对于android的播放引擎stagefright中关键成分OMX理解

    文件播放的实质就是通过对文件识别,文件解析,文件解码后输出数据流。android在2.3以上版本中都使用stagefright作为播放引擎实现播放。在这里值得关注的是stagefright以OMX插件完成主要的文件解码任务,从而完成播放工作。

    OMX中的三层结构中重点关注的是OMX_IL,向上,OMX_AL这层的接口是随时可以变化的,向下OMX_DL这个是供应商根据下层硬件的接口设计,硬件更新的话这层也是很容易变化的,相对不变的是OMX_IL,这个框架,这样的话在这层使用OMX标准供Clients调用是很合理的。也是基于此,在实现播放时是调用的OMX_IL层的标准接口实现的。

    其实,在文件录制中也使用的是OMX插件,有一点是录制编码的格式支持远不及播放解码支持的格式多。

    1. 既然使用的其实是OMX_IL,首先应该认识OMX_IL的结构:

     第一层:OMX_IL——Core(核心内容)

     第二层:组件component:主要是4个组件,这4个组件分别对用完成各自的功能,但是完成具体的播放或者录制任务时是协同工作的。

     第三层:LCML:各个组件是通过调用这层的接口完成真正分工作。

     第四层:DSPBridge:连接下层驱动。

     第五层:DSPBridge的驱动。

   这里的使用是OMX_IL是作为第三方的插件供我们使用,它会以.so供程序使用。包括在使用component时也是以.so的形式出现。

    2. 开启动态库的一个常用函数:

    void* dlsym(void*  handle, char*  symbol); // 打开对应库,找到对应的函数名。

   3. 所有组件都是使用统一的接口标准:

   (1) OMX_Decder.c: 用于解码

  (2)  OMX_Dec_CompThread.c:解码的线程循环

   (3) OMX_Dec_Util.c:相关解码工具,功能调用LCML实现解码功能

    这个对组件的操作对外接口函数就是标准的使用两个:在(1)中,函数为:OMX_ComponentInit(); (2)中调用****Dec_StartThread()这个函数内部调用的是

nRet = pthread_create(参数1,参数2,参数3,参数4);

   4. OMX的核心Core设计完成的工作是将和component相关的属性跟操作都放在一个结构体中,这样就很方便了,clients直接就调用的是这个结构体中的函数指针,就可以和components交互,clients使用命令操作组件这样就正确流向了。

    5. stagefright类的调用关系是:OMXNodeInstance代表OMX的具体实例,完成components的调用,OMXMaster是管理OMX插件。在工作过程中内部类CallbackDispatcher作用是用来接收回调函数的消息。OMXNodeInstance + CallbackDispatcher = 合作才完成不同实例的消息处理任务。

                                

 

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值