Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 91b8fe31 authored by Lajos Molnar's avatar Lajos Molnar
Browse files

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
parent 3c3d1d26
Loading
Loading
Loading
Loading
+43 −5
Original line number Diff line number Diff line
@@ -41,7 +41,6 @@ cc_library_shared {
        "libcutils",
        "libstagefright_foundation",
        "libstagefright_bufferqueue_helper",
        "libstagefright_softomx",
        "libstagefright_xmlparser",
        "libdl",
        "libhidlbase",
@@ -79,14 +78,10 @@ cc_library_shared {
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 {
    },
}

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,
+29 −25
Original line number Diff line number Diff line
@@ -29,8 +29,7 @@

namespace android {

OMXMaster::OMXMaster()
    : mVendorLibHandle(NULL) {
OMXMaster::OMXMaster() {

    pid_t pid = getpid();
    char filename[20];
@@ -52,47 +51,52 @@ OMXMaster::OMXMaster()
    }

    addVendorPlugin();
    addPlugin(new SoftOMXPlugin);
    addPlatformPlugin();
}

OMXMaster::~OMXMaster() {
    clearPlugins();

    if (mVendorLibHandle != NULL) {
        dlclose(mVendorLibHandle);
        mVendorLibHandle = NULL;
    }
}

void OMXMaster::addVendorPlugin() {
    addPlugin("libstagefrighthw.so");
}

void OMXMaster::addPlatformPlugin() {
    addPlugin("libstagefright_softomx_plugin.so");
}

void OMXMaster::addPlugin(const char *libname) {
    mVendorLibHandle = android_load_sphal_library(libname, RTLD_NOW);
    void *libHandle = android_load_sphal_library(libname, RTLD_NOW);

    if (mVendorLibHandle == NULL) {
    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::addPlugin(OMXPluginBase *plugin) {
void OMXMaster::clearPlugins() {
    Mutex::Autolock autoLock(mLock);

    mPluginByComponentName.clear();
    mPluginByInstance.clear();

    typedef void (*DestroyOMXPluginFunc)(OMXPluginBase*);
    for (const Plugin &plugin : mPlugins) {
        DestroyOMXPluginFunc destroyOMXPlugin =
            (DestroyOMXPluginFunc)dlsym(
                mVendorLibHandle, "destroyOMXPlugin");

    mPluginByComponentName.clear();

    for (List<OMXPluginBase *>::iterator it = mPlugins.begin();
            it != mPlugins.end(); ++it) {
                    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();
+10 −0
Original line number Diff line number Diff line
@@ -71,6 +71,16 @@ static const struct {
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() {
}

+6 −3
Original line number Diff line number Diff line
@@ -52,13 +52,16 @@ struct OMXMaster : public OMXPluginBase {
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();