display: Add reserved size and status check to MetaData_t

* Move from fixed array reserved region to variable reserved
  region size
* Add bool arrays to indicate whether metadata has been set using
  Gralloc4 indices
* Replace metadata->operation with bool arrays for
  gralloc4/qdMetaData compatibility

CRs-Fixed: 2730848
Change-Id: Id52aac70c23ee4b39db185861f951bb909831afb
diff --git a/gralloc/QtiGralloc.cpp b/gralloc/QtiGralloc.cpp
index e999063..aab5754 100644
--- a/gralloc/QtiGralloc.cpp
+++ b/gralloc/QtiGralloc.cpp
@@ -38,6 +38,24 @@
   static sp<IMapper> mapper = IMapper::getService();
   return mapper;
 }
+
+Error decodeMetadataState(hidl_vec<uint8_t> &in, bool *out) {
+  if (!in.size() || !out) {
+    return Error::BAD_VALUE;
+  }
+  memcpy(out, in.data(), METADATA_SET_SIZE);
+  return Error::NONE;
+}
+
+Error encodeMetadataState(bool *in, hidl_vec<uint8_t> *out) {
+  if (!in || !out) {
+    return Error::BAD_VALUE;
+  }
+  out->resize(sizeof(bool) * METADATA_SET_SIZE);
+  memcpy(out->data(), in, sizeof(bool) * METADATA_SET_SIZE);
+  return Error::NONE;
+}
+
 Error decodeColorMetadata(hidl_vec<uint8_t> &in, ColorMetaData *out) {
   if (!in.size() || !out) {
     return Error::BAD_VALUE;
@@ -180,6 +198,10 @@
       return MetadataType_AlignedWidthInPixels;
     case QTI_ALIGNED_HEIGHT_IN_PIXELS:
       return MetadataType_AlignedHeightInPixels;
+    case QTI_STANDARD_METADATA_STATUS:
+      return MetadataType_StandardMetadataStatus;
+    case QTI_VENDOR_METADATA_STATUS:
+      return MetadataType_VendorMetadataStatus;
     default:
       return MetadataType_Invalid;
   }
@@ -265,6 +287,10 @@
       err = static_cast<Error>(android::gralloc4::decodeUint32(
           qtigralloc::MetadataType_AlignedHeightInPixels, bytestream, (uint32_t *)param));
       break;
+    case QTI_STANDARD_METADATA_STATUS:
+    case QTI_VENDOR_METADATA_STATUS:
+      err = decodeMetadataState(bytestream, (bool *)param);
+      break;
     default:
       param = nullptr;
       return Error::UNSUPPORTED;
@@ -339,4 +365,25 @@
   return mapper->set((void *)buffer, metadata_type, bytestream);
 }
 
+int getMetadataState(void *buffer, uint32_t type) {
+  bool metadata_set[METADATA_SET_SIZE];
+  Error err;
+  if (IS_VENDOR_METADATA_TYPE(type)) {
+    err = get(buffer, QTI_VENDOR_METADATA_STATUS, &metadata_set);
+  } else {
+    err = get(buffer, QTI_STANDARD_METADATA_STATUS, &metadata_set);
+  }
+
+  if (err != Error::NONE) {
+    ALOGE("Unable to get metadata state");
+    return -1;
+  }
+
+  if (IS_VENDOR_METADATA_TYPE(type)) {
+    return metadata_set[GET_VENDOR_METADATA_STATUS_INDEX(type)];
+  } else {
+    return metadata_set[GET_STANDARD_METADATA_STATUS_INDEX(type)];
+  }
+}
+
 }  // namespace qtigralloc