Merge "QCamera2: msmcobalt: HAL3: Add hybrid AE vendor tag" into nyc-mr2-dev
diff --git a/msm8998/QCamera2/HAL3/QCamera3HWI.cpp b/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
index 5c6fcfe..1bb833c 100644
--- a/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
+++ b/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
@@ -9052,6 +9052,13 @@
     memset(videoOisProp, 0, sizeof(videoOisProp));
     property_get("persist.camera.ois.video", videoOisProp, "1");
     uint8_t forceVideoOis = (uint8_t)atoi(videoOisProp);
+
+    // 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);
+
     uint8_t controlIntent = 0;
     uint8_t focusMode;
     uint8_t vsMode;
@@ -9455,6 +9462,9 @@
     int32_t instant_aec_mode = (int32_t)QCAMERA3_INSTANT_AEC_NORMAL_CONVERGENCE;
     settings.update(QCAMERA3_INSTANT_AEC_MODE, &instant_aec_mode, 1);
 
+    /* hybrid ae */
+    settings.update(NEXUS_EXPERIMENTAL_2016_HYBRID_AE_ENABLE, &hybrid_ae, 1);
+
     mDefaultMetadata[type] = settings.release();
 
     return mDefaultMetadata[type];
@@ -10814,6 +10824,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/msm8998/QCamera2/HAL3/QCamera3VendorTags.cpp b/msm8998/QCamera2/HAL3/QCamera3VendorTags.cpp
index 9bd9ec7..cf8123f 100644
--- a/msm8998/QCamera2/HAL3/QCamera3VendorTags.cpp
+++ b/msm8998/QCamera2/HAL3/QCamera3VendorTags.cpp
@@ -62,7 +62,8 @@
         QCAMERA3_IR_END,
         QCAMERA3_AEC_CONVERGENCE_SPEED_END,
         QCAMERA3_AWB_CONVERGENCE_SPEED_END,
-        QCAMERA3_INSTANT_AEC_END
+        QCAMERA3_INSTANT_AEC_END,
+        NEXUS_EXPERIMENTAL_2016_END,
 };
 
 typedef struct vendor_tag_info {
@@ -91,7 +92,8 @@
     "org.codeaurora.qcamera3.ir",
     "org.codeaurora.qcamera3.aec_convergence_speed",
     "org.codeaurora.qcamera3.awb_convergence_speed",
-    "org.codeaurora.qcamera3.instant_aec"
+    "org.codeaurora.qcamera3.instant_aec",
+    "com.google.nexus.experimental2016"
 };
 
 vendor_tag_info_t qcamera3_privatedata[QCAMERA3_PRIVATEDATA_END - QCAMERA3_PRIVATEDATA_START] = {
@@ -211,6 +213,11 @@
     { "instant_aec_available_modes",   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,
@@ -232,7 +239,8 @@
     qcamera3_ir,
     qcamera3_aec_speed,
     qcamera3_awb_speed,
-    qcamera3_instant_aec
+    qcamera3_instant_aec,
+    nexus_experimental_2016,
 };
 
 uint32_t qcamera3_all_tags[] = {
@@ -309,7 +317,10 @@
 
     // QCAMERA3_INSTANT_AEC
     (uint32_t)QCAMERA3_INSTANT_AEC_MODE,
-    (uint32_t)QCAMERA3_INSTANT_AEC_AVAILABLE_MODES
+    (uint32_t)QCAMERA3_INSTANT_AEC_AVAILABLE_MODES,
+
+    //NEXUS_EXPERIMENTAL_2016
+    (uint32_t)NEXUS_EXPERIMENTAL_2016_HYBRID_AE_ENABLE,
 };
 
 const vendor_tag_ops_t* QCamera3VendorTags::Ops = NULL;
diff --git a/msm8998/QCamera2/HAL3/QCamera3VendorTags.h b/msm8998/QCamera2/HAL3/QCamera3VendorTags.h
index 2ec541c..532c8ab 100644
--- a/msm8998/QCamera2/HAL3/QCamera3VendorTags.h
+++ b/msm8998/QCamera2/HAL3/QCamera3VendorTags.h
@@ -56,6 +56,7 @@
     QCAMERA3_AEC_CONVERGENCE,
     QCAMERA3_AWB_CONVERGENCE,
     QCAMERA3_INSTANT_AEC,
+    NEXUS_EXPERIMENTAL_2016,
     QCAMERA3_SECTIONS_END
 };
 
@@ -79,7 +80,8 @@
     QCAMERA3_IR_START = QCAMERA3_IR << 16,
     QCAMERA3_AEC_CONVERGENCE_SPEED_START = QCAMERA3_AEC_CONVERGENCE << 16,
     QCAMERA3_AWB_CONVERGENCE_SPEED_START = QCAMERA3_AWB_CONVERGENCE << 16,
-    QCAMERA3_INSTANT_AEC_START = QCAMERA3_INSTANT_AEC << 16
+    QCAMERA3_INSTANT_AEC_START = QCAMERA3_INSTANT_AEC << 16,
+    NEXUS_EXPERIMENTAL_2016_START = NEXUS_EXPERIMENTAL_2016 <<16
 };
 
 enum qcamera3_ext_tags {
@@ -225,7 +227,10 @@
 
     QCAMERA3_INSTANT_AEC_MODE = QCAMERA3_INSTANT_AEC_START,
     QCAMERA3_INSTANT_AEC_AVAILABLE_MODES,
-    QCAMERA3_INSTANT_AEC_END
+    QCAMERA3_INSTANT_AEC_END,
+
+    NEXUS_EXPERIMENTAL_2016_HYBRID_AE_ENABLE = NEXUS_EXPERIMENTAL_2016_START,
+    NEXUS_EXPERIMENTAL_2016_END,
 };
 
 // QCAMERA3_OPAQUE_RAW_FORMAT
diff --git a/msm8998/QCamera2/stack/common/cam_intf.h b/msm8998/QCamera2/stack/common/cam_intf.h
index e978bfd..626d86d 100644
--- a/msm8998/QCamera2/stack/common/cam_intf.h
+++ b/msm8998/QCamera2/stack/common/cam_intf.h
@@ -1106,6 +1106,7 @@
     INCLUDE(CAM_INTF_PARM_HAL_BRACKETING_HDR,           cam_hdr_param_t,             1);
     INCLUDE(CAM_INTF_META_DC_LOW_POWER_ENABLE,          uint8_t,                     1);
     INCLUDE(CAM_INTF_META_DC_SAC_OUTPUT_INFO,           cam_sac_output_info_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/msm8998/QCamera2/stack/common/cam_types.h b/msm8998/QCamera2/stack/common/cam_types.h
index 05117b0..912d817 100644
--- a/msm8998/QCamera2/stack/common/cam_types.h
+++ b/msm8998/QCamera2/stack/common/cam_types.h
@@ -2332,6 +2332,8 @@
     CAM_INTF_META_DC_SAC_OUTPUT_INFO,
     /* Dual camera - enable low power mode for the slave camera */
     CAM_INTF_META_DC_LOW_POWER_ENABLE,
+    /* Whether to enable hybrid ae mode */
+    CAM_INTF_META_HYBRID_AE,
     CAM_INTF_PARM_MAX
 } cam_intf_parm_type_t;