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

Thomas Guillem thomas at gllm.fr
Mon May 27 09:43:21 CEST 2019



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.

> +            /* 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


More information about the vlc-devel mailing list