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

Commit 9e2b7918 authored by Marco Nelissen's avatar Marco Nelissen Committed by Lajos Molnar
Browse files

handle error during flush in MediaPlayer.reset()

If there was an error during the flush phase of a reset, then the
reset would never complete. We now make sure the MediaCodec moves
to the right state in this case, and that NuPlayer cleans up and
resumes the rest of the reset after a failed flush.

Bug: 16955082
Change-Id: Ied61136871a9fcdffcc80647fa2bba64a926ac2a
parent 426c719a
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -782,6 +782,14 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
                    err = UNKNOWN_ERROR;
                }
                mRenderer->queueEOS(audio, err);
                if (audio && mFlushingAudio != NONE) {
                    mAudioDecoder.clear();
                    mFlushingAudio = SHUT_DOWN;
                } else if (!audio && mFlushingVideo != NONE){
                    mVideoDecoder.clear();
                    mFlushingVideo = SHUT_DOWN;
                }
                finishFlushIfPossible();
            } else if (what == Decoder::kWhatDrainThisBuffer) {
                renderBuffer(audio, msg);
            } else {
+2 −2
Original line number Diff line number Diff line
@@ -44,11 +44,11 @@ NuPlayer::Decoder::Decoder(
    // Every decoder has its own looper because MediaCodec operations
    // are blocking, but NuPlayer needs asynchronous operations.
    mDecoderLooper = new ALooper;
    mDecoderLooper->setName("NuPlayerDecoder");
    mDecoderLooper->setName("NPDecoder");
    mDecoderLooper->start(false, false, ANDROID_PRIORITY_AUDIO);

    mCodecLooper = new ALooper;
    mCodecLooper->setName("NuPlayerDecoder-MC");
    mCodecLooper->setName("NPDecoder-CL");
    mCodecLooper->start(false, false, ANDROID_PRIORITY_AUDIO);
}

+8 −3
Original line number Diff line number Diff line
@@ -716,7 +716,8 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) {
                    CHECK(msg->findInt32("err", &err));
                    CHECK(msg->findInt32("actionCode", &actionCode));

                    ALOGE("Codec reported err %#x, actionCode %d", err, actionCode);
                    ALOGE("Codec reported err %#x, actionCode %d, while in state %d",
                            err, actionCode, mState);
                    if (err == DEAD_OBJECT) {
                        mFlags |= kFlagSawMediaServerDie;
                    }
@@ -767,8 +768,12 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) {

                        case FLUSHING:
                        {
                            if (actionCode == ACTION_CODE_FATAL) {
                                setState(UNINITIALIZED);
                            } else {
                                setState(
                                        (mFlags & kFlagIsAsync) ? FLUSHED : STARTED);
                            }
                            break;
                        }