summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorIgor Murashkin <iam@google.com>2013-05-09 19:01:31 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2013-05-09 19:01:31 +0000
commit9d75e9928f0fd49c4a0764ab71eb00636848c87a (patch)
treed8c2242aaff0cfe73644d8a08cab33b91f966ee9 /services
parent714e392037834a1d183609745e69d3cfc2d26985 (diff)
parent5a1798ad24c73212c6614cf9f11de5fa86a20148 (diff)
downloadframeworks_av-9d75e9928f0fd49c4a0764ab71eb00636848c87a.zip
frameworks_av-9d75e9928f0fd49c4a0764ab71eb00636848c87a.tar.gz
frameworks_av-9d75e9928f0fd49c4a0764ab71eb00636848c87a.tar.bz2
Merge "camera3: Manage fences properly when buffers are returned with an error" into jb-mr2-dev
Diffstat (limited to 'services')
-rw-r--r--services/camera/libcameraservice/camera3/Camera3OutputStream.cpp50
-rw-r--r--services/camera/libcameraservice/camera3/Camera3ZslStream.cpp49
2 files changed, 75 insertions, 24 deletions
diff --git a/services/camera/libcameraservice/camera3/Camera3OutputStream.cpp b/services/camera/libcameraservice/camera3/Camera3OutputStream.cpp
index ec8cf0d..9693346 100644
--- a/services/camera/libcameraservice/camera3/Camera3OutputStream.cpp
+++ b/services/camera/libcameraservice/camera3/Camera3OutputStream.cpp
@@ -152,15 +152,23 @@ status_t Camera3OutputStream::returnBufferLocked(
mId);
return INVALID_OPERATION;
}
+
+ sp<Fence> releaseFence;
+
+ /**
+ * Fence management - calculate Release Fence
+ */
if (buffer.status == CAMERA3_BUFFER_STATUS_ERROR) {
- res = mConsumer->cancelBuffer(mConsumer.get(),
- container_of(buffer.buffer, ANativeWindowBuffer, handle),
- buffer.release_fence);
- if (res != OK) {
- ALOGE("%s: Stream %d: Error cancelling buffer to native window:"
- " %s (%d)", __FUNCTION__, mId, strerror(-res), res);
- return res;
+ if (buffer.release_fence != -1) {
+ ALOGE("%s: Stream %d: HAL should not set release_fence(%d) when "
+ "there is an error", __FUNCTION__, mId, buffer.release_fence);
+ close(buffer.release_fence);
}
+
+ /**
+ * Reassign release fence as the acquire fence in case of error
+ */
+ releaseFence = new Fence(buffer.acquire_fence);
} else {
res = native_window_set_buffers_timestamp(mConsumer.get(), timestamp);
if (res != OK) {
@@ -169,22 +177,40 @@ status_t Camera3OutputStream::returnBufferLocked(
return res;
}
- sp<Fence> releaseFence = new Fence(buffer.release_fence);
- int anwReleaseFence = releaseFence->dup();
+ releaseFence = new Fence(buffer.release_fence);
+ }
+ int anwReleaseFence = releaseFence->dup();
+
+ /**
+ * Return buffer back to ANativeWindow
+ */
+ if (buffer.status == CAMERA3_BUFFER_STATUS_ERROR) {
+ // Cancel buffer
+ res = mConsumer->cancelBuffer(mConsumer.get(),
+ container_of(buffer.buffer, ANativeWindowBuffer, handle),
+ anwReleaseFence);
+ if (res != OK) {
+ ALOGE("%s: Stream %d: Error cancelling buffer to native window:"
+ " %s (%d)", __FUNCTION__, mId, strerror(-res), res);
+ }
+ } else {
res = mConsumer->queueBuffer(mConsumer.get(),
container_of(buffer.buffer, ANativeWindowBuffer, handle),
anwReleaseFence);
if (res != OK) {
ALOGE("%s: Stream %d: Error queueing buffer to native window: %s (%d)",
__FUNCTION__, mId, strerror(-res), res);
- close(anwReleaseFence);
- return res;
}
+ }
- mCombinedFence = Fence::merge(mName, mCombinedFence, releaseFence);
+ if (res != OK) {
+ close(anwReleaseFence);
+ return res;
}
+ mCombinedFence = Fence::merge(mName, mCombinedFence, releaseFence);
+
mDequeuedBufferCount--;
mBufferReturnedSignal.signal();
mLastTimestamp = timestamp;
diff --git a/services/camera/libcameraservice/camera3/Camera3ZslStream.cpp b/services/camera/libcameraservice/camera3/Camera3ZslStream.cpp
index 0345d5b..5a13dde 100644
--- a/services/camera/libcameraservice/camera3/Camera3ZslStream.cpp
+++ b/services/camera/libcameraservice/camera3/Camera3ZslStream.cpp
@@ -208,15 +208,23 @@ status_t Camera3ZslStream::returnBufferLocked(
mId);
return INVALID_OPERATION;
}
+
+ sp<Fence> releaseFence;
+
+ /**
+ * Fence management - calculate Release Fence
+ */
if (buffer.status == CAMERA3_BUFFER_STATUS_ERROR) {
- res = mConsumer->cancelBuffer(mConsumer.get(),
- container_of(buffer.buffer, ANativeWindowBuffer, handle),
- buffer.release_fence);
- if (res != OK) {
- ALOGE("%s: Stream %d: Error cancelling buffer to native window:"
- " %s (%d)", __FUNCTION__, mId, strerror(-res), res);
- return res;
+ if (buffer.release_fence != -1) {
+ ALOGE("%s: Stream %d: HAL should not set release_fence(%d) when "
+ "there is an error", __FUNCTION__, mId, buffer.release_fence);
+ close(buffer.release_fence);
}
+
+ /**
+ * Reassign release fence as the acquire fence in case of error
+ */
+ releaseFence = new Fence(buffer.acquire_fence);
} else {
res = native_window_set_buffers_timestamp(mConsumer.get(), timestamp);
if (res != OK) {
@@ -225,21 +233,38 @@ status_t Camera3ZslStream::returnBufferLocked(
return res;
}
- sp<Fence> releaseFence = new Fence(buffer.release_fence);
- int anwReleaseFence = releaseFence->dup();
+ releaseFence = new Fence(buffer.release_fence);
+ }
+ int anwReleaseFence = releaseFence->dup();
+
+ /**
+ * Return buffer back to ANativeWindow
+ */
+ if (buffer.status == CAMERA3_BUFFER_STATUS_ERROR) {
+ // Cancel buffer
+ res = mConsumer->cancelBuffer(mConsumer.get(),
+ container_of(buffer.buffer, ANativeWindowBuffer, handle),
+ anwReleaseFence);
+ if (res != OK) {
+ ALOGE("%s: Stream %d: Error cancelling buffer to native window:"
+ " %s (%d)", __FUNCTION__, mId, strerror(-res), res);
+ }
+ } else {
res = mConsumer->queueBuffer(mConsumer.get(),
container_of(buffer.buffer, ANativeWindowBuffer, handle),
anwReleaseFence);
if (res != OK) {
ALOGE("%s: Stream %d: Error queueing buffer to native window: %s (%d)",
__FUNCTION__, mId, strerror(-res), res);
- close(anwReleaseFence);
- return res;
}
+ }
- mCombinedFence = Fence::merge(mName, mCombinedFence, releaseFence);
+ if (res != OK) {
+ close(anwReleaseFence);
+ return res;
}
+ mCombinedFence = Fence::merge(mName, mCombinedFence, releaseFence);
mDequeuedBufferCount--;
mBufferReturnedSignal.signal();