OMXClient.cpp revision 7cd58537932ef6f481f68be0b9c597a89cebdfec
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 35e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual IBinder *onAsBinder() { return NULL; } 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 867cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden virtual status_t createInputSurface( 877cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden node_id node, OMX_U32 port_index, 887cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<IGraphicBufferProducer> *bufferProducer); 897cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 907cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden virtual status_t signalEndOfInputStream(node_id node); 917cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 92e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t allocateBuffer( 93e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, size_t size, 94e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber buffer_id *buffer, void **buffer_data); 95e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 96e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t allocateBufferWithBackup( 97e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, const sp<IMemory> ¶ms, 98e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber buffer_id *buffer); 99e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 100e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t freeBuffer( 101e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, buffer_id buffer); 102e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 103e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t fillBuffer(node_id node, buffer_id buffer); 104e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 105e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t emptyBuffer( 106e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, 107e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber buffer_id buffer, 108e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber OMX_U32 range_offset, OMX_U32 range_length, 109e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber OMX_U32 flags, OMX_TICKS timestamp); 110e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 111e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber virtual status_t getExtensionIndex( 112e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, 113e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber const char *parameter_name, 114e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber OMX_INDEXTYPE *index); 115e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 116e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberprivate: 117e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber mutable Mutex mLock; 118e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 119e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber sp<IOMX> mRemoteOMX; 120e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber sp<IOMX> mLocalOMX; 121e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 122e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber KeyedVector<node_id, bool> mIsLocalNode; 123e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 124e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber bool isLocalNode(node_id node) const; 125e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber bool isLocalNode_l(node_id node) const; 126e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber const sp<IOMX> &getOMX(node_id node) const; 127e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber const sp<IOMX> &getOMX_l(node_id node) const; 128e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 129e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber static bool IsSoftwareComponent(const char *name); 130e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 131e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber DISALLOW_EVIL_CONSTRUCTORS(MuxOMX); 132e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}; 133e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 134e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas HuberMuxOMX::MuxOMX(const sp<IOMX> &remoteOMX) 135e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber : mRemoteOMX(remoteOMX) { 136e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 137e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 138e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas HuberMuxOMX::~MuxOMX() { 139e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 140e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 141e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberbool MuxOMX::isLocalNode(node_id node) const { 142e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber Mutex::Autolock autoLock(mLock); 143e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 144e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return isLocalNode_l(node); 145e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 146e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 147e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberbool MuxOMX::isLocalNode_l(node_id node) const { 148e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return mIsLocalNode.indexOfKey(node) >= 0; 149e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 150e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 151e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber// static 152e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberbool MuxOMX::IsSoftwareComponent(const char *name) { 153e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return !strncasecmp(name, "OMX.google.", 11); 154e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 155e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 156e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberconst sp<IOMX> &MuxOMX::getOMX(node_id node) const { 157e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return isLocalNode(node) ? mLocalOMX : mRemoteOMX; 158e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 159e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 160e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberconst sp<IOMX> &MuxOMX::getOMX_l(node_id node) const { 161e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return isLocalNode_l(node) ? mLocalOMX : mRemoteOMX; 162e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 163e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 164d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huberbool MuxOMX::livesLocally(node_id node, pid_t pid) { 165d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huber return getOMX(node)->livesLocally(node, pid); 166e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 167e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 168e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::listNodes(List<ComponentInfo> *list) { 169e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber Mutex::Autolock autoLock(mLock); 170e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 171e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber if (mLocalOMX == NULL) { 172e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber mLocalOMX = new OMX; 173e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber } 174e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 175e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return mLocalOMX->listNodes(list); 176e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 177e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 178e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::allocateNode( 179e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber const char *name, const sp<IOMXObserver> &observer, 180e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id *node) { 181e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber Mutex::Autolock autoLock(mLock); 182e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 183e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber sp<IOMX> omx; 184e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 185e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber if (IsSoftwareComponent(name)) { 186e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber if (mLocalOMX == NULL) { 187e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber mLocalOMX = new OMX; 188e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber } 189e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber omx = mLocalOMX; 190e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber } else { 191e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber omx = mRemoteOMX; 192e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber } 193e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 194e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber status_t err = omx->allocateNode(name, observer, node); 195e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 196e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber if (err != OK) { 197e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return err; 198e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber } 199e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 200e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber if (omx == mLocalOMX) { 201e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber mIsLocalNode.add(*node, true); 202e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber } 203e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 204e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return OK; 205e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 206e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 207e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::freeNode(node_id node) { 208e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber Mutex::Autolock autoLock(mLock); 209e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 210e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber status_t err = getOMX_l(node)->freeNode(node); 211e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 212e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber if (err != OK) { 213e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return err; 214e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber } 215e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 216e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber mIsLocalNode.removeItem(node); 217e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 218e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return OK; 219e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 220e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 221e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::sendCommand( 222e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) { 223e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->sendCommand(node, cmd, param); 224e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 225e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 226e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::getParameter( 227e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_INDEXTYPE index, 228e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber void *params, size_t size) { 229e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->getParameter(node, index, params, size); 230e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 231e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 232e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::setParameter( 233e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_INDEXTYPE index, 234e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber const void *params, size_t size) { 235e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->setParameter(node, index, params, size); 236e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 237e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 238e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::getConfig( 239e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_INDEXTYPE index, 240e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber void *params, size_t size) { 241e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->getConfig(node, index, params, size); 242e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 243e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 244e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::setConfig( 245e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_INDEXTYPE index, 246e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber const void *params, size_t size) { 247e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->setConfig(node, index, params, size); 248e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 249e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 250e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::getState( 251e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_STATETYPE* state) { 252e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->getState(node, state); 253e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 254e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 255e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::storeMetaDataInBuffers( 256e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, OMX_BOOL enable) { 257e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->storeMetaDataInBuffers(node, port_index, enable); 258e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 259e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 260e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::enableGraphicBuffers( 261e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, OMX_BOOL enable) { 262e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->enableGraphicBuffers(node, port_index, enable); 263e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 264e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 265e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::getGraphicBufferUsage( 266e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, OMX_U32* usage) { 267e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->getGraphicBufferUsage(node, port_index, usage); 268e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 269e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 270e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::useBuffer( 271e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, const sp<IMemory> ¶ms, 272e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber buffer_id *buffer) { 273e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->useBuffer(node, port_index, params, buffer); 274e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 275e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 276e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::useGraphicBuffer( 277e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, 278e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer) { 279e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->useGraphicBuffer( 280e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node, port_index, graphicBuffer, buffer); 281e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 282e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 2837cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenstatus_t MuxOMX::createInputSurface( 2847cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden node_id node, OMX_U32 port_index, 2857cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<IGraphicBufferProducer> *bufferProducer) { 2867cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden status_t err = getOMX(node)->createInputSurface( 2877cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden node, port_index, bufferProducer); 2887cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden return err; 2897cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden} 2907cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 2917cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenstatus_t MuxOMX::signalEndOfInputStream(node_id node) { 2927cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden return getOMX(node)->signalEndOfInputStream(node); 2937cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden} 2947cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 295e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::allocateBuffer( 296e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, size_t size, 297e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber buffer_id *buffer, void **buffer_data) { 298e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->allocateBuffer( 299e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node, port_index, size, buffer, buffer_data); 300e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 301e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 302e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::allocateBufferWithBackup( 303e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, const sp<IMemory> ¶ms, 304e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber buffer_id *buffer) { 305e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->allocateBufferWithBackup( 306e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node, port_index, params, buffer); 307e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 308e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 309e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::freeBuffer( 310e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, OMX_U32 port_index, buffer_id buffer) { 311e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->freeBuffer(node, port_index, buffer); 312e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 313e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 314e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::fillBuffer(node_id node, buffer_id buffer) { 315e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->fillBuffer(node, buffer); 316e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 317e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 318e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::emptyBuffer( 319e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, 320e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber buffer_id buffer, 321e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber OMX_U32 range_offset, OMX_U32 range_length, 322e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber OMX_U32 flags, OMX_TICKS timestamp) { 323e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->emptyBuffer( 324e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node, buffer, range_offset, range_length, flags, timestamp); 325e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 326e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 327e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::getExtensionIndex( 328e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber node_id node, 329e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber const char *parameter_name, 330e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber OMX_INDEXTYPE *index) { 331e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber return getOMX(node)->getExtensionIndex(node, parameter_name, index); 332e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber} 333e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 334408b8e1073385d0d09bb96b9952f84731a0b4aebAndreas HuberOMXClient::OMXClient() { 33520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 33620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 33720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t OMXClient::connect() { 33820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<IServiceManager> sm = defaultServiceManager(); 33920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<IBinder> binder = sm->getService(String16("media.player")); 34020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<IMediaPlayerService> service = interface_cast<IMediaPlayerService>(binder); 34120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3420c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber CHECK(service.get() != NULL); 34320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 344318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mOMX = service->getOMX(); 3450c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber CHECK(mOMX.get() != NULL); 34620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 347d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huber if (!mOMX->livesLocally(NULL /* node */, getpid())) { 348e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber ALOGI("Using client-side OMX mux."); 349e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber mOMX = new MuxOMX(mOMX); 350e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber } 351e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber 35220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return OK; 35320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 35420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 35520111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid OMXClient::disconnect() { 35604394b1c83d56e2956ba84aa9cb4b5d3b01d8ae8James Dong if (mOMX.get() != NULL) { 35704394b1c83d56e2956ba84aa9cb4b5d3b01d8ae8James Dong mOMX.clear(); 35804394b1c83d56e2956ba84aa9cb4b5d3b01d8ae8James Dong mOMX = NULL; 35904394b1c83d56e2956ba84aa9cb4b5d3b01d8ae8James Dong } 36020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 36120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 36220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} // namespace android 363