From 9da0ce44f228408d73a4dea0be972c785095dccc Mon Sep 17 00:00:00 2001 From: Chong Zhang Date: Thu, 11 Jun 2015 17:18:58 -0700 Subject: stagefright: post audio EOS in NuPlayerRenderer if getPosition fails bug: 20071480 Change-Id: I81f2a1fea0daa694a61be7f4a6d70d6847e9f183 --- .../nuplayer/NuPlayerRenderer.cpp | 34 ++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp') 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::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; } -- cgit v1.1