#include #include typedef enum { FALSE, TRUE } boolean; typedef unsigned char BYTE; /* Interface to John Logajan's gray-level display routines. */ extern void grayinit(void), grayexit(void), grayshow(void); extern void gray22(BYTE *address, long span); boolean read_file(FILE *fp, BYTE *mem, int w, int h) { BYTE *rbuf, *rover; int x, y; long conv; if ((rbuf = calloc((size_t)w, (size_t)3)) == NULL) return FALSE; for (y = 0; y < h; ++y) { if (fread(rbuf, (size_t)3, (size_t)w, fp) < (size_t)w) { free(rbuf); return FALSE; } for (x = 0, rover = rbuf; x < w; ++x) { conv = *rover++ * 299l /* calc luminance (NTSC Y formula) */ + *rover++ * 587l + *rover++ * 114l; *mem++ = (BYTE)(conv / 11591); /* scale to range 0..21 */ } } free(rbuf); return TRUE; } void main(int argc, char **argv) { FILE *file; int width, height; BYTE *buffer; if (argc != 2) { printf("Usage: viewmtv filename\n"); exit(1); } if ((file = fopen(argv[1], "rb")) == NULL) { printf("Can't open '%s'\n", argv[1]); exit(1); } if (fscanf(file, "%d %d", &width, &height) != 2) { fclose(file); printf("'%s' is not in MTV format\n"); exit(1); } while (getc(file) != '\n') /* skip MTV `header' line */ ; if ((buffer = malloc((long)width * (long)height)) == NULL) { fclose(file); printf("Not enough memory for %dx%d pixels\n", width, height); exit(1); } if (! read_file(file, buffer, width, height)) { fclose(file); printf("Error while reading '%s'\n", argv[1]); exit(1); } fclose(file); /* ### */ grayinit(); gray22(buffer, width); grayexit(); /* ### */ free(buffer); exit(0); }