Mercurial > mplayer.hg
changeset 13502:05f846322437
show ogg subtitle language on OSD, if available
author | joey |
---|---|
date | Tue, 28 Sep 2004 14:00:49 +0000 |
parents | a5004eb92a79 |
children | f8347c521898 |
files | libmpdemux/demux_ogg.c libmpdemux/demuxer.h mplayer.c |
diffstat | 3 files changed, 47 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/libmpdemux/demux_ogg.c Tue Sep 28 13:51:20 2004 +0000 +++ b/libmpdemux/demux_ogg.c Tue Sep 28 14:00:49 2004 +0000 @@ -132,6 +132,7 @@ /* Used for subtitle switching. */ int n_text; int *text_ids; + char **text_langs; } ogg_demuxer_t; #define NUM_VORBIS_HDR_PACKETS 3 @@ -429,6 +430,8 @@ { char *hdr, *val; char **cmt = vc->user_comments; + int index; + ogg_demuxer_t *ogg_d = (ogg_demuxer_t *)d->priv; while(*cmt) { @@ -441,6 +444,13 @@ else if (!strncasecmp(*cmt, "LANGUAGE=", 9)) { val = *cmt + 9; + // copy this language name into the array + index = demux_ogg_sub_reverse_id(d, id); + if (index >= 0) { + // in case of malicious files with more than one lang per track: + if (ogg_d->text_langs[index]) free(ogg_d->text_langs[index]); + ogg_d->text_langs[index] = strdup(val); + } // check for -slang if subs are uninitialized yet if (os->text && d->sub->id == -1 && demux_ogg_check_lang(val, dvdsub_lang)) { @@ -685,6 +695,27 @@ return (index < 0) ? index : (index >= ogg_d->n_text) ? -1 : ogg_d->text_ids[index]; } +/** \brief Translate the ogg track number into the subtitle number. + * \param demuxer The demuxer about whose subtitles we are inquiring. + * \param id The ogg track number of the subtitle track. + */ +static int demux_ogg_sub_reverse_id(demuxer_t *demuxer, int id) { + ogg_demuxer_t *ogg_d = (ogg_demuxer_t *)demuxer->priv; + int i; + for (i = 0; i < ogg_d->n_text; i++) + if (ogg_d->text_ids[i] == id) return i; + return -1; +} + +/** \brief Lookup the subtitle language by the subtitle number. Returns NULL on out-of-bounds input. + * \param demuxer The demuxer about whose subtitles we are inquiring. + * \param index The subtitle number. + */ +char *demux_ogg_sub_lang(demuxer_t *demuxer, int index) { + ogg_demuxer_t *ogg_d = (ogg_demuxer_t *)demuxer->priv; + return (index < 0) ? NULL : (index >= ogg_d->n_text) ? NULL : ogg_d->text_langs[index]; +} + /// Open an ogg physical stream int demux_ogg_open(demuxer_t* demuxer) { ogg_demuxer_t* ogg_d; @@ -934,6 +965,8 @@ ogg_d->n_text++; ogg_d->text_ids = (int *)realloc(ogg_d->text_ids, sizeof(int) * ogg_d->n_text); ogg_d->text_ids[ogg_d->n_text - 1] = ogg_d->num_sub; + ogg_d->text_langs = (char **)realloc(ogg_d->text_langs, sizeof(char *) * ogg_d->n_text); + ogg_d->text_langs[ogg_d->n_text - 1] = NULL; demux_ogg_init_sub(); //// Unknown header type } else @@ -1382,6 +1415,7 @@ void demux_close_ogg(demuxer_t* demuxer) { ogg_demuxer_t* ogg_d = demuxer->priv; + int i; if(!ogg_d) return; @@ -1396,6 +1430,11 @@ free(ogg_d->syncpoints); if (ogg_d->text_ids) free(ogg_d->text_ids); + if (ogg_d->text_langs) { + for (i = 0; i < ogg_d->n_text; i++) + if (ogg_d->text_langs[i]) free(ogg_d->text_langs[i]); + free(ogg_d->text_langs); + } free(ogg_d); }
--- a/libmpdemux/demuxer.h Tue Sep 28 13:51:20 2004 +0000 +++ b/libmpdemux/demuxer.h Tue Sep 28 14:00:49 2004 +0000 @@ -282,6 +282,7 @@ /* Found in demux_ogg.c */ int demux_ogg_num_subs(demuxer_t *demuxer); int demux_ogg_sub_id(demuxer_t *demuxer, int index); +char *demux_ogg_sub_lang(demuxer_t *demuxer, int index); #endif #endif
--- a/mplayer.c Tue Sep 28 13:51:20 2004 +0000 +++ b/mplayer.c Tue Sep 28 14:00:49 2004 +0000 @@ -3719,12 +3719,17 @@ language = vobsub_get_id(vo_vobsub, (unsigned int) vobsub_id); snprintf(osd_text_tmp, 63, "Subtitles: (%d) %s", vobsub_id, language ? language : "unknown"); } +#ifdef HAVE_OGGVORBIS if (d_dvdsub && demuxer->type == DEMUXER_TYPE_OGG) { if (dvdsub_id < 0) snprintf(osd_text_tmp, 63, "Subtitles: (off)"); - else - snprintf(osd_text_tmp, 63, "Subtitles: (%d)", dvdsub_id); + else { + char *lang = demux_ogg_sub_lang(demuxer, dvdsub_id); + if (!lang) lang = "unknown"; + snprintf(osd_text_tmp, 63, "Subtitles: (%d) %s", dvdsub_id, lang); + } } +#endif #ifdef USE_DVDREAD if (vo_spudec && (demuxer->type != DEMUXER_TYPE_MATROSKA)) { char lang[5] = "none";