blob: a3141f08ca7d339022351daf982795610835b515 [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 {
Yichi Chenbddad072020-03-23 12:50:12 +080058 ALOGE(
59 "Cannot convert ColorMetaData to ColorSpace_t. "
60 "Primaries = %d, Range = %d",
61 in.colorPrimaries, in.range);
Tharaga Balachandrana6480a42020-01-20 13:58:43 -050062 return -1;
63 }
64
65 return 0;
66}
67
68static int colorSpaceToColorMetadata(ColorSpace_t in, ColorMetaData *out) {
69 out->transfer = Transfer_sRGB;
70 switch (in) {
71 case ITU_R_601:
72 out->colorPrimaries = ColorPrimaries_BT601_6_525;
73 out->range = Range_Limited;
74 break;
75 case ITU_R_601_FR:
76 out->colorPrimaries = ColorPrimaries_BT601_6_525;
77 out->range = Range_Full;
78 break;
79 case ITU_R_709:
80 out->colorPrimaries = ColorPrimaries_BT709_5;
81 out->range = Range_Limited;
82 break;
83 case ITU_R_2020:
84 out->colorPrimaries = ColorPrimaries_BT2020;
85 out->range = Range_Limited;
86 break;
87 case ITU_R_2020_FR:
88 out->colorPrimaries = ColorPrimaries_BT2020;
89 out->range = Range_Full;
90 break;
91 default:
Yichi Chenbddad072020-03-23 12:50:12 +080092 ALOGE("Cannot convert ColorSpace_t %d to ColorMetaData", in);
Tharaga Balachandrana6480a42020-01-20 13:58:43 -050093 return -1;
94 break;
95 }
96
97 return 0;
98}
Naseer Ahmed2e6bee12017-04-13 22:45:54 -040099unsigned long getMetaDataSize() {
100 return static_cast<unsigned long>(ROUND_UP_PAGESIZE(sizeof(MetaData_t)));
101}
102
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400103static int validateAndMap(private_handle_t* handle) {
Prabhanjan Kandula1ef8e6e2016-08-19 11:46:47 +0530104 if (private_handle_t::validate(handle)) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400105 ALOGE("%s: Private handle is invalid - handle:%p", __func__, handle);
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -0800106 return -1;
107 }
Naseer Ahmed7aff2612017-10-05 20:39:05 -0400108 if (handle->fd_metadata < 0) {
109 // Silently return, metadata cannot be used
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -0800110 return -1;
111 }
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400112
113 if (!handle->base_metadata) {
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400114 auto size = getMetaDataSize();
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400115 void *base = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED,
116 handle->fd_metadata, 0);
117 if (base == reinterpret_cast<void*>(MAP_FAILED)) {
118 ALOGE("%s: metadata mmap failed - handle:%p fd: %d err: %s",
119 __func__, handle, handle->fd_metadata, strerror(errno));
120
121 return -1;
122 }
123 handle->base_metadata = (uintptr_t) base;
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -0800124 }
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400125 return 0;
126}
127
Praveen Chavan5e5679a2018-11-18 11:14:19 -0800128static void unmapAndReset(private_handle_t *handle) {
129 if (private_handle_t::validate(handle) == 0 && handle->base_metadata) {
130 munmap(reinterpret_cast<void *>(handle->base_metadata), getMetaDataSize());
131 handle->base_metadata = 0;
132 }
133}
134
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400135int setMetaData(private_handle_t *handle, DispParamType paramType,
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400136 void *param) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400137 auto err = validateAndMap(handle);
138 if (err != 0)
139 return err;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400140 return setMetaDataVa(reinterpret_cast<MetaData_t*>(handle->base_metadata),
141 paramType, param);
142}
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400143
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400144int setMetaDataVa(MetaData_t *data, DispParamType paramType,
145 void *param) {
146 if (data == nullptr)
147 return -EINVAL;
Prabhanjan Kandula1ef8e6e2016-08-19 11:46:47 +0530148 // If parameter is NULL reset the specific MetaData Key
149 if (!param) {
150 data->operation &= ~paramType;
Mahesh Lankada067392020-04-07 19:23:46 +0530151 switch (paramType) {
152 case SET_VIDEO_PERF_MODE:
153 data->isVideoPerfMode = 0;
154 break;
155 case SET_CVP_METADATA:
156 data->cvpMetadata.size = 0;
157 break;
158 case SET_VIDEO_HISTOGRAM_STATS:
159 data->video_histogram_stats.stat_len = 0;
160 break;
161 default:
162 ALOGE("Unknown paramType %d", paramType);
163 break;
164 }
Naseer Ahmed8d1434a2017-03-31 15:31:18 -0400165 // param unset
166 return 0;
Prabhanjan Kandula1ef8e6e2016-08-19 11:46:47 +0530167 }
168
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -0800169 data->operation |= paramType;
170 switch (paramType) {
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -0800171 case PP_PARAM_INTERLACED:
172 data->interlaced = *((int32_t *)param);
173 break;
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -0500174 case UPDATE_BUFFER_GEOMETRY: {
175 BufferDim_t in = *((BufferDim_t *)param);
176 data->crop = {0, 0, in.sliceWidth, in.sliceHeight};
177 break;
178 }
Arun Kumar K.Ra727a882014-08-20 17:14:26 -0700179 case UPDATE_REFRESH_RATE:
feifanz9cc23032016-03-23 18:48:56 +0800180 data->refreshrate = *((float *)param);
Arun Kumar K.Ra727a882014-08-20 17:14:26 -0700181 break;
Tharaga Balachandrana6480a42020-01-20 13:58:43 -0500182 case UPDATE_COLOR_SPACE: {
Tharaga Balachandranc20aa832020-04-07 19:26:54 -0400183 ColorMetaData color = {};
Tharaga Balachandrana6480a42020-01-20 13:58:43 -0500184 if (!colorSpaceToColorMetadata(*((ColorSpace_t *)param), &color)) {
185 data->color = color;
Yichi Chenbddad072020-03-23 12:50:12 +0800186 break;
Tharaga Balachandrana6480a42020-01-20 13:58:43 -0500187 }
Yichi Chenbddad072020-03-23 12:50:12 +0800188 return -EINVAL;
Tharaga Balachandrana6480a42020-01-20 13:58:43 -0500189 }
Arun Kumar K.Rda2f69b2014-09-30 15:45:37 -0700190 case MAP_SECURE_BUFFER:
191 data->mapSecureBuffer = *((int32_t *)param);
192 break;
Naseer Ahmed3324ff72015-01-21 17:14:44 -0500193 case S3D_FORMAT:
194 data->s3dFormat = *((uint32_t *)param);
195 break;
Sushil Chauhane7acc3c2015-06-23 16:22:30 -0700196 case LINEAR_FORMAT:
197 data->linearFormat = *((uint32_t *)param);
198 break;
Saurabh Shah95f83682015-10-16 10:30:04 -0700199 case SET_SINGLE_BUFFER_MODE:
Saurabh Shahb8067a42015-11-06 16:52:02 -0800200 data->isSingleBufferMode = *((uint32_t *)param);
Saurabh Shah95f83682015-10-16 10:30:04 -0700201 break;
Naseer Ahmede8f254d2016-08-02 20:06:40 -0400202 case SET_VT_TIMESTAMP:
203 data->vtTimeStamp = *((uint64_t *)param);
204 break;
Arun Kumar K.Rb2771bf2016-10-03 21:38:23 -0700205 case COLOR_METADATA:
206 data->color = *((ColorMetaData *)param);
Arun Kumar K.Rb2771bf2016-10-03 21:38:23 -0700207 break;
Gurunath Ramaswamyb494c022017-07-04 13:47:46 -0700208 case SET_UBWC_CR_STATS_INFO: {
209 struct UBWCStats* stats = (struct UBWCStats*)param;
210 int numelems = sizeof(data->ubwcCRStats) / sizeof(struct UBWCStats);
211 for (int i = 0; i < numelems; i++) {
212 data->ubwcCRStats[i] = stats[i];
213 }
214 break;
215 }
Ashwini Rao6e616962017-11-28 12:12:46 -0800216 case SET_VIDEO_PERF_MODE:
217 data->isVideoPerfMode = *((uint32_t *)param);
218 break;
Mohan Pallaka5d814432018-08-01 10:40:13 -0700219 case SET_GRAPHICS_METADATA: {
220 GraphicsMetadata payload = *((GraphicsMetadata*)(param));
221 data->graphics_metadata.size = payload.size;
222 memcpy(data->graphics_metadata.data, payload.data,
223 sizeof(data->graphics_metadata.data));
224 break;
225 }
Maheshwar Ajja10690722019-01-30 14:12:45 -0800226 case SET_CVP_METADATA: {
227 struct CVPMetadata *cvpMetadata = (struct CVPMetadata *)param;
Maheshwar Ajja0de87d72019-03-11 11:44:30 -0700228 if (cvpMetadata->size <= CVP_METADATA_SIZE) {
Maheshwar Ajja10690722019-01-30 14:12:45 -0800229 data->cvpMetadata.size = cvpMetadata->size;
230 memcpy(data->cvpMetadata.payload, cvpMetadata->payload,
231 cvpMetadata->size);
Akshata Sahukaraab1e562019-07-30 13:57:25 -0700232 data->cvpMetadata.capture_frame_rate = cvpMetadata->capture_frame_rate;
233 data->cvpMetadata.cvp_frame_rate = cvpMetadata->cvp_frame_rate;
Akshata Sahukar8a8657c2019-10-04 20:29:25 -0700234 data->cvpMetadata.flags = cvpMetadata->flags;
235 memcpy(data->cvpMetadata.reserved, cvpMetadata->reserved,
236 (8 * sizeof(uint32_t)));
Maheshwar Ajja10690722019-01-30 14:12:45 -0800237 } else {
238 data->operation &= ~(paramType);
239 ALOGE("%s: cvp metadata length %d is more than max size %d",
240 __func__, cvpMetadata->size, CVP_METADATA_SIZE);
241 return -EINVAL;
242 }
243 break;
244 }
Mihir Ganu3d401542019-04-03 11:08:06 -0700245 case SET_VIDEO_HISTOGRAM_STATS: {
246 struct VideoHistogramMetadata *vidstats = (struct VideoHistogramMetadata *)param;
247 if (vidstats->stat_len <= VIDEO_HISTOGRAM_STATS_SIZE) {
248 memcpy(data->video_histogram_stats.stats_info,
249 vidstats->stats_info, VIDEO_HISTOGRAM_STATS_SIZE);
250 data->video_histogram_stats.stat_len = vidstats->stat_len;
251 data->video_histogram_stats.frame_type = vidstats->frame_type;
252 data->video_histogram_stats.display_width = vidstats->display_width;
253 data->video_histogram_stats.display_height = vidstats->display_height;
254 data->video_histogram_stats.decode_width = vidstats->decode_width;
255 data->video_histogram_stats.decode_height = vidstats->decode_height;
256 } else {
257 data->operation &= ~(paramType);
258 ALOGE("%s: video stats length %u is more than max size %u",
259 __func__, vidstats->stat_len, VIDEO_HISTOGRAM_STATS_SIZE);
260 return -EINVAL;
261 }
262 break;
263 }
264 default:
Ray Zhang8ace84d2016-08-08 19:36:03 +0800265 ALOGE("Unknown paramType %d", paramType);
266 break;
267 }
Ray Zhang8ace84d2016-08-08 19:36:03 +0800268 return 0;
269}
270
271int clearMetaData(private_handle_t *handle, DispParamType paramType) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400272 auto err = validateAndMap(handle);
273 if (err != 0)
274 return err;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400275 return clearMetaDataVa(reinterpret_cast<MetaData_t *>(handle->base_metadata),
276 paramType);
277}
Ray Zhang8ace84d2016-08-08 19:36:03 +0800278
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400279int clearMetaDataVa(MetaData_t *data, DispParamType paramType) {
280 if (data == nullptr)
281 return -EINVAL;
Ray Zhang8ace84d2016-08-08 19:36:03 +0800282 data->operation &= ~paramType;
283 switch (paramType) {
Priyanka Gujjula1db74712018-11-27 17:38:26 +0530284 case SET_VIDEO_PERF_MODE:
285 data->isVideoPerfMode = 0;
286 break;
Maheshwar Ajja10690722019-01-30 14:12:45 -0800287 case SET_CVP_METADATA:
288 data->cvpMetadata.size = 0;
289 break;
Mihir Ganu3d401542019-04-03 11:08:06 -0700290 case SET_VIDEO_HISTOGRAM_STATS:
291 data->video_histogram_stats.stat_len = 0;
292 break;
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -0800293 default:
294 ALOGE("Unknown paramType %d", paramType);
295 break;
296 }
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -0800297 return 0;
298}
feifanz9cc23032016-03-23 18:48:56 +0800299
300int getMetaData(private_handle_t *handle, DispFetchParamType paramType,
301 void *param) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400302 int ret = validateAndMap(handle);
303 if (ret != 0)
304 return ret;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400305 return getMetaDataVa(reinterpret_cast<MetaData_t *>(handle->base_metadata),
306 paramType, param);
307}
308
309int getMetaDataVa(MetaData_t *data, DispFetchParamType paramType,
310 void *param) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400311 // Make sure we send 0 only if the operation queried is present
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400312 int ret = -EINVAL;
313 if (data == nullptr)
314 return ret;
Gurunath Ramaswamyb494c022017-07-04 13:47:46 -0700315 if (param == nullptr)
316 return ret;
feifanz9cc23032016-03-23 18:48:56 +0800317
feifanz9cc23032016-03-23 18:48:56 +0800318 switch (paramType) {
319 case GET_PP_PARAM_INTERLACED:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800320 if (data->operation & PP_PARAM_INTERLACED) {
321 *((int32_t *)param) = data->interlaced;
322 ret = 0;
323 }
feifanz9cc23032016-03-23 18:48:56 +0800324 break;
325 case GET_BUFFER_GEOMETRY:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800326 if (data->operation & UPDATE_BUFFER_GEOMETRY) {
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -0500327 *((BufferDim_t *)param) = {data->crop.right, data->crop.bottom};
328 ret = 0;
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800329 }
feifanz9cc23032016-03-23 18:48:56 +0800330 break;
331 case GET_REFRESH_RATE:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800332 if (data->operation & UPDATE_REFRESH_RATE) {
333 *((float *)param) = data->refreshrate;
334 ret = 0;
335 }
feifanz9cc23032016-03-23 18:48:56 +0800336 break;
337 case GET_COLOR_SPACE:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800338 if (data->operation & UPDATE_COLOR_SPACE) {
Tharaga Balachandrana6480a42020-01-20 13:58:43 -0500339 ColorSpace_t color_space;
340 if (!colorMetaDataToColorSpace(data->color, &color_space)) {
341 *((ColorSpace_t *)param) = color_space;
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800342 ret = 0;
Yichi Chenbddad072020-03-23 12:50:12 +0800343 }
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800344 }
feifanz9cc23032016-03-23 18:48:56 +0800345 break;
346 case GET_MAP_SECURE_BUFFER:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800347 if (data->operation & MAP_SECURE_BUFFER) {
348 *((int32_t *)param) = data->mapSecureBuffer;
349 ret = 0;
350 }
feifanz9cc23032016-03-23 18:48:56 +0800351 break;
352 case GET_S3D_FORMAT:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800353 if (data->operation & S3D_FORMAT) {
354 *((uint32_t *)param) = data->s3dFormat;
355 ret = 0;
356 }
feifanz9cc23032016-03-23 18:48:56 +0800357 break;
358 case GET_LINEAR_FORMAT:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800359 if (data->operation & LINEAR_FORMAT) {
360 *((uint32_t *)param) = data->linearFormat;
361 ret = 0;
362 }
feifanz9cc23032016-03-23 18:48:56 +0800363 break;
feifanz9cc23032016-03-23 18:48:56 +0800364 case GET_SINGLE_BUFFER_MODE:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800365 if (data->operation & SET_SINGLE_BUFFER_MODE) {
366 *((uint32_t *)param) = data->isSingleBufferMode;
367 ret = 0;
368 }
feifanz9cc23032016-03-23 18:48:56 +0800369 break;
Naseer Ahmede8f254d2016-08-02 20:06:40 -0400370 case GET_VT_TIMESTAMP:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800371 if (data->operation & SET_VT_TIMESTAMP) {
372 *((uint64_t *)param) = data->vtTimeStamp;
373 ret = 0;
374 }
Naseer Ahmede8f254d2016-08-02 20:06:40 -0400375 break;
Arun Kumar K.Rb2771bf2016-10-03 21:38:23 -0700376 case GET_COLOR_METADATA:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800377 if (data->operation & COLOR_METADATA) {
378 *((ColorMetaData *)param) = data->color;
379 ret = 0;
380 }
Arun Kumar K.Rb2771bf2016-10-03 21:38:23 -0700381 break;
Gurunath Ramaswamyb494c022017-07-04 13:47:46 -0700382 case GET_UBWC_CR_STATS_INFO:
383 if (data->operation & SET_UBWC_CR_STATS_INFO) {
384 struct UBWCStats* stats = (struct UBWCStats*)param;
385 int numelems = sizeof(data->ubwcCRStats) / sizeof(struct UBWCStats);
386 for (int i = 0; i < numelems; i++) {
387 stats[i] = data->ubwcCRStats[i];
388 }
389 ret = 0;
390 }
391 break;
Ashwini Rao6e616962017-11-28 12:12:46 -0800392 case GET_VIDEO_PERF_MODE:
393 if (data->operation & SET_VIDEO_PERF_MODE) {
394 *((uint32_t *)param) = data->isVideoPerfMode;
395 ret = 0;
396 }
397 break;
Mohan Pallaka5d814432018-08-01 10:40:13 -0700398 case GET_GRAPHICS_METADATA:
399 if (data->operation & SET_GRAPHICS_METADATA) {
400 memcpy(param, data->graphics_metadata.data, sizeof(data->graphics_metadata.data));
401 ret = 0;
402 }
403 break;
Maheshwar Ajja10690722019-01-30 14:12:45 -0800404 case GET_CVP_METADATA:
405 if (data->operation & SET_CVP_METADATA) {
406 struct CVPMetadata *cvpMetadata = (struct CVPMetadata *)param;
407 cvpMetadata->size = 0;
Maheshwar Ajja0de87d72019-03-11 11:44:30 -0700408 if (data->cvpMetadata.size <= CVP_METADATA_SIZE) {
Maheshwar Ajja10690722019-01-30 14:12:45 -0800409 cvpMetadata->size = data->cvpMetadata.size;
410 memcpy(cvpMetadata->payload, data->cvpMetadata.payload,
411 data->cvpMetadata.size);
Akshata Sahukaraab1e562019-07-30 13:57:25 -0700412 cvpMetadata->capture_frame_rate = data->cvpMetadata.capture_frame_rate;
413 cvpMetadata->cvp_frame_rate = data->cvpMetadata.cvp_frame_rate;
Akshata Sahukar8a8657c2019-10-04 20:29:25 -0700414 cvpMetadata->flags = data->cvpMetadata.flags;
415 memcpy(cvpMetadata->reserved, data->cvpMetadata.reserved,
416 (8 * sizeof(uint32_t)));
Maheshwar Ajja10690722019-01-30 14:12:45 -0800417 ret = 0;
418 }
419 }
420 break;
Mihir Ganu3d401542019-04-03 11:08:06 -0700421 case GET_VIDEO_HISTOGRAM_STATS:
422 if (data->operation & SET_VIDEO_HISTOGRAM_STATS) {
423 struct VideoHistogramMetadata *vidstats = (struct VideoHistogramMetadata *)param;
424 vidstats->stat_len = 0;
425 if (data->video_histogram_stats.stat_len <= VIDEO_HISTOGRAM_STATS_SIZE) {
426 memcpy(vidstats->stats_info,
427 data->video_histogram_stats.stats_info, VIDEO_HISTOGRAM_STATS_SIZE);
428 vidstats->stat_len = data->video_histogram_stats.stat_len;
429 vidstats->frame_type = data->video_histogram_stats.frame_type;
430 vidstats->display_width = data->video_histogram_stats.display_width;
431 vidstats->display_height = data->video_histogram_stats.display_height;
432 vidstats->decode_width = data->video_histogram_stats.decode_width;
433 vidstats->decode_height = data->video_histogram_stats.decode_height;
434 ret = 0;
435 }
436 }
437 break;
feifanz9cc23032016-03-23 18:48:56 +0800438 default:
439 ALOGE("Unknown paramType %d", paramType);
440 break;
441 }
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800442 return ret;
feifanz9cc23032016-03-23 18:48:56 +0800443}
444
445int copyMetaData(struct private_handle_t *src, struct private_handle_t *dst) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400446 auto err = validateAndMap(src);
447 if (err != 0)
448 return err;
449
450 err = validateAndMap(dst);
451 if (err != 0)
452 return err;
feifanz9cc23032016-03-23 18:48:56 +0800453
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400454 MetaData_t *src_data = reinterpret_cast <MetaData_t *>(src->base_metadata);
455 MetaData_t *dst_data = reinterpret_cast <MetaData_t *>(dst->base_metadata);
Naseer Ahmede9b87622017-07-06 12:53:15 -0400456 *dst_data = *src_data;
feifanz9cc23032016-03-23 18:48:56 +0800457 return 0;
458}
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400459
460int copyMetaDataVaToHandle(MetaData_t *src_data, struct private_handle_t *dst) {
461 int err = -EINVAL;
462 if (src_data == nullptr)
463 return err;
464
465 err = validateAndMap(dst);
466 if (err != 0)
467 return err;
468
469 MetaData_t *dst_data = reinterpret_cast <MetaData_t *>(dst->base_metadata);
Naseer Ahmede9b87622017-07-06 12:53:15 -0400470 *dst_data = *src_data;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400471 return 0;
472}
473
474int copyMetaDataHandleToVa(struct private_handle_t *src, MetaData_t *dst_data) {
475 int err = -EINVAL;
476 if (dst_data == nullptr)
477 return err;
478
479 err = validateAndMap(src);
480 if (err != 0)
481 return err;
482
483 MetaData_t *src_data = reinterpret_cast <MetaData_t *>(src->base_metadata);
Naseer Ahmede9b87622017-07-06 12:53:15 -0400484 *dst_data = *src_data;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400485 return 0;
486}
487
488int copyMetaDataVaToVa(MetaData_t *src_data, MetaData_t *dst_data) {
489 int err = -EINVAL;
490 if (src_data == nullptr)
491 return err;
492
493 if (dst_data == nullptr)
494 return err;
495
Naseer Ahmede9b87622017-07-06 12:53:15 -0400496 *dst_data = *src_data;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400497 return 0;
498}
499
Praveen Chavan5e5679a2018-11-18 11:14:19 -0800500int setMetaDataAndUnmap(struct private_handle_t *handle, enum DispParamType paramType,
501 void *param) {
502 auto ret = setMetaData(handle, paramType, param);
503 unmapAndReset(handle);
504 return ret;
505}
506
507int getMetaDataAndUnmap(struct private_handle_t *handle,
508 enum DispFetchParamType paramType,
509 void *param) {
510 auto ret = getMetaData(handle, paramType, param);
511 unmapAndReset(handle);
512 return ret;
513}