libstagefright 编解码格式配置信息导入

本文详细介绍了libstagefright在Android中的配置和使用,包括软硬件解码库的添加、组件实例的创建及编解码器类型的确定过程,重点关注SoftOMXPlugin的makeComponentInstance和MediaCodecList解析配置文件等关键步骤。

一、libstagefright支持解码库信息配置导入

1OMXMaster构造函数OMXMaster::OMXMaster中会调用

    addVendorPlugin();  <---添加硬件解码库

    addPlugin(new SoftOMXPlugin);  <---添加软件解码库

2、SoftOMXPlugin类有3个主要接口

       makeComponentInstance: 作用是根据输入的组件名拼接解码库名,软件解码库的命名格式如libstagefright_soft_xx.so,然后打开这个库获取里面创建组件对象的的接口createSoftOMXComponent(这个库中必须包含),再调用这个接口创建组件对象,通过makeComponentInstance最后一个参数OMX_COMPONENTTYPE **component返回给调用者。(这个参数会一层一层上传,最后会到OMXCoder:create接口中)

       destroyComponentInstance:销毁组件对象

       enumerateComponents:遍历本组件支持的编解码格式

Ps1、所有的软编解码都在SoftOMXPlugin中添加  (kComponents数组)

    2、所有软编解码组件对象的新建都是通过SoftOMXPluginmakeComponentInstance来完成,实际上是可以分开的,比如硬编解码就是独立的。之所以这么做是因为软编解码实现大体类似,可以抽象成一个插件类。

    

3OMXMaster::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类查找。

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值