[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