NuPlayerDecoderPassThrough.cpp revision b6f9a21e7036e5619216faae902f005374bd8cad
14a10645c70199c8d8567fbc46312158c419720abChris Lattner/*
23da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman * Copyright (C) 2014 The Android Open Source Project
37c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell *
47c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell * Licensed under the Apache License, Version 2.0 (the "License");
521c62da287237d39d0d95004881ea4baae3be6daChris Lattner * you may not use this file except in compliance with the License.
621c62da287237d39d0d95004881ea4baae3be6daChris Lattner * You may obtain a copy of the License at
73da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman *
87c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell *      http://www.apache.org/licenses/LICENSE-2.0
94a10645c70199c8d8567fbc46312158c419720abChris Lattner *
104a10645c70199c8d8567fbc46312158c419720abChris Lattner * Unless required by applicable law or agreed to in writing, software
118ff70c2635bfd4e02c0140a5dc9ca909fffba35aGabor Greif * distributed under the License is distributed on an "AS IS" BASIS,
124a10645c70199c8d8567fbc46312158c419720abChris Lattner * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134a10645c70199c8d8567fbc46312158c419720abChris Lattner * See the License for the specific language governing permissions and
144a10645c70199c8d8567fbc46312158c419720abChris Lattner * limitations under the License.
154a10645c70199c8d8567fbc46312158c419720abChris Lattner */
16f1b20d8620b05abaa52f40ac6d21f839b265fb00Chris Lattner
17551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer//#define LOG_NDEBUG 0
18551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#define LOG_TAG "NuPlayerDecoderPassThrough"
19551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include <utils/Log.h>
20551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include <inttypes.h>
2174382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner
224a10645c70199c8d8567fbc46312158c419720abChris Lattner#include "NuPlayerDecoderPassThrough.h"
2351ab5c8862466bbddcd5c4369779c472978ed309Reid Spencer
24d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke#include <media/ICrypto.h>
25d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke#include <media/stagefright/foundation/ABuffer.h>
264a10645c70199c8d8567fbc46312158c419720abChris Lattner#include <media/stagefright/foundation/ADebug.h>
274a10645c70199c8d8567fbc46312158c419720abChris Lattner#include <media/stagefright/foundation/AMessage.h>
284a10645c70199c8d8567fbc46312158c419720abChris Lattner#include <media/stagefright/MediaDefs.h>
294a10645c70199c8d8567fbc46312158c419720abChris Lattner#include <media/stagefright/MediaErrors.h>
304a10645c70199c8d8567fbc46312158c419720abChris Lattner
31a443e5b1f1013612950fc3c9ebfafca60a1c20dfEric Christophernamespace android {
324a10645c70199c8d8567fbc46312158c419720abChris Lattner
334148556a9c767fdf3047ae8e004a759356b893ddMisha Brukmanstatic const int kMaxPendingBuffers = 10;
34a328c51bb99666ee0c045a57ea6d6ce2b0198f9bChris Lattnerstatic const int kMaxCachedBytes = 200000;
35a328c51bb99666ee0c045a57ea6d6ce2b0198f9bChris Lattner
36a328c51bb99666ee0c045a57ea6d6ce2b0198f9bChris LattnerNuPlayer::DecoderPassThrough::DecoderPassThrough(
37a328c51bb99666ee0c045a57ea6d6ce2b0198f9bChris Lattner        const sp<AMessage> &notify)
38a328c51bb99666ee0c045a57ea6d6ce2b0198f9bChris Lattner    : Decoder(notify),
39a328c51bb99666ee0c045a57ea6d6ce2b0198f9bChris Lattner      mNotify(notify),
40a328c51bb99666ee0c045a57ea6d6ce2b0198f9bChris Lattner      mBufferGeneration(0),
414a10645c70199c8d8567fbc46312158c419720abChris Lattner      mReachedEOS(true),
4270ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman      mPendingBuffers(0),
43b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke      mCachedBytes(0),
44b687d82b029ba448b978e2c9ed424ee5d1f9f093Misha Brukman      mComponentName("pass through decoder") {
45b687d82b029ba448b978e2c9ed424ee5d1f9f093Misha Brukman    mDecoderLooper = new ALooper;
465073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman    mDecoderLooper->setName("NuPlayerDecoderPassThrough");
475073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman    mDecoderLooper->start(false, false, ANDROID_PRIORITY_AUDIO);
4850010429a7c3285dab15ede68acae7231fade367Chris Lattner}
4950010429a7c3285dab15ede68acae7231fade367Chris Lattner
50cd6f46e2ac4c1d64067237c0b28eccfae22bd9f4Chris LattnerNuPlayer::DecoderPassThrough::~DecoderPassThrough() {
51f73311bb646bf970806ba7caba220e6bffff7b49Andrew Trick}
52f73311bb646bf970806ba7caba220e6bffff7b49Andrew Trick
53f73311bb646bf970806ba7caba220e6bffff7b49Andrew Trickvoid NuPlayer::DecoderPassThrough::configure(const sp<AMessage> &format) {
549ef7425a4d44ff129495da2357c98c67162fbeffAnton Korobeynikov    sp<AMessage> msg = new AMessage(kWhatConfigure, id());
559ef7425a4d44ff129495da2357c98c67162fbeffAnton Korobeynikov    msg->setMessage("format", format);
569ef7425a4d44ff129495da2357c98c67162fbeffAnton Korobeynikov    msg->post();
574d143ee01988e1b52e106ffccbb313937ca5e886Chris Lattner}
58b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke
593c053a0a98e19f5ac8905011ad4c8238b08d6aeaChris Lattnervoid NuPlayer::DecoderPassThrough::init() {
6070ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman    mDecoderLooper->registerHandler(this);
6170ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman}
6249419e28fe400509363cecf63a3a824002c1d9e0Evan Cheng
6349419e28fe400509363cecf63a3a824002c1d9e0Evan Chengvoid NuPlayer::DecoderPassThrough::signalFlush() {
6449419e28fe400509363cecf63a3a824002c1d9e0Evan Cheng    (new AMessage(kWhatFlush, id()))->post();
6549419e28fe400509363cecf63a3a824002c1d9e0Evan Cheng}
6649419e28fe400509363cecf63a3a824002c1d9e0Evan Cheng
6749419e28fe400509363cecf63a3a824002c1d9e0Evan Chengvoid NuPlayer::DecoderPassThrough::signalResume() {
6870ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman    (new AMessage(kWhatResume, id()))->post();
6970ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman}
7070ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman
7170ef449741da8b1ef035e04a55958652a0200ba1Dan Gohmanvoid NuPlayer::DecoderPassThrough::initiateShutdown() {
7249419e28fe400509363cecf63a3a824002c1d9e0Evan Cheng    (new AMessage(kWhatShutdown, id()))->post();
7349419e28fe400509363cecf63a3a824002c1d9e0Evan Cheng}
7470ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman
75c5cad211d6ec50fe90a0a716dee701c6c4721385Brian Gaekebool NuPlayer::DecoderPassThrough::supportsSeamlessFormatChange(
765e1452c856a8bcf39ab7a67a5af946c8162f942dReid Spencer        const sp<AMessage> & /* targetFormat */) const {
775e1452c856a8bcf39ab7a67a5af946c8162f942dReid Spencer    return true;
785e1452c856a8bcf39ab7a67a5af946c8162f942dReid Spencer}
795e1452c856a8bcf39ab7a67a5af946c8162f942dReid Spencer
803c053a0a98e19f5ac8905011ad4c8238b08d6aeaChris Lattnervoid NuPlayer::DecoderPassThrough::onConfigure(const sp<AMessage> &format) {
813c053a0a98e19f5ac8905011ad4c8238b08d6aeaChris Lattner    ALOGV("[%s] onConfigure", mComponentName.c_str());
823c053a0a98e19f5ac8905011ad4c8238b08d6aeaChris Lattner    mPendingBuffers = 0;
837dac658792425c10274594782d6fcf10208a16f0Chris Lattner    mCachedBytes = 0;
847dac658792425c10274594782d6fcf10208a16f0Chris Lattner    mReachedEOS = false;
857dac658792425c10274594782d6fcf10208a16f0Chris Lattner    ++mBufferGeneration;
867dac658792425c10274594782d6fcf10208a16f0Chris Lattner
877dac658792425c10274594782d6fcf10208a16f0Chris Lattner    requestABuffer();
887d91e49ff7bcc0fd10a54d45a6185bb05adf3d20Chris Lattner
8951ab5c8862466bbddcd5c4369779c472978ed309Reid Spencer    sp<AMessage> notify = mNotify->dup();
90de86cbdc57f30621d3692da7a36613bb623d13b5Andrew Trick    notify->setInt32("what", kWhatOutputFormatChanged);
9151ab5c8862466bbddcd5c4369779c472978ed309Reid Spencer    notify->setMessage("format", format);
929ef7425a4d44ff129495da2357c98c67162fbeffAnton Korobeynikov    notify->post();
939ef7425a4d44ff129495da2357c98c67162fbeffAnton Korobeynikov}
94f73311bb646bf970806ba7caba220e6bffff7b49Andrew Trick
95f73311bb646bf970806ba7caba220e6bffff7b49Andrew Trickbool NuPlayer::DecoderPassThrough::isStaleReply(const sp<AMessage> &msg) {
96f73311bb646bf970806ba7caba220e6bffff7b49Andrew Trick    int32_t generation;
97f73311bb646bf970806ba7caba220e6bffff7b49Andrew Trick    CHECK(msg->findInt32("generation", &generation));
98f73311bb646bf970806ba7caba220e6bffff7b49Andrew Trick    return generation != mBufferGeneration;
999ef7425a4d44ff129495da2357c98c67162fbeffAnton Korobeynikov}
1009ef7425a4d44ff129495da2357c98c67162fbeffAnton Korobeynikov
1019ef7425a4d44ff129495da2357c98c67162fbeffAnton Korobeynikovvoid NuPlayer::DecoderPassThrough::requestABuffer() {
1024a10645c70199c8d8567fbc46312158c419720abChris Lattner    if (mCachedBytes >= kMaxCachedBytes || mReachedEOS) {
1034a10645c70199c8d8567fbc46312158c419720abChris Lattner        ALOGV("[%s] mReachedEOS=%d, max pending buffers(%d:%d)",
104d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke                mComponentName.c_str(), (mReachedEOS ? 1 : 0),
105fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner                mPendingBuffers, kMaxPendingBuffers);
106fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner        return;
107fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner    }
108fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner
10960083e2fc0f1165b7511757449f1ee3852b7229cChris Lattner    sp<AMessage> reply = new AMessage(kWhatInputBufferFilled, id());
11068ccdaa84909108c42417a8091c771598e26456eDaniel Dunbar    reply->setInt32("generation", mBufferGeneration);
11168ccdaa84909108c42417a8091c771598e26456eDaniel Dunbar
11268ccdaa84909108c42417a8091c771598e26456eDaniel Dunbar    sp<AMessage> notify = mNotify->dup();
11368ccdaa84909108c42417a8091c771598e26456eDaniel Dunbar    notify->setInt32("what", kWhatFillThisBuffer);
11470ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman    notify->setMessage("reply", reply);
115636df3d7ec51a8c6fd759a98853ff709ae54d64eBrian Gaeke    notify->post();
11670ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman    mPendingBuffers++;
117636df3d7ec51a8c6fd759a98853ff709ae54d64eBrian Gaeke
118636df3d7ec51a8c6fd759a98853ff709ae54d64eBrian Gaeke    // pending buffers will already result in requestABuffer
11960083e2fc0f1165b7511757449f1ee3852b7229cChris Lattner    if (mPendingBuffers < kMaxPendingBuffers) {
12070ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman        sp<AMessage> message = new AMessage(kWhatRequestABuffer, id());
12170ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman        message->setInt32("generation", mBufferGeneration);
12270ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman        message->post();
12370ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman    }
12470ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman    return;
12538efa38c864f6d29892d92102c0232b234b526edBill Wendling}
126faa95763ebb081769bf6ac35e170394c9d477813Kalle Raiskila
127de86cbdc57f30621d3692da7a36613bb623d13b5Andrew Trickvoid android::NuPlayer::DecoderPassThrough::onInputBufferFilled(
128faa95763ebb081769bf6ac35e170394c9d477813Kalle Raiskila        const sp<AMessage> &msg) {
129faa95763ebb081769bf6ac35e170394c9d477813Kalle Raiskila    if (mReachedEOS) {
13038efa38c864f6d29892d92102c0232b234b526edBill Wendling        return;
13138efa38c864f6d29892d92102c0232b234b526edBill Wendling    }
13238efa38c864f6d29892d92102c0232b234b526edBill Wendling
13338efa38c864f6d29892d92102c0232b234b526edBill Wendling    sp<ABuffer> buffer;
134fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner    msg->findBuffer("buffer", &buffer);
1359d679cbc6cb5c7dc8cca87a1e1548c480fb056b8Misha Brukman    if (buffer == NULL) {
1364a10645c70199c8d8567fbc46312158c419720abChris Lattner        mReachedEOS = true;
1374a10645c70199c8d8567fbc46312158c419720abChris Lattner
1384a10645c70199c8d8567fbc46312158c419720abChris Lattner        sp<AMessage> notify = mNotify->dup();
1394a10645c70199c8d8567fbc46312158c419720abChris Lattner        notify->setInt32("what", kWhatEOS);
1404a10645c70199c8d8567fbc46312158c419720abChris Lattner        notify->setInt32("err", ERROR_END_OF_STREAM);
1414a10645c70199c8d8567fbc46312158c419720abChris Lattner        notify->post();
1424a10645c70199c8d8567fbc46312158c419720abChris Lattner        return;
1434a10645c70199c8d8567fbc46312158c419720abChris Lattner    }
144ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman
1454a10645c70199c8d8567fbc46312158c419720abChris Lattner    mCachedBytes += buffer->size();
1464148556a9c767fdf3047ae8e004a759356b893ddMisha Brukman
1474148556a9c767fdf3047ae8e004a759356b893ddMisha Brukman    sp<AMessage> reply = new AMessage(kWhatBufferConsumed, id());
14870ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman    reply->setInt32("generation", mBufferGeneration);
1494a10645c70199c8d8567fbc46312158c419720abChris Lattner    reply->setInt32("size", buffer->size());
150636df3d7ec51a8c6fd759a98853ff709ae54d64eBrian Gaeke
151cc876a7421f6dbcca98446058d5f0637092c6e1aChris Lattner    sp<AMessage> notify = mNotify->dup();
152b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke    notify->setInt32("what", kWhatDrainThisBuffer);
153b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke    notify->setBuffer("buffer", buffer);
154b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke    notify->setMessage("reply", reply);
155636df3d7ec51a8c6fd759a98853ff709ae54d64eBrian Gaeke    notify->post();
156636df3d7ec51a8c6fd759a98853ff709ae54d64eBrian Gaeke}
157b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke
158b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaekevoid NuPlayer::DecoderPassThrough::onBufferConsumed(int32_t size) {
159b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke    mPendingBuffers--;
160636df3d7ec51a8c6fd759a98853ff709ae54d64eBrian Gaeke    mCachedBytes -= size;
161de86cbdc57f30621d3692da7a36613bb623d13b5Andrew Trick    requestABuffer();
162faa95763ebb081769bf6ac35e170394c9d477813Kalle Raiskila}
163b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke
164b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaekevoid NuPlayer::DecoderPassThrough::onFlush() {
165b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke    ++mBufferGeneration;
166636df3d7ec51a8c6fd759a98853ff709ae54d64eBrian Gaeke
167636df3d7ec51a8c6fd759a98853ff709ae54d64eBrian Gaeke    sp<AMessage> notify = mNotify->dup();
168b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke    notify->setInt32("what", kWhatFlushCompleted);
169b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke    notify->post();
170b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke    mPendingBuffers = 0;
171b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke    mCachedBytes = 0;
172b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke    mReachedEOS = false;
173b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke}
174769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner
175636df3d7ec51a8c6fd759a98853ff709ae54d64eBrian Gaekevoid NuPlayer::DecoderPassThrough::onShutdown() {
176636df3d7ec51a8c6fd759a98853ff709ae54d64eBrian Gaeke    ++mBufferGeneration;
177769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner
178769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner    sp<AMessage> notify = mNotify->dup();
17950010429a7c3285dab15ede68acae7231fade367Chris Lattner    notify->setInt32("what", kWhatShutdownCompleted);
18070ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman    notify->post();
181636df3d7ec51a8c6fd759a98853ff709ae54d64eBrian Gaeke    mReachedEOS = true;
182de86cbdc57f30621d3692da7a36613bb623d13b5Andrew Trick}
183faa95763ebb081769bf6ac35e170394c9d477813Kalle Raiskila
18450010429a7c3285dab15ede68acae7231fade367Chris Lattnervoid NuPlayer::DecoderPassThrough::onMessageReceived(const sp<AMessage> &msg) {
185769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner    ALOGV("[%s] onMessage: %s", mComponentName.c_str(),
186769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner            msg->debugString().c_str());
187636df3d7ec51a8c6fd759a98853ff709ae54d64eBrian Gaeke
188636df3d7ec51a8c6fd759a98853ff709ae54d64eBrian Gaeke    switch (msg->what()) {
189769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner        case kWhatConfigure:
190f73311bb646bf970806ba7caba220e6bffff7b49Andrew Trick        {
191f73311bb646bf970806ba7caba220e6bffff7b49Andrew Trick            sp<AMessage> format;
192f73311bb646bf970806ba7caba220e6bffff7b49Andrew Trick            CHECK(msg->findMessage("format", &format));
193f73311bb646bf970806ba7caba220e6bffff7b49Andrew Trick            onConfigure(format);
1949ef7425a4d44ff129495da2357c98c67162fbeffAnton Korobeynikov            break;
195f73311bb646bf970806ba7caba220e6bffff7b49Andrew Trick        }
196f73311bb646bf970806ba7caba220e6bffff7b49Andrew Trick
1979ef7425a4d44ff129495da2357c98c67162fbeffAnton Korobeynikov        case kWhatRequestABuffer:
1984a10645c70199c8d8567fbc46312158c419720abChris Lattner        {
199ad6996d74f60340d6139af8f345d93735661fbbaMatthijs Kooijman            if (!isStaleReply(msg)) {
20065f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman                requestABuffer();
201ad6996d74f60340d6139af8f345d93735661fbbaMatthijs Kooijman            }
202ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman
2034a10645c70199c8d8567fbc46312158c419720abChris Lattner            break;
20470ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman        }
20570ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman
20670ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman        case kWhatInputBufferFilled:
20770ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman        {
20870ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman            if (!isStaleReply(msg)) {
20970ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman                onInputBufferFilled(msg);
21070ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman            }
21170ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman            break;
21270ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman        }
21370ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman
21470ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman        case kWhatBufferConsumed:
215197f728d49fa0cc0baa5aadb2b905fbd8c22a81eDan Gohman        {
216de86cbdc57f30621d3692da7a36613bb623d13b5Andrew Trick            if (!isStaleReply(msg)) {
21738efa38c864f6d29892d92102c0232b234b526edBill Wendling                int32_t size;
21838efa38c864f6d29892d92102c0232b234b526edBill Wendling                CHECK(msg->findInt32("size", &size));
21970ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman                onBufferConsumed(size);
22070ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman            }
22170ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman            break;
22270ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman        }
22370ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman
22470ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman        case kWhatFlush:
22570ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman        {
226197f728d49fa0cc0baa5aadb2b905fbd8c22a81eDan Gohman            onFlush();
227de86cbdc57f30621d3692da7a36613bb623d13b5Andrew Trick            break;
22838efa38c864f6d29892d92102c0232b234b526edBill Wendling        }
22938efa38c864f6d29892d92102c0232b234b526edBill Wendling
23070ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman        case kWhatResume:
23170ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman        {
23270ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman            requestABuffer();
233ed7fcf4fd93b16bfa698451862355fdd17239736Saleem Abdulrasool            break;
23470ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman        }
23570ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman
23670ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman        case kWhatShutdown:
23750010429a7c3285dab15ede68acae7231fade367Chris Lattner        {
23870ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman            onShutdown();
239197f728d49fa0cc0baa5aadb2b905fbd8c22a81eDan Gohman            break;
240faa95763ebb081769bf6ac35e170394c9d477813Kalle Raiskila        }
24150010429a7c3285dab15ede68acae7231fade367Chris Lattner
24250010429a7c3285dab15ede68acae7231fade367Chris Lattner        default:
24370ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman            TRESPASS();
24470ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman            break;
245f73311bb646bf970806ba7caba220e6bffff7b49Andrew Trick    }
246f73311bb646bf970806ba7caba220e6bffff7b49Andrew Trick}
24770ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman
24870ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman}  // namespace android
24970ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman