From e3ec3cec3a2e27033249ff82964d2cbd441d9873 Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Thu, 3 Dec 2009 11:39:54 -0800 Subject: Squashed commit of the following: commit 543e192bf2ae13f573dc4c4e53b239ed4ea00e81 Author: Andreas Huber Date: Thu Dec 3 11:33:57 2009 -0800 stagefright now acts as the OMX Master, vendors supply their own plugins through libstagefrighthw. In OpenCore-enabled builds we now sit on top of PVMaster... commit 3cbfdbd9cecadbb77b63125c62883bf1065884fe Author: Andreas Huber Date: Wed Dec 2 12:39:07 2009 -0800 More OMX infrastructure, stagefright is now taking over the OMX Master, multiplexing all contributing OMX implementations under a common interface. --- media/libstagefright/omx/OMXMaster.cpp | 144 +++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 media/libstagefright/omx/OMXMaster.cpp (limited to 'media/libstagefright/omx/OMXMaster.cpp') diff --git a/media/libstagefright/omx/OMXMaster.cpp b/media/libstagefright/omx/OMXMaster.cpp new file mode 100644 index 0000000..838a9f7 --- /dev/null +++ b/media/libstagefright/omx/OMXMaster.cpp @@ -0,0 +1,144 @@ +/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "OMXMaster.h" + +#include + +#include + +#ifndef NO_OPENCORE +#include "OMXPVCodecsPlugin.h" +#endif + +#include "OMXSoftwareCodecsPlugin.h" + +namespace android { + +OMXMaster::OMXMaster() + : mVendorLibHandle(NULL) { + addPlugin(new OMXSoftwareCodecsPlugin); + + addVendorPlugin(); + +#ifndef NO_OPENCORE + addPlugin(new OMXPVCodecsPlugin); +#endif +} + +OMXMaster::~OMXMaster() { + clearPlugins(); + + if (mVendorLibHandle != NULL) { + dlclose(mVendorLibHandle); + mVendorLibHandle = NULL; + } +} + +void OMXMaster::addVendorPlugin() { + mVendorLibHandle = dlopen("libstagefrighthw.so", RTLD_NOW); + + if (mVendorLibHandle == NULL) { + return; + } + + typedef OMXPluginBase *(*CreateOMXPluginFunc)(); + CreateOMXPluginFunc createOMXPlugin = + (CreateOMXPluginFunc)dlsym( + mVendorLibHandle, "_ZN7android15createOMXPluginEv"); + + addPlugin((*createOMXPlugin)()); +} + +void OMXMaster::addPlugin(OMXPluginBase *plugin) { + Mutex::Autolock autoLock(mLock); + + mPlugins.push_back(plugin); + + OMX_U32 index = 0; + + char name[128]; + OMX_ERRORTYPE err; + while ((err = plugin->enumerateComponents( + name, sizeof(name), index++)) == OMX_ErrorNone) { + String8 name8(name); + + if (mPluginByComponentName.indexOfKey(name8) >= 0) { + LOGE("A component of name '%s' already exists, ignoring this one.", + name8.string()); + + continue; + } + + mPluginByComponentName.add(name8, plugin); + } + CHECK_EQ(err, OMX_ErrorNoMore); +} + +void OMXMaster::clearPlugins() { + Mutex::Autolock autoLock(mLock); + + mPluginByComponentName.clear(); + + for (List::iterator it = mPlugins.begin(); + it != mPlugins.end(); ++it) { + delete *it; + *it = NULL; + } + + mPlugins.clear(); +} + +OMX_ERRORTYPE OMXMaster::makeComponentInstance( + const char *name, + const OMX_CALLBACKTYPE *callbacks, + OMX_PTR appData, + OMX_COMPONENTTYPE **component) { + Mutex::Autolock autoLock(mLock); + + *component = NULL; + + ssize_t index = mPluginByComponentName.indexOfKey(String8(name)); + + if (index < 0) { + return OMX_ErrorInvalidComponentName; + } + + OMXPluginBase *plugin = mPluginByComponentName.valueAt(index); + return plugin->makeComponentInstance(name, callbacks, appData, component); +} + +OMX_ERRORTYPE OMXMaster::enumerateComponents( + OMX_STRING name, + size_t size, + OMX_U32 index) { + Mutex::Autolock autoLock(mLock); + + size_t numComponents = mPluginByComponentName.size(); + + if (index >= numComponents) { + return OMX_ErrorNoMore; + } + + const String8 &name8 = mPluginByComponentName.keyAt(index); + + CHECK(size >= 1 + name8.size()); + strcpy(name, name8.string()); + + return OMX_ErrorNone; +} + +} // namespace android -- cgit v1.1