[FFmpeg-devel] mpegtsenc add synchronous metadata

Submitted by Mark Timmerman on Oct. 6, 2017, 11:37 a.m.

Details

Message ID CA+F=gyNgNJ2Fce_Oszc5ibrEJ4+0=E1sRN1zbu8U6LGhK1DsYw@mail.gmail.com
State New
Headers show

Commit Message

Mark Timmerman Oct. 6, 2017, 11:37 a.m.
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.

Comments

Michael Niedermayer Oct. 7, 2017, 12:46 a.m.
On Fri, Oct 06, 2017 at 01:37:40PM +0200, Mark Timmerman wrote:
> 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(+)
> adfd981b08a5133d7b4a0993153d13f037a03904  0001-synchronous-metadata.patch

please add a fate test for this

[...]

Patch hide | download patch | download mbox

---
 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