文件播放的实质就是通过对文件识别,文件解析,文件解码后输出数据流。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 = 合作才完成不同实例的消息处理任务。