1 // Copyright (c) the JPEG XL Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style
4 // license that can be found in the LICENSE file.
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"
27 struct SpeedTierTestParams {
28 explicit SpeedTierTestParams(const SpeedTier speed_tier,
29 const bool shrink8 = false)
30 : speed_tier(speed_tier), shrink8(shrink8) {}
35 std::ostream& operator<<(std::ostream& os, SpeedTierTestParams params) {
36 auto previous_flags = os.flags();
38 os << "SpeedTierTestParams{" << static_cast<size_t>(params.speed_tier)
39 << ", /*shrink8=*/" << params.shrink8 << "}";
40 os.flags(previous_flags);
44 class SpeedTierTest : public testing::TestWithParam<SpeedTierTestParams> {};
46 JXL_GTEST_INSTANTIATE_TEST_SUITE_P(
47 SpeedTierTestInstantiation, SpeedTierTest,
48 testing::Values(SpeedTierTestParams{SpeedTier::kCheetah,
50 SpeedTierTestParams{SpeedTier::kCheetah,
52 SpeedTierTestParams{SpeedTier::kThunder,
54 SpeedTierTestParams{SpeedTier::kThunder,
56 SpeedTierTestParams{SpeedTier::kLightning,
58 SpeedTierTestParams{SpeedTier::kLightning,
60 SpeedTierTestParams{SpeedTier::kFalcon,
62 SpeedTierTestParams{SpeedTier::kFalcon,
64 SpeedTierTestParams{SpeedTier::kHare,
66 SpeedTierTestParams{SpeedTier::kHare,
68 SpeedTierTestParams{SpeedTier::kWombat,
70 SpeedTierTestParams{SpeedTier::kWombat,
72 SpeedTierTestParams{SpeedTier::kSquirrel,
74 SpeedTierTestParams{SpeedTier::kSquirrel,
76 SpeedTierTestParams{SpeedTier::kKitten,
78 // Only downscaled image for Tortoise mode.
79 SpeedTierTestParams{SpeedTier::kTortoise,
81 SpeedTierTestParams{SpeedTier::kGlacier,
84 TEST_P(SpeedTierTest, Roundtrip) {
85 const std::vector<uint8_t> orig = jxl::test::ReadTestData(
86 "external/wesaturate/500px/u76c0g_bliznaca_srgb8.png");
88 test::ThreadPoolForTests pool(8);
89 ASSERT_TRUE(SetFromBytes(Bytes(orig), &io, &pool));
91 const SpeedTierTestParams& params = GetParam();
93 if (params.speed_tier == SpeedTier::kGlacier) {
94 // just a few pixels will already take enough time at this setting
96 } else if (params.shrink8) {
97 io.ShrinkTo(io.xsize() / 8, io.ysize() / 8);
100 CompressParams cparams;
101 cparams.speed_tier = params.speed_tier;
102 cparams.SetCms(*JxlGetDefaultCms());
105 JXL_EXPECT_OK(test::Roundtrip(&io, cparams, {}, &io2, _));
106 EXPECT_LE(ButteraugliDistance(io.frames, io2.frames, ButteraugliParams(),
108 /*distmap=*/nullptr, /*pool=*/nullptr),
111 if (params.shrink8) {
112 cparams.SetLossless();
113 JXL_EXPECT_OK(test::Roundtrip(&io, cparams, {}, &io3, _));
115 JXL_EXPECT_OK(SamePixels(*io.Main().color(), *io3.Main().color(), _));