OMXClient.cpp revision d0715867861c216e88a4a7523b6da8a3cb128724
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" 1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/Log.h> 2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <binder/IServiceManager.h> 2220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/IMediaPlayerService.h> 23e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber#include <media/stagefright/foundation/ADebug.h> 2420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/OMXClient.h> 25e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber#include <utils/KeyedVector.h> 26e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 27e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber#include "include/OMX.h" 2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android { 3020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 31e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstruct MuxOMX : public IOMX { 32e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber MuxOMX(const sp<IOMX> &remoteOMX); 33e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual ~MuxOMX(); 34e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 35ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber virtual IBinder *onAsBinder() { return mRemoteOMX->asBinder().get(); } 36e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 37d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huber virtual bool livesLocally(node_id node, pid_t pid); 38e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 39e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t listNodes(List<ComponentInfo> *list); 40e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 41e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t allocateNode( 42e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber const char *name, const sp<IOMXObserver> &observer, 43e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id *node); 44e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 45e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t freeNode(node_id node); 46e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 47e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t sendCommand( 48e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param); 49e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 50e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t getParameter( 51e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_INDEXTYPE index, 52e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber void *params, size_t size); 53e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 54e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t setParameter( 55e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_INDEXTYPE index, 56e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber const void *params, size_t size); 57e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 58e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t getConfig( 59e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_INDEXTYPE index, 60e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber void *params, size_t size); 61e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 62e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t setConfig( 63e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_INDEXTYPE index, 64e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber const void *params, size_t size); 65e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 66e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t getState( 67e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_STATETYPE* state); 68e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 69e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t storeMetaDataInBuffers( 70e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, OMX_BOOL enable); 71e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 72e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t enableGraphicBuffers( 73e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, OMX_BOOL enable); 74e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 75e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t getGraphicBufferUsage( 76e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, OMX_U32* usage); 77e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 78e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t useBuffer( 79e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, const sp<IMemory> ¶ms, 80e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber buffer_id *buffer); 81e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 82e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t useGraphicBuffer( 83e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, 84e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer); 85e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 86d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar virtual status_t updateGraphicBufferInMeta( 87d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar node_id node, OMX_U32 port_index, 88d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar const sp<GraphicBuffer> &graphicBuffer, buffer_id buffer); 89d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar 907cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden virtual status_t createInputSurface( 917cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden node_id node, OMX_U32 port_index, 927cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<IGraphicBufferProducer> *bufferProducer); 937cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 947cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden virtual status_t signalEndOfInputStream(node_id node); 957cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 96e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t allocateBuffer( 97e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, size_t size, 98e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber buffer_id *buffer, void **buffer_data); 99e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 100e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t allocateBufferWithBackup( 101e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, const sp<IMemory> ¶ms, 102e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber buffer_id *buffer); 103e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 104e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t freeBuffer( 105e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, buffer_id buffer); 106e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 107e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t fillBuffer(node_id node, buffer_id buffer); 108e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 109e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t emptyBuffer( 110e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, 111e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber buffer_id buffer, 112e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber OMX_U32 range_offset, OMX_U32 range_length, 113e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber OMX_U32 flags, OMX_TICKS timestamp); 114e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 115e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t getExtensionIndex( 116e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, 117e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber const char *parameter_name, 118e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber OMX_INDEXTYPE *index); 119e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 120e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber virtual status_t setInternalOption( 121e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber node_id node, 122e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber OMX_U32 port_index, 123e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber InternalOptionType type, 124e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber const void *data, 125e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber size_t size); 126e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber 127e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberprivate: 128e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber mutable Mutex mLock; 129e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 130e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber sp<IOMX> mRemoteOMX; 131e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber sp<IOMX> mLocalOMX; 132e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 133e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber KeyedVector<node_id, bool> mIsLocalNode; 134e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 135e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber bool isLocalNode(node_id node) const; 136e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber bool isLocalNode_l(node_id node) const; 137e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber const sp<IOMX> &getOMX(node_id node) const; 138e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber const sp<IOMX> &getOMX_l(node_id node) const; 139e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 140e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber static bool IsSoftwareComponent(const char *name); 141e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 142e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber DISALLOW_EVIL_CONSTRUCTORS(MuxOMX); 143e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}; 144e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 145e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas HuberMuxOMX::MuxOMX(const sp<IOMX> &remoteOMX) 146e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber : mRemoteOMX(remoteOMX) { 147e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 148e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 149e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas HuberMuxOMX::~MuxOMX() { 150e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 151e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 152e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberbool MuxOMX::isLocalNode(node_id node) const { 153e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber Mutex::Autolock autoLock(mLock); 154e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 155e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return isLocalNode_l(node); 156e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 157e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 158e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberbool MuxOMX::isLocalNode_l(node_id node) const { 159e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return mIsLocalNode.indexOfKey(node) >= 0; 160e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 161e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 162e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber// static 163e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberbool MuxOMX::IsSoftwareComponent(const char *name) { 164e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return !strncasecmp(name, "OMX.google.", 11); 165e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 166e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 167e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberconst sp<IOMX> &MuxOMX::getOMX(node_id node) const { 168e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return isLocalNode(node) ? mLocalOMX : mRemoteOMX; 169e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 170e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 171e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberconst sp<IOMX> &MuxOMX::getOMX_l(node_id node) const { 172e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return isLocalNode_l(node) ? mLocalOMX : mRemoteOMX; 173e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 174e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 175d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huberbool MuxOMX::livesLocally(node_id node, pid_t pid) { 176d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huber return getOMX(node)->livesLocally(node, pid); 177e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 178e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 179e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::listNodes(List<ComponentInfo> *list) { 180e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber Mutex::Autolock autoLock(mLock); 181e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 182e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber if (mLocalOMX == NULL) { 183e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber mLocalOMX = new OMX; 184e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber } 185e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 186e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return mLocalOMX->listNodes(list); 187e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 188e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 189e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::allocateNode( 190e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber const char *name, const sp<IOMXObserver> &observer, 191e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id *node) { 192e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber Mutex::Autolock autoLock(mLock); 193e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 194e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber sp<IOMX> omx; 195e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 196e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber if (IsSoftwareComponent(name)) { 197e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber if (mLocalOMX == NULL) { 198e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber mLocalOMX = new OMX; 199e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber } 200e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber omx = mLocalOMX; 201e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber } else { 202e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber omx = mRemoteOMX; 203e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber } 204e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 205e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber status_t err = omx->allocateNode(name, observer, node); 206e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 207e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber if (err != OK) { 208e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return err; 209e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber } 210e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 211e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber if (omx == mLocalOMX) { 212e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber mIsLocalNode.add(*node, true); 213e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber } 214e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 215e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return OK; 216e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 217e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 218e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::freeNode(node_id node) { 219e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber Mutex::Autolock autoLock(mLock); 220e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 221e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber status_t err = getOMX_l(node)->freeNode(node); 222e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 223e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber if (err != OK) { 224e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return err; 225e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber } 226e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 227e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber mIsLocalNode.removeItem(node); 228e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 229e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return OK; 230e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 231e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 232e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::sendCommand( 233e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) { 234e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->sendCommand(node, cmd, param); 235e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 236e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 237e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::getParameter( 238e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_INDEXTYPE index, 239e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber void *params, size_t size) { 240e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->getParameter(node, index, params, size); 241e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 242e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 243e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::setParameter( 244e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_INDEXTYPE index, 245e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber const void *params, size_t size) { 246e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->setParameter(node, index, params, size); 247e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 248e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 249e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::getConfig( 250e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_INDEXTYPE index, 251e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber void *params, size_t size) { 252e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->getConfig(node, index, params, size); 253e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 254e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 255e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::setConfig( 256e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_INDEXTYPE index, 257e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber const void *params, size_t size) { 258e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->setConfig(node, index, params, size); 259e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 260e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 261e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::getState( 262e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_STATETYPE* state) { 263e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->getState(node, state); 264e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 265e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 266e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::storeMetaDataInBuffers( 267e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, OMX_BOOL enable) { 268e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->storeMetaDataInBuffers(node, port_index, enable); 269e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 270e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 271e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::enableGraphicBuffers( 272e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, OMX_BOOL enable) { 273e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->enableGraphicBuffers(node, port_index, enable); 274e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 275e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 276e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::getGraphicBufferUsage( 277e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, OMX_U32* usage) { 278e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->getGraphicBufferUsage(node, port_index, usage); 279e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 280e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 281e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::useBuffer( 282e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, const sp<IMemory> ¶ms, 283e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber buffer_id *buffer) { 284e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->useBuffer(node, port_index, params, buffer); 285e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 286e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 287e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::useGraphicBuffer( 288e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, 289e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer) { 290e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->useGraphicBuffer( 291e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node, port_index, graphicBuffer, buffer); 292e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 293e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 294d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnarstatus_t MuxOMX::updateGraphicBufferInMeta( 295d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar node_id node, OMX_U32 port_index, 296d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar const sp<GraphicBuffer> &graphicBuffer, buffer_id buffer) { 297d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar return getOMX(node)->updateGraphicBufferInMeta( 298d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar node, port_index, graphicBuffer, buffer); 299d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar} 300d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar 3017cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenstatus_t MuxOMX::createInputSurface( 3027cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden node_id node, OMX_U32 port_index, 3037cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<IGraphicBufferProducer> *bufferProducer) { 3047cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden status_t err = getOMX(node)->createInputSurface( 3057cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden node, port_index, bufferProducer); 3067cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden return err; 3077cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden} 3087cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 3097cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenstatus_t MuxOMX::signalEndOfInputStream(node_id node) { 3107cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden return getOMX(node)->signalEndOfInputStream(node); 3117cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden} 3127cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 313e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::allocateBuffer( 314e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, size_t size, 315e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber buffer_id *buffer, void **buffer_data) { 316e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->allocateBuffer( 317e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node, port_index, size, buffer, buffer_data); 318e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 319e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 320e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::allocateBufferWithBackup( 321e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, const sp<IMemory> ¶ms, 322e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber buffer_id *buffer) { 323e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->allocateBufferWithBackup( 324e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node, port_index, params, buffer); 325e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 326e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 327e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::freeBuffer( 328e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, buffer_id buffer) { 329e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->freeBuffer(node, port_index, buffer); 330e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 331e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 332e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::fillBuffer(node_id node, buffer_id buffer) { 333e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->fillBuffer(node, buffer); 334e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 335e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 336e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::emptyBuffer( 337e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, 338e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber buffer_id buffer, 339e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber OMX_U32 range_offset, OMX_U32 range_length, 340e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber OMX_U32 flags, OMX_TICKS timestamp) { 341e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->emptyBuffer( 342e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node, buffer, range_offset, range_length, flags, timestamp); 343e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 344e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 345e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::getExtensionIndex( 346e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, 347e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber const char *parameter_name, 348e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber OMX_INDEXTYPE *index) { 349e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->getExtensionIndex(node, parameter_name, index); 350e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 351e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 352e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huberstatus_t MuxOMX::setInternalOption( 353e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber node_id node, 354e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber OMX_U32 port_index, 355e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber InternalOptionType type, 356e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber const void *data, 357e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber size_t size) { 358e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber return getOMX(node)->setInternalOption(node, port_index, type, data, size); 359e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber} 360e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber 361408b8e1073385d0d09bb96b9952f84731a0b4aebAndreas HuberOMXClient::OMXClient() { 36220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 36320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 36420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t OMXClient::connect() { 36520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<IServiceManager> sm = defaultServiceManager(); 36620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<IBinder> binder = sm->getService(String16("media.player")); 36720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<IMediaPlayerService> service = interface_cast<IMediaPlayerService>(binder); 36820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3690c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber CHECK(service.get() != NULL); 37020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 371318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mOMX = service->getOMX(); 3720c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber CHECK(mOMX.get() != NULL); 37320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 374d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huber if (!mOMX->livesLocally(NULL /* node */, getpid())) { 375e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber ALOGI("Using client-side OMX mux."); 376e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber mOMX = new MuxOMX(mOMX); 377e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber } 378e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 37920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return OK; 38020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 38120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 38220111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid OMXClient::disconnect() { 38304394b1c83d56e2956ba84aa9cb4b5d3b01d8ae8James Dong if (mOMX.get() != NULL) { 38404394b1c83d56e2956ba84aa9cb4b5d3b01d8ae8James Dong mOMX.clear(); 38504394b1c83d56e2956ba84aa9cb4b5d3b01d8ae8James Dong mOMX = NULL; 38604394b1c83d56e2956ba84aa9cb4b5d3b01d8ae8James Dong } 38720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 38820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 38920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} // namespace android 390