summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndriy Chepurnyy <x0155536@ti.com>2013-05-30 19:12:13 +0300
committerHashcode <hashcode0f@gmail.com>2015-02-03 13:41:13 -0800
commit86a4c32fa81297d20b4c563aaf17323530bb9797 (patch)
treed0738c28586b7f4cf08e1255b2a139b6e89465a4
parentc0eb0990aa53ef0574c3fa4943c1d4de5732bf30 (diff)
downloadhardware_ti_omap4-86a4c32fa81297d20b4c563aaf17323530bb9797.zip
hardware_ti_omap4-86a4c32fa81297d20b4c563aaf17323530bb9797.tar.gz
hardware_ti_omap4-86a4c32fa81297d20b4c563aaf17323530bb9797.tar.bz2
CameraHAL: Correctly calculate frame ref counter
This patch fix reference calculation during AV record usecase. Previously there was some logic that counts reference depends what type of frame passed. That leads to race condition in case of video snapshot. Now all possible types of subscriptions will be counted for particular frame. Change-Id: If183fdc425a25424fdb3ca5d31a0030c3669f322 Signed-off-by: Andriy Chepurnyy <x0155536@ti.com>
-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);