Merge "Camera2: Select VENUS specific code at compile-time"
diff --git a/QCamera2/HAL/QCamera2HWI.cpp b/QCamera2/HAL/QCamera2HWI.cpp
index 53fbb01..7cfd064 100644
--- a/QCamera2/HAL/QCamera2HWI.cpp
+++ b/QCamera2/HAL/QCamera2HWI.cpp
@@ -1299,6 +1299,10 @@
             streamInfo->num_of_burst = mParameters.getNumOfSnapshots();
         }
         break;
+    case CAM_STREAM_TYPE_POSTVIEW:
+        streamInfo->streaming_mode = CAM_STREAMING_MODE_BURST;
+        streamInfo->num_of_burst = mParameters.getNumOfSnapshots();
+        break;
     case CAM_STREAM_TYPE_OFFLINE_PROC:
         // right now offline process is only for WNR in ZSL case
         // use the same format and dimension for input and output
@@ -1801,8 +1805,6 @@
             (QCameraPicChannel *)m_channels[QCAMERA_CH_TYPE_ZSL];
         if (NULL != pZSLChannel) {
             pZSLChannel->cancelPicture();
-            stopChannel(QCAMERA_CH_TYPE_ZSL);
-            delChannel(QCAMERA_CH_TYPE_ZSL);
         }
     } else {
         // normal capture case
diff --git a/QCamera2/HAL/QCamera2HWI.h b/QCamera2/HAL/QCamera2HWI.h
index ab37958..f8396de 100644
--- a/QCamera2/HAL/QCamera2HWI.h
+++ b/QCamera2/HAL/QCamera2HWI.h
@@ -230,6 +230,7 @@
     int32_t prepareHardwareForSnapshot();
     bool needProcessPreviewFrame() {return m_stateMachine.isPreviewRunning();};
     bool isNoDisplayMode() {return mParameters.isNoDisplayMode();};
+    bool isZSLMode() {return mParameters.isZSLMode();};
     uint8_t numOfSnapshotsExpected() {return mParameters.getNumOfSnapshots();};
 
     static void camEvtHandle(uint32_t camera_handle,
diff --git a/QCamera2/HAL/QCameraParameters.cpp b/QCamera2/HAL/QCameraParameters.cpp
index 7e2fe7d..8910d26 100644
--- a/QCamera2/HAL/QCameraParameters.cpp
+++ b/QCamera2/HAL/QCameraParameters.cpp
@@ -99,6 +99,7 @@
 const char QCameraParameters::SCENE_MODE_BACKLIGHT[] = "backlight";
 const char QCameraParameters::SCENE_MODE_FLOWERS[] = "flowers";
 const char QCameraParameters::SCENE_MODE_AR[] = "AR";
+const char QCameraParameters::SCENE_MODE_HDR[] = "hdr";
 
 // Formats for setPreviewFormat and setPictureFormat.
 const char QCameraParameters::PIXEL_FORMAT_YUV420SP_ADRENO[] = "yuv420sp-adreno";
@@ -399,6 +400,7 @@
     { SCENE_MODE_BACKLIGHT,      CAM_SCENE_MODE_BACKLIGHT },
     { SCENE_MODE_FLOWERS,        CAM_SCENE_MODE_FLOWERS },
     { SCENE_MODE_AR,             CAM_SCENE_MODE_AR },
+    { SCENE_MODE_HDR,            CAM_SCENE_MODE_OFF },
 };
 
 const QCameraParameters::QCameraMap QCameraParameters::FLASH_MODES_MAP[] = {
@@ -1879,7 +1881,12 @@
     if (str != NULL) {
         if (prev_str == NULL ||
             strcmp(str, prev_str) != 0) {
-            return setMeteringAreas(str);
+            if ((strcmp(str, SCENE_MODE_HDR) == 0) ||
+                ((prev_str != NULL) && (strcmp(prev_str, SCENE_MODE_HDR) == 0))) {
+                ALOGD("%s: scene mode changed between HDR and non-HDR, need restart", __func__);
+                m_bNeedRestart = true;
+            }
+            return setSceneMode(str);
         }
     }
     return NO_ERROR;
@@ -1931,7 +1938,14 @@
         remove(KEY_QC_CAPTURE_BURST_EXPOSURE);
     }
 
-    const char *str = params.get(KEY_QC_AE_BRACKET_HDR);
+    const char *str = NULL;
+    const char *scene_mode = params.get(KEY_SCENE_MODE);
+    if (scene_mode != NULL && strcmp(scene_mode, SCENE_MODE_HDR) == 0) {
+        str = AE_BRACKET_HDR;
+    } else {
+        str = params.get(KEY_QC_AE_BRACKET_HDR);
+    }
+
     const char *prev_str = get(KEY_QC_AE_BRACKET_HDR);
     if (str != NULL) {
         if (prev_str == NULL ||
@@ -2496,15 +2510,17 @@
         String8 fpsRangeValues = createFpsRangeString(m_pCapability->fps_ranges_tbl,
                                                       m_pCapability->fps_ranges_tbl_cnt);
         set(KEY_SUPPORTED_PREVIEW_FPS_RANGE, fpsRangeValues.string());
-        setPreviewFpsRange(int(m_pCapability->fps_ranges_tbl[0].min_fps * 1000),
-                           int(m_pCapability->fps_ranges_tbl[0].max_fps * 1000));
+        int min_fps =
+            int(m_pCapability->fps_ranges_tbl[m_pCapability->fps_ranges_tbl_cnt - 1].min_fps * 1000);
+        int max_fps =
+            int(m_pCapability->fps_ranges_tbl[m_pCapability->fps_ranges_tbl_cnt - 1].max_fps * 1000);
+        setPreviewFpsRange(min_fps, max_fps);
 
         // Set legacy preview fps
         String8 fpsValues = createFpsString(m_pCapability->fps_ranges_tbl,
                                             m_pCapability->fps_ranges_tbl_cnt);
         set(KEY_SUPPORTED_PREVIEW_FRAME_RATES, fpsValues.string());
-        CameraParameters::setPreviewFrameRate(
-           (int)(m_pCapability->fps_ranges_tbl[0].max_fps * 1000));
+        CameraParameters::setPreviewFrameRate(max_fps);
     } else {
         ALOGE("%s: supported fps ranges cnt is 0!!!", __func__);
     }
diff --git a/QCamera2/HAL/QCameraParameters.h b/QCamera2/HAL/QCameraParameters.h
index 04071ad..049243b 100644
--- a/QCamera2/HAL/QCameraParameters.h
+++ b/QCamera2/HAL/QCameraParameters.h
@@ -158,6 +158,7 @@
     static const char SCENE_MODE_BACKLIGHT[];
     static const char SCENE_MODE_FLOWERS[];
     static const char SCENE_MODE_AR[];
+    static const char SCENE_MODE_HDR[];
     static const char PIXEL_FORMAT_YUV420SP_ADRENO[]; // ADRENO
     static const char PIXEL_FORMAT_YV12[]; // NV12
     static const char PIXEL_FORMAT_NV12[]; //NV12
diff --git a/QCamera2/HAL/QCameraStateMachine.cpp b/QCamera2/HAL/QCameraStateMachine.cpp
index 2993d97..daa6c6e 100644
--- a/QCamera2/HAL/QCameraStateMachine.cpp
+++ b/QCamera2/HAL/QCameraStateMachine.cpp
@@ -381,9 +381,13 @@
     case QCAMERA_SM_EVT_START_PREVIEW:
         {
             if (m_parent->mPreviewWindow == NULL) {
-                // preview window is not set yet, move to previewReady state
-                m_state = QCAMERA_SM_STATE_PREVIEW_READY;
-                rc = NO_ERROR;
+                rc = m_parent->preparePreview();
+                if(rc == NO_ERROR) {
+                    // preview window is not set yet, move to previewReady state
+                    m_state = QCAMERA_SM_STATE_PREVIEW_READY;
+                } else {
+                    ALOGE("%s: preparePreview failed",__func__);
+                }
             } else {
                 rc = m_parent->preparePreview();
                 if (rc == NO_ERROR) {
@@ -606,8 +610,21 @@
             bool needRestart = false;
             rc = m_parent->updateParameters((char*)payload, needRestart);
             if (rc == NO_ERROR) {
-                rc = m_parent->commitParameterChanges();
+                if (needRestart) {
+                    // need restart preview for parameters to take effect
+                    m_parent->unpreparePreview();
+                    // commit parameter changes to server
+                    m_parent->commitParameterChanges();
+                    // prepare preview again
+                    rc = m_parent->preparePreview();
+                    if (rc != NO_ERROR) {
+                        m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
+                    }
+                } else {
+                    rc = m_parent->commitParameterChanges();
+                }
             }
+
             result.status = rc;
             result.request_api = evt;
             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
@@ -975,7 +992,11 @@
             rc = m_parent->takePicture();
             if (rc == NO_ERROR) {
                 // move state to picture taking state
-                m_state = QCAMERA_SM_STATE_PIC_TAKING;
+                if (m_parent->isZSLMode()) {
+                    m_state = QCAMERA_SM_STATE_PREVIEW_PIC_TAKING;
+                } else {
+                    m_state = QCAMERA_SM_STATE_PIC_TAKING;
+                }
             } else {
                 // move state to preview stopped state
                 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
diff --git a/QCamera2/HAL/QCameraStateMachine.h b/QCamera2/HAL/QCameraStateMachine.h
index 0e7502f..107b5ae 100644
--- a/QCamera2/HAL/QCameraStateMachine.h
+++ b/QCamera2/HAL/QCameraStateMachine.h
@@ -149,7 +149,7 @@
         QCAMERA_SM_STATE_PIC_TAKING,               // taking picture (preview stopped)
         QCAMERA_SM_STATE_RECORDING,                // recording (preview running)
         QCAMERA_SM_STATE_VIDEO_PIC_TAKING,         // taking live snapshot during recording (preview running)
-        QCAMERA_SM_STATE_PREVIEW_PIC_TAKING        // taking live snapshot (recording stopped but preview running)
+        QCAMERA_SM_STATE_PREVIEW_PIC_TAKING        // taking ZSL/live snapshot (recording stopped but preview running)
     } qcamera_state_enum_t;
 
     typedef enum