1 /*
2 * Copyright (C) 2020 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 //#define LOG_NDEBUG 0
18 #define LOG_TAG "ColorUtilsTest"
19 #include <utils/Log.h>
20
21 #include <gtest/gtest.h>
22
23 #include <stdio.h>
24
25 #include <media/NdkMediaFormat.h>
26 #include <media/NdkMediaFormatPriv.h>
27 #include <media/stagefright/MediaCodecConstants.h>
28 #include <media/stagefright/foundation/ABuffer.h>
29 #include <media/stagefright/foundation/ColorUtils.h>
30
31 const size_t kHDRBufferSize = 25;
32 const uint16_t kHDRInfoTestValue1 = 420;
33 const uint16_t kHDRInfoTestValue2 = 42069;
34
35 using namespace android;
36
37 typedef ColorAspects CA;
38
39 class ColorRangeTest : public ::testing::TestWithParam</* ColorRange */ CA::Range> {
40 public:
ColorRangeTest()41 ColorRangeTest() { mRange = GetParam(); };
42
43 CA::Range mRange;
44 };
45
46 class ColorTransferTest : public ::testing::TestWithParam</* ColorTransfer */ CA::Transfer> {
47 public:
ColorTransferTest()48 ColorTransferTest() { mTransfer = GetParam(); };
49
50 CA::Transfer mTransfer;
51 };
52
53 class ColorStandardTest : public ::testing::TestWithParam<std::pair<
54 /* Primaries */ CA::Primaries,
55 /* MatrixCoeffs */ CA::MatrixCoeffs>> {
56 public:
ColorStandardTest()57 ColorStandardTest() {
58 mPrimaries = GetParam().first;
59 mMatrixCoeffs = GetParam().second;
60 };
61
62 CA::Primaries mPrimaries;
63 CA::MatrixCoeffs mMatrixCoeffs;
64 };
65
66 class IsoToPlatformAspectsTest : public ::testing::TestWithParam<std::tuple<
67 /* Primaries */ CA::Primaries,
68 /* Transfer */ CA::Transfer,
69 /* MatrixCoeffs */ CA::MatrixCoeffs,
70 /* Standard */ int32_t,
71 /* Transfer */ int32_t>> {
72 public:
IsoToPlatformAspectsTest()73 IsoToPlatformAspectsTest() {
74 mPrimaries = std::get<0>(GetParam());
75 mTransfer = std::get<1>(GetParam());
76 mMatrixCoeffs = std::get<2>(GetParam());
77 mPlatformStandard = std::get<3>(GetParam());
78 mPlatformTransfer = std::get<4>(GetParam());
79 };
80
81 CA::Primaries mPrimaries;
82 CA::Transfer mTransfer;
83 CA::MatrixCoeffs mMatrixCoeffs;
84 int32_t mPlatformStandard;
85 int32_t mPlatformTransfer;
86 };
87
88 class ColorAspectsTest : public ::testing::TestWithParam<std::tuple<
89 /* Primaries */ CA::Primaries,
90 /* ColorTransfer */ CA::Transfer,
91 /* MatrixCoeffs */ CA::MatrixCoeffs,
92 /* ColorRange */ CA::Range,
93 /* ColorStandard */ CA::Standard>> {
94 public:
ColorAspectsTest()95 ColorAspectsTest() {
96 mPrimaries = std::get<0>(GetParam());
97 mTransfer = std::get<1>(GetParam());
98 mMatrixCoeffs = std::get<2>(GetParam());
99 mRange = std::get<3>(GetParam());
100 mStandard = std::get<4>(GetParam());
101 };
102
103 CA::Primaries mPrimaries;
104 CA::Transfer mTransfer;
105 CA::MatrixCoeffs mMatrixCoeffs;
106 CA::Range mRange;
107 CA::Standard mStandard;
108 };
109
110 class DefaultColorAspectsTest : public ::testing::TestWithParam<std::tuple<
111 /* Width */ int32_t,
112 /* Height */ int32_t,
113 /* Primaries */ CA::Primaries,
114 /* MatrixCoeffs */ CA::MatrixCoeffs>> {
115 public:
DefaultColorAspectsTest()116 DefaultColorAspectsTest() {
117 mWidth = std::get<0>(GetParam());
118 mHeight = std::get<1>(GetParam());
119 mPrimaries = std::get<2>(GetParam());
120 mMatrixCoeffs = std::get<3>(GetParam());
121 };
122
123 int32_t mWidth;
124 int32_t mHeight;
125 CA::Primaries mPrimaries;
126 CA::MatrixCoeffs mMatrixCoeffs;
127 };
128
129 class DataSpaceTest : public ::testing::TestWithParam<std::tuple<
130 /* ColorRange */ CA::Range,
131 /* Primaries */ CA::Primaries,
132 /* ColorTransfer */ CA::Transfer,
133 /* MatrixCoeffs */ CA::MatrixCoeffs,
134 /* v0_android_dataspace */ android_dataspace,
135 /* android_dataspace */ android_dataspace>> {
136 public:
DataSpaceTest()137 DataSpaceTest() {
138 mRange = std::get<0>(GetParam());
139 mPrimaries = std::get<1>(GetParam());
140 mTransfer = std::get<2>(GetParam());
141 mMatrixCoeffs = std::get<3>(GetParam());
142 mDataSpaceV0 = std::get<4>(GetParam());
143 mDataSpace = std::get<5>(GetParam());
144 };
145
146 CA::Range mRange;
147 CA::Primaries mPrimaries;
148 CA::Transfer mTransfer;
149 CA::MatrixCoeffs mMatrixCoeffs;
150 android_dataspace mDataSpaceV0;
151 android_dataspace mDataSpace;
152 };
153
TEST_P(ColorRangeTest,WrapColorRangeTest)154 TEST_P(ColorRangeTest, WrapColorRangeTest) {
155 int32_t range = ColorUtils::wrapColorAspectsIntoColorRange(mRange);
156 CA::Range unwrappedRange;
157 status_t status = ColorUtils::unwrapColorAspectsFromColorRange(range, &unwrappedRange);
158 ASSERT_EQ(status, OK) << "unwrapping ColorAspects from ColorRange failed";
159 EXPECT_EQ(unwrappedRange, mRange) << "Returned ColorRange doesn't match";
160 ALOGV("toString test: Range: %s", asString(mRange, "default"));
161 }
162
TEST_P(ColorTransferTest,WrapColorTransferTest)163 TEST_P(ColorTransferTest, WrapColorTransferTest) {
164 int32_t transfer = ColorUtils::wrapColorAspectsIntoColorTransfer(mTransfer);
165 CA::Transfer unwrappedTransfer;
166 status_t status = ColorUtils::unwrapColorAspectsFromColorTransfer(transfer, &unwrappedTransfer);
167 ASSERT_EQ(status, OK) << "unwrapping ColorAspects from ColorTransfer failed";
168 EXPECT_EQ(unwrappedTransfer, mTransfer) << "Returned ColorTransfer doesn't match";
169 ALOGV("toString test: Transfer: %s", asString(mTransfer, "default"));
170 }
171
TEST_P(ColorStandardTest,WrapColorStandardTest)172 TEST_P(ColorStandardTest, WrapColorStandardTest) {
173 int32_t standard = ColorUtils::wrapColorAspectsIntoColorStandard(mPrimaries, mMatrixCoeffs);
174 CA::Primaries unwrappedPrimaries;
175 CA::MatrixCoeffs unwrappedMatrixCoeffs;
176 status_t status = ColorUtils::unwrapColorAspectsFromColorStandard(standard, &unwrappedPrimaries,
177 &unwrappedMatrixCoeffs);
178 ASSERT_EQ(status, OK) << "unwrapping ColorAspects from ColorStandard failed";
179 EXPECT_EQ(unwrappedPrimaries, mPrimaries) << "Returned primaries doesn't match";
180 EXPECT_EQ(unwrappedMatrixCoeffs, mMatrixCoeffs) << "Returned matrixCoeffs doesn't match";
181 }
182
TEST_P(ColorAspectsTest,PlatformAspectsTest)183 TEST_P(ColorAspectsTest, PlatformAspectsTest) {
184 CA aspects;
185 aspects.mRange = mRange;
186 aspects.mPrimaries = mPrimaries;
187 aspects.mTransfer = mTransfer;
188 aspects.mMatrixCoeffs = mMatrixCoeffs;
189
190 int32_t range = -1;
191 int32_t standard = -1;
192 int32_t transfer = -1;
193 status_t status = ColorUtils::convertCodecColorAspectsToPlatformAspects(aspects, &range,
194 &standard, &transfer);
195 ASSERT_EQ(status, OK) << "Conversion of ColorAspects to PlatformAspects failed";
196
197 CA returnedAspects;
198 status = ColorUtils::convertPlatformColorAspectsToCodecAspects(range, standard, transfer,
199 returnedAspects);
200 ASSERT_EQ(status, OK) << "Conversion of PlatformAspects to ColorAspects failed";
201 EXPECT_EQ(returnedAspects.mRange, aspects.mRange)
202 << "range mismatch for conversion between PlatformAspects";
203 EXPECT_EQ(returnedAspects.mPrimaries, aspects.mPrimaries)
204 << "primaries mismatch for conversion between PlatformAspects";
205 EXPECT_EQ(returnedAspects.mTransfer, aspects.mTransfer)
206 << "transfer mismatch for conversion between PlatformAspects";
207 EXPECT_EQ(returnedAspects.mMatrixCoeffs, aspects.mMatrixCoeffs)
208 << "matrixCoeffs mismatch for conversion between PlatformAspects";
209 }
210
TEST_P(ColorAspectsTest,IsoAspectsTest)211 TEST_P(ColorAspectsTest, IsoAspectsTest) {
212 CA aspects;
213 aspects.mRange = mRange;
214 aspects.mPrimaries = mPrimaries;
215 aspects.mTransfer = mTransfer;
216 aspects.mMatrixCoeffs = mMatrixCoeffs;
217
218 int32_t primaries = -1;
219 int32_t colorTransfer = -1;
220 int32_t matrixCoeffs = -1;
221 bool fullRange = false;
222 ColorUtils::convertCodecColorAspectsToIsoAspects(aspects, &primaries, &colorTransfer,
223 &matrixCoeffs, &fullRange);
224
225 CA returnedAspects;
226 ColorUtils::convertIsoColorAspectsToCodecAspects(primaries, colorTransfer, matrixCoeffs,
227 fullRange, returnedAspects);
228 EXPECT_EQ(returnedAspects.mRange, aspects.mRange)
229 << "range mismatch for conversion between IsoAspects";
230 EXPECT_EQ(returnedAspects.mPrimaries, aspects.mPrimaries)
231 << "primaries mismatch for conversion between IsoAspects";
232 EXPECT_EQ(returnedAspects.mTransfer, aspects.mTransfer)
233 << "transfer mismatch for conversion between IsoAspects";
234 EXPECT_EQ(returnedAspects.mMatrixCoeffs, aspects.mMatrixCoeffs)
235 << "matrixCoeffs mismatch for conversion between IsoAspects";
236 }
237
TEST_P(IsoToPlatformAspectsTest,IsoAspectsToPlatformAspectsTest)238 TEST_P(IsoToPlatformAspectsTest, IsoAspectsToPlatformAspectsTest) {
239 CA aspects;
240 aspects.mPrimaries = mPrimaries;
241 aspects.mTransfer = mTransfer;
242 aspects.mMatrixCoeffs = mMatrixCoeffs;
243
244 int32_t isoPrimaries = -1;
245 int32_t isoTransfer = -1;
246 int32_t isoMatrixCoeffs = -1;
247 bool fullrange = false;
248 ColorUtils::convertCodecColorAspectsToIsoAspects(aspects, &isoPrimaries, &isoTransfer,
249 &isoMatrixCoeffs, &fullrange);
250
251 int32_t range = -1;
252 int32_t standard = -1;
253 int32_t transfer = -1;
254 ColorUtils::convertIsoColorAspectsToPlatformAspects(isoPrimaries, isoTransfer, isoMatrixCoeffs,
255 fullrange, &range, &standard, &transfer);
256 if (fullrange) {
257 EXPECT_EQ(range, ColorUtils::kColorRangeFull)
258 << "range incorrect converting to PlatformAspects";
259 }
260 EXPECT_EQ(standard, mPlatformStandard) << "standard incorrect converting to PlatformAspects";
261 EXPECT_EQ(transfer, mPlatformTransfer) << "transfer incorrect converting to PlatformAspects";
262 }
263
TEST_P(ColorAspectsTest,PackColorAspectsTest)264 TEST_P(ColorAspectsTest, PackColorAspectsTest) {
265 CA aspects;
266 aspects.mRange = mRange;
267 aspects.mPrimaries = mPrimaries;
268 aspects.mTransfer = mTransfer;
269 aspects.mMatrixCoeffs = mMatrixCoeffs;
270 uint32_t packedColorAspects = ColorUtils::packToU32(aspects);
271
272 CA unpackedAspects = ColorUtils::unpackToColorAspects(packedColorAspects);
273 EXPECT_EQ(unpackedAspects.mRange, mRange) << "range mismatch after unpacking";
274 EXPECT_EQ(unpackedAspects.mPrimaries, mPrimaries) << "primaries mismatch after unpacking";
275 EXPECT_EQ(unpackedAspects.mTransfer, mTransfer) << "transfer mismatch after unpacking";
276 EXPECT_EQ(unpackedAspects.mMatrixCoeffs, mMatrixCoeffs)
277 << "matrixCoeffs mismatch after unpacking";
278 ALOGV("toString test: Standard: %s", asString(mStandard, "default"));
279 }
280
TEST_P(DefaultColorAspectsTest,DefaultColorAspectsTest)281 TEST_P(DefaultColorAspectsTest, DefaultColorAspectsTest) {
282 CA aspects;
283 aspects.mRange = CA::RangeUnspecified;
284 aspects.mPrimaries = CA::PrimariesUnspecified;
285 aspects.mMatrixCoeffs = CA::MatrixUnspecified;
286 aspects.mTransfer = CA::TransferUnspecified;
287
288 ColorUtils::setDefaultCodecColorAspectsIfNeeded(aspects, mWidth, mHeight);
289 EXPECT_EQ(aspects.mRange, CA::RangeLimited) << "range not set to default";
290 EXPECT_EQ(aspects.mPrimaries, mPrimaries) << "primaries not set to default";
291 EXPECT_EQ(aspects.mMatrixCoeffs, mMatrixCoeffs) << "matrixCoeffs not set to default";
292 EXPECT_EQ(aspects.mTransfer, CA::TransferSMPTE170M) << "transfer not set to default";
293 }
294
TEST_P(DataSpaceTest,DataSpaceTest)295 TEST_P(DataSpaceTest, DataSpaceTest) {
296 CA aspects;
297 aspects.mRange = mRange;
298 aspects.mPrimaries = mPrimaries;
299 aspects.mTransfer = mTransfer;
300 aspects.mMatrixCoeffs = mMatrixCoeffs;
301
302 android_dataspace dataSpace = ColorUtils::getDataSpaceForColorAspects(aspects, false);
303 EXPECT_EQ(dataSpace, mDataSpace) << "Returned incorrect dataspace";
304
305 bool status = ColorUtils::convertDataSpaceToV0(dataSpace);
306 ASSERT_TRUE(status) << "Returned v0 dataspace is not aspect-only";
307 EXPECT_EQ(dataSpace, mDataSpaceV0) << "Returned incorrect v0 dataspace";
308 }
309
TEST(ColorUtilsUnitTest,AspectsChangedTest)310 TEST(ColorUtilsUnitTest, AspectsChangedTest) {
311 CA origAspects;
312 origAspects.mRange = CA::Range::RangeFull;
313 origAspects.mPrimaries = CA::Primaries::PrimariesBT709_5;
314 origAspects.mTransfer = CA::Transfer::TransferLinear;
315 origAspects.mMatrixCoeffs = CA::MatrixCoeffs::MatrixBT709_5;
316
317 CA aspects;
318 aspects.mRange = CA::Range::RangeFull;
319 aspects.mPrimaries = CA::Primaries::PrimariesBT709_5;
320 aspects.mTransfer = CA::Transfer::TransferLinear;
321 aspects.mMatrixCoeffs = CA::MatrixCoeffs::MatrixBT709_5;
322
323 bool status = ColorUtils::checkIfAspectsChangedAndUnspecifyThem(aspects, origAspects);
324 ASSERT_FALSE(status) << "ColorAspects comparison check failed";
325
326 aspects.mRange = CA::Range::RangeLimited;
327 status = ColorUtils::checkIfAspectsChangedAndUnspecifyThem(aspects, origAspects);
328 ASSERT_TRUE(status) << "ColorAspects comparison check failed";
329 EXPECT_EQ(aspects.mRange, CA::Range::RangeUnspecified) << "range should have been unspecified";
330 aspects.mRange = CA::Range::RangeFull;
331
332 aspects.mTransfer = CA::Transfer::TransferSRGB;
333 status = ColorUtils::checkIfAspectsChangedAndUnspecifyThem(aspects, origAspects);
334 ASSERT_TRUE(status) << "ColorAspects comparison check failed";
335 EXPECT_EQ(aspects.mTransfer, CA::Transfer::TransferUnspecified)
336 << "transfer should have been unspecified";
337 aspects.mTransfer = CA::Transfer::TransferLinear;
338
339 aspects.mPrimaries = CA::Primaries::PrimariesBT2020;
340 status = ColorUtils::checkIfAspectsChangedAndUnspecifyThem(aspects, origAspects, true);
341 ASSERT_TRUE(status) << "ColorAspects comparison check failed";
342 EXPECT_EQ(aspects.mPrimaries, CA::Primaries::PrimariesUnspecified)
343 << "primaries should have been unspecified";
344 EXPECT_EQ(aspects.mMatrixCoeffs, CA::MatrixCoeffs::MatrixUnspecified)
345 << "matrixCoeffs should have been unspecified";
346
347 aspects.mMatrixCoeffs = CA::MatrixCoeffs::MatrixSMPTE240M;
348 status = ColorUtils::checkIfAspectsChangedAndUnspecifyThem(aspects, origAspects, true);
349 ASSERT_TRUE(status) << "ColorAspects comparison check failed";
350 EXPECT_EQ(aspects.mPrimaries, CA::Primaries::PrimariesUnspecified)
351 << "primaries should have been unspecified";
352 EXPECT_EQ(aspects.mMatrixCoeffs, CA::MatrixCoeffs::MatrixUnspecified)
353 << "matrixCoeffs should have been unspecified";
354 }
355
TEST(ColorUtilsUnitTest,ColorConfigFromFormatTest)356 TEST(ColorUtilsUnitTest, ColorConfigFromFormatTest) {
357 int range = -1;
358 int standard = -1;
359 int transfer = -1;
360 sp<AMessage> format = new AMessage();
361 ASSERT_NE(format, nullptr) << "failed to create AMessage";
362 ColorUtils::getColorConfigFromFormat(format, &range, &standard, &transfer);
363 EXPECT_EQ(range | standard | transfer, 0) << "color config didn't default to 0";
364
365 format->setInt32(KEY_COLOR_RANGE, CA::Range::RangeFull);
366 format->setInt32(KEY_COLOR_STANDARD, CA::Standard::StandardBT709);
367 format->setInt32(KEY_COLOR_TRANSFER, CA::Transfer::TransferLinear);
368 ColorUtils::getColorConfigFromFormat(format, &range, &standard, &transfer);
369 EXPECT_EQ(range, CA::Range::RangeFull) << "range mismatch";
370 EXPECT_EQ(standard, CA::Standard::StandardBT709) << "standard mismatch";
371 EXPECT_EQ(transfer, CA::Transfer::TransferLinear) << "transfer mismatch";
372
373 range = standard = transfer = -1;
374 sp<AMessage> copyFormat = new AMessage();
375 ASSERT_NE(copyFormat, nullptr) << "failed to create AMessage";
376 ColorUtils::copyColorConfig(format, copyFormat);
377 bool status = copyFormat->findInt32(KEY_COLOR_RANGE, &range);
378 ASSERT_TRUE(status) << "ColorConfig range entry missing";
379 status = copyFormat->findInt32(KEY_COLOR_STANDARD, &standard);
380 ASSERT_TRUE(status) << "ColorConfig standard entry missing";
381 status = copyFormat->findInt32(KEY_COLOR_TRANSFER, &transfer);
382 ASSERT_TRUE(status) << "ColorConfig transfer entry missing";
383 EXPECT_EQ(range, CA::Range::RangeFull) << "range mismatch";
384 EXPECT_EQ(standard, CA::Standard::StandardBT709) << "standard mismatch";
385 EXPECT_EQ(transfer, CA::Transfer::TransferLinear) << "transfer mismatchd";
386
387 range = standard = transfer = -1;
388 ColorUtils::getColorConfigFromFormat(copyFormat, &range, &standard, &transfer);
389 EXPECT_EQ(range, CA::Range::RangeFull) << "range mismatch";
390 EXPECT_EQ(standard, CA::Standard::StandardBT709) << "standard mismatch";
391 EXPECT_EQ(transfer, CA::Transfer::TransferLinear) << "transfer mismatch";
392 }
393
TEST_P(ColorAspectsTest,FormatTest)394 TEST_P(ColorAspectsTest, FormatTest) {
395 CA aspects;
396 sp<AMessage> format = new AMessage();
397 ASSERT_NE(format, nullptr) << "failed to create AMessage";
398 ColorUtils::setColorAspectsIntoFormat(aspects, format, true);
399
400 CA returnedAspects;
401 ColorUtils::getColorAspectsFromFormat(format, returnedAspects);
402 EXPECT_EQ(returnedAspects.mRange, aspects.mRange) << "range mismatch";
403 EXPECT_EQ(returnedAspects.mPrimaries, aspects.mPrimaries) << "primaries mismatch";
404 EXPECT_EQ(returnedAspects.mTransfer, aspects.mTransfer) << "transfer mismatch";
405 EXPECT_EQ(returnedAspects.mMatrixCoeffs, aspects.mMatrixCoeffs) << "matrixCoeffs mismatch";
406
407 aspects.mRange = mRange;
408 aspects.mPrimaries = mPrimaries;
409 aspects.mTransfer = mTransfer;
410 aspects.mMatrixCoeffs = mMatrixCoeffs;
411 ColorUtils::setColorAspectsIntoFormat(aspects, format);
412
413 memset(&returnedAspects, 0, sizeof(returnedAspects));
414 ColorUtils::getColorAspectsFromFormat(format, returnedAspects);
415 EXPECT_EQ(returnedAspects.mRange, aspects.mRange) << "range mismatch";
416 EXPECT_EQ(returnedAspects.mPrimaries, aspects.mPrimaries) << "primaries mismatch";
417 EXPECT_EQ(returnedAspects.mTransfer, aspects.mTransfer) << "transfer mismatch";
418 EXPECT_EQ(returnedAspects.mMatrixCoeffs, aspects.mMatrixCoeffs) << "matrixCoeffs mismatch";
419 }
420
TEST(ColorUtilsUnitTest,HDRStaticInfoTest)421 TEST(ColorUtilsUnitTest, HDRStaticInfoTest) {
422 sp<AMessage> format = new AMessage();
423 ASSERT_NE(format, nullptr) << "failed to create AMessage";
424
425 HDRStaticInfo returnedInfoHDR;
426 bool status = ColorUtils::getHDRStaticInfoFromFormat(format, &returnedInfoHDR);
427 ASSERT_FALSE(status) << "HDR info should be absent in empty format";
428
429 HDRStaticInfo infoHDR;
430 infoHDR.sType1.mMaxDisplayLuminance = kHDRInfoTestValue2;
431 infoHDR.sType1.mMinDisplayLuminance = kHDRInfoTestValue1;
432 infoHDR.sType1.mMaxContentLightLevel = kHDRInfoTestValue2;
433 infoHDR.sType1.mMaxFrameAverageLightLevel = kHDRInfoTestValue1;
434 infoHDR.sType1.mR.x = kHDRInfoTestValue1;
435 infoHDR.sType1.mR.y = kHDRInfoTestValue2;
436 infoHDR.sType1.mG.x = kHDRInfoTestValue1;
437 infoHDR.sType1.mG.y = kHDRInfoTestValue2;
438 infoHDR.sType1.mB.x = kHDRInfoTestValue1;
439 infoHDR.sType1.mB.y = kHDRInfoTestValue2;
440 infoHDR.sType1.mW.x = kHDRInfoTestValue1;
441 infoHDR.sType1.mW.y = kHDRInfoTestValue2;
442 ColorUtils::setHDRStaticInfoIntoFormat(infoHDR, format);
443
444 status = ColorUtils::getHDRStaticInfoFromFormat(format, &returnedInfoHDR);
445 ASSERT_TRUE(status) << "Failed to get HDR info from format";
446 ASSERT_EQ(0, memcmp(&returnedInfoHDR, &infoHDR, sizeof(infoHDR))) << " HDRStaticInfo mismatch";
447
448 AMediaFormat *mediaFormat = AMediaFormat_new();
449 ASSERT_NE(mediaFormat, nullptr) << "Unable to create AMediaFormat";
450 ColorUtils::setHDRStaticInfoIntoAMediaFormat(infoHDR, mediaFormat);
451 memset(&returnedInfoHDR, 0, sizeof(returnedInfoHDR));
452 status = ColorUtils::getHDRStaticInfoFromFormat(mediaFormat->mFormat, &returnedInfoHDR);
453 AMediaFormat_delete(mediaFormat);
454 ASSERT_TRUE(status) << "Failed to get HDR info from media format";
455 ASSERT_EQ(0, memcmp(&returnedInfoHDR, &infoHDR, sizeof(infoHDR))) << " HDRStaticInfo mismatch";
456 }
457
TEST(ColorUtilsUnitTest,SanityTest)458 TEST(ColorUtilsUnitTest, SanityTest) {
459 CA::Primaries unmappedPrimaries = (CA::Primaries)(CA::Primaries::PrimariesOther + 1);
460 CA::MatrixCoeffs unmappedMatrixCoeffs = (CA::MatrixCoeffs)(CA::MatrixOther + 1);
461 int32_t colorStandard =
462 ColorUtils::wrapColorAspectsIntoColorStandard(unmappedPrimaries, CA::MatrixUnspecified);
463 EXPECT_EQ(colorStandard, ColorUtils::kColorStandardUnspecified)
464 << "Standard unspecified expected";
465 colorStandard =
466 ColorUtils::wrapColorAspectsIntoColorStandard(CA::PrimariesOther, unmappedMatrixCoeffs);
467 EXPECT_EQ(colorStandard, ColorUtils::kColorStandardUnspecified)
468 << "Standard unspecified expected";
469 colorStandard = ColorUtils::wrapColorAspectsIntoColorStandard(CA::PrimariesBT601_6_525,
470 CA::MatrixBT2020);
471 EXPECT_GE(colorStandard, ColorUtils::kColorStandardExtendedStart)
472 << "Standard greater than extended start expected";
473 unmappedPrimaries = (CA::Primaries)(CA::Primaries::PrimariesBT2020 + 1);
474 unmappedMatrixCoeffs = (CA::MatrixCoeffs)(CA::MatrixBT2020Constant + 1);
475 colorStandard =
476 ColorUtils::wrapColorAspectsIntoColorStandard(unmappedPrimaries, unmappedMatrixCoeffs);
477 EXPECT_GE(colorStandard, ColorUtils::kColorStandardExtendedStart)
478 << "Standard greater than extended start expected";
479
480 CA aspects;
481 int32_t colorRange = -1;
482 colorStandard = -1;
483 int32_t colorTransfer = -1;
484 aspects.mPrimaries = (CA::Primaries)(CA::Primaries::PrimariesOther + 1);
485 status_t status = ColorUtils::convertCodecColorAspectsToPlatformAspects(
486 aspects, &colorRange, &colorStandard, &colorTransfer);
487 EXPECT_NE(status, OK) << "invalid colorAspects value accepted";
488
489 int32_t colorPrimaries = -1;
490 colorTransfer = -1;
491 int32_t colorMatrixCoeffs = -1;
492 bool fullRange = false;
493 aspects.mPrimaries = CA::PrimariesOther;
494 aspects.mTransfer = CA::TransferOther;
495 aspects.mMatrixCoeffs = CA::MatrixOther;
496 ColorUtils::convertCodecColorAspectsToIsoAspects(aspects, &colorPrimaries, &colorTransfer,
497 &colorMatrixCoeffs, &fullRange);
498 CA returnedAspects;
499 ColorUtils::convertIsoColorAspectsToCodecAspects(colorPrimaries, colorTransfer,
500 colorMatrixCoeffs, fullRange, returnedAspects);
501 EXPECT_EQ(returnedAspects.mPrimaries, CA::PrimariesUnspecified)
502 << "expected unspecified Primaries";
503 EXPECT_EQ(returnedAspects.mTransfer, CA::TransferUnspecified)
504 << "expected unspecified Transfer";
505 EXPECT_EQ(returnedAspects.mMatrixCoeffs, CA::MatrixUnspecified)
506 << "expected unspecified MatrixCoeffs";
507
508 // invalid values, other value equals 0xFF
509 colorPrimaries = CA::PrimariesOther;
510 colorTransfer = CA::TransferOther;
511 colorMatrixCoeffs = CA::MatrixOther;
512 fullRange = false;
513 memset(&returnedAspects, 0, sizeof(returnedAspects));
514 ColorUtils::convertIsoColorAspectsToCodecAspects(colorPrimaries, colorTransfer,
515 colorMatrixCoeffs, fullRange, returnedAspects);
516 EXPECT_EQ(returnedAspects.mPrimaries, CA::PrimariesUnspecified)
517 << "expected unspecified Primaries";
518 EXPECT_EQ(returnedAspects.mTransfer, CA::TransferUnspecified)
519 << "expected unspecified Transfer";
520 EXPECT_EQ(returnedAspects.mMatrixCoeffs, CA::MatrixUnspecified)
521 << "expected unspecified MatrixCoeffs";
522
523 CA::Primaries primaries = CA::PrimariesUnspecified;
524 CA::MatrixCoeffs matrixCoeffs = CA::MatrixUnspecified;
525 status = ColorUtils::unwrapColorAspectsFromColorStandard(ColorUtils::kColorStandardVendorStart,
526 &primaries, &matrixCoeffs);
527 EXPECT_EQ(status, OK) << "unwrapping aspects from color standard failed";
528
529 primaries = CA::PrimariesUnspecified;
530 matrixCoeffs = CA::MatrixUnspecified;
531 status = ColorUtils::unwrapColorAspectsFromColorStandard(
532 ColorUtils::kColorStandardVendorStart * 4, &primaries, &matrixCoeffs);
533 EXPECT_NE(status, OK) << "unwrapping aspects from color standard failed";
534
535 colorRange = ColorUtils::wrapColorAspectsIntoColorRange((CA::Range)(CA::RangeOther + 1));
536 EXPECT_EQ(colorRange, ColorUtils::kColorRangeUnspecified) << "expected unspecified color range";
537
538 CA::Range range;
539 status = ColorUtils::unwrapColorAspectsFromColorRange(
540 ColorUtils::kColorRangeVendorStart + CA::RangeOther + 1, &range);
541 EXPECT_NE(status, OK) << "invalid range value accepted";
542 EXPECT_EQ(range, CA::RangeOther) << "returned unexpected range value";
543
544 colorTransfer =
545 ColorUtils::wrapColorAspectsIntoColorTransfer((CA::Transfer)(CA::TransferOther + 1));
546 EXPECT_EQ(colorTransfer, ColorUtils::kColorTransferUnspecified)
547 << "expected unspecified color transfer";
548
549 CA::Transfer transfer;
550 status = ColorUtils::unwrapColorAspectsFromColorTransfer(
551 ColorUtils::kColorTransferVendorStart + CA::TransferOther + 1, &transfer);
552 EXPECT_NE(status, OK) << "invalid transfer value accepted";
553 EXPECT_EQ(transfer, CA::TransferOther) << "expected other color transfer";
554 }
555
TEST(ColorUtilsUnitTest,HDRInfoSanityTest)556 TEST(ColorUtilsUnitTest, HDRInfoSanityTest) {
557 HDRStaticInfo hdrInfo;
558 sp<AMessage> format = new AMessage();
559 ASSERT_NE(format, nullptr) << "failed to create AMessage";
560
561 bool boolStatus = ColorUtils::getHDRStaticInfoFromFormat(format, &hdrInfo);
562 EXPECT_FALSE(boolStatus) << "HDRStaticInfo should not be present";
563
564 sp<ABuffer> invalidSizeHDRInfoBuffer = new ABuffer(kHDRBufferSize - 1);
565 ASSERT_NE(invalidSizeHDRInfoBuffer, nullptr) << "failed to create ABuffer";
566 format->setBuffer(KEY_HDR_STATIC_INFO, invalidSizeHDRInfoBuffer);
567 memset(&hdrInfo, 0, sizeof(hdrInfo));
568 boolStatus = ColorUtils::getHDRStaticInfoFromFormat(format, &hdrInfo);
569 EXPECT_FALSE(boolStatus) << "incorrect HDRStaticInfo buffer accepted";
570
571 sp<ABuffer> invalidHDRInfoBuffer = new ABuffer(kHDRBufferSize);
572 ASSERT_NE(invalidHDRInfoBuffer, nullptr) << "failed to create ABuffer";
573 uint8_t *data = invalidHDRInfoBuffer->data();
574 *data = HDRStaticInfo::kType1 + 1;
575 format->setBuffer(KEY_HDR_STATIC_INFO, invalidHDRInfoBuffer);
576 memset(&hdrInfo, 0, sizeof(hdrInfo));
577 boolStatus = ColorUtils::getHDRStaticInfoFromFormat(format, &hdrInfo);
578 EXPECT_FALSE(boolStatus) << "incorrect HDRStaticInfo buffer accepted";
579
580 CA aspects;
581 format->setInt32(KEY_COLOR_RANGE, ColorUtils::kColorRangeVendorStart + CA::RangeOther + 1);
582 format->setInt32(KEY_COLOR_STANDARD, CA::Standard::StandardBT709);
583 format->setInt32(KEY_COLOR_TRANSFER, CA::Transfer::TransferLinear);
584 ColorUtils::getColorAspectsFromFormat(format, aspects);
585 EXPECT_EQ(aspects.mRange, CA::RangeOther) << "unexpected range";
586 }
587
TEST(ColorUtilsUnitTest,DataSpaceSanityTest)588 TEST(ColorUtilsUnitTest, DataSpaceSanityTest) {
589 CA aspects;
590 aspects.mRange = CA::RangeUnspecified;
591 aspects.mPrimaries = CA::PrimariesUnspecified;
592 aspects.mMatrixCoeffs = CA::MatrixUnspecified;
593 aspects.mTransfer = CA::TransferUnspecified;
594 android_dataspace dataSpace = ColorUtils::getDataSpaceForColorAspects(aspects, true);
595 EXPECT_EQ(dataSpace, 0) << "expected invalid dataspace";
596 aspects.mPrimaries = CA::PrimariesUnspecified;
597 aspects.mMatrixCoeffs = CA::MatrixBT2020Constant;
598 dataSpace = ColorUtils::getDataSpaceForColorAspects(aspects, true);
599 EXPECT_NE(dataSpace, 0) << "unexpected value";
600 }
601
602 INSTANTIATE_TEST_SUITE_P(ColorUtilsUnitTest, ColorRangeTest,
603 ::testing::Values(
604 // ColorRange
605 CA::Range::RangeLimited, CA::Range::RangeFull,
606 CA::Range::RangeUnspecified, CA::Range::RangeOther));
607
608 INSTANTIATE_TEST_SUITE_P(ColorUtilsUnitTest, ColorTransferTest,
609 ::testing::Values(
610 // ColorTransfer
611 CA::Transfer::TransferUnspecified, CA::Transfer::TransferLinear,
612 CA::Transfer::TransferSRGB, CA::Transfer::TransferSMPTE170M,
613 CA::Transfer::TransferGamma22, CA::Transfer::TransferGamma28,
614 CA::Transfer::TransferST2084, CA::Transfer::TransferHLG,
615 CA::Transfer::TransferSMPTE240M, CA::Transfer::TransferXvYCC,
616 CA::Transfer::TransferBT1361, CA::Transfer::TransferST428,
617 CA::Transfer::TransferOther));
618
619 INSTANTIATE_TEST_SUITE_P(
620 ColorUtilsUnitTest, ColorStandardTest,
621 ::testing::Values(
622 // Primaries, MatrixCoeffs
623 std::make_pair(CA::Primaries::PrimariesUnspecified,
624 CA::MatrixCoeffs::MatrixUnspecified),
625 std::make_pair(CA::Primaries::PrimariesBT709_5,
626 CA::MatrixCoeffs::MatrixBT709_5),
627 std::make_pair(CA::Primaries::PrimariesBT601_6_625,
628 CA::MatrixCoeffs::MatrixBT601_6),
629 std::make_pair(CA::Primaries::PrimariesBT601_6_625,
630 CA::MatrixCoeffs::MatrixBT709_5),
631 std::make_pair(CA::Primaries::PrimariesBT601_6_525,
632 CA::MatrixCoeffs::MatrixBT601_6),
633 std::make_pair(CA::Primaries::PrimariesBT601_6_525,
634 CA::MatrixCoeffs::MatrixSMPTE240M),
635 std::make_pair(CA::Primaries::PrimariesBT2020,
636 CA::MatrixCoeffs::MatrixBT2020),
637 std::make_pair(CA::Primaries::PrimariesBT2020,
638 CA::MatrixCoeffs::MatrixBT2020Constant),
639 std::make_pair(CA::Primaries::PrimariesBT470_6M,
640 CA::MatrixCoeffs::MatrixBT470_6M),
641 std::make_pair(CA::Primaries::PrimariesGenericFilm,
642 CA::MatrixCoeffs::MatrixBT2020)));
643
644 INSTANTIATE_TEST_SUITE_P(
645 ColorUtilsUnitTest, ColorAspectsTest,
646 ::testing::Values(
647 // Primaries, ColorTransfer, MatrixCoeffs, ColorRange, ColorStandard
648 std::make_tuple(CA::Primaries::PrimariesUnspecified,
649 CA::Transfer::TransferUnspecified,
650 CA::MatrixCoeffs::MatrixUnspecified, CA::Range::RangeFull,
651 CA::Standard::StandardUnspecified),
652 std::make_tuple(CA::Primaries::PrimariesBT709_5, CA::Transfer::TransferLinear,
653 CA::MatrixCoeffs::MatrixBT709_5, CA::Range::RangeFull,
654 CA::Standard::StandardBT709),
655 std::make_tuple(CA::Primaries::PrimariesBT601_6_625, CA::Transfer::TransferSRGB,
656 CA::MatrixCoeffs::MatrixBT601_6, CA::Range::RangeFull,
657 CA::Standard::StandardUnspecified),
658 std::make_tuple(CA::Primaries::PrimariesBT601_6_625,
659 CA::Transfer::TransferSMPTE170M, CA::MatrixCoeffs::MatrixBT709_5,
660 CA::Range::RangeFull, CA::Standard::StandardUnspecified),
661 std::make_tuple(CA::Primaries::PrimariesBT601_6_525, CA::Transfer::TransferGamma22,
662 CA::MatrixCoeffs::MatrixBT601_6, CA::Range::RangeFull,
663 CA::Standard::StandardUnspecified),
664 std::make_tuple(CA::Primaries::PrimariesBT601_6_525, CA::Transfer::TransferGamma28,
665 CA::MatrixCoeffs::MatrixSMPTE240M, CA::Range::RangeFull,
666 CA::Standard::StandardBT470M),
667 std::make_tuple(CA::Primaries::PrimariesBT2020, CA::Transfer::TransferST2084,
668 CA::MatrixCoeffs::MatrixBT2020, CA::Range::RangeFull,
669 CA::Standard::StandardBT601_525),
670 std::make_tuple(CA::Primaries::PrimariesBT2020, CA::Transfer::TransferHLG,
671 CA::MatrixCoeffs::MatrixBT2020Constant, CA::Range::RangeFull,
672 CA::Standard::StandardBT601_525),
673 std::make_tuple(CA::Primaries::PrimariesBT470_6M, CA::Transfer::TransferLinear,
674 CA::MatrixCoeffs::MatrixBT470_6M, CA::Range::RangeFull,
675 CA::Standard::StandardUnspecified),
676 std::make_tuple(CA::Primaries::PrimariesGenericFilm, CA::Transfer::TransferLinear,
677 CA::MatrixCoeffs::MatrixBT2020, CA::Range::RangeFull,
678 CA::Standard::StandardBT601_625)));
679
680 INSTANTIATE_TEST_SUITE_P(
681 ColorUtilsUnitTest, IsoToPlatformAspectsTest,
682 ::testing::Values(
683 // Primaries, Transfer, MatrixCoeffs, Standard, Transfer
684 std::make_tuple(CA::PrimariesUnspecified, CA::TransferUnspecified,
685 CA::MatrixUnspecified, ColorUtils::kColorStandardUnspecified,
686 ColorUtils::kColorTransferUnspecified),
687 std::make_tuple(CA::PrimariesBT709_5, CA::TransferLinear, CA::MatrixBT709_5,
688 ColorUtils::kColorStandardBT709, ColorUtils::kColorTransferLinear),
689 std::make_tuple(CA::PrimariesBT601_6_625, CA::TransferSRGB, CA::MatrixBT601_6,
690 ColorUtils::kColorStandardBT601_625,
691 ColorUtils::kColorTransferSRGB),
692 std::make_tuple(CA::PrimariesBT601_6_625, CA::TransferSMPTE170M, CA::MatrixBT709_5,
693 ColorUtils::kColorStandardBT601_625_Unadjusted,
694 ColorUtils::kColorTransferSMPTE_170M),
695 std::make_tuple(CA::PrimariesBT601_6_525, CA::TransferGamma22, CA::MatrixBT601_6,
696 ColorUtils::kColorStandardBT601_525,
697 ColorUtils::kColorTransferGamma22),
698 std::make_tuple(CA::PrimariesBT601_6_525, CA::TransferGamma28, CA::MatrixSMPTE240M,
699 ColorUtils::kColorStandardBT601_525_Unadjusted,
700 ColorUtils::kColorTransferGamma28),
701 std::make_tuple(CA::PrimariesBT2020, CA::TransferST2084, CA::MatrixBT2020,
702 ColorUtils::kColorStandardBT2020, ColorUtils::kColorTransferST2084),
703 std::make_tuple(CA::PrimariesBT2020, CA::TransferHLG, CA::MatrixBT2020Constant,
704 ColorUtils::kColorStandardBT2020Constant,
705 ColorUtils::kColorTransferHLG),
706 std::make_tuple(CA::PrimariesBT470_6M, CA::TransferUnspecified, CA::MatrixBT470_6M,
707 ColorUtils::kColorStandardBT470M,
708 ColorUtils::kColorTransferUnspecified),
709 std::make_tuple(CA::PrimariesGenericFilm, CA::TransferLinear, CA::MatrixBT2020,
710 ColorUtils::kColorStandardFilm, ColorUtils::kColorTransferLinear)));
711
712 INSTANTIATE_TEST_SUITE_P(
713 ColorUtilsUnitTest, DefaultColorAspectsTest,
714 ::testing::Values(
715 // Width, Height, Primaries, MatrixCoeffs
716 std::make_tuple(3840, 3840, CA::PrimariesBT2020, CA::MatrixBT2020),
717 std::make_tuple(720, 576, CA::PrimariesBT601_6_625, CA::MatrixBT601_6),
718 std::make_tuple(480, 360, CA::PrimariesBT601_6_525, CA::MatrixBT601_6),
719 std::make_tuple(480, 1920, CA::PrimariesBT709_5, CA::MatrixBT709_5)));
720
721 INSTANTIATE_TEST_SUITE_P(
722 ColorUtilsUnitTest, DataSpaceTest,
723 ::testing::Values(
724 // ColorRange, Primaries, ColorTransfer, MatrixCoeffs, v0_android_dataspace,
725 // android_dataspace
726 std::make_tuple(CA::Range::RangeFull, CA::Primaries::PrimariesBT709_5,
727 CA::Transfer::TransferSRGB, CA::MatrixCoeffs::MatrixBT709_5,
728 HAL_DATASPACE_V0_SRGB, HAL_DATASPACE_SRGB),
729 std::make_tuple(CA::Range::RangeLimited, CA::Primaries::PrimariesBT709_5,
730 CA::Transfer::TransferSMPTE170M, CA::MatrixCoeffs::MatrixBT709_5,
731 HAL_DATASPACE_V0_BT709, HAL_DATASPACE_BT709),
732 std::make_tuple(CA::Range::RangeFull, CA::Primaries::PrimariesBT709_5,
733 CA::Transfer::TransferLinear, CA::MatrixCoeffs::MatrixBT709_5,
734 HAL_DATASPACE_V0_SRGB_LINEAR, HAL_DATASPACE_SRGB_LINEAR),
735 std::make_tuple(CA::Range::RangeLimited, CA::Primaries::PrimariesBT601_6_525,
736 CA::Transfer::TransferSMPTE170M, CA::MatrixCoeffs::MatrixBT601_6,
737 HAL_DATASPACE_V0_BT601_525, HAL_DATASPACE_BT601_525),
738 std::make_tuple(CA::Range::RangeLimited, CA::Primaries::PrimariesBT601_6_625,
739 CA::Transfer::TransferSMPTE170M, CA::MatrixCoeffs::MatrixBT601_6,
740 HAL_DATASPACE_V0_BT601_625, HAL_DATASPACE_BT601_625),
741 std::make_tuple(CA::Range::RangeFull, CA::Primaries::PrimariesBT601_6_625,
742 CA::Transfer::TransferSMPTE170M, CA::MatrixCoeffs::MatrixBT601_6,
743 HAL_DATASPACE_V0_JFIF, HAL_DATASPACE_JFIF),
744 std::make_tuple(CA::Range::RangeLimited, CA::Primaries::PrimariesBT709_5,
745 CA::Transfer::TransferSMPTE170M, CA::MatrixCoeffs::MatrixBT470_6M,
746 HAL_DATASPACE_V0_BT601_625, HAL_DATASPACE_BT601_625),
747 std::make_tuple(CA::Range::RangeLimited, CA::Primaries::PrimariesBT709_5,
748 CA::Transfer::TransferSMPTE170M, CA::MatrixCoeffs::MatrixBT601_6,
749 HAL_DATASPACE_V0_BT601_625, HAL_DATASPACE_BT601_625),
750 std::make_tuple(CA::Range::RangeLimited, CA::Primaries::PrimariesBT709_5,
751 CA::Transfer::TransferSMPTE170M, CA::MatrixCoeffs::MatrixSMPTE240M,
752 HAL_DATASPACE_V0_BT709, HAL_DATASPACE_BT709),
753 std::make_tuple(CA::Range::RangeLimited, CA::Primaries::PrimariesBT709_5,
754 CA::Transfer::TransferSMPTE170M, CA::MatrixCoeffs::MatrixBT2020,
755 HAL_DATASPACE_V0_BT709, HAL_DATASPACE_BT709),
756 std::make_tuple(CA::Range::RangeLimited, CA::Primaries::PrimariesBT709_5,
757 CA::Transfer::TransferSMPTE170M,
758 CA::MatrixCoeffs::MatrixBT2020Constant, HAL_DATASPACE_V0_BT601_525,
759 HAL_DATASPACE_BT601_525),
760 std::make_tuple(CA::Range::RangeLimited, CA::Primaries::PrimariesBT601_6_625,
761 CA::Transfer::TransferSMPTE170M, CA::MatrixCoeffs::MatrixBT470_6M,
762 HAL_DATASPACE_V0_BT601_625, HAL_DATASPACE_BT601_625),
763 std::make_tuple(CA::Range::RangeLimited, CA::Primaries::PrimariesBT601_6_625,
764 CA::Transfer::TransferSMPTE170M,
765 CA::MatrixCoeffs::MatrixBT2020Constant, HAL_DATASPACE_V0_BT601_525,
766 HAL_DATASPACE_BT601_525),
767 std::make_tuple(CA::Range::RangeLimited, CA::Primaries::PrimariesBT601_6_525,
768 CA::Transfer::TransferSMPTE170M, CA::MatrixCoeffs::MatrixBT470_6M,
769 HAL_DATASPACE_V0_BT601_525, HAL_DATASPACE_BT601_525),
770 std::make_tuple(CA::Range::RangeLimited, CA::Primaries::PrimariesBT601_6_525,
771 CA::Transfer::TransferSMPTE170M,
772 CA::MatrixCoeffs::MatrixBT2020Constant, HAL_DATASPACE_V0_BT601_525,
773 HAL_DATASPACE_BT601_525)));
774