1 #ifdef ZIMG_X86
2
3 #include <cmath>
4 #include "common/cpuinfo.h"
5 #include "common/pixel.h"
6 #include "common/x86/cpuinfo_x86.h"
7 #include "graph/image_filter.h"
8 #include "colorspace/colorspace.h"
9
10 #include "gtest/gtest.h"
11 #include "graph/filter_validator.h"
12
13 namespace {
14
test_case(const zimg::colorspace::ColorspaceDefinition & csp_in,const zimg::colorspace::ColorspaceDefinition & csp_out,const char * const expected_sha1[3],double expected_snr)15 void test_case(const zimg::colorspace::ColorspaceDefinition &csp_in, const zimg::colorspace::ColorspaceDefinition &csp_out,
16 const char * const expected_sha1[3], double expected_snr)
17 {
18 const unsigned w = 640;
19 const unsigned h = 480;
20
21 if (!zimg::query_x86_capabilities().sse2) {
22 SUCCEED() << "sse2 not available, skipping";
23 return;
24 }
25
26 zimg::PixelFormat format = zimg::PixelType::FLOAT;
27 auto builder = zimg::colorspace::ColorspaceConversion{ w, h }
28 .set_csp_in(csp_in)
29 .set_csp_out(csp_out)
30 .set_approximate_gamma(true);
31
32 auto filter_c = builder.set_cpu(zimg::CPUClass::NONE).create();
33 auto filter_sse2 = builder.set_cpu(zimg::CPUClass::X86_SSE2).create();
34
35 FilterValidator validator{ filter_sse2.get(), w, h, format };
36 validator.set_sha1(expected_sha1)
37 .set_ref_filter(filter_c.get(), expected_snr)
38 .set_yuv(csp_in.matrix != zimg::colorspace::MatrixCoefficients::RGB)
39 .validate();
40 }
41
42 } // namespace
43
44
TEST(ColorspaceConversionSSE2Test,test_transfer_lut)45 TEST(ColorspaceConversionSSE2Test, test_transfer_lut)
46 {
47 using namespace zimg::colorspace;
48
49 const char *expected_sha1[][3] = {
50 {
51 "23d012fcb280f601e2e3c349229d0108e3cd632a",
52 "21f5071b0a817c28295d51ead5137cabc6e0d5c4",
53 "158c4ff0c91c08f82e9fc35a500a1c8166f5ae6b"
54 },
55 {
56 "74e3ebaea6ed216e6792a186592f70149616d2ca",
57 "a9f8a97a9f51c6be9aab3f48fb9cd51d6c33a605",
58 "b5b101c985b5e6ce6cac6f89c9b8d21085e134a3"
59 },
60 {
61 "8206be2ae5e8a0fc003daeec4178189eecf82a13",
62 "6bc5833cbd22f04c1965d230aad2ef8969da24b7",
63 "6538399afe0b9fd55a95608b25c8036e16d658b8"
64 },
65 {
66 "a33cd49cc2cf605ef8e80d61133d35660ab0ca5a",
67 "9525b3bad68eb52b6675de13bba15fae35bc9816",
68 "e783d9b01fd6d7ae5c5b65349b3d4739c0e5bc5f"
69 },
70 };
71 const double expected_tolinear_snr = 80.0;
72 const double expected_togamma_snr = 60.0;
73
74 SCOPED_TRACE("tolinear 709");
75 test_case({ MatrixCoefficients::RGB, TransferCharacteristics::REC_709, ColorPrimaries::UNSPECIFIED },
76 { MatrixCoefficients::RGB, TransferCharacteristics::LINEAR, ColorPrimaries::UNSPECIFIED },
77 expected_sha1[0], expected_tolinear_snr);
78 SCOPED_TRACE("togamma 709");
79 test_case({ MatrixCoefficients::RGB, TransferCharacteristics::LINEAR, ColorPrimaries::UNSPECIFIED },
80 { MatrixCoefficients::RGB, TransferCharacteristics::REC_709, ColorPrimaries::UNSPECIFIED },
81 expected_sha1[1], expected_togamma_snr);
82 SCOPED_TRACE("tolinear st2084");
83 test_case({ MatrixCoefficients::RGB, TransferCharacteristics::ST_2084, ColorPrimaries::UNSPECIFIED },
84 { MatrixCoefficients::RGB, TransferCharacteristics::LINEAR, ColorPrimaries::UNSPECIFIED },
85 expected_sha1[2], expected_tolinear_snr);
86 SCOPED_TRACE("togamma st2084");
87 test_case({ MatrixCoefficients::RGB, TransferCharacteristics::LINEAR, ColorPrimaries::UNSPECIFIED },
88 { MatrixCoefficients::RGB, TransferCharacteristics::ST_2084, ColorPrimaries::UNSPECIFIED },
89 expected_sha1[3], expected_togamma_snr);
90 }
91
92 #endif // ZIMG_X86
93