]> git.sesse.net Git - vlc/commitdiff
Moved most of private vout_thread_t fields out of vlc_vout.h
authorLaurent Aimar <fenrir@videolan.org>
Sun, 18 Apr 2010 16:31:16 +0000 (18:31 +0200)
committerLaurent Aimar <fenrir@videolan.org>
Sun, 18 Apr 2010 17:51:16 +0000 (19:51 +0200)
include/vlc_vout.h
src/video_output/video_output.c
src/video_output/vout_internal.h
src/video_output/vout_intf.c
src/video_output/vout_pictures.c
src/video_output/vout_wrapper.c

index c0249548451faec9c0664fedf6ccb0e5bf08e288..08549089d5d39889120d470dd2c75e7c05ea46e5 100644 (file)
@@ -76,64 +76,14 @@ struct vout_thread_t
 {
     VLC_COMMON_MEMBERS
 
-    /** \name Thread properties and locks */
-    /**@{*/
-    vlc_mutex_t         picture_lock;                 /**< picture heap lock */
-    vlc_mutex_t         change_lock;                 /**< thread change lock */
-    /**@}*/
-
-    /** \name Current display properties */
-    /**@{*/
-    uint16_t            i_changes;          /**< changes made to the thread.
-                                                      \see \ref vout_changes */
-    unsigned            b_fullscreen:1;       /**< toogle fullscreen display */
-    unsigned            b_on_top:1; /**< stay always on top of other windows */
-
-    /**@}*/
-
-    /** \name Video heap and translation tables */
-    /**@{*/
-    picture_heap_t      render;                       /**< rendered pictures */
-    picture_heap_t      output;                          /**< direct buffers */
-
     video_format_t      fmt_render;      /* render format (from the decoder) */
     video_format_t      fmt_in;            /* input (modified render) format */
     video_format_t      fmt_out;     /* output format (for the video output) */
-    /**@}*/
-
-    /* Picture heap */
-    picture_t           p_picture[2*VOUT_MAX_PICTURES+1];      /**< pictures */
 
     /* Private vout_thread data */
     vout_thread_sys_t *p;
 };
 
-#define I_OUTPUTPICTURES p_vout->output.i_pictures
-#define PP_OUTPUTPICTURE p_vout->output.pp_picture
-#define I_RENDERPICTURES p_vout->render.i_pictures
-#define PP_RENDERPICTURE p_vout->render.pp_picture
-
-/** \defgroup vout_changes Flags for changes
- * These flags are set in the vout_thread_t::i_changes field when another
- * thread changed a variable
- * @{
- */
-/** b_autoscale changed */
-#define VOUT_SCALE_CHANGE       0x0008
-/** b_on_top changed */
-#define VOUT_ON_TOP_CHANGE     0x0010
-/** b_fullscreen changed */
-#define VOUT_FULLSCREEN_CHANGE  0x0040
-/** i_zoom changed */
-#define VOUT_ZOOM_CHANGE        0x0080
-/** cropping parameters changed */
-#define VOUT_CROP_CHANGE        0x1000
-/** aspect ratio changed */
-#define VOUT_ASPECT_CHANGE      0x2000
-/** change/recreate picture buffers */
-#define VOUT_PICTURE_BUFFERS_CHANGE 0x4000
-/**@}*/
-
 /* Alignment flags */
 #define VOUT_ALIGN_LEFT         0x0001
 #define VOUT_ALIGN_RIGHT        0x0002
index e69efed9832725d273c0ec5effbfc459253b7613..68e935b0aecbff69914ed7f9e200e3105e6c4930 100644 (file)
@@ -129,9 +129,9 @@ static void video_del_buffer_filter( filter_t *p_filter, picture_t *p_pic )
 {
     vout_thread_t *p_vout = (vout_thread_t*)p_filter->p_owner;
 
-    vlc_mutex_lock( &p_vout->picture_lock );
+    vlc_mutex_lock( &p_vout->p->picture_lock );
     vout_UsePictureLocked( p_vout, p_pic );
-    vlc_mutex_unlock( &p_vout->picture_lock );
+    vlc_mutex_unlock( &p_vout->p->picture_lock );
 }
 
 static int video_filter_buffer_allocation_init( filter_t *p_filter, void *p_data )
@@ -173,7 +173,7 @@ vout_thread_t *vout_Request( vlc_object_t *p_this, vout_thread_t *p_vout,
     /* If we now have a video output, check it has the right properties */
     if( p_vout )
     {
-        vlc_mutex_lock( &p_vout->change_lock );
+        vlc_mutex_lock( &p_vout->p->change_lock );
 
         /* We don't directly check for the "vout-filter" variable for obvious
          * performance reasons. */
@@ -207,7 +207,7 @@ vout_thread_t *vout_Request( vlc_object_t *p_this, vout_thread_t *p_vout,
             p_vout->fmt_render.i_height != p_fmt->i_height ||
             p_vout->p->b_filter_change )
         {
-            vlc_mutex_unlock( &p_vout->change_lock );
+            vlc_mutex_unlock( &p_vout->p->change_lock );
 
             /* We are not interested in this format, close this vout */
             vout_CloseAndRelease( p_vout );
@@ -241,9 +241,9 @@ vout_thread_t *vout_Request( vlc_object_t *p_this, vout_thread_t *p_vout,
 
                 p_vout->fmt_render.i_sar_num = i_sar_num;
                 p_vout->fmt_render.i_sar_den = i_sar_den;
-                p_vout->i_changes |= VOUT_ASPECT_CHANGE;
+                p_vout->p->i_changes |= VOUT_ASPECT_CHANGE;
             }
-            vlc_mutex_unlock( &p_vout->change_lock );
+            vlc_mutex_unlock( &p_vout->p->change_lock );
 
             vlc_object_release( p_vout );
         }
@@ -316,9 +316,9 @@ vout_thread_t * vout_Create( vlc_object_t *p_parent, video_format_t *p_fmt )
      * will be initialized later in InitThread */
     for( i_index = 0; i_index < 2 * VOUT_MAX_PICTURES + 1; i_index++)
     {
-        p_vout->p_picture[i_index].i_status = FREE_PICTURE;
-        p_vout->p_picture[i_index].i_type   = EMPTY_PICTURE;
-        p_vout->p_picture[i_index].b_slow   = 0;
+        p_vout->p->p_picture[i_index].i_status = FREE_PICTURE;
+        p_vout->p->p_picture[i_index].i_type   = EMPTY_PICTURE;
+        p_vout->p->p_picture[i_index].b_slow   = 0;
     }
 
     /* Initialize the rendering heap */
@@ -332,14 +332,14 @@ vout_thread_t * vout_Create( vlc_object_t *p_parent, video_format_t *p_fmt )
     video_format_FixRgb( &p_vout->fmt_render );
     video_format_FixRgb( &p_vout->fmt_in );
 
-    p_vout->render.i_last_used_pic = -1;
+    p_vout->p->render.i_last_used_pic = -1;
 
     /* Zero the output heap */
     I_OUTPUTPICTURES = 0;
 
     /* Initialize misc stuff */
-    p_vout->i_changes    = 0;
-    p_vout->b_fullscreen = 0;
+    p_vout->p->i_changes    = 0;
+    p_vout->p->b_fullscreen = 0;
     p_vout->p->render_time  = 10;
     p_vout->p->c_fps_samples = 0;
     vout_statistic_Init( &p_vout->p->statistic );
@@ -360,9 +360,9 @@ vout_thread_t * vout_Create( vlc_object_t *p_parent, video_format_t *p_fmt )
     vout_snapshot_Init( &p_vout->p->snapshot );
 
     /* Initialize locks */
-    vlc_mutex_init( &p_vout->picture_lock );
+    vlc_mutex_init( &p_vout->p->picture_lock );
     vlc_cond_init( &p_vout->p->picture_wait );
-    vlc_mutex_init( &p_vout->change_lock );
+    vlc_mutex_init( &p_vout->p->change_lock );
     vlc_mutex_init( &p_vout->p->vfilter_lock );
 
     /* Mouse coordinates */
@@ -477,14 +477,14 @@ vout_thread_t * vout_Create( vlc_object_t *p_parent, video_format_t *p_fmt )
         return NULL;
     }
 
-    vlc_mutex_lock( &p_vout->change_lock );
+    vlc_mutex_lock( &p_vout->p->change_lock );
     while( !p_vout->p->b_ready )
     {   /* We are (ab)using the same condition in opposite directions for
          * b_ready and b_done. This works because of the strict ordering. */
         assert( !p_vout->p->b_done );
-        vlc_cond_wait( &p_vout->p->change_wait, &p_vout->change_lock );
+        vlc_cond_wait( &p_vout->p->change_wait, &p_vout->p->change_lock );
     }
-    vlc_mutex_unlock( &p_vout->change_lock );
+    vlc_mutex_unlock( &p_vout->p->change_lock );
 
     if( p_vout->p->b_error )
     {
@@ -508,10 +508,10 @@ void vout_Close( vout_thread_t *p_vout )
 {
     assert( p_vout );
 
-    vlc_mutex_lock( &p_vout->change_lock );
+    vlc_mutex_lock( &p_vout->p->change_lock );
     p_vout->p->b_done = true;
     vlc_cond_signal( &p_vout->p->change_wait );
-    vlc_mutex_unlock( &p_vout->change_lock );
+    vlc_mutex_unlock( &p_vout->p->change_lock );
 
     vout_snapshot_End( &p_vout->p->snapshot );
 
@@ -535,8 +535,8 @@ static void vout_Destructor( vlc_object_t * p_this )
     /* Destroy the locks */
     vlc_cond_destroy( &p_vout->p->change_wait );
     vlc_cond_destroy( &p_vout->p->picture_wait );
-    vlc_mutex_destroy( &p_vout->picture_lock );
-    vlc_mutex_destroy( &p_vout->change_lock );
+    vlc_mutex_destroy( &p_vout->p->picture_lock );
+    vlc_mutex_destroy( &p_vout->p->change_lock );
     vlc_mutex_destroy( &p_vout->p->vfilter_lock );
 
     /* */
@@ -558,11 +558,11 @@ static void vout_Destructor( vlc_object_t * p_this )
 /* */
 void vout_ChangePause( vout_thread_t *p_vout, bool b_paused, mtime_t i_date )
 {
-    vlc_mutex_lock( &p_vout->change_lock );
+    vlc_mutex_lock( &p_vout->p->change_lock );
 
     assert( !p_vout->p->b_paused || !b_paused );
 
-    vlc_mutex_lock( &p_vout->picture_lock );
+    vlc_mutex_lock( &p_vout->p->picture_lock );
 
     p_vout->p->i_picture_displayed_date = 0;
 
@@ -578,18 +578,18 @@ void vout_ChangePause( vout_thread_t *p_vout, bool b_paused, mtime_t i_date )
                 p_pic->date += i_duration;
         }
         vlc_cond_signal( &p_vout->p->picture_wait );
-        vlc_mutex_unlock( &p_vout->picture_lock );
+        vlc_mutex_unlock( &p_vout->p->picture_lock );
 
         spu_OffsetSubtitleDate( p_vout->p->p_spu, i_duration );
     }
     else
     {
-        vlc_mutex_unlock( &p_vout->picture_lock );
+        vlc_mutex_unlock( &p_vout->p->picture_lock );
     }
     p_vout->p->b_paused = b_paused;
     p_vout->p->i_pause_date = i_date;
 
-    vlc_mutex_unlock( &p_vout->change_lock );
+    vlc_mutex_unlock( &p_vout->p->change_lock );
 }
 
 void vout_GetResetStatistic( vout_thread_t *p_vout, int *pi_displayed, int *pi_lost )
@@ -600,11 +600,11 @@ void vout_GetResetStatistic( vout_thread_t *p_vout, int *pi_displayed, int *pi_l
 
 void vout_Flush( vout_thread_t *p_vout, mtime_t i_date )
 {
-    vlc_mutex_lock( &p_vout->picture_lock );
+    vlc_mutex_lock( &p_vout->p->picture_lock );
     p_vout->p->i_picture_displayed_date = 0;
-    for( int i = 0; i < p_vout->render.i_pictures; i++ )
+    for( int i = 0; i < p_vout->p->render.i_pictures; i++ )
     {
-        picture_t *p_pic = p_vout->render.pp_picture[i];
+        picture_t *p_pic = p_vout->p->render.pp_picture[i];
 
         if( p_pic->i_status == READY_PICTURE ||
             p_pic->i_status == DISPLAYED_PICTURE )
@@ -616,18 +616,18 @@ void vout_Flush( vout_thread_t *p_vout, mtime_t i_date )
         }
     }
     vlc_cond_signal( &p_vout->p->picture_wait );
-    vlc_mutex_unlock( &p_vout->picture_lock );
+    vlc_mutex_unlock( &p_vout->p->picture_lock );
 }
 
 void vout_FixLeaks( vout_thread_t *p_vout, bool b_forced )
 {
     int i_pic, i_ready_pic;
 
-    vlc_mutex_lock( &p_vout->picture_lock );
+    vlc_mutex_lock( &p_vout->p->picture_lock );
 
-    for( i_pic = 0, i_ready_pic = 0; i_pic < p_vout->render.i_pictures && !b_forced; i_pic++ )
+    for( i_pic = 0, i_ready_pic = 0; i_pic < p_vout->p->render.i_pictures && !b_forced; i_pic++ )
     {
-        const picture_t *p_pic = p_vout->render.pp_picture[i_pic];
+        const picture_t *p_pic = p_vout->p->render.pp_picture[i_pic];
 
         if( p_pic->i_status == READY_PICTURE )
         {
@@ -648,9 +648,9 @@ void vout_FixLeaks( vout_thread_t *p_vout, bool b_forced )
                 break;
         }
     }
-    if( i_pic < p_vout->render.i_pictures && !b_forced )
+    if( i_pic < p_vout->p->render.i_pictures && !b_forced )
     {
-        vlc_mutex_unlock( &p_vout->picture_lock );
+        vlc_mutex_unlock( &p_vout->p->picture_lock );
         return;
     }
 
@@ -660,9 +660,9 @@ void vout_FixLeaks( vout_thread_t *p_vout, bool b_forced )
         msg_Err( p_vout, "pictures leaked, resetting the heap" );
 
     /* Just free all the pictures */
-    for( i_pic = 0; i_pic < p_vout->render.i_pictures; i_pic++ )
+    for( i_pic = 0; i_pic < p_vout->p->render.i_pictures; i_pic++ )
     {
-        picture_t *p_pic = p_vout->render.pp_picture[i_pic];
+        picture_t *p_pic = p_vout->p->render.pp_picture[i_pic];
 
         msg_Dbg( p_vout, "[%d] %d %d", i_pic, p_pic->i_status, p_pic->i_refcount );
         p_pic->i_refcount = 0;
@@ -678,11 +678,11 @@ void vout_FixLeaks( vout_thread_t *p_vout, bool b_forced )
         }
     }
     vlc_cond_signal( &p_vout->p->picture_wait );
-    vlc_mutex_unlock( &p_vout->picture_lock );
+    vlc_mutex_unlock( &p_vout->p->picture_lock );
 }
 void vout_NextPicture( vout_thread_t *p_vout, mtime_t *pi_duration )
 {
-    vlc_mutex_lock( &p_vout->picture_lock );
+    vlc_mutex_lock( &p_vout->p->picture_lock );
 
     const mtime_t i_displayed_date = p_vout->p->i_picture_displayed_date;
 
@@ -695,13 +695,13 @@ void vout_NextPicture( vout_thread_t *p_vout, mtime_t *pi_duration )
     }
 
     while( !p_vout->p->b_picture_displayed && !p_vout->p->b_picture_empty )
-        vlc_cond_wait( &p_vout->p->picture_wait, &p_vout->picture_lock );
+        vlc_cond_wait( &p_vout->p->picture_wait, &p_vout->p->picture_lock );
 
     *pi_duration = __MAX( p_vout->p->i_picture_displayed_date - i_displayed_date, 0 );
 
     /* TODO advance subpicture by the duration ... */
 
-    vlc_mutex_unlock( &p_vout->picture_lock );
+    vlc_mutex_unlock( &p_vout->p->picture_lock );
 }
 
 void vout_DisplayTitle( vout_thread_t *p_vout, const char *psz_title )
@@ -711,10 +711,10 @@ void vout_DisplayTitle( vout_thread_t *p_vout, const char *psz_title )
     if( !var_InheritBool( p_vout, "osd" ) )
         return;
 
-    vlc_mutex_lock( &p_vout->change_lock );
+    vlc_mutex_lock( &p_vout->p->change_lock );
     free( p_vout->p->psz_title );
     p_vout->p->psz_title = strdup( psz_title );
-    vlc_mutex_unlock( &p_vout->change_lock );
+    vlc_mutex_unlock( &p_vout->p->change_lock );
 }
 
 spu_t *vout_GetSpu( vout_thread_t *p_vout )
@@ -815,15 +815,15 @@ static int InitThread( vout_thread_t *p_vout )
      * for memcpy operations */
     for( i = 1; i < VOUT_MAX_PICTURES; i++ )
     {
-        if( p_vout->p_picture[ i ].i_type != DIRECT_PICTURE &&
+        if( p_vout->p->p_picture[ i ].i_type != DIRECT_PICTURE &&
             I_RENDERPICTURES >= VOUT_MIN_DIRECT_PICTURES - 1 &&
-            p_vout->p_picture[ i - 1 ].i_type == DIRECT_PICTURE )
+            p_vout->p->p_picture[ i - 1 ].i_type == DIRECT_PICTURE )
         {
             /* We have enough direct buffers so there's no need to
              * try to use system memory buffers. */
             break;
         }
-        PP_RENDERPICTURE[ I_RENDERPICTURES ] = &p_vout->p_picture[ i ];
+        PP_RENDERPICTURE[ I_RENDERPICTURES ] = &p_vout->p->p_picture[ i ];
         I_RENDERPICTURES++;
     }
 
@@ -855,7 +855,7 @@ static void* RunThread( void *p_this )
      */
     b_has_wrapper = !vout_OpenWrapper( p_vout, p_vout->p->psz_module_name );
 
-    vlc_mutex_lock( &p_vout->change_lock );
+    vlc_mutex_lock( &p_vout->p->change_lock );
 
     if( b_has_wrapper )
         p_vout->p->b_error = InitThread( p_vout );
@@ -890,7 +890,7 @@ static void* RunThread( void *p_this )
         if( p_vout->p->b_title_show && p_vout->p->psz_title )
             DisplayTitleOnOSD( p_vout );
 
-        vlc_mutex_lock( &p_vout->picture_lock );
+        vlc_mutex_lock( &p_vout->p->picture_lock );
 
         /* Look for the earliest picture but after the last displayed one */
         picture_t *p_last = p_vout->p->p_picture_displayed;;
@@ -1007,7 +1007,7 @@ static void* RunThread( void *p_this )
         const bool b_picture_interlaced = p_vout->p->b_picture_interlaced;
         const int  i_picture_interlaced_state = (!!p_vout->p->b_picture_interlaced) - (!!b_picture_interlaced_last);
 
-        vlc_mutex_unlock( &p_vout->picture_lock );
+        vlc_mutex_unlock( &p_vout->p->picture_lock );
 
         if( p_picture == NULL )
             i_idle_loops++;
@@ -1083,7 +1083,7 @@ static void* RunThread( void *p_this )
         }
 
         /* Give back change lock */
-        vlc_mutex_unlock( &p_vout->change_lock );
+        vlc_mutex_unlock( &p_vout->p->change_lock );
 
         /* Sleep a while or until a given date */
         if( display_date != 0 )
@@ -1098,15 +1098,15 @@ static void* RunThread( void *p_this )
         else
         {
             /* Wait until a frame is being sent or a spurious wakeup (not a problem here) */
-            vlc_mutex_lock( &p_vout->picture_lock );
-            vlc_cond_timedwait( &p_vout->p->picture_wait, &p_vout->picture_lock, current_date + VOUT_IDLE_SLEEP );
-            vlc_mutex_unlock( &p_vout->picture_lock );
+            vlc_mutex_lock( &p_vout->p->picture_lock );
+            vlc_cond_timedwait( &p_vout->p->picture_wait, &p_vout->p->picture_lock, current_date + VOUT_IDLE_SLEEP );
+            vlc_mutex_unlock( &p_vout->p->picture_lock );
         }
 
         /* On awakening, take back lock and send immediately picture
          * to display. */
         /* Note: p_vout->p->b_done could be true here and now */
-        vlc_mutex_lock( &p_vout->change_lock );
+        vlc_mutex_lock( &p_vout->p->change_lock );
 
         /*
          * Display the previously rendered picture
@@ -1124,9 +1124,9 @@ static void* RunThread( void *p_this )
         /* Drop the filtered picture if created by video filters */
         if( p_filtered_picture != NULL && p_filtered_picture != p_picture )
         {
-            vlc_mutex_lock( &p_vout->picture_lock );
+            vlc_mutex_lock( &p_vout->p->picture_lock );
             vout_UsePictureLocked( p_vout, p_filtered_picture );
-            vlc_mutex_unlock( &p_vout->picture_lock );
+            vlc_mutex_unlock( &p_vout->p->picture_lock );
         }
 
         if( p_picture != NULL )
@@ -1148,19 +1148,19 @@ static void* RunThread( void *p_this )
             break;
         }
 
-        if( p_vout->i_changes & VOUT_ON_TOP_CHANGE )
-            p_vout->i_changes &= ~VOUT_ON_TOP_CHANGE;
+        if( p_vout->p->i_changes & VOUT_ON_TOP_CHANGE )
+            p_vout->p->i_changes &= ~VOUT_ON_TOP_CHANGE;
 
-        if( p_vout->i_changes & VOUT_PICTURE_BUFFERS_CHANGE )
+        if( p_vout->p->i_changes & VOUT_PICTURE_BUFFERS_CHANGE )
         {
             /* This happens when the picture buffers need to be recreated.
              * This is useful on multimonitor displays for instance.
              *
              * Warning: This only works when the vout creates only 1 picture
              * buffer!! */
-            p_vout->i_changes &= ~VOUT_PICTURE_BUFFERS_CHANGE;
+            p_vout->p->i_changes &= ~VOUT_PICTURE_BUFFERS_CHANGE;
 
-            vlc_mutex_lock( &p_vout->picture_lock );
+            vlc_mutex_lock( &p_vout->p->picture_lock );
 
             vout_EndWrapper( p_vout );
 
@@ -1171,7 +1171,7 @@ static void* RunThread( void *p_this )
                 msg_Err( p_vout, "InitThread after VOUT_PICTURE_BUFFERS_CHANGE failed" );
 
             vlc_cond_signal( &p_vout->p->picture_wait );
-            vlc_mutex_unlock( &p_vout->picture_lock );
+            vlc_mutex_unlock( &p_vout->p->picture_lock );
 
             if( p_vout->p->b_error )
                 break;
@@ -1232,7 +1232,7 @@ static void* RunThread( void *p_this )
 exit_thread:
     /* End of thread */
     EndThread( p_vout );
-    vlc_mutex_unlock( &p_vout->change_lock );
+    vlc_mutex_unlock( &p_vout->p->change_lock );
 
     if( b_has_wrapper )
         vout_CloseWrapper( p_vout );
@@ -1251,7 +1251,7 @@ static void ErrorThread( vout_thread_t *p_vout )
 {
     /* Wait until a `close' order */
     while( !p_vout->p->b_done )
-        vlc_cond_wait( &p_vout->p->change_wait, &p_vout->change_lock );
+        vlc_cond_wait( &p_vout->p->change_wait, &p_vout->p->change_lock );
 }
 
 /*****************************************************************************
@@ -1268,9 +1268,9 @@ static void CleanThread( vout_thread_t *p_vout )
     /* Destroy all remaining pictures */
     for( i_index = 0; i_index < 2 * VOUT_MAX_PICTURES + 1; i_index++ )
     {
-        if ( p_vout->p_picture[i_index].i_type == MEMORY_PICTURE )
+        if ( p_vout->p->p_picture[i_index].i_type == MEMORY_PICTURE )
         {
-            free( p_vout->p_picture[i_index].p_data_orig );
+            free( p_vout->p->p_picture[i_index].p_data_orig );
         }
     }
 
@@ -1463,7 +1463,7 @@ static void DisplayTitleOnOSD( vout_thread_t *p_vout )
     if( i_stop <= i_start )
         return;
 
-    vlc_assert_locked( &p_vout->change_lock );
+    vlc_assert_locked( &p_vout->p->change_lock );
 
     vout_ShowTextAbsolute( p_vout, DEFAULT_CHAN,
                            p_vout->p->psz_title, NULL,
index 4182cd47065c0701dc4a07da6bfb8c0a6a9ba559..1724b9d0b8bb73f42acc62b2dd0c9149fa232293 100644 (file)
@@ -113,8 +113,49 @@ struct vout_thread_sys_t
 
     /* */
     vlc_mouse_t     mouse;
+
+    /* */
+    vlc_mutex_t         picture_lock;                 /**< picture heap lock */
+    vlc_mutex_t         change_lock;                 /**< thread change lock */
+
+    uint16_t            i_changes;          /**< changes made to the thread.
+                                                      \see \ref vout_changes */
+    unsigned            b_fullscreen:1;       /**< toogle fullscreen display */
+    unsigned            b_on_top:1; /**< stay always on top of other windows */
+
+    picture_heap_t      render;                       /**< rendered pictures */
+    picture_heap_t      output;                          /**< direct buffers */
+
+    picture_t           p_picture[2*VOUT_MAX_PICTURES+1];      /**< pictures */
 };
 
+#define I_OUTPUTPICTURES p_vout->p->output.i_pictures
+#define PP_OUTPUTPICTURE p_vout->p->output.pp_picture
+#define I_RENDERPICTURES p_vout->p->render.i_pictures
+#define PP_RENDERPICTURE p_vout->p->render.pp_picture
+
+/** \defgroup vout_changes Flags for changes
+ * These flags are set in the vout_thread_t::i_changes field when another
+ * thread changed a variable
+ * @{
+ */
+/** b_autoscale changed */
+#define VOUT_SCALE_CHANGE       0x0008
+/** b_on_top changed */
+#define VOUT_ON_TOP_CHANGE      0x0010
+/** b_fullscreen changed */
+#define VOUT_FULLSCREEN_CHANGE  0x0040
+/** i_zoom changed */
+#define VOUT_ZOOM_CHANGE        0x0080
+/** cropping parameters changed */
+#define VOUT_CROP_CHANGE        0x1000
+/** aspect ratio changed */
+#define VOUT_ASPECT_CHANGE      0x2000
+/** change/recreate picture buffers */
+#define VOUT_PICTURE_BUFFERS_CHANGE 0x4000
+/**@}*/
+
+
 /* */
 int vout_AllocatePicture( vlc_object_t *, picture_t *, uint32_t i_chroma, int i_width, int i_height, int i_sar_num, int i_sar_den );
 #define vout_AllocatePicture(a,b,c,d,e,f,g) \
index f9e94bbb143b4488adc4d85346b7167ef5f1adc2..2be81e99e7afcf6b8b160159a153f055a46a5369 100644 (file)
@@ -344,7 +344,7 @@ void vout_IntfInit( vout_thread_t *p_vout )
     if( var_CreateGetBoolCommand( p_vout, "fullscreen" ) )
     {
         /* user requested fullscreen */
-        p_vout->i_changes |= VOUT_FULLSCREEN_CHANGE;
+        p_vout->p->i_changes |= VOUT_FULLSCREEN_CHANGE;
     }
     text.psz_string = _("Fullscreen");
     var_Change( p_vout, "fullscreen", VLC_VAR_SETTEXT, &text, NULL );
@@ -791,7 +791,7 @@ static int CropCallback( vlc_object_t *p_this, char const *psz_cmd,
     }
 
  crop_end:
-    p_vout->i_changes |= VOUT_CROP_CHANGE;
+    p_vout->p->i_changes |= VOUT_CROP_CHANGE;
 
     msg_Dbg( p_vout, "cropping picture %ix%i to %i,%i,%ix%i",
              p_vout->fmt_in.i_width, p_vout->fmt_in.i_height,
@@ -839,7 +839,7 @@ static int AspectCallback( vlc_object_t *p_this, char const *psz_cmd,
         p_vout->fmt_in.i_sar_den *= p_vout->p->i_par_num;
     }
 
-    p_vout->i_changes |= VOUT_ASPECT_CHANGE;
+    p_vout->p->i_changes |= VOUT_ASPECT_CHANGE;
 
     msg_Dbg( p_vout, "new aspect-ratio %i:%i, sample aspect-ratio %i:%i",
              p_vout->fmt_in.i_sar_num * p_vout->fmt_in.i_width,
@@ -860,18 +860,18 @@ static int ScalingCallback( vlc_object_t *p_this, char const *psz_cmd,
     vout_thread_t *p_vout = (vout_thread_t *)p_this;
     (void)oldval; (void)newval; (void)p_data;
 
-    vlc_mutex_lock( &p_vout->change_lock );
+    vlc_mutex_lock( &p_vout->p->change_lock );
 
     if( !strcmp( psz_cmd, "autoscale" ) )
     {
-        p_vout->i_changes |= VOUT_SCALE_CHANGE;
+        p_vout->p->i_changes |= VOUT_SCALE_CHANGE;
     }
     else if( !strcmp( psz_cmd, "scale" ) )
     {
-        p_vout->i_changes |= VOUT_ZOOM_CHANGE;
+        p_vout->p->i_changes |= VOUT_ZOOM_CHANGE;
     }
 
-    vlc_mutex_unlock( &p_vout->change_lock );
+    vlc_mutex_unlock( &p_vout->p->change_lock );
 
     return VLC_SUCCESS;
 }
@@ -881,10 +881,10 @@ static int OnTopCallback( vlc_object_t *p_this, char const *psz_cmd,
 {
     vout_thread_t *p_vout = (vout_thread_t *)p_this;
 
-    vlc_mutex_lock( &p_vout->change_lock );
-    p_vout->i_changes |= VOUT_ON_TOP_CHANGE;
-    p_vout->b_on_top = newval.b_bool;
-    vlc_mutex_unlock( &p_vout->change_lock );
+    vlc_mutex_lock( &p_vout->p->change_lock );
+    p_vout->p->i_changes |= VOUT_ON_TOP_CHANGE;
+    p_vout->p->b_on_top = newval.b_bool;
+    vlc_mutex_unlock( &p_vout->p->change_lock );
 
     (void)psz_cmd; (void)oldval; (void)p_data;
     return VLC_SUCCESS;
@@ -899,7 +899,7 @@ static int FullscreenCallback( vlc_object_t *p_this, char const *psz_cmd,
 
     if( oldval.b_bool == newval.b_bool )
         return VLC_SUCCESS; /* no-op */
-    p_vout->i_changes |= VOUT_FULLSCREEN_CHANGE;
+    p_vout->p->i_changes |= VOUT_FULLSCREEN_CHANGE;
 
     val.b_bool = true;
     var_Set( p_vout, "intf-change", val );
index c3b8415a785fa23bdcf3f665b2381316c1016e37..d053e513d95039f57d1edb0ed1bfb047cd4e9109 100644 (file)
@@ -52,7 +52,7 @@
  */
 void vout_DisplayPicture( vout_thread_t *p_vout, picture_t *p_pic )
 {
-    vlc_mutex_lock( &p_vout->picture_lock );
+    vlc_mutex_lock( &p_vout->p->picture_lock );
 
     if( p_pic->i_status == RESERVED_PICTURE )
     {
@@ -67,7 +67,7 @@ void vout_DisplayPicture( vout_thread_t *p_vout, picture_t *p_pic )
     p_vout->p->i_picture_qtype = p_pic->i_qtype;
     p_vout->p->b_picture_interlaced = !p_pic->b_progressive;
 
-    vlc_mutex_unlock( &p_vout->picture_lock );
+    vlc_mutex_unlock( &p_vout->p->picture_lock );
 }
 
 /**
@@ -84,10 +84,10 @@ int vout_CountPictureAvailable( vout_thread_t *p_vout )
     int i_free = 0;
     int i_pic;
 
-    vlc_mutex_lock( &p_vout->picture_lock );
+    vlc_mutex_lock( &p_vout->p->picture_lock );
     for( i_pic = 0; i_pic < I_RENDERPICTURES; i_pic++ )
     {
-        picture_t *p_pic = PP_RENDERPICTURE[(p_vout->render.i_last_used_pic + i_pic + 1) % I_RENDERPICTURES];
+        picture_t *p_pic = PP_RENDERPICTURE[(p_vout->p->render.i_last_used_pic + i_pic + 1) % I_RENDERPICTURES];
 
         switch( p_pic->i_status )
         {
@@ -103,7 +103,7 @@ int vout_CountPictureAvailable( vout_thread_t *p_vout )
                 break;
         }
     }
-    vlc_mutex_unlock( &p_vout->picture_lock );
+    vlc_mutex_unlock( &p_vout->p->picture_lock );
 
     return i_free;
 }
@@ -118,14 +118,14 @@ picture_t *vout_CreatePicture( vout_thread_t *p_vout,
     picture_t * p_freepic = NULL;                      /* first free picture */
 
     /* Get lock */
-    vlc_mutex_lock( &p_vout->picture_lock );
+    vlc_mutex_lock( &p_vout->p->picture_lock );
 
     /*
      * Look for an empty place in the picture heap.
      */
     for( i_pic = 0; i_pic < I_RENDERPICTURES; i_pic++ )
     {
-        p_pic = PP_RENDERPICTURE[(p_vout->render.i_last_used_pic + i_pic + 1)
+        p_pic = PP_RENDERPICTURE[(p_vout->p->render.i_last_used_pic + i_pic + 1)
                                  % I_RENDERPICTURES];
 
         switch( p_pic->i_status )
@@ -142,16 +142,16 @@ picture_t *vout_CreatePicture( vout_thread_t *p_vout,
                 p_pic->i_nb_fields          = i_nb_fields;
                 p_pic->b_top_field_first    = b_top_field_first;
 
-                p_vout->render.i_last_used_pic =
-                    ( p_vout->render.i_last_used_pic + i_pic + 1 )
+                p_vout->p->render.i_last_used_pic =
+                    ( p_vout->p->render.i_last_used_pic + i_pic + 1 )
                     % I_RENDERPICTURES;
-                vlc_mutex_unlock( &p_vout->picture_lock );
+                vlc_mutex_unlock( &p_vout->p->picture_lock );
                 return( p_pic );
 
             case FREE_PICTURE:
                 /* Picture is empty and ready for allocation */
-                p_vout->render.i_last_used_pic =
-                    ( p_vout->render.i_last_used_pic + i_pic + 1 )
+                p_vout->p->render.i_last_used_pic =
+                    ( p_vout->p->render.i_last_used_pic + i_pic + 1 )
                     % I_RENDERPICTURES;
                 p_freepic = p_pic;
                 break;
@@ -195,14 +195,14 @@ picture_t *vout_CreatePicture( vout_thread_t *p_vout,
             msg_Err( p_vout, "picture allocation failed" );
         }
 
-        vlc_mutex_unlock( &p_vout->picture_lock );
+        vlc_mutex_unlock( &p_vout->p->picture_lock );
 
         return( p_freepic );
     }
 
     /* No free or destroyed picture could be found, but the decoder
      * will try again in a while. */
-    vlc_mutex_unlock( &p_vout->picture_lock );
+    vlc_mutex_unlock( &p_vout->p->picture_lock );
 
     return( NULL );
 }
@@ -210,7 +210,7 @@ picture_t *vout_CreatePicture( vout_thread_t *p_vout,
 /* */
 static void DestroyPicture( vout_thread_t *p_vout, picture_t *p_picture )
 {
-    vlc_assert_locked( &p_vout->picture_lock );
+    vlc_assert_locked( &p_vout->p->picture_lock );
 
     p_picture->i_status = DESTROYED_PICTURE;
     picture_CleanupQuant( p_picture );
@@ -231,13 +231,13 @@ void vout_DestroyPicture( vout_thread_t *p_vout, picture_t *p_pic )
 {
 #ifndef NDEBUG
     /* Check if picture status is valid */
-    vlc_mutex_lock( &p_vout->picture_lock );
+    vlc_mutex_lock( &p_vout->p->picture_lock );
     if( p_pic->i_status != RESERVED_PICTURE )
     {
         msg_Err( p_vout, "picture to destroy %p has invalid status %d",
                          p_pic, p_pic->i_status );
     }
-    vlc_mutex_unlock( &p_vout->picture_lock );
+    vlc_mutex_unlock( &p_vout->p->picture_lock );
 #endif
 
     vout_DropPicture( p_vout, p_pic );
@@ -246,7 +246,7 @@ void vout_DestroyPicture( vout_thread_t *p_vout, picture_t *p_pic )
 /* */
 void vout_UsePictureLocked( vout_thread_t *p_vout, picture_t *p_picture )
 {
-    vlc_assert_locked( &p_vout->picture_lock );
+    vlc_assert_locked( &p_vout->p->picture_lock );
     if( p_picture->i_refcount > 0 )
     {
         /* Pretend we displayed the picture, but don't destroy
@@ -263,7 +263,7 @@ void vout_UsePictureLocked( vout_thread_t *p_vout, picture_t *p_picture )
 /* */
 void vout_DropPicture( vout_thread_t *p_vout, picture_t *p_pic  )
 {
-    vlc_mutex_lock( &p_vout->picture_lock );
+    vlc_mutex_lock( &p_vout->p->picture_lock );
 
     if( p_pic->i_status == READY_PICTURE )
     {
@@ -276,7 +276,7 @@ void vout_DropPicture( vout_thread_t *p_vout, picture_t *p_pic  )
         vout_UsePictureLocked( p_vout, p_pic );
     }
 
-    vlc_mutex_unlock( &p_vout->picture_lock );
+    vlc_mutex_unlock( &p_vout->p->picture_lock );
 }
 
 /**
@@ -287,9 +287,9 @@ void vout_DropPicture( vout_thread_t *p_vout, picture_t *p_pic  )
  */
 void vout_LinkPicture( vout_thread_t *p_vout, picture_t *p_pic )
 {
-    vlc_mutex_lock( &p_vout->picture_lock );
+    vlc_mutex_lock( &p_vout->p->picture_lock );
     p_pic->i_refcount++;
-    vlc_mutex_unlock( &p_vout->picture_lock );
+    vlc_mutex_unlock( &p_vout->p->picture_lock );
 }
 
 /**
@@ -299,7 +299,7 @@ void vout_LinkPicture( vout_thread_t *p_vout, picture_t *p_pic )
  */
 void vout_UnlinkPicture( vout_thread_t *p_vout, picture_t *p_pic )
 {
-    vlc_mutex_lock( &p_vout->picture_lock );
+    vlc_mutex_lock( &p_vout->p->picture_lock );
 
     if( p_pic->i_refcount > 0 )
         p_pic->i_refcount--;
@@ -311,7 +311,7 @@ void vout_UnlinkPicture( vout_thread_t *p_vout, picture_t *p_pic )
         ( p_pic->i_status == DISPLAYED_PICTURE || p_pic->i_status == RESERVED_PICTURE ) )
         DestroyPicture( p_vout, p_pic );
 
-    vlc_mutex_unlock( &p_vout->picture_lock );
+    vlc_mutex_unlock( &p_vout->p->picture_lock );
 }
 
 /**
@@ -346,7 +346,7 @@ picture_t *vout_RenderPicture( vout_thread_t *p_vout, picture_t *p_pic,
         /* The picture buffer is in slow memory. We'll use
          * the "2 * VOUT_MAX_PICTURES + 1" picture as a temporary
          * one for subpictures rendering. */
-        p_render = &p_vout->p_picture[2 * VOUT_MAX_PICTURES];
+        p_render = &p_vout->p->p_picture[2 * VOUT_MAX_PICTURES];
         if( p_render->i_status == FREE_PICTURE )
         {
             vout_AllocatePicture( VLC_OBJECT(p_vout),
index 4e5d579388d386c5fac8a827aff17189dc92cf5a..cfe5dde6e7f9295b5d69a2eea4dd10fdbeafffad 100644 (file)
@@ -163,9 +163,9 @@ int vout_InitWrapper(vout_thread_t *vout)
         vout->fmt_in.i_visible_height != source.i_visible_height ||
         vout->fmt_in.i_x_offset       != source.i_x_offset ||
         vout->fmt_in.i_y_offset       != source.i_y_offset )
-        vout->i_changes |= VOUT_CROP_CHANGE;
+        vout->p->i_changes |= VOUT_CROP_CHANGE;
 
-    if (vout->b_on_top)
+    if (vout->p->b_on_top)
         vout_SetWindowState(vd, VOUT_WINDOW_STATE_ABOVE);
 
     /* XXX For non dr case, the current vout implementation force us to
@@ -175,14 +175,14 @@ int vout_InitWrapper(vout_thread_t *vout)
     sys->use_dr = !vout_IsDisplayFiltered(vd);
     const bool allow_dr = !vd->info.has_pictures_invalid && sys->use_dr;
     const int picture_max = allow_dr ? VOUT_MAX_PICTURES : 1;
-    for (vout->output.i_pictures = 0;
-            vout->output.i_pictures < picture_max;
-                vout->output.i_pictures++) {
+    for (vout->p->output.i_pictures = 0;
+            vout->p->output.i_pictures < picture_max;
+                vout->p->output.i_pictures++) {
         /* Find an empty picture slot */
         picture_t *picture = NULL;
         for (int index = 0; index < VOUT_MAX_PICTURES; index++) {
-            if (vout->p_picture[index].i_status == FREE_PICTURE) {
-                picture = &vout->p_picture[index];
+            if (vout->p->p_picture[index].i_status == FREE_PICTURE) {
+                picture = &vout->p->p_picture[index];
                 break;
             }
         }
@@ -218,7 +218,7 @@ int vout_InitWrapper(vout_thread_t *vout)
         picture->i_status = DESTROYED_PICTURE;
         picture->i_type    = DIRECT_PICTURE;
 
-        vout->output.pp_picture[vout->output.i_pictures] = picture;
+        vout->p->output.pp_picture[vout->p->output.i_pictures] = picture;
     }
     return VLC_SUCCESS;
 }
@@ -231,7 +231,7 @@ void vout_EndWrapper(vout_thread_t *vout)
     vout_sys_t *sys = vout->p->p_sys;
 
     for (int i = 0; i < VOUT_MAX_PICTURES; i++) {
-        picture_t *picture = &vout->p_picture[i];
+        picture_t *picture = &vout->p->p_picture[i];
 
         if (picture->i_type != DIRECT_PICTURE)
             continue;
@@ -256,29 +256,29 @@ int vout_ManageWrapper(vout_thread_t *vout)
     vout_sys_t *sys = vout->p->p_sys;
     vout_display_t *vd = sys->vd;
 
-    while (vout->i_changes & (VOUT_FULLSCREEN_CHANGE |
+    while (vout->p->i_changes & (VOUT_FULLSCREEN_CHANGE |
                               VOUT_ASPECT_CHANGE |
                               VOUT_ZOOM_CHANGE |
                               VOUT_SCALE_CHANGE |
                               VOUT_ON_TOP_CHANGE |
                               VOUT_CROP_CHANGE)) {
         /* */
-        if (vout->i_changes & VOUT_FULLSCREEN_CHANGE) {
-            vout->b_fullscreen = !vout->b_fullscreen;
+        if (vout->p->i_changes & VOUT_FULLSCREEN_CHANGE) {
+            vout->p->b_fullscreen = !vout->p->b_fullscreen;
 
-            var_SetBool(vout, "fullscreen", vout->b_fullscreen);
-            vout_SetDisplayFullscreen(vd, vout->b_fullscreen);
-            vout->i_changes &= ~VOUT_FULLSCREEN_CHANGE;
+            var_SetBool(vout, "fullscreen", vout->p->b_fullscreen);
+            vout_SetDisplayFullscreen(vd, vout->p->b_fullscreen);
+            vout->p->i_changes &= ~VOUT_FULLSCREEN_CHANGE;
         }
-        if (vout->i_changes & VOUT_ASPECT_CHANGE) {
+        if (vout->p->i_changes & VOUT_ASPECT_CHANGE) {
             vout->fmt_out.i_sar_num = vout->fmt_in.i_sar_num;
             vout->fmt_out.i_sar_den = vout->fmt_in.i_sar_den;
 
             vout_SetDisplayAspect(vd, vout->fmt_in.i_sar_num, vout->fmt_in.i_sar_den);
 
-            vout->i_changes &= ~VOUT_ASPECT_CHANGE;
+            vout->p->i_changes &= ~VOUT_ASPECT_CHANGE;
         }
-        if (vout->i_changes & VOUT_ZOOM_CHANGE) {
+        if (vout->p->i_changes & VOUT_ZOOM_CHANGE) {
             const float zoom = var_GetFloat(vout, "scale");
 
             unsigned den = ZOOM_FP_FACTOR;
@@ -290,23 +290,23 @@ int vout_ManageWrapper(vout_thread_t *vout)
 
             vout_SetDisplayZoom(vd, num, den);
 
-            vout->i_changes &= ~VOUT_ZOOM_CHANGE;
+            vout->p->i_changes &= ~VOUT_ZOOM_CHANGE;
         }
-        if (vout->i_changes & VOUT_SCALE_CHANGE) {
+        if (vout->p->i_changes & VOUT_SCALE_CHANGE) {
             const bool is_display_filled = var_GetBool(vout, "autoscale");
 
             vout_SetDisplayFilled(vd, is_display_filled);
 
-            vout->i_changes &= ~VOUT_SCALE_CHANGE;
+            vout->p->i_changes &= ~VOUT_SCALE_CHANGE;
         }
-        if (vout->i_changes & VOUT_ON_TOP_CHANGE) {
-            vout_SetWindowState(vd, vout->b_on_top
+        if (vout->p->i_changes & VOUT_ON_TOP_CHANGE) {
+            vout_SetWindowState(vd, vout->p->b_on_top
                 ? VOUT_WINDOW_STATE_ABOVE
                 : VOUT_WINDOW_STATE_NORMAL);
 
-            vout->i_changes &= ~VOUT_ON_TOP_CHANGE;
+            vout->p->i_changes &= ~VOUT_ON_TOP_CHANGE;
         }
-        if (vout->i_changes & VOUT_CROP_CHANGE) {
+        if (vout->p->i_changes & VOUT_CROP_CHANGE) {
             const video_format_t crop = vout->fmt_in;
             const video_format_t org = vout->fmt_render;
             /* FIXME because of rounding errors, the reconstructed ratio is wrong */
@@ -328,13 +328,13 @@ int vout_ManageWrapper(vout_thread_t *vout)
             vout_SetDisplayCrop(vd, num, den,
                                 crop.i_x_offset, crop.i_y_offset,
                                 crop.i_visible_width, crop.i_visible_height);
-            vout->i_changes &= ~VOUT_CROP_CHANGE;
+            vout->p->i_changes &= ~VOUT_CROP_CHANGE;
         }
 
     }
 
     if (sys->use_dr && vout_AreDisplayPicturesInvalid(vd)) {
-        vout->i_changes |= VOUT_PICTURE_BUFFERS_CHANGE;
+        vout->p->i_changes |= VOUT_PICTURE_BUFFERS_CHANGE;
     }
     vout_ManageDisplay(vd, !sys->use_dr);
     return VLC_SUCCESS;