QCamera2: HAL3: Add hybrid AE vendor tag

Add vendor tag to enable/disable hybrid AE.

Bug: 27129493
Change-Id: I4a90145e4052d4da541b0ee3bc2f016cd0d97ad1
diff --git a/camera/QCamera2/HAL3/QCamera3HWI.cpp b/camera/QCamera2/HAL3/QCamera3HWI.cpp
index d1b9913..7de405c 100644
--- a/camera/QCamera2/HAL3/QCamera3HWI.cpp
+++ b/camera/QCamera2/HAL3/QCamera3HWI.cpp
@@ -7035,6 +7035,12 @@
     property_get("persist.camera.eis.enable", eis_prop, "0");
     const uint8_t eis_prop_set = (uint8_t)atoi(eis_prop);
 
+    // Hybrid AE enable/disable
+    char hybrid_ae_prop[PROPERTY_VALUE_MAX];
+    memset(hybrid_ae_prop, 0, sizeof(hybrid_ae_prop));
+    property_get("persist.camera.hybrid_ae.enable", hybrid_ae_prop, "0");
+    const uint8_t hybrid_ae = (uint8_t)atoi(hybrid_ae_prop);
+
     const bool facingBack = gCamCapability[mCameraId]->position == CAM_POSITION_BACK;
     // This is a bit hacky. EIS is enabled only when the above setprop
     // is set to non-zero value and on back camera (for 2015 Nexus).
@@ -7392,6 +7398,10 @@
 
     int32_t mode = cds_mode;
     settings.update(QCAMERA3_CDS_MODE, &mode, 1);
+
+    /* hybrid ae */
+    settings.update(NEXUS_EXPERIMENTAL_2016_HYBRID_AE_ENABLE, &hybrid_ae, 1);
+
     mDefaultMetadata[type] = settings.release();
 
     return mDefaultMetadata[type];
@@ -8513,6 +8523,17 @@
         }
     }
 
+    // Hybrid AE
+    if (frame_settings.exists(NEXUS_EXPERIMENTAL_2016_HYBRID_AE_ENABLE)) {
+        uint8_t *hybrid_ae = (uint8_t *)
+                frame_settings.find(NEXUS_EXPERIMENTAL_2016_HYBRID_AE_ENABLE).data.u8;
+
+        if (ADD_SET_PARAM_ENTRY_TO_BATCH(hal_metadata,
+                CAM_INTF_META_HYBRID_AE, *hybrid_ae)) {
+            rc = BAD_VALUE;
+        }
+    }
+
     return rc;
 }
 
diff --git a/camera/QCamera2/HAL3/QCamera3VendorTags.cpp b/camera/QCamera2/HAL3/QCamera3VendorTags.cpp
index 91a7fcd..953c6fd 100644
--- a/camera/QCamera2/HAL3/QCamera3VendorTags.cpp
+++ b/camera/QCamera2/HAL3/QCamera3VendorTags.cpp
@@ -53,6 +53,7 @@
         QCAMERA3_SENSOR_META_DATA_END,
         QCAMERA3_TEMPORAL_DENOISE_END,
         NEXUS_EXPERIMENTAL_2015_END,
+        NEXUS_EXPERIMENTAL_2016_END,
 } ;
 
 typedef struct vendor_tag_info {
@@ -70,7 +71,8 @@
     "org.codeaurora.qcamera3.av_timer",
     "org.codeaurora.qcamera3.sensor_meta_data",
     "org.codeaurora.qcamera3.temporal_denoise",
-    "com.google.nexus.experimental2015"
+    "com.google.nexus.experimental2015",
+    "com.google.nexus.experimental2016"
 };
 
 vendor_tag_info_t qcamera3_privatedata[QCAMERA3_PRIVATEDATA_END - QCAMERA3_PRIVATEDATA_START] = {
@@ -121,6 +123,11 @@
     {"sensor.info.opticallyShieldedRegions", TYPE_INT32 }
 };
 
+vendor_tag_info_t nexus_experimental_2016[NEXUS_EXPERIMENTAL_2016_END -
+        NEXUS_EXPERIMENTAL_2016_START] = {
+   {"3a.hybrid_3a_enable", TYPE_BYTE }
+};
+
 vendor_tag_info_t *qcamera3_tag_info[QCAMERA3_SECTIONS_END -
         VENDOR_SECTION] = {
     qcamera3_privatedata,
@@ -132,6 +139,7 @@
     qcamera3_sensor_meta_data,
     qcamera3_temporal_denoise,
     nexus_experimental_2015,
+    nexus_experimental_2016,
 };
 
 uint32_t qcamera3_all_tags[] = {
@@ -167,6 +175,9 @@
     //NEXUS_EXPERIMENTAL_2015
     (uint32_t)NEXUS_EXPERIMENTAL_2015_SENSOR_DYNAMIC_BLACK_LEVEL,
     (uint32_t)NEXUS_EXPERIMENTAL_2015_SENSOR_INFO_OPTICALLY_SHIELDED_REGIONS,
+
+    //NEXUS_EXPERIMENTAL_2016
+    (uint32_t)NEXUS_EXPERIMENTAL_2016_HYBRID_AE_ENABLE,
 };
 
 const vendor_tag_ops_t* QCamera3VendorTags::Ops = NULL;
diff --git a/camera/QCamera2/HAL3/QCamera3VendorTags.h b/camera/QCamera2/HAL3/QCamera3VendorTags.h
index 601b448..9277f74 100644
--- a/camera/QCamera2/HAL3/QCamera3VendorTags.h
+++ b/camera/QCamera2/HAL3/QCamera3VendorTags.h
@@ -42,6 +42,7 @@
     QCAMERA3_SENSOR_META_DATA,
     QCAMERA3_TEMPORAL_DENOISE,
     NEXUS_EXPERIMENTAL_2015,
+    NEXUS_EXPERIMENTAL_2016,
     QCAMERA3_SECTIONS_END
 };
 
@@ -54,7 +55,8 @@
     QCAMERA3_AV_TIMER_START = QCAMERA3_AV_TIMER << 16,
     QCAMERA3_SENSOR_META_DATA_START = QCAMERA3_SENSOR_META_DATA << 16,
     QCAMERA3_TEMPORAL_DENOISE_START = QCAMERA3_TEMPORAL_DENOISE << 16,
-    NEXUS_EXPERIMENTAL_2015_START = NEXUS_EXPERIMENTAL_2015 <<16
+    NEXUS_EXPERIMENTAL_2015_START = NEXUS_EXPERIMENTAL_2015 <<16,
+    NEXUS_EXPERIMENTAL_2016_START = NEXUS_EXPERIMENTAL_2016 <<16,
 };
 
 enum qcamera3_ext_tags {
@@ -136,7 +138,10 @@
 
     NEXUS_EXPERIMENTAL_2015_SENSOR_DYNAMIC_BLACK_LEVEL = NEXUS_EXPERIMENTAL_2015_START,
     NEXUS_EXPERIMENTAL_2015_SENSOR_INFO_OPTICALLY_SHIELDED_REGIONS,
-    NEXUS_EXPERIMENTAL_2015_END
+    NEXUS_EXPERIMENTAL_2015_END,
+
+    NEXUS_EXPERIMENTAL_2016_HYBRID_AE_ENABLE = NEXUS_EXPERIMENTAL_2016_START,
+    NEXUS_EXPERIMENTAL_2016_END,
 };
 
 // QCAMERA3_OPAQUE_RAW_FORMAT
diff --git a/camera/QCamera2/stack/common/cam_intf.h b/camera/QCamera2/stack/common/cam_intf.h
index 52682c3..bedf060 100644
--- a/camera/QCamera2/stack/common/cam_intf.h
+++ b/camera/QCamera2/stack/common/cam_intf.h
@@ -784,6 +784,7 @@
     INCLUDE(CAM_INTF_META_BLACK_LEVEL_SOURCE_PATTERN,   cam_black_level_metadata_t,  1);
     INCLUDE(CAM_INTF_META_BLACK_LEVEL_APPLIED_PATTERN,  cam_black_level_metadata_t,  1);
     INCLUDE(CAM_INTF_META_DAEMON_RESTART,               uint8_t,                     1);
+    INCLUDE(CAM_INTF_META_HYBRID_AE,                    uint8_t,                     1);
 } metadata_data_t;
 
 /* Update clear_metadata_buffer() function when a new is_xxx_valid is added to
diff --git a/camera/QCamera2/stack/common/cam_types.h b/camera/QCamera2/stack/common/cam_types.h
index 2bffc91..393154a 100644
--- a/camera/QCamera2/stack/common/cam_types.h
+++ b/camera/QCamera2/stack/common/cam_types.h
@@ -1776,6 +1776,8 @@
     CAM_INTF_META_VIDEO_STAB_MODE,
     /* Whether HAL has run into DRAIN error */
     CAM_INTF_META_DAEMON_RESTART,
+    /* Whether to enable hybrid ae mode */
+    CAM_INTF_META_HYBRID_AE,
     CAM_INTF_PARM_MAX
 } cam_intf_parm_type_t;