[vlc-devel] [PATCH 19/39] decoder: allow multiple calls to GetDecoderDevice before calling UpdateFormat

Steve Lhomme robux4 at ycbcr.xyz
Wed Oct 2 16:23:34 CEST 2019


This is how the VA's will be probed when multiple outputs are possible.
---
 src/input/decoder.c | 29 +++++++++++++++++++++--------
 1 file changed, 21 insertions(+), 8 deletions(-)

diff --git a/src/input/decoder.c b/src/input/decoder.c
index 3b6c4f05771..8af337a00ac 100644
--- a/src/input/decoder.c
+++ b/src/input/decoder.c
@@ -460,17 +460,19 @@ static void FixDisplayFormat(decoder_t *p_dec, video_format_t *fmt)
     video_format_AdjustColorSpace( fmt );
 }
 
+static int CreateVoutIfNeeded(struct decoder_owner *, vout_thread_t **, vlc_decoder_device **);
+
+
 static int ModuleThread_UpdateVideoFormat( decoder_t *p_dec )
 {
     struct decoder_owner *p_owner = dec_get_owner( p_dec );
 
-    vlc_mutex_lock( &p_owner->lock );
-
-    vout_thread_t *p_vout = p_owner->p_vout;
-    vlc_mutex_unlock( &p_owner->lock );
+    vout_thread_t *p_vout = NULL;
+    int created_vout = CreateVoutIfNeeded(p_owner, &p_vout, NULL);
+    if (created_vout == -1)
+        return -1; // error
 
-    if (!p_vout)
-        return -1;
+    // configure the new vout
 
     video_format_t fmt;
     FixDisplayFormat( p_dec, &fmt );
@@ -504,7 +506,7 @@ static int ModuleThread_UpdateVideoFormat( decoder_t *p_dec )
     return input_resource_GetDisplay( p_owner->p_resource, p_owner->p_dec_dev, &cfg);
 }
 
-static int CreateVoutIfNeeded(struct decoder_owner *p_owner, vlc_decoder_device **pp_dec_dev)
+static int CreateVoutIfNeeded(struct decoder_owner *p_owner, vout_thread_t **pp_vout, vlc_decoder_device **pp_dec_dev)
 {
     decoder_t *p_dec = &p_owner->dec;
     bool need_vout = false;
@@ -551,7 +553,15 @@ static int CreateVoutIfNeeded(struct decoder_owner *p_owner, vlc_decoder_device
     }
 
     if( !need_vout )
+    {
+        if (pp_vout)
+        {
+            vlc_mutex_lock( &p_owner->lock );
+            *pp_vout = p_owner->p_vout;
+            vlc_mutex_unlock( &p_owner->lock );
+        }
         return 0; // vout unchanged
+    }
 
     if( !p_dec->fmt_out.video.i_width ||
         !p_dec->fmt_out.video.i_height ||
@@ -582,6 +592,9 @@ static int CreateVoutIfNeeded(struct decoder_owner *p_owner, vlc_decoder_device
     if (p_vout)
         decoder_Notify(p_owner, on_vout_added, p_vout, order);
 
+    if (pp_vout)
+        *pp_vout = p_vout;
+
     vlc_mutex_lock( &p_owner->lock );
     p_owner->p_vout = p_vout;
     if ( pp_dec_dev )
@@ -618,7 +631,7 @@ static vlc_decoder_device * ModuleThread_GetDecoderDevice( decoder_t *p_dec )
     struct decoder_owner *p_owner = dec_get_owner( p_dec );
 
     vlc_decoder_device *dec_device = NULL;
-    int created_vout = CreateVoutIfNeeded(p_owner, &dec_device);
+    int created_vout = CreateVoutIfNeeded(p_owner, NULL, &dec_device);
     if (created_vout == -1)
     {
         if ( dec_device )
-- 
2.17.1



More information about the vlc-devel mailing list