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/butteraugli.h"
7
8 #include "gtest/gtest.h"
9 #include "jxl/butteraugli_cxx.h"
10 #include "lib/jxl/test_utils.h"
11
TEST(ButteraugliTest,Lossless)12 TEST(ButteraugliTest, Lossless) {
13 uint32_t xsize = 171;
14 uint32_t ysize = 219;
15 std::vector<uint8_t> pixels = jxl::test::GetSomeTestImage(xsize, ysize, 4, 0);
16 JxlPixelFormat pixel_format = {4, JXL_TYPE_UINT16, JXL_BIG_ENDIAN, 0};
17
18 JxlButteraugliApiPtr api(JxlButteraugliApiCreate(nullptr));
19 JxlButteraugliResultPtr result(JxlButteraugliCompute(
20 api.get(), xsize, ysize, &pixel_format, pixels.data(), pixels.size(),
21 &pixel_format, pixels.data(), pixels.size()));
22 EXPECT_EQ(0.0, JxlButteraugliResultGetDistance(result.get(), 8.0));
23 }
24
TEST(ButteraugliTest,Distmap)25 TEST(ButteraugliTest, Distmap) {
26 uint32_t xsize = 171;
27 uint32_t ysize = 219;
28 std::vector<uint8_t> pixels = jxl::test::GetSomeTestImage(xsize, ysize, 4, 0);
29 JxlPixelFormat pixel_format = {4, JXL_TYPE_UINT16, JXL_BIG_ENDIAN, 0};
30
31 JxlButteraugliApiPtr api(JxlButteraugliApiCreate(nullptr));
32 JxlButteraugliResultPtr result(JxlButteraugliCompute(
33 api.get(), xsize, ysize, &pixel_format, pixels.data(), pixels.size(),
34 &pixel_format, pixels.data(), pixels.size()));
35 EXPECT_EQ(0.0, JxlButteraugliResultGetDistance(result.get(), 8.0));
36 const float* distmap;
37 uint32_t row_stride;
38 JxlButteraugliResultGetDistmap(result.get(), &distmap, &row_stride);
39 for (uint32_t y = 0; y < ysize; y++) {
40 for (uint32_t x = 0; x < xsize; x++) {
41 EXPECT_EQ(0.0, distmap[y * row_stride + x]);
42 }
43 }
44 }
45
TEST(ButteraugliTest,Distorted)46 TEST(ButteraugliTest, Distorted) {
47 uint32_t xsize = 171;
48 uint32_t ysize = 219;
49 std::vector<uint8_t> orig_pixels =
50 jxl::test::GetSomeTestImage(xsize, ysize, 4, 0);
51 std::vector<uint8_t> dist_pixels =
52 jxl::test::GetSomeTestImage(xsize, ysize, 4, 0);
53 dist_pixels[0] += 128;
54
55 JxlPixelFormat pixel_format = {4, JXL_TYPE_UINT16, JXL_BIG_ENDIAN, 0};
56
57 JxlButteraugliApiPtr api(JxlButteraugliApiCreate(nullptr));
58 JxlButteraugliResultPtr result(JxlButteraugliCompute(
59 api.get(), xsize, ysize, &pixel_format, orig_pixels.data(),
60 orig_pixels.size(), &pixel_format, dist_pixels.data(),
61 dist_pixels.size()));
62 EXPECT_NE(0.0, JxlButteraugliResultGetDistance(result.get(), 8.0));
63 }
64
TEST(ButteraugliTest,Api)65 TEST(ButteraugliTest, Api) {
66 uint32_t xsize = 171;
67 uint32_t ysize = 219;
68 std::vector<uint8_t> orig_pixels =
69 jxl::test::GetSomeTestImage(xsize, ysize, 4, 0);
70 std::vector<uint8_t> dist_pixels =
71 jxl::test::GetSomeTestImage(xsize, ysize, 4, 0);
72 dist_pixels[0] += 128;
73
74 JxlPixelFormat pixel_format = {4, JXL_TYPE_UINT16, JXL_BIG_ENDIAN, 0};
75
76 JxlButteraugliApiPtr api(JxlButteraugliApiCreate(nullptr));
77 JxlButteraugliApiSetHFAsymmetry(api.get(), 1.0f);
78 JxlButteraugliApiSetIntensityTarget(api.get(), 250.0f);
79 JxlButteraugliResultPtr result(JxlButteraugliCompute(
80 api.get(), xsize, ysize, &pixel_format, orig_pixels.data(),
81 orig_pixels.size(), &pixel_format, dist_pixels.data(),
82 dist_pixels.size()));
83 double distance0 = JxlButteraugliResultGetDistance(result.get(), 8.0);
84
85 JxlButteraugliApiSetHFAsymmetry(api.get(), 2.0f);
86 result.reset(JxlButteraugliCompute(api.get(), xsize, ysize, &pixel_format,
87 orig_pixels.data(), orig_pixels.size(),
88 &pixel_format, dist_pixels.data(),
89 dist_pixels.size()));
90 double distance1 = JxlButteraugliResultGetDistance(result.get(), 8.0);
91
92 EXPECT_NE(distance0, distance1);
93
94 JxlButteraugliApiSetIntensityTarget(api.get(), 80.0f);
95 result.reset(JxlButteraugliCompute(api.get(), xsize, ysize, &pixel_format,
96 orig_pixels.data(), orig_pixels.size(),
97 &pixel_format, dist_pixels.data(),
98 dist_pixels.size()));
99 double distance2 = JxlButteraugliResultGetDistance(result.get(), 8.0);
100
101 EXPECT_NE(distance1, distance2);
102 }
103