/* This file is in the public domain. */ #include #include #include #include #include #include #include #include #include #include #include #include "mp4.h" extern const char *__progname; static const char *ifilename; static const char *ofilename; static MP4 *curfile; static int prev_rate; static int prev_chan; static FILE *ofp; #define Cisspace(x) isspace((unsigned char)(x)) static void handleargs(int ac, char **av) { int skip; int errs; skip = 0; errs = 0; for (;ac;ac--,av++) { if (skip > 0) { skip --; continue; } if (**av != '-') { if (! ifilename) { ifilename = *av; } else if (! ofilename) { ofilename = *av; } else { fprintf(stderr,"%s: extra argument `%s'\n",__progname,*av); errs = 1; } continue; } if (0) { needarg:; fprintf(stderr,"%s: %s needs a following argument\n",__progname,*av); errs = 1; continue; } #define WANTARG() do { if (++skip >= ac) goto needarg; } while (0) if (! strcmp(*av,"-in")) { WANTARG(); ifilename = av[skip]; continue; } if (! strcmp(*av,"-out")) { WANTARG(); ofilename = av[skip]; continue; } #undef WANTARG fprintf(stderr,"%s: unrecognized option `%s'\n",__progname,*av); errs = 1; } if (!ifilename || !ofilename) { fprintf(stderr,"%s: need input and output filenames\n",__progname); errs = 1; } if (errs) exit(1); } #if 0 static int compute_shift(unsigned long int m) { int n; if (! m) abort(); m &= ~ (m >> 1); if (m & (m-1)) abort(); n = 0; if (m & 0xffff0000) { m >>= 16; n += 16; } if (m & 0x0000ff00) { m >>= 8; n += 8; } if (m & 0x000000f0) { m >>= 4; n += 4; } if (m & 0x0000000c) { m >>= 2; n += 2; } if (m & 0x00000002) { m >>= 1; n ++; } return(n); } #endif static void init_play(void) { prev_rate = -1; prev_chan = -1; ofp = fopen(ofilename,"w"); } static void play_file(void) { int i; int ax; MP4TRK *at; const MP4ADESC *ad; int nb; curfile = mp4_open(ifilename,0); mp4_scan(curfile); ax = -1; for (i=mp4_ntracks(curfile)-1;i>=0;i--) { switch (mp4_track_type(curfile,i)) { default: abort(); break; case MP4_TT_AUDIO: ax = i; break; case MP4_TT_VIDEO: break; } } if (ax < 0) printf("*** no audio found\n"); at = mp4_open_audio(curfile,ax); while (1) { ad = mp4_get_audio(at); if (ad->samples) { switch (ad->format) { case MP4_AFMT_SLIN16N: nb = ad->samples * ad->channels * 2; fwrite(ad->data,1,nb,ofp); break; default: abort(); break; } } else { mp4_close_track(at); break; } } } int main(int, char **); int main(int ac, char **av) { handleargs(ac-1,av+1); init_play(); play_file(); fclose(ofp); return(0); }