summaryrefslogtreecommitdiffstats
path: root/libs/ui/Camera.cpp
diff options
context:
space:
mode:
authorDave Sparks <davidsparks@android.com>2009-06-23 17:30:11 -0700
committerDave Sparks <davidsparks@android.com>2009-06-24 07:58:27 -0700
commit5e27115995c4506dddf4f1271effd4fb4c935ad3 (patch)
treedd67833f50a64768b2bf25ec4d9dd5daa3a2dd78 /libs/ui/Camera.cpp
parent5f80605a0b866f34c74955e190909bd6ab5d992e (diff)
downloadframeworks_base-5e27115995c4506dddf4f1271effd4fb4c935ad3.zip
frameworks_base-5e27115995c4506dddf4f1271effd4fb4c935ad3.tar.gz
frameworks_base-5e27115995c4506dddf4f1271effd4fb4c935ad3.tar.bz2
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
Diffstat (limited to 'libs/ui/Camera.cpp')
-rw-r--r--libs/ui/Camera.cpp33
1 files changed, 33 insertions, 0 deletions
diff --git a/libs/ui/Camera.cpp b/libs/ui/Camera.cpp
index 6613700..1aa52452 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<CameraListener>& listener)
+{
+ Mutex::Autolock _l(mLock);
+ mListener = listener;
+}
+
+void Camera::setPreviewCallbackFlags(int flag)
+{
+ LOGV("setPreviewCallbackFlags");
+ sp <ICamera> 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<CameraListener> 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<IMemory>& dataPtr)
{
+ sp<CameraListener> 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<IMemory>& dataPtr)
void Camera::binderDied(const wp<IBinder>& who) {
LOGW("ICamera died");
+ notifyCallback(CAMERA_MSG_ERROR, DEAD_OBJECT, 0);
if (mErrorCallback) {
mErrorCallback(DEAD_OBJECT, mErrorCallbackCookie);
}