Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
From: Mark Thompson <sw@jkqxz.net>
To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
Subject: [FFmpeg-devel] [PATCH 2/2] cbs_av1: Don't reject unknown metadata
Date: Tue, 17 Jan 2023 22:23:22 +0000
Message-ID: <e1346a0a-1261-e597-57eb-8d9a33adaade@jkqxz.net> (raw)
In-Reply-To: <9f33d721-b3a5-dc8d-6048-4bc096d9abfe@jkqxz.net>

Accept it and pass it through unchanged.

The standard requires that decoders ignore unknown metadata, and indeed
this is tested by some of the Argon coverage streams.
---
Artificial test example:

[trace_headers @ 0x5596dda6ed80] OBU header
[trace_headers @ 0x5596dda6ed80] 0           obu_forbidden_bit                                           0 = 0
[trace_headers @ 0x5596dda6ed80] 1           obu_type                                                 0101 = 5
[trace_headers @ 0x5596dda6ed80] 5           obu_extension_flag                                          0 = 0
[trace_headers @ 0x5596dda6ed80] 6           obu_has_size_field                                          1 = 1
[trace_headers @ 0x5596dda6ed80] 7           obu_reserved_1bit                                           0 = 0
[trace_headers @ 0x5596dda6ed80] 8           leb128_byte[0]                                       00001101 = 13
[trace_headers @ 0x5596dda6ed80] 8           obu_size                                                      = 13
[trace_headers @ 0x5596dda6ed80] 16          leb128_byte[0]                                       00101010 = 42
[trace_headers @ 0x5596dda6ed80] 16          metadata_type                                                 = 42
[trace_headers @ 0x5596dda6ed80] Unknown Metadata
[trace_headers @ 0x5596dda6ed80] 24          payload[0]                                           00000000 = 0
[trace_headers @ 0x5596dda6ed80] 32          payload[1]                                           00000001 = 1
[trace_headers @ 0x5596dda6ed80] 40          payload[2]                                           00000010 = 2
[trace_headers @ 0x5596dda6ed80] 48          payload[3]                                           00000011 = 3
[trace_headers @ 0x5596dda6ed80] 56          payload[4]                                           00000100 = 4
[trace_headers @ 0x5596dda6ed80] 64          payload[5]                                           00000101 = 5
[trace_headers @ 0x5596dda6ed80] 72          payload[6]                                           00000110 = 6
[trace_headers @ 0x5596dda6ed80] 80          payload[7]                                           00000111 = 7
[trace_headers @ 0x5596dda6ed80] 88          payload[8]                                           00001000 = 8
[trace_headers @ 0x5596dda6ed80] 96          payload[9]                                           00001001 = 9
[trace_headers @ 0x5596dda6ed80] 104         payload[10]                                          00001010 = 10
[trace_headers @ 0x5596dda6ed80] 112         trailing_one_bit                                            1 = 1
[trace_headers @ 0x5596dda6ed80] 113         trailing_zero_bit                                           0 = 0
[trace_headers @ 0x5596dda6ed80] 114         trailing_zero_bit                                           0 = 0
[trace_headers @ 0x5596dda6ed80] 115         trailing_zero_bit                                           0 = 0
[trace_headers @ 0x5596dda6ed80] 116         trailing_zero_bit                                           0 = 0
[trace_headers @ 0x5596dda6ed80] 117         trailing_zero_bit                                           0 = 0
[trace_headers @ 0x5596dda6ed80] 118         trailing_zero_bit                                           0 = 0
[trace_headers @ 0x5596dda6ed80] 119         trailing_zero_bit                                           0 = 0

  libavcodec/cbs_av1.c                 |  7 +++++++
  libavcodec/cbs_av1.h                 |  7 +++++++
  libavcodec/cbs_av1_syntax_template.c | 26 ++++++++++++++++++++++++--
  3 files changed, 38 insertions(+), 2 deletions(-)

diff --git a/libavcodec/cbs_av1.c b/libavcodec/cbs_av1.c
index 45e1288a51..8788fee099 100644
--- a/libavcodec/cbs_av1.c
+++ b/libavcodec/cbs_av1.c
@@ -1306,9 +1306,16 @@ static void cbs_av1_free_metadata(void *unit, uint8_t *content)
      md = &obu->obu.metadata;

      switch (md->metadata_type) {
+    case AV1_METADATA_TYPE_HDR_CLL:
+    case AV1_METADATA_TYPE_HDR_MDCV:
+    case AV1_METADATA_TYPE_SCALABILITY:
+    case AV1_METADATA_TYPE_TIMECODE:
+        break;
      case AV1_METADATA_TYPE_ITUT_T35:
          av_buffer_unref(&md->metadata.itut_t35.payload_ref);
          break;
+    default:
+        av_buffer_unref(&md->metadata.unknown.payload_ref);
      }
      av_free(content);
  }
diff --git a/libavcodec/cbs_av1.h b/libavcodec/cbs_av1.h
index 1fc80dcfa0..36848d4410 100644
--- a/libavcodec/cbs_av1.h
+++ b/libavcodec/cbs_av1.h
@@ -370,6 +370,12 @@ typedef struct AV1RawMetadataTimecode {
      uint32_t time_offset_value;
  } AV1RawMetadataTimecode;

+typedef struct AV1RawMetadataUnknown {
+    uint8_t     *payload;
+    AVBufferRef *payload_ref;
+    size_t       payload_size;
+} AV1RawMetadataUnknown;
+
  typedef struct AV1RawMetadata {
      uint64_t metadata_type;
      union {
@@ -378,6 +384,7 @@ typedef struct AV1RawMetadata {
          AV1RawMetadataScalability scalability;
          AV1RawMetadataITUTT35     itut_t35;
          AV1RawMetadataTimecode    timecode;
+        AV1RawMetadataUnknown     unknown;
      } metadata;
  } AV1RawMetadata;

diff --git a/libavcodec/cbs_av1_syntax_template.c b/libavcodec/cbs_av1_syntax_template.c
index 46f4c5a6b8..3cab02bdd9 100644
--- a/libavcodec/cbs_av1_syntax_template.c
+++ b/libavcodec/cbs_av1_syntax_template.c
@@ -2007,6 +2007,29 @@ static int FUNC(metadata_timecode)(CodedBitstreamContext *ctx, RWContext *rw,
      return 0;
  }

+static int FUNC(metadata_unknown)(CodedBitstreamContext *ctx, RWContext *rw,
+                                  AV1RawMetadataUnknown *current)
+{
+    int err;
+    size_t i;
+
+    HEADER("Unknown Metadata");
+
+#ifdef READ
+    current->payload_size = cbs_av1_get_payload_bytes_left(rw);
+
+    current->payload_ref = av_buffer_alloc(current->payload_size);
+    if (!current->payload_ref)
+        return AVERROR(ENOMEM);
+    current->payload = current->payload_ref->data;
+#endif
+
+    for (i = 0; i < current->payload_size; i++)
+        fbs(8, payload[i], 1, i);
+
+    return 0;
+}
+
  static int FUNC(metadata_obu)(CodedBitstreamContext *ctx, RWContext *rw,
                                AV1RawMetadata *current)
  {
@@ -2031,8 +2054,7 @@ static int FUNC(metadata_obu)(CodedBitstreamContext *ctx, RWContext *rw,
          CHECK(FUNC(metadata_timecode)(ctx, rw, &current->metadata.timecode));
          break;
      default:
-        // Unknown metadata type.
-        return AVERROR_PATCHWELCOME;
+        CHECK(FUNC(metadata_unknown)(ctx, rw, &current->metadata.unknown));
      }

      return 0;
-- 
2.39.0
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

  reply	other threads:[~2023-01-17 22:23 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-01-17 22:21 [FFmpeg-devel] [PATCH 1/2] cbs_av1: Add tracing headers for metadata types Mark Thompson
2023-01-17 22:23 ` Mark Thompson [this message]
2023-01-18 20:35 ` [FFmpeg-devel] [PATCH 3/2] cbs_av1: Remove constraint on MDCV luminance values Mark Thompson
2023-01-18 20:38   ` James Almer
2023-01-24 22:29     ` Mark Thompson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=e1346a0a-1261-e597-57eb-8d9a33adaade@jkqxz.net \
    --to=sw@jkqxz.net \
    --cc=ffmpeg-devel@ffmpeg.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git