OpenMAX
open media acceleration:开放多媒体加速器。跨平台的软件抽象层,用来处理多媒体。
注意:这是一个标准,而不是具体的实现。
-
openmax建立了三个层次上的标准。
AL层:应用层。完全免费,跨平台的开放标准。提供创建,控制player和recorder对象;连接player,recoreder与配置输入和输出对象(content reader/writer,audio inputs/outputs,display windows)
IL层:集成层。IL层的API定义了一套标准化的media组件接口,使得开发者和平台提供者去和以硬件或软件实现的多媒体编解码器相互集成和交流
DL层:开发层。DL层的APIs包含了一套综合的audio,video和imaging 函数接口。这套接口可以在最新的CPUs,硬件引擎,和DSPs上实现和优化并用于更加广泛的加速编解码功能如: MPEG-4, H.264, MP3, AAC and JPEG
OpenMax IL层的接口定义由若干个头文件组成,这也是实现它需要实现的内容,它们的基本描述如下所示。
OMX_Types.h:OpenMax IL的数据类型定义
OMX_Core.h:OpenMax IL core的API
OMX_Component.h:OpenMax IL 组件相关的 API
OMX_Audio.h:音频相关的常量和数据结构
OMX_IVCommon.h:图像和视频公共的常量和数据结构
OMX_Image.h:图像相关的常量和数据结构
OMX_Video.h:视频相关的常量和数据结构
OMX_Other.h:其他数据结构(包括A/V 同步)
OMX_Index.h:OpenMax IL定义的数据结构索引
OMX_ContentPipe.h:内容的管道定义
提示:OpenMax标准只有头文件,没有标准的库,设置没有定义函数接口。对于实现者,需要实现的主要是包含函数指针的结构体
IL关键概念
Component:
代表了独立的功能单元,可以是:sources、sinks、codecs、filters、spliters、mixers。组件可以是硬件,软件,另外的处理器,或者是这些的结合体。一个IL组件包含如下几部分:
- 组件句柄:类似于文件描述符,通过这个句柄可以访问一组标准函数,这些函数允许client去获取或设置组件或端口设置选项、获取或设置组件的状态、向组件发送命令、接收消息通知、分配buffer、建立组件之间的连接
- 配置相关的结构体:设置和获取组件的各个属性
- port:用于组件之间相互通信
- Buffer:用于缓存输入输出到组件的数据的描述信息
- component event handle:组件事件句柄,用于向IL Client发送事件或消息—IL Client是用于综合管理所有组件的一个较高层次)
- 命令序列:存储和处理用户或程序输入的命令
- tunnel:组件之间进行通信的通路
IL Client:
可以是OpenMAX AL或一个应用程序。IL Client的核心是IL Core。通过IL core可以:
- 加载或卸载组件
- 在两个组件之间直接建立联系
- 访问组件的方法
-
概述
-
omx il介绍和构架
考虑一个系统需要实现4个不同的多媒体处理函数,记作f1,f2,f3,f4。这些函数可能来自于不同的厂商或者是一个组织中的不同团队开发者开发的。每一个函数可能对安装和卸载有不同的要求,可能有不同的方法去执行配置和数据传输。amx il的api提供了一种方式将这些函数,singlu或者逻辑组封装为组件。这些api包含一套标准的协议使得来自于不同开发商/团队合规的组件彼此之间交换数据。
2.1 系统组件
omx框架中有三种数据传输方式
non-tunneled:用于omx il client与component之间交换数据buffers
tunneled:用于组件之间进行数据buffers的交换
proprietary:组件之间直接的数据交换(不用buffer)
2.2 隧道化buffer分配
2.3 组件状态
所有组件首先都是处于unloaded状态,从unloaded转为loaded状态必须由omx il core来完成,然后其他状态就可以由组件数据交流来完成转换。
2.4 组件结构
2.5 数据交流方式
2.6 端口重连
2.7 队列和刷新
2.8 标记buffer
2.9 事件和回调
组件可以发送6种事件给il client
2.10 buffer payload
2.11 buffer的flag和时间戳
2.12 同步
2.13 速率控制
2.14 组件注册
- omx il控制api
3.1 omx il的数据类型
枚举类型:
OMX_COMMANDTYPE
OMX_STATETYPE
OMX_ERRORTYPE
OMX_EVENTTYPE
OMX_BUFFERSUPPLIERTYPE
结构体类型:
OMX_COMPONENTREGISTERTYPE
OMX_COMPONENTINITTYPE
OMX_VERSIONTYPE
OMX_PRIORITYMGMTTYE
OMX_RESOURCECOCEALMENTTYPE
OMX_BUFFERHEADERTYPE
OMX_PORT_PARAM_TYPE
…
3.2 omx il core的方法和宏(//omx il core是组件的管理者。是一个中间层,处于omx il client和components之间,实现了client想要使用的主要接口,为了效率考虑,omx il定义了一系列的核心宏,一对一映射到了omx il的组件方法。)
宏:
OMX_GetComponentVersion
OMX_SendCommand
OMX_CommandStateSet
OMX_CommandFlush
OMX_CommandPortDisable
OMX_CommandPortEnable
OMX_CommandMarkBuffer
OMX_GetParameter:从组件获得参数设置
OMX_SetParameter:设置组件参数设置
OMX_GetConfig:
OMX_SetConfig
OMX_GetExtensionIndex:
OMX_GetState:获得组件的状态
OMX_UseBuffer
OMX_AllocateBuffer
OMX_FreeBuffer
OMX_EmptyThisBuffer
OMX_FillThisBuffer
OMX_UseEGLImage
函数:
omx_init:初始化整个omx il core接口层
omx_deinit:销毁core接口层
omx_componentnameenum
omx_gethandle:获得一个omx il组件的句柄
omx_freehandle:释放一个omx il组件的句柄
omx_setuptunnel:在组件之间建立起一个数据通道
omx_getcontentpipe:获得一个内容导管
3.3 omx il组件的相关方法和数据结构
pComponentPrivate(指针)
pApplicationPrivate(指针)
getcomponentversion:omx il client通过omx_getcomponentversion宏来调用这个函数
sendcommand:client通过core对应宏来调用该函数
getparameter
setparameter
getconfig
setconfig
getstate
componenttunnelrequest:获取组件间的tunnel是否可用
userbuffer
allocatebuffer
freebuffer
emptythisbuffer
fillthisbuffer
setcallbacks
-
omx il数据api
-
omx il组件扩展api
-
同步
-
容器解析
-
标准组件
-
内容管道
-
实现缓冲区共享
OMX IL初始化流程
-
omx_init、omx_componentnameenum
-
omx_gethandle 创建组件,返回组件句柄
-
调用OMX_SetParameter和OMX_IndexParamStandardComponentRole这个index去设置组件的role
-
调用omx_setparameter和OMX_IndexParamSetResourceInfo这个index去设置组件的resource信息
-
调用omx_setparameter和OMX_IndexParamVideoPortFormat这个index设置组件输入输出port的format
-
OMX_IndexParamPortDefinition设置组件port的通用属性
1)调用OMX_GetParameter获取输入端口缓冲参数(最小/实际缓冲区数目,缓冲区大小等等)
2)检查有效的输入缓冲参数(修改一些参数,比如帧的长度和宽度,以及缓冲区的数目等等)
3)调用OMX_SetParameter函数设置输入缓冲参数
4)调用OMX_GetParameter获取输出端口缓冲参数(最小/实际缓冲区数目,缓冲区大小等等)
5)检查有效的输出缓冲参数(修改一些参数,比如帧的长度和宽度,以及缓冲区的数目等等)
6)调用OMX_SetParameter函数设置输出缓冲参数 -
omx_setcommand将组件状态从loaded转为idle状态
-
为输入输出port的缓冲区分配内存omx_usebuffer或OMX_AllocateBuffer
-
组件状态转为executing,开始工作
-
omx_emptybuffer===omx_emptybufferdone
-
omx_fillthisbuffer===omx_fillthisbufferdone
Android系统使用OMX框架实现音视频操作
Android系统中使用OpenMax来做编解码工作,stagefright层通过OpenMax层来与硬件进行通信。stage fright层有两条通路到达OpenMax。
stagefrightplayer(Awesomeplayer)构造
- stagefrightplayerfactory创建stagefrightplayer
- stagefrightplayer用于初始化创建Awesomeplayer
数据分离
-
打开资源文件的头部,根据资源类型的不同,选择不同的分离器(如:MPEG4Extractor)
-
使用分离器对资源文件的音视频轨道进行分离,并返回给mVideoTrack(视频数据)或mAudioTrack(音频数据)【都是MediaSource类型】
-
根据mVideoTrack或mAudioTrack中的编码类型来选择解码器,对mVideoTrack或mAudioTrack进行数据解码
数据解码过程
-
AwesomePlayer调用prepare方法,构造AwesomeEvent,初始化音频、视频解码器initVideoDecoder、initAudioDecoder
-
两个初始化函数中都会调用OMXCoderc的create方法,进入OMXCoderc的处理逻辑中
-
OMXCoderc解码类
渲染输出
AwesomePlayer:omx的解码过程
mVideoSource、mAudioSource:视频和音频解码器
omx的构造函数中会初始化两个重要的成员:omxnodeinstance、omxmaster
OMXNodeInstance:用于创建组件,组件根据需求创建。使用node_id作为标识
OMXMaster:用于管理组件