From 4bc4a3845e456fd464556d79d20650a107e873e5 Mon Sep 17 00:00:00 2001 From: Igor Murashkin Date: Wed, 20 Feb 2013 13:36:17 -0800 Subject: ProCamera: Fix waitForFrameBuffer not handling multiple outstanding frames If the CpuConsumer triggered multiple onFrameAvailable callbacks in between a single waitForFrameBuffer call, the old code would only handle 1 callback. This meant on two subsequent waitForFrameBuffer calls the second would always timeout when two buffers were already available to be unlocked. Bug: 8238112 Change-Id: Ibefca35005ac5c408e5ada97ec4a4344a9e3e497 --- camera/ProCamera.cpp | 41 +++++++++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 8 deletions(-) (limited to 'camera/ProCamera.cpp') diff --git a/camera/ProCamera.cpp b/camera/ProCamera.cpp index d4a9556..7c66d62 100644 --- a/camera/ProCamera.cpp +++ b/camera/ProCamera.cpp @@ -432,20 +432,21 @@ void ProCamera::onFrameAvailable(int streamId) { // Unblock waitForFrame(id) callers { Mutex::Autolock al(mWaitMutex); - getStreamInfo(streamId).frameReady = true; + getStreamInfo(streamId).frameReady++; mWaitCondition.broadcast(); } } -status_t ProCamera::waitForFrameBuffer(int streamId) { +int ProCamera::waitForFrameBuffer(int streamId) { status_t stat = BAD_VALUE; Mutex::Autolock al(mWaitMutex); StreamInfo& si = getStreamInfo(streamId); - if (si.frameReady) { - si.frameReady = false; - return OK; + if (si.frameReady > 0) { + int numFrames = si.frameReady; + si.frameReady = 0; + return numFrames; } else { while (true) { stat = mWaitCondition.waitRelative(mWaitMutex, @@ -456,9 +457,10 @@ status_t ProCamera::waitForFrameBuffer(int streamId) { return stat; } - if (si.frameReady) { - si.frameReady = false; - return OK; + if (si.frameReady > 0) { + int numFrames = si.frameReady; + si.frameReady = 0; + return numFrames; } // else it was some other stream that got unblocked } @@ -467,6 +469,29 @@ status_t ProCamera::waitForFrameBuffer(int streamId) { return stat; } +int ProCamera::dropFrameBuffer(int streamId, int count) { + StreamInfo& si = getStreamInfo(streamId); + + if (!si.cpuStream) { + return BAD_VALUE; + } else if (count < 0) { + return BAD_VALUE; + } + + int numDropped = 0; + for (int i = 0; i < count; ++i) { + CpuConsumer::LockedBuffer buffer; + if (si.cpuConsumer->lockNextBuffer(&buffer) != OK) { + break; + } + + si.cpuConsumer->unlockBuffer(buffer); + numDropped++; + } + + return numDropped; +} + status_t ProCamera::waitForFrameMetadata() { status_t stat = BAD_VALUE; Mutex::Autolock al(mWaitMutex); -- cgit v1.1