[vlc-devel] [PATCH 1/3] input: es_out: split es selection matching functions

Thomas Guillem thomas at gllm.fr
Thu Jun 18 13:23:35 CEST 2020


So, this commit doesn't change the actual logic, right ?

On Thu, Jun 18, 2020, at 10:30, Francois Cartegnie wrote:
> split enforced & fallback cases, move fallback away from
> cases leaves to sequential using autoselect flag
> ---
>  src/input/es_out.c | 94 ++++++++++++++++++++++++++++------------------
>  1 file changed, 57 insertions(+), 37 deletions(-)
> 
> diff --git a/src/input/es_out.c b/src/input/es_out.c
> index 97c8774eb5..f8b5c65d07 100644
> --- a/src/input/es_out.c
> +++ b/src/input/es_out.c
> @@ -2400,6 +2400,55 @@ static void EsOutUnselectEs( es_out_t *out, 
> es_out_id_t *es, bool b_update )
>      EsOutSendEsEvent(out, es, VLC_INPUT_ES_UNSELECTED, false);
>  }
>  
> +static bool EsOutSelectMatchPrioritized( const es_out_es_props_t 
> *p_esprops,
> +                                         const es_out_id_t *es )
> +{
> +    /* If demux has specified a default track */
> +    if( p_esprops->i_demux_id >= 0 )
> +    {
> +        return ( es->fmt.i_id == p_esprops->i_demux_id );
> +    }
> +    /* Otherwise, fallback by priority */
> +    else if( p_esprops->p_main_es != NULL )
> +    {
> +        return ( es->fmt.i_priority > 
> p_esprops->p_main_es->fmt.i_priority );
> +    }
> +
> +    return false;
> +}
> +
> +static bool EsOutSelectMatchExplicitParams( const es_out_es_props_t 
> *p_esprops,
> +                                            const es_out_id_t *es )
> +{
> +    /* user designated by ID ES have higher prio than everything */
> +    if( p_esprops->str_ids )
> +    {
> +        char *saveptr, *str_ids = strdup( p_esprops->str_ids );
> +        if( str_ids )
> +        {
> +            for( const char *str_id = strtok_r( str_ids, ",", &saveptr 
> );
> +                 str_id != NULL ;
> +                 str_id = strtok_r( NULL, ",", &saveptr ) )
> +            {
> +                if( strcmp( str_id, es->id.str_id ) == 0 )
> +                {
> +                    free( str_ids );
> +                    return true;
> +                }
> +            }
> +        }
> +        free( str_ids );
> +    }
> +
> +    /* then channel index */
> +    if( p_esprops->i_channel >= 0 )
> +    {
> +        return ( es->i_channel == p_esprops->i_channel );
> +    }
> +
> +    return false;
> +}
> +
>  /**
>   * Select an ES given the current mode
>   * XXX: you need to take a the lock before (stream.stream_lock)
> @@ -2471,30 +2520,13 @@ static void EsOutSelect( es_out_t *out, 
> es_out_id_t *es, bool b_force )
>      {
>          const es_out_id_t *wanted_es = NULL;
>  
> -        if( es->p_pgrm != p_sys->p_pgrm || !p_esprops )
> +        if( es->p_pgrm != p_sys->p_pgrm )
>              return;
>  
> -        /* user designated by ID ES have higher prio than everything */
> -        if ( p_esprops->str_ids )
> -        {
> -            char *saveptr, *str_ids = strdup( p_esprops->str_ids );
> -            if( str_ids )
> -            {
> -                for( const char *str_id = strtok_r( str_ids, ",", 
> &saveptr );
> -                     str_id != NULL && wanted_es != es;
> -                     str_id = strtok_r( NULL, ",", &saveptr ) )
> -                {
> -                    if( strcmp( str_id, es->id.str_id ) == 0 )
> -                        wanted_es = es;
> -                }
> -            }
> -            free( str_ids );
> -        }
> -        /* then per pos */
> -        else if( p_esprops->i_channel >= 0 )
> +        if( wanted_es != es &&
> +            EsOutSelectMatchExplicitParams( p_esprops, es ) )
>          {
> -            if( p_esprops->i_channel == es->i_channel )
> -                wanted_es = es;
> +            wanted_es = es;
>          }
>          else if( p_esprops->ppsz_language )
>          {
> @@ -2524,18 +2556,11 @@ static void EsOutSelect( es_out_t *out, 
> es_out_id_t *es, bool b_force )
>                      /* Select if asked by demuxer */
>                      if( current_es_idx < 0 ) /* No es is currently 
> selected by lang pref */
>                      {
> -                        /* If demux has specified a track */
> -                        if( p_esprops->i_demux_id >= 0 && es->fmt.i_id 
> == p_esprops->i_demux_id )
> +                        if( b_auto_selected &&
> +                            EsOutSelectMatchPrioritized( p_esprops, es 
> ) )
>                          {
>                              wanted_es = es;
>                          }
> -                        /* Otherwise, fallback by priority */
> -                        else if( p_esprops->p_main_es == NULL ||
> -                                 es->fmt.i_priority > 
> p_esprops->p_main_es->fmt.i_priority )
> -                        {
> -                            if( b_auto_selected )
> -                                wanted_es = es;
> -                        }
>                      }
>                  }
>              }
> @@ -2543,16 +2568,11 @@ static void EsOutSelect( es_out_t *out, 
> es_out_id_t *es, bool b_force )
>          }
>          /* If there is no user preference, select the default subtitle
>           * or adapt by ES priority */
> -        else if( p_esprops->i_demux_id >= 0 && es->fmt.i_id == 
> p_esprops->i_demux_id )
> +        else if( b_auto_selected &&
> +                 EsOutSelectMatchPrioritized( p_esprops, es ) )
>          {
>              wanted_es = es;
>          }
> -        else if( p_esprops->p_main_es == NULL ||
> -                 es->fmt.i_priority > 
> p_esprops->p_main_es->fmt.i_priority )
> -        {
> -            if( b_auto_selected )
> -                wanted_es = es;
> -        }
>  
>          if( wanted_es == es && !EsIsSelected( es ) )
>          {
> -- 
> 2.25.4
> 
> _______________________________________________
> 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