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> ¶ms, 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> ¶ms, 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