blob: 5ee62d8b1568a7ff3b270d2553c10971fbe545ed [file] [log] [blame]
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -08001/*
Tharaga Balachandrana6480a42020-01-20 13:58:43 -05002 * Copyright (c) 2012-2020, The Linux Foundation. All rights reserved.
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -08003 *
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
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -050030#include "qdMetaData.h"
31
32#include <QtiGrallocPriv.h>
Ray Zhang566adac2014-04-14 15:32:04 +080033#include <errno.h>
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -050034#include <gralloc_priv.h>
35#include <log/log.h>
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -080036#include <string.h>
37#include <sys/mman.h>
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -050038
Naseer Ahmed08c3e402017-03-16 15:51:54 -040039#include <cinttypes>
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -080040
Tharaga Balachandrana6480a42020-01-20 13:58:43 -050041static int colorMetaDataToColorSpace(ColorMetaData in, ColorSpace_t *out) {
42 if (in.colorPrimaries == ColorPrimaries_BT601_6_525 ||
43 in.colorPrimaries == ColorPrimaries_BT601_6_625) {
44 if (in.range == Range_Full) {
45 *out = ITU_R_601_FR;
46 } else {
47 *out = ITU_R_601;
48 }
49 } else if (in.colorPrimaries == ColorPrimaries_BT2020) {
50 if (in.range == Range_Full) {
51 *out = ITU_R_2020_FR;
52 } else {
53 *out = ITU_R_2020;
54 }
55 } else if (in.colorPrimaries == ColorPrimaries_BT709_5) {
56 *out = ITU_R_709;
57 } else {
58 ALOGE("Cannot convert ColorMetaData to ColorSpace_t");
59 return -1;
60 }
61
62 return 0;
63}
64
65static int colorSpaceToColorMetadata(ColorSpace_t in, ColorMetaData *out) {
66 out->transfer = Transfer_sRGB;
67 switch (in) {
68 case ITU_R_601:
69 out->colorPrimaries = ColorPrimaries_BT601_6_525;
70 out->range = Range_Limited;
71 break;
72 case ITU_R_601_FR:
73 out->colorPrimaries = ColorPrimaries_BT601_6_525;
74 out->range = Range_Full;
75 break;
76 case ITU_R_709:
77 out->colorPrimaries = ColorPrimaries_BT709_5;
78 out->range = Range_Limited;
79 break;
80 case ITU_R_2020:
81 out->colorPrimaries = ColorPrimaries_BT2020;
82 out->range = Range_Limited;
83 break;
84 case ITU_R_2020_FR:
85 out->colorPrimaries = ColorPrimaries_BT2020;
86 out->range = Range_Full;
87 break;
88 default:
89 ALOGE("Cannot convert ColorSpace_t to ColorMetaData");
90 return -1;
91 break;
92 }
93
94 return 0;
95}
Naseer Ahmed2e6bee12017-04-13 22:45:54 -040096unsigned long getMetaDataSize() {
97 return static_cast<unsigned long>(ROUND_UP_PAGESIZE(sizeof(MetaData_t)));
98}
99
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400100static int validateAndMap(private_handle_t* handle) {
Prabhanjan Kandula1ef8e6e2016-08-19 11:46:47 +0530101 if (private_handle_t::validate(handle)) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400102 ALOGE("%s: Private handle is invalid - handle:%p", __func__, handle);
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -0800103 return -1;
104 }
Naseer Ahmed7aff2612017-10-05 20:39:05 -0400105 if (handle->fd_metadata < 0) {
106 // Silently return, metadata cannot be used
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -0800107 return -1;
108 }
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400109
110 if (!handle->base_metadata) {
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400111 auto size = getMetaDataSize();
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400112 void *base = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED,
113 handle->fd_metadata, 0);
114 if (base == reinterpret_cast<void*>(MAP_FAILED)) {
115 ALOGE("%s: metadata mmap failed - handle:%p fd: %d err: %s",
116 __func__, handle, handle->fd_metadata, strerror(errno));
117
118 return -1;
119 }
120 handle->base_metadata = (uintptr_t) base;
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -0800121 }
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400122 return 0;
123}
124
Praveen Chavan5e5679a2018-11-18 11:14:19 -0800125static void unmapAndReset(private_handle_t *handle) {
126 if (private_handle_t::validate(handle) == 0 && handle->base_metadata) {
127 munmap(reinterpret_cast<void *>(handle->base_metadata), getMetaDataSize());
128 handle->base_metadata = 0;
129 }
130}
131
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400132int setMetaData(private_handle_t *handle, DispParamType paramType,
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400133 void *param) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400134 auto err = validateAndMap(handle);
135 if (err != 0)
136 return err;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400137 return setMetaDataVa(reinterpret_cast<MetaData_t*>(handle->base_metadata),
138 paramType, param);
139}
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400140
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400141int setMetaDataVa(MetaData_t *data, DispParamType paramType,
142 void *param) {
143 if (data == nullptr)
144 return -EINVAL;
Prabhanjan Kandula1ef8e6e2016-08-19 11:46:47 +0530145 // If parameter is NULL reset the specific MetaData Key
146 if (!param) {
147 data->operation &= ~paramType;
Mahesh Lankada067392020-04-07 19:23:46 +0530148 switch (paramType) {
149 case SET_VIDEO_PERF_MODE:
150 data->isVideoPerfMode = 0;
151 break;
152 case SET_CVP_METADATA:
153 data->cvpMetadata.size = 0;
154 break;
155 case SET_VIDEO_HISTOGRAM_STATS:
156 data->video_histogram_stats.stat_len = 0;
157 break;
158 default:
159 ALOGE("Unknown paramType %d", paramType);
160 break;
161 }
Naseer Ahmed8d1434a2017-03-31 15:31:18 -0400162 // param unset
163 return 0;
Prabhanjan Kandula1ef8e6e2016-08-19 11:46:47 +0530164 }
165
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -0800166 data->operation |= paramType;
167 switch (paramType) {
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -0800168 case PP_PARAM_INTERLACED:
169 data->interlaced = *((int32_t *)param);
170 break;
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -0500171 case UPDATE_BUFFER_GEOMETRY: {
172 BufferDim_t in = *((BufferDim_t *)param);
173 data->crop = {0, 0, in.sliceWidth, in.sliceHeight};
174 break;
175 }
Arun Kumar K.Ra727a882014-08-20 17:14:26 -0700176 case UPDATE_REFRESH_RATE:
feifanz9cc23032016-03-23 18:48:56 +0800177 data->refreshrate = *((float *)param);
Arun Kumar K.Ra727a882014-08-20 17:14:26 -0700178 break;
Tharaga Balachandrana6480a42020-01-20 13:58:43 -0500179 case UPDATE_COLOR_SPACE: {
180 ColorMetaData color;
181 if (!colorSpaceToColorMetadata(*((ColorSpace_t *)param), &color)) {
182 data->color = color;
183 }
184 break;
185 }
Arun Kumar K.Rda2f69b2014-09-30 15:45:37 -0700186 case MAP_SECURE_BUFFER:
187 data->mapSecureBuffer = *((int32_t *)param);
188 break;
Naseer Ahmed3324ff72015-01-21 17:14:44 -0500189 case S3D_FORMAT:
190 data->s3dFormat = *((uint32_t *)param);
191 break;
Sushil Chauhane7acc3c2015-06-23 16:22:30 -0700192 case LINEAR_FORMAT:
193 data->linearFormat = *((uint32_t *)param);
194 break;
Saurabh Shah95f83682015-10-16 10:30:04 -0700195 case SET_SINGLE_BUFFER_MODE:
Saurabh Shahb8067a42015-11-06 16:52:02 -0800196 data->isSingleBufferMode = *((uint32_t *)param);
Saurabh Shah95f83682015-10-16 10:30:04 -0700197 break;
Naseer Ahmede8f254d2016-08-02 20:06:40 -0400198 case SET_VT_TIMESTAMP:
199 data->vtTimeStamp = *((uint64_t *)param);
200 break;
Arun Kumar K.Rb2771bf2016-10-03 21:38:23 -0700201 case COLOR_METADATA:
202 data->color = *((ColorMetaData *)param);
Arun Kumar K.Rb2771bf2016-10-03 21:38:23 -0700203 break;
Gurunath Ramaswamyb494c022017-07-04 13:47:46 -0700204 case SET_UBWC_CR_STATS_INFO: {
205 struct UBWCStats* stats = (struct UBWCStats*)param;
206 int numelems = sizeof(data->ubwcCRStats) / sizeof(struct UBWCStats);
207 for (int i = 0; i < numelems; i++) {
208 data->ubwcCRStats[i] = stats[i];
209 }
210 break;
211 }
Ashwini Rao6e616962017-11-28 12:12:46 -0800212 case SET_VIDEO_PERF_MODE:
213 data->isVideoPerfMode = *((uint32_t *)param);
214 break;
Mohan Pallaka5d814432018-08-01 10:40:13 -0700215 case SET_GRAPHICS_METADATA: {
216 GraphicsMetadata payload = *((GraphicsMetadata*)(param));
217 data->graphics_metadata.size = payload.size;
218 memcpy(data->graphics_metadata.data, payload.data,
219 sizeof(data->graphics_metadata.data));
220 break;
221 }
Maheshwar Ajja10690722019-01-30 14:12:45 -0800222 case SET_CVP_METADATA: {
223 struct CVPMetadata *cvpMetadata = (struct CVPMetadata *)param;
Maheshwar Ajja0de87d72019-03-11 11:44:30 -0700224 if (cvpMetadata->size <= CVP_METADATA_SIZE) {
Maheshwar Ajja10690722019-01-30 14:12:45 -0800225 data->cvpMetadata.size = cvpMetadata->size;
226 memcpy(data->cvpMetadata.payload, cvpMetadata->payload,
227 cvpMetadata->size);
Akshata Sahukaraab1e562019-07-30 13:57:25 -0700228 data->cvpMetadata.capture_frame_rate = cvpMetadata->capture_frame_rate;
229 data->cvpMetadata.cvp_frame_rate = cvpMetadata->cvp_frame_rate;
Akshata Sahukar8a8657c2019-10-04 20:29:25 -0700230 data->cvpMetadata.flags = cvpMetadata->flags;
231 memcpy(data->cvpMetadata.reserved, cvpMetadata->reserved,
232 (8 * sizeof(uint32_t)));
Maheshwar Ajja10690722019-01-30 14:12:45 -0800233 } else {
234 data->operation &= ~(paramType);
235 ALOGE("%s: cvp metadata length %d is more than max size %d",
236 __func__, cvpMetadata->size, CVP_METADATA_SIZE);
237 return -EINVAL;
238 }
239 break;
240 }
Mihir Ganu3d401542019-04-03 11:08:06 -0700241 case SET_VIDEO_HISTOGRAM_STATS: {
242 struct VideoHistogramMetadata *vidstats = (struct VideoHistogramMetadata *)param;
243 if (vidstats->stat_len <= VIDEO_HISTOGRAM_STATS_SIZE) {
244 memcpy(data->video_histogram_stats.stats_info,
245 vidstats->stats_info, VIDEO_HISTOGRAM_STATS_SIZE);
246 data->video_histogram_stats.stat_len = vidstats->stat_len;
247 data->video_histogram_stats.frame_type = vidstats->frame_type;
248 data->video_histogram_stats.display_width = vidstats->display_width;
249 data->video_histogram_stats.display_height = vidstats->display_height;
250 data->video_histogram_stats.decode_width = vidstats->decode_width;
251 data->video_histogram_stats.decode_height = vidstats->decode_height;
252 } else {
253 data->operation &= ~(paramType);
254 ALOGE("%s: video stats length %u is more than max size %u",
255 __func__, vidstats->stat_len, VIDEO_HISTOGRAM_STATS_SIZE);
256 return -EINVAL;
257 }
258 break;
259 }
260 default:
Ray Zhang8ace84d2016-08-08 19:36:03 +0800261 ALOGE("Unknown paramType %d", paramType);
262 break;
263 }
Ray Zhang8ace84d2016-08-08 19:36:03 +0800264 return 0;
265}
266
267int clearMetaData(private_handle_t *handle, DispParamType paramType) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400268 auto err = validateAndMap(handle);
269 if (err != 0)
270 return err;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400271 return clearMetaDataVa(reinterpret_cast<MetaData_t *>(handle->base_metadata),
272 paramType);
273}
Ray Zhang8ace84d2016-08-08 19:36:03 +0800274
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400275int clearMetaDataVa(MetaData_t *data, DispParamType paramType) {
276 if (data == nullptr)
277 return -EINVAL;
Ray Zhang8ace84d2016-08-08 19:36:03 +0800278 data->operation &= ~paramType;
279 switch (paramType) {
Priyanka Gujjula1db74712018-11-27 17:38:26 +0530280 case SET_VIDEO_PERF_MODE:
281 data->isVideoPerfMode = 0;
282 break;
Maheshwar Ajja10690722019-01-30 14:12:45 -0800283 case SET_CVP_METADATA:
284 data->cvpMetadata.size = 0;
285 break;
Mihir Ganu3d401542019-04-03 11:08:06 -0700286 case SET_VIDEO_HISTOGRAM_STATS:
287 data->video_histogram_stats.stat_len = 0;
288 break;
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -0800289 default:
290 ALOGE("Unknown paramType %d", paramType);
291 break;
292 }
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -0800293 return 0;
294}
feifanz9cc23032016-03-23 18:48:56 +0800295
296int getMetaData(private_handle_t *handle, DispFetchParamType paramType,
297 void *param) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400298 int ret = validateAndMap(handle);
299 if (ret != 0)
300 return ret;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400301 return getMetaDataVa(reinterpret_cast<MetaData_t *>(handle->base_metadata),
302 paramType, param);
303}
304
305int getMetaDataVa(MetaData_t *data, DispFetchParamType paramType,
306 void *param) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400307 // Make sure we send 0 only if the operation queried is present
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400308 int ret = -EINVAL;
309 if (data == nullptr)
310 return ret;
Gurunath Ramaswamyb494c022017-07-04 13:47:46 -0700311 if (param == nullptr)
312 return ret;
feifanz9cc23032016-03-23 18:48:56 +0800313
feifanz9cc23032016-03-23 18:48:56 +0800314 switch (paramType) {
315 case GET_PP_PARAM_INTERLACED:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800316 if (data->operation & PP_PARAM_INTERLACED) {
317 *((int32_t *)param) = data->interlaced;
318 ret = 0;
319 }
feifanz9cc23032016-03-23 18:48:56 +0800320 break;
321 case GET_BUFFER_GEOMETRY:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800322 if (data->operation & UPDATE_BUFFER_GEOMETRY) {
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -0500323 *((BufferDim_t *)param) = {data->crop.right, data->crop.bottom};
324 ret = 0;
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800325 }
feifanz9cc23032016-03-23 18:48:56 +0800326 break;
327 case GET_REFRESH_RATE:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800328 if (data->operation & UPDATE_REFRESH_RATE) {
329 *((float *)param) = data->refreshrate;
330 ret = 0;
331 }
feifanz9cc23032016-03-23 18:48:56 +0800332 break;
333 case GET_COLOR_SPACE:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800334 if (data->operation & UPDATE_COLOR_SPACE) {
Tharaga Balachandrana6480a42020-01-20 13:58:43 -0500335 ColorSpace_t color_space;
336 if (!colorMetaDataToColorSpace(data->color, &color_space)) {
337 *((ColorSpace_t *)param) = color_space;
338 }
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800339 ret = 0;
340 }
feifanz9cc23032016-03-23 18:48:56 +0800341 break;
342 case GET_MAP_SECURE_BUFFER:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800343 if (data->operation & MAP_SECURE_BUFFER) {
344 *((int32_t *)param) = data->mapSecureBuffer;
345 ret = 0;
346 }
feifanz9cc23032016-03-23 18:48:56 +0800347 break;
348 case GET_S3D_FORMAT:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800349 if (data->operation & S3D_FORMAT) {
350 *((uint32_t *)param) = data->s3dFormat;
351 ret = 0;
352 }
feifanz9cc23032016-03-23 18:48:56 +0800353 break;
354 case GET_LINEAR_FORMAT:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800355 if (data->operation & LINEAR_FORMAT) {
356 *((uint32_t *)param) = data->linearFormat;
357 ret = 0;
358 }
feifanz9cc23032016-03-23 18:48:56 +0800359 break;
feifanz9cc23032016-03-23 18:48:56 +0800360 case GET_SINGLE_BUFFER_MODE:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800361 if (data->operation & SET_SINGLE_BUFFER_MODE) {
362 *((uint32_t *)param) = data->isSingleBufferMode;
363 ret = 0;
364 }
feifanz9cc23032016-03-23 18:48:56 +0800365 break;
Naseer Ahmede8f254d2016-08-02 20:06:40 -0400366 case GET_VT_TIMESTAMP:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800367 if (data->operation & SET_VT_TIMESTAMP) {
368 *((uint64_t *)param) = data->vtTimeStamp;
369 ret = 0;
370 }
Naseer Ahmede8f254d2016-08-02 20:06:40 -0400371 break;
Arun Kumar K.Rb2771bf2016-10-03 21:38:23 -0700372 case GET_COLOR_METADATA:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800373 if (data->operation & COLOR_METADATA) {
374 *((ColorMetaData *)param) = data->color;
375 ret = 0;
376 }
Arun Kumar K.Rb2771bf2016-10-03 21:38:23 -0700377 break;
Gurunath Ramaswamyb494c022017-07-04 13:47:46 -0700378 case GET_UBWC_CR_STATS_INFO:
379 if (data->operation & SET_UBWC_CR_STATS_INFO) {
380 struct UBWCStats* stats = (struct UBWCStats*)param;
381 int numelems = sizeof(data->ubwcCRStats) / sizeof(struct UBWCStats);
382 for (int i = 0; i < numelems; i++) {
383 stats[i] = data->ubwcCRStats[i];
384 }
385 ret = 0;
386 }
387 break;
Ashwini Rao6e616962017-11-28 12:12:46 -0800388 case GET_VIDEO_PERF_MODE:
389 if (data->operation & SET_VIDEO_PERF_MODE) {
390 *((uint32_t *)param) = data->isVideoPerfMode;
391 ret = 0;
392 }
393 break;
Mohan Pallaka5d814432018-08-01 10:40:13 -0700394 case GET_GRAPHICS_METADATA:
395 if (data->operation & SET_GRAPHICS_METADATA) {
396 memcpy(param, data->graphics_metadata.data, sizeof(data->graphics_metadata.data));
397 ret = 0;
398 }
399 break;
Maheshwar Ajja10690722019-01-30 14:12:45 -0800400 case GET_CVP_METADATA:
401 if (data->operation & SET_CVP_METADATA) {
402 struct CVPMetadata *cvpMetadata = (struct CVPMetadata *)param;
403 cvpMetadata->size = 0;
Maheshwar Ajja0de87d72019-03-11 11:44:30 -0700404 if (data->cvpMetadata.size <= CVP_METADATA_SIZE) {
Maheshwar Ajja10690722019-01-30 14:12:45 -0800405 cvpMetadata->size = data->cvpMetadata.size;
406 memcpy(cvpMetadata->payload, data->cvpMetadata.payload,
407 data->cvpMetadata.size);
Akshata Sahukaraab1e562019-07-30 13:57:25 -0700408 cvpMetadata->capture_frame_rate = data->cvpMetadata.capture_frame_rate;
409 cvpMetadata->cvp_frame_rate = data->cvpMetadata.cvp_frame_rate;
Akshata Sahukar8a8657c2019-10-04 20:29:25 -0700410 cvpMetadata->flags = data->cvpMetadata.flags;
411 memcpy(cvpMetadata->reserved, data->cvpMetadata.reserved,
412 (8 * sizeof(uint32_t)));
Maheshwar Ajja10690722019-01-30 14:12:45 -0800413 ret = 0;
414 }
415 }
416 break;
Mihir Ganu3d401542019-04-03 11:08:06 -0700417 case GET_VIDEO_HISTOGRAM_STATS:
418 if (data->operation & SET_VIDEO_HISTOGRAM_STATS) {
419 struct VideoHistogramMetadata *vidstats = (struct VideoHistogramMetadata *)param;
420 vidstats->stat_len = 0;
421 if (data->video_histogram_stats.stat_len <= VIDEO_HISTOGRAM_STATS_SIZE) {
422 memcpy(vidstats->stats_info,
423 data->video_histogram_stats.stats_info, VIDEO_HISTOGRAM_STATS_SIZE);
424 vidstats->stat_len = data->video_histogram_stats.stat_len;
425 vidstats->frame_type = data->video_histogram_stats.frame_type;
426 vidstats->display_width = data->video_histogram_stats.display_width;
427 vidstats->display_height = data->video_histogram_stats.display_height;
428 vidstats->decode_width = data->video_histogram_stats.decode_width;
429 vidstats->decode_height = data->video_histogram_stats.decode_height;
430 ret = 0;
431 }
432 }
433 break;
feifanz9cc23032016-03-23 18:48:56 +0800434 default:
435 ALOGE("Unknown paramType %d", paramType);
436 break;
437 }
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800438 return ret;
feifanz9cc23032016-03-23 18:48:56 +0800439}
440
441int copyMetaData(struct private_handle_t *src, struct private_handle_t *dst) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400442 auto err = validateAndMap(src);
443 if (err != 0)
444 return err;
445
446 err = validateAndMap(dst);
447 if (err != 0)
448 return err;
feifanz9cc23032016-03-23 18:48:56 +0800449
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400450 MetaData_t *src_data = reinterpret_cast <MetaData_t *>(src->base_metadata);
451 MetaData_t *dst_data = reinterpret_cast <MetaData_t *>(dst->base_metadata);
Naseer Ahmede9b87622017-07-06 12:53:15 -0400452 *dst_data = *src_data;
feifanz9cc23032016-03-23 18:48:56 +0800453 return 0;
454}
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400455
456int copyMetaDataVaToHandle(MetaData_t *src_data, struct private_handle_t *dst) {
457 int err = -EINVAL;
458 if (src_data == nullptr)
459 return err;
460
461 err = validateAndMap(dst);
462 if (err != 0)
463 return err;
464
465 MetaData_t *dst_data = reinterpret_cast <MetaData_t *>(dst->base_metadata);
Naseer Ahmede9b87622017-07-06 12:53:15 -0400466 *dst_data = *src_data;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400467 return 0;
468}
469
470int copyMetaDataHandleToVa(struct private_handle_t *src, MetaData_t *dst_data) {
471 int err = -EINVAL;
472 if (dst_data == nullptr)
473 return err;
474
475 err = validateAndMap(src);
476 if (err != 0)
477 return err;
478
479 MetaData_t *src_data = reinterpret_cast <MetaData_t *>(src->base_metadata);
Naseer Ahmede9b87622017-07-06 12:53:15 -0400480 *dst_data = *src_data;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400481 return 0;
482}
483
484int copyMetaDataVaToVa(MetaData_t *src_data, MetaData_t *dst_data) {
485 int err = -EINVAL;
486 if (src_data == nullptr)
487 return err;
488
489 if (dst_data == nullptr)
490 return err;
491
Naseer Ahmede9b87622017-07-06 12:53:15 -0400492 *dst_data = *src_data;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400493 return 0;
494}
495
Praveen Chavan5e5679a2018-11-18 11:14:19 -0800496int setMetaDataAndUnmap(struct private_handle_t *handle, enum DispParamType paramType,
497 void *param) {
498 auto ret = setMetaData(handle, paramType, param);
499 unmapAndReset(handle);
500 return ret;
501}
502
503int getMetaDataAndUnmap(struct private_handle_t *handle,
504 enum DispFetchParamType paramType,
505 void *param) {
506 auto ret = getMetaData(handle, paramType, param);
507 unmapAndReset(handle);
508 return ret;
509}