[vlc-devel] [PATCH 03/26] decoder: get the decoder device from the vout

Steve Lhomme robux4 at ycbcr.xyz
Fri Sep 20 16:28:33 CEST 2019


---
 src/audio_output/filters.c       |  2 +-
 src/input/decoder.c              | 12 ++++++++++--
 src/input/resource.c             |  7 ++++---
 src/input/resource.h             |  5 +++--
 src/video_output/video_output.c  | 14 +++++++++++++-
 src/video_output/vout_internal.h |  4 +++-
 6 files changed, 34 insertions(+), 10 deletions(-)

diff --git a/src/audio_output/filters.c b/src/audio_output/filters.c
index 6a37c8e8ab7..dad467b44f0 100644
--- a/src/audio_output/filters.c
+++ b/src/audio_output/filters.c
@@ -395,7 +395,7 @@ vout_thread_t *aout_filter_GetVout(filter_t *filter, const video_format_t *fmt)
 
     video_format_AdjustColorSpace(&adj_fmt);
 
-    if (vout_Request(&cfg, NULL)) {
+    if (vout_Request(&cfg, NULL, NULL)) {
         vout_Close(vout);
         vout = NULL;
     }
diff --git a/src/input/decoder.c b/src/input/decoder.c
index 57c9de6a1ee..f2f69a05fd1 100644
--- a/src/input/decoder.c
+++ b/src/input/decoder.c
@@ -122,6 +122,7 @@ struct decoder_owner
     audio_output_t *p_aout;
 
     vout_thread_t   *p_vout;
+    vlc_decoder_device *p_dec_dev;
 
     /* -- Theses variables need locking on read *and* write -- */
     /* Preroll */
@@ -560,17 +561,21 @@ static int ModuleThread_UpdateVideoFormat( decoder_t *p_dec )
             break;
         }
         enum vlc_vout_order order;
-        p_vout = input_resource_GetVout( p_owner->p_resource,
+        vlc_decoder_device *dec_dev = NULL;
+        p_vout = input_resource_GetVoutHoldDevice( p_owner->p_resource,
             &(vout_configuration_t) {
                 .vout = p_vout, .clock = p_owner->p_clock, .fmt = &fmt,
                 .dpb_size = dpb_size + p_dec->i_extra_picture_buffers + 1,
                 .mouse_event = MouseEvent, .mouse_opaque = p_dec
-            }, &order );
+            }, &order, &dec_dev );
         if (p_vout)
             decoder_Notify(p_owner, on_vout_added, p_vout, order);
 
         vlc_mutex_lock( &p_owner->lock );
         p_owner->p_vout = p_vout;
+        if ( p_owner->p_dec_dev != NULL )
+            vlc_decoder_device_Release( p_owner->p_dec_dev );
+        p_owner->p_dec_dev = dec_dev;
 
         DecoderUpdateFormatLocked( p_owner );
         p_owner->fmt.video.i_chroma = p_dec->fmt_out.i_codec;
@@ -1906,6 +1911,9 @@ static void DeleteDecoder( decoder_t * p_dec )
     const enum es_format_category_e i_cat =p_dec->fmt_in.i_cat;
     decoder_Clean( p_dec );
 
+    if ( p_owner->p_dec_dev )
+        vlc_decoder_device_Release( p_owner->p_dec_dev );
+
     /* Free all packets still in the decoder fifo. */
     block_FifoRelease( p_owner->p_fifo );
 
diff --git a/src/input/resource.c b/src/input/resource.c
index b4ffbd68ce3..39d1a87a464 100644
--- a/src/input/resource.c
+++ b/src/input/resource.c
@@ -368,9 +368,10 @@ void input_resource_PutVout(input_resource_t *p_resource,
     vlc_mutex_unlock( &p_resource->lock );
 }
 
-vout_thread_t *input_resource_GetVout(input_resource_t *p_resource,
+vout_thread_t *input_resource_GetVoutHoldDevice(input_resource_t *p_resource,
                                       const vout_configuration_t *cfg,
-                                      enum vlc_vout_order *order)
+                                      enum vlc_vout_order *order,
+                                      vlc_decoder_device **dec_dev)
 {
     vout_configuration_t cfg_buf;
     vout_thread_t *vout;
@@ -425,7 +426,7 @@ vout_thread_t *input_resource_GetVout(input_resource_t *p_resource,
     }
 #endif
 
-    if (vout_Request(cfg, p_resource->p_input)) {
+    if (vout_Request(cfg, dec_dev, p_resource->p_input)) {
         input_resource_PutVoutLocked(p_resource, cfg->vout, false);
         vlc_mutex_unlock(&p_resource->lock);
         return NULL;
diff --git a/src/input/resource.h b/src/input/resource.h
index a13ca0dc85c..ab456d7ce5d 100644
--- a/src/input/resource.h
+++ b/src/input/resource.h
@@ -37,9 +37,10 @@ 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_GetVout(input_resource_t *,
+vout_thread_t *input_resource_GetVoutHoldDevice(input_resource_t *,
                                       const vout_configuration_t *,
-                                      enum vlc_vout_order *order);
+                                      enum vlc_vout_order *order,
+                                      vlc_decoder_device **);
 void input_resource_PutVout(input_resource_t *, vout_thread_t *);
 
 /**
diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c
index cf2132a089c..2a38bd677c4 100644
--- a/src/video_output/video_output.c
+++ b/src/video_output/video_output.c
@@ -1860,7 +1860,8 @@ vout_thread_t *vout_Hold(vout_thread_t *vout)
     return vout;
 }
 
-int vout_Request(const vout_configuration_t *cfg, input_thread_t *input)
+int vout_Request(const vout_configuration_t *cfg, vlc_decoder_device **dec_dev,
+                 input_thread_t *input)
 {
     vout_thread_t *vout = cfg->vout;
     vout_thread_sys_t *sys = vout->p;
@@ -1870,6 +1871,10 @@ int vout_Request(const vout_configuration_t *cfg, input_thread_t *input)
     assert(cfg->fmt != NULL);
     assert(cfg->clock != NULL);
 
+    if (dec_dev)
+        // don't return a decoder device by default, we need a proper reference
+        *dec_dev = NULL;
+
     if (!VoutCheckFormat(cfg->fmt))
         return -1;
 
@@ -1949,6 +1954,13 @@ error:
         return -1;
     }
 
+    if (dec_dev)
+    {
+        vlc_mutex_lock(&sys->window_lock);
+        *dec_dev = sys->dec_device ? vlc_decoder_device_Hold( sys->dec_device ) : NULL;
+        vlc_mutex_unlock(&sys->window_lock);
+    }
+
     if (input != NULL && sys->spu)
         spu_Attach(sys->spu, input);
     vout_IntfReinit(vout);
diff --git a/src/video_output/vout_internal.h b/src/video_output/vout_internal.h
index ee24cd9153f..1f88997779c 100644
--- a/src/video_output/vout_internal.h
+++ b/src/video_output/vout_internal.h
@@ -207,11 +207,13 @@ vout_thread_t *vout_CreateDummy(vlc_object_t *obj) VLC_USED;
  * You can release the returned value either by vout_Request() or vout_Close().
  *
  * \param cfg the video configuration requested.
+ * \param dec_dev pointer to receive the decoder device reference to use with the vout or NULL
  * \param input used to get attachments for spu filters
  * \retval 0 on success
  * \retval -1 on error
  */
-int vout_Request(const vout_configuration_t *cfg, input_thread_t *input);
+int vout_Request(const vout_configuration_t *cfg, vlc_decoder_device **dec_dev,
+                 input_thread_t *input);
 
 /**
  * Disables a vout.
-- 
2.17.1



More information about the vlc-devel mailing list