blob: 912d3608188cf56bd3ebe91e332f3a9ff65d3726 [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
58Error decodeGraphicsMetadata(hidl_vec<uint8_t> &in, GraphicsMetadata *out) {
59 if (!in.size() || !out) {
60 return Error::BAD_VALUE;
61 }
62 memcpy(out, in.data(), sizeof(GraphicsMetadata));
63 return Error::NONE;
64}
65
66Error encodeGraphicsMetadata(GraphicsMetadata &in, hidl_vec<uint8_t> *out) {
67 if (!out) {
68 return Error::BAD_VALUE;
69 }
70 out->resize(sizeof(GraphicsMetadata));
71 memcpy(out->data(), &in, sizeof(GraphicsMetadata));
72 return Error::NONE;
73}
74
75Error decodeUBWCStats(hidl_vec<uint8_t> &in, UBWCStats *out) {
76 if (!in.size() || !out) {
77 return Error::BAD_VALUE;
78 }
79 memcpy(out, in.data(), UBWC_STATS_ARRAY_SIZE * sizeof(UBWCStats));
80 return Error::NONE;
81}
82
83Error encodeUBWCStats(UBWCStats *in, hidl_vec<uint8_t> *out) {
84 if (!in || !out) {
85 return Error::BAD_VALUE;
86 }
87 out->resize(UBWC_STATS_ARRAY_SIZE * sizeof(UBWCStats));
Yichi Chenbddad072020-03-23 12:50:12 +080088 memcpy(out->data(), in, UBWC_STATS_ARRAY_SIZE * sizeof(UBWCStats));
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -050089 return Error::NONE;
90}
91
92Error decodeCVPMetadata(hidl_vec<uint8_t> &in, CVPMetadata *out) {
93 if (!in.size() || !out) {
94 return Error::BAD_VALUE;
95 }
96 memcpy(out, in.data(), sizeof(CVPMetadata));
97 return Error::NONE;
98}
99
100Error encodeCVPMetadata(CVPMetadata &in, hidl_vec<uint8_t> *out) {
101 if (!out) {
102 return Error::BAD_VALUE;
103 }
104 out->resize(sizeof(CVPMetadata));
105 memcpy(out->data(), &in, sizeof(CVPMetadata));
106 return Error::NONE;
107}
108
109Error decodeVideoHistogramMetadata(hidl_vec<uint8_t> &in, VideoHistogramMetadata *out) {
110 if (!in.size() || !out) {
111 return Error::BAD_VALUE;
112 }
113 memcpy(out, in.data(), sizeof(VideoHistogramMetadata));
114 return Error::NONE;
115}
116
117Error encodeVideoHistogramMetadata(VideoHistogramMetadata &in, hidl_vec<uint8_t> *out) {
118 if (!out) {
119 return Error::BAD_VALUE;
120 }
121 out->resize(sizeof(VideoHistogramMetadata));
122 memcpy(out->data(), &in, sizeof(VideoHistogramMetadata));
123 return Error::NONE;
124}
125
126MetadataType getMetadataType(uint32_t in) {
127 switch (in) {
128 case QTI_VT_TIMESTAMP:
129 return MetadataType_VTTimestamp;
130 case QTI_VIDEO_PERF_MODE:
131 return MetadataType_VideoPerfMode;
132 case QTI_LINEAR_FORMAT:
133 return MetadataType_LinearFormat;
134 case QTI_SINGLE_BUFFER_MODE:
135 return MetadataType_SingleBufferMode;
136 case QTI_PP_PARAM_INTERLACED:
137 return MetadataType_PPParamInterlaced;
138 case QTI_MAP_SECURE_BUFFER:
139 return MetadataType_MapSecureBuffer;
140 case QTI_COLOR_METADATA:
141 return MetadataType_ColorMetadata;
142 case QTI_GRAPHICS_METADATA:
143 return MetadataType_GraphicsMetadata;
144 case QTI_UBWC_CR_STATS_INFO:
145 return MetadataType_UBWCCRStatsInfo;
146 case QTI_REFRESH_RATE:
147 return MetadataType_RefreshRate;
148 case QTI_CVP_METADATA:
149 return MetadataType_CVPMetadata;
150 case QTI_VIDEO_HISTOGRAM_STATS:
151 return MetadataType_VideoHistogramStats;
152 case QTI_FD:
153 return MetadataType_FD;
154 case QTI_PRIVATE_FLAGS:
155 return MetadataType_PrivateFlags;
Tharaga Balachandranaa640f72020-03-10 13:52:04 -0400156 case QTI_ALIGNED_WIDTH_IN_PIXELS:
157 return MetadataType_AlignedWidthInPixels;
158 case QTI_ALIGNED_HEIGHT_IN_PIXELS:
159 return MetadataType_AlignedHeightInPixels;
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -0500160 default:
161 return MetadataType_Invalid;
162 }
163}
164
165Error get(void *buffer, uint32_t type, void *param) {
166 hidl_vec<uint8_t> bytestream;
167 sp<IMapper> mapper = getInstance();
168
169 MetadataType metadata_type = getMetadataType(type);
170 if (metadata_type == MetadataType_Invalid) {
171 param = nullptr;
172 return Error::UNSUPPORTED;
173 }
174
175 auto err = Error::UNSUPPORTED;
176 mapper->get(buffer, metadata_type, [&](const auto &tmpError, const auto &tmpByteStream) {
177 err = tmpError;
178 bytestream = tmpByteStream;
179 });
180
181 if (err != Error::NONE) {
182 return err;
183 }
184
185 switch (type) {
186 case QTI_VT_TIMESTAMP:
187 err = static_cast<Error>(android::gralloc4::decodeUint64(qtigralloc::MetadataType_VTTimestamp,
188 bytestream, (uint64_t *)param));
189 break;
190 case QTI_VIDEO_PERF_MODE:
191 err = static_cast<Error>(android::gralloc4::decodeUint32(
192 qtigralloc::MetadataType_VideoPerfMode, bytestream, (uint32_t *)param));
193 break;
194 case QTI_LINEAR_FORMAT:
195 err = static_cast<Error>(android::gralloc4::decodeUint32(
196 qtigralloc::MetadataType_LinearFormat, bytestream, (uint32_t *)param));
197 break;
198 case QTI_SINGLE_BUFFER_MODE:
199 err = static_cast<Error>(android::gralloc4::decodeUint32(
200 qtigralloc::MetadataType_SingleBufferMode, bytestream, (uint32_t *)param));
201 break;
202 case QTI_PP_PARAM_INTERLACED:
203 err = static_cast<Error>(android::gralloc4::decodeInt32(
204 qtigralloc::MetadataType_PPParamInterlaced, bytestream, (int32_t *)param));
205 break;
206 case QTI_MAP_SECURE_BUFFER:
207 err = static_cast<Error>(android::gralloc4::decodeInt32(
208 qtigralloc::MetadataType_MapSecureBuffer, bytestream, (int32_t *)param));
209 break;
210 case QTI_COLOR_METADATA:
211 err = decodeColorMetadata(bytestream, (ColorMetaData *)param);
212 break;
213 case QTI_GRAPHICS_METADATA:
214 err = decodeGraphicsMetadata(bytestream, (GraphicsMetadata *)param);
215 break;
216 case QTI_UBWC_CR_STATS_INFO:
217 err = decodeUBWCStats(bytestream, (UBWCStats *)param);
218 break;
219 case QTI_REFRESH_RATE:
220 err = static_cast<Error>(android::gralloc4::decodeFloat(qtigralloc::MetadataType_RefreshRate,
221 bytestream, (float *)param));
222 break;
223 case QTI_CVP_METADATA:
224 err = decodeCVPMetadata(bytestream, (CVPMetadata *)param);
225 break;
226 case QTI_VIDEO_HISTOGRAM_STATS:
227 err = decodeVideoHistogramMetadata(bytestream, (VideoHistogramMetadata *)param);
228 break;
229 case QTI_FD:
230 err = static_cast<Error>(android::gralloc4::decodeInt32(qtigralloc::MetadataType_FD,
231 bytestream, (int32_t *)param));
232 break;
233 case QTI_PRIVATE_FLAGS:
234 err = static_cast<Error>(android::gralloc4::decodeInt32(qtigralloc::MetadataType_PrivateFlags,
235 bytestream, (int32_t *)param));
236 break;
Tharaga Balachandranaa640f72020-03-10 13:52:04 -0400237 case QTI_ALIGNED_WIDTH_IN_PIXELS:
238 err = static_cast<Error>(android::gralloc4::decodeUint32(
239 qtigralloc::MetadataType_AlignedWidthInPixels, bytestream, (uint32_t *)param));
240 break;
241 case QTI_ALIGNED_HEIGHT_IN_PIXELS:
242 err = static_cast<Error>(android::gralloc4::decodeUint32(
243 qtigralloc::MetadataType_AlignedHeightInPixels, bytestream, (uint32_t *)param));
244 break;
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -0500245 default:
246 param = nullptr;
247 return Error::UNSUPPORTED;
248 }
249
250 return err;
251}
252
253Error set(void *buffer, uint32_t type, void *param) {
254 hidl_vec<uint8_t> bytestream;
255 sp<IMapper> mapper = getInstance();
256
257 Error err = Error::UNSUPPORTED;
258 MetadataType metadata_type = getMetadataType(type);
259 if (metadata_type == MetadataType_Invalid) {
260 return err;
261 }
262
263 switch (type) {
264 case QTI_VT_TIMESTAMP:
265 err = static_cast<Error>(android::gralloc4::encodeUint64(qtigralloc::MetadataType_VTTimestamp,
266 *(uint64_t *)param, &bytestream));
267 break;
268 case QTI_VIDEO_PERF_MODE:
269 err = static_cast<Error>(android::gralloc4::encodeUint32(
270 qtigralloc::MetadataType_VideoPerfMode, *(uint32_t *)param, &bytestream));
271 break;
272 case QTI_LINEAR_FORMAT:
273 err = static_cast<Error>(android::gralloc4::encodeUint32(
274 qtigralloc::MetadataType_LinearFormat, *(uint32_t *)param, &bytestream));
275 break;
276 case QTI_SINGLE_BUFFER_MODE:
277 err = static_cast<Error>(android::gralloc4::encodeUint32(
278 qtigralloc::MetadataType_SingleBufferMode, *(uint32_t *)param, &bytestream));
279 break;
280 case QTI_PP_PARAM_INTERLACED:
281 err = static_cast<Error>(android::gralloc4::encodeInt32(
282 qtigralloc::MetadataType_PPParamInterlaced, *(int32_t *)param, &bytestream));
283 break;
284 case QTI_MAP_SECURE_BUFFER:
285 err = static_cast<Error>(android::gralloc4::encodeInt32(
286 qtigralloc::MetadataType_MapSecureBuffer, *(int32_t *)param, &bytestream));
287 break;
288 case QTI_COLOR_METADATA:
289 err = encodeColorMetadata(*(ColorMetaData *)param, &bytestream);
290 break;
291 case QTI_GRAPHICS_METADATA:
292 err = encodeGraphicsMetadata(*(GraphicsMetadata *)param, &bytestream);
293 break;
294 case QTI_UBWC_CR_STATS_INFO:
295 err = encodeUBWCStats((UBWCStats *)param, &bytestream);
296 break;
297 case QTI_REFRESH_RATE:
298 err = static_cast<Error>(android::gralloc4::encodeFloat(qtigralloc::MetadataType_RefreshRate,
299 *(float *)param, &bytestream));
300 break;
301 case QTI_CVP_METADATA:
302 err = encodeCVPMetadata(*(CVPMetadata *)param, &bytestream);
303 break;
304 case QTI_VIDEO_HISTOGRAM_STATS:
305 err = encodeVideoHistogramMetadata(*(VideoHistogramMetadata *)param, &bytestream);
306 break;
307 default:
308 param = nullptr;
309 return Error::UNSUPPORTED;
310 }
311
312 if (err != Error::NONE) {
313 return err;
314 }
315
316 return mapper->set((void *)buffer, metadata_type, bytestream);
317}
318
319} // namespace qtigralloc