[vlc-devel] [PATCH 2/4] decoder: manage VBI from decoder.c

Thomas Guillem thomas at gllm.fr
Wed Mar 18 15:10:17 CET 2020


This is the only direct usage of the decoder_t created by input_DecoderCreate().
This will allow to use a new opaque struct for the decoder_t input API.
---
 src/input/decoder.c | 28 ++++++++++++++++++++++++++++
 src/input/decoder.h |  4 ++++
 src/input/es_out.c  | 22 +++++++++++-----------
 3 files changed, 43 insertions(+), 11 deletions(-)

diff --git a/src/input/decoder.c b/src/input/decoder.c
index 20df3f2230..b6208368d6 100644
--- a/src/input/decoder.c
+++ b/src/input/decoder.c
@@ -2583,6 +2583,34 @@ size_t input_DecoderGetFifoSize( decoder_t *p_dec )
     return block_FifoSize( p_owner->p_fifo );
 }
 
+static bool DecoderHasVbi( decoder_t *dec )
+{
+    return dec->fmt_in.i_cat == SPU_ES && dec->fmt_in.i_codec == VLC_CODEC_TELETEXT
+        && var_Type( dec, "vbi-page" ) == VLC_VAR_INTEGER;
+}
+
+int input_DecoderGetVbiPage( decoder_t *dec, bool *opaque )
+{
+    if( !DecoderHasVbi( dec ) )
+        return -1;
+    *opaque = var_GetBool( dec, "vbi-opaque" );
+    return var_GetInteger( dec, "vbi-page" );
+}
+
+int input_DecoderSetVbiPage( decoder_t *dec, unsigned page )
+{
+    if( !DecoderHasVbi( dec ) )
+        return VLC_EGENERIC;
+    return var_SetInteger( dec, "vbi-page", page );
+}
+
+int input_DecoderSetVbiOpaque( decoder_t *dec, bool opaque )
+{
+    if( !DecoderHasVbi( dec ) )
+        return VLC_EGENERIC;
+    return var_SetBool( dec, "vbi-opaque", opaque );
+}
+
 void input_DecoderSetVoutMouseEvent( decoder_t *dec, vlc_mouse_event mouse_event,
                                     void *user_data )
 {
diff --git a/src/input/decoder.h b/src/input/decoder.h
index af9f7c7bdb..216d02b053 100644
--- a/src/input/decoder.h
+++ b/src/input/decoder.h
@@ -134,6 +134,10 @@ bool input_DecoderHasFormatChanged( decoder_t *p_dec, es_format_t *p_fmt, vlc_me
  */
 size_t input_DecoderGetFifoSize( decoder_t *p_dec );
 
+int input_DecoderGetVbiPage( decoder_t *, bool *opaque );
+int input_DecoderSetVbiPage( decoder_t *, unsigned page );
+int input_DecoderSetVbiOpaque( decoder_t *, bool opaque );
+
 void input_DecoderSetVoutMouseEvent( decoder_t *, vlc_mouse_event, void * );
 int  input_DecoderAddVoutOverlay( decoder_t *, subpicture_t *, size_t * );
 int  input_DecoderDelVoutOverlay( decoder_t *, size_t );
diff --git a/src/input/es_out.c b/src/input/es_out.c
index e4e0e460ac..3973e3e0fc 100644
--- a/src/input/es_out.c
+++ b/src/input/es_out.c
@@ -2313,14 +2313,15 @@ static void EsOutSelectEs( es_out_t *out, es_out_id_t *es, bool b_force )
 
     /* Special case of the zvbi decoder for teletext: send the initial selected
      * page and transparency */
-    if( !es->p_master && es->fmt.i_cat == SPU_ES
-     && es->fmt.i_codec == VLC_CODEC_TELETEXT
-     && var_Type( es->p_dec, "vbi-page" ) == VLC_VAR_INTEGER )
+    if( !es->p_master )
     {
-        input_SendEventVbiPage( p_input,
-                                var_GetInteger( es->p_dec, "vbi-page" ) );
-        input_SendEventVbiTransparency( p_input,
-                                        var_GetBool( es->p_dec, "vbi-opaque" ) );
+        bool vbi_opaque;
+        int vbi_page = input_DecoderGetVbiPage( es->p_dec, &vbi_opaque );
+        if( vbi_page >= 0 )
+        {
+            input_SendEventVbiPage( p_input, vbi_page );
+            input_SendEventVbiTransparency( p_input, vbi_opaque );
+        }
     }
 }
 
@@ -3718,22 +3719,21 @@ static int EsOutVaPrivControlLocked( es_out_t *out, int query, va_list args )
         vlc_es_id_t *es_id = va_arg( args, vlc_es_id_t * );
         es_out_id_t *es = vlc_es_id_get_out( es_id );
         assert(es);
-        if( !es->p_dec || es->fmt.i_cat != SPU_ES
-          || es->fmt.i_codec != VLC_CODEC_TELETEXT )
+        if( !es->p_dec )
             return VLC_EGENERIC;
 
         int ret;
         if( query == ES_OUT_PRIV_SET_VBI_PAGE )
         {
             unsigned page = va_arg( args, unsigned );
-            ret = var_SetInteger( es->p_dec, "vbi-page", page );
+            ret = input_DecoderSetVbiPage( es->p_dec, page );
             if( ret == VLC_SUCCESS )
                 input_SendEventVbiPage( p_sys->p_input, page );
         }
         else
         {
             bool opaque = va_arg( args, int );
-            ret = var_SetBool( es->p_dec, "vbi-opaque", opaque );
+            ret = input_DecoderSetVbiOpaque( es->p_dec, opaque );
             if( ret == VLC_SUCCESS )
                 input_SendEventVbiTransparency( p_sys->p_input, opaque );
         }
-- 
2.20.1



More information about the vlc-devel mailing list