[FFmpeg-devel] [PATCH v1 2/2] libavformat/mpegtsenc: Write necessary descriptors into PMT for arib_caption
zheng qian
xqq at xqq.im
Tue Apr 6 11:18:16 EEST 2021
Stream copy for arib_caption into mpegts is not working correctly for now.
This patch utilizes the data stored in codecpar->extradata to write necessary
stream_identifier_descriptor and data_component_descriptor into PMT table
for arib_caption remuxing.
This patch fixes the copying of arib_caption. After this patch, arib_caption
inside the outputted (remuxed) mpegts stream can be recognized correctly
as an arib_caption subtitle stream.
Signed-off-by: zheng qian <xqq at xqq.im>
---
libavformat/mpegtsenc.c | 16 +++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c
index a357f3a6aa..e26a5d3b51 100644
--- a/libavformat/mpegtsenc.c
+++ b/libavformat/mpegtsenc.c
@@ -357,6 +357,7 @@ static int get_dvb_stream_type(AVFormatContext *s, AVStream *st)
break;
case AV_CODEC_ID_DVB_SUBTITLE:
case AV_CODEC_ID_DVB_TELETEXT:
+ case AV_CODEC_ID_ARIB_CAPTION:
stream_type = STREAM_TYPE_PRIVATE_DATA;
break;
case AV_CODEC_ID_SMPTE_KLV:
@@ -714,8 +715,21 @@ 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 (st->codecpar->extradata && st->codecpar->extradata_size >= 4) {
+ // stream_identifier_descriptor
+ *q++ = 0x52; // descriptor_tag
+ *q++ = 1; // descriptor_length
+ *q++ = st->codecpar->extradata[0]; // component_tag: stream_identifier
+
+ // data_component_descriptor
+ *q++ = 0xFD; // descriptor_tag: ARIB data coding type descriptor
+ *q++ = 3; // descriptor_length
+ memcpy(q, &st->codecpar->extradata[1], 3); // data_component_id & additional_arib_caption_info
+ q += 3;
+ }
}
- break;
+ break;
case AVMEDIA_TYPE_VIDEO:
if (stream_type == STREAM_TYPE_VIDEO_DIRAC) {
put_registration_descriptor(&q, MKTAG('d', 'r', 'a', 'c'));
--
2.29.2
More information about the ffmpeg-devel
mailing list