一、libstagefright支持解码库信息配置导入
1、OMXMaster构造函数OMXMaster::OMXMaster中会调用
addVendorPlugin(); <---添加硬件解码库
addPlugin(new SoftOMXPlugin); <---添加软件解码库
2、SoftOMXPlugin类有3个主要接口
makeComponentInstance: 作用是根据输入的组件名拼接解码库名,软件解码库的命名格式如libstagefright_soft_xx.so,然后打开这个库获取里面创建组件对象的的接口createSoftOMXComponent(这个库中必须包含),再调用这个接口创建组件对象,通过makeComponentInstance最后一个参数OMX_COMPONENTTYPE **component返回给调用者。(这个参数会一层一层上传,最后会到OMXCoder:create接口中)
destroyComponentInstance:销毁组件对象
enumerateComponents:遍历本组件支持的编解码格式
Ps:1、所有的软编解码都在SoftOMXPlugin中添加 (kComponents数组)
2、所有软编解码组件对象的新建都是通过SoftOMXPlugin:makeComponentInstance来完成,实际上是可以分开的,比如硬编解码就是独立的。之所以这么做是因为软编解码实现大体类似,可以抽象成一个插件类。
3、OMXMaster::addPlugin接口是用来添加解码组件到stagefright中的,组件名称保存在mPluginByComponentName中,(mPluginByComponentName的数据类型是
KeyedVector<String8, OMXPluginBase *> 前面是组件名 后面是插件对象)
addPlugin会循环调用SoftOMXPlugin中的enumerateComponents获取需要添加组件支持的编解码名称,再在mPluginByComponentName中查找是否已经存在,如果存在就跳过,否则添加。
4、OMXMaster::addPlugin还可以添加库,主要用于添加硬编解码库,例如
void OMXMaster::addVendorPlugin() {
addPlugin("libstagefrighthw.so");
}
OMXMaster::addPlugin(const char *libname) 这个接口首先会从库中获取创建插件对象的接口,
createOMXPlugin = (CreateOMXPluginFunc)dlsym(
mVendorLibHandle, "_ZN7android15createOMXPluginEv");
然后再创建一个插件类对象,再调用3步的OMXMaster::addPlugin
(这个插件类与SoftOMXPlugin类似。)
二、插件对象的创建
OMXCodec::Create -> omx->allocateNode -> OMX::allocateNode -> mMaster->makeComponentInstance -> OMXMaster::makeComponentInstance
OMXPluginBase *plugin = mPluginByComponentName.valueAt(index);
OMX_ERRORTYPE err =
plugin->makeComponentInstance(name, callbacks, appData, component);
Component 输出对象
三、OMXCodec对象创建时编解码器类型确定
OMXCodec::Create中会调用OMXCodec::findMatchingCodecs来确定编解码器类型,stagefright支持的编解码器保存在MediaCodecList对象中,这个是单例。MediaCodecList类在构造函数中解析配置文件/etc/media_codecs.xml,把编解码类型信息保存到mCodecInfos中。使用时通过接口MediaCodecList::findCodecByType和MediaCodecList::findCodecByName类查找。