blob: fb320950fb259e0b67ef65844de6bb504f2e8067 [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
Ray Zhang566adac2014-04-14 15:32:04 +080030#include <errno.h>
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -080031#include <string.h>
32#include <sys/mman.h>
Naseer Ahmed04a804a2018-03-06 20:41:14 -050033#include <log/log.h>
Naseer Ahmed08c3e402017-03-16 15:51:54 -040034#include <cinttypes>
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -080035#include <gralloc_priv.h>
36#include "qdMetaData.h"
37
Tharaga Balachandrana6480a42020-01-20 13:58:43 -050038static int colorMetaDataToColorSpace(ColorMetaData in, ColorSpace_t *out) {
39 if (in.colorPrimaries == ColorPrimaries_BT601_6_525 ||
40 in.colorPrimaries == ColorPrimaries_BT601_6_625) {
41 if (in.range == Range_Full) {
42 *out = ITU_R_601_FR;
43 } else {
44 *out = ITU_R_601;
45 }
46 } else if (in.colorPrimaries == ColorPrimaries_BT2020) {
47 if (in.range == Range_Full) {
48 *out = ITU_R_2020_FR;
49 } else {
50 *out = ITU_R_2020;
51 }
52 } else if (in.colorPrimaries == ColorPrimaries_BT709_5) {
53 *out = ITU_R_709;
54 } else {
55 ALOGE("Cannot convert ColorMetaData to ColorSpace_t");
56 return -1;
57 }
58
59 return 0;
60}
61
62static int colorSpaceToColorMetadata(ColorSpace_t in, ColorMetaData *out) {
63 out->transfer = Transfer_sRGB;
64 switch (in) {
65 case ITU_R_601:
66 out->colorPrimaries = ColorPrimaries_BT601_6_525;
67 out->range = Range_Limited;
68 break;
69 case ITU_R_601_FR:
70 out->colorPrimaries = ColorPrimaries_BT601_6_525;
71 out->range = Range_Full;
72 break;
73 case ITU_R_709:
74 out->colorPrimaries = ColorPrimaries_BT709_5;
75 out->range = Range_Limited;
76 break;
77 case ITU_R_2020:
78 out->colorPrimaries = ColorPrimaries_BT2020;
79 out->range = Range_Limited;
80 break;
81 case ITU_R_2020_FR:
82 out->colorPrimaries = ColorPrimaries_BT2020;
83 out->range = Range_Full;
84 break;
85 default:
86 ALOGE("Cannot convert ColorSpace_t to ColorMetaData");
87 return -1;
88 break;
89 }
90
91 return 0;
92}
Naseer Ahmed2e6bee12017-04-13 22:45:54 -040093unsigned long getMetaDataSize() {
94 return static_cast<unsigned long>(ROUND_UP_PAGESIZE(sizeof(MetaData_t)));
95}
96
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -040097static int validateAndMap(private_handle_t* handle) {
Prabhanjan Kandula1ef8e6e2016-08-19 11:46:47 +053098 if (private_handle_t::validate(handle)) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -040099 ALOGE("%s: Private handle is invalid - handle:%p", __func__, handle);
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -0800100 return -1;
101 }
Naseer Ahmed7aff2612017-10-05 20:39:05 -0400102 if (handle->fd_metadata < 0) {
103 // Silently return, metadata cannot be used
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -0800104 return -1;
105 }
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400106
107 if (!handle->base_metadata) {
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400108 auto size = getMetaDataSize();
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400109 void *base = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED,
110 handle->fd_metadata, 0);
111 if (base == reinterpret_cast<void*>(MAP_FAILED)) {
112 ALOGE("%s: metadata mmap failed - handle:%p fd: %d err: %s",
113 __func__, handle, handle->fd_metadata, strerror(errno));
114
115 return -1;
116 }
117 handle->base_metadata = (uintptr_t) base;
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -0800118 }
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400119 return 0;
120}
121
Praveen Chavan5e5679a2018-11-18 11:14:19 -0800122static void unmapAndReset(private_handle_t *handle) {
123 if (private_handle_t::validate(handle) == 0 && handle->base_metadata) {
124 munmap(reinterpret_cast<void *>(handle->base_metadata), getMetaDataSize());
125 handle->base_metadata = 0;
126 }
127}
128
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400129int setMetaData(private_handle_t *handle, DispParamType paramType,
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400130 void *param) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400131 auto err = validateAndMap(handle);
132 if (err != 0)
133 return err;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400134 return setMetaDataVa(reinterpret_cast<MetaData_t*>(handle->base_metadata),
135 paramType, param);
136}
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400137
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400138int setMetaDataVa(MetaData_t *data, DispParamType paramType,
139 void *param) {
140 if (data == nullptr)
141 return -EINVAL;
Prabhanjan Kandula1ef8e6e2016-08-19 11:46:47 +0530142 // If parameter is NULL reset the specific MetaData Key
143 if (!param) {
144 data->operation &= ~paramType;
Naseer Ahmed8d1434a2017-03-31 15:31:18 -0400145 // param unset
146 return 0;
Prabhanjan Kandula1ef8e6e2016-08-19 11:46:47 +0530147 }
148
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -0800149 data->operation |= paramType;
150 switch (paramType) {
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -0800151 case PP_PARAM_INTERLACED:
152 data->interlaced = *((int32_t *)param);
153 break;
Ramkumar Radhakrishnan92f3abe2013-06-05 13:52:40 -0700154 case UPDATE_BUFFER_GEOMETRY:
Dileep Marchya2295fdd2015-08-12 17:04:14 -0700155 data->bufferDim = *((BufferDim_t *)param);
Arun Kumar K.Ra727a882014-08-20 17:14:26 -0700156 break;
157 case UPDATE_REFRESH_RATE:
feifanz9cc23032016-03-23 18:48:56 +0800158 data->refreshrate = *((float *)param);
Arun Kumar K.Ra727a882014-08-20 17:14:26 -0700159 break;
Tharaga Balachandrana6480a42020-01-20 13:58:43 -0500160 case UPDATE_COLOR_SPACE: {
161 ColorMetaData color;
162 if (!colorSpaceToColorMetadata(*((ColorSpace_t *)param), &color)) {
163 data->color = color;
164 }
165 break;
166 }
Arun Kumar K.Rda2f69b2014-09-30 15:45:37 -0700167 case MAP_SECURE_BUFFER:
168 data->mapSecureBuffer = *((int32_t *)param);
169 break;
Naseer Ahmed3324ff72015-01-21 17:14:44 -0500170 case S3D_FORMAT:
171 data->s3dFormat = *((uint32_t *)param);
172 break;
Sushil Chauhane7acc3c2015-06-23 16:22:30 -0700173 case LINEAR_FORMAT:
174 data->linearFormat = *((uint32_t *)param);
175 break;
Saurabh Shah95f83682015-10-16 10:30:04 -0700176 case SET_SINGLE_BUFFER_MODE:
Saurabh Shahb8067a42015-11-06 16:52:02 -0800177 data->isSingleBufferMode = *((uint32_t *)param);
Saurabh Shah95f83682015-10-16 10:30:04 -0700178 break;
Naseer Ahmede8f254d2016-08-02 20:06:40 -0400179 case SET_VT_TIMESTAMP:
180 data->vtTimeStamp = *((uint64_t *)param);
181 break;
Arun Kumar K.Rb2771bf2016-10-03 21:38:23 -0700182 case COLOR_METADATA:
183 data->color = *((ColorMetaData *)param);
Arun Kumar K.Rb2771bf2016-10-03 21:38:23 -0700184 break;
Gurunath Ramaswamyb494c022017-07-04 13:47:46 -0700185 case SET_UBWC_CR_STATS_INFO: {
186 struct UBWCStats* stats = (struct UBWCStats*)param;
187 int numelems = sizeof(data->ubwcCRStats) / sizeof(struct UBWCStats);
188 for (int i = 0; i < numelems; i++) {
189 data->ubwcCRStats[i] = stats[i];
190 }
191 break;
192 }
Ashwini Rao6e616962017-11-28 12:12:46 -0800193 case SET_VIDEO_PERF_MODE:
194 data->isVideoPerfMode = *((uint32_t *)param);
195 break;
Mohan Pallaka5d814432018-08-01 10:40:13 -0700196 case SET_GRAPHICS_METADATA: {
197 GraphicsMetadata payload = *((GraphicsMetadata*)(param));
198 data->graphics_metadata.size = payload.size;
199 memcpy(data->graphics_metadata.data, payload.data,
200 sizeof(data->graphics_metadata.data));
201 break;
202 }
Maheshwar Ajja10690722019-01-30 14:12:45 -0800203 case SET_CVP_METADATA: {
204 struct CVPMetadata *cvpMetadata = (struct CVPMetadata *)param;
Maheshwar Ajja0de87d72019-03-11 11:44:30 -0700205 if (cvpMetadata->size <= CVP_METADATA_SIZE) {
Maheshwar Ajja10690722019-01-30 14:12:45 -0800206 data->cvpMetadata.size = cvpMetadata->size;
207 memcpy(data->cvpMetadata.payload, cvpMetadata->payload,
208 cvpMetadata->size);
Akshata Sahukaraab1e562019-07-30 13:57:25 -0700209 data->cvpMetadata.capture_frame_rate = cvpMetadata->capture_frame_rate;
210 data->cvpMetadata.cvp_frame_rate = cvpMetadata->cvp_frame_rate;
Akshata Sahukar8a8657c2019-10-04 20:29:25 -0700211 data->cvpMetadata.flags = cvpMetadata->flags;
212 memcpy(data->cvpMetadata.reserved, cvpMetadata->reserved,
213 (8 * sizeof(uint32_t)));
Maheshwar Ajja10690722019-01-30 14:12:45 -0800214 } else {
215 data->operation &= ~(paramType);
216 ALOGE("%s: cvp metadata length %d is more than max size %d",
217 __func__, cvpMetadata->size, CVP_METADATA_SIZE);
218 return -EINVAL;
219 }
220 break;
221 }
Mihir Ganu3d401542019-04-03 11:08:06 -0700222 case SET_VIDEO_HISTOGRAM_STATS: {
223 struct VideoHistogramMetadata *vidstats = (struct VideoHistogramMetadata *)param;
224 if (vidstats->stat_len <= VIDEO_HISTOGRAM_STATS_SIZE) {
225 memcpy(data->video_histogram_stats.stats_info,
226 vidstats->stats_info, VIDEO_HISTOGRAM_STATS_SIZE);
227 data->video_histogram_stats.stat_len = vidstats->stat_len;
228 data->video_histogram_stats.frame_type = vidstats->frame_type;
229 data->video_histogram_stats.display_width = vidstats->display_width;
230 data->video_histogram_stats.display_height = vidstats->display_height;
231 data->video_histogram_stats.decode_width = vidstats->decode_width;
232 data->video_histogram_stats.decode_height = vidstats->decode_height;
233 } else {
234 data->operation &= ~(paramType);
235 ALOGE("%s: video stats length %u is more than max size %u",
236 __func__, vidstats->stat_len, VIDEO_HISTOGRAM_STATS_SIZE);
237 return -EINVAL;
238 }
239 break;
240 }
241 default:
Ray Zhang8ace84d2016-08-08 19:36:03 +0800242 ALOGE("Unknown paramType %d", paramType);
243 break;
244 }
Ray Zhang8ace84d2016-08-08 19:36:03 +0800245 return 0;
246}
247
248int clearMetaData(private_handle_t *handle, DispParamType paramType) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400249 auto err = validateAndMap(handle);
250 if (err != 0)
251 return err;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400252 return clearMetaDataVa(reinterpret_cast<MetaData_t *>(handle->base_metadata),
253 paramType);
254}
Ray Zhang8ace84d2016-08-08 19:36:03 +0800255
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400256int clearMetaDataVa(MetaData_t *data, DispParamType paramType) {
257 if (data == nullptr)
258 return -EINVAL;
Ray Zhang8ace84d2016-08-08 19:36:03 +0800259 data->operation &= ~paramType;
260 switch (paramType) {
Priyanka Gujjula1db74712018-11-27 17:38:26 +0530261 case SET_VIDEO_PERF_MODE:
262 data->isVideoPerfMode = 0;
263 break;
Maheshwar Ajja10690722019-01-30 14:12:45 -0800264 case SET_CVP_METADATA:
265 data->cvpMetadata.size = 0;
266 break;
Mihir Ganu3d401542019-04-03 11:08:06 -0700267 case SET_VIDEO_HISTOGRAM_STATS:
268 data->video_histogram_stats.stat_len = 0;
269 break;
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -0800270 default:
271 ALOGE("Unknown paramType %d", paramType);
272 break;
273 }
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -0800274 return 0;
275}
feifanz9cc23032016-03-23 18:48:56 +0800276
277int getMetaData(private_handle_t *handle, DispFetchParamType paramType,
278 void *param) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400279 int ret = validateAndMap(handle);
280 if (ret != 0)
281 return ret;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400282 return getMetaDataVa(reinterpret_cast<MetaData_t *>(handle->base_metadata),
283 paramType, param);
284}
285
286int getMetaDataVa(MetaData_t *data, DispFetchParamType paramType,
287 void *param) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400288 // Make sure we send 0 only if the operation queried is present
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400289 int ret = -EINVAL;
290 if (data == nullptr)
291 return ret;
Gurunath Ramaswamyb494c022017-07-04 13:47:46 -0700292 if (param == nullptr)
293 return ret;
feifanz9cc23032016-03-23 18:48:56 +0800294
feifanz9cc23032016-03-23 18:48:56 +0800295 switch (paramType) {
296 case GET_PP_PARAM_INTERLACED:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800297 if (data->operation & PP_PARAM_INTERLACED) {
298 *((int32_t *)param) = data->interlaced;
299 ret = 0;
300 }
feifanz9cc23032016-03-23 18:48:56 +0800301 break;
302 case GET_BUFFER_GEOMETRY:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800303 if (data->operation & UPDATE_BUFFER_GEOMETRY) {
304 *((BufferDim_t *)param) = data->bufferDim;
305 ret = 0;
306 }
feifanz9cc23032016-03-23 18:48:56 +0800307 break;
308 case GET_REFRESH_RATE:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800309 if (data->operation & UPDATE_REFRESH_RATE) {
310 *((float *)param) = data->refreshrate;
311 ret = 0;
312 }
feifanz9cc23032016-03-23 18:48:56 +0800313 break;
314 case GET_COLOR_SPACE:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800315 if (data->operation & UPDATE_COLOR_SPACE) {
Tharaga Balachandrana6480a42020-01-20 13:58:43 -0500316 ColorSpace_t color_space;
317 if (!colorMetaDataToColorSpace(data->color, &color_space)) {
318 *((ColorSpace_t *)param) = color_space;
319 }
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800320 ret = 0;
321 }
feifanz9cc23032016-03-23 18:48:56 +0800322 break;
323 case GET_MAP_SECURE_BUFFER:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800324 if (data->operation & MAP_SECURE_BUFFER) {
325 *((int32_t *)param) = data->mapSecureBuffer;
326 ret = 0;
327 }
feifanz9cc23032016-03-23 18:48:56 +0800328 break;
329 case GET_S3D_FORMAT:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800330 if (data->operation & S3D_FORMAT) {
331 *((uint32_t *)param) = data->s3dFormat;
332 ret = 0;
333 }
feifanz9cc23032016-03-23 18:48:56 +0800334 break;
335 case GET_LINEAR_FORMAT:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800336 if (data->operation & LINEAR_FORMAT) {
337 *((uint32_t *)param) = data->linearFormat;
338 ret = 0;
339 }
feifanz9cc23032016-03-23 18:48:56 +0800340 break;
feifanz9cc23032016-03-23 18:48:56 +0800341 case GET_SINGLE_BUFFER_MODE:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800342 if (data->operation & SET_SINGLE_BUFFER_MODE) {
343 *((uint32_t *)param) = data->isSingleBufferMode;
344 ret = 0;
345 }
feifanz9cc23032016-03-23 18:48:56 +0800346 break;
Naseer Ahmede8f254d2016-08-02 20:06:40 -0400347 case GET_VT_TIMESTAMP:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800348 if (data->operation & SET_VT_TIMESTAMP) {
349 *((uint64_t *)param) = data->vtTimeStamp;
350 ret = 0;
351 }
Naseer Ahmede8f254d2016-08-02 20:06:40 -0400352 break;
Arun Kumar K.Rb2771bf2016-10-03 21:38:23 -0700353 case GET_COLOR_METADATA:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800354 if (data->operation & COLOR_METADATA) {
355 *((ColorMetaData *)param) = data->color;
356 ret = 0;
357 }
Arun Kumar K.Rb2771bf2016-10-03 21:38:23 -0700358 break;
Gurunath Ramaswamyb494c022017-07-04 13:47:46 -0700359 case GET_UBWC_CR_STATS_INFO:
360 if (data->operation & SET_UBWC_CR_STATS_INFO) {
361 struct UBWCStats* stats = (struct UBWCStats*)param;
362 int numelems = sizeof(data->ubwcCRStats) / sizeof(struct UBWCStats);
363 for (int i = 0; i < numelems; i++) {
364 stats[i] = data->ubwcCRStats[i];
365 }
366 ret = 0;
367 }
368 break;
Ashwini Rao6e616962017-11-28 12:12:46 -0800369 case GET_VIDEO_PERF_MODE:
370 if (data->operation & SET_VIDEO_PERF_MODE) {
371 *((uint32_t *)param) = data->isVideoPerfMode;
372 ret = 0;
373 }
374 break;
Mohan Pallaka5d814432018-08-01 10:40:13 -0700375 case GET_GRAPHICS_METADATA:
376 if (data->operation & SET_GRAPHICS_METADATA) {
377 memcpy(param, data->graphics_metadata.data, sizeof(data->graphics_metadata.data));
378 ret = 0;
379 }
380 break;
Maheshwar Ajja10690722019-01-30 14:12:45 -0800381 case GET_CVP_METADATA:
382 if (data->operation & SET_CVP_METADATA) {
383 struct CVPMetadata *cvpMetadata = (struct CVPMetadata *)param;
384 cvpMetadata->size = 0;
Maheshwar Ajja0de87d72019-03-11 11:44:30 -0700385 if (data->cvpMetadata.size <= CVP_METADATA_SIZE) {
Maheshwar Ajja10690722019-01-30 14:12:45 -0800386 cvpMetadata->size = data->cvpMetadata.size;
387 memcpy(cvpMetadata->payload, data->cvpMetadata.payload,
388 data->cvpMetadata.size);
Akshata Sahukaraab1e562019-07-30 13:57:25 -0700389 cvpMetadata->capture_frame_rate = data->cvpMetadata.capture_frame_rate;
390 cvpMetadata->cvp_frame_rate = data->cvpMetadata.cvp_frame_rate;
Akshata Sahukar8a8657c2019-10-04 20:29:25 -0700391 cvpMetadata->flags = data->cvpMetadata.flags;
392 memcpy(cvpMetadata->reserved, data->cvpMetadata.reserved,
393 (8 * sizeof(uint32_t)));
Maheshwar Ajja10690722019-01-30 14:12:45 -0800394 ret = 0;
395 }
396 }
397 break;
Mihir Ganu3d401542019-04-03 11:08:06 -0700398 case GET_VIDEO_HISTOGRAM_STATS:
399 if (data->operation & SET_VIDEO_HISTOGRAM_STATS) {
400 struct VideoHistogramMetadata *vidstats = (struct VideoHistogramMetadata *)param;
401 vidstats->stat_len = 0;
402 if (data->video_histogram_stats.stat_len <= VIDEO_HISTOGRAM_STATS_SIZE) {
403 memcpy(vidstats->stats_info,
404 data->video_histogram_stats.stats_info, VIDEO_HISTOGRAM_STATS_SIZE);
405 vidstats->stat_len = data->video_histogram_stats.stat_len;
406 vidstats->frame_type = data->video_histogram_stats.frame_type;
407 vidstats->display_width = data->video_histogram_stats.display_width;
408 vidstats->display_height = data->video_histogram_stats.display_height;
409 vidstats->decode_width = data->video_histogram_stats.decode_width;
410 vidstats->decode_height = data->video_histogram_stats.decode_height;
411 ret = 0;
412 }
413 }
414 break;
feifanz9cc23032016-03-23 18:48:56 +0800415 default:
416 ALOGE("Unknown paramType %d", paramType);
417 break;
418 }
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800419 return ret;
feifanz9cc23032016-03-23 18:48:56 +0800420}
421
422int copyMetaData(struct private_handle_t *src, struct private_handle_t *dst) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400423 auto err = validateAndMap(src);
424 if (err != 0)
425 return err;
426
427 err = validateAndMap(dst);
428 if (err != 0)
429 return err;
feifanz9cc23032016-03-23 18:48:56 +0800430
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400431 MetaData_t *src_data = reinterpret_cast <MetaData_t *>(src->base_metadata);
432 MetaData_t *dst_data = reinterpret_cast <MetaData_t *>(dst->base_metadata);
Naseer Ahmede9b87622017-07-06 12:53:15 -0400433 *dst_data = *src_data;
feifanz9cc23032016-03-23 18:48:56 +0800434 return 0;
435}
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400436
437int copyMetaDataVaToHandle(MetaData_t *src_data, struct private_handle_t *dst) {
438 int err = -EINVAL;
439 if (src_data == nullptr)
440 return err;
441
442 err = validateAndMap(dst);
443 if (err != 0)
444 return err;
445
446 MetaData_t *dst_data = reinterpret_cast <MetaData_t *>(dst->base_metadata);
Naseer Ahmede9b87622017-07-06 12:53:15 -0400447 *dst_data = *src_data;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400448 return 0;
449}
450
451int copyMetaDataHandleToVa(struct private_handle_t *src, MetaData_t *dst_data) {
452 int err = -EINVAL;
453 if (dst_data == nullptr)
454 return err;
455
456 err = validateAndMap(src);
457 if (err != 0)
458 return err;
459
460 MetaData_t *src_data = reinterpret_cast <MetaData_t *>(src->base_metadata);
Naseer Ahmede9b87622017-07-06 12:53:15 -0400461 *dst_data = *src_data;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400462 return 0;
463}
464
465int copyMetaDataVaToVa(MetaData_t *src_data, MetaData_t *dst_data) {
466 int err = -EINVAL;
467 if (src_data == nullptr)
468 return err;
469
470 if (dst_data == nullptr)
471 return err;
472
Naseer Ahmede9b87622017-07-06 12:53:15 -0400473 *dst_data = *src_data;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400474 return 0;
475}
476
Praveen Chavan5e5679a2018-11-18 11:14:19 -0800477int setMetaDataAndUnmap(struct private_handle_t *handle, enum DispParamType paramType,
478 void *param) {
479 auto ret = setMetaData(handle, paramType, param);
480 unmapAndReset(handle);
481 return ret;
482}
483
484int getMetaDataAndUnmap(struct private_handle_t *handle,
485 enum DispFetchParamType paramType,
486 void *param) {
487 auto ret = getMetaData(handle, paramType, param);
488 unmapAndReset(handle);
489 return ret;
490}