James Zern | d36933a | 2019-11-21 18:57:45 -0800 | [diff] [blame] | 1 | /* |
Krishna Rapaka | 7319db5 | 2021-09-28 20:35:29 -0700 | [diff] [blame] | 2 | * Copyright (c) 2021, Alliance for Open Media. All rights reserved |
James Zern | d36933a | 2019-11-21 18:57:45 -0800 | [diff] [blame] | 3 | * |
Vibhoothi | 41c6dd7 | 2021-10-12 18:48:26 +0000 | [diff] [blame] | 4 | * This source code is subject to the terms of the BSD 3-Clause Clear License |
| 5 | * and the Alliance for Open Media Patent License 1.0. If the BSD 3-Clause Clear |
| 6 | * License was not distributed with this source code in the LICENSE file, you |
| 7 | * can obtain it at aomedia.org/license/software-license/bsd-3-c-c/. If the |
| 8 | * Alliance for Open Media Patent License 1.0 was not distributed with this |
| 9 | * source code in the PATENTS file, you can obtain it at |
| 10 | * aomedia.org/license/patent-license/. |
James Zern | d36933a | 2019-11-21 18:57:45 -0800 | [diff] [blame] | 11 | */ |
| 12 | |
Daniel Max Valenzuela | 0a6c808 | 2019-11-04 10:52:56 -0800 | [diff] [blame] | 13 | #include "third_party/googletest/src/googletest/include/gtest/gtest.h" |
| 14 | |
| 15 | #include "aom/aom_codec.h" |
| 16 | #include "aom/aom_image.h" |
| 17 | #include "aom/internal/aom_image_internal.h" |
| 18 | #include "aom_scale/yv12config.h" |
| 19 | #include "av1/encoder/bitstream.h" |
| 20 | #include "test/codec_factory.h" |
| 21 | #include "test/encode_test_driver.h" |
| 22 | #include "test/i420_video_source.h" |
| 23 | #include "test/util.h" |
| 24 | #include "test/video_source.h" |
| 25 | |
| 26 | namespace { |
Daniel Max Valenzuela | 62eab67 | 2020-01-08 12:12:47 -0800 | [diff] [blame] | 27 | const size_t kMetadataPayloadSizeT35 = 24; |
Daniel Max Valenzuela | cc6cf05 | 2019-12-17 11:13:15 -0800 | [diff] [blame] | 28 | // 0xB5 stands for the itut t35 metadata country code for the Unites States |
Daniel Max Valenzuela | 62eab67 | 2020-01-08 12:12:47 -0800 | [diff] [blame] | 29 | const uint8_t kMetadataPayloadT35[kMetadataPayloadSizeT35] = { |
| 30 | 0xB5, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, |
| 31 | 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 |
| 32 | }; |
| 33 | |
| 34 | const size_t kMetadataPayloadSizeCll = 4; |
| 35 | const uint8_t kMetadataPayloadCll[kMetadataPayloadSizeCll] = { 0xB5, 0x01, 0x02, |
| 36 | 0x03 }; |
Daniel Max Valenzuela | 0a6c808 | 2019-11-04 10:52:56 -0800 | [diff] [blame] | 37 | |
| 38 | #if CONFIG_AV1_ENCODER |
| 39 | |
Daniel Max Valenzuela | 62eab67 | 2020-01-08 12:12:47 -0800 | [diff] [blame] | 40 | const size_t kMetadataObuSizeT35 = 28; |
| 41 | const uint8_t kMetadataObuT35[kMetadataObuSizeT35] = { |
| 42 | 0x2A, 0x1A, 0x02, 0xB5, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, |
| 43 | 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, |
| 44 | 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x80 |
| 45 | }; |
Wan-Teh Chang | 7a7fa5c | 2020-01-25 13:56:41 -0800 | [diff] [blame] | 46 | const size_t kMetadataObuSizeMdcv = 28; |
| 47 | const uint8_t kMetadataObuMdcv[kMetadataObuSizeMdcv] = { |
Daniel Max Valenzuela | 62eab67 | 2020-01-08 12:12:47 -0800 | [diff] [blame] | 48 | 0x2A, 0x1A, 0x02, 0xB5, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, |
| 49 | 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, |
| 50 | 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x80 |
| 51 | }; |
| 52 | const size_t kMetadataObuSizeCll = 8; |
| 53 | const uint8_t kMetadataObuCll[kMetadataObuSizeCll] = { 0x2A, 0x06, 0x01, 0xB5, |
| 54 | 0x01, 0x02, 0x03, 0x80 }; |
| 55 | |
Daniel Max Valenzuela | 0a6c808 | 2019-11-04 10:52:56 -0800 | [diff] [blame] | 56 | class MetadataEncodeTest |
| 57 | : public ::libaom_test::CodecTestWithParam<libaom_test::TestMode>, |
| 58 | public ::libaom_test::EncoderTest { |
| 59 | protected: |
| 60 | MetadataEncodeTest() : EncoderTest(GET_PARAM(0)) {} |
| 61 | |
| 62 | virtual ~MetadataEncodeTest() {} |
| 63 | |
| 64 | virtual void SetUp() { |
| 65 | InitializeConfig(); |
| 66 | SetMode(GET_PARAM(1)); |
| 67 | } |
| 68 | |
| 69 | virtual void PreEncodeFrameHook(::libaom_test::VideoSource *video) { |
| 70 | aom_image_t *current_frame = video->img(); |
| 71 | if (current_frame) { |
| 72 | if (current_frame->metadata) aom_img_remove_metadata(current_frame); |
| 73 | ASSERT_EQ(aom_img_add_metadata(current_frame, OBU_METADATA_TYPE_ITUT_T35, |
Daniel Max Valenzuela | 62eab67 | 2020-01-08 12:12:47 -0800 | [diff] [blame] | 74 | kMetadataPayloadT35, 0, AOM_MIF_ANY_FRAME), |
Daniel Max Valenzuela | cc6cf05 | 2019-12-17 11:13:15 -0800 | [diff] [blame] | 75 | -1); |
Daniel Max Valenzuela | 62eab67 | 2020-01-08 12:12:47 -0800 | [diff] [blame] | 76 | ASSERT_EQ( |
| 77 | aom_img_add_metadata(current_frame, OBU_METADATA_TYPE_ITUT_T35, NULL, |
| 78 | kMetadataPayloadSizeT35, AOM_MIF_ANY_FRAME), |
| 79 | -1); |
Daniel Max Valenzuela | cc6cf05 | 2019-12-17 11:13:15 -0800 | [diff] [blame] | 80 | ASSERT_EQ(aom_img_add_metadata(current_frame, OBU_METADATA_TYPE_ITUT_T35, |
Daniel Max Valenzuela | 62eab67 | 2020-01-08 12:12:47 -0800 | [diff] [blame] | 81 | NULL, 0, AOM_MIF_ANY_FRAME), |
Daniel Max Valenzuela | cc6cf05 | 2019-12-17 11:13:15 -0800 | [diff] [blame] | 82 | -1); |
Daniel Max Valenzuela | 62eab67 | 2020-01-08 12:12:47 -0800 | [diff] [blame] | 83 | ASSERT_EQ( |
| 84 | aom_img_add_metadata(current_frame, OBU_METADATA_TYPE_ITUT_T35, |
| 85 | kMetadataPayloadT35, kMetadataPayloadSizeT35, |
| 86 | AOM_MIF_ANY_FRAME), |
| 87 | 0); |
Daniel Max Valenzuela | cc6cf05 | 2019-12-17 11:13:15 -0800 | [diff] [blame] | 88 | |
Daniel Max Valenzuela | 62eab67 | 2020-01-08 12:12:47 -0800 | [diff] [blame] | 89 | ASSERT_EQ( |
| 90 | aom_img_add_metadata(current_frame, OBU_METADATA_TYPE_HDR_MDCV, |
| 91 | kMetadataPayloadT35, kMetadataPayloadSizeT35, |
| 92 | AOM_MIF_KEY_FRAME), |
| 93 | 0); |
| 94 | |
| 95 | ASSERT_EQ( |
| 96 | aom_img_add_metadata(current_frame, OBU_METADATA_TYPE_HDR_CLL, |
| 97 | kMetadataPayloadCll, kMetadataPayloadSizeCll, |
| 98 | AOM_MIF_KEY_FRAME), |
| 99 | 0); |
Daniel Max Valenzuela | 0a6c808 | 2019-11-04 10:52:56 -0800 | [diff] [blame] | 100 | } |
| 101 | } |
| 102 | |
| 103 | virtual void FramePktHook(const aom_codec_cx_pkt_t *pkt) { |
| 104 | if (pkt->kind == AOM_CODEC_CX_FRAME_PKT) { |
Daniel Max Valenzuela | 0a6c808 | 2019-11-04 10:52:56 -0800 | [diff] [blame] | 105 | const size_t bitstream_size = pkt->data.frame.sz; |
| 106 | const uint8_t *bitstream = |
| 107 | static_cast<const uint8_t *>(pkt->data.frame.buf); |
Daniel Max Valenzuela | cc6cf05 | 2019-12-17 11:13:15 -0800 | [diff] [blame] | 108 | // look for valid metadatas in bitstream |
Daniel Max Valenzuela | 62eab67 | 2020-01-08 12:12:47 -0800 | [diff] [blame] | 109 | bool itut_t35_metadata_found = false; |
| 110 | if (bitstream_size >= kMetadataObuSizeT35) { |
| 111 | for (size_t i = 0; i <= bitstream_size - kMetadataObuSizeT35; ++i) { |
| 112 | if (memcmp(bitstream + i, kMetadataObuT35, kMetadataObuSizeT35) == |
| 113 | 0) { |
| 114 | itut_t35_metadata_found = true; |
Daniel Max Valenzuela | cc6cf05 | 2019-12-17 11:13:15 -0800 | [diff] [blame] | 115 | } |
Daniel Max Valenzuela | 0a6c808 | 2019-11-04 10:52:56 -0800 | [diff] [blame] | 116 | } |
| 117 | } |
Daniel Max Valenzuela | 62eab67 | 2020-01-08 12:12:47 -0800 | [diff] [blame] | 118 | ASSERT_EQ(itut_t35_metadata_found, 1u); |
| 119 | |
| 120 | // Testing for HDR MDCV metadata |
| 121 | bool hdr_mdcv_metadata_found = false; |
Wan-Teh Chang | 7a7fa5c | 2020-01-25 13:56:41 -0800 | [diff] [blame] | 122 | if (bitstream_size >= kMetadataObuSizeMdcv) { |
| 123 | for (size_t i = 0; i <= bitstream_size - kMetadataObuSizeMdcv; ++i) { |
| 124 | if (memcmp(bitstream + i, kMetadataObuMdcv, kMetadataObuSizeMdcv) == |
| 125 | 0) { |
| 126 | hdr_mdcv_metadata_found = true; |
| 127 | } |
Daniel Max Valenzuela | 62eab67 | 2020-01-08 12:12:47 -0800 | [diff] [blame] | 128 | } |
| 129 | } |
| 130 | ASSERT_TRUE(hdr_mdcv_metadata_found); |
| 131 | |
| 132 | // Testing for HDR CLL metadata |
| 133 | bool hdr_cll_metadata_found = false; |
Wan-Teh Chang | 7a7fa5c | 2020-01-25 13:56:41 -0800 | [diff] [blame] | 134 | if (bitstream_size >= kMetadataObuSizeCll) { |
| 135 | for (size_t i = 0; i <= bitstream_size - kMetadataObuSizeCll; ++i) { |
| 136 | if (memcmp(bitstream + i, kMetadataObuCll, kMetadataObuSizeCll) == |
| 137 | 0) { |
| 138 | hdr_cll_metadata_found = true; |
| 139 | } |
Daniel Max Valenzuela | 62eab67 | 2020-01-08 12:12:47 -0800 | [diff] [blame] | 140 | } |
| 141 | } |
| 142 | ASSERT_TRUE(hdr_cll_metadata_found); |
Daniel Max Valenzuela | 0a6c808 | 2019-11-04 10:52:56 -0800 | [diff] [blame] | 143 | } |
| 144 | } |
Daniel Max Valenzuela | cc6cf05 | 2019-12-17 11:13:15 -0800 | [diff] [blame] | 145 | |
| 146 | virtual void DecompressedFrameHook(const aom_image_t &img, |
| 147 | aom_codec_pts_t /*pts*/) { |
| 148 | ASSERT_TRUE(img.metadata != nullptr); |
| 149 | |
Daniel Max Valenzuela | 62eab67 | 2020-01-08 12:12:47 -0800 | [diff] [blame] | 150 | ASSERT_EQ(img.metadata->sz, 3u); |
Daniel Max Valenzuela | cc6cf05 | 2019-12-17 11:13:15 -0800 | [diff] [blame] | 151 | |
Daniel Max Valenzuela | 62eab67 | 2020-01-08 12:12:47 -0800 | [diff] [blame] | 152 | for (size_t i = 0; i < img.metadata->sz - 1; ++i) { |
| 153 | ASSERT_EQ(kMetadataPayloadSizeT35, img.metadata->metadata_array[i]->sz); |
| 154 | EXPECT_EQ( |
| 155 | memcmp(kMetadataPayloadT35, img.metadata->metadata_array[i]->payload, |
| 156 | kMetadataPayloadSizeT35), |
| 157 | 0); |
| 158 | } |
Daniel Max Valenzuela | cc6cf05 | 2019-12-17 11:13:15 -0800 | [diff] [blame] | 159 | |
Daniel Max Valenzuela | 62eab67 | 2020-01-08 12:12:47 -0800 | [diff] [blame] | 160 | ASSERT_EQ(kMetadataPayloadSizeCll, img.metadata->metadata_array[2]->sz); |
| 161 | EXPECT_EQ( |
| 162 | memcmp(kMetadataPayloadCll, img.metadata->metadata_array[2]->payload, |
| 163 | kMetadataPayloadSizeCll), |
| 164 | 0); |
Daniel Max Valenzuela | cc6cf05 | 2019-12-17 11:13:15 -0800 | [diff] [blame] | 165 | } |
Daniel Max Valenzuela | 0a6c808 | 2019-11-04 10:52:56 -0800 | [diff] [blame] | 166 | }; |
| 167 | |
| 168 | TEST_P(MetadataEncodeTest, TestMetadataEncoding) { |
| 169 | ::libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288, |
| 170 | 30, 1, 0, 5); |
| 171 | init_flags_ = AOM_CODEC_USE_PSNR; |
| 172 | |
| 173 | cfg_.g_w = 352; |
| 174 | cfg_.g_h = 288; |
| 175 | |
| 176 | cfg_.rc_buf_initial_sz = 500; |
| 177 | cfg_.rc_buf_optimal_sz = 600; |
| 178 | cfg_.rc_buf_sz = 1000; |
Urvang Joshi | 457d27b | 2020-07-08 11:07:50 -0700 | [diff] [blame] | 179 | cfg_.rc_min_quantizer = 8; |
Debargha Mukherjee | 43d7655 | 2021-04-19 18:51:21 -0700 | [diff] [blame] | 180 | #if CONFIG_EXTQUANT |
| 181 | cfg_.rc_max_quantizer = 164; |
| 182 | #else |
Urvang Joshi | 457d27b | 2020-07-08 11:07:50 -0700 | [diff] [blame] | 183 | cfg_.rc_max_quantizer = 224; |
Debargha Mukherjee | 43d7655 | 2021-04-19 18:51:21 -0700 | [diff] [blame] | 184 | #endif // CONFIG_EXTQUANT |
Daniel Max Valenzuela | 0a6c808 | 2019-11-04 10:52:56 -0800 | [diff] [blame] | 185 | cfg_.rc_undershoot_pct = 50; |
| 186 | cfg_.rc_overshoot_pct = 50; |
| 187 | cfg_.rc_end_usage = AOM_CBR; |
| 188 | cfg_.kf_mode = AOM_KF_AUTO; |
| 189 | cfg_.g_lag_in_frames = 1; |
| 190 | cfg_.kf_min_dist = cfg_.kf_max_dist = 3000; |
| 191 | // Enable dropped frames. |
| 192 | cfg_.rc_dropframe_thresh = 1; |
| 193 | // Disable error_resilience mode. |
| 194 | cfg_.g_error_resilient = 0; |
| 195 | // Run at low bitrate. |
| 196 | cfg_.rc_target_bitrate = 40; |
| 197 | |
| 198 | ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); |
| 199 | } |
| 200 | |
chiyotsai | 9dfac72 | 2020-07-07 17:43:02 -0700 | [diff] [blame] | 201 | AV1_INSTANTIATE_TEST_SUITE(MetadataEncodeTest, |
| 202 | ::testing::Values(::libaom_test::kOnePassGood)); |
Daniel Max Valenzuela | 0a6c808 | 2019-11-04 10:52:56 -0800 | [diff] [blame] | 203 | |
| 204 | #endif // CONFIG_AV1_ENCODER |
| 205 | } // namespace |
| 206 | |
| 207 | TEST(MetadataTest, MetadataAllocation) { |
Daniel Max Valenzuela | 62eab67 | 2020-01-08 12:12:47 -0800 | [diff] [blame] | 208 | aom_metadata_t *metadata = |
| 209 | aom_img_metadata_alloc(OBU_METADATA_TYPE_ITUT_T35, kMetadataPayloadT35, |
| 210 | kMetadataPayloadSizeT35, AOM_MIF_ANY_FRAME); |
Daniel Max Valenzuela | 0a6c808 | 2019-11-04 10:52:56 -0800 | [diff] [blame] | 211 | ASSERT_NE(metadata, nullptr); |
Wan-Teh Chang | 7a3853e | 2019-11-12 11:53:47 -0800 | [diff] [blame] | 212 | aom_img_metadata_free(metadata); |
Daniel Max Valenzuela | 0a6c808 | 2019-11-04 10:52:56 -0800 | [diff] [blame] | 213 | } |
| 214 | |
| 215 | TEST(MetadataTest, MetadataArrayAllocation) { |
| 216 | aom_metadata_array_t *metadata_array = aom_img_metadata_array_alloc(2); |
| 217 | ASSERT_NE(metadata_array, nullptr); |
| 218 | |
Daniel Max Valenzuela | 62eab67 | 2020-01-08 12:12:47 -0800 | [diff] [blame] | 219 | metadata_array->metadata_array[0] = |
| 220 | aom_img_metadata_alloc(OBU_METADATA_TYPE_ITUT_T35, kMetadataPayloadT35, |
| 221 | kMetadataPayloadSizeT35, AOM_MIF_ANY_FRAME); |
| 222 | metadata_array->metadata_array[1] = |
| 223 | aom_img_metadata_alloc(OBU_METADATA_TYPE_ITUT_T35, kMetadataPayloadT35, |
| 224 | kMetadataPayloadSizeT35, AOM_MIF_ANY_FRAME); |
Daniel Max Valenzuela | 0a6c808 | 2019-11-04 10:52:56 -0800 | [diff] [blame] | 225 | |
Wan-Teh Chang | 7a3853e | 2019-11-12 11:53:47 -0800 | [diff] [blame] | 226 | aom_img_metadata_array_free(metadata_array); |
Daniel Max Valenzuela | 0a6c808 | 2019-11-04 10:52:56 -0800 | [diff] [blame] | 227 | } |
| 228 | |
| 229 | TEST(MetadataTest, AddMetadataToImage) { |
| 230 | aom_image_t image; |
| 231 | image.metadata = NULL; |
| 232 | |
| 233 | ASSERT_EQ(aom_img_add_metadata(&image, OBU_METADATA_TYPE_ITUT_T35, |
Daniel Max Valenzuela | 62eab67 | 2020-01-08 12:12:47 -0800 | [diff] [blame] | 234 | kMetadataPayloadT35, kMetadataPayloadSizeT35, |
| 235 | AOM_MIF_ANY_FRAME), |
Daniel Max Valenzuela | 0a6c808 | 2019-11-04 10:52:56 -0800 | [diff] [blame] | 236 | 0); |
Wan-Teh Chang | 7a3853e | 2019-11-12 11:53:47 -0800 | [diff] [blame] | 237 | aom_img_metadata_array_free(image.metadata); |
Daniel Max Valenzuela | 62eab67 | 2020-01-08 12:12:47 -0800 | [diff] [blame] | 238 | EXPECT_EQ(aom_img_add_metadata(NULL, OBU_METADATA_TYPE_ITUT_T35, |
| 239 | kMetadataPayloadT35, kMetadataPayloadSizeT35, |
| 240 | AOM_MIF_ANY_FRAME), |
Daniel Max Valenzuela | 0a6c808 | 2019-11-04 10:52:56 -0800 | [diff] [blame] | 241 | -1); |
| 242 | } |
| 243 | |
| 244 | TEST(MetadataTest, RemoveMetadataFromImage) { |
| 245 | aom_image_t image; |
| 246 | image.metadata = NULL; |
| 247 | |
| 248 | ASSERT_EQ(aom_img_add_metadata(&image, OBU_METADATA_TYPE_ITUT_T35, |
Daniel Max Valenzuela | 62eab67 | 2020-01-08 12:12:47 -0800 | [diff] [blame] | 249 | kMetadataPayloadT35, kMetadataPayloadSizeT35, |
| 250 | AOM_MIF_ANY_FRAME), |
Daniel Max Valenzuela | 0a6c808 | 2019-11-04 10:52:56 -0800 | [diff] [blame] | 251 | 0); |
Wan-Teh Chang | 7a3853e | 2019-11-12 11:53:47 -0800 | [diff] [blame] | 252 | aom_img_remove_metadata(&image); |
| 253 | aom_img_remove_metadata(NULL); |
Daniel Max Valenzuela | 0a6c808 | 2019-11-04 10:52:56 -0800 | [diff] [blame] | 254 | } |
| 255 | |
| 256 | TEST(MetadataTest, CopyMetadataToFrameBuffer) { |
| 257 | YV12_BUFFER_CONFIG yvBuf; |
| 258 | yvBuf.metadata = NULL; |
| 259 | |
| 260 | aom_metadata_array_t *metadata_array = aom_img_metadata_array_alloc(1); |
| 261 | ASSERT_NE(metadata_array, nullptr); |
| 262 | |
Daniel Max Valenzuela | 62eab67 | 2020-01-08 12:12:47 -0800 | [diff] [blame] | 263 | metadata_array->metadata_array[0] = |
| 264 | aom_img_metadata_alloc(OBU_METADATA_TYPE_ITUT_T35, kMetadataPayloadT35, |
| 265 | kMetadataPayloadSizeT35, AOM_MIF_ANY_FRAME); |
Daniel Max Valenzuela | 0a6c808 | 2019-11-04 10:52:56 -0800 | [diff] [blame] | 266 | |
| 267 | // Metadata_array |
| 268 | int status = aom_copy_metadata_to_frame_buffer(&yvBuf, metadata_array); |
| 269 | EXPECT_EQ(status, 0); |
| 270 | status = aom_copy_metadata_to_frame_buffer(NULL, metadata_array); |
| 271 | EXPECT_EQ(status, -1); |
Wan-Teh Chang | 7a3853e | 2019-11-12 11:53:47 -0800 | [diff] [blame] | 272 | aom_img_metadata_array_free(metadata_array); |
Daniel Max Valenzuela | 0a6c808 | 2019-11-04 10:52:56 -0800 | [diff] [blame] | 273 | |
| 274 | // Metadata_array_2 |
| 275 | aom_metadata_array_t *metadata_array_2 = aom_img_metadata_array_alloc(0); |
| 276 | ASSERT_NE(metadata_array_2, nullptr); |
| 277 | status = aom_copy_metadata_to_frame_buffer(&yvBuf, metadata_array_2); |
| 278 | EXPECT_EQ(status, -1); |
Wan-Teh Chang | 7a3853e | 2019-11-12 11:53:47 -0800 | [diff] [blame] | 279 | aom_img_metadata_array_free(metadata_array_2); |
Daniel Max Valenzuela | 0a6c808 | 2019-11-04 10:52:56 -0800 | [diff] [blame] | 280 | |
| 281 | // YV12_BUFFER_CONFIG |
| 282 | status = aom_copy_metadata_to_frame_buffer(&yvBuf, NULL); |
| 283 | EXPECT_EQ(status, -1); |
Wan-Teh Chang | 7a3853e | 2019-11-12 11:53:47 -0800 | [diff] [blame] | 284 | aom_remove_metadata_from_frame_buffer(&yvBuf); |
| 285 | aom_remove_metadata_from_frame_buffer(NULL); |
Daniel Max Valenzuela | 0a6c808 | 2019-11-04 10:52:56 -0800 | [diff] [blame] | 286 | } |
Daniel Max Valenzuela | cc6cf05 | 2019-12-17 11:13:15 -0800 | [diff] [blame] | 287 | |
| 288 | TEST(MetadataTest, GetMetadataFromImage) { |
| 289 | aom_image_t image; |
| 290 | image.metadata = NULL; |
| 291 | |
| 292 | ASSERT_EQ(aom_img_add_metadata(&image, OBU_METADATA_TYPE_ITUT_T35, |
Daniel Max Valenzuela | 62eab67 | 2020-01-08 12:12:47 -0800 | [diff] [blame] | 293 | kMetadataPayloadT35, kMetadataPayloadSizeT35, |
| 294 | AOM_MIF_ANY_FRAME), |
Daniel Max Valenzuela | cc6cf05 | 2019-12-17 11:13:15 -0800 | [diff] [blame] | 295 | 0); |
| 296 | |
| 297 | EXPECT_TRUE(aom_img_get_metadata(NULL, 0) == NULL); |
| 298 | EXPECT_TRUE(aom_img_get_metadata(&image, 1u) == NULL); |
| 299 | EXPECT_TRUE(aom_img_get_metadata(&image, 10u) == NULL); |
| 300 | |
| 301 | const aom_metadata_t *metadata = aom_img_get_metadata(&image, 0); |
| 302 | ASSERT_TRUE(metadata != NULL); |
Daniel Max Valenzuela | 62eab67 | 2020-01-08 12:12:47 -0800 | [diff] [blame] | 303 | ASSERT_EQ(metadata->sz, kMetadataPayloadSizeT35); |
| 304 | EXPECT_EQ( |
| 305 | memcmp(kMetadataPayloadT35, metadata->payload, kMetadataPayloadSizeT35), |
| 306 | 0); |
Daniel Max Valenzuela | cc6cf05 | 2019-12-17 11:13:15 -0800 | [diff] [blame] | 307 | |
| 308 | aom_img_metadata_array_free(image.metadata); |
| 309 | } |
| 310 | |
| 311 | TEST(MetadataTest, ReadMetadatasFromImage) { |
| 312 | aom_image_t image; |
| 313 | image.metadata = NULL; |
| 314 | |
| 315 | uint32_t types[3]; |
| 316 | types[0] = OBU_METADATA_TYPE_ITUT_T35; |
| 317 | types[1] = OBU_METADATA_TYPE_HDR_CLL; |
| 318 | types[2] = OBU_METADATA_TYPE_HDR_MDCV; |
| 319 | |
Daniel Max Valenzuela | 62eab67 | 2020-01-08 12:12:47 -0800 | [diff] [blame] | 320 | ASSERT_EQ(aom_img_add_metadata(&image, types[0], kMetadataPayloadT35, |
| 321 | kMetadataPayloadSizeT35, AOM_MIF_ANY_FRAME), |
| 322 | 0); |
| 323 | ASSERT_EQ(aom_img_add_metadata(&image, types[1], kMetadataPayloadT35, |
| 324 | kMetadataPayloadSizeT35, AOM_MIF_KEY_FRAME), |
| 325 | 0); |
| 326 | ASSERT_EQ(aom_img_add_metadata(&image, types[2], kMetadataPayloadT35, |
| 327 | kMetadataPayloadSizeT35, AOM_MIF_KEY_FRAME), |
| 328 | 0); |
Daniel Max Valenzuela | cc6cf05 | 2019-12-17 11:13:15 -0800 | [diff] [blame] | 329 | |
| 330 | size_t number_metadata = aom_img_num_metadata(&image); |
| 331 | ASSERT_EQ(number_metadata, 3u); |
| 332 | for (size_t i = 0; i < number_metadata; ++i) { |
| 333 | const aom_metadata_t *metadata = aom_img_get_metadata(&image, i); |
| 334 | ASSERT_TRUE(metadata != NULL); |
| 335 | ASSERT_EQ(metadata->type, types[i]); |
Daniel Max Valenzuela | 62eab67 | 2020-01-08 12:12:47 -0800 | [diff] [blame] | 336 | ASSERT_EQ(metadata->sz, kMetadataPayloadSizeT35); |
| 337 | EXPECT_EQ( |
| 338 | memcmp(kMetadataPayloadT35, metadata->payload, kMetadataPayloadSizeT35), |
| 339 | 0); |
Daniel Max Valenzuela | cc6cf05 | 2019-12-17 11:13:15 -0800 | [diff] [blame] | 340 | } |
| 341 | aom_img_metadata_array_free(image.metadata); |
| 342 | } |