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> &notify)
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