blob: 95dfaf26f619628d7dbf31c9aa4004b6d3c604a6 [file] [log] [blame] [edit]
/*
* 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