nuplayer: clear pending audio access unit on flush.
Also add flag to avoid reading on flush.
Bug: 18540219
Change-Id: I2fc351c32c87db9a8c8c2aad12ee2bd56a0370ab
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 @@
mSource(source),
mRenderer(renderer),
mSkipRenderingUntilMediaTimeUs(-1ll),
+ mPaused(false),
mBufferGeneration(0),
mReachedEOS(true),
mPendingAudioErr(OK),
@@ -105,16 +106,16 @@
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<AMessage> msg = new AMessage();
err = fetchInputData(msg);
@@ -355,6 +356,8 @@
}
void NuPlayer::DecoderPassThrough::onResume(bool notifyComplete) {
+ mPaused = false;
+
onRequestInputBuffers();
if (notifyComplete) {
@@ -367,6 +370,9 @@
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 @@
}
if (notifyComplete) {
+ mPaused = true;
sp<AMessage> notify = mNotify->dup();
notify->setInt32("what", kWhatFlushCompleted);
notify->post();