QCamera2: Enable sensor HDR support in HAL3.

Issue:
sensor HDR is enabled only in video mode for HAL3.

Fix:
Add sensor HDR support for snapshot mode as well.

Use below setprop to enable sensor HDR :
adb shell setprop persist.camera.sensor.hdr <value>

where value is one of cam_sensor_hdr_type_t
0 -> off
1 -> IN_SENSOR
2 -> ZIGZAG
3 -> STAGGERED

CRs-Fixed: 1075030
Change-Id: I6d22ab8e26c38a8cc3b3cd4119313fffad9e4e90
diff --git a/msm8998/QCamera2/HAL3/QCamera3HWI.cpp b/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
index d172bbd..e145f8a 100644
--- a/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
+++ b/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
@@ -195,7 +195,8 @@
     { ANDROID_CONTROL_SCENE_MODE_SPORTS ,        CAM_SCENE_MODE_SPORTS },
     { ANDROID_CONTROL_SCENE_MODE_PARTY,          CAM_SCENE_MODE_PARTY },
     { ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT,    CAM_SCENE_MODE_CANDLELIGHT },
-    { ANDROID_CONTROL_SCENE_MODE_BARCODE,        CAM_SCENE_MODE_BARCODE}
+    { ANDROID_CONTROL_SCENE_MODE_BARCODE,        CAM_SCENE_MODE_BARCODE},
+    { ANDROID_CONTROL_SCENE_MODE_HDR,            CAM_SCENE_MODE_HDR}
 };
 
 const QCamera3HardwareInterface::QCameraMap<
@@ -424,7 +425,8 @@
       mIsMainCamera(true),
       mLinkedCameraId(0),
       m_pDualCamCmdHeap(NULL),
-      m_pDualCamCmdPtr(NULL)
+      m_pDualCamCmdPtr(NULL),
+      m_bSensorHDREnabled(false)
 {
     getLogLevel();
     mCommon.init(gCamCapability[cameraId]);
@@ -8688,6 +8690,7 @@
             int val = lookupFwkName(SCENE_MODES_MAP,
                     METADATA_MAP_SIZE(SCENE_MODES_MAP),
                     gCamCapability[cameraId]->supported_scene_modes[i]);
+
             if (NAME_NOT_FOUND != val) {
                 avail_scene_modes[supported_scene_modes_cnt] = (uint8_t)val;
                 supported_indexes[supported_scene_modes_cnt] = (uint8_t)i;
@@ -9338,10 +9341,12 @@
     staticInfo.update(QCAMERA3_OPAQUE_RAW_STRIDES, strides.array(),
             strides.size());
 
+    //TBD: remove the following line once backend advertises zzHDR in feature mask
+    gCamCapability[cameraId]->qcom_supported_feature_mask |= CAM_QCOM_FEATURE_ZIGZAG_HDR;
     //Video HDR default
     if ((gCamCapability[cameraId]->qcom_supported_feature_mask) &
             (CAM_QCOM_FEATURE_STAGGERED_VIDEO_HDR |
-            CAM_QCOM_FEATURE_ZIGZAG_VIDEO_HDR | CAM_QCOM_FEATURE_SENSOR_HDR)) {
+            CAM_QCOM_FEATURE_ZIGZAG_HDR | CAM_QCOM_FEATURE_SENSOR_HDR)) {
         int32_t vhdr_mode[] = {
                 QCAMERA3_VIDEO_HDR_MODE_OFF,
                 QCAMERA3_VIDEO_HDR_MODE_ON};
@@ -10151,9 +10156,6 @@
     int32_t mode = cds_mode;
     settings.update(QCAMERA3_CDS_MODE, &mode, 1);
 
-    int32_t hdr_mode = (int32_t)QCAMERA3_VIDEO_HDR_MODE_OFF;
-    settings.update(QCAMERA3_VIDEO_HDR_MODE, &hdr_mode, 1);
-
     /* IR Mode Default Off */
     int32_t ir_mode = (int32_t)QCAMERA3_IR_MODE_OFF;
     settings.update(QCAMERA3_IR_MODE, &ir_mode, 1);
@@ -11925,6 +11927,12 @@
         metadata_buffer_t *hal_metadata)
 {
     int32_t rc = NO_ERROR;
+    uint8_t sceneMode = CAM_SCENE_MODE_OFF;
+
+    if (ANDROID_CONTROL_MODE_OFF_KEEP_STATE == metaMode) {
+        LOGD("Ignoring control mode OFF_KEEP_STATE");
+        return NO_ERROR;
+    }
 
     if (metaMode == ANDROID_CONTROL_MODE_USE_SCENE_MODE) {
         camera_metadata_ro_entry entry =
@@ -11938,15 +11946,17 @@
                 sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]),
                 fwk_sceneMode);
         if (NAME_NOT_FOUND != val) {
-            uint8_t sceneMode = (uint8_t)val;
+            sceneMode = (uint8_t)val;
             LOGD("sceneMode: %d", sceneMode);
-            if (ADD_SET_PARAM_ENTRY_TO_BATCH(hal_metadata,
-                    CAM_INTF_PARM_BESTSHOT_MODE, sceneMode)) {
-                rc = BAD_VALUE;
-            }
         }
+    }
 
-        if (fwk_sceneMode == ANDROID_CONTROL_SCENE_MODE_HDR) {
+    if ((sceneMode == CAM_SCENE_MODE_HDR) || m_bSensorHDREnabled) {
+        rc = setSensorHDR(hal_metadata, (sceneMode == CAM_SCENE_MODE_HDR));
+    }
+
+    if ((rc == NO_ERROR) && !m_bSensorHDREnabled) {
+        if (sceneMode == ANDROID_CONTROL_SCENE_MODE_HDR) {
             cam_hdr_param_t hdr_params;
             hdr_params.hdr_enable = 1;
             hdr_params.hdr_mode = CAM_HDR_MODE_MULTIFRAME;
@@ -11956,10 +11966,7 @@
                 rc = BAD_VALUE;
             }
         }
-    } else if ((ANDROID_CONTROL_MODE_OFF == metaMode) ||
-            (ANDROID_CONTROL_MODE_AUTO == metaMode)) {
-        uint8_t sceneMode = CAM_SCENE_MODE_OFF;
-        LOGD("sceneMode: %d", sceneMode);
+
         if (ADD_SET_PARAM_ENTRY_TO_BATCH(hal_metadata,
                 CAM_INTF_PARM_BESTSHOT_MODE, sceneMode)) {
             rc = BAD_VALUE;
@@ -11994,48 +12001,83 @@
 int32_t QCamera3HardwareInterface::setVideoHdrMode(
         metadata_buffer_t *hal_metadata, cam_video_hdr_mode_t vhdr)
 {
+    if ( (vhdr >= CAM_VIDEO_HDR_MODE_OFF) && (vhdr < CAM_VIDEO_HDR_MODE_MAX)) {
+        return setSensorHDR(hal_metadata, (vhdr == CAM_VIDEO_HDR_MODE_ON), true);
+    }
+
+    LOGE("Invalid Video HDR mode %d!", vhdr);
+    return BAD_VALUE;
+}
+
+/*===========================================================================
+ * FUNCTION   : setSensorHDR
+ *
+ * DESCRIPTION: Enable/disable sensor HDR.
+ *
+ * PARAMETERS :
+ *      @hal_metadata: hal metadata structure
+ *      @enable: boolean whether to enable/disable sensor HDR
+ *
+ * RETURN     : None
+ *==========================================================================*/
+int32_t QCamera3HardwareInterface::setSensorHDR(
+        metadata_buffer_t *hal_metadata, bool enable, bool isVideoHdrEnable)
+{
     int32_t rc = NO_ERROR;
-    if ((CAM_VIDEO_HDR_MODE_MAX <= (vhdr)) || (0 > (vhdr))) {
-        LOGE("%s: Invalid Video HDR mode %d!", __func__, vhdr);
-        rc = BAD_VALUE;
-    } else {
-        cam_sensor_hdr_type_t vhdr_type = CAM_SENSOR_HDR_MAX;
-        if(vhdr == QCAMERA3_VIDEO_HDR_MODE_OFF) {
-            LOGD("Setting HDR mode Off");
-            vhdr_type = CAM_SENSOR_HDR_OFF;
-        } else {
-            char video_hdr_prop[PROPERTY_VALUE_MAX];
-            memset(video_hdr_prop, 0, sizeof(video_hdr_prop));
-            property_get("persist.camera.hdr.video", video_hdr_prop, "3");
-            uint8_t use_hdr_video = (uint8_t)atoi(video_hdr_prop);
-            if ((gCamCapability[mCameraId]->qcom_supported_feature_mask &
-                    CAM_QCOM_FEATURE_SENSOR_HDR) &&
-                    (use_hdr_video == CAM_SENSOR_HDR_IN_SENSOR)) {
+    cam_sensor_hdr_type_t sensor_hdr = CAM_SENSOR_HDR_OFF;
+
+    if (enable) {
+        char sensor_hdr_prop[PROPERTY_VALUE_MAX];
+        memset(sensor_hdr_prop, 0, sizeof(sensor_hdr_prop));
+        #ifdef _LE_CAMERA_
+        //Default to staggered HDR for IOT
+        property_get("persist.camera.sensor.hdr", sensor_hdr_prop, "3");
+        #else
+        property_get("persist.camera.sensor.hdr", sensor_hdr_prop, "0");
+        #endif
+        sensor_hdr = (cam_sensor_hdr_type_t) atoi(sensor_hdr_prop);
+    }
+
+    bool isSupported = false;
+    switch (sensor_hdr) {
+        case CAM_SENSOR_HDR_IN_SENSOR:
+            if (gCamCapability[mCameraId]->qcom_supported_feature_mask &
+                    CAM_QCOM_FEATURE_SENSOR_HDR) {
+                isSupported = true;
                 LOGD("Setting HDR mode In Sensor");
-                vhdr_type = CAM_SENSOR_HDR_IN_SENSOR;
             }
-            if ((gCamCapability[mCameraId]->qcom_supported_feature_mask &
-                    CAM_QCOM_FEATURE_ZIGZAG_VIDEO_HDR) &&
-                    (use_hdr_video == CAM_SENSOR_HDR_ZIGZAG)) {
+            break;
+        case CAM_SENSOR_HDR_ZIGZAG:
+            if (gCamCapability[mCameraId]->qcom_supported_feature_mask &
+                    CAM_QCOM_FEATURE_ZIGZAG_HDR) {
+                isSupported = true;
                 LOGD("Setting HDR mode Zigzag");
-                vhdr_type = CAM_SENSOR_HDR_ZIGZAG;
             }
-            if ((gCamCapability[mCameraId]->qcom_supported_feature_mask &
-                    CAM_QCOM_FEATURE_STAGGERED_VIDEO_HDR) &&
-                    (use_hdr_video == CAM_SENSOR_HDR_STAGGERED)) {
+            break;
+        case CAM_SENSOR_HDR_STAGGERED:
+            if (gCamCapability[mCameraId]->qcom_supported_feature_mask &
+                    CAM_QCOM_FEATURE_STAGGERED_VIDEO_HDR) {
+                isSupported = true;
                 LOGD("Setting HDR mode Staggered");
-                vhdr_type = CAM_SENSOR_HDR_STAGGERED;
             }
-            if(vhdr_type == CAM_SENSOR_HDR_MAX) {
-                LOGD("HDR mode not supported");
-                rc = BAD_VALUE;
-            }
-        }
-        if(rc == NO_ERROR) {
-            if (ADD_SET_PARAM_ENTRY_TO_BATCH(hal_metadata,
-                    CAM_INTF_PARM_SENSOR_HDR, vhdr_type)) {
-                rc = BAD_VALUE;
-            }
+            break;
+        case CAM_SENSOR_HDR_OFF:
+            isSupported = true;
+            LOGD("Turning off sensor HDR");
+            break;
+        default:
+            LOGE("HDR mode %d not supported", sensor_hdr);
+            rc = BAD_VALUE;
+            break;
+    }
+
+    if(isSupported) {
+        if (ADD_SET_PARAM_ENTRY_TO_BATCH(hal_metadata,
+                CAM_INTF_PARM_SENSOR_HDR, sensor_hdr)) {
+            rc = BAD_VALUE;
+        } else {
+            if(!isVideoHdrEnable)
+                m_bSensorHDREnabled = (sensor_hdr != CAM_SENSOR_HDR_OFF);
         }
     }
     return rc;