diff options
-rw-r--r-- | libqdutils/qdMetaData.cpp | 107 | ||||
-rw-r--r-- | libqdutils/qdMetaData.h | 20 |
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 |