/* This file is in the public domain. */ #include #include extern const char *__progname; #include "mp4.h" static void usage(void) { fprintf(stderr,"Usage: %s filename\n",__progname); exit(1); } static void dump_audio(MP4 *h, int tx) { MP4TRK *ht; const MP4ADESC *d; char *fn; FILE *f; asprintf(&fn,"TRACK/%d.a",tx); f = fopen(fn,"w"); if (! f) { printf("*** can't open %s\n",fn); return; } ht = mp4_open_audio(h,tx); while <"decode"> (1) { d = mp4_get_audio(ht); switch (d->format) { case MP4_AFMT_EOF: break <"decode">; case MP4_AFMT_SLIN16N: fwrite(d->data,2,d->samples*d->channels,f); break; } } mp4_close_track(ht); fclose(f); } static void dump_video(MP4 *h, int tx) { MP4TRK *ht; const MP4VDESC *d; int i; char *fn; FILE *f; ht = mp4_open_video(h,tx); for (i=0;;i++) { d = mp4_get_video(ht); if (! d->data) break; asprintf(&fn,"FRAME/%d",i); f = fopen(fn,"w"); if (f) { fprintf(f,"P6\n%d %d\n255\n",d->w,d->h); fwrite(d->data,3,d->w*d->h,f); fclose(f); } else { printf("*** can't open %s\n",fn); } } mp4_close_track(ht); } int main(int, char **); int main(int ac, char **av) { MP4 *h; int i; if (ac != 2) usage(); h = mp4_open(av[1],MP4F_VERBOSE,stdout); mp4_scan(h); for (i=mp4_ntracks(h)-1;i>=0;i--) { switch (mp4_track_type(h,i)) { default: abort(); break; case MP4_TT_AUDIO: dump_audio(h,i); break; case MP4_TT_VIDEO: dump_video(h,i); break; } } return(0); }