* 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 <sam@zoy.org>
* Pierre Baillet <oct@zoy.org>
#include <stdlib.h> /* free() */
#include <string.h> /* strerror() */
+#include <sys/types.h>
+#ifndef WIN32
+# include <netinet/in.h> /* BSD: struct in_addr */
+#endif
+
#include <SDL/SDL.h>
#include "config.h"
#include "threads.h"
#include "mtime.h"
#include "tests.h"
-#include "modules.h"
#include "video.h"
#include "video_output.h"
#include "main.h"
#include "netutils.h"
+#include "modules.h"
+#include "modules_export.h"
+
/*****************************************************************************
* FIXME: this file is ... *
* *
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;
}
/* 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 );
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 );
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;
static void vout_End( vout_thread_t *p_vout )
{
SDLCloseDisplay( p_vout );
- SDL_Quit();
+ SDL_QuitSubSystem( SDL_INIT_VIDEO );
}
/*****************************************************************************
*/
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);
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
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 );
}
}
/* init flags and cursor */
flags = SDL_ANYFORMAT | SDL_HWPALETTE;
- if( p_vout->p_sys->b_fullscreen )
+ if( p_vout->b_fullscreen )
{
flags |= SDL_FULLSCREEN;
}
/* 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
{
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;