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