1 /*****************************************************************************
2 * vout_sdl.c: SDL video output display method
3 *****************************************************************************
4 * Copyright (C) 1998, 1999, 2000 VideoLAN
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
21 *****************************************************************************/
23 /*****************************************************************************
25 *****************************************************************************/
28 #include <errno.h> /* ENOMEM */
29 #include <stdlib.h> /* free() */
30 #include <string.h> /* strerror() */
41 #include "video_output.h"
45 /*****************************************************************************
46 * vout_sys_t: video output SDL method descriptor
47 *****************************************************************************
48 * This structure is part of the video output thread descriptor.
49 * It describes the SDL specific properties of an output thread.
50 *****************************************************************************/
51 typedef struct vout_sys_s
53 SDL_Surface * p_display; /* display device */
55 /* Buffers informations */
56 boolean_t b_must_acquire; /* must be acquired before writing */
59 /*****************************************************************************
61 *****************************************************************************/
62 static int SDLOpenDisplay ( vout_thread_t *p_vout,
63 char *psz_display, void *p_data );
64 static void SDLCloseDisplay ( vout_thread_t *p_vout );
66 /*****************************************************************************
67 * vout_SDLCreate: allocate SDL video thread output method
68 *****************************************************************************
69 * This function allocate and initialize a SDL vout method. It uses some of the
70 * vout properties to choose the correct mode, and change them according to the
72 *****************************************************************************/
73 int vout_SDLCreate( vout_thread_t *p_vout, char *psz_display,
74 int i_root_window, void *p_data )
76 /* Allocate structure */
77 p_vout->p_sys = malloc( sizeof( vout_sys_t ) );
78 if( p_vout->p_sys == NULL )
80 intf_ErrMsg( "error: %s\n", strerror(ENOMEM) );
84 /* Open and initialize device */
86 if( SDLOpenDisplay( p_vout, psz_display, p_data ) )
88 intf_ErrMsg( "error: can't initialize SDL display\n" );
89 free( p_vout->p_sys );
95 /*****************************************************************************
96 * vout_SDLInit: initialize SDL video thread output method
97 *****************************************************************************
98 * This function initialize the SDL display device.
99 *****************************************************************************/
100 int vout_SDLInit( vout_thread_t *p_vout )
102 /* Acquire first buffer */
103 if( p_vout->p_sys->b_must_acquire )
105 SDL_LockSurface(p_vout->p_sys->p_display);
111 /*****************************************************************************
112 * vout_SDLEnd: terminate Sys video thread output method
113 *****************************************************************************
114 * Terminate an output method created by vout_SDLCreate
115 *****************************************************************************/
116 void vout_SDLEnd( vout_thread_t *p_vout )
119 if( p_vout->p_sys->b_must_acquire )
121 SDL_UnlockSurface ( p_vout->p_sys->p_display );
123 free( p_vout->p_sys );
126 /*****************************************************************************
127 * vout_SDLDestroy: destroy Sys video thread output method
128 *****************************************************************************
129 * Terminate an output method created by vout_SDLCreate
130 *****************************************************************************/
131 void vout_SDLDestroy( vout_thread_t *p_vout )
133 // SDLCloseDisplay( p_vout );
134 free( p_vout->p_sys );
137 /*****************************************************************************
138 * vout_SDLManage: handle Sys events
139 *****************************************************************************
140 * This function should be called regularly by video output thread. It returns
141 * a non null value if an error occured.
142 *****************************************************************************/
143 int vout_SDLManage( vout_thread_t *p_vout )
145 /* FIXME: 8bpp: change palette ?? */
149 /*****************************************************************************
150 * vout_SDLDisplay: displays previously rendered output
151 *****************************************************************************
152 * This function send the currently rendered image to the display, wait until
153 * it is displayed and switch the two rendering buffer, preparing next frame.
154 *****************************************************************************/
155 void vout_SDLDisplay( vout_thread_t *p_vout )
157 /* Change display frame */
158 if( p_vout->p_sys->b_must_acquire )
160 SDL_Flip( p_vout->p_sys->p_display );
162 /* Swap buffers and change write frame */
163 if( p_vout->p_sys->b_must_acquire )
165 SDL_LockSurface ( p_vout->p_sys->p_display );
169 /* following functions are local */
171 /*****************************************************************************
172 * SDLOpenDisplay: open and initialize SDL device
173 *****************************************************************************
174 * Open and initialize display according to preferences specified in the vout
176 *****************************************************************************/
177 static int SDLOpenDisplay( vout_thread_t *p_vout, char *psz_display, void *p_data )
179 /* Initialize library */
180 if( SDL_Init(SDL_INIT_VIDEO) < 0 )
182 intf_ErrMsg( "error: can't initialize SDL library: %s\n",
188 if( psz_display != NULL && strcmp(psz_display,"fullscreen") == 0 )
190 p_vout->p_sys->p_display =
191 SDL_SetVideoMode( p_vout->i_width, p_vout->i_height, 15,
192 SDL_ANYFORMAT | SDL_HWSURFACE | SDL_DOUBLEBUF |
197 p_vout->p_sys->p_display =
198 SDL_SetVideoMode( p_vout->i_width, p_vout->i_height, 15,
199 SDL_ANYFORMAT | SDL_HWSURFACE | SDL_DOUBLEBUF );
202 if( p_vout->p_sys->p_display == NULL )
204 intf_ErrMsg( "error: can't open DISPLAY default display\n" );
207 SDL_EventState(SDL_KEYUP , SDL_IGNORE); /* ignore keys up */
208 //SDL_EventState(SDL_ACTIVEEVENT , SDL_IGNORE);
210 /* Check buffers properties */
212 p_vout->p_sys->b_must_acquire = 1; /* always acquire */
214 p_vout->p_sys->p_buffer[ 0 ] =
215 p_vout->p_sys->p_display->pixels;
217 SDL_Flip(p_vout->p_sys->p_display);
218 p_vout->p_sys->p_buffer[ 1 ] =
219 p_vout->p_sys->p_display->pixels;
221 SDL_Flip(p_vout->p_sys->p_display);
223 /* Set graphic context colors */
226 col_fg.r = col_fg.g = col_fg.b = -1;
227 col_bg.r = col_bg.g = col_bg.b = 0;
228 if( ggiSetGCForeground(p_vout->p_sys->p_display,
229 ggiMapColor(p_vout->p_sys->p_display,&col_fg)) ||
230 ggiSetGCBackground(p_vout->p_sys->p_display,
231 ggiMapColor(p_vout->p_sys->p_display,&col_bg)) )
233 intf_ErrMsg("error: can't set colors\n");
234 ggiClose( p_vout->p_sys->p_display );
240 /* Set clipping for text */
241 SDL_SetClipping(p_vout->p_sys->p_display, 0, 0,
242 p_vout->p_sys->p_display->w,
243 p_vout->p_sys->p_display->h );
247 /* Set thread information */
248 p_vout->i_width = p_vout->p_sys->p_display->w;
249 p_vout->i_height = p_vout->p_sys->p_display->h;
251 p_vout->i_bytes_per_line = p_vout->p_sys->p_display->format->BytesPerPixel *
252 p_vout->p_sys->p_display->w ;
254 p_vout->i_screen_depth = p_vout->p_sys->p_display->format->BitsPerPixel;
255 p_vout->i_bytes_per_pixel = p_vout->p_sys->p_display->format->BytesPerPixel;
256 p_vout->i_red_mask = p_vout->p_sys->p_display->format->Rmask;
257 p_vout->i_green_mask = p_vout->p_sys->p_display->format->Gmask;
258 p_vout->i_blue_mask = p_vout->p_sys->p_display->format->Bmask;
260 /* FIXME: palette in 8bpp ?? */
263 /* Set and initialize buffers */
264 vout_SetBuffers( p_vout, p_vout->p_sys->p_buffer[ 0 ],
265 p_vout->p_sys->p_buffer[ 1 ] );
270 /*****************************************************************************
271 * SDLCloseDisplay: close and reset SDL device
272 *****************************************************************************
273 * This function returns all resources allocated by SDLOpenDisplay and restore
274 * the original state of the device.
275 *****************************************************************************/
276 static void SDLCloseDisplay( vout_thread_t *p_vout )
278 SDL_FreeSurface( p_vout->p_sys->p_display );