summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cfg-common.h4
-rw-r--r--libmpdemux/demux_ts.c2
-rw-r--r--libmpdemux/demuxer.c28
-rw-r--r--libmpdemux/demuxer.h6
-rw-r--r--mplayer.c2
-rw-r--r--options.h4
-rw-r--r--stream/stream_dvd.c23
-rw-r--r--stream/stream_dvd.h4
-rw-r--r--stream/stream_dvdnav.c16
-rw-r--r--stream/stream_dvdnav.h4
-rw-r--r--sub/vobsub.c10
-rw-r--r--sub/vobsub.h2
12 files changed, 45 insertions, 60 deletions
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;i<d->nr_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;i<d->nr_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 */