]> git.sesse.net Git - vlc/blobdiff - src/video_output/video_output.c
Moved out snapshot code to a standalone file.
[vlc] / src / video_output / video_output.c
index 418c7a7f61e662d5f9b98702462f77c33cbb7d67..691e144064b91334005ed7e8fe141e0cfae6d92e 100644 (file)
@@ -398,11 +398,7 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent, video_format_t *p_fmt )
     p_vout->p->b_picture_empty = false;
     p_vout->p->i_picture_qtype = QTYPE_NONE;
 
-    p_vout->p->snapshot.b_available = true;
-    p_vout->p->snapshot.i_request = 0;
-    p_vout->p->snapshot.p_picture = NULL;
-    vlc_mutex_init( &p_vout->p->snapshot.lock );
-    vlc_cond_init( &p_vout->p->snapshot.wait );
+    vout_snapshot_Init( &p_vout->p->snapshot );
 
     /* Initialize locks */
     vlc_mutex_init( &p_vout->picture_lock );
@@ -563,10 +559,7 @@ void vout_Close( vout_thread_t *p_vout )
     vlc_cond_signal( &p_vout->p->change_wait );
     vlc_mutex_unlock( &p_vout->change_lock );
 
-    vlc_mutex_lock( &p_vout->p->snapshot.lock );
-    p_vout->p->snapshot.b_available = false;
-    vlc_cond_broadcast( &p_vout->p->snapshot.wait );
-    vlc_mutex_unlock( &p_vout->p->snapshot.lock );
+    vout_snapshot_End( &p_vout->p->snapshot );
 
     vlc_join( p_vout->p->thread, NULL );
     module_unneed( p_vout, p_vout->p_module );
@@ -593,18 +586,7 @@ static void vout_Destructor( vlc_object_t * p_this )
     vlc_mutex_destroy( &p_vout->p->vfilter_lock );
 
     /* */
-    for( ;; )
-    {
-        picture_t *p_picture = p_vout->p->snapshot.p_picture;
-        if( !p_picture )
-            break;
-
-        p_vout->p->snapshot.p_picture = p_picture->p_next;
-
-        picture_Release( p_picture );
-    }
-    vlc_cond_destroy( &p_vout->p->snapshot.wait );
-    vlc_mutex_destroy( &p_vout->p->snapshot.lock );
+    vout_snapshot_Clean( &p_vout->p->snapshot );
 
     /* */
     free( p_vout->p->psz_filter_chain );
@@ -1166,13 +1148,7 @@ static void* RunThread( void *p_this )
             p_filtered_picture = filter_chain_VideoFilter( p_vout->p->p_vf2_chain,
                                                            p_picture );
 
-        bool b_snapshot = false;
-        if( vlc_mutex_trylock( &p_vout->p->snapshot.lock ) == 0 )
-        {
-             b_snapshot = p_vout->p->snapshot.i_request > 0
-                       && p_picture != NULL;
-             vlc_mutex_unlock( &p_vout->p->snapshot.lock );
-        }
+        const bool b_snapshot = vout_snapshot_IsRequested( &p_vout->p->snapshot );
 
         /*
          * Check for subpictures to display
@@ -1200,30 +1176,8 @@ static void* RunThread( void *p_this )
          * Take a snapshot if requested
          */
         if( p_directbuffer && b_snapshot )
-        {
-            vlc_mutex_lock( &p_vout->p->snapshot.lock );
-            assert( p_vout->p->snapshot.i_request > 0 );
-            while( p_vout->p->snapshot.i_request > 0 )
-            {
-                picture_t *p_pic = picture_New( p_vout->fmt_out.i_chroma,
-                                                p_vout->fmt_out.i_width,
-                                                p_vout->fmt_out.i_height,
-                                                p_vout->fmt_out.i_aspect  );
-                if( !p_pic )
-                    break;
-
-                picture_Copy( p_pic, p_directbuffer );
-
-                p_pic->format.i_sar_num = p_vout->fmt_out.i_sar_num;
-                p_pic->format.i_sar_den = p_vout->fmt_out.i_sar_den;
-
-                p_pic->p_next = p_vout->p->snapshot.p_picture;
-                p_vout->p->snapshot.p_picture = p_pic;
-                p_vout->p->snapshot.i_request--;
-            }
-            vlc_cond_broadcast( &p_vout->p->snapshot.wait );
-            vlc_mutex_unlock( &p_vout->p->snapshot.lock );
-        }
+            vout_snapshot_Set( &p_vout->p->snapshot,
+                               &p_vout->fmt_out, p_directbuffer );
 
         /*
          * Call the plugin-specific rendering method if there is one