display: Adds additional APIs for gralloc4 support

Adds gralloc4 support for QtiMapperExtensions APIs

Change-Id: I2728f7dd7286702ae19f6fa1c0548027a2e12437
diff --git a/gralloc/QtiGralloc.cpp b/gralloc/QtiGralloc.cpp
index c354537..348e097 100644
--- a/gralloc/QtiGralloc.cpp
+++ b/gralloc/QtiGralloc.cpp
@@ -181,6 +181,24 @@
   return Error::NONE;
 }
 
+Error decodeYUVPlaneInfoMetadata(hidl_vec<uint8_t> &in, qti_ycbcr *out) {
+  if (!in.size() || !out) {
+    return Error::BAD_VALUE;
+  }
+  qti_ycbcr *p = reinterpret_cast<qti_ycbcr *>(in.data());
+  memcpy(out, in.data(), (YCBCR_LAYOUT_ARRAY_SIZE * sizeof(qti_ycbcr)));
+  return Error::NONE;
+}
+
+Error encodeYUVPlaneInfoMetadata(qti_ycbcr *in, hidl_vec<uint8_t> *out) {
+  if (!out) {
+    return Error::BAD_VALUE;
+  }
+  out->resize(YCBCR_LAYOUT_ARRAY_SIZE * sizeof(qti_ycbcr));
+  memcpy(out->data(), in, YCBCR_LAYOUT_ARRAY_SIZE * sizeof(qti_ycbcr));
+  return Error::NONE;
+}
+
 MetadataType getMetadataType(uint32_t in) {
   switch (in) {
     case QTI_VT_TIMESTAMP:
@@ -223,6 +241,16 @@
       return MetadataType_VendorMetadataStatus;
     case QTI_BUFFER_TYPE:
       return MetadataType_BufferType;
+    case QTI_CUSTOM_DIMENSIONS_STRIDE:
+      return MetadataType_CustomDimensionsStride;
+    case QTI_CUSTOM_DIMENSIONS_HEIGHT:
+      return MetadataType_CustomDimensionsHeight;
+    case QTI_RGB_DATA_ADDRESS:
+      return MetadataType_RgbDataAddress;
+    case QTI_COLORSPACE:
+      return MetadataType_ColorSpace;
+    case QTI_YUV_PLANE_INFO:
+      return MetadataType_YuvPlaneInfo;
     default:
       return MetadataType_Invalid;
   }
@@ -319,6 +347,25 @@
       err = static_cast<Error>(android::gralloc4::decodeUint32(
           qtigralloc::MetadataType_BufferType, bytestream, (uint32_t *)param));
       break;
+    case QTI_CUSTOM_DIMENSIONS_STRIDE:
+      err = static_cast<Error>(android::gralloc4::decodeUint32(
+          qtigralloc::MetadataType_CustomDimensionsStride, bytestream, (uint32_t *)param));
+      break;
+    case QTI_CUSTOM_DIMENSIONS_HEIGHT:
+      err = static_cast<Error>(android::gralloc4::decodeUint32(
+          qtigralloc::MetadataType_CustomDimensionsHeight, bytestream, (uint32_t *)param));
+      break;
+    case QTI_RGB_DATA_ADDRESS:
+      err = static_cast<Error>(android::gralloc4::decodeUint64(
+          qtigralloc::MetadataType_RgbDataAddress, bytestream, (uint64_t *)param));
+      break;
+    case QTI_COLORSPACE:
+      err = static_cast<Error>(android::gralloc4::decodeUint32(qtigralloc::MetadataType_ColorSpace,
+                                                               bytestream, (uint32_t *)param));
+      break;
+    case QTI_YUV_PLANE_INFO:
+      err = decodeYUVPlaneInfoMetadata(bytestream, (qti_ycbcr *)param);
+      break;
     default:
       param = nullptr;
       return Error::UNSUPPORTED;
diff --git a/gralloc/QtiGralloc.h b/gralloc/QtiGralloc.h
index 4ec681e..6f8bd1f 100644
--- a/gralloc/QtiGralloc.h
+++ b/gralloc/QtiGralloc.h
@@ -115,6 +115,16 @@
 static const MetadataType MetadataType_BufferType = {VENDOR_QTI,
                                                      QTI_BUFFER_TYPE};
 
+static const MetadataType MetadataType_CustomDimensionsStride = {VENDOR_QTI,
+                                                                 QTI_CUSTOM_DIMENSIONS_STRIDE};
+
+static const MetadataType MetadataType_CustomDimensionsHeight = {VENDOR_QTI,
+                                                                 QTI_CUSTOM_DIMENSIONS_HEIGHT};
+
+static const MetadataType MetadataType_RgbDataAddress = {VENDOR_QTI, QTI_RGB_DATA_ADDRESS};
+
+static const MetadataType MetadataType_ColorSpace = {VENDOR_QTI, QTI_COLORSPACE};
+static const MetadataType MetadataType_YuvPlaneInfo = {VENDOR_QTI, QTI_YUV_PLANE_INFO};
 // 0 is also used as invalid value in standard metadata
 static const MetadataType MetadataType_Invalid = {VENDOR_QTI, 0};
 
@@ -144,6 +154,8 @@
 Error encodeVideoHistogramMetadata(VideoHistogramMetadata &in, hidl_vec<uint8_t> *out);
 Error decodeVideoTimestampInfo(hidl_vec<uint8_t> &in, VideoTimestampInfo *out);
 Error encodeVideoTimestampInfo(VideoTimestampInfo &in, hidl_vec<uint8_t> *out);
+Error decodeYUVPlaneInfoMetadata(hidl_vec<uint8_t> &in, qti_ycbcr *out);
+Error encodeYUVPlaneInfoMetadata(qti_ycbcr *in, hidl_vec<uint8_t> *out);
 }  // namespace qtigralloc
 
 #endif  //__QTIGRALLOC_H__
diff --git a/gralloc/QtiGrallocMetadata.h b/gralloc/QtiGrallocMetadata.h
index 5fabd6d..6ae65c9 100644
--- a/gralloc/QtiGrallocMetadata.h
+++ b/gralloc/QtiGrallocMetadata.h
@@ -59,6 +59,11 @@
 #define QTI_VIDEO_TS_INFO 10019
 // This is legacy format
 #define QTI_S3D_FORMAT 10020
+#define QTI_CUSTOM_DIMENSIONS_STRIDE 10021
+#define QTI_CUSTOM_DIMENSIONS_HEIGHT 10022
+#define QTI_RGB_DATA_ADDRESS 10023
+#define QTI_COLORSPACE 10024
+#define QTI_YUV_PLANE_INFO 10025
 
 // Used to indicate to framework that internal definitions are used instead
 #define COMPRESSION_QTI_UBWC 20001
@@ -169,6 +174,23 @@
   uint8_t data[RESERVED_REGION_SIZE];
 } ReservedRegion;
 
+#define YCBCR_LAYOUT_ARRAY_SIZE 2
+struct qti_ycbcr {
+  void *y;
+  void *cb;
+  void *cr;
+  uint32_t yStride;
+  uint32_t cStride;
+  uint32_t chromaStep;
+};
+
+/* Color Space Macros */
+#define HAL_CSC_ITU_R_601 0
+#define HAL_CSC_ITU_R_601_FR 1
+#define HAL_CSC_ITU_R_709 2
+#define HAL_CSC_ITU_R_2020 3
+#define HAL_CSC_ITU_R_2020_FR 4
+
 #define METADATA_SET_SIZE 512
 
 #define IS_VENDOR_METADATA_TYPE(x) (x >= QTI_VT_TIMESTAMP)