diff options
author | Chong Zhang <chz@google.com> | 2015-06-11 17:18:58 -0700 |
---|---|---|
committer | Chong Zhang <chz@google.com> | 2015-06-12 11:03:52 -0700 |
commit | 9da0ce44f228408d73a4dea0be972c785095dccc (patch) | |
tree | 0d439822ec091a1fd48d72a0ddfc757e6b465e66 /media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp | |
parent | 3a20d29ff09ca2568cb904415625cc44db37edb0 (diff) | |
download | frameworks_av-9da0ce44f228408d73a4dea0be972c785095dccc.zip frameworks_av-9da0ce44f228408d73a4dea0be972c785095dccc.tar.gz frameworks_av-9da0ce44f228408d73a4dea0be972c785095dccc.tar.bz2 |
stagefright: post audio EOS in NuPlayerRenderer if getPosition fails
bug: 20071480
Change-Id: I81f2a1fea0daa694a61be7f4a6d70d6847e9f183
Diffstat (limited to 'media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp')
-rw-r--r-- | media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp index fb2e767..7e55aac 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp @@ -771,6 +771,33 @@ size_t NuPlayer::Renderer::fillAudioBuffer(void *buffer, size_t size) { return sizeCopied; } +void NuPlayer::Renderer::drainAudioQueueUntilLastEOS() { + List<QueueEntry>::iterator it = mAudioQueue.begin(), itEOS = it; + bool foundEOS = false; + while (it != mAudioQueue.end()) { + int32_t eos; + QueueEntry *entry = &*it++; + if (entry->mBuffer == NULL + || (entry->mNotifyConsumed->findInt32("eos", &eos) && eos != 0)) { + itEOS = it; + foundEOS = true; + } + } + + if (foundEOS) { + // post all replies before EOS and drop the samples + for (it = mAudioQueue.begin(); it != itEOS; it++) { + if (it->mBuffer == NULL) { + // delay doesn't matter as we don't even have an AudioTrack + notifyEOS(true /* audio */, it->mFinalResult); + } else { + it->mNotifyConsumed->post(); + } + } + mAudioQueue.erase(mAudioQueue.begin(), itEOS); + } +} + bool NuPlayer::Renderer::onDrainAudioQueue() { // TODO: This call to getPosition checks if AudioTrack has been created // in AudioSink before draining audio. If AudioTrack doesn't exist, then @@ -784,6 +811,13 @@ bool NuPlayer::Renderer::onDrainAudioQueue() { // "vorbis_dsp_synthesis returned -135", along with RTSP. uint32_t numFramesPlayed; if (mAudioSink->getPosition(&numFramesPlayed) != OK) { + // When getPosition fails, renderer will not reschedule the draining + // unless new samples are queued. + // If we have pending EOS (or "eos" marker for discontinuities), we need + // to post these now as NuPlayerDecoder might be waiting for it. + drainAudioQueueUntilLastEOS(); + + ALOGW("onDrainAudioQueue(): audio sink is not ready"); return false; } |