[vlc-devel] [PATCH 03/13] resource: also hold free vouts

Thomas Guillem thomas at gllm.fr
Mon Apr 15 15:50:48 CEST 2019


Small reminder: a "free vout" is just a stopped vout, not used by any video
decoders.
---
 src/input/resource.c | 22 +++++++++++++++-------
 1 file changed, 15 insertions(+), 7 deletions(-)

diff --git a/src/input/resource.c b/src/input/resource.c
index 01a2889655..322d6ed251 100644
--- a/src/input/resource.c
+++ b/src/input/resource.c
@@ -199,7 +199,7 @@ static vout_thread_t *HoldVout( input_resource_t *p_resource )
     /* TODO FIXME: p_resource->pp_vout order is NOT stable */
     vlc_mutex_lock( &p_resource->lock_hold );
 
-    vout_thread_t *p_vout = p_resource->i_vout > 0 ? p_resource->pp_vout[0] : NULL;
+    vout_thread_t *p_vout = p_resource->i_vout > 0 ? p_resource->pp_vout[0] : p_resource->p_vout_free;
     if( p_vout )
         vout_Hold(p_vout);
 
@@ -218,20 +218,28 @@ static void HoldVouts( input_resource_t *p_resource, vout_thread_t ***ppp_vout,
 
     vlc_mutex_lock( &p_resource->lock_hold );
 
-    if( p_resource->i_vout <= 0 )
+    size_t count = p_resource->i_vout;
+    if( count == 0 && p_resource->p_vout_free )
+        count = 1;
+    if( count <= 0 )
         goto exit;
 
-    pp_vout = vlc_alloc( p_resource->i_vout, sizeof(*pp_vout) );
+    pp_vout = vlc_alloc( count, sizeof(*pp_vout) );
     if( !pp_vout )
         goto exit;
 
     *ppp_vout = pp_vout;
-    *pi_vout = p_resource->i_vout;
+    *pi_vout = count;
 
-    for( int i = 0; i < p_resource->i_vout; i++ )
+    if( count == 1 && !p_resource->pp_vout )
     {
-        pp_vout[i] = p_resource->pp_vout[i];
-        vout_Hold(pp_vout[i]);
+        assert( p_resource->p_vout_free );
+        pp_vout[0] = vout_Hold( p_resource->p_vout_free );
+    }
+    else
+    {
+        for( int i = 0; i < p_resource->i_vout; i++ )
+            pp_vout[i] = vout_Hold( p_resource->pp_vout[i] );
     }
 
 exit:
-- 
2.20.1



More information about the vlc-devel mailing list