Android 解码器component加载

转载:http://blog.sina.com.cn/s/blog_645b74b90101djrj.html

 

前面一篇博客画出了Android中openBinder框架图,最近也看了一些openMAX IL的资料,知道IL Client要完成音视频的播放首先需要完成一些初始化工作,比如IL Client要按照openMAX框架加载对应的component,这篇博客中将细化这部分,看看Android是如何加载动态so库的。

    
   一:首先是插件的管理,包含codec vendor的插件和谷歌自带的软解插件,大致流程如下:
 
 
new了一个omx之后,加载了两套插件,其中右边是谷歌自带的插件SoftOMXPlugin,左边是各个厂商的实现VendorPlugin,我们看 右边的插件,OMXMaster用一个容器变量mPluginByComponent记录了每种插件管理的解码器的类型,我们看 SoftOMXPlugin管理的编解码类型在一个结构体数组中,如下:
static const struct {
    const char *mName;
    const char *mLibNameSuffix;
    const char *mRole;
} kComponents[] = {
    { "OMX.google.aac.decoder", "aacdec", "audio_decoder.aac" },
    { "OMX.google.aac.encoder", "aacenc", "audio_encoder.aac" },
    { "OMX.google.amrnb.decoder", "amrdec", "audio_decoder.amrnb" },
    { "OMX.google.amrnb.encoder", "amrnbenc", "audio_encoder.amrnb" },
    { "OMX.google.amrwb.decoder", "amrdec", "audio_decoder.amrwb" },
    { "OMX.google.amrwb.encoder", "amrwbenc", "audio_encoder.amrwb" },
    { "OMX.google.h264.decoder", "h264dec", "video_decoder.avc" },
    { "OMX.google.h264.encoder", "h264enc", "video_encoder.avc" },
    { "OMX.google.g711.alaw.decoder", "g711dec", "audio_decoder.g711alaw" },
    { "OMX.google.g711.mlaw.decoder", "g711dec", "audio_decoder.g711mlaw" },
    { "OMX.google.h263.decoder", "mpeg4dec", "video_decoder.h263" },
    { "OMX.google.h263.encoder", "mpeg4enc", "video_encoder.h263" },
    { "OMX.google.mpeg4.decoder", "mpeg4dec", "video_decoder.mpeg4" },
    { "OMX.google.mpeg4.encoder", "mpeg4enc", "video_encoder.mpeg4" },
    { "OMX.google.mp3.decoder", "mp3dec", "audio_decoder.mp3" },
    { "OMX.google.vorbis.decoder", "vorbisdec", "audio_decoder.vorbis" },
    { "OMX.google.vpx.decoder", "vpxdec", "video_decoder.vpx" },
    { "OMX.google.raw.decoder", "rawdec", "audio_decoder.raw" },
    { "OMX.google.flac.encoder", "flacenc", "audio_encoder.flac" },
};

二:根据的音视频的mime,寻找对应的plugin,然后选择对应的解码器(相应的so库),并通过dlopen函数打开动态链接库,并且获取到句柄,最后通过这个句柄获取动态库中具体函数指针的地址,进行调用,调用关系如下:

 
获取函数指针,然后创建具体的codec实例,我们看解码器SoftAAC.cpp和SoftAAC2.cpp中这个函数的实现:
android::SoftOMXComponent *createSoftOMXComponent(
        const char *name, const OMX_CALLBACKTYPE *callbacks,
        OMX_PTR appData, OMX_COMPONENTTYPE **component) {
    return new android::SoftAAC2(name, callbacks, appData, component);
}
android::SoftOMXComponent *createSoftOMXComponent(
        const char *name, const OMX_CALLBACKTYPE *callbacks,
        OMX_PTR appData, OMX_COMPONENTTYPE **component) {
    return new android::SoftAAC(name, callbacks, appData, component);
}
支持,动态库加载完毕,后续就行是IL Client和component的交互过程,包括设置和获取参数,端口数据empty和fill等,中间都是通过独一无二的nodeID找到对应的NodeInstance,然后调到解码器中相应实现,简略图如下:
 
编解码其的加载和调用流程大致如上,具体细节不用过多跟踪,为了将一些不重要的细节整理出来,往往会搅乱主要的流程,所以这里不过多追究,自此,本篇博客到此结束。
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值