X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=plugins%2Fsdl%2Fvout_sdl.c;h=1863f53267d8ad3f715f7bc77ec3dffeadfd0687;hb=a50a0a25f56aaada717d6265a7b2d9b34dccfb4c;hp=b0bf0f7514ae21159a93d71ab8630f86f2a1aa34;hpb=d69ab00d9d696ff207feb13db0819264eead11f0;p=vlc diff --git a/plugins/sdl/vout_sdl.c b/plugins/sdl/vout_sdl.c index b0bf0f7514..1863f53267 100644 --- a/plugins/sdl/vout_sdl.c +++ b/plugins/sdl/vout_sdl.c @@ -2,7 +2,7 @@ * vout_sdl.c: SDL video output display method ***************************************************************************** * Copyright (C) 1998, 1999, 2000 VideoLAN - * $Id: vout_sdl.c,v 1.47 2001/04/11 02:01:24 henri Exp $ + * $Id: vout_sdl.c,v 1.57 2001/07/11 02:01:05 sam Exp $ * * Authors: Samuel Hocevar * Pierre Baillet @@ -35,6 +35,11 @@ #include /* free() */ #include /* strerror() */ +#include +#ifndef WIN32 +# include /* BSD: struct in_addr */ +#endif + #include #include "config.h" @@ -42,7 +47,6 @@ #include "threads.h" #include "mtime.h" #include "tests.h" -#include "modules.h" #include "video.h" #include "video_output.h" @@ -54,6 +58,9 @@ #include "main.h" #include "netutils.h" +#include "modules.h" +#include "modules_export.h" + /***************************************************************************** * FIXME: this file is ... * * * @@ -80,7 +87,6 @@ typedef struct vout_sys_s SDL_Surface * p_display; /* display device */ SDL_Overlay * p_overlay; /* overlay device */ - boolean_t b_fullscreen; boolean_t b_overlay; boolean_t b_cursor; boolean_t b_reopen_display; @@ -158,8 +164,12 @@ static int vout_Create( vout_thread_t *p_vout ) } /* Initialize library */ - if( SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTTHREAD | SDL_INIT_NOPARACHUTE) - < 0 ) + if( SDL_Init( SDL_INIT_VIDEO +#ifndef WIN32 + /* Win32 SDL implementation doesn't support SDL_INIT_EVENTTHREAD yet*/ + | SDL_INIT_EVENTTHREAD +#endif + | SDL_INIT_NOPARACHUTE ) < 0 ) { intf_ErrMsg( "vout error: can't initialize SDL (%s)", SDL_GetError() ); free( p_vout->p_sys ); @@ -171,7 +181,7 @@ static int vout_Create( vout_thread_t *p_vout ) p_vout->p_sys->b_cursor_autohidden = 0; p_vout->p_sys->i_lastmoved = mdate(); - p_vout->p_sys->b_fullscreen = main_GetIntVariable( VOUT_FULLSCREEN_VAR, + p_vout->b_fullscreen = main_GetIntVariable( VOUT_FULLSCREEN_VAR, VOUT_FULLSCREEN_DEFAULT ); p_vout->p_sys->b_overlay = main_GetIntVariable( VOUT_OVERLAY_VAR, VOUT_OVERLAY_DEFAULT ); @@ -236,7 +246,15 @@ static int vout_Init( vout_thread_t *p_vout ) main_GetIntVariable( VOUT_HEIGHT_VAR,VOUT_HEIGHT_DEFAULT ), SDL_YV12_OVERLAY, p_vout->p_sys->p_display ); - intf_Msg( "vout: YUV acceleration %s", + + if( p_overlay == NULL ) + { + intf_ErrMsg( "vout error: could not create SDL overlay" ); + p_vout->b_need_render = 1; + return( 0 ); + } + + intf_WarnMsg( 2, "vout: YUV acceleration %s", p_overlay->hw_overlay ? "activated" : "unavailable !" ); p_vout->b_need_render = !p_overlay->hw_overlay; @@ -253,7 +271,7 @@ static int vout_Init( vout_thread_t *p_vout ) static void vout_End( vout_thread_t *p_vout ) { SDLCloseDisplay( p_vout ); - SDL_Quit(); + SDL_QuitSubSystem( SDL_INIT_VIDEO ); } /***************************************************************************** @@ -451,7 +469,7 @@ static int vout_Manage( vout_thread_t *p_vout ) */ if( p_vout->i_changes & VOUT_FULLSCREEN_CHANGE ) { - p_vout->p_sys->b_fullscreen = ! p_vout->p_sys->b_fullscreen; + p_vout->b_fullscreen = ! p_vout->b_fullscreen; SDL_WM_ToggleFullScreen(p_vout->p_sys->p_display); @@ -527,12 +545,7 @@ static void vout_Display( vout_thread_t *p_vout ) SDL_Rect disp; if((p_vout->p_sys->p_display != NULL) && !p_vout->p_sys->b_reopen_display) { - if( p_vout->b_need_render ) - { - /* Change display frame */ - SDL_Flip( p_vout->p_sys->p_display ); - } - else + if( !p_vout->b_need_render ) { /* * p_vout->p_rendered_pic->p_y/u/v contains the YUV buffers to @@ -546,39 +559,58 @@ static void vout_Display( vout_thread_t *p_vout ) p_vout->p_rendered_pic->i_width, p_vout->p_rendered_pic->i_height, SDL_YV12_OVERLAY, - p_vout->p_sys->p_display - ); - intf_Msg("vout: YUV acceleration %s", - p_vout->p_sys->p_overlay->hw_overlay - ? "activated" : "unavailable !" ); + p_vout->p_sys->p_display ); + + if( p_vout->p_sys->p_overlay != NULL ) + { + intf_WarnMsg( 2, "vout: YUV acceleration %s", + p_vout->p_sys->p_overlay->hw_overlay + ? "activated" : "unavailable !" ); + } + } + + if( p_vout->p_sys->p_overlay == NULL ) + { + /* Overlay allocation failed, switch back to software mode */ + intf_ErrMsg( "vout error: could not create SDL overlay" ); + p_vout->b_need_render = 1; } + else + { + SDL_LockYUVOverlay( p_vout->p_sys->p_overlay ); + /* copy the data into video buffers */ + /* Y first */ + memcpy( p_vout->p_sys->p_overlay->pixels[0], + p_vout->p_rendered_pic->p_y, + p_vout->p_sys->p_overlay->h * + p_vout->p_sys->p_overlay->pitches[0] ); + /* then V */ + memcpy( p_vout->p_sys->p_overlay->pixels[1], + p_vout->p_rendered_pic->p_v, + p_vout->p_sys->p_overlay->h * + p_vout->p_sys->p_overlay->pitches[1] / 2 ); + /* and U */ + memcpy( p_vout->p_sys->p_overlay->pixels[2], + p_vout->p_rendered_pic->p_u, + p_vout->p_sys->p_overlay->h * + p_vout->p_sys->p_overlay->pitches[2] / 2 ); + +#define BUFFER (&p_vout->p_buffer[p_vout->i_buffer_index]) + disp.w = BUFFER->i_pic_width; + disp.h = BUFFER->i_pic_height; +#undef BUFFER + disp.x = (p_vout->i_width - disp.w)/2; + disp.y = (p_vout->i_height - disp.h)/2; + + SDL_DisplayYUVOverlay( p_vout->p_sys->p_overlay , &disp ); + SDL_UnlockYUVOverlay(p_vout->p_sys->p_overlay); - SDL_LockYUVOverlay(p_vout->p_sys->p_overlay); - /* copy the data into video buffers */ - /* Y first */ - memcpy(p_vout->p_sys->p_overlay->pixels[0], - p_vout->p_rendered_pic->p_y, - p_vout->p_sys->p_overlay->h * - p_vout->p_sys->p_overlay->pitches[0]); - /* then V */ - memcpy(p_vout->p_sys->p_overlay->pixels[1], - p_vout->p_rendered_pic->p_v, - p_vout->p_sys->p_overlay->h * - p_vout->p_sys->p_overlay->pitches[1] / 2); - /* and U */ - memcpy(p_vout->p_sys->p_overlay->pixels[2], - p_vout->p_rendered_pic->p_u, - p_vout->p_sys->p_overlay->h * - p_vout->p_sys->p_overlay->pitches[2] / 2); - - disp.w = (&p_vout->p_buffer[p_vout->i_buffer_index])->i_pic_width; - disp.h = (&p_vout->p_buffer[p_vout->i_buffer_index])->i_pic_height; - disp.x = (p_vout->i_width - disp.w)/2; - disp.y = (p_vout->i_height - disp.h)/2; - - SDL_DisplayYUVOverlay( p_vout->p_sys->p_overlay , &disp ); - SDL_UnlockYUVOverlay(p_vout->p_sys->p_overlay); + return; + } } + + /* Software YUV: change display frame */ + SDL_Flip( p_vout->p_sys->p_display ); } } @@ -602,7 +634,7 @@ static int SDLOpenDisplay( vout_thread_t *p_vout ) /* init flags and cursor */ flags = SDL_ANYFORMAT | SDL_HWPALETTE; - if( p_vout->p_sys->b_fullscreen ) + if( p_vout->b_fullscreen ) { flags |= SDL_FULLSCREEN; } @@ -676,8 +708,8 @@ static int SDLOpenDisplay( vout_thread_t *p_vout ) /* FIXME: palette in 8bpp ?? */ /* Set and initialize buffers */ - vout_SetBuffers( p_vout, p_vout->p_sys->p_sdl_buf[ 0 ], - p_vout->p_sys->p_sdl_buf[ 1 ] ); + p_vout->pf_setbuffers( p_vout, p_vout->p_sys->p_sdl_buf[ 0 ], + p_vout->p_sys->p_sdl_buf[ 1 ] ); } else { @@ -689,8 +721,8 @@ static int SDLOpenDisplay( vout_thread_t *p_vout ) p_vout->i_height = p_vout->p_sys->p_display->h; p_vout->i_bytes_per_line = p_vout->p_sys->p_display->pitch; - vout_SetBuffers( p_vout, p_vout->p_sys->p_sdl_buf[ 0 ], - p_vout->p_sys->p_sdl_buf[ 1 ] ); + p_vout->pf_setbuffers( p_vout, p_vout->p_sys->p_sdl_buf[ 0 ], + p_vout->p_sys->p_sdl_buf[ 1 ] ); } p_vout->p_sys->b_reopen_display = 0;