diff options
-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); |