summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWei Jia <wjia@google.com>2014-08-19 22:53:35 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2014-08-19 22:53:25 +0000
commit3ef1e656086e6aed75b508715e59951f028841a1 (patch)
tree5a2b3e5c592f396e5878e5ca9365c704adfc8981
parent2a1bcb8347ad4778a49bb340c3ed28ba27caa7d7 (diff)
parent28a8a9ff2a2bfd5edbdbbadde50c6d804335ffdc (diff)
downloadframeworks_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.cpp68
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();