summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-08-22 21:35:44 +0000
committerarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-08-22 21:35:44 +0000
commit0a1256777b619d822f0ec844cee560c0fd6911cd (patch)
tree01aa83ff9a1dcaefb6bd52a215368aef9f3ff220
parent672e72ea7273cdd6ab4ad55c9f8c91fbbf06d16f (diff)
downloadmpv-0a1256777b619d822f0ec844cee560c0fd6911cd.tar.bz2
mpv-0a1256777b619d822f0ec844cee560c0fd6911cd.tar.xz
initial multifile support
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@1640 b3059339-0415-0410-9bf9-f77b7e298cf2
-rw-r--r--mplayer.c291
1 files changed, 163 insertions, 128 deletions
diff --git a/mplayer.c b/mplayer.c
index 3fe8b083e2..25dc305eb7 100644
--- a/mplayer.c
+++ b/mplayer.c
@@ -315,6 +315,7 @@ void exit_player(char* how){
if ( nogui )
#endif
getch2_disable();
+
#ifdef USE_LIBVO2
if(video_out) vo2_close(video_out);
#else
@@ -328,6 +329,7 @@ void exit_player(char* how){
#endif
lirc_mp_cleanup();
#endif
+
exit(1);
}
@@ -461,22 +463,24 @@ int use_stdin=0; //int f; // filedes
mp_msg(MSGT_CPLAYER,MSGL_INFO,"%s",banner_text);
#ifdef HAVE_GUI
- if ( nogui )
- {
+ if ( nogui ) {
#endif
+
parse_cfgfiles();
- if ((num_filenames=parse_command_line(conf, argc, argv, envp, &filenames)) < 0) exit(1);
- printf("XXX num_filenames: %d\n",num_filenames);
- curr_filename=0;
- filename=(num_filenames>0)?filenames[curr_filename]:NULL;
-
- mp_msg_init(verbose+MSGL_STATUS);
+ num_filenames=parse_command_line(conf, argc, argv, envp, &filenames);
+ if(num_filenames<0) exit(1); // error parsing cmdline
+ if(!num_filenames && !vcd_track && !dvd_title){
+ // no file/vcd/dvd -> show HELP:
+ printf("%s",help_text);
+ exit(0);
+ }
// Many users forget to include command line in bugreports...
if(verbose){
printf("CommandLine:");
for(i=1;i<argc;i++)printf(" '%s'",argv[i]);
printf("\n");
+ printf("num_filenames: %d\n",num_filenames);
}
#ifndef USE_LIBVO2
@@ -501,18 +505,93 @@ int use_stdin=0; //int f; // filedes
printf("\n");
exit(0);
}
+
#ifdef HAVE_GUI
}
#endif
-if(!filename){
- if(!vcd_track && !dvd_title){
- printf("%s",help_text); exit(0);
+ mp_msg_init(verbose+MSGL_STATUS);
+
+//------ load global data first ------
+
+// check codec.conf
+if(!parse_codec_cfg(get_path("codecs.conf"))){
+ if(!parse_codec_cfg(DATADIR"/codecs.conf")){
+ mp_msg(MSGT_CPLAYER,MSGL_HINT,MSGTR_CopyCodecsConf);
+ exit(1);
}
}
+// check font
+#ifdef USE_OSD
+ if(font_name){
+ vo_font=read_font_desc(font_name,font_factor,verbose>1);
+ if(!vo_font) mp_msg(MSGT_CPLAYER,MSGL_ERR,MSGTR_CantLoadFont,font_name);
+ } else {
+ // try default:
+ vo_font=read_font_desc(get_path("font/font.desc"),font_factor,verbose>1);
+ if(!vo_font)
+ vo_font=read_font_desc(DATADIR"/font/font.desc",font_factor,verbose>1);
+ }
+#endif
+
+#ifdef USE_SUB
+// check .sub
+ if(sub_name){
+ int l=strlen(sub_name);
+ if ((l>4) && ((0==strcmp(&sub_name[l-4],".utf"))
+ ||(0==strcmp(&sub_name[l-4],".UTF"))))
+ sub_utf8=1;
+ subtitles=sub_read_file(sub_name);
+ if(!subtitles) mp_msg(MSGT_CPLAYER,MSGL_ERR,MSGTR_CantLoadSub,sub_name);
+ } else {
+ if(sub_auto && filename) // auto load sub file ...
+ subtitles=sub_read_file( sub_filename( get_path("sub/"), filename ) );
+ if(!subtitles) subtitles=sub_read_file(get_path("default.sub")); // try default
+ }
+#endif
+
+
+#ifdef HAVE_LIRC
+ #ifdef HAVE_GUI
+ if ( nogui )
+ #endif
+ lirc_mp_setup();
+#endif
+
+#ifdef USE_TERMCAP
+ load_termcap(NULL); // load key-codes
+#endif
+
+ //========= Catch terminate signals: ================
+ // terminate requests:
+ signal(SIGTERM,exit_sighandler); // kill
+ signal(SIGHUP,exit_sighandler); // kill -HUP / xterm closed
+
+ #ifdef HAVE_GUI
+ if ( nogui )
+ #endif
+ signal(SIGINT,exit_sighandler); // Interrupt from keyboard
+
+ signal(SIGQUIT,exit_sighandler); // Quit from keyboard
+ // fatal errors:
+ signal(SIGBUS,exit_sighandler); // bus error
+ signal(SIGSEGV,exit_sighandler); // segfault
+ signal(SIGILL,exit_sighandler); // illegal instruction
+ signal(SIGFPE,exit_sighandler); // floating point exc.
+ signal(SIGABRT,exit_sighandler); // abort()
+
+
+// ******************* Now, let's see the per-file stuff ********************
+
+ curr_filename=0;
+play_next_file:
+ filename=(num_filenames>0)?filenames[curr_filename]:NULL;
+
#ifdef USE_LIBVO2
+ current_module="vo2_new";
video_out=vo2_new(video_driver);
+ current_module=NULL;
#else
// check video_out driver name:
if (video_driver)
@@ -541,7 +620,7 @@ if(!filename){
#endif
if(!video_out){
mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_InvalidVOdriver,video_driver?video_driver:"?");
- return 0;
+ exit_player(MSGTR_Exit_error);
}
// check audio_out driver name:
@@ -570,57 +649,24 @@ if(!filename){
}
if (!audio_out){
mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_InvalidAOdriver,audio_driver);
- return 0;
+ exit_player(MSGTR_Exit_error);
}
/*DSP!! if(dsp) audio_out->control(AOCONTROL_SET_DEVICE,(int)dsp);*/
-// check codec.conf
-if(!parse_codec_cfg(get_path("codecs.conf"))){
- if(!parse_codec_cfg(DATADIR"/codecs.conf")){
- mp_msg(MSGT_CPLAYER,MSGL_HINT,MSGTR_CopyCodecsConf);
- exit(1);
- }
-}
-
-// check font
-#ifdef USE_OSD
- if(font_name){
- vo_font=read_font_desc(font_name,font_factor,verbose>1);
- if(!vo_font) mp_msg(MSGT_CPLAYER,MSGL_ERR,MSGTR_CantLoadFont,font_name);
- } else {
- // try default:
- vo_font=read_font_desc(get_path("font/font.desc"),font_factor,verbose>1);
- if(!vo_font)
- vo_font=read_font_desc(DATADIR"/font/font.desc",font_factor,verbose>1);
- }
-#endif
-
-#ifdef USE_SUB
-// check .sub
- if(sub_name){
- int l=strlen(sub_name);
- if ((l>4) && ((0==strcmp(&sub_name[l-4],".utf"))
- ||(0==strcmp(&sub_name[l-4],".UTF"))))
- sub_utf8=1;
- subtitles=sub_read_file(sub_name);
- if(!subtitles) mp_msg(MSGT_CPLAYER,MSGL_ERR,MSGTR_CantLoadSub,sub_name);
- } else {
- if(sub_auto && filename) // auto load sub file ...
- subtitles=sub_read_file( sub_filename( get_path("sub/"), filename ) );
- if(!subtitles) subtitles=sub_read_file(get_path("default.sub")); // try default
- }
-#endif
+ current_module="open_stream";
stream=open_stream(filename,vcd_track,&file_format);
- if(!stream) return 1; // error...
- use_stdin=filename && (!strcmp(filename,"-"));
+ if(!stream) exit_player(MSGTR_Exit_error); // error...
stream->start_pos+=seek_to_byte;
+ use_stdin=filename && (!strcmp(filename,"-"));
+
#ifdef HAVE_LIBCSS
+ current_module="libcss";
if (dvdimportkey) {
if (dvd_import_key(dvdimportkey)) {
mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_ErrorDVDkey);
- exit(1);
+ exit_player(MSGTR_Exit_error);
}
mp_msg(MSGT_CPLAYER,MSGL_INFO,MSGTR_CmdlineDVDkey);
}
@@ -628,7 +674,7 @@ if(!parse_codec_cfg(get_path("codecs.conf"))){
// if (dvd_auth(dvd_auth_device,f)) {
if (dvd_auth(dvd_auth_device,filename)) {
GUI_MSG( mplErrorDVDAuth )
- exit(0);
+ exit_player(MSGTR_Exit_error);
}
mp_msg(MSGT_CPLAYER,MSGL_INFO,MSGTR_DVDauthOk);
}
@@ -638,8 +684,10 @@ if(!parse_codec_cfg(get_path("codecs.conf"))){
if(!has_audio) audio_id=-2; // do NOT read audio packets...
+current_module="demux_open";
+
demuxer=demux_open(stream,file_format,audio_id,video_id,dvdsub_id);
-if(!demuxer) exit(1); // ERROR
+if(!demuxer) exit_player(MSGTR_Exit_error); // ERROR
file_format=demuxer->file_format;
@@ -651,6 +699,7 @@ d_dvdsub=demuxer->sub;
if(stream_dump_type){
FILE *f;
demux_stream_t *ds=NULL;
+ current_module="dump";
// select stream to dump
switch(stream_dump_type){
case 1: ds=d_audio;break;
@@ -659,7 +708,7 @@ if(stream_dump_type){
}
if(!ds){
mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_DumpSelectedSteramMissing);
- exit(1);
+ exit_player(MSGTR_Exit_error);
}
// disable other streams:
if(d_audio && d_audio!=ds) {ds_free_packs(d_audio); d_audio->id=-2; }
@@ -667,7 +716,10 @@ if(stream_dump_type){
if(d_dvdsub && d_dvdsub!=ds) {ds_free_packs(d_dvdsub); d_dvdsub->id=-2; }
// let's dump it!
f=fopen(stream_dump_name?stream_dump_name:"stream.dump","wb");
- if(!f){ mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_CantOpenDumpfile);exit(1); }
+ if(!f){
+ mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_CantOpenDumpfile);
+ exit_player(MSGTR_Exit_error);
+ }
while(!ds->eof){
unsigned char* start;
int in_size=ds_get_packet(ds,&start);
@@ -677,15 +729,17 @@ if(stream_dump_type){
}
fclose(f);
mp_msg(MSGT_CPLAYER,MSGL_INFO,MSGTR_CoreDumped);
- exit(1);
+ exit_player(MSGTR_Exit_eof);
}
sh_audio=d_audio->sh;
sh_video=d_video->sh;
+current_module="video_read_properties";
+
if(sh_video){
- if(!video_read_properties(sh_video)) exit(1); // couldn't read header?
+ if(!video_read_properties(sh_video)) exit_player(MSGTR_Exit_error); // couldn't read header?
mp_msg(MSGT_CPLAYER,MSGL_INFO,"[V] filefmt:%d fourcc:0x%X size:%dx%d fps:%5.2f ftime:=%6.4f\n",
file_format,sh_video->format, sh_video->disp_w,sh_video->disp_h,
@@ -694,7 +748,7 @@ if(sh_video){
if(!sh_video->fps && !force_fps){
mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_FPSnotspecified);
- exit(1);
+ exit_player(MSGTR_Exit_error);
}
}
@@ -703,10 +757,13 @@ fflush(stdout);
if(!sh_video){
mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_NoVideoStream);
- exit(1);
+ exit_player(MSGTR_Exit_error);
}
//================== Init AUDIO (codec) ==========================
+
+current_module="init_audio_codec";
+
if(sh_audio){
// Go through the codec.conf and find the best codec...
sh_audio->codec=NULL;
@@ -745,6 +802,8 @@ if(sh_audio){
//================== Init VIDEO (codec & libvo) ==========================
+current_module="init_video_codec";
+
// Go through the codec.conf and find the best codec...
sh_video->codec=NULL;
if(video_family!=-1) mp_msg(MSGT_CPLAYER,MSGL_INFO,MSGTR_TryForceVideoFmt,video_family);
@@ -760,7 +819,7 @@ while(1){
}
mp_msg(MSGT_CPLAYER,MSGL_ERR,MSGTR_CantFindVideoCodec,sh_video->format);
mp_msg(MSGT_CPLAYER,MSGL_HINT, MSGTR_TryUpgradeCodecsConfOrRTFM,get_path("codecs.conf"));
- exit(1);
+ exit_player(MSGTR_Exit_error);
}
// is next line needed anymore? - atmos ::
if(!allow_dshow && sh_video->codec->driver==VFM_DSHOW) continue; // skip DShow
@@ -785,7 +844,7 @@ for(i=0;i<CODECS_MAX_OUTFMT;i++){
}
if(i>=CODECS_MAX_OUTFMT){
mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_VOincompCodec);
- exit(1);
+ exit_player(MSGTR_Exit_error);
}
sh_video->outfmtidx=i;
@@ -801,7 +860,7 @@ mp_msg(MSGT_CPLAYER,MSGL_DBG2,"vo_debug1: out_fmt=%s\n",vo_format_name(out_fmt))
if(!init_video(sh_video)){
mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_CouldntInitVideoCodec);
- exit(1);
+ exit_player(MSGTR_Exit_error);
}
if(auto_quality>0){
@@ -820,12 +879,12 @@ if(auto_quality>0){
if(encode_file){
fclose(encode_file);
mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_EncodeFileExists,encode_name);
- return 0;
+ exit_player(MSGTR_Exit_error);
}
encode_file=fopen(encode_name,"wb");
if(!encode_file){
mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_CantCreateEncodeFile);
- return 0;
+ exit_player(MSGTR_Exit_error);
}
write_avi_header_1(encode_file,mmioFOURCC('d', 'i', 'v', 'x'),sh_video->fps,sh_video->disp_w,sh_video->disp_h);
fclose(encode_file);
@@ -844,6 +903,8 @@ make_pipe(&keyb_fifo_get,&keyb_fifo_put);
// ========== Init display (sh_video->disp_w*sh_video->disp_h/out_fmt) ============
+current_module="init_libvo";
+
#ifdef X11_FULLSCREEN
if(fullscreen){
if(vo_init()){
@@ -907,7 +968,7 @@ make_pipe(&keyb_fifo_get,&keyb_fifo_put);
sh_video->disp_w,sh_video->disp_h,out_fmt,0,
fullscreen|(vidmode<<1)|(softzoom<<2)|(flip<<3) )){
mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_CannotInitVO );
- exit(1);
+ exit_player(MSGTR_Exit_error);
}
#else
if(video_out->init(sh_video->disp_w,sh_video->disp_h,
@@ -915,7 +976,7 @@ make_pipe(&keyb_fifo_get,&keyb_fifo_put);
fullscreen|(vidmode<<1)|(softzoom<<2)|(flip<<3),
title,out_fmt)){
mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_CannotInitVO);
- exit(1);
+ exit_player(MSGTR_Exit_error);
}
#endif
mp_msg(MSGT_CPLAYER,MSGL_V,"INFO: Video OUT driver init OK!\n");
@@ -941,42 +1002,6 @@ double cvideo_base_vtime;
double cvideo_base_vframe;
double vdecode_time;
-#ifdef HAVE_LIRC
- #ifdef HAVE_GUI
- if ( nogui )
- #endif
- lirc_mp_setup();
-#endif
-
- #ifdef HAVE_GUI
- if ( nogui )
- {
- #endif
-#ifdef USE_TERMCAP
- load_termcap(NULL); // load key-codes
-#endif
- if(!use_stdin) getch2_enable();
- #ifdef HAVE_GUI
- }
- #endif
-
- //========= Catch terminate signals: ================
- // terminate requests:
- signal(SIGTERM,exit_sighandler); // kill
- signal(SIGHUP,exit_sighandler); // kill -HUP / xterm closed
-
- #ifdef HAVE_GUI
- if ( nogui )
- #endif
- signal(SIGINT,exit_sighandler); // Interrupt from keyboard
-
- signal(SIGQUIT,exit_sighandler); // Quit from keyboard
- // fatal errors:
- signal(SIGBUS,exit_sighandler); // bus error
- signal(SIGSEGV,exit_sighandler); // segfault
- signal(SIGILL,exit_sighandler); // illegal instruction
- signal(SIGFPE,exit_sighandler); // floating point exc.
- signal(SIGABRT,exit_sighandler); // abort()
//================ SETUP AUDIO ==========================
current_module="setup_audio";
@@ -1027,36 +1052,19 @@ if(!sh_audio){
current_module=NULL;
-//==================== START PLAYING =======================
-
-if(file_format==DEMUXER_TYPE_AVI && sh_audio){
-#if 0
- //a_pts=d_audio->pts;
- if(verbose) printf("Initial frame delay A: %d V: %d\n",(int)sh_audio->audio.dwInitialFrames,(int)sh_video->video.dwInitialFrames);
- if(!pts_from_bps){
- float x=(float)(sh_audio->audio.dwInitialFrames-sh_video->video.dwInitialFrames)*sh_video->frametime;
-// audio_delay-=x;
- if(verbose) printf("AVI Initial frame delay: %5.3f\n",x);
- delay_corrected=0; // has to correct PTS diffs
- }
- if(verbose){
-// printf("v: audio_delay=%5.3f buffer_delay=%5.3f a_pts=%5.3f sh_audio->timer=%5.3f\n",
-// audio_delay,audio_buffer_delay,a_pts,sh_audio->timer);
- printf("START: a_pts=%5.3f v_pts=%5.3f \n",d_audio->pts,d_video->pts);
- }
- d_video->pts=0;d_audio->pts=0; // PTS is outdated now!
-#endif
-} else {
- pts_from_bps=0; // it must be 0 for mpeg/asf !
-}
+if(file_format!=DEMUXER_TYPE_AVI) pts_from_bps=0; // it must be 0 for mpeg/asf!
if(force_fps){
sh_video->fps=force_fps;
sh_video->frametime=1.0f/sh_video->fps;
mp_msg(MSGT_CPLAYER,MSGL_INFO,"FPS forced to be %5.3f (ftime: %5.3f)\n",sh_video->fps,sh_video->frametime);
}
+//==================== START PLAYING =======================
+
mp_msg(MSGT_CPLAYER,MSGL_INFO,MSGTR_StartPlaying);fflush(stdout);
+if(!use_stdin) getch2_enable(); // prepare stdin for hotkeys...
+
InitTimer();
total_time_usage_start=GetTimer();
@@ -1081,8 +1089,8 @@ while(sh_audio){
//if(playsize>outburst) playsize=outburst;
// Update buffer if needed
- t=GetTimer();
current_module="decode_audio"; // Enter AUDIO decoder module
+ t=GetTimer();
while(sh_audio->a_buffer_len<playsize && !d_audio->eof){
int ret=decode_audio(sh_audio,&sh_audio->a_buffer[sh_audio->a_buffer_len],
playsize-sh_audio->a_buffer_len,sh_audio->a_buffer_size-sh_audio->a_buffer_len);
@@ -1517,8 +1525,10 @@ if(auto_quality>0){
break;
// quit
case KEY_ESC: // ESC
- case KEY_ENTER: // ESC
case 'q': exit_player(MSGTR_Exit_quit);
+ case KEY_ENTER: // ESC
+ eof=1; // jump to next file
+ break;
case 'g': grab_frames=2;break;
// pause
case 'p':
@@ -1765,7 +1775,32 @@ if(rel_seek_secs || abs_seek_pos){
mp_msg(MSGT_GLOBAL,MSGL_V,"EOF code: %d \n",eof);
-exit_player(MSGTR_Exit_eof);
}
+
+++curr_filename;
+if(curr_filename<num_filenames){
+ // partial uninit:
+
+ // restore terminal:
+ #ifdef HAVE_GUI
+ if ( nogui )
+ #endif
+ getch2_disable();
+
+#ifdef USE_LIBVO2
+ if(video_out) vo2_close(video_out);
+#else
+ if(video_out) video_out->uninit();
+#endif
+ video_out=NULL;
+ if(audio_out) audio_out->uninit();
+ audio_out=NULL;
+// if(encode_name) avi_fixate();
+
+ goto play_next_file;
+}
+
+exit_player(MSGTR_Exit_eof);
+
return 1;
}