summaryrefslogtreecommitdiffstats
path: root/media/libmediaplayerservice
diff options
context:
space:
mode:
authorWei Jia <wjia@google.com>2015-07-14 18:15:28 -0700
committerWei Jia <wjia@google.com>2015-07-15 12:21:28 -0700
commitda4252f86b1b730827053f015acec43b9c61fd37 (patch)
treeb477bed3c40d49a1d1ebc9c3fabc6ecf92fff26c /media/libmediaplayerservice
parent7f4e78fedf1dbcd175a52b17d46a658218ed7453 (diff)
downloadframeworks_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.cpp28
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);
}
}