Merge "QCamera2 : Differentiate focus events for CAF and normal AF."
diff --git a/QCamera2/HAL/QCamera2HWI.cpp b/QCamera2/HAL/QCamera2HWI.cpp
index a36a6bf..e3eb252 100644
--- a/QCamera2/HAL/QCamera2HWI.cpp
+++ b/QCamera2/HAL/QCamera2HWI.cpp
@@ -992,6 +992,7 @@
mDumpSkipCnt(0),
mThermalLevel(QCAMERA_THERMAL_NO_ADJUSTMENT),
mCancelAutoFocus(false),
+ mActiveAF(false),
m_HDRSceneEnabled(false),
mLongshotEnabled(false),
m_max_pic_width(0),
@@ -2035,6 +2036,7 @@
int QCamera2HardwareInterface::stopPreview()
{
CDBG_HIGH("%s: E", __func__);
+ mActiveAF = false;
// stop preview stream
stopChannel(QCAMERA_CH_TYPE_ZSL);
stopChannel(QCAMERA_CH_TYPE_PREVIEW);
@@ -2174,6 +2176,7 @@
{
int rc = NO_ERROR;
setCancelAutoFocus(false);
+ mActiveAF = true;
cam_focus_mode_type focusMode = mParameters.getFocusMode();
CDBG_HIGH("[AF_DBG] %s: focusMode=%d, m_currentFocusState=%d, m_bAFRunning=%d",
__func__, focusMode, m_currentFocusState, isAFRunning());
@@ -2211,6 +2214,7 @@
{
int rc = NO_ERROR;
setCancelAutoFocus(true);
+ mActiveAF = false;
cam_focus_mode_type focusMode = mParameters.getFocusMode();
switch (focusMode) {
@@ -3646,6 +3650,13 @@
break;
}
+ if (focus_data.focus_state == CAM_AF_PASSIVE_SCANNING ||
+ focus_data.focus_state == CAM_AF_PASSIVE_FOCUSED ||
+ focus_data.focus_state == CAM_AF_PASSIVE_UNFOCUSED) {
+ //ignore passive(CAF) events in Auto/Macro AF modes
+ break;
+ }
+
if (focus_data.focus_state == CAM_AF_SCANNING ||
focus_data.focus_state == CAM_AF_INACTIVE) {
// in the middle of focusing, just ignore it
@@ -3660,17 +3671,28 @@
break;
case CAM_FOCUS_MODE_CONTINOUS_VIDEO:
case CAM_FOCUS_MODE_CONTINOUS_PICTURE:
- if (focus_data.focus_state == CAM_AF_FOCUSED ||
+ if (mActiveAF &&
+ (focus_data.focus_state == CAM_AF_PASSIVE_FOCUSED ||
+ focus_data.focus_state == CAM_AF_PASSIVE_UNFOCUSED)) {
+ //ignore passive(CAF) events during AF triggered by app/HAL
+ break;
+ }
+
+ if (focus_data.focus_state == CAM_AF_PASSIVE_FOCUSED ||
+ focus_data.focus_state == CAM_AF_PASSIVE_UNFOCUSED ||
+ focus_data.focus_state == CAM_AF_FOCUSED ||
focus_data.focus_state == CAM_AF_NOT_FOCUSED) {
+
// update focus distance
mParameters.updateFocusDistances(&focus_data.focus_dist);
ret = sendEvtNotify(CAMERA_MSG_FOCUS,
- (focus_data.focus_state == CAM_AF_FOCUSED)? true : false,
+ (focus_data.focus_state == CAM_AF_PASSIVE_FOCUSED ||
+ focus_data.focus_state == CAM_AF_FOCUSED)? true : false,
0);
}
ret = sendEvtNotify(CAMERA_MSG_FOCUS_MOVE,
- (focus_data.focus_state == CAM_AF_SCANNING)? true : false,
+ (focus_data.focus_state == CAM_AF_PASSIVE_SCANNING)? true : false,
0);
break;
case CAM_FOCUS_MODE_INFINITY:
@@ -3681,6 +3703,12 @@
break;
}
+ //Reset mActiveAF once we receive focus done event
+ if (focus_data.focus_state == CAM_AF_FOCUSED ||
+ focus_data.focus_state == CAM_AF_NOT_FOCUSED) {
+ mActiveAF = false;
+ }
+
// we save cam_auto_focus_data_t.focus_pos to parameters,
// in any focus mode.
CDBG_HIGH("%s, update focus position: %d", __func__, focus_data.focus_pos);
diff --git a/QCamera2/HAL/QCamera2HWI.h b/QCamera2/HAL/QCamera2HWI.h
index 17c9545..0365e57 100644
--- a/QCamera2/HAL/QCamera2HWI.h
+++ b/QCamera2/HAL/QCamera2HWI.h
@@ -564,6 +564,7 @@
mm_jpeg_exif_params_t mExifParams;
qcamera_thermal_level_enum_t mThermalLevel;
bool mCancelAutoFocus;
+ bool mActiveAF;
bool m_HDRSceneEnabled;
bool mLongshotEnabled;
int32_t m_max_pic_width;
diff --git a/QCamera2/stack/common/cam_types.h b/QCamera2/stack/common/cam_types.h
index 78426d8..10784d9 100644
--- a/QCamera2/stack/common/cam_types.h
+++ b/QCamera2/stack/common/cam_types.h
@@ -798,7 +798,10 @@
CAM_AF_SCANNING,
CAM_AF_FOCUSED,
CAM_AF_NOT_FOCUSED,
- CAM_AF_INACTIVE
+ CAM_AF_INACTIVE,
+ CAM_AF_PASSIVE_SCANNING,
+ CAM_AF_PASSIVE_FOCUSED,
+ CAM_AF_PASSIVE_UNFOCUSED,
} cam_autofocus_state_t;
typedef struct {