speed_tier_test.cc (4692B)
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/encode.h> 7 #include <jxl/types.h> 8 9 #include <cstddef> 10 #include <cstdint> 11 #include <ios> 12 #include <ostream> 13 #include <string> 14 #include <vector> 15 16 #include "lib/extras/dec/jxl.h" 17 #include "lib/extras/enc/jxl.h" 18 #include "lib/jxl/enc_params.h" 19 #include "lib/jxl/test_image.h" 20 #include "lib/jxl/test_utils.h" 21 #include "lib/jxl/testing.h" 22 23 namespace jxl { 24 namespace { 25 26 struct SpeedTierTestParams { 27 explicit SpeedTierTestParams(const SpeedTier speed_tier, 28 const bool shrink8 = false) 29 : speed_tier(speed_tier), shrink8(shrink8) {} 30 SpeedTier speed_tier; 31 bool shrink8; 32 }; 33 34 std::ostream& operator<<(std::ostream& os, SpeedTierTestParams params) { 35 auto previous_flags = os.flags(); 36 os << std::boolalpha; 37 os << "SpeedTierTestParams{" << static_cast<size_t>(params.speed_tier) 38 << ", /*shrink8=*/" << params.shrink8 << "}"; 39 os.flags(previous_flags); 40 return os; 41 } 42 43 class SpeedTierTest : public testing::TestWithParam<SpeedTierTestParams> {}; 44 45 JXL_GTEST_INSTANTIATE_TEST_SUITE_P( 46 SpeedTierTestInstantiation, SpeedTierTest, 47 testing::Values(SpeedTierTestParams{SpeedTier::kCheetah, 48 /*shrink8=*/true}, 49 SpeedTierTestParams{SpeedTier::kCheetah, 50 /*shrink8=*/false}, 51 SpeedTierTestParams{SpeedTier::kThunder, 52 /*shrink8=*/true}, 53 SpeedTierTestParams{SpeedTier::kThunder, 54 /*shrink8=*/false}, 55 SpeedTierTestParams{SpeedTier::kLightning, 56 /*shrink8=*/true}, 57 SpeedTierTestParams{SpeedTier::kLightning, 58 /*shrink8=*/false}, 59 SpeedTierTestParams{SpeedTier::kFalcon, 60 /*shrink8=*/true}, 61 SpeedTierTestParams{SpeedTier::kFalcon, 62 /*shrink8=*/false}, 63 SpeedTierTestParams{SpeedTier::kHare, 64 /*shrink8=*/true}, 65 SpeedTierTestParams{SpeedTier::kHare, 66 /*shrink8=*/false}, 67 SpeedTierTestParams{SpeedTier::kWombat, 68 /*shrink8=*/true}, 69 SpeedTierTestParams{SpeedTier::kWombat, 70 /*shrink8=*/false}, 71 SpeedTierTestParams{SpeedTier::kSquirrel, 72 /*shrink8=*/true}, 73 SpeedTierTestParams{SpeedTier::kSquirrel, 74 /*shrink8=*/false}, 75 SpeedTierTestParams{SpeedTier::kKitten, 76 /*shrink8=*/false}, 77 // Only downscaled image for Tortoise mode. 78 SpeedTierTestParams{SpeedTier::kTortoise, 79 /*shrink8=*/true}, 80 SpeedTierTestParams{SpeedTier::kGlacier, 81 /*shrink8=*/true})); 82 83 TEST_P(SpeedTierTest, Roundtrip) { 84 const SpeedTierTestParams& params = GetParam(); 85 test::ThreadPoolForTests pool(8); 86 const std::vector<uint8_t> orig = jxl::test::ReadTestData( 87 "external/wesaturate/500px/u76c0g_bliznaca_srgb8.png"); 88 test::TestImage t; 89 t.DecodeFromBytes(orig).ClearMetadata(); 90 if (params.speed_tier == SpeedTier::kGlacier) { 91 // just a few pixels will already take enough time at this setting 92 t.SetDimensions(8, 8); 93 } else if (params.shrink8) { 94 t.SetDimensions(t.ppf().xsize() / 8, t.ppf().ysize() / 8); 95 } 96 97 extras::JXLCompressParams cparams; 98 cparams.distance = 1.0f; 99 cparams.allow_expert_options = true; 100 cparams.AddOption(JXL_ENC_FRAME_SETTING_EFFORT, 101 10 - static_cast<int>(params.speed_tier)); 102 extras::JXLDecompressParams dparams; 103 dparams.accepted_formats = {{3, JXL_TYPE_UINT16, JXL_LITTLE_ENDIAN, 0}}; 104 105 { 106 extras::PackedPixelFile ppf_out; 107 test::Roundtrip(t.ppf(), cparams, dparams, nullptr, &ppf_out); 108 EXPECT_LE(test::ButteraugliDistance(t.ppf(), ppf_out), 2.0); 109 } 110 if (params.shrink8) { 111 cparams.distance = 0.0f; 112 extras::PackedPixelFile ppf_out; 113 test::Roundtrip(t.ppf(), cparams, dparams, nullptr, &ppf_out); 114 EXPECT_EQ(0.0f, test::ComputeDistance2(t.ppf(), ppf_out)); 115 } 116 } 117 } // namespace 118 } // namespace jxl