[vlc-devel] [PATCH 2/2] [RFC] input: update the demux filter chain of the current input_thread while playing
Steve Lhomme
robux4 at videolabs.io
Fri Apr 22 17:57:21 CEST 2016
---
src/input/input.c | 37 +++++++++++++++++++++++++++++++++++++
1 file changed, 37 insertions(+)
diff --git a/src/input/input.c b/src/input/input.c
index 7e9c0bc..176c1db 100644
--- a/src/input/input.c
+++ b/src/input/input.c
@@ -88,6 +88,8 @@ static int InitSout( input_thread_t * p_input );
static int SoutChanged(vlc_object_t *, char const *,
vlc_value_t, vlc_value_t, void *);
+static int DemuxFilterChanged(vlc_object_t *, char const *,
+ vlc_value_t, vlc_value_t, void *);
static int ForwardStringValueChanged(vlc_object_t *, char const *,
vlc_value_t, vlc_value_t, void *);
@@ -1223,9 +1225,14 @@ static int Init( input_thread_t * p_input )
goto error;
p_input->p->master = master;
+ demux_t *p_master_demux = master->p_demux;
+ while ( p_master_demux->p_source )
+ p_master_demux = p_master_demux->p_source;
+ var_AddCallback( p_input, "demux-filter", DemuxFilterChanged, p_master_demux );
var_AddCallback( p_input, "sout", SoutChanged, p_input );
var_AddCallback( p_input->p_libvlc, "sout", ForwardStringValueChanged, p_input );
+ var_AddCallback( p_input->p_libvlc, "demux-filter", ForwardStringValueChanged, p_input );
InitTitle( p_input );
@@ -1359,8 +1366,13 @@ static void End( input_thread_t * p_input )
InputSourceDestroy( p_input->p->slave[i] );
free( p_input->p->slave );
+ demux_t *p_master_demux = p_input->p->master->p_demux;
+ while ( p_master_demux->p_source )
+ p_master_demux = p_master_demux->p_source;
+ var_DelCallback( p_input, "demux-filter", DemuxFilterChanged, p_master_demux );
var_DelCallback( p_input, "sout", SoutChanged, p_input );
+ var_DelCallback( p_input->p_libvlc, "demux-filter", ForwardStringValueChanged, p_input );
var_DelCallback( p_input->p_libvlc, "sout", ForwardStringValueChanged, p_input );
/* Clean up master */
@@ -3037,3 +3049,28 @@ int ForwardStringValueChanged( vlc_object_t *p_this, char const *psz_var,
}
return VLC_SUCCESS;
}
+
+int DemuxFilterChanged( vlc_object_t *p_this, char const *psz_var,
+ vlc_value_t oldval, vlc_value_t val, void *p_data )
+{
+ VLC_UNUSED(psz_var);
+ input_thread_t *p_input = (input_thread_t *) p_this;
+ demux_t *p_main_demux = (demux_t *) p_data;
+ if ( oldval.psz_string != val.psz_string &&
+ ( oldval.psz_string == NULL || val.psz_string == NULL ||
+ strcmp( oldval.psz_string, val.psz_string ) ) )
+ {
+ input_source_t *in = p_input->p->master;
+ while (in->p_demux && in->p_demux != p_main_demux)
+ {
+ demux_t *p_old = in->p_demux;
+ in->p_demux = p_old->p_source;
+ in->p_demux->s = p_old->s;
+ p_old->s = NULL;
+ demux_Delete( p_old );
+ }
+ assert( in->p_demux != NULL ); /* we need to restart on the base master */
+ UpdateDemuxer( p_input, p_input->p->master, val.psz_string );
+ }
+ return VLC_SUCCESS;
+}
--
2.7.0
More information about the vlc-devel
mailing list