[vlc-devel] [RFC PATCH 2/8] input: Allow demux_filter to be enabled/disabled

Hugo Beauzée-Luyssen hugo at beauzee.fr
Wed Jul 19 16:17:42 CEST 2017


---
 include/vlc_demux.h                                |  3 +++
 modules/stream_out/chromecast/chromecast_demux.cpp |  3 +++
 src/input/demux.c                                  | 30 ++++++++++++++++++++++
 src/input/demux.h                                  |  2 ++
 src/input/input.c                                  | 10 ++++++++
 5 files changed, 48 insertions(+)

diff --git a/include/vlc_demux.h b/include/vlc_demux.h
index 4905d3e8a8..5311c04216 100644
--- a/include/vlc_demux.h
+++ b/include/vlc_demux.h
@@ -323,6 +323,9 @@ enum demux_query_e
     DEMUX_NAV_POPUP,
     /** Activate disc Root Menu. Can fail */
     DEMUX_NAV_MENU,            /* res=can fail */
+    /** Enable/Disable a demux filter */
+    DEMUX_FILTER_ENABLE,
+    DEMUX_FILTER_DISABLE
 };
 
 /*************************************************************************
diff --git a/modules/stream_out/chromecast/chromecast_demux.cpp b/modules/stream_out/chromecast/chromecast_demux.cpp
index 88e8b69aeb..27c8758694 100644
--- a/modules/stream_out/chromecast/chromecast_demux.cpp
+++ b/modules/stream_out/chromecast/chromecast_demux.cpp
@@ -230,6 +230,9 @@ struct demux_sys_t
             setPauseState( paused != 0 );
             break;
         }
+        case DEMUX_FILTER_DISABLE:
+            demux_Control( p_demux_filter->p_next, DEMUX_SET_TIME, getPlaybackTime() );
+            return VLC_SUCCESS;
         }
 
         return demux_vaControl( p_demux_filter->p_next, i_query, args );
diff --git a/src/input/demux.c b/src/input/demux.c
index 109a386775..c5f1d941f3 100644
--- a/src/input/demux.c
+++ b/src/input/demux.c
@@ -487,6 +487,8 @@ int demux_vaControlHelper( stream_t *s,
         case DEMUX_NAV_RIGHT:
         case DEMUX_NAV_POPUP:
         case DEMUX_NAV_MENU:
+        case DEMUX_FILTER_ENABLE:
+        case DEMUX_FILTER_DISABLE:
             return VLC_EGENERIC;
 
         case DEMUX_SET_TITLE:
@@ -652,3 +654,31 @@ demux_t *demux_FilterChainNew( demux_t *p_demux, const char *psz_chain )
 
     return NULL;
 }
+
+static bool demux_filter_enable_disable( demux_t *p_demux_chain,
+                                          const char* psz_demux, bool b_enable )
+{
+    demux_t *p_demux = p_demux_chain;
+    while ( p_demux )
+    {
+        if( strcmp( module_get_name( p_demux->p_module, false ), psz_demux) == 0 ||
+            strcmp( module_get_name( p_demux->p_module, true ), psz_demux ) == 0 )
+        {
+            demux_Control( p_demux,
+                           b_enable ? DEMUX_FILTER_ENABLE : DEMUX_FILTER_DISABLE );
+            return true;
+        }
+        p_demux = p_demux->p_next;
+    }
+    return false;
+}
+
+bool demux_FilterEnable( demux_t *p_demux_chain, const char* psz_demux )
+{
+    return demux_filter_enable_disable( p_demux_chain, psz_demux, true );
+}
+
+bool demux_FilterDisable( demux_t *p_demux_chain, const char* psz_demux )
+{
+    return demux_filter_enable_disable( p_demux_chain, psz_demux, false );
+}
diff --git a/src/input/demux.h b/src/input/demux.h
index 25c9520de2..5a6d63a6ef 100644
--- a/src/input/demux.h
+++ b/src/input/demux.h
@@ -41,5 +41,7 @@ int demux_GetTitle( demux_t * );
 int demux_GetSeekpoint( demux_t * );
 
 demux_t *demux_FilterChainNew( demux_t *p_demux, const char *psz_name );
+bool demux_FilterEnable( demux_t *p_demux_chain, const char* psz_demux );
+bool demux_FilterDisable( demux_t *p_demux_chain, const char* psz_demux );
 
 #endif
diff --git a/src/input/input.c b/src/input/input.c
index e537682d3c..0ceb5796c3 100644
--- a/src/input/input.c
+++ b/src/input/input.c
@@ -1754,6 +1754,16 @@ static void ControlUpdateSout( input_thread_t *p_input, const char* psz_chain )
     es_out_Control( input_priv(p_input)->p_es_out, ES_OUT_RESTART_ALL_ES );
 }
 
+static void ControlInsertDemuxFilter( input_thread_t* p_input, const char* psz_demux_chain )
+{
+    input_source_t *p_inputSource = input_priv(p_input)->master;
+    demux_t *p_filtered_demux = demux_FilterChainNew( p_inputSource->p_demux, psz_demux_chain );
+    if ( p_filtered_demux != NULL )
+        p_inputSource->p_demux = p_filtered_demux;
+    else if ( psz_demux_chain != NULL )
+        msg_Dbg(p_input, "Failed to create demux filter %s", psz_demux_chain);
+}
+
 static bool Control( input_thread_t *p_input,
                      int i_type, vlc_value_t val )
 {
-- 
2.11.0



More information about the vlc-devel mailing list