[vlc-devel] [PATCH 2/2] demux: asf: do ES audio selection for mms (fix #8797, #3400, #3797)

Francois Cartegnie fcvlcdev at free.fr
Tue Dec 3 19:05:21 CET 2013


---
 modules/access/mms/mmsh.c | 20 ++++++++++++++++++++
 modules/demux/asf/asf.c   | 34 ++++++++++++++++++++++++++--------
 2 files changed, 46 insertions(+), 8 deletions(-)

diff --git a/modules/access/mms/mmsh.c b/modules/access/mms/mmsh.c
index d354d28..414dfd4 100644
--- a/modules/access/mms/mmsh.c
+++ b/modules/access/mms/mmsh.c
@@ -261,6 +261,26 @@ static int Control( access_t *p_access, int i_query, va_list args )
             *pb_bool =  p_sys->asfh.stream[i_int].i_selected ? true : false;
             break;
 
+        case ACCESS_SET_PRIVATE_ID_STATE:
+            i_int = (int)va_arg( args, int );
+            b_bool = (bool)va_arg( args, int );
+            if( (i_int < 0) || (i_int > 127) )
+                return VLC_EGENERIC;
+            else
+            {
+                int i_cat = p_sys->asfh.stream[i_int].i_cat;
+                for ( int i=0; i< 128; i++ )
+                {
+                    /* First unselect all streams from the same cat */
+                    if ( i_cat == p_sys->asfh.stream[i].i_cat )
+                        p_sys->asfh.stream[i].i_selected = false;
+                }
+                p_sys->asfh.stream[i_int].i_selected = true;
+                Stop( p_access );
+                Seek( p_access, p_access->info.i_pos );
+                return VLC_SUCCESS;
+            }
+
         case ACCESS_SET_PAUSE_STATE:
             b_bool = (bool)va_arg( args, int );
             if( b_bool )
diff --git a/modules/demux/asf/asf.c b/modules/demux/asf/asf.c
index f169d37..bde94e6 100644
--- a/modules/demux/asf/asf.c
+++ b/modules/demux/asf/asf.c
@@ -354,6 +354,7 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
     demux_sys_t *p_sys = p_demux->p_sys;
     vlc_meta_t  *p_meta;
     int64_t     i64, *pi64;
+    int         i;
     double      f, *pf;
 
     switch( i_query )
@@ -388,6 +389,20 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
         }
         return SeekPercent( p_demux, i_query, args );
 
+    case DEMUX_SET_ES:
+    {
+        i = (int)va_arg( args, int );
+        int i_ret = stream_Control( p_demux->s,
+                                    STREAM_SET_PRIVATE_ID_STATE, i, true );
+        if ( i_ret == VLC_SUCCESS )
+        {
+            SeekPrepare( p_demux );
+            p_sys->i_seek_track = 0;
+            WaitKeyframe( p_demux );
+        }
+        return i_ret;
+    }
+
     case DEMUX_GET_POSITION:
         if( p_sys->i_time < 0 ) return VLC_EGENERIC;
         if( p_sys->i_length > 0 )
@@ -1003,15 +1018,18 @@ static int DemuxInit( demux_t *p_demux )
         tk->p_esp = NULL;
         tk->p_frame = NULL;
 
-        /* Check (in case of mms) if this track is selected (ie will receive data) */
-        if( !stream_Control( p_demux->s, STREAM_GET_PRIVATE_ID_STATE,
-                             (int) p_sp->i_stream_number, &b_access_selected ) &&
-            !b_access_selected )
+        if ( strncmp( p_demux->psz_access, "mms", 3 ) )
         {
-            tk->i_cat = UNKNOWN_ES;
-            msg_Dbg( p_demux, "ignoring not selected stream(ID:%u) (by access)",
-                     p_sp->i_stream_number );
-            continue;
+            /* Check (not mms) if this track is selected (ie will receive data) */
+            if( !stream_Control( p_demux->s, STREAM_GET_PRIVATE_ID_STATE,
+                                 (int) p_sp->i_stream_number, &b_access_selected ) &&
+                !b_access_selected )
+            {
+                tk->i_cat = UNKNOWN_ES;
+                msg_Dbg( p_demux, "ignoring not selected stream(ID:%u) (by access)",
+                         p_sp->i_stream_number );
+                continue;
+            }
         }
 
         /* Find the associated extended_stream_properties if any */
-- 
1.8.3.1




More information about the vlc-devel mailing list