blob: aab5754f3dbfb8215ca8b6079940e99695460e12 [file] [log] [blame]
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -05001/*
2 * Copyright (c) 2020, The Linux Foundation. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
6 * met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above
10 * copyright notice, this list of conditions and the following
11 * disclaimer in the documentation and/or other materials provided
12 * with the distribution.
13 * * Neither the name of The Linux Foundation nor the names of its
14 * contributors may be used to endorse or promote products derived
15 * from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30#include "QtiGralloc.h"
31
32#include <log/log.h>
33namespace qtigralloc {
34
35using android::hardware::graphics::mapper::V4_0::IMapper;
Yichi Chenbddad072020-03-23 12:50:12 +080036
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -050037static sp<IMapper> getInstance() {
38 static sp<IMapper> mapper = IMapper::getService();
39 return mapper;
40}
Tharaga Balachandran39810462020-06-16 09:34:34 -040041
42Error decodeMetadataState(hidl_vec<uint8_t> &in, bool *out) {
43 if (!in.size() || !out) {
44 return Error::BAD_VALUE;
45 }
46 memcpy(out, in.data(), METADATA_SET_SIZE);
47 return Error::NONE;
48}
49
50Error encodeMetadataState(bool *in, hidl_vec<uint8_t> *out) {
51 if (!in || !out) {
52 return Error::BAD_VALUE;
53 }
54 out->resize(sizeof(bool) * METADATA_SET_SIZE);
55 memcpy(out->data(), in, sizeof(bool) * METADATA_SET_SIZE);
56 return Error::NONE;
57}
58
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -050059Error decodeColorMetadata(hidl_vec<uint8_t> &in, ColorMetaData *out) {
60 if (!in.size() || !out) {
61 return Error::BAD_VALUE;
62 }
63 memcpy(out, in.data(), sizeof(ColorMetaData));
64 return Error::NONE;
65}
66
67Error encodeColorMetadata(ColorMetaData &in, hidl_vec<uint8_t> *out) {
68 if (!out) {
69 return Error::BAD_VALUE;
70 }
71 out->resize(sizeof(ColorMetaData));
72 memcpy(out->data(), &in, sizeof(ColorMetaData));
73 return Error::NONE;
74}
75
Ravi Ranjanc74a80e2020-05-04 09:40:39 +053076// decode the raw graphics metadata from bytestream and store it in 'data' member of
77// GraphicsMetadata struct during mapper->set call, 'size' member is unused.
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -050078Error decodeGraphicsMetadata(hidl_vec<uint8_t> &in, GraphicsMetadata *out) {
79 if (!in.size() || !out) {
80 return Error::BAD_VALUE;
81 }
Ravi Ranjanc74a80e2020-05-04 09:40:39 +053082 memcpy(&(out->data), in.data(), GRAPHICS_METADATA_SIZE_IN_BYTES);
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -050083 return Error::NONE;
84}
85
Ravi Ranjanc74a80e2020-05-04 09:40:39 +053086// encode only 'data' member of GraphicsMetadata struct for retrieval of
87// graphics metadata during mapper->get call
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -050088Error encodeGraphicsMetadata(GraphicsMetadata &in, hidl_vec<uint8_t> *out) {
89 if (!out) {
90 return Error::BAD_VALUE;
91 }
Ravi Ranjanc74a80e2020-05-04 09:40:39 +053092 out->resize(GRAPHICS_METADATA_SIZE_IN_BYTES);
93 memcpy(out->data(), &(in.data), GRAPHICS_METADATA_SIZE_IN_BYTES);
94 return Error::NONE;
95}
96
97// decode the raw graphics metadata from bytestream before presenting it to caller
98Error decodeGraphicsMetadataRaw(hidl_vec<uint8_t> &in, void *out) {
99 if (!in.size() || !out) {
100 return Error::BAD_VALUE;
101 }
102 memcpy(out, in.data(), GRAPHICS_METADATA_SIZE_IN_BYTES);
103 return Error::NONE;
104}
105
106// encode the raw graphics metadata in bytestream before calling mapper->set
107Error encodeGraphicsMetadataRaw(void *in, hidl_vec<uint8_t> *out) {
108 if (!in || !out) {
109 return Error::BAD_VALUE;
110 }
111 out->resize(GRAPHICS_METADATA_SIZE_IN_BYTES);
112 memcpy(out->data(), in, GRAPHICS_METADATA_SIZE_IN_BYTES);
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -0500113 return Error::NONE;
114}
115
116Error decodeUBWCStats(hidl_vec<uint8_t> &in, UBWCStats *out) {
117 if (!in.size() || !out) {
118 return Error::BAD_VALUE;
119 }
120 memcpy(out, in.data(), UBWC_STATS_ARRAY_SIZE * sizeof(UBWCStats));
121 return Error::NONE;
122}
123
124Error encodeUBWCStats(UBWCStats *in, hidl_vec<uint8_t> *out) {
125 if (!in || !out) {
126 return Error::BAD_VALUE;
127 }
128 out->resize(UBWC_STATS_ARRAY_SIZE * sizeof(UBWCStats));
Yichi Chenbddad072020-03-23 12:50:12 +0800129 memcpy(out->data(), in, UBWC_STATS_ARRAY_SIZE * sizeof(UBWCStats));
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -0500130 return Error::NONE;
131}
132
133Error decodeCVPMetadata(hidl_vec<uint8_t> &in, CVPMetadata *out) {
134 if (!in.size() || !out) {
135 return Error::BAD_VALUE;
136 }
137 memcpy(out, in.data(), sizeof(CVPMetadata));
138 return Error::NONE;
139}
140
141Error encodeCVPMetadata(CVPMetadata &in, hidl_vec<uint8_t> *out) {
142 if (!out) {
143 return Error::BAD_VALUE;
144 }
145 out->resize(sizeof(CVPMetadata));
146 memcpy(out->data(), &in, sizeof(CVPMetadata));
147 return Error::NONE;
148}
149
150Error decodeVideoHistogramMetadata(hidl_vec<uint8_t> &in, VideoHistogramMetadata *out) {
151 if (!in.size() || !out) {
152 return Error::BAD_VALUE;
153 }
154 memcpy(out, in.data(), sizeof(VideoHistogramMetadata));
155 return Error::NONE;
156}
157
158Error encodeVideoHistogramMetadata(VideoHistogramMetadata &in, hidl_vec<uint8_t> *out) {
159 if (!out) {
160 return Error::BAD_VALUE;
161 }
162 out->resize(sizeof(VideoHistogramMetadata));
163 memcpy(out->data(), &in, sizeof(VideoHistogramMetadata));
164 return Error::NONE;
165}
166
167MetadataType getMetadataType(uint32_t in) {
168 switch (in) {
169 case QTI_VT_TIMESTAMP:
170 return MetadataType_VTTimestamp;
171 case QTI_VIDEO_PERF_MODE:
172 return MetadataType_VideoPerfMode;
173 case QTI_LINEAR_FORMAT:
174 return MetadataType_LinearFormat;
175 case QTI_SINGLE_BUFFER_MODE:
176 return MetadataType_SingleBufferMode;
177 case QTI_PP_PARAM_INTERLACED:
178 return MetadataType_PPParamInterlaced;
179 case QTI_MAP_SECURE_BUFFER:
180 return MetadataType_MapSecureBuffer;
181 case QTI_COLOR_METADATA:
182 return MetadataType_ColorMetadata;
183 case QTI_GRAPHICS_METADATA:
184 return MetadataType_GraphicsMetadata;
185 case QTI_UBWC_CR_STATS_INFO:
186 return MetadataType_UBWCCRStatsInfo;
187 case QTI_REFRESH_RATE:
188 return MetadataType_RefreshRate;
189 case QTI_CVP_METADATA:
190 return MetadataType_CVPMetadata;
191 case QTI_VIDEO_HISTOGRAM_STATS:
192 return MetadataType_VideoHistogramStats;
193 case QTI_FD:
194 return MetadataType_FD;
195 case QTI_PRIVATE_FLAGS:
196 return MetadataType_PrivateFlags;
Tharaga Balachandranaa640f72020-03-10 13:52:04 -0400197 case QTI_ALIGNED_WIDTH_IN_PIXELS:
198 return MetadataType_AlignedWidthInPixels;
199 case QTI_ALIGNED_HEIGHT_IN_PIXELS:
200 return MetadataType_AlignedHeightInPixels;
Tharaga Balachandran39810462020-06-16 09:34:34 -0400201 case QTI_STANDARD_METADATA_STATUS:
202 return MetadataType_StandardMetadataStatus;
203 case QTI_VENDOR_METADATA_STATUS:
204 return MetadataType_VendorMetadataStatus;
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -0500205 default:
206 return MetadataType_Invalid;
207 }
208}
209
210Error get(void *buffer, uint32_t type, void *param) {
211 hidl_vec<uint8_t> bytestream;
212 sp<IMapper> mapper = getInstance();
213
214 MetadataType metadata_type = getMetadataType(type);
215 if (metadata_type == MetadataType_Invalid) {
216 param = nullptr;
217 return Error::UNSUPPORTED;
218 }
219
220 auto err = Error::UNSUPPORTED;
221 mapper->get(buffer, metadata_type, [&](const auto &tmpError, const auto &tmpByteStream) {
222 err = tmpError;
223 bytestream = tmpByteStream;
224 });
225
226 if (err != Error::NONE) {
227 return err;
228 }
229
230 switch (type) {
231 case QTI_VT_TIMESTAMP:
232 err = static_cast<Error>(android::gralloc4::decodeUint64(qtigralloc::MetadataType_VTTimestamp,
233 bytestream, (uint64_t *)param));
234 break;
235 case QTI_VIDEO_PERF_MODE:
236 err = static_cast<Error>(android::gralloc4::decodeUint32(
237 qtigralloc::MetadataType_VideoPerfMode, bytestream, (uint32_t *)param));
238 break;
239 case QTI_LINEAR_FORMAT:
240 err = static_cast<Error>(android::gralloc4::decodeUint32(
241 qtigralloc::MetadataType_LinearFormat, bytestream, (uint32_t *)param));
242 break;
243 case QTI_SINGLE_BUFFER_MODE:
244 err = static_cast<Error>(android::gralloc4::decodeUint32(
245 qtigralloc::MetadataType_SingleBufferMode, bytestream, (uint32_t *)param));
246 break;
247 case QTI_PP_PARAM_INTERLACED:
248 err = static_cast<Error>(android::gralloc4::decodeInt32(
249 qtigralloc::MetadataType_PPParamInterlaced, bytestream, (int32_t *)param));
250 break;
251 case QTI_MAP_SECURE_BUFFER:
252 err = static_cast<Error>(android::gralloc4::decodeInt32(
253 qtigralloc::MetadataType_MapSecureBuffer, bytestream, (int32_t *)param));
254 break;
255 case QTI_COLOR_METADATA:
256 err = decodeColorMetadata(bytestream, (ColorMetaData *)param);
257 break;
258 case QTI_GRAPHICS_METADATA:
Ravi Ranjanc74a80e2020-05-04 09:40:39 +0530259 err = decodeGraphicsMetadataRaw(bytestream, param);
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -0500260 break;
261 case QTI_UBWC_CR_STATS_INFO:
262 err = decodeUBWCStats(bytestream, (UBWCStats *)param);
263 break;
264 case QTI_REFRESH_RATE:
265 err = static_cast<Error>(android::gralloc4::decodeFloat(qtigralloc::MetadataType_RefreshRate,
266 bytestream, (float *)param));
267 break;
268 case QTI_CVP_METADATA:
269 err = decodeCVPMetadata(bytestream, (CVPMetadata *)param);
270 break;
271 case QTI_VIDEO_HISTOGRAM_STATS:
272 err = decodeVideoHistogramMetadata(bytestream, (VideoHistogramMetadata *)param);
273 break;
274 case QTI_FD:
275 err = static_cast<Error>(android::gralloc4::decodeInt32(qtigralloc::MetadataType_FD,
276 bytestream, (int32_t *)param));
277 break;
278 case QTI_PRIVATE_FLAGS:
279 err = static_cast<Error>(android::gralloc4::decodeInt32(qtigralloc::MetadataType_PrivateFlags,
280 bytestream, (int32_t *)param));
281 break;
Tharaga Balachandranaa640f72020-03-10 13:52:04 -0400282 case QTI_ALIGNED_WIDTH_IN_PIXELS:
283 err = static_cast<Error>(android::gralloc4::decodeUint32(
284 qtigralloc::MetadataType_AlignedWidthInPixels, bytestream, (uint32_t *)param));
285 break;
286 case QTI_ALIGNED_HEIGHT_IN_PIXELS:
287 err = static_cast<Error>(android::gralloc4::decodeUint32(
288 qtigralloc::MetadataType_AlignedHeightInPixels, bytestream, (uint32_t *)param));
289 break;
Tharaga Balachandran39810462020-06-16 09:34:34 -0400290 case QTI_STANDARD_METADATA_STATUS:
291 case QTI_VENDOR_METADATA_STATUS:
292 err = decodeMetadataState(bytestream, (bool *)param);
293 break;
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -0500294 default:
295 param = nullptr;
296 return Error::UNSUPPORTED;
297 }
298
299 return err;
300}
301
302Error set(void *buffer, uint32_t type, void *param) {
303 hidl_vec<uint8_t> bytestream;
304 sp<IMapper> mapper = getInstance();
305
306 Error err = Error::UNSUPPORTED;
307 MetadataType metadata_type = getMetadataType(type);
308 if (metadata_type == MetadataType_Invalid) {
309 return err;
310 }
311
312 switch (type) {
313 case QTI_VT_TIMESTAMP:
314 err = static_cast<Error>(android::gralloc4::encodeUint64(qtigralloc::MetadataType_VTTimestamp,
315 *(uint64_t *)param, &bytestream));
316 break;
317 case QTI_VIDEO_PERF_MODE:
318 err = static_cast<Error>(android::gralloc4::encodeUint32(
319 qtigralloc::MetadataType_VideoPerfMode, *(uint32_t *)param, &bytestream));
320 break;
321 case QTI_LINEAR_FORMAT:
322 err = static_cast<Error>(android::gralloc4::encodeUint32(
323 qtigralloc::MetadataType_LinearFormat, *(uint32_t *)param, &bytestream));
324 break;
325 case QTI_SINGLE_BUFFER_MODE:
326 err = static_cast<Error>(android::gralloc4::encodeUint32(
327 qtigralloc::MetadataType_SingleBufferMode, *(uint32_t *)param, &bytestream));
328 break;
329 case QTI_PP_PARAM_INTERLACED:
330 err = static_cast<Error>(android::gralloc4::encodeInt32(
331 qtigralloc::MetadataType_PPParamInterlaced, *(int32_t *)param, &bytestream));
332 break;
333 case QTI_MAP_SECURE_BUFFER:
334 err = static_cast<Error>(android::gralloc4::encodeInt32(
335 qtigralloc::MetadataType_MapSecureBuffer, *(int32_t *)param, &bytestream));
336 break;
337 case QTI_COLOR_METADATA:
338 err = encodeColorMetadata(*(ColorMetaData *)param, &bytestream);
339 break;
340 case QTI_GRAPHICS_METADATA:
Ravi Ranjanc74a80e2020-05-04 09:40:39 +0530341 err = encodeGraphicsMetadataRaw(param, &bytestream);
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -0500342 break;
343 case QTI_UBWC_CR_STATS_INFO:
344 err = encodeUBWCStats((UBWCStats *)param, &bytestream);
345 break;
346 case QTI_REFRESH_RATE:
347 err = static_cast<Error>(android::gralloc4::encodeFloat(qtigralloc::MetadataType_RefreshRate,
348 *(float *)param, &bytestream));
349 break;
350 case QTI_CVP_METADATA:
351 err = encodeCVPMetadata(*(CVPMetadata *)param, &bytestream);
352 break;
353 case QTI_VIDEO_HISTOGRAM_STATS:
354 err = encodeVideoHistogramMetadata(*(VideoHistogramMetadata *)param, &bytestream);
355 break;
356 default:
357 param = nullptr;
358 return Error::UNSUPPORTED;
359 }
360
361 if (err != Error::NONE) {
362 return err;
363 }
364
365 return mapper->set((void *)buffer, metadata_type, bytestream);
366}
367
Tharaga Balachandran39810462020-06-16 09:34:34 -0400368int getMetadataState(void *buffer, uint32_t type) {
369 bool metadata_set[METADATA_SET_SIZE];
370 Error err;
371 if (IS_VENDOR_METADATA_TYPE(type)) {
372 err = get(buffer, QTI_VENDOR_METADATA_STATUS, &metadata_set);
373 } else {
374 err = get(buffer, QTI_STANDARD_METADATA_STATUS, &metadata_set);
375 }
376
377 if (err != Error::NONE) {
378 ALOGE("Unable to get metadata state");
379 return -1;
380 }
381
382 if (IS_VENDOR_METADATA_TYPE(type)) {
383 return metadata_set[GET_VENDOR_METADATA_STATUS_INDEX(type)];
384 } else {
385 return metadata_set[GET_STANDARD_METADATA_STATUS_INDEX(type)];
386 }
387}
388
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -0500389} // namespace qtigralloc