[FFmpeg-cvslog] mpegts: add all stream languages into metadata

Anssi Hannula git
Tue Mar 8 02:43:30 CET 2011


ffmpeg | branch: master | Anssi Hannula <anssi.hannula at iki.fi> | Thu Feb 17 17:26:34 2011 +0200| [b543e1dccf66804bab2e03d70ebb4b25b324a511] | committer: Michael Niedermayer

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 at gmail.com>
(cherry picked from commit 6a7e074eb98c4d45898d7f2920312db6899ee650)

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=b543e1dccf66804bab2e03d70ebb4b25b324a511
---

 libavformat/mpegts.c |   18 ++++++++++++------
 1 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
index 3859068..2fed3cb 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);




More information about the ffmpeg-cvslog mailing list