[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