From 2245fc625910e47d1ba3c339e205c21ab58a47ad Mon Sep 17 00:00:00 2001 From: Wei Jia Date: Thu, 2 Oct 2014 15:12:25 -0700 Subject: [PATCH] NuPlayerDecoder: postpone input message processing when it's not dequeued. Bug: 17622642 Change-Id: I67608121bf70d6acb152e4aa64892b11bf167e8c --- .../nuplayer/NuPlayerDecoder.cpp | 35 +++++++++++++++++----- .../nuplayer/NuPlayerDecoder.h | 4 ++- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp index 1a066b70fc..037b5d277c 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp @@ -185,6 +185,8 @@ void NuPlayer::Decoder::releaseAndResetMediaBuffers() { for (size_t i = 0; i < mInputBufferIsDequeued.size(); i++) { mInputBufferIsDequeued.editItemAt(i) = false; } + + mPendingInputMessages.clear(); } void NuPlayer::Decoder::requestCodecNotification() { @@ -270,7 +272,19 @@ bool NuPlayer::Decoder::handleAnInputBuffer() { ALOGI("[%s] resubmitting CSD", mComponentName.c_str()); reply->setBuffer("buffer", buffer); mCSDsToSubmit.removeAt(0); - reply->post(); + CHECK(onInputBufferFilled(reply)); + return true; + } + + while (!mPendingInputMessages.empty()) { + sp msg = *mPendingInputMessages.begin(); + if (!onInputBufferFilled(msg)) { + break; + } + mPendingInputMessages.erase(mPendingInputMessages.begin()); + } + + if (!mInputBufferIsDequeued.editItemAt(bufferIx)) { return true; } @@ -282,7 +296,7 @@ bool NuPlayer::Decoder::handleAnInputBuffer() { return true; } -void android::NuPlayer::Decoder::onInputBufferFilled(const sp &msg) { +bool android::NuPlayer::Decoder::onInputBufferFilled(const sp &msg) { size_t bufferIx; CHECK(msg->findSize("buffer-ix", &bufferIx)); CHECK_LT(bufferIx, mInputBuffers.size()); @@ -302,9 +316,12 @@ void android::NuPlayer::Decoder::onInputBufferFilled(const sp &msg) { const sp &buf = mInputBuffers[ix]; if (buf->data() == mediaBuffer->data()) { // all input buffers are dequeued on start, hence the check - CHECK(mInputBufferIsDequeued[ix]); - ALOGV("[%s] received MediaBuffer for #%zu instead of #%zu", - mComponentName.c_str(), ix, bufferIx); + if (!mInputBufferIsDequeued[ix]) { + ALOGV("[%s] received MediaBuffer for #%zu instead of #%zu", + mComponentName.c_str(), ix, bufferIx); + mediaBuffer->release(); + return false; + } // TRICKY: need buffer for the metadata, so instead, set // codecBuffer to the same (though incorrect) buffer to @@ -329,7 +346,7 @@ void android::NuPlayer::Decoder::onInputBufferFilled(const sp &msg) { if (streamErr == OK) { /* buffers are returned to hold on to */ - return; + return true; } // attempt to queue EOS @@ -394,6 +411,7 @@ void android::NuPlayer::Decoder::onInputBufferFilled(const sp &msg) { } } } + return true; } bool NuPlayer::Decoder::handleAnOutputBuffer() { @@ -616,7 +634,10 @@ void NuPlayer::Decoder::onMessageReceived(const sp &msg) { case kWhatInputBufferFilled: { if (!isStaleReply(msg)) { - onInputBufferFilled(msg); + if (!mPendingInputMessages.empty() + || !onInputBufferFilled(msg)) { + mPendingInputMessages.push_back(msg); + } } break; diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.h b/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.h index cc1bdff7db..dba3eeeb1b 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.h +++ b/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.h @@ -80,6 +80,8 @@ private: sp mCodecLooper; sp mDecoderLooper; + List > mPendingInputMessages; + Vector > mInputBuffers; Vector > mOutputBuffers; Vector > mCSDsForCurrentFormat; @@ -98,7 +100,7 @@ private: void onConfigure(const sp &format); void onFlush(); void onResume(); - void onInputBufferFilled(const sp &msg); + bool onInputBufferFilled(const sp &msg); void onRenderBuffer(const sp &msg); void onShutdown(); -- 2.11.0