stagefright 架构分析(七) 动态加载libstagefrighthw.so

来源:互联网 发布:华云数据最新消息 编辑:程序博客网 时间:2024/05/18 06:16

在加载软解码库的代码中,可以看到有加载libstagefrighthw.so的代码,其是加载硬件解码plugin,每个平台都有自己libstagefrighthw.so的实现,以实现硬编解码,以高通平台为例:


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

//加入硬解码Plugin
    addVendorPlugin();
    addPlugin(new SoftOMXPlugin);
}


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


void OMXMaster::addPlugin(const char *libname) {

//dlopen库
    mVendorLibHandle = dlopen(libname, RTLD_NOW);
    if (mVendorLibHandle == NULL) {
        return;
    }
    typedef OMXPluginBase *(*CreateOMXPluginFunc)();
    CreateOMXPluginFunc createOMXPlugin =
        (CreateOMXPluginFunc)dlsym(
                mVendorLibHandle, "createOMXPlugin");
    if (!createOMXPlugin)
        createOMXPlugin = (CreateOMXPluginFunc)dlsym(
                mVendorLibHandle, "_ZN7android15createOMXPluginEv");

//调用libstagefrighthw.so库中的createOMXPlugin
    if (createOMXPlugin) {

        addPlugin((*createOMXPlugin)());
    }
}


在高通的平台下,OMXPlugin的实现在QComOMXPlugin.h

//接口继承OMXPluginBase

struct QComOMXPlugin : public OMXPluginBase {

}

OMXPluginBase *createOMXPlugin() {
    return new QComOMXPlugin;
}


QComOMXPlugin::QComOMXPlugin()

//Omx核心实现是libOmxCore.so
    : mLibHandle(dlopen("libOmxCore.so", RTLD_NOW)),
      mInit(NULL),
      mDeinit(NULL),
      mComponentNameEnum(NULL),
      mGetHandle(NULL),
      mFreeHandle(NULL),
      mGetRolesOfComponentHandle(NULL) {
    if (mLibHandle != NULL) {

//下面是OMX提供的标准接口函数
        mInit = (InitFunc)dlsym(mLibHandle, "OMX_Init");
        mDeinit = (DeinitFunc)dlsym(mLibHandle, "OMX_Deinit");
        mComponentNameEnum =
            (ComponentNameEnumFunc)dlsym(mLibHandle, "OMX_ComponentNameEnum");
        mGetHandle = (GetHandleFunc)dlsym(mLibHandle, "OMX_GetHandle");
        mFreeHandle = (FreeHandleFunc)dlsym(mLibHandle, "OMX_FreeHandle");
        mGetRolesOfComponentHandle =
            (GetRolesOfComponentFunc)dlsym(
                    mLibHandle, "OMX_GetRolesOfComponent");
        (*mInit)();
    }
}