diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2015-11-16 00:34:56 -0800 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2015-11-16 00:34:56 -0800 |
commit | 19232747b795fc5496364b48e34a62d453e31694 (patch) | |
tree | 10d5e00be042f6ec7cb9a9fc71f5262a4d9a734f /media/libmediaplayerservice/nuplayer/NuPlayer.cpp | |
parent | 6c6f283bfee003b32843c0d4cec19604b6875927 (diff) | |
parent | 767254cd47bbcaa5ad9e09a6f0bae4a703fbdf7e (diff) | |
download | frameworks_av-19232747b795fc5496364b48e34a62d453e31694.zip frameworks_av-19232747b795fc5496364b48e34a62d453e31694.tar.gz frameworks_av-19232747b795fc5496364b48e34a62d453e31694.tar.bz2 |
Merge "nuplayer: Perform proper shutdown sequence for offload teardown"
Diffstat (limited to 'media/libmediaplayerservice/nuplayer/NuPlayer.cpp')
-rw-r--r-- | media/libmediaplayerservice/nuplayer/NuPlayer.cpp | 51 |
1 files changed, 9 insertions, 42 deletions
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp index 1b31f19..ff771b9 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp @@ -1111,46 +1111,7 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) { int32_t reason; CHECK(msg->findInt32("reason", &reason)); ALOGV("Tear down audio with reason %d.", reason); - - if (ifDecodedPCMOffload()) { - tearDownPCMOffload(msg); - break; - } - - mAudioDecoder.clear(); - ++mAudioDecoderGeneration; - bool needsToCreateAudioDecoder = true; - if (mFlushingAudio == FLUSHING_DECODER) { - mFlushComplete[1 /* audio */][1 /* isDecoder */] = true; - mFlushingAudio = FLUSHED; - finishFlushIfPossible(); - } else if (mFlushingAudio == FLUSHING_DECODER_SHUTDOWN - || mFlushingAudio == SHUTTING_DOWN_DECODER) { - mFlushComplete[1 /* audio */][1 /* isDecoder */] = true; - mFlushingAudio = SHUT_DOWN; - finishFlushIfPossible(); - needsToCreateAudioDecoder = false; - } - if (mRenderer == NULL) { - break; - } - closeAudioSink(); - mRenderer->flush( - true /* audio */, false /* notifyComplete */); - if (mVideoDecoder != NULL) { - mRenderer->flush( - false /* audio */, false /* notifyComplete */); - } - - int64_t positionUs; - if (!msg->findInt64("positionUs", &positionUs)) { - positionUs = mPreviousSeekTimeUs; - } - performSeek(positionUs); - - if (reason == Renderer::kDueToError && needsToCreateAudioDecoder) { - instantiateDecoder(true /* audio */, &mAudioDecoder); - } + performTearDown(msg); } break; } @@ -2419,7 +2380,12 @@ void NuPlayer::Source::onMessageReceived(const sp<AMessage> & /* msg */) { TRESPASS(); } -void NuPlayer::tearDownPCMOffload(const sp<AMessage> &msg) { +// +// There is a flush from within the decoder's onFlush handling. +// Without it, it is still possible that a buffer can be queueued +// after NuPlayer issues a flush on the renderer's audio queue. +// +void NuPlayer::performTearDown(const sp<AMessage> &msg) { int32_t reason; CHECK(msg->findInt32("reason", &reason)); @@ -2443,13 +2409,14 @@ void NuPlayer::tearDownPCMOffload(const sp<AMessage> &msg) { mDeferredActions.push_back(new SeekAction(positionUs)); break; default: - ALOGW("tearDownPCMOffload while flushing audio in %d", mFlushingAudio); + ALOGW("performTearDown while flushing audio in %d", mFlushingAudio); break; } } if (mRenderer != NULL) { closeAudioSink(); + // see comment at beginning of function mRenderer->flush( true /* audio */, false /* notifyComplete */); if (mVideoDecoder != NULL) { |