camera: Changes to match ZSL snapshot match issue.

Preview frames are blocked when takePicture is issued. Changes to
make sure send Preview frames till actual snapshot frames received.
Change to handle the case when startPreview issued after takePicture
without stopPreview.

Bug: 7349527
Change-Id: I155b92fe0858b0eb1ea00cb4d0f4601e8bc98c17
Signed-off-by: Iliyan Malchev <malchev@google.com>
diff --git a/QCameraHWI.cpp b/QCameraHWI.cpp
index 56bd29b..4668b5a 100755
--- a/QCameraHWI.cpp
+++ b/QCameraHWI.cpp
@@ -1005,6 +1005,15 @@
 
     ALOGV("%s: mPreviewState =%d", __func__, mPreviewState);
     Mutex::Autolock lock(mLock);
+
+    if(mPauseFramedispatch){
+        //In ZSL case after snapshot we need to restart
+        //if stop preview not issued.
+        stopPreviewInternal();
+        mPreviewState = QCAMERA_HAL_PREVIEW_STOPPED;
+        mPauseFramedispatch = false;
+    }
+
     switch(mPreviewState) {
     case QCAMERA_HAL_PREVIEW_STOPPED:
     case QCAMERA_HAL_TAKE_PICTURE:
@@ -1043,8 +1052,8 @@
     cam_ctrl_dimension_t dim;
     mm_camera_dimension_t maxDim;
     bool initPreview = false;
-    mPauseFramedispatch = false;
 
+    mPauseFramedispatch = false;
     if (mPreviewState == QCAMERA_HAL_PREVIEW_STARTED) { //isPreviewRunning()){
         ALOGE("%s:Preview already started  mCameraState = %d!", __func__, mCameraState);
         ALOGV("%s: X", __func__);
@@ -1246,6 +1255,7 @@
     }
     mStreamDisplay->stop();
 
+    mPauseFramedispatch = false;
     mCameraState = CAMERA_STATE_PREVIEW_STOP_CMD_SENT;
     ALOGV("stopPreviewInternal: X");
 }
@@ -1255,6 +1265,9 @@
     ALOGV("previewEnabled: E");
     Mutex::Autolock lock(mLock);
     ALOGI("%s: mCameraState = %d", __func__, mCameraState);
+    if (mPauseFramedispatch) {
+        return false;
+    }
     switch(mPreviewState) {
     case QCAMERA_HAL_PREVIEW_STOPPED:
     case QCAMERA_HAL_TAKE_PICTURE:
@@ -1630,7 +1643,6 @@
         mStreamSnap->setFullSizeLiveshot(false);
         if (isZSLMode()) {
             if (mStreamSnap != NULL) {
-                mPauseFramedispatch = true;
                 pausePreviewForZSL();
                 ret = mStreamSnap->takePictureZSL();
                 if (ret != MM_CAMERA_OK) {
diff --git a/QCameraHWI_Preview.cpp b/QCameraHWI_Preview.cpp
index 2f1197f..f53069d 100755
--- a/QCameraHWI_Preview.cpp
+++ b/QCameraHWI_Preview.cpp
@@ -874,6 +874,13 @@
     /*Call buf done*/
     return BAD_VALUE;
   }
+
+  if(mHalCamCtrl->mPauseFramedispatch) {
+      if(MM_CAMERA_OK != cam_evt_buf_done(mCameraId, frame)) {
+            ALOGE("BUF DONE FAILED for the recylce buffer");
+      }
+      return NO_ERROR;
+  }
   mHalCamCtrl->mCallbackLock.lock();
   camera_data_timestamp_callback rcb = mHalCamCtrl->mDataCbTimestamp;
   void *rdata = mHalCamCtrl->mCallbackCookie;
@@ -898,13 +905,13 @@
   ALOGI("Enqueue buf handle %p\n",
   mHalCamCtrl->mPreviewMemory.buffer_handle[frame->def.idx]);
   ALOGV("%s: camera call genlock_unlock", __FUNCTION__);
-  if(!mHalCamCtrl->mPauseFramedispatch) {
+
     if (BUFFER_LOCKED == mHalCamCtrl->mPreviewMemory.local_flag[frame->def.idx]) {
       ALOGI("%s: genlock_unlock_buffer hdl =%p", __FUNCTION__, (*mHalCamCtrl->mPreviewMemory.buffer_handle[frame->def.idx]));
         if (GENLOCK_FAILURE == genlock_unlock_buffer((native_handle_t*)
-	            (*mHalCamCtrl->mPreviewMemory.buffer_handle[frame->def.idx]))) {
+                (*mHalCamCtrl->mPreviewMemory.buffer_handle[frame->def.idx]))) {
             ALOGE("%s: genlock_unlock_buffer failed", __FUNCTION__);
-	        //mHalCamCtrl->mPreviewMemoryLock.unlock();
+            //mHalCamCtrl->mPreviewMemoryLock.unlock();
             //return -EINVAL;
         } else {
             mHalCamCtrl->mPreviewMemory.local_flag[frame->def.idx] = BUFFER_UNLOCKED;
@@ -998,11 +1005,7 @@
      }
   } else
       ALOGV("%s: error in dequeue_buffer, enqueue_buffer idx = %d, no free buffer now", __func__, frame->def.idx);
-  } else {
-      if(MM_CAMERA_OK != cam_evt_buf_done(mCameraId, frame)) {
-            ALOGE("BUF DONE FAILED for the recylce buffer");
-      }
-  }
+
   /* Save the last displayed frame. We'll be using it to fill the gap between
      when preview stops and postview start during snapshot.*/
   mLastQueuedFrame = &(mDisplayStreamBuf.frame[frame->def.idx]);
diff --git a/QCameraHWI_Still.cpp b/QCameraHWI_Still.cpp
index d0e1b59..3da606f 100755
--- a/QCameraHWI_Still.cpp
+++ b/QCameraHWI_Still.cpp
@@ -1952,13 +1952,11 @@
           frame. We'll need to query.*/
         memset(&crop, 0, sizeof(common_crop_t));
 
-        /*maftab*/
-        #if 0
-        crop.in1_w=mCrop.snapshot.thumbnail_crop.width;
-        crop.in1_h=mCrop.snapshot.thumbnail_crop.height;
-        crop.out1_w=mThumbnailWidth;
-        crop.out1_h=mThumbnailHeight;
-        #endif
+        if(isZSLMode()){
+            //Changes to stop sending Preview Frames when Snapshot issued
+            //in ZSL case.
+            mHalCamCtrl->mPauseFramedispatch = true;
+        }
 
         ALOGI("%s: Call notifyShutter 2nd time", __func__);
         /* The recvd_frame structre we receive from lower library is a local
diff --git a/mm-camera-interface/mm_camera_notify.c b/mm-camera-interface/mm_camera_notify.c
index aa46289..c76f572 100644
--- a/mm-camera-interface/mm_camera_notify.c
+++ b/mm-camera-interface/mm_camera_notify.c
@@ -430,12 +430,6 @@
     }
     pthread_mutex_unlock(&my_obj->ch[MM_CAMERA_CH_PREVIEW].mutex);
 
-    for( i=0;i<cnt;i++) {
-        if(buf_cb[i].cb != NULL && my_obj->poll_threads[MM_CAMERA_CH_PREVIEW].data.used == 1) {
-            buf_cb[i].cb(&data[i],buf_cb[i].user_data);
-        }
-    }
-
     if(my_obj->op_mode == MM_CAMERA_OP_MODE_ZSL) {
         /* Reset match to 0. */
         stream->frame.frame[idx].match = 0;
@@ -444,6 +438,12 @@
           &my_obj->ch[MM_CAMERA_CH_PREVIEW].preview.stream.frame.frame[idx],
           stream);
     }
+
+    for( i=0;i<cnt;i++) {
+        if(buf_cb[i].cb != NULL && my_obj->poll_threads[MM_CAMERA_CH_PREVIEW].data.used == 1) {
+            buf_cb[i].cb(&data[i],buf_cb[i].user_data);
+        }
+    }
 }
 
 static void mm_camera_snapshot_send_liveshot_notify(mm_camera_obj_t * my_obj)