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