media/omx: Make OMX software plugin an actual plugin
- This allows devices to ship with or without software
OMX codecs.
Bug: 129710438
Change-Id: Ie23fd3b39b2607ae657b43521a3e1870a7a25976
diff --git a/media/libstagefright/omx/Android.bp b/media/libstagefright/omx/Android.bp
index 0c50752..e260cae 100644
--- a/media/libstagefright/omx/Android.bp
+++ b/media/libstagefright/omx/Android.bp
@@ -41,7 +41,6 @@
"libcutils",
"libstagefright_foundation",
"libstagefright_bufferqueue_helper",
- "libstagefright_softomx",
"libstagefright_xmlparser",
"libdl",
"libhidlbase",
@@ -79,14 +78,10 @@
cc_library_shared {
name: "libstagefright_softomx",
vendor_available: true,
- vndk: {
- enabled: true,
- },
srcs: [
"SimpleSoftOMXComponent.cpp",
"SoftOMXComponent.cpp",
- "SoftOMXPlugin.cpp",
"SoftVideoDecoderOMXComponent.cpp",
"SoftVideoEncoderOMXComponent.cpp",
],
@@ -126,6 +121,49 @@
},
}
+cc_library_shared {
+ name: "libstagefright_softomx_plugin",
+ vendor_available: true,
+
+ srcs: [
+ "SoftOMXPlugin.cpp",
+ ],
+
+ export_include_dirs: [
+ "include",
+ ],
+
+ header_libs: [
+ "media_plugin_headers",
+ ],
+
+ export_header_lib_headers: [
+ "media_plugin_headers",
+ ],
+
+ shared_libs: [
+ "libstagefright_softomx",
+ "libstagefright_foundation",
+ "liblog",
+ "libutils",
+ ],
+
+ cflags: [
+ "-Werror",
+ "-Wall",
+ "-Wno-unused-parameter",
+ "-Wno-documentation",
+ ],
+
+ sanitize: {
+ misc_undefined: [
+ "signed-integer-overflow",
+ "unsigned-integer-overflow",
+ ],
+ cfi: true,
+ },
+}
+
cc_defaults {
name: "libstagefright_softomx-defaults",
vendor_available: true,
diff --git a/media/libstagefright/omx/OMXMaster.cpp b/media/libstagefright/omx/OMXMaster.cpp
index 0967b5f..8c5ca6e 100644
--- a/media/libstagefright/omx/OMXMaster.cpp
+++ b/media/libstagefright/omx/OMXMaster.cpp
@@ -29,8 +29,7 @@
namespace android {
-OMXMaster::OMXMaster()
- : mVendorLibHandle(NULL) {
+OMXMaster::OMXMaster() {
pid_t pid = getpid();
char filename[20];
@@ -52,47 +51,52 @@
}
addVendorPlugin();
- addPlugin(new SoftOMXPlugin);
+ addPlatformPlugin();
}
OMXMaster::~OMXMaster() {
clearPlugins();
-
- if (mVendorLibHandle != NULL) {
- dlclose(mVendorLibHandle);
- mVendorLibHandle = NULL;
- }
}
void OMXMaster::addVendorPlugin() {
addPlugin("libstagefrighthw.so");
}
-void OMXMaster::addPlugin(const char *libname) {
- mVendorLibHandle = android_load_sphal_library(libname, RTLD_NOW);
+void OMXMaster::addPlatformPlugin() {
+ addPlugin("libstagefright_softomx_plugin.so");
+}
- if (mVendorLibHandle == NULL) {
+void OMXMaster::addPlugin(const char *libname) {
+ void *libHandle = android_load_sphal_library(libname, RTLD_NOW);
+
+ if (libHandle == NULL) {
return;
}
typedef OMXPluginBase *(*CreateOMXPluginFunc)();
CreateOMXPluginFunc createOMXPlugin =
(CreateOMXPluginFunc)dlsym(
- mVendorLibHandle, "createOMXPlugin");
+ libHandle, "createOMXPlugin");
if (!createOMXPlugin)
createOMXPlugin = (CreateOMXPluginFunc)dlsym(
- mVendorLibHandle, "_ZN7android15createOMXPluginEv");
+ libHandle, "_ZN7android15createOMXPluginEv");
+ OMXPluginBase *plugin = nullptr;
if (createOMXPlugin) {
- addPlugin((*createOMXPlugin)());
+ plugin = (*createOMXPlugin)();
+ }
+
+ if (plugin) {
+ mPlugins.push_back({ plugin, libHandle });
+ addPlugin(plugin);
+ } else {
+ android_unload_sphal_library(libHandle);
}
}
void OMXMaster::addPlugin(OMXPluginBase *plugin) {
Mutex::Autolock autoLock(mLock);
- mPlugins.push_back(plugin);
-
OMX_U32 index = 0;
char name[128];
@@ -120,20 +124,20 @@
void OMXMaster::clearPlugins() {
Mutex::Autolock autoLock(mLock);
- typedef void (*DestroyOMXPluginFunc)(OMXPluginBase*);
- DestroyOMXPluginFunc destroyOMXPlugin =
- (DestroyOMXPluginFunc)dlsym(
- mVendorLibHandle, "destroyOMXPlugin");
-
mPluginByComponentName.clear();
+ mPluginByInstance.clear();
- for (List<OMXPluginBase *>::iterator it = mPlugins.begin();
- it != mPlugins.end(); ++it) {
+ typedef void (*DestroyOMXPluginFunc)(OMXPluginBase*);
+ for (const Plugin &plugin : mPlugins) {
+ DestroyOMXPluginFunc destroyOMXPlugin =
+ (DestroyOMXPluginFunc)dlsym(
+ plugin.mLibHandle, "destroyOMXPlugin");
if (destroyOMXPlugin)
- destroyOMXPlugin(*it);
+ destroyOMXPlugin(plugin.mOmx);
else
- delete *it;
- *it = NULL;
+ delete plugin.mOmx;
+
+ android_unload_sphal_library(plugin.mLibHandle);
}
mPlugins.clear();
diff --git a/media/libstagefright/omx/SoftOMXPlugin.cpp b/media/libstagefright/omx/SoftOMXPlugin.cpp
index 1f3e8c1..a720bc9 100644
--- a/media/libstagefright/omx/SoftOMXPlugin.cpp
+++ b/media/libstagefright/omx/SoftOMXPlugin.cpp
@@ -71,6 +71,16 @@
static const size_t kNumComponents =
sizeof(kComponents) / sizeof(kComponents[0]);
+extern "C" OMXPluginBase* createOMXPlugin() {
+ ALOGI("createOMXPlugin");
+ return new SoftOMXPlugin();
+}
+
+extern "C" void destroyOMXPlugin(OMXPluginBase* plugin) {
+ ALOGI("destroyOMXPlugin");
+ delete plugin;
+}
+
SoftOMXPlugin::SoftOMXPlugin() {
}
diff --git a/media/libstagefright/omx/include/media/stagefright/omx/OMXMaster.h b/media/libstagefright/omx/include/media/stagefright/omx/OMXMaster.h
index 897f287..93eaef1 100644
--- a/media/libstagefright/omx/include/media/stagefright/omx/OMXMaster.h
+++ b/media/libstagefright/omx/include/media/stagefright/omx/OMXMaster.h
@@ -52,13 +52,16 @@
private:
char mProcessName[16];
Mutex mLock;
- List<OMXPluginBase *> mPlugins;
+ struct Plugin {
+ OMXPluginBase *mOmx;
+ void *mLibHandle;
+ };
+ List<Plugin> mPlugins;
KeyedVector<String8, OMXPluginBase *> mPluginByComponentName;
KeyedVector<OMX_COMPONENTTYPE *, OMXPluginBase *> mPluginByInstance;
- void *mVendorLibHandle;
-
void addVendorPlugin();
+ void addPlatformPlugin();
void addPlugin(const char *libname);
void addPlugin(OMXPluginBase *plugin);
void clearPlugins();