From 3c2cfee488f09bd34b1edf80219d9ea66508c669 Mon Sep 17 00:00:00 2001 From: Uoti Urpala Date: Mon, 8 Nov 2010 13:05:49 +0200 Subject: demux: improve -alang / -slang track choosing logic When -alang / -slang was specified the numerically first matching track (if any) was always chosen. This meant that specifying "-alang eng" could change the track choice even if all tracks were in English, because now the default flag of tracks was ignored. Change the logic to take the default flag into account as a secondary sorting key. The code also accepted prefix matches, so that "-slang g" would match track language "ger". I think that was not intentional. Change it to require exact matches. --- libmpdemux/demuxer.c | 87 ++++++++++++++++++++++++---------------------------- 1 file changed, 40 insertions(+), 47 deletions(-) (limited to 'libmpdemux/demuxer.c') diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c index 99f1be9fe8..32fc486e59 100644 --- a/libmpdemux/demuxer.c +++ b/libmpdemux/demuxer.c @@ -1618,61 +1618,54 @@ int demuxer_set_angle(demuxer_t *demuxer, int angle) return angle; } -int demuxer_audio_track_by_lang(demuxer_t *d, char *lang) +int demuxer_audio_track_by_lang_and_default(struct demuxer *d, char *lang) { - int i, len; - lang += strspn(lang, ","); - while ((len = strcspn(lang, ",")) > 0) { - for (i = 0; i < MAX_A_STREAMS; ++i) { - sh_audio_t *sh = d->a_streams[i]; - if (sh && sh->lang && strncmp(sh->lang, lang, len) == 0) - return sh->aid; + if (!lang) + lang = ""; + while (1) { + lang += strspn(lang, ","); + int len = strcspn(lang, ","); + int id = -1; + for (int i = 0; i < MAX_A_STREAMS; i++) { + struct sh_audio *sh = d->a_streams[i]; + if (sh && (!len || sh->lang && strlen(sh->lang) == len && + !memcmp(lang, sh->lang, len))) { + if (sh->default_track) + return sh->aid; + if (id < 0) + id = sh->aid; + } } + if (id >= 0) + return id; + if (!len) + return -1; lang += len; - lang += strspn(lang, ","); } - return -1; } -int demuxer_sub_track_by_lang(demuxer_t *d, char *lang) +int demuxer_sub_track_by_lang_and_default(struct demuxer *d, char *lang) { - int i, len; - lang += strspn(lang, ","); - while ((len = strcspn(lang, ",")) > 0) { - for (i = 0; i < MAX_S_STREAMS; ++i) { - sh_sub_t *sh = d->s_streams[i]; - if (sh && sh->lang && strncmp(sh->lang, lang, len) == 0) - return sh->sid; + if (!lang) + lang = ""; + while (1) { + lang += strspn(lang, ","); + int len = strcspn(lang, ","); + int id = -1; + for (int i = 0; i < MAX_A_STREAMS; i++) { + struct sh_audio *sh = d->a_streams[i]; + if (sh && (!len || sh->lang && strlen(sh->lang) == len && + !memcmp(lang, sh->lang, len))) { + if (sh->default_track) + return sh->aid; + if (id < 0) + id = sh->aid; + } } + if (!len) + return -1; + if (id >= 0) + return id; lang += len; - lang += strspn(lang, ","); - } - return -1; -} - -int demuxer_default_audio_track(demuxer_t *d) -{ - int i; - for (i = 0; i < MAX_A_STREAMS; ++i) { - sh_audio_t *sh = d->a_streams[i]; - if (sh && sh->default_track) - return sh->aid; - } - for (i = 0; i < MAX_A_STREAMS; ++i) { - sh_audio_t *sh = d->a_streams[i]; - if (sh) - return sh->aid; } - return -1; -} - -int demuxer_default_sub_track(demuxer_t *d) -{ - int i; - for (i = 0; i < MAX_S_STREAMS; ++i) { - sh_sub_t *sh = d->s_streams[i]; - if (sh && sh->default_track) - return sh->sid; - } - return -1; } -- cgit v1.2.3