diff options
author | Andreas Huber <andih@google.com> | 2009-12-03 11:39:54 -0800 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2009-12-03 12:49:09 -0800 |
commit | e3ec3cec3a2e27033249ff82964d2cbd441d9873 (patch) | |
tree | 46e3b22fc02c1f20b8a8403818395ba4ba51ddb2 /media/libstagefright/omx/OMXMaster.cpp | |
parent | c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0f (diff) | |
download | frameworks_av-e3ec3cec3a2e27033249ff82964d2cbd441d9873.zip frameworks_av-e3ec3cec3a2e27033249ff82964d2cbd441d9873.tar.gz frameworks_av-e3ec3cec3a2e27033249ff82964d2cbd441d9873.tar.bz2 |
Squashed commit of the following:
commit 543e192bf2ae13f573dc4c4e53b239ed4ea00e81
Author: Andreas Huber <andih@google.com>
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 <andih@google.com>
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.
Diffstat (limited to 'media/libstagefright/omx/OMXMaster.cpp')
-rw-r--r-- | media/libstagefright/omx/OMXMaster.cpp | 144 |
1 files changed, 144 insertions, 0 deletions
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 <dlfcn.h> + +#include <media/stagefright/MediaDebug.h> + +#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<OMXPluginBase *>::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 |