[vlc-commits] Fix track selection according to user preference.
Denis Charmet
git at videolan.org
Tue Jul 16 22:16:37 CEST 2013
vlc | branch: master | Denis Charmet <typx at dinauz.org> | Fri Jul 12 02:03:33 2013 +0200| [78e6b2bc6bb39eb49317cede9b1e7bda1e096c2d] | committer: Denis Charmet
Fix track selection according to user preference.
Fix #6375 and may benefit to #8936
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=78e6b2bc6bb39eb49317cede9b1e7bda1e096c2d
---
src/input/es_out.c | 102 ++++++++++++++++++++++++++++++----------------------
1 file changed, 59 insertions(+), 43 deletions(-)
diff --git a/src/input/es_out.c b/src/input/es_out.c
index c566287..6b0e9ad 100644
--- a/src/input/es_out.c
+++ b/src/input/es_out.c
@@ -1756,28 +1756,34 @@ 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,
- p_sys->p_es_audio->psz_language_code );
-
- if( idx1 < 0 || ( idx2 >= 0 && idx2 <= idx1 ) )
- return;
- i_wanted = es->i_channel;
+ int es_idx = 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( es_idx >= 0 )
+ i_wanted = es->i_channel;
+ }
+ else
+ {
+ int selected_es_idx =
+ LanguageArrayIndex( p_sys->ppsz_audio_language,
+ p_sys->p_es_audio->psz_language_code );
+ if( es_idx >= 0 &&
+ ( es_idx < selected_es_idx ||
+ ( es_idx == selected_es_idx &&
+ 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 )
+ /* Select the first one if there is no selected audio yet
+ * then choose by ES priority */
+ if( !p_sys->p_es_audio ||
+ p_sys->p_es_audio->fmt.i_priority < es->fmt.i_priority )
i_wanted = es->i_channel;
}
@@ -1794,34 +1800,44 @@ 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 )
- {
- 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 )
+ if( p_sys->ppsz_sub_language )
{
- msg_Dbg( p_sys->p_input, "idx1=%d(%s)",
- idx1, es->psz_language_code );
-
- i_wanted = es->i_channel;
+ int es_idx = 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( es_idx >= 0 ||
+ /*FIXME: Should default subtitle not in the list be
+ * displayed if not forbidden by none? */
+ ( p_sys->i_default_sub_id >= 0 &&
+ /* check if the subtitle isn't forbidden by none */
+ LanguageArrayIndex( p_sys->ppsz_sub_language, "none" ) < 0 &&
+ es->i_id == p_sys->i_default_sub_id ) )
+ i_wanted = es->i_channel;
+ }
+ else
+ {
+ int selected_es_idx =
+ LanguageArrayIndex( p_sys->ppsz_sub_language,
+ p_sys->p_es_sub->psz_language_code );
+
+ if( es_idx >= 0 &&
+ ( es_idx < selected_es_idx ||
+ ( es_idx == selected_es_idx &&
+ 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 )
+ /* If there is no user preference, select the default subtitle
+ * or adapt by ES priority */
+ if( ( !p_sys->p_es_sub &&
+ ( p_sys->i_default_sub_id >= 0 &&
+ es->i_id == p_sys->i_default_sub_id ) ) ||
+ ( p_sys->p_es_sub &&
+ p_sys->p_es_sub->fmt.i_priority < es->fmt.i_priority ) )
i_wanted = es->i_channel;
}
More information about the vlc-commits
mailing list