diff options
author | Andriy Chepurnyy <x0155536@ti.com> | 2013-05-30 19:12:13 +0300 |
---|---|---|
committer | Hashcode <hashcode0f@gmail.com> | 2015-02-03 13:41:13 -0800 |
commit | 86a4c32fa81297d20b4c563aaf17323530bb9797 (patch) | |
tree | d0738c28586b7f4cf08e1255b2a139b6e89465a4 | |
parent | c0eb0990aa53ef0574c3fa4943c1d4de5732bf30 (diff) | |
download | hardware_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.cpp | 118 | ||||
-rw-r--r-- | camera/OMXCameraAdapter/OMXCapture.cpp | 2 | ||||
-rw-r--r-- | camera/inc/BaseCameraAdapter.h | 5 |
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); |