summaryrefslogtreecommitdiffstats
path: root/camera/inc/BufferSourceAdapter.h
diff options
context:
space:
mode:
Diffstat (limited to 'camera/inc/BufferSourceAdapter.h')
-rw-r--r--camera/inc/BufferSourceAdapter.h64
1 files changed, 51 insertions, 13 deletions
diff --git a/camera/inc/BufferSourceAdapter.h b/camera/inc/BufferSourceAdapter.h
index 436d2e5..c006b9d 100644
--- a/camera/inc/BufferSourceAdapter.h
+++ b/camera/inc/BufferSourceAdapter.h
@@ -37,32 +37,54 @@ class BufferSourceAdapter : public DisplayAdapter
{
// private types
private:
+ ///Constant declarations
+ static const int NO_BUFFERS_IMAGE_CAPTURE_SYSTEM_HEAP;
+
+
// helper class to return frame in different thread context
class ReturnFrame : public android::Thread {
public:
ReturnFrame(BufferSourceAdapter* __this) : mBufferSourceAdapter(__this) {
- mWaitForSignal.Create(0);
+ android::AutoMutex lock(mReturnFrameMutex);
mDestroying = false;
+ mFrameCount = 0;
}
~ReturnFrame() {
- mDestroying = true;
- mWaitForSignal.Release();
+ android::AutoMutex lock(mReturnFrameMutex);
}
void signal() {
- mWaitForSignal.Signal();
+ android::AutoMutex lock(mReturnFrameMutex);
+ mFrameCount++;
+ mReturnFrameCondition.signal();
+ }
+
+ virtual void requestExit() {
+ Thread::requestExit();
+
+ android::AutoMutex lock(mReturnFrameMutex);
+ mDestroying = true;
+ mReturnFrameCondition.signal();
}
virtual bool threadLoop() {
- mWaitForSignal.Wait();
- if (!mDestroying) mBufferSourceAdapter->handleFrameReturn();
+ android::AutoMutex lock(mReturnFrameMutex);
+ if ( 0 >= mFrameCount ) {
+ mReturnFrameCondition.wait(mReturnFrameMutex);
+ }
+ if (!mDestroying) {
+ mBufferSourceAdapter->handleFrameReturn();
+ mFrameCount--;
+ }
return true;
}
private:
BufferSourceAdapter* mBufferSourceAdapter;
- Utils::Semaphore mWaitForSignal;
+ android::Condition mReturnFrameCondition;
+ android::Mutex mReturnFrameMutex;
+ int mFrameCount;
bool mDestroying;
};
@@ -74,6 +96,17 @@ private:
}
~QueueFrame() {
+ }
+
+ void addFrame(CameraFrame *frame) {
+ android::AutoMutex lock(mFramesMutex);
+ mFrames.add(new CameraFrame(*frame));
+ mFramesCondition.signal();
+ }
+
+ virtual void requestExit() {
+ Thread::requestExit();
+
mDestroying = true;
android::AutoMutex lock(mFramesMutex);
@@ -84,12 +117,6 @@ private:
delete frame;
}
mFramesCondition.signal();
- }
-
- void addFrame(CameraFrame *frame) {
- android::AutoMutex lock(mFramesMutex);
- mFrames.add(new CameraFrame(*frame));
- mFramesCondition.signal();
}
virtual bool threadLoop() {
@@ -106,6 +133,12 @@ private:
if (frame) {
mBufferSourceAdapter->handleFrameCallback(frame);
frame->mMetaData.clear();
+
+ if (frame->mFrameType != CameraFrame::REPROCESS_INPUT_FRAME) {
+ // signal return frame thread that it can dequeue a buffer now
+ mBufferSourceAdapter->mReturnFrame->signal();
+ }
+
delete frame;
}
@@ -149,6 +182,11 @@ public:
virtual int freeBufferList(CameraBuffer * buflist);
virtual int maxQueueableBuffers(unsigned int& queueable);
virtual int minUndequeueableBuffers(int& unqueueable);
+ virtual bool match(const char * str);
+
+ virtual CameraBuffer * getBuffers(bool reset = false);
+ virtual unsigned int getSize();
+ virtual int getBufferCount();
static void frameCallback(CameraFrame* caFrame);
void addFrame(CameraFrame* caFrame);