[vlc-devel] [PATCH 1/3] input: es_out: split es selection matching functions
Francois Cartegnie
fcvlcdev at free.fr
Thu Jun 18 10:30:17 CEST 2020
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
More information about the vlc-devel
mailing list