From 8a048338d9291b2db1b3a325fff58cb1aa69f04d Mon Sep 17 00:00:00 2001 From: Chong Zhang Date: Wed, 6 May 2015 15:16:28 -0700 Subject: 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 --- media/libmediaplayerservice/nuplayer/NuPlayer.cpp | 20 +++++++++++++++----- media/libmediaplayerservice/nuplayer/NuPlayer.h | 3 +++ media/libstagefright/httplive/LiveSession.cpp | 3 +-- media/libstagefright/httplive/PlaylistFetcher.cpp | 11 ++++++++++- 4 files changed, 29 insertions(+), 8 deletions(-) diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp index 9963353..63b12a9 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp @@ -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 &msg) { { ALOGV("kWhatStart"); if (mStarted) { - onResume(); + // do not resume yet if the source is still buffering + if (!mPausedForBuffering) { + onResume(); + } } else { onStart(); } @@ -1977,9 +1981,10 @@ void NuPlayer::onSourceNotify(const sp &msg) { case Source::kWhatPauseOnBufferingStart: { // ignore if not playing - if (mStarted && !mPausedByClient) { + if (mStarted) { ALOGI("buffer low, pausing..."); + mPausedForBuffering = true; onPause(); } // fall-thru @@ -1994,10 +1999,15 @@ void NuPlayer::onSourceNotify(const sp &msg) { case Source::kWhatResumeOnBufferingEnd: { // ignore if not playing - if (mStarted && !mPausedByClient) { + if (mStarted) { ALOGI("buffer ready, resuming..."); - onResume(); + mPausedForBuffering = false; + + // do not resume yet if client didn't unpause + if (!mPausedByClient) { + onResume(); + } } // fall-thru } diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.h b/media/libmediaplayerservice/nuplayer/NuPlayer.h index fcf6841..cc7e137 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayer.h +++ b/media/libmediaplayerservice/nuplayer/NuPlayer.h @@ -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 &getDecoder(bool audio) { return audio ? mAudioDecoder : mVideoDecoder; } diff --git a/media/libstagefright/httplive/LiveSession.cpp b/media/libstagefright/httplive/LiveSession.cpp index d8c38e7..64a8532 100644 --- a/media/libstagefright/httplive/LiveSession.cpp +++ b/media/libstagefright/httplive/LiveSession.cpp @@ -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 diff --git a/media/libstagefright/httplive/PlaylistFetcher.cpp b/media/libstagefright/httplive/PlaylistFetcher.cpp index 53087b6..5a0deec 100644 --- a/media/libstagefright/httplive/PlaylistFetcher.cpp +++ b/media/libstagefright/httplive/PlaylistFetcher.cpp @@ -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 &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 source = static_cast( -- cgit v1.1