| Server IP : 23.254.227.96 / Your IP : 216.73.216.183 Web Server : Apache/2.4.62 (Unix) OpenSSL/1.1.1k System : Linux hwsrv-1277026.hostwindsdns.com 4.18.0-477.13.1.el8_8.x86_64 #1 SMP Tue May 30 14:53:41 EDT 2023 x86_64 User : viralblo ( 1001) PHP Version : 8.1.31 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /proc/self/root/proc/self/root/usr/local/src/libavif-0.11.1/tests/gtest/ |
Upload File : |
// Copyright 2022 Yuan Tong. All rights reserved.
// SPDX-License-Identifier: BSD-2-Clause
#include <map>
#include <string>
#include "avif/avif.h"
#include "aviftest_helpers.h"
#include "gtest/gtest.h"
namespace libavif {
namespace {
void TestEncodeDecode(avifCodecChoice codec,
const std::map<std::string, std::string>& init_cs_options,
bool can_encode, bool use_cq) {
if (avifCodecName(codec, AVIF_CODEC_FLAG_CAN_ENCODE) == nullptr) {
GTEST_SKIP() << "Codec unavailable, skip test.";
}
const uint32_t image_size = 512;
testutil::AvifImagePtr image =
testutil::CreateImage(image_size, image_size, 8, AVIF_PIXEL_FORMAT_YUV420,
AVIF_PLANES_YUV, AVIF_RANGE_FULL);
ASSERT_NE(image, nullptr);
testutil::FillImageGradient(image.get());
// Encode
testutil::AvifEncoderPtr encoder(avifEncoderCreate(), avifEncoderDestroy);
ASSERT_NE(encoder, nullptr);
encoder->codecChoice = codec;
encoder->speed = AVIF_SPEED_FASTEST;
encoder->timescale = 1;
for (const auto& option : init_cs_options) {
avifEncoderSetCodecSpecificOption(encoder.get(), option.first.c_str(),
option.second.c_str());
}
if (use_cq) {
encoder->minQuantizer = 0;
encoder->maxQuantizer = 63;
avifEncoderSetCodecSpecificOption(encoder.get(), "end-usage", "q");
avifEncoderSetCodecSpecificOption(encoder.get(), "cq-level", "63");
} else {
encoder->minQuantizer = 63;
encoder->maxQuantizer = 63;
}
ASSERT_EQ(avifEncoderAddImage(encoder.get(), image.get(), 1,
AVIF_ADD_IMAGE_FLAG_FORCE_KEYFRAME),
AVIF_RESULT_OK);
if (use_cq) {
avifEncoderSetCodecSpecificOption(encoder.get(), "cq-level", "0");
} else {
encoder->minQuantizer = 0;
encoder->maxQuantizer = 0;
}
if (!can_encode) {
ASSERT_EQ(avifEncoderAddImage(encoder.get(), image.get(), 1,
AVIF_ADD_IMAGE_FLAG_FORCE_KEYFRAME),
AVIF_RESULT_NOT_IMPLEMENTED);
return;
}
ASSERT_EQ(avifEncoderAddImage(encoder.get(), image.get(), 1,
AVIF_ADD_IMAGE_FLAG_FORCE_KEYFRAME),
AVIF_RESULT_OK);
testutil::AvifRwData encodedAvif;
ASSERT_EQ(avifEncoderFinish(encoder.get(), &encodedAvif), AVIF_RESULT_OK);
// Decode
testutil::AvifDecoderPtr decoder(avifDecoderCreate(), avifDecoderDestroy);
ASSERT_NE(decoder, nullptr);
// The second frame is set to have far better quality,
// and should be much bigger, so small amount of data at beginning
// should be enough to decode the first frame.
avifIO* io = testutil::AvifIOCreateLimitedReader(
avifIOCreateMemoryReader(encodedAvif.data, encodedAvif.size),
encodedAvif.size / 10);
ASSERT_NE(io, nullptr);
avifDecoderSetIO(decoder.get(), io);
ASSERT_EQ(avifDecoderParse(decoder.get()), AVIF_RESULT_OK);
ASSERT_EQ(avifDecoderNextImage(decoder.get()), AVIF_RESULT_OK);
ASSERT_EQ(avifDecoderNextImage(decoder.get()), AVIF_RESULT_WAITING_ON_IO);
reinterpret_cast<testutil::AvifIOLimitedReader*>(io)->clamp =
testutil::AvifIOLimitedReader::kNoClamp;
ASSERT_EQ(avifDecoderNextImage(decoder.get()), AVIF_RESULT_OK);
ASSERT_EQ(avifDecoderNextImage(decoder.get()),
AVIF_RESULT_NO_IMAGES_REMAINING);
}
TEST(ChangeSettingTest, AOM) {
// Test if changes to AV1 encode settings are detected.
TestEncodeDecode(AVIF_CODEC_CHOICE_AOM, {{"end-usage", "cbr"}}, true, false);
// Test if changes to codec specific options are detected.
TestEncodeDecode(AVIF_CODEC_CHOICE_AOM, {}, true, true);
}
TEST(ChangeSettingTest, RAV1E) {
TestEncodeDecode(AVIF_CODEC_CHOICE_RAV1E, {}, false, false);
}
TEST(ChangeSettingTest, SVT) {
TestEncodeDecode(AVIF_CODEC_CHOICE_SVT, {}, false, false);
}
TEST(ChangeSettingTest, UnchangeableSetting) {
if (avifCodecName(AVIF_CODEC_CHOICE_AOM, AVIF_CODEC_FLAG_CAN_ENCODE) ==
nullptr) {
GTEST_SKIP() << "Codec unavailable, skip test.";
}
const uint32_t image_size = 512;
testutil::AvifImagePtr image =
testutil::CreateImage(image_size, image_size, 8, AVIF_PIXEL_FORMAT_YUV420,
AVIF_PLANES_YUV, AVIF_RANGE_FULL);
ASSERT_NE(image, nullptr);
testutil::FillImageGradient(image.get());
// Encode
testutil::AvifEncoderPtr encoder(avifEncoderCreate(), avifEncoderDestroy);
ASSERT_NE(encoder, nullptr);
encoder->codecChoice = AVIF_CODEC_CHOICE_AOM;
encoder->speed = AVIF_SPEED_FASTEST;
encoder->timescale = 1;
encoder->minQuantizer = 63;
encoder->maxQuantizer = 63;
ASSERT_EQ(avifEncoderAddImage(encoder.get(), image.get(), 1,
AVIF_ADD_IMAGE_FLAG_FORCE_KEYFRAME),
AVIF_RESULT_OK);
encoder->timescale = 2;
ASSERT_EQ(avifEncoderAddImage(encoder.get(), image.get(), 1,
AVIF_ADD_IMAGE_FLAG_FORCE_KEYFRAME),
AVIF_RESULT_CANNOT_CHANGE_SETTING);
}
} // namespace
} // namespace libavif