gralloc: Use only 'data' member in GraphicsMetadata

- In gralloc3, first member 'size' in GraphicsMetadata struct was
  never unused in call to GetGraphicsMetadata. Get() call always
  returned 'data' member in GraphicsMetadata structure.

- Gralloc4 implementation introduced new encode/decode functions for
  GraphicsMetadata which are simultaneously used during set/get
  calls to encode/decode  metadata for caller and during storing/
  retrieving it from Metadata_t struct. Get() call returned
  GraphicsMetadata struct pointing to its first member 'size'
  instead of second member 'data'.

- Implement function to encode/decode GraphicsMetadataRaw to translate
  the metadata before calling mapper set/get.

- Update encodeGraphicsMetadata/decodeGraphicsMetadata functions to
  store/retrieve only 'data' member in GraphicsMetadata structure.

CRs-fixed: 2682060
Change-Id: I60c3dd2029ba21aa481dad35f9b4738b2d78957a
diff --git a/gralloc/QtiGralloc.cpp b/gralloc/QtiGralloc.cpp
index 912d360..e999063 100644
--- a/gralloc/QtiGralloc.cpp
+++ b/gralloc/QtiGralloc.cpp
@@ -55,20 +55,43 @@
   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<uint8_t> &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<uint8_t> *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<uint8_t> &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<uint8_t> *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 @@
       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 @@
       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 08053cc..f0392f9 100644
--- a/gralloc/QtiGralloc.h
+++ b/gralloc/QtiGralloc.h
@@ -119,6 +119,8 @@
 Error encodeColorMetadata(ColorMetaData &in, hidl_vec<uint8_t> *out);
 Error decodeGraphicsMetadata(hidl_vec<uint8_t> &in, GraphicsMetadata *out);
 Error encodeGraphicsMetadata(GraphicsMetadata &in, hidl_vec<uint8_t> *out);
+Error decodeGraphicsMetadataRaw(hidl_vec<uint8_t> &in, void *out);
+Error encodeGraphicsMetadataRaw(void *in, hidl_vec<uint8_t> *out);
 Error decodeUBWCStats(hidl_vec<uint8_t> &in, UBWCStats *out);
 Error encodeUBWCStats(UBWCStats *in, hidl_vec<uint8_t> *out);
 Error decodeCVPMetadata(hidl_vec<uint8_t> &in, CVPMetadata *out);
diff --git a/gralloc/QtiGrallocMetadata.h b/gralloc/QtiGrallocMetadata.h
index 00b0503..b8e779b 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