From 474d7c778b63aa33dcf25a92e23a52c1c47f0ac1 Mon Sep 17 00:00:00 2001 From: Wei Jia Date: Thu, 4 Dec 2014 15:12:13 -0800 Subject: NuPlayerRenderer: Update mAnchorMaxMediaUs when anchor time is changed to fix pause-seek-getCurrentPosition. NuPlayerDecoder: Notify resume is done when EOS is reached. GenericSource: add code to signal pre-roll for seek so that it will seek to the requested position, not only I-frame. This code is disabled temporarily till we have a full solution to handle both single seek and continous seek gracefully. Bug: 18625723 Change-Id: I99a54d4d549e0d805e3abcc227fbf96c16405af0 --- media/libmediaplayerservice/nuplayer/GenericSource.cpp | 14 +++++++++++++- media/libmediaplayerservice/nuplayer/GenericSource.h | 1 + media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp | 1 + media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp | 1 + 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/media/libmediaplayerservice/nuplayer/GenericSource.cpp b/media/libmediaplayerservice/nuplayer/GenericSource.cpp index e7a26b6..67e7584 100644 --- a/media/libmediaplayerservice/nuplayer/GenericSource.cpp +++ b/media/libmediaplayerservice/nuplayer/GenericSource.cpp @@ -1179,6 +1179,7 @@ status_t NuPlayer::GenericSource::doSeek(int64_t seekTimeUs) { sp NuPlayer::GenericSource::mediaBufferToABuffer( MediaBuffer* mb, media_track_type trackType, + int64_t /* seekTimeUs */, int64_t *actualTimeUs) { bool audio = trackType == MEDIA_TRACK_TYPE_AUDIO; size_t outLength = mb->range_length(); @@ -1216,6 +1217,16 @@ sp 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) { + sp extra = new AMessage; + extra->setInt64("resume-at-mediaTimeUs", seekTimeUs); + meta->setMessage("extra", extra); + } +#endif + if (trackType == MEDIA_TRACK_TYPE_TIMEDTEXT) { const char *mime; CHECK(mTimedTextTrack.mSource != NULL @@ -1348,7 +1359,8 @@ void NuPlayer::GenericSource::readBuffer( track->mPackets->queueDiscontinuity( type, NULL, true /* discard */); } - sp buffer = mediaBufferToABuffer(mbuf, trackType, actualTimeUs); + sp buffer = mediaBufferToABuffer( + mbuf, trackType, seekTimeUs, actualTimeUs); track->mPackets->queueAccessUnit(buffer); formatChange = false; seeking = false; diff --git a/media/libmediaplayerservice/nuplayer/GenericSource.h b/media/libmediaplayerservice/nuplayer/GenericSource.h index f2528a9..f5ff47c 100644 --- a/media/libmediaplayerservice/nuplayer/GenericSource.h +++ b/media/libmediaplayerservice/nuplayer/GenericSource.h @@ -182,6 +182,7 @@ private: sp mediaBufferToABuffer( MediaBuffer *mbuf, media_track_type trackType, + int64_t seekTimeUs, int64_t *actualTimeUs = NULL); void postReadBuffer(media_track_type trackType); diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp index 6ad28b5..2abd9d6 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp @@ -476,6 +476,7 @@ bool NuPlayer::Decoder::handleAnOutputBuffer() { buffer->meta()->setInt64("timeUs", timeUs); if (flags & MediaCodec::BUFFER_FLAG_EOS) { buffer->meta()->setInt32("eos", true); + notifyResumeCompleteIfNecessary(); } // we do not expect CODECCONFIG or SYNCFRAME for decoder diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp index a1e1aec..21b74ee 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp @@ -771,6 +771,7 @@ void NuPlayer::Renderer::postDrainVideoQueue() { if (mAnchorTimeMediaUs < 0) { setAnchorTime(mediaTimeUs, nowUs); + mAnchorMaxMediaUs = mediaTimeUs; realTimeUs = nowUs; } else { realTimeUs = getRealTimeUs(mediaTimeUs, nowUs); -- cgit v1.1