[vlc-commits] input: fix vout recycling

Thomas Guillem git at videolan.org
Fri May 10 09:51:29 CEST 2019


vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Mon May  6 14:08:26 2019 +0200| [ad183c8ffc20b964d5b0fb66c47d2dfb3f92fb06] | committer: Thomas Guillem

input: fix vout recycling

Vout recycling as keeping the same "vout display" plugin and not
disabling/enabling the window.

Add input_resource_StopFreeVout: Used to stop the re-used vout if there is no
video following the current input.

The vout is now always closed or paused from input_resource_PutVout(). Only the
main vout is paused, all additional vouts will be closed. The main vout will be
actually closed from input_resource_StopFreeVout(), when we are sure that the
next input doesn't have video.

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

 src/input/decoder.c  |  3 ---
 src/input/es_out.c   |  6 +++---
 src/input/player.c   |  2 +-
 src/input/resource.c | 18 ++++++++++++++++++
 src/input/resource.h |  2 ++
 5 files changed, 24 insertions(+), 7 deletions(-)

diff --git a/src/input/decoder.c b/src/input/decoder.c
index 36b5ac8f89..e5bc84d091 100644
--- a/src/input/decoder.c
+++ b/src/input/decoder.c
@@ -1950,9 +1950,6 @@ static void DeleteDecoder( decoder_t * p_dec )
                 /* Reset the cancel state that was set before joining the decoder
                  * thread */
                 vout_Cancel(vout, false);
-                vout_FlushAll(vout);
-                vout_FlushSubpictureChannel(vout, -1);
-                vout_Stop(vout);
                 input_SendEventVout(p_owner->p_input,
                     &(struct vlc_input_event_vout) {
                         .action = VLC_INPUT_EVENT_VOUT_DELETED,
diff --git a/src/input/es_out.c b/src/input/es_out.c
index c527086bf3..2026fb8c22 100644
--- a/src/input/es_out.c
+++ b/src/input/es_out.c
@@ -46,6 +46,7 @@
 #include "decoder.h"
 #include "es_out.h"
 #include "event.h"
+#include "resource.h"
 #include "info.h"
 #include "item.h"
 
@@ -748,10 +749,9 @@ static void EsOutStopFreeVout( es_out_t *out )
 {
     es_out_sys_t *p_sys = container_of(out, es_out_sys_t, out);
 
-    /* Clean up vout after user action (in active mode only).
-     * FIXME it does not work well with multiple video windows */
+    /* Clean up vout after user action (in active mode only). */
     if( p_sys->b_active )
-        input_resource_TerminateVout( input_priv(p_sys->p_input)->p_resource );
+        input_resource_StopFreeVout( input_priv(p_sys->p_input)->p_resource );
 }
 
 static void EsOutDecodersStopBuffering( es_out_t *out, bool b_forced )
diff --git a/src/input/player.c b/src/input/player.c
index f43f9f71a5..328a7def15 100644
--- a/src/input/player.c
+++ b/src/input/player.c
@@ -885,7 +885,7 @@ vlc_player_destructor_Thread(void *data)
             const bool started = player->started;
             vlc_player_Unlock(player);
             if (!started)
-                input_resource_TerminateVout(player->resource);
+                input_resource_StopFreeVout(player->resource);
             if (!keep_sout)
                 input_resource_TerminateSout(player->resource);
             vlc_player_Lock(player);
diff --git a/src/input/resource.c b/src/input/resource.c
index 23ad7426eb..14726aa063 100644
--- a/src/input/resource.c
+++ b/src/input/resource.c
@@ -58,6 +58,7 @@ struct input_resource_t
 
     sout_instance_t *p_sout;
     vout_thread_t   *p_vout_free;
+    bool             b_vout_free_paused;
 
     /* This lock is used to protect vout resources access (for hold)
      * It is a special case because of embed video (possible deadlock
@@ -152,6 +153,7 @@ static void DestroyVout( input_resource_t *p_resource )
 
         vout_Close( p_resource->p_vout_free );
         p_resource->p_vout_free = NULL;
+        p_resource->b_vout_free_paused = false;
     }
 
     p_resource->p_vout_free = NULL;
@@ -344,8 +346,11 @@ static void input_resource_PutVoutLocked(input_resource_t *p_resource,
         vlc_mutex_unlock(&p_resource->lock_hold);
 
         assert(p_resource->p_vout_free == NULL);
+        assert(!p_resource->b_vout_free_paused);
         msg_Dbg(p_resource->p_parent, "saving a free vout");
+        vout_Pause(vout);
         p_resource->p_vout_free = vout;
+        p_resource->b_vout_free_paused = true;
     }
     else
     {
@@ -386,6 +391,7 @@ vout_thread_t *input_resource_GetVout(input_resource_t *p_resource,
         cfg_buf = *cfg;
         cfg_buf.vout = p_resource->p_vout_free;
         p_resource->p_vout_free = NULL;
+        p_resource->b_vout_free_paused = false;
         cfg = &cfg_buf;
 
         if (cfg_buf.vout == NULL) {
@@ -484,6 +490,18 @@ void input_resource_TerminateVout( input_resource_t *p_resource )
     vlc_mutex_unlock(&p_resource->lock);
 }
 
+void input_resource_StopFreeVout(input_resource_t *p_resource)
+{
+    vlc_mutex_lock(&p_resource->lock);
+    if (p_resource->p_vout_free != NULL && p_resource->b_vout_free_paused)
+    {
+        msg_Dbg(p_resource->p_vout_free, "stop free vout");
+        vout_Stop(p_resource->p_vout_free);
+        p_resource->b_vout_free_paused = false;
+    }
+    vlc_mutex_unlock(&p_resource->lock);
+}
+
 /* */
 sout_instance_t *input_resource_RequestSout( input_resource_t *p_resource, sout_instance_t *p_sout, const char *psz_sout )
 {
diff --git a/src/input/resource.h b/src/input/resource.h
index 123018064c..5d779ca3e1 100644
--- a/src/input/resource.h
+++ b/src/input/resource.h
@@ -60,6 +60,8 @@ void input_resource_HoldVouts( input_resource_t *, vout_thread_t ***, size_t * )
  */
 void input_resource_Terminate( input_resource_t * );
 
+void input_resource_StopFreeVout( input_resource_t * );
+
 /**
  * This function holds the input_resource_t itself
  */



More information about the vlc-commits mailing list