# include "config.h"
#endif
-#include <vlc/vlc.h>
+#include <vlc_common.h>
+#include <vlc_plugin.h>
#include <vlc_interface.h>
#include <vlc_playlist.h>
#include <vlc_vout.h>
/* For RGB output */
int i_surfaces;
- vlc_bool_t b_cursor;
- vlc_bool_t b_cursor_autohidden;
+ bool b_cursor;
+ bool b_cursor_autohidden;
mtime_t i_lastmoved;
+ mtime_t i_mouse_hide_timeout;
mtime_t i_lastpressed; /* to track dbl-clicks */
};
/*****************************************************************************
* Module descriptor
*****************************************************************************/
-vlc_module_begin();
- set_shortname( "SDL" );
- set_category( CAT_VIDEO );
- set_subcategory( SUBCAT_VIDEO_VOUT );
- set_description( _("Simple DirectMedia Layer video output") );
- set_capability( "video output", 60 );
- add_shortcut( "sdl" );
- add_string( "sdl-chroma", NULL, NULL, CHROMA_TEXT, CHROMA_LONGTEXT, VLC_TRUE );
- set_callbacks( Open, Close );
+vlc_module_begin ()
+ set_shortname( "SDL" )
+ set_category( CAT_VIDEO )
+ set_subcategory( SUBCAT_VIDEO_VOUT )
+ set_description( N_("Simple DirectMedia Layer video output") )
+ set_capability( "video output", 60 )
+ add_shortcut( "sdl" )
+ add_string( "sdl-chroma", NULL, NULL, CHROMA_TEXT, CHROMA_LONGTEXT, true )
+ set_callbacks( Open, Close )
#if defined( __i386__ ) || defined( __x86_64__ )
/* On i386, SDL is linked against svgalib */
- linked_with_a_crap_library_which_uses_atexit();
+ linked_with_a_crap_library_which_uses_atexit ()
#endif
-vlc_module_end();
+vlc_module_end ()
+
+static vlc_mutex_t sdl_lock = VLC_STATIC_MUTEX;
/*****************************************************************************
* OpenVideo: allocate SDL video thread output method
{
vout_thread_t * p_vout = (vout_thread_t *)p_this;
/* XXX: check for conflicts with the SDL audio output */
- vlc_mutex_t *lock = var_AcquireMutex( "sdl" );
+ vlc_mutex_lock( &sdl_lock );
#ifdef HAVE_SETENV
char *psz_method;
#endif
- if( lock == NULL )
- return VLC_ENOMEM;
-
p_vout->p_sys = malloc( sizeof( vout_sys_t ) );
if( p_vout->p_sys == NULL )
{
- vlc_mutex_unlock( lock );
+ vlc_mutex_unlock( &sdl_lock );
return VLC_ENOMEM;
}
+ memset( p_vout->p_sys, 0, sizeof( vout_sys_t ) );
+
/* Check if SDL video module has been initialized */
if( SDL_WasInit( SDL_INIT_VIDEO ) != 0 )
{
- vlc_mutex_unlock( lock );
+ vlc_mutex_unlock( &sdl_lock );
free( p_vout->p_sys );
return VLC_EGENERIC;
}
p_vout->pf_control = NULL;
#ifdef HAVE_SETENV
- psz_method = config_GetPsz( p_vout, "vout" );
+ char* psz = psz_method = config_GetPsz( p_vout, "vout" );
if( psz_method )
{
while( *psz_method && *psz_method != ':' )
setenv( "SDL_VIDEODRIVER", psz_method + 1, 1 );
}
}
+ free( psz );
#endif
/* Initialize library */
/* Win32 SDL implementation doesn't support SDL_INIT_EVENTTHREAD yet*/
| SDL_INIT_EVENTTHREAD
#endif
-#ifdef DEBUG
+#ifndef NDEBUG
/* In debug mode you may want vlc to dump a core instead of staying
* stuck */
| SDL_INIT_NOPARACHUTE
{
msg_Err( p_vout, "cannot initialize SDL (%s)", SDL_GetError() );
free( p_vout->p_sys );
- vlc_mutex_unlock( lock );
+ vlc_mutex_unlock( &sdl_lock );
return VLC_EGENERIC;
}
- vlc_mutex_unlock( lock );
+ vlc_mutex_unlock( &sdl_lock );
/* Translate keys into unicode */
SDL_EnableUNICODE(1);
p_vout->p_sys->b_cursor = 1;
p_vout->p_sys->b_cursor_autohidden = 0;
p_vout->p_sys->i_lastmoved = p_vout->p_sys->i_lastpressed = mdate();
+ p_vout->p_sys->i_mouse_hide_timeout =
+ var_GetInteger(p_vout, "mouse-hide-timeout") * 1000;
if( OpenDisplay( p_vout ) )
{
val.i_int = p_vout->fmt_in.i_visible_height;
var_Set( p_vout, "mouse-y", val );
-
- val.b_bool = VLC_TRUE;
- var_Set( p_vout, "mouse-moved", val );
+ var_SetBool( p_vout, "mouse-moved", true );
if( p_vout->p_sys->b_cursor )
{
switch( event.button.button )
{
case SDL_BUTTON_LEFT:
- var_Get( p_vout, "mouse-button-down", &val );
- val.i_int &= ~1;
- var_Set( p_vout, "mouse-button-down", val );
+ {
+ var_Get( p_vout, "mouse-button-down", &val );
+ val.i_int &= ~1;
+ var_Set( p_vout, "mouse-button-down", val );
- val.b_bool = VLC_TRUE;
- var_Set( p_vout, "mouse-clicked", val );
+ var_SetBool( p_vout, "mouse-clicked", true );
+ var_SetBool( p_vout->p_libvlc, "intf-popupmenu", false );
+ }
break;
case SDL_BUTTON_MIDDLE:
{
- playlist_t *p_playlist;
-
var_Get( p_vout, "mouse-button-down", &val );
val.i_int &= ~2;
var_Set( p_vout, "mouse-button-down", val );
- p_playlist = vlc_object_find( p_vout, VLC_OBJECT_PLAYLIST,
- FIND_ANYWHERE );
- if( p_playlist != NULL )
- {
- vlc_value_t val;
- var_Get( p_playlist, "intf-show", &val );
- val.b_bool = !val.b_bool;
- var_Set( p_playlist, "intf-show", val );
- vlc_object_release( p_playlist );
- }
+ var_Get( p_vout->p_libvlc, "intf-show", &val );
+ val.b_bool = !val.b_bool;
+ var_Set( p_vout->p_libvlc, "intf-show", val );
}
break;
case SDL_BUTTON_RIGHT:
{
- intf_thread_t *p_intf;
- playlist_t *p_playlist;
-
var_Get( p_vout, "mouse-button-down", &val );
val.i_int &= ~4;
- var_Set( p_vout, "mous-button-down", val );
- p_intf = vlc_object_find( p_vout, VLC_OBJECT_INTF,
- FIND_ANYWHERE );
- if( p_intf )
- {
- p_intf->b_menu_change = 1;
- vlc_object_release( p_intf );
- }
-
- p_playlist = vlc_object_find( p_vout, VLC_OBJECT_PLAYLIST,
- FIND_ANYWHERE );
-
- if( p_playlist != NULL )
- {
- vlc_value_t val;
- val.b_bool = VLC_TRUE;
- var_Set( p_playlist, "intf-popupmenu", val );
- vlc_object_release( p_playlist );
- }
+ var_Set( p_vout, "mouse-button-down", val );
+
+ var_SetBool( p_vout->p_libvlc, "intf-popupmenu", true );
}
break;
}
/* Quit event (close the window) */
case SDL_QUIT:
{
- playlist_t *p_playlist = (playlist_t *)vlc_object_find( p_vout, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
+#if 0
+ playlist_t *p_playlist = pl_Hold( p_vout );
if( p_playlist != NULL )
{
playlist_Stop( p_playlist );
- vlc_object_release( p_playlist );
+ pl_Release( p_vout );
}
+#else
+#warning FIXME FIXME ?
+#endif
}
break;
p_vout->i_changes |= VOUT_SIZE_CHANGE;
}
+ /* autoscale toggle */
+ if( p_vout->i_changes & VOUT_SCALE_CHANGE )
+ {
+ p_vout->i_changes &= ~VOUT_SCALE_CHANGE;
+
+ p_vout->b_autoscale = var_GetBool( p_vout, "autoscale" );
+ p_vout->i_zoom = (int) ZOOM_FP_FACTOR;
+
+ p_vout->i_changes |= VOUT_SIZE_CHANGE;
+ }
+
+ /* scaling factor (if no-autoscale) */
+ if( p_vout->i_changes & VOUT_ZOOM_CHANGE )
+ {
+ p_vout->i_changes &= ~VOUT_ZOOM_CHANGE;
+
+ p_vout->b_autoscale = false;
+ p_vout->i_zoom = (int)( ZOOM_FP_FACTOR * var_GetFloat( p_vout, "scale" ) );
+
+ p_vout->i_changes |= VOUT_SIZE_CHANGE;
+ }
+
/* Crop or Aspect Ratio Changes */
if( p_vout->i_changes & VOUT_CROP_CHANGE ||
p_vout->i_changes & VOUT_ASPECT_CHANGE )
/* Pointer change */
if( ! p_vout->p_sys->b_cursor_autohidden &&
- ( mdate() - p_vout->p_sys->i_lastmoved > 2000000 ) )
+ ( mdate() - p_vout->p_sys->i_lastmoved >
+ p_vout->p_sys->i_mouse_hide_timeout ) )
{
/* Hide the mouse automatically */
p_vout->p_sys->b_cursor_autohidden = 1;
/*****************************************************************************
* Key events handling
*****************************************************************************/
-static struct
+static const struct
{
SDLKey sdl_key;
int i_vlckey;
/* SDL fucked up fourcc definitions on bigendian machines */
uint32_t i_sdl_chroma;
char *psz_chroma = NULL;
- uint32_t i_chroma = 0;
+ vlc_fourcc_t i_chroma = 0;
+
+ bool b_overlay = config_GetInt( p_vout, "overlay" );
/* Set main window's size */
#if SDL_VERSION_ATLEAST(1,2,10)
if( ( psz_chroma = config_GetPsz( p_vout, "sdl-chroma" ) ) )
{
- if( strlen( psz_chroma ) >= 4 )
+ i_chroma = vlc_fourcc_GetCodecFromString( VIDEO_ES, psz_chroma );
+ if( i_chroma )
{
- memcpy(&i_chroma, psz_chroma, 4);
msg_Dbg( p_vout, "Forcing chroma to 0x%.8x (%4.4s)", i_chroma, (char*)&i_chroma );
}
else
}
}
- /* Choose the chroma we will try first. */
- do
+ if( b_overlay )
{
- if( !psz_chroma ) i_chroma = 0;
- switch( i_chroma ? i_chroma : p_vout->render.i_chroma )
+ /* Choose the chroma we will try first. */
+ do
{
- case VLC_FOURCC('Y','U','Y','2'):
- case VLC_FOURCC('Y','U','N','V'):
- p_vout->output.i_chroma = VLC_FOURCC('Y','U','Y','2');
- i_sdl_chroma = SDL_YUY2_OVERLAY;
- break;
- case VLC_FOURCC('U','Y','V','Y'):
- case VLC_FOURCC('U','Y','N','V'):
- case VLC_FOURCC('Y','4','2','2'):
- p_vout->output.i_chroma = VLC_FOURCC('U','Y','V','Y');
- i_sdl_chroma = SDL_UYVY_OVERLAY;
- break;
- case VLC_FOURCC('Y','V','Y','U'):
- p_vout->output.i_chroma = VLC_FOURCC('Y','V','Y','U');
- i_sdl_chroma = SDL_YVYU_OVERLAY;
- break;
- case VLC_FOURCC('Y','V','1','2'):
- case VLC_FOURCC('I','4','2','0'):
- case VLC_FOURCC('I','Y','U','V'):
- 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;
+ if( !psz_chroma ) i_chroma = 0;
+ switch( i_chroma ? i_chroma : p_vout->render.i_chroma )
+ {
+ case VLC_CODEC_YUYV:
+ p_vout->output.i_chroma = VLC_CODEC_YUYV;
+ i_sdl_chroma = SDL_YUY2_OVERLAY;
+ break;
+ case VLC_CODEC_UYVY:
+ p_vout->output.i_chroma = VLC_CODEC_UYVY;
+ i_sdl_chroma = SDL_UYVY_OVERLAY;
+ break;
+ case VLC_CODEC_YVYU:
+ p_vout->output.i_chroma = VLC_CODEC_YVYU;
+ i_sdl_chroma = SDL_YVYU_OVERLAY;
+ break;
+ case VLC_CODEC_YV12:
+ case VLC_CODEC_I420:
+ default:
+ p_vout->output.i_chroma = VLC_CODEC_YV12;
+ 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 ... */
+ }
+ while( i_chroma && !p_vout->p_sys->p_overlay );
- /* If this best choice failed, fall back to other chromas */
- if( p_vout->p_sys->p_overlay == NULL )
- {
- p_vout->output.i_chroma = VLC_FOURCC('I','Y','U','V');
- p_vout->p_sys->p_overlay =
- SDL_CreateYUVOverlay( 32, 32, SDL_IYUV_OVERLAY,
- p_vout->p_sys->p_display );
- }
+ /* If this best choice failed, fall back to other chromas */
+ if( p_vout->p_sys->p_overlay == NULL )
+ {
+ p_vout->output.i_chroma = VLC_CODEC_I420;
+ p_vout->p_sys->p_overlay =
+ SDL_CreateYUVOverlay( 32, 32, SDL_IYUV_OVERLAY,
+ p_vout->p_sys->p_display );
+ }
- if( p_vout->p_sys->p_overlay == NULL )
- {
- p_vout->output.i_chroma = VLC_FOURCC('Y','V','1','2');
- p_vout->p_sys->p_overlay =
- SDL_CreateYUVOverlay( 32, 32, SDL_YV12_OVERLAY,
- p_vout->p_sys->p_display );
- }
+ if( p_vout->p_sys->p_overlay == NULL )
+ {
+ p_vout->output.i_chroma = VLC_CODEC_YV12;
+ p_vout->p_sys->p_overlay =
+ SDL_CreateYUVOverlay( 32, 32, SDL_YV12_OVERLAY,
+ p_vout->p_sys->p_display );
+ }
- if( p_vout->p_sys->p_overlay == NULL )
- {
- p_vout->output.i_chroma = VLC_FOURCC('Y','U','Y','2');
- p_vout->p_sys->p_overlay =
- SDL_CreateYUVOverlay( 32, 32, SDL_YUY2_OVERLAY,
- p_vout->p_sys->p_display );
+ if( p_vout->p_sys->p_overlay == NULL )
+ {
+ p_vout->output.i_chroma = VLC_CODEC_YUYV;
+ p_vout->p_sys->p_overlay =
+ SDL_CreateYUVOverlay( 32, 32, SDL_YUY2_OVERLAY,
+ p_vout->p_sys->p_display );
+ }
}
if( p_vout->p_sys->p_overlay == NULL )
{
- msg_Warn( p_vout, "no SDL overlay for 0x%.8x (%4.4s)",
- p_vout->render.i_chroma, (char*)&p_vout->render.i_chroma );
+ if( b_overlay )
+ msg_Warn( p_vout, "no SDL overlay for 0x%.8x (%4.4s)",
+ p_vout->render.i_chroma,
+ (char*)&p_vout->render.i_chroma );
+ else
+ msg_Warn( p_vout, "SDL overlay disabled by the user" );
switch( p_vout->p_sys->p_display->format->BitsPerPixel )
{
case 8:
- p_vout->output.i_chroma = VLC_FOURCC('R','G','B','2');
+ p_vout->output.i_chroma = VLC_CODEC_RGB8;
p_vout->output.pf_setpalette = SetPalette;
break;
case 15:
- p_vout->output.i_chroma = VLC_FOURCC('R','V','1','5');
+ p_vout->output.i_chroma = VLC_CODEC_RGB15;
break;
case 16:
- p_vout->output.i_chroma = VLC_FOURCC('R','V','1','6');
+ p_vout->output.i_chroma = VLC_CODEC_RGB16;
break;
case 24:
- p_vout->output.i_chroma = VLC_FOURCC('R','V','2','4');
+ p_vout->output.i_chroma = VLC_CODEC_RGB24;
break;
case 32:
- p_vout->output.i_chroma = VLC_FOURCC('R','V','3','2');
+ p_vout->output.i_chroma = VLC_CODEC_RGB32;
break;
default:
msg_Err( p_vout, "unknown screen depth %i",