1 // Copyright 2023 Google LLC
2 // SPDX-License-Identifier: BSD-2-Clause
3 
4 #include "avif/avif.h"
5 #include "aviftest_helpers.h"
6 #include "gtest/gtest.h"
7 
8 namespace avif {
9 namespace {
10 
11 // Used to pass the data folder path to the GoogleTest suites.
12 const char* data_path = nullptr;
13 
TEST(AvifDecodeTest,AnimatedImage)14 TEST(AvifDecodeTest, AnimatedImage) {
15   if (!testutil::Av1DecoderAvailable()) {
16     GTEST_SKIP() << "AV1 Codec unavailable, skip test.";
17   }
18   const char* file_name = "colors-animated-8bpc.avif";
19   DecoderPtr decoder(avifDecoderCreate());
20   ASSERT_NE(decoder, nullptr);
21   ASSERT_EQ(avifDecoderSetIOFile(decoder.get(),
22                                  (std::string(data_path) + file_name).c_str()),
23             AVIF_RESULT_OK);
24   ASSERT_EQ(avifDecoderParse(decoder.get()), AVIF_RESULT_OK);
25   EXPECT_EQ(decoder->compressionFormat, COMPRESSION_FORMAT_AVIF);
26   EXPECT_EQ(decoder->alphaPresent, AVIF_FALSE);
27   EXPECT_EQ(decoder->imageSequenceTrackPresent, AVIF_TRUE);
28   EXPECT_EQ(decoder->imageCount, 5);
29   EXPECT_EQ(decoder->repetitionCount, 0);
30   for (int i = 0; i < 5; ++i) {
31     EXPECT_EQ(avifDecoderNextImage(decoder.get()), AVIF_RESULT_OK);
32   }
33 }
34 
TEST(AvifDecodeTest,AnimatedImageWithSourceSetToPrimaryItem)35 TEST(AvifDecodeTest, AnimatedImageWithSourceSetToPrimaryItem) {
36   if (!testutil::Av1DecoderAvailable()) {
37     GTEST_SKIP() << "AV1 Codec unavailable, skip test.";
38   }
39   const char* file_name = "colors-animated-8bpc.avif";
40   DecoderPtr decoder(avifDecoderCreate());
41   ASSERT_NE(decoder, nullptr);
42   ASSERT_EQ(avifDecoderSetIOFile(decoder.get(),
43                                  (std::string(data_path) + file_name).c_str()),
44             AVIF_RESULT_OK);
45   ASSERT_EQ(
46       avifDecoderSetSource(decoder.get(), AVIF_DECODER_SOURCE_PRIMARY_ITEM),
47       AVIF_RESULT_OK);
48   ASSERT_EQ(avifDecoderParse(decoder.get()), AVIF_RESULT_OK);
49   EXPECT_EQ(decoder->compressionFormat, COMPRESSION_FORMAT_AVIF);
50   EXPECT_EQ(decoder->alphaPresent, AVIF_FALSE);
51   EXPECT_EQ(decoder->imageSequenceTrackPresent, AVIF_TRUE);
52   // imageCount is expected to be 1 because we are using primary item as the
53   // preferred source.
54   EXPECT_EQ(decoder->imageCount, 1);
55   EXPECT_EQ(decoder->repetitionCount, 0);
56   // Get the first (and only) image.
57   EXPECT_EQ(avifDecoderNextImage(decoder.get()), AVIF_RESULT_OK);
58   // Subsequent calls should not return AVIF_RESULT_OK since there is only one
59   // image in the preferred source.
60   EXPECT_NE(avifDecoderNextImage(decoder.get()), AVIF_RESULT_OK);
61 }
62 
TEST(AvifDecodeTest,AnimatedImageWithAlphaAndMetadata)63 TEST(AvifDecodeTest, AnimatedImageWithAlphaAndMetadata) {
64   const char* file_name = "colors-animated-8bpc-alpha-exif-xmp.avif";
65   DecoderPtr decoder(avifDecoderCreate());
66   ASSERT_NE(decoder, nullptr);
67   ASSERT_EQ(avifDecoderSetIOFile(decoder.get(),
68                                  (std::string(data_path) + file_name).c_str()),
69             AVIF_RESULT_OK);
70   ASSERT_EQ(avifDecoderParse(decoder.get()), AVIF_RESULT_OK);
71   EXPECT_EQ(decoder->compressionFormat, COMPRESSION_FORMAT_AVIF);
72   EXPECT_EQ(decoder->alphaPresent, AVIF_TRUE);
73   EXPECT_EQ(decoder->imageSequenceTrackPresent, AVIF_TRUE);
74   EXPECT_EQ(decoder->imageCount, 5);
75   EXPECT_EQ(decoder->repetitionCount, AVIF_REPETITION_COUNT_INFINITE);
76   EXPECT_EQ(decoder->image->exif.size, 1126);
77   EXPECT_EQ(decoder->image->xmp.size, 3898);
78 }
79 
80 }  // namespace
81 }  // namespace avif
82 
main(int argc,char ** argv)83 int main(int argc, char** argv) {
84   ::testing::InitGoogleTest(&argc, argv);
85   if (argc != 2) {
86     std::cerr << "There must be exactly one argument containing the path to "
87                  "the test data folder"
88               << std::endl;
89     return 1;
90   }
91   avif::data_path = argv[1];
92   return RUN_ALL_TESTS();
93 }
94