blob: 348e097ad21fa2740a7a2d1a5a0e135526956919 [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
Shrikara B21c0d722020-08-27 18:23:10 +0530167Error decodeVideoTimestampInfo(hidl_vec<uint8_t> &in, VideoTimestampInfo *out) {
168 if (!in.size() || !out) {
169 return Error::BAD_VALUE;
170 }
171 memcpy(out, in.data(), sizeof(VideoTimestampInfo));
172 return Error::NONE;
173}
174
175Error encodeVideoTimestampInfo(VideoTimestampInfo &in, hidl_vec<uint8_t> *out) {
176 if (!out) {
177 return Error::BAD_VALUE;
178 }
179 out->resize(sizeof(VideoTimestampInfo));
180 memcpy(out->data(), &in, sizeof(VideoTimestampInfo));
181 return Error::NONE;
182}
183
Zube Molokwu10c74ab2020-11-06 15:41:40 -0800184Error decodeYUVPlaneInfoMetadata(hidl_vec<uint8_t> &in, qti_ycbcr *out) {
185 if (!in.size() || !out) {
186 return Error::BAD_VALUE;
187 }
188 qti_ycbcr *p = reinterpret_cast<qti_ycbcr *>(in.data());
189 memcpy(out, in.data(), (YCBCR_LAYOUT_ARRAY_SIZE * sizeof(qti_ycbcr)));
190 return Error::NONE;
191}
192
193Error encodeYUVPlaneInfoMetadata(qti_ycbcr *in, hidl_vec<uint8_t> *out) {
194 if (!out) {
195 return Error::BAD_VALUE;
196 }
197 out->resize(YCBCR_LAYOUT_ARRAY_SIZE * sizeof(qti_ycbcr));
198 memcpy(out->data(), in, YCBCR_LAYOUT_ARRAY_SIZE * sizeof(qti_ycbcr));
199 return Error::NONE;
200}
201
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -0500202MetadataType getMetadataType(uint32_t in) {
203 switch (in) {
204 case QTI_VT_TIMESTAMP:
205 return MetadataType_VTTimestamp;
206 case QTI_VIDEO_PERF_MODE:
207 return MetadataType_VideoPerfMode;
208 case QTI_LINEAR_FORMAT:
209 return MetadataType_LinearFormat;
210 case QTI_SINGLE_BUFFER_MODE:
211 return MetadataType_SingleBufferMode;
212 case QTI_PP_PARAM_INTERLACED:
213 return MetadataType_PPParamInterlaced;
214 case QTI_MAP_SECURE_BUFFER:
215 return MetadataType_MapSecureBuffer;
216 case QTI_COLOR_METADATA:
217 return MetadataType_ColorMetadata;
218 case QTI_GRAPHICS_METADATA:
219 return MetadataType_GraphicsMetadata;
220 case QTI_UBWC_CR_STATS_INFO:
221 return MetadataType_UBWCCRStatsInfo;
222 case QTI_REFRESH_RATE:
223 return MetadataType_RefreshRate;
224 case QTI_CVP_METADATA:
225 return MetadataType_CVPMetadata;
226 case QTI_VIDEO_HISTOGRAM_STATS:
227 return MetadataType_VideoHistogramStats;
Shrikara B21c0d722020-08-27 18:23:10 +0530228 case QTI_VIDEO_TS_INFO:
229 return MetadataType_VideoTimestampInfo;
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -0500230 case QTI_FD:
231 return MetadataType_FD;
232 case QTI_PRIVATE_FLAGS:
233 return MetadataType_PrivateFlags;
Tharaga Balachandranaa640f72020-03-10 13:52:04 -0400234 case QTI_ALIGNED_WIDTH_IN_PIXELS:
235 return MetadataType_AlignedWidthInPixels;
236 case QTI_ALIGNED_HEIGHT_IN_PIXELS:
237 return MetadataType_AlignedHeightInPixels;
Tharaga Balachandran39810462020-06-16 09:34:34 -0400238 case QTI_STANDARD_METADATA_STATUS:
239 return MetadataType_StandardMetadataStatus;
240 case QTI_VENDOR_METADATA_STATUS:
241 return MetadataType_VendorMetadataStatus;
Tharaga Balachandranbcd39b92020-04-22 16:40:30 -0400242 case QTI_BUFFER_TYPE:
243 return MetadataType_BufferType;
Zube Molokwu10c74ab2020-11-06 15:41:40 -0800244 case QTI_CUSTOM_DIMENSIONS_STRIDE:
245 return MetadataType_CustomDimensionsStride;
246 case QTI_CUSTOM_DIMENSIONS_HEIGHT:
247 return MetadataType_CustomDimensionsHeight;
248 case QTI_RGB_DATA_ADDRESS:
249 return MetadataType_RgbDataAddress;
250 case QTI_COLORSPACE:
251 return MetadataType_ColorSpace;
252 case QTI_YUV_PLANE_INFO:
253 return MetadataType_YuvPlaneInfo;
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -0500254 default:
255 return MetadataType_Invalid;
256 }
257}
258
259Error get(void *buffer, uint32_t type, void *param) {
260 hidl_vec<uint8_t> bytestream;
261 sp<IMapper> mapper = getInstance();
262
263 MetadataType metadata_type = getMetadataType(type);
264 if (metadata_type == MetadataType_Invalid) {
265 param = nullptr;
266 return Error::UNSUPPORTED;
267 }
268
269 auto err = Error::UNSUPPORTED;
270 mapper->get(buffer, metadata_type, [&](const auto &tmpError, const auto &tmpByteStream) {
271 err = tmpError;
272 bytestream = tmpByteStream;
273 });
274
275 if (err != Error::NONE) {
276 return err;
277 }
278
279 switch (type) {
280 case QTI_VT_TIMESTAMP:
281 err = static_cast<Error>(android::gralloc4::decodeUint64(qtigralloc::MetadataType_VTTimestamp,
282 bytestream, (uint64_t *)param));
283 break;
284 case QTI_VIDEO_PERF_MODE:
285 err = static_cast<Error>(android::gralloc4::decodeUint32(
286 qtigralloc::MetadataType_VideoPerfMode, bytestream, (uint32_t *)param));
287 break;
288 case QTI_LINEAR_FORMAT:
289 err = static_cast<Error>(android::gralloc4::decodeUint32(
290 qtigralloc::MetadataType_LinearFormat, bytestream, (uint32_t *)param));
291 break;
292 case QTI_SINGLE_BUFFER_MODE:
293 err = static_cast<Error>(android::gralloc4::decodeUint32(
294 qtigralloc::MetadataType_SingleBufferMode, bytestream, (uint32_t *)param));
295 break;
296 case QTI_PP_PARAM_INTERLACED:
297 err = static_cast<Error>(android::gralloc4::decodeInt32(
298 qtigralloc::MetadataType_PPParamInterlaced, bytestream, (int32_t *)param));
299 break;
300 case QTI_MAP_SECURE_BUFFER:
301 err = static_cast<Error>(android::gralloc4::decodeInt32(
302 qtigralloc::MetadataType_MapSecureBuffer, bytestream, (int32_t *)param));
303 break;
304 case QTI_COLOR_METADATA:
305 err = decodeColorMetadata(bytestream, (ColorMetaData *)param);
306 break;
307 case QTI_GRAPHICS_METADATA:
Ravi Ranjanc74a80e2020-05-04 09:40:39 +0530308 err = decodeGraphicsMetadataRaw(bytestream, param);
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -0500309 break;
310 case QTI_UBWC_CR_STATS_INFO:
311 err = decodeUBWCStats(bytestream, (UBWCStats *)param);
312 break;
313 case QTI_REFRESH_RATE:
314 err = static_cast<Error>(android::gralloc4::decodeFloat(qtigralloc::MetadataType_RefreshRate,
315 bytestream, (float *)param));
316 break;
317 case QTI_CVP_METADATA:
318 err = decodeCVPMetadata(bytestream, (CVPMetadata *)param);
319 break;
320 case QTI_VIDEO_HISTOGRAM_STATS:
321 err = decodeVideoHistogramMetadata(bytestream, (VideoHistogramMetadata *)param);
322 break;
Shrikara B21c0d722020-08-27 18:23:10 +0530323 case QTI_VIDEO_TS_INFO:
324 err = decodeVideoTimestampInfo(bytestream, (VideoTimestampInfo *)param);
325 break;
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -0500326 case QTI_FD:
327 err = static_cast<Error>(android::gralloc4::decodeInt32(qtigralloc::MetadataType_FD,
328 bytestream, (int32_t *)param));
329 break;
330 case QTI_PRIVATE_FLAGS:
331 err = static_cast<Error>(android::gralloc4::decodeInt32(qtigralloc::MetadataType_PrivateFlags,
332 bytestream, (int32_t *)param));
333 break;
Tharaga Balachandranaa640f72020-03-10 13:52:04 -0400334 case QTI_ALIGNED_WIDTH_IN_PIXELS:
335 err = static_cast<Error>(android::gralloc4::decodeUint32(
336 qtigralloc::MetadataType_AlignedWidthInPixels, bytestream, (uint32_t *)param));
337 break;
338 case QTI_ALIGNED_HEIGHT_IN_PIXELS:
339 err = static_cast<Error>(android::gralloc4::decodeUint32(
340 qtigralloc::MetadataType_AlignedHeightInPixels, bytestream, (uint32_t *)param));
341 break;
Tharaga Balachandran39810462020-06-16 09:34:34 -0400342 case QTI_STANDARD_METADATA_STATUS:
343 case QTI_VENDOR_METADATA_STATUS:
344 err = decodeMetadataState(bytestream, (bool *)param);
345 break;
Tharaga Balachandranbcd39b92020-04-22 16:40:30 -0400346 case QTI_BUFFER_TYPE:
347 err = static_cast<Error>(android::gralloc4::decodeUint32(
348 qtigralloc::MetadataType_BufferType, bytestream, (uint32_t *)param));
349 break;
Zube Molokwu10c74ab2020-11-06 15:41:40 -0800350 case QTI_CUSTOM_DIMENSIONS_STRIDE:
351 err = static_cast<Error>(android::gralloc4::decodeUint32(
352 qtigralloc::MetadataType_CustomDimensionsStride, bytestream, (uint32_t *)param));
353 break;
354 case QTI_CUSTOM_DIMENSIONS_HEIGHT:
355 err = static_cast<Error>(android::gralloc4::decodeUint32(
356 qtigralloc::MetadataType_CustomDimensionsHeight, bytestream, (uint32_t *)param));
357 break;
358 case QTI_RGB_DATA_ADDRESS:
359 err = static_cast<Error>(android::gralloc4::decodeUint64(
360 qtigralloc::MetadataType_RgbDataAddress, bytestream, (uint64_t *)param));
361 break;
362 case QTI_COLORSPACE:
363 err = static_cast<Error>(android::gralloc4::decodeUint32(qtigralloc::MetadataType_ColorSpace,
364 bytestream, (uint32_t *)param));
365 break;
366 case QTI_YUV_PLANE_INFO:
367 err = decodeYUVPlaneInfoMetadata(bytestream, (qti_ycbcr *)param);
368 break;
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -0500369 default:
370 param = nullptr;
371 return Error::UNSUPPORTED;
372 }
373
374 return err;
375}
376
377Error set(void *buffer, uint32_t type, void *param) {
378 hidl_vec<uint8_t> bytestream;
379 sp<IMapper> mapper = getInstance();
380
381 Error err = Error::UNSUPPORTED;
382 MetadataType metadata_type = getMetadataType(type);
383 if (metadata_type == MetadataType_Invalid) {
384 return err;
385 }
386
387 switch (type) {
388 case QTI_VT_TIMESTAMP:
389 err = static_cast<Error>(android::gralloc4::encodeUint64(qtigralloc::MetadataType_VTTimestamp,
390 *(uint64_t *)param, &bytestream));
391 break;
392 case QTI_VIDEO_PERF_MODE:
393 err = static_cast<Error>(android::gralloc4::encodeUint32(
394 qtigralloc::MetadataType_VideoPerfMode, *(uint32_t *)param, &bytestream));
395 break;
396 case QTI_LINEAR_FORMAT:
397 err = static_cast<Error>(android::gralloc4::encodeUint32(
398 qtigralloc::MetadataType_LinearFormat, *(uint32_t *)param, &bytestream));
399 break;
400 case QTI_SINGLE_BUFFER_MODE:
401 err = static_cast<Error>(android::gralloc4::encodeUint32(
402 qtigralloc::MetadataType_SingleBufferMode, *(uint32_t *)param, &bytestream));
403 break;
404 case QTI_PP_PARAM_INTERLACED:
405 err = static_cast<Error>(android::gralloc4::encodeInt32(
406 qtigralloc::MetadataType_PPParamInterlaced, *(int32_t *)param, &bytestream));
407 break;
408 case QTI_MAP_SECURE_BUFFER:
409 err = static_cast<Error>(android::gralloc4::encodeInt32(
410 qtigralloc::MetadataType_MapSecureBuffer, *(int32_t *)param, &bytestream));
411 break;
412 case QTI_COLOR_METADATA:
413 err = encodeColorMetadata(*(ColorMetaData *)param, &bytestream);
414 break;
415 case QTI_GRAPHICS_METADATA:
Ravi Ranjanc74a80e2020-05-04 09:40:39 +0530416 err = encodeGraphicsMetadataRaw(param, &bytestream);
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -0500417 break;
418 case QTI_UBWC_CR_STATS_INFO:
419 err = encodeUBWCStats((UBWCStats *)param, &bytestream);
420 break;
421 case QTI_REFRESH_RATE:
422 err = static_cast<Error>(android::gralloc4::encodeFloat(qtigralloc::MetadataType_RefreshRate,
423 *(float *)param, &bytestream));
424 break;
425 case QTI_CVP_METADATA:
426 err = encodeCVPMetadata(*(CVPMetadata *)param, &bytestream);
427 break;
428 case QTI_VIDEO_HISTOGRAM_STATS:
429 err = encodeVideoHistogramMetadata(*(VideoHistogramMetadata *)param, &bytestream);
430 break;
Shrikara B21c0d722020-08-27 18:23:10 +0530431 case QTI_VIDEO_TS_INFO:
432 err = encodeVideoTimestampInfo(*(VideoTimestampInfo *)param, &bytestream);
433 break;
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -0500434 default:
435 param = nullptr;
436 return Error::UNSUPPORTED;
437 }
438
439 if (err != Error::NONE) {
440 return err;
441 }
442
443 return mapper->set((void *)buffer, metadata_type, bytestream);
444}
445
Tharaga Balachandran39810462020-06-16 09:34:34 -0400446int getMetadataState(void *buffer, uint32_t type) {
447 bool metadata_set[METADATA_SET_SIZE];
448 Error err;
449 if (IS_VENDOR_METADATA_TYPE(type)) {
450 err = get(buffer, QTI_VENDOR_METADATA_STATUS, &metadata_set);
451 } else {
452 err = get(buffer, QTI_STANDARD_METADATA_STATUS, &metadata_set);
453 }
454
455 if (err != Error::NONE) {
456 ALOGE("Unable to get metadata state");
457 return -1;
458 }
459
460 if (IS_VENDOR_METADATA_TYPE(type)) {
461 return metadata_set[GET_VENDOR_METADATA_STATUS_INDEX(type)];
Venkat Thogaru6b511cd2020-07-27 23:22:25 +0530462 } else if (GET_STANDARD_METADATA_STATUS_INDEX(type) < METADATA_SET_SIZE) {
Tharaga Balachandran39810462020-06-16 09:34:34 -0400463 return metadata_set[GET_STANDARD_METADATA_STATUS_INDEX(type)];
Venkat Thogaru6b511cd2020-07-27 23:22:25 +0530464 } else {
465 return -1;
Tharaga Balachandran39810462020-06-16 09:34:34 -0400466 }
467}
468
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -0500469} // namespace qtigralloc