[FFmpeg-devel] [PATCH 3/5] avformat/mpegtsenc: Add muxing support for arib_superimpose
zheng qian
xqq at xqq.im
Sat Jun 12 12:30:30 EEST 2021
Signed-off-by: zheng qian <xqq at xqq.im>
---
libavformat/mpegtsenc.c | 30 +++++++++++++++++++++++-------
1 file changed, 23 insertions(+), 7 deletions(-)
diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c
index 98dac17994..68f69d5df8 100644
--- a/libavformat/mpegtsenc.c
+++ b/libavformat/mpegtsenc.c
@@ -287,7 +287,7 @@ 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,
+static int put_arib_descriptor(AVFormatContext *s, uint8_t **q_ptr,
AVCodecParameters *codecpar)
{
uint8_t stream_identifier;
@@ -296,11 +296,19 @@ static int put_arib_caption_descriptor(AVFormatContext *s, uint8_t **q_ptr,
switch (codecpar->profile) {
case FF_PROFILE_ARIB_PROFILE_A:
- stream_identifier = 0x30;
+ if (codecpar->codec_id == AV_CODEC_ID_ARIB_CAPTION) {
+ stream_identifier = 0x30;
+ } else { // AV_CODEC_ID_ARIB_SUPERIMPOSE
+ stream_identifier = 0x38;
+ }
data_component_id = 0x0008;
break;
case FF_PROFILE_ARIB_PROFILE_C:
- stream_identifier = 0x87;
+ if (codecpar->codec_id == AV_CODEC_ID_ARIB_CAPTION) {
+ stream_identifier = 0x87;
+ } else { // AV_CODEC_ID_ARIB_SUPERIMPOSE
+ stream_identifier = 0x88;
+ }
data_component_id = 0x0012;
break;
default:
@@ -320,11 +328,15 @@ 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 (codecpar->codec_id == AV_CODEC_ID_ARIB_CAPTION) {
+ *q++ = 0x3D; // DMF('0011'), Reserved('11'), Timing('01')
+ } else { // AV_CODEC_ID_ARIB_SUPERIMPOSE
+ *q++ = 0x3C; // DMF('0011'), Reserved('11'), Timing('00')
+ }
*q_ptr = q;
@@ -414,6 +426,7 @@ static int get_dvb_stream_type(AVFormatContext *s, AVStream *st)
case AV_CODEC_ID_DVB_SUBTITLE:
case AV_CODEC_ID_DVB_TELETEXT:
case AV_CODEC_ID_ARIB_CAPTION:
+ case AV_CODEC_ID_ARIB_SUPERIMPOSE:
stream_type = STREAM_TYPE_PRIVATE_DATA;
break;
case AV_CODEC_ID_SMPTE_KLV:
@@ -771,8 +784,8 @@ 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)
+ } else if (codec_id == AV_CODEC_ID_ARIB_CAPTION || codec_id == AV_CODEC_ID_ARIB_SUPERIMPOSE) {
+ if (put_arib_descriptor(s, &q, st->codecpar) < 0)
break;
}
break;
@@ -1444,6 +1457,9 @@ 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_SUPERIMPOSE) {
+ return STREAM_ID_PRIVATE_STREAM_2;
} else {
return STREAM_ID_PRIVATE_STREAM_1;
}
--
2.29.2
More information about the ffmpeg-devel
mailing list