gralloc: Add handling for custom content metadata

Update QtiGralloc to support getting and setting custom
content metadata.

Change-Id: I6f79eb0d39a82668ef7fb99e30669eb367ef00b1
diff --git a/gralloc/QtiGralloc.cpp b/gralloc/QtiGralloc.cpp
index e71e545..e913090 100644
--- a/gralloc/QtiGralloc.cpp
+++ b/gralloc/QtiGralloc.cpp
@@ -30,6 +30,8 @@
 #include "QtiGralloc.h"
 
 #include <log/log.h>
+#include "color_extensions.h"
+
 namespace qtigralloc {
 
 using android::hardware::graphics::mapper::V4_0::IMapper;
@@ -216,6 +218,38 @@
   return Error::NONE;
 }
 
+Error decodeCustomContentMetadata(hidl_vec<uint8_t> &in, void *out) {
+  static size_t target_size = sizeof(CustomContentMetadata);
+
+  if (in.size() != target_size || !out) {
+    return Error::BAD_VALUE;
+  }
+
+  CustomContentMetadata *c_md_in = reinterpret_cast<CustomContentMetadata *>(in.data());
+  CustomContentMetadata *c_md_out = reinterpret_cast<CustomContentMetadata *>(out);
+
+  if (c_md_in->size > CUSTOM_METADATA_SIZE_BYTES) {
+    return Error::BAD_VALUE;
+  }
+
+  c_md_out->size = c_md_in->size;
+  memcpy(c_md_out->metadataPayload, c_md_in->metadataPayload, c_md_in->size);
+  return Error::NONE;
+}
+
+Error encodeCustomContentMetadata(const void *in, hidl_vec<uint8_t> *out) {
+  static size_t target_size = sizeof(CustomContentMetadata);
+
+  if (!in || !out) {
+    return Error::BAD_VALUE;
+  }
+
+  out->resize(target_size);
+
+  memcpy(out->data(), in, target_size);
+  return Error::NONE;
+}
+
 MetadataType getMetadataType(uint32_t in) {
   switch (in) {
     case QTI_VT_TIMESTAMP:
@@ -272,6 +306,8 @@
       return MetadataType_YuvPlaneInfo;
     case QTI_TIMED_RENDERING:
       return MetadataType_TimedRendering;
+    case QTI_CUSTOM_CONTENT_METADATA:
+      return MetadataType_CustomContentMetadata;
     default:
       return MetadataType_Invalid;
   }
@@ -404,6 +440,9 @@
       err = static_cast<Error>(android::gralloc4::decodeUint32(
           qtigralloc::MetadataType_TimedRendering, bytestream, reinterpret_cast<uint32_t *>(param)));
       break;
+    case QTI_CUSTOM_CONTENT_METADATA:
+      err = decodeCustomContentMetadata(bytestream, param);
+      break;
     default:
       param = nullptr;
       return Error::UNSUPPORTED;
@@ -484,6 +523,9 @@
           android::gralloc4::encodeUint32(qtigralloc::MetadataType_TimedRendering,
                                           *reinterpret_cast<uint32_t *>(param), &bytestream));
       break;
+    case QTI_CUSTOM_CONTENT_METADATA:
+      err = encodeCustomContentMetadata(param, &bytestream);
+      break;
     default:
       param = nullptr;
       return Error::UNSUPPORTED;