diff options
-rw-r--r-- | libqdutils/qdMetaData.cpp | 78 | ||||
-rw-r--r-- | libqdutils/qdMetaData.h | 17 |
2 files changed, 84 insertions, 11 deletions
diff --git a/libqdutils/qdMetaData.cpp b/libqdutils/qdMetaData.cpp index f1eece96..ae23b534 100644 --- a/libqdutils/qdMetaData.cpp +++ b/libqdutils/qdMetaData.cpp @@ -35,6 +35,10 @@ #include <gralloc_priv.h> #include "qdMetaData.h" +unsigned long getMetaDataSize() { + return static_cast<unsigned long>(ROUND_UP_PAGESIZE(sizeof(MetaData_t))); +} + static int validateAndMap(private_handle_t* handle) { if (private_handle_t::validate(handle)) { ALOGE("%s: Private handle is invalid - handle:%p", __func__, handle); @@ -47,7 +51,7 @@ static int validateAndMap(private_handle_t* handle) { } if (!handle->base_metadata) { - unsigned long size = ROUND_UP_PAGESIZE(sizeof(MetaData_t)); + auto size = getMetaDataSize(); void *base = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd_metadata, 0); if (base == reinterpret_cast<void*>(MAP_FAILED)) { @@ -62,12 +66,18 @@ static int validateAndMap(private_handle_t* handle) { } int setMetaData(private_handle_t *handle, DispParamType paramType, - void *param) { + void *param) { auto err = validateAndMap(handle); if (err != 0) return err; + return setMetaDataVa(reinterpret_cast<MetaData_t*>(handle->base_metadata), + paramType, param); +} - MetaData_t *data = reinterpret_cast <MetaData_t *>(handle->base_metadata); +int setMetaDataVa(MetaData_t *data, DispParamType paramType, + void *param) { + if (data == nullptr) + return -EINVAL; // If parameter is NULL reset the specific MetaData Key if (!param) { data->operation &= ~paramType; @@ -126,8 +136,13 @@ int clearMetaData(private_handle_t *handle, DispParamType paramType) { auto err = validateAndMap(handle); if (err != 0) return err; + return clearMetaDataVa(reinterpret_cast<MetaData_t *>(handle->base_metadata), + paramType); +} - MetaData_t *data = reinterpret_cast <MetaData_t *>(handle->base_metadata); +int clearMetaDataVa(MetaData_t *data, DispParamType paramType) { + if (data == nullptr) + return -EINVAL; data->operation &= ~paramType; switch (paramType) { case SET_S3D_COMP: @@ -146,9 +161,16 @@ int getMetaData(private_handle_t *handle, DispFetchParamType paramType, int ret = validateAndMap(handle); if (ret != 0) return ret; - MetaData_t *data = reinterpret_cast <MetaData_t *>(handle->base_metadata); + return getMetaDataVa(reinterpret_cast<MetaData_t *>(handle->base_metadata), + paramType, param); +} + +int getMetaDataVa(MetaData_t *data, DispFetchParamType paramType, + void *param) { // Make sure we send 0 only if the operation queried is present - ret = -EINVAL; + int ret = -EINVAL; + if (data == nullptr) + return ret; switch (paramType) { case GET_PP_PARAM_INTERLACED: @@ -241,9 +263,49 @@ int copyMetaData(struct private_handle_t *src, struct private_handle_t *dst) { if (err != 0) return err; - unsigned long size = ROUND_UP_PAGESIZE(sizeof(MetaData_t)); MetaData_t *src_data = reinterpret_cast <MetaData_t *>(src->base_metadata); MetaData_t *dst_data = reinterpret_cast <MetaData_t *>(dst->base_metadata); - memcpy(src_data, dst_data, size); + memcpy(src_data, dst_data, getMetaDataSize()); + return 0; +} + +int copyMetaDataVaToHandle(MetaData_t *src_data, struct private_handle_t *dst) { + int err = -EINVAL; + if (src_data == nullptr) + return err; + + err = validateAndMap(dst); + if (err != 0) + return err; + + MetaData_t *dst_data = reinterpret_cast <MetaData_t *>(dst->base_metadata); + memcpy(src_data, dst_data, getMetaDataSize()); return 0; } + +int copyMetaDataHandleToVa(struct private_handle_t *src, MetaData_t *dst_data) { + int err = -EINVAL; + if (dst_data == nullptr) + return err; + + err = validateAndMap(src); + if (err != 0) + return err; + + MetaData_t *src_data = reinterpret_cast <MetaData_t *>(src->base_metadata); + memcpy(src_data, dst_data, getMetaDataSize()); + return 0; +} + +int copyMetaDataVaToVa(MetaData_t *src_data, MetaData_t *dst_data) { + int err = -EINVAL; + if (src_data == nullptr) + return err; + + if (dst_data == nullptr) + return err; + + memcpy(src_data, dst_data, getMetaDataSize()); + return 0; +} + diff --git a/libqdutils/qdMetaData.h b/libqdutils/qdMetaData.h index 042db217..e704f6c0 100644 --- a/libqdutils/qdMetaData.h +++ b/libqdutils/qdMetaData.h @@ -177,14 +177,25 @@ enum DispFetchParamType { struct private_handle_t; int setMetaData(struct private_handle_t *handle, enum DispParamType paramType, - void *param); + void *param); +int setMetaDataVa(struct MetaData_t* data, enum DispParamType paramType, + void *param); -int getMetaData(struct private_handle_t *handle, enum DispFetchParamType paramType, - void *param); +int getMetaData(struct private_handle_t *handle, + enum DispFetchParamType paramType, + void *param); +int getMetaDataVa(struct MetaData_t* data, enum DispFetchParamType paramType, + void *param); int copyMetaData(struct private_handle_t *src, struct private_handle_t *dst); +int copyMetaDataVaToHandle(struct MetaData_t *src, struct private_handle_t *dst); +int copyMetaDataHandleToVa(struct private_handle_t* src, struct MetaData_t *dst); +int copyMetaDataVaToVa(struct MetaData_t *src, struct MetaData_t *dst); int clearMetaData(struct private_handle_t *handle, enum DispParamType paramType); +int clearMetaDataVa(struct MetaData_t *data, enum DispParamType paramType); + +unsigned long getMetaDataSize(); #ifdef __cplusplus } |