Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(234)

Side by Side Diff: media/base/video_color_space_unittest.cc

Issue 2088273003: Video Color Managament (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: bugfix Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "media/base/video_color_space.h"
6 #include "testing/gtest/include/gtest/gtest.h"
7
8 namespace media {
9
10 VideoColorSpace::PrimaryID all_primaries[] = {
11 VideoColorSpace::PRI_BT709, VideoColorSpace::PRI_BT470M,
12 VideoColorSpace::PRI_BT470BG, VideoColorSpace::PRI_SMPTE170M,
13 VideoColorSpace::PRI_SMPTE240M, VideoColorSpace::PRI_FILM,
14 VideoColorSpace::PRI_BT2020, VideoColorSpace::PRI_SMPTEST428_1,
15 VideoColorSpace::PRI_SMPTEST431_2, VideoColorSpace::PRI_SMPTEST432_1,
16 };
17
18 VideoColorSpace::TransferID all_transfers[] = {
19 VideoColorSpace::TRC_BT709, VideoColorSpace::TRC_GAMMA22,
20 VideoColorSpace::TRC_GAMMA28, VideoColorSpace::TRC_SMPTE170M,
21 VideoColorSpace::TRC_SMPTE240M, VideoColorSpace::TRC_LINEAR,
22 VideoColorSpace::TRC_LOG, VideoColorSpace::TRC_LOG_SQRT,
23 VideoColorSpace::TRC_IEC61966_2_4, VideoColorSpace::TRC_BT1361_ECG,
24 VideoColorSpace::TRC_IEC61966_2_1, VideoColorSpace::TRC_BT2020_10,
25 VideoColorSpace::TRC_BT2020_12, VideoColorSpace::TRC_SMPTEST2084,
26
27 // This one is weird as the non-linear numbers are not between 0 and 1.
28 // TODO(hubbe): Test this separately.
29 // VideoColorSpace::TRC_SMPTEST428_1,
30 };
31
32 VideoColorSpace::MatrixID all_matrices[] = {
33 VideoColorSpace::SPC_RGB, VideoColorSpace::SPC_BT709,
34 VideoColorSpace::SPC_UNSPECIFIED, VideoColorSpace::SPC_RESERVED,
35 VideoColorSpace::SPC_FCC, VideoColorSpace::SPC_BT470BG,
36 VideoColorSpace::SPC_SMPTE170M, VideoColorSpace::SPC_SMPTE240M,
37
38 // YCOCG produces lots of negative values which isn't compatible with many
39 // transfer functions.
40 // TODO(hubbe): Test this separately.
41 // VideoColorSpace::SPC_YCOCG,
42 VideoColorSpace::SPC_BT2020_NCL, VideoColorSpace::SPC_BT2020_CL,
43 VideoColorSpace::SPC_YDZDX,
44 };
45
46 TEST(SimpleVideoColorSpace, BT709toSRGB) {
47 VideoColorSpace bt709(COLOR_SPACE_HD_REC709);
48 VideoColorSpace sRGB = VideoColorSpace::SRGB();
49 ColorTransform t(bt709, sRGB, ColorTransform::INTENT_ABSOLUTE);
50
51 VideoColorSpace::TriStim tmp(16.0f / 255.0f, 0.5f, 0.5f);
52 t.transform(&tmp, 1);
53 EXPECT_NEAR(tmp.values[0], 0.0f, 0.001f);
54 EXPECT_NEAR(tmp.values[1], 0.0f, 0.001f);
55 EXPECT_NEAR(tmp.values[2], 0.0f, 0.001f);
56
57 tmp = VideoColorSpace::TriStim(235.0f / 255.0f, 0.5f, 0.5f);
58 t.transform(&tmp, 1);
59 EXPECT_NEAR(tmp.values[0], 1.0f, 0.001f);
60 EXPECT_NEAR(tmp.values[1], 1.0f, 0.001f);
61 EXPECT_NEAR(tmp.values[2], 1.0f, 0.001f);
62
63 // Test a blue color
64 tmp = VideoColorSpace::TriStim(128.0f / 255.0f, 240.0f / 255.0f, 0.5f);
65 t.transform(&tmp, 1);
66 EXPECT_GT(tmp.values[2], tmp.values[0]);
67 EXPECT_GT(tmp.values[2], tmp.values[1]);
68 }
69
70 TEST(SimpleVideoColorSpace, UnknownToSRGB) {
71 VideoColorSpace unknown;
72 VideoColorSpace sRGB = VideoColorSpace::SRGB();
73 ColorTransform t(unknown, sRGB, ColorTransform::INTENT_PERCEIVED);
74
75 VideoColorSpace::TriStim tmp(16.0f / 255.0f, 0.5f, 0.5f);
76 t.transform(&tmp, 1);
77 EXPECT_NEAR(tmp.values[0], 0.0f, 0.001f);
78 EXPECT_NEAR(tmp.values[1], 0.0f, 0.001f);
79 EXPECT_NEAR(tmp.values[2], 0.0f, 0.001f);
80
81 tmp = VideoColorSpace::TriStim(235.0f / 255.0f, 0.5f, 0.5f);
82 t.transform(&tmp, 1);
83 EXPECT_NEAR(tmp.values[0], 1.0f, 0.001f);
84 EXPECT_NEAR(tmp.values[1], 1.0f, 0.001f);
85 EXPECT_NEAR(tmp.values[2], 1.0f, 0.001f);
86
87 // Test a blue color
88 tmp = VideoColorSpace::TriStim(128.0f / 255.0f, 240.0f / 255.0f, 0.5f);
89 t.transform(&tmp, 1);
90 EXPECT_GT(tmp.values[2], tmp.values[0]);
91 EXPECT_GT(tmp.values[2], tmp.values[1]);
92 }
93
94 class PrimaryTest : public testing::TestWithParam<VideoColorSpace::PrimaryID> {
95 };
96
97 TEST_P(PrimaryTest, checkInvertible) {
98 EXPECT_EQ(VideoColorSpace::GetPrimaryMatrix(GetParam()).rows[3][3], 1.0f);
99 // Check that all primary matrices are invertable.
100 EXPECT_EQ(
101 VideoColorSpace::Invert(VideoColorSpace::GetPrimaryMatrix(GetParam()))
102 .rows[3][3],
103 1.0f);
104 };
105
106 INSTANTIATE_TEST_CASE_P(VideoColorSpace,
107 PrimaryTest,
108 testing::ValuesIn(all_primaries));
109
110 class MatrixTest : public testing::TestWithParam<VideoColorSpace::MatrixID> {};
111
112 TEST_P(MatrixTest, checkInvertible) {
113 EXPECT_EQ(VideoColorSpace::GetTransferMatrix(GetParam()).rows[3][3], 1.0f);
114 // Check that all transfer matrices are invertable.
115 EXPECT_EQ(
116 VideoColorSpace::Invert(VideoColorSpace::GetTransferMatrix(GetParam()))
117 .rows[3][3],
118 1.0f);
119 };
120
121 INSTANTIATE_TEST_CASE_P(VideoColorSpace,
122 MatrixTest,
123 testing::ValuesIn(all_matrices));
124
125 class TransferTest
126 : public testing::TestWithParam<VideoColorSpace::TransferID> {};
127
128 TEST_P(TransferTest, basicTest) {
129 for (float x = 0.0; x <= 1.0; x += 1.0f / 128.0f) {
130 float linear = VideoColorSpace::toLinear(GetParam(), x);
131 float x2 = VideoColorSpace::fromLinear(GetParam(), linear);
132 EXPECT_NEAR(x, x2, 0.001);
133 }
134 }
135
136 INSTANTIATE_TEST_CASE_P(VideoColorSpace,
137 TransferTest,
138 testing::ValuesIn(all_transfers));
139
140 typedef std::tr1::tuple<VideoColorSpace::PrimaryID,
141 VideoColorSpace::TransferID,
142 VideoColorSpace::MatrixID,
143 bool>
144 VideoColorSpaceTestData;
145 class VideoColorSpaceTest
146 : public testing::TestWithParam<VideoColorSpaceTestData> {
147 public:
148 VideoColorSpaceTest()
149 : color_space_(std::tr1::get<0>(GetParam()),
150 std::tr1::get<1>(GetParam()),
151 std::tr1::get<2>(GetParam()),
152 std::tr1::get<3>(GetParam())) {}
153
154 protected:
155 VideoColorSpace color_space_;
156 };
157
158 TEST_P(VideoColorSpaceTest, testGetters) {
159 EXPECT_EQ(color_space_.GetPrimaries().size(), 4u);
160 EXPECT_NE(color_space_.GetPrimaryMatrix().rows[0][0], -10.0f);
161 EXPECT_NE(color_space_.toLinear(0.0), -1.0f);
162 EXPECT_NE(color_space_.fromLinear(0.0), -1.0f);
163 }
164
165 TEST_P(VideoColorSpaceTest, testNullTransform) {
166 ColorTransform t(color_space_, color_space_, ColorTransform::INTENT_ABSOLUTE);
167 VideoColorSpace::TriStim tristim(0.4, 0.5, 0.6);
168 t.transform(&tristim, 1);
169 EXPECT_NEAR(tristim.values[0], 0.4, 0.001);
170 EXPECT_NEAR(tristim.values[1], 0.5, 0.001);
171 EXPECT_NEAR(tristim.values[2], 0.6, 0.001);
172 }
173
174 TEST_P(VideoColorSpaceTest, toXYZandBack) {
175 ColorTransform t1(color_space_, VideoColorSpace::XYZ(),
176 ColorTransform::INTENT_ABSOLUTE);
177 ColorTransform t2(VideoColorSpace::XYZ(), color_space_,
178 ColorTransform::INTENT_ABSOLUTE);
179 VideoColorSpace::TriStim tristim(0.4, 0.5, 0.6);
180 t1.transform(&tristim, 1);
181 t2.transform(&tristim, 1);
182 EXPECT_NEAR(tristim.values[0], 0.4, 0.001);
183 EXPECT_NEAR(tristim.values[1], 0.5, 0.001);
184 EXPECT_NEAR(tristim.values[2], 0.6, 0.001);
185 }
186
187 INSTANTIATE_TEST_CASE_P(
188 A,
189 VideoColorSpaceTest,
190 testing::Combine(testing::ValuesIn(all_primaries),
191 testing::ValuesIn(all_transfers),
192 testing::Values(VideoColorSpace::SPC_BT709),
193 testing::Values(false)));
194
195 INSTANTIATE_TEST_CASE_P(
196 B,
197 VideoColorSpaceTest,
198 testing::Combine(testing::Values(VideoColorSpace::PRI_BT709),
199 testing::ValuesIn(all_transfers),
200 testing::ValuesIn(all_matrices),
201 testing::Values(true, false)));
202
203 INSTANTIATE_TEST_CASE_P(
204 C,
205 VideoColorSpaceTest,
206 testing::Combine(testing::ValuesIn(all_primaries),
207 testing::Values(VideoColorSpace::TRC_BT709),
208 testing::ValuesIn(all_matrices),
209 testing::Values(true, false)));
210
211 } // namespace
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698