[vlc-devel] [PATCH 10/11] decoder: add the possibility to have a custom fmt_out setup to load a decoder

Steve Lhomme robux4 at videolabs.io
Thu Jul 13 15:44:43 CEST 2017


By default it is a blank fmt_out with just the category set.
---
 include/vlc_codec.h |  7 ++++++-
 src/input/decoder.c | 21 +++++++++++++++++----
 src/misc/image.c    |  3 +--
 3 files changed, 24 insertions(+), 7 deletions(-)

diff --git a/include/vlc_codec.h b/include/vlc_codec.h
index 76a86767f1..eacb57f5e0 100644
--- a/include/vlc_codec.h
+++ b/include/vlc_codec.h
@@ -30,6 +30,7 @@
 #include <vlc_es.h>
 #include <vlc_picture.h>
 #include <vlc_subpicture.h>
+#include <vlc_modules.h>
 
 /**
  * \defgroup codec Codec
@@ -411,8 +412,12 @@ VLC_API int decoder_GetDisplayRate( decoder_t * ) VLC_USED;
 
 /**
  * This function loads a decoder module matching the fmt_in of the decoder object.
+ *
+ * The probe is responsible for setting up the decoder fmt_out before/after
+ * loading a module. By default it initializes a blank fmt_out with just
+ * the category and cleans it up on module loading error.
  */
-VLC_API module_t *decoder_LoadModule( decoder_t * ) VLC_USED;
+VLC_API module_t *decoder_LoadModule( decoder_t *, vlc_activate_t probe ) VLC_USED;
 
 /** @} */
 /** @} */
diff --git a/src/input/decoder.c b/src/input/decoder.c
index f2bb533a23..5d751157b6 100644
--- a/src/input/decoder.c
+++ b/src/input/decoder.c
@@ -151,7 +151,18 @@ struct decoder_owner_sys_t
 #define DECODER_SPU_VOUT_WAIT_DURATION ((int)(0.200*CLOCK_FREQ))
 #define BLOCK_FLAG_CORE_PRIVATE_RELOADED (1 << BLOCK_FLAG_CORE_PRIVATE_SHIFT)
 
-module_t *decoder_LoadModule( decoder_t *p_dec )
+static int DecoderStart(void *func, va_list ap)
+{
+    decoder_t *p_dec = va_arg(ap, decoder_t *);
+    int (*activate)(vlc_object_t *) = func;
+
+    int res = activate( VLC_OBJECT(p_dec) );
+    if ( res != VLC_SUCCESS )
+        es_format_Change( &p_dec->fmt_out, p_dec->fmt_out.i_cat, 0 );
+    return res;
+}
+
+module_t *decoder_LoadModule( decoder_t *p_dec, vlc_activate_t probe )
 {
     const char caps[ES_CATEGORY_COUNT][16] = {
         [VIDEO_ES] = "video decoder",
@@ -169,7 +180,10 @@ module_t *decoder_LoadModule( decoder_t *p_dec )
         return NULL; /* no decoder for this type */
     }
 
-    return module_need( p_dec, caps[p_dec->fmt_in.i_cat], "$codec", false );
+    if ( probe == NULL )
+        es_format_Init( &p_dec->fmt_out, p_dec->fmt_in.i_cat, 0 );
+    return vlc_module_load( p_dec, caps[p_dec->fmt_in.i_cat], "$codec",
+                     false, probe ? probe : DecoderStart, p_dec );
 }
 
 /**
@@ -191,8 +205,7 @@ static int LoadDecoder( decoder_t *p_dec, bool b_packetizer,
     /* Find a suitable decoder/packetizer module */
     if( !b_packetizer )
     {
-        es_format_Init( &p_dec->fmt_out, p_fmt->i_cat, 0 );
-        p_dec->p_module = decoder_LoadModule( p_dec );
+        p_dec->p_module = decoder_LoadModule( p_dec, NULL );
     }
     else
     {
diff --git a/src/misc/image.c b/src/misc/image.c
index 19aa95cfe2..f2dbde3d2d 100644
--- a/src/misc/image.c
+++ b/src/misc/image.c
@@ -647,14 +647,13 @@ static decoder_t *CreateDecoder( vlc_object_t *p_this, const video_format_t *fmt
 
     p_dec->p_module = NULL;
     es_format_InitFromVideo( &p_dec->fmt_in, fmt );
-    es_format_Init( &p_dec->fmt_out, VIDEO_ES, 0 );
     p_dec->b_frame_drop_allowed = false;
 
     p_dec->pf_vout_format_update = video_update_format;
     p_dec->pf_vout_buffer_new = video_new_buffer;
 
     /* Find a suitable decoder module */
-    p_dec->p_module = decoder_LoadModule( p_dec );
+    p_dec->p_module = decoder_LoadModule( p_dec, NULL );
     if( !p_dec->p_module )
     {
         msg_Err( p_dec, "no suitable decoder module for fourcc `%4.4s'. "
-- 
2.12.1



More information about the vlc-devel mailing list