]> git.sesse.net Git - vlc/blobdiff - modules/video_output/x11/xcommon.c
Compile XvMC. Disabled the subtitles part for that. Commented a few things. This...
[vlc] / modules / video_output / x11 / xcommon.c
index 3a8e41810b76c098c03237ecd9d9c52428b6bba7..7fafacd7cb128501524562196b0db1f4430a78c3 100644 (file)
 /*****************************************************************************
  * Preamble
  *****************************************************************************/
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include <vlc/vlc.h>
 #include <vlc_interface.h>
 #include <vlc_playlist.h>
@@ -111,11 +115,16 @@ static void DestroyWindow  ( vout_thread_t *, x11_window_t * );
 static int  NewPicture     ( vout_thread_t *, picture_t * );
 static void FreePicture    ( vout_thread_t *, picture_t * );
 
+#ifndef MODULE_NAME_IS_glx
 static IMAGE_TYPE *CreateImage    ( vout_thread_t *,
                                     Display *, EXTRA_ARGS, int, int );
+#endif
+
 #ifdef HAVE_SYS_SHM_H
+#ifndef MODULE_NAME_IS_glx
 static IMAGE_TYPE *CreateShmImage ( vout_thread_t *,
                                     Display *, EXTRA_ARGS_SHM, int, int );
+#endif
 static int i_shm_major = 0;
 #endif
 
@@ -421,6 +430,7 @@ int E_(Activate) ( vlc_object_t *p_this )
         E_(Deactivate)( p_vout );
         return VLC_EGENERIC;
     }
+    subpicture_t sub_pic;
     sub_pic.p_sys = NULL;
     p_vout->p_sys->last_date = 0;
 #endif
@@ -588,11 +598,11 @@ static void RenderVideo( vout_thread_t *p_vout, picture_t *p_pic )
         return;
     }
 
+#if 0
     vlc_mutex_lock( &p_vout->lastsubtitle_lock );
-
-    if (p_vout->p_last_subtitle != NULL)
+    if (p_vout->p_sys->p_last_subtitle != NULL)
     {
-        if( p_vout->p_sys->p_last_subtitle_save != p_vout->p_last_subtitle )
+        if( p_vout->p_sys->p_last_subtitle_save != p_vout->p_sys->p_last_subtitle )
         {
             p_vout->p_sys->new_subpic =
                 xxmc_xvmc_alloc_subpicture( p_vout, &p_vout->p_sys->context,
@@ -746,6 +756,7 @@ static void RenderVideo( vout_thread_t *p_vout, picture_t *p_pic )
     p_vout->p_sys->p_last_subtitle_save = p_vout->p_last_subtitle;
 
     vlc_mutex_unlock( &p_vout->lastsubtitle_lock );
+#endif
     xvmc_context_reader_unlock( &p_vout->p_sys->xvmc_lock );
 
     vlc_mutex_unlock( &p_vout->p_sys->lock );
@@ -956,20 +967,21 @@ static void DisplayVideo( vout_thread_t *p_vout, picture_t *p_pic )
 #ifdef MODULE_NAME_IS_xvmc
     xvmc_context_reader_lock( &p_vout->p_sys->xvmc_lock );
 
-    vlc_xxmc_t *xxmc = &p_picture->p_sys->xxmc_data;
+    vlc_xxmc_t *xxmc = &p_pic->p_sys->xxmc_data;
     if( !xxmc->decoded ||
-        !xxmc_xvmc_surface_valid( p_vout, p_picture->p_sys->xvmc_surf ) )
+        !xxmc_xvmc_surface_valid( p_vout, p_pic->p_sys->xvmc_surf ) )
     {
       msg_Dbg( p_vout, "DisplayVideo decoded=%d\tsurfacevalid=%d",
                xxmc->decoded,
-               xxmc_xvmc_surface_valid( p_vout, p_picture->p_sys->xvmc_surf ) );
+               xxmc_xvmc_surface_valid( p_vout, p_pic->p_sys->xvmc_surf ) );
       vlc_mutex_unlock( &p_vout->p_sys->lock );
       xvmc_context_reader_unlock( &p_vout->p_sys->xvmc_lock );
       return;
     }
 
-    src_width = p_vout->output.i_width;
-    src_height = p_vout->output.i_height;
+    int src_width = p_vout->output.i_width;
+    int src_height = p_vout->output.i_height;
+    int src_x, src_y;
 
     if( p_vout->p_sys->xvmc_crop_style == 1 )
     {
@@ -998,17 +1010,18 @@ static void DisplayVideo( vout_thread_t *p_vout, picture_t *p_pic )
         src_y = 0;
     }
 
+    int first_field;
     if( p_vout->p_sys->xvmc_deinterlace_method > 0 )
     {   /* BOB DEINTERLACE */
-        if( (p_picture->p_sys->nb_display == 0) ||
+        if( (p_pic->p_sys->nb_display == 0) ||
             (p_vout->p_sys->xvmc_deinterlace_method == 1) )
         {
-            first_field = (p_picture->b_top_field_first) ?
+            first_field = (p_pic->b_top_field_first) ?
                                 XVMC_BOTTOM_FIELD : XVMC_TOP_FIELD;
         }
         else
         {
-            first_field = (p_picture->b_top_field_first) ?
+            first_field = (p_pic->b_top_field_first) ?
                                 XVMC_TOP_FIELD : XVMC_BOTTOM_FIELD;
         }
     }
@@ -1018,10 +1031,10 @@ static void DisplayVideo( vout_thread_t *p_vout, picture_t *p_pic )
      }
 
     XVMCLOCKDISPLAY( p_vout->p_sys->p_display );
-    XvMCFlushSurface( p_vout->p_sys->p_display, p_picture->p_sys->xvmc_surf );
+    XvMCFlushSurface( p_vout->p_sys->p_display, p_pic->p_sys->xvmc_surf );
     /* XvMCSyncSurface(p_vout->p_sys->p_display, p_picture->p_sys->xvmc_surf); */
     XvMCPutSurface( p_vout->p_sys->p_display,
-                    p_picture->p_sys->xvmc_surf,
+                    p_pic->p_sys->xvmc_surf,
                     p_vout->p_sys->p_win->video_window,
                     src_x,
                     src_y,
@@ -1036,29 +1049,29 @@ static void DisplayVideo( vout_thread_t *p_vout, picture_t *p_pic )
     XVMCUNLOCKDISPLAY( p_vout->p_sys->p_display );
     if( p_vout->p_sys->xvmc_deinterlace_method == 2 )
     {   /* BOB DEINTERLACE */
-        if( p_picture->p_sys->nb_display == 0 )/* && ((t2-t1) < 15000)) */
+        if( p_pic->p_sys->nb_display == 0 )/* && ((t2-t1) < 15000)) */
         {
-            mtime_t last_date = p_picture->date;
+            mtime_t last_date = p_pic->date;
 
             vlc_mutex_lock( &p_vout->picture_lock );
             if( !p_vout->p_sys->last_date )
             {
-                p_picture->date += 20000;
+                p_pic->date += 20000;
             }
             else
             {
-                p_picture->date = ((3 * p_picture->date -
+                p_pic->date = ((3 * p_pic->date -
                                     p_vout->p_sys->last_date) / 2 );
             }
             p_vout->p_sys->last_date = last_date;
-            p_picture->b_force = 1;
-            p_picture->p_sys->nb_display = 1;
+            p_pic->b_force = 1;
+            p_pic->p_sys->nb_display = 1;
             vlc_mutex_unlock( &p_vout->picture_lock );
         }
         else
         {
-            p_picture->p_sys->nb_display = 0;
-            p_picture->b_force = 0;
+            p_pic->p_sys->nb_display = 0;
+            p_pic->b_force = 0;
         }
     }
     xvmc_context_reader_unlock( &p_vout->p_sys->xvmc_lock );
@@ -1609,8 +1622,7 @@ static int CreateWindow( vout_thread_t *p_vout, x11_window_t *p_win )
 
     if( !p_vout->b_fullscreen )
     {
-        p_win->owner_window =
-            (Window)vout_RequestWindow( p_vout, &p_win->i_x, &p_win->i_y,
+        p_win->owner_window = (Window)vout_RequestWindow( p_vout, &p_win->i_x, &p_win->i_y,
                                         &p_win->i_width, &p_win->i_height );
 
         xsize_hints.base_width  = xsize_hints.width = p_win->i_width;
@@ -1673,12 +1685,14 @@ static int CreateWindow( vout_thread_t *p_vout, x11_window_t *p_win )
 
         if( !p_vout->b_fullscreen )
         {
+            const char *argv[] = { "vlc", NULL };
+
             /* Set window manager hints and properties: size hints, command,
              * window's name, and accepted protocols */
             XSetWMNormalHints( p_vout->p_sys->p_display,
                                p_win->base_window, &xsize_hints );
             XSetCommand( p_vout->p_sys->p_display, p_win->base_window,
-                         p_vout->p_libvlc->ppsz_argv, p_vout->p_libvlc->i_argc );
+                         (char**)argv, 1 );
 
             if( !var_GetBool( p_vout, "video-deco") )
             {
@@ -1892,7 +1906,7 @@ static int NewPicture( vout_thread_t *p_vout, picture_t *p_pic )
     p_pic->p_sys->xvmc_surf = NULL;
     p_pic->p_sys->xxmc_data.decoded = 0;
     p_pic->p_sys->xxmc_data.proc_xxmc_update_frame = xxmc_do_update_frame;
-    p_pic->p_accel_data = &p_pic->p_sys->xxmc_data;
+    //    p_pic->p_accel_data = &p_pic->p_sys->xxmc_data;
     p_pic->p_sys->nb_display = 0;
 #endif
 
@@ -1966,7 +1980,7 @@ static int NewPicture( vout_thread_t *p_vout, picture_t *p_pic )
             for( i_plane = 0; i_plane < p_pic->p_sys->p_image->num_planes;
                  i_plane++ )
             {
-                p_pic->p[i_plane].p_pixels = p_pic->p_sys->p_image->data
+                p_pic->p[i_plane].p_pixels = (uint8_t*)p_pic->p_sys->p_image->data
                     + p_pic->p_sys->p_image->offsets[i_plane];
                 p_pic->p[i_plane].i_pitch =
                     p_pic->p_sys->p_image->pitches[i_plane];
@@ -1975,9 +1989,9 @@ static int NewPicture( vout_thread_t *p_vout, picture_t *p_pic )
             {
                 /* U and V inverted compared to I420
                  * Fixme: this should be handled by the vout core */
-                p_pic->U_PIXELS = p_pic->p_sys->p_image->data
+                p_pic->U_PIXELS = (uint8_t*)p_pic->p_sys->p_image->data
                     + p_pic->p_sys->p_image->offsets[2];
-                p_pic->V_PIXELS = p_pic->p_sys->p_image->data
+                p_pic->V_PIXELS = (uint8_t*)p_pic->p_sys->p_image->data
                     + p_pic->p_sys->p_image->offsets[1];
             }
             break;
@@ -1991,7 +2005,7 @@ static int NewPicture( vout_thread_t *p_vout, picture_t *p_pic )
 
             p_pic->p->i_lines = p_pic->p_sys->p_image->height;
             p_pic->p->i_visible_lines = p_pic->p_sys->p_image->height;
-            p_pic->p->p_pixels = p_pic->p_sys->p_image->data
+            p_pic->p->p_pixels = (uint8_t*)p_pic->p_sys->p_image->data
                                   + p_pic->p_sys->p_image->xoffset;
             p_pic->p->i_pitch = p_pic->p_sys->p_image->bytes_per_line;
 
@@ -2011,6 +2025,9 @@ static int NewPicture( vout_thread_t *p_vout, picture_t *p_pic )
             p_pic->i_planes = 0;
             return -1;
     }
+#else
+
+    VLC_UNUSED(p_vout); VLC_UNUSED(p_pic);
 
 #endif /* !MODULE_NAME_IS_glx */
 
@@ -2654,9 +2671,6 @@ static int InitDisplay( vout_thread_t *p_vout )
 
     if( config_GetInt( p_vout, MODULE_STRING "-shm" ) )
     {
-#   ifdef __APPLE__
-        /* FIXME: As of 2001-03-16, XFree4 for MacOS X does not support Xshm */
-#   else
         int major, evt, err;
 
         if( XQueryExtension( p_vout->p_sys->p_display, "MIT-SHM", &major,
@@ -2676,22 +2690,11 @@ static int InitDisplay( vout_thread_t *p_vout )
                      major, minor, pixmaps ? "" : "out",
                      p_vout->p_sys->i_shm_opcode );
         }
-
-#   endif
-
-        if( !p_vout->p_sys->i_shm_opcode )
-        {
-            msg_Warn( p_vout, "XShm video extension is unavailable" );
-        }
+        else
+            msg_Warn( p_vout, "XShm video extension not available" );
     }
     else
-    {
-        msg_Dbg( p_vout, "disabling XShm video extension" );
-    }
-
-#else
-    msg_Warn( p_vout, "XShm video extension is unavailable" );
-
+        msg_Dbg( p_vout, "XShm video extension disabled" );
 #endif
 
 #ifdef MODULE_NAME_IS_xvideo
@@ -2796,6 +2799,8 @@ static int InitDisplay( vout_thread_t *p_vout )
     return VLC_SUCCESS;
 }
 
+#ifndef MODULE_NAME_IS_glx
+
 #ifdef HAVE_SYS_SHM_H
 /*****************************************************************************
  * CreateShmImage: create an XImage or XvImage using shared memory extension
@@ -2955,6 +2960,7 @@ static IMAGE_TYPE * CreateImage( vout_thread_t *p_vout,
     return p_image;
 }
 
+#endif
 /*****************************************************************************
  * X11ErrorHandler: replace error handler so we can intercept some of them
  *****************************************************************************/
@@ -2976,8 +2982,10 @@ static int X11ErrorHandler( Display * display, XErrorEvent * event )
         return 0;
     }
 
+#ifdef HAVE_SYS_SHM_H
     if( event->request_code == i_shm_major ) /* MIT-SHM */
         return i_shm_major = 0;
+#endif
 
     XSetErrorHandler(NULL);
     return (XSetErrorHandler(X11ErrorHandler))( display, event );
@@ -3077,6 +3085,7 @@ static int Control( vout_thread_t *p_vout, int i_query, va_list args )
             vlc_mutex_lock( &p_vout->p_sys->lock );
             if( i_query == VOUT_REPARENT ) d = (Drawable)va_arg( args, int );
             if( !d )
+            {
 #ifdef MODULE_NAME_IS_xvmc
             xvmc_context_reader_lock( &p_vout->p_sys->xvmc_lock );
 #endif
@@ -3084,6 +3093,7 @@ static int Control( vout_thread_t *p_vout, int i_query, va_list args )
                              p_vout->p_sys->original_window.base_window,
                              DefaultRootWindow( p_vout->p_sys->p_display ),
                              0, 0 );
+            }
             else
             XReparentWindow( p_vout->p_sys->p_display,
                              p_vout->p_sys->original_window.base_window,