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