From 6a7e074eb98c4d45898d7f2920312db6899ee650 Mon Sep 17 00:00:00 2001 From: Anssi Hannula Date: Thu, 17 Feb 2011 17:26:34 +0200 Subject: 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 --- libavformat/mpegts.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) (limited to 'libavformat/mpegts.c') diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c index 600ef534f5..a1446d839f 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); -- cgit v1.2.3