[vlc-devel] [PATCH 4/5] video_output: pass the vout directly to input_resource_GetVoutDecoderDevice()

Steve Lhomme robux4 at ycbcr.xyz
Wed Jan 22 11:44:04 CET 2020


---
 src/input/decoder.c              |  4 ++--
 src/input/resource.c             | 29 ++++++++++++-----------------
 src/input/resource.h             |  2 +-
 src/video_output/video_output.c  |  6 +++---
 src/video_output/vout_internal.h |  4 ++--
 5 files changed, 20 insertions(+), 25 deletions(-)

diff --git a/src/input/decoder.c b/src/input/decoder.c
index 480fa6bd17c..8f250fb2b0d 100644
--- a/src/input/decoder.c
+++ b/src/input/decoder.c
@@ -543,7 +543,7 @@ static int CreateVoutIfNeeded(struct decoder_owner *p_owner,
                 .vout = p_owner->p_vout, .fmt = &p_dec->fmt_out.video,
             };
             input_resource_GetVoutDecoderDevice( p_owner->p_resource,
-                                                &cfg, order, pp_dec_dev );
+                                                cfg.vout, order, pp_dec_dev );
             *order = p_owner->vout_order;
             vlc_mutex_unlock( &p_owner->lock );
         }
@@ -561,7 +561,7 @@ static int CreateVoutIfNeeded(struct decoder_owner *p_owner,
         .vout = p_vout, .fmt = &p_dec->fmt_out.video,
     };
     p_vout = input_resource_GetVoutDecoderDevice( p_owner->p_resource,
-                                    &cfg, order, pp_dec_dev );
+                                    cfg.vout, order, pp_dec_dev );
 
     if (pp_vout)
         *pp_vout = p_vout;
diff --git a/src/input/resource.c b/src/input/resource.c
index 4ff6edd79c0..1a989df2e2e 100644
--- a/src/input/resource.c
+++ b/src/input/resource.c
@@ -365,32 +365,27 @@ void input_resource_PutVout(input_resource_t *p_resource,
 }
 
 vout_thread_t *input_resource_GetVoutDecoderDevice(input_resource_t *p_resource,
-                                      const vout_device_configuration_t *cfg,
+                                      vout_thread_t *cfg_vout,
                                       enum vlc_vout_order *order,
                                       vlc_decoder_device **pp_dec_dev)
 {
-    vout_device_configuration_t cfg_buf;
     vout_thread_t *vout;
-
-    assert(cfg != NULL);
-    assert(cfg->fmt != NULL);
     vlc_mutex_lock( &p_resource->lock );
 
-    if (cfg->vout == NULL) {
-        cfg_buf = *cfg;
-        cfg_buf.vout = p_resource->p_vout_free;
+    if (cfg_vout == NULL) {
+        cfg_vout = p_resource->p_vout_free;
         p_resource->p_vout_free = NULL;
-        cfg = &cfg_buf;
 
-        if (cfg_buf.vout == NULL) {
+        if (cfg_vout == NULL) {
             /* Use the dummy vout as the parent of the future main vout. This
              * will allow the future vout to inherit all parameters
              * pre-configured on this dummy vout. */
             vlc_object_t *parent = p_resource->i_vout == 0 ?
                 VLC_OBJECT(p_resource->p_vout_dummy) : p_resource->p_parent;
-            cfg_buf.vout = vout = vout_Create(parent);
+            vout = vout_Create(parent);
             if (vout == NULL)
                 goto out;
+            cfg_vout = vout;
 
             vlc_mutex_lock(&p_resource->lock_hold);
             *order = p_resource->i_vout == 0 ? VLC_VOUT_ORDER_PRIMARY
@@ -408,10 +403,10 @@ vout_thread_t *input_resource_GetVoutDecoderDevice(input_resource_t *p_resource,
     {
         vlc_mutex_lock(&p_resource->lock_hold);
         assert(p_resource->i_vout > 0);
-        *order = p_resource->pp_vout[0] == cfg->vout ? VLC_VOUT_ORDER_PRIMARY
+        *order = p_resource->pp_vout[0] == cfg_vout ? VLC_VOUT_ORDER_PRIMARY
                                                      : VLC_VOUT_ORDER_SECONDARY;
         /* the caller is going to reuse the free vout, it's not free anymore */
-        if (p_resource->p_vout_free == cfg->vout)
+        if (p_resource->p_vout_free == cfg_vout)
             p_resource->p_vout_free = NULL;
         vlc_mutex_unlock(&p_resource->lock_hold);
     }
@@ -419,18 +414,18 @@ vout_thread_t *input_resource_GetVoutDecoderDevice(input_resource_t *p_resource,
 #ifndef NDEBUG
     {
         int index;
-        TAB_FIND(p_resource->i_vout, p_resource->pp_vout, cfg->vout, index );
+        TAB_FIND(p_resource->i_vout, p_resource->pp_vout, cfg_vout, index );
         assert(index >= 0);
-        assert(p_resource->p_vout_free == NULL || p_resource->p_vout_free == cfg->vout);
+        assert(p_resource->p_vout_free == NULL || p_resource->p_vout_free == cfg_vout);
     }
 #endif
 
     if (pp_dec_dev)
     {
-        *pp_dec_dev = vout_GetDevice(cfg);
+        *pp_dec_dev = vout_GetDevice(cfg_vout);
     }
 
-    vout = cfg->vout;
+    vout = cfg_vout;
 
 out:
     vlc_mutex_unlock( &p_resource->lock );
diff --git a/src/input/resource.h b/src/input/resource.h
index 6e85b3661db..b46ef6a33dd 100644
--- a/src/input/resource.h
+++ b/src/input/resource.h
@@ -38,7 +38,7 @@ void input_resource_SetInput( input_resource_t *, input_thread_t * );
 sout_instance_t *input_resource_RequestSout( input_resource_t *, sout_instance_t *, const char *psz_sout );
 
 vout_thread_t *input_resource_GetVoutDecoderDevice(input_resource_t *,
-                                      const vout_device_configuration_t *,
+                                      vout_thread_t *cfg_vout,
                                       enum vlc_vout_order *order,
                                       vlc_decoder_device **);
 int input_resource_StartVout(input_resource_t *, vlc_video_context *, const vout_configuration_t *);
diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c
index 83a773e916b..6effa2a70b7 100644
--- a/src/video_output/video_output.c
+++ b/src/video_output/video_output.c
@@ -2093,15 +2093,15 @@ int vout_Request(const vout_configuration_t *cfg, vlc_video_context *vctx, input
     return 0;
 }
 
-vlc_decoder_device *vout_GetDevice(const vout_device_configuration_t *cfg)
+vlc_decoder_device *vout_GetDevice(const vout_thread_t *vout)
 {
     vlc_decoder_device *dec_device = NULL;
 
-    vout_thread_sys_t *sys = cfg->vout->p;
+    vout_thread_sys_t *sys = vout->p;
 
     vlc_mutex_lock(&sys->window_lock);
     if (sys->dec_device == NULL)
-        sys->dec_device = vlc_decoder_device_Create(&cfg->vout->obj, sys->display_cfg.window);
+        sys->dec_device = vlc_decoder_device_Create(&vout->obj, sys->display_cfg.window);
     dec_device = sys->dec_device ? vlc_decoder_device_Hold( sys->dec_device ) : NULL;
     vlc_mutex_unlock(&sys->window_lock);
     return dec_device;
diff --git a/src/video_output/vout_internal.h b/src/video_output/vout_internal.h
index 0ca81871fee..95643a52ef0 100644
--- a/src/video_output/vout_internal.h
+++ b/src/video_output/vout_internal.h
@@ -202,10 +202,10 @@ vout_thread_t *vout_CreateDummy(vlc_object_t *obj) VLC_USED;
 /**
  * Setup the vout for the given configuration and get an associated decoder device.
  *
- * \param cfg the video configuration requested.
+ * \param vout the video configuration requested.
  * \return pointer to a decoder device reference to use with the vout or NULL
  */
-vlc_decoder_device *vout_GetDevice(const vout_device_configuration_t *cfg);
+vlc_decoder_device *vout_GetDevice(const vout_thread_t *vout);
 
 /**
  * Returns a suitable vout or release the given one.
-- 
2.17.1



More information about the vlc-devel mailing list