summaryrefslogtreecommitdiffstats
path: root/camera/OMXCameraAdapter
diff options
context:
space:
mode:
authorTyler Luu <tluu@ti.com>2011-10-26 22:35:48 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2011-10-26 22:35:48 +0000
commitdf6023f6fd9a515da9cec0e98ea303306b14c5d8 (patch)
tree3431416f492463b55cc2dbd0e754a4f870b74842 /camera/OMXCameraAdapter
parent37bf2859181aedae7f0f74462e13279863349e06 (diff)
parentfd705eb8b757a4f3d1d80b736cf20cade04524d7 (diff)
downloadhardware_ti_omap4xxx-df6023f6fd9a515da9cec0e98ea303306b14c5d8.tar.gz
hardware_ti_omap4xxx-df6023f6fd9a515da9cec0e98ea303306b14c5d8.tar.bz2
hardware_ti_omap4xxx-df6023f6fd9a515da9cec0e98ea303306b14c5d8.zip
am fd705eb8: CameraHal: Fixes for #testFocusDistance
* commit 'fd705eb8b757a4f3d1d80b736cf20cade04524d7': CameraHal: Fixes for #testFocusDistance
Diffstat (limited to 'camera/OMXCameraAdapter')
-rw-r--r--camera/OMXCameraAdapter/OMX3A.cpp17
-rwxr-xr-xcamera/OMXCameraAdapter/OMXCameraAdapter.cpp62
-rw-r--r--camera/OMXCameraAdapter/OMXCapture.cpp13
-rw-r--r--camera/OMXCameraAdapter/OMXFocus.cpp14
4 files changed, 84 insertions, 22 deletions
diff --git a/camera/OMXCameraAdapter/OMX3A.cpp b/camera/OMXCameraAdapter/OMX3A.cpp
index 75f514d..73f3714 100644
--- a/camera/OMXCameraAdapter/OMX3A.cpp
+++ b/camera/OMXCameraAdapter/OMX3A.cpp
@@ -218,6 +218,12 @@ status_t OMXCameraAdapter::setParameters3A(const CameraParameters &params,
}
mParameters3A.Focus = mode;
+
+ // if focus mode is set to infinity...update focus distance immediately
+ if (mode == OMX_IMAGE_FocusControlAutoInfinity) {
+ updateFocusDistances(mParameters);
+ }
+
CAMHAL_LOGDB("Focus %x", mParameters3A.Focus);
}
@@ -313,6 +319,17 @@ status_t OMXCameraAdapter::setParameters3A(const CameraParameters &params,
}
}
+ str = params.get(TICameraParameters::KEY_AUTO_FOCUS_LOCK);
+ if (str && (strcmp(str, TRUE) == 0) && (mParameters3A.FocusLock != OMX_TRUE)) {
+ CAMHAL_LOGVA("Locking Focus");
+ mParameters3A.FocusLock = OMX_TRUE;
+ setFocusLock(mParameters3A);
+ } else if (str && (strcmp(str, FALSE) == 0) && (mParameters3A.FocusLock != OMX_FALSE)) {
+ CAMHAL_LOGVA("UnLocking Focus");
+ mParameters3A.FocusLock = OMX_FALSE;
+ setFocusLock(mParameters3A);
+ }
+
str = params.get(CameraParameters::KEY_METERING_AREAS);
if ( (str != NULL) ) {
size_t MAX_METERING_AREAS;
diff --git a/camera/OMXCameraAdapter/OMXCameraAdapter.cpp b/camera/OMXCameraAdapter/OMXCameraAdapter.cpp
index c3feeee..6dab841 100755
--- a/camera/OMXCameraAdapter/OMXCameraAdapter.cpp
+++ b/camera/OMXCameraAdapter/OMXCameraAdapter.cpp
@@ -664,11 +664,8 @@ void OMXCameraAdapter::getParameters(CameraParameters& params)
params.set(CameraParameters::KEY_FOCUS_MODE, valstr);
}
- //Query focus distances only during CAF, Infinity
- //or when focus is running
+ //Query focus distances only when focus is running
if ( ( AF_ACTIVE & state ) ||
- ( mParameters3A.Focus == OMX_IMAGE_FocusControlAuto ) ||
- ( mParameters3A.Focus == OMX_IMAGE_FocusControlAutoInfinity ) ||
( NULL == mParameters.get(CameraParameters::KEY_FOCUS_DISTANCES) ) )
{
updateFocusDistances(params);
@@ -1863,14 +1860,17 @@ status_t OMXCameraAdapter::startPreview()
if ( mPending3Asettings )
apply3Asettings(mParameters3A);
- //Query current focus distance after
- //starting the preview
- updateFocusDistances(mParameters);
-
//reset frame rate estimates
mFPS = 0.0f;
mLastFPS = 0.0f;
- mFrameCount = 0;
+ // start frame count from 0. i.e first frame after
+ // startPreview will be the 0th reference frame
+ // this way we will wait for second frame until
+ // takePicture/autoFocus is allowed to run. we
+ // are seeing SetConfig/GetConfig fail after
+ // calling after the first frame and not failing
+ // after the second frame
+ mFrameCount = -1;
mLastFrameCount = 0;
mIter = 1;
mLastFPSTime = systemTime();
@@ -1911,6 +1911,12 @@ status_t OMXCameraAdapter::stopPreview()
return NO_INIT;
}
+ {
+ Mutex::Autolock lock(mFrameCountMutex);
+ mFrameCount = 0;
+ mFirstFrameCondition.broadcast();
+ }
+
ret = cancelAutoFocus();
if(ret!=NO_ERROR)
{
@@ -2208,10 +2214,25 @@ status_t OMXCameraAdapter::autoFocus()
LOG_FUNCTION_NAME;
+ {
+ Mutex::Autolock lock(mFrameCountMutex);
+ if (mFrameCount < 1) {
+ // first frame may time some time to come...so wait for an adequate amount of time
+ // which 2 * OMX_CAPTURE_TIMEOUT * 1000 will cover.
+ ret = mFirstFrameCondition.waitRelative(mFrameCountMutex,
+ (nsecs_t) 2 * OMX_CAPTURE_TIMEOUT * 1000);
+ if ((NO_ERROR != ret) || (mFrameCount == 0)) {
+ goto EXIT;
+ }
+ }
+ }
+
msg.command = CommandHandler::CAMERA_PERFORM_AUTOFOCUS;
msg.arg1 = mErrorNotifier;
ret = mCommandHandler->put(&msg);
+ EXIT:
+
LOG_FUNCTION_NAME;
return ret;
@@ -2224,10 +2245,24 @@ status_t OMXCameraAdapter::takePicture()
LOG_FUNCTION_NAME;
+ {
+ Mutex::Autolock lock(mFrameCountMutex);
+ if (mFrameCount < 1) {
+ // first frame may time some time to come...so wait for an adequate amount of time
+ // which 2 * OMX_CAPTURE_TIMEOUT * 1000 will cover.
+ ret = mFirstFrameCondition.waitRelative(mFrameCountMutex,
+ (nsecs_t) 2 * OMX_CAPTURE_TIMEOUT * 1000);
+ if ((NO_ERROR != ret) || (mFrameCount == 0)) {
+ goto EXIT;
+ }
+ }
+ }
+
msg.command = CommandHandler::CAMERA_START_IMAGE_CAPTURE;
msg.arg1 = mErrorNotifier;
ret = mCommandHandler->put(&msg);
+ EXIT:
LOG_FUNCTION_NAME_EXIT;
return ret;
@@ -2929,7 +2964,6 @@ OMX_ERRORTYPE OMXCameraAdapter::OMXCameraAdapterFillBufferDone(OMX_IN OMX_HANDLE
{
apply3Asettings(mParameters3A);
}
-
}
else if( pBuffHeader->nOutputPortIndex == OMX_CAMERA_PORT_VIDEO_OUT_MEASUREMENT )
{
@@ -3041,7 +3075,13 @@ status_t OMXCameraAdapter::recalculateFPS()
{
float currentFPS;
- mFrameCount++;
+ {
+ Mutex::Autolock lock(mFrameCountMutex);
+ mFrameCount++;
+ if (mFrameCount == 1) {
+ mFirstFrameCondition.broadcast();
+ }
+ }
if ( ( mFrameCount % FPS_PERIOD ) == 0 )
{
diff --git a/camera/OMXCameraAdapter/OMXCapture.cpp b/camera/OMXCameraAdapter/OMXCapture.cpp
index 5a83169..379cf48 100644
--- a/camera/OMXCameraAdapter/OMXCapture.cpp
+++ b/camera/OMXCameraAdapter/OMXCapture.cpp
@@ -953,6 +953,12 @@ status_t OMXCameraAdapter::stopImageCapture()
mCaptureSignalled = true; //set this to true if we exited because of timeout
+ {
+ Mutex::Autolock lock(mFrameCountMutex);
+ mFrameCount = 0;
+ mFirstFrameCondition.broadcast();
+ }
+
return (ret | ErrorUtils::omxToAndroidError(eError));
EXIT:
@@ -961,6 +967,13 @@ EXIT:
if ( NULL != mReleaseImageBuffersCallback ) {
mReleaseImageBuffersCallback(mReleaseData);
}
+
+ {
+ Mutex::Autolock lock(mFrameCountMutex);
+ mFrameCount = 0;
+ mFirstFrameCondition.broadcast();
+ }
+
performCleanupAfterError();
LOG_FUNCTION_NAME_EXIT;
return (ret | ErrorUtils::omxToAndroidError(eError));
diff --git a/camera/OMXCameraAdapter/OMXFocus.cpp b/camera/OMXCameraAdapter/OMXFocus.cpp
index 4746602..6b94140 100644
--- a/camera/OMXCameraAdapter/OMXFocus.cpp
+++ b/camera/OMXCameraAdapter/OMXFocus.cpp
@@ -236,9 +236,6 @@ status_t OMXCameraAdapter::stopAutoFocus()
}
}
- //Query current focus distance after AF is complete
- updateFocusDistances(mParameters);
-
LOG_FUNCTION_NAME_EXIT;
return ret;
@@ -278,13 +275,6 @@ status_t OMXCameraAdapter::cancelAutoFocus()
OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE focusMode;
LOG_FUNCTION_NAME;
- // Unlock 3A locks since they were locked by AF conditionally
- if( set3ALock(mUserSetExpLock, mUserSetWbLock, OMX_FALSE) != NO_ERROR) {
- CAMHAL_LOGEA("Error Unlocking 3A locks");
- }
- else{
- CAMHAL_LOGDA("AE/AWB unlocked successfully");
- }
ret = getFocusMode(focusMode);
if ( NO_ERROR != ret ) {
@@ -436,7 +426,9 @@ status_t OMXCameraAdapter::returnFocusStatus(bool timeoutReached)
stopAutoFocus();
}
- }
+ //Query current focus distance after AF is complete
+ updateFocusDistances(mParameters);
+ }
ret = BaseCameraAdapter::setState(CAMERA_CANCEL_AUTOFOCUS);
if ( NO_ERROR == ret )