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
1720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber//#define LOG_NDEBUG 0
1820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#define LOG_TAG "OMX"
1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/Log.h>
2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
21e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber#include <dlfcn.h>
22fa71449d6c3b3da082d8fbedf9470ee8750a1646Andreas Huber
23318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#include "../include/OMX.h"
248b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
25318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#include "../include/OMXNodeInstance.h"
2689e69da4d86348409994c9dafbbb2634ccd7c196Andreas Huber
2720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <binder/IMemory.h>
28f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong#include <media/stagefright/foundation/ADebug.h>
2952e71f87f1dac8d2f6bcaf77bb25b78cba664c43Andreas Huber#include <utils/threads.h>
3020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
31e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber#include "OMXMaster.h"
32e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber
3320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <OMX_Component.h>
3420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
3520111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android {
3620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
37693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber////////////////////////////////////////////////////////////////////////////////
38693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
39ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten// This provides the underlying Thread used by CallbackDispatcher.
40ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten// Note that deriving CallbackDispatcher from Thread does not work.
41ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten
42ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kastenstruct OMX::CallbackDispatcherThread : public Thread {
43ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten    CallbackDispatcherThread(CallbackDispatcher *dispatcher)
44ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten        : mDispatcher(dispatcher) {
45ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten    }
46ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten
47ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kastenprivate:
48ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten    CallbackDispatcher *mDispatcher;
49ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten
50ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten    bool threadLoop();
51ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten
52ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten    CallbackDispatcherThread(const CallbackDispatcherThread &);
53ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten    CallbackDispatcherThread &operator=(const CallbackDispatcherThread &);
54ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten};
55ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten
56ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten////////////////////////////////////////////////////////////////////////////////
57ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten
58693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstruct OMX::CallbackDispatcher : public RefBase {
5978d26445a7dfe8f49d7005185f28b01cffe80adfJames Dong    CallbackDispatcher(OMXNodeInstance *owner);
60693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
61693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    void post(const omx_message &msg);
62693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
63ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten    bool loop();
64ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten
65693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberprotected:
66693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    virtual ~CallbackDispatcher();
67693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
68693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberprivate:
69693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    Mutex mLock;
70318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
7178d26445a7dfe8f49d7005185f28b01cffe80adfJames Dong    OMXNodeInstance *mOwner;
72693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    bool mDone;
73693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    Condition mQueueChanged;
74693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    List<omx_message> mQueue;
75693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
76ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten    sp<CallbackDispatcherThread> mThread;
77693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
78693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    void dispatch(const omx_message &msg);
79693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
80693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    CallbackDispatcher(const CallbackDispatcher &);
81693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    CallbackDispatcher &operator=(const CallbackDispatcher &);
82693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber};
83693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
8478d26445a7dfe8f49d7005185f28b01cffe80adfJames DongOMX::CallbackDispatcher::CallbackDispatcher(OMXNodeInstance *owner)
85318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    : mOwner(owner),
86318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber      mDone(false) {
87ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten    mThread = new CallbackDispatcherThread(this);
88078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber    mThread->run("OMXCallbackDisp", ANDROID_PRIORITY_FOREGROUND);
89693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber}
90693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
91693d271e62a3726689ff68f4505ba49228eb94b2Andreas HuberOMX::CallbackDispatcher::~CallbackDispatcher() {
92693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    {
93693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        Mutex::Autolock autoLock(mLock);
94693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
95693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        mDone = true;
96693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        mQueueChanged.signal();
97693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    }
98693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
9940d76d70587ed095692615b0a1b657da861f7ffcGlenn Kasten    // A join on self can happen if the last ref to CallbackDispatcher
10040d76d70587ed095692615b0a1b657da861f7ffcGlenn Kasten    // is released within the CallbackDispatcherThread loop
101ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten    status_t status = mThread->join();
10240d76d70587ed095692615b0a1b657da861f7ffcGlenn Kasten    if (status != WOULD_BLOCK) {
10340d76d70587ed095692615b0a1b657da861f7ffcGlenn Kasten        // Other than join to self, the only other error return codes are
10440d76d70587ed095692615b0a1b657da861f7ffcGlenn Kasten        // whatever readyToRun() returns, and we don't override that
105f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong        CHECK_EQ(status, (status_t)NO_ERROR);
10640d76d70587ed095692615b0a1b657da861f7ffcGlenn Kasten    }
107693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber}
108693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
109693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMX::CallbackDispatcher::post(const omx_message &msg) {
110693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    Mutex::Autolock autoLock(mLock);
11152e71f87f1dac8d2f6bcaf77bb25b78cba664c43Andreas Huber
112693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    mQueue.push_back(msg);
113693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    mQueueChanged.signal();
114693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber}
115693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
116693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubervoid OMX::CallbackDispatcher::dispatch(const omx_message &msg) {
11778d26445a7dfe8f49d7005185f28b01cffe80adfJames Dong    if (mOwner == NULL) {
1183856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("Would have dispatched a message to a node that's already gone.");
119318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        return;
120693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    }
12178d26445a7dfe8f49d7005185f28b01cffe80adfJames Dong    mOwner->onMessage(msg);
122693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber}
123693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
124ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kastenbool OMX::CallbackDispatcher::loop() {
125693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    for (;;) {
126693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        omx_message msg;
127693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
128693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        {
129693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            Mutex::Autolock autoLock(mLock);
130693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            while (!mDone && mQueue.empty()) {
131693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber                mQueueChanged.wait(mLock);
132693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            }
133693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
134693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            if (mDone) {
135693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber                break;
136693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            }
137693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
138693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            msg = *mQueue.begin();
139693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            mQueue.erase(mQueue.begin());
140693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        }
141693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
142693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        dispatch(msg);
143693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    }
144ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten
145ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten    return false;
146ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten}
147ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten
148ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten////////////////////////////////////////////////////////////////////////////////
149ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten
150ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kastenbool OMX::CallbackDispatcherThread::threadLoop() {
151ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten    return mDispatcher->loop();
152693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber}
153693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
154693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber////////////////////////////////////////////////////////////////////////////////
155693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
156318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX::OMX()
157e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber    : mMaster(new OMXMaster),
158318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber      mNodeCounter(0) {
15920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
16020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
161e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas HuberOMX::~OMX() {
162e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber    delete mMaster;
163e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber    mMaster = NULL;
164e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber}
165e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber
166318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubervoid OMX::binderDied(const wp<IBinder> &the_late_who) {
167318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMXNodeInstance *instance;
16820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
169318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    {
170318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        Mutex::Autolock autoLock(mLock);
17120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
172318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        ssize_t index = mLiveNodes.indexOfKey(the_late_who);
173318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        CHECK(index >= 0);
174318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
175318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        instance = mLiveNodes.editValueAt(index);
176318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        mLiveNodes.removeItemsAt(index);
177318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
178f0128187491b4d65b9c2620d46f5af807f63d728Andreas Huber        index = mDispatchers.indexOfKey(instance->nodeID());
179f0128187491b4d65b9c2620d46f5af807f63d728Andreas Huber        CHECK(index >= 0);
180f0128187491b4d65b9c2620d46f5af807f63d728Andreas Huber        mDispatchers.removeItemsAt(index);
181f0128187491b4d65b9c2620d46f5af807f63d728Andreas Huber
182318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        invalidateNodeID_l(instance->nodeID());
183318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
184318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
185f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huber    instance->onObserverDied(mMaster);
18620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
18720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
188d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huberbool OMX::livesLocally(node_id node, pid_t pid) {
1897eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber    return pid == getpid();
1907eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber}
1917eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
192134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huberstatus_t OMX::listNodes(List<ComponentInfo> *list) {
19320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    list->clear();
19420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
19520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    OMX_U32 index = 0;
19620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    char componentName[256];
197e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber    while (mMaster->enumerateComponents(
198e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber                componentName, sizeof(componentName), index) == OMX_ErrorNone) {
199134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        list->push_back(ComponentInfo());
200134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        ComponentInfo &info = *--list->end();
201134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
202134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        info.mName = componentName;
20320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
204134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        Vector<String8> roles;
205134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        OMX_ERRORTYPE err =
206134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            mMaster->getRolesOfComponent(componentName, &roles);
207134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
208134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        if (err == OMX_ErrorNone) {
209134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            for (OMX_U32 i = 0; i < roles.size(); ++i) {
210134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber                info.mRoles.push_back(roles[i]);
211134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            }
212134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        }
2138ae1d0bdcef22f2bdd8d283e0e615f3ba6c3f4cdAndreas Huber
21420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        ++index;
21520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
21620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
21720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return OK;
21820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
21920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
220318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMX::allocateNode(
221318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        const char *name, const sp<IOMXObserver> &observer, node_id *node) {
22220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    Mutex::Autolock autoLock(mLock);
22320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
22420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    *node = 0;
22520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
226318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMXNodeInstance *instance = new OMXNodeInstance(this, observer);
22720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
228e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber    OMX_COMPONENTTYPE *handle;
229e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber    OMX_ERRORTYPE err = mMaster->makeComponentInstance(
230e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber            name, &OMXNodeInstance::kCallbacks,
231e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber            instance, &handle);
23220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
23320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    if (err != OMX_ErrorNone) {
2343856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("FAILED to allocate omx component '%s'", name);
23520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
236318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        instance->onGetHandleFailed();
23720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
23820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return UNKNOWN_ERROR;
23920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
24020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
241318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    *node = makeNodeID(instance);
24278d26445a7dfe8f49d7005185f28b01cffe80adfJames Dong    mDispatchers.add(*node, new CallbackDispatcher(instance));
24320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
244318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    instance->setHandle(*node, handle);
245318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
246318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mLiveNodes.add(observer->asBinder(), instance);
247318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    observer->asBinder()->linkToDeath(this);
24820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
24920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return OK;
25020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
25120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
252318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMX::freeNode(node_id node) {
253318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMXNodeInstance *instance = findInstance(node);
25420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
255318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    ssize_t index = mLiveNodes.indexOfKey(instance->observer()->asBinder());
256b78ff5fb6f56c679bce936078180ce61a1e97288Andreas Huber    if (index < 0) {
257b78ff5fb6f56c679bce936078180ce61a1e97288Andreas Huber        // This could conceivably happen if the observer dies at roughly the
258b78ff5fb6f56c679bce936078180ce61a1e97288Andreas Huber        // same time that a client attempts to free the node explicitly.
259b78ff5fb6f56c679bce936078180ce61a1e97288Andreas Huber        return OK;
260b78ff5fb6f56c679bce936078180ce61a1e97288Andreas Huber    }
261318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mLiveNodes.removeItemsAt(index);
262f0128187491b4d65b9c2620d46f5af807f63d728Andreas Huber
26300998fbb52dfa78ac3a4b3706d64fc612926bfbcAndreas Huber    instance->observer()->asBinder()->unlinkToDeath(this);
26400998fbb52dfa78ac3a4b3706d64fc612926bfbcAndreas Huber
26500998fbb52dfa78ac3a4b3706d64fc612926bfbcAndreas Huber    status_t err = instance->freeNode(mMaster);
26600998fbb52dfa78ac3a4b3706d64fc612926bfbcAndreas Huber
26714c858e80dfe2030c9f343dc0c6e2048e030731bJames Dong    {
26814c858e80dfe2030c9f343dc0c6e2048e030731bJames Dong        Mutex::Autolock autoLock(mLock);
26914c858e80dfe2030c9f343dc0c6e2048e030731bJames Dong        index = mDispatchers.indexOfKey(node);
27014c858e80dfe2030c9f343dc0c6e2048e030731bJames Dong        CHECK(index >= 0);
27114c858e80dfe2030c9f343dc0c6e2048e030731bJames Dong        mDispatchers.removeItemsAt(index);
27214c858e80dfe2030c9f343dc0c6e2048e030731bJames Dong    }
273f0128187491b4d65b9c2620d46f5af807f63d728Andreas Huber
27400998fbb52dfa78ac3a4b3706d64fc612926bfbcAndreas Huber    return err;
27520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
27620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
277318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMX::sendCommand(
27820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) {
279318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return findInstance(node)->sendCommand(cmd, param);
28020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
28120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
282318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMX::getParameter(
28320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        node_id node, OMX_INDEXTYPE index,
28420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        void *params, size_t size) {
285318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return findInstance(node)->getParameter(
286318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            index, params, size);
28720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
28820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
289318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMX::setParameter(
29020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        node_id node, OMX_INDEXTYPE index,
29120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        const void *params, size_t size) {
292318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return findInstance(node)->setParameter(
293318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            index, params, size);
29420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
29520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
296318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMX::getConfig(
297693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        node_id node, OMX_INDEXTYPE index,
298693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        void *params, size_t size) {
299318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return findInstance(node)->getConfig(
300318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            index, params, size);
301693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber}
302693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
303318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMX::setConfig(
304693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        node_id node, OMX_INDEXTYPE index,
305693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        const void *params, size_t size) {
306318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return findInstance(node)->setConfig(
307318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            index, params, size);
308693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber}
309693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
310b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennisstatus_t OMX::getState(
311b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis        node_id node, OMX_STATETYPE* state) {
312b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis    return findInstance(node)->getState(
313b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis            state);
314b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis}
315b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis
31683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennisstatus_t OMX::enableGraphicBuffers(
31783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        node_id node, OMX_U32 port_index, OMX_BOOL enable) {
31883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    return findInstance(node)->enableGraphicBuffers(port_index, enable);
31983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis}
32083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
321e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennisstatus_t OMX::getGraphicBufferUsage(
322e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        node_id node, OMX_U32 port_index, OMX_U32* usage) {
323e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    return findInstance(node)->getGraphicBufferUsage(port_index, usage);
324e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis}
325e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
326e870772a78ffe08b1c14a791e368f1499f1be0f3James Dongstatus_t OMX::storeMetaDataInBuffers(
327e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        node_id node, OMX_U32 port_index, OMX_BOOL enable) {
328e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    return findInstance(node)->storeMetaDataInBuffers(port_index, enable);
329e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong}
330e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
331318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMX::useBuffer(
33220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        node_id node, OMX_U32 port_index, const sp<IMemory> &params,
33320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        buffer_id *buffer) {
334318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return findInstance(node)->useBuffer(
335318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            port_index, params, buffer);
33620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
33720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
33883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennisstatus_t OMX::useGraphicBuffer(
33983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        node_id node, OMX_U32 port_index,
34083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer) {
34183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    return findInstance(node)->useGraphicBuffer(
34283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            port_index, graphicBuffer, buffer);
34383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis}
34483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
345318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMX::allocateBuffer(
34620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        node_id node, OMX_U32 port_index, size_t size,
347570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber        buffer_id *buffer, void **buffer_data) {
348318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return findInstance(node)->allocateBuffer(
349570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber            port_index, size, buffer, buffer_data);
35020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
35120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
352318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMX::allocateBufferWithBackup(
35320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        node_id node, OMX_U32 port_index, const sp<IMemory> &params,
35420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        buffer_id *buffer) {
355318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return findInstance(node)->allocateBufferWithBackup(
356318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            port_index, params, buffer);
35720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
35820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
359318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMX::freeBuffer(node_id node, OMX_U32 port_index, buffer_id buffer) {
360318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return findInstance(node)->freeBuffer(
361318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            port_index, buffer);
362318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
36320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
364318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMX::fillBuffer(node_id node, buffer_id buffer) {
365318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return findInstance(node)->fillBuffer(buffer);
366318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
36720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
368318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMX::emptyBuffer(
369318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        node_id node,
370318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        buffer_id buffer,
371318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_U32 range_offset, OMX_U32 range_length,
372318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_U32 flags, OMX_TICKS timestamp) {
373318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return findInstance(node)->emptyBuffer(
374318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            buffer, range_offset, range_length, flags, timestamp);
375318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
37620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
377318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMX::getExtensionIndex(
378318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        node_id node,
379318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        const char *parameter_name,
380318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_INDEXTYPE *index) {
381318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return findInstance(node)->getExtensionIndex(
382318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            parameter_name, index);
38320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
38420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
38520111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberOMX_ERRORTYPE OMX::OnEvent(
386318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        node_id node,
38720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        OMX_IN OMX_EVENTTYPE eEvent,
38820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        OMX_IN OMX_U32 nData1,
38920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        OMX_IN OMX_U32 nData2,
39020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        OMX_IN OMX_PTR pEventData) {
3913856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("OnEvent(%d, %ld, %ld)", eEvent, nData1, nData2);
39220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
39320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    omx_message msg;
39420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    msg.type = omx_message::EVENT;
395318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    msg.node = node;
39620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    msg.u.event_data.event = eEvent;
39720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    msg.u.event_data.data1 = nData1;
39820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    msg.u.event_data.data2 = nData2;
39920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
40078d26445a7dfe8f49d7005185f28b01cffe80adfJames Dong    findDispatcher(node)->post(msg);
40120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
40220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return OMX_ErrorNone;
40320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
404318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
40520111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberOMX_ERRORTYPE OMX::OnEmptyBufferDone(
406318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        node_id node, OMX_IN OMX_BUFFERHEADERTYPE *pBuffer) {
4073856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("OnEmptyBufferDone buffer=%p", pBuffer);
40820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
40920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    omx_message msg;
41020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    msg.type = omx_message::EMPTY_BUFFER_DONE;
411318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    msg.node = node;
41220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    msg.u.buffer_data.buffer = pBuffer;
41320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
41478d26445a7dfe8f49d7005185f28b01cffe80adfJames Dong    findDispatcher(node)->post(msg);
41520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
41620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return OMX_ErrorNone;
41720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
41820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
41920111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberOMX_ERRORTYPE OMX::OnFillBufferDone(
420318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        node_id node, OMX_IN OMX_BUFFERHEADERTYPE *pBuffer) {
4213856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("OnFillBufferDone buffer=%p", pBuffer);
42220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
42320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    omx_message msg;
42420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    msg.type = omx_message::FILL_BUFFER_DONE;
425318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    msg.node = node;
42620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    msg.u.extended_buffer_data.buffer = pBuffer;
42720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    msg.u.extended_buffer_data.range_offset = pBuffer->nOffset;
42820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    msg.u.extended_buffer_data.range_length = pBuffer->nFilledLen;
42920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    msg.u.extended_buffer_data.flags = pBuffer->nFlags;
43020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    msg.u.extended_buffer_data.timestamp = pBuffer->nTimeStamp;
43120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    msg.u.extended_buffer_data.platform_private = pBuffer->pPlatformPrivate;
432213addfaf4b359c69da4e9b4490c511d116845bbAndreas Huber    msg.u.extended_buffer_data.data_ptr = pBuffer->pBuffer;
43320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
43478d26445a7dfe8f49d7005185f28b01cffe80adfJames Dong    findDispatcher(node)->post(msg);
43520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
43620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return OMX_ErrorNone;
43720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
43820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
439318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX::node_id OMX::makeNodeID(OMXNodeInstance *instance) {
440318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    // mLock is already held.
44120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
442318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    node_id node = (node_id)++mNodeCounter;
443318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mNodeIDToInstance.add(node, instance);
44420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
445318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return node;
44620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
44720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
448318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMXNodeInstance *OMX::findInstance(node_id node) {
449318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
45020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
451318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    ssize_t index = mNodeIDToInstance.indexOfKey(node);
45236efa039efaae4526791336cb688032d22b34becAndreas Huber
453318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return index < 0 ? NULL : mNodeIDToInstance.valueAt(index);
45420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
45520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
45678d26445a7dfe8f49d7005185f28b01cffe80adfJames Dongsp<OMX::CallbackDispatcher> OMX::findDispatcher(node_id node) {
45778d26445a7dfe8f49d7005185f28b01cffe80adfJames Dong    Mutex::Autolock autoLock(mLock);
45878d26445a7dfe8f49d7005185f28b01cffe80adfJames Dong
45978d26445a7dfe8f49d7005185f28b01cffe80adfJames Dong    ssize_t index = mDispatchers.indexOfKey(node);
46078d26445a7dfe8f49d7005185f28b01cffe80adfJames Dong
46178d26445a7dfe8f49d7005185f28b01cffe80adfJames Dong    return index < 0 ? NULL : mDispatchers.valueAt(index);
46278d26445a7dfe8f49d7005185f28b01cffe80adfJames Dong}
46378d26445a7dfe8f49d7005185f28b01cffe80adfJames Dong
464318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubervoid OMX::invalidateNodeID(node_id node) {
465318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
466318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    invalidateNodeID_l(node);
46720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
46820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
469318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubervoid OMX::invalidateNodeID_l(node_id node) {
470318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    // mLock is held.
471318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mNodeIDToInstance.removeItem(node);
472693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber}
473693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
47420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}  // namespace android
475