diff --git a/gralloc/QtiGralloc.cpp b/gralloc/QtiGralloc.cpp index 912d3608..e999063f 100644 --- a/gralloc/QtiGralloc.cpp +++ b/gralloc/QtiGralloc.cpp @@ -55,20 +55,43 @@ Error encodeColorMetadata(ColorMetaData &in, hidl_vec *out) { return Error::NONE; } +// decode the raw graphics metadata from bytestream and store it in 'data' member of +// GraphicsMetadata struct during mapper->set call, 'size' member is unused. Error decodeGraphicsMetadata(hidl_vec &in, GraphicsMetadata *out) { if (!in.size() || !out) { return Error::BAD_VALUE; } - memcpy(out, in.data(), sizeof(GraphicsMetadata)); + memcpy(&(out->data), in.data(), GRAPHICS_METADATA_SIZE_IN_BYTES); return Error::NONE; } +// encode only 'data' member of GraphicsMetadata struct for retrieval of +// graphics metadata during mapper->get call Error encodeGraphicsMetadata(GraphicsMetadata &in, hidl_vec *out) { if (!out) { return Error::BAD_VALUE; } - out->resize(sizeof(GraphicsMetadata)); - memcpy(out->data(), &in, sizeof(GraphicsMetadata)); + out->resize(GRAPHICS_METADATA_SIZE_IN_BYTES); + memcpy(out->data(), &(in.data), GRAPHICS_METADATA_SIZE_IN_BYTES); + return Error::NONE; +} + +// decode the raw graphics metadata from bytestream before presenting it to caller +Error decodeGraphicsMetadataRaw(hidl_vec &in, void *out) { + if (!in.size() || !out) { + return Error::BAD_VALUE; + } + memcpy(out, in.data(), GRAPHICS_METADATA_SIZE_IN_BYTES); + return Error::NONE; +} + +// encode the raw graphics metadata in bytestream before calling mapper->set +Error encodeGraphicsMetadataRaw(void *in, hidl_vec *out) { + if (!in || !out) { + return Error::BAD_VALUE; + } + out->resize(GRAPHICS_METADATA_SIZE_IN_BYTES); + memcpy(out->data(), in, GRAPHICS_METADATA_SIZE_IN_BYTES); return Error::NONE; } @@ -211,7 +234,7 @@ Error get(void *buffer, uint32_t type, void *param) { err = decodeColorMetadata(bytestream, (ColorMetaData *)param); break; case QTI_GRAPHICS_METADATA: - err = decodeGraphicsMetadata(bytestream, (GraphicsMetadata *)param); + err = decodeGraphicsMetadataRaw(bytestream, param); break; case QTI_UBWC_CR_STATS_INFO: err = decodeUBWCStats(bytestream, (UBWCStats *)param); @@ -289,7 +312,7 @@ Error set(void *buffer, uint32_t type, void *param) { err = encodeColorMetadata(*(ColorMetaData *)param, &bytestream); break; case QTI_GRAPHICS_METADATA: - err = encodeGraphicsMetadata(*(GraphicsMetadata *)param, &bytestream); + err = encodeGraphicsMetadataRaw(param, &bytestream); break; case QTI_UBWC_CR_STATS_INFO: err = encodeUBWCStats((UBWCStats *)param, &bytestream); diff --git a/gralloc/QtiGralloc.h b/gralloc/QtiGralloc.h index 08053cc8..f0392f92 100644 --- a/gralloc/QtiGralloc.h +++ b/gralloc/QtiGralloc.h @@ -119,6 +119,8 @@ Error decodeColorMetadata(hidl_vec &in, ColorMetaData *out); Error encodeColorMetadata(ColorMetaData &in, hidl_vec *out); Error decodeGraphicsMetadata(hidl_vec &in, GraphicsMetadata *out); Error encodeGraphicsMetadata(GraphicsMetadata &in, hidl_vec *out); +Error decodeGraphicsMetadataRaw(hidl_vec &in, void *out); +Error encodeGraphicsMetadataRaw(void *in, hidl_vec *out); Error decodeUBWCStats(hidl_vec &in, UBWCStats *out); Error encodeUBWCStats(UBWCStats *in, hidl_vec *out); Error decodeCVPMetadata(hidl_vec &in, CVPMetadata *out); diff --git a/gralloc/QtiGrallocMetadata.h b/gralloc/QtiGrallocMetadata.h index 00b0503d..b8e779ba 100644 --- a/gralloc/QtiGrallocMetadata.h +++ b/gralloc/QtiGrallocMetadata.h @@ -64,9 +64,10 @@ // GRAPHICS_METADATA #define GRAPHICS_METADATA_SIZE 4096 +#define GRAPHICS_METADATA_SIZE_IN_BYTES (GRAPHICS_METADATA_SIZE * sizeof(uint32_t)) typedef struct GraphicsMetadata { - uint32_t size; - uint32_t data[GRAPHICS_METADATA_SIZE]; + uint32_t size; //unused in Gralloc4, in Gralloc3 it was never returned on Get() + uint32_t data[GRAPHICS_METADATA_SIZE]; //Clients must set only raw data with Gralloc4 } GraphicsMetadata; // UBWC_CR_STATS_INFO