Add synchronous metadata to mpegtsenc * Added AV_CODEC_ID_SYNCHRONOUS_METADATA * PMT will have metadata_descriptor and metadata_std_descriptor in accordance with MISB ST 1402.2 * stream_type will be 0x15 metadata carried in PES packets * stream_id will be 0xfc metadata stream
Users must supply Metadata Access Unit to the packet before writing.
--- libavcodec/avcodec.h | 1 + libavcodec/codec_desc.c | 6 ++++++ libavformat/mpegtsenc.c | 22 ++++++++++++++++++++++ 3 files changed, 29 insertions(+) diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 52cc5b0..fb43182 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -683,6 +683,7 @@ enum AVCodecID { AV_CODEC_ID_DVD_NAV, AV_CODEC_ID_TIMED_ID3, AV_CODEC_ID_BIN_DATA, + AV_CODEC_ID_SYNCHRONOUS_METADATA, AV_CODEC_ID_PROBE = 0x19000, ///< codec_id is not known (like AV_CODEC_ID_NONE) but lavf should attempt to identify it diff --git a/libavcodec/codec_desc.c b/libavcodec/codec_desc.c index 6a13bbb..0ec6872 100644 --- a/libavcodec/codec_desc.c +++ b/libavcodec/codec_desc.c @@ -3114,6 +3114,12 @@ static const AVCodecDescriptor codec_descriptors[] = { .name = "scte_35", .long_name = NULL_IF_CONFIG_SMALL("SCTE 35 Message Queue"), }, + { + .id = AV_CODEC_ID_SYNCHRONOUS_METADATA, + .type = AVMEDIA_TYPE_DATA, + .name = "sync_metadata", + .long_name = NULL_IF_CONFIG_SMALL("ISO/IEC 13818-1 Synchronous Metadata"), + }, /* deprecated codec ids */ }; diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c index fdfa544..35907da 100644 --- a/libavformat/mpegtsenc.c +++ b/libavformat/mpegtsenc.c @@ -387,6 +387,7 @@ static int mpegts_write_pmt(AVFormatContext *s, MpegTSService *service) stream_type = STREAM_TYPE_PRIVATE_DATA; break; case AV_CODEC_ID_TIMED_ID3: + case AV_CODEC_ID_SYNCHRONOUS_METADATA: stream_type = STREAM_TYPE_METADATA; break; default: @@ -641,6 +642,27 @@ static int mpegts_write_pmt(AVFormatContext *s, MpegTSService *service) *q++ = 'L'; *q++ = 'V'; *q++ = 'A'; + } else if (st->codecpar->codec_id == AV_CODEC_ID_SYNCHRONOUS_METADATA) { + const char *tag = "KLVA"; + *q++ = 0x26; /* desctiptor_tag = metadata_descriptor */ + *q++ = 9; /* desctiptor_length */ + put16(&q, 0x0100); /* metadata application format */ + *q++ = 0xff; /* metadata format */ + putstr8(&q, tag, 0); + *q++ = 0; /* metadata service ID */ + *q++ = 0xF; /* decoder_config_flags|DSM-CC flag|reserved */ + + *q++ = 0x27; /* desctiptor_tag = metadata_std_descriptor */ + *q++ = 9; /* desctiptor_length */ + *q++ = 0xc0; + *q++ = 0x00; + *q++ = 0x00; + *q++ = 0xc0; + *q++ = 0x00; + *q++ = 0x00; + *q++ = 0xc0; + *q++ = 0x00; + *q++ = 0x00; } else if (st->codecpar->codec_id == AV_CODEC_ID_TIMED_ID3) { const char *tag = "ID3 "; *q++ = 0x26; /* metadata descriptor */ -- 2.7.4
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel