summaryrefslogtreecommitdiffstats
path: root/media/libmediaplayerservice
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2015-11-16 00:34:56 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2015-11-16 00:34:56 -0800
commit19232747b795fc5496364b48e34a62d453e31694 (patch)
tree10d5e00be042f6ec7cb9a9fc71f5262a4d9a734f /media/libmediaplayerservice
parent6c6f283bfee003b32843c0d4cec19604b6875927 (diff)
parent767254cd47bbcaa5ad9e09a6f0bae4a703fbdf7e (diff)
downloadframeworks_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')
-rw-r--r--media/libmediaplayerservice/nuplayer/NuPlayer.cpp51
-rw-r--r--media/libmediaplayerservice/nuplayer/NuPlayer.h2
2 files changed, 10 insertions, 43 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) {
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.h b/media/libmediaplayerservice/nuplayer/NuPlayer.h
index 32a3efe..b934e4e 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayer.h
+++ b/media/libmediaplayerservice/nuplayer/NuPlayer.h
@@ -281,7 +281,7 @@ protected:
void writeTrackInfo(Parcel* reply, const sp<AMessage> format) const;
- void tearDownPCMOffload(const sp<AMessage> &msg);
+ void performTearDown(const sp<AMessage> &msg);
DISALLOW_EVIL_CONSTRUCTORS(NuPlayer);
};