[vlc-devel] [PATCH 02/16] Add call to demux control when setting ES list

Roland Bewick roland.bewick at gmail.com
Mon May 27 17:39:24 CEST 2019


On 27/05/2019 2:43 PM, Thomas Guillem wrote:
>
> On Tue, May 21, 2019, at 20:09, Roland Bewick wrote:
>> ---
>>   include/vlc_demux.h                                |  3 +-
>>   modules/access/bluray.c                            | 18 ++++
>>   modules/demux/asf/asf.c                            | 98 ++++++++++++++--------
>>   modules/demux/mock.c                               |  2 +
>>   modules/demux/mpeg/ts.c                            | 12 +++
>>   modules/stream_out/chromecast/chromecast_demux.cpp |  2 +-
>>   src/input/demux.c                                  |  1 +
>>   src/input/input.c                                  |  4 +-
>>   8 files changed, 103 insertions(+), 37 deletions(-)
>>
>> diff --git a/include/vlc_demux.h b/include/vlc_demux.h
>> index 9930c0957d..7b24f0906a 100644
>> --- a/include/vlc_demux.h
>> +++ b/include/vlc_demux.h
>> @@ -197,7 +197,8 @@ enum demux_query_e
>>       DEMUX_SET_GROUP_DEFAULT,
>>       DEMUX_SET_GROUP_ALL,
>>       DEMUX_SET_GROUP_LIST,       /* arg1= size_t, arg2= const int *,
>> can fail */
>> -    DEMUX_SET_ES,               /* arg1= int
>>   can fail */
>> +    DEMUX_SET_ES,               /* arg1= int
>> can fail */
>> +    DEMUX_SET_ES_LIST,          /* arg1= int
>> can fail */
>>   
>>       /* Ask the demux to demux until the given date at the next
>> pf_demux call
>>        * but not more (and not less, at the precision available of
>> course).
>> diff --git a/modules/access/bluray.c b/modules/access/bluray.c
>> index cd88dcc4cf..8774c94c2a 100644
>> --- a/modules/access/bluray.c
>> +++ b/modules/access/bluray.c
>> @@ -2415,6 +2415,24 @@ static int blurayControl(demux_t *p_demux, int
>> query, va_list args)
>>           blurayOnUserStreamSelection(p_demux, i_id);
>>           break;
>>       }
>> +    case DEMUX_SET_ES_LIST:
>> +    {
>> +        vlc_es_id_t **es_id_list = va_arg( args, vlc_es_id_t ** );
>> +        size_t count;
>> +        for( count = 0; ; count++ )
>> +        {
>> +            vlc_es_id_t *es_id = es_id_list[count];
>> +            if( es_id == NULL )
>> +                break;
>> +        }
>> +        if (count == 1)
>> +        {
> You could do this check/optim in input/input.c. That way, every demux won't have to handle a one sized list.
>
> This will simplify a lot bluray and asf commits.
> In the meantime, make these module return VLC_EGENERIC if they receive a valid list.

Alright, I can do that.


>
>> +            /* For now, only support single track selection */
>> +            int i_id = vlc_es_id_GetInputId(es_id_list[0]);
>> +            blurayOnUserStreamSelection(p_demux, i_id);
>> +        }
>> +        break;
>> +    }
>>       case DEMUX_SET_TITLE:
>>       {
>>           int i_title = va_arg(args, int);
>> diff --git a/modules/demux/asf/asf.c b/modules/demux/asf/asf.c
>> index 8a72c706f9..3ffe6285cc 100644
>> --- a/modules/demux/asf/asf.c
>> +++ b/modules/demux/asf/asf.c
>> @@ -406,6 +406,51 @@ static void SeekPrepare( demux_t *p_demux )
>>       es_out_Control( p_demux->out, ES_OUT_RESET_PCR );
>>   }
>>   
>> +static int SetStreamById( demux_t *p_demux, int id )
>> +{
>> +    demux_sys_t *p_sys = p_demux->p_sys;
>> +
>> +    int i_ret;
>> +    if ( id >= 0 )
>> +    {
>> +        msg_Dbg( p_demux, "Requesting access to enable stream %d", id
>> );
>> +        i_ret = vlc_stream_Control( p_demux->s,
>> +                                    STREAM_SET_PRIVATE_ID_STATE, id,
>> true );
>> +    }
>> +    else
>> +    {  /* i contains -1 * es_category */
>> +        msg_Dbg( p_demux, "Requesting access to disable stream %d", id
>> );
>> +        i_ret = vlc_stream_Control( p_demux->s,
>> +                                    STREAM_SET_PRIVATE_ID_STATE, id,
>> +                                    false );
>> +    }
>> +
>> +    if ( i_ret == VLC_SUCCESS )
>> +    {
>> +        asf_track_t *tk;
>> +        if( id >= 0 )
>> +        {
>> +            tk = p_sys->track[id];
>> +        }
>> +        else
>> +        {
>> +            for( int j = 0; j < MAX_ASF_TRACKS ; j++ )
>> +            {
>> +                tk = p_sys->track[j];
>> +                if( !tk || !tk->p_fmt || tk->i_cat != -1 * id )
>> +                    continue;
>> +                FlushQueue( tk );
>> +                tk->i_time = VLC_TICK_INVALID;
>> +            }
>> +        }
>> +
>> +        p_sys->i_seek_track = 0;
>> +        if ( ( tk && tk->i_cat == VIDEO_ES ) || id == -1 * VIDEO_ES )
>> +            WaitKeyframe( p_demux );
>> +    }
>> +    return i_ret;
>> +}
>> +
>>   
>> /*****************************************************************************
>>    * Control:
>>    
>> *****************************************************************************/
>> @@ -450,45 +495,30 @@ static int Control( demux_t *p_demux, int
>> i_query, va_list args )
>>       case DEMUX_SET_ES:
>>       {
>>           i = va_arg( args, int );
>> -        int i_ret;
>> -        if ( i >= 0 )
>> +
>> +        return SetStreamById( p_demux, i );
>> +    }
>> +
>> +    case DEMUX_SET_ES_LIST:
>> +    {
>> +        vlc_es_id_t **es_id_list = va_arg( args, vlc_es_id_t ** );
>> +        size_t count;
>> +        for( count = 0; ; count++ )
>> +        {
>> +            vlc_es_id_t *es_id = es_id_list[count];
>> +            if( es_id == NULL )
>> +                break;
>> +        }
>> +        if (count == 1)
>>           {
>> -            msg_Dbg( p_demux, "Requesting access to enable stream %d",
>> i );
>> -            i_ret = vlc_stream_Control( p_demux->s,
>> -                                        STREAM_SET_PRIVATE_ID_STATE,
>> i, true );
>> +            /* For now, only support single track selection */
>> +            i = vlc_es_id_GetInputId(es_id_list[0]);
>> +            return SetStreamById( p_demux, i );
>>           }
>>           else
>> -        {  /* i contains -1 * es_category */
>> -            msg_Dbg( p_demux, "Requesting access to disable stream
>> %d", i );
>> -            i_ret = vlc_stream_Control( p_demux->s,
>> -                                        STREAM_SET_PRIVATE_ID_STATE, i,
>> -                                        false );
>> -        }
>> -
>> -        if ( i_ret == VLC_SUCCESS )
>>           {
>> -            asf_track_t *tk;
>> -            if( i >= 0 )
>> -            {
>> -                tk = p_sys->track[i];
>> -            }
>> -            else
>> -            {
>> -                for( int j = 0; j < MAX_ASF_TRACKS ; j++ )
>> -                {
>> -                    tk = p_sys->track[j];
>> -                    if( !tk || !tk->p_fmt || tk->i_cat != -1 * i )
>> -                        continue;
>> -                    FlushQueue( tk );
>> -                    tk->i_time = VLC_TICK_INVALID;
>> -                }
>> -            }
>> -
>> -            p_sys->i_seek_track = 0;
>> -            if ( ( tk && tk->i_cat == VIDEO_ES ) || i == -1 * VIDEO_ES
>> )
>> -                WaitKeyframe( p_demux );
>> +            return VLC_SUCCESS;
>>           }
>> -        return i_ret;
>>       }
>>   
>>       case DEMUX_GET_POSITION:
>> diff --git a/modules/demux/mock.c b/modules/demux/mock.c
>> index 03d282606b..b01fb2c342 100644
>> --- a/modules/demux/mock.c
>> +++ b/modules/demux/mock.c
>> @@ -287,6 +287,8 @@ Control(demux_t *demux, int query, va_list args)
>>               return VLC_EGENERIC;
>>           case DEMUX_SET_ES:
>>               return VLC_EGENERIC;
>> +        case DEMUX_SET_ES_LIST:
>> +            return VLC_EGENERIC;
>>           case DEMUX_SET_NEXT_DEMUX_TIME:
>>               return VLC_EGENERIC;
>>           case DEMUX_GET_FPS:
>> diff --git a/modules/demux/mpeg/ts.c b/modules/demux/mpeg/ts.c
>> index 3ff513a2e9..10d28cdbd5 100644
>> --- a/modules/demux/mpeg/ts.c
>> +++ b/modules/demux/mpeg/ts.c
>> @@ -1116,6 +1116,18 @@ static int Control( demux_t *p_demux, int
>> i_query, va_list args )
>>   
>>           return VLC_SUCCESS;
>>       }
>> +    case DEMUX_SET_ES_LIST:
>> +    {
>> +        vlc_es_id_t **es_id_list = va_arg( args, vlc_es_id_t ** );
>> +        VLC_UNUSED(es_id_list);
>> +
>> +        msg_Dbg( p_demux, "DEMUX_SET_ES_LIST" );
>> +
>> +        if( p_sys->seltype != PROGRAM_ALL ) /* Won't change anything */
>> +            UpdatePESFilters( p_demux, false );
>> +
>> +        return VLC_SUCCESS;
>> +    }
>>   
>>       case DEMUX_GET_TITLE_INFO:
>>       {
>> diff --git a/modules/stream_out/chromecast/chromecast_demux.cpp
>> b/modules/stream_out/chromecast/chromecast_demux.cpp
>> index 7a97b9cadc..32cb98010b 100644
>> --- a/modules/stream_out/chromecast/chromecast_demux.cpp
>> +++ b/modules/stream_out/chromecast/chromecast_demux.cpp
>> @@ -377,7 +377,7 @@ struct demux_cc
>>               setPauseState( paused != 0 );
>>               break;
>>           }
>> -        case DEMUX_SET_ES:
>> +        case DEMUX_SET_ES: case DEMUX_SET_ES_LIST:
>>               /* Seek back to the last known pos when changing tracks.
>> This will
>>                * flush sout streams, make sout del/add called right away
>> and
>>                * clear CC buffers. */
>> diff --git a/src/input/demux.c b/src/input/demux.c
>> index d7b5ce3711..b69053d7ff 100644
>> --- a/src/input/demux.c
>> +++ b/src/input/demux.c
>> @@ -379,6 +379,7 @@ int demux_vaControlHelper( stream_t *s,
>>           case DEMUX_SET_GROUP_ALL:
>>           case DEMUX_SET_GROUP_LIST:
>>           case DEMUX_SET_ES:
>> +        case DEMUX_SET_ES_LIST:
>>           case DEMUX_GET_ATTACHMENTS:
>>           case DEMUX_CAN_RECORD:
>>           case DEMUX_TEST_AND_CLEAR_FLAGS:
>> diff --git a/src/input/input.c b/src/input/input.c
>> index eea40b59c1..31761c9671 100644
>> --- a/src/input/input.c
>> +++ b/src/input/input.c
>> @@ -2148,7 +2148,9 @@ static bool Control( input_thread_t *p_input,
>>                                   ES_OUT_SET_ES_LIST, param.list.cat,
>>                                   param.list.ids ) == VLC_SUCCESS )
>>               {
>> -                /* TODO: demux_Control(..., DEMUX_SET_ES_LIST, ... ) */
>> +                demux_Control( input_priv(p_input)->master->p_demux,
>> +                               DEMUX_SET_ES_LIST,
>> +                               param.list.ids );
>>               }
>>               break;
>>           }
>> -- 
>> 2.11.0
>>
>> _______________________________________________
>> vlc-devel mailing list
>> To unsubscribe or modify your subscription options:
>> https://mailman.videolan.org/listinfo/vlc-devel
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel


More information about the vlc-devel mailing list