diff options
author | Wei Jia <wjia@google.com> | 2015-07-14 18:15:28 -0700 |
---|---|---|
committer | Wei Jia <wjia@google.com> | 2015-07-15 12:21:28 -0700 |
commit | da4252f86b1b730827053f015acec43b9c61fd37 (patch) | |
tree | b477bed3c40d49a1d1ebc9c3fabc6ecf92fff26c /media/libmediaplayerservice | |
parent | 7f4e78fedf1dbcd175a52b17d46a658218ed7453 (diff) | |
download | frameworks_av-da4252f86b1b730827053f015acec43b9c61fd37.zip frameworks_av-da4252f86b1b730827053f015acec43b9c61fd37.tar.gz frameworks_av-da4252f86b1b730827053f015acec43b9c61fd37.tar.bz2 |
NuPlayer: fix handling of teardown event during flushing or shutting down.
Bug: 22481669
Change-Id: I9114c16c081fd7907508e9c776607d653ae18612
Diffstat (limited to 'media/libmediaplayerservice')
-rw-r--r-- | media/libmediaplayerservice/nuplayer/NuPlayer.cpp | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp index 3e0ee08..2fdc196 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp @@ -1071,6 +1071,11 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) { CHECK(msg->findInt32("audio", &audio)); ALOGV("renderer %s flush completed.", audio ? "audio" : "video"); + if (audio && (mFlushingAudio == NONE || mFlushingAudio == FLUSHED + || mFlushingAudio == SHUT_DOWN)) { + // Flush has been handled by tear down. + break; + } handleFlushComplete(audio, false /* isDecoder */); finishFlushIfPossible(); } else if (what == Renderer::kWhatVideoRenderingStart) { @@ -1079,14 +1084,27 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) { ALOGV("media rendering started"); notifyListener(MEDIA_STARTED, 0, 0); } else if (what == Renderer::kWhatAudioTearDown) { - int64_t positionUs; - CHECK(msg->findInt64("positionUs", &positionUs)); int32_t reason; CHECK(msg->findInt32("reason", &reason)); ALOGV("Tear down audio with reason %d.", reason); - closeAudioSink(); 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) { @@ -1094,9 +1112,11 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) { false /* audio */, false /* notifyComplete */); } + int64_t positionUs; + CHECK(msg->findInt64("positionUs", &positionUs)); performSeek(positionUs); - if (reason == Renderer::kDueToError) { + if (reason == Renderer::kDueToError && needsToCreateAudioDecoder) { instantiateDecoder(true /* audio */, &mAudioDecoder); } } |