OMXMaster.cpp revision fb41d59595a09f60fd2fa3618e9d5a4937c4555b
1b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber/* 2b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber * Copyright (C) 2009 The Android Open Source Project 3b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber * 4b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber * you may not use this file except in compliance with the License. 6b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber * You may obtain a copy of the License at 7b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber * 8b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber * 10b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber * Unless required by applicable law or agreed to in writing, software 11b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber * See the License for the specific language governing permissions and 14b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber * limitations under the License. 15b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber */ 16b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 17fb41d59595a09f60fd2fa3618e9d5a4937c4555bAndreas Huber//#define LOG_NDEBUG 0 18fb41d59595a09f60fd2fa3618e9d5a4937c4555bAndreas Huber#define LOG_TAG "OMXMaster" 19fb41d59595a09f60fd2fa3618e9d5a4937c4555bAndreas Huber#include <utils/Log.h> 20fb41d59595a09f60fd2fa3618e9d5a4937c4555bAndreas Huber 21b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber#include "OMXMaster.h" 22b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 23b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber#include <dlfcn.h> 24b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 25b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber#include <media/stagefright/MediaDebug.h> 26b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 27b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber#ifndef NO_OPENCORE 28b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber#include "OMXPVCodecsPlugin.h" 29b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber#endif 30b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 31b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Hubernamespace android { 32b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 33b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas HuberOMXMaster::OMXMaster() 34b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber : mVendorLibHandle(NULL) { 35b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber addVendorPlugin(); 36b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 37b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber#ifndef NO_OPENCORE 38b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber addPlugin(new OMXPVCodecsPlugin); 39b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber#endif 40b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber} 41b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 42b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas HuberOMXMaster::~OMXMaster() { 43b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber clearPlugins(); 44b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 45b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber if (mVendorLibHandle != NULL) { 46b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber dlclose(mVendorLibHandle); 47b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber mVendorLibHandle = NULL; 48b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber } 49b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber} 50b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 51b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Hubervoid OMXMaster::addVendorPlugin() { 52b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber mVendorLibHandle = dlopen("libstagefrighthw.so", RTLD_NOW); 53b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 54b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber if (mVendorLibHandle == NULL) { 55b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber return; 56b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber } 57b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 58b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber typedef OMXPluginBase *(*CreateOMXPluginFunc)(); 59b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber CreateOMXPluginFunc createOMXPlugin = 60b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber (CreateOMXPluginFunc)dlsym( 61b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber mVendorLibHandle, "_ZN7android15createOMXPluginEv"); 62b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 63fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber if (createOMXPlugin) { 64fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber addPlugin((*createOMXPlugin)()); 65fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber } 66b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber} 67b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 68b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Hubervoid OMXMaster::addPlugin(OMXPluginBase *plugin) { 69b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber Mutex::Autolock autoLock(mLock); 70b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 71b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber mPlugins.push_back(plugin); 72b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 73b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber OMX_U32 index = 0; 74b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 75b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber char name[128]; 76b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber OMX_ERRORTYPE err; 77b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber while ((err = plugin->enumerateComponents( 78b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber name, sizeof(name), index++)) == OMX_ErrorNone) { 79b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber String8 name8(name); 80b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 81b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber if (mPluginByComponentName.indexOfKey(name8) >= 0) { 82b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber LOGE("A component of name '%s' already exists, ignoring this one.", 83b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber name8.string()); 84b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 85b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber continue; 86b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber } 87b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 88b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber mPluginByComponentName.add(name8, plugin); 89b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber } 90b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber CHECK_EQ(err, OMX_ErrorNoMore); 91b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber} 92b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 93b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Hubervoid OMXMaster::clearPlugins() { 94b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber Mutex::Autolock autoLock(mLock); 95b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 96b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber mPluginByComponentName.clear(); 97b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 98b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber for (List<OMXPluginBase *>::iterator it = mPlugins.begin(); 99b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber it != mPlugins.end(); ++it) { 100b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber delete *it; 101b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber *it = NULL; 102b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber } 103b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 104b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber mPlugins.clear(); 105b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber} 106b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 107b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas HuberOMX_ERRORTYPE OMXMaster::makeComponentInstance( 108b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber const char *name, 109b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber const OMX_CALLBACKTYPE *callbacks, 110b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber OMX_PTR appData, 111b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber OMX_COMPONENTTYPE **component) { 112b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber Mutex::Autolock autoLock(mLock); 113b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 114b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber *component = NULL; 115b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 116b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber ssize_t index = mPluginByComponentName.indexOfKey(String8(name)); 117b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 118b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber if (index < 0) { 119b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber return OMX_ErrorInvalidComponentName; 120b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber } 121b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 122b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber OMXPluginBase *plugin = mPluginByComponentName.valueAt(index); 123fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber OMX_ERRORTYPE err = 124fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber plugin->makeComponentInstance(name, callbacks, appData, component); 125fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber 126fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber if (err != OMX_ErrorNone) { 127fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber return err; 128fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber } 129fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber 130fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber mPluginByInstance.add(*component, plugin); 131fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber 132fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber return err; 133fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber} 134fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber 135fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas HuberOMX_ERRORTYPE OMXMaster::destroyComponentInstance( 136fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber OMX_COMPONENTTYPE *component) { 137fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber Mutex::Autolock autoLock(mLock); 138fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber 139fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber ssize_t index = mPluginByInstance.indexOfKey(component); 140fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber 141fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber if (index < 0) { 142fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber return OMX_ErrorBadParameter; 143fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber } 144fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber 145fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber OMXPluginBase *plugin = mPluginByInstance.valueAt(index); 146fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber mPluginByInstance.removeItemsAt(index); 147fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber 148fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber return plugin->destroyComponentInstance(component); 149b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber} 150b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 151b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas HuberOMX_ERRORTYPE OMXMaster::enumerateComponents( 152b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber OMX_STRING name, 153b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber size_t size, 154b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber OMX_U32 index) { 155b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber Mutex::Autolock autoLock(mLock); 156b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 157b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber size_t numComponents = mPluginByComponentName.size(); 158b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 159b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber if (index >= numComponents) { 160b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber return OMX_ErrorNoMore; 161b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber } 162b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 163b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber const String8 &name8 = mPluginByComponentName.keyAt(index); 164b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 165b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber CHECK(size >= 1 + name8.size()); 166b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber strcpy(name, name8.string()); 167b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 168b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber return OMX_ErrorNone; 169b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber} 170b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 171c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas HuberOMX_ERRORTYPE OMXMaster::getRolesOfComponent( 172c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber const char *name, 173c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber Vector<String8> *roles) { 174c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber Mutex::Autolock autoLock(mLock); 175c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber 176c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber roles->clear(); 177c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber 178c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber ssize_t index = mPluginByComponentName.indexOfKey(String8(name)); 179c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber 180c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber if (index < 0) { 181c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber return OMX_ErrorInvalidComponentName; 182c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber } 183c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber 184c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber OMXPluginBase *plugin = mPluginByComponentName.valueAt(index); 185c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber return plugin->getRolesOfComponent(name, roles); 186c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber} 187c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber 188b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber} // namespace android 189