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 "OMXClient" 19f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung 20f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung#ifdef __LP64__ 21f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung#define OMX_ANDROID_COMPILE_AS_32BIT_ON_64BIT_PLATFORMS 22f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung#endif 23f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung 2420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/Log.h> 2520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <binder/IServiceManager.h> 2720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/IMediaPlayerService.h> 28e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber#include <media/stagefright/foundation/ADebug.h> 2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/OMXClient.h> 30e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber#include <utils/KeyedVector.h> 31e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 32e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber#include "include/OMX.h" 3320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3420111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android { 3520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 36e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstruct MuxOMX : public IOMX { 37e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber MuxOMX(const sp<IOMX> &remoteOMX); 38e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual ~MuxOMX(); 39e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 40ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber virtual IBinder *onAsBinder() { return mRemoteOMX->asBinder().get(); } 41e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 42d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huber virtual bool livesLocally(node_id node, pid_t pid); 43e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 44e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t listNodes(List<ComponentInfo> *list); 45e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 46e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t allocateNode( 47e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber const char *name, const sp<IOMXObserver> &observer, 48e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id *node); 49e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 50e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t freeNode(node_id node); 51e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 52e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t sendCommand( 53e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param); 54e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 55e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t getParameter( 56e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_INDEXTYPE index, 57e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber void *params, size_t size); 58e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 59e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t setParameter( 60e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_INDEXTYPE index, 61e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber const void *params, size_t size); 62e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 63e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t getConfig( 64e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_INDEXTYPE index, 65e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber void *params, size_t size); 66e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 67e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t setConfig( 68e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_INDEXTYPE index, 69e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber const void *params, size_t size); 70e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 71e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t getState( 72e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_STATETYPE* state); 73e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 74e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t storeMetaDataInBuffers( 75e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, OMX_BOOL enable); 76e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 7756ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar virtual status_t prepareForAdaptivePlayback( 7856ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar node_id node, OMX_U32 port_index, OMX_BOOL enable, 7956ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar OMX_U32 maxFrameWidth, OMX_U32 maxFrameHeight); 8056ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar 815a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad virtual status_t configureVideoTunnelMode( 825a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad node_id node, OMX_U32 portIndex, OMX_BOOL tunneled, 835a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad OMX_U32 audioHwSync, native_handle_t **sidebandHandle); 845a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 85e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t enableGraphicBuffers( 86e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, OMX_BOOL enable); 87e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 88e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t getGraphicBufferUsage( 89e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, OMX_U32* usage); 90e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 91e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t useBuffer( 92e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, const sp<IMemory> ¶ms, 93e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber buffer_id *buffer); 94e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 95e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t useGraphicBuffer( 96e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, 97e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer); 98e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 99d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar virtual status_t updateGraphicBufferInMeta( 100d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar node_id node, OMX_U32 port_index, 101d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar const sp<GraphicBuffer> &graphicBuffer, buffer_id buffer); 102d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar 1037cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden virtual status_t createInputSurface( 1047cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden node_id node, OMX_U32 port_index, 1057cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<IGraphicBufferProducer> *bufferProducer); 1067cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 1077cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden virtual status_t signalEndOfInputStream(node_id node); 1087cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 109e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t allocateBuffer( 110e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, size_t size, 111e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber buffer_id *buffer, void **buffer_data); 112e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 113e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t allocateBufferWithBackup( 114e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, const sp<IMemory> ¶ms, 115e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber buffer_id *buffer); 116e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 117e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t freeBuffer( 118e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, buffer_id buffer); 119e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 120e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t fillBuffer(node_id node, buffer_id buffer); 121e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 122e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t emptyBuffer( 123e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, 124e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber buffer_id buffer, 125e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber OMX_U32 range_offset, OMX_U32 range_length, 126e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber OMX_U32 flags, OMX_TICKS timestamp); 127e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 128e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t getExtensionIndex( 129e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, 130e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber const char *parameter_name, 131e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber OMX_INDEXTYPE *index); 132e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 133e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber virtual status_t setInternalOption( 134e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber node_id node, 135e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber OMX_U32 port_index, 136e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber InternalOptionType type, 137e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber const void *data, 138e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber size_t size); 139e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber 140e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberprivate: 141e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber mutable Mutex mLock; 142e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 143e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber sp<IOMX> mRemoteOMX; 144e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber sp<IOMX> mLocalOMX; 145e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 146e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber KeyedVector<node_id, bool> mIsLocalNode; 147e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 148e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber bool isLocalNode(node_id node) const; 149e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber bool isLocalNode_l(node_id node) const; 150e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber const sp<IOMX> &getOMX(node_id node) const; 151e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber const sp<IOMX> &getOMX_l(node_id node) const; 152e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 153609b815a3131d22da38b2f452faa9f89daad4039Andy Hung static bool CanLiveLocally(const char *name); 154e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 155e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber DISALLOW_EVIL_CONSTRUCTORS(MuxOMX); 156e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}; 157e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 158e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas HuberMuxOMX::MuxOMX(const sp<IOMX> &remoteOMX) 159e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber : mRemoteOMX(remoteOMX) { 160e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 161e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 162e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas HuberMuxOMX::~MuxOMX() { 163e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 164e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 165e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberbool MuxOMX::isLocalNode(node_id node) const { 166e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber Mutex::Autolock autoLock(mLock); 167e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 168e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return isLocalNode_l(node); 169e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 170e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 171e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberbool MuxOMX::isLocalNode_l(node_id node) const { 172e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return mIsLocalNode.indexOfKey(node) >= 0; 173e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 174e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 175e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber// static 176609b815a3131d22da38b2f452faa9f89daad4039Andy Hungbool MuxOMX::CanLiveLocally(const char *name) { 177f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung#ifdef __LP64__ 178f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung (void)name; // disable unused parameter warning 179f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung // 64 bit processes always run OMX remote on MediaServer 180f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung return false; 181f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung#else 182f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung // 32 bit processes run only OMX.google.* components locally 183e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return !strncasecmp(name, "OMX.google.", 11); 184f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung#endif 185e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 186e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 187e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberconst sp<IOMX> &MuxOMX::getOMX(node_id node) const { 188e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return isLocalNode(node) ? mLocalOMX : mRemoteOMX; 189e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 190e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 191e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberconst sp<IOMX> &MuxOMX::getOMX_l(node_id node) const { 192e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return isLocalNode_l(node) ? mLocalOMX : mRemoteOMX; 193e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 194e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 195d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huberbool MuxOMX::livesLocally(node_id node, pid_t pid) { 196d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huber return getOMX(node)->livesLocally(node, pid); 197e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 198e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 199e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::listNodes(List<ComponentInfo> *list) { 200e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber Mutex::Autolock autoLock(mLock); 201e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 202e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber if (mLocalOMX == NULL) { 203e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber mLocalOMX = new OMX; 204e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber } 205e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 206e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return mLocalOMX->listNodes(list); 207e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 208e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 209e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::allocateNode( 210e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber const char *name, const sp<IOMXObserver> &observer, 211e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id *node) { 212e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber Mutex::Autolock autoLock(mLock); 213e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 214e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber sp<IOMX> omx; 215e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 216609b815a3131d22da38b2f452faa9f89daad4039Andy Hung if (CanLiveLocally(name)) { 217e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber if (mLocalOMX == NULL) { 218e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber mLocalOMX = new OMX; 219e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber } 220e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber omx = mLocalOMX; 221e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber } else { 222e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber omx = mRemoteOMX; 223e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber } 224e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 225e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber status_t err = omx->allocateNode(name, observer, node); 226e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 227e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber if (err != OK) { 228e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return err; 229e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber } 230e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 231e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber if (omx == mLocalOMX) { 232e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber mIsLocalNode.add(*node, true); 233e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber } 234e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 235e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return OK; 236e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 237e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 238e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::freeNode(node_id node) { 239e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber Mutex::Autolock autoLock(mLock); 240e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 241e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber status_t err = getOMX_l(node)->freeNode(node); 242e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 243e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber if (err != OK) { 244e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return err; 245e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber } 246e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 247e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber mIsLocalNode.removeItem(node); 248e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 249e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return OK; 250e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 251e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 252e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::sendCommand( 253e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) { 254e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->sendCommand(node, cmd, param); 255e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 256e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 257e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::getParameter( 258e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_INDEXTYPE index, 259e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber void *params, size_t size) { 260e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->getParameter(node, index, params, size); 261e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 262e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 263e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::setParameter( 264e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_INDEXTYPE index, 265e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber const void *params, size_t size) { 266e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->setParameter(node, index, params, size); 267e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 268e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 269e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::getConfig( 270e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_INDEXTYPE index, 271e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber void *params, size_t size) { 272e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->getConfig(node, index, params, size); 273e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 274e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 275e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::setConfig( 276e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_INDEXTYPE index, 277e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber const void *params, size_t size) { 278e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->setConfig(node, index, params, size); 279e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 280e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 281e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::getState( 282e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_STATETYPE* state) { 283e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->getState(node, state); 284e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 285e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 286e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::storeMetaDataInBuffers( 287e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, OMX_BOOL enable) { 288e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->storeMetaDataInBuffers(node, port_index, enable); 289e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 290e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 29156ce726019f700a95ce5b45beebceadae4836e30Lajos Molnarstatus_t MuxOMX::prepareForAdaptivePlayback( 29256ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar node_id node, OMX_U32 port_index, OMX_BOOL enable, 29356ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar OMX_U32 maxFrameWidth, OMX_U32 maxFrameHeight) { 29456ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar return getOMX(node)->prepareForAdaptivePlayback( 29556ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar node, port_index, enable, maxFrameWidth, maxFrameHeight); 29656ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar} 29756ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar 2985a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachadstatus_t MuxOMX::configureVideoTunnelMode( 2995a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad node_id node, OMX_U32 portIndex, OMX_BOOL enable, 3005a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad OMX_U32 audioHwSync, native_handle_t **sidebandHandle) { 3015a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad return getOMX(node)->configureVideoTunnelMode( 3025a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad node, portIndex, enable, audioHwSync, sidebandHandle); 3035a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad} 3045a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 305e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::enableGraphicBuffers( 306e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, OMX_BOOL enable) { 307e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->enableGraphicBuffers(node, port_index, enable); 308e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 309e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 310e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::getGraphicBufferUsage( 311e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, OMX_U32* usage) { 312e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->getGraphicBufferUsage(node, port_index, usage); 313e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 314e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 315e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::useBuffer( 316e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, const sp<IMemory> ¶ms, 317e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber buffer_id *buffer) { 318e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->useBuffer(node, port_index, params, buffer); 319e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 320e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 321e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::useGraphicBuffer( 322e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, 323e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer) { 324e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->useGraphicBuffer( 325e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node, port_index, graphicBuffer, buffer); 326e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 327e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 328d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnarstatus_t MuxOMX::updateGraphicBufferInMeta( 329d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar node_id node, OMX_U32 port_index, 330d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar const sp<GraphicBuffer> &graphicBuffer, buffer_id buffer) { 331d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar return getOMX(node)->updateGraphicBufferInMeta( 332d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar node, port_index, graphicBuffer, buffer); 333d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar} 334d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar 3357cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenstatus_t MuxOMX::createInputSurface( 3367cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden node_id node, OMX_U32 port_index, 3377cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<IGraphicBufferProducer> *bufferProducer) { 3387cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden status_t err = getOMX(node)->createInputSurface( 3397cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden node, port_index, bufferProducer); 3407cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden return err; 3417cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden} 3427cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 3437cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenstatus_t MuxOMX::signalEndOfInputStream(node_id node) { 3447cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden return getOMX(node)->signalEndOfInputStream(node); 3457cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden} 3467cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 347e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::allocateBuffer( 348e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, size_t size, 349e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber buffer_id *buffer, void **buffer_data) { 350e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->allocateBuffer( 351e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node, port_index, size, buffer, buffer_data); 352e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 353e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 354e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::allocateBufferWithBackup( 355e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, const sp<IMemory> ¶ms, 356e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber buffer_id *buffer) { 357e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->allocateBufferWithBackup( 358e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node, port_index, params, buffer); 359e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 360e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 361e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::freeBuffer( 362e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, buffer_id buffer) { 363e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->freeBuffer(node, port_index, buffer); 364e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 365e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 366e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::fillBuffer(node_id node, buffer_id buffer) { 367e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->fillBuffer(node, buffer); 368e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 369e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 370e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::emptyBuffer( 371e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, 372e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber buffer_id buffer, 373e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber OMX_U32 range_offset, OMX_U32 range_length, 374e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber OMX_U32 flags, OMX_TICKS timestamp) { 375e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->emptyBuffer( 376e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node, buffer, range_offset, range_length, flags, timestamp); 377e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 378e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 379e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::getExtensionIndex( 380e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, 381e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber const char *parameter_name, 382e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber OMX_INDEXTYPE *index) { 383e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->getExtensionIndex(node, parameter_name, index); 384e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 385e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 386e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huberstatus_t MuxOMX::setInternalOption( 387e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber node_id node, 388e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber OMX_U32 port_index, 389e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber InternalOptionType type, 390e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber const void *data, 391e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber size_t size) { 392e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber return getOMX(node)->setInternalOption(node, port_index, type, data, size); 393e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber} 394e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber 395408b8e1073385d0d09bb96b9952f84731a0b4aebAndreas HuberOMXClient::OMXClient() { 39620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 39720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 39820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t OMXClient::connect() { 39920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<IServiceManager> sm = defaultServiceManager(); 40020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<IBinder> binder = sm->getService(String16("media.player")); 40120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<IMediaPlayerService> service = interface_cast<IMediaPlayerService>(binder); 40220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4030c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber CHECK(service.get() != NULL); 40420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 405318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mOMX = service->getOMX(); 4060c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber CHECK(mOMX.get() != NULL); 40720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 408609b815a3131d22da38b2f452faa9f89daad4039Andy Hung if (!mOMX->livesLocally(0 /* node */, getpid())) { 409e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber ALOGI("Using client-side OMX mux."); 410e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber mOMX = new MuxOMX(mOMX); 411e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber } 412e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 41320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return OK; 41420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 41520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 41620111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid OMXClient::disconnect() { 41704394b1c83d56e2956ba84aa9cb4b5d3b01d8ae8James Dong if (mOMX.get() != NULL) { 41804394b1c83d56e2956ba84aa9cb4b5d3b01d8ae8James Dong mOMX.clear(); 41904394b1c83d56e2956ba84aa9cb4b5d3b01d8ae8James Dong mOMX = NULL; 42004394b1c83d56e2956ba84aa9cb4b5d3b01d8ae8James Dong } 42120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 42220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 42320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} // namespace android 424