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