NuPlayerDecoderPassThrough.cpp revision c6cfd70f24a11b946859485ce398a189c301a4e2
1bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia/* 2bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia * Copyright (C) 2014 The Android Open Source Project 3bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia * 4bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia * Licensed under the Apache License, Version 2.0 (the "License"); 5bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia * you may not use this file except in compliance with the License. 6bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia * You may obtain a copy of the License at 7bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia * 8bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia * http://www.apache.org/licenses/LICENSE-2.0 9bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia * 10bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia * Unless required by applicable law or agreed to in writing, software 11bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia * distributed under the License is distributed on an "AS IS" BASIS, 12bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia * See the License for the specific language governing permissions and 14bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia * limitations under the License. 15bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia */ 16bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 17bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia//#define LOG_NDEBUG 0 18bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia#define LOG_TAG "NuPlayerDecoderPassThrough" 19bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia#include <utils/Log.h> 20bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia#include <inttypes.h> 21bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 22bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia#include "NuPlayerDecoderPassThrough.h" 23bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 24c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia#include "NuPlayerRenderer.h" 25c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia#include "NuPlayerSource.h" 26c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia 27bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia#include <media/ICrypto.h> 28bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia#include <media/stagefright/foundation/ABuffer.h> 29bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia#include <media/stagefright/foundation/ADebug.h> 30bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia#include <media/stagefright/foundation/AMessage.h> 31bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia#include <media/stagefright/MediaDefs.h> 32bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia#include <media/stagefright/MediaErrors.h> 33bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 34bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jianamespace android { 35bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 36c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burkstatic const size_t kMaxCachedBytes = 200000; 37c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk// The buffers will contain a bit less than kAggregateBufferSizeBytes. 38c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk// So we can start off with just enough buffers to keep the cache full. 39c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burkstatic const size_t kMaxPendingBuffers = 1 + (kMaxCachedBytes / NuPlayer::kAggregateBufferSizeBytes); 40bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 41bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei JiaNuPlayer::DecoderPassThrough::DecoderPassThrough( 42c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia const sp<AMessage> ¬ify, 43c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia const sp<Source> &source, 44c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia const sp<Renderer> &renderer) 45c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia : Decoder(notify, source), 46bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia mNotify(notify), 47c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia mSource(source), 48c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia mRenderer(renderer), 49c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia mSkipRenderingUntilMediaTimeUs(-1ll), 50bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia mBufferGeneration(0), 51bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia mReachedEOS(true), 52c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk mPendingBuffersToFill(0), 53c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk mPendingBuffersToDrain(0), 54de01afbbc55ac9c5c23ec66154603f34217aed2cChong Zhang mCachedBytes(0), 55bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia mComponentName("pass through decoder") { 56c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia ALOGW_IF(renderer == NULL, "expect a non-NULL renderer"); 57bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia mDecoderLooper = new ALooper; 58bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia mDecoderLooper->setName("NuPlayerDecoderPassThrough"); 59bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia mDecoderLooper->start(false, false, ANDROID_PRIORITY_AUDIO); 60bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia} 61bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 62bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei JiaNuPlayer::DecoderPassThrough::~DecoderPassThrough() { 63bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia} 64bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 65bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiavoid NuPlayer::DecoderPassThrough::configure(const sp<AMessage> &format) { 66bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia sp<AMessage> msg = new AMessage(kWhatConfigure, id()); 67bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia msg->setMessage("format", format); 68bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia msg->post(); 69bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia} 70bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 71bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiavoid NuPlayer::DecoderPassThrough::init() { 72bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia mDecoderLooper->registerHandler(this); 73bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia} 74bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 75bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiavoid NuPlayer::DecoderPassThrough::signalFlush() { 76bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia (new AMessage(kWhatFlush, id()))->post(); 77bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia} 78bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 79bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiavoid NuPlayer::DecoderPassThrough::signalResume() { 80bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia (new AMessage(kWhatResume, id()))->post(); 81bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia} 82bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 83bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiavoid NuPlayer::DecoderPassThrough::initiateShutdown() { 84bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia (new AMessage(kWhatShutdown, id()))->post(); 85bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia} 86bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 87bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiabool NuPlayer::DecoderPassThrough::supportsSeamlessFormatChange( 88bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia const sp<AMessage> & /* targetFormat */) const { 89bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia return true; 90bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia} 91bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 92bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiavoid NuPlayer::DecoderPassThrough::onConfigure(const sp<AMessage> &format) { 93bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia ALOGV("[%s] onConfigure", mComponentName.c_str()); 94de01afbbc55ac9c5c23ec66154603f34217aed2cChong Zhang mCachedBytes = 0; 95c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk mPendingBuffersToFill = 0; 96c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk mPendingBuffersToDrain = 0; 97bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia mReachedEOS = false; 98bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia ++mBufferGeneration; 99bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 100c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk requestMaxBuffers(); 101bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 102c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia uint32_t flags; 103c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia int64_t durationUs; 104c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia if (mSource->getDuration(&durationUs) == OK && 105c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia durationUs > AUDIO_SINK_MIN_DEEP_BUFFER_DURATION_US) { 106c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia flags = AUDIO_OUTPUT_FLAG_DEEP_BUFFER; 107c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia } else { 108c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia flags = AUDIO_OUTPUT_FLAG_NONE; 109c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia } 110c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia 111c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia mRenderer->openAudioSink( 112c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia format, true /* offloadOnly */, false /* hasVideo */, flags); 113bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia} 114bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 115bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiabool NuPlayer::DecoderPassThrough::isStaleReply(const sp<AMessage> &msg) { 116bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia int32_t generation; 117bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia CHECK(msg->findInt32("generation", &generation)); 118bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia return generation != mBufferGeneration; 119bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia} 120bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 121c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burkbool NuPlayer::DecoderPassThrough::requestABuffer() { 122c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk if (mCachedBytes >= kMaxCachedBytes) { 123c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk ALOGV("[%s] mCachedBytes = %zu", 124c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk mComponentName.c_str(), mCachedBytes); 125c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk return false; 126c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk } 127c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk if (mReachedEOS) { 128c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk ALOGV("[%s] reached EOS", mComponentName.c_str()); 129c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk return false; 130bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia } 131bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 132bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia sp<AMessage> reply = new AMessage(kWhatInputBufferFilled, id()); 133bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia reply->setInt32("generation", mBufferGeneration); 134bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 135bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia sp<AMessage> notify = mNotify->dup(); 136bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia notify->setInt32("what", kWhatFillThisBuffer); 137bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia notify->setMessage("reply", reply); 138bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia notify->post(); 139c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk mPendingBuffersToFill++; 140c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk ALOGV("requestABuffer: #ToFill = %zu, #ToDrain = %zu", mPendingBuffersToFill, 141c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk mPendingBuffersToDrain); 142bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 143c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk return true; 144bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia} 145bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 146bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiavoid android::NuPlayer::DecoderPassThrough::onInputBufferFilled( 147bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia const sp<AMessage> &msg) { 148c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk --mPendingBuffersToFill; 149bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia if (mReachedEOS) { 150bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia return; 151bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia } 152bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 153bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia sp<ABuffer> buffer; 154bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia msg->findBuffer("buffer", &buffer); 155bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia if (buffer == NULL) { 156bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia mReachedEOS = true; 157c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia if (mRenderer != NULL) { 158c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia mRenderer->queueEOS(true /* audio */, ERROR_END_OF_STREAM); 159c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia } 160bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia return; 161bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia } 162bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 163c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia sp<AMessage> extra; 164c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia if (buffer->meta()->findMessage("extra", &extra) && extra != NULL) { 165c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia int64_t resumeAtMediaTimeUs; 166c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia if (extra->findInt64( 167c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia "resume-at-mediatimeUs", &resumeAtMediaTimeUs)) { 168c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia ALOGI("[%s] suppressing rendering until %lld us", 169c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia mComponentName.c_str(), (long long)resumeAtMediaTimeUs); 170c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia mSkipRenderingUntilMediaTimeUs = resumeAtMediaTimeUs; 171c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia } 172c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia } 173c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia 174c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia int32_t bufferSize = buffer->size(); 175c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia mCachedBytes += bufferSize; 176c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia 177c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia if (mSkipRenderingUntilMediaTimeUs >= 0) { 178c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia int64_t timeUs = 0; 179c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 180c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia 181c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia if (timeUs < mSkipRenderingUntilMediaTimeUs) { 182c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia ALOGV("[%s] dropping buffer at time %lld as requested.", 183c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia mComponentName.c_str(), (long long)timeUs); 184c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia 185c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia onBufferConsumed(bufferSize); 186c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia return; 187c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia } 188c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia 189c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia mSkipRenderingUntilMediaTimeUs = -1; 190c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia } 191c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia 192c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia if (mRenderer == NULL) { 193c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia onBufferConsumed(bufferSize); 194c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia return; 195c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia } 196de01afbbc55ac9c5c23ec66154603f34217aed2cChong Zhang 197bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia sp<AMessage> reply = new AMessage(kWhatBufferConsumed, id()); 198bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia reply->setInt32("generation", mBufferGeneration); 199c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia reply->setInt32("size", bufferSize); 200c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia 201c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia mRenderer->queueBuffer(true /* audio */, buffer, reply); 202bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 203c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk ++mPendingBuffersToDrain; 204c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk ALOGV("onInputBufferFilled: #ToFill = %zu, #ToDrain = %zu, cachedBytes = %zu", 205c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk mPendingBuffersToFill, mPendingBuffersToDrain, mCachedBytes); 206bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia} 207bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 208de01afbbc55ac9c5c23ec66154603f34217aed2cChong Zhangvoid NuPlayer::DecoderPassThrough::onBufferConsumed(int32_t size) { 209c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk --mPendingBuffersToDrain; 210de01afbbc55ac9c5c23ec66154603f34217aed2cChong Zhang mCachedBytes -= size; 211c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk ALOGV("onBufferConsumed: #ToFill = %zu, #ToDrain = %zu, cachedBytes = %zu", 212c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk mPendingBuffersToFill, mPendingBuffersToDrain, mCachedBytes); 213178e506350ef41609daaf307f598ef0bc4f82c71Lajos Molnar requestABuffer(); 214bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia} 215bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 216bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiavoid NuPlayer::DecoderPassThrough::onFlush() { 217bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia ++mBufferGeneration; 218c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia mSkipRenderingUntilMediaTimeUs = -1; 219c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia 220c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia if (mRenderer != NULL) { 221c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia mRenderer->flush(true /* audio */); 222c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia } 223bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 224bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia sp<AMessage> notify = mNotify->dup(); 225bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia notify->setInt32("what", kWhatFlushCompleted); 226bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia notify->post(); 227c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk mPendingBuffersToFill = 0; 228c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk mPendingBuffersToDrain = 0; 229de01afbbc55ac9c5c23ec66154603f34217aed2cChong Zhang mCachedBytes = 0; 230bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia mReachedEOS = false; 231bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia} 232bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 233c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burkvoid NuPlayer::DecoderPassThrough::requestMaxBuffers() { 234c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk for (size_t i = 0; i < kMaxPendingBuffers; i++) { 235c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk if (!requestABuffer()) { 236c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk break; 237c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk } 238c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk } 239c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk} 240c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk 241bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiavoid NuPlayer::DecoderPassThrough::onShutdown() { 242bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia ++mBufferGeneration; 243c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia mSkipRenderingUntilMediaTimeUs = -1; 244bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 245bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia sp<AMessage> notify = mNotify->dup(); 246bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia notify->setInt32("what", kWhatShutdownCompleted); 247bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia notify->post(); 248bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia mReachedEOS = true; 249bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia} 250bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 251bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiavoid NuPlayer::DecoderPassThrough::onMessageReceived(const sp<AMessage> &msg) { 252bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia ALOGV("[%s] onMessage: %s", mComponentName.c_str(), 253bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia msg->debugString().c_str()); 254bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 255bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia switch (msg->what()) { 256bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia case kWhatConfigure: 257bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia { 258bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia sp<AMessage> format; 259bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia CHECK(msg->findMessage("format", &format)); 260bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia onConfigure(format); 261bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia break; 262bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia } 263bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 264bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia case kWhatRequestABuffer: 265bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia { 266bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia if (!isStaleReply(msg)) { 267bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia requestABuffer(); 268bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia } 269bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 270bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia break; 271bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia } 272bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 273bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia case kWhatInputBufferFilled: 274bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia { 275bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia if (!isStaleReply(msg)) { 276bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia onInputBufferFilled(msg); 277bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia } 278bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia break; 279bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia } 280bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 281bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia case kWhatBufferConsumed: 282bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia { 283bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia if (!isStaleReply(msg)) { 284de01afbbc55ac9c5c23ec66154603f34217aed2cChong Zhang int32_t size; 285de01afbbc55ac9c5c23ec66154603f34217aed2cChong Zhang CHECK(msg->findInt32("size", &size)); 286de01afbbc55ac9c5c23ec66154603f34217aed2cChong Zhang onBufferConsumed(size); 287bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia } 288bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia break; 289bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia } 290bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 291bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia case kWhatFlush: 292bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia { 293bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia onFlush(); 294bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia break; 295bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia } 296bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 297bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia case kWhatResume: 298bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia { 299c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk requestMaxBuffers(); 300bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia break; 301bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia } 302bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 303bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia case kWhatShutdown: 304bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia { 305bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia onShutdown(); 306bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia break; 307bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia } 308bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 309bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia default: 310bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia TRESPASS(); 311bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia break; 312bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia } 313bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia} 314bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 315bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia} // namespace android 316