[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