Loading include/media/stagefright/CameraSource.h +3 −0 Original line number Diff line number Diff line Loading @@ -244,12 +244,15 @@ private: * The following variables are used in VIDEO_BUFFER_MODE_BUFFER_QUEUE mode. */ static const size_t kConsumerBufferCount = 8; static const nsecs_t kMemoryBaseAvailableTimeoutNs = 200000000; // 200ms // Consumer and producer of the buffer queue between this class and camera. sp<BufferItemConsumer> mVideoBufferConsumer; sp<IGraphicBufferProducer> mVideoBufferProducer; // Memory used to send the buffers to encoder, where sp<IMemory> stores VideoNativeMetadata. sp<IMemoryHeap> mMemoryHeapBase; List<sp<IMemory>> mMemoryBases; // The condition that will be signaled when there is an entry available in mMemoryBases. Condition mMemoryBaseAvailableCond; // A mapping from ANativeWindowBuffer sent to encoder to BufferItem received from camera. // This is protected by mLock. KeyedVector<ANativeWindowBuffer*, BufferItem> mReceivedBufferItemMap; Loading media/libstagefright/CameraSource.cpp +8 −4 Original line number Diff line number Diff line Loading @@ -919,6 +919,7 @@ void CameraSource::releaseRecordingFrame(const sp<IMemory>& frame) { mReceivedBufferItemMap.removeItemsAt(index); mVideoBufferConsumer->releaseBuffer(buffer); mMemoryBases.push_back(frame); mMemoryBaseAvailableCond.signal(); } else if (mCameraRecordingProxy != NULL) { mCameraRecordingProxy->releaseRecordingFrame(frame); } else if (mCamera != NULL) { Loading Loading @@ -1122,11 +1123,14 @@ void CameraSource::processBufferQueueFrame(const BufferItem& buffer) { return; } if (mMemoryBases.empty()) { ALOGW("%s: No available memory base. Dropping a recording frame.", __FUNCTION__); while (mMemoryBases.empty()) { if (mMemoryBaseAvailableCond.waitRelative(mLock, kMemoryBaseAvailableTimeoutNs) == TIMED_OUT) { ALOGW("Waiting on an available memory base timed out. Dropping a recording frame."); mVideoBufferConsumer->releaseBuffer(buffer); return; } } ++mNumFramesReceived; Loading Loading
include/media/stagefright/CameraSource.h +3 −0 Original line number Diff line number Diff line Loading @@ -244,12 +244,15 @@ private: * The following variables are used in VIDEO_BUFFER_MODE_BUFFER_QUEUE mode. */ static const size_t kConsumerBufferCount = 8; static const nsecs_t kMemoryBaseAvailableTimeoutNs = 200000000; // 200ms // Consumer and producer of the buffer queue between this class and camera. sp<BufferItemConsumer> mVideoBufferConsumer; sp<IGraphicBufferProducer> mVideoBufferProducer; // Memory used to send the buffers to encoder, where sp<IMemory> stores VideoNativeMetadata. sp<IMemoryHeap> mMemoryHeapBase; List<sp<IMemory>> mMemoryBases; // The condition that will be signaled when there is an entry available in mMemoryBases. Condition mMemoryBaseAvailableCond; // A mapping from ANativeWindowBuffer sent to encoder to BufferItem received from camera. // This is protected by mLock. KeyedVector<ANativeWindowBuffer*, BufferItem> mReceivedBufferItemMap; Loading
media/libstagefright/CameraSource.cpp +8 −4 Original line number Diff line number Diff line Loading @@ -919,6 +919,7 @@ void CameraSource::releaseRecordingFrame(const sp<IMemory>& frame) { mReceivedBufferItemMap.removeItemsAt(index); mVideoBufferConsumer->releaseBuffer(buffer); mMemoryBases.push_back(frame); mMemoryBaseAvailableCond.signal(); } else if (mCameraRecordingProxy != NULL) { mCameraRecordingProxy->releaseRecordingFrame(frame); } else if (mCamera != NULL) { Loading Loading @@ -1122,11 +1123,14 @@ void CameraSource::processBufferQueueFrame(const BufferItem& buffer) { return; } if (mMemoryBases.empty()) { ALOGW("%s: No available memory base. Dropping a recording frame.", __FUNCTION__); while (mMemoryBases.empty()) { if (mMemoryBaseAvailableCond.waitRelative(mLock, kMemoryBaseAvailableTimeoutNs) == TIMED_OUT) { ALOGW("Waiting on an available memory base timed out. Dropping a recording frame."); mVideoBufferConsumer->releaseBuffer(buffer); return; } } ++mNumFramesReceived; Loading