OMXNodeInstance.cpp revision 2ea14e231945afb6581fa8f54015b33bc74a19e5
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
1323085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber                   && state != OMX_StateIdle) {
1333085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber                usleep(100000);
1343085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            }
1353085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            CHECK_EQ(err, OMX_ErrorNone);
1363085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
1373085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            // fall through
1383085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        }
1393085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
1403085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        case OMX_StateIdle:
1413085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        {
1423085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            LOGV("forcing Idle->Loaded");
1433085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            sendCommand(OMX_CommandStateSet, OMX_StateLoaded);
1443085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
1453085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            freeActiveBuffers();
1463085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
1473085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            OMX_ERRORTYPE err;
1483085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            while ((err = OMX_GetState(mHandle, &state)) == OMX_ErrorNone
1493085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber                   && state != OMX_StateLoaded) {
1503085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber                LOGV("waiting for Loaded state...");
1513085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber                usleep(100000);
1523085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            }
1533085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            CHECK_EQ(err, OMX_ErrorNone);
1543085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
1553085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            // fall through
1563085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        }
1573085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
1583085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        case OMX_StateLoaded:
1599a50fdf467fdd56bb97efc3bc0931a9e52b990a7Andreas Huber        case OMX_StateInvalid:
1603085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            break;
1613085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
1623085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        default:
1633085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            CHECK(!"should not be here, unknown state.");
1643085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            break;
1653085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    }
1663085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
167fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber    OMX_ERRORTYPE err = master->destroyComponentInstance(
168fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber            static_cast<OMX_COMPONENTTYPE *>(mHandle));
169fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber
170784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    mHandle = NULL;
171784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
172784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    if (err != OMX_ErrorNone) {
173784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        LOGE("FreeHandle FAILED with error 0x%08x.", err);
174784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    }
175784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
176784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    mOwner->invalidateNodeID(mNodeID);
177784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    mNodeID = NULL;
178784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
179ad28543022101d0b01845e3f53dcd57e524816efAndreas Huber    LOGV("OMXNodeInstance going away.");
180ad28543022101d0b01845e3f53dcd57e524816efAndreas Huber    delete this;
181784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
182784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
183784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
184784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
185784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::sendCommand(
186784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_COMMANDTYPE cmd, OMX_S32 param) {
187784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
188784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
189784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_SendCommand(mHandle, cmd, param, NULL);
190784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
191784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
192784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
193784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::getParameter(
194784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_INDEXTYPE index, void *params, size_t size) {
195784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
196784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
197784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_GetParameter(mHandle, index, params);
198784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
199784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
200784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
201784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::setParameter(
202784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_INDEXTYPE index, const void *params, size_t size) {
203784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
204784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
205784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_SetParameter(
206784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            mHandle, index, const_cast<void *>(params));
207784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
208784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
209784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
210784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
211784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::getConfig(
212784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_INDEXTYPE index, void *params, size_t size) {
213784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
214784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
215784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_GetConfig(mHandle, index, params);
216784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
217784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
218784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
219784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::setConfig(
220784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_INDEXTYPE index, const void *params, size_t size) {
221784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
222784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
223784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_SetConfig(
224784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            mHandle, index, const_cast<void *>(params));
225784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
226784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
227784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
228784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
229784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::useBuffer(
230784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_U32 portIndex, const sp<IMemory> &params,
231784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX::buffer_id *buffer) {
232784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
233784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
234784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    BufferMeta *buffer_meta = new BufferMeta(params);
235784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
236784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_BUFFERHEADERTYPE *header;
237784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
238784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_UseBuffer(
239784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            mHandle, &header, portIndex, buffer_meta,
240784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            params->size(), static_cast<OMX_U8 *>(params->pointer()));
241784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
242784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    if (err != OMX_ErrorNone) {
243784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        LOGE("OMX_UseBuffer failed with error %d (0x%08x)", err, err);
244784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
245784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        delete buffer_meta;
246784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        buffer_meta = NULL;
247784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
248784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        *buffer = 0;
249784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
250784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        return UNKNOWN_ERROR;
251784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    }
252784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
253784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    *buffer = header;
254784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
2553085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    addActiveBuffer(portIndex, *buffer);
2563085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
257784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return OK;
258784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
259784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
260784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::allocateBuffer(
261784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_U32 portIndex, size_t size, OMX::buffer_id *buffer) {
262784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
263784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
264784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    BufferMeta *buffer_meta = new BufferMeta(size);
265784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
266784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_BUFFERHEADERTYPE *header;
267784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
268784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_AllocateBuffer(
269784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            mHandle, &header, portIndex, buffer_meta, size);
270784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
271784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    if (err != OMX_ErrorNone) {
272784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        LOGE("OMX_AllocateBuffer failed with error %d (0x%08x)", err, err);
273784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
274784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        delete buffer_meta;
275784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        buffer_meta = NULL;
276784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
277784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        *buffer = 0;
278784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
279784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        return UNKNOWN_ERROR;
280784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    }
281784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
282784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    *buffer = header;
283784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
2843085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    addActiveBuffer(portIndex, *buffer);
2853085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
286784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return OK;
287784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
288784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
289784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::allocateBufferWithBackup(
290784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_U32 portIndex, const sp<IMemory> &params,
291784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX::buffer_id *buffer) {
292784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
293784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
294784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    BufferMeta *buffer_meta = new BufferMeta(params, true);
295784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
296784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_BUFFERHEADERTYPE *header;
297784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
298784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_AllocateBuffer(
299784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            mHandle, &header, portIndex, buffer_meta, params->size());
300784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
301784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    if (err != OMX_ErrorNone) {
302784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        LOGE("OMX_AllocateBuffer failed with error %d (0x%08x)", err, err);
303784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
304784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        delete buffer_meta;
305784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        buffer_meta = NULL;
306784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
307784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        *buffer = 0;
308784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
309784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        return UNKNOWN_ERROR;
310784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    }
311784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
312784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    *buffer = header;
313784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
3143085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    addActiveBuffer(portIndex, *buffer);
3153085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
316784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return OK;
317784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
318784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
319784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::freeBuffer(
320784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_U32 portIndex, OMX::buffer_id buffer) {
321784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
322784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
3233085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    removeActiveBuffer(portIndex, buffer);
3243085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
325784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer;
326784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    BufferMeta *buffer_meta = static_cast<BufferMeta *>(header->pAppPrivate);
327784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
328784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_FreeBuffer(mHandle, portIndex, header);
329784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
330784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    delete buffer_meta;
331784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    buffer_meta = NULL;
332784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
333784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
334784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
335784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
336784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::fillBuffer(OMX::buffer_id buffer) {
337784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
338784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
339784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer;
340784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    header->nFilledLen = 0;
341784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    header->nOffset = 0;
342784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    header->nFlags = 0;
343784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
344784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_FillThisBuffer(mHandle, header);
345784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
346784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
347784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
348784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
349784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::emptyBuffer(
350784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX::buffer_id buffer,
351784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_U32 rangeOffset, OMX_U32 rangeLength,
352784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_U32 flags, OMX_TICKS timestamp) {
353784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
354784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
355784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer;
356784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    header->nFilledLen = rangeLength;
357784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    header->nOffset = rangeOffset;
358784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    header->nFlags = flags;
359784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    header->nTimeStamp = timestamp;
360784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
361784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    BufferMeta *buffer_meta =
362784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        static_cast<BufferMeta *>(header->pAppPrivate);
363784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    buffer_meta->CopyToOMX(header);
364784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
365784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_EmptyThisBuffer(mHandle, header);
366784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
367784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
368784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
369784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
370784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::getExtensionIndex(
371784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        const char *parameterName, OMX_INDEXTYPE *index) {
372784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
373784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
374784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_GetExtensionIndex(
375784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            mHandle, const_cast<char *>(parameterName), index);
376784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
377784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
378784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
379784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
380784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Hubervoid OMXNodeInstance::onMessage(const omx_message &msg) {
381784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    if (msg.type == omx_message::FILL_BUFFER_DONE) {
382784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_BUFFERHEADERTYPE *buffer =
383784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            static_cast<OMX_BUFFERHEADERTYPE *>(
384784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber                    msg.u.extended_buffer_data.buffer);
385784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
386784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        BufferMeta *buffer_meta =
387784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            static_cast<BufferMeta *>(buffer->pAppPrivate);
388784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
389784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        buffer_meta->CopyFromOMX(buffer);
390784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    }
391784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
392784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    mObserver->onMessage(msg);
393784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
394784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
395fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Hubervoid OMXNodeInstance::onObserverDied(OMXMaster *master) {
396784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    LOGE("!!! Observer died. Quickly, do something, ... anything...");
397784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
398784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    // Try to force shutdown of the node and hope for the best.
399fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber    freeNode(master);
400784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
401784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
402784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Hubervoid OMXNodeInstance::onGetHandleFailed() {
403784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    delete this;
404784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
405784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
406784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber// static
407784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX_ERRORTYPE OMXNodeInstance::OnEvent(
408784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_HANDLETYPE hComponent,
409784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_PTR pAppData,
410784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_EVENTTYPE eEvent,
411784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_U32 nData1,
412784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_U32 nData2,
413784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_PTR pEventData) {
414784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData);
4152ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber    if (instance->mDying) {
4162ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber        return OMX_ErrorNone;
4172ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber    }
418784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return instance->owner()->OnEvent(
419784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            instance->nodeID(), eEvent, nData1, nData2, pEventData);
420784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
421784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
422784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber// static
423784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX_ERRORTYPE OMXNodeInstance::OnEmptyBufferDone(
424784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_HANDLETYPE hComponent,
425784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_PTR pAppData,
426784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) {
427784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData);
4282ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber    if (instance->mDying) {
4292ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber        return OMX_ErrorNone;
4302ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber    }
431784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return instance->owner()->OnEmptyBufferDone(instance->nodeID(), pBuffer);
432784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
433784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
434784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber// static
435784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX_ERRORTYPE OMXNodeInstance::OnFillBufferDone(
436784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_HANDLETYPE hComponent,
437784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_PTR pAppData,
438784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) {
439784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData);
4402ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber    if (instance->mDying) {
4412ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber        return OMX_ErrorNone;
4422ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber    }
443784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return instance->owner()->OnFillBufferDone(instance->nodeID(), pBuffer);
444784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
445784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
4463085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Hubervoid OMXNodeInstance::addActiveBuffer(OMX_U32 portIndex, OMX::buffer_id id) {
4473085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    ActiveBuffer active;
4483085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    active.mPortIndex = portIndex;
4493085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    active.mID = id;
4503085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    mActiveBuffers.push(active);
4513085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber}
4523085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
4533085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Hubervoid OMXNodeInstance::removeActiveBuffer(
4543085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        OMX_U32 portIndex, OMX::buffer_id id) {
4553085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    bool found = false;
4563085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    for (size_t i = 0; i < mActiveBuffers.size(); ++i) {
4573085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        if (mActiveBuffers[i].mPortIndex == portIndex
4583085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            && mActiveBuffers[i].mID == id) {
4593085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            found = true;
4603085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            mActiveBuffers.removeItemsAt(i);
4613085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            break;
4623085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        }
4633085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    }
4643085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
4653085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    if (!found) {
4663085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        LOGW("Attempt to remove an active buffer we know nothing about...");
4673085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    }
4683085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber}
4693085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
4703085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Hubervoid OMXNodeInstance::freeActiveBuffers() {
4713085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    // Make sure to count down here, as freeBuffer will in turn remove
4723085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    // the active buffer from the vector...
4733085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    for (size_t i = mActiveBuffers.size(); i--;) {
4743085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        freeBuffer(mActiveBuffers[i].mPortIndex, mActiveBuffers[i].mID);
4753085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    }
4763085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber}
4773085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
478784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}  // namespace android
479784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
480