• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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