summaryrefslogtreecommitdiffstats
path: root/libqdutils/qdMetaData.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libqdutils/qdMetaData.cpp')
-rw-r--r--libqdutils/qdMetaData.cpp107
1 files changed, 105 insertions, 2 deletions
diff --git a/libqdutils/qdMetaData.cpp b/libqdutils/qdMetaData.cpp
index 79daa14b5..72edfdf4c 100644
--- a/libqdutils/qdMetaData.cpp
+++ b/libqdutils/qdMetaData.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2015, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
@@ -67,7 +67,7 @@ int setMetaData(private_handle_t *handle, DispParamType paramType,
data->bufferDim = *((BufferDim_t *)param);
break;
case UPDATE_REFRESH_RATE:
- data->refreshrate = *((uint32_t *)param);
+ data->refreshrate = *((float *)param);
break;
case UPDATE_COLOR_SPACE:
data->colorSpace = *((ColorSpace_t *)param);
@@ -96,3 +96,106 @@ int setMetaData(private_handle_t *handle, DispParamType paramType,
errno);
return 0;
}
+
+int getMetaData(private_handle_t *handle, DispFetchParamType paramType,
+ void *param) {
+ if (!handle) {
+ ALOGE("%s: Private handle is null!", __func__);
+ return -1;
+ }
+ if (handle->fd_metadata == -1) {
+ ALOGE("%s: Bad fd for extra data!", __func__);
+ return -1;
+ }
+ if (!param) {
+ ALOGE("%s: input param is null!", __func__);
+ return -1;
+ }
+ unsigned long size = ROUND_UP_PAGESIZE(sizeof(MetaData_t));
+ void *base = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED,
+ handle->fd_metadata, 0);
+ if (base == reinterpret_cast<void*>(MAP_FAILED)) {
+ ALOGE("%s: mmap() failed: error is %s!", __func__, strerror(errno));
+ return -1;
+ }
+
+ MetaData_t *data = reinterpret_cast <MetaData_t *>(base);
+ data->operation |= paramType;
+ switch (paramType) {
+ case GET_PP_PARAM_INTERLACED:
+ *((int32_t *)param) = data->interlaced;
+ break;
+ case GET_BUFFER_GEOMETRY:
+ *((BufferDim_t *)param) = data->bufferDim;
+ break;
+ case GET_REFRESH_RATE:
+ *((float *)param) = data->refreshrate;
+ break;
+ case GET_COLOR_SPACE:
+ *((ColorSpace_t *)param) = data->colorSpace;
+ break;
+ case GET_MAP_SECURE_BUFFER:
+ *((int32_t *)param) = data->mapSecureBuffer;
+ break;
+ case GET_S3D_FORMAT:
+ *((uint32_t *)param) = data->s3dFormat;
+ break;
+ case GET_LINEAR_FORMAT:
+ *((uint32_t *)param) = data->linearFormat;
+ break;
+ case GET_IGC:
+ *((IGC_t *)param) = data->igc;
+ break;
+ case GET_SINGLE_BUFFER_MODE:
+ *((uint32_t *)param) = data->isSingleBufferMode ;
+ break;
+ default:
+ ALOGE("Unknown paramType %d", paramType);
+ break;
+ }
+ if(munmap(base, size))
+ ALOGE("%s: failed to unmap ptr %p, err %d", __func__, (void*)base,
+ errno);
+ return 0;
+}
+
+int copyMetaData(struct private_handle_t *src, struct private_handle_t *dst) {
+ if (!src || !dst) {
+ ALOGE("%s: Private handle is null!", __func__);
+ return -1;
+ }
+ if (src->fd_metadata == -1) {
+ ALOGE("%s: Bad fd for src extra data!", __func__);
+ return -1;
+ }
+ if (dst->fd_metadata == -1) {
+ ALOGE("%s: Bad fd for dst extra data!", __func__);
+ return -1;
+ }
+
+ unsigned long size = ROUND_UP_PAGESIZE(sizeof(MetaData_t));
+
+ void *base_src = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED,
+ src->fd_metadata, 0);
+ if (base_src == reinterpret_cast<void*>(MAP_FAILED)) {
+ ALOGE("%s: src mmap() failed: error is %s!", __func__, strerror(errno));
+ return -1;
+ }
+
+ void *base_dst = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED,
+ dst->fd_metadata, 0);
+ if (base_dst == reinterpret_cast<void*>(MAP_FAILED)) {
+ ALOGE("%s: dst mmap() failed: error is %s!", __func__, strerror(errno));
+ return -1;
+ }
+
+ memcpy(base_dst, base_src, size);
+
+ if(munmap(base_src, size))
+ ALOGE("%s: failed to unmap src ptr %p, err %d", __func__, (void*)base_src,
+ errno);
+ if(munmap(base_dst, size))
+ ALOGE("%s: failed to unmap src ptr %p, err %d", __func__, (void*)base_dst,
+ errno);
+ return 0;
+}