11// Copyright 2022 Yuan Tong. All rights reserved.
22// SPDX-License-Identifier: BSD-2-Clause
33
4+ #include < map>
5+ #include < string>
6+
47#include " avif/avif.h"
58#include " aviftest_helpers.h"
69#include " gtest/gtest.h"
710
811namespace libavif {
912namespace {
1013
11- TEST (ChangeSettingTest, AOM) {
12- if (avifCodecName (AVIF_CODEC_CHOICE_AOM, AVIF_CODEC_FLAG_CAN_ENCODE) ==
13- nullptr ) {
14- GTEST_SKIP () << " AOM encoder unavailable, skip test." ;
14+ void TestEncodeDecode (avifCodecChoice codec,
15+ const std::map<std::string, std::string>& init_cs_options,
16+ bool can_encode, bool use_cq) {
17+ if (avifCodecName (codec, AVIF_CODEC_FLAG_CAN_ENCODE) == nullptr ) {
18+ GTEST_SKIP () << " Codec unavailable, skip test." ;
1519 }
1620
1721 const uint32_t image_size = 512 ;
1822 testutil::AvifImagePtr image =
19- testutil::CreateImage (image_size, image_size, 8 , AVIF_PIXEL_FORMAT_YUV444 ,
23+ testutil::CreateImage (image_size, image_size, 8 , AVIF_PIXEL_FORMAT_YUV420 ,
2024 AVIF_PLANES_YUV, AVIF_RANGE_FULL);
2125 ASSERT_NE (image, nullptr );
2226 testutil::FillImageGradient (image.get ());
2327
2428 // Encode
2529 testutil::AvifEncoderPtr encoder (avifEncoderCreate (), avifEncoderDestroy);
2630 ASSERT_NE (encoder, nullptr );
27- encoder->codecChoice = AVIF_CODEC_CHOICE_AOM ;
31+ encoder->codecChoice = codec ;
2832 encoder->speed = AVIF_SPEED_FASTEST;
29- encoder->minQuantizer = 63 ;
30- encoder->maxQuantizer = 63 ;
3133 encoder->timescale = 1 ;
32- // Force cbr mode, to ensure quality settings is fully complied.
33- avifEncoderSetCodecSpecificOption (encoder.get (), " end-usage" , " cbr" );
34+
35+ for (const auto & option : init_cs_options) {
36+ avifEncoderSetCodecSpecificOption (encoder.get (), option.first .c_str (),
37+ option.second .c_str ());
38+ }
39+
40+ if (use_cq) {
41+ encoder->minQuantizer = 0 ;
42+ encoder->maxQuantizer = 63 ;
43+ avifEncoderSetCodecSpecificOption (encoder.get (), " end-usage" , " q" );
44+ avifEncoderSetCodecSpecificOption (encoder.get (), " cq-level" , " 63" );
45+ } else {
46+ encoder->minQuantizer = 63 ;
47+ encoder->maxQuantizer = 63 ;
48+ }
3449
3550 ASSERT_EQ (avifEncoderAddImage (encoder.get (), image.get (), 1 ,
3651 AVIF_ADD_IMAGE_FLAG_FORCE_KEYFRAME),
3752 AVIF_RESULT_OK);
3853
39- encoder->minQuantizer = 0 ;
40- encoder->maxQuantizer = 0 ;
54+ if (use_cq) {
55+ avifEncoderSetCodecSpecificOption (encoder.get (), " cq-level" , " 0" );
56+ } else {
57+ encoder->minQuantizer = 0 ;
58+ encoder->maxQuantizer = 0 ;
59+ }
60+
61+ if (!can_encode) {
62+ ASSERT_EQ (avifEncoderAddImage (encoder.get (), image.get (), 1 ,
63+ AVIF_ADD_IMAGE_FLAG_FORCE_KEYFRAME),
64+ AVIF_RESULT_NOT_IMPLEMENTED);
65+
66+ return ;
67+ }
68+
4169 ASSERT_EQ (avifEncoderAddImage (encoder.get (), image.get (), 1 ,
42- AVIF_ADD_IMAGE_FLAG_UPDATE_SETTINGS |
43- AVIF_ADD_IMAGE_FLAG_FORCE_KEYFRAME),
70+ AVIF_ADD_IMAGE_FLAG_FORCE_KEYFRAME),
4471 AVIF_RESULT_OK);
4572
4673 testutil::AvifRwData encodedAvif;
@@ -53,7 +80,7 @@ TEST(ChangeSettingTest, AOM) {
5380 // The second frame is set to have far better quality,
5481 // and should be much bigger, so small amount of data at beginning
5582 // should be enough to decode the first frame.
56- auto io = testutil::AvifIOCreateLimitedReader (
83+ avifIO* io = testutil::AvifIOCreateLimitedReader (
5784 avifIOCreateMemoryReader (encodedAvif.data , encodedAvif.size ),
5885 encodedAvif.size / 10 );
5986 ASSERT_NE (io, nullptr );
@@ -62,52 +89,32 @@ TEST(ChangeSettingTest, AOM) {
6289 ASSERT_EQ (avifDecoderNextImage (decoder.get ()), AVIF_RESULT_OK);
6390 ASSERT_EQ (avifDecoderNextImage (decoder.get ()), AVIF_RESULT_WAITING_ON_IO);
6491 ((testutil::AvifIOLimitedReader*)io)->clamp =
65- testutil::AvifIOLimitedReader::NoClamp ;
92+ testutil::AvifIOLimitedReader::kNoClamp ;
6693 ASSERT_EQ (avifDecoderNextImage (decoder.get ()), AVIF_RESULT_OK);
6794 ASSERT_EQ (avifDecoderNextImage (decoder.get ()),
6895 AVIF_RESULT_NO_IMAGES_REMAINING);
6996}
7097
71- TEST (ChangeSettingTest, RAV1E) {
72- if (avifCodecName (AVIF_CODEC_CHOICE_RAV1E, AVIF_CODEC_FLAG_CAN_ENCODE) ==
73- nullptr ) {
74- GTEST_SKIP () << " rav1e encoder unavailable, skip test." ;
75- }
76-
77- const uint32_t image_size = 512 ;
78- testutil::AvifImagePtr image =
79- testutil::CreateImage (image_size, image_size, 8 , AVIF_PIXEL_FORMAT_YUV444,
80- AVIF_PLANES_YUV, AVIF_RANGE_FULL);
81- ASSERT_NE (image, nullptr );
82- testutil::FillImageGradient (image.get ());
83-
84- // Encode
85- testutil::AvifEncoderPtr encoder (avifEncoderCreate (), avifEncoderDestroy);
86- ASSERT_NE (encoder, nullptr );
87- encoder->codecChoice = AVIF_CODEC_CHOICE_RAV1E;
88- encoder->speed = AVIF_SPEED_FASTEST;
89- encoder->minQuantizer = 63 ;
90- encoder->maxQuantizer = 63 ;
91- encoder->timescale = 1 ;
98+ TEST (ChangeSettingTest, AOM) {
99+ TestEncodeDecode (AVIF_CODEC_CHOICE_AOM, {{" end-usage" , " cbr" }}, true , false );
100+ }
92101
93- ASSERT_EQ ( avifEncoderAddImage (encoder. get (), image. get (), 1 ,
94- AVIF_ADD_IMAGE_FLAG_FORCE_KEYFRAME),
95- AVIF_RESULT_OK);
102+ TEST (ChangeSettingTest, RAV1E) {
103+ TestEncodeDecode (AVIF_CODEC_CHOICE_RAV1E, {}, false , false );
104+ }
96105
97- encoder->minQuantizer = 0 ;
98- encoder->maxQuantizer = 0 ;
106+ TEST (ChangeSettingTest, SVT) {
107+ TestEncodeDecode (AVIF_CODEC_CHOICE_SVT, {}, false , false );
108+ }
99109
100- // rav1e does not support updating settings.
101- ASSERT_EQ (avifEncoderAddImage (encoder.get (), image.get (), 1 ,
102- AVIF_ADD_IMAGE_FLAG_UPDATE_SETTINGS |
103- AVIF_ADD_IMAGE_FLAG_FORCE_KEYFRAME),
104- AVIF_RESULT_NOT_IMPLEMENTED);
110+ TEST (ChangeSettingTest, ChangeCsOptions) {
111+ TestEncodeDecode (AVIF_CODEC_CHOICE_AOM, {}, true , true );
105112}
106113
107- TEST (ChangeSettingTest, SVT ) {
108- if (avifCodecName (AVIF_CODEC_CHOICE_SVT , AVIF_CODEC_FLAG_CAN_ENCODE) ==
114+ TEST (ChangeSettingTest, UnchangableSetting ) {
115+ if (avifCodecName (AVIF_CODEC_CHOICE_AOM , AVIF_CODEC_FLAG_CAN_ENCODE) ==
109116 nullptr ) {
110- GTEST_SKIP () << " SVT encoder unavailable, skip test." ;
117+ GTEST_SKIP () << " Codec unavailable, skip test." ;
111118 }
112119
113120 const uint32_t image_size = 512 ;
@@ -120,24 +127,20 @@ TEST(ChangeSettingTest, SVT) {
120127 // Encode
121128 testutil::AvifEncoderPtr encoder (avifEncoderCreate (), avifEncoderDestroy);
122129 ASSERT_NE (encoder, nullptr );
123- encoder->codecChoice = AVIF_CODEC_CHOICE_SVT ;
130+ encoder->codecChoice = AVIF_CODEC_CHOICE_AOM ;
124131 encoder->speed = AVIF_SPEED_FASTEST;
132+ encoder->timescale = 1 ;
125133 encoder->minQuantizer = 63 ;
126134 encoder->maxQuantizer = 63 ;
127- encoder->timescale = 1 ;
128135
129136 ASSERT_EQ (avifEncoderAddImage (encoder.get (), image.get (), 1 ,
130137 AVIF_ADD_IMAGE_FLAG_FORCE_KEYFRAME),
131138 AVIF_RESULT_OK);
132139
133- encoder->minQuantizer = 0 ;
134- encoder->maxQuantizer = 0 ;
135-
136- // SVT does not support updating settings.
140+ encoder->timescale = 2 ;
137141 ASSERT_EQ (avifEncoderAddImage (encoder.get (), image.get (), 1 ,
138- AVIF_ADD_IMAGE_FLAG_UPDATE_SETTINGS |
139- AVIF_ADD_IMAGE_FLAG_FORCE_KEYFRAME),
140- AVIF_RESULT_NOT_IMPLEMENTED);
142+ AVIF_ADD_IMAGE_FLAG_FORCE_KEYFRAME),
143+ AVIF_RESULT_CANNOT_CHANGE_SETTING);
141144}
142145
143146} // namespace
0 commit comments