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> ¬ify) 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> ¶ms) { 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", ¶ms)); 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", ¬ifyComplete)); 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