Merge "display: Fix dependency compile error"
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/QtiGrallocDefs.h b/gralloc/QtiGrallocDefs.h
index c61187e..93272dd 100644
--- a/gralloc/QtiGrallocDefs.h
+++ b/gralloc/QtiGrallocDefs.h
@@ -106,7 +106,7 @@
 #define HAL_PIXEL_FORMAT_ABGR_2101010 0x11B
 #define HAL_PIXEL_FORMAT_BGRX_1010102 0x11C
 #define HAL_PIXEL_FORMAT_XBGR_2101010 0x11D
-#define HAL_PIXEL_FORMAT_YCbCr_420_P010 0x11F
+#define HAL_PIXEL_FORMAT_YCbCr_420_P010 0x36  // HAL_PIXEL_FORMAT_YCBCR_P010
 #define HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC 0x124
 #define HAL_PIXEL_FORMAT_YCbCr_420_P010_VENUS 0x7FA30C0A
 
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
diff --git a/include/composer_extn_intf.h b/include/composer_extn_intf.h
index a6a4fba..9bc3f0d 100644
--- a/include/composer_extn_intf.h
+++ b/include/composer_extn_intf.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2019-2020, The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -32,6 +32,7 @@
 
 #include <dlfcn.h>
 #include "frame_scheduler_intf.h"
+#include "display_extn_intf.h"
 
 #define COMPOSER_EXTN_REV_MAJOR (1)
 #define COMPOSER_EXTN_REV_MINOR (0)
@@ -44,6 +45,8 @@
  public:
   virtual int CreateFrameScheduler(FrameSchedulerIntf **intf) = 0;
   virtual void DestroyFrameScheduler(FrameSchedulerIntf *intf) = 0;
+  virtual int CreateDisplayExtn(DisplayExtnIntf **intf) = 0;
+  virtual void DestroyDisplayExtn(DisplayExtnIntf *intf) = 0;
  protected:
   virtual ~ComposerExtnIntf() { }
 };
diff --git a/include/display_extn_intf.h b/include/display_extn_intf.h
new file mode 100644
index 0000000..84cd508
--- /dev/null
+++ b/include/display_extn_intf.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2020, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of The Linux Foundation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __DISP_EXTN_INTF_H__
+#define __DISP_EXTN_INTF_H__
+
+namespace composer {
+
+class DisplayExtnIntf {
+ public:
+  virtual int SetContentFps(uint32_t fps) = 0;
+ protected:
+  virtual ~DisplayExtnIntf() { }
+};
+
+}  // namespace composer
+
+#endif  // __DISP_EXTN_INTF_H__
diff --git a/services/config/config_defs.h b/services/config/config_defs.h
index 77eea44..7b4838a 100644
--- a/services/config/config_defs.h
+++ b/services/config/config_defs.h
@@ -265,14 +265,14 @@
   virtual int IsHDRSupported(uint32_t disp_id, bool *supported) DEFAULT_RET
   virtual int IsWCGSupported(uint32_t disp_id, bool *supported) DEFAULT_RET
   virtual int SetLayerAsMask(uint32_t disp_id, uint64_t layer_id) DEFAULT_RET
-  virtual int GetDebugProperty(const std::string prop_name, std::string value) DEFAULT_RET
+  virtual int GetDebugProperty(const std::string prop_name, std::string *value) DEFAULT_RET
   virtual int GetActiveBuiltinDisplayAttributes(Attributes *attr) DEFAULT_RET
   virtual int SetPanelLuminanceAttributes(uint32_t disp_id, float min_lum,
                                           float max_lum) DEFAULT_RET
   virtual int IsBuiltInDisplay(uint32_t disp_id, bool *is_builtin) DEFAULT_RET
   virtual int IsAsyncVDSCreationSupported(bool *supported) DEFAULT_RET
   virtual int CreateVirtualDisplay(uint32_t width, uint32_t height, int format) DEFAULT_RET
-  virtual int GetSupportedDSIBitClks(uint32_t disp_id, std::vector<uint64_t> bit_clks) DEFAULT_RET
+  virtual int GetSupportedDSIBitClks(uint32_t disp_id, std::vector<uint64_t> *bit_clks) DEFAULT_RET
   virtual int GetDSIClk(uint32_t disp_id, uint64_t *bit_clk) DEFAULT_RET
   virtual int SetDSIClk(uint32_t disp_id, uint64_t bit_clk) DEFAULT_RET
   virtual int SetCWBOutputBuffer(uint32_t disp_id, const Rect rect, bool post_processed,
@@ -282,6 +282,10 @@
   virtual int IsRotatorSupportedFormat(int hal_format, bool ubwc, bool *supported) DEFAULT_RET
   virtual int ControlQsyncCallback(bool enable) DEFAULT_RET
 
+  // deprecated APIs
+  virtual int GetDebugProperty(const std::string prop_name, std::string value) DEFAULT_RET
+  virtual int GetSupportedDSIBitClks(uint32_t disp_id, std::vector<uint64_t> bit_clks) DEFAULT_RET
+
  protected:
   virtual ~ConfigInterface() { }
 };
diff --git a/services/config/src/client_impl.cpp b/services/config/src/client_impl.cpp
index b3dd3e8..c11fa3c 100644
--- a/services/config/src/client_impl.cpp
+++ b/services/config/src/client_impl.cpp
@@ -538,11 +538,13 @@
   return error;
 }
 
-int ClientImpl::GetDebugProperty(const std::string prop_name, std::string value) {
+int ClientImpl::GetDebugProperty(const std::string prop_name, std::string *value) {
   ByteStream input_params;
-  uint8_t *data_input = reinterpret_cast<uint8_t*>(const_cast<char*>(prop_name.data()));
+  std::string prop(prop_name);
+  prop += '\0';
+  uint8_t *data_input = reinterpret_cast<uint8_t*>(const_cast<char*>(prop.data()));
   input_params.setToExternal(reinterpret_cast<uint8_t*>(data_input),
-                             prop_name.size() * sizeof(char));
+                             prop.size() * sizeof(char));
   ByteStream output_params;
   int error = 0;
   auto hidl_cb = [&error, &output_params] (int32_t err, ByteStream params, HandleStream handles) {
@@ -554,9 +556,9 @@
 
   const uint8_t *data = output_params.data();
   const char *name = reinterpret_cast<const char *>(data);
-  std::string output(name);
   if (!error) {
-    value = output;
+    std::string output(name);
+    *value = output;
   }
 
   return error;
@@ -645,7 +647,7 @@
   return error;
 }
 
-int ClientImpl::GetSupportedDSIBitClks(uint32_t disp_id, std::vector<uint64_t> bit_clks) {
+int ClientImpl::GetSupportedDSIBitClks(uint32_t disp_id, std::vector<uint64_t> *bit_clks) {
   ByteStream input_params;
   input_params.setToExternal(reinterpret_cast<uint8_t*>(&disp_id), sizeof(uint32_t));
   ByteStream output_params;
@@ -662,7 +664,7 @@
     const uint64_t *bit_clks_data = reinterpret_cast<const uint64_t *>(data);
     int num_bit_clks = static_cast<int>(output_params.size() / sizeof(uint64_t));
     for (int i = 0; i < num_bit_clks; i++) {
-      bit_clks.push_back(bit_clks_data[i]);
+      bit_clks->push_back(bit_clks_data[i]);
     }
   }
 
diff --git a/services/config/src/client_impl.h b/services/config/src/client_impl.h
index f90a4e0..085fc22 100644
--- a/services/config/src/client_impl.h
+++ b/services/config/src/client_impl.h
@@ -84,13 +84,13 @@
   virtual int IsHDRSupported(uint32_t disp_id, bool *supported);
   virtual int IsWCGSupported(uint32_t disp_id, bool *supported);
   virtual int SetLayerAsMask(uint32_t disp_id, uint64_t layer_id);
-  virtual int GetDebugProperty(const std::string prop_name, std::string value);
+  virtual int GetDebugProperty(const std::string prop_name, std::string *value);
   virtual int GetActiveBuiltinDisplayAttributes(Attributes *attr);
   virtual int SetPanelLuminanceAttributes(uint32_t disp_id, float min_lum, float max_lum);
   virtual int IsBuiltInDisplay(uint32_t disp_id, bool *is_builtin);
   virtual int IsAsyncVDSCreationSupported(bool *supported);
   virtual int CreateVirtualDisplay(uint32_t width, uint32_t height, int format);
-  virtual int GetSupportedDSIBitClks(uint32_t disp_id, std::vector<uint64_t> bit_clks);
+  virtual int GetSupportedDSIBitClks(uint32_t disp_id, std::vector<uint64_t> *bit_clks);
   virtual int GetDSIClk(uint32_t disp_id, uint64_t *bit_clk);
   virtual int SetDSIClk(uint32_t disp_id, uint64_t bit_clk);
   virtual int SetCWBOutputBuffer(uint32_t disp_id, const Rect rect, bool post_processed,
diff --git a/services/config/src/device_impl.cpp b/services/config/src/device_impl.cpp
index c02de23..7c36729 100644
--- a/services/config/src/device_impl.cpp
+++ b/services/config/src/device_impl.cpp
@@ -501,9 +501,10 @@
   const uint8_t *data = input_params.data();
   const char *name = reinterpret_cast<const char *>(data);
   std::string prop_name(name);
-  int32_t error = intf_->GetDebugProperty(prop_name, value);
+  int32_t error = intf_->GetDebugProperty(prop_name, &value);
+  value += '\0';
   uint8_t *data_output = reinterpret_cast<uint8_t*>(value.data());
-  output_params.setToExternal(reinterpret_cast<uint8_t*>(&data_output),
+  output_params.setToExternal(reinterpret_cast<uint8_t*>(data_output),
                               value.size() * sizeof(char));
 
   _hidl_cb(error, output_params, {});
@@ -578,7 +579,7 @@
 
   const uint8_t *data = input_params.data();
   disp_id = reinterpret_cast<const uint32_t*>(data);
-  int32_t error = intf_->GetSupportedDSIBitClks(*disp_id, bit_clks);
+  int32_t error = intf_->GetSupportedDSIBitClks(*disp_id, &bit_clks);
 
   bit_clks_data = reinterpret_cast<uint64_t *>(malloc(sizeof(uint64_t) * bit_clks.size()));
   for (int i = 0; i < bit_clks.size(); i++) {