From bbbc7cb77efba3dd46e9d13fc22e81cff17c35d2 Mon Sep 17 00:00:00 2001 From: Dave Sparks Date: Tue, 23 Jun 2009 17:30:11 -0700 Subject: Use a ref-counted callback interface for Camera. This allows the camera service to hang onto the callback interface until all callbacks have been processed. This prevents problems where pending callbacks in binder worker threads are processed after the Java camera object and its associated native resources have been released. Bug 1884362 --- libs/ui/Camera.cpp | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'libs/ui/Camera.cpp') diff --git a/libs/ui/Camera.cpp b/libs/ui/Camera.cpp index 661370040e..1aa5245202 100644 --- a/libs/ui/Camera.cpp +++ b/libs/ui/Camera.cpp @@ -337,9 +337,32 @@ void Camera::setErrorCallback(error_callback cb, void *cookie) mErrorCallbackCookie = cookie; } +void Camera::setListener(const sp& listener) +{ + Mutex::Autolock _l(mLock); + mListener = listener; +} + +void Camera::setPreviewCallbackFlags(int flag) +{ + LOGV("setPreviewCallbackFlags"); + sp c = mCamera; + if (c == 0) return; + mCamera->setPreviewCallbackFlag(flag); +} + // callback from camera service void Camera::notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2) { + sp listener; + { + Mutex::Autolock _l(mLock); + listener = mListener; + } + if (listener != NULL) { + listener->notify(msgType, ext1, ext2); + } + switch(msgType) { case CAMERA_MSG_ERROR: LOGV("errorCallback"); @@ -368,6 +391,15 @@ void Camera::notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2) // callback from camera service when frame or image is ready void Camera::dataCallback(int32_t msgType, const sp& dataPtr) { + sp listener; + { + Mutex::Autolock _l(mLock); + listener = mListener; + } + if (listener != NULL) { + listener->postData(msgType, dataPtr); + } + switch(msgType) { case CAMERA_MSG_PREVIEW_FRAME: LOGV("previewCallback"); @@ -401,6 +433,7 @@ void Camera::dataCallback(int32_t msgType, const sp& dataPtr) void Camera::binderDied(const wp& who) { LOGW("ICamera died"); + notifyCallback(CAMERA_MSG_ERROR, DEAD_OBJECT, 0); if (mErrorCallback) { mErrorCallback(DEAD_OBJECT, mErrorCallbackCookie); } -- cgit v1.2.3-59-g8ed1b