mirror of
https://github.com/mpv-player/mpv
synced 2025-02-16 20:27:23 +00:00
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
This commit is contained in:
parent
4b05808939
commit
1a6f3e1d60
@ -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},
|
||||
|
@ -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*/
|
||||
|
@ -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[];
|
||||
|
||||
|
71
mplayer.c
71
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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user