NuPlayerDecoderPassThrough.cpp revision bc2fb720bbd0acd122bacc67e844e982d068f6f9
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
33bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiastatic const int kMaxPendingBuffers = 10;
34bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
35bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei JiaNuPlayer::DecoderPassThrough::DecoderPassThrough(
36bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        const sp<AMessage> &notify)
37bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    : Decoder(notify),
38bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia      mNotify(notify),
39bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia      mBufferGeneration(0),
40bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia      mReachedEOS(true),
41bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia      mPendingBuffers(0),
42bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia      mComponentName("pass through decoder") {
43bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    mDecoderLooper = new ALooper;
44bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    mDecoderLooper->setName("NuPlayerDecoderPassThrough");
45bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    mDecoderLooper->start(false, false, ANDROID_PRIORITY_AUDIO);
46bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia}
47bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
48bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei JiaNuPlayer::DecoderPassThrough::~DecoderPassThrough() {
49bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia}
50bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
51bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiavoid NuPlayer::DecoderPassThrough::configure(const sp<AMessage> &format) {
52bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    sp<AMessage> msg = new AMessage(kWhatConfigure, id());
53bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    msg->setMessage("format", format);
54bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    msg->post();
55bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia}
56bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
57bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiavoid NuPlayer::DecoderPassThrough::init() {
58bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    mDecoderLooper->registerHandler(this);
59bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia}
60bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
61bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiavoid NuPlayer::DecoderPassThrough::signalFlush() {
62bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    (new AMessage(kWhatFlush, id()))->post();
63bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia}
64bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
65bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiavoid NuPlayer::DecoderPassThrough::signalResume() {
66bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    (new AMessage(kWhatResume, id()))->post();
67bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia}
68bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
69bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiavoid NuPlayer::DecoderPassThrough::initiateShutdown() {
70bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    (new AMessage(kWhatShutdown, id()))->post();
71bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia}
72bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
73bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiabool NuPlayer::DecoderPassThrough::supportsSeamlessFormatChange(
74bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        const sp<AMessage> & /* targetFormat */) const {
75bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    return true;
76bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia}
77bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
78bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiavoid NuPlayer::DecoderPassThrough::onConfigure(const sp<AMessage> &format) {
79bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    ALOGV("[%s] onConfigure", mComponentName.c_str());
80bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    mPendingBuffers = 0;
81bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    mReachedEOS = false;
82bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    ++mBufferGeneration;
83bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
84bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    requestABuffer();
85bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
86bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    sp<AMessage> notify = mNotify->dup();
87bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    notify->setInt32("what", kWhatOutputFormatChanged);
88bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    notify->setMessage("format", format);
89bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    notify->post();
90bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia}
91bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
92bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiabool NuPlayer::DecoderPassThrough::isStaleReply(const sp<AMessage> &msg) {
93bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    int32_t generation;
94bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    CHECK(msg->findInt32("generation", &generation));
95bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    return generation != mBufferGeneration;
96bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia}
97bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
98bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiavoid NuPlayer::DecoderPassThrough::requestABuffer() {
99bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    if (mPendingBuffers >= kMaxPendingBuffers || mReachedEOS) {
100bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        ALOGV("[%s] mReachedEOS=%d, max pending buffers(%d:%d)",
101bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia                mComponentName.c_str(), (mReachedEOS ? 1 : 0),
102bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia                mPendingBuffers, kMaxPendingBuffers);
103bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        return;
104bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    }
105bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
106bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    sp<AMessage> reply = new AMessage(kWhatInputBufferFilled, id());
107bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    reply->setInt32("generation", mBufferGeneration);
108bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
109bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    sp<AMessage> notify = mNotify->dup();
110bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    notify->setInt32("what", kWhatFillThisBuffer);
111bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    notify->setMessage("reply", reply);
112bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    notify->post();
113bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    mPendingBuffers++;
114bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
115bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    sp<AMessage> message = new AMessage(kWhatRequestABuffer, id());
116bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    message->setInt32("generation", mBufferGeneration);
117bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    message->post();
118bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    return;
119bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia}
120bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
121bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiavoid android::NuPlayer::DecoderPassThrough::onInputBufferFilled(
122bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        const sp<AMessage> &msg) {
123bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    if (mReachedEOS) {
124bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        return;
125bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    }
126bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
127bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    sp<ABuffer> buffer;
128bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    msg->findBuffer("buffer", &buffer);
129bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    if (buffer == NULL) {
130bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        mReachedEOS = true;
131bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
132bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        sp<AMessage> notify = mNotify->dup();
133bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        notify->setInt32("what", kWhatEOS);
134bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        notify->setInt32("err", ERROR_END_OF_STREAM);
135bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        notify->post();
136bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        return;
137bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    }
138bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
139bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    sp<AMessage> reply = new AMessage(kWhatBufferConsumed, id());
140bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    reply->setInt32("generation", mBufferGeneration);
141bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
142bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    sp<AMessage> notify = mNotify->dup();
143bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    notify->setInt32("what", kWhatDrainThisBuffer);
144bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    notify->setBuffer("buffer", buffer);
145bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    notify->setMessage("reply", reply);
146bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    notify->post();
147bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia}
148bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
149bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiavoid NuPlayer::DecoderPassThrough::onBufferConsumed() {
150bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    mPendingBuffers--;
151bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    sp<AMessage> message = new AMessage(kWhatRequestABuffer, id());
152bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    message->setInt32("generation", mBufferGeneration);
153bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    message->post();
154bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia}
155bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
156bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiavoid NuPlayer::DecoderPassThrough::onFlush() {
157bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    ++mBufferGeneration;
158bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
159bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    sp<AMessage> notify = mNotify->dup();
160bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    notify->setInt32("what", kWhatFlushCompleted);
161bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    notify->post();
162bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    mPendingBuffers = 0;
163bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    mReachedEOS = false;
164bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia}
165bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
166bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiavoid NuPlayer::DecoderPassThrough::onShutdown() {
167bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    ++mBufferGeneration;
168bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
169bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    sp<AMessage> notify = mNotify->dup();
170bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    notify->setInt32("what", kWhatShutdownCompleted);
171bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    notify->post();
172bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    mReachedEOS = true;
173bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia}
174bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
175bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jiavoid NuPlayer::DecoderPassThrough::onMessageReceived(const sp<AMessage> &msg) {
176bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    ALOGV("[%s] onMessage: %s", mComponentName.c_str(),
177bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia            msg->debugString().c_str());
178bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
179bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    switch (msg->what()) {
180bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        case kWhatConfigure:
181bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        {
182bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia            sp<AMessage> format;
183bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia            CHECK(msg->findMessage("format", &format));
184bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia            onConfigure(format);
185bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia            break;
186bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        }
187bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
188bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        case kWhatRequestABuffer:
189bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        {
190bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia            if (!isStaleReply(msg)) {
191bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia                requestABuffer();
192bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia            }
193bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
194bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia            break;
195bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        }
196bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
197bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        case kWhatInputBufferFilled:
198bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        {
199bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia            if (!isStaleReply(msg)) {
200bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia                onInputBufferFilled(msg);
201bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia            }
202bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia            break;
203bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        }
204bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
205bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        case kWhatBufferConsumed:
206bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        {
207bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia            if (!isStaleReply(msg)) {
208bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia                onBufferConsumed();
209bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia            }
210bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia            break;
211bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        }
212bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
213bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        case kWhatFlush:
214bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        {
215bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia            onFlush();
216bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia            break;
217bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        }
218bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
219bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        case kWhatResume:
220bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        {
221bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia            requestABuffer();
222bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia            break;
223bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        }
224bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
225bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        case kWhatShutdown:
226bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        {
227bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia            onShutdown();
228bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia            break;
229bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        }
230bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
231bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia        default:
232bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia            TRESPASS();
233bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia            break;
234bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    }
235bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia}
236bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia
237bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia}  // namespace android
238