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

Francois Cartegnie git at videolan.org
Wed Dec 11 20:18:24 CET 2013


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Tue Dec  3 19:05:21 2013 +0100| [2a310e14227b7cab441ee5128757a27b57f0b9a7] | committer: Francois Cartegnie

demux: asf: do ES audio selection for mms (fix #8797, #3400, #3797)

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=2a310e14227b7cab441ee5128757a27b57f0b9a7
---

 modules/access/mms/mmsh.c |   20 ++++++++++++++++++++
 modules/demux/asf/asf.c   |   39 +++++++++++++++++++++++++++++++--------
 2 files changed, 51 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 ce4dc76..e1add65 100644
--- a/modules/demux/asf/asf.c
+++ b/modules/demux/asf/asf.c
@@ -360,6 +360,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 )
@@ -394,6 +395,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 )
@@ -1144,15 +1159,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 */
@@ -1380,6 +1398,11 @@ static int DemuxInit( demux_t *p_demux )
             }
             fmt.i_priority = i_priority;
 
+            if ( i_stream <= INT_MAX )
+                fmt.i_id = i_stream;
+            else
+                msg_Warn( p_demux, "Can't set fmt.i_id to match stream id %u", i_stream );
+
             tk->p_es = es_out_Add( p_demux->out, &fmt );
         }
         else



More information about the vlc-commits mailing list