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

Commit e5e9a0df authored by Chong Zhang's avatar Chong Zhang Committed by Android (Google) Code Review
Browse files

Merge "nuplayer: fixes for subtitle pause/resume" into mnc-dev

parents f52b2284 8a048338
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();
}

@@ -683,7 +684,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();
            }
@@ -2007,9 +2011,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
@@ -2024,11 +2029,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
@@ -203,6 +203,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 *>(