[vlc-commits] input: resource: split input_resource_GetVout()

Steve Lhomme git at videolan.org
Wed Oct 9 10:16:03 CEST 2019


vlc | branch: master | Steve Lhomme <robux4 at ycbcr.xyz> | Mon Jul  1 14:03:18 2019 +0200| [0f755cd584d88e05f3a16f801ae2581046d02590] | committer: Steve Lhomme

input: resource: split input_resource_GetVout()

So we can create the display separately, when the video context will be created.

The first call creates/gets the vout and the decoder device. The other call
creates/gets the display module.

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

 src/input/decoder.c  | 52 ++++++++++++++++++++++++++++++----------------------
 src/input/resource.c | 23 ++++++++++++++++-------
 src/input/resource.h |  1 +
 3 files changed, 47 insertions(+), 29 deletions(-)

diff --git a/src/input/decoder.c b/src/input/decoder.c
index d3fa78ea1a..f46ad07c6a 100644
--- a/src/input/decoder.c
+++ b/src/input/decoder.c
@@ -523,36 +523,44 @@ static int CreateVoutIfNeeded(struct decoder_owner *p_owner)
     p_owner->p_vout = NULL; // the DecoderThread should not use the old vout anymore
     vlc_mutex_unlock( &p_owner->lock );
 
-    unsigned dpb_size;
-    switch( p_dec->fmt_in.i_codec )
-    {
-    case VLC_CODEC_HEVC:
-    case VLC_CODEC_H264:
-    case VLC_CODEC_DIRAC: /* FIXME valid ? */
-        dpb_size = 18;
-        break;
-    case VLC_CODEC_AV1:
-        dpb_size = 10;
-        break;
-    case VLC_CODEC_VP5:
-    case VLC_CODEC_VP6:
-    case VLC_CODEC_VP6F:
-    case VLC_CODEC_VP8:
-        dpb_size = 3;
-        break;
-    default:
-        dpb_size = 2;
-        break;
-    }
     enum vlc_vout_order order;
     vout_configuration_t cfg = {
         .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
     };
     vlc_decoder_device *dec_dev = NULL;
     p_vout = input_resource_GetVoutDecoderDevice( p_owner->p_resource,
                                     &cfg, &order, &dec_dev );
+    if (p_vout)
+    {
+        unsigned dpb_size;
+        switch( p_dec->fmt_in.i_codec )
+        {
+        case VLC_CODEC_HEVC:
+        case VLC_CODEC_H264:
+        case VLC_CODEC_DIRAC: /* FIXME valid ? */
+            dpb_size = 18;
+            break;
+        case VLC_CODEC_AV1:
+            dpb_size = 10;
+            break;
+        case VLC_CODEC_VP5:
+        case VLC_CODEC_VP6:
+        case VLC_CODEC_VP6F:
+        case VLC_CODEC_VP8:
+            dpb_size = 3;
+            break;
+        default:
+            dpb_size = 2;
+            break;
+        }
+        cfg.dpb_size = dpb_size + p_dec->i_extra_picture_buffers + 1;
+        cfg.vout = p_vout;
+        if (input_resource_ReconfigureVout( p_owner->p_resource, dec_dev, &cfg) != 0)
+        {
+            p_vout = NULL;
+        }
+    }
     if (p_vout)
         decoder_Notify(p_owner, on_vout_added, p_vout, order);
 
diff --git a/src/input/resource.c b/src/input/resource.c
index 71cbbda2f6..21a25dd059 100644
--- a/src/input/resource.c
+++ b/src/input/resource.c
@@ -431,14 +431,25 @@ vout_thread_t *input_resource_GetVoutDecoderDevice(input_resource_t *p_resource,
         *pp_dec_dev = vout_GetDevice(cfg);
     }
 
-    if (vout_Request(cfg, pp_dec_dev ? *pp_dec_dev : NULL, p_resource->p_input)) {
+    vout = cfg->vout;
+
+out:
+    vlc_mutex_unlock( &p_resource->lock );
+    return vout;
+}
+
+int input_resource_ReconfigureVout(input_resource_t *p_resource,
+                              vlc_decoder_device *dec_dev,
+                              const vout_configuration_t *cfg)
+{
+    vlc_mutex_lock( &p_resource->lock );
+    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;
+        return -1;
     }
 
-    vout = cfg->vout;
-    DisplayVoutTitle(p_resource, vout);
+    DisplayVoutTitle(p_resource, cfg->vout);
 
     /* Send original viewpoint to the input in order to update other ESes */
     if (p_resource->p_input != NULL)
@@ -447,10 +458,8 @@ vout_thread_t *input_resource_GetVoutDecoderDevice(input_resource_t *p_resource,
         input_ControlPush(p_resource->p_input, INPUT_CONTROL_SET_INITIAL_VIEWPOINT,
                           &param);
     }
-
-out:
     vlc_mutex_unlock( &p_resource->lock );
-    return vout;
+    return 0;
 }
 
 vout_thread_t *input_resource_HoldVout( input_resource_t *p_resource )
diff --git a/src/input/resource.h b/src/input/resource.h
index 537033c9d7..5e9d5c4ce9 100644
--- a/src/input/resource.h
+++ b/src/input/resource.h
@@ -41,6 +41,7 @@ vout_thread_t *input_resource_GetVoutDecoderDevice(input_resource_t *,
                                       const vout_configuration_t *,
                                       enum vlc_vout_order *order,
                                       vlc_decoder_device **);
+int input_resource_ReconfigureVout(input_resource_t *, vlc_decoder_device *, const vout_configuration_t *);
 void input_resource_PutVout(input_resource_t *, vout_thread_t *);
 
 /**



More information about the vlc-commits mailing list