OMXNodeInstance.cpp revision 3085c83e0015f019c960bc76f9689dfbfc9f5bb8
1784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber/*
2784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber * Copyright (C) 2009 The Android Open Source Project
3784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber *
4784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber * you may not use this file except in compliance with the License.
6784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber * You may obtain a copy of the License at
7784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber *
8784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber *
10784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber * Unless required by applicable law or agreed to in writing, software
11784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber * See the License for the specific language governing permissions and
14784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber * limitations under the License.
15784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber */
16784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
17784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber//#define LOG_NDEBUG 0
18784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber#define LOG_TAG "OMXNodeInstance"
19784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber#include <utils/Log.h>
20784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
21784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber#include "../include/OMXNodeInstance.h"
22784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
23784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber#include "pv_omxcore.h"
24784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
25784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber#include <binder/IMemory.h>
26784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber#include <media/stagefright/MediaDebug.h>
27784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
28784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Hubernamespace android {
29784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
30784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstruct BufferMeta {
31784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    BufferMeta(const sp<IMemory> &mem, bool is_backup = false)
32784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        : mMem(mem),
33784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber          mIsBackup(is_backup) {
34784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    }
35784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
36784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    BufferMeta(size_t size)
37784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        : mSize(size),
38784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber          mIsBackup(false) {
39784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    }
40784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
41784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    void CopyFromOMX(const OMX_BUFFERHEADERTYPE *header) {
42784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        if (!mIsBackup) {
43784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            return;
44784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        }
45784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
46784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        memcpy((OMX_U8 *)mMem->pointer() + header->nOffset,
47784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber               header->pBuffer + header->nOffset,
48784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber               header->nFilledLen);
49784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    }
50784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
51784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    void CopyToOMX(const OMX_BUFFERHEADERTYPE *header) {
52784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        if (!mIsBackup) {
53784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            return;
54784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        }
55784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
56784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        memcpy(header->pBuffer + header->nOffset,
57784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber               (const OMX_U8 *)mMem->pointer() + header->nOffset,
58784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber               header->nFilledLen);
59784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    }
60784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
61784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberprivate:
62784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    sp<IMemory> mMem;
63784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    size_t mSize;
64784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    bool mIsBackup;
65784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
66784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    BufferMeta(const BufferMeta &);
67784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    BufferMeta &operator=(const BufferMeta &);
68784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber};
69784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
70784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber// static
71784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX_CALLBACKTYPE OMXNodeInstance::kCallbacks = {
72784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    &OnEvent, &OnEmptyBufferDone, &OnFillBufferDone
73784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber};
74784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
75784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMXNodeInstance::OMXNodeInstance(
76784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX *owner, const sp<IOMXObserver> &observer)
77784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    : mOwner(owner),
78784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber      mNodeID(NULL),
79784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber      mHandle(NULL),
80784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber      mObserver(observer) {
81784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
82784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
83784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMXNodeInstance::~OMXNodeInstance() {
84784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    CHECK_EQ(mHandle, NULL);
85784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
86784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
87784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Hubervoid OMXNodeInstance::setHandle(OMX::node_id node_id, OMX_HANDLETYPE handle) {
88784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    CHECK_EQ(mHandle, NULL);
89784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    mNodeID = node_id;
90784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    mHandle = handle;
91784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
92784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
93784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX *OMXNodeInstance::owner() {
94784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return mOwner;
95784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
96784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
97784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Hubersp<IOMXObserver> OMXNodeInstance::observer() {
98784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return mObserver;
99784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
100784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
101784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX::node_id OMXNodeInstance::nodeID() {
102784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return mNodeID;
103784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
104784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
105784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatic status_t StatusFromOMXError(OMX_ERRORTYPE err) {
106784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return (err == OMX_ErrorNone) ? OK : UNKNOWN_ERROR;
107784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
108784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
109784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::freeNode() {
1103085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    // Transition the node from its current state all the way down
1113085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    // to "Loaded".
1123085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    // This ensures that all active buffers are properly freed even
1133085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    // for components that don't do this themselves on a call to
1143085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    // "FreeHandle".
1153085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
1163085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    OMX_STATETYPE state;
1173085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    CHECK_EQ(OMX_GetState(mHandle, &state), OMX_ErrorNone);
1183085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    switch (state) {
1193085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        case OMX_StateExecuting:
1203085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        {
1213085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            LOGV("forcing Executing->Idle");
1223085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            sendCommand(OMX_CommandStateSet, OMX_StateIdle);
1233085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            OMX_ERRORTYPE err;
1243085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            while ((err = OMX_GetState(mHandle, &state)) == OMX_ErrorNone
1253085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber                   && state != OMX_StateIdle) {
1263085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber                usleep(100000);
1273085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            }
1283085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            CHECK_EQ(err, OMX_ErrorNone);
1293085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
1303085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            // fall through
1313085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        }
1323085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
1333085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        case OMX_StateIdle:
1343085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        {
1353085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            LOGV("forcing Idle->Loaded");
1363085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            sendCommand(OMX_CommandStateSet, OMX_StateLoaded);
1373085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
1383085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            freeActiveBuffers();
1393085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
1403085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            OMX_ERRORTYPE err;
1413085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            while ((err = OMX_GetState(mHandle, &state)) == OMX_ErrorNone
1423085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber                   && state != OMX_StateLoaded) {
1433085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber                LOGV("waiting for Loaded state...");
1443085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber                usleep(100000);
1453085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            }
1463085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            CHECK_EQ(err, OMX_ErrorNone);
1473085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
1483085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            // fall through
1493085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        }
1503085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
1513085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        case OMX_StateLoaded:
1523085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            break;
1533085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
1543085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        default:
1553085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            CHECK(!"should not be here, unknown state.");
1563085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            break;
1573085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    }
1583085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
159784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_MasterFreeHandle(mHandle);
160784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    mHandle = NULL;
161784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
162784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    if (err != OMX_ErrorNone) {
163784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        LOGE("FreeHandle FAILED with error 0x%08x.", err);
164784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    }
165784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
166784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    mOwner->invalidateNodeID(mNodeID);
167784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    mNodeID = NULL;
168784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
169ad28543022101d0b01845e3f53dcd57e524816efAndreas Huber    LOGV("OMXNodeInstance going away.");
170ad28543022101d0b01845e3f53dcd57e524816efAndreas Huber    delete this;
171784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
172784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
173784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
174784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
175784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::sendCommand(
176784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_COMMANDTYPE cmd, OMX_S32 param) {
177784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
178784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
179784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_SendCommand(mHandle, cmd, param, NULL);
180784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
181784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
182784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
183784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::getParameter(
184784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_INDEXTYPE index, void *params, size_t size) {
185784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
186784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
187784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_GetParameter(mHandle, index, params);
188784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
189784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
190784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
191784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::setParameter(
192784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_INDEXTYPE index, const void *params, size_t size) {
193784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
194784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
195784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_SetParameter(
196784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            mHandle, index, const_cast<void *>(params));
197784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
198784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
199784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
200784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
201784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::getConfig(
202784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_INDEXTYPE index, void *params, size_t size) {
203784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
204784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
205784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_GetConfig(mHandle, index, params);
206784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
207784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
208784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
209784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::setConfig(
210784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_INDEXTYPE index, const void *params, size_t size) {
211784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
212784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
213784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_SetConfig(
214784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            mHandle, index, const_cast<void *>(params));
215784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
216784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
217784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
218784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
219784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::useBuffer(
220784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_U32 portIndex, const sp<IMemory> &params,
221784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX::buffer_id *buffer) {
222784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
223784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
224784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    BufferMeta *buffer_meta = new BufferMeta(params);
225784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
226784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_BUFFERHEADERTYPE *header;
227784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
228784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_UseBuffer(
229784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            mHandle, &header, portIndex, buffer_meta,
230784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            params->size(), static_cast<OMX_U8 *>(params->pointer()));
231784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
232784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    if (err != OMX_ErrorNone) {
233784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        LOGE("OMX_UseBuffer failed with error %d (0x%08x)", err, err);
234784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
235784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        delete buffer_meta;
236784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        buffer_meta = NULL;
237784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
238784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        *buffer = 0;
239784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
240784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        return UNKNOWN_ERROR;
241784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    }
242784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
243784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    *buffer = header;
244784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
2453085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    addActiveBuffer(portIndex, *buffer);
2463085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
247784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return OK;
248784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
249784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
250784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::allocateBuffer(
251784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_U32 portIndex, size_t size, OMX::buffer_id *buffer) {
252784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
253784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
254784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    BufferMeta *buffer_meta = new BufferMeta(size);
255784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
256784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_BUFFERHEADERTYPE *header;
257784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
258784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_AllocateBuffer(
259784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            mHandle, &header, portIndex, buffer_meta, size);
260784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
261784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    if (err != OMX_ErrorNone) {
262784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        LOGE("OMX_AllocateBuffer failed with error %d (0x%08x)", err, err);
263784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
264784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        delete buffer_meta;
265784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        buffer_meta = NULL;
266784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
267784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        *buffer = 0;
268784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
269784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        return UNKNOWN_ERROR;
270784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    }
271784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
272784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    *buffer = header;
273784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
2743085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    addActiveBuffer(portIndex, *buffer);
2753085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
276784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return OK;
277784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
278784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
279784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::allocateBufferWithBackup(
280784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_U32 portIndex, const sp<IMemory> &params,
281784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX::buffer_id *buffer) {
282784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
283784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
284784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    BufferMeta *buffer_meta = new BufferMeta(params, true);
285784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
286784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_BUFFERHEADERTYPE *header;
287784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
288784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_AllocateBuffer(
289784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            mHandle, &header, portIndex, buffer_meta, params->size());
290784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
291784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    if (err != OMX_ErrorNone) {
292784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        LOGE("OMX_AllocateBuffer failed with error %d (0x%08x)", err, err);
293784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
294784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        delete buffer_meta;
295784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        buffer_meta = NULL;
296784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
297784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        *buffer = 0;
298784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
299784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        return UNKNOWN_ERROR;
300784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    }
301784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
302784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    *buffer = header;
303784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
3043085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    addActiveBuffer(portIndex, *buffer);
3053085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
306784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return OK;
307784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
308784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
309784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::freeBuffer(
310784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_U32 portIndex, OMX::buffer_id buffer) {
311784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
312784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
3133085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    removeActiveBuffer(portIndex, buffer);
3143085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
315784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer;
316784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    BufferMeta *buffer_meta = static_cast<BufferMeta *>(header->pAppPrivate);
317784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
318784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_FreeBuffer(mHandle, portIndex, header);
319784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
320784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    delete buffer_meta;
321784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    buffer_meta = NULL;
322784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
323784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
324784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
325784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
326784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::fillBuffer(OMX::buffer_id buffer) {
327784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
328784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
329784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer;
330784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    header->nFilledLen = 0;
331784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    header->nOffset = 0;
332784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    header->nFlags = 0;
333784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
334784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_FillThisBuffer(mHandle, header);
335784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
336784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
337784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
338784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
339784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::emptyBuffer(
340784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX::buffer_id buffer,
341784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_U32 rangeOffset, OMX_U32 rangeLength,
342784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_U32 flags, OMX_TICKS timestamp) {
343784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
344784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
345784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer;
346784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    header->nFilledLen = rangeLength;
347784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    header->nOffset = rangeOffset;
348784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    header->nFlags = flags;
349784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    header->nTimeStamp = timestamp;
350784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
351784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    BufferMeta *buffer_meta =
352784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        static_cast<BufferMeta *>(header->pAppPrivate);
353784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    buffer_meta->CopyToOMX(header);
354784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
355784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_EmptyThisBuffer(mHandle, header);
356784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
357784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
358784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
359784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
360784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::getExtensionIndex(
361784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        const char *parameterName, OMX_INDEXTYPE *index) {
362784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
363784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
364784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_GetExtensionIndex(
365784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            mHandle, const_cast<char *>(parameterName), index);
366784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
367784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
368784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
369784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
370784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Hubervoid OMXNodeInstance::onMessage(const omx_message &msg) {
371784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    if (msg.type == omx_message::FILL_BUFFER_DONE) {
372784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_BUFFERHEADERTYPE *buffer =
373784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            static_cast<OMX_BUFFERHEADERTYPE *>(
374784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber                    msg.u.extended_buffer_data.buffer);
375784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
376784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        BufferMeta *buffer_meta =
377784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            static_cast<BufferMeta *>(buffer->pAppPrivate);
378784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
379784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        buffer_meta->CopyFromOMX(buffer);
380784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    }
381784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
382784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    mObserver->onMessage(msg);
383784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
384784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
385784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Hubervoid OMXNodeInstance::onObserverDied() {
386784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    LOGE("!!! Observer died. Quickly, do something, ... anything...");
387784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
388784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    // Try to force shutdown of the node and hope for the best.
389784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    freeNode();
390784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
391784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
392784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Hubervoid OMXNodeInstance::onGetHandleFailed() {
393784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    delete this;
394784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
395784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
396784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber// static
397784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX_ERRORTYPE OMXNodeInstance::OnEvent(
398784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_HANDLETYPE hComponent,
399784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_PTR pAppData,
400784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_EVENTTYPE eEvent,
401784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_U32 nData1,
402784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_U32 nData2,
403784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_PTR pEventData) {
404784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData);
405784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return instance->owner()->OnEvent(
406784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            instance->nodeID(), eEvent, nData1, nData2, pEventData);
407784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
408784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
409784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber// static
410784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX_ERRORTYPE OMXNodeInstance::OnEmptyBufferDone(
411784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_HANDLETYPE hComponent,
412784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_PTR pAppData,
413784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) {
414784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData);
415784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return instance->owner()->OnEmptyBufferDone(instance->nodeID(), pBuffer);
416784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
417784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
418784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber// static
419784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX_ERRORTYPE OMXNodeInstance::OnFillBufferDone(
420784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_HANDLETYPE hComponent,
421784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_PTR pAppData,
422784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) {
423784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData);
424784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return instance->owner()->OnFillBufferDone(instance->nodeID(), pBuffer);
425784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
426784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
4273085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Hubervoid OMXNodeInstance::addActiveBuffer(OMX_U32 portIndex, OMX::buffer_id id) {
4283085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    ActiveBuffer active;
4293085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    active.mPortIndex = portIndex;
4303085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    active.mID = id;
4313085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    mActiveBuffers.push(active);
4323085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber}
4333085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
4343085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Hubervoid OMXNodeInstance::removeActiveBuffer(
4353085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        OMX_U32 portIndex, OMX::buffer_id id) {
4363085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    bool found = false;
4373085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    for (size_t i = 0; i < mActiveBuffers.size(); ++i) {
4383085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        if (mActiveBuffers[i].mPortIndex == portIndex
4393085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            && mActiveBuffers[i].mID == id) {
4403085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            found = true;
4413085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            mActiveBuffers.removeItemsAt(i);
4423085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            break;
4433085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        }
4443085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    }
4453085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
4463085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    if (!found) {
4473085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        LOGW("Attempt to remove an active buffer we know nothing about...");
4483085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    }
4493085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber}
4503085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
4513085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Hubervoid OMXNodeInstance::freeActiveBuffers() {
4523085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    // Make sure to count down here, as freeBuffer will in turn remove
4533085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    // the active buffer from the vector...
4543085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    for (size_t i = mActiveBuffers.size(); i--;) {
4553085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        freeBuffer(mActiveBuffers[i].mPortIndex, mActiveBuffers[i].mID);
4563085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    }
4573085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber}
4583085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
459784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}  // namespace android
460784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
461