summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--camera/BaseCameraAdapter.cpp118
-rw-r--r--camera/OMXCameraAdapter/OMXCapture.cpp2
-rw-r--r--camera/inc/BaseCameraAdapter.h5
3 files changed, 75 insertions, 50 deletions
diff --git a/camera/BaseCameraAdapter.cpp b/camera/BaseCameraAdapter.cpp
index aa12b05..5b1b22f 100644
--- a/camera/BaseCameraAdapter.cpp
+++ b/camera/BaseCameraAdapter.cpp
@@ -347,7 +347,7 @@ void BaseCameraAdapter::returnFrame(CameraBuffer * frameBuf, CameraFrame::FrameT
{
android::AutoMutex lock(mReturnFrameLock);
- refCount = getFrameRefCount(frameBuf, frameType);
+ refCount = getFrameRefCountByType(frameBuf, frameType);
if(frameType == CameraFrame::PREVIEW_FRAME_SYNC)
{
@@ -362,18 +362,12 @@ void BaseCameraAdapter::returnFrame(CameraBuffer * frameBuf, CameraFrame::FrameT
{
refCount--;
- setFrameRefCount(frameBuf, frameType, refCount);
+ setFrameRefCountByType(frameBuf, frameType, refCount);
-
- if ( mRecording && (CameraFrame::VIDEO_FRAME_SYNC == frameType) ) {
- refCount += getFrameRefCount(frameBuf, CameraFrame::PREVIEW_FRAME_SYNC);
- } else if ( mRecording && (CameraFrame::PREVIEW_FRAME_SYNC == frameType) ) {
- refCount += getFrameRefCount(frameBuf, CameraFrame::VIDEO_FRAME_SYNC);
- } else if ( mRecording && (CameraFrame::SNAPSHOT_FRAME == frameType) ) {
- refCount += getFrameRefCount(frameBuf, CameraFrame::VIDEO_FRAME_SYNC);
+ if (mRecording) {
+ refCount += getFrameRefCount(frameBuf);
}
-
}
else
{
@@ -1379,7 +1373,7 @@ status_t BaseCameraAdapter::__sendFrameToSubscribers(CameraFrame* frame,
}
if (NULL != subscribers) {
- refCount = getFrameRefCount(frame->mBuffer, frameType);
+ refCount = getFrameRefCountByType(frame->mBuffer, frameType);
if (refCount == 0) {
CAMHAL_LOGDA("Invalid ref count of 0");
@@ -1433,37 +1427,37 @@ int BaseCameraAdapter::setInitFrameRefCount(CameraBuffer * buf, unsigned int mas
case CameraFrame::IMAGE_FRAME:
{
- setFrameRefCount(buf, CameraFrame::IMAGE_FRAME, (int) mImageSubscribers.size());
+ setFrameRefCountByType(buf, CameraFrame::IMAGE_FRAME, (int) mImageSubscribers.size());
}
break;
case CameraFrame::RAW_FRAME:
{
- setFrameRefCount(buf, CameraFrame::RAW_FRAME, mRawSubscribers.size());
+ setFrameRefCountByType(buf, CameraFrame::RAW_FRAME, mRawSubscribers.size());
}
break;
case CameraFrame::PREVIEW_FRAME_SYNC:
{
- setFrameRefCount(buf, CameraFrame::PREVIEW_FRAME_SYNC, mFrameSubscribers.size());
+ setFrameRefCountByType(buf, CameraFrame::PREVIEW_FRAME_SYNC, mFrameSubscribers.size());
}
break;
case CameraFrame::SNAPSHOT_FRAME:
{
- setFrameRefCount(buf, CameraFrame::SNAPSHOT_FRAME, mSnapshotSubscribers.size());
+ setFrameRefCountByType(buf, CameraFrame::SNAPSHOT_FRAME, mSnapshotSubscribers.size());
}
break;
case CameraFrame::VIDEO_FRAME_SYNC:
{
- setFrameRefCount(buf,CameraFrame::VIDEO_FRAME_SYNC, mVideoSubscribers.size());
+ setFrameRefCountByType(buf,CameraFrame::VIDEO_FRAME_SYNC, mVideoSubscribers.size());
}
break;
case CameraFrame::FRAME_DATA_SYNC:
{
- setFrameRefCount(buf, CameraFrame::FRAME_DATA_SYNC, mFrameDataSubscribers.size());
+ setFrameRefCountByType(buf, CameraFrame::FRAME_DATA_SYNC, mFrameDataSubscribers.size());
}
break;
case CameraFrame::REPROCESS_INPUT_FRAME:
{
- setFrameRefCount(buf,CameraFrame::REPROCESS_INPUT_FRAME, mVideoInSubscribers.size());
+ setFrameRefCountByType(buf,CameraFrame::REPROCESS_INPUT_FRAME, mVideoInSubscribers.size());
}
break;
default:
@@ -1477,60 +1471,90 @@ int BaseCameraAdapter::setInitFrameRefCount(CameraBuffer * buf, unsigned int mas
return ret;
}
-int BaseCameraAdapter::getFrameRefCount(CameraBuffer * frameBuf, CameraFrame::FrameType frameType)
+int BaseCameraAdapter::getFrameRefCount(CameraBuffer * frameBuf)
+{
+ int res = 0, refCnt = 0;
+
+ for (unsigned int frameType = 1; frameType < CameraFrame::ALL_FRAMES; frameType <<= 1) {
+ refCnt = getFrameRefCountByType(frameBuf, static_cast<CameraFrame::FrameType>(frameType));
+ if (refCnt > 0) res += refCnt;
+ }
+ return res;
+}
+
+int BaseCameraAdapter::getFrameRefCountByType(CameraBuffer * frameBuf, CameraFrame::FrameType frameType)
{
int res = -1;
+ ssize_t index = NAME_NOT_FOUND;
LOG_FUNCTION_NAME;
- switch ( frameType )
- {
+ switch (frameType) {
case CameraFrame::IMAGE_FRAME:
case CameraFrame::RAW_FRAME:
- {
- android::AutoMutex lock(mCaptureBufferLock);
- res = mCaptureBuffersAvailable.valueFor(frameBuf );
- }
+ {
+ android::AutoMutex lock(mCaptureBufferLock);
+ index = mCaptureBuffersAvailable.indexOfKey(frameBuf);
+ if (index != NAME_NOT_FOUND) {
+ res = mCaptureBuffersAvailable[index];
+ }
break;
+ }
case CameraFrame::SNAPSHOT_FRAME:
- {
- android::AutoMutex lock(mSnapshotBufferLock);
- res = mSnapshotBuffersAvailable.valueFor(frameBuf );
- }
+ {
+ android::AutoMutex lock(mSnapshotBufferLock);
+ index = mSnapshotBuffersAvailable.indexOfKey(frameBuf);
+ if (index != NAME_NOT_FOUND) {
+ res = mSnapshotBuffersAvailable[index];
+ }
break;
+ }
case CameraFrame::PREVIEW_FRAME_SYNC:
- {
- android::AutoMutex lock(mPreviewBufferLock);
- res = mPreviewBuffersAvailable.valueFor(frameBuf );
- }
+ {
+ android::AutoMutex lock(mPreviewBufferLock);
+ index = mPreviewBuffersAvailable.indexOfKey(frameBuf);
+ if (index != NAME_NOT_FOUND) {
+ res = mPreviewBuffersAvailable[index];
+ }
break;
+ }
case CameraFrame::FRAME_DATA_SYNC:
- {
- android::AutoMutex lock(mPreviewDataBufferLock);
- res = mPreviewDataBuffersAvailable.valueFor(frameBuf );
- }
+ {
+ android::AutoMutex lock(mPreviewDataBufferLock);
+ index = mPreviewDataBuffersAvailable.indexOfKey(frameBuf);
+ if (index != NAME_NOT_FOUND) {
+ res = mPreviewDataBuffersAvailable[index];
+ }
break;
+ }
case CameraFrame::VIDEO_FRAME_SYNC:
- {
- android::AutoMutex lock(mVideoBufferLock);
- res = mVideoBuffersAvailable.valueFor(frameBuf );
- }
+ {
+ android::AutoMutex lock(mVideoBufferLock);
+ index = mVideoBuffersAvailable.indexOfKey(frameBuf);
+ if (index != NAME_NOT_FOUND) {
+ res = mVideoBuffersAvailable[index];
+ }
break;
- case CameraFrame::REPROCESS_INPUT_FRAME: {
- android::AutoMutex lock(mVideoInBufferLock);
- res = mVideoInBuffersAvailable.valueFor(frameBuf );
}
+ case CameraFrame::REPROCESS_INPUT_FRAME:
+ {
+ android::AutoMutex lock(mVideoInBufferLock);
+ index = mVideoInBuffersAvailable.indexOfKey(frameBuf);
+ if (index != NAME_NOT_FOUND) {
+ res = mVideoInBuffersAvailable[index];
+ }
break;
+ }
default:
break;
- };
+ }
LOG_FUNCTION_NAME_EXIT;
return res;
}
-void BaseCameraAdapter::setFrameRefCount(CameraBuffer * frameBuf, CameraFrame::FrameType frameType, int refCount)
+void BaseCameraAdapter::setFrameRefCountByType(CameraBuffer * frameBuf, CameraFrame::FrameType frameType, int refCount)
{
LOG_FUNCTION_NAME;
@@ -1630,7 +1654,7 @@ status_t BaseCameraAdapter::stopVideoCapture()
for ( unsigned int i = 0 ; i < mVideoBuffersAvailable.size() ; i++ )
{
CameraBuffer *frameBuf = mVideoBuffersAvailable.keyAt(i);
- if( getFrameRefCount(frameBuf, CameraFrame::VIDEO_FRAME_SYNC) > 0)
+ if( getFrameRefCountByType(frameBuf, CameraFrame::VIDEO_FRAME_SYNC) > 0)
{
returnFrame(frameBuf, CameraFrame::VIDEO_FRAME_SYNC);
}
diff --git a/camera/OMXCameraAdapter/OMXCapture.cpp b/camera/OMXCameraAdapter/OMXCapture.cpp
index 4168bf1..afc335e 100644
--- a/camera/OMXCameraAdapter/OMXCapture.cpp
+++ b/camera/OMXCameraAdapter/OMXCapture.cpp
@@ -936,7 +936,7 @@ status_t OMXCameraAdapter::doBracketing(OMX_BUFFERHEADERTYPE *pBuffHeader,
mBracketingBuffersQueued[nextBufferIdx] = true;
mBracketingBuffersQueuedCount++;
mLastBracetingBufferIdx = nextBufferIdx;
- setFrameRefCount((CameraBuffer *)imgCaptureData->mBufferHeader[nextBufferIdx]->pAppPrivate, typeOfFrame, 1);
+ setFrameRefCountByType((CameraBuffer *)imgCaptureData->mBufferHeader[nextBufferIdx]->pAppPrivate, typeOfFrame, 1);
returnFrame((CameraBuffer *)imgCaptureData->mBufferHeader[nextBufferIdx]->pAppPrivate, typeOfFrame);
}
}
diff --git a/camera/inc/BaseCameraAdapter.h b/camera/inc/BaseCameraAdapter.h
index 185d58e..ffe0492 100644
--- a/camera/inc/BaseCameraAdapter.h
+++ b/camera/inc/BaseCameraAdapter.h
@@ -176,8 +176,9 @@ protected:
status_t resetFrameRefCount(CameraFrame &frame);
//A couple of helper functions
- void setFrameRefCount(CameraBuffer* frameBuf, CameraFrame::FrameType frameType, int refCount);
- int getFrameRefCount(CameraBuffer* frameBuf, CameraFrame::FrameType frameType);
+ void setFrameRefCountByType(CameraBuffer* frameBuf, CameraFrame::FrameType frameType, int refCount);
+ int getFrameRefCount(CameraBuffer* frameBuf);
+ int getFrameRefCountByType(CameraBuffer* frameBuf, CameraFrame::FrameType frameType);
int setInitFrameRefCount(CameraBuffer* buf, unsigned int mask);
static const char* getLUTvalue_translateHAL(int Value, LUTtypeHAL LUT);