diff -Naur MPlayer-20030727/cfg-mplayer.h MPlayer-20030727-new/cfg-mplayer.h --- MPlayer-20030727/cfg-mplayer.h 2003-07-01 21:23:08.000000000 +0200 +++ MPlayer-20030727-new/cfg-mplayer.h 2003-07-27 18:11:34.000000000 +0200 @@ -378,6 +378,10 @@ {"dumpmicrodvdsub", &stream_dump_type, CONF_TYPE_FLAG, 0, 0, 7, NULL}, {"dumpjacosub", &stream_dump_type, CONF_TYPE_FLAG, 0, 0, 8, NULL}, {"dumpsami", &stream_dump_type, CONF_TYPE_FLAG, 0, 0, 9, NULL}, + {"dumpavstreams", &stream_dump_type, CONF_TYPE_FLAG, 0, 0, -3, NULL}, + {"dumpraw", &dump_raw, CONF_TYPE_FLAG, 0, 0, 1, NULL}, + {"dumpvideofile", &stream_video_dump_name, CONF_TYPE_STRING, 0, 0, 0, NULL}, + {"dumpaudiofile", &stream_audio_dump_name, CONF_TYPE_STRING, 0, 0, 0, NULL}, #ifdef HAVE_LIRC {"lircconf", &lirc_configfile, CONF_TYPE_STRING, CONF_GLOBAL, 0, 0, NULL}, diff -Naur MPlayer-20030727/DOCS/en/mplayer.1 MPlayer-20030727-new/DOCS/en/mplayer.1 --- MPlayer-20030727/DOCS/en/mplayer.1 2003-07-08 01:02:25.000000000 +0200 +++ MPlayer-20030727-new/DOCS/en/mplayer.1 2003-07-27 18:23:39.000000000 +0200 @@ -697,12 +697,31 @@ Specify which file MPlayer should dump to. Should be used together with \-dumpaudio / \-dumpvideo / \-dumpstream. .TP +.B \-dumpaudiofile (MPLAYER only) +Specify which file MPlayer should dump the audio stream to. +Should be used together with \-dumpvideofile / \-dumpavstreams. +.TP +.B \-dumpvideofile (MPLAYER only) +Specify which file MPlayer should dump the video stream to. +Should be used together with \-dumpaudiofile / \-dumpavstreams. +.TP .B \-dumpstream (MPLAYER only) Dumps the raw stream to ./\:stream.dump. Useful when ripping from DVD or network. .TP +.B \-dumpavstreams (MPLAYER only) +Dumps the raw audio and video streams to ./\:audiostream.dump and ./\:videostream.dump, +unless otherwise specified with \-dumpaudiofile and \-dumpvideofile, respectively. +Useful when ripping from DVD or network. +.TP .B \-dumpvideo (MPLAYER only) Dump raw compressed video stream to ./\:stream.dump (not very usable). +When the source file is AVI/MOV/ASF MPlayer adds a 4 bytes header for every packet +to the dump, use \-dumpraw to avoid this. +.TP +.B \-dumpraw (MPLAYER only) +Dumps raw, headerless compressed stream to ./\:stream.dump (not very usable). +Useful for MPEG1/2 video streams in AVI. .TP .B \-dvd\-device Override default DVD device name /dev/\:dvd. diff -Naur MPlayer-20030727/mplayer.c MPlayer-20030727-new/mplayer.c --- MPlayer-20030727/mplayer.c 2003-07-22 12:46:22.000000000 +0200 +++ MPlayer-20030727-new/mplayer.c 2003-07-27 18:30:48.000000000 +0200 @@ -252,8 +252,12 @@ #endif // dump: -static char *stream_dump_name="stream.dump"; int stream_dump_type=0; +static int dump_raw = 0; +static char *stream_dump_name="stream.dump"; +static char *stream_video_dump_name="videostream.dump"; +static char *stream_audio_dump_name="audiostream.dump"; + // A-V sync: static float default_max_pts_correction=-1;//0.01f; @@ -1433,38 +1437,74 @@ d_dvdsub=demuxer->sub; // DUMP STREAMS: -if((stream_dump_type)&&(stream_dump_type<4)){ - FILE *f; - demux_stream_t *ds=NULL; +if((stream_dump_type)&&((stream_dump_type<4))){ + FILE *f, *f2 = NULL; + demux_stream_t *ds=NULL, *ds2=NULL; current_module="dump"; + char dump2[80]; + int done = 0; // select stream to dump switch(stream_dump_type){ case 1: ds=d_audio;break; case 2: ds=d_video;break; case 3: ds=d_dvdsub;break; + case -3: ds=d_audio; ds2=d_video; break; } - if(!ds){ + + if(!ds){ mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_DumpSelectedStreamMissing); exit_player(MSGTR_Exit_error); } // disable other streams: - if(d_audio && d_audio!=ds) {ds_free_packs(d_audio); d_audio->id=-2; } - if(d_video && d_video!=ds) {ds_free_packs(d_video); d_video->id=-2; } + if(d_audio && d_audio!=ds && stream_dump_type != -3) {ds_free_packs(d_audio); d_audio->id=-2; } + if(d_video && d_video!=ds && stream_dump_type != -3) {ds_free_packs(d_video); d_video->id=-2; } if(d_dvdsub && d_dvdsub!=ds) {ds_free_packs(d_dvdsub); d_dvdsub->id=-2; } // let's dump it! - f=fopen(stream_dump_name,"wb"); - if(!f){ - mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_CantOpenDumpfile); - exit_player(MSGTR_Exit_error); + + if(stream_dump_type == -3) + { + f=fopen(stream_audio_dump_name,"wb"); + f2=fopen(stream_video_dump_name,"wb"); + if((f==NULL) || (f2==NULL)){ + mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_CantOpenDumpfile); + exit_player(MSGTR_Exit_error); + } } - while(!ds->eof){ + else + { + f=fopen(stream_dump_name,"wb"); + if(!f){ + mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_CantOpenDumpfile); + exit_player(MSGTR_Exit_error); + } + } + + while(! done) + { unsigned char* start; - int in_size=ds_get_packet(ds,&start); - if( (demuxer->file_format==DEMUXER_TYPE_AVI || demuxer->file_format==DEMUXER_TYPE_ASF || demuxer->file_format==DEMUXER_TYPE_MOV) - && stream_dump_type==2) fwrite(&in_size,1,4,f); - if(in_size>0) fwrite(start,in_size,1,f); + if(! ds->eof) + { + int in_size=ds_get_packet(ds,&start); + if( (demuxer->file_format==DEMUXER_TYPE_AVI || demuxer->file_format==DEMUXER_TYPE_ASF || demuxer->file_format==DEMUXER_TYPE_MOV) + && (stream_dump_type==2 || stream_dump_type==-3) && (dump_raw == 0)) fwrite(&in_size,1,4,f); + if(in_size>0) fwrite(start,in_size,1,f); + } + done = ds->eof; + + if(ds2) + if(! ds2->eof) + { + int in_size=ds_get_packet(ds2,&start); + if( (demuxer->file_format==DEMUXER_TYPE_AVI || demuxer->file_format==DEMUXER_TYPE_ASF || demuxer->file_format==DEMUXER_TYPE_MOV) + && (stream_dump_type==2 || stream_dump_type==-3) && (dump_raw == 0)) fwrite(&in_size,1,4,f2); + if(in_size>0) fwrite(start,in_size,1,f2); + done = done && ds2->eof; + } } fclose(f); + if(f2) + fclose(f2); + mp_msg(MSGT_CPLAYER,MSGL_INFO,MSGTR_CoreDumped); exit_player_with_rc(MSGTR_Exit_eof, 0); }