OMXNodeInstance.cpp revision 2a3847ee1cbdaa8a65eee397a0173bb02211c459
1318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber/*
2318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * Copyright (C) 2009 The Android Open Source Project
3318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber *
4318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * you may not use this file except in compliance with the License.
6318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * You may obtain a copy of the License at
7318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber *
8318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber *
10318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * Unless required by applicable law or agreed to in writing, software
11318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * See the License for the specific language governing permissions and
14318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * limitations under the License.
15318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber */
16318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
17318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber//#define LOG_NDEBUG 0
18318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#define LOG_TAG "OMXNodeInstance"
19318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#include <utils/Log.h>
20318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
21318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#include "../include/OMXNodeInstance.h"
22f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huber#include "OMXMaster.h"
23318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
24e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber#include <OMX_Component.h>
25318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
26318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#include <binder/IMemory.h>
27318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#include <media/stagefright/MediaDebug.h>
282a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber#include <media/stagefright/MediaErrors.h>
29318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
30318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubernamespace android {
31318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
32318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstruct BufferMeta {
33318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta(const sp<IMemory> &mem, bool is_backup = false)
34318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        : mMem(mem),
35318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber          mIsBackup(is_backup) {
36318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
37318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
38318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta(size_t size)
39318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        : mSize(size),
40318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber          mIsBackup(false) {
41318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
42318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
43318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    void CopyFromOMX(const OMX_BUFFERHEADERTYPE *header) {
44318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        if (!mIsBackup) {
45318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            return;
46318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        }
47318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
48318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        memcpy((OMX_U8 *)mMem->pointer() + header->nOffset,
49318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber               header->pBuffer + header->nOffset,
50318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber               header->nFilledLen);
51318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
52318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
53318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    void CopyToOMX(const OMX_BUFFERHEADERTYPE *header) {
54318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        if (!mIsBackup) {
55318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            return;
56318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        }
57318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
58318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        memcpy(header->pBuffer + header->nOffset,
59318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber               (const OMX_U8 *)mMem->pointer() + header->nOffset,
60318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber               header->nFilledLen);
61318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
62318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
63318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberprivate:
64318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    sp<IMemory> mMem;
65318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    size_t mSize;
66318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    bool mIsBackup;
67318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
68318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta(const BufferMeta &);
69318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta &operator=(const BufferMeta &);
70318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber};
71318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
72318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static
73318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_CALLBACKTYPE OMXNodeInstance::kCallbacks = {
74318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    &OnEvent, &OnEmptyBufferDone, &OnFillBufferDone
75318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber};
76318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
77318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMXNodeInstance::OMXNodeInstance(
78318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX *owner, const sp<IOMXObserver> &observer)
79318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    : mOwner(owner),
80318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber      mNodeID(NULL),
81318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber      mHandle(NULL),
82134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber      mObserver(observer),
83134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber      mDying(false) {
84318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
85318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
86318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMXNodeInstance::~OMXNodeInstance() {
87318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    CHECK_EQ(mHandle, NULL);
88318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
89318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
90318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubervoid OMXNodeInstance::setHandle(OMX::node_id node_id, OMX_HANDLETYPE handle) {
91318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    CHECK_EQ(mHandle, NULL);
92318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mNodeID = node_id;
93318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mHandle = handle;
94318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
95318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
96318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX *OMXNodeInstance::owner() {
97318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return mOwner;
98318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
99318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
100318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubersp<IOMXObserver> OMXNodeInstance::observer() {
101318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return mObserver;
102318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
103318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
104318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX::node_id OMXNodeInstance::nodeID() {
105318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return mNodeID;
106318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
107318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
108318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatic status_t StatusFromOMXError(OMX_ERRORTYPE err) {
1092a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber    switch (err) {
1102a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber        case OMX_ErrorNone:
1112a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber            return OK;
1122a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber        case OMX_ErrorUnsupportedSetting:
1132a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber            return ERROR_UNSUPPORTED;
1142a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber        default:
1152a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber            return UNKNOWN_ERROR;
1162a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber    }
117318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
118318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
119f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huberstatus_t OMXNodeInstance::freeNode(OMXMaster *master) {
120d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    // Transition the node from its current state all the way down
121d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    // to "Loaded".
122d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    // This ensures that all active buffers are properly freed even
123d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    // for components that don't do this themselves on a call to
124d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    // "FreeHandle".
125d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
126134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    // The code below may trigger some more events to be dispatched
127134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    // by the OMX component - we want to ignore them as our client
128134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    // does not expect them.
129134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    mDying = true;
130134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
131d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    OMX_STATETYPE state;
132d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    CHECK_EQ(OMX_GetState(mHandle, &state), OMX_ErrorNone);
133d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    switch (state) {
134d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        case OMX_StateExecuting:
135d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        {
136d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            LOGV("forcing Executing->Idle");
137d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            sendCommand(OMX_CommandStateSet, OMX_StateIdle);
138d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            OMX_ERRORTYPE err;
139d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            while ((err = OMX_GetState(mHandle, &state)) == OMX_ErrorNone
1400d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber                   && state != OMX_StateIdle
1410d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber                   && state != OMX_StateInvalid) {
142d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber                usleep(100000);
143d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            }
144d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            CHECK_EQ(err, OMX_ErrorNone);
145d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
1460d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber            if (state == OMX_StateInvalid) {
1470d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber                break;
1480d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber            }
1490d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber
150d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            // fall through
151d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        }
152d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
153d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        case OMX_StateIdle:
154d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        {
155d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            LOGV("forcing Idle->Loaded");
156d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            sendCommand(OMX_CommandStateSet, OMX_StateLoaded);
157d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
158d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            freeActiveBuffers();
159d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
160d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            OMX_ERRORTYPE err;
161d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            while ((err = OMX_GetState(mHandle, &state)) == OMX_ErrorNone
1620d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber                   && state != OMX_StateLoaded
1630d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber                   && state != OMX_StateInvalid) {
164d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber                LOGV("waiting for Loaded state...");
165d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber                usleep(100000);
166d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            }
167d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            CHECK_EQ(err, OMX_ErrorNone);
168d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
169d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            // fall through
170d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        }
171d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
172d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        case OMX_StateLoaded:
173fa70cad40b01627ac1c22e04cdd548ece9c2654fAndreas Huber        case OMX_StateInvalid:
174d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            break;
175d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
176d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        default:
177d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            CHECK(!"should not be here, unknown state.");
178d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            break;
179d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    }
180d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
181f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huber    OMX_ERRORTYPE err = master->destroyComponentInstance(
182f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huber            static_cast<OMX_COMPONENTTYPE *>(mHandle));
183f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huber
184318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mHandle = NULL;
185318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
186318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    if (err != OMX_ErrorNone) {
187318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        LOGE("FreeHandle FAILED with error 0x%08x.", err);
188318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
189318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
190318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mOwner->invalidateNodeID(mNodeID);
191318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mNodeID = NULL;
192318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
19347bed1a7755ed58fa5d4c0d35b20468deb83bd60Andreas Huber    LOGV("OMXNodeInstance going away.");
19447bed1a7755ed58fa5d4c0d35b20468deb83bd60Andreas Huber    delete this;
195318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
196318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
197318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
198318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
199318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::sendCommand(
200318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_COMMANDTYPE cmd, OMX_S32 param) {
201318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
202318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
203318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_SendCommand(mHandle, cmd, param, NULL);
204318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
205318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
206318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
207318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::getParameter(
208318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_INDEXTYPE index, void *params, size_t size) {
209318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
210318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
211318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_GetParameter(mHandle, index, params);
212318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
213318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
214318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
215318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::setParameter(
216318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_INDEXTYPE index, const void *params, size_t size) {
217318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
218318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
219318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_SetParameter(
220318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            mHandle, index, const_cast<void *>(params));
221318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
222318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
223318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
224318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
225318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::getConfig(
226318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_INDEXTYPE index, void *params, size_t size) {
227318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
228318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
229318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_GetConfig(mHandle, index, params);
230318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
231318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
232318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
233318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::setConfig(
234318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_INDEXTYPE index, const void *params, size_t size) {
235318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
236318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
237318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_SetConfig(
238318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            mHandle, index, const_cast<void *>(params));
239318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
240318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
241318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
242318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
243318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::useBuffer(
244318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_U32 portIndex, const sp<IMemory> &params,
245318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX::buffer_id *buffer) {
246318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
247318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
248318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta *buffer_meta = new BufferMeta(params);
249318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
250318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_BUFFERHEADERTYPE *header;
251318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
252318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_UseBuffer(
253318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            mHandle, &header, portIndex, buffer_meta,
254318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            params->size(), static_cast<OMX_U8 *>(params->pointer()));
255318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
256318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    if (err != OMX_ErrorNone) {
257318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        LOGE("OMX_UseBuffer failed with error %d (0x%08x)", err, err);
258318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
259318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        delete buffer_meta;
260318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        buffer_meta = NULL;
261318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
262318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        *buffer = 0;
263318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
264318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        return UNKNOWN_ERROR;
265318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
266318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
267318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    *buffer = header;
268318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
269d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    addActiveBuffer(portIndex, *buffer);
270d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
271318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return OK;
272318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
273318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
274318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::allocateBuffer(
275570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber        OMX_U32 portIndex, size_t size, OMX::buffer_id *buffer,
276570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber        void **buffer_data) {
277318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
278318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
279318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta *buffer_meta = new BufferMeta(size);
280318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
281318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_BUFFERHEADERTYPE *header;
282318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
283318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_AllocateBuffer(
284318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            mHandle, &header, portIndex, buffer_meta, size);
285318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
286318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    if (err != OMX_ErrorNone) {
287318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        LOGE("OMX_AllocateBuffer failed with error %d (0x%08x)", err, err);
288318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
289318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        delete buffer_meta;
290318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        buffer_meta = NULL;
291318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
292318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        *buffer = 0;
293318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
294318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        return UNKNOWN_ERROR;
295318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
296318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
297318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    *buffer = header;
298570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber    *buffer_data = header->pBuffer;
299318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
300d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    addActiveBuffer(portIndex, *buffer);
301d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
302318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return OK;
303318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
304318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
305318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::allocateBufferWithBackup(
306318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_U32 portIndex, const sp<IMemory> &params,
307318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX::buffer_id *buffer) {
308318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
309318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
310318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta *buffer_meta = new BufferMeta(params, true);
311318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
312318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_BUFFERHEADERTYPE *header;
313318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
314318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_AllocateBuffer(
315318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            mHandle, &header, portIndex, buffer_meta, params->size());
316318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
317318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    if (err != OMX_ErrorNone) {
318318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        LOGE("OMX_AllocateBuffer failed with error %d (0x%08x)", err, err);
319318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
320318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        delete buffer_meta;
321318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        buffer_meta = NULL;
322318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
323318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        *buffer = 0;
324318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
325318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        return UNKNOWN_ERROR;
326318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
327318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
328318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    *buffer = header;
329318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
330d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    addActiveBuffer(portIndex, *buffer);
331d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
332318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return OK;
333318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
334318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
335318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::freeBuffer(
336318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_U32 portIndex, OMX::buffer_id buffer) {
337318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
338318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
339d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    removeActiveBuffer(portIndex, buffer);
340d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
341318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer;
342318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta *buffer_meta = static_cast<BufferMeta *>(header->pAppPrivate);
343318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
344318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_FreeBuffer(mHandle, portIndex, header);
345318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
346318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    delete buffer_meta;
347318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    buffer_meta = NULL;
348318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
349318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
350318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
351318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
352318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::fillBuffer(OMX::buffer_id buffer) {
353318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
354318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
355318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer;
356318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    header->nFilledLen = 0;
357318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    header->nOffset = 0;
358318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    header->nFlags = 0;
359318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
360318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_FillThisBuffer(mHandle, header);
361318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
362318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
363318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
364318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
365318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::emptyBuffer(
366318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX::buffer_id buffer,
367318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_U32 rangeOffset, OMX_U32 rangeLength,
368318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_U32 flags, OMX_TICKS timestamp) {
369318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
370318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
371318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer;
372318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    header->nFilledLen = rangeLength;
373318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    header->nOffset = rangeOffset;
374318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    header->nFlags = flags;
375318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    header->nTimeStamp = timestamp;
376318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
377318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta *buffer_meta =
378318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        static_cast<BufferMeta *>(header->pAppPrivate);
379318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    buffer_meta->CopyToOMX(header);
380318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
381318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_EmptyThisBuffer(mHandle, header);
382318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
383318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
384318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
385318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
386318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::getExtensionIndex(
387318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        const char *parameterName, OMX_INDEXTYPE *index) {
388318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
389318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
390318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_GetExtensionIndex(
391318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            mHandle, const_cast<char *>(parameterName), index);
392318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
393318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
394318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
395318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
396318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubervoid OMXNodeInstance::onMessage(const omx_message &msg) {
397318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    if (msg.type == omx_message::FILL_BUFFER_DONE) {
398318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_BUFFERHEADERTYPE *buffer =
399318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            static_cast<OMX_BUFFERHEADERTYPE *>(
400318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber                    msg.u.extended_buffer_data.buffer);
401318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
402318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        BufferMeta *buffer_meta =
403318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            static_cast<BufferMeta *>(buffer->pAppPrivate);
404318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
405318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        buffer_meta->CopyFromOMX(buffer);
406318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
407318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
408318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mObserver->onMessage(msg);
409318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
410318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
411f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Hubervoid OMXNodeInstance::onObserverDied(OMXMaster *master) {
412318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    LOGE("!!! Observer died. Quickly, do something, ... anything...");
413318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
414318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    // Try to force shutdown of the node and hope for the best.
415f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huber    freeNode(master);
416318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
417318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
418318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubervoid OMXNodeInstance::onGetHandleFailed() {
419318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    delete this;
420318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
421318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
422318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static
423318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_ERRORTYPE OMXNodeInstance::OnEvent(
424318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_HANDLETYPE hComponent,
425318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_PTR pAppData,
426318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_EVENTTYPE eEvent,
427318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_U32 nData1,
428318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_U32 nData2,
429318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_PTR pEventData) {
430318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData);
431134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    if (instance->mDying) {
432134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        return OMX_ErrorNone;
433134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    }
434318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return instance->owner()->OnEvent(
435318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            instance->nodeID(), eEvent, nData1, nData2, pEventData);
436318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
437318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
438318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static
439318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_ERRORTYPE OMXNodeInstance::OnEmptyBufferDone(
440318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_HANDLETYPE hComponent,
441318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_PTR pAppData,
442318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) {
443318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData);
444134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    if (instance->mDying) {
445134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        return OMX_ErrorNone;
446134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    }
447318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return instance->owner()->OnEmptyBufferDone(instance->nodeID(), pBuffer);
448318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
449318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
450318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static
451318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_ERRORTYPE OMXNodeInstance::OnFillBufferDone(
452318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_HANDLETYPE hComponent,
453318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_PTR pAppData,
454318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) {
455318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData);
456134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    if (instance->mDying) {
457134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        return OMX_ErrorNone;
458134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    }
459318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return instance->owner()->OnFillBufferDone(instance->nodeID(), pBuffer);
460318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
461318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
462d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Hubervoid OMXNodeInstance::addActiveBuffer(OMX_U32 portIndex, OMX::buffer_id id) {
463d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    ActiveBuffer active;
464d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    active.mPortIndex = portIndex;
465d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    active.mID = id;
466d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    mActiveBuffers.push(active);
467d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber}
468d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
469d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Hubervoid OMXNodeInstance::removeActiveBuffer(
470d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        OMX_U32 portIndex, OMX::buffer_id id) {
471d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    bool found = false;
472d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    for (size_t i = 0; i < mActiveBuffers.size(); ++i) {
473d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        if (mActiveBuffers[i].mPortIndex == portIndex
474d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            && mActiveBuffers[i].mID == id) {
475d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            found = true;
476d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            mActiveBuffers.removeItemsAt(i);
477d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            break;
478d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        }
479d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    }
480d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
481d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    if (!found) {
482d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        LOGW("Attempt to remove an active buffer we know nothing about...");
483d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    }
484d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber}
485d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
486d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Hubervoid OMXNodeInstance::freeActiveBuffers() {
487d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    // Make sure to count down here, as freeBuffer will in turn remove
488d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    // the active buffer from the vector...
489d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    for (size_t i = mActiveBuffers.size(); i--;) {
490d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        freeBuffer(mActiveBuffers[i].mPortIndex, mActiveBuffers[i].mID);
491d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    }
492d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber}
493d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
494318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}  // namespace android
495318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
496