Commit d8aaa1c5 authored by Antoine Cellerier's avatar Antoine Cellerier

Add new --sdl-chroma option to force the used chroma.

parent 37f3331d
...@@ -98,6 +98,11 @@ static int NewPicture ( vout_thread_t *, picture_t * ); ...@@ -98,6 +98,11 @@ static int NewPicture ( vout_thread_t *, picture_t * );
static void SetPalette ( vout_thread_t *, static void SetPalette ( vout_thread_t *,
uint16_t *, uint16_t *, uint16_t * ); uint16_t *, uint16_t *, uint16_t * );
#define CHROMA_TEXT N_("SDL chroma format")
#define CHROMA_LONGTEXT N_( \
"Force the SDL renderer to use a specific chroma format instead of " \
"trying to improve performances by using the most efficient one.")
/***************************************************************************** /*****************************************************************************
* Module descriptor * Module descriptor
*****************************************************************************/ *****************************************************************************/
...@@ -108,6 +113,7 @@ vlc_module_begin(); ...@@ -108,6 +113,7 @@ vlc_module_begin();
set_description( _("Simple DirectMedia Layer video output") ); set_description( _("Simple DirectMedia Layer video output") );
set_capability( "video output", 60 ); set_capability( "video output", 60 );
add_shortcut( "sdl" ); add_shortcut( "sdl" );
add_string( "sdl-chroma", NULL, NULL, CHROMA_TEXT, CHROMA_LONGTEXT, VLC_TRUE );
set_callbacks( Open, Close ); set_callbacks( Open, Close );
/* XXX: check for conflicts with the SDL audio output */ /* XXX: check for conflicts with the SDL audio output */
var_Create( p_module->p_libvlc_global, "sdl", VLC_VAR_MUTEX ); var_Create( p_module->p_libvlc_global, "sdl", VLC_VAR_MUTEX );
...@@ -615,6 +621,8 @@ static int OpenDisplay( vout_thread_t *p_vout ) ...@@ -615,6 +621,8 @@ static int OpenDisplay( vout_thread_t *p_vout )
/* SDL fucked up fourcc definitions on bigendian machines */ /* SDL fucked up fourcc definitions on bigendian machines */
uint32_t i_sdl_chroma; uint32_t i_sdl_chroma;
char *psz_chroma = NULL;
uint32_t i_chroma = 0;
/* Set main window's size */ /* Set main window's size */
p_vout->p_sys->i_width = p_vout->b_fullscreen ? p_vout->output.i_width : p_vout->p_sys->i_width = p_vout->b_fullscreen ? p_vout->output.i_width :
...@@ -646,37 +654,59 @@ static int OpenDisplay( vout_thread_t *p_vout ) ...@@ -646,37 +654,59 @@ static int OpenDisplay( vout_thread_t *p_vout )
SDL_LockSurface( p_vout->p_sys->p_display ); SDL_LockSurface( p_vout->p_sys->p_display );
if( ( psz_chroma = config_GetPsz( p_vout, "sdl-chroma" ) ) )
{
if( strlen( psz_chroma ) >= 4 )
{
memcpy(&i_chroma, psz_chroma, 4);
msg_Dbg( p_vout, "Forcing chroma to 0x%.8x (%4.4s)", i_chroma, (char*)&i_chroma );
}
else
{
free( psz_chroma );
psz_chroma = NULL;
}
}
/* Choose the chroma we will try first. */ /* Choose the chroma we will try first. */
switch( p_vout->render.i_chroma ) do
{ {
case VLC_FOURCC('Y','U','Y','2'): if( !psz_chroma ) i_chroma = 0;
case VLC_FOURCC('Y','U','N','V'): switch( i_chroma ? i_chroma : p_vout->render.i_chroma )
p_vout->output.i_chroma = VLC_FOURCC('Y','U','Y','2'); {
i_sdl_chroma = SDL_YUY2_OVERLAY; case VLC_FOURCC('Y','U','Y','2'):
break; case VLC_FOURCC('Y','U','N','V'):
case VLC_FOURCC('U','Y','V','Y'): p_vout->output.i_chroma = VLC_FOURCC('Y','U','Y','2');
case VLC_FOURCC('U','Y','N','V'): i_sdl_chroma = SDL_YUY2_OVERLAY;
case VLC_FOURCC('Y','4','2','2'): break;
p_vout->output.i_chroma = VLC_FOURCC('U','Y','V','Y'); case VLC_FOURCC('U','Y','V','Y'):
i_sdl_chroma = SDL_UYVY_OVERLAY; case VLC_FOURCC('U','Y','N','V'):
break; case VLC_FOURCC('Y','4','2','2'):
case VLC_FOURCC('Y','V','Y','U'): p_vout->output.i_chroma = VLC_FOURCC('U','Y','V','Y');
p_vout->output.i_chroma = VLC_FOURCC('Y','V','Y','U'); i_sdl_chroma = SDL_UYVY_OVERLAY;
i_sdl_chroma = SDL_YVYU_OVERLAY; break;
break; case VLC_FOURCC('Y','V','Y','U'):
case VLC_FOURCC('Y','V','1','2'): p_vout->output.i_chroma = VLC_FOURCC('Y','V','Y','U');
case VLC_FOURCC('I','4','2','0'): i_sdl_chroma = SDL_YVYU_OVERLAY;
case VLC_FOURCC('I','Y','U','V'): break;
default: case VLC_FOURCC('Y','V','1','2'):
p_vout->output.i_chroma = VLC_FOURCC('Y','V','1','2'); case VLC_FOURCC('I','4','2','0'):
i_sdl_chroma = SDL_YV12_OVERLAY; case VLC_FOURCC('I','Y','U','V'):
break; default:
p_vout->output.i_chroma = VLC_FOURCC('Y','V','1','2');
i_sdl_chroma = SDL_YV12_OVERLAY;
break;
}
free( psz_chroma ); psz_chroma = NULL;
p_vout->p_sys->p_overlay =
SDL_CreateYUVOverlay( 32, 32, i_sdl_chroma,
p_vout->p_sys->p_display );
/* FIXME: if the first overlay we find is software, don't stop,
* because we may find a hardware one later ... */
} }
while( i_chroma && !p_vout->p_sys->p_overlay );
p_vout->p_sys->p_overlay =
SDL_CreateYUVOverlay( 32, 32, i_sdl_chroma, p_vout->p_sys->p_display );
/* FIXME: if the first overlay we find is software, don't stop,
* because we may find a hardware one later ... */
/* If this best choice failed, fall back to other chromas */ /* If this best choice failed, fall back to other chromas */
if( p_vout->p_sys->p_overlay == NULL ) if( p_vout->p_sys->p_overlay == NULL )
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment