// Copyright 2024 Google LLC // SPDX-License-Identifier: BSD-2-Clause #include #include #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(KeyframeTest, Decode) { if (!testutil::Av1DecoderAvailable()) { GTEST_SKIP() << "AV1 Codec unavailable, skip test."; } DecoderPtr decoder(avifDecoderCreate()); ASSERT_NE(decoder, nullptr); const std::string file_name = "colors-animated-12bpc-keyframes-0-2-3.avif"; ASSERT_EQ( avifDecoderSetIOFile(decoder.get(), (data_path + file_name).c_str()), AVIF_RESULT_OK); ASSERT_EQ(avifDecoderParse(decoder.get()), AVIF_RESULT_OK); EXPECT_EQ(decoder->compressionFormat, COMPRESSION_FORMAT_AVIF); // The first frame is always a keyframe. EXPECT_TRUE(avifDecoderIsKeyframe(decoder.get(), 0)); EXPECT_EQ(avifDecoderNearestKeyframe(decoder.get(), 0), 0); // The encoder may choose to use a keyframe here, even without FORCE_KEYFRAME. // It seems not to. EXPECT_FALSE(avifDecoderIsKeyframe(decoder.get(), 1)); EXPECT_EQ(avifDecoderNearestKeyframe(decoder.get(), 1), 0); EXPECT_TRUE(avifDecoderIsKeyframe(decoder.get(), 2)); EXPECT_EQ(avifDecoderNearestKeyframe(decoder.get(), 2), 2); // The encoder seems to prefer a keyframe here // (gradient too different from plain color). EXPECT_TRUE(avifDecoderIsKeyframe(decoder.get(), 3)); EXPECT_EQ(avifDecoderNearestKeyframe(decoder.get(), 3), 3); // This is the same frame as the previous one. It should not be a keyframe. EXPECT_FALSE(avifDecoderIsKeyframe(decoder.get(), 4)); EXPECT_EQ(avifDecoderNearestKeyframe(decoder.get(), 4), 3); } } // 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(); }