diff options
author | Wei Jia <wjia@google.com> | 2014-07-22 16:01:33 -0700 |
---|---|---|
committer | Wei Jia <wjia@google.com> | 2014-07-22 17:27:23 -0700 |
commit | 3a2956d148d81194e297408179e84a47a309ef48 (patch) | |
tree | 01af40a9fb8f1d5f0703ec8525f2a24583b8f8d7 | |
parent | ecc01ef05aea6b04aafc1b7d2d8f8519d0a8d928 (diff) | |
download | frameworks_av-3a2956d148d81194e297408179e84a47a309ef48.zip frameworks_av-3a2956d148d81194e297408179e84a47a309ef48.tar.gz frameworks_av-3a2956d148d81194e297408179e84a47a309ef48.tar.bz2 |
Fall back to s/w decoding when audio offloading fails.
Change-Id: Icde3d65c964b2a13fb1c6636adcce52ae048a3fb
-rw-r--r-- | media/libmediaplayerservice/nuplayer/NuPlayer.cpp | 17 | ||||
-rw-r--r-- | media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp | 29 | ||||
-rw-r--r-- | media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h | 3 |
3 files changed, 48 insertions, 1 deletions
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp index 6ccd27a..fa6b1e5 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp @@ -754,6 +754,7 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) { offloadInfo.has_video = (mVideoDecoder != NULL); offloadInfo.is_streaming = true; + ALOGV("try to open AudioSink in offload mode"); err = mAudioSink->open( sampleRate, numChannels, @@ -793,6 +794,7 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) { if (!mOffloadAudio) { flags &= ~AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD; + ALOGV("open AudioSink in NON-offload mode"); CHECK_EQ(mAudioSink->open( sampleRate, numChannels, @@ -940,6 +942,21 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) { } else if (what == Renderer::kWhatMediaRenderingStart) { ALOGV("media rendering started"); notifyListener(MEDIA_STARTED, 0, 0); + } else if (what == Renderer::kWhatAudioOffloadTearDown) { + ALOGV("Tear down audio offload, fall back to s/w path"); + int64_t positionUs; + CHECK(msg->findInt64("positionUs", &positionUs)); + mAudioSink->close(); + mAudioDecoder.clear(); + mRenderer->flush(true /* audio */); + if (mVideoDecoder != NULL) { + mRenderer->flush(false /* audio */); + } + mRenderer->signalDisableOffloadAudio(); + mOffloadAudio = false; + + performSeek(positionUs); + instantiateDecoder(true /* audio */, &mAudioDecoder); } break; } diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp index 8592ec2..3640038 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp @@ -223,6 +223,12 @@ void NuPlayer::Renderer::onMessageReceived(const sp<AMessage> &msg) { break; } + case kWhatAudioOffloadTearDown: + { + onAudioOffloadTearDown(); + break; + } + default: TRESPASS(); break; @@ -294,7 +300,7 @@ size_t NuPlayer::Renderer::AudioSinkCallback( case MediaPlayerBase::AudioSink::CB_EVENT_TEAR_DOWN: { - // TODO: send this to player. + me->notifyAudioOffloadTearDown(); break; } } @@ -582,6 +588,10 @@ void NuPlayer::Renderer::notifyEOS(bool audio, status_t finalResult) { notify->post(); } +void NuPlayer::Renderer::notifyAudioOffloadTearDown() { + (new AMessage(kWhatAudioOffloadTearDown, id()))->post(); +} + void NuPlayer::Renderer::onQueueBuffer(const sp<AMessage> &msg) { int32_t audio; CHECK(msg->findInt32("audio", &audio)); @@ -814,6 +824,7 @@ void NuPlayer::Renderer::onAudioSinkChanged() { void NuPlayer::Renderer::onDisableOffloadAudio() { Mutex::Autolock autoLock(mLock); mFlags &= ~FLAG_OFFLOAD_AUDIO; + ++mAudioQueueGeneration; } void NuPlayer::Renderer::notifyPosition() { @@ -880,5 +891,21 @@ void NuPlayer::Renderer::onResume() { } } +void NuPlayer::Renderer::onAudioOffloadTearDown() { + uint32_t numFramesPlayed; + CHECK_EQ(mAudioSink->getPosition(&numFramesPlayed), (status_t)OK); + + int64_t currentPositionUs = mFirstAudioTimeUs + + (numFramesPlayed * mAudioSink->msecsPerFrame()) * 1000ll; + + mAudioSink->stop(); + mAudioSink->flush(); + + sp<AMessage> notify = mNotify->dup(); + notify->setInt32("what", kWhatAudioOffloadTearDown); + notify->setInt64("positionUs", currentPositionUs); + notify->post(); +} + } // namespace android diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h index 6e86a8f..1cba1a0 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h +++ b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h @@ -62,6 +62,7 @@ struct NuPlayer::Renderer : public AHandler { kWhatPosition = 'posi', kWhatVideoRenderingStart = 'vdrd', kWhatMediaRenderingStart = 'mdrd', + kWhatAudioOffloadTearDown = 'aOTD', }; protected: @@ -143,12 +144,14 @@ private: void onDisableOffloadAudio(); void onPause(); void onResume(); + void onAudioOffloadTearDown(); void notifyEOS(bool audio, status_t finalResult); void notifyFlushComplete(bool audio); void notifyPosition(); void notifyVideoLateBy(int64_t lateByUs); void notifyVideoRenderingStart(); + void notifyAudioOffloadTearDown(); void flushQueue(List<QueueEntry> *queue); bool dropBufferWhileFlushing(bool audio, const sp<AMessage> &msg); |