分类: LINUX
2016-04-11 14:01:11
原文地址:stagefright + omx小结 作者:superfight
看了将近1个多月的stagefright和OMX IL,感觉对框架有了一点感觉,趁感觉还在,记录下来和大家分享,由于本人也是刚开始看多媒体框架,有认识不当的地方还请务必指正.
由于stagefright和openmax运行在两个不同的进程上,所以他们之间的通讯要经过openBinder进行处理,对openBinder这一块还没有了解,所以恕stagefright和openmax之间的通信不能做分析,还有就是本小结不考虑音频这一块,假设视频为MP4封装的AVC编码文件.
最早看的是opencore,但opencore兼顾了多平台的移植性而过于复杂,后来就改看stagefright了,stagefright使用的OMX IL为opencore中的代码........所以我蛮期待google什么时候能重写一个OMX IL框架来全面替代opencore
先简单的看一下stagefright是怎么工作的, stagefright使用event来进行驱动,event调度器和event运行在同一个线程中,播放器向队列插入event来驱动整个解码流程,event调度器的工作抽象流程如下:
1. 检测队列是否为空,为空则等待event的插入
2. 获取队列中的第一个event
3. 计算event所要求的delay time后进行延时操作
4. 将event从队列中剔除后执行该event
event调度器通过不断循环这样的过程来进行调度,在具体代码中还会根据特殊情况进而改变调度过程,目前event事件有如下几种:
1. onVideoEvent
2. onStreamDone
3. onBufferingUpdate
4. onCheckAudioStatus
5. onPrepareAsyncEvent
stagefright的播放器类为AwesomePlayer,这个类主要有以下几个成员(排除Audio部分):
1. mVideoSource(解码视频)
2. mVideoTrack(从多媒体文件中读取视频数据)
3. mVideoRenderer(对解码好的视频进行格式转换,android使用的格式为RGB565)
4. mISurface(重绘图层)
5. mQueue(event事件队列)
stagefright运行时的抽象流程如下:
下面以一个mp4文件(avc编码)来分析AwesomePlayer的抽象工作流程(排除Audio部分)OMX IL作为底层解码部件的集合层,为上层多媒体框架提供了统一的接口,在Android2.2的stagefright中, stagefright使用的是opencore中的OMX IL实现,使用该OMX IL框架需要将mVideoSource设置为OMXCodec类,OMX IL层的对外接口主要有以下几种:
1) stagefright使用OMX_MasterInit初始化OMX框架,加载component
2) stagefright使用OMX_MasterGetHandle匹配OMX中的component,匹配成功则返回OMX_HANDLETYPE用于OMXCodec与component之间进行通信
3) OMXCodec使用OMX_SendCommand来设置component的状态,操作component的port
4) OMXCodec使用EventHandler通知OMXCodec的Command执行结果
5) OMXCodec使用OMX_GetParameter和OMX_SetParameter来获取和设置component的属性参数
6) OMXCodec使用OMX_UseBuffer设置compoment使用的buffer为OMXCodec分配的buffer
7) OMXCodec使用OMX_EmptyThisBuffer传递未解码的buffer给component,用于解码
8) OMXCodec使用OMX_FillThisBuffer传递空的bffer给component用于存储解码后的帧
9) compoment使用EmptyBufferDone通知OMXCodec已完成inputport buffer的读取
10) compoment使用FillBufferDone通知OMXCodec已完成outputport buffer的填充
初始化流程如下: