[FFmpeg-devel] [PATCH 2/2] mpegtsenc: handle multiple language tags per stream
Anssi Hannula
anssi.hannula
Thu Feb 17 16:26:35 CET 2011
---
libavformat/mpegtsenc.c | 28 +++++++++++++++++++++++-----
1 files changed, 23 insertions(+), 5 deletions(-)
diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c
index 89b88d7..4e4c42d 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:
--
1.7.3
More information about the ffmpeg-devel
mailing list