QCamera2: Integrates pipeline events during longshot

- If supported by the camera reprocess events will
  trigger the shutter callback, notifying the camera
  client that it could queue a new buffer via a
  'takePicture()'.

Change-Id: I39f56d08e09599fe2841268d563a123573360198
diff --git a/QCamera2/HAL/QCameraPostProc.cpp b/QCamera2/HAL/QCameraPostProc.cpp
index b61fd49..63d6107 100644
--- a/QCamera2/HAL/QCameraPostProc.cpp
+++ b/QCamera2/HAL/QCameraPostProc.cpp
@@ -78,7 +78,8 @@
       mUseSaveProc(false),
       mUseJpegBurst(false),
       mJpegMemOpt(true),
-      mNewJpegSessionNeeded(true)
+      mNewJpegSessionNeeded(true),
+      mMultipleStages(false)
 {
     memset(&mJpegHandle, 0, sizeof(mJpegHandle));
     memset(&m_pJpegOutputMem, 0, sizeof(m_pJpegOutputMem));
@@ -225,6 +226,8 @@
     m_dataProcTh.sendCmd(CAMERA_CMD_TYPE_START_DATA_PROC, FALSE, FALSE);
     m_parent->m_cbNotifier.startSnapshots();
 
+    mMultipleStages = false;
+
     // Create Jpeg session
     if ( !m_parent->mParameters.getRecordingHintValue() &&
             !m_parent->isLongshotEnabled() &&
@@ -832,11 +835,8 @@
         return processRawData(frame);
     }
 
-    if ( m_parent->isLongshotEnabled() ) {
-        // play shutter sound for longshot
-        // after reprocess is done
-        // TODO: Move this after CAC done event
-
+    if ( m_parent->isLongshotEnabled() &&
+         !getMultipleStages() ) {
         m_parent->playShutter();
     }
 
diff --git a/QCamera2/HAL/QCameraPostProc.h b/QCamera2/HAL/QCameraPostProc.h
index 8acbd7a..a8f29ba 100644
--- a/QCamera2/HAL/QCameraPostProc.h
+++ b/QCamera2/HAL/QCameraPostProc.h
@@ -119,6 +119,8 @@
     int32_t processJpegEvt(qcamera_jpeg_evt_payload_t *evt);
     int32_t getJpegPaddingReq(cam_padding_info_t &padding_info);
     QCameraReprocessChannel * getReprocChannel() {return m_pReprocChannel;};
+    bool getMultipleStages() { return mMultipleStages; };
+    void setMultipleStages(bool stages) { mMultipleStages = stages; };
 
 private:
     int32_t sendDataNotify(int32_t msg_type,
@@ -184,6 +186,7 @@
     bool mUseJpegBurst;                 // use jpeg burst encoding mode
     bool mJpegMemOpt;
     uint8_t mNewJpegSessionNeeded;
+    bool mMultipleStages;               // multiple stages are present
 };
 
 }; // namespace qcamera
diff --git a/QCamera2/HAL/QCameraStateMachine.cpp b/QCamera2/HAL/QCameraStateMachine.cpp
index f90e24e..e724d1c 100644
--- a/QCamera2/HAL/QCameraStateMachine.cpp
+++ b/QCamera2/HAL/QCameraStateMachine.cpp
@@ -1664,6 +1664,16 @@
         {
             mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
             switch (cam_evt->server_event_type) {
+            case CAM_EVENT_TYPE_REPROCESS_STAGE_DONE:
+                {
+                    if ( m_parent->isLongshotEnabled() ) {
+                        if(!m_parent->m_postprocessor.getMultipleStages()) {
+                            m_parent->m_postprocessor.setMultipleStages(true);
+                        }
+                        m_parent->playShutter();
+                    }
+                }
+                break;
             case CAM_EVENT_TYPE_DAEMON_DIED:
                 {
                     m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
@@ -2752,6 +2762,16 @@
         {
             mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
             switch (cam_evt->server_event_type) {
+            case CAM_EVENT_TYPE_REPROCESS_STAGE_DONE:
+                {
+                    if ( m_parent->isLongshotEnabled() ) {
+                        if(!m_parent->m_postprocessor.getMultipleStages()) {
+                            m_parent->m_postprocessor.setMultipleStages(true);
+                        }
+                        m_parent->playShutter();
+                    }
+                }
+                break;
             case CAM_EVENT_TYPE_DAEMON_DIED:
                 {
                     m_parent->sendEvtNotify(CAMERA_MSG_ERROR,