blob: 1810101a2e29a7ddb73dcb19a688e1df27aa96d0 [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;
Naseer Ahmed8d1434a2017-03-31 15:31:18 -0400148 // param unset
149 return 0;
Prabhanjan Kandula1ef8e6e2016-08-19 11:46:47 +0530150 }
151
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -0800152 data->operation |= paramType;
153 switch (paramType) {
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -0800154 case PP_PARAM_INTERLACED:
155 data->interlaced = *((int32_t *)param);
156 break;
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -0500157 case UPDATE_BUFFER_GEOMETRY: {
158 BufferDim_t in = *((BufferDim_t *)param);
159 data->crop = {0, 0, in.sliceWidth, in.sliceHeight};
160 break;
161 }
Arun Kumar K.Ra727a882014-08-20 17:14:26 -0700162 case UPDATE_REFRESH_RATE:
feifanz9cc23032016-03-23 18:48:56 +0800163 data->refreshrate = *((float *)param);
Arun Kumar K.Ra727a882014-08-20 17:14:26 -0700164 break;
Tharaga Balachandrana6480a42020-01-20 13:58:43 -0500165 case UPDATE_COLOR_SPACE: {
166 ColorMetaData color;
167 if (!colorSpaceToColorMetadata(*((ColorSpace_t *)param), &color)) {
168 data->color = color;
169 }
170 break;
171 }
Arun Kumar K.Rda2f69b2014-09-30 15:45:37 -0700172 case MAP_SECURE_BUFFER:
173 data->mapSecureBuffer = *((int32_t *)param);
174 break;
Naseer Ahmed3324ff72015-01-21 17:14:44 -0500175 case S3D_FORMAT:
176 data->s3dFormat = *((uint32_t *)param);
177 break;
Sushil Chauhane7acc3c2015-06-23 16:22:30 -0700178 case LINEAR_FORMAT:
179 data->linearFormat = *((uint32_t *)param);
180 break;
Saurabh Shah95f83682015-10-16 10:30:04 -0700181 case SET_SINGLE_BUFFER_MODE:
Saurabh Shahb8067a42015-11-06 16:52:02 -0800182 data->isSingleBufferMode = *((uint32_t *)param);
Saurabh Shah95f83682015-10-16 10:30:04 -0700183 break;
Naseer Ahmede8f254d2016-08-02 20:06:40 -0400184 case SET_VT_TIMESTAMP:
185 data->vtTimeStamp = *((uint64_t *)param);
186 break;
Arun Kumar K.Rb2771bf2016-10-03 21:38:23 -0700187 case COLOR_METADATA:
188 data->color = *((ColorMetaData *)param);
Arun Kumar K.Rb2771bf2016-10-03 21:38:23 -0700189 break;
Gurunath Ramaswamyb494c022017-07-04 13:47:46 -0700190 case SET_UBWC_CR_STATS_INFO: {
191 struct UBWCStats* stats = (struct UBWCStats*)param;
192 int numelems = sizeof(data->ubwcCRStats) / sizeof(struct UBWCStats);
193 for (int i = 0; i < numelems; i++) {
194 data->ubwcCRStats[i] = stats[i];
195 }
196 break;
197 }
Ashwini Rao6e616962017-11-28 12:12:46 -0800198 case SET_VIDEO_PERF_MODE:
199 data->isVideoPerfMode = *((uint32_t *)param);
200 break;
Mohan Pallaka5d814432018-08-01 10:40:13 -0700201 case SET_GRAPHICS_METADATA: {
202 GraphicsMetadata payload = *((GraphicsMetadata*)(param));
203 data->graphics_metadata.size = payload.size;
204 memcpy(data->graphics_metadata.data, payload.data,
205 sizeof(data->graphics_metadata.data));
206 break;
207 }
Maheshwar Ajja10690722019-01-30 14:12:45 -0800208 case SET_CVP_METADATA: {
209 struct CVPMetadata *cvpMetadata = (struct CVPMetadata *)param;
Maheshwar Ajja0de87d72019-03-11 11:44:30 -0700210 if (cvpMetadata->size <= CVP_METADATA_SIZE) {
Maheshwar Ajja10690722019-01-30 14:12:45 -0800211 data->cvpMetadata.size = cvpMetadata->size;
212 memcpy(data->cvpMetadata.payload, cvpMetadata->payload,
213 cvpMetadata->size);
Akshata Sahukaraab1e562019-07-30 13:57:25 -0700214 data->cvpMetadata.capture_frame_rate = cvpMetadata->capture_frame_rate;
215 data->cvpMetadata.cvp_frame_rate = cvpMetadata->cvp_frame_rate;
Akshata Sahukar8a8657c2019-10-04 20:29:25 -0700216 data->cvpMetadata.flags = cvpMetadata->flags;
217 memcpy(data->cvpMetadata.reserved, cvpMetadata->reserved,
218 (8 * sizeof(uint32_t)));
Maheshwar Ajja10690722019-01-30 14:12:45 -0800219 } else {
220 data->operation &= ~(paramType);
221 ALOGE("%s: cvp metadata length %d is more than max size %d",
222 __func__, cvpMetadata->size, CVP_METADATA_SIZE);
223 return -EINVAL;
224 }
225 break;
226 }
Mihir Ganu3d401542019-04-03 11:08:06 -0700227 case SET_VIDEO_HISTOGRAM_STATS: {
228 struct VideoHistogramMetadata *vidstats = (struct VideoHistogramMetadata *)param;
229 if (vidstats->stat_len <= VIDEO_HISTOGRAM_STATS_SIZE) {
230 memcpy(data->video_histogram_stats.stats_info,
231 vidstats->stats_info, VIDEO_HISTOGRAM_STATS_SIZE);
232 data->video_histogram_stats.stat_len = vidstats->stat_len;
233 data->video_histogram_stats.frame_type = vidstats->frame_type;
234 data->video_histogram_stats.display_width = vidstats->display_width;
235 data->video_histogram_stats.display_height = vidstats->display_height;
236 data->video_histogram_stats.decode_width = vidstats->decode_width;
237 data->video_histogram_stats.decode_height = vidstats->decode_height;
238 } else {
239 data->operation &= ~(paramType);
240 ALOGE("%s: video stats length %u is more than max size %u",
241 __func__, vidstats->stat_len, VIDEO_HISTOGRAM_STATS_SIZE);
242 return -EINVAL;
243 }
244 break;
245 }
246 default:
Ray Zhang8ace84d2016-08-08 19:36:03 +0800247 ALOGE("Unknown paramType %d", paramType);
248 break;
249 }
Ray Zhang8ace84d2016-08-08 19:36:03 +0800250 return 0;
251}
252
253int clearMetaData(private_handle_t *handle, DispParamType paramType) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400254 auto err = validateAndMap(handle);
255 if (err != 0)
256 return err;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400257 return clearMetaDataVa(reinterpret_cast<MetaData_t *>(handle->base_metadata),
258 paramType);
259}
Ray Zhang8ace84d2016-08-08 19:36:03 +0800260
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400261int clearMetaDataVa(MetaData_t *data, DispParamType paramType) {
262 if (data == nullptr)
263 return -EINVAL;
Ray Zhang8ace84d2016-08-08 19:36:03 +0800264 data->operation &= ~paramType;
265 switch (paramType) {
Priyanka Gujjula1db74712018-11-27 17:38:26 +0530266 case SET_VIDEO_PERF_MODE:
267 data->isVideoPerfMode = 0;
268 break;
Maheshwar Ajja10690722019-01-30 14:12:45 -0800269 case SET_CVP_METADATA:
270 data->cvpMetadata.size = 0;
271 break;
Mihir Ganu3d401542019-04-03 11:08:06 -0700272 case SET_VIDEO_HISTOGRAM_STATS:
273 data->video_histogram_stats.stat_len = 0;
274 break;
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -0800275 default:
276 ALOGE("Unknown paramType %d", paramType);
277 break;
278 }
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -0800279 return 0;
280}
feifanz9cc23032016-03-23 18:48:56 +0800281
282int getMetaData(private_handle_t *handle, DispFetchParamType paramType,
283 void *param) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400284 int ret = validateAndMap(handle);
285 if (ret != 0)
286 return ret;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400287 return getMetaDataVa(reinterpret_cast<MetaData_t *>(handle->base_metadata),
288 paramType, param);
289}
290
291int getMetaDataVa(MetaData_t *data, DispFetchParamType paramType,
292 void *param) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400293 // Make sure we send 0 only if the operation queried is present
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400294 int ret = -EINVAL;
295 if (data == nullptr)
296 return ret;
Gurunath Ramaswamyb494c022017-07-04 13:47:46 -0700297 if (param == nullptr)
298 return ret;
feifanz9cc23032016-03-23 18:48:56 +0800299
feifanz9cc23032016-03-23 18:48:56 +0800300 switch (paramType) {
301 case GET_PP_PARAM_INTERLACED:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800302 if (data->operation & PP_PARAM_INTERLACED) {
303 *((int32_t *)param) = data->interlaced;
304 ret = 0;
305 }
feifanz9cc23032016-03-23 18:48:56 +0800306 break;
307 case GET_BUFFER_GEOMETRY:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800308 if (data->operation & UPDATE_BUFFER_GEOMETRY) {
Tharaga Balachandrana069a7e2020-01-08 17:22:12 -0500309 *((BufferDim_t *)param) = {data->crop.right, data->crop.bottom};
310 ret = 0;
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800311 }
feifanz9cc23032016-03-23 18:48:56 +0800312 break;
313 case GET_REFRESH_RATE:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800314 if (data->operation & UPDATE_REFRESH_RATE) {
315 *((float *)param) = data->refreshrate;
316 ret = 0;
317 }
feifanz9cc23032016-03-23 18:48:56 +0800318 break;
319 case GET_COLOR_SPACE:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800320 if (data->operation & UPDATE_COLOR_SPACE) {
Tharaga Balachandrana6480a42020-01-20 13:58:43 -0500321 ColorSpace_t color_space;
322 if (!colorMetaDataToColorSpace(data->color, &color_space)) {
323 *((ColorSpace_t *)param) = color_space;
324 }
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800325 ret = 0;
326 }
feifanz9cc23032016-03-23 18:48:56 +0800327 break;
328 case GET_MAP_SECURE_BUFFER:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800329 if (data->operation & MAP_SECURE_BUFFER) {
330 *((int32_t *)param) = data->mapSecureBuffer;
331 ret = 0;
332 }
feifanz9cc23032016-03-23 18:48:56 +0800333 break;
334 case GET_S3D_FORMAT:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800335 if (data->operation & S3D_FORMAT) {
336 *((uint32_t *)param) = data->s3dFormat;
337 ret = 0;
338 }
feifanz9cc23032016-03-23 18:48:56 +0800339 break;
340 case GET_LINEAR_FORMAT:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800341 if (data->operation & LINEAR_FORMAT) {
342 *((uint32_t *)param) = data->linearFormat;
343 ret = 0;
344 }
feifanz9cc23032016-03-23 18:48:56 +0800345 break;
feifanz9cc23032016-03-23 18:48:56 +0800346 case GET_SINGLE_BUFFER_MODE:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800347 if (data->operation & SET_SINGLE_BUFFER_MODE) {
348 *((uint32_t *)param) = data->isSingleBufferMode;
349 ret = 0;
350 }
feifanz9cc23032016-03-23 18:48:56 +0800351 break;
Naseer Ahmede8f254d2016-08-02 20:06:40 -0400352 case GET_VT_TIMESTAMP:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800353 if (data->operation & SET_VT_TIMESTAMP) {
354 *((uint64_t *)param) = data->vtTimeStamp;
355 ret = 0;
356 }
Naseer Ahmede8f254d2016-08-02 20:06:40 -0400357 break;
Arun Kumar K.Rb2771bf2016-10-03 21:38:23 -0700358 case GET_COLOR_METADATA:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800359 if (data->operation & COLOR_METADATA) {
360 *((ColorMetaData *)param) = data->color;
361 ret = 0;
362 }
Arun Kumar K.Rb2771bf2016-10-03 21:38:23 -0700363 break;
Gurunath Ramaswamyb494c022017-07-04 13:47:46 -0700364 case GET_UBWC_CR_STATS_INFO:
365 if (data->operation & SET_UBWC_CR_STATS_INFO) {
366 struct UBWCStats* stats = (struct UBWCStats*)param;
367 int numelems = sizeof(data->ubwcCRStats) / sizeof(struct UBWCStats);
368 for (int i = 0; i < numelems; i++) {
369 stats[i] = data->ubwcCRStats[i];
370 }
371 ret = 0;
372 }
373 break;
Ashwini Rao6e616962017-11-28 12:12:46 -0800374 case GET_VIDEO_PERF_MODE:
375 if (data->operation & SET_VIDEO_PERF_MODE) {
376 *((uint32_t *)param) = data->isVideoPerfMode;
377 ret = 0;
378 }
379 break;
Mohan Pallaka5d814432018-08-01 10:40:13 -0700380 case GET_GRAPHICS_METADATA:
381 if (data->operation & SET_GRAPHICS_METADATA) {
382 memcpy(param, data->graphics_metadata.data, sizeof(data->graphics_metadata.data));
383 ret = 0;
384 }
385 break;
Maheshwar Ajja10690722019-01-30 14:12:45 -0800386 case GET_CVP_METADATA:
387 if (data->operation & SET_CVP_METADATA) {
388 struct CVPMetadata *cvpMetadata = (struct CVPMetadata *)param;
389 cvpMetadata->size = 0;
Maheshwar Ajja0de87d72019-03-11 11:44:30 -0700390 if (data->cvpMetadata.size <= CVP_METADATA_SIZE) {
Maheshwar Ajja10690722019-01-30 14:12:45 -0800391 cvpMetadata->size = data->cvpMetadata.size;
392 memcpy(cvpMetadata->payload, data->cvpMetadata.payload,
393 data->cvpMetadata.size);
Akshata Sahukaraab1e562019-07-30 13:57:25 -0700394 cvpMetadata->capture_frame_rate = data->cvpMetadata.capture_frame_rate;
395 cvpMetadata->cvp_frame_rate = data->cvpMetadata.cvp_frame_rate;
Akshata Sahukar8a8657c2019-10-04 20:29:25 -0700396 cvpMetadata->flags = data->cvpMetadata.flags;
397 memcpy(cvpMetadata->reserved, data->cvpMetadata.reserved,
398 (8 * sizeof(uint32_t)));
Maheshwar Ajja10690722019-01-30 14:12:45 -0800399 ret = 0;
400 }
401 }
402 break;
Mihir Ganu3d401542019-04-03 11:08:06 -0700403 case GET_VIDEO_HISTOGRAM_STATS:
404 if (data->operation & SET_VIDEO_HISTOGRAM_STATS) {
405 struct VideoHistogramMetadata *vidstats = (struct VideoHistogramMetadata *)param;
406 vidstats->stat_len = 0;
407 if (data->video_histogram_stats.stat_len <= VIDEO_HISTOGRAM_STATS_SIZE) {
408 memcpy(vidstats->stats_info,
409 data->video_histogram_stats.stats_info, VIDEO_HISTOGRAM_STATS_SIZE);
410 vidstats->stat_len = data->video_histogram_stats.stat_len;
411 vidstats->frame_type = data->video_histogram_stats.frame_type;
412 vidstats->display_width = data->video_histogram_stats.display_width;
413 vidstats->display_height = data->video_histogram_stats.display_height;
414 vidstats->decode_width = data->video_histogram_stats.decode_width;
415 vidstats->decode_height = data->video_histogram_stats.decode_height;
416 ret = 0;
417 }
418 }
419 break;
feifanz9cc23032016-03-23 18:48:56 +0800420 default:
421 ALOGE("Unknown paramType %d", paramType);
422 break;
423 }
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800424 return ret;
feifanz9cc23032016-03-23 18:48:56 +0800425}
426
427int copyMetaData(struct private_handle_t *src, struct private_handle_t *dst) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400428 auto err = validateAndMap(src);
429 if (err != 0)
430 return err;
431
432 err = validateAndMap(dst);
433 if (err != 0)
434 return err;
feifanz9cc23032016-03-23 18:48:56 +0800435
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400436 MetaData_t *src_data = reinterpret_cast <MetaData_t *>(src->base_metadata);
437 MetaData_t *dst_data = reinterpret_cast <MetaData_t *>(dst->base_metadata);
Naseer Ahmede9b87622017-07-06 12:53:15 -0400438 *dst_data = *src_data;
feifanz9cc23032016-03-23 18:48:56 +0800439 return 0;
440}
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400441
442int copyMetaDataVaToHandle(MetaData_t *src_data, struct private_handle_t *dst) {
443 int err = -EINVAL;
444 if (src_data == nullptr)
445 return err;
446
447 err = validateAndMap(dst);
448 if (err != 0)
449 return err;
450
451 MetaData_t *dst_data = reinterpret_cast <MetaData_t *>(dst->base_metadata);
Naseer Ahmede9b87622017-07-06 12:53:15 -0400452 *dst_data = *src_data;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400453 return 0;
454}
455
456int copyMetaDataHandleToVa(struct private_handle_t *src, MetaData_t *dst_data) {
457 int err = -EINVAL;
458 if (dst_data == nullptr)
459 return err;
460
461 err = validateAndMap(src);
462 if (err != 0)
463 return err;
464
465 MetaData_t *src_data = reinterpret_cast <MetaData_t *>(src->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 copyMetaDataVaToVa(MetaData_t *src_data, MetaData_t *dst_data) {
471 int err = -EINVAL;
472 if (src_data == nullptr)
473 return err;
474
475 if (dst_data == nullptr)
476 return err;
477
Naseer Ahmede9b87622017-07-06 12:53:15 -0400478 *dst_data = *src_data;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400479 return 0;
480}
481
Praveen Chavan5e5679a2018-11-18 11:14:19 -0800482int setMetaDataAndUnmap(struct private_handle_t *handle, enum DispParamType paramType,
483 void *param) {
484 auto ret = setMetaData(handle, paramType, param);
485 unmapAndReset(handle);
486 return ret;
487}
488
489int getMetaDataAndUnmap(struct private_handle_t *handle,
490 enum DispFetchParamType paramType,
491 void *param) {
492 auto ret = getMetaData(handle, paramType, param);
493 unmapAndReset(handle);
494 return ret;
495}