NuPlayerRenderer.cpp revision 3831a066bcf1019864a94d2bc7b4c9241efc5c22
1f933441648ef6a71dee783d733aac17b9508b452Andreas Huber/* 2f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Copyright (C) 2010 The Android Open Source Project 3f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * 4f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * you may not use this file except in compliance with the License. 6f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * You may obtain a copy of the License at 7f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * 8f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * 10f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Unless required by applicable law or agreed to in writing, software 11f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * See the License for the specific language governing permissions and 14f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * limitations under the License. 15f933441648ef6a71dee783d733aac17b9508b452Andreas Huber */ 16f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 17f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//#define LOG_NDEBUG 0 18f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#define LOG_TAG "NuPlayerRenderer" 19f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <utils/Log.h> 20f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 21f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayerRenderer.h" 22f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 23f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ABuffer.h> 24f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ADebug.h> 25f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 26f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android { 27f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 28f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::Renderer::Renderer( 29f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<MediaPlayerBase::AudioSink> &sink, 30f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<AMessage> ¬ify) 31f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : mAudioSink(sink), 32f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNotify(notify), 33f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNumFramesWritten(0), 34f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDrainAudioQueuePending(false), 35f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDrainVideoQueuePending(false), 36f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioQueueGeneration(0), 37f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mVideoQueueGeneration(0), 38f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAnchorTimeMediaUs(-1), 39f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAnchorTimeRealUs(-1), 40f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingAudio(false), 41f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingVideo(false), 423831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mHasAudio(mAudioSink != NULL), 433831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mHasVideo(true), 443831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mSyncQueues(mHasAudio && mHasVideo) { 45f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 46f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 47f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::Renderer::~Renderer() { 48f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 49f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 50f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::Renderer::queueBuffer( 51f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool audio, 52f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<ABuffer> &buffer, 53f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<AMessage> ¬ifyConsumed) { 54f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = new AMessage(kWhatQueueBuffer, id()); 55f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("audio", static_cast<int32_t>(audio)); 56f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setObject("buffer", buffer); 57f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setMessage("notifyConsumed", notifyConsumed); 58f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 60f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 61f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::Renderer::queueEOS(bool audio, status_t finalResult) { 62f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_NE(finalResult, (status_t)OK); 63f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 64f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = new AMessage(kWhatQueueEOS, id()); 65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("audio", static_cast<int32_t>(audio)); 66f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("finalResult", finalResult); 67f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 68f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 69f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 70f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::Renderer::flush(bool audio) { 71f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 72f933441648ef6a71dee783d733aac17b9508b452Andreas Huber Mutex::Autolock autoLock(mFlushLock); 73f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (audio) { 74f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(!mFlushingAudio); 75f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingAudio = true; 76f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 77f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(!mFlushingVideo); 78f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingVideo = true; 79f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 80f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 81f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 82f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = new AMessage(kWhatFlush, id()); 83f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("audio", static_cast<int32_t>(audio)); 84f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 85f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 86f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 87f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::Renderer::signalTimeDiscontinuity() { 88f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mAudioQueue.empty()); 89f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mVideoQueue.empty()); 90f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAnchorTimeMediaUs = -1; 91f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAnchorTimeRealUs = -1; 923831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mSyncQueues = mHasAudio && mHasVideo; 93f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 94f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 95f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::Renderer::onMessageReceived(const sp<AMessage> &msg) { 96f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 97f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatDrainAudioQueue: 98f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 99f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t generation; 100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("generation", &generation)); 101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (generation != mAudioQueueGeneration) { 102f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 103f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 104f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDrainAudioQueuePending = false; 106f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber onDrainAudioQueue(); 108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber postDrainAudioQueue(); 110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatDrainVideoQueue: 114f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t generation; 116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("generation", &generation)); 117f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (generation != mVideoQueueGeneration) { 118f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 119f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 120f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDrainVideoQueuePending = false; 122f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 123f933441648ef6a71dee783d733aac17b9508b452Andreas Huber onDrainVideoQueue(); 124f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 125f933441648ef6a71dee783d733aac17b9508b452Andreas Huber postDrainVideoQueue(); 126f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 127f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 128f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 129f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatQueueBuffer: 130f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 131f933441648ef6a71dee783d733aac17b9508b452Andreas Huber onQueueBuffer(msg); 132f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 133f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 134f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 135f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatQueueEOS: 136f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 137f933441648ef6a71dee783d733aac17b9508b452Andreas Huber onQueueEOS(msg); 138f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 139f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 140f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 141f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 142f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 143f933441648ef6a71dee783d733aac17b9508b452Andreas Huber onFlush(msg); 144f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 145f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 146f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1473831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber case kWhatAudioSinkChanged: 1483831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber { 1493831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber onAudioSinkChanged(); 1503831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber break; 1513831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 1523831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 153f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 155f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 156f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 157f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 158f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 159f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::Renderer::postDrainAudioQueue() { 160f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mDrainAudioQueuePending || mSyncQueues) { 161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 162f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 164f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mAudioQueue.empty()) { 165f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 167f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 168f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDrainAudioQueuePending = true; 169f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = new AMessage(kWhatDrainAudioQueue, id()); 170f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("generation", mAudioQueueGeneration); 171f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(10000); 172f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 173f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1743831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Hubervoid NuPlayer::Renderer::signalAudioSinkChanged() { 1753831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber (new AMessage(kWhatAudioSinkChanged, id()))->post(); 1763831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber} 1773831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 178f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::Renderer::onDrainAudioQueue() { 179f933441648ef6a71dee783d733aac17b9508b452Andreas Huber uint32_t numFramesPlayed; 180f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mAudioSink->getPosition(&numFramesPlayed), (status_t)OK); 181f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ssize_t numFramesAvailableToWrite = 183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioSink->frameCount() - (mNumFramesWritten - numFramesPlayed); 184f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_GE(numFramesAvailableToWrite, 0); 186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t numBytesAvailableToWrite = 188f933441648ef6a71dee783d733aac17b9508b452Andreas Huber numFramesAvailableToWrite * mAudioSink->frameSize(); 189f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 190f933441648ef6a71dee783d733aac17b9508b452Andreas Huber while (numBytesAvailableToWrite > 0) { 191f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mAudioQueue.empty()) { 192f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 193f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber QueueEntry *entry = &*mAudioQueue.begin(); 196f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 197f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (entry->mBuffer == NULL) { 198f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // EOS 199f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 200f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notifyEOS(true /* audio */); 201f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 202f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioQueue.erase(mAudioQueue.begin()); 203f933441648ef6a71dee783d733aac17b9508b452Andreas Huber entry = NULL; 204f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 205f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 206f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 207f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (entry->mOffset == 0) { 208f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t mediaTimeUs; 209f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(entry->mBuffer->meta()->findInt64("timeUs", &mediaTimeUs)); 210f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 211f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGV("rendering audio at media time %.2f secs", mediaTimeUs / 1E6); 212f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 213f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAnchorTimeMediaUs = mediaTimeUs; 214f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 215f933441648ef6a71dee783d733aac17b9508b452Andreas Huber uint32_t numFramesPlayed; 216f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mAudioSink->getPosition(&numFramesPlayed), (status_t)OK); 217f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 218f933441648ef6a71dee783d733aac17b9508b452Andreas Huber uint32_t numFramesPendingPlayout = 219f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNumFramesWritten - numFramesPlayed; 220f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 221f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t realTimeOffsetUs = 222f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (mAudioSink->latency() / 2 /* XXX */ 223f933441648ef6a71dee783d733aac17b9508b452Andreas Huber + numFramesPendingPlayout 224f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * mAudioSink->msecsPerFrame()) * 1000ll; 225f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 226f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // LOGI("realTimeOffsetUs = %lld us", realTimeOffsetUs); 227f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 228f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAnchorTimeRealUs = 229f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ALooper::GetNowUs() + realTimeOffsetUs; 230f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 231f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 232f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t copy = entry->mBuffer->size() - entry->mOffset; 233f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (copy > numBytesAvailableToWrite) { 234f933441648ef6a71dee783d733aac17b9508b452Andreas Huber copy = numBytesAvailableToWrite; 235f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mAudioSink->write( 238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber entry->mBuffer->data() + entry->mOffset, copy), 239f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (ssize_t)copy); 240f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 241f933441648ef6a71dee783d733aac17b9508b452Andreas Huber entry->mOffset += copy; 242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (entry->mOffset == entry->mBuffer->size()) { 243f933441648ef6a71dee783d733aac17b9508b452Andreas Huber entry->mNotifyConsumed->post(); 244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioQueue.erase(mAudioQueue.begin()); 245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber entry = NULL; 246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber numBytesAvailableToWrite -= copy; 249f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNumFramesWritten += copy / mAudioSink->frameSize(); 250f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 251f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 252f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 253f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::Renderer::postDrainVideoQueue() { 254f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mDrainVideoQueuePending || mSyncQueues) { 255f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 256f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 257f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 258f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mVideoQueue.empty()) { 259f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 260f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 261f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 262f933441648ef6a71dee783d733aac17b9508b452Andreas Huber QueueEntry &entry = *mVideoQueue.begin(); 263f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 264f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = new AMessage(kWhatDrainVideoQueue, id()); 265f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("generation", mVideoQueueGeneration); 266f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 267f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t delayUs; 268f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 269f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (entry.mBuffer == NULL) { 270f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // EOS doesn't carry a timestamp. 271f933441648ef6a71dee783d733aac17b9508b452Andreas Huber delayUs = 0; 272f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 273f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t mediaTimeUs; 274f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(entry.mBuffer->meta()->findInt64("timeUs", &mediaTimeUs)); 275f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 276f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mAnchorTimeMediaUs < 0) { 277f933441648ef6a71dee783d733aac17b9508b452Andreas Huber delayUs = 0; 278f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2793831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (!mHasAudio) { 280f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAnchorTimeMediaUs = mediaTimeUs; 281f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAnchorTimeRealUs = ALooper::GetNowUs(); 282f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 283f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 284f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t realTimeUs = 285f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (mediaTimeUs - mAnchorTimeMediaUs) + mAnchorTimeRealUs; 286f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 287f933441648ef6a71dee783d733aac17b9508b452Andreas Huber delayUs = realTimeUs - ALooper::GetNowUs(); 288f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 289f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 290f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 291f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(delayUs); 292f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 293f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDrainVideoQueuePending = true; 294f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 295f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 296f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::Renderer::onDrainVideoQueue() { 297f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mVideoQueue.empty()) { 298f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 299f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 300f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 301f933441648ef6a71dee783d733aac17b9508b452Andreas Huber QueueEntry *entry = &*mVideoQueue.begin(); 302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 303f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (entry->mBuffer == NULL) { 304f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // EOS 305f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notifyEOS(false /* audio */); 307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 308f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mVideoQueue.erase(mVideoQueue.begin()); 309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber entry = NULL; 310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 311f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 312f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 313f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0 314f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t mediaTimeUs; 315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(entry->mBuffer->meta()->findInt64("timeUs", &mediaTimeUs)); 316f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 317f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGI("rendering video at media time %.2f secs", mediaTimeUs / 1E6); 318f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif 319f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 320f933441648ef6a71dee783d733aac17b9508b452Andreas Huber entry->mNotifyConsumed->setInt32("render", true); 321f933441648ef6a71dee783d733aac17b9508b452Andreas Huber entry->mNotifyConsumed->post(); 322f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mVideoQueue.erase(mVideoQueue.begin()); 323f933441648ef6a71dee783d733aac17b9508b452Andreas Huber entry = NULL; 324f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 325f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 326f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::Renderer::notifyEOS(bool audio) { 327f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mNotify->dup(); 328f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->setInt32("what", kWhatEOS); 329f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->setInt32("audio", static_cast<int32_t>(audio)); 330f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 331f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 332f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 333f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::Renderer::onQueueBuffer(const sp<AMessage> &msg) { 334f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t audio; 335f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("audio", &audio)); 336f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 337f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (dropBufferWhileFlushing(audio, msg)) { 338f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 339f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 340f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 341f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 342f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findObject("buffer", &obj)); 343f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> buffer = static_cast<ABuffer *>(obj.get()); 344f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 345f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notifyConsumed; 346f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("notifyConsumed", ¬ifyConsumed)); 347f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 348f933441648ef6a71dee783d733aac17b9508b452Andreas Huber QueueEntry entry; 349f933441648ef6a71dee783d733aac17b9508b452Andreas Huber entry.mBuffer = buffer; 350f933441648ef6a71dee783d733aac17b9508b452Andreas Huber entry.mNotifyConsumed = notifyConsumed; 351f933441648ef6a71dee783d733aac17b9508b452Andreas Huber entry.mOffset = 0; 352f933441648ef6a71dee783d733aac17b9508b452Andreas Huber entry.mFinalResult = OK; 353f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 354f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (audio) { 355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioQueue.push_back(entry); 356f933441648ef6a71dee783d733aac17b9508b452Andreas Huber postDrainAudioQueue(); 357f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 358f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mVideoQueue.push_back(entry); 359f933441648ef6a71dee783d733aac17b9508b452Andreas Huber postDrainVideoQueue(); 360f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 361f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 362f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mSyncQueues && !mAudioQueue.empty() && !mVideoQueue.empty()) { 363f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t firstAudioTimeUs; 364f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t firstVideoTimeUs; 365f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK((*mAudioQueue.begin()).mBuffer->meta() 366f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ->findInt64("timeUs", &firstAudioTimeUs)); 367f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK((*mVideoQueue.begin()).mBuffer->meta() 368f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ->findInt64("timeUs", &firstVideoTimeUs)); 369f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 370f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t diff = firstVideoTimeUs - firstAudioTimeUs; 371f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 372f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGV("queueDiff = %.2f secs", diff / 1E6); 373f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 374f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (diff > 100000ll) { 375f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Audio data starts More than 0.1 secs before video. 376f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Drop some audio. 377f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 378f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (*mAudioQueue.begin()).mNotifyConsumed->post(); 379f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioQueue.erase(mAudioQueue.begin()); 380f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 381f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 382f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 383f933441648ef6a71dee783d733aac17b9508b452Andreas Huber syncQueuesDone(); 384f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 385f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 386f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 387f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::Renderer::syncQueuesDone() { 388f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!mSyncQueues) { 389f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 390f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 391f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 392f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mSyncQueues = false; 393f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 394f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!mAudioQueue.empty()) { 395f933441648ef6a71dee783d733aac17b9508b452Andreas Huber postDrainAudioQueue(); 396f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 397f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 398f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!mVideoQueue.empty()) { 399f933441648ef6a71dee783d733aac17b9508b452Andreas Huber postDrainVideoQueue(); 400f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 401f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 402f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 403f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::Renderer::onQueueEOS(const sp<AMessage> &msg) { 404f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t audio; 405f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("audio", &audio)); 406f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 407f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (dropBufferWhileFlushing(audio, msg)) { 408f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 409f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 410f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 411f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t finalResult; 412f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("finalResult", &finalResult)); 413f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 414f933441648ef6a71dee783d733aac17b9508b452Andreas Huber QueueEntry entry; 415f933441648ef6a71dee783d733aac17b9508b452Andreas Huber entry.mOffset = 0; 416f933441648ef6a71dee783d733aac17b9508b452Andreas Huber entry.mFinalResult = finalResult; 417f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 418f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (audio) { 419f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioQueue.push_back(entry); 420f933441648ef6a71dee783d733aac17b9508b452Andreas Huber postDrainAudioQueue(); 421f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 422f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mVideoQueue.push_back(entry); 423f933441648ef6a71dee783d733aac17b9508b452Andreas Huber postDrainVideoQueue(); 424f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 425f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 426f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 427f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::Renderer::onFlush(const sp<AMessage> &msg) { 428f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t audio; 429f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("audio", &audio)); 430f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 431f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // If we're currently syncing the queues, i.e. dropping audio while 432f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // aligning the first audio/video buffer times and only one of the 433f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // two queues has data, we may starve that queue by not requesting 434f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // more buffers from the decoder. If the other source then encounters 435f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // a discontinuity that leads to flushing, we'll never find the 436f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // corresponding discontinuity on the other queue. 437f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Therefore we'll stop syncing the queues if at least one of them 438f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // is flushed. 439f933441648ef6a71dee783d733aac17b9508b452Andreas Huber syncQueuesDone(); 440f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 441f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (audio) { 442f933441648ef6a71dee783d733aac17b9508b452Andreas Huber flushQueue(&mAudioQueue); 443f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 444f933441648ef6a71dee783d733aac17b9508b452Andreas Huber Mutex::Autolock autoLock(mFlushLock); 445f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingAudio = false; 446f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 447f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDrainAudioQueuePending = false; 448f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ++mAudioQueueGeneration; 449f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 450f933441648ef6a71dee783d733aac17b9508b452Andreas Huber flushQueue(&mVideoQueue); 451f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 452f933441648ef6a71dee783d733aac17b9508b452Andreas Huber Mutex::Autolock autoLock(mFlushLock); 453f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingVideo = false; 454f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 455f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDrainVideoQueuePending = false; 456f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ++mVideoQueueGeneration; 457f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 458f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 459f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notifyFlushComplete(audio); 460f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 461f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 462f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::Renderer::flushQueue(List<QueueEntry> *queue) { 463f933441648ef6a71dee783d733aac17b9508b452Andreas Huber while (!queue->empty()) { 464f933441648ef6a71dee783d733aac17b9508b452Andreas Huber QueueEntry *entry = &*queue->begin(); 465f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 466f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (entry->mBuffer != NULL) { 467f933441648ef6a71dee783d733aac17b9508b452Andreas Huber entry->mNotifyConsumed->post(); 468f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 469f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 470f933441648ef6a71dee783d733aac17b9508b452Andreas Huber queue->erase(queue->begin()); 471f933441648ef6a71dee783d733aac17b9508b452Andreas Huber entry = NULL; 472f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 473f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 474f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 475f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::Renderer::notifyFlushComplete(bool audio) { 476f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mNotify->dup(); 477f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->setInt32("what", kWhatFlushComplete); 478f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->setInt32("audio", static_cast<int32_t>(audio)); 479f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 480f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 481f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 482f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool NuPlayer::Renderer::dropBufferWhileFlushing( 483f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool audio, const sp<AMessage> &msg) { 484f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool flushing = false; 485f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 486f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 487f933441648ef6a71dee783d733aac17b9508b452Andreas Huber Mutex::Autolock autoLock(mFlushLock); 488f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (audio) { 489f933441648ef6a71dee783d733aac17b9508b452Andreas Huber flushing = mFlushingAudio; 490f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 491f933441648ef6a71dee783d733aac17b9508b452Andreas Huber flushing = mFlushingVideo; 492f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 493f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 494f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 495f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!flushing) { 496f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 497f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 498f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 499f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notifyConsumed; 500f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (msg->findMessage("notifyConsumed", ¬ifyConsumed)) { 501f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notifyConsumed->post(); 502f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 503f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 504f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 505f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 506f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5073831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Hubervoid NuPlayer::Renderer::onAudioSinkChanged() { 5083831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber CHECK(!mDrainAudioQueuePending); 5093831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mNumFramesWritten = 0; 5103831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber} 5113831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 512f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 513f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 514