2 * Copyright (c) 2016, Alliance for Open Media. All rights reserved
4 * This source code is subject to the terms of the BSD 2 Clause License and
5 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
6 * was not distributed with this source code in the LICENSE file, you can
7 * obtain it at www.aomedia.org/license/software. If the Alliance for Open
8 * Media Patent License 1.0 was not distributed with this source code in the
9 * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
11 #include "config/aom_config.h"
13 #include "third_party/googletest/src/googletest/include/gtest/gtest.h"
14 #include "test/codec_factory.h"
15 #include "test/encode_test_driver.h"
16 #include "test/i420_video_source.h"
17 #include "test/util.h"
18 #include "av1/encoder/av1_quantize.h"
19 #include "test/y4m_video_source.h"
23 const ::libaom_test::TestMode kTestMode
[] =
24 #if CONFIG_REALTIME_ONLY
25 { ::libaom_test::kRealTime
};
27 { ::libaom_test::kRealTime
, ::libaom_test::kOnePassGood
};
31 : public ::libaom_test::CodecTestWith2Params
<libaom_test::TestMode
, int>,
32 public ::libaom_test::EncoderTest
{
34 QMTest() : EncoderTest(GET_PARAM(0)) {}
35 ~QMTest() override
= default;
37 void SetUp() override
{
38 InitializeConfig(GET_PARAM(1));
39 set_cpu_used_
= GET_PARAM(2);
42 void PreEncodeFrameHook(::libaom_test::VideoSource
*video
,
43 ::libaom_test::Encoder
*encoder
) override
{
44 if (video
->frame() == 0) {
45 encoder
->Control(AOME_SET_CPUUSED
, set_cpu_used_
);
46 encoder
->Control(AV1E_SET_ENABLE_QM
, 1);
47 encoder
->Control(AV1E_SET_QM_MIN
, qm_min_
);
48 encoder
->Control(AV1E_SET_QM_MAX
, qm_max_
);
50 encoder
->Control(AOME_SET_MAX_INTRA_BITRATE_PCT
, 100);
51 if (mode_
== ::libaom_test::kRealTime
) {
52 encoder
->Control(AV1E_SET_ALLOW_WARPED_MOTION
, 0);
53 encoder
->Control(AV1E_SET_ENABLE_GLOBAL_MOTION
, 0);
54 encoder
->Control(AV1E_SET_ENABLE_OBMC
, 0);
59 void DoTest(int qm_min
, int qm_max
) {
62 cfg_
.kf_max_dist
= 12;
63 cfg_
.rc_min_quantizer
= 8;
64 cfg_
.rc_max_quantizer
= 56;
65 cfg_
.rc_end_usage
= AOM_CBR
;
66 cfg_
.g_lag_in_frames
= 6;
67 cfg_
.rc_buf_initial_sz
= 500;
68 cfg_
.rc_buf_optimal_sz
= 500;
69 cfg_
.rc_buf_sz
= 1000;
70 cfg_
.rc_target_bitrate
= 300;
71 ::libaom_test::I420VideoSource
video("hantro_collage_w352h288.yuv", 352,
73 ASSERT_NO_FATAL_FAILURE(RunLoop(&video
));
81 // encodes and decodes without a mismatch.
82 TEST_P(QMTest
, TestNoMisMatchQM1
) { DoTest(5, 9); }
84 // encodes and decodes without a mismatch.
85 TEST_P(QMTest
, TestNoMisMatchQM2
) { DoTest(0, 8); }
87 // encodes and decodes without a mismatch.
88 TEST_P(QMTest
, TestNoMisMatchQM3
) { DoTest(9, 15); }
90 AV1_INSTANTIATE_TEST_SUITE(QMTest
, ::testing::ValuesIn(kTestMode
),
91 ::testing::Range(5, 9));
93 #if !CONFIG_REALTIME_ONLY
95 const unsigned int min_q
;
96 const unsigned int max_q
;
99 const QuantParam QuantTestParams
[] = {
100 { 0, 10 }, { 0, 60 }, { 20, 35 }, { 35, 50 }, { 50, 63 }
103 std::ostream
&operator<<(std::ostream
&os
, const QuantParam
&test_arg
) {
104 return os
<< "QuantParam { min_q:" << test_arg
.min_q
105 << " max_q:" << test_arg
.max_q
<< " }";
109 * This class is used to test whether base_qindex is within min
110 * and max quantizer range configured by user.
112 class QuantizerBoundsCheckTestLarge
113 : public ::libaom_test::CodecTestWith3Params
<libaom_test::TestMode
,
114 QuantParam
, aom_rc_mode
>,
115 public ::libaom_test::EncoderTest
{
117 QuantizerBoundsCheckTestLarge()
118 : EncoderTest(GET_PARAM(0)), encoding_mode_(GET_PARAM(1)),
119 quant_param_(GET_PARAM(2)), rc_end_usage_(GET_PARAM(3)) {
120 quant_bound_violated_
= false;
122 ~QuantizerBoundsCheckTestLarge() override
= default;
124 void SetUp() override
{
125 InitializeConfig(encoding_mode_
);
126 const aom_rational timebase
= { 1, 30 };
127 cfg_
.g_timebase
= timebase
;
128 cfg_
.rc_end_usage
= rc_end_usage_
;
130 cfg_
.rc_min_quantizer
= quant_param_
.min_q
;
131 cfg_
.rc_max_quantizer
= quant_param_
.max_q
;
132 cfg_
.g_lag_in_frames
= 35;
133 if (rc_end_usage_
!= AOM_Q
) {
134 cfg_
.rc_target_bitrate
= 400;
138 bool DoDecode() const override
{ return true; }
140 void PreEncodeFrameHook(::libaom_test::VideoSource
*video
,
141 ::libaom_test::Encoder
*encoder
) override
{
142 if (video
->frame() == 0) {
143 encoder
->Control(AOME_SET_CPUUSED
, 5);
147 bool HandleDecodeResult(const aom_codec_err_t res_dec
,
148 libaom_test::Decoder
*decoder
) override
{
149 EXPECT_EQ(AOM_CODEC_OK
, res_dec
) << decoder
->DecodeError();
150 if (AOM_CODEC_OK
== res_dec
) {
151 aom_codec_ctx_t
*ctx_dec
= decoder
->GetDecoder();
152 AOM_CODEC_CONTROL_TYPECHECKED(ctx_dec
, AOMD_GET_LAST_QUANTIZER
,
154 min_bound_qindex_
= av1_quantizer_to_qindex(cfg_
.rc_min_quantizer
);
155 max_bound_qindex_
= av1_quantizer_to_qindex(cfg_
.rc_max_quantizer
);
156 if ((base_qindex_
< min_bound_qindex_
||
157 base_qindex_
> max_bound_qindex_
) &&
158 quant_bound_violated_
== false) {
159 quant_bound_violated_
= true;
162 return AOM_CODEC_OK
== res_dec
;
165 ::libaom_test::TestMode encoding_mode_
;
166 const QuantParam quant_param_
;
168 int min_bound_qindex_
;
169 int max_bound_qindex_
;
170 bool quant_bound_violated_
;
171 aom_rc_mode rc_end_usage_
;
174 TEST_P(QuantizerBoundsCheckTestLarge
, QuantizerBoundsCheckEncodeTest
) {
175 libaom_test::I420VideoSource
video("hantro_collage_w352h288.yuv", 352, 288,
176 cfg_
.g_timebase
.den
, cfg_
.g_timebase
.num
,
178 ASSERT_NO_FATAL_FAILURE(RunLoop(&video
));
179 ASSERT_EQ(quant_bound_violated_
, false);
182 AV1_INSTANTIATE_TEST_SUITE(QuantizerBoundsCheckTestLarge
,
183 ::testing::Values(::libaom_test::kOnePassGood
,
184 ::libaom_test::kTwoPassGood
),
185 ::testing::ValuesIn(QuantTestParams
),
186 ::testing::Values(AOM_Q
, AOM_VBR
, AOM_CBR
, AOM_CQ
));
187 #endif // !CONFIG_REALTIME_ONLY