diff options
author | Wei Jia <wjia@google.com> | 2014-08-19 22:53:35 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2014-08-19 22:53:25 +0000 |
commit | 3ef1e656086e6aed75b508715e59951f028841a1 (patch) | |
tree | 5a2b3e5c592f396e5878e5ca9365c704adfc8981 | |
parent | 2a1bcb8347ad4778a49bb340c3ed28ba27caa7d7 (diff) | |
parent | 28a8a9ff2a2bfd5edbdbbadde50c6d804335ffdc (diff) | |
download | frameworks_av-3ef1e656086e6aed75b508715e59951f028841a1.zip frameworks_av-3ef1e656086e6aed75b508715e59951f028841a1.tar.gz frameworks_av-3ef1e656086e6aed75b508715e59951f028841a1.tar.bz2 |
Merge "NuPlayerRenderer: allow flush() to be called multiple times." into lmp-dev
-rw-r--r-- | media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp | 68 |
1 files changed, 43 insertions, 25 deletions
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp index 3777f64..1213a18 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp @@ -93,10 +93,14 @@ void NuPlayer::Renderer::flush(bool audio) { { Mutex::Autolock autoLock(mFlushLock); if (audio) { - CHECK(!mFlushingAudio); + if (mFlushingAudio) { + return; + } mFlushingAudio = true; } else { - CHECK(!mFlushingVideo); + if (mFlushingVideo) { + return; + } mFlushingVideo = true; } } @@ -115,6 +119,14 @@ void NuPlayer::Renderer::signalTimeDiscontinuity() { mSyncQueues = false; } +void NuPlayer::Renderer::signalAudioSinkChanged() { + (new AMessage(kWhatAudioSinkChanged, id()))->post(); +} + +void NuPlayer::Renderer::signalDisableOffloadAudio() { + (new AMessage(kWhatDisableOffloadAudio, id()))->post(); +} + void NuPlayer::Renderer::pause() { (new AMessage(kWhatPause, id()))->post(); } @@ -251,14 +263,6 @@ void NuPlayer::Renderer::postDrainAudioQueue_l(int64_t delayUs) { msg->post(delayUs); } -void NuPlayer::Renderer::signalAudioSinkChanged() { - (new AMessage(kWhatAudioSinkChanged, id()))->post(); -} - -void NuPlayer::Renderer::signalDisableOffloadAudio() { - (new AMessage(kWhatDisableOffloadAudio, id()))->post(); -} - void NuPlayer::Renderer::prepareForMediaRenderingStart() { mAudioRenderingStartGeneration = mAudioQueueGeneration; mVideoRenderingStartGeneration = mVideoQueueGeneration; @@ -717,6 +721,15 @@ void NuPlayer::Renderer::onFlush(const sp<AMessage> &msg) { int32_t audio; CHECK(msg->findInt32("audio", &audio)); + { + Mutex::Autolock autoLock(mFlushLock); + if (audio) { + mFlushingAudio = false; + } else { + mFlushingVideo = false; + } + } + // If we're currently syncing the queues, i.e. dropping audio while // aligning the first audio/video buffer times and only one of the // two queues has data, we may starve that queue by not requesting @@ -735,17 +748,18 @@ void NuPlayer::Renderer::onFlush(const sp<AMessage> &msg) { { Mutex::Autolock autoLock(mLock); flushQueue(&mAudioQueue); - } - Mutex::Autolock autoLock(mFlushLock); - mFlushingAudio = false; + ++mAudioQueueGeneration; + prepareForMediaRenderingStart(); + + if (offloadingAudio()) { + mFirstAudioTimeUs = -1; + } + } mDrainAudioQueuePending = false; - ++mAudioQueueGeneration; - prepareForMediaRenderingStart(); if (offloadingAudio()) { - mFirstAudioTimeUs = -1; mAudioSink->pause(); mAudioSink->flush(); mAudioSink->start(); @@ -753,9 +767,6 @@ void NuPlayer::Renderer::onFlush(const sp<AMessage> &msg) { } else { flushQueue(&mVideoQueue); - Mutex::Autolock autoLock(mFlushLock); - mFlushingVideo = false; - mDrainVideoQueuePending = false; ++mVideoQueueGeneration; @@ -853,13 +864,15 @@ void NuPlayer::Renderer::notifyPosition() { void NuPlayer::Renderer::onPause() { CHECK(!mPaused); - mDrainAudioQueuePending = false; - ++mAudioQueueGeneration; + { + Mutex::Autolock autoLock(mLock); + ++mAudioQueueGeneration; + ++mVideoQueueGeneration; + prepareForMediaRenderingStart(); + } + mDrainAudioQueuePending = false; mDrainVideoQueuePending = false; - ++mVideoQueueGeneration; - - prepareForMediaRenderingStart(); if (mHasAudio) { mAudioSink->pause(); @@ -896,7 +909,12 @@ void NuPlayer::Renderer::onAudioOffloadTearDown() { uint32_t numFramesPlayed; CHECK_EQ(mAudioSink->getPosition(&numFramesPlayed), (status_t)OK); - int64_t currentPositionUs = mFirstAudioTimeUs + int64_t firstAudioTimeUs; + { + Mutex::Autolock autoLock(mLock); + firstAudioTimeUs = mFirstAudioTimeUs; + } + int64_t currentPositionUs = firstAudioTimeUs + (numFramesPlayed * mAudioSink->msecsPerFrame()) * 1000ll; mAudioSink->stop(); |