blob: 6434ea3b026295c3be026509bfb6fe84f2e8b631 [file] [log] [blame]
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -08001/*
Akshata Sahukaraab1e562019-07-30 13:57:25 -07002 * Copyright (c) 2012-2019, 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
Naseer Ahmed2e6bee12017-04-13 22:45:54 -040038unsigned long getMetaDataSize() {
39 return static_cast<unsigned long>(ROUND_UP_PAGESIZE(sizeof(MetaData_t)));
40}
41
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -040042static int validateAndMap(private_handle_t* handle) {
Prabhanjan Kandula1ef8e6e2016-08-19 11:46:47 +053043 if (private_handle_t::validate(handle)) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -040044 ALOGE("%s: Private handle is invalid - handle:%p", __func__, handle);
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -080045 return -1;
46 }
Naseer Ahmed7aff2612017-10-05 20:39:05 -040047 if (handle->fd_metadata < 0) {
48 // Silently return, metadata cannot be used
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -080049 return -1;
50 }
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -040051
52 if (!handle->base_metadata) {
Naseer Ahmed2e6bee12017-04-13 22:45:54 -040053 auto size = getMetaDataSize();
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -040054 void *base = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED,
55 handle->fd_metadata, 0);
56 if (base == reinterpret_cast<void*>(MAP_FAILED)) {
57 ALOGE("%s: metadata mmap failed - handle:%p fd: %d err: %s",
58 __func__, handle, handle->fd_metadata, strerror(errno));
59
60 return -1;
61 }
62 handle->base_metadata = (uintptr_t) base;
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -080063 }
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -040064 return 0;
65}
66
Praveen Chavan5e5679a2018-11-18 11:14:19 -080067static void unmapAndReset(private_handle_t *handle) {
68 if (private_handle_t::validate(handle) == 0 && handle->base_metadata) {
69 munmap(reinterpret_cast<void *>(handle->base_metadata), getMetaDataSize());
70 handle->base_metadata = 0;
71 }
72}
73
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -040074int setMetaData(private_handle_t *handle, DispParamType paramType,
Naseer Ahmed2e6bee12017-04-13 22:45:54 -040075 void *param) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -040076 auto err = validateAndMap(handle);
77 if (err != 0)
78 return err;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -040079 return setMetaDataVa(reinterpret_cast<MetaData_t*>(handle->base_metadata),
80 paramType, param);
81}
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -040082
Naseer Ahmed2e6bee12017-04-13 22:45:54 -040083int setMetaDataVa(MetaData_t *data, DispParamType paramType,
84 void *param) {
85 if (data == nullptr)
86 return -EINVAL;
Prabhanjan Kandula1ef8e6e2016-08-19 11:46:47 +053087 // If parameter is NULL reset the specific MetaData Key
88 if (!param) {
89 data->operation &= ~paramType;
Naseer Ahmed8d1434a2017-03-31 15:31:18 -040090 // param unset
91 return 0;
Prabhanjan Kandula1ef8e6e2016-08-19 11:46:47 +053092 }
93
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -080094 data->operation |= paramType;
95 switch (paramType) {
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -080096 case PP_PARAM_INTERLACED:
97 data->interlaced = *((int32_t *)param);
98 break;
Ramkumar Radhakrishnan92f3abe2013-06-05 13:52:40 -070099 case UPDATE_BUFFER_GEOMETRY:
Dileep Marchya2295fdd2015-08-12 17:04:14 -0700100 data->bufferDim = *((BufferDim_t *)param);
Arun Kumar K.Ra727a882014-08-20 17:14:26 -0700101 break;
102 case UPDATE_REFRESH_RATE:
feifanz9cc23032016-03-23 18:48:56 +0800103 data->refreshrate = *((float *)param);
Arun Kumar K.Ra727a882014-08-20 17:14:26 -0700104 break;
Shuzhen Wang0d113482014-01-28 16:10:22 -0800105 case UPDATE_COLOR_SPACE:
106 data->colorSpace = *((ColorSpace_t *)param);
107 break;
Arun Kumar K.Rda2f69b2014-09-30 15:45:37 -0700108 case MAP_SECURE_BUFFER:
109 data->mapSecureBuffer = *((int32_t *)param);
110 break;
Naseer Ahmed3324ff72015-01-21 17:14:44 -0500111 case S3D_FORMAT:
112 data->s3dFormat = *((uint32_t *)param);
113 break;
Sushil Chauhane7acc3c2015-06-23 16:22:30 -0700114 case LINEAR_FORMAT:
115 data->linearFormat = *((uint32_t *)param);
116 break;
Dileep Marchya1a7e1f12015-09-25 19:11:57 -0700117 case SET_IGC:
118 data->igc = *((IGC_t *)param);
119 break;
Saurabh Shah95f83682015-10-16 10:30:04 -0700120 case SET_SINGLE_BUFFER_MODE:
Saurabh Shahb8067a42015-11-06 16:52:02 -0800121 data->isSingleBufferMode = *((uint32_t *)param);
Saurabh Shah95f83682015-10-16 10:30:04 -0700122 break;
Ray Zhang8ace84d2016-08-08 19:36:03 +0800123 case SET_S3D_COMP:
124 data->s3dComp = *((S3DGpuComp_t *)param);
125 break;
Naseer Ahmede8f254d2016-08-02 20:06:40 -0400126 case SET_VT_TIMESTAMP:
127 data->vtTimeStamp = *((uint64_t *)param);
128 break;
Arun Kumar K.Rb2771bf2016-10-03 21:38:23 -0700129 case COLOR_METADATA:
130 data->color = *((ColorMetaData *)param);
Arun Kumar K.Rb2771bf2016-10-03 21:38:23 -0700131 break;
Gurunath Ramaswamyb494c022017-07-04 13:47:46 -0700132 case SET_UBWC_CR_STATS_INFO: {
133 struct UBWCStats* stats = (struct UBWCStats*)param;
134 int numelems = sizeof(data->ubwcCRStats) / sizeof(struct UBWCStats);
135 for (int i = 0; i < numelems; i++) {
136 data->ubwcCRStats[i] = stats[i];
137 }
138 break;
139 }
Ashwini Rao6e616962017-11-28 12:12:46 -0800140 case SET_VIDEO_PERF_MODE:
141 data->isVideoPerfMode = *((uint32_t *)param);
142 break;
Mohan Pallaka5d814432018-08-01 10:40:13 -0700143 case SET_GRAPHICS_METADATA: {
144 GraphicsMetadata payload = *((GraphicsMetadata*)(param));
145 data->graphics_metadata.size = payload.size;
146 memcpy(data->graphics_metadata.data, payload.data,
147 sizeof(data->graphics_metadata.data));
148 break;
149 }
Maheshwar Ajja10690722019-01-30 14:12:45 -0800150 case SET_CVP_METADATA: {
151 struct CVPMetadata *cvpMetadata = (struct CVPMetadata *)param;
Maheshwar Ajja0de87d72019-03-11 11:44:30 -0700152 if (cvpMetadata->size <= CVP_METADATA_SIZE) {
Maheshwar Ajja10690722019-01-30 14:12:45 -0800153 data->cvpMetadata.size = cvpMetadata->size;
154 memcpy(data->cvpMetadata.payload, cvpMetadata->payload,
155 cvpMetadata->size);
Akshata Sahukaraab1e562019-07-30 13:57:25 -0700156 data->cvpMetadata.capture_frame_rate = cvpMetadata->capture_frame_rate;
157 data->cvpMetadata.cvp_frame_rate = cvpMetadata->cvp_frame_rate;
Akshata Sahukar8a8657c2019-10-04 20:29:25 -0700158 data->cvpMetadata.flags = cvpMetadata->flags;
159 memcpy(data->cvpMetadata.reserved, cvpMetadata->reserved,
160 (8 * sizeof(uint32_t)));
Maheshwar Ajja10690722019-01-30 14:12:45 -0800161 } else {
162 data->operation &= ~(paramType);
163 ALOGE("%s: cvp metadata length %d is more than max size %d",
164 __func__, cvpMetadata->size, CVP_METADATA_SIZE);
165 return -EINVAL;
166 }
167 break;
168 }
Mihir Ganu3d401542019-04-03 11:08:06 -0700169 case SET_VIDEO_HISTOGRAM_STATS: {
170 struct VideoHistogramMetadata *vidstats = (struct VideoHistogramMetadata *)param;
171 if (vidstats->stat_len <= VIDEO_HISTOGRAM_STATS_SIZE) {
172 memcpy(data->video_histogram_stats.stats_info,
173 vidstats->stats_info, VIDEO_HISTOGRAM_STATS_SIZE);
174 data->video_histogram_stats.stat_len = vidstats->stat_len;
175 data->video_histogram_stats.frame_type = vidstats->frame_type;
176 data->video_histogram_stats.display_width = vidstats->display_width;
177 data->video_histogram_stats.display_height = vidstats->display_height;
178 data->video_histogram_stats.decode_width = vidstats->decode_width;
179 data->video_histogram_stats.decode_height = vidstats->decode_height;
180 } else {
181 data->operation &= ~(paramType);
182 ALOGE("%s: video stats length %u is more than max size %u",
183 __func__, vidstats->stat_len, VIDEO_HISTOGRAM_STATS_SIZE);
184 return -EINVAL;
185 }
186 break;
187 }
188 default:
Ray Zhang8ace84d2016-08-08 19:36:03 +0800189 ALOGE("Unknown paramType %d", paramType);
190 break;
191 }
Ray Zhang8ace84d2016-08-08 19:36:03 +0800192 return 0;
193}
194
195int clearMetaData(private_handle_t *handle, DispParamType paramType) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400196 auto err = validateAndMap(handle);
197 if (err != 0)
198 return err;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400199 return clearMetaDataVa(reinterpret_cast<MetaData_t *>(handle->base_metadata),
200 paramType);
201}
Ray Zhang8ace84d2016-08-08 19:36:03 +0800202
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400203int clearMetaDataVa(MetaData_t *data, DispParamType paramType) {
204 if (data == nullptr)
205 return -EINVAL;
Ray Zhang8ace84d2016-08-08 19:36:03 +0800206 data->operation &= ~paramType;
207 switch (paramType) {
208 case SET_S3D_COMP:
209 data->s3dComp.displayId = -1;
210 data->s3dComp.s3dMode = 0;
211 break;
Priyanka Gujjula1db74712018-11-27 17:38:26 +0530212 case SET_VIDEO_PERF_MODE:
213 data->isVideoPerfMode = 0;
214 break;
Maheshwar Ajja10690722019-01-30 14:12:45 -0800215 case SET_CVP_METADATA:
216 data->cvpMetadata.size = 0;
217 break;
Mihir Ganu3d401542019-04-03 11:08:06 -0700218 case SET_VIDEO_HISTOGRAM_STATS:
219 data->video_histogram_stats.stat_len = 0;
220 break;
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -0800221 default:
222 ALOGE("Unknown paramType %d", paramType);
223 break;
224 }
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -0800225 return 0;
226}
feifanz9cc23032016-03-23 18:48:56 +0800227
228int getMetaData(private_handle_t *handle, DispFetchParamType paramType,
229 void *param) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400230 int ret = validateAndMap(handle);
231 if (ret != 0)
232 return ret;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400233 return getMetaDataVa(reinterpret_cast<MetaData_t *>(handle->base_metadata),
234 paramType, param);
235}
236
237int getMetaDataVa(MetaData_t *data, DispFetchParamType paramType,
238 void *param) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400239 // Make sure we send 0 only if the operation queried is present
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400240 int ret = -EINVAL;
241 if (data == nullptr)
242 return ret;
Gurunath Ramaswamyb494c022017-07-04 13:47:46 -0700243 if (param == nullptr)
244 return ret;
feifanz9cc23032016-03-23 18:48:56 +0800245
feifanz9cc23032016-03-23 18:48:56 +0800246 switch (paramType) {
247 case GET_PP_PARAM_INTERLACED:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800248 if (data->operation & PP_PARAM_INTERLACED) {
249 *((int32_t *)param) = data->interlaced;
250 ret = 0;
251 }
feifanz9cc23032016-03-23 18:48:56 +0800252 break;
253 case GET_BUFFER_GEOMETRY:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800254 if (data->operation & UPDATE_BUFFER_GEOMETRY) {
255 *((BufferDim_t *)param) = data->bufferDim;
256 ret = 0;
257 }
feifanz9cc23032016-03-23 18:48:56 +0800258 break;
259 case GET_REFRESH_RATE:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800260 if (data->operation & UPDATE_REFRESH_RATE) {
261 *((float *)param) = data->refreshrate;
262 ret = 0;
263 }
feifanz9cc23032016-03-23 18:48:56 +0800264 break;
265 case GET_COLOR_SPACE:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800266 if (data->operation & UPDATE_COLOR_SPACE) {
267 *((ColorSpace_t *)param) = data->colorSpace;
268 ret = 0;
269 }
feifanz9cc23032016-03-23 18:48:56 +0800270 break;
271 case GET_MAP_SECURE_BUFFER:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800272 if (data->operation & MAP_SECURE_BUFFER) {
273 *((int32_t *)param) = data->mapSecureBuffer;
274 ret = 0;
275 }
feifanz9cc23032016-03-23 18:48:56 +0800276 break;
277 case GET_S3D_FORMAT:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800278 if (data->operation & S3D_FORMAT) {
279 *((uint32_t *)param) = data->s3dFormat;
280 ret = 0;
281 }
feifanz9cc23032016-03-23 18:48:56 +0800282 break;
283 case GET_LINEAR_FORMAT:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800284 if (data->operation & LINEAR_FORMAT) {
285 *((uint32_t *)param) = data->linearFormat;
286 ret = 0;
287 }
feifanz9cc23032016-03-23 18:48:56 +0800288 break;
289 case GET_IGC:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800290 if (data->operation & SET_IGC) {
291 *((IGC_t *)param) = data->igc;
292 ret = 0;
293 }
feifanz9cc23032016-03-23 18:48:56 +0800294 break;
295 case GET_SINGLE_BUFFER_MODE:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800296 if (data->operation & SET_SINGLE_BUFFER_MODE) {
297 *((uint32_t *)param) = data->isSingleBufferMode;
298 ret = 0;
299 }
feifanz9cc23032016-03-23 18:48:56 +0800300 break;
Ray Zhang8ace84d2016-08-08 19:36:03 +0800301 case GET_S3D_COMP:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800302 if (data->operation & SET_S3D_COMP) {
303 *((S3DGpuComp_t *)param) = data->s3dComp;
304 ret = 0;
305 }
Ray Zhang8ace84d2016-08-08 19:36:03 +0800306 break;
Naseer Ahmede8f254d2016-08-02 20:06:40 -0400307 case GET_VT_TIMESTAMP:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800308 if (data->operation & SET_VT_TIMESTAMP) {
309 *((uint64_t *)param) = data->vtTimeStamp;
310 ret = 0;
311 }
Naseer Ahmede8f254d2016-08-02 20:06:40 -0400312 break;
Arun Kumar K.Rb2771bf2016-10-03 21:38:23 -0700313 case GET_COLOR_METADATA:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800314 if (data->operation & COLOR_METADATA) {
315 *((ColorMetaData *)param) = data->color;
316 ret = 0;
317 }
Arun Kumar K.Rb2771bf2016-10-03 21:38:23 -0700318 break;
Gurunath Ramaswamyb494c022017-07-04 13:47:46 -0700319 case GET_UBWC_CR_STATS_INFO:
320 if (data->operation & SET_UBWC_CR_STATS_INFO) {
321 struct UBWCStats* stats = (struct UBWCStats*)param;
322 int numelems = sizeof(data->ubwcCRStats) / sizeof(struct UBWCStats);
323 for (int i = 0; i < numelems; i++) {
324 stats[i] = data->ubwcCRStats[i];
325 }
326 ret = 0;
327 }
328 break;
Ashwini Rao6e616962017-11-28 12:12:46 -0800329 case GET_VIDEO_PERF_MODE:
330 if (data->operation & SET_VIDEO_PERF_MODE) {
331 *((uint32_t *)param) = data->isVideoPerfMode;
332 ret = 0;
333 }
334 break;
Mohan Pallaka5d814432018-08-01 10:40:13 -0700335 case GET_GRAPHICS_METADATA:
336 if (data->operation & SET_GRAPHICS_METADATA) {
337 memcpy(param, data->graphics_metadata.data, sizeof(data->graphics_metadata.data));
338 ret = 0;
339 }
340 break;
Maheshwar Ajja10690722019-01-30 14:12:45 -0800341 case GET_CVP_METADATA:
342 if (data->operation & SET_CVP_METADATA) {
343 struct CVPMetadata *cvpMetadata = (struct CVPMetadata *)param;
344 cvpMetadata->size = 0;
Maheshwar Ajja0de87d72019-03-11 11:44:30 -0700345 if (data->cvpMetadata.size <= CVP_METADATA_SIZE) {
Maheshwar Ajja10690722019-01-30 14:12:45 -0800346 cvpMetadata->size = data->cvpMetadata.size;
347 memcpy(cvpMetadata->payload, data->cvpMetadata.payload,
348 data->cvpMetadata.size);
Akshata Sahukaraab1e562019-07-30 13:57:25 -0700349 cvpMetadata->capture_frame_rate = data->cvpMetadata.capture_frame_rate;
350 cvpMetadata->cvp_frame_rate = data->cvpMetadata.cvp_frame_rate;
Akshata Sahukar8a8657c2019-10-04 20:29:25 -0700351 cvpMetadata->flags = data->cvpMetadata.flags;
352 memcpy(cvpMetadata->reserved, data->cvpMetadata.reserved,
353 (8 * sizeof(uint32_t)));
Maheshwar Ajja10690722019-01-30 14:12:45 -0800354 ret = 0;
355 }
356 }
357 break;
Mihir Ganu3d401542019-04-03 11:08:06 -0700358 case GET_VIDEO_HISTOGRAM_STATS:
359 if (data->operation & SET_VIDEO_HISTOGRAM_STATS) {
360 struct VideoHistogramMetadata *vidstats = (struct VideoHistogramMetadata *)param;
361 vidstats->stat_len = 0;
362 if (data->video_histogram_stats.stat_len <= VIDEO_HISTOGRAM_STATS_SIZE) {
363 memcpy(vidstats->stats_info,
364 data->video_histogram_stats.stats_info, VIDEO_HISTOGRAM_STATS_SIZE);
365 vidstats->stat_len = data->video_histogram_stats.stat_len;
366 vidstats->frame_type = data->video_histogram_stats.frame_type;
367 vidstats->display_width = data->video_histogram_stats.display_width;
368 vidstats->display_height = data->video_histogram_stats.display_height;
369 vidstats->decode_width = data->video_histogram_stats.decode_width;
370 vidstats->decode_height = data->video_histogram_stats.decode_height;
371 ret = 0;
372 }
373 }
374 break;
feifanz9cc23032016-03-23 18:48:56 +0800375 default:
376 ALOGE("Unknown paramType %d", paramType);
377 break;
378 }
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800379 return ret;
feifanz9cc23032016-03-23 18:48:56 +0800380}
381
382int copyMetaData(struct private_handle_t *src, struct private_handle_t *dst) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400383 auto err = validateAndMap(src);
384 if (err != 0)
385 return err;
386
387 err = validateAndMap(dst);
388 if (err != 0)
389 return err;
feifanz9cc23032016-03-23 18:48:56 +0800390
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400391 MetaData_t *src_data = reinterpret_cast <MetaData_t *>(src->base_metadata);
392 MetaData_t *dst_data = reinterpret_cast <MetaData_t *>(dst->base_metadata);
Naseer Ahmede9b87622017-07-06 12:53:15 -0400393 *dst_data = *src_data;
feifanz9cc23032016-03-23 18:48:56 +0800394 return 0;
395}
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400396
397int copyMetaDataVaToHandle(MetaData_t *src_data, struct private_handle_t *dst) {
398 int err = -EINVAL;
399 if (src_data == nullptr)
400 return err;
401
402 err = validateAndMap(dst);
403 if (err != 0)
404 return err;
405
406 MetaData_t *dst_data = reinterpret_cast <MetaData_t *>(dst->base_metadata);
Naseer Ahmede9b87622017-07-06 12:53:15 -0400407 *dst_data = *src_data;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400408 return 0;
409}
410
411int copyMetaDataHandleToVa(struct private_handle_t *src, MetaData_t *dst_data) {
412 int err = -EINVAL;
413 if (dst_data == nullptr)
414 return err;
415
416 err = validateAndMap(src);
417 if (err != 0)
418 return err;
419
420 MetaData_t *src_data = reinterpret_cast <MetaData_t *>(src->base_metadata);
Naseer Ahmede9b87622017-07-06 12:53:15 -0400421 *dst_data = *src_data;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400422 return 0;
423}
424
425int copyMetaDataVaToVa(MetaData_t *src_data, MetaData_t *dst_data) {
426 int err = -EINVAL;
427 if (src_data == nullptr)
428 return err;
429
430 if (dst_data == nullptr)
431 return err;
432
Naseer Ahmede9b87622017-07-06 12:53:15 -0400433 *dst_data = *src_data;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400434 return 0;
435}
436
Praveen Chavan5e5679a2018-11-18 11:14:19 -0800437int setMetaDataAndUnmap(struct private_handle_t *handle, enum DispParamType paramType,
438 void *param) {
439 auto ret = setMetaData(handle, paramType, param);
440 unmapAndReset(handle);
441 return ret;
442}
443
444int getMetaDataAndUnmap(struct private_handle_t *handle,
445 enum DispFetchParamType paramType,
446 void *param) {
447 auto ret = getMetaData(handle, paramType, param);
448 unmapAndReset(handle);
449 return ret;
450}