Commit 851ffa75 authored by Gildas Bazin's avatar Gildas Bazin

* Fixed the sdl video output plugin that I broke 2 days ago.
parent 156201a1
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* vout_sdl.c: SDL video output display method * vout_sdl.c: SDL video output display method
***************************************************************************** *****************************************************************************
* Copyright (C) 1998, 1999, 2000 VideoLAN * Copyright (C) 1998, 1999, 2000 VideoLAN
* $Id: vout_sdl.c,v 1.61 2001/07/30 13:57:46 massiot Exp $ * $Id: vout_sdl.c,v 1.62 2001/08/06 20:45:55 gbazin Exp $
* *
* Authors: Samuel Hocevar <sam@zoy.org> * Authors: Samuel Hocevar <sam@zoy.org>
* Pierre Baillet <oct@zoy.org> * Pierre Baillet <oct@zoy.org>
...@@ -111,8 +111,11 @@ static void vout_Display ( struct vout_thread_s * ); ...@@ -111,8 +111,11 @@ static void vout_Display ( struct vout_thread_s * );
static void vout_SetPalette( p_vout_thread_t p_vout, u16 *red, u16 *green, static void vout_SetPalette( p_vout_thread_t p_vout, u16 *red, u16 *green,
u16 *blue, u16 *transp ); u16 *blue, u16 *transp );
static int SDLOpenDisplay ( vout_thread_t *p_vout ); static int SDLOpenDisplay ( vout_thread_t *p_vout );
static void SDLCloseDisplay ( vout_thread_t *p_vout ); static void SDLCloseDisplay ( vout_thread_t *p_vout );
static void OutputCoords ( const picture_t *p_pic, const boolean_t scale,
const int win_w, const int win_h,
int *dx, int *dy, int *w, int *h );
/***************************************************************************** /*****************************************************************************
* Functions exported as capabilities. They are declared as static so that * Functions exported as capabilities. They are declared as static so that
...@@ -530,7 +533,7 @@ static void vout_SetPalette( p_vout_thread_t p_vout, u16 *red, u16 *green, ...@@ -530,7 +533,7 @@ static void vout_SetPalette( p_vout_thread_t p_vout, u16 *red, u16 *green,
colors[ i ].g = green[ i ] >> 8; colors[ i ].g = green[ i ] >> 8;
colors[ i ].b = blue[ i ] >> 8; colors[ i ].b = blue[ i ] >> 8;
} }
/* Set palette */ /* Set palette */
if( SDL_SetColors( p_vout->p_sys->p_display, colors, 0, 256 ) == 0 ) if( SDL_SetColors( p_vout->p_sys->p_display, colors, 0, 256 ) == 0 )
{ {
...@@ -548,6 +551,7 @@ static void vout_SetPalette( p_vout_thread_t p_vout, u16 *red, u16 *green, ...@@ -548,6 +551,7 @@ static void vout_SetPalette( p_vout_thread_t p_vout, u16 *red, u16 *green,
static void vout_Display( vout_thread_t *p_vout ) static void vout_Display( vout_thread_t *p_vout )
{ {
SDL_Rect disp; SDL_Rect disp;
if((p_vout->p_sys->p_display != NULL) && !p_vout->p_sys->b_reopen_display) if((p_vout->p_sys->p_display != NULL) && !p_vout->p_sys->b_reopen_display)
{ {
if( !p_vout->b_need_render ) if( !p_vout->b_need_render )
...@@ -582,6 +586,8 @@ static void vout_Display( vout_thread_t *p_vout ) ...@@ -582,6 +586,8 @@ static void vout_Display( vout_thread_t *p_vout )
} }
else else
{ {
int i_x, i_y, i_w, i_h;
SDL_LockYUVOverlay( p_vout->p_sys->p_overlay ); SDL_LockYUVOverlay( p_vout->p_sys->p_overlay );
/* copy the data into video buffers */ /* copy the data into video buffers */
/* Y first */ /* Y first */
...@@ -599,14 +605,17 @@ static void vout_Display( vout_thread_t *p_vout ) ...@@ -599,14 +605,17 @@ static void vout_Display( vout_thread_t *p_vout )
p_vout->p_rendered_pic->p_u, p_vout->p_rendered_pic->p_u,
p_vout->p_sys->p_overlay->h * p_vout->p_sys->p_overlay->h *
p_vout->p_sys->p_overlay->pitches[2] / 2 ); p_vout->p_sys->p_overlay->pitches[2] / 2 );
#define BUFFER (&p_vout->p_buffer[p_vout->i_buffer_index]) OutputCoords( p_vout->p_rendered_pic, 1,
disp.w = BUFFER->i_pic_width; p_vout->p_sys->i_width,
disp.h = BUFFER->i_pic_height; p_vout->p_sys->i_height,
#undef BUFFER &i_x, &i_y,
disp.x = (p_vout->i_width - disp.w)/2; &i_w, &i_h);
disp.y = (p_vout->i_height - disp.h)/2; disp.x = i_x;
disp.y = i_y;
disp.w = i_w;
disp.h = i_h;
SDL_DisplayYUVOverlay( p_vout->p_sys->p_overlay , &disp ); SDL_DisplayYUVOverlay( p_vout->p_sys->p_overlay , &disp );
SDL_UnlockYUVOverlay(p_vout->p_sys->p_overlay); SDL_UnlockYUVOverlay(p_vout->p_sys->p_overlay);
...@@ -757,3 +766,70 @@ static void SDLCloseDisplay( vout_thread_t *p_vout ) ...@@ -757,3 +766,70 @@ static void SDLCloseDisplay( vout_thread_t *p_vout )
} }
} }
/*****************************************************************************
* OutputCoords: compute the dimensions of the destination image
*****************************************************************************
* This based on some code in SetBufferPicture... , it is also in use in the
* the xvideo plugin. Maybe we should think about putting standard video
* processing functions in a common library ?
*****************************************************************************/
static void OutputCoords( const picture_t *p_pic, const boolean_t scale,
const int win_w, const int win_h,
int *dx, int *dy, int *w, int *h )
{
if( !scale )
{
*w = p_pic->i_width; *h = p_pic->i_height;
}
else
{
*w = win_w;
switch( p_pic->i_aspect_ratio )
{
case AR_3_4_PICTURE:
*h = win_w * 3 / 4;
break;
case AR_16_9_PICTURE:
*h = win_w * 9 / 16;
break;
case AR_221_1_PICTURE:
*h = win_w * 100 / 221;
break;
case AR_SQUARE_PICTURE:
default:
*h = win_w * p_pic->i_height / p_pic->i_width;
break;
}
if( *h > win_h )
{
*h = win_h;
switch( p_pic->i_aspect_ratio )
{
case AR_3_4_PICTURE:
*w = win_h * 4 / 3;
break;
case AR_16_9_PICTURE:
*w = win_h * 16 / 9;
break;
case AR_221_1_PICTURE:
*w = win_h * 221 / 100;
break;
case AR_SQUARE_PICTURE:
default:
*w = win_h * p_pic->i_width / p_pic->i_height;
break;
}
}
}
/* Set picture position */
*dx = (win_w - *w) / 2;
*dy = (win_h - *h) / 2;
}
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