Commit 2a310e14 authored by Francois Cartegnie's avatar Francois Cartegnie

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

parent 836a03aa
...@@ -261,6 +261,26 @@ static int Control( access_t *p_access, int i_query, va_list args ) ...@@ -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; *pb_bool = p_sys->asfh.stream[i_int].i_selected ? true : false;
break; 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: case ACCESS_SET_PAUSE_STATE:
b_bool = (bool)va_arg( args, int ); b_bool = (bool)va_arg( args, int );
if( b_bool ) if( b_bool )
......
...@@ -360,6 +360,7 @@ static int Control( demux_t *p_demux, int i_query, va_list args ) ...@@ -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; demux_sys_t *p_sys = p_demux->p_sys;
vlc_meta_t *p_meta; vlc_meta_t *p_meta;
int64_t i64, *pi64; int64_t i64, *pi64;
int i;
double f, *pf; double f, *pf;
switch( i_query ) switch( i_query )
...@@ -394,6 +395,20 @@ static int Control( demux_t *p_demux, int i_query, va_list args ) ...@@ -394,6 +395,20 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
} }
return SeekPercent( p_demux, i_query, 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: case DEMUX_GET_POSITION:
if( p_sys->i_time < 0 ) return VLC_EGENERIC; if( p_sys->i_time < 0 ) return VLC_EGENERIC;
if( p_sys->i_length > 0 ) if( p_sys->i_length > 0 )
...@@ -1144,15 +1159,18 @@ static int DemuxInit( demux_t *p_demux ) ...@@ -1144,15 +1159,18 @@ static int DemuxInit( demux_t *p_demux )
tk->p_esp = NULL; tk->p_esp = NULL;
tk->p_frame = NULL; tk->p_frame = NULL;
/* Check (in case of mms) if this track is selected (ie will receive data) */ if ( strncmp( p_demux->psz_access, "mms", 3 ) )
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; /* Check (not mms) if this track is selected (ie will receive data) */
msg_Dbg( p_demux, "ignoring not selected stream(ID:%u) (by access)", if( !stream_Control( p_demux->s, STREAM_GET_PRIVATE_ID_STATE,
p_sp->i_stream_number ); (int) p_sp->i_stream_number, &b_access_selected ) &&
continue; !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 */ /* Find the associated extended_stream_properties if any */
...@@ -1380,6 +1398,11 @@ static int DemuxInit( demux_t *p_demux ) ...@@ -1380,6 +1398,11 @@ static int DemuxInit( demux_t *p_demux )
} }
fmt.i_priority = i_priority; 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 ); tk->p_es = es_out_Add( p_demux->out, &fmt );
} }
else else
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment