NuPlayerDecoderPassThrough.cpp revision de01afbbc55ac9c5c23ec66154603f34217aed2c
17340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock/* 27340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock * Copyright (C) 2014 The Android Open Source Project 37340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock * 47340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock * Licensed under the Apache License, Version 2.0 (the "License"); 57340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock * you may not use this file except in compliance with the License. 67340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock * You may obtain a copy of the License at 77340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock * 87340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock * http://www.apache.org/licenses/LICENSE-2.0 97340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock * 107340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock * Unless required by applicable law or agreed to in writing, software 117340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock * distributed under the License is distributed on an "AS IS" BASIS, 127340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock * See the License for the specific language governing permissions and 147340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock * limitations under the License. 157340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock */ 167340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock 177340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock//#define LOG_NDEBUG 0 187340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock#define LOG_TAG "NuPlayerDecoderPassThrough" 196e839b006e102b4c2d9f495fe0551e7668dae61eJulia Reynolds#include <utils/Log.h> 203b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock#include <inttypes.h> 21c279b996f13e644782633853612452860e596308Julia Reynolds 227340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock#include "NuPlayerDecoderPassThrough.h" 23e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock 247340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock#include <media/ICrypto.h> 257340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock#include <media/stagefright/foundation/ABuffer.h> 267340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock#include <media/stagefright/foundation/ADebug.h> 27e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock#include <media/stagefright/foundation/AMessage.h> 28856edebad73560e9b1cce021a7de9a0470d07176John Spurlock#include <media/stagefright/MediaDefs.h> 297340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock#include <media/stagefright/MediaErrors.h> 30e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock 317340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlocknamespace android { 32e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock 33c279b996f13e644782633853612452860e596308Julia Reynoldsstatic const int kMaxPendingBuffers = 10; 34e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlockstatic const int kMaxCachedBytes = 200000; 353b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock 367340fc8665ae3f9f1978f42aa0e5e1da85036158John SpurlockNuPlayer::DecoderPassThrough::DecoderPassThrough( 377340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock const sp<AMessage> ¬ify) 387340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock : Decoder(notify), 3925e2d24f24040e58a61169db797f760b16c11f5dJohn Spurlock mNotify(notify), 407340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock mBufferGeneration(0), 41e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock mReachedEOS(true), 423b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock mPendingBuffers(0), 43e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock mCachedBytes(0), 44e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock mComponentName("pass through decoder") { 457340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock mDecoderLooper = new ALooper; 46b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock mDecoderLooper->setName("NuPlayerDecoderPassThrough"); 47b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock mDecoderLooper->start(false, false, ANDROID_PRIORITY_AUDIO); 48b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock} 49b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock 50b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John SpurlockNuPlayer::DecoderPassThrough::~DecoderPassThrough() { 51b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock} 52b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock 53b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlockvoid NuPlayer::DecoderPassThrough::configure(const sp<AMessage> &format) { 54e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock sp<AMessage> msg = new AMessage(kWhatConfigure, id()); 55b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock msg->setMessage("format", format); 56530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock msg->post(); 57530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock} 58530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock 59530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlockvoid NuPlayer::DecoderPassThrough::init() { 60b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock mDecoderLooper->registerHandler(this); 61b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock} 62b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock 63b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlockvoid NuPlayer::DecoderPassThrough::signalFlush() { 64b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock (new AMessage(kWhatFlush, id()))->post(); 65b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock} 66b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock 67b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlockvoid NuPlayer::DecoderPassThrough::signalResume() { 68b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock (new AMessage(kWhatResume, id()))->post(); 69b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock} 70b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock 71ddbe4ca1ca3c585cf86dac3823947ebacb7c9be6Xiaohui Chenvoid NuPlayer::DecoderPassThrough::initiateShutdown() { 72b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock (new AMessage(kWhatShutdown, id()))->post(); 73b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock} 74b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock 75b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlockbool NuPlayer::DecoderPassThrough::supportsSeamlessFormatChange( 767340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock const sp<AMessage> & /* targetFormat */) const { 777340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock return true; 787340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock} 797340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock 80b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlockvoid NuPlayer::DecoderPassThrough::onConfigure(const sp<AMessage> &format) { 817340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock ALOGV("[%s] onConfigure", mComponentName.c_str()); 827340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock mPendingBuffers = 0; 83c279b996f13e644782633853612452860e596308Julia Reynolds mCachedBytes = 0; 846e839b006e102b4c2d9f495fe0551e7668dae61eJulia Reynolds mReachedEOS = false; 857340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock ++mBufferGeneration; 867340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock 877340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock requestABuffer(); 887340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock 897340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock sp<AMessage> notify = mNotify->dup(); 907340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock notify->setInt32("what", kWhatOutputFormatChanged); 917340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock notify->setMessage("format", format); 9225e2d24f24040e58a61169db797f760b16c11f5dJohn Spurlock notify->post(); 9325e2d24f24040e58a61169db797f760b16c11f5dJohn Spurlock} 94e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock 953b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlockbool NuPlayer::DecoderPassThrough::isStaleReply(const sp<AMessage> &msg) { 963b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock int32_t generation; 97856edebad73560e9b1cce021a7de9a0470d07176John Spurlock CHECK(msg->findInt32("generation", &generation)); 9825e2d24f24040e58a61169db797f760b16c11f5dJohn Spurlock return generation != mBufferGeneration; 99856edebad73560e9b1cce021a7de9a0470d07176John Spurlock} 100856edebad73560e9b1cce021a7de9a0470d07176John Spurlock 101856edebad73560e9b1cce021a7de9a0470d07176John Spurlockvoid NuPlayer::DecoderPassThrough::requestABuffer() { 102856edebad73560e9b1cce021a7de9a0470d07176John Spurlock if (mCachedBytes >= kMaxCachedBytes || mReachedEOS) { 103856edebad73560e9b1cce021a7de9a0470d07176John Spurlock ALOGV("[%s] mReachedEOS=%d, max pending buffers(%d:%d)", 104e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock mComponentName.c_str(), (mReachedEOS ? 1 : 0), 105e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock mPendingBuffers, kMaxPendingBuffers); 106b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock return; 107b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock } 108b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock 109530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock sp<AMessage> reply = new AMessage(kWhatInputBufferFilled, id()); 110e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock reply->setInt32("generation", mBufferGeneration); 111e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock 112e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock sp<AMessage> notify = mNotify->dup(); 1137340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock notify->setInt32("what", kWhatFillThisBuffer); 1147340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock notify->setMessage("reply", reply); 1157340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock notify->post(); 1167340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock mPendingBuffers++; 1177340fc8665ae3f9f1978f42aa0e5e1da85036158John Spurlock 11851017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren sp<AMessage> message = new AMessage(kWhatRequestABuffer, id()); 11951017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren message->setInt32("generation", mBufferGeneration); 12051017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren message->post(); 12151017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren return; 12251017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren} 123856edebad73560e9b1cce021a7de9a0470d07176John Spurlock 124856edebad73560e9b1cce021a7de9a0470d07176John Spurlockvoid android::NuPlayer::DecoderPassThrough::onInputBufferFilled( 1252f096ed7662f9d20876ae2944ffc4ecf4fd51faaJohn Spurlock const sp<AMessage> &msg) { 1262f096ed7662f9d20876ae2944ffc4ecf4fd51faaJohn Spurlock if (mReachedEOS) { 1272f096ed7662f9d20876ae2944ffc4ecf4fd51faaJohn Spurlock return; 128b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock } 129b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock 130530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock sp<ABuffer> buffer; 13137bc92cc2332eb6f864977381135c19d6a081a92John Spurlock msg->findBuffer("buffer", &buffer); 13237bc92cc2332eb6f864977381135c19d6a081a92John Spurlock if (buffer == NULL) { 13337bc92cc2332eb6f864977381135c19d6a081a92John Spurlock mReachedEOS = true; 1341b8b22b1a412539020f78a132cff7c8fa7fae258John Spurlock 1351b8b22b1a412539020f78a132cff7c8fa7fae258John Spurlock sp<AMessage> notify = mNotify->dup(); 136b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock notify->setInt32("what", kWhatEOS); 137b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock notify->setInt32("err", ERROR_END_OF_STREAM); 138530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock notify->post(); 139856edebad73560e9b1cce021a7de9a0470d07176John Spurlock return; 140856edebad73560e9b1cce021a7de9a0470d07176John Spurlock } 141856edebad73560e9b1cce021a7de9a0470d07176John Spurlock 1423b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock mCachedBytes += buffer->size(); 1433b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock 144e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock sp<AMessage> reply = new AMessage(kWhatBufferConsumed, id()); 145e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock reply->setInt32("generation", mBufferGeneration); 146e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock reply->setInt32("size", buffer->size()); 147e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock 148e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock sp<AMessage> notify = mNotify->dup(); 14939581cc16d3c44acc8f0881d8e63afe53acaa1c1John Spurlock notify->setInt32("what", kWhatDrainThisBuffer); 15039581cc16d3c44acc8f0881d8e63afe53acaa1c1John Spurlock notify->setBuffer("buffer", buffer); 15139581cc16d3c44acc8f0881d8e63afe53acaa1c1John Spurlock notify->setMessage("reply", reply); 152e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock notify->post(); 153e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock} 154e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock 155e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlockvoid NuPlayer::DecoderPassThrough::onBufferConsumed(int32_t size) { 156e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock mPendingBuffers--; 1573b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock mCachedBytes -= size; 1583b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock sp<AMessage> message = new AMessage(kWhatRequestABuffer, id()); 1593b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock message->setInt32("generation", mBufferGeneration); 1603b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock message->post(); 161e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock} 162e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock 163e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlockvoid NuPlayer::DecoderPassThrough::onFlush() { 164e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock ++mBufferGeneration; 165e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock 166e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock sp<AMessage> notify = mNotify->dup(); 167e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock notify->setInt32("what", kWhatFlushCompleted); 168e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock notify->post(); 169e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock mPendingBuffers = 0; 1701d6d16d6995099afa506ecac38019a5bb8eacd86Julia Reynolds mCachedBytes = 0; 1713b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock mReachedEOS = false; 1723b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock} 1733b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock 1743b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlockvoid NuPlayer::DecoderPassThrough::onShutdown() { 1753b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock ++mBufferGeneration; 1763b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock 1773b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock sp<AMessage> notify = mNotify->dup(); 1783b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock notify->setInt32("what", kWhatShutdownCompleted); 1793b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock notify->post(); 1803b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock mReachedEOS = true; 1813b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock} 1823b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock 1833b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlockvoid NuPlayer::DecoderPassThrough::onMessageReceived(const sp<AMessage> &msg) { 1843b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock ALOGV("[%s] onMessage: %s", mComponentName.c_str(), 1853b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock msg->debugString().c_str()); 1863b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock 1873b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock switch (msg->what()) { 1883b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock case kWhatConfigure: 1893b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock { 1903b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock sp<AMessage> format; 191b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock CHECK(msg->findMessage("format", &format)); 192b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock onConfigure(format); 1933b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock break; 1943b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock } 1953b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock 1963b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock case kWhatRequestABuffer: 1973b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock { 1983b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock if (!isStaleReply(msg)) { 1993b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock requestABuffer(); 200b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock } 201b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock 202b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock break; 203b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock } 204b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock 205b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock case kWhatInputBufferFilled: 2063b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock { 2073b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock if (!isStaleReply(msg)) { 208e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock onInputBufferFilled(msg); 209e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock } 210e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock break; 211e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock } 2121d6d16d6995099afa506ecac38019a5bb8eacd86Julia Reynolds 213e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock case kWhatBufferConsumed: 214e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock { 2153b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock if (!isStaleReply(msg)) { 2163b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock int32_t size; 217b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock CHECK(msg->findInt32("size", &size)); 2183b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock onBufferConsumed(size); 2193b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock } 2200f50e4ebabc39f38e90c7d6e7261043b9852dd51Julia Reynolds break; 2210f50e4ebabc39f38e90c7d6e7261043b9852dd51Julia Reynolds } 2220f50e4ebabc39f38e90c7d6e7261043b9852dd51Julia Reynolds 2230f50e4ebabc39f38e90c7d6e7261043b9852dd51Julia Reynolds case kWhatFlush: 2240f50e4ebabc39f38e90c7d6e7261043b9852dd51Julia Reynolds { 2250f50e4ebabc39f38e90c7d6e7261043b9852dd51Julia Reynolds onFlush(); 2260f50e4ebabc39f38e90c7d6e7261043b9852dd51Julia Reynolds break; 227e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock } 228e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock 229e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock case kWhatResume: 230e77bb36d48b6b8b5c3bb6a1195aca469bb237919John Spurlock { 23139581cc16d3c44acc8f0881d8e63afe53acaa1c1John Spurlock requestABuffer(); 23239581cc16d3c44acc8f0881d8e63afe53acaa1c1John Spurlock break; 23339581cc16d3c44acc8f0881d8e63afe53acaa1c1John Spurlock } 23439581cc16d3c44acc8f0881d8e63afe53acaa1c1John Spurlock 23539581cc16d3c44acc8f0881d8e63afe53acaa1c1John Spurlock case kWhatShutdown: 23639581cc16d3c44acc8f0881d8e63afe53acaa1c1John Spurlock { 23739581cc16d3c44acc8f0881d8e63afe53acaa1c1John Spurlock onShutdown(); 23839581cc16d3c44acc8f0881d8e63afe53acaa1c1John Spurlock break; 23939581cc16d3c44acc8f0881d8e63afe53acaa1c1John Spurlock } 24039581cc16d3c44acc8f0881d8e63afe53acaa1c1John Spurlock 24121258a3703fe16b7c4754aec743215f3063bcdacJohn Spurlock default: 24221258a3703fe16b7c4754aec743215f3063bcdacJohn Spurlock TRESPASS(); 24321258a3703fe16b7c4754aec743215f3063bcdacJohn Spurlock break; 24421258a3703fe16b7c4754aec743215f3063bcdacJohn Spurlock } 24521258a3703fe16b7c4754aec743215f3063bcdacJohn Spurlock} 24621258a3703fe16b7c4754aec743215f3063bcdacJohn Spurlock 24721258a3703fe16b7c4754aec743215f3063bcdacJohn Spurlock} // namespace android 24821258a3703fe16b7c4754aec743215f3063bcdacJohn Spurlock