Loading media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp +43 −25 Original line number Diff line number Diff line Loading @@ -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; } } Loading @@ -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(); } Loading Loading @@ -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; Loading Loading @@ -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 Loading @@ -735,17 +748,18 @@ void NuPlayer::Renderer::onFlush(const sp<AMessage> &msg) { { Mutex::Autolock autoLock(mLock); flushQueue(&mAudioQueue); } Mutex::Autolock autoLock(mFlushLock); mFlushingAudio = false; mDrainAudioQueuePending = false; ++mAudioQueueGeneration; prepareForMediaRenderingStart(); if (offloadingAudio()) { mFirstAudioTimeUs = -1; } } mDrainAudioQueuePending = false; if (offloadingAudio()) { mAudioSink->pause(); mAudioSink->flush(); mAudioSink->start(); Loading @@ -753,9 +767,6 @@ void NuPlayer::Renderer::onFlush(const sp<AMessage> &msg) { } else { flushQueue(&mVideoQueue); Mutex::Autolock autoLock(mFlushLock); mFlushingVideo = false; mDrainVideoQueuePending = false; ++mVideoQueueGeneration; Loading Loading @@ -853,13 +864,15 @@ void NuPlayer::Renderer::notifyPosition() { void NuPlayer::Renderer::onPause() { CHECK(!mPaused); mDrainAudioQueuePending = false; { Mutex::Autolock autoLock(mLock); ++mAudioQueueGeneration; mDrainVideoQueuePending = false; ++mVideoQueueGeneration; prepareForMediaRenderingStart(); } mDrainAudioQueuePending = false; mDrainVideoQueuePending = false; if (mHasAudio) { mAudioSink->pause(); Loading Loading @@ -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(); Loading Loading
media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp +43 −25 Original line number Diff line number Diff line Loading @@ -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; } } Loading @@ -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(); } Loading Loading @@ -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; Loading Loading @@ -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 Loading @@ -735,17 +748,18 @@ void NuPlayer::Renderer::onFlush(const sp<AMessage> &msg) { { Mutex::Autolock autoLock(mLock); flushQueue(&mAudioQueue); } Mutex::Autolock autoLock(mFlushLock); mFlushingAudio = false; mDrainAudioQueuePending = false; ++mAudioQueueGeneration; prepareForMediaRenderingStart(); if (offloadingAudio()) { mFirstAudioTimeUs = -1; } } mDrainAudioQueuePending = false; if (offloadingAudio()) { mAudioSink->pause(); mAudioSink->flush(); mAudioSink->start(); Loading @@ -753,9 +767,6 @@ void NuPlayer::Renderer::onFlush(const sp<AMessage> &msg) { } else { flushQueue(&mVideoQueue); Mutex::Autolock autoLock(mFlushLock); mFlushingVideo = false; mDrainVideoQueuePending = false; ++mVideoQueueGeneration; Loading Loading @@ -853,13 +864,15 @@ void NuPlayer::Renderer::notifyPosition() { void NuPlayer::Renderer::onPause() { CHECK(!mPaused); mDrainAudioQueuePending = false; { Mutex::Autolock autoLock(mLock); ++mAudioQueueGeneration; mDrainVideoQueuePending = false; ++mVideoQueueGeneration; prepareForMediaRenderingStart(); } mDrainAudioQueuePending = false; mDrainVideoQueuePending = false; if (mHasAudio) { mAudioSink->pause(); Loading Loading @@ -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(); Loading