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