]> git.sesse.net Git - vlc/blobdiff - plugins/sdl/vout_sdl.c
* libdvdcss enhancements by Billy Biggs <vektor@dumbterm.net>. This breaks
[vlc] / plugins / sdl / vout_sdl.c
index b0bf0f7514ae21159a93d71ab8630f86f2a1aa34..1863f53267d8ad3f715f7bc77ec3dffeadfd0687 100644 (file)
@@ -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 <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"
@@ -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;