From f1828910d48bbd22e1392e6ab0ce31298d1f115c Mon Sep 17 00:00:00 2001 From: Ronghua Wu Date: Mon, 1 Dec 2014 15:33:36 -0800 Subject: nuplayer: clear pending audio access unit on flush. Also add flag to avoid reading on flush. Bug: 18540219 Change-Id: I2fc351c32c87db9a8c8c2aad12ee2bd56a0370ab --- .../nuplayer/NuPlayerDecoderPassThrough.cpp | 17 ++++++++++++----- .../nuplayer/NuPlayerDecoderPassThrough.h | 3 ++- 2 files changed, 14 insertions(+), 6 deletions(-) (limited to 'media') diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDecoderPassThrough.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerDecoderPassThrough.cpp index 8112e9f..79b7a3c 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerDecoderPassThrough.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayerDecoderPassThrough.cpp @@ -47,6 +47,7 @@ NuPlayer::DecoderPassThrough::DecoderPassThrough( mSource(source), mRenderer(renderer), mSkipRenderingUntilMediaTimeUs(-1ll), + mPaused(false), mBufferGeneration(0), mReachedEOS(true), mPendingAudioErr(OK), @@ -105,16 +106,16 @@ bool NuPlayer::DecoderPassThrough::isStaleReply(const sp &msg) { return generation != mBufferGeneration; } -bool NuPlayer::DecoderPassThrough::isCacheFullOrEOS() const { - ALOGV("[%s] mCachedBytes = %zu, mReachedEOS = %d", - mComponentName.c_str(), mCachedBytes, mReachedEOS); +bool NuPlayer::DecoderPassThrough::isDoneFetching() const { + ALOGV("[%s] mCachedBytes = %zu, mReachedEOS = %d mPaused = %d", + mComponentName.c_str(), mCachedBytes, mReachedEOS, mPaused); - return mCachedBytes >= kMaxCachedBytes || mReachedEOS; + return mCachedBytes >= kMaxCachedBytes || mReachedEOS || mPaused; } void NuPlayer::DecoderPassThrough::doRequestBuffers() { status_t err = OK; - while (!isCacheFullOrEOS()) { + while (!isDoneFetching()) { sp msg = new AMessage(); err = fetchInputData(msg); @@ -355,6 +356,8 @@ void NuPlayer::DecoderPassThrough::onBufferConsumed(int32_t size) { } void NuPlayer::DecoderPassThrough::onResume(bool notifyComplete) { + mPaused = false; + onRequestInputBuffers(); if (notifyComplete) { @@ -367,6 +370,9 @@ void NuPlayer::DecoderPassThrough::onResume(bool notifyComplete) { void NuPlayer::DecoderPassThrough::onFlush(bool notifyComplete) { ++mBufferGeneration; mSkipRenderingUntilMediaTimeUs = -1; + mPendingAudioAccessUnit.clear(); + mPendingAudioErr = OK; + mAggregateBuffer.clear(); if (mRenderer != NULL) { mRenderer->flush(true /* audio */, notifyComplete); @@ -374,6 +380,7 @@ void NuPlayer::DecoderPassThrough::onFlush(bool notifyComplete) { } if (notifyComplete) { + mPaused = true; sp notify = mNotify->dup(); notify->setInt32("what", kWhatFlushCompleted); notify->post(); diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDecoderPassThrough.h b/media/libmediaplayerservice/nuplayer/NuPlayerDecoderPassThrough.h index d761b07..37b28c8 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerDecoderPassThrough.h +++ b/media/libmediaplayerservice/nuplayer/NuPlayerDecoderPassThrough.h @@ -56,6 +56,7 @@ private: sp mSource; sp mRenderer; int64_t mSkipRenderingUntilMediaTimeUs; + bool mPaused; int32_t mBufferGeneration; bool mReachedEOS; @@ -73,7 +74,7 @@ private: AString mComponentName; bool isStaleReply(const sp &msg); - bool isCacheFullOrEOS() const; + bool isDoneFetching() const; status_t dequeueAccessUnit(sp *accessUnit); sp aggregateBuffer(const sp &accessUnit); -- cgit v1.1