[vlc-devel] [PATCH] Fix track selection according to user preference.
Denis Charmet
typx at dinauz.org
Sat Jul 13 17:12:40 CEST 2013
Fix #6375 and may benefit to #8936
---
src/input/es_out.c | 109 ++++++++++++++++++++++++++++++++--------------------
1 file changed, 68 insertions(+), 41 deletions(-)
diff --git a/src/input/es_out.c b/src/input/es_out.c
index c566287..d2f9803 100644
--- a/src/input/es_out.c
+++ b/src/input/es_out.c
@@ -1756,28 +1756,37 @@ static void EsOutSelect( es_out_t *out, es_out_id_t *es, bool b_force )
if( i_cat == AUDIO_ES )
{
- int idx1 = LanguageArrayIndex( p_sys->ppsz_audio_language,
- es->psz_language_code );
-
- if( p_sys->p_es_audio &&
- p_sys->p_es_audio->fmt.i_priority >= es->fmt.i_priority )
+ if( p_sys->ppsz_audio_language )
{
- int idx2 = LanguageArrayIndex( p_sys->ppsz_audio_language,
+ int idx1 = LanguageArrayIndex( p_sys->ppsz_audio_language,
+ es->psz_language_code );
+ if( !p_sys->p_es_audio )
+ {
+ /* Only select the language if it's in the list */
+ if( idx1 >= 0 )
+ i_wanted = es->i_channel;
+ }
+ else
+ {
+ int idx2 = LanguageArrayIndex( p_sys->ppsz_audio_language,
p_sys->p_es_audio->psz_language_code );
-
- if( idx1 < 0 || ( idx2 >= 0 && idx2 <= idx1 ) )
- return;
- i_wanted = es->i_channel;
+ if( idx1 >= 0 )
+ {
+ if( idx1 < idx2 )
+ i_wanted = es->i_channel;
+ else if( idx1 == idx2 &&
+ p_sys->p_es_audio->fmt.i_priority < es->fmt.i_priority )
+ i_wanted = es->i_channel;
+ }
+ }
}
else
{
- /* Select audio if (no audio selected yet)
- * - no audio-language
- * - no audio code for the ES
- * - audio code in the requested list */
- if( idx1 >= 0 ||
- !strcmp( es->psz_language_code, "??" ) ||
- !p_sys->ppsz_audio_language )
+ /* no list select the first one */
+ if( !p_sys->p_es_audio )
+ i_wanted = es->i_channel;
+ /* Select the most prioritary */
+ else if( p_sys->p_es_audio->fmt.i_priority < es->fmt.i_priority )
i_wanted = es->i_channel;
}
@@ -1794,34 +1803,52 @@ static void EsOutSelect( es_out_t *out, es_out_id_t *es, bool b_force )
}
else if( i_cat == SPU_ES )
{
- int idx1 = LanguageArrayIndex( p_sys->ppsz_sub_language,
- es->psz_language_code );
-
- if( p_sys->p_es_sub &&
- p_sys->p_es_sub->fmt.i_priority >= es->fmt.i_priority )
+ if( p_sys->ppsz_sub_language )
{
- int idx2 = LanguageArrayIndex( p_sys->ppsz_sub_language,
+ int idx1 = LanguageArrayIndex( p_sys->ppsz_sub_language,
+ es->psz_language_code );
+ if( !p_sys->p_es_sub )
+ {
+ /* Select the language if it's in the list */
+ if( idx1 >= 0 )
+ i_wanted = es->i_channel;
+ /*FIXME: Should default subtitle not in the list be
+ * displayed if not forbidden by none? */
+ else if( p_sys->i_default_sub_id >= 0 )
+ {
+ /* check if the subtitle isn't forbidden by none */
+ if( LanguageArrayIndex( p_sys->ppsz_sub_language, "none" ) < 0 )
+ {
+ if( es->i_id == p_sys->i_default_sub_id )
+ i_wanted = es->i_channel;
+ }
+ }
+ }
+ else
+ {
+ int idx2 = LanguageArrayIndex( p_sys->ppsz_sub_language,
p_sys->p_es_sub->psz_language_code );
-
- msg_Dbg( p_sys->p_input, "idx1=%d(%s) idx2=%d(%s)",
- idx1, es->psz_language_code, idx2,
- p_sys->p_es_sub->psz_language_code );
-
- if( idx1 < 0 || ( idx2 >= 0 && idx2 <= idx1 ) )
- return;
- /* We found a SPU that matches our language request */
- i_wanted = es->i_channel;
- }
- else if( idx1 >= 0 )
- {
- msg_Dbg( p_sys->p_input, "idx1=%d(%s)",
- idx1, es->psz_language_code );
-
- i_wanted = es->i_channel;
+ if( idx1 >= 0 )
+ {
+ if( idx1 < idx2 )
+ i_wanted = es->i_channel;
+ else if( idx1 == idx2 &&
+ p_sys->p_es_sub->fmt.i_priority < es->fmt.i_priority )
+ i_wanted = es->i_channel;
+ }
+ }
}
- else if( p_sys->i_default_sub_id >= 0 )
+ else
{
- if( es->i_id == p_sys->i_default_sub_id )
+ /* no list select the default one */
+ if( !p_sys->p_es_sub )
+ {
+ if( p_sys->i_default_sub_id >= 0 &&
+ es->i_id == p_sys->i_default_sub_id )
+ i_wanted = es->i_channel;
+ }
+ /* Select the most prioritary */
+ else if( p_sys->p_es_sub->fmt.i_priority < es->fmt.i_priority )
i_wanted = es->i_channel;
}
--
1.7.10.4
More information about the vlc-devel
mailing list