OMXMaster.cpp revision c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8
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 17b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber#include "OMXMaster.h" 18b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 19b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber#include <dlfcn.h> 20b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 21b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber#include <media/stagefright/MediaDebug.h> 22b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 23b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber#ifndef NO_OPENCORE 24b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber#include "OMXPVCodecsPlugin.h" 25b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber#endif 26b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 27b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Hubernamespace android { 28b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 29b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas HuberOMXMaster::OMXMaster() 30b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber : mVendorLibHandle(NULL) { 31b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber addVendorPlugin(); 32b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 33b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber#ifndef NO_OPENCORE 34b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber addPlugin(new OMXPVCodecsPlugin); 35b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber#endif 36b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber} 37b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 38b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas HuberOMXMaster::~OMXMaster() { 39b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber clearPlugins(); 40b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 41b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber if (mVendorLibHandle != NULL) { 42b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber dlclose(mVendorLibHandle); 43b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber mVendorLibHandle = NULL; 44b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber } 45b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber} 46b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 47b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Hubervoid OMXMaster::addVendorPlugin() { 48b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber mVendorLibHandle = dlopen("libstagefrighthw.so", RTLD_NOW); 49b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 50b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber if (mVendorLibHandle == NULL) { 51b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber return; 52b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber } 53b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 54b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber typedef OMXPluginBase *(*CreateOMXPluginFunc)(); 55b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber CreateOMXPluginFunc createOMXPlugin = 56b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber (CreateOMXPluginFunc)dlsym( 57b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber mVendorLibHandle, "_ZN7android15createOMXPluginEv"); 58b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 59fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber if (createOMXPlugin) { 60fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber addPlugin((*createOMXPlugin)()); 61fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber } 62b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber} 63b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 64b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Hubervoid OMXMaster::addPlugin(OMXPluginBase *plugin) { 65b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber Mutex::Autolock autoLock(mLock); 66b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 67b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber mPlugins.push_back(plugin); 68b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 69b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber OMX_U32 index = 0; 70b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 71b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber char name[128]; 72b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber OMX_ERRORTYPE err; 73b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber while ((err = plugin->enumerateComponents( 74b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber name, sizeof(name), index++)) == OMX_ErrorNone) { 75b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber String8 name8(name); 76b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 77b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber if (mPluginByComponentName.indexOfKey(name8) >= 0) { 78b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber LOGE("A component of name '%s' already exists, ignoring this one.", 79b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber name8.string()); 80b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 81b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber continue; 82b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber } 83b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 84b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber mPluginByComponentName.add(name8, plugin); 85b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber } 86b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber CHECK_EQ(err, OMX_ErrorNoMore); 87b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber} 88b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 89b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Hubervoid OMXMaster::clearPlugins() { 90b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber Mutex::Autolock autoLock(mLock); 91b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 92b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber mPluginByComponentName.clear(); 93b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 94b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber for (List<OMXPluginBase *>::iterator it = mPlugins.begin(); 95b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber it != mPlugins.end(); ++it) { 96b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber delete *it; 97b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber *it = NULL; 98b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber } 99b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 100b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber mPlugins.clear(); 101b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber} 102b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 103b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas HuberOMX_ERRORTYPE OMXMaster::makeComponentInstance( 104b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber const char *name, 105b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber const OMX_CALLBACKTYPE *callbacks, 106b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber OMX_PTR appData, 107b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber OMX_COMPONENTTYPE **component) { 108b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber Mutex::Autolock autoLock(mLock); 109b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 110b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber *component = NULL; 111b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 112b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber ssize_t index = mPluginByComponentName.indexOfKey(String8(name)); 113b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 114b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber if (index < 0) { 115b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber return OMX_ErrorInvalidComponentName; 116b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber } 117b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 118b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber OMXPluginBase *plugin = mPluginByComponentName.valueAt(index); 119fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber OMX_ERRORTYPE err = 120fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber plugin->makeComponentInstance(name, callbacks, appData, component); 121fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber 122fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber if (err != OMX_ErrorNone) { 123fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber return err; 124fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber } 125fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber 126fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber mPluginByInstance.add(*component, plugin); 127fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber 128fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber return err; 129fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber} 130fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber 131fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas HuberOMX_ERRORTYPE OMXMaster::destroyComponentInstance( 132fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber OMX_COMPONENTTYPE *component) { 133fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber Mutex::Autolock autoLock(mLock); 134fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber 135fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber ssize_t index = mPluginByInstance.indexOfKey(component); 136fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber 137fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber if (index < 0) { 138fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber return OMX_ErrorBadParameter; 139fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber } 140fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber 141fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber OMXPluginBase *plugin = mPluginByInstance.valueAt(index); 142fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber mPluginByInstance.removeItemsAt(index); 143fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber 144fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber return plugin->destroyComponentInstance(component); 145b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber} 146b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 147b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas HuberOMX_ERRORTYPE OMXMaster::enumerateComponents( 148b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber OMX_STRING name, 149b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber size_t size, 150b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber OMX_U32 index) { 151b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber Mutex::Autolock autoLock(mLock); 152b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 153b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber size_t numComponents = mPluginByComponentName.size(); 154b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 155b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber if (index >= numComponents) { 156b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber return OMX_ErrorNoMore; 157b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber } 158b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 159b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber const String8 &name8 = mPluginByComponentName.keyAt(index); 160b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 161b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber CHECK(size >= 1 + name8.size()); 162b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber strcpy(name, name8.string()); 163b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 164b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber return OMX_ErrorNone; 165b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber} 166b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber 167c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas HuberOMX_ERRORTYPE OMXMaster::getRolesOfComponent( 168c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber const char *name, 169c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber Vector<String8> *roles) { 170c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber Mutex::Autolock autoLock(mLock); 171c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber 172c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber roles->clear(); 173c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber 174c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber ssize_t index = mPluginByComponentName.indexOfKey(String8(name)); 175c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber 176c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber if (index < 0) { 177c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber return OMX_ErrorInvalidComponentName; 178c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber } 179c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber 180c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber OMXPluginBase *plugin = mPluginByComponentName.valueAt(index); 181c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber return plugin->getRolesOfComponent(name, roles); 182c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber} 183c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber 184b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber} // namespace android 185