Camera2: skip meta data stream as an input source of reprocess

- Postporp module cannot support reprocess on meta data stream, so will
  skip adding meta data stream as an input source for online reprocess.
- Stop channel first if it's active in its destructor.

Change-Id: I390803fa03a9a17ee3132419959c5d43db08ac03
diff --git a/QCamera2/HAL/QCameraChannel.cpp b/QCamera2/HAL/QCameraChannel.cpp
index 78a460d..0f2a02c 100644
--- a/QCamera2/HAL/QCameraChannel.cpp
+++ b/QCamera2/HAL/QCameraChannel.cpp
@@ -54,6 +54,7 @@
 {
     m_camHandle = cam_handle;
     m_camOps = cam_ops;
+    m_bIsActive = false;
 
     m_handle = 0;
     m_numStreams = 0;
@@ -73,6 +74,7 @@
 {
     m_camHandle = 0;
     m_camOps = NULL;
+    m_bIsActive = false;
 
     m_handle = 0;
     m_numStreams = 0;
@@ -90,6 +92,10 @@
  *==========================================================================*/
 QCameraChannel::~QCameraChannel()
 {
+    if (m_bIsActive) {
+        stop();
+    }
+
     for (int i = 0; i < m_numStreams; i++) {
         if (mStreams[i] != NULL) {
             delete mStreams[i];
@@ -227,6 +233,8 @@
                 mStreams[i]->stop();
             }
         }
+    } else {
+        m_bIsActive = true;
     }
 
     return rc;
@@ -254,6 +262,7 @@
         }
     }
 
+    m_bIsActive = false;
     return rc;
 }
 
@@ -579,6 +588,12 @@
     for (int i = 0; i < pSrcChannel->getNumOfStreams(); i++) {
         pStream = pSrcChannel->getStreamByIndex(i);
         if (pStream != NULL) {
+            if (pStream->isTypeOf(CAM_STREAM_TYPE_METADATA)) {
+                // Skip metadata for reprocess now because PP module cannot handle meta data
+                // May need furthur discussion if Imaginglib need meta data
+                continue;
+            }
+
             pStreamInfoBuf = allocator.allocateStreamInfoBuf(CAM_STREAM_TYPE_OFFLINE_PROC);
             if (pStreamInfoBuf == NULL) {
                 ALOGE("%s: no mem for stream info buf", __func__);
diff --git a/QCamera2/HAL/QCameraChannel.h b/QCamera2/HAL/QCameraChannel.h
index 2fd64cd..51b14e4 100644
--- a/QCamera2/HAL/QCameraChannel.h
+++ b/QCamera2/HAL/QCameraChannel.h
@@ -69,6 +69,7 @@
 protected:
     uint32_t m_camHandle;
     mm_camera_ops_t *m_camOps;
+    bool m_bIsActive;
 
     uint32_t m_handle;
     uint8_t m_numStreams;
diff --git a/QCamera2/HAL/QCameraPostProc.cpp b/QCamera2/HAL/QCameraPostProc.cpp
index 8e63e7f..b58782d 100644
--- a/QCamera2/HAL/QCameraPostProc.cpp
+++ b/QCamera2/HAL/QCameraPostProc.cpp
@@ -716,13 +716,8 @@
 void QCameraPostProcessor::releasePPInputData(void *data, void *user_data)
 {
     QCameraPostProcessor *pme = (QCameraPostProcessor *)user_data;
-    qcamera_pp_request_t *request = (qcamera_pp_request_t *)data;
     if (NULL != pme) {
-        if (request->frame != NULL) {
-            pme->releaseSuperBuf(request->frame);
-            free(request->frame);
-            request->frame = NULL;
-        }
+        pme->releaseSuperBuf((mm_camera_super_buf_t *)data);
     }
 }
 
@@ -1379,17 +1374,17 @@
                         }
                     }
 
-                    qcamera_pp_request_t *request =
-                        (qcamera_pp_request_t *)pme->m_inputPPQ.dequeue();
-                    if (NULL != request) {
+                    mm_camera_super_buf_t *pp_frame =
+                        (mm_camera_super_buf_t *)pme->m_inputPPQ.dequeue();
+                    if (NULL != pp_frame) {
                         qcamera_pp_data_t *pp_job =
                             (qcamera_pp_data_t *)malloc(sizeof(qcamera_pp_data_t));
                         if (pp_job != NULL) {
                             memset(pp_job, 0, sizeof(qcamera_pp_data_t));
                             if (pme->m_pReprocChannel != NULL) {
-                                ret = pme->m_pReprocChannel->doReprocess(request->frame);
+                                ret = pme->m_pReprocChannel->doReprocess(pp_frame);
                                 if (ret == 0) {
-                                    pp_job->src_frame = request->frame;
+                                    pp_job->src_frame = pp_frame;
                                 }
                             } else {
                                 ALOGE("%s: Reprocess channel is NULL", __func__);
@@ -1402,12 +1397,10 @@
 
                         if (0 != ret) {
                             // free frame
-                            if (request->frame != NULL) {
-                                pme->releaseSuperBuf(request->frame);
-                                free(request->frame);
+                            if (pp_frame != NULL) {
+                                pme->releaseSuperBuf(pp_frame);
+                                free(pp_frame);
                             }
-                            // free request buf
-                            free(request);
                             // send error notify
                             pme->sendDataNotify(CAMERA_MSG_COMPRESSED_IMAGE,
                                                 NULL,
@@ -1415,9 +1408,6 @@
                                                 NULL,
                                                 NULL);
                         } else {
-                            // free request buf
-                            free(request);
-
                             // add into ongoing jpeg job Q
                             pme->m_ongoingPPQ.enqueue((void *)pp_job);
                         }
@@ -1435,13 +1425,10 @@
                         pme->releaseSuperBuf(super_buf);
                         free(super_buf);
                     }
-                    qcamera_pp_request_t *request =
-                        (qcamera_pp_request_t *)pme->m_inputPPQ.dequeue();
-                    if (NULL != request) {
-                        if (request->frame != NULL) {
-                            pme->releaseSuperBuf(request->frame);
-                        }
-                        free(request);
+                    super_buf = (mm_camera_super_buf_t *)pme->m_inputPPQ.dequeue();
+                    if (NULL != super_buf) {
+                        pme->releaseSuperBuf(super_buf);
+                        free(super_buf);
                     }
                 }
             }
diff --git a/QCamera2/HAL/QCameraStateMachine.cpp b/QCamera2/HAL/QCameraStateMachine.cpp
index 882f443..904130c 100644
--- a/QCamera2/HAL/QCameraStateMachine.cpp
+++ b/QCamera2/HAL/QCameraStateMachine.cpp
@@ -1579,9 +1579,10 @@
         break;
     case QCAMERA_SM_EVT_TAKE_PICTURE:
         {
+            m_state = QCAMERA_SM_STATE_VIDEO_PIC_TAKING;
             rc = m_parent->takeLiveSnapshot();
-            if (rc == 0) {
-                m_state = QCAMERA_SM_STATE_VIDEO_PIC_TAKING;
+            if (rc != NO_ERROR) {
+                m_state = QCAMERA_SM_STATE_RECORDING;
             }
             result.status = rc;
             result.request_api = evt;