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

Commit 0512bd43 authored by Lajos Molnar's avatar Lajos Molnar Committed by Android Git Automerger
Browse files

am 07c408ad: Merge "stagefright: handle removal of a tracked buffer in ACodec" into mnc-dev

* commit '07c408ad':
  stagefright: handle removal of a tracked buffer in ACodec
parents a0a386db 07c408ad
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -119,8 +119,9 @@ struct FrameRenderTracker : public RefBase {
    std::list<Info> checkFencesAndGetRenderedFrames(const Info *until, bool dropIncomplete);

    // Stop tracking a queued frame (e.g. if the frame has been discarded). If |info| is NULL or is
    // not tracked, this method is a no-op.
    void untrackFrame(const Info *info);
    // not tracked, this method is a no-op. If |index| is specified, all indices larger that |index|
    // are decremented. This is useful if the untracked frame is deleted from the frame vector.
    void untrackFrame(const Info *info, ssize_t index = SSIZE_MAX);

    void dumpRenderQueue() const;

+10 −5
Original line number Diff line number Diff line
@@ -1271,8 +1271,12 @@ void ACodec::notifyOfRenderedFrames(bool dropIncomplete, FrameRenderTracker::Inf
    // unlink untracked frames
    for (std::list<FrameRenderTracker::Info>::const_iterator it = done.cbegin();
            it != done.cend(); ++it) {
        if (it->getIndex() >= 0) {
            mBuffers[kPortIndexOutput].editItemAt(it->getIndex()).mRenderInfo = NULL;
        ssize_t index = it->getIndex();
        if (index >= 0 && (size_t)index < mBuffers[kPortIndexOutput].size()) {
            mBuffers[kPortIndexOutput].editItemAt(index).mRenderInfo = NULL;
        } else if (index >= 0) {
            // THIS SHOULD NEVER HAPPEN
            ALOGE("invalid index %zd in %zu", index, mBuffers[kPortIndexOutput].size());
        }
    }

@@ -1467,12 +1471,13 @@ status_t ACodec::freeBuffer(OMX_U32 portIndex, size_t i) {
        ::close(info->mFenceFd);
    }

    mRenderTracker.untrackFrame(info->mRenderInfo);
    if (portIndex == kPortIndexOutput) {
        mRenderTracker.untrackFrame(info->mRenderInfo, i);
        info->mRenderInfo = NULL;
    }

    // remove buffer even if mOMX->freeBuffer fails
    mBuffers[portIndex].removeAt(i);

    return err;
}

+14 −7
Original line number Diff line number Diff line
@@ -149,14 +149,21 @@ std::list<FrameRenderTracker::Info> FrameRenderTracker::checkFencesAndGetRendere
    return done;
}

void FrameRenderTracker::untrackFrame(const FrameRenderTracker::Info *info) {
    if (info != NULL) {
void FrameRenderTracker::untrackFrame(const FrameRenderTracker::Info *info, ssize_t index) {
    if (info == NULL && index == SSIZE_MAX) {
        // nothing to do
        return;
    }

    for (std::list<Info>::iterator it = mRenderQueue.begin();
                it != mRenderQueue.end(); ++it) {
            it != mRenderQueue.end(); ) {
        if (&*it == info) {
                mRenderQueue.erase(it);
                return;
            mRenderQueue.erase(it++);
        } else {
            if (it->mIndex > index) {
                --(it->mIndex);
            }
            ++it;
        }
    }
}