#include #include #include #include #include #define PIXEL 4 struct yjk { int16_t y; int16_t j; int16_t k; } __attribute__((packed)); static void avgjk(struct yjk *yjk, int pixels) { int i, j, k; j = 0; k = 0; for (i = 0; i < pixels; i++) { j += (int16_t)le16toh(yjk[i].j); k += (int16_t)le16toh(yjk[i].k); } j /= pixels; k /= pixels; for (i = 0; i < pixels; i++) { yjk[i].j = le16toh((int16_t)j); yjk[i].k = le16toh((int16_t)k); } } static void clampyjk(struct yjk *yjk, int pixels) { int i; for (i = 0; i < pixels; i++) { yjk[i].y &= ~0x3f; yjk[i].j &= ~0x1f; yjk[i].k &= ~0x1f; } } static void filter(FILE *fpi, FILE *fpo) { struct yjk yjk[PIXEL]; while (1) { if (fread(yjk, 1, sizeof(yjk), fpi) < sizeof(yjk)) break; avgjk(yjk, PIXEL); clampyjk(yjk, PIXEL); if (fwrite(yjk, sizeof(yjk), 1, fpo) < 1) { fprintf(stderr, "filter: file write error\n"); break; } } } int main(int argc, char *argv[]) { FILE *fpi, *fpo; if (argc < 2) { fprintf(stderr, "usage: %s [(infile)] [(outfile)]\n", argv[0]); goto fin0; } if (argc < 2 || !strcmp(argv[1], "-")) { fpi = stdin; } else { fpi = fopen(argv[1], "r"); if (fpi == NULL) { fprintf(stderr, "file open error (in)\n"); goto fin0; } } if (argc < 3 || !strcmp(argv[2], "-")) { fpo = stdout; } else { fpo = fopen(argv[2], "w"); if (fpo == NULL) { fprintf(stderr, "file open error (out)\n"); goto fin1; } } filter(fpi, fpo); //fin2: if (fpo != stdout) fclose(fpo); fin1: if (fpi != stdin) fclose(fpi); fin0: return 0; }