Skip to content

Commit 3eeb8c1

Browse files
Add tests for more encoding cases
1 parent d0d7290 commit 3eeb8c1

File tree

4 files changed

+145
-61
lines changed

4 files changed

+145
-61
lines changed

src/codec_aom.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -675,6 +675,10 @@ static avifResult aomCodecEncodeImage(avifCodec * codec,
675675
// Tell libaom that all frames will be key frames.
676676
cfg->kf_max_dist = 0;
677677
}
678+
if ((encoder->width || encoder->height) && (cfg->g_lag_in_frames > 1)) {
679+
// libaom do not allow changing frame dimension if g_lag_in_frames > 1.
680+
cfg->g_lag_in_frames = 1;
681+
}
678682
if (encoder->maxThreads > 1) {
679683
cfg->g_threads = encoder->maxThreads;
680684
}

tests/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,11 @@ if(AVIF_ENABLE_GTEST)
8080
target_include_directories(avifalphapremtest PRIVATE ${GTEST_INCLUDE_DIRS})
8181
add_test(NAME avifalphapremtest COMMAND avifalphapremtest)
8282

83+
add_executable(avifchangedimensiontest gtest/avifchangedimensiontest.cc)
84+
target_link_libraries(avifchangedimensiontest aviftest_helpers ${GTEST_BOTH_LIBRARIES})
85+
target_include_directories(avifchangedimensiontest PRIVATE ${GTEST_INCLUDE_DIRS})
86+
add_test(NAME avifchangedimensiontest COMMAND avifchangedimensiontest)
87+
8388
add_executable(avifchangesettingtest gtest/avifchangesettingtest.cc)
8489
target_link_libraries(avifchangesettingtest aviftest_helpers ${GTEST_BOTH_LIBRARIES})
8590
target_include_directories(avifchangesettingtest PRIVATE ${GTEST_INCLUDE_DIRS})
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
// Copyright 2022 Yuan Tong. All rights reserved.
2+
// SPDX-License-Identifier: BSD-2-Clause
3+
4+
#include <map>
5+
#include <string>
6+
7+
#include "avif/avif.h"
8+
#include "aviftest_helpers.h"
9+
#include "gtest/gtest.h"
10+
11+
using testing::Bool;
12+
using testing::Combine;
13+
using testing::Values;
14+
15+
namespace libavif {
16+
namespace {
17+
18+
class ChangeDimensionTest
19+
: public testing::TestWithParam<std::tuple<
20+
/*speed=*/int, /*depth=*/int, /*maxThreads*/int, /*tiling*/ bool, /*end_usage=*/std::string,
21+
/*tune=*/std::string, /*denoise=*/bool>> {};
22+
23+
TEST_P(ChangeDimensionTest, EncodeDecode) {
24+
if (avifCodecName(AVIF_CODEC_CHOICE_AOM, AVIF_CODEC_FLAG_CAN_ENCODE) ==
25+
nullptr) {
26+
GTEST_SKIP() << "Codec unavailable, skip test.";
27+
}
28+
29+
const int speed = std::get<0>(GetParam());
30+
const int depth = std::get<1>(GetParam());
31+
const int maxThreads = std::get<2>(GetParam());
32+
const bool tiling = std::get<3>(GetParam());
33+
const std::string end_usage = std::get<4>(GetParam());
34+
const std::string tune = std::get<5>(GetParam());
35+
const bool denoise = std::get<6>(GetParam());
36+
37+
int size_small = 64;
38+
int size_display = 128;
39+
if (maxThreads > 1) {
40+
size_small = 512;
41+
size_display = 768;
42+
}
43+
44+
testutil::AvifImagePtr first = testutil::CreateImage(
45+
size_small, size_small, depth, AVIF_PIXEL_FORMAT_YUV420, AVIF_PLANES_YUV,
46+
AVIF_RANGE_FULL);
47+
ASSERT_NE(first, nullptr);
48+
testutil::FillImageGradient(first.get());
49+
50+
testutil::AvifImagePtr second = testutil::CreateImage(
51+
size_display, size_display, depth, AVIF_PIXEL_FORMAT_YUV420,
52+
AVIF_PLANES_YUV, AVIF_RANGE_FULL);
53+
ASSERT_NE(second, nullptr);
54+
testutil::FillImageGradient(second.get());
55+
56+
testutil::AvifRwData encodedAvif;
57+
58+
// Encode
59+
{
60+
testutil::AvifEncoderPtr encoder(avifEncoderCreate(), avifEncoderDestroy);
61+
ASSERT_NE(encoder, nullptr);
62+
encoder->codecChoice = AVIF_CODEC_CHOICE_AOM;
63+
encoder->speed = speed;
64+
encoder->maxThreads = maxThreads;
65+
encoder->timescale = 1;
66+
encoder->minQuantizer = 20;
67+
encoder->maxQuantizer = 40;
68+
encoder->tileRowsLog2 = (tiling ? 1 : 0);
69+
encoder->width = size_display;
70+
encoder->height = size_display;
71+
72+
avifEncoderSetCodecSpecificOption(encoder.get(), "end-usage",
73+
end_usage.c_str());
74+
if (end_usage == "q") {
75+
avifEncoderSetCodecSpecificOption(encoder.get(), "cq-level", "30");
76+
}
77+
avifEncoderSetCodecSpecificOption(encoder.get(), "tune", tune.c_str());
78+
if (denoise) {
79+
avifEncoderSetCodecSpecificOption(encoder.get(), "denoise-noise-level",
80+
"25");
81+
}
82+
83+
ASSERT_EQ(avifEncoderAddImage(encoder.get(), first.get(), 1, 0),
84+
AVIF_RESULT_OK)
85+
<< encoder->diag.error;
86+
87+
ASSERT_EQ(avifEncoderAddImage(encoder.get(), second.get(), 1, 0),
88+
AVIF_RESULT_OK)
89+
<< encoder->diag.error;
90+
91+
ASSERT_EQ(avifEncoderFinish(encoder.get(), &encodedAvif), AVIF_RESULT_OK)
92+
<< encoder->diag.error;
93+
}
94+
95+
// Decode
96+
{
97+
testutil::AvifDecoderPtr decoder(avifDecoderCreate(), avifDecoderDestroy);
98+
ASSERT_NE(decoder, nullptr);
99+
100+
avifDecoderSetIOMemory(decoder.get(), encodedAvif.data, encodedAvif.size);
101+
ASSERT_EQ(avifDecoderParse(decoder.get()), AVIF_RESULT_OK)
102+
<< decoder->diag.error;
103+
ASSERT_EQ(avifDecoderNextImage(decoder.get()), AVIF_RESULT_OK)
104+
<< decoder->diag.error;
105+
// libavif scales frames automatically.
106+
ASSERT_EQ(decoder->image->width, size_display);
107+
ASSERT_EQ(decoder->image->height, size_display);
108+
ASSERT_EQ(avifDecoderNextImage(decoder.get()), AVIF_RESULT_OK)
109+
<< decoder->diag.error;
110+
ASSERT_EQ(decoder->image->width, size_display);
111+
ASSERT_EQ(decoder->image->height, size_display);
112+
}
113+
}
114+
115+
INSTANTIATE_TEST_SUITE_P(
116+
AOM, ChangeDimensionTest,
117+
Combine(/*speed=*/Values(6, 10), // Test both GOOD_QUALITY and REALTIME
118+
/*depth=*/Values(8, 10),
119+
/*maxThreads*/Values(1),
120+
/*tiling*/ Bool(),
121+
/*end_usage=*/Values("q", "cbr"),
122+
/*tune=*/Values("ssim", "psnr"),
123+
/*denoise=*/Bool()));
124+
125+
INSTANTIATE_TEST_SUITE_P(
126+
AOMMultiThread, ChangeDimensionTest,
127+
Combine(/*speed=*/Values(6, 10), // Test both GOOD_QUALITY and REALTIME
128+
/*depth=*/Values(8, 10),
129+
/*maxThreads*/Values(8),
130+
/*tiling*/ Values(true),
131+
/*end_usage=*/Values("q"),
132+
/*tune=*/Values("ssim"),
133+
/*denoise=*/Values(true)));
134+
135+
} // namespace
136+
} // namespace libavif

tests/gtest/avifchangesettingtest.cc

Lines changed: 0 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -154,66 +154,5 @@ TEST(ChangeSettingTest, UnchangeableSetting) {
154154
AVIF_RESULT_CANNOT_CHANGE_SETTING);
155155
}
156156

157-
TEST(ChangeSettingTest, ChangeDimension) {
158-
if (avifCodecName(AVIF_CODEC_CHOICE_AOM, AVIF_CODEC_FLAG_CAN_ENCODE) ==
159-
nullptr) {
160-
GTEST_SKIP() << "Codec unavailable, skip test.";
161-
}
162-
163-
const uint32_t size_small = 256;
164-
const uint32_t size_display = 512;
165-
166-
testutil::AvifImagePtr first =
167-
testutil::CreateImage(size_small, size_small, 8, AVIF_PIXEL_FORMAT_YUV420,
168-
AVIF_PLANES_YUV, AVIF_RANGE_FULL);
169-
ASSERT_NE(first, nullptr);
170-
testutil::FillImageGradient(first.get());
171-
172-
testutil::AvifImagePtr second = testutil::CreateImage(
173-
size_display, size_display, 8, AVIF_PIXEL_FORMAT_YUV420, AVIF_PLANES_YUV,
174-
AVIF_RANGE_FULL);
175-
ASSERT_NE(second, nullptr);
176-
testutil::FillImageGradient(second.get());
177-
178-
testutil::AvifRwData encodedAvif;
179-
180-
// Encode
181-
{
182-
testutil::AvifEncoderPtr encoder(avifEncoderCreate(), avifEncoderDestroy);
183-
ASSERT_NE(encoder, nullptr);
184-
encoder->codecChoice = AVIF_CODEC_CHOICE_AOM;
185-
encoder->speed = AVIF_SPEED_FASTEST;
186-
encoder->timescale = 1;
187-
encoder->minQuantizer = 63;
188-
encoder->maxQuantizer = 63;
189-
encoder->width = size_display;
190-
encoder->height = size_display;
191-
192-
ASSERT_EQ(avifEncoderAddImage(encoder.get(), first.get(), 1, 0),
193-
AVIF_RESULT_OK);
194-
195-
ASSERT_EQ(avifEncoderAddImage(encoder.get(), second.get(), 1, 0),
196-
AVIF_RESULT_OK);
197-
198-
ASSERT_EQ(avifEncoderFinish(encoder.get(), &encodedAvif), AVIF_RESULT_OK);
199-
}
200-
201-
// Decode
202-
{
203-
testutil::AvifDecoderPtr decoder(avifDecoderCreate(), avifDecoderDestroy);
204-
ASSERT_NE(decoder, nullptr);
205-
206-
avifDecoderSetIOMemory(decoder.get(), encodedAvif.data, encodedAvif.size);
207-
ASSERT_EQ(avifDecoderParse(decoder.get()), AVIF_RESULT_OK);
208-
ASSERT_EQ(avifDecoderNextImage(decoder.get()), AVIF_RESULT_OK);
209-
// libavif scales frame automatically.
210-
ASSERT_EQ(decoder->image->width, size_display);
211-
ASSERT_EQ(decoder->image->height, size_display);
212-
ASSERT_EQ(avifDecoderNextImage(decoder.get()), AVIF_RESULT_OK);
213-
ASSERT_EQ(decoder->image->width, size_display);
214-
ASSERT_EQ(decoder->image->height, size_display);
215-
}
216-
}
217-
218157
} // namespace
219158
} // namespace libavif

0 commit comments

Comments
 (0)