[FFmpeg-cvslog] mpegtsenc: handle multiple language tags per stream

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:35 2011 +0200| [70b5906315c2b1f85272d3c529d695371b8fda0c] | committer: Michael Niedermayer

mpegtsenc: handle multiple language tags per stream

Signed-off-by: Ronald S. Bultje <rsbultje at gmail.com>
(cherry picked from commit 435cebd01560691e9322bdb0aa5af5b2bc76c3f8)

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

 libavformat/mpegtsenc.c |   28 +++++++++++++++++++++++-----
 1 files changed, 23 insertions(+), 5 deletions(-)

diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c
index 02bde7c..11a840f 100644
--- a/libavformat/mpegtsenc.c
+++ b/libavformat/mpegtsenc.c
@@ -283,12 +283,24 @@ static void mpegts_write_pmt(AVFormatContext *s, MpegTSService *service)
         /* write optional descriptors here */
         switch(st->codec->codec_type) {
         case AVMEDIA_TYPE_AUDIO:
-            if (lang && strlen(lang->value) == 3) {
+            if (lang) {
+                char *p;
+                char *next = lang->value;
+                uint8_t *len_ptr;
+
                 *q++ = 0x0a; /* ISO 639 language descriptor */
-                *q++ = 4;
-                *q++ = lang->value[0];
-                *q++ = lang->value[1];
-                *q++ = lang->value[2];
+                len_ptr = q++;
+                *len_ptr = 0;
+
+                for (p = lang->value; next && *len_ptr < 255 / 4 * 4; p = next + 1) {
+                    next = strchr(p, ',');
+                    if (strlen(p) != 3 && (!next || next != p + 3))
+                        continue; /* not a 3-letter code */
+
+                    *q++ = *p++;
+                    *q++ = *p++;
+                    *q++ = *p++;
+
                 if (st->disposition & AV_DISPOSITION_CLEAN_EFFECTS)
                     *q++ = 0x01;
                 else if (st->disposition & AV_DISPOSITION_HEARING_IMPAIRED)
@@ -297,6 +309,12 @@ static void mpegts_write_pmt(AVFormatContext *s, MpegTSService *service)
                     *q++ = 0x03;
                 else
                     *q++ = 0; /* undefined type */
+
+                    *len_ptr += 4;
+                }
+
+                if (*len_ptr == 0)
+                    q -= 2; /* no language codes were written */
             }
             break;
         case AVMEDIA_TYPE_SUBTITLE:




More information about the ffmpeg-cvslog mailing list