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

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

Merge "NuPlayer: merge start() and resume()." into lmp-mr1-dev

parents 6e8212b2 9421174a
Loading
Loading
Loading
Loading
+87 −86
Original line number Diff line number Diff line
@@ -306,10 +306,6 @@ void NuPlayer::pause() {
    (new AMessage(kWhatPause, id()))->post();
}

void NuPlayer::resume() {
    (new AMessage(kWhatResume, id()))->post();
}

void NuPlayer::resetAsync() {
    if (mSource != NULL) {
        // During a reset, the data source might be unresponsive already, we need to
@@ -574,69 +570,11 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
        case kWhatStart:
        {
            ALOGV("kWhatStart");

            mVideoIsAVC = false;
            mOffloadAudio = false;
            mAudioEOS = false;
            mVideoEOS = false;
            mSkipRenderingAudioUntilMediaTimeUs = -1;
            mSkipRenderingVideoUntilMediaTimeUs = -1;
            mNumFramesTotal = 0;
            mNumFramesDropped = 0;
            mStarted = true;

            /* instantiate decoders now for secure playback */
            if (mSourceFlags & Source::FLAG_SECURE) {
                if (mNativeWindow != NULL) {
                    instantiateDecoder(false, &mVideoDecoder);
                }

                if (mAudioSink != NULL) {
                    instantiateDecoder(true, &mAudioDecoder);
                }
            }

            mSource->start();

            uint32_t flags = 0;

            if (mSource->isRealTime()) {
                flags |= Renderer::FLAG_REAL_TIME;
            }

            sp<MetaData> audioMeta = mSource->getFormatMeta(true /* audio */);
            audio_stream_type_t streamType = AUDIO_STREAM_MUSIC;
            if (mAudioSink != NULL) {
                streamType = mAudioSink->getAudioStreamType();
            }

            sp<AMessage> videoFormat = mSource->getFormat(false /* audio */);

            mOffloadAudio =
                canOffloadStream(audioMeta, (videoFormat != NULL),
                                 true /* is_streaming */, streamType);
            if (mOffloadAudio) {
                flags |= Renderer::FLAG_OFFLOAD_AUDIO;
            }

            sp<AMessage> notify = new AMessage(kWhatRendererNotify, id());
            ++mRendererGeneration;
            notify->setInt32("generation", mRendererGeneration);
            mRenderer = new Renderer(mAudioSink, notify, flags);

            mRendererLooper = new ALooper;
            mRendererLooper->setName("NuPlayerRenderer");
            mRendererLooper->start(false, false, ANDROID_PRIORITY_AUDIO);
            mRendererLooper->registerHandler(mRenderer);

            sp<MetaData> meta = getFileMeta();
            int32_t rate;
            if (meta != NULL
                    && meta->findInt32(kKeyFrameRate, &rate) && rate > 0) {
                mRenderer->setVideoFrameRate(rate);
            if (mStarted) {
                onResume();
            } else {
                onStart();
            }

            postScanSources();
            break;
        }

@@ -979,8 +917,25 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
            break;
        }

        case kWhatResume:
        case kWhatSourceNotify:
        {
            onSourceNotify(msg);
            break;
        }

        case kWhatClosedCaptionNotify:
        {
            onClosedCaptionNotify(msg);
            break;
        }

        default:
            TRESPASS();
            break;
    }
}

void NuPlayer::onResume() {
    if (mSource != NULL) {
        mSource->resume();
    } else {
@@ -996,25 +951,71 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
    } else {
        ALOGW("resume called when renderer is gone or not set");
    }
            break;
}

        case kWhatSourceNotify:
        {
            onSourceNotify(msg);
            break;
void NuPlayer::onStart() {
    mVideoIsAVC = false;
    mOffloadAudio = false;
    mAudioEOS = false;
    mVideoEOS = false;
    mSkipRenderingAudioUntilMediaTimeUs = -1;
    mSkipRenderingVideoUntilMediaTimeUs = -1;
    mNumFramesTotal = 0;
    mNumFramesDropped = 0;
    mStarted = true;

    /* instantiate decoders now for secure playback */
    if (mSourceFlags & Source::FLAG_SECURE) {
        if (mNativeWindow != NULL) {
            instantiateDecoder(false, &mVideoDecoder);
        }

        case kWhatClosedCaptionNotify:
        {
            onClosedCaptionNotify(msg);
            break;
        if (mAudioSink != NULL) {
            instantiateDecoder(true, &mAudioDecoder);
        }
    }

        default:
            TRESPASS();
            break;
    mSource->start();

    uint32_t flags = 0;

    if (mSource->isRealTime()) {
        flags |= Renderer::FLAG_REAL_TIME;
    }

    sp<MetaData> audioMeta = mSource->getFormatMeta(true /* audio */);
    audio_stream_type_t streamType = AUDIO_STREAM_MUSIC;
    if (mAudioSink != NULL) {
        streamType = mAudioSink->getAudioStreamType();
    }

    sp<AMessage> videoFormat = mSource->getFormat(false /* audio */);

    mOffloadAudio =
        canOffloadStream(audioMeta, (videoFormat != NULL),
                         true /* is_streaming */, streamType);
    if (mOffloadAudio) {
        flags |= Renderer::FLAG_OFFLOAD_AUDIO;
    }

    sp<AMessage> notify = new AMessage(kWhatRendererNotify, id());
    ++mRendererGeneration;
    notify->setInt32("generation", mRendererGeneration);
    mRenderer = new Renderer(mAudioSink, notify, flags);

    mRendererLooper = new ALooper;
    mRendererLooper->setName("NuPlayerRenderer");
    mRendererLooper->start(false, false, ANDROID_PRIORITY_AUDIO);
    mRendererLooper->registerHandler(mRenderer);

    sp<MetaData> meta = getFileMeta();
    int32_t rate;
    if (meta != NULL
            && meta->findInt32(kKeyFrameRate, &rate) && rate > 0) {
        mRenderer->setVideoFrameRate(rate);
    }

    postScanSources();
}

bool NuPlayer::audioDecoderStillNeeded() {
+3 −1
Original line number Diff line number Diff line
@@ -54,7 +54,6 @@ struct NuPlayer : public AHandler {
    void start();

    void pause();
    void resume();

    // Will notify the driver through "notifyResetComplete" once finished.
    void resetAsync();
@@ -213,6 +212,9 @@ private:
    void handleFlushComplete(bool audio, bool isDecoder);
    void finishFlushIfPossible();

    void onStart();
    void onResume();

    bool audioDecoderStillNeeded();

    void flushDecoder(
+13 −18
Original line number Diff line number Diff line
@@ -239,16 +239,24 @@ status_t NuPlayerDriver::start() {
            // fall through
        }

        case STATE_PAUSED:
        case STATE_STOPPED_AND_PREPARED:
        {
            if (mAtEOS && mStartupSeekTimeUs < 0) {
                mStartupSeekTimeUs = 0;
                mPositionUs = -1;
            }

            // fall through
        }

        case STATE_PREPARED:
        {
            mAtEOS = false;
            mPlayer->start();

            if (mStartupSeekTimeUs >= 0) {
                if (mStartupSeekTimeUs > 0) {
                mPlayer->seekToAsync(mStartupSeekTimeUs);
                }

                mStartupSeekTimeUs = -1;
            }
            break;
@@ -264,20 +272,6 @@ status_t NuPlayerDriver::start() {
            break;
        }

        case STATE_PAUSED:
        case STATE_STOPPED_AND_PREPARED:
        {
            if (mAtEOS) {
                mPlayer->seekToAsync(0);
                mAtEOS = false;
                mPlayer->resume();
                mPositionUs = -1;
            } else {
                mPlayer->resume();
            }
            break;
        }

        default:
            return INVALID_OPERATION;
    }
@@ -348,6 +342,7 @@ status_t NuPlayerDriver::seekTo(int msec) {

    switch (mState) {
        case STATE_PREPARED:
        case STATE_STOPPED_AND_PREPARED:
        {
            mStartupSeekTimeUs = seekTimeUs;
            // pretend that the seek completed. It will actually happen when starting playback.