blob: 26f5e477e2fce2954bd858b2a841b927e812f650 [file] [log] [blame]
James Zernd36933a2019-11-21 18:57:45 -08001/*
Krishna Rapaka7319db52021-09-28 20:35:29 -07002 * Copyright (c) 2021, Alliance for Open Media. All rights reserved
James Zernd36933a2019-11-21 18:57:45 -08003 *
Vibhoothi41c6dd72021-10-12 18:48:26 +00004 * 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 Zernd36933a2019-11-21 18:57:45 -080011 */
12
Daniel Max Valenzuela0a6c8082019-11-04 10:52:56 -080013#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
26namespace {
Daniel Max Valenzuela62eab672020-01-08 12:12:47 -080027const size_t kMetadataPayloadSizeT35 = 24;
Daniel Max Valenzuelacc6cf052019-12-17 11:13:15 -080028// 0xB5 stands for the itut t35 metadata country code for the Unites States
Daniel Max Valenzuela62eab672020-01-08 12:12:47 -080029const 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
34const size_t kMetadataPayloadSizeCll = 4;
35const uint8_t kMetadataPayloadCll[kMetadataPayloadSizeCll] = { 0xB5, 0x01, 0x02,
36 0x03 };
Daniel Max Valenzuela0a6c8082019-11-04 10:52:56 -080037
38#if CONFIG_AV1_ENCODER
39
Daniel Max Valenzuela62eab672020-01-08 12:12:47 -080040const size_t kMetadataObuSizeT35 = 28;
41const 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 Chang7a7fa5c2020-01-25 13:56:41 -080046const size_t kMetadataObuSizeMdcv = 28;
47const uint8_t kMetadataObuMdcv[kMetadataObuSizeMdcv] = {
Daniel Max Valenzuela62eab672020-01-08 12:12:47 -080048 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};
52const size_t kMetadataObuSizeCll = 8;
53const uint8_t kMetadataObuCll[kMetadataObuSizeCll] = { 0x2A, 0x06, 0x01, 0xB5,
54 0x01, 0x02, 0x03, 0x80 };
55
Daniel Max Valenzuela0a6c8082019-11-04 10:52:56 -080056class 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 Valenzuela62eab672020-01-08 12:12:47 -080074 kMetadataPayloadT35, 0, AOM_MIF_ANY_FRAME),
Daniel Max Valenzuelacc6cf052019-12-17 11:13:15 -080075 -1);
Daniel Max Valenzuela62eab672020-01-08 12:12:47 -080076 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 Valenzuelacc6cf052019-12-17 11:13:15 -080080 ASSERT_EQ(aom_img_add_metadata(current_frame, OBU_METADATA_TYPE_ITUT_T35,
Daniel Max Valenzuela62eab672020-01-08 12:12:47 -080081 NULL, 0, AOM_MIF_ANY_FRAME),
Daniel Max Valenzuelacc6cf052019-12-17 11:13:15 -080082 -1);
Daniel Max Valenzuela62eab672020-01-08 12:12:47 -080083 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 Valenzuelacc6cf052019-12-17 11:13:15 -080088
Daniel Max Valenzuela62eab672020-01-08 12:12:47 -080089 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 Valenzuela0a6c8082019-11-04 10:52:56 -0800100 }
101 }
102
103 virtual void FramePktHook(const aom_codec_cx_pkt_t *pkt) {
104 if (pkt->kind == AOM_CODEC_CX_FRAME_PKT) {
Daniel Max Valenzuela0a6c8082019-11-04 10:52:56 -0800105 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 Valenzuelacc6cf052019-12-17 11:13:15 -0800108 // look for valid metadatas in bitstream
Daniel Max Valenzuela62eab672020-01-08 12:12:47 -0800109 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 Valenzuelacc6cf052019-12-17 11:13:15 -0800115 }
Daniel Max Valenzuela0a6c8082019-11-04 10:52:56 -0800116 }
117 }
Daniel Max Valenzuela62eab672020-01-08 12:12:47 -0800118 ASSERT_EQ(itut_t35_metadata_found, 1u);
119
120 // Testing for HDR MDCV metadata
121 bool hdr_mdcv_metadata_found = false;
Wan-Teh Chang7a7fa5c2020-01-25 13:56:41 -0800122 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 Valenzuela62eab672020-01-08 12:12:47 -0800128 }
129 }
130 ASSERT_TRUE(hdr_mdcv_metadata_found);
131
132 // Testing for HDR CLL metadata
133 bool hdr_cll_metadata_found = false;
Wan-Teh Chang7a7fa5c2020-01-25 13:56:41 -0800134 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 Valenzuela62eab672020-01-08 12:12:47 -0800140 }
141 }
142 ASSERT_TRUE(hdr_cll_metadata_found);
Daniel Max Valenzuela0a6c8082019-11-04 10:52:56 -0800143 }
144 }
Daniel Max Valenzuelacc6cf052019-12-17 11:13:15 -0800145
146 virtual void DecompressedFrameHook(const aom_image_t &img,
147 aom_codec_pts_t /*pts*/) {
148 ASSERT_TRUE(img.metadata != nullptr);
149
Daniel Max Valenzuela62eab672020-01-08 12:12:47 -0800150 ASSERT_EQ(img.metadata->sz, 3u);
Daniel Max Valenzuelacc6cf052019-12-17 11:13:15 -0800151
Daniel Max Valenzuela62eab672020-01-08 12:12:47 -0800152 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 Valenzuelacc6cf052019-12-17 11:13:15 -0800159
Daniel Max Valenzuela62eab672020-01-08 12:12:47 -0800160 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 Valenzuelacc6cf052019-12-17 11:13:15 -0800165 }
Daniel Max Valenzuela0a6c8082019-11-04 10:52:56 -0800166};
167
168TEST_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 Joshi457d27b2020-07-08 11:07:50 -0700179 cfg_.rc_min_quantizer = 8;
Debargha Mukherjee43d76552021-04-19 18:51:21 -0700180#if CONFIG_EXTQUANT
181 cfg_.rc_max_quantizer = 164;
182#else
Urvang Joshi457d27b2020-07-08 11:07:50 -0700183 cfg_.rc_max_quantizer = 224;
Debargha Mukherjee43d76552021-04-19 18:51:21 -0700184#endif // CONFIG_EXTQUANT
Daniel Max Valenzuela0a6c8082019-11-04 10:52:56 -0800185 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
chiyotsai9dfac722020-07-07 17:43:02 -0700201AV1_INSTANTIATE_TEST_SUITE(MetadataEncodeTest,
202 ::testing::Values(::libaom_test::kOnePassGood));
Daniel Max Valenzuela0a6c8082019-11-04 10:52:56 -0800203
204#endif // CONFIG_AV1_ENCODER
205} // namespace
206
207TEST(MetadataTest, MetadataAllocation) {
Daniel Max Valenzuela62eab672020-01-08 12:12:47 -0800208 aom_metadata_t *metadata =
209 aom_img_metadata_alloc(OBU_METADATA_TYPE_ITUT_T35, kMetadataPayloadT35,
210 kMetadataPayloadSizeT35, AOM_MIF_ANY_FRAME);
Daniel Max Valenzuela0a6c8082019-11-04 10:52:56 -0800211 ASSERT_NE(metadata, nullptr);
Wan-Teh Chang7a3853e2019-11-12 11:53:47 -0800212 aom_img_metadata_free(metadata);
Daniel Max Valenzuela0a6c8082019-11-04 10:52:56 -0800213}
214
215TEST(MetadataTest, MetadataArrayAllocation) {
216 aom_metadata_array_t *metadata_array = aom_img_metadata_array_alloc(2);
217 ASSERT_NE(metadata_array, nullptr);
218
Daniel Max Valenzuela62eab672020-01-08 12:12:47 -0800219 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 Valenzuela0a6c8082019-11-04 10:52:56 -0800225
Wan-Teh Chang7a3853e2019-11-12 11:53:47 -0800226 aom_img_metadata_array_free(metadata_array);
Daniel Max Valenzuela0a6c8082019-11-04 10:52:56 -0800227}
228
229TEST(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 Valenzuela62eab672020-01-08 12:12:47 -0800234 kMetadataPayloadT35, kMetadataPayloadSizeT35,
235 AOM_MIF_ANY_FRAME),
Daniel Max Valenzuela0a6c8082019-11-04 10:52:56 -0800236 0);
Wan-Teh Chang7a3853e2019-11-12 11:53:47 -0800237 aom_img_metadata_array_free(image.metadata);
Daniel Max Valenzuela62eab672020-01-08 12:12:47 -0800238 EXPECT_EQ(aom_img_add_metadata(NULL, OBU_METADATA_TYPE_ITUT_T35,
239 kMetadataPayloadT35, kMetadataPayloadSizeT35,
240 AOM_MIF_ANY_FRAME),
Daniel Max Valenzuela0a6c8082019-11-04 10:52:56 -0800241 -1);
242}
243
244TEST(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 Valenzuela62eab672020-01-08 12:12:47 -0800249 kMetadataPayloadT35, kMetadataPayloadSizeT35,
250 AOM_MIF_ANY_FRAME),
Daniel Max Valenzuela0a6c8082019-11-04 10:52:56 -0800251 0);
Wan-Teh Chang7a3853e2019-11-12 11:53:47 -0800252 aom_img_remove_metadata(&image);
253 aom_img_remove_metadata(NULL);
Daniel Max Valenzuela0a6c8082019-11-04 10:52:56 -0800254}
255
256TEST(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 Valenzuela62eab672020-01-08 12:12:47 -0800263 metadata_array->metadata_array[0] =
264 aom_img_metadata_alloc(OBU_METADATA_TYPE_ITUT_T35, kMetadataPayloadT35,
265 kMetadataPayloadSizeT35, AOM_MIF_ANY_FRAME);
Daniel Max Valenzuela0a6c8082019-11-04 10:52:56 -0800266
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 Chang7a3853e2019-11-12 11:53:47 -0800272 aom_img_metadata_array_free(metadata_array);
Daniel Max Valenzuela0a6c8082019-11-04 10:52:56 -0800273
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 Chang7a3853e2019-11-12 11:53:47 -0800279 aom_img_metadata_array_free(metadata_array_2);
Daniel Max Valenzuela0a6c8082019-11-04 10:52:56 -0800280
281 // YV12_BUFFER_CONFIG
282 status = aom_copy_metadata_to_frame_buffer(&yvBuf, NULL);
283 EXPECT_EQ(status, -1);
Wan-Teh Chang7a3853e2019-11-12 11:53:47 -0800284 aom_remove_metadata_from_frame_buffer(&yvBuf);
285 aom_remove_metadata_from_frame_buffer(NULL);
Daniel Max Valenzuela0a6c8082019-11-04 10:52:56 -0800286}
Daniel Max Valenzuelacc6cf052019-12-17 11:13:15 -0800287
288TEST(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 Valenzuela62eab672020-01-08 12:12:47 -0800293 kMetadataPayloadT35, kMetadataPayloadSizeT35,
294 AOM_MIF_ANY_FRAME),
Daniel Max Valenzuelacc6cf052019-12-17 11:13:15 -0800295 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 Valenzuela62eab672020-01-08 12:12:47 -0800303 ASSERT_EQ(metadata->sz, kMetadataPayloadSizeT35);
304 EXPECT_EQ(
305 memcmp(kMetadataPayloadT35, metadata->payload, kMetadataPayloadSizeT35),
306 0);
Daniel Max Valenzuelacc6cf052019-12-17 11:13:15 -0800307
308 aom_img_metadata_array_free(image.metadata);
309}
310
311TEST(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 Valenzuela62eab672020-01-08 12:12:47 -0800320 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 Valenzuelacc6cf052019-12-17 11:13:15 -0800329
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 Valenzuela62eab672020-01-08 12:12:47 -0800336 ASSERT_EQ(metadata->sz, kMetadataPayloadSizeT35);
337 EXPECT_EQ(
338 memcmp(kMetadataPayloadT35, metadata->payload, kMetadataPayloadSizeT35),
339 0);
Daniel Max Valenzuelacc6cf052019-12-17 11:13:15 -0800340 }
341 aom_img_metadata_array_free(image.metadata);
342}