导读:
本篇文章对OpenMAX做了一个整体的介绍与概述,说明OpenMAX是什么?可以解决什么问题?用在什么地方?以及为什么要用OpenMAX?这里并不对OpenMAX进行深入介绍(放到接下来的几篇文章里面),希望通过这篇文章可以对OpenMAX有一个大体的了解。
什么是OpenMAX
OpenMAX:open media acceleration.
直译为开放多媒体加速器,可以理解为是一个拥有免费使用权的多媒体加速器。OpenMAX是Khronos Group开发制定的,该标准采用C语言实现,这个小组是由3Dlabs、ATI、Intel、Nvidia等行业大佬联合创建,目的是实现跨平台的免费的多媒体加速、回放。
- OpenMAX可以用来做什么?
其实从名字上可以看出来,OpenMAX是与多媒体有关的,为多媒体处理提供统一的接口标准,以此来达到跨平台的多媒体软硬件开发的目标。在嵌入式设备比如安卓设备的多媒体软件框架中就使用到了OpenMAX编程标准。
一个完整的多媒体设备包括设备硬件、设备驱动以及设备应用程序。与之对应的是OpenMAX的DL、IL、AL层,不过在实际编程(嵌入式软件)当中最常使用到的是IL层。通过实现这三个层级,可以达到从硬件到软件的完整的音视频、图像等多媒体资源的编解码流程。 - 为什么要使用OpenMAX
大概有这么几个理由促成了OpenMAX在多媒体编程当中的使用:- 多媒体软件使用OpenMAX这一统一的编程标准来进行设计,可以使得开发者在开发应用等的时候不需要过度关注其底层的一些实现,也省去了大量的学习不同多媒体框架的时间。
- OpenMAX标准本身足够优秀,即使不完全遵循OpenMAX的标准来进行多媒体软件框架设计,采用OpenMAX的架构原理来作为多媒体软件框架的指导性设计原理,也能够大量减少多媒体软件的开发设计流程,并且由于OpenMAX本身的特点,也使得整个多媒体软件十分易于扩展,具有高度的去耦合性。该标准涵盖了大部分多媒体开发规格,可以轻松满足绝大多数开发需求。
- 该标准本身由多媒体等行业的领导者联合确立,具有较大的影响力,有相关的详细设计文档可以参考,如果遇到问题相对更加容易在网络上获取答案,并且整个标准在使用的时候无需授权费,是完全免费的。
- OpenMAX适用于哪些地方?
OpenMAX是专门用于音视频、图像编解码的,在一些以音视频编解码为主导功能的产品设计领域都可以使用OpenMAX,比如安防、手机(安卓系统里面就有OpenMAX)等。
关于OpenMAX的一些概念
DL、IL、AL
![](https://i-blog.csdnimg.cn/blog_migrate/69cab0562c4e3bfeceb1d5dfd0bcec80.png)
-
DL
Development Layer(开发层),截至目前最新版本是1.0.2。
DL层定义了众多的API,全方位包含了OpenMAX音频、视频以及图像处理功能,这些功能可以由硅供应商(芯片原厂)实现并优化,然后编解码厂商在此基础上实现一些广泛的编解码功能。 它包含了:- 音频信号处理:比如FFT(快速傅立叶变换)、滤波器等;
- 图像处理:比如色域转换(RGB、YUV等);
- 视频处理:比如实现并且优化的 MPEG-4, H.264, MP3, AAC 和 JPEG;
-
IL
Integration Layer(集成层),截至目前最新版本是1.1。
IL层是作为一个比较低层级的接口来服务于嵌入式设备的音视频、图像编解码。它使得应用程序与多媒体框架可以以一种统一的方式与多媒体编解码器对接,而编解码器本身可以是硬件与软件的任何组合形式,这样编解码器可以做到对用户透明,用户无需关注编解码器的实现细节问题。如果没有IL,那么不同的编解码厂商都需要按照自己的方式实现一套接口,并且各个厂商之间也是不通用的,这样会使得跨平台移植变得极其复杂。 -
AL
Application Layer(应用层),截至目前最新版本是1.1。
AL层为多媒体中间件与应用层之间提供一个标准化的API接口,多媒体中间件提供能够完成预期的API功能的服务。AL层为多媒体接口(应用)提供跨平台可移植性。
其实就一句话,OpenMAX为整个多媒体编解码(从应用到硬件)流程提供了一个极度灵活的可移植的标准化解决方案。它解决的主要两个问题是:1. 提供完整的可实现的音视频、图像编解码流程;2. 使多媒体软硬件平台变得更加易于跨平台移植。
这些层级之间可以相互组合实现,也可以单独实现某个层级,比如对于有些芯片厂商来说,他完全可以自己实现一套编解码硬件,然后在此基础上实现OpenMAX的IL层,这样使得基于该厂商硬件以及相关中间件开发的应用程序可以很快的移植到其它符合OpenMAX IL的软硬件设备上,同时其它平台的多媒体应用也可以无缝移植到该厂商的软硬件平台上面,而我们嵌入式软件岗在实际开发当中往往会去实现一个独立的OpenMAX IL层来承接编解码器与应用开发的桥梁。
组件
![](https://i-blog.csdnimg.cn/blog_migrate/baf0e4e54c3d6d05b3e679385dd50b28.png)
在OpenMAX IL层中,一个重要的组成部分就是component,称之为组件,比如对于一个媒体播放器来说,它需要具有以下三个基本的功能:
- 音视频、字幕分离解析;
- 音频解码、视频解码;
- 音频输出、视频输出;
对于这三个功能来说,它们就可以拆分为5个组件,分别是:音视频、字幕分解组件;音频解码组件;音频输出组件;视频解码组件;视频输出组件;或许还需要字幕解析组件。而对于一个视频录制软件来说,它们这5个组件的功能恰巧相反,可以分为:音视频、字幕混合;音频编码;音频输出;视频编码;视频输入。
IL层的组件是采用一种Tunnel(隧道链接)的方式来进行数据交流的,不同组件之间的链接通过一个由IL层定义的方法来进行协商。通过上面的图可以看到,一个组件的大致结构有这么几点:
- 配置结构体(Parameter/Configuration Set/Get):用于用户代码直接与组件进行交互,包括组件属性设置获取、组件状态设置获取等。
- Port口:负责记录与之建立隧道链接的组件的信息,数据交流必不可少。
- Buffer管理:负责管理组件内部接收以及送出的数据流。
- 组件事件句柄(Component Event Handler):负责组件向用户代码进行事件通知,类似于Linux内核的Input子系统事件。
- 命令序列:负责存储并处理来自于用户代码产生的命令,比如状态转换等。
IL Clinet
顾名思义,IL Client就是指IL的客户端,可以在上图里面看到有IL Clinet的字样,对于组件来说,IL Client就是组件的管理者,Client通过组件内部提供的相关回调函数来对组件进行管理,应用程序可以调用Client的代码来操作组件,包括设置组件的状态、添加一个组件、销毁一个组件等等。
隧道链接
![](https://i-blog.csdnimg.cn/blog_migrate/24aab9ab68cd95427d82123869d6c6b6.png)
两个组件通过port进行相互链接,然后组件内部自行协调进行数据交流。整个链接过程是由组件的管理者连续调用两个组件的链接函数完成的,组件的链接函数里面会判断两个port是否适合链接,如果适合的话就将对方port以及COMP的句柄信息记录下来,存放到一个port结构体描述当中,这样的话两个组件就可以通过port来进行通信以及数据传输了。
在接下来的文章里面会对OpenMAX的细节内容进行介绍,包括组件的实现,数据结构,方法、一些特殊组件的描述等
![](https://i-blog.csdnimg.cn/blog_migrate/73f9221b425e89d5b68b55981a0a0493.png)