diff --git a/cfg-common.h b/cfg-common.h index e56d87b3de..6e74eb66cc 100644 --- a/cfg-common.h +++ b/cfg-common.h @@ -506,8 +506,8 @@ const m_option_t common_opts[] = { OPT_FLAG_CONSTANTS("novideo", video_id, 0, -1, -2), OPT_FLAG_CONSTANTS("sound", audio_id, 0, -2, -1), OPT_FLAG_CONSTANTS("nosound", audio_id, 0, -1, -2), - OPT_STRING("alang", audio_lang, 0), - OPT_STRING("slang", sub_lang, 0), + OPT_STRINGLIST("alang", audio_lang, 0), + OPT_STRINGLIST("slang", sub_lang, 0), OPT_MAKE_FLAGS("hr-mp3-seek", hr_mp3_seek, 0), diff --git a/libmpdemux/demux_ts.c b/libmpdemux/demux_ts.c index 237a524bd4..0085f286e0 100644 --- a/libmpdemux/demux_ts.c +++ b/libmpdemux/demux_ts.c @@ -1029,7 +1029,7 @@ static demuxer_t *demux_open_ts(demuxer_t * demuxer) if(demuxer->opts->audio_lang != NULL) { - strncpy(params.alang, demuxer->opts->audio_lang, 3); + strncpy(params.alang, demuxer->opts->audio_lang[0], 3); params.alang[3] = 0; } else diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c index 9efcf91862..a4cee9b8ea 100644 --- a/libmpdemux/demuxer.c +++ b/libmpdemux/demuxer.c @@ -1561,18 +1561,15 @@ int demuxer_set_angle(demuxer_t *demuxer, int angle) return angle; } -int demuxer_audio_track_by_lang_and_default(struct demuxer *d, char *lang) +int demuxer_audio_track_by_lang_and_default(struct demuxer *d, char **langt) { - if (!lang) - lang = ""; + int n = 0; while (1) { - lang += strspn(lang, ","); - int len = strcspn(lang, ","); + char *lang = langt ? langt[n++] : NULL; 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 && (!lang || sh->lang && !strcmp(lang, sh->lang))) { if (sh->default_track) return sh->aid; if (id < 0) @@ -1581,34 +1578,29 @@ int demuxer_audio_track_by_lang_and_default(struct demuxer *d, char *lang) } if (id >= 0) return id; - if (!len) + if (!lang) return -1; - lang += len; } } -int demuxer_sub_track_by_lang_and_default(struct demuxer *d, char *lang) +int demuxer_sub_track_by_lang_and_default(struct demuxer *d, char **langt) { - if (!lang) - lang = ""; + int n = 0; while (1) { - lang += strspn(lang, ","); - int len = strcspn(lang, ","); + char *lang = langt ? langt[n++] : NULL; int id = -1; for (int i = 0; i < MAX_S_STREAMS; i++) { struct sh_sub *sh = d->s_streams[i]; - if (sh && (!len || sh->lang && strlen(sh->lang) == len && - !memcmp(lang, sh->lang, len))) { + if (sh && (!lang || sh->lang && !strcmp(lang, sh->lang))) { if (sh->default_track) return sh->sid; if (id < 0) id = sh->sid; } } - if (!len) + if (!lang) return -1; if (id >= 0) return id; - lang += len; } } diff --git a/libmpdemux/demuxer.h b/libmpdemux/demuxer.h index 4a8a7545d1..ed2d651a8c 100644 --- a/libmpdemux/demuxer.h +++ b/libmpdemux/demuxer.h @@ -421,7 +421,7 @@ int demuxer_set_angle(struct demuxer *demuxer, int angle); int demuxer_angles_count(struct demuxer *demuxer); /* Get the index of a track. - * lang is a comma-separated list, NULL is same as empty list + * lang is a string list, NULL is same as empty list * Sort tracks based on the following criteria: * 1) earlier match in lang list, or last no match * 2) track is marked default (default wins) @@ -431,7 +431,7 @@ int demuxer_angles_count(struct demuxer *demuxer); * For subs, select best track according to the same criteria, but return -1 * if all tracks are no-lang-match, not-default. */ -int demuxer_audio_track_by_lang_and_default(struct demuxer *d, char *lang); -int demuxer_sub_track_by_lang_and_default(struct demuxer *d, char *lang); +int demuxer_audio_track_by_lang_and_default(struct demuxer *d, char **langt); +int demuxer_sub_track_by_lang_and_default(struct demuxer *d, char **langt); #endif /* MPLAYER_DEMUXER_H */ diff --git a/mplayer.c b/mplayer.c index 9ffd4a0bec..f0a343140c 100644 --- a/mplayer.c +++ b/mplayer.c @@ -3665,7 +3665,7 @@ static bool attachment_is_font(struct demux_attachment *att) return false; } -static int select_audio(demuxer_t *demuxer, int audio_id, char *audio_lang) +static int select_audio(demuxer_t *demuxer, int audio_id, char **audio_lang) { if (audio_id == -1) audio_id = demuxer_audio_track_by_lang_and_default(demuxer, audio_lang); diff --git a/options.h b/options.h index 0fb0a7d809..ed3dbdc926 100644 --- a/options.h +++ b/options.h @@ -64,8 +64,8 @@ typedef struct MPOpts { int audio_id; int video_id; int sub_id; - char *audio_lang; - char *sub_lang; + char **audio_lang; + char **sub_lang; int hr_mp3_seek; char *audio_stream; diff --git a/stream/stream_dvd.c b/stream/stream_dvd.c index a302da81f1..f257ab78bd 100644 --- a/stream/stream_dvd.c +++ b/stream/stream_dvd.c @@ -125,24 +125,21 @@ int dvd_lang_from_aid(stream_t *stream, int id) { return 0; } -int dvd_aid_from_lang(stream_t *stream, const unsigned char* lang) { +int dvd_aid_from_lang(stream_t *stream, char **lang) { dvd_priv_t *d=stream->priv; int code,i; - if(lang) { - while(strlen(lang)>=2) { - code=lang[1]|(lang[0]<<8); + for (int n = 0; lang[n]; n++) { + code = lang[n][1] | (lang[n][0] << 8); for(i=0;inr_of_channels;i++) { if(d->audio_streams[i].language==code) { mp_tmsg(MSGT_OPEN,MSGL_INFO,"Selected DVD audio channel: %d language: %c%c\n", - d->audio_streams[i].id, lang[0],lang[1]); + d->audio_streams[i].id, lang[n][0], lang[n][1]); return d->audio_streams[i].id; } //printf("%X != %X (%c%c)\n",code,d->audio_streams[i].language,lang[0],lang[1]); } - lang+=2; while (lang[0]==',' || lang[0]==' ') ++lang; - } - mp_tmsg(MSGT_OPEN,MSGL_WARN,"No matching DVD audio language found!\n"); } + mp_tmsg(MSGT_OPEN,MSGL_WARN,"No matching DVD audio language found!\n"); return -1; } @@ -169,19 +166,17 @@ int dvd_lang_from_sid(stream_t *stream, int id) { return 0; } -int dvd_sid_from_lang(stream_t *stream, const unsigned char* lang) { +int dvd_sid_from_lang(stream_t *stream, char **lang) { dvd_priv_t *d=stream->priv; int code,i; - while(lang && strlen(lang)>=2) { - code=lang[1]|(lang[0]<<8); + for (int n = 0; lang[n]; n++) { + code = lang[n][1] | (lang[n][0] << 8); for(i=0;inr_of_subtitles;i++) { if(d->subtitles[i].language==code) { - mp_tmsg(MSGT_OPEN,MSGL_INFO,"Selected DVD subtitle channel: %d language: %c%c\n", i, lang[0],lang[1]); + mp_tmsg(MSGT_OPEN,MSGL_INFO,"Selected DVD subtitle channel: %d language: %c%c\n", i, lang[n][0], lang[n][1]); return d->subtitles[i].id; } } - lang+=2; - while (lang[0]==',' || lang[0]==' ') ++lang; } mp_tmsg(MSGT_OPEN,MSGL_WARN,"No matching DVD subtitle language found!\n"); return -1; diff --git a/stream/stream_dvd.h b/stream/stream_dvd.h index f0f0b5d08f..fe52d4399a 100644 --- a/stream/stream_dvd.h +++ b/stream/stream_dvd.h @@ -59,8 +59,8 @@ typedef struct { int dvd_number_of_subs(stream_t *stream); int dvd_lang_from_aid(stream_t *stream, int id); int dvd_lang_from_sid(stream_t *stream, int id); -int dvd_aid_from_lang(stream_t *stream, const unsigned char* lang); -int dvd_sid_from_lang(stream_t *stream, const unsigned char* lang); +int dvd_aid_from_lang(stream_t *stream, char **lang); +int dvd_sid_from_lang(stream_t *stream, char **lang); int dvd_chapter_from_cell(dvd_priv_t *dvd,int title,int cell); #endif /* MPLAYER_STREAM_DVD_H */ diff --git a/stream/stream_dvdnav.c b/stream/stream_dvdnav.c index 21522f8b6b..b1c51e68e9 100644 --- a/stream/stream_dvdnav.c +++ b/stream/stream_dvdnav.c @@ -733,14 +733,14 @@ static int mp_dvdnav_get_aid_from_format (stream_t *stream, int index, uint8_t l * \param lang: 2-characters language code[s], eventually separated by spaces of commas * \return -1 on error, current subtitle id if successful */ -int mp_dvdnav_aid_from_lang(stream_t *stream, const unsigned char *language) { +int mp_dvdnav_aid_from_lang(stream_t *stream, char **language) { dvdnav_priv_t * priv = stream->priv; int k; uint8_t lg; uint16_t lang, lcode; - while(language && strlen(language)>=2) { - lcode = (language[0] << 8) | (language[1]); + for (int i = 0; language[i]; i++) { + lcode = (language[i][0] << 8) | (language[i][1]); for(k=0; k<32; k++) { lg = dvdnav_get_audio_logical_stream(priv->dvdnav, k); if(lg == 0xff) continue; @@ -748,8 +748,6 @@ int mp_dvdnav_aid_from_lang(stream_t *stream, const unsigned char *language) { if(lang != 0xFFFF && lang == lcode) return mp_dvdnav_get_aid_from_format (stream, k, lg); } - language += 2; - while(language[0]==',' || language[0]==' ') ++language; } return -1; } @@ -785,13 +783,13 @@ int mp_dvdnav_lang_from_aid(stream_t *stream, int aid, unsigned char *buf) { * \param lang: 2-characters language code[s], eventually separated by spaces of commas * \return -1 on error, current subtitle id if successful */ -int mp_dvdnav_sid_from_lang(stream_t *stream, const unsigned char *language) { +int mp_dvdnav_sid_from_lang(stream_t *stream, char **language) { dvdnav_priv_t * priv = stream->priv; uint8_t lg, k; uint16_t lang, lcode; - while(language && strlen(language)>=2) { - lcode = (language[0] << 8) | (language[1]); + for (int i = 0; language[i]; i++) { + lcode = (language[i][0] << 8) | (language[i][1]); for(k=0; k<32; k++) { lg = dvdnav_get_spu_logical_stream(priv->dvdnav, k); if(lg == 0xff) continue; @@ -800,8 +798,6 @@ int mp_dvdnav_sid_from_lang(stream_t *stream, const unsigned char *language) { return lg; } } - language += 2; - while(language[0]==',' || language[0]==' ') ++language; } return -1; } diff --git a/stream/stream_dvdnav.h b/stream/stream_dvdnav.h index 97c2cb6d71..ae58367320 100644 --- a/stream/stream_dvdnav.h +++ b/stream/stream_dvdnav.h @@ -30,9 +30,9 @@ typedef struct { int mp_dvdnav_number_of_subs(stream_t *stream); int mp_dvdnav_aid_from_audio_num(stream_t *stream, int audio_num); -int mp_dvdnav_aid_from_lang(stream_t *stream, const unsigned char *language); +int mp_dvdnav_aid_from_lang(stream_t *stream, char **language); int mp_dvdnav_lang_from_aid(stream_t *stream, int id, unsigned char *buf); -int mp_dvdnav_sid_from_lang(stream_t *stream, const unsigned char *language); +int mp_dvdnav_sid_from_lang(stream_t *stream, char **language); int mp_dvdnav_lang_from_sid(stream_t *stream, int sid, unsigned char *buf); void mp_dvdnav_handle_input(stream_t *stream, int cmd, int *button); void mp_dvdnav_update_mouse_pos(stream_t *stream, int32_t x, int32_t y, int* button); diff --git a/sub/vobsub.c b/sub/vobsub.c index 08efa3acec..a2fc94fb17 100644 --- a/sub/vobsub.c +++ b/sub/vobsub.c @@ -1109,20 +1109,22 @@ int vobsub_get_index_by_id(void *vobhandle, int id) return j; } -int vobsub_set_from_lang(void *vobhandle, unsigned char * lang) +int vobsub_set_from_lang(void *vobhandle, char **lang) { int i; vobsub_t *vob= vobhandle; - while (lang && strlen(lang) >= 2) { + if (!lang) + goto end; + for (int n = 0; lang[n]; n++) { for (i = 0; i < vob->spu_streams_size; i++) if (vob->spu_streams[i].id) - if ((strncmp(vob->spu_streams[i].id, lang, 2) == 0)) { + if ((strncmp(vob->spu_streams[i].id, lang[n], 2) == 0)) { vobsub_id = i; mp_msg(MSGT_VOBSUB, MSGL_INFO, "Selected VOBSUB language: %d language: %s\n", i, vob->spu_streams[i].id); return 0; } - lang+=2;while (lang[0]==',' || lang[0]==' ') ++lang; } +end: mp_msg(MSGT_VOBSUB, MSGL_WARN, "No matching VOBSUB language found!\n"); return -1; } diff --git a/sub/vobsub.h b/sub/vobsub.h index b076e4b6bc..3cef1347e5 100644 --- a/sub/vobsub.h +++ b/sub/vobsub.h @@ -41,7 +41,7 @@ unsigned int vobsub_rgb_to_yuv(unsigned int rgb); void *vobsub_out_open(const char *basename, const unsigned int *palette, unsigned int orig_width, unsigned int orig_height, const char *id, unsigned int index); void vobsub_out_output(void *me, const unsigned char *packet, int len, double pts); void vobsub_out_close(void *me); -int vobsub_set_from_lang(void *vobhandle, unsigned char * lang); +int vobsub_set_from_lang(void *vobhandle, char **lang); void vobsub_seek(void * vobhandle, float pts); #endif /* MPLAYER_VOBSUB_H */