NuPlayerDecoderPassThrough.cpp revision c5cc2e21602182c7ab4df1d7eba40f18037c1818
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 24bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia#include <media/ICrypto.h> 25bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia#include <media/stagefright/foundation/ABuffer.h> 26bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia#include <media/stagefright/foundation/ADebug.h> 27bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia#include <media/stagefright/foundation/AMessage.h> 28bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia#include <media/stagefright/MediaDefs.h> 29bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia#include <media/stagefright/MediaErrors.h> 30bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 31bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jianamespace android { 32bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 33c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burkstatic const size_t kMaxCachedBytes = 200000; 34c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk// The buffers will contain a bit less than kAggregateBufferSizeBytes. 35c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk// So we can start off with just enough buffers to keep the cache full. 36c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burkstatic const size_t kMaxPendingBuffers = 1 + (kMaxCachedBytes / NuPlayer::kAggregateBufferSizeBytes); 37bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 38bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei JiaNuPlayer::DecoderPassThrough::DecoderPassThrough( 39bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia const sp<AMessage> ¬ify) 40bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia : Decoder(notify), 41bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia mNotify(notify), 42bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia mBufferGeneration(0), 43bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia mReachedEOS(true), 44c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk mPendingBuffersToFill(0), 45c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk mPendingBuffersToDrain(0), 46de01afbbc55ac9c5c23ec66154603f34217aed2cChong Zhang mCachedBytes(0), 47bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia mComponentName("pass through decoder") { 48bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia mDecoderLooper = new ALooper; 49bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia mDecoderLooper->setName("NuPlayerDecoderPassThrough"); 50bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia mDecoderLooper->start(false, false, ANDROID_PRIORITY_AUDIO); 51bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia} 52bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 53bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei JiaNuPlayer::DecoderPassThrough::~DecoderPassThrough() { 54bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia} 55bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 56bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiavoid NuPlayer::DecoderPassThrough::configure(const sp<AMessage> &format) { 57bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia sp<AMessage> msg = new AMessage(kWhatConfigure, id()); 58bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia msg->setMessage("format", format); 59bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia msg->post(); 60bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia} 61bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 62bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiavoid NuPlayer::DecoderPassThrough::init() { 63bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia mDecoderLooper->registerHandler(this); 64bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia} 65bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 66bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiavoid NuPlayer::DecoderPassThrough::signalFlush() { 67bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia (new AMessage(kWhatFlush, id()))->post(); 68bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia} 69bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 70bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiavoid NuPlayer::DecoderPassThrough::signalResume() { 71bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia (new AMessage(kWhatResume, id()))->post(); 72bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia} 73bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 74bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiavoid NuPlayer::DecoderPassThrough::initiateShutdown() { 75bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia (new AMessage(kWhatShutdown, id()))->post(); 76bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia} 77bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 78bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiabool NuPlayer::DecoderPassThrough::supportsSeamlessFormatChange( 79bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia const sp<AMessage> & /* targetFormat */) const { 80bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia return true; 81bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia} 82bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 83bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiavoid NuPlayer::DecoderPassThrough::onConfigure(const sp<AMessage> &format) { 84bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia ALOGV("[%s] onConfigure", mComponentName.c_str()); 85de01afbbc55ac9c5c23ec66154603f34217aed2cChong Zhang mCachedBytes = 0; 86c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk mPendingBuffersToFill = 0; 87c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk mPendingBuffersToDrain = 0; 88bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia mReachedEOS = false; 89bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia ++mBufferGeneration; 90bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 91c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk requestMaxBuffers(); 92bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 93bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia sp<AMessage> notify = mNotify->dup(); 94bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia notify->setInt32("what", kWhatOutputFormatChanged); 95bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia notify->setMessage("format", format); 96bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia notify->post(); 97bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia} 98bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 99bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiabool NuPlayer::DecoderPassThrough::isStaleReply(const sp<AMessage> &msg) { 100bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia int32_t generation; 101bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia CHECK(msg->findInt32("generation", &generation)); 102bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia return generation != mBufferGeneration; 103bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia} 104bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 105c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burkbool NuPlayer::DecoderPassThrough::requestABuffer() { 106c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk if (mCachedBytes >= kMaxCachedBytes) { 107c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk ALOGV("[%s] mCachedBytes = %zu", 108c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk mComponentName.c_str(), mCachedBytes); 109c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk return false; 110c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk } 111c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk if (mReachedEOS) { 112c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk ALOGV("[%s] reached EOS", mComponentName.c_str()); 113c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk return false; 114bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia } 115bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 116bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia sp<AMessage> reply = new AMessage(kWhatInputBufferFilled, id()); 117bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia reply->setInt32("generation", mBufferGeneration); 118bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 119bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia sp<AMessage> notify = mNotify->dup(); 120bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia notify->setInt32("what", kWhatFillThisBuffer); 121bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia notify->setMessage("reply", reply); 122bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia notify->post(); 123c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk mPendingBuffersToFill++; 124c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk ALOGV("requestABuffer: #ToFill = %zu, #ToDrain = %zu", mPendingBuffersToFill, 125c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk mPendingBuffersToDrain); 126bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 127c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk return true; 128bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia} 129bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 130bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiavoid android::NuPlayer::DecoderPassThrough::onInputBufferFilled( 131bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia const sp<AMessage> &msg) { 132c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk --mPendingBuffersToFill; 133bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia if (mReachedEOS) { 134bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia return; 135bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia } 136bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 137bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia sp<ABuffer> buffer; 138bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia msg->findBuffer("buffer", &buffer); 139bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia if (buffer == NULL) { 140bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia mReachedEOS = true; 141bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 142bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia sp<AMessage> notify = mNotify->dup(); 143bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia notify->setInt32("what", kWhatEOS); 144bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia notify->setInt32("err", ERROR_END_OF_STREAM); 145bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia notify->post(); 146bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia return; 147bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia } 148bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 149de01afbbc55ac9c5c23ec66154603f34217aed2cChong Zhang mCachedBytes += buffer->size(); 150de01afbbc55ac9c5c23ec66154603f34217aed2cChong Zhang 151bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia sp<AMessage> reply = new AMessage(kWhatBufferConsumed, id()); 152bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia reply->setInt32("generation", mBufferGeneration); 153de01afbbc55ac9c5c23ec66154603f34217aed2cChong Zhang reply->setInt32("size", buffer->size()); 154bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 155bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia sp<AMessage> notify = mNotify->dup(); 156bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia notify->setInt32("what", kWhatDrainThisBuffer); 157bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia notify->setBuffer("buffer", buffer); 158bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia notify->setMessage("reply", reply); 159bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia notify->post(); 160c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk ++mPendingBuffersToDrain; 161c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk ALOGV("onInputBufferFilled: #ToFill = %zu, #ToDrain = %zu, cachedBytes = %zu", 162c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk mPendingBuffersToFill, mPendingBuffersToDrain, mCachedBytes); 163bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia} 164bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 165de01afbbc55ac9c5c23ec66154603f34217aed2cChong Zhangvoid NuPlayer::DecoderPassThrough::onBufferConsumed(int32_t size) { 166c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk --mPendingBuffersToDrain; 167de01afbbc55ac9c5c23ec66154603f34217aed2cChong Zhang mCachedBytes -= size; 168c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk ALOGV("onBufferConsumed: #ToFill = %zu, #ToDrain = %zu, cachedBytes = %zu", 169c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk mPendingBuffersToFill, mPendingBuffersToDrain, mCachedBytes); 170178e506350ef41609daaf307f598ef0bc4f82c71Lajos Molnar requestABuffer(); 171bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia} 172bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 173bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiavoid NuPlayer::DecoderPassThrough::onFlush() { 174bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia ++mBufferGeneration; 175bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 176bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia sp<AMessage> notify = mNotify->dup(); 177bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia notify->setInt32("what", kWhatFlushCompleted); 178bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia notify->post(); 179c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk mPendingBuffersToFill = 0; 180c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk mPendingBuffersToDrain = 0; 181de01afbbc55ac9c5c23ec66154603f34217aed2cChong Zhang mCachedBytes = 0; 182bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia mReachedEOS = false; 183bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia} 184bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 185c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burkvoid NuPlayer::DecoderPassThrough::requestMaxBuffers() { 186c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk for (size_t i = 0; i < kMaxPendingBuffers; i++) { 187c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk if (!requestABuffer()) { 188c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk break; 189c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk } 190c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk } 191c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk} 192c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk 193bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiavoid NuPlayer::DecoderPassThrough::onShutdown() { 194bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia ++mBufferGeneration; 195bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 196bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia sp<AMessage> notify = mNotify->dup(); 197bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia notify->setInt32("what", kWhatShutdownCompleted); 198bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia notify->post(); 199bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia mReachedEOS = true; 200bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia} 201bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 202bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiavoid NuPlayer::DecoderPassThrough::onMessageReceived(const sp<AMessage> &msg) { 203bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia ALOGV("[%s] onMessage: %s", mComponentName.c_str(), 204bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia msg->debugString().c_str()); 205bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 206bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia switch (msg->what()) { 207bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia case kWhatConfigure: 208bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia { 209bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia sp<AMessage> format; 210bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia CHECK(msg->findMessage("format", &format)); 211bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia onConfigure(format); 212bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia break; 213bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia } 214bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 215bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia case kWhatRequestABuffer: 216bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia { 217bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia if (!isStaleReply(msg)) { 218bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia requestABuffer(); 219bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia } 220bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 221bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia break; 222bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia } 223bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 224bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia case kWhatInputBufferFilled: 225bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia { 226bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia if (!isStaleReply(msg)) { 227bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia onInputBufferFilled(msg); 228bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia } 229bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia break; 230bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia } 231bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 232bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia case kWhatBufferConsumed: 233bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia { 234bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia if (!isStaleReply(msg)) { 235de01afbbc55ac9c5c23ec66154603f34217aed2cChong Zhang int32_t size; 236de01afbbc55ac9c5c23ec66154603f34217aed2cChong Zhang CHECK(msg->findInt32("size", &size)); 237de01afbbc55ac9c5c23ec66154603f34217aed2cChong Zhang onBufferConsumed(size); 238bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia } 239bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia break; 240bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia } 241bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 242bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia case kWhatFlush: 243bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia { 244bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia onFlush(); 245bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia break; 246bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia } 247bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 248bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia case kWhatResume: 249bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia { 250c5cc2e21602182c7ab4df1d7eba40f18037c1818Phil Burk requestMaxBuffers(); 251bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia break; 252bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia } 253bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 254bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia case kWhatShutdown: 255bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia { 256bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia onShutdown(); 257bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia break; 258bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia } 259bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 260bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia default: 261bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia TRESPASS(); 262bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia break; 263bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia } 264bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia} 265bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 266bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia} // namespace android 267