diff options
author | Anssi Hannula <anssi.hannula@iki.fi> | 2011-02-17 17:26:35 +0200 |
---|---|---|
committer | Ronald S. Bultje <rsbultje@gmail.com> | 2011-03-07 14:43:03 -0500 |
commit | 435cebd01560691e9322bdb0aa5af5b2bc76c3f8 (patch) | |
tree | 1056bebe6a49a3d96db3509f6a8b2518d2b003e9 /libavformat/mpegtsenc.c | |
parent | 89e568feeca69b1e4b975d0b26aeafbe72fd5418 (diff) | |
download | ffmpeg-435cebd01560691e9322bdb0aa5af5b2bc76c3f8.tar.gz |
mpegtsenc: handle multiple language tags per stream
Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com>
Diffstat (limited to 'libavformat/mpegtsenc.c')
-rw-r--r-- | libavformat/mpegtsenc.c | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c index 02bde7c4be..11a840f8e4 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: |