转载请注明:https://www.jianshu.com/p/2c378623d93c
以RK3399平台为例,加载流程如下:
new OMX -> new OMXMaster
-> addVendorPlugin -> addPlugin(libstagefrighthw.so, libffmpeg_omx.so) -> addPlugin(new SoftOMXPlugin)
-> mVendorLibHandle = dlopen(libname)
-> createOMXPlugin = dlsym(mVendorLibHandle, "createOMXPlugin")
-> 调用上一步从so中找到的函数(*createOMXPlugin)(), libstagefrighthw.so对应源码位于hardware_rockchip\librkvpu\libstagefrighthw
-> 在添加libstagefrighthw.so这个插件的时候调用到了RKOMXPlugin: OMXPluginBase *createOMXPlugin()
-> new RKOMXPlugin -> AddCore("libOMX_Core.so") 这个so对应源码位于 hardware_rockchip\omx_il\core
-> 通过dlopen, dlsym初始化RKOMXCore* core
-> (*(core->mInit))(); 初始化
-> Rockchip_OMX_Core: RKOMX_Init
-> Rockchip_OMX_Component_Register, 通过如下数组,初始化gComponentList和gComponentNum 一共2个元素
{ "rk.omx_dec", "libomxvpu_dec.so" },
{ "rk.omx_enc", "libomxvpu_enc.so" },
-> Rockchip_OMX_ResourceManager_Init,构建ghVideoRMComponentListMutex互斥量
-> Rockchip_OSAL_MutexCreate(&ghLoadComponentListMutex) 构建ghLoadComponentListMutex互斥量
-> 将构建好的加入可用plugin队列 Vector<RKOMXCore*> mCores
-> 返回OMXMaster::addPlugin,将构建好的plugin入列 mPlugins.push_back(plugin),保存plugin的名字mPluginByComponentName.add(name8, plugin);
网友评论