[vlc-devel] [RFC PATCH 8/8] demux: Disable demux filters before removing them from the chain

Hugo Beauzée-Luyssen hugo at beauzee.fr
Thu Jul 6 19:14:31 CEST 2017


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

diff --git a/include/vlc_demux.h b/include/vlc_demux.h
index 4905d3e8a8..fcd39d3b8f 100644
--- a/include/vlc_demux.h
+++ b/include/vlc_demux.h
@@ -323,6 +323,8 @@ enum demux_query_e
     DEMUX_NAV_POPUP,
     /** Activate disc Root Menu. Can fail */
     DEMUX_NAV_MENU,            /* res=can fail */
+    /** Disable a demux filter */
+    DEMUX_FILTER_DISABLE
 };
 
 /*************************************************************************
diff --git a/modules/stream_out/chromecast/chromecast_demux.cpp b/modules/stream_out/chromecast/chromecast_demux.cpp
index 06536d1a27..cf1962f817 100644
--- a/modules/stream_out/chromecast/chromecast_demux.cpp
+++ b/modules/stream_out/chromecast/chromecast_demux.cpp
@@ -249,6 +249,9 @@ static int Control( demux_t *p_demux_filter, int i_query, va_list args)
         p_sys->setPauseState( paused != 0 );
         break;
     }
+    case DEMUX_FILTER_DISABLE:
+        demux_Control( p_demux_filter->p_next, DEMUX_SET_TIME, p_sys->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 d85eb0fd53..a9d4f509ae 100644
--- a/src/input/demux.c
+++ b/src/input/demux.c
@@ -482,6 +482,7 @@ int demux_vaControlHelper( stream_t *s,
         case DEMUX_NAV_RIGHT:
         case DEMUX_NAV_POPUP:
         case DEMUX_NAV_MENU:
+        case DEMUX_FILTER_DISABLE:
             return VLC_EGENERIC;
 
         case DEMUX_SET_TITLE:
@@ -729,6 +730,12 @@ demux_t *demux_FilterRemoveFromChain( demux_t *p_demux_chain, const char* psz_de
         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 )
         {
+            if( demux_IsDemuxFilter( p_demux ) == false )
+            {
+                msg_Warn( p_demux_chain, "Can't remove non demux filter module "
+                          "%s from the chain", psz_demux );
+                return p_demux_chain;
+            }
             demux_t* p_ret = NULL;
             if( p_prev == NULL )
                 p_ret = p_demux->p_next;
@@ -737,6 +744,7 @@ demux_t *demux_FilterRemoveFromChain( demux_t *p_demux_chain, const char* psz_de
                 p_prev->p_next = p_demux->p_next;
                 p_ret = p_demux_chain;
             }
+            demux_Control( p_demux, DEMUX_FILTER_DISABLE );
             module_unneed( p_demux, p_demux->p_module );
             vlc_object_release( p_demux );
             return p_ret;
-- 
2.11.0



More information about the vlc-devel mailing list