1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker * Copyright (C) 2022 The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker *
4*4d7e907cSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker *
8*4d7e907cSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker *
10*4d7e907cSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker */
16*4d7e907cSAndroid Build Coastguard Worker
17*4d7e907cSAndroid Build Coastguard Worker #include <gtest/gtest.h>
18*4d7e907cSAndroid Build Coastguard Worker
19*4d7e907cSAndroid Build Coastguard Worker #include <android/hardware/graphics/mapper/utils/IMapperMetadataTypes.h>
20*4d7e907cSAndroid Build Coastguard Worker #include <android/hardware/graphics/mapper/utils/IMapperProvider.h>
21*4d7e907cSAndroid Build Coastguard Worker #include <drm/drm_fourcc.h>
22*4d7e907cSAndroid Build Coastguard Worker #include <gralloctypes/Gralloc4.h>
23*4d7e907cSAndroid Build Coastguard Worker #include <span>
24*4d7e907cSAndroid Build Coastguard Worker #include <vector>
25*4d7e907cSAndroid Build Coastguard Worker
26*4d7e907cSAndroid Build Coastguard Worker using namespace ::android;
27*4d7e907cSAndroid Build Coastguard Worker using namespace ::android::hardware::graphics::mapper;
28*4d7e907cSAndroid Build Coastguard Worker using namespace ::aidl::android::hardware::graphics::common;
29*4d7e907cSAndroid Build Coastguard Worker namespace gralloc4 = ::android::gralloc4;
30*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::hidl_vec;
31*4d7e907cSAndroid Build Coastguard Worker
32*4d7e907cSAndroid Build Coastguard Worker // These tests are primarily interested in hitting all the different *types* that can be
33*4d7e907cSAndroid Build Coastguard Worker // serialized/deserialized than in exhaustively testing all the StandardMetadataTypes.
34*4d7e907cSAndroid Build Coastguard Worker // Exhaustive testing of the actual metadata types is relegated for IMapper's VTS suite
35*4d7e907cSAndroid Build Coastguard Worker // where meaning & correctness of values are more narrowly defined (eg, read-only values)
36*4d7e907cSAndroid Build Coastguard Worker
37*4d7e907cSAndroid Build Coastguard Worker static constexpr auto HeaderSize = 69;
38*4d7e907cSAndroid Build Coastguard Worker
SkipHeader(std::vector<uint8_t> & buffer)39*4d7e907cSAndroid Build Coastguard Worker static std::span<uint8_t> SkipHeader(std::vector<uint8_t>& buffer) {
40*4d7e907cSAndroid Build Coastguard Worker return std::span<uint8_t>(buffer).subspan(HeaderSize);
41*4d7e907cSAndroid Build Coastguard Worker }
42*4d7e907cSAndroid Build Coastguard Worker
fakePlaneLayouts()43*4d7e907cSAndroid Build Coastguard Worker static std::vector<PlaneLayout> fakePlaneLayouts() {
44*4d7e907cSAndroid Build Coastguard Worker PlaneLayout myPlaneLayout;
45*4d7e907cSAndroid Build Coastguard Worker myPlaneLayout.offsetInBytes = 10;
46*4d7e907cSAndroid Build Coastguard Worker myPlaneLayout.sampleIncrementInBits = 11;
47*4d7e907cSAndroid Build Coastguard Worker myPlaneLayout.strideInBytes = 12;
48*4d7e907cSAndroid Build Coastguard Worker myPlaneLayout.widthInSamples = 13;
49*4d7e907cSAndroid Build Coastguard Worker myPlaneLayout.heightInSamples = 14;
50*4d7e907cSAndroid Build Coastguard Worker myPlaneLayout.totalSizeInBytes = 15;
51*4d7e907cSAndroid Build Coastguard Worker myPlaneLayout.horizontalSubsampling = 16;
52*4d7e907cSAndroid Build Coastguard Worker myPlaneLayout.verticalSubsampling = 17;
53*4d7e907cSAndroid Build Coastguard Worker
54*4d7e907cSAndroid Build Coastguard Worker myPlaneLayout.components.resize(3);
55*4d7e907cSAndroid Build Coastguard Worker for (int i = 0; i < myPlaneLayout.components.size(); i++) {
56*4d7e907cSAndroid Build Coastguard Worker auto& it = myPlaneLayout.components[i];
57*4d7e907cSAndroid Build Coastguard Worker it.type = ExtendableType{"Plane ID", 40 + i};
58*4d7e907cSAndroid Build Coastguard Worker it.offsetInBits = 20 + i;
59*4d7e907cSAndroid Build Coastguard Worker it.sizeInBits = 30 + i;
60*4d7e907cSAndroid Build Coastguard Worker }
61*4d7e907cSAndroid Build Coastguard Worker
62*4d7e907cSAndroid Build Coastguard Worker return std::vector<PlaneLayout>{myPlaneLayout, PlaneLayout{}};
63*4d7e907cSAndroid Build Coastguard Worker }
64*4d7e907cSAndroid Build Coastguard Worker
TEST(Metadata,setGetBufferId)65*4d7e907cSAndroid Build Coastguard Worker TEST(Metadata, setGetBufferId) {
66*4d7e907cSAndroid Build Coastguard Worker using BufferId = StandardMetadata<StandardMetadataType::BUFFER_ID>::value;
67*4d7e907cSAndroid Build Coastguard Worker
68*4d7e907cSAndroid Build Coastguard Worker std::vector<uint8_t> buffer(10000, 0);
69*4d7e907cSAndroid Build Coastguard Worker int64_t* payload = reinterpret_cast<int64_t*>(SkipHeader(buffer).data());
70*4d7e907cSAndroid Build Coastguard Worker *payload = 42;
71*4d7e907cSAndroid Build Coastguard Worker
72*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(8 + HeaderSize, BufferId::encode(18, buffer.data(), 0));
73*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(42, *payload);
74*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(8 + HeaderSize, BufferId::encode(18, buffer.data(), buffer.size()));
75*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(18, *payload);
76*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(BufferId::decode(buffer.data(), 0));
77*4d7e907cSAndroid Build Coastguard Worker auto read = BufferId::decode(buffer.data(), buffer.size());
78*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(read.has_value());
79*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(18, read.value_or(0));
80*4d7e907cSAndroid Build Coastguard Worker }
81*4d7e907cSAndroid Build Coastguard Worker
TEST(Metadata,setGetDataspace)82*4d7e907cSAndroid Build Coastguard Worker TEST(Metadata, setGetDataspace) {
83*4d7e907cSAndroid Build Coastguard Worker using DataspaceValue = StandardMetadata<StandardMetadataType::DATASPACE>::value;
84*4d7e907cSAndroid Build Coastguard Worker using intType = std::underlying_type_t<Dataspace>;
85*4d7e907cSAndroid Build Coastguard Worker std::vector<uint8_t> buffer(10000, 0);
86*4d7e907cSAndroid Build Coastguard Worker auto data = SkipHeader(buffer);
87*4d7e907cSAndroid Build Coastguard Worker
88*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(4 + HeaderSize, DataspaceValue::encode(Dataspace::BT2020, buffer.data(), 0));
89*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(0, *reinterpret_cast<intType*>(data.data()));
90*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(4 + HeaderSize,
91*4d7e907cSAndroid Build Coastguard Worker DataspaceValue::encode(Dataspace::BT2020, buffer.data(), buffer.size()));
92*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(static_cast<intType>(Dataspace::BT2020), *reinterpret_cast<intType*>(data.data()));
93*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(DataspaceValue::decode(buffer.data(), 0));
94*4d7e907cSAndroid Build Coastguard Worker auto read = DataspaceValue::decode(buffer.data(), buffer.size());
95*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(read.has_value());
96*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(Dataspace::BT2020, *read);
97*4d7e907cSAndroid Build Coastguard Worker }
98*4d7e907cSAndroid Build Coastguard Worker
TEST(Metadata,setGetValidName)99*4d7e907cSAndroid Build Coastguard Worker TEST(Metadata, setGetValidName) {
100*4d7e907cSAndroid Build Coastguard Worker using NameValue = StandardMetadata<StandardMetadataType::NAME>::value;
101*4d7e907cSAndroid Build Coastguard Worker
102*4d7e907cSAndroid Build Coastguard Worker std::vector<uint8_t> buffer(10000, 'a');
103*4d7e907cSAndroid Build Coastguard Worker
104*4d7e907cSAndroid Build Coastguard Worker // len("Hello") + sizeof(int64)
105*4d7e907cSAndroid Build Coastguard Worker constexpr int expectedSize = 5 + sizeof(int64_t) + HeaderSize;
106*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(expectedSize, NameValue::encode("Hello", buffer.data(), buffer.size()));
107*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(5, *reinterpret_cast<int64_t*>(SkipHeader(buffer).data()));
108*4d7e907cSAndroid Build Coastguard Worker // Verify didn't write past the end of the desired size
109*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ('a', buffer[expectedSize]);
110*4d7e907cSAndroid Build Coastguard Worker
111*4d7e907cSAndroid Build Coastguard Worker auto readValue = NameValue::decode(buffer.data(), buffer.size());
112*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(readValue.has_value());
113*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(5, readValue->length());
114*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ("Hello", *readValue);
115*4d7e907cSAndroid Build Coastguard Worker }
116*4d7e907cSAndroid Build Coastguard Worker
TEST(Metadata,setGetInvalidName)117*4d7e907cSAndroid Build Coastguard Worker TEST(Metadata, setGetInvalidName) {
118*4d7e907cSAndroid Build Coastguard Worker using NameValue = StandardMetadata<StandardMetadataType::NAME>::value;
119*4d7e907cSAndroid Build Coastguard Worker
120*4d7e907cSAndroid Build Coastguard Worker std::vector<uint8_t> buffer;
121*4d7e907cSAndroid Build Coastguard Worker buffer.resize(12 + HeaderSize, 'a');
122*4d7e907cSAndroid Build Coastguard Worker buffer[buffer.size() - 1] = '\0';
123*4d7e907cSAndroid Build Coastguard Worker
124*4d7e907cSAndroid Build Coastguard Worker // len("This is a long string") + sizeof(int64)
125*4d7e907cSAndroid Build Coastguard Worker constexpr int expectedSize = 21 + sizeof(int64_t) + HeaderSize;
126*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(expectedSize,
127*4d7e907cSAndroid Build Coastguard Worker NameValue::encode("This is a long string", buffer.data(), buffer.size()));
128*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(21, *reinterpret_cast<int64_t*>(SkipHeader(buffer).data()));
129*4d7e907cSAndroid Build Coastguard Worker
130*4d7e907cSAndroid Build Coastguard Worker auto readValue = NameValue::decode(buffer.data(), buffer.size());
131*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(readValue.has_value());
132*4d7e907cSAndroid Build Coastguard Worker readValue = NameValue::decode(buffer.data(), 0);
133*4d7e907cSAndroid Build Coastguard Worker ASSERT_FALSE(readValue.has_value());
134*4d7e907cSAndroid Build Coastguard Worker }
135*4d7e907cSAndroid Build Coastguard Worker
TEST(Metadata,wouldOverflowName)136*4d7e907cSAndroid Build Coastguard Worker TEST(Metadata, wouldOverflowName) {
137*4d7e907cSAndroid Build Coastguard Worker using NameValue = StandardMetadata<StandardMetadataType::NAME>::value;
138*4d7e907cSAndroid Build Coastguard Worker std::vector<uint8_t> buffer(10000, 0);
139*4d7e907cSAndroid Build Coastguard Worker
140*4d7e907cSAndroid Build Coastguard Worker // int_max + sizeof(int64) overflows int32
141*4d7e907cSAndroid Build Coastguard Worker std::string_view bad_string{"badbeef", std::numeric_limits<int32_t>::max()};
142*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(-AIMAPPER_ERROR_BAD_VALUE,
143*4d7e907cSAndroid Build Coastguard Worker NameValue::encode(bad_string, buffer.data(), buffer.size()));
144*4d7e907cSAndroid Build Coastguard Worker
145*4d7e907cSAndroid Build Coastguard Worker // check barely overflows
146*4d7e907cSAndroid Build Coastguard Worker bad_string = std::string_view{"badbeef", std::numeric_limits<int32_t>::max() - 7};
147*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(-AIMAPPER_ERROR_BAD_VALUE,
148*4d7e907cSAndroid Build Coastguard Worker NameValue::encode(bad_string, buffer.data(), buffer.size()));
149*4d7e907cSAndroid Build Coastguard Worker }
150*4d7e907cSAndroid Build Coastguard Worker
TEST(Metadata,setGetMismatchedWidthHight)151*4d7e907cSAndroid Build Coastguard Worker TEST(Metadata, setGetMismatchedWidthHight) {
152*4d7e907cSAndroid Build Coastguard Worker // Validates that the header is properly validated on decode
153*4d7e907cSAndroid Build Coastguard Worker using WidthValue = StandardMetadata<StandardMetadataType::WIDTH>::value;
154*4d7e907cSAndroid Build Coastguard Worker using HeightValue = StandardMetadata<StandardMetadataType::HEIGHT>::value;
155*4d7e907cSAndroid Build Coastguard Worker std::vector<uint8_t> buffer(10000, 0);
156*4d7e907cSAndroid Build Coastguard Worker
157*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(8 + HeaderSize, WidthValue::encode(100, buffer.data(), buffer.size()));
158*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(100, *reinterpret_cast<uint64_t*>(SkipHeader(buffer).data()));
159*4d7e907cSAndroid Build Coastguard Worker auto read = WidthValue::decode(buffer.data(), buffer.size());
160*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(read.has_value());
161*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(100, *read);
162*4d7e907cSAndroid Build Coastguard Worker read = HeightValue::decode(buffer.data(), buffer.size());
163*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(read.has_value());
164*4d7e907cSAndroid Build Coastguard Worker }
165*4d7e907cSAndroid Build Coastguard Worker
TEST(Metadata,setGetCompression)166*4d7e907cSAndroid Build Coastguard Worker TEST(Metadata, setGetCompression) {
167*4d7e907cSAndroid Build Coastguard Worker using CompressionValue = StandardMetadata<StandardMetadataType::COMPRESSION>::value;
168*4d7e907cSAndroid Build Coastguard Worker ExtendableType myCompression{"bestest_compression_ever", 42};
169*4d7e907cSAndroid Build Coastguard Worker std::vector<uint8_t> buffer(10000, 0);
170*4d7e907cSAndroid Build Coastguard Worker const int expectedSize =
171*4d7e907cSAndroid Build Coastguard Worker myCompression.name.length() + sizeof(int64_t) + sizeof(int64_t) + HeaderSize;
172*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(expectedSize, CompressionValue::encode(myCompression, buffer.data(), 0));
173*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(0, buffer[0]);
174*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(expectedSize, CompressionValue::encode(myCompression, buffer.data(), buffer.size()));
175*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(myCompression.name.length(), *reinterpret_cast<int64_t*>(SkipHeader(buffer).data()));
176*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(CompressionValue::decode(buffer.data(), 0).has_value());
177*4d7e907cSAndroid Build Coastguard Worker auto read = CompressionValue::decode(buffer.data(), buffer.size());
178*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(read.has_value());
179*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(myCompression, read.value());
180*4d7e907cSAndroid Build Coastguard Worker }
181*4d7e907cSAndroid Build Coastguard Worker
TEST(Metadata,setGetPlaneLayout)182*4d7e907cSAndroid Build Coastguard Worker TEST(Metadata, setGetPlaneLayout) {
183*4d7e907cSAndroid Build Coastguard Worker using PlaneLayoutValue = StandardMetadata<StandardMetadataType::PLANE_LAYOUTS>::value;
184*4d7e907cSAndroid Build Coastguard Worker
185*4d7e907cSAndroid Build Coastguard Worker std::vector<PlaneLayout> layouts = fakePlaneLayouts();
186*4d7e907cSAndroid Build Coastguard Worker
187*4d7e907cSAndroid Build Coastguard Worker std::vector<uint8_t> buffer(10000, 0);
188*4d7e907cSAndroid Build Coastguard Worker constexpr int componentSize = 8 + (4 * sizeof(int64_t));
189*4d7e907cSAndroid Build Coastguard Worker constexpr int firstLayoutSize = (8 + 1) * sizeof(int64_t) + (3 * componentSize);
190*4d7e907cSAndroid Build Coastguard Worker constexpr int secondLayoutSize = (8 + 1) * sizeof(int64_t);
191*4d7e907cSAndroid Build Coastguard Worker constexpr int expectedSize = firstLayoutSize + secondLayoutSize + sizeof(int64_t) + HeaderSize;
192*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(expectedSize, PlaneLayoutValue::encode(layouts, buffer.data(), 0));
193*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(0, buffer[0]);
194*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(expectedSize, PlaneLayoutValue::encode(layouts, buffer.data(), buffer.size()));
195*4d7e907cSAndroid Build Coastguard Worker int64_t* payload = reinterpret_cast<int64_t*>(SkipHeader(buffer).data());
196*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(3, payload[1]);
197*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(8, payload[2]);
198*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(40, payload[4]);
199*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(31, payload[11]);
200*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(22, payload[15]);
201*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(10, payload[17]);
202*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(11, payload[18]);
203*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(PlaneLayoutValue::decode(buffer.data(), 0).has_value());
204*4d7e907cSAndroid Build Coastguard Worker auto read = PlaneLayoutValue::decode(buffer.data(), buffer.size());
205*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(read.has_value());
206*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(layouts, *read);
207*4d7e907cSAndroid Build Coastguard Worker }
208*4d7e907cSAndroid Build Coastguard Worker
TEST(Metadata,setGetRects)209*4d7e907cSAndroid Build Coastguard Worker TEST(Metadata, setGetRects) {
210*4d7e907cSAndroid Build Coastguard Worker using RectsValue = StandardMetadata<StandardMetadataType::CROP>::value;
211*4d7e907cSAndroid Build Coastguard Worker std::vector<uint8_t> buffer(10000, 0);
212*4d7e907cSAndroid Build Coastguard Worker std::vector<Rect> cropRects{2};
213*4d7e907cSAndroid Build Coastguard Worker cropRects[0] = Rect{10, 11, 12, 13};
214*4d7e907cSAndroid Build Coastguard Worker cropRects[1] = Rect{20, 21, 22, 23};
215*4d7e907cSAndroid Build Coastguard Worker
216*4d7e907cSAndroid Build Coastguard Worker constexpr int expectedSize = sizeof(int64_t) + (8 * sizeof(int32_t)) + HeaderSize;
217*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(expectedSize, RectsValue::encode(cropRects, buffer.data(), buffer.size()));
218*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(2, reinterpret_cast<int64_t*>(SkipHeader(buffer).data())[0]);
219*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(10, reinterpret_cast<int32_t*>(SkipHeader(buffer).data())[2]);
220*4d7e907cSAndroid Build Coastguard Worker auto read = RectsValue::decode(buffer.data(), buffer.size());
221*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(read.has_value());
222*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(cropRects.size(), read->size());
223*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(cropRects, *read);
224*4d7e907cSAndroid Build Coastguard Worker }
225*4d7e907cSAndroid Build Coastguard Worker
TEST(Metadata,setGetSmpte2086)226*4d7e907cSAndroid Build Coastguard Worker TEST(Metadata, setGetSmpte2086) {
227*4d7e907cSAndroid Build Coastguard Worker using Smpte2086Value = StandardMetadata<StandardMetadataType::SMPTE2086>::value;
228*4d7e907cSAndroid Build Coastguard Worker Smpte2086 source;
229*4d7e907cSAndroid Build Coastguard Worker source.minLuminance = 12.335f;
230*4d7e907cSAndroid Build Coastguard Worker source.maxLuminance = 452.889f;
231*4d7e907cSAndroid Build Coastguard Worker source.whitePoint = XyColor{-6.f, -9.f};
232*4d7e907cSAndroid Build Coastguard Worker source.primaryRed = XyColor{.1f, .2f};
233*4d7e907cSAndroid Build Coastguard Worker source.primaryGreen = XyColor{.3f, .4f};
234*4d7e907cSAndroid Build Coastguard Worker source.primaryBlue = XyColor{.5f, .6f};
235*4d7e907cSAndroid Build Coastguard Worker
236*4d7e907cSAndroid Build Coastguard Worker constexpr int expectedSize = 10 * sizeof(float) + HeaderSize;
237*4d7e907cSAndroid Build Coastguard Worker std::vector<uint8_t> buffer(10000, 0);
238*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(expectedSize, Smpte2086Value::encode(source, buffer.data(), buffer.size()));
239*4d7e907cSAndroid Build Coastguard Worker auto read = Smpte2086Value::decode(buffer.data(), buffer.size());
240*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(read.has_value());
241*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(read->has_value());
242*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(source, read->value());
243*4d7e907cSAndroid Build Coastguard Worker
244*4d7e907cSAndroid Build Coastguard Worker // A valid encoding of a nullopt
245*4d7e907cSAndroid Build Coastguard Worker read = Smpte2086Value::decode(nullptr, 0);
246*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(read.has_value());
247*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(read->has_value());
248*4d7e907cSAndroid Build Coastguard Worker }
249*4d7e907cSAndroid Build Coastguard Worker
TEST(Metadata,setGetCta861_3)250*4d7e907cSAndroid Build Coastguard Worker TEST(Metadata, setGetCta861_3) {
251*4d7e907cSAndroid Build Coastguard Worker using Cta861_3Value = StandardMetadata<StandardMetadataType::CTA861_3>::value;
252*4d7e907cSAndroid Build Coastguard Worker Cta861_3 source;
253*4d7e907cSAndroid Build Coastguard Worker source.maxFrameAverageLightLevel = 244.55f;
254*4d7e907cSAndroid Build Coastguard Worker source.maxContentLightLevel = 202.202f;
255*4d7e907cSAndroid Build Coastguard Worker
256*4d7e907cSAndroid Build Coastguard Worker constexpr int expectedSize = 2 * sizeof(float) + HeaderSize;
257*4d7e907cSAndroid Build Coastguard Worker std::vector<uint8_t> buffer(10000, 0);
258*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(expectedSize, Cta861_3Value::encode(source, buffer.data(), buffer.size()));
259*4d7e907cSAndroid Build Coastguard Worker auto read = Cta861_3Value::decode(buffer.data(), buffer.size());
260*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(read.has_value());
261*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(read->has_value());
262*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(source, read->value());
263*4d7e907cSAndroid Build Coastguard Worker
264*4d7e907cSAndroid Build Coastguard Worker // A valid encoding of a nullopt
265*4d7e907cSAndroid Build Coastguard Worker read = Cta861_3Value::decode(nullptr, 0);
266*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(read.has_value());
267*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(read->has_value());
268*4d7e907cSAndroid Build Coastguard Worker }
269*4d7e907cSAndroid Build Coastguard Worker
TEST(Metadata,setGetSmpte2094_10)270*4d7e907cSAndroid Build Coastguard Worker TEST(Metadata, setGetSmpte2094_10) {
271*4d7e907cSAndroid Build Coastguard Worker using SMPTE2094_10Value = StandardMetadata<StandardMetadataType::SMPTE2094_10>::value;
272*4d7e907cSAndroid Build Coastguard Worker
273*4d7e907cSAndroid Build Coastguard Worker std::vector<uint8_t> buffer(10000, 0);
274*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(0, SMPTE2094_10Value::encode(std::nullopt, buffer.data(), buffer.size()));
275*4d7e907cSAndroid Build Coastguard Worker auto read = SMPTE2094_10Value::decode(buffer.data(), 0);
276*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(read.has_value());
277*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(read->has_value());
278*4d7e907cSAndroid Build Coastguard Worker
279*4d7e907cSAndroid Build Coastguard Worker const std::vector<uint8_t> emptyBuffer;
280*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(sizeof(int64_t) + HeaderSize,
281*4d7e907cSAndroid Build Coastguard Worker SMPTE2094_10Value::encode(emptyBuffer, buffer.data(), buffer.size()));
282*4d7e907cSAndroid Build Coastguard Worker read = SMPTE2094_10Value::decode(buffer.data(), buffer.size());
283*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(read.has_value());
284*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(read->has_value());
285*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(0, read->value().size());
286*4d7e907cSAndroid Build Coastguard Worker
287*4d7e907cSAndroid Build Coastguard Worker const std::vector<uint8_t> simpleBuffer{0, 1, 2, 3, 4, 5};
288*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(sizeof(int64_t) + 6 + HeaderSize,
289*4d7e907cSAndroid Build Coastguard Worker SMPTE2094_10Value::encode(simpleBuffer, buffer.data(), buffer.size()));
290*4d7e907cSAndroid Build Coastguard Worker read = SMPTE2094_10Value::decode(buffer.data(), buffer.size());
291*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(read.has_value());
292*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(read->has_value());
293*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(6, read->value().size());
294*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(simpleBuffer, read->value());
295*4d7e907cSAndroid Build Coastguard Worker }
296*4d7e907cSAndroid Build Coastguard Worker
TEST(MetadataProvider,bufferId)297*4d7e907cSAndroid Build Coastguard Worker TEST(MetadataProvider, bufferId) {
298*4d7e907cSAndroid Build Coastguard Worker using BufferId = StandardMetadata<StandardMetadataType::BUFFER_ID>::value;
299*4d7e907cSAndroid Build Coastguard Worker std::vector<uint8_t> buffer(10000, 0);
300*4d7e907cSAndroid Build Coastguard Worker int result = provideStandardMetadata(StandardMetadataType::BUFFER_ID, buffer.data(),
301*4d7e907cSAndroid Build Coastguard Worker buffer.size(), []<StandardMetadataType T>(auto&& provide) {
302*4d7e907cSAndroid Build Coastguard Worker if constexpr (T == StandardMetadataType::BUFFER_ID) {
303*4d7e907cSAndroid Build Coastguard Worker return provide(42);
304*4d7e907cSAndroid Build Coastguard Worker }
305*4d7e907cSAndroid Build Coastguard Worker return 0;
306*4d7e907cSAndroid Build Coastguard Worker });
307*4d7e907cSAndroid Build Coastguard Worker
308*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(8 + HeaderSize, result);
309*4d7e907cSAndroid Build Coastguard Worker auto read = BufferId::decode(buffer.data(), buffer.size());
310*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(42, read.value_or(0));
311*4d7e907cSAndroid Build Coastguard Worker }
312*4d7e907cSAndroid Build Coastguard Worker
TEST(MetadataProvider,allJumpsWork)313*4d7e907cSAndroid Build Coastguard Worker TEST(MetadataProvider, allJumpsWork) {
314*4d7e907cSAndroid Build Coastguard Worker const auto& values = ndk::internal::enum_values<StandardMetadataType>;
315*4d7e907cSAndroid Build Coastguard Worker auto get = [](StandardMetadataType type) -> int {
316*4d7e907cSAndroid Build Coastguard Worker return provideStandardMetadata(type, nullptr, 0, []<StandardMetadataType T>(auto&&) {
317*4d7e907cSAndroid Build Coastguard Worker return static_cast<int>(T) + 100;
318*4d7e907cSAndroid Build Coastguard Worker });
319*4d7e907cSAndroid Build Coastguard Worker };
320*4d7e907cSAndroid Build Coastguard Worker
321*4d7e907cSAndroid Build Coastguard Worker for (auto& type : values) {
322*4d7e907cSAndroid Build Coastguard Worker const int expected = type == StandardMetadataType::INVALID ? -AIMAPPER_ERROR_UNSUPPORTED
323*4d7e907cSAndroid Build Coastguard Worker : static_cast<int>(type) + 100;
324*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(expected, get(type));
325*4d7e907cSAndroid Build Coastguard Worker }
326*4d7e907cSAndroid Build Coastguard Worker }
327*4d7e907cSAndroid Build Coastguard Worker
TEST(MetadataProvider,invalid)328*4d7e907cSAndroid Build Coastguard Worker TEST(MetadataProvider, invalid) {
329*4d7e907cSAndroid Build Coastguard Worker int result = provideStandardMetadata(StandardMetadataType::INVALID, nullptr, 0,
330*4d7e907cSAndroid Build Coastguard Worker []<StandardMetadataType T>(auto&&) { return 10; });
331*4d7e907cSAndroid Build Coastguard Worker
332*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(-AIMAPPER_ERROR_UNSUPPORTED, result);
333*4d7e907cSAndroid Build Coastguard Worker }
334*4d7e907cSAndroid Build Coastguard Worker
TEST(MetadataProvider,outOfBounds)335*4d7e907cSAndroid Build Coastguard Worker TEST(MetadataProvider, outOfBounds) {
336*4d7e907cSAndroid Build Coastguard Worker int result = provideStandardMetadata(static_cast<StandardMetadataType>(-1), nullptr, 0,
337*4d7e907cSAndroid Build Coastguard Worker []<StandardMetadataType T>(auto&&) { return 10; });
338*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(-AIMAPPER_ERROR_UNSUPPORTED, result) << "-1 should have resulted in UNSUPPORTED";
339*4d7e907cSAndroid Build Coastguard Worker
340*4d7e907cSAndroid Build Coastguard Worker result = provideStandardMetadata(static_cast<StandardMetadataType>(100), nullptr, 0,
341*4d7e907cSAndroid Build Coastguard Worker []<StandardMetadataType T>(auto&&) { return 10; });
342*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(-AIMAPPER_ERROR_UNSUPPORTED, result)
343*4d7e907cSAndroid Build Coastguard Worker << "100 (out of range) should have resulted in UNSUPPORTED";
344*4d7e907cSAndroid Build Coastguard Worker }
345*4d7e907cSAndroid Build Coastguard Worker
346*4d7e907cSAndroid Build Coastguard Worker template <StandardMetadataType T>
encode(const typename StandardMetadata<T>::value_type & value)347*4d7e907cSAndroid Build Coastguard Worker std::vector<uint8_t> encode(const typename StandardMetadata<T>::value_type& value) {
348*4d7e907cSAndroid Build Coastguard Worker using Value = typename StandardMetadata<T>::value;
349*4d7e907cSAndroid Build Coastguard Worker
350*4d7e907cSAndroid Build Coastguard Worker int desiredSize = Value::encode(value, nullptr, 0);
351*4d7e907cSAndroid Build Coastguard Worker EXPECT_GE(desiredSize, 0);
352*4d7e907cSAndroid Build Coastguard Worker std::vector<uint8_t> buffer;
353*4d7e907cSAndroid Build Coastguard Worker buffer.resize(desiredSize);
354*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(desiredSize, Value::encode(value, buffer.data(), buffer.size()));
355*4d7e907cSAndroid Build Coastguard Worker return buffer;
356*4d7e907cSAndroid Build Coastguard Worker }
357*4d7e907cSAndroid Build Coastguard Worker
TEST(MetadataGralloc4Interop,BufferId)358*4d7e907cSAndroid Build Coastguard Worker TEST(MetadataGralloc4Interop, BufferId) {
359*4d7e907cSAndroid Build Coastguard Worker auto mpbuf = encode<StandardMetadataType::BUFFER_ID>(42);
360*4d7e907cSAndroid Build Coastguard Worker hidl_vec<uint8_t> g4buf;
361*4d7e907cSAndroid Build Coastguard Worker ASSERT_EQ(NO_ERROR, gralloc4::encodeBufferId(42, &g4buf));
362*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(g4buf, mpbuf);
363*4d7e907cSAndroid Build Coastguard Worker }
364*4d7e907cSAndroid Build Coastguard Worker
TEST(MetadataGralloc4Interop,Name)365*4d7e907cSAndroid Build Coastguard Worker TEST(MetadataGralloc4Interop, Name) {
366*4d7e907cSAndroid Build Coastguard Worker auto mpbuf = encode<StandardMetadataType::NAME>("Hello, Interop!");
367*4d7e907cSAndroid Build Coastguard Worker hidl_vec<uint8_t> g4buf;
368*4d7e907cSAndroid Build Coastguard Worker ASSERT_EQ(NO_ERROR, gralloc4::encodeName("Hello, Interop!", &g4buf));
369*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(g4buf, mpbuf);
370*4d7e907cSAndroid Build Coastguard Worker }
371*4d7e907cSAndroid Build Coastguard Worker
TEST(MetadataGralloc4Interop,Width)372*4d7e907cSAndroid Build Coastguard Worker TEST(MetadataGralloc4Interop, Width) {
373*4d7e907cSAndroid Build Coastguard Worker auto mpbuf = encode<StandardMetadataType::WIDTH>(128);
374*4d7e907cSAndroid Build Coastguard Worker hidl_vec<uint8_t> g4buf;
375*4d7e907cSAndroid Build Coastguard Worker ASSERT_EQ(NO_ERROR, gralloc4::encodeWidth(128, &g4buf));
376*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(g4buf, mpbuf);
377*4d7e907cSAndroid Build Coastguard Worker }
378*4d7e907cSAndroid Build Coastguard Worker
TEST(MetadataGralloc4Interop,Height)379*4d7e907cSAndroid Build Coastguard Worker TEST(MetadataGralloc4Interop, Height) {
380*4d7e907cSAndroid Build Coastguard Worker auto mpbuf = encode<StandardMetadataType::HEIGHT>(64);
381*4d7e907cSAndroid Build Coastguard Worker hidl_vec<uint8_t> g4buf;
382*4d7e907cSAndroid Build Coastguard Worker ASSERT_EQ(NO_ERROR, gralloc4::encodeHeight(64, &g4buf));
383*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(g4buf, mpbuf);
384*4d7e907cSAndroid Build Coastguard Worker }
385*4d7e907cSAndroid Build Coastguard Worker
TEST(MetadataGralloc4Interop,LayerCount)386*4d7e907cSAndroid Build Coastguard Worker TEST(MetadataGralloc4Interop, LayerCount) {
387*4d7e907cSAndroid Build Coastguard Worker auto mpbuf = encode<StandardMetadataType::LAYER_COUNT>(3);
388*4d7e907cSAndroid Build Coastguard Worker hidl_vec<uint8_t> g4buf;
389*4d7e907cSAndroid Build Coastguard Worker ASSERT_EQ(NO_ERROR, gralloc4::encodeLayerCount(3, &g4buf));
390*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(g4buf, mpbuf);
391*4d7e907cSAndroid Build Coastguard Worker }
392*4d7e907cSAndroid Build Coastguard Worker
TEST(MetadataGralloc4Interop,PixelFormatRequested)393*4d7e907cSAndroid Build Coastguard Worker TEST(MetadataGralloc4Interop, PixelFormatRequested) {
394*4d7e907cSAndroid Build Coastguard Worker auto mpbuf = encode<StandardMetadataType::PIXEL_FORMAT_REQUESTED>(PixelFormat::RGBX_8888);
395*4d7e907cSAndroid Build Coastguard Worker hidl_vec<uint8_t> g4buf;
396*4d7e907cSAndroid Build Coastguard Worker ASSERT_EQ(NO_ERROR, gralloc4::encodePixelFormatRequested(
397*4d7e907cSAndroid Build Coastguard Worker hardware::graphics::common::V1_2::PixelFormat::RGBX_8888, &g4buf));
398*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(g4buf, mpbuf);
399*4d7e907cSAndroid Build Coastguard Worker }
400*4d7e907cSAndroid Build Coastguard Worker
TEST(MetadataGralloc4Interop,PixelFormatFourcc)401*4d7e907cSAndroid Build Coastguard Worker TEST(MetadataGralloc4Interop, PixelFormatFourcc) {
402*4d7e907cSAndroid Build Coastguard Worker auto mpbuf = encode<StandardMetadataType::PIXEL_FORMAT_FOURCC>(DRM_FORMAT_ABGR8888);
403*4d7e907cSAndroid Build Coastguard Worker hidl_vec<uint8_t> g4buf;
404*4d7e907cSAndroid Build Coastguard Worker ASSERT_EQ(NO_ERROR, gralloc4::encodePixelFormatFourCC(DRM_FORMAT_ABGR8888, &g4buf));
405*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(g4buf, mpbuf);
406*4d7e907cSAndroid Build Coastguard Worker }
407*4d7e907cSAndroid Build Coastguard Worker
TEST(MetadataGralloc4Interop,PixelFormatModifier)408*4d7e907cSAndroid Build Coastguard Worker TEST(MetadataGralloc4Interop, PixelFormatModifier) {
409*4d7e907cSAndroid Build Coastguard Worker auto mpbuf = encode<StandardMetadataType::PIXEL_FORMAT_MODIFIER>(123456);
410*4d7e907cSAndroid Build Coastguard Worker hidl_vec<uint8_t> g4buf;
411*4d7e907cSAndroid Build Coastguard Worker ASSERT_EQ(NO_ERROR, gralloc4::encodePixelFormatModifier(123456, &g4buf));
412*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(g4buf, mpbuf);
413*4d7e907cSAndroid Build Coastguard Worker }
414*4d7e907cSAndroid Build Coastguard Worker
TEST(MetadataGralloc4Interop,Usage)415*4d7e907cSAndroid Build Coastguard Worker TEST(MetadataGralloc4Interop, Usage) {
416*4d7e907cSAndroid Build Coastguard Worker auto mpbuf = encode<StandardMetadataType::USAGE>(BufferUsage::COMPOSER_OVERLAY);
417*4d7e907cSAndroid Build Coastguard Worker hidl_vec<uint8_t> g4buf;
418*4d7e907cSAndroid Build Coastguard Worker ASSERT_EQ(NO_ERROR,
419*4d7e907cSAndroid Build Coastguard Worker gralloc4::encodeUsage(
420*4d7e907cSAndroid Build Coastguard Worker static_cast<uint64_t>(
421*4d7e907cSAndroid Build Coastguard Worker hardware::graphics::common::V1_2::BufferUsage::COMPOSER_OVERLAY),
422*4d7e907cSAndroid Build Coastguard Worker &g4buf));
423*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(g4buf, mpbuf);
424*4d7e907cSAndroid Build Coastguard Worker }
425*4d7e907cSAndroid Build Coastguard Worker
TEST(MetadataGralloc4Interop,AllocationSize)426*4d7e907cSAndroid Build Coastguard Worker TEST(MetadataGralloc4Interop, AllocationSize) {
427*4d7e907cSAndroid Build Coastguard Worker auto mpbuf = encode<StandardMetadataType::ALLOCATION_SIZE>(10200);
428*4d7e907cSAndroid Build Coastguard Worker hidl_vec<uint8_t> g4buf;
429*4d7e907cSAndroid Build Coastguard Worker ASSERT_EQ(NO_ERROR, gralloc4::encodeAllocationSize(10200, &g4buf));
430*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(g4buf, mpbuf);
431*4d7e907cSAndroid Build Coastguard Worker }
432*4d7e907cSAndroid Build Coastguard Worker
TEST(MetadataGralloc4Interop,ProtectedContent)433*4d7e907cSAndroid Build Coastguard Worker TEST(MetadataGralloc4Interop, ProtectedContent) {
434*4d7e907cSAndroid Build Coastguard Worker auto mpbuf = encode<StandardMetadataType::PROTECTED_CONTENT>(1);
435*4d7e907cSAndroid Build Coastguard Worker hidl_vec<uint8_t> g4buf;
436*4d7e907cSAndroid Build Coastguard Worker ASSERT_EQ(NO_ERROR, gralloc4::encodeProtectedContent(1, &g4buf));
437*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(g4buf, mpbuf);
438*4d7e907cSAndroid Build Coastguard Worker }
439*4d7e907cSAndroid Build Coastguard Worker
TEST(MetadataGralloc4Interop,Compression)440*4d7e907cSAndroid Build Coastguard Worker TEST(MetadataGralloc4Interop, Compression) {
441*4d7e907cSAndroid Build Coastguard Worker auto mpbuf = encode<StandardMetadataType::COMPRESSION>(
442*4d7e907cSAndroid Build Coastguard Worker gralloc4::Compression_DisplayStreamCompression);
443*4d7e907cSAndroid Build Coastguard Worker hidl_vec<uint8_t> g4buf;
444*4d7e907cSAndroid Build Coastguard Worker ASSERT_EQ(NO_ERROR,
445*4d7e907cSAndroid Build Coastguard Worker gralloc4::encodeCompression(gralloc4::Compression_DisplayStreamCompression, &g4buf));
446*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(g4buf, mpbuf);
447*4d7e907cSAndroid Build Coastguard Worker }
448*4d7e907cSAndroid Build Coastguard Worker
TEST(MetadataGralloc4Interop,Interlaced)449*4d7e907cSAndroid Build Coastguard Worker TEST(MetadataGralloc4Interop, Interlaced) {
450*4d7e907cSAndroid Build Coastguard Worker auto mpbuf = encode<StandardMetadataType::INTERLACED>(gralloc4::Interlaced_TopBottom);
451*4d7e907cSAndroid Build Coastguard Worker hidl_vec<uint8_t> g4buf;
452*4d7e907cSAndroid Build Coastguard Worker ASSERT_EQ(NO_ERROR, gralloc4::encodeInterlaced(gralloc4::Interlaced_TopBottom, &g4buf));
453*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(g4buf, mpbuf);
454*4d7e907cSAndroid Build Coastguard Worker }
455*4d7e907cSAndroid Build Coastguard Worker
TEST(MetadataGralloc4Interop,ChromeSitting)456*4d7e907cSAndroid Build Coastguard Worker TEST(MetadataGralloc4Interop, ChromeSitting) {
457*4d7e907cSAndroid Build Coastguard Worker auto mpbuf =
458*4d7e907cSAndroid Build Coastguard Worker encode<StandardMetadataType::CHROMA_SITING>(gralloc4::ChromaSiting_SitedInterstitial);
459*4d7e907cSAndroid Build Coastguard Worker hidl_vec<uint8_t> g4buf;
460*4d7e907cSAndroid Build Coastguard Worker ASSERT_EQ(NO_ERROR,
461*4d7e907cSAndroid Build Coastguard Worker gralloc4::encodeChromaSiting(gralloc4::ChromaSiting_SitedInterstitial, &g4buf));
462*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(g4buf, mpbuf);
463*4d7e907cSAndroid Build Coastguard Worker }
464*4d7e907cSAndroid Build Coastguard Worker
TEST(MetadataGralloc4Interop,PlaneLayouts)465*4d7e907cSAndroid Build Coastguard Worker TEST(MetadataGralloc4Interop, PlaneLayouts) {
466*4d7e907cSAndroid Build Coastguard Worker auto mpbuf = encode<StandardMetadataType::PLANE_LAYOUTS>(fakePlaneLayouts());
467*4d7e907cSAndroid Build Coastguard Worker hidl_vec<uint8_t> g4buf;
468*4d7e907cSAndroid Build Coastguard Worker ASSERT_EQ(NO_ERROR, gralloc4::encodePlaneLayouts(fakePlaneLayouts(), &g4buf));
469*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(g4buf, mpbuf);
470*4d7e907cSAndroid Build Coastguard Worker }
471*4d7e907cSAndroid Build Coastguard Worker
TEST(MetadataGralloc4Interop,Crop)472*4d7e907cSAndroid Build Coastguard Worker TEST(MetadataGralloc4Interop, Crop) {
473*4d7e907cSAndroid Build Coastguard Worker std::vector<Rect> cropRects{Rect{10, 11, 12, 13}, Rect{20, 21, 22, 23}};
474*4d7e907cSAndroid Build Coastguard Worker auto mpbuf = encode<StandardMetadataType::CROP>(cropRects);
475*4d7e907cSAndroid Build Coastguard Worker hidl_vec<uint8_t> g4buf;
476*4d7e907cSAndroid Build Coastguard Worker ASSERT_EQ(NO_ERROR, gralloc4::encodeCrop(cropRects, &g4buf));
477*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(g4buf, mpbuf);
478*4d7e907cSAndroid Build Coastguard Worker }
479*4d7e907cSAndroid Build Coastguard Worker
TEST(MetadataGralloc4Interop,Dataspace)480*4d7e907cSAndroid Build Coastguard Worker TEST(MetadataGralloc4Interop, Dataspace) {
481*4d7e907cSAndroid Build Coastguard Worker auto mpbuf = encode<StandardMetadataType::DATASPACE>(Dataspace::DISPLAY_P3);
482*4d7e907cSAndroid Build Coastguard Worker hidl_vec<uint8_t> g4buf;
483*4d7e907cSAndroid Build Coastguard Worker ASSERT_EQ(NO_ERROR, gralloc4::encodeDataspace(Dataspace::DISPLAY_P3, &g4buf));
484*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(g4buf, mpbuf);
485*4d7e907cSAndroid Build Coastguard Worker }
486*4d7e907cSAndroid Build Coastguard Worker
TEST(MetadataGralloc4Interop,BlendMode)487*4d7e907cSAndroid Build Coastguard Worker TEST(MetadataGralloc4Interop, BlendMode) {
488*4d7e907cSAndroid Build Coastguard Worker auto mpbuf = encode<StandardMetadataType::BLEND_MODE>(BlendMode::PREMULTIPLIED);
489*4d7e907cSAndroid Build Coastguard Worker hidl_vec<uint8_t> g4buf;
490*4d7e907cSAndroid Build Coastguard Worker ASSERT_EQ(NO_ERROR, gralloc4::encodeBlendMode(BlendMode::PREMULTIPLIED, &g4buf));
491*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(g4buf, mpbuf);
492*4d7e907cSAndroid Build Coastguard Worker }
493*4d7e907cSAndroid Build Coastguard Worker
TEST(MetadataGralloc4Interop,Smpte2086)494*4d7e907cSAndroid Build Coastguard Worker TEST(MetadataGralloc4Interop, Smpte2086) {
495*4d7e907cSAndroid Build Coastguard Worker Smpte2086 hdrdata{XyColor{.1f, .2f}, XyColor{.3f, .4f}, XyColor{.5f, .6f},
496*4d7e907cSAndroid Build Coastguard Worker XyColor{.7f, .8f}, 452.889f, 12.335f};
497*4d7e907cSAndroid Build Coastguard Worker
498*4d7e907cSAndroid Build Coastguard Worker auto mpbuf = encode<StandardMetadataType::SMPTE2086>(hdrdata);
499*4d7e907cSAndroid Build Coastguard Worker hidl_vec<uint8_t> g4buf;
500*4d7e907cSAndroid Build Coastguard Worker ASSERT_EQ(NO_ERROR, gralloc4::encodeSmpte2086(hdrdata, &g4buf));
501*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(g4buf, mpbuf);
502*4d7e907cSAndroid Build Coastguard Worker }
503*4d7e907cSAndroid Build Coastguard Worker
TEST(MetadataGralloc4Interop,Cta861_3)504*4d7e907cSAndroid Build Coastguard Worker TEST(MetadataGralloc4Interop, Cta861_3) {
505*4d7e907cSAndroid Build Coastguard Worker Cta861_3 hdrdata{302.202f, 244.55f};
506*4d7e907cSAndroid Build Coastguard Worker auto mpbuf = encode<StandardMetadataType::CTA861_3>(hdrdata);
507*4d7e907cSAndroid Build Coastguard Worker hidl_vec<uint8_t> g4buf;
508*4d7e907cSAndroid Build Coastguard Worker ASSERT_EQ(NO_ERROR, gralloc4::encodeCta861_3(hdrdata, &g4buf));
509*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(g4buf, mpbuf);
510*4d7e907cSAndroid Build Coastguard Worker }
511*4d7e907cSAndroid Build Coastguard Worker
TEST(MetadataGralloc4Interop,Smpte2094_10)512*4d7e907cSAndroid Build Coastguard Worker TEST(MetadataGralloc4Interop, Smpte2094_10) {
513*4d7e907cSAndroid Build Coastguard Worker auto mpbuf = encode<StandardMetadataType::SMPTE2094_10>(std::nullopt);
514*4d7e907cSAndroid Build Coastguard Worker hidl_vec<uint8_t> g4buf;
515*4d7e907cSAndroid Build Coastguard Worker ASSERT_EQ(NO_ERROR, gralloc4::encodeSmpte2094_10(std::nullopt, &g4buf));
516*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(g4buf, mpbuf);
517*4d7e907cSAndroid Build Coastguard Worker
518*4d7e907cSAndroid Build Coastguard Worker std::vector<uint8_t> hdrdata{1, 2, 3, 4, 5, 6};
519*4d7e907cSAndroid Build Coastguard Worker mpbuf = encode<StandardMetadataType::SMPTE2094_10>(hdrdata);
520*4d7e907cSAndroid Build Coastguard Worker ASSERT_EQ(NO_ERROR, gralloc4::encodeSmpte2094_10(hdrdata, &g4buf));
521*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(g4buf, mpbuf);
522*4d7e907cSAndroid Build Coastguard Worker }
523*4d7e907cSAndroid Build Coastguard Worker
TEST(MetadataGralloc4Interop,Smpte2094_40)524*4d7e907cSAndroid Build Coastguard Worker TEST(MetadataGralloc4Interop, Smpte2094_40) {
525*4d7e907cSAndroid Build Coastguard Worker auto mpbuf = encode<StandardMetadataType::SMPTE2094_40>(std::nullopt);
526*4d7e907cSAndroid Build Coastguard Worker hidl_vec<uint8_t> g4buf;
527*4d7e907cSAndroid Build Coastguard Worker ASSERT_EQ(NO_ERROR, gralloc4::encodeSmpte2094_40(std::nullopt, &g4buf));
528*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(g4buf, mpbuf);
529*4d7e907cSAndroid Build Coastguard Worker
530*4d7e907cSAndroid Build Coastguard Worker std::vector<uint8_t> hdrdata{1, 2, 3, 4, 5, 6};
531*4d7e907cSAndroid Build Coastguard Worker mpbuf = encode<StandardMetadataType::SMPTE2094_40>(hdrdata);
532*4d7e907cSAndroid Build Coastguard Worker ASSERT_EQ(NO_ERROR, gralloc4::encodeSmpte2094_40(hdrdata, &g4buf));
533*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(g4buf, mpbuf);
534*4d7e907cSAndroid Build Coastguard Worker }
535