aboutsummaryrefslogtreecommitdiffstats
path: root/libavformat
diff options
context:
space:
mode:
authorAnssi Hannula <anssi.hannula@iki.fi>2011-02-17 17:26:34 +0200
committerMichael Niedermayer <michaelni@gmx.at>2011-03-08 02:09:45 +0100
commitb543e1dccf66804bab2e03d70ebb4b25b324a511 (patch)
treed7b21e5b9ca0ffd64d258280a328543467761c0a /libavformat
parentaa612fbb99f6246913a789afde5a26f70c5a9159 (diff)
downloadffmpeg-b543e1dccf66804bab2e03d70ebb4b25b324a511.tar.gz
mpegts: add all stream languages into metadata
This is used at least on some older DVB broadcasts for dual-mono audio tracks. Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com> (cherry picked from commit 6a7e074eb98c4d45898d7f2920312db6899ee650)
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/mpegts.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
index 3859068c94..2fed3cb34a 100644
--- a/libavformat/mpegts.c
+++ b/libavformat/mpegts.c
@@ -891,7 +891,8 @@ int ff_parse_mpeg2_descriptor(AVFormatContext *fc, AVStream *st, int stream_type
{
const uint8_t *desc_end;
int desc_len, desc_tag;
- char language[4];
+ char language[252];
+ int i;
desc_tag = get8(pp, desc_list_end);
if (desc_tag < 0)
@@ -960,16 +961,21 @@ int ff_parse_mpeg2_descriptor(AVFormatContext *fc, AVStream *st, int stream_type
av_metadata_set2(&st->metadata, "language", language, 0);
break;
case 0x0a: /* ISO 639 language descriptor */
- language[0] = get8(pp, desc_end);
- language[1] = get8(pp, desc_end);
- language[2] = get8(pp, desc_end);
- language[3] = 0;
- av_metadata_set2(&st->metadata, "language", language, 0);
+ for (i = 0; i + 4 <= desc_len; i += 4) {
+ language[i + 0] = get8(pp, desc_end);
+ language[i + 1] = get8(pp, desc_end);
+ language[i + 2] = get8(pp, desc_end);
+ language[i + 3] = ',';
switch (get8(pp, desc_end)) {
case 0x01: st->disposition |= AV_DISPOSITION_CLEAN_EFFECTS; break;
case 0x02: st->disposition |= AV_DISPOSITION_HEARING_IMPAIRED; break;
case 0x03: st->disposition |= AV_DISPOSITION_VISUAL_IMPAIRED; break;
}
+ }
+ if (i) {
+ language[i - 1] = 0;
+ av_metadata_set2(&st->metadata, "language", language, 0);
+ }
break;
case 0x05: /* registration descriptor */
st->codec->codec_tag = bytestream_get_le32(pp);