Signed-off-by: zheng qian <x...@xqq.im> --- libavformat/mpegtsenc.c | 40 +++++++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 9 deletions(-)
diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c index 98dac17994..b5d2938c4a 100644 --- a/libavformat/mpegtsenc.c +++ b/libavformat/mpegtsenc.c @@ -287,26 +287,37 @@ static void putbuf(uint8_t **q_ptr, const uint8_t *buf, size_t len) *q_ptr += len; } -static int put_arib_caption_descriptor(AVFormatContext *s, uint8_t **q_ptr, - AVCodecParameters *codecpar) +static int put_arib_descriptor(AVFormatContext *s, AVStream* st, uint8_t **q_ptr) { uint8_t stream_identifier; uint16_t data_component_id; uint8_t *q = *q_ptr; - switch (codecpar->profile) { + switch (st->codecpar->profile) { case FF_PROFILE_ARIB_PROFILE_A: - stream_identifier = 0x30; + if (st->disposition & AV_DISPOSITION_URGENT) { + // ARIB superimpose, with AV_DISPOSITION_URGENT flag + stream_identifier = 0x38; + } else { + // ARIB caption + stream_identifier = 0x30; + } data_component_id = 0x0008; break; case FF_PROFILE_ARIB_PROFILE_C: - stream_identifier = 0x87; + if (st->disposition & AV_DISPOSITION_URGENT) { + // ARIB superimpose + stream_identifier = 0x88; + } else { + // ARIB caption + stream_identifier = 0x87; + } data_component_id = 0x0012; break; default: av_log(s, AV_LOG_ERROR, "Unset/unknown ARIB caption profile %d utilized!\n", - codecpar->profile); + st->codecpar->profile); return AVERROR_INVALIDDATA; } @@ -320,11 +331,17 @@ static int put_arib_caption_descriptor(AVFormatContext *s, uint8_t **q_ptr, *q++ = 3; // descriptor_length put16(&q, data_component_id); // data_component_id // additional_arib_caption_info: defined in ARIB STD-B24, fascicle 1, Part 3, 9.6.1 - // Here we utilize a pre-defined set of values defined in ARIB TR-B14, + // Here we utilize pre-defined sets of values defined in ARIB TR-B14, // Fascicle 2, 4.2.8.5 for PMT usage, with the reserved bits in the middle // set to 1 (as that is what every broadcaster seems to be doing in // production). - *q++ = 0x3D; // DMF('0011'), Reserved('11'), Timing('01') + if (st->disposition & AV_DISPOSITION_URGENT) { + // ARIB superimpose + *q++ = 0x3C; // DMF('0011'), Reserved('11'), Timing('00') + } else { + // ARIB caption + *q++ = 0x3D; // DMF('0011'), Reserved('11'), Timing('01') + } *q_ptr = q; @@ -772,7 +789,7 @@ static int mpegts_write_pmt(AVFormatContext *s, MpegTSService *service) *len_ptr = q - len_ptr - 1; } else if (codec_id == AV_CODEC_ID_ARIB_CAPTION) { - if (put_arib_caption_descriptor(s, &q, st->codecpar) < 0) + if (put_arib_descriptor(s, st, &q) < 0) break; } break; @@ -1444,6 +1461,11 @@ static int get_pes_stream_id(AVFormatContext *s, AVStream *st, int stream_id, in if (stream_id == STREAM_ID_PRIVATE_STREAM_1) /* asynchronous KLV */ *async = 1; return stream_id != -1 ? stream_id : STREAM_ID_METADATA_STREAM; + } else if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE && + st->codecpar->codec_id == AV_CODEC_ID_ARIB_CAPTION && + st->disposition & AV_DISPOSITION_URGENT) { // ARIB superimpose + // ARIB TR-B14, Fascicle 1 (2/2), Vol.3, 4.2.3 + return STREAM_ID_PRIVATE_STREAM_2; } else { return STREAM_ID_PRIVATE_STREAM_1; } -- 2.29.2 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".