blob: 47be7dd1c6cf5ea6865c51607ac97748efa1efce [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;
155 default:
156 return MetadataType_Invalid;
157 }
158}
159
160Error get(void *buffer, uint32_t type, void *param) {
161 hidl_vec<uint8_t> bytestream;
162 sp<IMapper> mapper = getInstance();
163
164 MetadataType metadata_type = getMetadataType(type);
165 if (metadata_type == MetadataType_Invalid) {
166 param = nullptr;
167 return Error::UNSUPPORTED;
168 }
169
170 auto err = Error::UNSUPPORTED;
171 mapper->get(buffer, metadata_type, [&](const auto &tmpError, const auto &tmpByteStream) {
172 err = tmpError;
173 bytestream = tmpByteStream;
174 });
175
176 if (err != Error::NONE) {
177 return err;
178 }
179
180 switch (type) {
181 case QTI_VT_TIMESTAMP:
182 err = static_cast<Error>(android::gralloc4::decodeUint64(qtigralloc::MetadataType_VTTimestamp,
183 bytestream, (uint64_t *)param));
184 break;
185 case QTI_VIDEO_PERF_MODE:
186 err = static_cast<Error>(android::gralloc4::decodeUint32(
187 qtigralloc::MetadataType_VideoPerfMode, bytestream, (uint32_t *)param));
188 break;
189 case QTI_LINEAR_FORMAT:
190 err = static_cast<Error>(android::gralloc4::decodeUint32(
191 qtigralloc::MetadataType_LinearFormat, bytestream, (uint32_t *)param));
192 break;
193 case QTI_SINGLE_BUFFER_MODE:
194 err = static_cast<Error>(android::gralloc4::decodeUint32(
195 qtigralloc::MetadataType_SingleBufferMode, bytestream, (uint32_t *)param));
196 break;
197 case QTI_PP_PARAM_INTERLACED:
198 err = static_cast<Error>(android::gralloc4::decodeInt32(
199 qtigralloc::MetadataType_PPParamInterlaced, bytestream, (int32_t *)param));
200 break;
201 case QTI_MAP_SECURE_BUFFER:
202 err = static_cast<Error>(android::gralloc4::decodeInt32(
203 qtigralloc::MetadataType_MapSecureBuffer, bytestream, (int32_t *)param));
204 break;
205 case QTI_COLOR_METADATA:
206 err = decodeColorMetadata(bytestream, (ColorMetaData *)param);
207 break;
208 case QTI_GRAPHICS_METADATA:
209 err = decodeGraphicsMetadata(bytestream, (GraphicsMetadata *)param);
210 break;
211 case QTI_UBWC_CR_STATS_INFO:
212 err = decodeUBWCStats(bytestream, (UBWCStats *)param);
213 break;
214 case QTI_REFRESH_RATE:
215 err = static_cast<Error>(android::gralloc4::decodeFloat(qtigralloc::MetadataType_RefreshRate,
216 bytestream, (float *)param));
217 break;
218 case QTI_CVP_METADATA:
219 err = decodeCVPMetadata(bytestream, (CVPMetadata *)param);
220 break;
221 case QTI_VIDEO_HISTOGRAM_STATS:
222 err = decodeVideoHistogramMetadata(bytestream, (VideoHistogramMetadata *)param);
223 break;
224 case QTI_FD:
225 err = static_cast<Error>(android::gralloc4::decodeInt32(qtigralloc::MetadataType_FD,
226 bytestream, (int32_t *)param));
227 break;
228 case QTI_PRIVATE_FLAGS:
229 err = static_cast<Error>(android::gralloc4::decodeInt32(qtigralloc::MetadataType_PrivateFlags,
230 bytestream, (int32_t *)param));
231 break;
232 default:
233 param = nullptr;
234 return Error::UNSUPPORTED;
235 }
236
237 return err;
238}
239
240Error set(void *buffer, uint32_t type, void *param) {
241 hidl_vec<uint8_t> bytestream;
242 sp<IMapper> mapper = getInstance();
243
244 Error err = Error::UNSUPPORTED;
245 MetadataType metadata_type = getMetadataType(type);
246 if (metadata_type == MetadataType_Invalid) {
247 return err;
248 }
249
250 switch (type) {
251 case QTI_VT_TIMESTAMP:
252 err = static_cast<Error>(android::gralloc4::encodeUint64(qtigralloc::MetadataType_VTTimestamp,
253 *(uint64_t *)param, &bytestream));
254 break;
255 case QTI_VIDEO_PERF_MODE:
256 err = static_cast<Error>(android::gralloc4::encodeUint32(
257 qtigralloc::MetadataType_VideoPerfMode, *(uint32_t *)param, &bytestream));
258 break;
259 case QTI_LINEAR_FORMAT:
260 err = static_cast<Error>(android::gralloc4::encodeUint32(
261 qtigralloc::MetadataType_LinearFormat, *(uint32_t *)param, &bytestream));
262 break;
263 case QTI_SINGLE_BUFFER_MODE:
264 err = static_cast<Error>(android::gralloc4::encodeUint32(
265 qtigralloc::MetadataType_SingleBufferMode, *(uint32_t *)param, &bytestream));
266 break;
267 case QTI_PP_PARAM_INTERLACED:
268 err = static_cast<Error>(android::gralloc4::encodeInt32(
269 qtigralloc::MetadataType_PPParamInterlaced, *(int32_t *)param, &bytestream));
270 break;
271 case QTI_MAP_SECURE_BUFFER:
272 err = static_cast<Error>(android::gralloc4::encodeInt32(
273 qtigralloc::MetadataType_MapSecureBuffer, *(int32_t *)param, &bytestream));
274 break;
275 case QTI_COLOR_METADATA:
276 err = encodeColorMetadata(*(ColorMetaData *)param, &bytestream);
277 break;
278 case QTI_GRAPHICS_METADATA:
279 err = encodeGraphicsMetadata(*(GraphicsMetadata *)param, &bytestream);
280 break;
281 case QTI_UBWC_CR_STATS_INFO:
282 err = encodeUBWCStats((UBWCStats *)param, &bytestream);
283 break;
284 case QTI_REFRESH_RATE:
285 err = static_cast<Error>(android::gralloc4::encodeFloat(qtigralloc::MetadataType_RefreshRate,
286 *(float *)param, &bytestream));
287 break;
288 case QTI_CVP_METADATA:
289 err = encodeCVPMetadata(*(CVPMetadata *)param, &bytestream);
290 break;
291 case QTI_VIDEO_HISTOGRAM_STATS:
292 err = encodeVideoHistogramMetadata(*(VideoHistogramMetadata *)param, &bytestream);
293 break;
294 default:
295 param = nullptr;
296 return Error::UNSUPPORTED;
297 }
298
299 if (err != Error::NONE) {
300 return err;
301 }
302
303 return mapper->set((void *)buffer, metadata_type, bytestream);
304}
305
306} // namespace qtigralloc