Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9670850d authored by Chien-Yu Chen's avatar Chien-Yu Chen Committed by Android (Google) Code Review
Browse files

Merge "CameraSource: Wait before dropping a frame" into nyc-dev

parents 2af5b1d8 0419ba7b
Loading
Loading
Loading
Loading
+3 −0
Original line number Original line Diff line number Diff line
@@ -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;
+8 −4
Original line number Original line Diff line number Diff line
@@ -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) {
@@ -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;