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

Commit 095da43d authored by Yin-Chia Yeh's avatar Yin-Chia Yeh Committed by Android (Google) Code Review
Browse files

Merge "camera2: skip capture result after clearZslQueue" into lmp-dev

parents 3b54aba0 6b7a2294
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -44,6 +44,7 @@ ZslProcessor3::ZslProcessor3(
    sp<Camera2Client> client,
    wp<CaptureSequencer> sequencer):
        Thread(false),
        mLatestClearedBufferTimestamp(0),
        mState(RUNNING),
        mClient(client),
        mSequencer(sequencer),
@@ -107,7 +108,6 @@ void ZslProcessor3::onResultAvailable(const CaptureResult &result) {
        ALOGE("%s: metadata doesn't have timestamp, skip this result", __FUNCTION__);
        return;
    }
    (void)timestamp;

    entry = result.mMetadata.find(ANDROID_REQUEST_FRAME_COUNT);
    if (entry.count == 0) {
@@ -120,6 +120,9 @@ void ZslProcessor3::onResultAvailable(const CaptureResult &result) {

    if (mState != RUNNING) return;

    // Corresponding buffer has been cleared. No need to push into mFrameList
    if (timestamp <= mLatestClearedBufferTimestamp) return;

    mFrameList.editItemAt(mFrameListHead) = result.mMetadata;
    mFrameListHead = (mFrameListHead + 1) % mFrameListDepth;
}
@@ -392,7 +395,7 @@ status_t ZslProcessor3::clearZslQueueLocked() {
    if (mZslStream != 0) {
        // clear result metadata list first.
        clearZslResultQueueLocked();
        return mZslStream->clearInputRingBuffer();
        return mZslStream->clearInputRingBuffer(&mLatestClearedBufferTimestamp);
    }
    return OK;
}
+1 −0
Original line number Diff line number Diff line
@@ -82,6 +82,7 @@ class ZslProcessor3 :

  private:
    static const nsecs_t kWaitDuration = 10000000; // 10 ms
    nsecs_t mLatestClearedBufferTimestamp;

    enum {
        RUNNING,
+8 −4
Original line number Diff line number Diff line
@@ -315,20 +315,24 @@ status_t Camera3ZslStream::enqueueInputBufferByTimestamp(
    return OK;
}

status_t Camera3ZslStream::clearInputRingBuffer() {
status_t Camera3ZslStream::clearInputRingBuffer(nsecs_t* latestTimestamp) {
    Mutex::Autolock l(mLock);

    return clearInputRingBufferLocked();
    return clearInputRingBufferLocked(latestTimestamp);
}

status_t Camera3ZslStream::clearInputRingBufferLocked() {
status_t Camera3ZslStream::clearInputRingBufferLocked(nsecs_t* latestTimestamp) {

    if (latestTimestamp) {
        *latestTimestamp = mProducer->getLatestTimestamp();
    }
    mInputBufferQueue.clear();

    return mProducer->clear();
}

status_t Camera3ZslStream::disconnectLocked() {
    clearInputRingBufferLocked();
    clearInputRingBufferLocked(NULL);

    return Camera3OutputStream::disconnectLocked();
}
+4 −2
Original line number Diff line number Diff line
@@ -59,8 +59,10 @@ class Camera3ZslStream :

    /**
     * Clears the buffers that can be used by enqueueInputBufferByTimestamp
     * latestTimestamp will be filled with the largest timestamp of buffers
     * being cleared, 0 if there is no buffer being clear.
     */
    status_t clearInputRingBuffer();
    status_t clearInputRingBuffer(nsecs_t* latestTimestamp);

  protected:

@@ -100,7 +102,7 @@ class Camera3ZslStream :
    // Disconnet the Camera3ZslStream specific bufferQueues.
    virtual status_t disconnectLocked();

    status_t clearInputRingBufferLocked();
    status_t clearInputRingBufferLocked(nsecs_t* latestTimestamp);

}; // class Camera3ZslStream

+17 −1
Original line number Diff line number Diff line
@@ -41,7 +41,8 @@ RingBufferConsumer::RingBufferConsumer(const sp<IGraphicBufferConsumer>& consume
        uint32_t consumerUsage,
        int bufferCount) :
    ConsumerBase(consumer),
    mBufferCount(bufferCount)
    mBufferCount(bufferCount),
    mLatestTimestamp(0)
{
    mConsumer->setConsumerUsageBits(consumerUsage);
    mConsumer->setMaxAcquiredBufferCount(bufferCount);
@@ -152,6 +153,14 @@ status_t RingBufferConsumer::clear() {
    return OK;
}

nsecs_t RingBufferConsumer::getLatestTimestamp() {
    Mutex::Autolock _l(mMutex);
    if (mBufferItemList.size() == 0) {
        return 0;
    }
    return mLatestTimestamp;
}

void RingBufferConsumer::pinBufferLocked(const BufferItem& item) {
    List<RingBufferItem>::iterator it, end;

@@ -302,6 +311,13 @@ void RingBufferConsumer::onFrameAvailable() {
                item.mTimestamp,
                mBufferItemList.size(), mBufferCount);

        if (item.mTimestamp < mLatestTimestamp) {
            BI_LOGE("Timestamp  decreases from %" PRId64 " to %" PRId64,
                    mLatestTimestamp, item.mTimestamp);
        }

        mLatestTimestamp = item.mTimestamp;

        item.mGraphicBuffer = mSlots[item.mBuf].mGraphicBuffer;
    } // end of mMutex lock

Loading