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

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

Merge "NuPlayer will notify SeekComplete only when requested so." into lmp-dev

parents a4b08944 e427abf1
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);
};
@@ -324,9 +326,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();
}

@@ -561,7 +564,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
@@ -940,7 +944,7 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
                mRenderer->signalDisableOffloadAudio();
                mOffloadAudio = false;

                performSeek(positionUs);
                performSeek(positionUs, false /* needNotify */);
                instantiateDecoder(true /* audio */, &mAudioDecoder);
            }
            break;
@@ -969,14 +973,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;
@@ -1802,10 +1810,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
@@ -1822,9 +1831,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;
@@ -215,7 +216,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;
        }