vlc | branch: master | Thomas Guillem <[email protected]> | Thu May  9 15:30:23 
2019 +0200| [e6f406bce310d5ca9acbe71ea0bc6993f747b68f] | committer: Thomas 
Guillem

resource: respect vout order

The first vout created (the main one) will now always be the first vout of the
array. It's important to keep the same reference on the first vout, since its
window plugin is likely linked to an interface. This commit ensure that this
first vout will always be the first vout used by the first video decoder or
visualiser.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=e6f406bce310d5ca9acbe71ea0bc6993f747b68f
---

 src/input/resource.c | 67 +++++++++++++++++++++++++++++++++-------------------
 1 file changed, 43 insertions(+), 24 deletions(-)

diff --git a/src/input/resource.c b/src/input/resource.c
index 45fd4eec54..abaf40d104 100644
--- a/src/input/resource.c
+++ b/src/input/resource.c
@@ -142,10 +142,17 @@ static sout_instance_t *RequestSout( input_resource_t 
*p_resource,
 /* */
 static void DestroyVout( input_resource_t *p_resource )
 {
-    assert( p_resource->i_vout == 0 );
+    assert( p_resource->i_vout == 0 || p_resource->p_vout_free == 
p_resource->pp_vout[0] );
 
     if( p_resource->p_vout_free )
+    {
+        vlc_mutex_lock(&p_resource->lock_hold);
+        TAB_REMOVE(p_resource->i_vout, p_resource->pp_vout, 
p_resource->p_vout_free);
+        vlc_mutex_unlock(&p_resource->lock_hold);
+
         vout_Close( p_resource->p_vout_free );
+        p_resource->p_vout_free = NULL;
+    }
 
     p_resource->p_vout_free = NULL;
 }
@@ -317,7 +324,7 @@ void input_resource_SetInput( input_resource_t *p_resource, 
input_thread_t *p_in
     vlc_mutex_lock( &p_resource->lock );
 
     if( p_resource->p_input && !p_input )
-        assert( p_resource->i_vout == 0 );
+        assert( p_resource->i_vout == 0 || p_resource->p_vout_free == 
p_resource->pp_vout[0] );
 
     /* */
     p_resource->p_input = p_input;
@@ -329,20 +336,32 @@ static void input_resource_PutVoutLocked(input_resource_t 
*p_resource,
                                          vout_thread_t *vout)
 {
     assert(vout != NULL);
-
     vlc_mutex_lock(&p_resource->lock_hold);
-    TAB_REMOVE(p_resource->i_vout, p_resource->pp_vout, vout);
+    assert( p_resource->i_vout > 0 );
 
-    const int active_vouts = p_resource->i_vout;
-    vlc_mutex_unlock(&p_resource->lock_hold);
+    if (p_resource->pp_vout[0] == vout)
+    {
+        vlc_mutex_unlock(&p_resource->lock_hold);
 
-    if (p_resource->p_vout_free != NULL || active_vouts > 0) {
-        msg_Dbg(p_resource->p_parent, "destroying vout (already one saved or 
active)");
-        vout_Close(vout);
-    } else {
+        assert(p_resource->p_vout_free == NULL);
         msg_Dbg(p_resource->p_parent, "saving a free vout");
         p_resource->p_vout_free = vout;
     }
+    else
+    {
+        msg_Dbg(p_resource->p_parent, "destroying vout (already one saved or 
active)");
+#ifndef NDEBUG
+        {
+            int index;
+            TAB_FIND(p_resource->i_vout, p_resource->pp_vout, vout, index);
+            assert(index >= 0);
+        }
+#endif
+
+        TAB_REMOVE(p_resource->i_vout, p_resource->pp_vout, vout);
+        vlc_mutex_unlock(&p_resource->lock_hold);
+        vout_Close(vout);
+    }
 }
 
 void input_resource_PutVout(input_resource_t *p_resource,
@@ -373,21 +392,27 @@ vout_thread_t *input_resource_GetVout(input_resource_t 
*p_resource,
             cfg_buf.vout = vout = vout_Create(p_resource->p_parent);
             if (vout == NULL)
                 goto out;
+
+            vlc_mutex_lock(&p_resource->lock_hold);
+            TAB_APPEND(p_resource->i_vout, p_resource->pp_vout, vout);
+            vlc_mutex_unlock(&p_resource->lock_hold);
         } else
             msg_Dbg(p_resource->p_parent, "trying to reuse free vout");
-    }  else if (cfg->vout != NULL) {
-        assert(cfg->vout != p_resource->p_vout_free);
+    }
 
+#ifndef NDEBUG
+    {
         vlc_mutex_lock(&p_resource->lock_hold);
-        TAB_REMOVE(p_resource->i_vout, p_resource->pp_vout, cfg->vout);
+        int index;
+        TAB_FIND(p_resource->i_vout, p_resource->pp_vout, cfg->vout, index );
+        assert(index >= 0);
+        assert(p_resource->p_vout_free == NULL);
         vlc_mutex_unlock(&p_resource->lock_hold);
     }
+#endif
 
     if (vout_Request(cfg, p_resource->p_input)) {
-        if (p_resource->p_vout_free == NULL && p_resource->i_vout == 0)
-            p_resource->p_vout_free = cfg->vout;
-        else
-            vout_Close(cfg->vout);
+        input_resource_PutVoutLocked(p_resource, cfg->vout);
         vlc_mutex_unlock(&p_resource->lock);
         return NULL;
     }
@@ -400,10 +425,6 @@ vout_thread_t *input_resource_GetVout(input_resource_t 
*p_resource,
         input_Control(p_resource->p_input, INPUT_SET_INITIAL_VIEWPOINT,
                       &cfg->fmt->pose);
 
-    vlc_mutex_lock(&p_resource->lock_hold);
-    TAB_APPEND(p_resource->i_vout, p_resource->pp_vout, vout);
-    vlc_mutex_unlock(&p_resource->lock_hold);
-
 out:
     vlc_mutex_unlock( &p_resource->lock );
     return vout;
@@ -411,7 +432,6 @@ out:
 
 vout_thread_t *input_resource_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;
@@ -459,8 +479,7 @@ void input_resource_TerminateVout( input_resource_t 
*p_resource )
     if (p_resource->p_vout_free != NULL)
     {
         msg_Dbg(p_resource->p_vout_free, "destroying useless vout");
-        vout_Close(p_resource->p_vout_free);
-        p_resource->p_vout_free = NULL;
+        DestroyVout(p_resource);
     }
     vlc_mutex_unlock(&p_resource->lock);
 }

_______________________________________________
vlc-commits mailing list
[email protected]
https://mailman.videolan.org/listinfo/vlc-commits

Reply via email to