diff options
author | 2009-09-15 14:51:56 +0800 | |
---|---|---|
committer | 2009-09-15 18:29:03 +0800 | |
commit | 244f8c26365a303d9dd861bd48a29a4b48578da1 (patch) | |
tree | 33c20568a94d606507507ec5cedf2a01eba8de58 | |
parent | 54c06152e0d9c666aec61ae5d9686d7d3327ea34 (diff) |
Fix 2083478: Camera needs an auto-focus cancel API
Change-Id: I13bda991b32aee47e82b5cf9d43b3021c416a9a2
-rw-r--r-- | camera/libcameraservice/CameraHardwareStub.cpp | 5 | ||||
-rw-r--r-- | camera/libcameraservice/CameraHardwareStub.h | 1 | ||||
-rw-r--r-- | camera/libcameraservice/CameraService.cpp | 17 | ||||
-rw-r--r-- | camera/libcameraservice/CameraService.h | 3 | ||||
-rw-r--r-- | core/java/android/hardware/Camera.java | 16 | ||||
-rw-r--r-- | core/jni/android_hardware_Camera.cpp | 15 | ||||
-rw-r--r-- | include/ui/Camera.h | 3 | ||||
-rw-r--r-- | include/ui/CameraHardwareInterface.h | 8 | ||||
-rw-r--r-- | include/ui/ICamera.h | 3 | ||||
-rw-r--r-- | libs/ui/Camera.cpp | 8 | ||||
-rw-r--r-- | 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 24496bb7e2f8..35f4846f9b72 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 000906a74376..f957fa87acfd 100644 --- a/camera/libcameraservice/CameraHardwareStub.h +++ b/camera/libcameraservice/CameraHardwareStub.h @@ -51,6 +51,7 @@ public: virtual void releaseRecordingFrame(const sp<IMemory>& 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<String16>& args) const; diff --git a/camera/libcameraservice/CameraService.cpp b/camera/libcameraservice/CameraService.cpp index f425f6bc184e..bab7d086a111 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 f8c72167068e..0a909cf01a19 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 04daa1cd9645..9991600e64da 100644 --- a/core/java/android/hardware/Camera.java +++ b/core/java/android/hardware/Camera.java @@ -383,6 +383,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. */ public interface ShutterCallback @@ -1338,5 +1352,3 @@ public class Camera { } }; } - - diff --git a/core/jni/android_hardware_Camera.cpp b/core/jni/android_hardware_Camera.cpp index 8a312d935d84..ce2b10c2f3d5 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<Camera> 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 ae6e255ea910..9ceb8fd43dab 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 535f70e0cdc6..5fbb7d80cb91 100644 --- a/include/ui/CameraHardwareInterface.h +++ b/include/ui/CameraHardwareInterface.h @@ -161,6 +161,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. */ virtual status_t takePicture() = 0; diff --git a/include/ui/ICamera.h b/include/ui/ICamera.h index 1df791404156..7595e36e57b6 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 12a7725010f3..0c6d3408ab08 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 <ICamera> 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 805c2ca2be2c..fd7e084d2899 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); |