Camera: Block CancelAF till HAL receives AF event.
Focus distances should not be updated after CancelAF. But due
to timing issues, sometimes we may receive AF event after
Cancel AF is issued. This will result in testCancelAutoFocus
CTS failure.
To avoid such scenarios, make Cancel AF wait for the focus event
if AF is in progress.
Change-Id: Iba641487c8f31de2d118fbc7dc3ed040c9d34601
diff --git a/QCamera2/HAL/QCamera2HWI.cpp b/QCamera2/HAL/QCamera2HWI.cpp
index ac5d91a..42d3e20 100644
--- a/QCamera2/HAL/QCamera2HWI.cpp
+++ b/QCamera2/HAL/QCamera2HWI.cpp
@@ -959,7 +959,7 @@
m_bShutterSoundPlayed(false),
m_bPreviewStarted(false),
m_bRecordStarted(false),
- m_currentFocusState(CAM_AF_SCANNING),
+ m_currentFocusState(CAM_AF_NOT_FOCUSED),
m_pPowerModule(NULL),
mDumpFrmCnt(0),
mDumpSkipCnt(0),
@@ -2143,6 +2143,7 @@
case CAM_FOCUS_MODE_CONTINOUS_VIDEO:
case CAM_FOCUS_MODE_CONTINOUS_PICTURE:
rc = mCameraHandle->ops->cancel_auto_focus(mCameraHandle->camera_handle);
+ m_currentFocusState = CAM_AF_CANCELLED;
break;
case CAM_FOCUS_MODE_INFINITY:
case CAM_FOCUS_MODE_FIXED:
@@ -3319,6 +3320,8 @@
{
int32_t ret = NO_ERROR;
ALOGD("%s: E",__func__);
+
+ cam_autofocus_state_t prevFocusState = m_currentFocusState;
m_currentFocusState = focus_data.focus_state;
cam_focus_mode_type focusMode = mParameters.getFocusMode();
@@ -3335,6 +3338,15 @@
ret = sendEvtNotify(CAMERA_MSG_FOCUS,
(focus_data.focus_state == CAM_AF_FOCUSED)? true : false,
0);
+ if (CAM_AF_CANCELLED == prevFocusState) {
+ //Notify CancelAF API
+ qcamera_api_result_t result;
+ memset(&result, 0, sizeof(qcamera_api_result_t));
+ result.status = NO_ERROR;
+ result.request_api = QCAMERA_SM_EVT_STOP_AUTO_FOCUS;
+ result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
+ signalAPIResult(&result);
+ }
break;
case CAM_FOCUS_MODE_CONTINOUS_VIDEO:
case CAM_FOCUS_MODE_CONTINOUS_PICTURE:
@@ -5440,6 +5452,28 @@
}
/*===========================================================================
+=======
+ * FUNCTION : isAFRunning
+ *
+ * DESCRIPTION: if AF is in progress while in Auto/Macro focus modes
+ *
+ * PARAMETERS : none
+ *
+ * RETURN : true: AF in progress
+ * false: AF not in progress
+ *==========================================================================*/
+bool QCamera2HardwareInterface::isAFRunning()
+{
+ bool isAFInProgress = (m_currentFocusState == CAM_AF_SCANNING &&
+ (mParameters.getFocusMode() == CAM_FOCUS_MODE_AUTO ||
+ mParameters.getFocusMode() == CAM_FOCUS_MODE_MACRO));
+
+ return isAFInProgress;
+}
+
+/*===========================================================================
+
+>>>>>>> c709c9a... Camera: Block CancelAF till HAL receives AF event.
* FUNCTION : needReprocess
*
* DESCRIPTION: if reprocess is needed
diff --git a/QCamera2/HAL/QCamera2HWI.h b/QCamera2/HAL/QCamera2HWI.h
index 0c3c461..e1199af 100644
--- a/QCamera2/HAL/QCamera2HWI.h
+++ b/QCamera2/HAL/QCamera2HWI.h
@@ -330,6 +330,7 @@
bool isPreviewRestartEnabled();
bool is4k2kResolution(cam_dimension_t* resolution);
bool isCaptureShutterEnabled();
+ bool isAFRunning();
bool needReprocess();
bool needRotationReprocess();
bool needScaleReprocess();
diff --git a/QCamera2/HAL/QCameraStateMachine.cpp b/QCamera2/HAL/QCameraStateMachine.cpp
index 1e70149..864e10b 100644
--- a/QCamera2/HAL/QCameraStateMachine.cpp
+++ b/QCamera2/HAL/QCameraStateMachine.cpp
@@ -516,11 +516,14 @@
break;
case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
{
+ bool isAFRunning = m_parent->isAFRunning();
rc = m_parent->cancelAutoFocus();
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
+ if (!isAFRunning) {
+ result.status = rc;
+ result.request_api = evt;
+ result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
+ m_parent->signalAPIResult(&result);
+ }
}
break;
case QCAMERA_SM_EVT_REG_FACE_IMAGE:
@@ -783,11 +786,14 @@
break;
case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
{
+ bool isAFRunning = m_parent->isAFRunning();
rc = m_parent->cancelAutoFocus();
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
+ if (!isAFRunning) {
+ result.status = rc;
+ result.request_api = evt;
+ result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
+ m_parent->signalAPIResult(&result);
+ }
}
break;
case QCAMERA_SM_EVT_SEND_COMMAND:
@@ -1074,11 +1080,14 @@
break;
case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
{
+ bool isAFRunning = m_parent->isAFRunning();
rc = m_parent->cancelAutoFocus();
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
+ if (!isAFRunning) {
+ result.status = rc;
+ result.request_api = evt;
+ result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
+ m_parent->signalAPIResult(&result);
+ }
}
break;
case QCAMERA_SM_EVT_START_RECORDING:
@@ -1585,11 +1594,14 @@
break;
case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
{
+ bool isAFRunning = m_parent->isAFRunning();
rc = m_parent->cancelAutoFocus();
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
+ if (!isAFRunning) {
+ result.status = rc;
+ result.request_api = evt;
+ result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
+ m_parent->signalAPIResult(&result);
+ }
}
break;
case QCAMERA_SM_EVT_SEND_COMMAND:
@@ -1944,11 +1956,14 @@
break;
case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
{
+ bool isAFRunning = m_parent->isAFRunning();
rc = m_parent->cancelAutoFocus();
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
+ if (!isAFRunning) {
+ result.status = rc;
+ result.request_api = evt;
+ result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
+ m_parent->signalAPIResult(&result);
+ }
}
break;
case QCAMERA_SM_EVT_SEND_COMMAND:
@@ -2294,11 +2309,14 @@
break;
case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
{
+ bool isAFRunning = m_parent->isAFRunning();
rc = m_parent->cancelAutoFocus();
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
+ if (!isAFRunning) {
+ result.status = rc;
+ result.request_api = evt;
+ result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
+ m_parent->signalAPIResult(&result);
+ }
}
break;
case QCAMERA_SM_EVT_SEND_COMMAND:
@@ -2640,11 +2658,14 @@
break;
case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
{
+ bool isAFRunning = m_parent->isAFRunning();
rc = m_parent->cancelAutoFocus();
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
+ if (!isAFRunning) {
+ result.status = rc;
+ result.request_api = evt;
+ result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
+ m_parent->signalAPIResult(&result);
+ }
}
break;
case QCAMERA_SM_EVT_SEND_COMMAND:
diff --git a/QCamera2/stack/common/cam_types.h b/QCamera2/stack/common/cam_types.h
index 27c7499..ca88233 100644
--- a/QCamera2/stack/common/cam_types.h
+++ b/QCamera2/stack/common/cam_types.h
@@ -785,7 +785,8 @@
typedef enum {
CAM_AF_SCANNING,
CAM_AF_FOCUSED,
- CAM_AF_NOT_FOCUSED
+ CAM_AF_NOT_FOCUSED,
+ CAM_AF_CANCELLED
} cam_autofocus_state_t;
typedef struct {