[vlc-devel] [PATCH 3/3] input: es_out: simplify cases and cleanup fallback

Francois Cartegnie fcvlcdev at free.fr
Mon Jun 15 15:15:43 CEST 2020


---
 src/input/es_out.c | 70 +++++++++++++++++++++++-----------------------
 1 file changed, 35 insertions(+), 35 deletions(-)

diff --git a/src/input/es_out.c b/src/input/es_out.c
index 6f8daef7e3..5f08e38752 100644
--- a/src/input/es_out.c
+++ b/src/input/es_out.c
@@ -2422,6 +2422,11 @@ static bool EsOutSelectMatchPrioritized( const es_out_es_props_t *p_esprops,
     return false;
 }
 
+static bool EsOutSelectHasExplicitParams( const es_out_es_props_t *p_esprops )
+{
+    return p_esprops->str_ids || p_esprops->i_channel >= 0;
+}
+
 static bool EsOutSelectMatchExplicitParams( const es_out_es_props_t *p_esprops,
                                             const es_out_id_t *es )
 {
@@ -2505,7 +2510,7 @@ static void EsOutSelect( es_out_t *out, es_out_id_t *es, bool b_force )
                   prgm != NULL;
                   prgm = strtok_r( NULL, ",", &buf ) )
             {
-                if( atoi( prgm ) == es->p_pgrm->i_id || b_force )
+                if( atoi( prgm ) == es->p_pgrm->i_id )
                 {
                     if( !EsIsSelected( es ) )
                         EsOutSelectEs( out, es, b_force );
@@ -2522,57 +2527,52 @@ static void EsOutSelect( es_out_t *out, es_out_id_t *es, bool b_force )
         if( es->p_pgrm != p_sys->p_pgrm )
             return;
 
-        if( wanted_es != es &&
-            EsOutSelectMatchExplicitParams( p_esprops, es ) )
+        if( EsOutSelectHasExplicitParams( p_esprops ) )
         {
-            wanted_es = es;
+            b_auto_selected = false;
+            if( EsOutSelectMatchExplicitParams( p_esprops, es ) )
+            {
+                wanted_es = es;
+            }
         }
         else if( p_esprops->ppsz_language )
         {
             /* If not deactivated */
             const int i_stop_idx = LanguageArrayIndex( p_esprops->ppsz_language, "none" );
+            const int current_es_idx = ( p_esprops->p_main_es == NULL ) ? -1 :
+                                    LanguageArrayIndex( p_esprops->ppsz_language,
+                                                        p_esprops->p_main_es->psz_language_code );
+            const int es_idx = LanguageArrayIndex( p_esprops->ppsz_language,
+                                                   es->psz_language_code );
+            if( es_idx >= 0 && (i_stop_idx < 0 || i_stop_idx > es_idx) )
             {
-                int current_es_idx = ( p_esprops->p_main_es == NULL ) ? -1 :
-                        LanguageArrayIndex( p_esprops->ppsz_language,
-                                            p_esprops->p_main_es->psz_language_code );
-                int es_idx = LanguageArrayIndex( p_esprops->ppsz_language,
-                                                 es->psz_language_code );
-                if( es_idx >= 0 && (i_stop_idx < 0 || i_stop_idx > es_idx) )
+                /* Only select the language if it's in the list */
+                if( current_es_idx < 0 || /* current es was not selected by lang prefs */
+                    es_idx < current_es_idx || /* current es has lower lang prio */
+                    ( es_idx == current_es_idx && /* lang is same, but es has higher prio */
+                      p_esprops->p_main_es->fmt.i_priority < es->fmt.i_priority ) )
                 {
-                    /* Only select the language if it's in the list */
-                    if( p_esprops->p_main_es == NULL ||
-                        current_es_idx < 0 || /* current es was not selected by lang prefs */
-                        es_idx < current_es_idx || /* current es has lower lang prio */
-                        (  es_idx == current_es_idx && /* lang is same, but es has higher prio */
-                           p_esprops->p_main_es->fmt.i_priority < es->fmt.i_priority ) )
-                    {
-                        wanted_es = es;
-                    }
-                }
-                /* We did not find a language matching our prefs */
-                else if( i_stop_idx < 0 ) /* If not fallback disabled by 'none' */
-                {
-                    /* Select if asked by demuxer */
-                    if( current_es_idx < 0 ) /* No es is currently selected by lang pref */
-                    {
-                        if( b_auto_selected &&
-                            EsOutSelectMatchPrioritized( p_esprops, es ) )
-                        {
-                            wanted_es = es;
-                        }
-                    }
+                    wanted_es = es;
                 }
             }
 
+            if( wanted_es || /* We did find a language matching our prefs */
+                i_stop_idx >= 0 || /* If fallback disabled by 'none' */
+                current_es_idx >= 0 ) /* Is currently selected by lang pref */
+            {
+                b_auto_selected = false; /* do not perform other selection rules */
+            }
         }
-        /* If there is no user preference, select the default subtitle
+
+        /* If there is no user preference, select the default track
          * or adapt by ES priority */
-        else if( b_auto_selected &&
-                 EsOutSelectMatchPrioritized( p_esprops, es ) )
+        if( b_auto_selected && wanted_es == NULL &&
+            EsOutSelectMatchPrioritized( p_esprops, es ) )
         {
             wanted_es = es;
         }
 
+        /* Do ES activation/deactivation */
         if( wanted_es == es && !EsIsSelected( es ) )
         {
             if( b_auto_unselect )
-- 
2.25.4



More information about the vlc-devel mailing list