| // Copyright 2023 Google LLC |
| // SPDX-License-Identifier: BSD-2-Clause |
| |
| #include "avif/avif.h" |
| #include "aviftest_helpers.h" |
| #include "gtest/gtest.h" |
| |
| namespace avif { |
| namespace { |
| |
| class CodecTest : public testing::TestWithParam< |
| std::tuple</*encoding_codec=*/avifCodecChoice, |
| /*decoding_codec=*/avifCodecChoice>> {}; |
| |
| TEST_P(CodecTest, EncodeDecode) { |
| const avifCodecChoice encoding_codec = std::get<0>(GetParam()); |
| const avifCodecChoice decoding_codec = std::get<1>(GetParam()); |
| |
| if (avifCodecName(encoding_codec, AVIF_CODEC_FLAG_CAN_ENCODE) == nullptr || |
| avifCodecName(decoding_codec, AVIF_CODEC_FLAG_CAN_DECODE) == nullptr) { |
| GTEST_SKIP() << "Codec unavailable, skip test."; |
| } |
| |
| // AVIF_CODEC_CHOICE_SVT requires dimensions to be at least 64 pixels. |
| ImagePtr image = |
| testutil::CreateImage(/*width=*/64, /*height=*/64, /*depth=*/8, |
| AVIF_PIXEL_FORMAT_YUV420, AVIF_PLANES_ALL); |
| ASSERT_NE(image, nullptr); |
| testutil::FillImageGradient(image.get()); |
| |
| EncoderPtr encoder(avifEncoderCreate()); |
| ASSERT_NE(encoder, nullptr); |
| encoder->codecChoice = encoding_codec; |
| encoder->quality = encoder->qualityAlpha = 90; // Small loss. |
| testutil::AvifRwData encoded; |
| ASSERT_EQ(avifEncoderWrite(encoder.get(), image.get(), &encoded), |
| AVIF_RESULT_OK); |
| |
| DecoderPtr decoder(avifDecoderCreate()); |
| ASSERT_NE(decoder, nullptr); |
| decoder->codecChoice = decoding_codec; |
| ImagePtr decoded(avifImageCreateEmpty()); |
| ASSERT_NE(decoded, nullptr); |
| ASSERT_EQ(avifDecoderReadMemory(decoder.get(), decoded.get(), encoded.data, |
| encoded.size), |
| AVIF_RESULT_OK); |
| |
| ASSERT_GT(testutil::GetPsnr(*image, *decoded), 32.0); |
| } |
| |
| INSTANTIATE_TEST_SUITE_P( |
| All, CodecTest, |
| testing::Combine(/*encoding_codec=*/testing::Values(AVIF_CODEC_CHOICE_AOM, |
| AVIF_CODEC_CHOICE_RAV1E, |
| AVIF_CODEC_CHOICE_SVT), |
| /*decoding_codec=*/testing::Values( |
| AVIF_CODEC_CHOICE_AOM, AVIF_CODEC_CHOICE_DAV1D, |
| AVIF_CODEC_CHOICE_LIBGAV1))); |
| |
| } // namespace |
| } // namespace avif |