17137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang/*
27137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang * Copyright (C) 2010 The Android Open Source Project
37137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang *
47137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang * Licensed under the Apache License, Version 2.0 (the "License");
57137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang * you may not use this file except in compliance with the License.
67137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang * You may obtain a copy of the License at
77137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang *
87137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang *      http://www.apache.org/licenses/LICENSE-2.0
97137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang *
107137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang * Unless required by applicable law or agreed to in writing, software
117137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang * distributed under the License is distributed on an "AS IS" BASIS,
127137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang * See the License for the specific language governing permissions and
147137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang * limitations under the License.
157137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang */
167137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
177137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang//#define LOG_NDEBUG 0
187137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang#define LOG_TAG "NuPlayerDecoderBase"
197137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang#include <utils/Log.h>
207137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang#include <inttypes.h>
217137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
227137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang#include "NuPlayerDecoderBase.h"
237137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
247137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang#include "NuPlayerRenderer.h"
257137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
267137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang#include <media/stagefright/foundation/ADebug.h>
277137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang#include <media/stagefright/foundation/AMessage.h>
287137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
297137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhangnamespace android {
307137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
31202bce11a7f66f27e6dbb6d154ddc123aa62513dAndy HungNuPlayer::DecoderBase::DecoderBase(const sp<AMessage> &notify)
32202bce11a7f66f27e6dbb6d154ddc123aa62513dAndy Hung    :  mNotify(notify),
33202bce11a7f66f27e6dbb6d154ddc123aa62513dAndy Hung       mBufferGeneration(0),
343bc667014875aba35102941b3997d242c303aa0dWei Jia       mPaused(false),
35e1e5d7a3d3d4d6d644e6c731f977422e004140d5Praveen Chavan       mStats(new AMessage),
36202bce11a7f66f27e6dbb6d154ddc123aa62513dAndy Hung       mRequestInputBuffersPending(false) {
377137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    // Every decoder has its own looper because MediaCodec operations
387137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    // are blocking, but NuPlayer needs asynchronous operations.
397137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    mDecoderLooper = new ALooper;
407137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    mDecoderLooper->setName("NPDecoder");
417137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    mDecoderLooper->start(false, false, ANDROID_PRIORITY_AUDIO);
427137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang}
437137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
447137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong ZhangNuPlayer::DecoderBase::~DecoderBase() {
457137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    mDecoderLooper->unregisterHandler(id());
467137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    mDecoderLooper->stop();
477137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang}
487137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
497137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhangstatic
507137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhangstatus_t PostAndAwaitResponse(
517137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang        const sp<AMessage> &msg, sp<AMessage> *response) {
527137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    status_t err = msg->postAndAwaitResponse(response);
537137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
547137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    if (err != OK) {
557137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang        return err;
567137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    }
577137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
587137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    if (!(*response)->findInt32("err", &err)) {
597137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang        err = OK;
607137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    }
617137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
627137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    return err;
637137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang}
647137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
657137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhangvoid NuPlayer::DecoderBase::configure(const sp<AMessage> &format) {
661d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar    sp<AMessage> msg = new AMessage(kWhatConfigure, this);
677137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    msg->setMessage("format", format);
687137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    msg->post();
697137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang}
707137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
717137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhangvoid NuPlayer::DecoderBase::init() {
727137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    mDecoderLooper->registerHandler(this);
737137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang}
747137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
758db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wuvoid NuPlayer::DecoderBase::setParameters(const sp<AMessage> &params) {
768db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu    sp<AMessage> msg = new AMessage(kWhatSetParameters, this);
778db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu    msg->setMessage("params", params);
788db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu    msg->post();
798db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu}
808db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu
817137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhangvoid NuPlayer::DecoderBase::setRenderer(const sp<Renderer> &renderer) {
821d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar    sp<AMessage> msg = new AMessage(kWhatSetRenderer, this);
837137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    msg->setObject("renderer", renderer);
847137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    msg->post();
857137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang}
867137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
873bc667014875aba35102941b3997d242c303aa0dWei Jiavoid NuPlayer::DecoderBase::pause() {
883bc667014875aba35102941b3997d242c303aa0dWei Jia    sp<AMessage> msg = new AMessage(kWhatPause, this);
893bc667014875aba35102941b3997d242c303aa0dWei Jia
903bc667014875aba35102941b3997d242c303aa0dWei Jia    sp<AMessage> response;
913bc667014875aba35102941b3997d242c303aa0dWei Jia    PostAndAwaitResponse(msg, &response);
923bc667014875aba35102941b3997d242c303aa0dWei Jia}
933bc667014875aba35102941b3997d242c303aa0dWei Jia
947137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhangstatus_t NuPlayer::DecoderBase::getInputBuffers(Vector<sp<ABuffer> > *buffers) const {
951d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar    sp<AMessage> msg = new AMessage(kWhatGetInputBuffers, this);
967137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    msg->setPointer("buffers", buffers);
977137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
987137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    sp<AMessage> response;
997137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    return PostAndAwaitResponse(msg, &response);
1007137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang}
1017137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
1027137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhangvoid NuPlayer::DecoderBase::signalFlush() {
1031d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar    (new AMessage(kWhatFlush, this))->post();
1047137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang}
1057137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
106f8d717772f6d185cb07720cd5091df9b7d612e0bChong Zhangvoid NuPlayer::DecoderBase::signalResume(bool notifyComplete) {
1071d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar    sp<AMessage> msg = new AMessage(kWhatResume, this);
108f8d717772f6d185cb07720cd5091df9b7d612e0bChong Zhang    msg->setInt32("notifyComplete", notifyComplete);
109f8d717772f6d185cb07720cd5091df9b7d612e0bChong Zhang    msg->post();
1107137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang}
1117137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
1127137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhangvoid NuPlayer::DecoderBase::initiateShutdown() {
1131d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar    (new AMessage(kWhatShutdown, this))->post();
1147137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang}
1157137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
1167137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhangvoid NuPlayer::DecoderBase::onRequestInputBuffers() {
1177137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    if (mRequestInputBuffersPending) {
1187137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang        return;
1197137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    }
1207137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
1213b032b3865fd93173aadca0591eeea32853206f9Chong Zhang    // doRequestBuffers() return true if we should request more data
1223b032b3865fd93173aadca0591eeea32853206f9Chong Zhang    if (doRequestBuffers()) {
1233b032b3865fd93173aadca0591eeea32853206f9Chong Zhang        mRequestInputBuffersPending = true;
1247137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
1253b032b3865fd93173aadca0591eeea32853206f9Chong Zhang        sp<AMessage> msg = new AMessage(kWhatRequestInputBuffers, this);
1263b032b3865fd93173aadca0591eeea32853206f9Chong Zhang        msg->post(10 * 1000ll);
1277137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    }
1287137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang}
1297137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
1307137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhangvoid NuPlayer::DecoderBase::onMessageReceived(const sp<AMessage> &msg) {
1317137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
1327137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    switch (msg->what()) {
1337137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang        case kWhatConfigure:
1347137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang        {
1357137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang            sp<AMessage> format;
1367137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang            CHECK(msg->findMessage("format", &format));
1377137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang            onConfigure(format);
1387137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang            break;
1397137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang        }
1407137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
1418db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu        case kWhatSetParameters:
1428db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu        {
1438db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu            sp<AMessage> params;
1448db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu            CHECK(msg->findMessage("params", &params));
1458db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu            onSetParameters(params);
1468db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu            break;
1478db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu        }
1488db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu
1497137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang        case kWhatSetRenderer:
1507137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang        {
1517137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang            sp<RefBase> obj;
1527137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang            CHECK(msg->findObject("renderer", &obj));
1537137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang            onSetRenderer(static_cast<Renderer *>(obj.get()));
1547137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang            break;
1557137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang        }
1567137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
1573bc667014875aba35102941b3997d242c303aa0dWei Jia        case kWhatPause:
1583bc667014875aba35102941b3997d242c303aa0dWei Jia        {
1593bc667014875aba35102941b3997d242c303aa0dWei Jia            sp<AReplyToken> replyID;
1603bc667014875aba35102941b3997d242c303aa0dWei Jia            CHECK(msg->senderAwaitsResponse(&replyID));
1613bc667014875aba35102941b3997d242c303aa0dWei Jia
1623bc667014875aba35102941b3997d242c303aa0dWei Jia            mPaused = true;
1633bc667014875aba35102941b3997d242c303aa0dWei Jia
1643bc667014875aba35102941b3997d242c303aa0dWei Jia            (new AMessage)->postReply(replyID);
1653bc667014875aba35102941b3997d242c303aa0dWei Jia            break;
1663bc667014875aba35102941b3997d242c303aa0dWei Jia        }
1673bc667014875aba35102941b3997d242c303aa0dWei Jia
1687137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang        case kWhatGetInputBuffers:
1697137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang        {
1703f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar            sp<AReplyToken> replyID;
1717137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang            CHECK(msg->senderAwaitsResponse(&replyID));
1727137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
1737137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang            Vector<sp<ABuffer> > *dstBuffers;
1747137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang            CHECK(msg->findPointer("buffers", (void **)&dstBuffers));
1757137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
1767137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang            onGetInputBuffers(dstBuffers);
1777137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
1787137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang            (new AMessage)->postReply(replyID);
1797137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang            break;
1807137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang        }
1817137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
1827137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang        case kWhatRequestInputBuffers:
1837137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang        {
1847137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang            mRequestInputBuffersPending = false;
1857137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang            onRequestInputBuffers();
1867137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang            break;
1877137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang        }
1887137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
1897137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang        case kWhatFlush:
1907137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang        {
19166704af4d82c2b6303609b29402641f861fdcb19Chong Zhang            onFlush();
1927137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang            break;
1937137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang        }
1947137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
1957137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang        case kWhatResume:
1967137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang        {
197f8d717772f6d185cb07720cd5091df9b7d612e0bChong Zhang            int32_t notifyComplete;
198f8d717772f6d185cb07720cd5091df9b7d612e0bChong Zhang            CHECK(msg->findInt32("notifyComplete", &notifyComplete));
199f8d717772f6d185cb07720cd5091df9b7d612e0bChong Zhang
200f8d717772f6d185cb07720cd5091df9b7d612e0bChong Zhang            onResume(notifyComplete);
2017137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang            break;
2027137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang        }
2037137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
2047137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang        case kWhatShutdown:
2057137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang        {
2067137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang            onShutdown(true);
2077137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang            break;
2087137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang        }
2097137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
2107137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang        default:
2117137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang            TRESPASS();
2127137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang            break;
2137137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    }
2147137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang}
2157137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
216202bce11a7f66f27e6dbb6d154ddc123aa62513dAndy Hungvoid NuPlayer::DecoderBase::handleError(int32_t err)
217202bce11a7f66f27e6dbb6d154ddc123aa62513dAndy Hung{
218202bce11a7f66f27e6dbb6d154ddc123aa62513dAndy Hung    // We cannot immediately release the codec due to buffers still outstanding
219202bce11a7f66f27e6dbb6d154ddc123aa62513dAndy Hung    // in the renderer.  We signal to the player the error so it can shutdown/release the
220202bce11a7f66f27e6dbb6d154ddc123aa62513dAndy Hung    // decoder after flushing and increment the generation to discard unnecessary messages.
221202bce11a7f66f27e6dbb6d154ddc123aa62513dAndy Hung
222202bce11a7f66f27e6dbb6d154ddc123aa62513dAndy Hung    ++mBufferGeneration;
223202bce11a7f66f27e6dbb6d154ddc123aa62513dAndy Hung
224202bce11a7f66f27e6dbb6d154ddc123aa62513dAndy Hung    sp<AMessage> notify = mNotify->dup();
225202bce11a7f66f27e6dbb6d154ddc123aa62513dAndy Hung    notify->setInt32("what", kWhatError);
226202bce11a7f66f27e6dbb6d154ddc123aa62513dAndy Hung    notify->setInt32("err", err);
227202bce11a7f66f27e6dbb6d154ddc123aa62513dAndy Hung    notify->post();
228202bce11a7f66f27e6dbb6d154ddc123aa62513dAndy Hung}
229202bce11a7f66f27e6dbb6d154ddc123aa62513dAndy Hung
2307137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang}  // namespace android
2317137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
232