initial multifile support

git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@1640 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
arpi 2001-08-22 21:35:44 +00:00
parent 672e72ea72
commit 0a1256777b
1 changed files with 189 additions and 154 deletions

343
mplayer.c
View File

@ -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,78 +505,14 @@ 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);
#ifdef USE_LIBVO2
video_out=vo2_new(video_driver);
#else
// check video_out driver name:
if (video_driver)
if ((i = strcspn(video_driver, ":")) > 0)
{
size_t i2 = strlen(video_driver);
if (video_driver[i] == ':')
{
vo_subdevice = malloc(i2-i);
if (vo_subdevice != NULL)
strncpy(vo_subdevice, (char *)(video_driver+i+1), i2-i);
video_driver[i] = '\0';
}
// printf("video_driver: %s, subdevice: %s\n", video_driver, vo_subdevice);
}
if(!video_driver)
video_out=video_out_drivers[0];
else
for (i=0; video_out_drivers[i] != NULL; i++){
const vo_info_t *info = video_out_drivers[i]->get_info ();
if(strcmp(info->short_name,video_driver) == 0){
video_out = video_out_drivers[i];break;
}
}
#endif
if(!video_out){
mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_InvalidVOdriver,video_driver?video_driver:"?");
return 0;
}
// check audio_out driver name:
if (audio_driver)
if ((i = strcspn(audio_driver, ":")) > 0)
{
size_t i2 = strlen(audio_driver);
if (audio_driver[i] == ':')
{
ao_subdevice = malloc(i2-i);
if (ao_subdevice != NULL)
strncpy(ao_subdevice, (char *)(audio_driver+i+1), i2-i);
audio_driver[i] = '\0';
}
// printf("audio_driver: %s, subdevice: %s\n", audio_driver, ao_subdevice);
}
if(!audio_driver)
audio_out=audio_out_drivers[0];
else
for (i=0; audio_out_drivers[i] != NULL; i++){
const ao_info_t *info = audio_out_drivers[i]->info;
if(strcmp(info->short_name,audio_driver) == 0){
audio_out = audio_out_drivers[i];break;
}
}
if (!audio_out){
mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_InvalidAOdriver,audio_driver);
return 0;
}
/*DSP!! if(dsp) audio_out->control(AOCONTROL_SET_DEVICE,(int)dsp);*/
//------ load global data first ------
// check codec.conf
if(!parse_codec_cfg(get_path("codecs.conf"))){
@ -611,16 +551,122 @@ if(!parse_codec_cfg(get_path("codecs.conf"))){
}
#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)
if ((i = strcspn(video_driver, ":")) > 0)
{
size_t i2 = strlen(video_driver);
if (video_driver[i] == ':')
{
vo_subdevice = malloc(i2-i);
if (vo_subdevice != NULL)
strncpy(vo_subdevice, (char *)(video_driver+i+1), i2-i);
video_driver[i] = '\0';
}
// printf("video_driver: %s, subdevice: %s\n", video_driver, vo_subdevice);
}
if(!video_driver)
video_out=video_out_drivers[0];
else
for (i=0; video_out_drivers[i] != NULL; i++){
const vo_info_t *info = video_out_drivers[i]->get_info ();
if(strcmp(info->short_name,video_driver) == 0){
video_out = video_out_drivers[i];break;
}
}
#endif
if(!video_out){
mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_InvalidVOdriver,video_driver?video_driver:"?");
exit_player(MSGTR_Exit_error);
}
// check audio_out driver name:
if (audio_driver)
if ((i = strcspn(audio_driver, ":")) > 0)
{
size_t i2 = strlen(audio_driver);
if (audio_driver[i] == ':')
{
ao_subdevice = malloc(i2-i);
if (ao_subdevice != NULL)
strncpy(ao_subdevice, (char *)(audio_driver+i+1), i2-i);
audio_driver[i] = '\0';
}
// printf("audio_driver: %s, subdevice: %s\n", audio_driver, ao_subdevice);
}
if(!audio_driver)
audio_out=audio_out_drivers[0];
else
for (i=0; audio_out_drivers[i] != NULL; i++){
const ao_info_t *info = audio_out_drivers[i]->info;
if(strcmp(info->short_name,audio_driver) == 0){
audio_out = audio_out_drivers[i];break;
}
}
if (!audio_out){
mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_InvalidAOdriver,audio_driver);
exit_player(MSGTR_Exit_error);
}
/*DSP!! if(dsp) audio_out->control(AOCONTROL_SET_DEVICE,(int)dsp);*/
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;
}