/* * mvrgb -- extract image from movie into rgb file * * mvrgb file.mv [track] frame */ #include #include #include #include #include #include #include #define MVPR(s) fprintf(stderr, "%s: %s\n", s, mvGetErrorStr(mvGetErrno())) #define EMV(func, s) if (func == DM_FAILURE) { MVPR(s); exit(1); } #include void dump_frame(char * data, int xsize, int ysize, char *fname) { IMAGE *image; unsigned short rbuf[1024]; unsigned short gbuf[1024]; unsigned short bbuf[1024]; int x, y; image = iopen(fname, "w", RLE(1), 3, xsize, ysize, 3); for( y = 0 ; y < ysize ; y++ ) { for( x = 0 ; x < xsize ; x++ ) { data++; bbuf[x] = *data++; gbuf[x] = *data++; rbuf[x] = *data++; } (void)putrow(image, rbuf, ysize - y - 1, 0); (void)putrow(image, gbuf, ysize - y - 1, 1); (void)putrow(image, bbuf, ysize - y - 1, 2); } (void)iclose(image); } main(int argc, char **argv) { double rate; MVid movie, track; MVtime dur; MVtimescale tscale; MVframe nframes; int frameno; size_t nbytes; MVtime mvtime; DMparams *p; int wid, ht; char *buf; char *mvname = argv[1]; int trackno; char fname[16]; if (argc != 3 && argc != 4) { fprintf(stderr, "usage: %s file.mv [trackno] frameno\n", argv[0]); exit(1); } trackno = argc == 4 ? atoi(argv[2]) : 0; frameno = atoi(argv[argc - 1]); EMV(mvOpenFile(mvname, O_RDONLY, &movie), mvname); tscale = mvGetMovieTimeScale(movie); EMV(mvFindTrackByIndex(movie, trackno, &track), "find track N"); nframes = mvGetTrackLength(track); if (frameno >= nframes) { fprintf(stderr, "%s: %s has %d frames\n", argv[0], mvname, nframes); exit(1); } dmParamsCreate(&p); EMV(mvGetTrackDataParams(track, 0, p), "get track data params"); dmParamsSetEnum(p, DM_IMAGE_PACKING, DM_IMAGE_PACKING_XBGR); dmParamsSetEnum(p, DM_IMAGE_INTERLACING, DM_IMAGE_NONINTERLACED); nbytes = dmImageFrameSize(p); if ((buf = malloc(nbytes)) == NULL) { fprintf(stderr, "%d: malloc failed\n", argv[0]); exit(1); } rate = mvGetImageRate(track); dur = (long long)((double)tscale/rate); mvtime = (long long)frameno * dur; EMV(mvRenderMovieToImageBuffer(movie, mvtime, tscale, buf, p), "render to buffer"); wid = mvGetImageWidth(track); ht = mvGetImageHeight(track); sprintf(fname, "%05d.rgb", frameno); dump_frame(buf, wid, ht, fname); exit(0); }