summaryrefslogtreecommitdiff
path: root/camera
diff options
context:
space:
mode:
authorSundar Raman <sunds@ti.com>2011-08-26 11:28:22 -0700
committerIliyan Malchev <malchev@google.com>2011-08-26 12:39:42 -0700
commit85c859b69b3c003b8db810371e24fe41599fc7de (patch)
treebfd7d4117e65aa7e226509c73b66ac7a47e8ce0f /camera
parent43bdd31577be33023b40de6b730eef24f484cc4b (diff)
downloadomap4-aah-85c859b69b3c003b8db810371e24fe41599fc7de.tar.gz
CameraHAL: Adds support for 'autoFocus()' calls during CAF
- Previously during CAF any calls for doing AF were immediately returning status. The patch will check if CAF has succeeded in locking and if this is not the case it will temporarily switch to 'auto' triggering a full AF sweep. CAF is again restored afterwards. - Additionally this patch adds support for canceling AF during 'PREVIEW_STATE' state, which is needed in order to release the 3A lock after AF Change-Id: Ie8c9b77fb134e63ed668a22453c1672b34488d94 Signed-off-by: Sundar Raman <sunds@ti.com>
Diffstat (limited to 'camera')
-rw-r--r--camera/BaseCameraAdapter.cpp1
-rw-r--r--camera/OMXCameraAdapter/OMXFocus.cpp151
-rw-r--r--camera/inc/OMXCameraAdapter/OMXCameraAdapter.h2
3 files changed, 105 insertions, 49 deletions
diff --git a/camera/BaseCameraAdapter.cpp b/camera/BaseCameraAdapter.cpp
index 026333e..cd20346 100644
--- a/camera/BaseCameraAdapter.cpp
+++ b/camera/BaseCameraAdapter.cpp
@@ -1617,6 +1617,7 @@ status_t BaseCameraAdapter::setState(CameraCommands operation)
mNextState = VIDEO_STATE;
break;
+ case CAMERA_CANCEL_AUTOFOCUS:
case CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE:
case CAMERA_STOP_SMOOTH_ZOOM:
CAMHAL_LOGDB("Adapter state switch PREVIEW_ACTIVE->PREVIEW_ACTIVE event = 0x%x",
diff --git a/camera/OMXCameraAdapter/OMXFocus.cpp b/camera/OMXCameraAdapter/OMXFocus.cpp
index ccfb835..f12b85c 100644
--- a/camera/OMXCameraAdapter/OMXFocus.cpp
+++ b/camera/OMXCameraAdapter/OMXFocus.cpp
@@ -68,6 +68,7 @@ status_t OMXCameraAdapter::doAutoFocus()
status_t ret = NO_ERROR;
OMX_ERRORTYPE eError = OMX_ErrorNone;
OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE focusControl;
+ OMX_PARAM_FOCUSSTATUSTYPE focusStatus;
LOG_FUNCTION_NAME;
@@ -87,54 +88,72 @@ status_t OMXCameraAdapter::doAutoFocus()
// If the app calls autoFocus, the camera will stop sending face callbacks.
pauseFaceDetection(true);
- if ( NO_ERROR == ret )
- {
- OMX_INIT_STRUCT_PTR (&focusControl, OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE);
- focusControl.eFocusControl = ( OMX_IMAGE_FOCUSCONTROLTYPE ) mParameters3A.Focus;
+ OMX_INIT_STRUCT_PTR (&focusControl, OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE);
+ focusControl.eFocusControl = ( OMX_IMAGE_FOCUSCONTROLTYPE ) mParameters3A.Focus;
+
+ //In case we have CAF running we should first check the AF status.
+ //If it has managed to lock, then do as usual and return status
+ //immediately. If lock is not available, then switch temporarily
+ //to 'autolock' and do normal AF.
+ if ( mParameters3A.Focus == OMX_IMAGE_FocusControlAuto ) {
+//FIXME: The CAF seems to return focus failure all the time.
+// Probably this is tuning related, disable this until the
+// MMS IQ team fixes it
+#if 0
+ ret = checkFocus(&focusStatus);
+#else
+ ret = NO_ERROR;
+ focusStatus.eFocusStatus = OMX_FocusStatusReached;
+#endif
+ if ( NO_ERROR != ret ) {
+ CAMHAL_LOGEB("Focus status check failed 0x%x!", ret);
+ return ret;
+ } else {
+ CAMHAL_LOGDB("Focus status check 0x%x!", focusStatus.eFocusStatus);
+ }
+
+ if ( OMX_FocusStatusReached != focusStatus.eFocusStatus ) {
+ focusControl.eFocusControl = OMX_IMAGE_FocusControlAutoLock;
+ }
+ }
- if ( ( mParameters3A.Focus != OMX_IMAGE_FocusControlAuto ) &&
- ( mParameters3A.Focus != OMX_IMAGE_FocusControlAutoInfinity ) )
- {
+ if ( ( focusControl.eFocusControl != OMX_IMAGE_FocusControlAuto ) &&
+ ( focusControl.eFocusControl != ( OMX_IMAGE_FOCUSCONTROLTYPE )
+ OMX_IMAGE_FocusControlAutoInfinity ) ) {
- ret = RegisterForEvent(mCameraAdapterParameters.mHandleComp,
- (OMX_EVENTTYPE) OMX_EventIndexSettingChanged,
- OMX_ALL,
- OMX_IndexConfigCommonFocusStatus,
- mDoAFSem);
+ ret = RegisterForEvent(mCameraAdapterParameters.mHandleComp,
+ (OMX_EVENTTYPE) OMX_EventIndexSettingChanged,
+ OMX_ALL,
+ OMX_IndexConfigCommonFocusStatus,
+ mDoAFSem);
- if ( NO_ERROR == ret )
- {
- ret = setFocusCallback(true);
- }
+ if ( NO_ERROR == ret ) {
+ ret = setFocusCallback(true);
+ }
- }
+ }
- eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
- OMX_IndexConfigFocusControl,
- &focusControl);
+ eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
+ OMX_IndexConfigFocusControl,
+ &focusControl);
- if ( OMX_ErrorNone != eError )
- {
- CAMHAL_LOGEB("Error while starting focus 0x%x", eError);
- return INVALID_OPERATION;
- }
- else
- {
- CAMHAL_LOGDA("Autofocus started successfully");
- }
- }
+ if ( OMX_ErrorNone != eError ) {
+ CAMHAL_LOGEB("Error while starting focus 0x%x", eError);
+ return INVALID_OPERATION;
+ } else {
+ CAMHAL_LOGDA("Autofocus started successfully");
+ }
- if ( ( mParameters3A.Focus != OMX_IMAGE_FocusControlAuto ) &&
- ( mParameters3A.Focus != OMX_IMAGE_FocusControlAutoInfinity ) )
- {
+ if ( ( focusControl.eFocusControl != OMX_IMAGE_FocusControlAuto ) &&
+ ( focusControl.eFocusControl != ( OMX_IMAGE_FOCUSCONTROLTYPE )
+ OMX_IMAGE_FocusControlAutoInfinity ) ) {
ret = mDoAFSem.WaitTimeout(AF_CALLBACK_TIMEOUT);
//Disable auto focus callback from Ducati
setFocusCallback(false);
//Signal a dummy AF event so that in case the callback from ducati
//does come then it doesnt crash after
//exiting this function since eventSem will go out of scope.
- if(ret != NO_ERROR)
- {
+ if(ret != NO_ERROR) {
CAMHAL_LOGEA("Autofocus callback timeout expired");
SignalEvent(mCameraAdapterParameters.mHandleComp,
(OMX_EVENTTYPE) OMX_EventIndexSettingChanged,
@@ -142,21 +161,22 @@ status_t OMXCameraAdapter::doAutoFocus()
OMX_IndexConfigCommonFocusStatus,
NULL );
returnFocusStatus(true);
- }
- else
- {
+ } else {
CAMHAL_LOGDA("Autofocus callback received");
ret = returnFocusStatus(false);
- }
-
}
- else
- {
- if ( NO_ERROR == ret )
- {
+
+ } else {
+ if ( NO_ERROR == ret ) {
ret = returnFocusStatus(false);
- }
}
+ }
+
+ //Restore CAF if needed
+ if ( ( mParameters3A.Focus == OMX_IMAGE_FocusControlAuto ) &&
+ ( focusControl.eFocusControl == OMX_IMAGE_FocusControlAutoLock ) ) {
+ mPending3Asettings |= SetFocus;
+ }
LOG_FUNCTION_NAME_EXIT;
@@ -211,10 +231,38 @@ status_t OMXCameraAdapter::stopAutoFocus()
return ret;
}
+status_t OMXCameraAdapter::getFocusMode(OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE &focusMode)
+{;
+ OMX_ERRORTYPE eError = OMX_ErrorNone;
+
+ LOG_FUNCTION_NAME;
+
+ if ( OMX_StateInvalid == mComponentState ) {
+ CAMHAL_LOGEA("OMX component is in invalid state");
+ return NO_INIT;
+ }
+
+ OMX_INIT_STRUCT_PTR (&focusMode, OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE);
+ focusMode.nPortIndex = mCameraAdapterParameters.mPrevPortIndex;
+
+ eError = OMX_GetConfig(mCameraAdapterParameters.mHandleComp,
+ OMX_IndexConfigFocusControl,
+ &focusMode);
+
+ if ( OMX_ErrorNone != eError ) {
+ CAMHAL_LOGEB("Error while retrieving focus mode 0x%x", eError);
+ }
+
+ LOG_FUNCTION_NAME_EXIT;
+
+ return ErrorUtils::omxToAndroidError(eError);
+}
+
status_t OMXCameraAdapter::cancelAutoFocus()
{
status_t ret = NO_ERROR;
OMX_ERRORTYPE eError = OMX_ErrorNone;
+ OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE focusMode;
LOG_FUNCTION_NAME;
// Unlock 3A locks since they were locked by AF
@@ -225,10 +273,15 @@ status_t OMXCameraAdapter::cancelAutoFocus()
CAMHAL_LOGDA("AE/AWB unlocked successfully");
}
+ ret = getFocusMode(focusMode);
+ if ( NO_ERROR != ret ) {
+ return ret;
+ }
+
//Stop the AF only for modes other than CAF or Inifinity
- if ( ( mParameters3A.Focus != OMX_IMAGE_FocusControlAuto ) ||
- ( mParameters3A.Focus != OMX_IMAGE_FocusControlAutoInfinity ) )
- {
+ if ( ( focusMode.eFocusControl != OMX_IMAGE_FocusControlAuto ) &&
+ ( focusMode.eFocusControl != ( OMX_IMAGE_FOCUSCONTROLTYPE )
+ OMX_IMAGE_FocusControlAutoInfinity ) ) {
stopAutoFocus();
//Signal a dummy AF event so that in case the callback from ducati
//does come then it doesnt crash after
@@ -238,7 +291,7 @@ status_t OMXCameraAdapter::cancelAutoFocus()
OMX_ALL,
OMX_IndexConfigCommonFocusStatus,
NULL );
- }
+ }
// If the apps call #cancelAutoFocus()}, the face callbacks will also resume.
pauseFaceDetection(false);
diff --git a/camera/inc/OMXCameraAdapter/OMXCameraAdapter.h b/camera/inc/OMXCameraAdapter/OMXCameraAdapter.h
index b065d06..6fc4423 100644
--- a/camera/inc/OMXCameraAdapter/OMXCameraAdapter.h
+++ b/camera/inc/OMXCameraAdapter/OMXCameraAdapter.h
@@ -419,6 +419,8 @@ private:
status_t stopAutoFocus();
status_t checkFocus(OMX_PARAM_FOCUSSTATUSTYPE *eFocusStatus);
status_t returnFocusStatus(bool timeoutReached);
+ status_t getFocusMode(OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE &focusMode);
+
//Focus distances
status_t setParametersFocus(const CameraParameters &params,