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