// 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 { // Used to pass the data folder path to the GoogleTest suites. const char* data_path = nullptr; TEST(AvifDecodeTest, AnimatedImage) { if (!testutil::Av1DecoderAvailable()) { GTEST_SKIP() << "AV1 Codec unavailable, skip test."; } const char* file_name = "colors-animated-8bpc.avif"; DecoderPtr decoder(avifDecoderCreate()); ASSERT_NE(decoder, nullptr); ASSERT_EQ(avifDecoderSetIOFile(decoder.get(), (std::string(data_path) + file_name).c_str()), AVIF_RESULT_OK); ASSERT_EQ(avifDecoderParse(decoder.get()), AVIF_RESULT_OK); EXPECT_EQ(decoder->compressionFormat, COMPRESSION_FORMAT_AVIF); EXPECT_EQ(decoder->alphaPresent, AVIF_FALSE); EXPECT_EQ(decoder->imageSequenceTrackPresent, AVIF_TRUE); EXPECT_EQ(decoder->imageCount, 5); EXPECT_EQ(decoder->repetitionCount, 0); for (int i = 0; i < 5; ++i) { EXPECT_EQ(avifDecoderNextImage(decoder.get()), AVIF_RESULT_OK); } } TEST(AvifDecodeTest, AnimatedImageWithSourceSetToPrimaryItem) { if (!testutil::Av1DecoderAvailable()) { GTEST_SKIP() << "AV1 Codec unavailable, skip test."; } const char* file_name = "colors-animated-8bpc.avif"; DecoderPtr decoder(avifDecoderCreate()); ASSERT_NE(decoder, nullptr); ASSERT_EQ(avifDecoderSetIOFile(decoder.get(), (std::string(data_path) + file_name).c_str()), AVIF_RESULT_OK); ASSERT_EQ( avifDecoderSetSource(decoder.get(), AVIF_DECODER_SOURCE_PRIMARY_ITEM), AVIF_RESULT_OK); ASSERT_EQ(avifDecoderParse(decoder.get()), AVIF_RESULT_OK); EXPECT_EQ(decoder->compressionFormat, COMPRESSION_FORMAT_AVIF); EXPECT_EQ(decoder->alphaPresent, AVIF_FALSE); EXPECT_EQ(decoder->imageSequenceTrackPresent, AVIF_TRUE); // imageCount is expected to be 1 because we are using primary item as the // preferred source. EXPECT_EQ(decoder->imageCount, 1); EXPECT_EQ(decoder->repetitionCount, 0); // Get the first (and only) image. EXPECT_EQ(avifDecoderNextImage(decoder.get()), AVIF_RESULT_OK); // Subsequent calls should not return AVIF_RESULT_OK since there is only one // image in the preferred source. EXPECT_NE(avifDecoderNextImage(decoder.get()), AVIF_RESULT_OK); } TEST(AvifDecodeTest, AnimatedImageWithAlphaAndMetadata) { const char* file_name = "colors-animated-8bpc-alpha-exif-xmp.avif"; DecoderPtr decoder(avifDecoderCreate()); ASSERT_NE(decoder, nullptr); ASSERT_EQ(avifDecoderSetIOFile(decoder.get(), (std::string(data_path) + file_name).c_str()), AVIF_RESULT_OK); ASSERT_EQ(avifDecoderParse(decoder.get()), AVIF_RESULT_OK); EXPECT_EQ(decoder->compressionFormat, COMPRESSION_FORMAT_AVIF); EXPECT_EQ(decoder->alphaPresent, AVIF_TRUE); EXPECT_EQ(decoder->imageSequenceTrackPresent, AVIF_TRUE); EXPECT_EQ(decoder->imageCount, 5); EXPECT_EQ(decoder->repetitionCount, AVIF_REPETITION_COUNT_INFINITE); EXPECT_EQ(decoder->image->exif.size, 1126); EXPECT_EQ(decoder->image->xmp.size, 3898); } } // namespace } // namespace avif int main(int argc, char** argv) { ::testing::InitGoogleTest(&argc, argv); if (argc != 2) { std::cerr << "There must be exactly one argument containing the path to " "the test data folder" << std::endl; return 1; } avif::data_path = argv[1]; return RUN_ALL_TESTS(); }