From 244f8c26365a303d9dd861bd48a29a4b48578da1 Mon Sep 17 00:00:00 2001 From: Chih-Chung Chang Date: Tue, 15 Sep 2009 14:51:56 +0800 Subject: [PATCH] Fix 2083478: Camera needs an auto-focus cancel API Change-Id: I13bda991b32aee47e82b5cf9d43b3021c416a9a2 --- camera/libcameraservice/CameraHardwareStub.cpp | 5 +++++ camera/libcameraservice/CameraHardwareStub.h | 1 + camera/libcameraservice/CameraService.cpp | 17 ++++++++++++++++- camera/libcameraservice/CameraService.h | 3 +++ core/java/android/hardware/Camera.java | 16 ++++++++++++++-- core/jni/android_hardware_Camera.cpp | 15 +++++++++++++++ include/ui/Camera.h | 3 +++ include/ui/CameraHardwareInterface.h | 8 ++++++++ include/ui/ICamera.h | 3 +++ libs/ui/Camera.cpp | 8 ++++++++ libs/ui/ICamera.cpp | 18 ++++++++++++++++++ 11 files changed, 94 insertions(+), 3 deletions(-) diff --git a/camera/libcameraservice/CameraHardwareStub.cpp b/camera/libcameraservice/CameraHardwareStub.cpp index 24496bb7e2f8d..35f4846f9b72a 100644 --- a/camera/libcameraservice/CameraHardwareStub.cpp +++ b/camera/libcameraservice/CameraHardwareStub.cpp @@ -265,6 +265,11 @@ status_t CameraHardwareStub::autoFocus() return NO_ERROR; } +status_t CameraHardwareStub::cancelAutoFocus() +{ + return NO_ERROR; +} + /*static*/ int CameraHardwareStub::beginPictureThread(void *cookie) { CameraHardwareStub *c = (CameraHardwareStub *)cookie; diff --git a/camera/libcameraservice/CameraHardwareStub.h b/camera/libcameraservice/CameraHardwareStub.h index 000906a743768..f957fa87acfdf 100644 --- a/camera/libcameraservice/CameraHardwareStub.h +++ b/camera/libcameraservice/CameraHardwareStub.h @@ -51,6 +51,7 @@ public: virtual void releaseRecordingFrame(const sp& mem); virtual status_t autoFocus(); + virtual status_t cancelAutoFocus(); virtual status_t takePicture(); virtual status_t cancelPicture(); virtual status_t dump(int fd, const Vector& args) const; diff --git a/camera/libcameraservice/CameraService.cpp b/camera/libcameraservice/CameraService.cpp index f425f6bc184e9..bab7d086a1119 100644 --- a/camera/libcameraservice/CameraService.cpp +++ b/camera/libcameraservice/CameraService.cpp @@ -798,7 +798,6 @@ static void dump_to_file(const char *fname, } #endif -// take a picture - image is returned in callback status_t CameraService::Client::autoFocus() { LOGD("autoFocus (pid %d)", getCallingPid()); @@ -815,6 +814,22 @@ status_t CameraService::Client::autoFocus() return mHardware->autoFocus(); } +status_t CameraService::Client::cancelAutoFocus() +{ + LOGD("cancelAutoFocus (pid %d)", getCallingPid()); + + Mutex::Autolock lock(mLock); + status_t result = checkPid(); + if (result != NO_ERROR) return result; + + if (mHardware == 0) { + LOGE("mHardware is NULL, returning."); + return INVALID_OPERATION; + } + + return mHardware->cancelAutoFocus(); +} + // take a picture - image is returned in callback status_t CameraService::Client::takePicture() { diff --git a/camera/libcameraservice/CameraService.h b/camera/libcameraservice/CameraService.h index f8c72167068e1..0a909cf01a199 100644 --- a/camera/libcameraservice/CameraService.h +++ b/camera/libcameraservice/CameraService.h @@ -110,6 +110,9 @@ private: // auto focus virtual status_t autoFocus(); + // cancel auto focus + virtual status_t cancelAutoFocus(); + // take a picture - returns an IMemory (ref-counted mmap) virtual status_t takePicture(); diff --git a/core/java/android/hardware/Camera.java b/core/java/android/hardware/Camera.java index 04daa1cd9645e..9991600e64da8 100644 --- a/core/java/android/hardware/Camera.java +++ b/core/java/android/hardware/Camera.java @@ -382,6 +382,20 @@ public class Camera { } private native final void native_autoFocus(); + /** + * Cancels auto-focus function. If the auto-focus is still in progress, + * this function will cancel it. Whether the auto-focus is in progress + * or not, this function will return the focus position to the default. + * If the camera does not support auto-focus, this is a no-op. + * @hide + */ + public final void cancelAutoFocus() + { + mAutoFocusCallback = null; + native_cancelAutoFocus(); + } + private native final void native_cancelAutoFocus(); + /** * An interface which contains a callback for the shutter closing after taking a picture. */ @@ -1338,5 +1352,3 @@ public class Camera { } }; } - - diff --git a/core/jni/android_hardware_Camera.cpp b/core/jni/android_hardware_Camera.cpp index 8a312d935d84c..ce2b10c2f3d51 100644 --- a/core/jni/android_hardware_Camera.cpp +++ b/core/jni/android_hardware_Camera.cpp @@ -327,6 +327,18 @@ static void android_hardware_Camera_autoFocus(JNIEnv *env, jobject thiz) } } +static void android_hardware_Camera_cancelAutoFocus(JNIEnv *env, jobject thiz) +{ + LOGV("cancelAutoFocus"); + JNICameraContext* context; + sp c = get_native_camera(env, thiz, &context); + if (c == 0) return; + + if (c->cancelAutoFocus() != NO_ERROR) { + jniThrowException(env, "java/lang/RuntimeException", "cancelAutoFocus failed"); + } +} + static void android_hardware_Camera_takePicture(JNIEnv *env, jobject thiz) { LOGV("takePicture"); @@ -422,6 +434,9 @@ static JNINativeMethod camMethods[] = { { "native_autoFocus", "()V", (void *)android_hardware_Camera_autoFocus }, + { "native_cancelAutoFocus", + "()V", + (void *)android_hardware_Camera_cancelAutoFocus }, { "native_takePicture", "()V", (void *)android_hardware_Camera_takePicture }, diff --git a/include/ui/Camera.h b/include/ui/Camera.h index ae6e255ea910d..9ceb8fd43dabe 100644 --- a/include/ui/Camera.h +++ b/include/ui/Camera.h @@ -143,6 +143,9 @@ public: // autoFocus - status returned from callback status_t autoFocus(); + // cancel auto focus + status_t cancelAutoFocus(); + // take a picture - picture returned from callback status_t takePicture(); diff --git a/include/ui/CameraHardwareInterface.h b/include/ui/CameraHardwareInterface.h index 535f70e0cdc6e..5fbb7d80cb917 100644 --- a/include/ui/CameraHardwareInterface.h +++ b/include/ui/CameraHardwareInterface.h @@ -160,6 +160,14 @@ public: */ virtual status_t autoFocus() = 0; + /** + * Cancels auto-focus function. If the auto-focus is still in progress, + * this function will cancel it. Whether the auto-focus is in progress + * or not, this function will return the focus position to the default. + * If the camera does not support auto-focus, this is a no-op. + */ + virtual status_t cancelAutoFocus() = 0; + /** * Take a picture. */ diff --git a/include/ui/ICamera.h b/include/ui/ICamera.h index 1df791404156e..7595e36e57b6c 100644 --- a/include/ui/ICamera.h +++ b/include/ui/ICamera.h @@ -76,6 +76,9 @@ public: // auto focus virtual status_t autoFocus() = 0; + // cancel auto focus + virtual status_t cancelAutoFocus() = 0; + // take a picture virtual status_t takePicture() = 0; diff --git a/libs/ui/Camera.cpp b/libs/ui/Camera.cpp index 12a7725010f31..0c6d3408ab087 100644 --- a/libs/ui/Camera.cpp +++ b/libs/ui/Camera.cpp @@ -242,6 +242,14 @@ status_t Camera::autoFocus() return c->autoFocus(); } +status_t Camera::cancelAutoFocus() +{ + LOGV("cancelAutoFocus"); + sp c = mCamera; + if (c == 0) return NO_INIT; + return c->cancelAutoFocus(); +} + // take a picture status_t Camera::takePicture() { diff --git a/libs/ui/ICamera.cpp b/libs/ui/ICamera.cpp index 805c2ca2be2c9..fd7e084d28995 100644 --- a/libs/ui/ICamera.cpp +++ b/libs/ui/ICamera.cpp @@ -32,6 +32,7 @@ enum { START_PREVIEW, STOP_PREVIEW, AUTO_FOCUS, + CANCEL_AUTO_FOCUS, TAKE_PICTURE, SET_PARAMETERS, GET_PARAMETERS, @@ -162,6 +163,17 @@ public: return ret; } + // cancel focus + status_t cancelAutoFocus() + { + LOGV("cancelAutoFocus"); + Parcel data, reply; + data.writeInterfaceToken(ICamera::getInterfaceDescriptor()); + remote()->transact(CANCEL_AUTO_FOCUS, data, &reply); + status_t ret = reply.readInt32(); + return ret; + } + // take a picture - returns an IMemory (ref-counted mmap) status_t takePicture() { @@ -294,6 +306,12 @@ status_t BnCamera::onTransact( reply->writeInt32(autoFocus()); return NO_ERROR; } break; + case CANCEL_AUTO_FOCUS: { + LOGV("CANCEL_AUTO_FOCUS"); + CHECK_INTERFACE(ICamera, data, reply); + reply->writeInt32(cancelAutoFocus()); + return NO_ERROR; + } break; case TAKE_PICTURE: { LOGV("TAKE_PICTURE"); CHECK_INTERFACE(ICamera, data, reply);