From 2e8a9ddd4ceb49aa66abc0a62882ff641ae37f28 Mon Sep 17 00:00:00 2001 From: Wu-cheng Li Date: Wed, 10 Jun 2009 14:27:39 +0800 Subject: [PATCH] Cancel autofocus in stopPreview. --- libcamera2/QualcommCameraHardware.cpp | 32 +++++++++++++++++++++------ 1 file changed, 25 insertions(+), 7 deletions(-) mode change 100755 => 100644 libcamera2/QualcommCameraHardware.cpp diff --git a/libcamera2/QualcommCameraHardware.cpp b/libcamera2/QualcommCameraHardware.cpp old mode 100755 new mode 100644 index 8952470..449a610 --- a/libcamera2/QualcommCameraHardware.cpp +++ b/libcamera2/QualcommCameraHardware.cpp @@ -1069,7 +1069,6 @@ void QualcommCameraHardware::release() struct msm_ctrl_cmd ctrlCmd; if (mCameraRunning) { - cancelAutoFocus(); if(mRecordingCallback != NULL) { mRecordFrameLock.lock(); mReleasedRecordingFrame = true; @@ -1179,6 +1178,16 @@ void QualcommCameraHardware::stopPreviewInternal() { LOGV("stopPreviewInternal E: %d", mCameraRunning); if (mCameraRunning) { + // Cancel auto focus. + if (mAutoFocusCallback) { + { + Mutex::Autolock cbLock(&mCallbackLock); + mAutoFocusCallback = NULL; + mAutoFocusCallbackCookie = NULL; + } + cancelAutoFocus(); + } + mCameraRunning = !native_stop_preview(mCameraControlFd); if (!mCameraRunning && mPreviewInitialized) { deinitPreview(); @@ -1196,7 +1205,6 @@ void QualcommCameraHardware::stopPreview() { Mutex::Autolock cbLock(&mCallbackLock); - mAutoFocusCallback = NULL; mPreviewCallback = NULL; mPreviewCallbackCookie = NULL; if(mRecordingCallback != NULL) @@ -1236,6 +1244,11 @@ void QualcommCameraHardware::runAutoFocus() mCallbackLock.unlock(); if (cb != NULL) cb(status, data); + + mCallbackLock.lock(); + mAutoFocusCallback = NULL; + mAutoFocusCallbackCookie = NULL; + mCallbackLock.unlock(); } void QualcommCameraHardware::cancelAutoFocus() @@ -1263,17 +1276,22 @@ status_t QualcommCameraHardware::autoFocus(autofocus_callback af_cb, LOGV("autoFocus E"); Mutex::Autolock l(&mLock); + if (mCameraControlFd < 0) { + LOGE("not starting autofocus: main control fd %d", mCameraControlFd); + return UNKNOWN_ERROR; + } + + if (mAutoFocusCallback != NULL) { + LOGW("Auto focus is already in progress"); + return mAutoFocusCallback == af_cb ? NO_ERROR : INVALID_OPERATION; + } + { Mutex::Autolock cbl(&mCallbackLock); mAutoFocusCallback = af_cb; mAutoFocusCallbackCookie = user; } - if (mCameraControlFd < 0) { - LOGE("not starting autofocus: main control fd %d", mCameraControlFd); - return UNKNOWN_ERROR; - } - { mAutoFocusThreadLock.lock(); if (!mAutoFocusThreadRunning) {