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

Commit e427abf1 authored by Wei Jia's avatar Wei Jia
Browse files

NuPlayer will notify SeekComplete only when requested so.

Bug: 17596535
Change-Id: I6b744fdcf80f11d521d26c7c8b45f7de70aa0dc3
parent 0079b331
Loading
Loading
Loading
Loading
+23 −12
Original line number Diff line number Diff line
@@ -64,16 +64,18 @@ private:
};

struct NuPlayer::SeekAction : public Action {
    SeekAction(int64_t seekTimeUs)
        : mSeekTimeUs(seekTimeUs) {
    SeekAction(int64_t seekTimeUs, bool needNotify)
        : mSeekTimeUs(seekTimeUs),
          mNeedNotify(needNotify) {
    }

    virtual void execute(NuPlayer *player) {
        player->performSeek(mSeekTimeUs);
        player->performSeek(mSeekTimeUs, mNeedNotify);
    }

private:
    int64_t mSeekTimeUs;
    bool mNeedNotify;

    DISALLOW_EVIL_CONSTRUCTORS(SeekAction);
};
@@ -323,9 +325,10 @@ void NuPlayer::resetAsync() {
    (new AMessage(kWhatReset, id()))->post();
}

void NuPlayer::seekToAsync(int64_t seekTimeUs) {
void NuPlayer::seekToAsync(int64_t seekTimeUs, bool needNotify) {
    sp<AMessage> msg = new AMessage(kWhatSeek, id());
    msg->setInt64("seekTimeUs", seekTimeUs);
    msg->setInt32("needNotify", needNotify);
    msg->post();
}

@@ -560,7 +563,8 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
                    // the extractor may not yet be started and will assert.
                    // If the video decoder is not set (perhaps audio only in this case)
                    // do not perform a seek as it is not needed.
                    mDeferredActions.push_back(new SeekAction(mCurrentPositionUs));
                    mDeferredActions.push_back(
                            new SeekAction(mCurrentPositionUs, false /* needNotify */));
                }

                // If there is a new surface texture, instantiate decoders
@@ -926,7 +930,7 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
                mRenderer->signalDisableOffloadAudio();
                mOffloadAudio = false;

                performSeek(positionUs);
                performSeek(positionUs, false /* needNotify */);
                instantiateDecoder(true /* audio */, &mAudioDecoder);
            }
            break;
@@ -955,14 +959,18 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
        case kWhatSeek:
        {
            int64_t seekTimeUs;
            int32_t needNotify;
            CHECK(msg->findInt64("seekTimeUs", &seekTimeUs));
            CHECK(msg->findInt32("needNotify", &needNotify));

            ALOGV("kWhatSeek seekTimeUs=%lld us", seekTimeUs);
            ALOGV("kWhatSeek seekTimeUs=%lld us, needNotify=%d",
                    seekTimeUs, needNotify);

            mDeferredActions.push_back(
                    new SimpleAction(&NuPlayer::performDecoderFlush));

            mDeferredActions.push_back(new SeekAction(seekTimeUs));
            mDeferredActions.push_back(
                    new SeekAction(seekTimeUs, needNotify));

            processDeferredActions();
            break;
@@ -1774,10 +1782,11 @@ void NuPlayer::processDeferredActions() {
    }
}

void NuPlayer::performSeek(int64_t seekTimeUs) {
    ALOGV("performSeek seekTimeUs=%lld us (%.2f secs)",
void NuPlayer::performSeek(int64_t seekTimeUs, bool needNotify) {
    ALOGV("performSeek seekTimeUs=%lld us (%.2f secs), needNotify(%d)",
          seekTimeUs,
          seekTimeUs / 1E6);
          seekTimeUs / 1E6,
          needNotify);

    if (mSource == NULL) {
        // This happens when reset occurs right before the loop mode
@@ -1794,9 +1803,11 @@ void NuPlayer::performSeek(int64_t seekTimeUs) {
        sp<NuPlayerDriver> driver = mDriver.promote();
        if (driver != NULL) {
            driver->notifyPosition(seekTimeUs);
            if (needNotify) {
                driver->notifySeekComplete();
            }
        }
    }

    // everything's flushed, continue playback.
}
+4 −3
Original line number Diff line number Diff line
@@ -59,8 +59,9 @@ struct NuPlayer : public AHandler {
    // Will notify the driver through "notifyResetComplete" once finished.
    void resetAsync();

    // Will notify the driver through "notifySeekComplete" once finished.
    void seekToAsync(int64_t seekTimeUs);
    // Will notify the driver through "notifySeekComplete" once finished
    // and needNotify is true.
    void seekToAsync(int64_t seekTimeUs, bool needNotify = false);

    status_t setVideoScalingMode(int32_t mode);
    status_t getTrackInfo(Parcel* reply) const;
@@ -214,7 +215,7 @@ private:

    void processDeferredActions();

    void performSeek(int64_t seekTimeUs);
    void performSeek(int64_t seekTimeUs, bool needNotify);
    void performDecoderFlush();
    void performDecoderShutdown(bool audio, bool video);
    void performReset();
+2 −4
Original line number Diff line number Diff line
@@ -240,9 +240,7 @@ status_t NuPlayerDriver::start() {
            mPlayer->start();

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

@@ -369,7 +367,7 @@ status_t NuPlayerDriver::seekTo(int msec) {
            mAtEOS = false;
            // seeks can take a while, so we essentially paused
            notifyListener_l(MEDIA_PAUSED);
            mPlayer->seekToAsync(seekTimeUs);
            mPlayer->seekToAsync(seekTimeUs, true /* needNotify */);
            break;
        }