120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber/*
220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Copyright (C) 2009 The Android Open Source Project
320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *
420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * you may not use this file except in compliance with the License.
620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * You may obtain a copy of the License at
720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *
820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *
1020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Unless required by applicable law or agreed to in writing, software
1120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
1220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * See the License for the specific language governing permissions and
1420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * limitations under the License.
1520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber */
1620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
17db43b34c3428e480f8c4c66e7e88f4001f37f91eMark Salyzyn#include <inttypes.h>
18db43b34c3428e480f8c4c66e7e88f4001f37f91eMark Salyzyn
1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber//#define LOG_NDEBUG 0
2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#define LOG_TAG "OMX"
2120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/Log.h>
2220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
23e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber#include <dlfcn.h>
24fa71449d6c3b3da082d8fbedf9470ee8750a1646Andreas Huber
25318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#include "../include/OMX.h"
268b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
27318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#include "../include/OMXNodeInstance.h"
2889e69da4d86348409994c9dafbbb2634ccd7c196Andreas Huber
2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <binder/IMemory.h>
30f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong#include <media/stagefright/foundation/ADebug.h>
3152e71f87f1dac8d2f6bcaf77bb25b78cba664c43Andreas Huber#include <utils/threads.h>
3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
33e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber#include "OMXMaster.h"
3473dd808754c641fe798273d356ee38368715fa7bLajos Molnar#include "OMXUtils.h"
35e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber
36fafcc219184223ab584eac3b03ee807e2798207aPraveen Chavan#include <OMX_AsString.h>
3720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <OMX_Component.h>
3890fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar#include <OMX_VideoExt.h>
3920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
4020111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android {
4120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
42cf3abd4875fd54ba40fccdbd90755d2a5ecfca60Marco Nelissen// node ids are created by concatenating the pid with a 16-bit counter
43cf3abd4875fd54ba40fccdbd90755d2a5ecfca60Marco Nelissenstatic size_t kMaxNodeInstances = (1 << 16);
44cf3abd4875fd54ba40fccdbd90755d2a5ecfca60Marco Nelissen
45693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber////////////////////////////////////////////////////////////////////////////////
46693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
47ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten// This provides the underlying Thread used by CallbackDispatcher.
48ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten// Note that deriving CallbackDispatcher from Thread does not work.
49ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten
50ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kastenstruct OMX::CallbackDispatcherThread : public Thread {
51ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten    CallbackDispatcherThread(CallbackDispatcher *dispatcher)
52ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten        : mDispatcher(dispatcher) {
53ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten    }
54ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten
55ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kastenprivate:
56ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten    CallbackDispatcher *mDispatcher;
57ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten
58ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten    bool threadLoop();
59ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten
60ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten    CallbackDispatcherThread(const CallbackDispatcherThread &);
61ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten    CallbackDispatcherThread &operator=(const CallbackDispatcherThread &);
62ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten};
63ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten
64ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten////////////////////////////////////////////////////////////////////////////////
65ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten
66693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstruct OMX::CallbackDispatcher : public RefBase {
6778d26445a7dfe8f49d7005185f28b01cffe80adfJames Dong    CallbackDispatcher(OMXNodeInstance *owner);
68693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
6926a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar    // Posts |msg| to the listener's queue. If |realTime| is true, the listener thread is notified
7026a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar    // that a new message is available on the queue. Otherwise, the message stays on the queue, but
7126a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar    // the listener is not notified of it. It will process this message when a subsequent message
7226a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar    // is posted with |realTime| set to true.
7326a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar    void post(const omx_message &msg, bool realTime = true);
74693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
75ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten    bool loop();
76ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten
77693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberprotected:
78693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    virtual ~CallbackDispatcher();
79693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
80693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberprivate:
81693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    Mutex mLock;
82318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
8378d26445a7dfe8f49d7005185f28b01cffe80adfJames Dong    OMXNodeInstance *mOwner;
84693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    bool mDone;
85693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    Condition mQueueChanged;
8626a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar    std::list<omx_message> mQueue;
87693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
88ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten    sp<CallbackDispatcherThread> mThread;
89693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
9026a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar    void dispatch(std::list<omx_message> &messages);
91693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
92693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    CallbackDispatcher(const CallbackDispatcher &);
93693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    CallbackDispatcher &operator=(const CallbackDispatcher &);
94693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber};
95693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
9678d26445a7dfe8f49d7005185f28b01cffe80adfJames DongOMX::CallbackDispatcher::CallbackDispatcher(OMXNodeInstance *owner)
97318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    : mOwner(owner),
98318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber      mDone(false) {
99ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten    mThread = new CallbackDispatcherThread(this);
100078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber    mThread->run("OMXCallbackDisp", ANDROID_PRIORITY_FOREGROUND);
101693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber}
102693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
103693d271e62a3726689ff68f4505ba49228eb94b2Andreas HuberOMX::CallbackDispatcher::~CallbackDispatcher() {
104693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    {
105693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        Mutex::Autolock autoLock(mLock);
106693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
107693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        mDone = true;
108693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        mQueueChanged.signal();
109693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    }
110693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
11140d76d70587ed095692615b0a1b657da861f7ffcGlenn Kasten    // A join on self can happen if the last ref to CallbackDispatcher
11240d76d70587ed095692615b0a1b657da861f7ffcGlenn Kasten    // is released within the CallbackDispatcherThread loop
113ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten    status_t status = mThread->join();
11440d76d70587ed095692615b0a1b657da861f7ffcGlenn Kasten    if (status != WOULD_BLOCK) {
11540d76d70587ed095692615b0a1b657da861f7ffcGlenn Kasten        // Other than join to self, the only other error return codes are
11640d76d70587ed095692615b0a1b657da861f7ffcGlenn Kasten        // whatever readyToRun() returns, and we don't override that
117f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong        CHECK_EQ(status, (status_t)NO_ERROR);
11840d76d70587ed095692615b0a1b657da861f7ffcGlenn Kasten    }
119693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber}
120693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
12126a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnarvoid OMX::CallbackDispatcher::post(const omx_message &msg, bool realTime) {
122693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    Mutex::Autolock autoLock(mLock);
12352e71f87f1dac8d2f6bcaf77bb25b78cba664c43Andreas Huber
124693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    mQueue.push_back(msg);
12526a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar    if (realTime) {
12626a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar        mQueueChanged.signal();
12726a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar    }
128693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber}
129693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
13026a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnarvoid OMX::CallbackDispatcher::dispatch(std::list<omx_message> &messages) {
13178d26445a7dfe8f49d7005185f28b01cffe80adfJames Dong    if (mOwner == NULL) {
1323856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("Would have dispatched a message to a node that's already gone.");
133318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        return;
134693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    }
13526a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar    mOwner->onMessages(messages);
136693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber}
137693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
138ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kastenbool OMX::CallbackDispatcher::loop() {
139693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    for (;;) {
14026a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar        std::list<omx_message> messages;
141693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
142693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        {
143693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            Mutex::Autolock autoLock(mLock);
144693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            while (!mDone && mQueue.empty()) {
145693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber                mQueueChanged.wait(mLock);
146693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            }
147693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
148693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            if (mDone) {
149693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber                break;
150693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            }
151693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
15226a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar            messages.swap(mQueue);
153693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        }
154693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
15526a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar        dispatch(messages);
156693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    }
157ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten
158ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten    return false;
159ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten}
160ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten
161ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten////////////////////////////////////////////////////////////////////////////////
162ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten
163ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kastenbool OMX::CallbackDispatcherThread::threadLoop() {
164ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten    return mDispatcher->loop();
165693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber}
166693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
167693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber////////////////////////////////////////////////////////////////////////////////
168693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
169318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX::OMX()
170e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber    : mMaster(new OMXMaster),
171318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber      mNodeCounter(0) {
17220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
17320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
174e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas HuberOMX::~OMX() {
175e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber    delete mMaster;
176e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber    mMaster = NULL;
177e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber}
178e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber
179318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubervoid OMX::binderDied(const wp<IBinder> &the_late_who) {
180318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMXNodeInstance *instance;
18120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
182318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    {
183318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        Mutex::Autolock autoLock(mLock);
18420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
185318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        ssize_t index = mLiveNodes.indexOfKey(the_late_who);
186ca00182c94d2ec1bdc9baeb1385e0cf3de9171d1Marco Nelissen
187ca00182c94d2ec1bdc9baeb1385e0cf3de9171d1Marco Nelissen        if (index < 0) {
188ca00182c94d2ec1bdc9baeb1385e0cf3de9171d1Marco Nelissen            ALOGE("b/27597103, nonexistent observer on binderDied");
189ca00182c94d2ec1bdc9baeb1385e0cf3de9171d1Marco Nelissen            android_errorWriteLog(0x534e4554, "27597103");
190ca00182c94d2ec1bdc9baeb1385e0cf3de9171d1Marco Nelissen            return;
191ca00182c94d2ec1bdc9baeb1385e0cf3de9171d1Marco Nelissen        }
192318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
193318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        instance = mLiveNodes.editValueAt(index);
194318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        mLiveNodes.removeItemsAt(index);
195318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
196f0128187491b4d65b9c2620d46f5af807f63d728Andreas Huber        index = mDispatchers.indexOfKey(instance->nodeID());
197f0128187491b4d65b9c2620d46f5af807f63d728Andreas Huber        CHECK(index >= 0);
198f0128187491b4d65b9c2620d46f5af807f63d728Andreas Huber        mDispatchers.removeItemsAt(index);
199f0128187491b4d65b9c2620d46f5af807f63d728Andreas Huber
200318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        invalidateNodeID_l(instance->nodeID());
201318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
202318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
203f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huber    instance->onObserverDied(mMaster);
20420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
20520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2068dde7269a5356503d2b283234b6cb46d0c3f214eWei Jiabool OMX::isSecure(node_id node) {
2078dde7269a5356503d2b283234b6cb46d0c3f214eWei Jia    OMXNodeInstance *instance = findInstance(node);
2088dde7269a5356503d2b283234b6cb46d0c3f214eWei Jia    return (instance == NULL ? false : instance->isSecure());
2098dde7269a5356503d2b283234b6cb46d0c3f214eWei Jia}
2108dde7269a5356503d2b283234b6cb46d0c3f214eWei Jia
211d411b4ca2945cd8974a3a78199fce94646950128Andreas Huberbool OMX::livesLocally(node_id /* node */, pid_t pid) {
2127eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber    return pid == getpid();
2137eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber}
2147eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
215134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huberstatus_t OMX::listNodes(List<ComponentInfo> *list) {
21620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    list->clear();
21720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
21820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    OMX_U32 index = 0;
21920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    char componentName[256];
220e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber    while (mMaster->enumerateComponents(
221e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber                componentName, sizeof(componentName), index) == OMX_ErrorNone) {
222134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        list->push_back(ComponentInfo());
223134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        ComponentInfo &info = *--list->end();
224134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
225134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        info.mName = componentName;
22620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
227134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        Vector<String8> roles;
228134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        OMX_ERRORTYPE err =
229134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            mMaster->getRolesOfComponent(componentName, &roles);
230134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
231134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        if (err == OMX_ErrorNone) {
232134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            for (OMX_U32 i = 0; i < roles.size(); ++i) {
233134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                info.mRoles.push_back(roles[i]);
234134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            }
235134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        }
2368ae1d0bdcef22f2bdd8d283e0e615f3ba6c3f4cdAndreas Huber
23720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        ++index;
23820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
23920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
24020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return OK;
24120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
24220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
243318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMX::allocateNode(
24423858874bbce68fb5ac83250087fa7788c97dd12Marco Nelissen        const char *name, const sp<IOMXObserver> &observer,
24523858874bbce68fb5ac83250087fa7788c97dd12Marco Nelissen        sp<IBinder> *nodeBinder, node_id *node) {
24620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    Mutex::Autolock autoLock(mLock);
24720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
24820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    *node = 0;
24923858874bbce68fb5ac83250087fa7788c97dd12Marco Nelissen    if (nodeBinder != NULL) {
25023858874bbce68fb5ac83250087fa7788c97dd12Marco Nelissen        *nodeBinder = NULL;
25123858874bbce68fb5ac83250087fa7788c97dd12Marco Nelissen    }
25220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
253cf3abd4875fd54ba40fccdbd90755d2a5ecfca60Marco Nelissen    if (mNodeIDToInstance.size() == kMaxNodeInstances) {
254cf3abd4875fd54ba40fccdbd90755d2a5ecfca60Marco Nelissen        // all possible node IDs are in use
255cf3abd4875fd54ba40fccdbd90755d2a5ecfca60Marco Nelissen        return NO_MEMORY;
256cf3abd4875fd54ba40fccdbd90755d2a5ecfca60Marco Nelissen    }
257cf3abd4875fd54ba40fccdbd90755d2a5ecfca60Marco Nelissen
258f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    OMXNodeInstance *instance = new OMXNodeInstance(this, observer, name);
25920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
260e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber    OMX_COMPONENTTYPE *handle;
261e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber    OMX_ERRORTYPE err = mMaster->makeComponentInstance(
262e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber            name, &OMXNodeInstance::kCallbacks,
263e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber            instance, &handle);
26420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
26520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    if (err != OMX_ErrorNone) {
266fafcc219184223ab584eac3b03ee807e2798207aPraveen Chavan        ALOGE("FAILED to allocate omx component '%s' err=%s(%#x)", name, asString(err), err);
26720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
268318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        instance->onGetHandleFailed();
26920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
270fafcc219184223ab584eac3b03ee807e2798207aPraveen Chavan        return StatusFromOMXError(err);
27120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
27220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
273cf3abd4875fd54ba40fccdbd90755d2a5ecfca60Marco Nelissen    *node = makeNodeID_l(instance);
27478d26445a7dfe8f49d7005185f28b01cffe80adfJames Dong    mDispatchers.add(*node, new CallbackDispatcher(instance));
27520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
276318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    instance->setHandle(*node, handle);
277318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
27806b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen    mLiveNodes.add(IInterface::asBinder(observer), instance);
27906b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen    IInterface::asBinder(observer)->linkToDeath(this);
28020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
28120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return OK;
28220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
28320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
284318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMX::freeNode(node_id node) {
285318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMXNodeInstance *instance = findInstance(node);
28620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2871dadfe4fd466b5eab10e5aefa1343e53fbf4cb17Flanker    if (instance == NULL) {
2881dadfe4fd466b5eab10e5aefa1343e53fbf4cb17Flanker        return OK;
2891dadfe4fd466b5eab10e5aefa1343e53fbf4cb17Flanker    }
2901dadfe4fd466b5eab10e5aefa1343e53fbf4cb17Flanker
29145dfb6ae94b33eea04d74afa378c1664e884f09aHaynes Mathew George    {
29245dfb6ae94b33eea04d74afa378c1664e884f09aHaynes Mathew George        Mutex::Autolock autoLock(mLock);
29306b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen        ssize_t index = mLiveNodes.indexOfKey(IInterface::asBinder(instance->observer()));
29445dfb6ae94b33eea04d74afa378c1664e884f09aHaynes Mathew George        if (index < 0) {
29545dfb6ae94b33eea04d74afa378c1664e884f09aHaynes Mathew George            // This could conceivably happen if the observer dies at roughly the
29645dfb6ae94b33eea04d74afa378c1664e884f09aHaynes Mathew George            // same time that a client attempts to free the node explicitly.
29745dfb6ae94b33eea04d74afa378c1664e884f09aHaynes Mathew George            return OK;
29845dfb6ae94b33eea04d74afa378c1664e884f09aHaynes Mathew George        }
29945dfb6ae94b33eea04d74afa378c1664e884f09aHaynes Mathew George        mLiveNodes.removeItemsAt(index);
300b78ff5fb6f56c679bce936078180ce61a1e97288Andreas Huber    }
301f0128187491b4d65b9c2620d46f5af807f63d728Andreas Huber
30206b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen    IInterface::asBinder(instance->observer())->unlinkToDeath(this);
30300998fbb52dfa78ac3a4b3706d64fc612926bfbcAndreas Huber
30400998fbb52dfa78ac3a4b3706d64fc612926bfbcAndreas Huber    status_t err = instance->freeNode(mMaster);
30500998fbb52dfa78ac3a4b3706d64fc612926bfbcAndreas Huber
30614c858e80dfe2030c9f343dc0c6e2048e030731bJames Dong    {
30714c858e80dfe2030c9f343dc0c6e2048e030731bJames Dong        Mutex::Autolock autoLock(mLock);
30845dfb6ae94b33eea04d74afa378c1664e884f09aHaynes Mathew George        ssize_t index = mDispatchers.indexOfKey(node);
30914c858e80dfe2030c9f343dc0c6e2048e030731bJames Dong        CHECK(index >= 0);
31014c858e80dfe2030c9f343dc0c6e2048e030731bJames Dong        mDispatchers.removeItemsAt(index);
31114c858e80dfe2030c9f343dc0c6e2048e030731bJames Dong    }
312f0128187491b4d65b9c2620d46f5af807f63d728Andreas Huber
31300998fbb52dfa78ac3a4b3706d64fc612926bfbcAndreas Huber    return err;
31420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
31520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
316318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMX::sendCommand(
31720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) {
318fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    OMXNodeInstance *instance = findInstance(node);
319fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
320fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    if (instance == NULL) {
321fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih        return NAME_NOT_FOUND;
322fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    }
323fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
324fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    return instance->sendCommand(cmd, param);
32520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
32620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
327318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMX::getParameter(
32820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        node_id node, OMX_INDEXTYPE index,
32920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        void *params, size_t size) {
330609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    ALOGV("getParameter(%u %#x %p %zd)", node, index, params, size);
331fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    OMXNodeInstance *instance = findInstance(node);
332fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
333fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    if (instance == NULL) {
334fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih        return NAME_NOT_FOUND;
335fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    }
336fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
337fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    return instance->getParameter(
338318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            index, params, size);
33920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
34020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
341318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMX::setParameter(
34220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        node_id node, OMX_INDEXTYPE index,
34320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        const void *params, size_t size) {
344609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    ALOGV("setParameter(%u %#x %p %zd)", node, index, params, size);
345fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    OMXNodeInstance *instance = findInstance(node);
346fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
347fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    if (instance == NULL) {
348fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih        return NAME_NOT_FOUND;
349fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    }
350fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
351fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    return instance->setParameter(
352318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            index, params, size);
35320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
35420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
355318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMX::getConfig(
356693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        node_id node, OMX_INDEXTYPE index,
357693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        void *params, size_t size) {
358fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    OMXNodeInstance *instance = findInstance(node);
359fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
360fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    if (instance == NULL) {
361fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih        return NAME_NOT_FOUND;
362fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    }
363fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
364fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    return instance->getConfig(
365318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            index, params, size);
366693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber}
367693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
368318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMX::setConfig(
369693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        node_id node, OMX_INDEXTYPE index,
370693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        const void *params, size_t size) {
371fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    OMXNodeInstance *instance = findInstance(node);
372fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
373fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    if (instance == NULL) {
374fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih        return NAME_NOT_FOUND;
375fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    }
376fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
377fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    return instance->setConfig(
378318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            index, params, size);
379693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber}
380693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
381b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennisstatus_t OMX::getState(
382b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis        node_id node, OMX_STATETYPE* state) {
383fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    OMXNodeInstance *instance = findInstance(node);
384fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
385fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    if (instance == NULL) {
386fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih        return NAME_NOT_FOUND;
387fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    }
388fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
389fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    return instance->getState(
390b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis            state);
391b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis}
392b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis
393a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnarstatus_t OMX::enableNativeBuffers(
394a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar        node_id node, OMX_U32 port_index, OMX_BOOL graphic, OMX_BOOL enable) {
395fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    OMXNodeInstance *instance = findInstance(node);
396fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
397fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    if (instance == NULL) {
398fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih        return NAME_NOT_FOUND;
399fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    }
400fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
401a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar    return instance->enableNativeBuffers(port_index, graphic, enable);
40283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis}
40383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
404e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennisstatus_t OMX::getGraphicBufferUsage(
405e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        node_id node, OMX_U32 port_index, OMX_U32* usage) {
406fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    OMXNodeInstance *instance = findInstance(node);
407fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
408fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    if (instance == NULL) {
409fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih        return NAME_NOT_FOUND;
410fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    }
411fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
412fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    return instance->getGraphicBufferUsage(port_index, usage);
413e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis}
414e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
415e870772a78ffe08b1c14a791e368f1499f1be0f3James Dongstatus_t OMX::storeMetaDataInBuffers(
416054219874873b41f1c815552987c10465c34ba2bLajos Molnar        node_id node, OMX_U32 port_index, OMX_BOOL enable, MetadataBufferType *type) {
417fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    OMXNodeInstance *instance = findInstance(node);
418fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
419fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    if (instance == NULL) {
420fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih        return NAME_NOT_FOUND;
421fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    }
422fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
423fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    return instance->storeMetaDataInBuffers(port_index, enable, type);
424e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong}
425e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
42656ce726019f700a95ce5b45beebceadae4836e30Lajos Molnarstatus_t OMX::prepareForAdaptivePlayback(
42756ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar        node_id node, OMX_U32 portIndex, OMX_BOOL enable,
42856ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar        OMX_U32 maxFrameWidth, OMX_U32 maxFrameHeight) {
429fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    OMXNodeInstance *instance = findInstance(node);
430fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
431fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    if (instance == NULL) {
432fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih        return NAME_NOT_FOUND;
433fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    }
434fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
435fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    return instance->prepareForAdaptivePlayback(
43656ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar            portIndex, enable, maxFrameWidth, maxFrameHeight);
43756ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar}
43856ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar
4395a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachadstatus_t OMX::configureVideoTunnelMode(
4405a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad        node_id node, OMX_U32 portIndex, OMX_BOOL tunneled,
4415a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad        OMX_U32 audioHwSync, native_handle_t **sidebandHandle) {
442fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    OMXNodeInstance *instance = findInstance(node);
443fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
444fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    if (instance == NULL) {
445fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih        return NAME_NOT_FOUND;
446fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    }
447fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
448fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    return instance->configureVideoTunnelMode(
4495a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad            portIndex, tunneled, audioHwSync, sidebandHandle);
4505a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad}
4515a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad
452318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMX::useBuffer(
45320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        node_id node, OMX_U32 port_index, const sp<IMemory> &params,
454cc7cc67349b7a3f498882087aa42ffc05a2daf11Lajos Molnar        buffer_id *buffer, OMX_U32 allottedSize) {
455fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    OMXNodeInstance *instance = findInstance(node);
456fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
457fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    if (instance == NULL) {
458fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih        return NAME_NOT_FOUND;
459fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    }
460fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
461fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    return instance->useBuffer(
462cc7cc67349b7a3f498882087aa42ffc05a2daf11Lajos Molnar            port_index, params, buffer, allottedSize);
46320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
46420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
46583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennisstatus_t OMX::useGraphicBuffer(
46683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        node_id node, OMX_U32 port_index,
46783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer) {
468fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    OMXNodeInstance *instance = findInstance(node);
469fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
470fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    if (instance == NULL) {
471fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih        return NAME_NOT_FOUND;
472fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    }
473fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
474fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    return instance->useGraphicBuffer(
47583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            port_index, graphicBuffer, buffer);
47683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis}
47783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
478d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnarstatus_t OMX::updateGraphicBufferInMeta(
479d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar        node_id node, OMX_U32 port_index,
480d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar        const sp<GraphicBuffer> &graphicBuffer, buffer_id buffer) {
481fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    OMXNodeInstance *instance = findInstance(node);
482fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
483fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    if (instance == NULL) {
484fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih        return NAME_NOT_FOUND;
485fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    }
486fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
487fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    return instance->updateGraphicBufferInMeta(
488d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar            port_index, graphicBuffer, buffer);
489d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar}
490d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar
4917e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnarstatus_t OMX::updateNativeHandleInMeta(
4927e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar        node_id node, OMX_U32 port_index,
4937e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar        const sp<NativeHandle> &nativeHandle, buffer_id buffer) {
4947e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar    OMXNodeInstance *instance = findInstance(node);
4957e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar
4967e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar    if (instance == NULL) {
4977e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar        return NAME_NOT_FOUND;
4987e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar    }
4997e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar
5007e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar    return instance->updateNativeHandleInMeta(
5017e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar            port_index, nativeHandle, buffer);
5027e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar}
5037e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar
5047cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenstatus_t OMX::createInputSurface(
50557fad3c31f46ec98d15bc253c16f9d269aeb8ea7Lajos Molnar        node_id node, OMX_U32 port_index, android_dataspace dataSpace,
506054219874873b41f1c815552987c10465c34ba2bLajos Molnar        sp<IGraphicBufferProducer> *bufferProducer, MetadataBufferType *type) {
507fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    OMXNodeInstance *instance = findInstance(node);
508fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
509fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    if (instance == NULL) {
510fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih        return NAME_NOT_FOUND;
511fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    }
512fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
513fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    return instance->createInputSurface(
51457fad3c31f46ec98d15bc253c16f9d269aeb8ea7Lajos Molnar            port_index, dataSpace, bufferProducer, type);
5157cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden}
5167cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
517d291c222357303b9611cab89d0c3b047584ef377Chong Zhangstatus_t OMX::createPersistentInputSurface(
518d291c222357303b9611cab89d0c3b047584ef377Chong Zhang        sp<IGraphicBufferProducer> *bufferProducer,
519d291c222357303b9611cab89d0c3b047584ef377Chong Zhang        sp<IGraphicBufferConsumer> *bufferConsumer) {
520d291c222357303b9611cab89d0c3b047584ef377Chong Zhang    return OMXNodeInstance::createPersistentInputSurface(
521d291c222357303b9611cab89d0c3b047584ef377Chong Zhang            bufferProducer, bufferConsumer);
522d291c222357303b9611cab89d0c3b047584ef377Chong Zhang}
523d291c222357303b9611cab89d0c3b047584ef377Chong Zhang
5248f469e18c307cb9dc0d16ed9225972aa8be4516fChong Zhangstatus_t OMX::setInputSurface(
525d291c222357303b9611cab89d0c3b047584ef377Chong Zhang        node_id node, OMX_U32 port_index,
526054219874873b41f1c815552987c10465c34ba2bLajos Molnar        const sp<IGraphicBufferConsumer> &bufferConsumer, MetadataBufferType *type) {
527fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    OMXNodeInstance *instance = findInstance(node);
528fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
529fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    if (instance == NULL) {
530fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih        return NAME_NOT_FOUND;
531fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    }
532fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
533fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    return instance->setInputSurface(port_index, bufferConsumer, type);
534d291c222357303b9611cab89d0c3b047584ef377Chong Zhang}
535d291c222357303b9611cab89d0c3b047584ef377Chong Zhang
536d291c222357303b9611cab89d0c3b047584ef377Chong Zhang
5377cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenstatus_t OMX::signalEndOfInputStream(node_id node) {
538fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    OMXNodeInstance *instance = findInstance(node);
539fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
540fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    if (instance == NULL) {
541fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih        return NAME_NOT_FOUND;
542fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    }
543fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
544fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    return instance->signalEndOfInputStream();
5457cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden}
5467cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
547a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnarstatus_t OMX::allocateSecureBuffer(
54820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        node_id node, OMX_U32 port_index, size_t size,
5491b40f2804a27b695e9e53fb1699b64cb0dd387f9Lajos Molnar        buffer_id *buffer, void **buffer_data, sp<NativeHandle> *native_handle) {
550fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    OMXNodeInstance *instance = findInstance(node);
551fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
552fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    if (instance == NULL) {
553fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih        return NAME_NOT_FOUND;
554fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    }
555fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
556a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar    return instance->allocateSecureBuffer(
557a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar            port_index, size, buffer, buffer_data, native_handle);
55820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
55920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
560318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMX::allocateBufferWithBackup(
56120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        node_id node, OMX_U32 port_index, const sp<IMemory> &params,
562cc7cc67349b7a3f498882087aa42ffc05a2daf11Lajos Molnar        buffer_id *buffer, OMX_U32 allottedSize) {
563fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    OMXNodeInstance *instance = findInstance(node);
564fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
565fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    if (instance == NULL) {
566fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih        return NAME_NOT_FOUND;
567fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    }
568fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
569fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    return instance->allocateBufferWithBackup(
570cc7cc67349b7a3f498882087aa42ffc05a2daf11Lajos Molnar            port_index, params, buffer, allottedSize);
57120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
57220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
573318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMX::freeBuffer(node_id node, OMX_U32 port_index, buffer_id buffer) {
574fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    OMXNodeInstance *instance = findInstance(node);
575fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
576fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    if (instance == NULL) {
577fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih        return NAME_NOT_FOUND;
578fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    }
579fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
580fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    return instance->freeBuffer(
581318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            port_index, buffer);
582318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
58320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
58415ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnarstatus_t OMX::fillBuffer(node_id node, buffer_id buffer, int fenceFd) {
585fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    OMXNodeInstance *instance = findInstance(node);
586fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
587fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    if (instance == NULL) {
588fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih        return NAME_NOT_FOUND;
589fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    }
590fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
591fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    return instance->fillBuffer(buffer, fenceFd);
592318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
59320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
594318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMX::emptyBuffer(
595318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        node_id node,
596318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        buffer_id buffer,
597318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_U32 range_offset, OMX_U32 range_length,
59815ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar        OMX_U32 flags, OMX_TICKS timestamp, int fenceFd) {
599fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    OMXNodeInstance *instance = findInstance(node);
600fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
601fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    if (instance == NULL) {
602fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih        return NAME_NOT_FOUND;
603fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    }
604fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
605fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    return instance->emptyBuffer(
60615ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar            buffer, range_offset, range_length, flags, timestamp, fenceFd);
607318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
60820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
609318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMX::getExtensionIndex(
610318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        node_id node,
611318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        const char *parameter_name,
612318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_INDEXTYPE *index) {
613fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    OMXNodeInstance *instance = findInstance(node);
614fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
615fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    if (instance == NULL) {
616fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih        return NAME_NOT_FOUND;
617fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    }
618fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
619fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    return instance->getExtensionIndex(
620318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            parameter_name, index);
62120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
62220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
623e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huberstatus_t OMX::setInternalOption(
624e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber        node_id node,
625e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber        OMX_U32 port_index,
626e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber        InternalOptionType type,
627e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber        const void *data,
628e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber        size_t size) {
629fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    OMXNodeInstance *instance = findInstance(node);
630fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
631fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    if (instance == NULL) {
632fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih        return NAME_NOT_FOUND;
633fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    }
634fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
635fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    return instance->setInternalOption(port_index, type, data, size);
636e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber}
637e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber
63820111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberOMX_ERRORTYPE OMX::OnEvent(
639318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        node_id node,
64020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        OMX_IN OMX_EVENTTYPE eEvent,
64120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        OMX_IN OMX_U32 nData1,
64220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        OMX_IN OMX_U32 nData2,
64390fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar        OMX_IN OMX_PTR pEventData) {
644db43b34c3428e480f8c4c66e7e88f4001f37f91eMark Salyzyn    ALOGV("OnEvent(%d, %" PRIu32", %" PRIu32 ")", eEvent, nData1, nData2);
645fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    OMXNodeInstance *instance = findInstance(node);
646fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih
647fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    if (instance == NULL) {
648fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih        return OMX_ErrorComponentNotFound;
649fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    }
65020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
6517cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    // Forward to OMXNodeInstance.
652fdc6e509ce99682de9b6fbcaeb0f7b66eb4b8d89Robert Shih    instance->onEvent(eEvent, nData1, nData2);
6537cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
65490fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar    sp<OMX::CallbackDispatcher> dispatcher = findDispatcher(node);
65590fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar
65690fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar    // output rendered events are not processed as regular events until they hit the observer
65790fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar    if (eEvent == OMX_EventOutputRendered) {
65890fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar        if (pEventData == NULL) {
65990fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar            return OMX_ErrorBadParameter;
66090fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar        }
66190fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar
66290fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar        // process data from array
66390fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar        OMX_VIDEO_RENDEREVENTTYPE *renderData = (OMX_VIDEO_RENDEREVENTTYPE *)pEventData;
66490fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar        for (size_t i = 0; i < nData1; ++i) {
66590fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar            omx_message msg;
66690fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar            msg.type = omx_message::FRAME_RENDERED;
66790fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar            msg.node = node;
66890fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar            msg.fenceFd = -1;
66990fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar            msg.u.render_data.timestamp = renderData[i].nMediaTimeUs;
67090fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar            msg.u.render_data.nanoTime = renderData[i].nSystemTimeNs;
67190fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar
67290fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar            dispatcher->post(msg, false /* realTime */);
67390fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar        }
67490fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar        return OMX_ErrorNone;
67590fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar    }
67690fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar
67720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    omx_message msg;
67820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    msg.type = omx_message::EVENT;
679318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    msg.node = node;
68015ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    msg.fenceFd = -1;
68120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    msg.u.event_data.event = eEvent;
68220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    msg.u.event_data.data1 = nData1;
68320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    msg.u.event_data.data2 = nData2;
68420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
68590fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar    dispatcher->post(msg, true /* realTime */);
68620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
68720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return OMX_ErrorNone;
68820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
689318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
69020111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberOMX_ERRORTYPE OMX::OnEmptyBufferDone(
69115ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar        node_id node, buffer_id buffer, OMX_IN OMX_BUFFERHEADERTYPE *pBuffer, int fenceFd) {
6923856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("OnEmptyBufferDone buffer=%p", pBuffer);
69320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
69420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    omx_message msg;
69520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    msg.type = omx_message::EMPTY_BUFFER_DONE;
696318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    msg.node = node;
69715ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    msg.fenceFd = fenceFd;
698609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    msg.u.buffer_data.buffer = buffer;
69920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
70078d26445a7dfe8f49d7005185f28b01cffe80adfJames Dong    findDispatcher(node)->post(msg);
70120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
70220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return OMX_ErrorNone;
70320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
70420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
70520111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberOMX_ERRORTYPE OMX::OnFillBufferDone(
70615ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar        node_id node, buffer_id buffer, OMX_IN OMX_BUFFERHEADERTYPE *pBuffer, int fenceFd) {
7073856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("OnFillBufferDone buffer=%p", pBuffer);
70820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
70920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    omx_message msg;
71020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    msg.type = omx_message::FILL_BUFFER_DONE;
711318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    msg.node = node;
71215ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    msg.fenceFd = fenceFd;
713609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    msg.u.extended_buffer_data.buffer = buffer;
71420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    msg.u.extended_buffer_data.range_offset = pBuffer->nOffset;
71520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    msg.u.extended_buffer_data.range_length = pBuffer->nFilledLen;
71620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    msg.u.extended_buffer_data.flags = pBuffer->nFlags;
71720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    msg.u.extended_buffer_data.timestamp = pBuffer->nTimeStamp;
71820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
71978d26445a7dfe8f49d7005185f28b01cffe80adfJames Dong    findDispatcher(node)->post(msg);
72020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
72120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return OMX_ErrorNone;
72220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
72320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
724cf3abd4875fd54ba40fccdbd90755d2a5ecfca60Marco NelissenOMX::node_id OMX::makeNodeID_l(OMXNodeInstance *instance) {
725318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    // mLock is already held.
72620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
727cf3abd4875fd54ba40fccdbd90755d2a5ecfca60Marco Nelissen    node_id prefix = node_id(getpid() << 16);
728cf3abd4875fd54ba40fccdbd90755d2a5ecfca60Marco Nelissen    node_id node = 0;
729cf3abd4875fd54ba40fccdbd90755d2a5ecfca60Marco Nelissen    do  {
730cf3abd4875fd54ba40fccdbd90755d2a5ecfca60Marco Nelissen        if (++mNodeCounter >= kMaxNodeInstances) {
731cf3abd4875fd54ba40fccdbd90755d2a5ecfca60Marco Nelissen            mNodeCounter = 0; // OK to use because we're combining with the pid
732cf3abd4875fd54ba40fccdbd90755d2a5ecfca60Marco Nelissen        }
733cf3abd4875fd54ba40fccdbd90755d2a5ecfca60Marco Nelissen        node = node_id(prefix | mNodeCounter);
734cf3abd4875fd54ba40fccdbd90755d2a5ecfca60Marco Nelissen    } while (mNodeIDToInstance.indexOfKey(node) >= 0);
735318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mNodeIDToInstance.add(node, instance);
73620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
737318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return node;
73820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
73920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
740318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMXNodeInstance *OMX::findInstance(node_id node) {
741318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
74220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
743318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    ssize_t index = mNodeIDToInstance.indexOfKey(node);
74436efa039efaae4526791336cb688032d22b34becAndreas Huber
745318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return index < 0 ? NULL : mNodeIDToInstance.valueAt(index);
74620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
74720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
74878d26445a7dfe8f49d7005185f28b01cffe80adfJames Dongsp<OMX::CallbackDispatcher> OMX::findDispatcher(node_id node) {
74978d26445a7dfe8f49d7005185f28b01cffe80adfJames Dong    Mutex::Autolock autoLock(mLock);
75078d26445a7dfe8f49d7005185f28b01cffe80adfJames Dong
75178d26445a7dfe8f49d7005185f28b01cffe80adfJames Dong    ssize_t index = mDispatchers.indexOfKey(node);
75278d26445a7dfe8f49d7005185f28b01cffe80adfJames Dong
75378d26445a7dfe8f49d7005185f28b01cffe80adfJames Dong    return index < 0 ? NULL : mDispatchers.valueAt(index);
75478d26445a7dfe8f49d7005185f28b01cffe80adfJames Dong}
75578d26445a7dfe8f49d7005185f28b01cffe80adfJames Dong
756318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubervoid OMX::invalidateNodeID(node_id node) {
757318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
758318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    invalidateNodeID_l(node);
75920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
76020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
761318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubervoid OMX::invalidateNodeID_l(node_id node) {
762318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    // mLock is held.
763318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mNodeIDToInstance.removeItem(node);
764693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber}
765693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
76620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}  // namespace android
767