1
0
mirror of https://github.com/mpv-player/mpv synced 2025-03-20 10:17:31 +00:00

options: change -alang and -slang to use string list type

There is no reason to use manual language list splitting when an
automatic split function is already available.

Some types change from "unsigned char" to "char", but this shouldn't
cause issues since [as]lang settings are unlikely to have characters
above 127.
This commit is contained in:
Clément Bœsch 2011-02-18 15:32:40 +01:00 committed by Uoti Urpala
parent 2a7c5a1365
commit 59fff90d94
12 changed files with 45 additions and 60 deletions

View File

@ -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),

View File

@ -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

View File

@ -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;
}
}

View File

@ -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 */

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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 */

View File

@ -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;
}

View File

@ -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);

View File

@ -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;
}

View File

@ -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 */