diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c index 02bde7c4bef987ef0fe1aeec5cbeb6d9c9a21463..11a840f8e4be749150cc30e5b01bb93a5989b35c 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: