summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libqdutils/qdMetaData.cpp107
-rw-r--r--libqdutils/qdMetaData.h20
2 files changed, 123 insertions, 4 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;
+}
diff --git a/libqdutils/qdMetaData.h b/libqdutils/qdMetaData.h
index a1d935012..fd4f4447a 100644
--- a/libqdutils/qdMetaData.h
+++ b/libqdutils/qdMetaData.h
@@ -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
@@ -61,7 +61,7 @@ struct MetaData_t {
int32_t operation;
int32_t interlaced;
struct BufferDim_t bufferDim;
- uint32_t refreshrate;
+ float refreshrate;
enum ColorSpace_t colorSpace;
enum IGC_t igc;
/* Gralloc sets PRIV_SECURE_BUFFER flag to inform that the buffers are from
@@ -99,10 +99,26 @@ enum DispParamType {
SET_SINGLE_BUFFER_MODE = 0x4000,
};
+enum DispFetchParamType {
+ GET_PP_PARAM_INTERLACED = 0x0004,
+ GET_BUFFER_GEOMETRY = 0x0080,
+ GET_REFRESH_RATE = 0x0100,
+ GET_COLOR_SPACE = 0x0200,
+ GET_MAP_SECURE_BUFFER = 0x400,
+ GET_S3D_FORMAT = 0x800,
+ GET_LINEAR_FORMAT = 0x1000,
+ GET_IGC = 0x2000,
+ GET_SINGLE_BUFFER_MODE = 0x4000,
+};
+
struct private_handle_t;
int setMetaData(struct private_handle_t *handle, enum DispParamType paramType,
void *param);
+int getMetaData(struct private_handle_t *handle, enum DispFetchParamType paramType,
+ void *param);
+
+int copyMetaData(struct private_handle_t *src, struct private_handle_t *dst);
#ifdef __cplusplus
}
#endif