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

Commit 8a048338 authored by Chong Zhang's avatar Chong Zhang
Browse files

nuplayer: fixes for subtitle pause/resume

- pause after the current block when select track
- ignore metadata timestamps as they're too sparse
- use smaller range when searching for next segment to prevent
  resumeUntil from downloading too much data

bug: 20500732
Change-Id: Ibda57a39ec86efd96a8dd0db95adeb92d076697a
parent 32fa6d0e
Loading
Loading
Loading
Loading
+15 −5
Original line number Diff line number Diff line
@@ -189,7 +189,8 @@ NuPlayer::NuPlayer()
      mVideoFpsHint(-1.f),
      mStarted(false),
      mPaused(false),
      mPausedByClient(false) {
      mPausedByClient(false),
      mPausedForBuffering(false) {
    clearFlushComplete();
}

@@ -671,7 +672,10 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
        {
            ALOGV("kWhatStart");
            if (mStarted) {
                // do not resume yet if the source is still buffering
                if (!mPausedForBuffering) {
                    onResume();
                }
            } else {
                onStart();
            }
@@ -1977,9 +1981,10 @@ void NuPlayer::onSourceNotify(const sp<AMessage> &msg) {
        case Source::kWhatPauseOnBufferingStart:
        {
            // ignore if not playing
            if (mStarted && !mPausedByClient) {
            if (mStarted) {
                ALOGI("buffer low, pausing...");

                mPausedForBuffering = true;
                onPause();
            }
            // fall-thru
@@ -1994,11 +1999,16 @@ void NuPlayer::onSourceNotify(const sp<AMessage> &msg) {
        case Source::kWhatResumeOnBufferingEnd:
        {
            // ignore if not playing
            if (mStarted && !mPausedByClient) {
            if (mStarted) {
                ALOGI("buffer ready, resuming...");

                mPausedForBuffering = false;

                // do not resume yet if client didn't unpause
                if (!mPausedByClient) {
                    onResume();
                }
            }
            // fall-thru
        }

+3 −0
Original line number Diff line number Diff line
@@ -202,6 +202,9 @@ private:
    // still become true, when we pause internally due to buffering.
    bool mPausedByClient;

    // Pause state as requested by source (internally) due to buffering
    bool mPausedForBuffering;

    inline const sp<DecoderBase> &getDecoder(bool audio) {
        return audio ? mAudioDecoder : mVideoDecoder;
    }
+1 −2
Original line number Diff line number Diff line
@@ -1503,11 +1503,10 @@ void LiveSession::changeConfiguration(
            ALOGV("discarding fetcher-%d", fetcher->getFetcherID());
            fetcher->stopAsync();
        } else {
            float threshold = -1.0f; // always finish fetching by default
            float threshold = 0.0f; // default to pause after current block (47Kbytes)
            bool disconnect = false;
            if (timeUs >= 0ll) {
                // seeking, no need to finish fetching
                threshold = 0.0f;
                disconnect = true;
            } else if (delayRemoval) {
                // adapting, abort if remaining of current segment is over threshold
+10 −1
Original line number Diff line number Diff line
@@ -1424,11 +1424,17 @@ bool PlaylistFetcher::adjustSeqNumberWithAnchorTime(int64_t anchorTimeUs) {

    int64_t minDiffUs, maxDiffUs;
    if (mSeekMode == LiveSession::kSeekModeNextSample) {
        // if the previous fetcher paused in the middle of a segment, we
        // want to start at a segment that overlaps the last sample
        minDiffUs = -mPlaylist->getTargetDuration();
        maxDiffUs = 0ll;
    } else {
        // if the previous fetcher paused at the end of a segment, ideally
        // we want to start at the segment that's roughly aligned with its
        // next segment, but if the two variants are not well aligned we
        // adjust the diff to within (-T/2, T/2)
        minDiffUs = -mPlaylist->getTargetDuration() / 2;
        maxDiffUs = mPlaylist->getTargetDuration();
        maxDiffUs = mPlaylist->getTargetDuration() / 2;
    }

    int32_t oldSeqNumber = mSeqNumber;
@@ -1611,6 +1617,9 @@ status_t PlaylistFetcher::extractAndQueueAccessUnitsFromTs(const sp<ABuffer> &bu
                ALOGE("MPEG2 Transport streams do not contain subtitles.");
                return ERROR_MALFORMED;
            }
            if (stream == LiveSession::STREAMTYPE_METADATA) {
                continue;
            }
            ATSParser::SourceType type =LiveSession::getSourceTypeForStream(stream);
            sp<AnotherPacketSource> source =
                static_cast<AnotherPacketSource *>(