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

Commit 5ec347fc authored by Wei Jia's avatar Wei Jia
Browse files

NuPlayerSource: add "precise" as additional argument to seekTo.

Test: compiles
Bug: 32557491
Change-Id: I9d251bf345630d6628125302946768297e73613f
parent 2aa19a96
Loading
Loading
Loading
Loading
+21 −18
Original line number Diff line number Diff line
@@ -665,8 +665,8 @@ void NuPlayer::GenericSource::onMessageReceived(const sp<AMessage> &msg) {
          } else {
              timeUs = mVideoLastDequeueTimeUs;
          }
          readBuffer(trackType, timeUs, &actualTimeUs, formatChange);
          readBuffer(counterpartType, -1, NULL, !formatChange);
          readBuffer(trackType, timeUs, false /* precise */, &actualTimeUs, formatChange);
          readBuffer(counterpartType, -1, false /* precise */, NULL, !formatChange);
          ALOGV("timeUs %lld actualTimeUs %lld", (long long)timeUs, (long long)actualTimeUs);

          break;
@@ -759,7 +759,7 @@ void NuPlayer::GenericSource::fetchTextData(
    CHECK(msg->findInt64("timeUs", &timeUs));

    int64_t subTimeUs;
    readBuffer(type, timeUs, &subTimeUs);
    readBuffer(type, timeUs, false /* precise */, &subTimeUs);

    int64_t delayUs = subTimeUs - timeUs;
    if (msg->what() == kWhatFetchSubtitleData) {
@@ -790,7 +790,7 @@ void NuPlayer::GenericSource::sendTextData(
    }

    int64_t nextSubTimeUs;
    readBuffer(type, -1, &nextSubTimeUs);
    readBuffer(type, -1, false /* precise */, &nextSubTimeUs);

    sp<ABuffer> buffer;
    status_t dequeueStatus = packets->dequeueAccessUnit(&buffer);
@@ -1186,9 +1186,10 @@ status_t NuPlayer::GenericSource::doSelectTrack(size_t trackIndex, bool select,
    return INVALID_OPERATION;
}

status_t NuPlayer::GenericSource::seekTo(int64_t seekTimeUs) {
status_t NuPlayer::GenericSource::seekTo(int64_t seekTimeUs, bool precise) {
    sp<AMessage> msg = new AMessage(kWhatSeek, this);
    msg->setInt64("seekTimeUs", seekTimeUs);
    msg->setInt32("precise", precise);

    sp<AMessage> response;
    status_t err = msg->postAndAwaitResponse(&response);
@@ -1201,10 +1202,12 @@ status_t NuPlayer::GenericSource::seekTo(int64_t seekTimeUs) {

void NuPlayer::GenericSource::onSeek(const sp<AMessage>& msg) {
    int64_t seekTimeUs;
    int32_t precise;
    CHECK(msg->findInt64("seekTimeUs", &seekTimeUs));
    CHECK(msg->findInt32("precise", &precise));

    sp<AMessage> response = new AMessage;
    status_t err = doSeek(seekTimeUs);
    status_t err = doSeek(seekTimeUs, precise);
    response->setInt32("err", err);

    sp<AReplyToken> replyID;
@@ -1212,7 +1215,7 @@ void NuPlayer::GenericSource::onSeek(const sp<AMessage>& msg) {
    response->postReply(replyID);
}

status_t NuPlayer::GenericSource::doSeek(int64_t seekTimeUs) {
status_t NuPlayer::GenericSource::doSeek(int64_t seekTimeUs, bool precise) {
    mBufferingMonitor->updateDequeuedBufferTime(-1ll);

    // If the Widevine source is stopped, do not attempt to read any
@@ -1222,10 +1225,12 @@ status_t NuPlayer::GenericSource::doSeek(int64_t seekTimeUs) {
    }
    if (mVideoTrack.mSource != NULL) {
        int64_t actualTimeUs;
        readBuffer(MEDIA_TRACK_TYPE_VIDEO, seekTimeUs, &actualTimeUs);
        readBuffer(MEDIA_TRACK_TYPE_VIDEO, seekTimeUs, precise, &actualTimeUs);

        if (!precise) {
            seekTimeUs = actualTimeUs;
        mVideoLastDequeueTimeUs = seekTimeUs;
        }
        mVideoLastDequeueTimeUs = actualTimeUs;
    }

    if (mAudioTrack.mSource != NULL) {
@@ -1250,7 +1255,8 @@ status_t NuPlayer::GenericSource::doSeek(int64_t seekTimeUs) {
sp<ABuffer> NuPlayer::GenericSource::mediaBufferToABuffer(
        MediaBuffer* mb,
        media_track_type trackType,
        int64_t /* seekTimeUs */,
        int64_t seekTimeUs,
        bool precise,
        int64_t *actualTimeUs) {
    bool audio = trackType == MEDIA_TRACK_TYPE_AUDIO;
    size_t outLength = mb->range_length();
@@ -1288,15 +1294,11 @@ sp<ABuffer> NuPlayer::GenericSource::mediaBufferToABuffer(
    CHECK(mb->meta_data()->findInt64(kKeyTime, &timeUs));
    meta->setInt64("timeUs", timeUs);

#if 0
    // Temporarily disable pre-roll till we have a full solution to handle
    // both single seek and continous seek gracefully.
    if (seekTimeUs > timeUs) {
    if (precise && seekTimeUs > timeUs) {
        sp<AMessage> extra = new AMessage;
        extra->setInt64("resume-at-mediaTimeUs", seekTimeUs);
        meta->setMessage("extra", extra);
    }
#endif

    if (trackType == MEDIA_TRACK_TYPE_VIDEO) {
        int32_t layerId;
@@ -1372,7 +1374,8 @@ void NuPlayer::GenericSource::onReadBuffer(const sp<AMessage>& msg) {
}

void NuPlayer::GenericSource::readBuffer(
        media_track_type trackType, int64_t seekTimeUs, int64_t *actualTimeUs, bool formatChange) {
        media_track_type trackType, int64_t seekTimeUs, bool precise,
        int64_t *actualTimeUs, bool formatChange) {
    // Do not read data if Widevine source is stopped
    if (mStopRead) {
        return;
@@ -1466,7 +1469,7 @@ void NuPlayer::GenericSource::readBuffer(
            queueDiscontinuityIfNeeded(seeking, formatChange, trackType, track);

            sp<ABuffer> buffer = mediaBufferToABuffer(
                    mbuf, trackType, seekTimeUs,
                    mbuf, trackType, seekTimeUs, precise,
                    numBuffers == 0 ? actualTimeUs : NULL);
            track->mPackets->queueAccessUnit(buffer);
            formatChange = false;
+5 −3
Original line number Diff line number Diff line
@@ -71,7 +71,7 @@ struct NuPlayer::GenericSource : public NuPlayer::Source {
    virtual sp<AMessage> getTrackInfo(size_t trackIndex) const;
    virtual ssize_t getSelectedTrack(media_track_type type) const;
    virtual status_t selectTrack(size_t trackIndex, bool select, int64_t timeUs);
    virtual status_t seekTo(int64_t seekTimeUs);
    virtual status_t seekTo(int64_t seekTimeUs, bool precise = false);

    virtual status_t setBuffers(bool audio, Vector<MediaBuffer *> &buffers);

@@ -258,7 +258,7 @@ private:
    status_t doSelectTrack(size_t trackIndex, bool select, int64_t timeUs);

    void onSeek(const sp<AMessage>& msg);
    status_t doSeek(int64_t seekTimeUs);
    status_t doSeek(int64_t seekTimeUs, bool precise);

    void onPrepareAsync();

@@ -278,13 +278,15 @@ private:
            MediaBuffer *mbuf,
            media_track_type trackType,
            int64_t seekTimeUs,
            bool precise,
            int64_t *actualTimeUs = NULL);

    void postReadBuffer(media_track_type trackType);
    void onReadBuffer(const sp<AMessage>& msg);
    void readBuffer(
            media_track_type trackType,
            int64_t seekTimeUs = -1ll, int64_t *actualTimeUs = NULL, bool formatChange = false);
            int64_t seekTimeUs = -1ll, bool precise = false,
            int64_t *actualTimeUs = NULL, bool formatChange = false);

    void queueDiscontinuityIfNeeded(
            bool seeking, bool formatChange, media_track_type trackType, Track *track);
+2 −2
Original line number Diff line number Diff line
@@ -214,8 +214,8 @@ status_t NuPlayer::HTTPLiveSource::selectTrack(size_t trackIndex, bool select, i
    return (err == OK || err == BAD_VALUE) ? (status_t)OK : err;
}

status_t NuPlayer::HTTPLiveSource::seekTo(int64_t seekTimeUs) {
    return mLiveSession->seekTo(seekTimeUs);
status_t NuPlayer::HTTPLiveSource::seekTo(int64_t seekTimeUs, bool precise) {
    return mLiveSession->seekTo(seekTimeUs, precise);
}

void NuPlayer::HTTPLiveSource::pollForRawData(
+1 −1
Original line number Diff line number Diff line
@@ -47,7 +47,7 @@ struct NuPlayer::HTTPLiveSource : public NuPlayer::Source {
    virtual sp<AMessage> getTrackInfo(size_t trackIndex) const;
    virtual ssize_t getSelectedTrack(media_track_type /* type */) const;
    virtual status_t selectTrack(size_t trackIndex, bool select, int64_t timeUs);
    virtual status_t seekTo(int64_t seekTimeUs);
    virtual status_t seekTo(int64_t seekTimeUs, bool precise = false);

protected:
    virtual ~HTTPLiveSource();
+1 −1
Original line number Diff line number Diff line
@@ -104,7 +104,7 @@ struct NuPlayer::Source : public AHandler {
        return INVALID_OPERATION;
    }

    virtual status_t seekTo(int64_t /* seekTimeUs */) {
    virtual status_t seekTo(int64_t /* seekTimeUs */, bool /* precise */ = false) {
        return INVALID_OPERATION;
    }

Loading