1 // Copyright 2022 Yuan Tong. All rights reserved.
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,Progressive)14 TEST(AvifDecodeTest, Progressive) {
15   struct Params {
16     const char* file_name;
17     uint32_t width;
18     uint32_t height;
19     uint32_t layer_count;
20   };
21   Params params[] = {
22     {"progressive/progressive_dimension_change.avif", 256, 256, 2},
23     {"progressive/progressive_layered_grid.avif", 512, 256, 2},
24     {"progressive/progressive_quality_change.avif", 256, 256, 2},
25     {"progressive/progressive_same_layers.avif", 256, 256, 4},
26     {"progressive/tiger_3layer_1res.avif", 1216, 832, 3},
27     {"progressive/tiger_3layer_3res.avif", 1216, 832, 3},
28   };
29   for (const auto& param : params) {
30     DecoderPtr decoder(avifDecoderCreate());
31     ASSERT_NE(decoder, nullptr);
32     decoder->allowProgressive = true;
33     ASSERT_EQ(avifDecoderSetIOFile(decoder.get(),
34                                    (std::string(data_path) + param.file_name).c_str()),
35               AVIF_RESULT_OK);
36     ASSERT_EQ(avifDecoderParse(decoder.get()), AVIF_RESULT_OK);
37     EXPECT_EQ(decoder->compressionFormat, COMPRESSION_FORMAT_AVIF);
38     ASSERT_EQ(decoder->progressiveState, AVIF_PROGRESSIVE_STATE_ACTIVE);
39     ASSERT_EQ(static_cast<uint32_t>(decoder->imageCount), param.layer_count);
40 
41     for (uint32_t layer = 0; layer < param.layer_count; ++layer) {
42       ASSERT_EQ(avifDecoderNextImage(decoder.get()), AVIF_RESULT_OK);
43       // libavif scales frame automatically.
44       ASSERT_EQ(decoder->image->width, param.width);
45       ASSERT_EQ(decoder->image->height, param.height);
46     }
47   }
48 }
49 
50 }  // namespace
51 }  // namespace avif
52 
main(int argc,char ** argv)53 int main(int argc, char** argv) {
54   ::testing::InitGoogleTest(&argc, argv);
55   if (argc != 2) {
56     std::cerr << "There must be exactly one argument containing the path to "
57                  "the test data folder"
58               << std::endl;
59     return 1;
60   }
61   avif::data_path = argv[1];
62   return RUN_ALL_TESTS();
63 }
64