Imported Upstream version 0.9.0
[platform/upstream/libjxl.git] / lib / jxl / speed_tier_test.cc
1 // Copyright (c) the JPEG XL Project Authors. All rights reserved.
2 //
3 // Use of this source code is governed by a BSD-style
4 // license that can be found in the LICENSE file.
5
6 #include <jxl/cms.h>
7
8 #include <cstdint>
9 #include <string>
10 #include <vector>
11
12 #include "lib/extras/codec.h"
13 #include "lib/jxl/base/data_parallel.h"
14 #include "lib/jxl/base/span.h"
15 #include "lib/jxl/codec_in_out.h"
16 #include "lib/jxl/enc_butteraugli_comparator.h"
17 #include "lib/jxl/enc_cache.h"
18 #include "lib/jxl/enc_params.h"
19 #include "lib/jxl/image.h"
20 #include "lib/jxl/image_test_utils.h"
21 #include "lib/jxl/test_utils.h"
22 #include "lib/jxl/testing.h"
23
24 namespace jxl {
25 namespace {
26
27 struct SpeedTierTestParams {
28   explicit SpeedTierTestParams(const SpeedTier speed_tier,
29                                const bool shrink8 = false)
30       : speed_tier(speed_tier), shrink8(shrink8) {}
31   SpeedTier speed_tier;
32   bool shrink8;
33 };
34
35 std::ostream& operator<<(std::ostream& os, SpeedTierTestParams params) {
36   auto previous_flags = os.flags();
37   os << std::boolalpha;
38   os << "SpeedTierTestParams{" << static_cast<size_t>(params.speed_tier)
39      << ", /*shrink8=*/" << params.shrink8 << "}";
40   os.flags(previous_flags);
41   return os;
42 }
43
44 class SpeedTierTest : public testing::TestWithParam<SpeedTierTestParams> {};
45
46 JXL_GTEST_INSTANTIATE_TEST_SUITE_P(
47     SpeedTierTestInstantiation, SpeedTierTest,
48     testing::Values(SpeedTierTestParams{SpeedTier::kCheetah,
49                                         /*shrink8=*/true},
50                     SpeedTierTestParams{SpeedTier::kCheetah,
51                                         /*shrink8=*/false},
52                     SpeedTierTestParams{SpeedTier::kThunder,
53                                         /*shrink8=*/true},
54                     SpeedTierTestParams{SpeedTier::kThunder,
55                                         /*shrink8=*/false},
56                     SpeedTierTestParams{SpeedTier::kLightning,
57                                         /*shrink8=*/true},
58                     SpeedTierTestParams{SpeedTier::kLightning,
59                                         /*shrink8=*/false},
60                     SpeedTierTestParams{SpeedTier::kFalcon,
61                                         /*shrink8=*/true},
62                     SpeedTierTestParams{SpeedTier::kFalcon,
63                                         /*shrink8=*/false},
64                     SpeedTierTestParams{SpeedTier::kHare,
65                                         /*shrink8=*/true},
66                     SpeedTierTestParams{SpeedTier::kHare,
67                                         /*shrink8=*/false},
68                     SpeedTierTestParams{SpeedTier::kWombat,
69                                         /*shrink8=*/true},
70                     SpeedTierTestParams{SpeedTier::kWombat,
71                                         /*shrink8=*/false},
72                     SpeedTierTestParams{SpeedTier::kSquirrel,
73                                         /*shrink8=*/true},
74                     SpeedTierTestParams{SpeedTier::kSquirrel,
75                                         /*shrink8=*/false},
76                     SpeedTierTestParams{SpeedTier::kKitten,
77                                         /*shrink8=*/false},
78                     // Only downscaled image for Tortoise mode.
79                     SpeedTierTestParams{SpeedTier::kTortoise,
80                                         /*shrink8=*/true},
81                     SpeedTierTestParams{SpeedTier::kGlacier,
82                                         /*shrink8=*/true}));
83
84 TEST_P(SpeedTierTest, Roundtrip) {
85   const std::vector<uint8_t> orig = jxl::test::ReadTestData(
86       "external/wesaturate/500px/u76c0g_bliznaca_srgb8.png");
87   CodecInOut io;
88   test::ThreadPoolForTests pool(8);
89   ASSERT_TRUE(SetFromBytes(Bytes(orig), &io, &pool));
90
91   const SpeedTierTestParams& params = GetParam();
92
93   if (params.speed_tier == SpeedTier::kGlacier) {
94     // just a few pixels will already take enough time at this setting
95     io.ShrinkTo(8, 8);
96   } else if (params.shrink8) {
97     io.ShrinkTo(io.xsize() / 8, io.ysize() / 8);
98   }
99
100   CompressParams cparams;
101   cparams.speed_tier = params.speed_tier;
102   cparams.SetCms(*JxlGetDefaultCms());
103
104   CodecInOut io2, io3;
105   JXL_EXPECT_OK(test::Roundtrip(&io, cparams, {}, &io2, _));
106   EXPECT_LE(ButteraugliDistance(io.frames, io2.frames, ButteraugliParams(),
107                                 *JxlGetDefaultCms(),
108                                 /*distmap=*/nullptr, /*pool=*/nullptr),
109             1.6);
110
111   if (params.shrink8) {
112     cparams.SetLossless();
113     JXL_EXPECT_OK(test::Roundtrip(&io, cparams, {}, &io3, _));
114
115     JXL_EXPECT_OK(SamePixels(*io.Main().color(), *io3.Main().color(), _));
116   }
117 }
118 }  // namespace
119 }  // namespace jxl