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

Commit dc9bacd8 authored by Andreas Huber's avatar Andreas Huber
Browse files

Propagate error signalled by the source all the way to the output EOS notification.

Change-Id: I30e959a6d669f09745c59fbdebee08f869511cf7
related-to-bug: 5372901
parent ece731de
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -113,6 +113,7 @@ private:

    Vector<BufferInfo> mBuffers[2];
    bool mPortEOS[2];
    status_t mInputEOSResult;

    List<sp<AMessage> > mDeferredQueue;

+5 −1
Original line number Diff line number Diff line
@@ -110,7 +110,11 @@ bool NuPlayer::HTTPLiveSource::feedMoreTSData() {
        if (n == -EWOULDBLOCK) {
            break;
        } else if (n < 0) {
            if (n != ERROR_END_OF_STREAM) {
                LOGI("input data EOS reached, error %d", n);
            } else {
                LOGI("input data EOS reached.");
            }
            mTSParser->signalEOS(n);
            mEOS = true;
            break;
+13 −2
Original line number Diff line number Diff line
@@ -272,7 +272,18 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
                    }
                }
            } else if (what == ACodec::kWhatEOS) {
                mRenderer->queueEOS(audio, ERROR_END_OF_STREAM);
                int32_t err;
                CHECK(codecRequest->findInt32("err", &err));

                if (err == ERROR_END_OF_STREAM) {
                    LOGV("got %s decoder EOS", audio ? "audio" : "video");
                } else {
                    LOGV("got %s decoder EOS w/ error %d",
                         audio ? "audio" : "video",
                         err);
                }

                mRenderer->queueEOS(audio, err);
            } else if (what == ACodec::kWhatFlushCompleted) {
                bool needShutdown;

@@ -397,7 +408,7 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
                if (finalResult == ERROR_END_OF_STREAM) {
                    LOGV("reached %s EOS", audio ? "audio" : "video");
                } else {
                    LOGE("%s track encountered an error (0x%08x)",
                    LOGE("%s track encountered an error (%d)",
                         audio ? "audio" : "video", finalResult);

                    notifyListener(
+19 −3
Original line number Diff line number Diff line
@@ -323,6 +323,7 @@ ACodec::ACodec()
    mFlushingState = new FlushingState(this);

    mPortEOS[kPortIndexInput] = mPortEOS[kPortIndexOutput] = false;
    mInputEOSResult = OK;

    changeState(mUninitializedState);
}
@@ -1347,7 +1348,10 @@ void ACodec::BaseState::onInputBufferFilled(const sp<AMessage> &msg) {
        case KEEP_BUFFERS:
        {
            if (buffer == NULL) {
                if (!mCodec->mPortEOS[kPortIndexInput]) {
                    mCodec->mPortEOS[kPortIndexInput] = true;
                    mCodec->mInputEOSResult = err;
                }
            }
            break;
        }
@@ -1398,8 +1402,14 @@ void ACodec::BaseState::onInputBufferFilled(const sp<AMessage> &msg) {

                getMoreInputDataIfPossible();
            } else if (!mCodec->mPortEOS[kPortIndexInput]) {
                if (err != ERROR_END_OF_STREAM) {
                    LOGV("[%s] Signalling EOS on the input port "
                         "due to error %d",
                         mCodec->mComponentName.c_str(), err);
                } else {
                    LOGV("[%s] Signalling EOS on the input port",
                         mCodec->mComponentName.c_str());
                }

                LOGV("[%s] calling emptyBuffer %p signalling EOS",
                     mCodec->mComponentName.c_str(), bufferID);
@@ -1416,6 +1426,7 @@ void ACodec::BaseState::onInputBufferFilled(const sp<AMessage> &msg) {
                info->mStatus = BufferInfo::OWNED_BY_COMPONENT;

                mCodec->mPortEOS[kPortIndexInput] = true;
                mCodec->mInputEOSResult = err;
            }
            break;

@@ -1523,6 +1534,7 @@ bool ACodec::BaseState::onOMXFillBufferDone(
            if (flags & OMX_BUFFERFLAG_EOS) {
                sp<AMessage> notify = mCodec->mNotify->dup();
                notify->setInt32("what", ACodec::kWhatEOS);
                notify->setInt32("err", mCodec->mInputEOSResult);
                notify->post();

                mCodec->mPortEOS[kPortIndexOutput] = true;
@@ -1721,6 +1733,8 @@ void ACodec::UninitializedState::onSetup(
    mCodec->mPortEOS[kPortIndexInput] =
        mCodec->mPortEOS[kPortIndexOutput] = false;

    mCodec->mInputEOSResult = OK;

    mCodec->configureCodec(mime.c_str(), msg);

    sp<RefBase> obj;
@@ -2371,6 +2385,8 @@ void ACodec::FlushingState::changeStateIfWeOwnAllBuffers() {
        mCodec->mPortEOS[kPortIndexInput] =
            mCodec->mPortEOS[kPortIndexOutput] = false;

        mCodec->mInputEOSResult = OK;

        mCodec->changeState(mCodec->mExecutingState);
    }
}