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>
282a09c7e042d6a3ae600b25f606d584368a6e3f3aAndreas Huber#include <media/stagefright/MediaErrors.h>
29784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
30784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Hubernamespace android {
31784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
32784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstruct BufferMeta {
33784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    BufferMeta(const sp<IMemory> &mem, bool is_backup = false)
34784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        : mMem(mem),
35784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber          mIsBackup(is_backup) {
36784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    }
37784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
38784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    BufferMeta(size_t size)
39784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        : mSize(size),
40784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber          mIsBackup(false) {
41784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    }
42784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
43784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    void CopyFromOMX(const OMX_BUFFERHEADERTYPE *header) {
44784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        if (!mIsBackup) {
45784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            return;
46784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        }
47784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
48784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        memcpy((OMX_U8 *)mMem->pointer() + header->nOffset,
49784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber               header->pBuffer + header->nOffset,
50784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber               header->nFilledLen);
51784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    }
52784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
53784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    void CopyToOMX(const OMX_BUFFERHEADERTYPE *header) {
54784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        if (!mIsBackup) {
55784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            return;
56784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        }
57784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
58784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        memcpy(header->pBuffer + header->nOffset,
59784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber               (const OMX_U8 *)mMem->pointer() + header->nOffset,
60784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber               header->nFilledLen);
61784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    }
62784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
63784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberprivate:
64784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    sp<IMemory> mMem;
65784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    size_t mSize;
66784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    bool mIsBackup;
67784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
68784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    BufferMeta(const BufferMeta &);
69784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    BufferMeta &operator=(const BufferMeta &);
70784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber};
71784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
72784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber// static
73784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX_CALLBACKTYPE OMXNodeInstance::kCallbacks = {
74784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    &OnEvent, &OnEmptyBufferDone, &OnFillBufferDone
75784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber};
76784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
77784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMXNodeInstance::OMXNodeInstance(
78784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX *owner, const sp<IOMXObserver> &observer)
79784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    : mOwner(owner),
80784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber      mNodeID(NULL),
81784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber      mHandle(NULL),
822ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber      mObserver(observer),
832ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber      mDying(false) {
84784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
85784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
86784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMXNodeInstance::~OMXNodeInstance() {
87784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    CHECK_EQ(mHandle, NULL);
88784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
89784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
90784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Hubervoid OMXNodeInstance::setHandle(OMX::node_id node_id, OMX_HANDLETYPE handle) {
91784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    CHECK_EQ(mHandle, NULL);
92784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    mNodeID = node_id;
93784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    mHandle = handle;
94784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
95784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
96784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX *OMXNodeInstance::owner() {
97784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return mOwner;
98784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
99784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
100784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Hubersp<IOMXObserver> OMXNodeInstance::observer() {
101784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return mObserver;
102784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
103784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
104784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX::node_id OMXNodeInstance::nodeID() {
105784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return mNodeID;
106784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
107784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
108784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatic status_t StatusFromOMXError(OMX_ERRORTYPE err) {
1092a09c7e042d6a3ae600b25f606d584368a6e3f3aAndreas Huber    switch (err) {
1102a09c7e042d6a3ae600b25f606d584368a6e3f3aAndreas Huber        case OMX_ErrorNone:
1112a09c7e042d6a3ae600b25f606d584368a6e3f3aAndreas Huber            return OK;
1122a09c7e042d6a3ae600b25f606d584368a6e3f3aAndreas Huber        case OMX_ErrorUnsupportedSetting:
1132a09c7e042d6a3ae600b25f606d584368a6e3f3aAndreas Huber            return ERROR_UNSUPPORTED;
1142a09c7e042d6a3ae600b25f606d584368a6e3f3aAndreas Huber        default:
1152a09c7e042d6a3ae600b25f606d584368a6e3f3aAndreas Huber            return UNKNOWN_ERROR;
1162a09c7e042d6a3ae600b25f606d584368a6e3f3aAndreas Huber    }
117784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
118784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
119fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huberstatus_t OMXNodeInstance::freeNode(OMXMaster *master) {
1203085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    // Transition the node from its current state all the way down
1213085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    // to "Loaded".
1223085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    // This ensures that all active buffers are properly freed even
1233085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    // for components that don't do this themselves on a call to
1243085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    // "FreeHandle".
1253085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
1262ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber    // The code below may trigger some more events to be dispatched
1272ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber    // by the OMX component - we want to ignore them as our client
1282ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber    // does not expect them.
1292ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber    mDying = true;
1302ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber
1313085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    OMX_STATETYPE state;
1323085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    CHECK_EQ(OMX_GetState(mHandle, &state), OMX_ErrorNone);
1333085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    switch (state) {
1343085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        case OMX_StateExecuting:
1353085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        {
1363085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            LOGV("forcing Executing->Idle");
1373085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            sendCommand(OMX_CommandStateSet, OMX_StateIdle);
1383085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            OMX_ERRORTYPE err;
1393085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            while ((err = OMX_GetState(mHandle, &state)) == OMX_ErrorNone
1409f4557ed0b29c85df1f2219408bad91ae4e29cbbAndreas Huber                   && state != OMX_StateIdle
1419f4557ed0b29c85df1f2219408bad91ae4e29cbbAndreas Huber                   && state != OMX_StateInvalid) {
1423085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber                usleep(100000);
1433085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            }
1443085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            CHECK_EQ(err, OMX_ErrorNone);
1453085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
1469f4557ed0b29c85df1f2219408bad91ae4e29cbbAndreas Huber            if (state == OMX_StateInvalid) {
1479f4557ed0b29c85df1f2219408bad91ae4e29cbbAndreas Huber                break;
1489f4557ed0b29c85df1f2219408bad91ae4e29cbbAndreas Huber            }
1499f4557ed0b29c85df1f2219408bad91ae4e29cbbAndreas Huber
1503085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            // fall through
1513085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        }
1523085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
1533085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        case OMX_StateIdle:
1543085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        {
1553085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            LOGV("forcing Idle->Loaded");
1563085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            sendCommand(OMX_CommandStateSet, OMX_StateLoaded);
1573085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
1583085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            freeActiveBuffers();
1593085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
1603085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            OMX_ERRORTYPE err;
1613085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            while ((err = OMX_GetState(mHandle, &state)) == OMX_ErrorNone
1629f4557ed0b29c85df1f2219408bad91ae4e29cbbAndreas Huber                   && state != OMX_StateLoaded
1639f4557ed0b29c85df1f2219408bad91ae4e29cbbAndreas Huber                   && state != OMX_StateInvalid) {
1643085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber                LOGV("waiting for Loaded state...");
1653085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber                usleep(100000);
1663085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            }
1673085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            CHECK_EQ(err, OMX_ErrorNone);
1683085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
1693085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            // fall through
1703085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        }
1713085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
1723085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        case OMX_StateLoaded:
1739a50fdf467fdd56bb97efc3bc0931a9e52b990a7Andreas Huber        case OMX_StateInvalid:
1743085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            break;
1753085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
1763085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        default:
1773085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            CHECK(!"should not be here, unknown state.");
1783085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            break;
1793085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    }
1803085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
181fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber    OMX_ERRORTYPE err = master->destroyComponentInstance(
182fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber            static_cast<OMX_COMPONENTTYPE *>(mHandle));
183fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber
184784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    mHandle = NULL;
185784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
186784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    if (err != OMX_ErrorNone) {
187784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        LOGE("FreeHandle FAILED with error 0x%08x.", err);
188784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    }
189784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
190784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    mOwner->invalidateNodeID(mNodeID);
191784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    mNodeID = NULL;
192784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
193ad28543022101d0b01845e3f53dcd57e524816efAndreas Huber    LOGV("OMXNodeInstance going away.");
194ad28543022101d0b01845e3f53dcd57e524816efAndreas Huber    delete this;
195784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
196784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
197784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
198784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
199784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::sendCommand(
200784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_COMMANDTYPE cmd, OMX_S32 param) {
201784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
202784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
203784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_SendCommand(mHandle, cmd, param, NULL);
204784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
205784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
206784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
207784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::getParameter(
208784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_INDEXTYPE index, void *params, size_t size) {
209784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
210784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
211784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_GetParameter(mHandle, index, params);
212784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
213784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
214784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
215784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::setParameter(
216784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_INDEXTYPE index, const void *params, size_t size) {
217784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
218784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
219784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_SetParameter(
220784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            mHandle, index, const_cast<void *>(params));
221784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
222784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
223784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
224784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
225784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::getConfig(
226784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_INDEXTYPE index, void *params, size_t size) {
227784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
228784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
229784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_GetConfig(mHandle, index, params);
230784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
231784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
232784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
233784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::setConfig(
234784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_INDEXTYPE index, const void *params, size_t size) {
235784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
236784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
237784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_SetConfig(
238784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            mHandle, index, const_cast<void *>(params));
239784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
240784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
241784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
242784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
243784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::useBuffer(
244784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_U32 portIndex, const sp<IMemory> &params,
245784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX::buffer_id *buffer) {
246784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
247784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
248784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    BufferMeta *buffer_meta = new BufferMeta(params);
249784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
250784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_BUFFERHEADERTYPE *header;
251784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
252784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_UseBuffer(
253784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            mHandle, &header, portIndex, buffer_meta,
254784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            params->size(), static_cast<OMX_U8 *>(params->pointer()));
255784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
256784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    if (err != OMX_ErrorNone) {
257784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        LOGE("OMX_UseBuffer failed with error %d (0x%08x)", err, err);
258784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
259784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        delete buffer_meta;
260784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        buffer_meta = NULL;
261784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
262784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        *buffer = 0;
263784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
264784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        return UNKNOWN_ERROR;
265784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    }
266784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
267784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    *buffer = header;
268784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
2693085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    addActiveBuffer(portIndex, *buffer);
2703085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
271784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return OK;
272784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
273784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
274784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::allocateBuffer(
275c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber        OMX_U32 portIndex, size_t size, OMX::buffer_id *buffer,
276c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber        void **buffer_data) {
277784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
278784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
279784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    BufferMeta *buffer_meta = new BufferMeta(size);
280784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
281784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_BUFFERHEADERTYPE *header;
282784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
283784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_AllocateBuffer(
284784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            mHandle, &header, portIndex, buffer_meta, size);
285784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
286784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    if (err != OMX_ErrorNone) {
287784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        LOGE("OMX_AllocateBuffer failed with error %d (0x%08x)", err, err);
288784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
289784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        delete buffer_meta;
290784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        buffer_meta = NULL;
291784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
292784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        *buffer = 0;
293784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
294784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        return UNKNOWN_ERROR;
295784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    }
296784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
297784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    *buffer = header;
298c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber    *buffer_data = header->pBuffer;
299784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
3003085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    addActiveBuffer(portIndex, *buffer);
3013085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
302784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return OK;
303784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
304784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
305784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::allocateBufferWithBackup(
306784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_U32 portIndex, const sp<IMemory> &params,
307784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX::buffer_id *buffer) {
308784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
309784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
310784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    BufferMeta *buffer_meta = new BufferMeta(params, true);
311784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
312784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_BUFFERHEADERTYPE *header;
313784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
314784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_AllocateBuffer(
315784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            mHandle, &header, portIndex, buffer_meta, params->size());
316784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
317784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    if (err != OMX_ErrorNone) {
318784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        LOGE("OMX_AllocateBuffer failed with error %d (0x%08x)", err, err);
319784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
320784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        delete buffer_meta;
321784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        buffer_meta = NULL;
322784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
323784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        *buffer = 0;
324784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
325784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        return UNKNOWN_ERROR;
326784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    }
327784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
328784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    *buffer = header;
329784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
3303085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    addActiveBuffer(portIndex, *buffer);
3313085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
332784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return OK;
333784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
334784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
335784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::freeBuffer(
336784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_U32 portIndex, OMX::buffer_id buffer) {
337784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
338784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
3393085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    removeActiveBuffer(portIndex, buffer);
3403085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
341784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer;
342784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    BufferMeta *buffer_meta = static_cast<BufferMeta *>(header->pAppPrivate);
343784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
344784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_FreeBuffer(mHandle, portIndex, header);
345784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
346784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    delete buffer_meta;
347784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    buffer_meta = NULL;
348784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
349784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
350784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
351784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
352784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::fillBuffer(OMX::buffer_id buffer) {
353784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
354784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
355784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer;
356784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    header->nFilledLen = 0;
357784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    header->nOffset = 0;
358784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    header->nFlags = 0;
359784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
360784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_FillThisBuffer(mHandle, header);
361784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
362784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
363784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
364784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
365784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::emptyBuffer(
366784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX::buffer_id buffer,
367784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_U32 rangeOffset, OMX_U32 rangeLength,
368784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_U32 flags, OMX_TICKS timestamp) {
369784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
370784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
371784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer;
372784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    header->nFilledLen = rangeLength;
373784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    header->nOffset = rangeOffset;
374784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    header->nFlags = flags;
375784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    header->nTimeStamp = timestamp;
376784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
377784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    BufferMeta *buffer_meta =
378784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        static_cast<BufferMeta *>(header->pAppPrivate);
379784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    buffer_meta->CopyToOMX(header);
380784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
381784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_EmptyThisBuffer(mHandle, header);
382784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
383784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
384784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
385784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
386784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::getExtensionIndex(
387784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        const char *parameterName, OMX_INDEXTYPE *index) {
388784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    Mutex::Autolock autoLock(mLock);
389784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
390784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMX_ERRORTYPE err = OMX_GetExtensionIndex(
391784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            mHandle, const_cast<char *>(parameterName), index);
392784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
393784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return StatusFromOMXError(err);
394784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
395784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
396784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Hubervoid OMXNodeInstance::onMessage(const omx_message &msg) {
397784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    if (msg.type == omx_message::FILL_BUFFER_DONE) {
398784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_BUFFERHEADERTYPE *buffer =
399784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            static_cast<OMX_BUFFERHEADERTYPE *>(
400784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber                    msg.u.extended_buffer_data.buffer);
401784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
402784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        BufferMeta *buffer_meta =
403784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            static_cast<BufferMeta *>(buffer->pAppPrivate);
404784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
405784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        buffer_meta->CopyFromOMX(buffer);
406784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    }
407784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
408784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    mObserver->onMessage(msg);
409784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
410784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
411fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Hubervoid OMXNodeInstance::onObserverDied(OMXMaster *master) {
412784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    LOGE("!!! Observer died. Quickly, do something, ... anything...");
413784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
414784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    // Try to force shutdown of the node and hope for the best.
415fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber    freeNode(master);
416784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
417784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
418784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Hubervoid OMXNodeInstance::onGetHandleFailed() {
419784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    delete this;
420784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
421784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
422784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber// static
423784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX_ERRORTYPE OMXNodeInstance::OnEvent(
424784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_HANDLETYPE hComponent,
425784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_PTR pAppData,
426784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_EVENTTYPE eEvent,
427784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_U32 nData1,
428784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_U32 nData2,
429784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_PTR pEventData) {
430784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData);
4312ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber    if (instance->mDying) {
4322ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber        return OMX_ErrorNone;
4332ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber    }
434784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return instance->owner()->OnEvent(
435784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            instance->nodeID(), eEvent, nData1, nData2, pEventData);
436784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
437784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
438784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber// static
439784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX_ERRORTYPE OMXNodeInstance::OnEmptyBufferDone(
440784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_HANDLETYPE hComponent,
441784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_PTR pAppData,
442784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) {
443784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData);
4442ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber    if (instance->mDying) {
4452ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber        return OMX_ErrorNone;
4462ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber    }
447784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return instance->owner()->OnEmptyBufferDone(instance->nodeID(), pBuffer);
448784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
449784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
450784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber// static
451784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX_ERRORTYPE OMXNodeInstance::OnFillBufferDone(
452784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_HANDLETYPE hComponent,
453784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_PTR pAppData,
454784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber        OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) {
455784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData);
4562ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber    if (instance->mDying) {
4572ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber        return OMX_ErrorNone;
4582ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber    }
459784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    return instance->owner()->OnFillBufferDone(instance->nodeID(), pBuffer);
460784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}
461784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
4623085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Hubervoid OMXNodeInstance::addActiveBuffer(OMX_U32 portIndex, OMX::buffer_id id) {
4633085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    ActiveBuffer active;
4643085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    active.mPortIndex = portIndex;
4653085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    active.mID = id;
4663085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    mActiveBuffers.push(active);
4673085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber}
4683085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
4693085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Hubervoid OMXNodeInstance::removeActiveBuffer(
4703085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        OMX_U32 portIndex, OMX::buffer_id id) {
4713085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    bool found = false;
4723085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    for (size_t i = 0; i < mActiveBuffers.size(); ++i) {
4733085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        if (mActiveBuffers[i].mPortIndex == portIndex
4743085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            && mActiveBuffers[i].mID == id) {
4753085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            found = true;
4763085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            mActiveBuffers.removeItemsAt(i);
4773085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber            break;
4783085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        }
4793085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    }
4803085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
4813085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    if (!found) {
4823085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        LOGW("Attempt to remove an active buffer we know nothing about...");
4833085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    }
4843085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber}
4853085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
4863085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Hubervoid OMXNodeInstance::freeActiveBuffers() {
4873085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    // Make sure to count down here, as freeBuffer will in turn remove
4883085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    // the active buffer from the vector...
4893085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    for (size_t i = mActiveBuffers.size(); i--;) {
4903085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber        freeBuffer(mActiveBuffers[i].mPortIndex, mActiveBuffers[i].mID);
4913085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber    }
4923085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber}
4933085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber
494784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}  // namespace android
495784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
496