summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/omx/OMXMaster.cpp
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2009-12-03 11:39:54 -0800
committerAndreas Huber <andih@google.com>2009-12-03 12:49:09 -0800
commite3ec3cec3a2e27033249ff82964d2cbd441d9873 (patch)
tree46e3b22fc02c1f20b8a8403818395ba4ba51ddb2 /media/libstagefright/omx/OMXMaster.cpp
parentc297fccffc4ab1cb3b9f5c6a5b0802be057f3e0f (diff)
downloadframeworks_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.cpp144
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