|
|
@@ -226,7 +226,7 @@ static void mpegts_write_pmt(AVFormatContext *s, MpegTSService *service) |
|
|
|
{ |
|
|
|
MpegTSWrite *ts = s->priv_data; |
|
|
|
uint8_t data[SECTION_LENGTH], *q, *desc_length_ptr, *program_info_length_ptr; |
|
|
|
int val, stream_type, i; |
|
|
|
int val, stream_type, i, err = 0; |
|
|
|
|
|
|
|
q = data; |
|
|
|
put16(&q, 0xe000 | service->pcr_pid); |
|
|
@@ -244,6 +244,11 @@ static void mpegts_write_pmt(AVFormatContext *s, MpegTSService *service) |
|
|
|
AVStream *st = s->streams[i]; |
|
|
|
MpegTSWriteStream *ts_st = st->priv_data; |
|
|
|
AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0); |
|
|
|
|
|
|
|
if (q - data > SECTION_LENGTH - 3 - 2 - 6) { |
|
|
|
err = 1; |
|
|
|
break; |
|
|
|
} |
|
|
|
switch (st->codec->codec_id) { |
|
|
|
case AV_CODEC_ID_MPEG1VIDEO: |
|
|
|
case AV_CODEC_ID_MPEG2VIDEO: |
|
|
@@ -301,6 +306,10 @@ static void mpegts_write_pmt(AVFormatContext *s, MpegTSService *service) |
|
|
|
*len_ptr = 0; |
|
|
|
|
|
|
|
for (p = lang->value; next && *len_ptr < 255 / 4 * 4; p = next + 1) { |
|
|
|
if (q - data > SECTION_LENGTH - 4) { |
|
|
|
err = 1; |
|
|
|
break; |
|
|
|
} |
|
|
|
next = strchr(p, ','); |
|
|
|
if (strlen(p) != 3 && (!next || next != p + 3)) |
|
|
|
continue; /* not a 3-letter code */ |
|
|
@@ -335,6 +344,12 @@ static void mpegts_write_pmt(AVFormatContext *s, MpegTSService *service) |
|
|
|
*q++ = language[1]; |
|
|
|
*q++ = language[2]; |
|
|
|
*q++ = 0x10; /* normal subtitles (0x20 = if hearing pb) */ |
|
|
|
|
|
|
|
if (q - data > SECTION_LENGTH - 4) { |
|
|
|
err = 1; |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
if (st->codec->extradata_size == 4) { |
|
|
|
memcpy(q, st->codec->extradata, 4); |
|
|
|
q += 4; |
|
|
@@ -360,6 +375,13 @@ static void mpegts_write_pmt(AVFormatContext *s, MpegTSService *service) |
|
|
|
desc_length_ptr[0] = val >> 8; |
|
|
|
desc_length_ptr[1] = val; |
|
|
|
} |
|
|
|
|
|
|
|
if (err) |
|
|
|
av_log(s, AV_LOG_ERROR, |
|
|
|
"The PMT section cannot fit stream %d and all following streams.\n" |
|
|
|
"Try reducing the number of languages in the audio streams " |
|
|
|
"or the total number of streams.\n", i); |
|
|
|
|
|
|
|
mpegts_write_section1(&service->pmt, PMT_TID, service->sid, 0, 0, 0, |
|
|
|
data, q - data); |
|
|
|
} |
|
|
|