From 1a6f3e1d60c13d0d654d90b24bef63f19ab9b3b0 Mon Sep 17 00:00:00 2001 From: arpi Date: Sun, 29 Sep 2002 21:53:05 +0000 Subject: video out driver list support (like -vc, example: -vo xmga,xv,x11,) git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@7563 b3059339-0415-0410-9bf9-f77b7e298cf2 --- cfg-mplayer.h | 4 ++-- libvo/video_out.c | 49 ++++++++++++++++++++++++++++++++++++++ libvo/video_out.h | 3 +++ mplayer.c | 71 ++++++++++--------------------------------------------- 4 files changed, 67 insertions(+), 60 deletions(-) diff --git a/cfg-mplayer.h b/cfg-mplayer.h index 1224c7b15e..9e372536ac 100644 --- a/cfg-mplayer.h +++ b/cfg-mplayer.h @@ -166,8 +166,8 @@ static config_t mplayer_opts[]={ //---------------------- libao/libvo options ------------------------ {"o", "Option -o has been renamed to -vo (video-out), use -vo !\n", CONF_TYPE_PRINT, CONF_NOCFG, 0, 0, NULL}, - {"vo", &video_driver, CONF_TYPE_STRING, 0, 0, 0, NULL}, - {"ao", &audio_driver, CONF_TYPE_STRING, 0, 0, 0, NULL}, + {"vo", &video_driver_list, CONF_TYPE_STRING_LIST, 0, 0, 0, NULL}, + {"ao", &audio_driver_list, CONF_TYPE_STRING_LIST, 0, 0, 0, NULL}, {"aop", ao_plugin_conf, CONF_TYPE_SUBCONFIG, 0, 0, 0, NULL}, {"dsp", "Use -ao oss:dsp_path!\n", CONF_TYPE_PRINT, CONF_NOCFG, 0, 0, NULL}, diff --git a/libvo/video_out.c b/libvo/video_out.c index 5aec99bb0d..5793aff8b9 100644 --- a/libvo/video_out.c +++ b/libvo/video_out.c @@ -12,6 +12,9 @@ #include "config.h" #include "video_out.h" +#include "mp_msg.h" +#include "help_mp.h" + #include "../linux/shmem.h" //int vo_flags=0; @@ -190,6 +193,52 @@ void libvo_register_options(void* cfg) { vo_dxr2_register_options(cfg); #endif } + +void list_video_out(){ + int i=0; + mp_msg(MSGT_CPLAYER, MSGL_INFO, MSGTR_AvailableVideoOutputDrivers); + while (video_out_drivers[i]) { + const vo_info_t *info = video_out_drivers[i++]->get_info (); + printf("\t%s\t%s\n", info->short_name, info->name); + } + printf("\n"); +} + +vo_functions_t* init_best_video_out(char** vo_list){ + int i; + // first try the preferred drivers, with their optional subdevice param: + if(vo_list && vo_list[0]) + while(vo_list[0][0]){ + char* vo=strdup(vo_list[0]); + vo_subdevice=strchr(vo,':'); + if(vo_subdevice){ + vo_subdevice[0]=0; + ++vo_subdevice; + } + for(i=0;video_out_drivers[i];i++){ + vo_functions_t* video_driver=video_out_drivers[i]; + const vo_info_t *info = video_driver->get_info(); + if(!strcmp(info->short_name,vo)){ + // name matches, try it + if(!video_driver->preinit(vo_subdevice)) + return video_driver; // success! + } + } + // continue... + ++vo_list; + if(!(vo_list[0])) return NULL; // do NOT fallback to others + } + // now try the rest... + vo_subdevice=NULL; + for(i=0;video_out_drivers[i];i++){ + vo_functions_t* video_driver=video_out_drivers[i]; + if(!video_driver->preinit(vo_subdevice)) + return video_driver; // success! + } + return NULL; +} + + #if defined(HAVE_FBDEV)||defined(HAVE_VESA) /* Borrowed from vo_fbdev.c Monitor ranges related functions*/ diff --git a/libvo/video_out.h b/libvo/video_out.h index 04e0c219ea..c6bd52e3f1 100644 --- a/libvo/video_out.h +++ b/libvo/video_out.h @@ -151,6 +151,9 @@ typedef struct vo_functions_s char *vo_format_name(int format); int vo_init(void); +vo_functions_t* init_best_video_out(char** vo_list); +void list_video_out(); + // NULL terminated array of all drivers extern vo_functions_t* video_out_drivers[]; diff --git a/mplayer.c b/mplayer.c index 47694ad795..3e7ac94ee9 100644 --- a/mplayer.c +++ b/mplayer.c @@ -219,8 +219,10 @@ static int play_n_frames=-1; static int play_n_frames_mf=-1; // screen info: -char* video_driver=NULL; //"mga"; // default -char* audio_driver=NULL; +char* video_driver=NULL; // OBSOLETE, FIXME gui +char* audio_driver=NULL; // OBSOLETE, FIXME gui +char** video_driver_list=NULL; +char** audio_driver_list=NULL; extern char *vo_subdevice; extern char *ao_subdevice; @@ -591,17 +593,12 @@ int gui_no_filename=0; exit(0); } - if(video_driver && strcmp(video_driver,"help")==0){ - mp_msg(MSGT_CPLAYER, MSGL_INFO, MSGTR_AvailableVideoOutputDrivers); - i=0; - while (video_out_drivers[i]) { - const vo_info_t *info = video_out_drivers[i++]->get_info (); - printf("\t%s\t%s\n", info->short_name, info->name); - } - printf("\n"); + if(video_driver_list && strcmp(video_driver_list[0],"help")==0){ + list_video_out(); exit(0); } + audio_driver=audio_driver_list?audio_driver_list[0]:NULL; if(audio_driver && strcmp(audio_driver,"help")==0){ mp_msg(MSGT_CPLAYER, MSGL_INFO, MSGTR_AvailableAudioOutputDrivers); i=0; @@ -849,46 +846,6 @@ if(!use_stdin && !slave_mode){ if(vo_vobsub) sub_auto=0; // don't do autosub for textsubs if vobsub found -//==================== Init Video Out ============================ - -// check video_out driver name: -{ - char* vo = video_driver ? strdup(video_driver) : NULL; - if(vo_subdevice) { - free(vo_subdevice); - vo_subdevice = NULL; - } - 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); - vo[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,vo) == 0){ - video_out = video_out_drivers[i];break; - } - } - if(!video_out){ - mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_InvalidVOdriver,vo?vo:"?"); - exit_player(MSGTR_Exit_error); - } - if(vo) - free(vo); -} - //==================== Init Audio Out ============================ // check audio_out driver name: @@ -1123,13 +1080,15 @@ if(sh_video){ sh_video->fps,sh_video->frametime ); - vo_fps = sh_video->fps; /* need to set fps here for output encoders to pick it up in their init */ if(force_fps){ sh_video->fps=force_fps; sh_video->frametime=1.0f/sh_video->fps; - vo_fps = force_fps; } + vo_fps = sh_video->fps; +#ifdef X11_FULLSCREEN + vo_mouse_timer_const=(int)sh_video->fps; +#endif if(!sh_video->fps && !force_fps){ mp_msg(MSGT_CPLAYER,MSGL_ERR,MSGTR_FPSnotspecified); @@ -1224,13 +1183,11 @@ if(!sh_video) goto main; // audio-only current_module="preinit_libvo"; vo_config_count=0; -if((video_out->preinit(vo_subdevice))!=0){ +//if((video_out->preinit(vo_subdevice))!=0){ +if(!(video_out=init_best_video_out(video_driver_list))){ mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_ErrorInitializingVODevice); goto goto_next_file; // exit_player(MSGTR_Exit_error); } -#ifdef X11_FULLSCREEN -vo_mouse_timer_const=(int)sh_video->fps; -#endif sh_video->video_out=video_out; inited_flags|=INITED_VO; @@ -1356,8 +1313,6 @@ if(sh_audio){ sh_audio->channels,sh_audio->sample_format,0)){ mp_msg(MSGT_CPLAYER,MSGL_ERR,MSGTR_CannotInitAO); sh_audio=d_audio->sh=NULL; - if(sh_video == NULL) - goto goto_next_file; } else { inited_flags|=INITED_AO; } -- cgit v1.2.3