summaryrefslogtreecommitdiffstats
path: root/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
diff options
context:
space:
mode:
authorChong Zhang <chz@google.com>2015-06-11 17:18:58 -0700
committerChong Zhang <chz@google.com>2015-06-12 11:03:52 -0700
commit9da0ce44f228408d73a4dea0be972c785095dccc (patch)
tree0d439822ec091a1fd48d72a0ddfc757e6b465e66 /media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
parent3a20d29ff09ca2568cb904415625cc44db37edb0 (diff)
downloadframeworks_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.cpp34
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;
}