Revert "Add API for layer-specific metadata." This reverts commit 0a6035a0939cfa65e3fcc83f0f6caaaa7bbc075b. Reason: exclude the layer-specific metadata API from libaom v3.13.0. Change-Id: Ie3f1218f4f87cd8368eb76aa9f38adb89f3f2b06
diff --git a/aom/aom_image.h b/aom/aom_image.h index c4ad19a..248b5b6 100644 --- a/aom/aom_image.h +++ b/aom/aom_image.h
@@ -154,33 +154,17 @@ * * While encoding, when metadata is added to an aom_image via * aom_img_add_metadata(), the flag passed along with the metadata will - * determine where the metadata OBU will be placed in the encoded OBU stream, - * and whether it's layer-specific. Metadata will be emitted into the output - * stream within the next temporal unit if it satisfies the specified insertion - * flag. + * determine where the metadata OBU will be placed in the encoded OBU stream. + * Metadata will be emitted into the output stream within the next temporal unit + * if it satisfies the specified insertion flag. * - * If the video contains multiple spatial and/or temporal layers, - * a layer-specific metadata OBU only applies to the current frame's layer, as - * determined by the frame's temporal_id and spatial_id. Some metadata types - * cannot be layer-specific, as listed in Section 6.7.1 of the draft AV1 - * specification as of 2025-03-06. - * - * During decoding, when the library encounters a metadata OBU, it is emitted - * with the next output aom_image. Its insert_flag is set to either - * AOM_MIF_ANY_FRAME, or AOM_MIF_ANY_FRAME_LAYER_SPECIFIC if the OBU contains an - * OBU header extension (i.e. the video contains multiple layers AND the - * metadata was added using *_LAYER_SPECIFC insert flag if using libaom). + * During decoding, when the library encounters a metadata OBU, it is always + * flagged as AOM_MIF_ANY_FRAME and emitted with the next output aom_image. */ typedef enum aom_metadata_insert_flags { - AOM_MIF_NON_KEY_FRAME = 0, /**< Adds metadata if it's not a keyframe */ + AOM_MIF_NON_KEY_FRAME = 0, /**< Adds metadata if it's not keyframe */ AOM_MIF_KEY_FRAME = 1, /**< Adds metadata only if it's a keyframe */ - AOM_MIF_ANY_FRAME = 2, /**< Adds metadata to any type of frame */ - /** Adds layer-specific metadata if it's not a keyframe */ - AOM_MIF_NON_KEY_FRAME_LAYER_SPECIFIC = 16, - /** Adds layer-specific metadata only if it's a keyframe */ - AOM_MIF_KEY_FRAME_LAYER_SPECIFIC = 17, - /** Adds layer-specific metadata to any type of frame */ - AOM_MIF_ANY_FRAME_LAYER_SPECIFIC = 18, + AOM_MIF_ANY_FRAME = 2 /**< Adds metadata to any type of frame */ } aom_metadata_insert_flags_t; /*!\brief Array of aom_metadata structs for an image. */
diff --git a/aom/internal/aom_image_internal.h b/aom/internal/aom_image_internal.h index e11223a..ef0f166 100644 --- a/aom/internal/aom_image_internal.h +++ b/aom/internal/aom_image_internal.h
@@ -29,14 +29,6 @@ aom_metadata_t **metadata_array; /* Array of metadata structs */ }; -/*! \brief Bit in aom_metadata_insert_flags marking metadata as layer-specific. - */ -#define AOM_MIF_LAYER_SPECIFIC 0x10 -/*! \brief Bits in aom_metadata_insert_flags used to signal which frames to - * add the metadata to (keyframes, non keyframes...). - */ -#define AOM_MIF_INSERT_LOCATION_MASK 0x0f - /*!\brief Alloc memory for aom_metadata_array struct. * * Allocate memory for aom_metadata_array struct.
diff --git a/aom/src/aom_image.c b/aom/src/aom_image.c index 0b3cbde..a33262d 100644 --- a/aom/src/aom_image.c +++ b/aom/src/aom_image.c
@@ -18,7 +18,6 @@ #include "aom/aom_integer.h" #include "aom/internal/aom_image_internal.h" #include "aom_mem/aom_mem.h" -#include "aom/aom_codec.h" static inline unsigned int align_image_dimension(unsigned int d, unsigned int subsampling, @@ -384,15 +383,6 @@ img->metadata = aom_img_metadata_array_alloc(0); if (!img->metadata) return -1; } - // Some metadata types are not allowed to be layer specific, according to - // the Table in Section 6.7.1 of the AV1 specifiction. - // Do not check for OBU_METADATA_TYPE_HDR_CLL or OBU_METADATA_TYPE_HDR_MDCV - // because there are plans to alow them to be layer specific. - if ((insert_flag & AOM_MIF_LAYER_SPECIFIC) && - (type == OBU_METADATA_TYPE_SCALABILITY || - type == OBU_METADATA_TYPE_TIMECODE)) { - return -1; - } aom_metadata_t *metadata = aom_img_metadata_alloc(type, data, sz, insert_flag); if (!metadata) return -1;
diff --git a/av1/decoder/obu.c b/av1/decoder/obu.c index 28ca200..6d6aa41 100644 --- a/av1/decoder/obu.c +++ b/av1/decoder/obu.c
@@ -628,7 +628,7 @@ // On failure, calls aom_internal_error() and does not return. static void read_metadata_itut_t35(AV1Decoder *const pbi, const uint8_t *data, - size_t sz, bool has_obu_extension_header) { + size_t sz) { if (sz == 0) { aom_internal_error(&pbi->error, AOM_CODEC_CORRUPT_FRAME, "itu_t_t35_country_code is missing"); @@ -657,9 +657,7 @@ data[end_index]); } alloc_read_metadata(pbi, OBU_METADATA_TYPE_ITUT_T35, data, end_index, - has_obu_extension_header - ? AOM_MIF_ANY_FRAME_LAYER_SPECIFIC - : AOM_MIF_ANY_FRAME); + AOM_MIF_ANY_FRAME); } // On success, returns the number of bytes read from 'data'. On failure, calls @@ -786,8 +784,7 @@ // On success, returns the number of bytes read from 'data'. On failure, sets // pbi->common.error.error_code and returns 0, or calls aom_internal_error() // and does not return. -static size_t read_metadata(AV1Decoder *pbi, const uint8_t *data, size_t sz, - bool has_obu_extension_header) { +static size_t read_metadata(AV1Decoder *pbi, const uint8_t *data, size_t sz) { size_t type_length; uint64_t type_value; if (aom_uleb_decode(data, sz, &type_value, &type_length) < 0) { @@ -806,8 +803,7 @@ } if (metadata_type == OBU_METADATA_TYPE_ITUT_T35) { // read_metadata_itut_t35() checks trailing bits. - read_metadata_itut_t35(pbi, data + type_length, sz - type_length, - has_obu_extension_header); + read_metadata_itut_t35(pbi, data + type_length, sz - type_length); return sz; } else if (metadata_type == OBU_METADATA_TYPE_HDR_CLL) { size_t bytes_read = @@ -1061,12 +1057,10 @@ } pbi->num_tile_groups++; break; - case OBU_METADATA: { - decoded_payload_size = - read_metadata(pbi, data, payload_size, obu_header.has_extension); + case OBU_METADATA: + decoded_payload_size = read_metadata(pbi, data, payload_size); if (pbi->error.error_code != AOM_CODEC_OK) return -1; break; - } case OBU_TILE_LIST: if (CONFIG_NORMAL_TILE_MODE) { pbi->error.error_code = AOM_CODEC_UNSUP_BITSTREAM;
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c index 178a84a..a6a92bf 100644 --- a/av1/encoder/bitstream.c +++ b/av1/encoder/bitstream.c
@@ -4222,24 +4222,23 @@ for (size_t i = 0; i < arr->sz; i++) { aom_metadata_t *current_metadata = arr->metadata_array[i]; if (current_metadata && current_metadata->payload) { - const int metadata_insert_location = - current_metadata->insert_flag & AOM_MIF_INSERT_LOCATION_MASK; if ((cm->current_frame.frame_type == KEY_FRAME && - metadata_insert_location == AOM_MIF_KEY_FRAME) || + current_metadata->insert_flag == AOM_MIF_KEY_FRAME) || (cm->current_frame.frame_type != KEY_FRAME && - metadata_insert_location == AOM_MIF_NON_KEY_FRAME) || - metadata_insert_location == AOM_MIF_ANY_FRAME) { + current_metadata->insert_flag == AOM_MIF_NON_KEY_FRAME) || + current_metadata->insert_flag == AOM_MIF_ANY_FRAME) { // OBU header is either one or two bytes. if (dst_size < 2) { aom_internal_error(cm->error, AOM_CODEC_ERROR, "av1_write_metadata_array: output buffer full"); } - const bool is_layer_specific_obu = - (current_metadata->insert_flag & AOM_MIF_LAYER_SPECIFIC) != 0; + // According to the AV1 spec draft version (as of git commit 5e04f) + // Section 6.7.1, some metadata types can be layer specific, but we + // currently only support non-layer specific metadata. obu_header_size = av1_write_obu_header( &cpi->ppi->level_params, &cpi->frame_header_count, OBU_METADATA, cm->seq_params->has_nonzero_operating_point_idc, - is_layer_specific_obu, 0, dst); + /*is_layer_specific_obu=*/false, 0, dst); assert(obu_header_size <= 2); obu_payload_size = av1_write_metadata_obu(current_metadata, dst + obu_header_size,
diff --git a/test/metadata_test.cc b/test/metadata_test.cc index c34f4da..da0fb13 100644 --- a/test/metadata_test.cc +++ b/test/metadata_test.cc
@@ -35,12 +35,6 @@ 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 }; -const size_t kMetadataPayloadSizeT35Two = 10; -// 0xB5 stands for the itut t35 metadata country code for the Unites States -const uint8_t kMetadataPayloadT35Two[kMetadataPayloadSizeT35] = { - 0xB5, 0x01, 0x02, 0x42, 0xff, 0xff, 0x00, 0x07, 0x08, 0x09 -}; - const size_t kMetadataPayloadSizeMdcv = 24; // Arbitrary content. const uint8_t kMetadataPayloadMdcv[kMetadataPayloadSizeMdcv] = { @@ -102,18 +96,11 @@ ASSERT_EQ(aom_img_add_metadata(current_frame, OBU_METADATA_TYPE_ITUT_T35, nullptr, 0, AOM_MIF_ANY_FRAME), -1); - ASSERT_EQ(aom_img_add_metadata(current_frame, OBU_METADATA_TYPE_ITUT_T35, kMetadataPayloadT35, kMetadataPayloadSizeT35, AOM_MIF_ANY_FRAME), 0); - ASSERT_EQ( - aom_img_add_metadata(current_frame, OBU_METADATA_TYPE_ITUT_T35, - kMetadataPayloadT35Two, kMetadataPayloadSizeT35Two, - AOM_MIF_ANY_FRAME_LAYER_SPECIFIC), - 0); - ASSERT_EQ(aom_img_add_metadata(current_frame, OBU_METADATA_TYPE_HDR_MDCV, kMetadataPayloadMdcv, kMetadataPayloadSizeMdcv, AOM_MIF_KEY_FRAME), @@ -156,42 +143,32 @@ ASSERT_NE(img.metadata, nullptr); - ASSERT_EQ(img.metadata->sz, is_key_frame ? 4 : 2); + ASSERT_EQ(img.metadata->sz, is_key_frame ? 3 : 1); - aom_metadata_t *metadata = img.metadata->metadata_array[0]; - ASSERT_EQ(metadata->type, OBU_METADATA_TYPE_ITUT_T35); - ASSERT_EQ(metadata->insert_flag, AOM_MIF_ANY_FRAME); - ASSERT_EQ(metadata->sz, kMetadataPayloadSizeT35); + ASSERT_EQ(OBU_METADATA_TYPE_ITUT_T35, + img.metadata->metadata_array[0]->type); + ASSERT_EQ(kMetadataPayloadSizeT35, img.metadata->metadata_array[0]->sz); EXPECT_EQ( - memcmp(kMetadataPayloadT35, metadata->payload, kMetadataPayloadSizeT35), + memcmp(kMetadataPayloadT35, img.metadata->metadata_array[0]->payload, + kMetadataPayloadSizeT35), 0); - metadata = img.metadata->metadata_array[1]; - ASSERT_EQ(metadata->type, OBU_METADATA_TYPE_ITUT_T35); - // AOM_MIF_ANY_FRAME and not AOM_MIF_ANY_FRAME_LAYER_SPECIFIC because the - // stream does not contain layers. - ASSERT_EQ(metadata->insert_flag, AOM_MIF_ANY_FRAME); - ASSERT_EQ(metadata->sz, kMetadataPayloadSizeT35Two); - EXPECT_EQ(memcmp(kMetadataPayloadT35Two, metadata->payload, - kMetadataPayloadSizeT35Two), - 0); - if (is_key_frame) { - metadata = img.metadata->metadata_array[2]; - ASSERT_EQ(metadata->type, OBU_METADATA_TYPE_HDR_MDCV); - ASSERT_EQ(metadata->insert_flag, AOM_MIF_ANY_FRAME); - ASSERT_EQ(metadata->sz, kMetadataPayloadSizeMdcv); - EXPECT_EQ(memcmp(kMetadataPayloadMdcv, metadata->payload, - kMetadataPayloadSizeMdcv), - 0); + ASSERT_EQ(OBU_METADATA_TYPE_HDR_MDCV, + img.metadata->metadata_array[1]->type); + ASSERT_EQ(kMetadataPayloadSizeMdcv, img.metadata->metadata_array[1]->sz); + EXPECT_EQ( + memcmp(kMetadataPayloadMdcv, img.metadata->metadata_array[1]->payload, + kMetadataPayloadSizeMdcv), + 0); - metadata = img.metadata->metadata_array[3]; - ASSERT_EQ(metadata->type, OBU_METADATA_TYPE_HDR_CLL); - ASSERT_EQ(metadata->insert_flag, AOM_MIF_ANY_FRAME); - ASSERT_EQ(metadata->sz, kMetadataPayloadSizeCll); - EXPECT_EQ(memcmp(kMetadataPayloadCll, metadata->payload, - kMetadataPayloadSizeCll), - 0); + ASSERT_EQ(OBU_METADATA_TYPE_HDR_CLL, + img.metadata->metadata_array[2]->type); + ASSERT_EQ(kMetadataPayloadSizeCll, img.metadata->metadata_array[2]->sz); + EXPECT_EQ( + memcmp(kMetadataPayloadCll, img.metadata->metadata_array[2]->payload, + kMetadataPayloadSizeCll), + 0); } } @@ -266,12 +243,6 @@ AOM_MIF_ANY_FRAME), 0); - ASSERT_EQ( - aom_img_add_metadata(current_frame, OBU_METADATA_TYPE_ITUT_T35, - kMetadataPayloadT35Two, kMetadataPayloadSizeT35Two, - AOM_MIF_ANY_FRAME_LAYER_SPECIFIC), - 0); - ASSERT_EQ(aom_img_add_metadata(current_frame, OBU_METADATA_TYPE_HDR_MDCV, kMetadataPayloadMdcv, kMetadataPayloadSizeMdcv, AOM_MIF_KEY_FRAME), @@ -317,40 +288,32 @@ ASSERT_NE(img.metadata, nullptr); - ASSERT_EQ(img.metadata->sz, is_key_frame ? 4 : 2); + ASSERT_EQ(img.metadata->sz, is_key_frame ? 3 : 1); - aom_metadata_t *metadata = img.metadata->metadata_array[0]; - ASSERT_EQ(metadata->type, OBU_METADATA_TYPE_ITUT_T35); - ASSERT_EQ(metadata->insert_flag, AOM_MIF_ANY_FRAME); - ASSERT_EQ(metadata->sz, kMetadataPayloadSizeT35); + ASSERT_EQ(OBU_METADATA_TYPE_ITUT_T35, + img.metadata->metadata_array[0]->type); + ASSERT_EQ(kMetadataPayloadSizeT35, img.metadata->metadata_array[0]->sz); EXPECT_EQ( - memcmp(kMetadataPayloadT35, metadata->payload, kMetadataPayloadSizeT35), + memcmp(kMetadataPayloadT35, img.metadata->metadata_array[0]->payload, + kMetadataPayloadSizeT35), 0); - metadata = img.metadata->metadata_array[1]; - ASSERT_EQ(metadata->type, OBU_METADATA_TYPE_ITUT_T35); - ASSERT_EQ(metadata->insert_flag, AOM_MIF_ANY_FRAME_LAYER_SPECIFIC); - ASSERT_EQ(metadata->sz, kMetadataPayloadSizeT35Two); - EXPECT_EQ(memcmp(kMetadataPayloadT35Two, metadata->payload, - kMetadataPayloadSizeT35Two), - 0); - if (is_key_frame) { - metadata = img.metadata->metadata_array[2]; - ASSERT_EQ(metadata->type, OBU_METADATA_TYPE_HDR_MDCV); - ASSERT_EQ(metadata->insert_flag, AOM_MIF_ANY_FRAME); - ASSERT_EQ(metadata->sz, kMetadataPayloadSizeMdcv); - EXPECT_EQ(memcmp(kMetadataPayloadMdcv, metadata->payload, - kMetadataPayloadSizeMdcv), - 0); + ASSERT_EQ(OBU_METADATA_TYPE_HDR_MDCV, + img.metadata->metadata_array[1]->type); + ASSERT_EQ(kMetadataPayloadSizeMdcv, img.metadata->metadata_array[1]->sz); + EXPECT_EQ( + memcmp(kMetadataPayloadMdcv, img.metadata->metadata_array[1]->payload, + kMetadataPayloadSizeMdcv), + 0); - metadata = img.metadata->metadata_array[3]; - ASSERT_EQ(metadata->type, OBU_METADATA_TYPE_HDR_CLL); - ASSERT_EQ(metadata->insert_flag, AOM_MIF_ANY_FRAME); - ASSERT_EQ(metadata->sz, kMetadataPayloadSizeCll); - EXPECT_EQ(memcmp(kMetadataPayloadCll, metadata->payload, - kMetadataPayloadSizeCll), - 0); + ASSERT_EQ(OBU_METADATA_TYPE_HDR_CLL, + img.metadata->metadata_array[2]->type); + ASSERT_EQ(kMetadataPayloadSizeCll, img.metadata->metadata_array[2]->sz); + EXPECT_EQ( + memcmp(kMetadataPayloadCll, img.metadata->metadata_array[2]->payload, + kMetadataPayloadSizeCll), + 0); } } @@ -439,33 +402,6 @@ -1); } -TEST(MetadataTest, AddLayerSpecificMetadataToImage) { - aom_image_t image; - image.metadata = nullptr; - - ASSERT_EQ( - aom_img_add_metadata( - &image, OBU_METADATA_TYPE_ITUT_T35, kMetadataPayloadT35, - kMetadataPayloadSizeT35, - (aom_metadata_insert_flags_t)(AOM_MIF_ANY_FRAME_LAYER_SPECIFIC)), - 0); - aom_img_metadata_array_free(image.metadata); -} - -TEST(MetadataTest, AddLayerSpecificMetadataToImageNotAllowed) { - aom_image_t image; - image.metadata = nullptr; - - // OBU_METADATA_TYPE_SCALABILITY cannot be layer specific. - ASSERT_EQ( - aom_img_add_metadata( - &image, OBU_METADATA_TYPE_SCALABILITY, kMetadataPayloadT35, - kMetadataPayloadSizeT35, - (aom_metadata_insert_flags_t)(AOM_MIF_ANY_FRAME_LAYER_SPECIFIC)), - -1); - aom_img_metadata_array_free(image.metadata); -} - TEST(MetadataTest, RemoveMetadataFromImage) { aom_image_t image; image.metadata = nullptr; @@ -518,13 +454,9 @@ kMetadataPayloadT35, kMetadataPayloadSizeT35, AOM_MIF_ANY_FRAME), 0); - ASSERT_EQ(aom_img_add_metadata(&image, OBU_METADATA_TYPE_ITUT_T35, - kMetadataPayloadT35, kMetadataPayloadSizeT35, - AOM_MIF_ANY_FRAME_LAYER_SPECIFIC), - 0); EXPECT_EQ(aom_img_get_metadata(nullptr, 0), nullptr); - EXPECT_EQ(aom_img_get_metadata(&image, 2u), nullptr); + EXPECT_EQ(aom_img_get_metadata(&image, 1u), nullptr); EXPECT_EQ(aom_img_get_metadata(&image, 10u), nullptr); const aom_metadata_t *metadata = aom_img_get_metadata(&image, 0); @@ -533,15 +465,6 @@ EXPECT_EQ( memcmp(kMetadataPayloadT35, metadata->payload, kMetadataPayloadSizeT35), 0); - EXPECT_EQ(metadata->insert_flag, AOM_MIF_ANY_FRAME); - - metadata = aom_img_get_metadata(&image, 1); - ASSERT_NE(metadata, nullptr); - ASSERT_EQ(metadata->sz, kMetadataPayloadSizeT35); - EXPECT_EQ( - memcmp(kMetadataPayloadT35, metadata->payload, kMetadataPayloadSizeT35), - 0); - EXPECT_EQ(metadata->insert_flag, AOM_MIF_ANY_FRAME_LAYER_SPECIFIC); aom_img_metadata_array_free(image.metadata); }