| /* |
| * Copyright (c) 2021, Alliance for Open Media. All rights reserved |
| * |
| * This source code is subject to the terms of the BSD 3-Clause Clear License |
| * and the Alliance for Open Media Patent License 1.0. If the BSD 3-Clause Clear |
| * License was not distributed with this source code in the LICENSE file, you |
| * can obtain it at aomedia.org/license/software-license/bsd-3-c-c/. If the |
| * Alliance for Open Media Patent License 1.0 was not distributed with this |
| * source code in the PATENTS file, you can obtain it at |
| * aomedia.org/license/patent-license/. |
| */ |
| |
| #include <cstdlib> |
| |
| #include "third_party/googletest/src/googletest/include/gtest/gtest.h" |
| |
| #include "config/aom_config.h" |
| |
| #include "aom/aomcx.h" |
| #include "aom/aom_encoder.h" |
| |
| namespace { |
| |
| TEST(EncodeAPI, InvalidParams) { |
| uint8_t buf[1] = { 0 }; |
| aom_image_t img; |
| aom_codec_ctx_t enc; |
| aom_codec_enc_cfg_t cfg; |
| |
| EXPECT_EQ(&img, aom_img_wrap(&img, AOM_IMG_FMT_I420, 1, 1, 1, buf)); |
| |
| EXPECT_EQ(AOM_CODEC_INVALID_PARAM, aom_codec_enc_init(NULL, NULL, NULL, 0)); |
| EXPECT_EQ(AOM_CODEC_INVALID_PARAM, aom_codec_enc_init(&enc, NULL, NULL, 0)); |
| EXPECT_EQ(AOM_CODEC_INVALID_PARAM, aom_codec_encode(NULL, NULL, 0, 0, 0)); |
| EXPECT_EQ(AOM_CODEC_INVALID_PARAM, aom_codec_encode(NULL, &img, 0, 0, 0)); |
| EXPECT_EQ(AOM_CODEC_INVALID_PARAM, aom_codec_destroy(NULL)); |
| EXPECT_EQ(AOM_CODEC_INVALID_PARAM, |
| aom_codec_enc_config_default(NULL, NULL, 0)); |
| EXPECT_EQ(AOM_CODEC_INVALID_PARAM, |
| aom_codec_enc_config_default(NULL, &cfg, 0)); |
| EXPECT_TRUE(aom_codec_error(NULL) != NULL); |
| |
| aom_codec_iface_t *iface = aom_codec_av1_cx(); |
| SCOPED_TRACE(aom_codec_iface_name(iface)); |
| EXPECT_EQ(AOM_CODEC_INVALID_PARAM, aom_codec_enc_init(NULL, iface, NULL, 0)); |
| EXPECT_EQ(AOM_CODEC_INVALID_PARAM, aom_codec_enc_init(&enc, iface, NULL, 0)); |
| EXPECT_EQ(AOM_CODEC_INVALID_PARAM, |
| aom_codec_enc_config_default(iface, &cfg, 2)); |
| EXPECT_EQ(AOM_CODEC_OK, aom_codec_enc_config_default(iface, &cfg, 0)); |
| EXPECT_EQ(AOM_CODEC_OK, aom_codec_enc_init(&enc, iface, &cfg, 0)); |
| EXPECT_EQ(NULL, aom_codec_get_global_headers(NULL)); |
| |
| aom_fixed_buf_t *glob_headers = aom_codec_get_global_headers(&enc); |
| EXPECT_TRUE(glob_headers->buf != NULL); |
| if (glob_headers) { |
| free(glob_headers->buf); |
| free(glob_headers); |
| } |
| EXPECT_EQ(AOM_CODEC_OK, aom_codec_encode(&enc, NULL, 0, 0, 0)); |
| EXPECT_EQ(AOM_CODEC_OK, aom_codec_destroy(&enc)); |
| } |
| |
| TEST(EncodeAPI, InvalidControlId) { |
| aom_codec_iface_t *iface = aom_codec_av1_cx(); |
| aom_codec_ctx_t enc; |
| aom_codec_enc_cfg_t cfg; |
| EXPECT_EQ(AOM_CODEC_OK, aom_codec_enc_config_default(iface, &cfg, 0)); |
| EXPECT_EQ(AOM_CODEC_OK, aom_codec_enc_init(&enc, iface, &cfg, 0)); |
| EXPECT_EQ(AOM_CODEC_ERROR, aom_codec_control(&enc, -1, 0)); |
| EXPECT_EQ(AOM_CODEC_INVALID_PARAM, aom_codec_control(&enc, 0, 0)); |
| EXPECT_EQ(AOM_CODEC_OK, aom_codec_destroy(&enc)); |
| } |
| |
| TEST(EncodeAPI, EncodeOddWidthHeight420) { |
| constexpr unsigned int kWidth = 9; |
| constexpr unsigned kHeight = 9; |
| uint8_t buf[3 * (kWidth + 1) * (kHeight + 1)] = { 0 }; |
| aom_image_t img; |
| EXPECT_EQ(&img, |
| aom_img_wrap(&img, AOM_IMG_FMT_I420, kWidth, kHeight, 1, buf)); |
| aom_codec_iface_t *iface = aom_codec_av1_cx(); |
| aom_codec_enc_cfg_t cfg; |
| EXPECT_EQ(AOM_CODEC_OK, |
| aom_codec_enc_config_default(iface, &cfg, AOM_USAGE_GOOD_QUALITY)); |
| cfg.g_profile = 0; |
| cfg.g_bit_depth = AOM_BITS_8; |
| cfg.g_input_bit_depth = 8; |
| cfg.g_w = kWidth; |
| cfg.g_h = kHeight; |
| cfg.g_lag_in_frames = 0; |
| aom_codec_ctx_t enc; |
| EXPECT_EQ(aom_codec_enc_init(&enc, iface, &cfg, 0), AOM_CODEC_OK); |
| EXPECT_EQ(aom_codec_encode(&enc, &img, 0, 1, 0), AOM_CODEC_OK); |
| EXPECT_EQ(aom_codec_destroy(&enc), AOM_CODEC_OK); |
| } |
| |
| // A test that reproduces https://gitlab.com/AOMediaCodec/avm/-/issues/717. |
| TEST(EncodeAPI, AvmIssue717Width2) { |
| constexpr unsigned int kWidth = 2; |
| constexpr unsigned int kHeight = 34; |
| constexpr unsigned int kChromaWidth = kWidth / 2; |
| constexpr unsigned int kChromaHeight = kHeight / 2; |
| uint16_t buf[kWidth * kHeight + 2 * kChromaWidth * kChromaHeight] = { |
| // Y plane: |
| 0, 30, 30, 60, 60, 90, 90, 120, // |
| 120, 150, 150, 180, 180, 210, 210, 240, // |
| 240, 270, 270, 300, 300, 330, 330, 361, // |
| 361, 391, 391, 421, 421, 451, 451, 481, // |
| 481, 511, 511, 541, 541, 571, 571, 601, // |
| 601, 631, 631, 661, 661, 692, 692, 722, // |
| 722, 752, 752, 782, 782, 812, 812, 842, // |
| 842, 872, 872, 902, 902, 932, 932, 962, // |
| 962, 992, 992, 1023, // |
| // U plane: |
| 0, 63, 127, 191, 255, 319, 383, 447, // |
| 511, 575, 639, 703, 767, 831, 895, 959, // |
| 1023, // |
| // V plane: |
| 0, 63, 127, 191, 255, 319, 383, 447, // |
| 511, 575, 639, 703, 767, 831, 895, 959, // |
| 1023, // |
| }; |
| aom_image_t img; |
| EXPECT_EQ(&img, aom_img_wrap(&img, AOM_IMG_FMT_I42016, kWidth, kHeight, 1, |
| reinterpret_cast<uint8_t *>(buf))); |
| aom_codec_iface_t *iface = aom_codec_av1_cx(); |
| aom_codec_enc_cfg_t cfg; |
| EXPECT_EQ(AOM_CODEC_OK, |
| aom_codec_enc_config_default(iface, &cfg, AOM_USAGE_GOOD_QUALITY)); |
| cfg.rc_end_usage = AOM_Q; |
| cfg.g_profile = 0; |
| cfg.g_bit_depth = AOM_BITS_10; |
| cfg.g_input_bit_depth = 10; |
| cfg.g_w = kWidth; |
| cfg.g_h = kHeight; |
| cfg.g_limit = 1; |
| cfg.g_lag_in_frames = 0; |
| cfg.kf_mode = AOM_KF_DISABLED; |
| cfg.kf_max_dist = 0; |
| cfg.rc_min_quantizer = -48; |
| cfg.rc_max_quantizer = 255; |
| aom_codec_ctx_t enc; |
| EXPECT_EQ(aom_codec_enc_init(&enc, iface, &cfg, AOM_CODEC_USE_PSNR), |
| AOM_CODEC_OK); |
| EXPECT_EQ(aom_codec_control(&enc, AOME_SET_QP, 101), AOM_CODEC_OK); |
| EXPECT_EQ(aom_codec_control(&enc, AV1E_SET_COLOR_RANGE, AOM_CR_FULL_RANGE), |
| AOM_CODEC_OK); |
| EXPECT_EQ(aom_codec_set_option(&enc, "enable-ext-partitions", "0"), |
| AOM_CODEC_OK); |
| EXPECT_EQ(aom_codec_set_option(&enc, "enable-uneven-4way-partitions", "0"), |
| AOM_CODEC_OK); |
| EXPECT_EQ(aom_codec_control(&enc, AOME_SET_TUNING, AOM_TUNE_SSIM), |
| AOM_CODEC_OK); |
| EXPECT_EQ(aom_codec_encode(&enc, &img, 0, 1, 0), AOM_CODEC_OK); |
| const aom_codec_cx_pkt_t *pkt; |
| aom_codec_iter_t iter = nullptr; |
| while ((pkt = aom_codec_get_cx_data(&enc, &iter)) != nullptr) { |
| if (pkt->kind == AOM_CODEC_PSNR_PKT) { |
| // In commit 2f829d09, PSNR is 39.31. But in the next commit (d7372c17), |
| // PSNR drops to 20.88. |
| EXPECT_GE(pkt->data.psnr.psnr[0], 39.0); |
| } |
| } |
| EXPECT_EQ(aom_codec_encode(&enc, nullptr, 0, 1, 0), AOM_CODEC_OK); |
| iter = nullptr; |
| EXPECT_EQ(aom_codec_get_cx_data(&enc, &iter), nullptr); |
| EXPECT_EQ(aom_codec_destroy(&enc), AOM_CODEC_OK); |
| } |
| |
| // A test that reproduces https://gitlab.com/AOMediaCodec/avm/-/issues/717. |
| TEST(EncodeAPI, AvmIssue717Width4) { |
| constexpr unsigned int kWidth = 4; |
| constexpr unsigned int kHeight = 34; |
| constexpr unsigned int kChromaWidth = kWidth / 2; |
| constexpr unsigned int kChromaHeight = kHeight / 2; |
| uint16_t buf[kWidth * kHeight + 2 * kChromaWidth * kChromaHeight] = { |
| // Y plane: |
| 0, 28, 56, 85, 28, 56, 85, 113, // |
| 56, 85, 113, 142, 85, 113, 142, 170, // |
| 113, 142, 170, 198, 142, 170, 198, 227, // |
| 170, 198, 227, 255, 198, 227, 255, 284, // |
| 227, 255, 284, 312, 255, 284, 312, 341, // |
| 284, 312, 341, 369, 312, 341, 369, 397, // |
| 341, 369, 397, 426, 369, 397, 426, 454, // |
| 397, 426, 454, 483, 426, 454, 483, 511, // |
| 454, 483, 511, 539, 483, 511, 539, 568, // |
| 511, 539, 568, 596, 539, 568, 596, 625, // |
| 568, 596, 625, 653, 596, 625, 653, 682, // |
| 625, 653, 682, 710, 653, 682, 710, 738, // |
| 682, 710, 738, 767, 710, 738, 767, 795, // |
| 738, 767, 795, 824, 767, 795, 824, 852, // |
| 795, 824, 852, 880, 824, 852, 880, 909, // |
| 852, 880, 909, 937, 880, 909, 937, 966, // |
| 909, 937, 966, 994, 937, 966, 994, 1023, // |
| // U plane: |
| 0, 60, 60, 120, 120, 180, 180, 240, // |
| 240, 300, 300, 361, 361, 421, 421, 481, // |
| 481, 541, 541, 601, 601, 661, 661, 722, // |
| 722, 782, 782, 842, 842, 902, 902, 962, // |
| 962, 1023, // |
| // V plane: |
| 0, 60, 60, 120, 120, 180, 180, 240, // |
| 240, 300, 300, 361, 361, 421, 421, 481, // |
| 481, 541, 541, 601, 601, 661, 661, 722, // |
| 722, 782, 782, 842, 842, 902, 902, 962, // |
| 962, 1023, // |
| }; |
| aom_image_t img; |
| EXPECT_EQ(&img, aom_img_wrap(&img, AOM_IMG_FMT_I42016, kWidth, kHeight, 1, |
| reinterpret_cast<uint8_t *>(buf))); |
| aom_codec_iface_t *iface = aom_codec_av1_cx(); |
| aom_codec_enc_cfg_t cfg; |
| EXPECT_EQ(AOM_CODEC_OK, |
| aom_codec_enc_config_default(iface, &cfg, AOM_USAGE_GOOD_QUALITY)); |
| cfg.rc_end_usage = AOM_Q; |
| cfg.g_profile = 0; |
| cfg.g_bit_depth = AOM_BITS_10; |
| cfg.g_input_bit_depth = 10; |
| cfg.g_w = kWidth; |
| cfg.g_h = kHeight; |
| cfg.g_limit = 1; |
| cfg.g_lag_in_frames = 0; |
| cfg.kf_mode = AOM_KF_DISABLED; |
| cfg.kf_max_dist = 0; |
| cfg.rc_min_quantizer = -48; |
| cfg.rc_max_quantizer = 255; |
| aom_codec_ctx_t enc; |
| EXPECT_EQ(aom_codec_enc_init(&enc, iface, &cfg, AOM_CODEC_USE_PSNR), |
| AOM_CODEC_OK); |
| EXPECT_EQ(aom_codec_control(&enc, AOME_SET_QP, 101), AOM_CODEC_OK); |
| EXPECT_EQ(aom_codec_control(&enc, AV1E_SET_COLOR_RANGE, AOM_CR_FULL_RANGE), |
| AOM_CODEC_OK); |
| EXPECT_EQ(aom_codec_set_option(&enc, "enable-ext-partitions", "0"), |
| AOM_CODEC_OK); |
| EXPECT_EQ(aom_codec_set_option(&enc, "enable-uneven-4way-partitions", "0"), |
| AOM_CODEC_OK); |
| EXPECT_EQ(aom_codec_control(&enc, AOME_SET_TUNING, AOM_TUNE_SSIM), |
| AOM_CODEC_OK); |
| EXPECT_EQ(aom_codec_encode(&enc, &img, 0, 1, 0), AOM_CODEC_OK); |
| const aom_codec_cx_pkt_t *pkt; |
| aom_codec_iter_t iter = nullptr; |
| while ((pkt = aom_codec_get_cx_data(&enc, &iter)) != nullptr) { |
| if (pkt->kind == AOM_CODEC_PSNR_PKT) { |
| // In commit 2f829d09, PSNR is 39.26. But in the next commit (d7372c17), |
| // PSNR drops to 28.96. |
| EXPECT_GE(pkt->data.psnr.psnr[0], 39.0); |
| } |
| } |
| EXPECT_EQ(aom_codec_encode(&enc, nullptr, 0, 1, 0), AOM_CODEC_OK); |
| iter = nullptr; |
| EXPECT_EQ(aom_codec_get_cx_data(&enc, &iter), nullptr); |
| EXPECT_EQ(aom_codec_destroy(&enc), AOM_CODEC_OK); |
| } |
| |
| TEST(EncodeAPI, GdfOptimizer8x8) { |
| constexpr unsigned int kWidth = 8; |
| constexpr unsigned kHeight = 8; |
| uint8_t buf[3 * kWidth * kHeight] = { 0 }; |
| aom_image_t img; |
| EXPECT_EQ(&img, |
| aom_img_wrap(&img, AOM_IMG_FMT_I444, kWidth, kHeight, 1, buf)); |
| aom_codec_iface_t *iface = aom_codec_av1_cx(); |
| aom_codec_enc_cfg_t cfg; |
| EXPECT_EQ(AOM_CODEC_OK, |
| aom_codec_enc_config_default(iface, &cfg, AOM_USAGE_GOOD_QUALITY)); |
| cfg.g_profile = 1; |
| cfg.g_bit_depth = AOM_BITS_8; |
| cfg.g_input_bit_depth = 8; |
| cfg.g_w = kWidth; |
| cfg.g_h = kHeight; |
| cfg.g_lag_in_frames = 0; |
| aom_codec_ctx_t enc; |
| EXPECT_EQ(aom_codec_enc_init(&enc, iface, &cfg, 0), AOM_CODEC_OK); |
| EXPECT_EQ(aom_codec_encode(&enc, &img, 0, 1, 0), AOM_CODEC_OK); |
| EXPECT_EQ(aom_codec_destroy(&enc), AOM_CODEC_OK); |
| } |
| |
| // A test that reproduces https://gitlab.com/AOMediaCodec/avm/-/issues/749. |
| TEST(EncodeAPI, AvmIssue749) { |
| constexpr unsigned int kWidth = 12; |
| constexpr unsigned int kHeight = 34; |
| constexpr unsigned int kChromaWidth = kWidth / 2; |
| constexpr unsigned int kChromaHeight = kHeight / 2; |
| uint8_t buf[kWidth * kHeight + 2 * kChromaWidth * kChromaHeight] = { |
| // Y plane: |
| 0x00, 0x05, 0x0b, 0x11, 0x17, 0x1c, 0x22, 0x28, 0x2e, 0x34, 0x39, 0x3f, |
| 0x05, 0x0b, 0x11, 0x17, 0x1c, 0x22, 0x28, 0x2e, 0x34, 0x39, 0x3f, 0x45, |
| 0x0b, 0x11, 0x17, 0x1c, 0x22, 0x28, 0x2e, 0x34, 0x39, 0x3f, 0x45, 0x4b, |
| 0x11, 0x17, 0x1c, 0x22, 0x28, 0x2e, 0x34, 0x39, 0x3f, 0x45, 0x4b, 0x51, |
| 0x17, 0x1c, 0x22, 0x28, 0x2e, 0x34, 0x39, 0x3f, 0x45, 0x4b, 0x51, 0x56, |
| 0x1c, 0x22, 0x28, 0x2e, 0x34, 0x39, 0x3f, 0x45, 0x4b, 0x51, 0x56, 0x5c, |
| 0x22, 0x28, 0x2e, 0x34, 0x39, 0x3f, 0x45, 0x4b, 0x51, 0x56, 0x5c, 0x62, |
| 0x28, 0x2e, 0x34, 0x39, 0x3f, 0x45, 0x4b, 0x51, 0x56, 0x5c, 0x62, 0x68, |
| 0x2e, 0x34, 0x39, 0x3f, 0x45, 0x4b, 0x51, 0x56, 0x5c, 0x62, 0x68, 0x6e, |
| 0x34, 0x39, 0x3f, 0x45, 0x4b, 0x51, 0x56, 0x5c, 0x62, 0x68, 0x6e, 0x73, |
| 0x39, 0x3f, 0x45, 0x4b, 0x51, 0x56, 0x5c, 0x62, 0x68, 0x6e, 0x73, 0x79, |
| 0x3f, 0x45, 0x4b, 0x51, 0x56, 0x5c, 0x62, 0x68, 0x6e, 0x73, 0x79, 0x7f, |
| 0x45, 0x4b, 0x51, 0x56, 0x5c, 0x62, 0x68, 0x6e, 0x73, 0x79, 0x7f, 0x85, |
| 0x4b, 0x51, 0x56, 0x5c, 0x62, 0x68, 0x6e, 0x73, 0x79, 0x7f, 0x85, 0x8b, |
| 0x51, 0x56, 0x5c, 0x62, 0x68, 0x6e, 0x73, 0x79, 0x7f, 0x85, 0x8b, 0x90, |
| 0x56, 0x5c, 0x62, 0x68, 0x6e, 0x73, 0x79, 0x7f, 0x85, 0x8b, 0x90, 0x96, |
| 0x5c, 0x62, 0x68, 0x6e, 0x73, 0x79, 0x7f, 0x85, 0x8b, 0x90, 0x96, 0x9c, |
| 0x62, 0x68, 0x6e, 0x73, 0x79, 0x7f, 0x85, 0x8b, 0x90, 0x96, 0x9c, 0xa2, |
| 0x68, 0x6e, 0x73, 0x79, 0x7f, 0x85, 0x8b, 0x90, 0x96, 0x9c, 0xa2, 0xa8, |
| 0x6e, 0x73, 0x79, 0x7f, 0x85, 0x8b, 0x90, 0x96, 0x9c, 0xa2, 0xa8, 0xad, |
| 0x73, 0x79, 0x7f, 0x85, 0x8b, 0x90, 0x96, 0x9c, 0xa2, 0xa8, 0xad, 0xb3, |
| 0x79, 0x7f, 0x85, 0x8b, 0x90, 0x96, 0x9c, 0xa2, 0xa8, 0xad, 0xb3, 0xb9, |
| 0x7f, 0x85, 0x8b, 0x90, 0x96, 0x9c, 0xa2, 0xa8, 0xad, 0xb3, 0xb9, 0xbf, |
| 0x85, 0x8b, 0x90, 0x96, 0x9c, 0xa2, 0xa8, 0xad, 0xb3, 0xb9, 0xbf, 0xc5, |
| 0x8b, 0x90, 0x96, 0x9c, 0xa2, 0xa8, 0xad, 0xb3, 0xb9, 0xbf, 0xc5, 0xca, |
| 0x90, 0x96, 0x9c, 0xa2, 0xa8, 0xad, 0xb3, 0xb9, 0xbf, 0xc5, 0xca, 0xd0, |
| 0x96, 0x9c, 0xa2, 0xa8, 0xad, 0xb3, 0xb9, 0xbf, 0xc5, 0xca, 0xd0, 0xd6, |
| 0x9c, 0xa2, 0xa8, 0xad, 0xb3, 0xb9, 0xbf, 0xc5, 0xca, 0xd0, 0xd6, 0xdc, |
| 0xa2, 0xa8, 0xad, 0xb3, 0xb9, 0xbf, 0xc5, 0xca, 0xd0, 0xd6, 0xdc, 0xe2, |
| 0xa8, 0xad, 0xb3, 0xb9, 0xbf, 0xc5, 0xca, 0xd0, 0xd6, 0xdc, 0xe2, 0xe7, |
| 0xad, 0xb3, 0xb9, 0xbf, 0xc5, 0xca, 0xd0, 0xd6, 0xdc, 0xe2, 0xe7, 0xed, |
| 0xb3, 0xb9, 0xbf, 0xc5, 0xca, 0xd0, 0xd6, 0xdc, 0xe2, 0xe7, 0xed, 0xf3, |
| 0xb9, 0xbf, 0xc5, 0xca, 0xd0, 0xd6, 0xdc, 0xe2, 0xe7, 0xed, 0xf3, 0xf9, |
| 0xbf, 0xc5, 0xca, 0xd0, 0xd6, 0xdc, 0xe2, 0xe7, 0xed, 0xf3, 0xf9, 0xff, |
| // U plane: |
| 0x00, 0x0c, 0x18, 0x24, 0x30, 0x3c, 0x0c, 0x18, 0x24, 0x30, 0x3c, 0x48, |
| 0x18, 0x24, 0x30, 0x3c, 0x48, 0x55, 0x24, 0x30, 0x3c, 0x48, 0x55, 0x61, |
| 0x30, 0x3c, 0x48, 0x55, 0x61, 0x6d, 0x3c, 0x48, 0x55, 0x61, 0x6d, 0x79, |
| 0x48, 0x55, 0x61, 0x6d, 0x79, 0x85, 0x55, 0x61, 0x6d, 0x79, 0x85, 0x91, |
| 0x61, 0x6d, 0x79, 0x85, 0x91, 0x9d, 0x6d, 0x79, 0x85, 0x91, 0x9d, 0xaa, |
| 0x79, 0x85, 0x91, 0x9d, 0xaa, 0xb6, 0x85, 0x91, 0x9d, 0xaa, 0xb6, 0xc2, |
| 0x91, 0x9d, 0xaa, 0xb6, 0xc2, 0xce, 0x9d, 0xaa, 0xb6, 0xc2, 0xce, 0xda, |
| 0xaa, 0xb6, 0xc2, 0xce, 0xda, 0xe6, 0xb6, 0xc2, 0xce, 0xda, 0xe6, 0xf2, |
| 0xc2, 0xce, 0xda, 0xe6, 0xf2, 0xff, |
| // V plane: |
| 0x00, 0x0c, 0x18, 0x24, 0x30, 0x3c, 0x0c, 0x18, 0x24, 0x30, 0x3c, 0x48, |
| 0x18, 0x24, 0x30, 0x3c, 0x48, 0x55, 0x24, 0x30, 0x3c, 0x48, 0x55, 0x61, |
| 0x30, 0x3c, 0x48, 0x55, 0x61, 0x6d, 0x3c, 0x48, 0x55, 0x61, 0x6d, 0x79, |
| 0x48, 0x55, 0x61, 0x6d, 0x79, 0x85, 0x55, 0x61, 0x6d, 0x79, 0x85, 0x91, |
| 0x61, 0x6d, 0x79, 0x85, 0x91, 0x9d, 0x6d, 0x79, 0x85, 0x91, 0x9d, 0xaa, |
| 0x79, 0x85, 0x91, 0x9d, 0xaa, 0xb6, 0x85, 0x91, 0x9d, 0xaa, 0xb6, 0xc2, |
| 0x91, 0x9d, 0xaa, 0xb6, 0xc2, 0xce, 0x9d, 0xaa, 0xb6, 0xc2, 0xce, 0xda, |
| 0xaa, 0xb6, 0xc2, 0xce, 0xda, 0xe6, 0xb6, 0xc2, 0xce, 0xda, 0xe6, 0xf2, |
| 0xc2, 0xce, 0xda, 0xe6, 0xf2, 0xff |
| }; |
| aom_image_t img; |
| EXPECT_EQ(&img, |
| aom_img_wrap(&img, AOM_IMG_FMT_I420, kWidth, kHeight, 1, buf)); |
| aom_codec_iface_t *iface = aom_codec_av1_cx(); |
| aom_codec_enc_cfg_t cfg; |
| EXPECT_EQ(AOM_CODEC_OK, |
| aom_codec_enc_config_default(iface, &cfg, AOM_USAGE_GOOD_QUALITY)); |
| cfg.rc_end_usage = AOM_Q; |
| cfg.g_profile = 0; |
| cfg.g_bit_depth = AOM_BITS_8; |
| cfg.g_input_bit_depth = 8; |
| cfg.g_w = kWidth; |
| cfg.g_h = kHeight; |
| cfg.g_limit = 1; |
| cfg.g_lag_in_frames = 0; |
| cfg.kf_mode = AOM_KF_DISABLED; |
| cfg.kf_max_dist = 0; |
| cfg.rc_min_quantizer = 0; |
| cfg.rc_max_quantizer = 255; |
| aom_codec_ctx_t enc; |
| EXPECT_EQ(aom_codec_enc_init(&enc, iface, &cfg, AOM_CODEC_USE_PSNR), |
| AOM_CODEC_OK); |
| EXPECT_EQ(aom_codec_control(&enc, AOME_SET_QP, 127), AOM_CODEC_OK); |
| EXPECT_EQ(aom_codec_control(&enc, AV1E_SET_COLOR_RANGE, AOM_CR_FULL_RANGE), |
| AOM_CODEC_OK); |
| EXPECT_EQ(aom_codec_set_option(&enc, "enable-ext-partitions", "0"), |
| AOM_CODEC_OK); |
| EXPECT_EQ(aom_codec_set_option(&enc, "enable-uneven-4way-partitions", "0"), |
| AOM_CODEC_OK); |
| EXPECT_EQ(aom_codec_control(&enc, AOME_SET_TUNING, AOM_TUNE_SSIM), |
| AOM_CODEC_OK); |
| EXPECT_EQ(aom_codec_encode(&enc, &img, 0, 1, 0), AOM_CODEC_OK); |
| const aom_codec_cx_pkt_t *pkt; |
| aom_codec_iter_t iter = nullptr; |
| while ((pkt = aom_codec_get_cx_data(&enc, &iter)) != nullptr) { |
| if (pkt->kind == AOM_CODEC_PSNR_PKT) { |
| EXPECT_GE(pkt->data.psnr.psnr[0], 41.3); |
| } |
| } |
| EXPECT_EQ(aom_codec_encode(&enc, nullptr, 0, 1, 0), AOM_CODEC_OK); |
| iter = nullptr; |
| EXPECT_EQ(aom_codec_get_cx_data(&enc, &iter), nullptr); |
| EXPECT_EQ(aom_codec_destroy(&enc), AOM_CODEC_OK); |
| } |
| |
| } // namespace |