OMXNodeInstance.cpp revision 9f4557ed0b29c85df1f2219408bad91ae4e29cbb
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"
22fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber#include "OMXMaster.h"
23784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
24b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber#include <OMX_Component.h>
25784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
26784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber#include <binder/IMemory.h>
27784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber#include <media/stagefright/MediaDebug.h>
28784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
29784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Hubernamespace android {
30784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
31784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstruct BufferMeta {
32784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    BufferMeta(const sp<IMemory> &mem, bool is_backup = false)
33784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        : mMem(mem),
34784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber          mIsBackup(is_backup) {
35784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    }
36784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
37784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    BufferMeta(size_t size)
38784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        : mSize(size),
39784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber          mIsBackup(false) {
40784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    }
41784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
42784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    void CopyFromOMX(const OMX_BUFFERHEADERTYPE *header) {
43784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        if (!mIsBackup) {
44784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            return;
45784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        }
46784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
47784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        memcpy((OMX_U8 *)mMem->pointer() + header->nOffset,
48784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber               header->pBuffer + header->nOffset,
49784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber               header->nFilledLen);
50784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    }
51784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
52784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    void CopyToOMX(const OMX_BUFFERHEADERTYPE *header) {
53784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        if (!mIsBackup) {
54784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            return;
55784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        }
56784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
57784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        memcpy(header->pBuffer + header->nOffset,
58784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber               (const OMX_U8 *)mMem->pointer() + header->nOffset,
59784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber               header->nFilledLen);
60784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    }
61784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
62784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberprivate:
63784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    sp<IMemory> mMem;
64784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    size_t mSize;
65784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    bool mIsBackup;
66784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
67784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    BufferMeta(const BufferMeta &);
68784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    BufferMeta &operator=(const BufferMeta &);
69784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber};
70784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
71784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber// static
72784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX_CALLBACKTYPE OMXNodeInstance::kCallbacks = {
73784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    &OnEvent, &OnEmptyBufferDone, &OnFillBufferDone
74784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber};
75784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
76784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMXNodeInstance::OMXNodeInstance(
77784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX *owner, const sp<IOMXObserver> &observer)
78784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    : mOwner(owner),
79784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber      mNodeID(NULL),
80784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber      mHandle(NULL),
812ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber      mObserver(observer),
822ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber      mDying(false) {
83784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
84784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
85784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMXNodeInstance::~OMXNodeInstance() {
86784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    CHECK_EQ(mHandle, NULL);
87784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
88784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
89784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Hubervoid OMXNodeInstance::setHandle(OMX::node_id node_id, OMX_HANDLETYPE handle) {
90784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    CHECK_EQ(mHandle, NULL);
91784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    mNodeID = node_id;
92784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    mHandle = handle;
93784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
94784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
95784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX *OMXNodeInstance::owner() {
96784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return mOwner;
97784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
98784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
99784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Hubersp<IOMXObserver> OMXNodeInstance::observer() {
100784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return mObserver;
101784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
102784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
103784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX::node_id OMXNodeInstance::nodeID() {
104784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return mNodeID;
105784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
106784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
107784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatic status_t StatusFromOMXError(OMX_ERRORTYPE err) {
108784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return (err == OMX_ErrorNone) ? OK : UNKNOWN_ERROR;
109784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
110784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
111fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huberstatus_t OMXNodeInstance::freeNode(OMXMaster *master) {
1123085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    // Transition the node from its current state all the way down
1133085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    // to "Loaded".
1143085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    // This ensures that all active buffers are properly freed even
1153085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    // for components that don't do this themselves on a call to
1163085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    // "FreeHandle".
1173085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
1182ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber    // The code below may trigger some more events to be dispatched
1192ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber    // by the OMX component - we want to ignore them as our client
1202ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber    // does not expect them.
1212ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber    mDying = true;
1222ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber
1233085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    OMX_STATETYPE state;
1243085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    CHECK_EQ(OMX_GetState(mHandle, &state), OMX_ErrorNone);
1253085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    switch (state) {
1263085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        case OMX_StateExecuting:
1273085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        {
1283085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            LOGV("forcing Executing->Idle");
1293085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            sendCommand(OMX_CommandStateSet, OMX_StateIdle);
1303085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            OMX_ERRORTYPE err;
1313085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            while ((err = OMX_GetState(mHandle, &state)) == OMX_ErrorNone
1329f4557ed0b29c85df1f2219408bad91ae4e29cbbAndreas Huber                   && state != OMX_StateIdle
1339f4557ed0b29c85df1f2219408bad91ae4e29cbbAndreas Huber                   && state != OMX_StateInvalid) {
1343085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber                usleep(100000);
1353085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            }
1363085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            CHECK_EQ(err, OMX_ErrorNone);
1373085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
1389f4557ed0b29c85df1f2219408bad91ae4e29cbbAndreas Huber            if (state == OMX_StateInvalid) {
1399f4557ed0b29c85df1f2219408bad91ae4e29cbbAndreas Huber                break;
1409f4557ed0b29c85df1f2219408bad91ae4e29cbbAndreas Huber            }
1419f4557ed0b29c85df1f2219408bad91ae4e29cbbAndreas Huber
1423085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            // fall through
1433085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        }
1443085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
1453085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        case OMX_StateIdle:
1463085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        {
1473085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            LOGV("forcing Idle->Loaded");
1483085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            sendCommand(OMX_CommandStateSet, OMX_StateLoaded);
1493085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
1503085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            freeActiveBuffers();
1513085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
1523085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            OMX_ERRORTYPE err;
1533085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            while ((err = OMX_GetState(mHandle, &state)) == OMX_ErrorNone
1549f4557ed0b29c85df1f2219408bad91ae4e29cbbAndreas Huber                   && state != OMX_StateLoaded
1559f4557ed0b29c85df1f2219408bad91ae4e29cbbAndreas Huber                   && state != OMX_StateInvalid) {
1563085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber                LOGV("waiting for Loaded state...");
1573085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber                usleep(100000);
1583085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            }
1593085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            CHECK_EQ(err, OMX_ErrorNone);
1603085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
1613085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            // fall through
1623085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        }
1633085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
1643085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        case OMX_StateLoaded:
1659a50fdf467fdd56bb97efc3bc0931a9e52b990a7Andreas Huber        case OMX_StateInvalid:
1663085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            break;
1673085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
1683085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        default:
1693085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            CHECK(!"should not be here, unknown state.");
1703085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            break;
1713085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    }
1723085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
173fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber    OMX_ERRORTYPE err = master->destroyComponentInstance(
174fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber            static_cast<OMX_COMPONENTTYPE *>(mHandle));
175fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber
176784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    mHandle = NULL;
177784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
178784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    if (err != OMX_ErrorNone) {
179784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        LOGE("FreeHandle FAILED with error 0x%08x.", err);
180784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    }
181784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
182784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    mOwner->invalidateNodeID(mNodeID);
183784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    mNodeID = NULL;
184784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
185ad28543022101d0b01845e3f53dcd57e524816efAndreas Huber    LOGV("OMXNodeInstance going away.");
186ad28543022101d0b01845e3f53dcd57e524816efAndreas Huber    delete this;
187784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
188784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
189784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
190784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
191784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::sendCommand(
192784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_COMMANDTYPE cmd, OMX_S32 param) {
193784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
194784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
195784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_SendCommand(mHandle, cmd, param, NULL);
196784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
197784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
198784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
199784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::getParameter(
200784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_INDEXTYPE index, void *params, size_t size) {
201784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
202784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
203784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_GetParameter(mHandle, index, params);
204784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
205784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
206784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
207784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::setParameter(
208784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_INDEXTYPE index, const void *params, size_t size) {
209784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
210784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
211784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_SetParameter(
212784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            mHandle, index, const_cast<void *>(params));
213784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
214784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
215784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
216784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
217784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::getConfig(
218784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_INDEXTYPE index, void *params, size_t size) {
219784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
220784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
221784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_GetConfig(mHandle, index, params);
222784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
223784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
224784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
225784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::setConfig(
226784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_INDEXTYPE index, const void *params, size_t size) {
227784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
228784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
229784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_SetConfig(
230784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            mHandle, index, const_cast<void *>(params));
231784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
232784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
233784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
234784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
235784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::useBuffer(
236784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_U32 portIndex, const sp<IMemory> &params,
237784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX::buffer_id *buffer) {
238784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
239784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
240784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    BufferMeta *buffer_meta = new BufferMeta(params);
241784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
242784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_BUFFERHEADERTYPE *header;
243784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
244784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_UseBuffer(
245784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            mHandle, &header, portIndex, buffer_meta,
246784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            params->size(), static_cast<OMX_U8 *>(params->pointer()));
247784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
248784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    if (err != OMX_ErrorNone) {
249784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        LOGE("OMX_UseBuffer failed with error %d (0x%08x)", err, err);
250784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
251784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        delete buffer_meta;
252784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        buffer_meta = NULL;
253784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
254784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        *buffer = 0;
255784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
256784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        return UNKNOWN_ERROR;
257784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    }
258784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
259784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    *buffer = header;
260784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
2613085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    addActiveBuffer(portIndex, *buffer);
2623085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
263784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return OK;
264784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
265784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
266784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::allocateBuffer(
267c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber        OMX_U32 portIndex, size_t size, OMX::buffer_id *buffer,
268c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber        void **buffer_data) {
269784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
270784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
271784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    BufferMeta *buffer_meta = new BufferMeta(size);
272784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
273784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_BUFFERHEADERTYPE *header;
274784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
275784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_AllocateBuffer(
276784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            mHandle, &header, portIndex, buffer_meta, size);
277784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
278784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    if (err != OMX_ErrorNone) {
279784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        LOGE("OMX_AllocateBuffer failed with error %d (0x%08x)", err, err);
280784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
281784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        delete buffer_meta;
282784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        buffer_meta = NULL;
283784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
284784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        *buffer = 0;
285784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
286784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        return UNKNOWN_ERROR;
287784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    }
288784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
289784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    *buffer = header;
290c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber    *buffer_data = header->pBuffer;
291784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
2923085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    addActiveBuffer(portIndex, *buffer);
2933085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
294784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return OK;
295784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
296784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
297784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::allocateBufferWithBackup(
298784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_U32 portIndex, const sp<IMemory> &params,
299784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX::buffer_id *buffer) {
300784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
301784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
302784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    BufferMeta *buffer_meta = new BufferMeta(params, true);
303784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
304784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_BUFFERHEADERTYPE *header;
305784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
306784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_AllocateBuffer(
307784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            mHandle, &header, portIndex, buffer_meta, params->size());
308784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
309784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    if (err != OMX_ErrorNone) {
310784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        LOGE("OMX_AllocateBuffer failed with error %d (0x%08x)", err, err);
311784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
312784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        delete buffer_meta;
313784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        buffer_meta = NULL;
314784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
315784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        *buffer = 0;
316784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
317784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        return UNKNOWN_ERROR;
318784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    }
319784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
320784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    *buffer = header;
321784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
3223085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    addActiveBuffer(portIndex, *buffer);
3233085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
324784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return OK;
325784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
326784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
327784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::freeBuffer(
328784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_U32 portIndex, OMX::buffer_id buffer) {
329784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
330784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
3313085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    removeActiveBuffer(portIndex, buffer);
3323085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
333784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer;
334784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    BufferMeta *buffer_meta = static_cast<BufferMeta *>(header->pAppPrivate);
335784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
336784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_FreeBuffer(mHandle, portIndex, header);
337784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
338784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    delete buffer_meta;
339784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    buffer_meta = NULL;
340784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
341784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
342784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
343784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
344784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::fillBuffer(OMX::buffer_id buffer) {
345784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
346784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
347784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer;
348784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    header->nFilledLen = 0;
349784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    header->nOffset = 0;
350784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    header->nFlags = 0;
351784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
352784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_FillThisBuffer(mHandle, header);
353784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
354784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
355784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
356784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
357784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::emptyBuffer(
358784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX::buffer_id buffer,
359784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_U32 rangeOffset, OMX_U32 rangeLength,
360784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_U32 flags, OMX_TICKS timestamp) {
361784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
362784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
363784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer;
364784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    header->nFilledLen = rangeLength;
365784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    header->nOffset = rangeOffset;
366784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    header->nFlags = flags;
367784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    header->nTimeStamp = timestamp;
368784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
369784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    BufferMeta *buffer_meta =
370784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        static_cast<BufferMeta *>(header->pAppPrivate);
371784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    buffer_meta->CopyToOMX(header);
372784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
373784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_EmptyThisBuffer(mHandle, header);
374784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
375784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
376784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
377784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
378784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::getExtensionIndex(
379784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        const char *parameterName, OMX_INDEXTYPE *index) {
380784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
381784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
382784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_GetExtensionIndex(
383784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            mHandle, const_cast<char *>(parameterName), index);
384784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
385784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
386784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
387784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
388784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Hubervoid OMXNodeInstance::onMessage(const omx_message &msg) {
389784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    if (msg.type == omx_message::FILL_BUFFER_DONE) {
390784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_BUFFERHEADERTYPE *buffer =
391784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            static_cast<OMX_BUFFERHEADERTYPE *>(
392784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber                    msg.u.extended_buffer_data.buffer);
393784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
394784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        BufferMeta *buffer_meta =
395784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            static_cast<BufferMeta *>(buffer->pAppPrivate);
396784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
397784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        buffer_meta->CopyFromOMX(buffer);
398784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    }
399784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
400784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    mObserver->onMessage(msg);
401784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
402784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
403fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Hubervoid OMXNodeInstance::onObserverDied(OMXMaster *master) {
404784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    LOGE("!!! Observer died. Quickly, do something, ... anything...");
405784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
406784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    // Try to force shutdown of the node and hope for the best.
407fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber    freeNode(master);
408784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
409784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
410784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Hubervoid OMXNodeInstance::onGetHandleFailed() {
411784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    delete this;
412784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
413784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
414784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber// static
415784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX_ERRORTYPE OMXNodeInstance::OnEvent(
416784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_HANDLETYPE hComponent,
417784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_PTR pAppData,
418784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_EVENTTYPE eEvent,
419784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_U32 nData1,
420784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_U32 nData2,
421784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_PTR pEventData) {
422784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData);
4232ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber    if (instance->mDying) {
4242ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber        return OMX_ErrorNone;
4252ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber    }
426784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return instance->owner()->OnEvent(
427784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            instance->nodeID(), eEvent, nData1, nData2, pEventData);
428784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
429784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
430784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber// static
431784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX_ERRORTYPE OMXNodeInstance::OnEmptyBufferDone(
432784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_HANDLETYPE hComponent,
433784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_PTR pAppData,
434784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) {
435784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData);
4362ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber    if (instance->mDying) {
4372ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber        return OMX_ErrorNone;
4382ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber    }
439784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return instance->owner()->OnEmptyBufferDone(instance->nodeID(), pBuffer);
440784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
441784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
442784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber// static
443784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX_ERRORTYPE OMXNodeInstance::OnFillBufferDone(
444784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_HANDLETYPE hComponent,
445784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_PTR pAppData,
446784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) {
447784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData);
4482ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber    if (instance->mDying) {
4492ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber        return OMX_ErrorNone;
4502ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber    }
451784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return instance->owner()->OnFillBufferDone(instance->nodeID(), pBuffer);
452784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
453784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
4543085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Hubervoid OMXNodeInstance::addActiveBuffer(OMX_U32 portIndex, OMX::buffer_id id) {
4553085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    ActiveBuffer active;
4563085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    active.mPortIndex = portIndex;
4573085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    active.mID = id;
4583085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    mActiveBuffers.push(active);
4593085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber}
4603085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
4613085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Hubervoid OMXNodeInstance::removeActiveBuffer(
4623085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        OMX_U32 portIndex, OMX::buffer_id id) {
4633085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    bool found = false;
4643085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    for (size_t i = 0; i < mActiveBuffers.size(); ++i) {
4653085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        if (mActiveBuffers[i].mPortIndex == portIndex
4663085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            && mActiveBuffers[i].mID == id) {
4673085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            found = true;
4683085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            mActiveBuffers.removeItemsAt(i);
4693085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            break;
4703085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        }
4713085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    }
4723085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
4733085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    if (!found) {
4743085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        LOGW("Attempt to remove an active buffer we know nothing about...");
4753085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    }
4763085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber}
4773085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
4783085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Hubervoid OMXNodeInstance::freeActiveBuffers() {
4793085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    // Make sure to count down here, as freeBuffer will in turn remove
4803085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    // the active buffer from the vector...
4813085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    for (size_t i = mActiveBuffers.size(); i--;) {
4823085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        freeBuffer(mActiveBuffers[i].mPortIndex, mActiveBuffers[i].mID);
4833085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    }
4843085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber}
4853085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
486784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}  // namespace android
487784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
488