summaryrefslogtreecommitdiffstats
path: root/services/camera
diff options
context:
space:
mode:
authorZhijun He <zhijunhe@google.com>2013-05-24 12:41:03 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2013-05-24 12:41:03 -0700
commit55beec78a47a32288a01dde7fbc08406aa44345a (patch)
tree2eaa6df85571c958d135de3144aa3f0f8af15599 /services/camera
parent4032fc33089ddd6f4bc4f247f5c8f32a3f7f975e (diff)
parent22a5ddb68173b75053d838a30d091920cd0a1dca (diff)
downloadframeworks_av-55beec78a47a32288a01dde7fbc08406aa44345a.zip
frameworks_av-55beec78a47a32288a01dde7fbc08406aa44345a.tar.gz
frameworks_av-55beec78a47a32288a01dde7fbc08406aa44345a.tar.bz2
am 22a5ddb6: am 6f6b31da: Merge "Camera3: Fix the deadlock during recording pinch zooming" into jb-mr2-dev
* commit '22a5ddb68173b75053d838a30d091920cd0a1dca': Camera3: Fix the deadlock during recording pinch zooming
Diffstat (limited to 'services/camera')
-rw-r--r--services/camera/libcameraservice/camera3/Camera3OutputStream.cpp15
-rw-r--r--services/camera/libcameraservice/camera3/Camera3OutputStream.h3
2 files changed, 15 insertions, 3 deletions
diff --git a/services/camera/libcameraservice/camera3/Camera3OutputStream.cpp b/services/camera/libcameraservice/camera3/Camera3OutputStream.cpp
index a2c97d4..2efeede 100644
--- a/services/camera/libcameraservice/camera3/Camera3OutputStream.cpp
+++ b/services/camera/libcameraservice/camera3/Camera3OutputStream.cpp
@@ -166,11 +166,20 @@ status_t Camera3OutputStream::returnBufferCheckedLocked(
int anwReleaseFence = releaseFence->dup();
/**
+ * Release the lock briefly to avoid deadlock with
+ * StreamingProcessor::startStream -> Camera3Stream::isConfiguring (this
+ * thread will go into StreamingProcessor::onFrameAvailable) during
+ * queueBuffer
+ */
+ sp<ANativeWindow> currentConsumer = mConsumer;
+ mLock.unlock();
+
+ /**
* Return buffer back to ANativeWindow
*/
if (buffer.status == CAMERA3_BUFFER_STATUS_ERROR) {
// Cancel buffer
- res = mConsumer->cancelBuffer(mConsumer.get(),
+ res = currentConsumer->cancelBuffer(currentConsumer.get(),
container_of(buffer.buffer, ANativeWindowBuffer, handle),
anwReleaseFence);
if (res != OK) {
@@ -178,7 +187,7 @@ status_t Camera3OutputStream::returnBufferCheckedLocked(
" %s (%d)", __FUNCTION__, mId, strerror(-res), res);
}
} else {
- res = mConsumer->queueBuffer(mConsumer.get(),
+ res = currentConsumer->queueBuffer(currentConsumer.get(),
container_of(buffer.buffer, ANativeWindowBuffer, handle),
anwReleaseFence);
if (res != OK) {
@@ -186,7 +195,7 @@ status_t Camera3OutputStream::returnBufferCheckedLocked(
"%s (%d)", __FUNCTION__, mId, strerror(-res), res);
}
}
-
+ mLock.lock();
if (res != OK) {
close(anwReleaseFence);
return res;
diff --git a/services/camera/libcameraservice/camera3/Camera3OutputStream.h b/services/camera/libcameraservice/camera3/Camera3OutputStream.h
index ce317f9..774fbdd 100644
--- a/services/camera/libcameraservice/camera3/Camera3OutputStream.h
+++ b/services/camera/libcameraservice/camera3/Camera3OutputStream.h
@@ -66,6 +66,9 @@ class Camera3OutputStream :
Camera3OutputStream(int id, camera3_stream_type_t type,
uint32_t width, uint32_t height, int format);
+ /**
+ * Note that we release the lock briefly in this function
+ */
virtual status_t returnBufferCheckedLocked(
const camera3_stream_buffer &buffer,
nsecs_t timestamp,