* vout_sdl.c: SDL video output display method
*****************************************************************************
* Copyright (C) 1998-2001 VideoLAN
- * $Id: vout_sdl.c,v 1.82 2002/02/19 00:50:19 sam Exp $
+ * $Id: vout_sdl.c,v 1.85 2002/03/18 19:14:52 sam Exp $
*
* Authors: Samuel Hocevar <sam@zoy.org>
* Pierre Baillet <oct@zoy.org>
/* For RGB output */
int i_surfaces;
- int i_red_mask;
- int i_green_mask;
- int i_blue_mask;
boolean_t b_cursor;
boolean_t b_cursor_autohidden;
static void vout_Render ( struct vout_thread_s *, struct picture_s * );
static void vout_Display ( struct vout_thread_s *, struct picture_s * );
-static int SDLOpenDisplay ( vout_thread_t *p_vout );
-static void SDLCloseDisplay ( vout_thread_t *p_vout );
-static int SDLNewPicture ( vout_thread_t *p_vout, picture_t *p_pic );
+static int OpenDisplay ( struct vout_thread_s * );
+static void CloseDisplay ( struct vout_thread_s * );
+static int NewPicture ( struct vout_thread_s *, struct picture_s * );
+static void SetPalette ( struct vout_thread_s *, u16 *, u16 *, u16 * );
/*****************************************************************************
* Functions exported as capabilities. They are declared as static so that
*****************************************************************************/
static int vout_Create( vout_thread_t *p_vout )
{
+ char *psz_method;
+
if( SDL_WasInit( SDL_INIT_VIDEO ) != 0 )
{
return( 1 );
return( 1 );
}
+ psz_method = config_GetPszVariable( "vout" );
+ if( psz_method )
+ {
+ while( *psz_method && *psz_method != ':' )
+ {
+ psz_method++;
+ }
+
+ if( *psz_method )
+ {
+ setenv( "SDL_VIDEODRIVER", psz_method + 1, 1 );
+ }
+ }
+
/* Initialize library */
if( SDL_Init( SDL_INIT_VIDEO
#ifndef WIN32
}
#endif
- if( SDLOpenDisplay( p_vout ) )
+ if( OpenDisplay( p_vout ) )
{
intf_ErrMsg( "vout error: can't set up SDL (%s)", SDL_GetError() );
SDL_QuitSubSystem( SDL_INIT_VIDEO );
}
/* Allocate the picture if we found one */
- if( p_pic == NULL || SDLNewPicture( p_vout, p_pic ) )
+ if( p_pic == NULL || NewPicture( p_vout, p_pic ) )
{
break;
}
*****************************************************************************/
static void vout_Destroy( vout_thread_t *p_vout )
{
- SDLCloseDisplay( p_vout );
+ CloseDisplay( p_vout );
SDL_QuitSubSystem( SDL_INIT_VIDEO );
case SDL_VIDEORESIZE: /* Resizing of window */
p_vout->p_sys->i_width = event.resize.w;
p_vout->p_sys->i_height = event.resize.h;
- SDLCloseDisplay( p_vout );
- SDLOpenDisplay( p_vout );
+ CloseDisplay( p_vout );
+ OpenDisplay( p_vout );
break;
case SDL_MOUSEMOTION:
/* following functions are local */
/*****************************************************************************
- * SDLOpenDisplay: open and initialize SDL device
+ * OpenDisplay: open and initialize SDL device
*****************************************************************************
* Open and initialize display according to preferences specified in the vout
* thread fields.
*****************************************************************************/
-static int SDLOpenDisplay( vout_thread_t *p_vout )
+static int OpenDisplay( vout_thread_t *p_vout )
{
Uint32 i_flags;
int i_bpp;
p_vout->p_sys->p_overlay =
SDL_CreateYUVOverlay( 32, 32, p_vout->output.i_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 ... */
switch( p_vout->p_sys->p_display->format->BitsPerPixel )
{
case 8:
- p_vout->output.i_chroma = FOURCC_BI_RGB;
+ p_vout->output.i_chroma = FOURCC_RGB2;
+ p_vout->output.pf_setpalette = SetPalette;
break;
case 15:
p_vout->output.i_chroma = FOURCC_RV15;
p_vout->output.i_chroma = FOURCC_RV16;
break;
case 24:
- p_vout->output.i_chroma = FOURCC_BI_BITFIELDS;
+ p_vout->output.i_chroma = FOURCC_RV24;
break;
case 32:
- p_vout->output.i_chroma = FOURCC_BI_BITFIELDS;
+ p_vout->output.i_chroma = FOURCC_RV32;
break;
default:
intf_ErrMsg( "vout error: unknown screen depth" );
return( -1 );
}
- p_vout->p_sys->i_red_mask = p_vout->p_sys->p_display->format->Rmask;
- p_vout->p_sys->i_green_mask = p_vout->p_sys->p_display->format->Gmask;
- p_vout->p_sys->i_blue_mask = p_vout->p_sys->p_display->format->Bmask;
+ p_vout->output.i_rmask = p_vout->p_sys->p_display->format->Rmask;
+ p_vout->output.i_gmask = p_vout->p_sys->p_display->format->Gmask;
+ p_vout->output.i_bmask = p_vout->p_sys->p_display->format->Bmask;
SDL_WM_SetCaption( VOUT_TITLE " (software RGB SDL output)",
VOUT_TITLE " (software RGB SDL output)" );
}
/*****************************************************************************
- * SDLCloseDisplay: close and reset SDL device
+ * CloseDisplay: close and reset SDL device
*****************************************************************************
- * This function returns all resources allocated by SDLOpenDisplay and restore
+ * This function returns all resources allocated by OpenDisplay and restore
* the original state of the device.
*****************************************************************************/
-static void SDLCloseDisplay( vout_thread_t *p_vout )
+static void CloseDisplay( vout_thread_t *p_vout )
{
SDL_FreeYUVOverlay( p_vout->p_sys->p_overlay );
SDL_UnlockSurface ( p_vout->p_sys->p_display );
}
/*****************************************************************************
- * SDLNewPicture: allocate a picture
+ * NewPicture: allocate a picture
*****************************************************************************
* Returns 0 on success, -1 otherwise
*****************************************************************************/
-static int SDLNewPicture( vout_thread_t *p_vout, picture_t *p_pic )
+static int NewPicture( vout_thread_t *p_vout, picture_t *p_pic )
{
int i_width = p_vout->output.i_width;
int i_height = p_vout->output.i_height;
return -1;
}
+ switch( p_vout->p_sys->p_display->format->BitsPerPixel )
+ {
+ case 8:
+ p_pic->p->i_pixel_bytes = 1;
+ break;
+ case 15:
+ case 16:
+ p_pic->p->i_pixel_bytes = 2;
+ break;
+ case 24:
+ case 32:
+ p_pic->p->i_pixel_bytes = 4;
+ break;
+ default:
+ return( -1 );
+ }
+
p_pic->p->p_pixels = p_vout->p_sys->p_display->pixels;
p_pic->p->i_lines = p_vout->p_sys->p_display->h;
p_pic->p->i_pitch = p_vout->p_sys->p_display->pitch;
- p_pic->p->i_pixel_bytes = 2;
- if( p_pic->p->i_pitch == 2 * p_vout->p_sys->p_display->w )
+ if( p_pic->p->i_pitch ==
+ p_pic->p->i_pixel_bytes * p_vout->p_sys->p_display->w )
{
p_pic->p->b_margin = 0;
}
{
p_pic->p->b_margin = 1;
p_pic->p->b_hidden = 1;
- p_pic->p->i_visible_bytes = 2 * p_vout->p_sys->p_display->w;
+ p_pic->p->i_visible_bytes =
+ p_pic->p->i_pixel_bytes * p_vout->p_sys->p_display->w;
}
- p_pic->p->i_red_mask = p_vout->p_sys->p_display->format->Rmask;
- p_pic->p->i_green_mask = p_vout->p_sys->p_display->format->Gmask;
- p_pic->p->i_blue_mask = p_vout->p_sys->p_display->format->Bmask;
-
p_vout->p_sys->i_surfaces++;
p_pic->i_planes = 1;
return 0;
}
+/*****************************************************************************
+ * SetPalette: sets an 8 bpp palette
+ *****************************************************************************/
+static void SetPalette( vout_thread_t *p_vout, u16 *red, u16 *green, u16 *blue )
+{
+ SDL_Color colors[256];
+ int i;
+
+ /* Fill colors with color information */
+ for( i = 0; i < 256; i++ )
+ {
+ colors[ i ].r = red[ i ] >> 8;
+ colors[ i ].g = green[ i ] >> 8;
+ colors[ i ].b = blue[ i ] >> 8;
+ }
+
+ /* Set palette */
+ if( SDL_SetColors( p_vout->p_sys->p_display, colors, 0, 256 ) == 0 )
+ {
+ intf_ErrMsg( "vout error: failed setting palette" );
+ }
+}
+