blob: e999063fe41a6c7c94fb4908ada86805348debbc [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}
41Error decodeColorMetadata(hidl_vec<uint8_t> &in, ColorMetaData *out) {
42 if (!in.size() || !out) {
43 return Error::BAD_VALUE;
44 }
45 memcpy(out, in.data(), sizeof(ColorMetaData));
46 return Error::NONE;
47}
48
49Error encodeColorMetadata(ColorMetaData &in, hidl_vec<uint8_t> *out) {
50 if (!out) {
51 return Error::BAD_VALUE;
52 }
53 out->resize(sizeof(ColorMetaData));
54 memcpy(out->data(), &in, sizeof(ColorMetaData));
55 return Error::NONE;
56}
57
Ravi Ranjanc74a80e2020-05-04 09:40:39 +053058// decode the raw graphics metadata from bytestream and store it in 'data' member of
59// GraphicsMetadata struct during mapper->set call, 'size' member is unused.
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -050060Error decodeGraphicsMetadata(hidl_vec<uint8_t> &in, GraphicsMetadata *out) {
61 if (!in.size() || !out) {
62 return Error::BAD_VALUE;
63 }
Ravi Ranjanc74a80e2020-05-04 09:40:39 +053064 memcpy(&(out->data), in.data(), GRAPHICS_METADATA_SIZE_IN_BYTES);
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -050065 return Error::NONE;
66}
67
Ravi Ranjanc74a80e2020-05-04 09:40:39 +053068// encode only 'data' member of GraphicsMetadata struct for retrieval of
69// graphics metadata during mapper->get call
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -050070Error encodeGraphicsMetadata(GraphicsMetadata &in, hidl_vec<uint8_t> *out) {
71 if (!out) {
72 return Error::BAD_VALUE;
73 }
Ravi Ranjanc74a80e2020-05-04 09:40:39 +053074 out->resize(GRAPHICS_METADATA_SIZE_IN_BYTES);
75 memcpy(out->data(), &(in.data), GRAPHICS_METADATA_SIZE_IN_BYTES);
76 return Error::NONE;
77}
78
79// decode the raw graphics metadata from bytestream before presenting it to caller
80Error decodeGraphicsMetadataRaw(hidl_vec<uint8_t> &in, void *out) {
81 if (!in.size() || !out) {
82 return Error::BAD_VALUE;
83 }
84 memcpy(out, in.data(), GRAPHICS_METADATA_SIZE_IN_BYTES);
85 return Error::NONE;
86}
87
88// encode the raw graphics metadata in bytestream before calling mapper->set
89Error encodeGraphicsMetadataRaw(void *in, hidl_vec<uint8_t> *out) {
90 if (!in || !out) {
91 return Error::BAD_VALUE;
92 }
93 out->resize(GRAPHICS_METADATA_SIZE_IN_BYTES);
94 memcpy(out->data(), in, GRAPHICS_METADATA_SIZE_IN_BYTES);
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -050095 return Error::NONE;
96}
97
98Error decodeUBWCStats(hidl_vec<uint8_t> &in, UBWCStats *out) {
99 if (!in.size() || !out) {
100 return Error::BAD_VALUE;
101 }
102 memcpy(out, in.data(), UBWC_STATS_ARRAY_SIZE * sizeof(UBWCStats));
103 return Error::NONE;
104}
105
106Error encodeUBWCStats(UBWCStats *in, hidl_vec<uint8_t> *out) {
107 if (!in || !out) {
108 return Error::BAD_VALUE;
109 }
110 out->resize(UBWC_STATS_ARRAY_SIZE * sizeof(UBWCStats));
Yichi Chenbddad072020-03-23 12:50:12 +0800111 memcpy(out->data(), in, UBWC_STATS_ARRAY_SIZE * sizeof(UBWCStats));
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -0500112 return Error::NONE;
113}
114
115Error decodeCVPMetadata(hidl_vec<uint8_t> &in, CVPMetadata *out) {
116 if (!in.size() || !out) {
117 return Error::BAD_VALUE;
118 }
119 memcpy(out, in.data(), sizeof(CVPMetadata));
120 return Error::NONE;
121}
122
123Error encodeCVPMetadata(CVPMetadata &in, hidl_vec<uint8_t> *out) {
124 if (!out) {
125 return Error::BAD_VALUE;
126 }
127 out->resize(sizeof(CVPMetadata));
128 memcpy(out->data(), &in, sizeof(CVPMetadata));
129 return Error::NONE;
130}
131
132Error decodeVideoHistogramMetadata(hidl_vec<uint8_t> &in, VideoHistogramMetadata *out) {
133 if (!in.size() || !out) {
134 return Error::BAD_VALUE;
135 }
136 memcpy(out, in.data(), sizeof(VideoHistogramMetadata));
137 return Error::NONE;
138}
139
140Error encodeVideoHistogramMetadata(VideoHistogramMetadata &in, hidl_vec<uint8_t> *out) {
141 if (!out) {
142 return Error::BAD_VALUE;
143 }
144 out->resize(sizeof(VideoHistogramMetadata));
145 memcpy(out->data(), &in, sizeof(VideoHistogramMetadata));
146 return Error::NONE;
147}
148
149MetadataType getMetadataType(uint32_t in) {
150 switch (in) {
151 case QTI_VT_TIMESTAMP:
152 return MetadataType_VTTimestamp;
153 case QTI_VIDEO_PERF_MODE:
154 return MetadataType_VideoPerfMode;
155 case QTI_LINEAR_FORMAT:
156 return MetadataType_LinearFormat;
157 case QTI_SINGLE_BUFFER_MODE:
158 return MetadataType_SingleBufferMode;
159 case QTI_PP_PARAM_INTERLACED:
160 return MetadataType_PPParamInterlaced;
161 case QTI_MAP_SECURE_BUFFER:
162 return MetadataType_MapSecureBuffer;
163 case QTI_COLOR_METADATA:
164 return MetadataType_ColorMetadata;
165 case QTI_GRAPHICS_METADATA:
166 return MetadataType_GraphicsMetadata;
167 case QTI_UBWC_CR_STATS_INFO:
168 return MetadataType_UBWCCRStatsInfo;
169 case QTI_REFRESH_RATE:
170 return MetadataType_RefreshRate;
171 case QTI_CVP_METADATA:
172 return MetadataType_CVPMetadata;
173 case QTI_VIDEO_HISTOGRAM_STATS:
174 return MetadataType_VideoHistogramStats;
175 case QTI_FD:
176 return MetadataType_FD;
177 case QTI_PRIVATE_FLAGS:
178 return MetadataType_PrivateFlags;
Tharaga Balachandranaa640f72020-03-10 13:52:04 -0400179 case QTI_ALIGNED_WIDTH_IN_PIXELS:
180 return MetadataType_AlignedWidthInPixels;
181 case QTI_ALIGNED_HEIGHT_IN_PIXELS:
182 return MetadataType_AlignedHeightInPixels;
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -0500183 default:
184 return MetadataType_Invalid;
185 }
186}
187
188Error get(void *buffer, uint32_t type, void *param) {
189 hidl_vec<uint8_t> bytestream;
190 sp<IMapper> mapper = getInstance();
191
192 MetadataType metadata_type = getMetadataType(type);
193 if (metadata_type == MetadataType_Invalid) {
194 param = nullptr;
195 return Error::UNSUPPORTED;
196 }
197
198 auto err = Error::UNSUPPORTED;
199 mapper->get(buffer, metadata_type, [&](const auto &tmpError, const auto &tmpByteStream) {
200 err = tmpError;
201 bytestream = tmpByteStream;
202 });
203
204 if (err != Error::NONE) {
205 return err;
206 }
207
208 switch (type) {
209 case QTI_VT_TIMESTAMP:
210 err = static_cast<Error>(android::gralloc4::decodeUint64(qtigralloc::MetadataType_VTTimestamp,
211 bytestream, (uint64_t *)param));
212 break;
213 case QTI_VIDEO_PERF_MODE:
214 err = static_cast<Error>(android::gralloc4::decodeUint32(
215 qtigralloc::MetadataType_VideoPerfMode, bytestream, (uint32_t *)param));
216 break;
217 case QTI_LINEAR_FORMAT:
218 err = static_cast<Error>(android::gralloc4::decodeUint32(
219 qtigralloc::MetadataType_LinearFormat, bytestream, (uint32_t *)param));
220 break;
221 case QTI_SINGLE_BUFFER_MODE:
222 err = static_cast<Error>(android::gralloc4::decodeUint32(
223 qtigralloc::MetadataType_SingleBufferMode, bytestream, (uint32_t *)param));
224 break;
225 case QTI_PP_PARAM_INTERLACED:
226 err = static_cast<Error>(android::gralloc4::decodeInt32(
227 qtigralloc::MetadataType_PPParamInterlaced, bytestream, (int32_t *)param));
228 break;
229 case QTI_MAP_SECURE_BUFFER:
230 err = static_cast<Error>(android::gralloc4::decodeInt32(
231 qtigralloc::MetadataType_MapSecureBuffer, bytestream, (int32_t *)param));
232 break;
233 case QTI_COLOR_METADATA:
234 err = decodeColorMetadata(bytestream, (ColorMetaData *)param);
235 break;
236 case QTI_GRAPHICS_METADATA:
Ravi Ranjanc74a80e2020-05-04 09:40:39 +0530237 err = decodeGraphicsMetadataRaw(bytestream, param);
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -0500238 break;
239 case QTI_UBWC_CR_STATS_INFO:
240 err = decodeUBWCStats(bytestream, (UBWCStats *)param);
241 break;
242 case QTI_REFRESH_RATE:
243 err = static_cast<Error>(android::gralloc4::decodeFloat(qtigralloc::MetadataType_RefreshRate,
244 bytestream, (float *)param));
245 break;
246 case QTI_CVP_METADATA:
247 err = decodeCVPMetadata(bytestream, (CVPMetadata *)param);
248 break;
249 case QTI_VIDEO_HISTOGRAM_STATS:
250 err = decodeVideoHistogramMetadata(bytestream, (VideoHistogramMetadata *)param);
251 break;
252 case QTI_FD:
253 err = static_cast<Error>(android::gralloc4::decodeInt32(qtigralloc::MetadataType_FD,
254 bytestream, (int32_t *)param));
255 break;
256 case QTI_PRIVATE_FLAGS:
257 err = static_cast<Error>(android::gralloc4::decodeInt32(qtigralloc::MetadataType_PrivateFlags,
258 bytestream, (int32_t *)param));
259 break;
Tharaga Balachandranaa640f72020-03-10 13:52:04 -0400260 case QTI_ALIGNED_WIDTH_IN_PIXELS:
261 err = static_cast<Error>(android::gralloc4::decodeUint32(
262 qtigralloc::MetadataType_AlignedWidthInPixels, bytestream, (uint32_t *)param));
263 break;
264 case QTI_ALIGNED_HEIGHT_IN_PIXELS:
265 err = static_cast<Error>(android::gralloc4::decodeUint32(
266 qtigralloc::MetadataType_AlignedHeightInPixels, bytestream, (uint32_t *)param));
267 break;
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -0500268 default:
269 param = nullptr;
270 return Error::UNSUPPORTED;
271 }
272
273 return err;
274}
275
276Error set(void *buffer, uint32_t type, void *param) {
277 hidl_vec<uint8_t> bytestream;
278 sp<IMapper> mapper = getInstance();
279
280 Error err = Error::UNSUPPORTED;
281 MetadataType metadata_type = getMetadataType(type);
282 if (metadata_type == MetadataType_Invalid) {
283 return err;
284 }
285
286 switch (type) {
287 case QTI_VT_TIMESTAMP:
288 err = static_cast<Error>(android::gralloc4::encodeUint64(qtigralloc::MetadataType_VTTimestamp,
289 *(uint64_t *)param, &bytestream));
290 break;
291 case QTI_VIDEO_PERF_MODE:
292 err = static_cast<Error>(android::gralloc4::encodeUint32(
293 qtigralloc::MetadataType_VideoPerfMode, *(uint32_t *)param, &bytestream));
294 break;
295 case QTI_LINEAR_FORMAT:
296 err = static_cast<Error>(android::gralloc4::encodeUint32(
297 qtigralloc::MetadataType_LinearFormat, *(uint32_t *)param, &bytestream));
298 break;
299 case QTI_SINGLE_BUFFER_MODE:
300 err = static_cast<Error>(android::gralloc4::encodeUint32(
301 qtigralloc::MetadataType_SingleBufferMode, *(uint32_t *)param, &bytestream));
302 break;
303 case QTI_PP_PARAM_INTERLACED:
304 err = static_cast<Error>(android::gralloc4::encodeInt32(
305 qtigralloc::MetadataType_PPParamInterlaced, *(int32_t *)param, &bytestream));
306 break;
307 case QTI_MAP_SECURE_BUFFER:
308 err = static_cast<Error>(android::gralloc4::encodeInt32(
309 qtigralloc::MetadataType_MapSecureBuffer, *(int32_t *)param, &bytestream));
310 break;
311 case QTI_COLOR_METADATA:
312 err = encodeColorMetadata(*(ColorMetaData *)param, &bytestream);
313 break;
314 case QTI_GRAPHICS_METADATA:
Ravi Ranjanc74a80e2020-05-04 09:40:39 +0530315 err = encodeGraphicsMetadataRaw(param, &bytestream);
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -0500316 break;
317 case QTI_UBWC_CR_STATS_INFO:
318 err = encodeUBWCStats((UBWCStats *)param, &bytestream);
319 break;
320 case QTI_REFRESH_RATE:
321 err = static_cast<Error>(android::gralloc4::encodeFloat(qtigralloc::MetadataType_RefreshRate,
322 *(float *)param, &bytestream));
323 break;
324 case QTI_CVP_METADATA:
325 err = encodeCVPMetadata(*(CVPMetadata *)param, &bytestream);
326 break;
327 case QTI_VIDEO_HISTOGRAM_STATS:
328 err = encodeVideoHistogramMetadata(*(VideoHistogramMetadata *)param, &bytestream);
329 break;
330 default:
331 param = nullptr;
332 return Error::UNSUPPORTED;
333 }
334
335 if (err != Error::NONE) {
336 return err;
337 }
338
339 return mapper->set((void *)buffer, metadata_type, bytestream);
340}
341
342} // namespace qtigralloc