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

Commit 6eff943c authored by Wei Jia's avatar Wei Jia Committed by Android (Google) Code Review
Browse files

Merge "NuPlayerDecoder: postpone input message processing when it's not dequeued." into lmp-dev

parents 8b76b592 2245fc62
Loading
Loading
Loading
Loading
+28 −7
Original line number Diff line number Diff line
@@ -189,6 +189,8 @@ void NuPlayer::Decoder::releaseAndResetMediaBuffers() {
    for (size_t i = 0; i < mInputBufferIsDequeued.size(); i++) {
        mInputBufferIsDequeued.editItemAt(i) = false;
    }

    mPendingInputMessages.clear();
}

void NuPlayer::Decoder::requestCodecNotification() {
@@ -274,7 +276,19 @@ bool NuPlayer::Decoder::handleAnInputBuffer() {
        ALOGI("[%s] resubmitting CSD", mComponentName.c_str());
        reply->setBuffer("buffer", buffer);
        mCSDsToSubmit.removeAt(0);
        reply->post();
        CHECK(onInputBufferFilled(reply));
        return true;
    }

    while (!mPendingInputMessages.empty()) {
        sp<AMessage> msg = *mPendingInputMessages.begin();
        if (!onInputBufferFilled(msg)) {
            break;
        }
        mPendingInputMessages.erase(mPendingInputMessages.begin());
    }

    if (!mInputBufferIsDequeued.editItemAt(bufferIx)) {
        return true;
    }

@@ -286,7 +300,7 @@ bool NuPlayer::Decoder::handleAnInputBuffer() {
    return true;
}

void android::NuPlayer::Decoder::onInputBufferFilled(const sp<AMessage> &msg) {
bool android::NuPlayer::Decoder::onInputBufferFilled(const sp<AMessage> &msg) {
    size_t bufferIx;
    CHECK(msg->findSize("buffer-ix", &bufferIx));
    CHECK_LT(bufferIx, mInputBuffers.size());
@@ -306,9 +320,12 @@ void android::NuPlayer::Decoder::onInputBufferFilled(const sp<AMessage> &msg) {
                const sp<ABuffer> &buf = mInputBuffers[ix];
                if (buf->data() == mediaBuffer->data()) {
                    // all input buffers are dequeued on start, hence the check
                    CHECK(mInputBufferIsDequeued[ix]);
                    if (!mInputBufferIsDequeued[ix]) {
                        ALOGV("[%s] received MediaBuffer for #%zu instead of #%zu",
                                mComponentName.c_str(), ix, bufferIx);
                        mediaBuffer->release();
                        return false;
                    }

                    // TRICKY: need buffer for the metadata, so instead, set
                    // codecBuffer to the same (though incorrect) buffer to
@@ -333,7 +350,7 @@ void android::NuPlayer::Decoder::onInputBufferFilled(const sp<AMessage> &msg) {

        if (streamErr == OK) {
            /* buffers are returned to hold on to */
            return;
            return true;
        }

        // attempt to queue EOS
@@ -398,6 +415,7 @@ void android::NuPlayer::Decoder::onInputBufferFilled(const sp<AMessage> &msg) {
            }
        }
    }
    return true;
}

bool NuPlayer::Decoder::handleAnOutputBuffer() {
@@ -620,7 +638,10 @@ void NuPlayer::Decoder::onMessageReceived(const sp<AMessage> &msg) {
        case kWhatInputBufferFilled:
        {
            if (!isStaleReply(msg)) {
                onInputBufferFilled(msg);
                if (!mPendingInputMessages.empty()
                        || !onInputBufferFilled(msg)) {
                    mPendingInputMessages.push_back(msg);
                }
            }

            break;
+3 −1
Original line number Diff line number Diff line
@@ -80,6 +80,8 @@ private:
    sp<ALooper> mCodecLooper;
    sp<ALooper> mDecoderLooper;

    List<sp<AMessage> > mPendingInputMessages;

    Vector<sp<ABuffer> > mInputBuffers;
    Vector<sp<ABuffer> > mOutputBuffers;
    Vector<sp<ABuffer> > mCSDsForCurrentFormat;
@@ -98,7 +100,7 @@ private:
    void onConfigure(const sp<AMessage> &format);
    void onFlush();
    void onResume();
    void onInputBufferFilled(const sp<AMessage> &msg);
    bool onInputBufferFilled(const sp<AMessage> &msg);
    void onRenderBuffer(const sp<AMessage> &msg);
    void onShutdown();