原文链接

导读:

本篇文章对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

DL、IL、AL层级图

  • 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层来承接编解码器与应用开发的桥梁。

组件

组件抽象化结构图

  在OpenMAX IL层中,一个重要的组成部分就是component,称之为组件,比如对于一个媒体播放器来说,它需要具有以下三个基本的功能:

  1. 音视频、字幕分离解析;
  2. 音频解码、视频解码;
  3. 音频输出、视频输出;

对于这三个功能来说,它们就可以拆分为5个组件,分别是:音视频、字幕分解组件;音频解码组件;音频输出组件;视频解码组件;视频输出组件;或许还需要字幕解析组件。而对于一个视频录制软件来说,它们这5个组件的功能恰巧相反,可以分为:音视频、字幕混合;音频编码;音频输出;视频编码;视频输入。
  IL层的组件是采用一种Tunnel(隧道链接)的方式来进行数据交流的,不同组件之间的链接通过一个由IL层定义的方法来进行协商。通过上面的图可以看到,一个组件的大致结构有这么几点:

  1. 配置结构体(Parameter/Configuration Set/Get):用于用户代码直接与组件进行交互,包括组件属性设置获取、组件状态设置获取等。
  2. Port口:负责记录与之建立隧道链接的组件的信息,数据交流必不可少。
  3. Buffer管理:负责管理组件内部接收以及送出的数据流。
  4. 组件事件句柄(Component Event Handler):负责组件向用户代码进行事件通知,类似于Linux内核的Input子系统事件。
  5. 命令序列:负责存储并处理来自于用户代码产生的命令,比如状态转换等。

IL Clinet

顾名思义,IL Client就是指IL的客户端,可以在上图里面看到有IL Clinet的字样,对于组件来说,IL Client就是组件的管理者,Client通过组件内部提供的相关回调函数来对组件进行管理,应用程序可以调用Client的代码来操作组件,包括设置组件的状态、添加一个组件、销毁一个组件等等。

隧道链接

隧道链接图

两个组件通过port进行相互链接,然后组件内部自行协调进行数据交流。整个链接过程是由组件的管理者连续调用两个组件的链接函数完成的,组件的链接函数里面会判断两个port是否适合链接,如果适合的话就将对方port以及COMP的句柄信息记录下来,存放到一个port结构体描述当中,这样的话两个组件就可以通过port来进行通信以及数据传输了。

在接下来的文章里面会对OpenMAX的细节内容进行介绍,包括组件的实现,数据结构,方法、一些特殊组件的描述等


如果觉得本文章不错,请关注微信公众号-YellowMax多多支持,查看更多文章 欢迎转发、关注、点赞一波

OpenMAX编程初识相关推荐

  1. OpenMAX编程-音视频等组件介绍

    我的小站 往期文章索引: 03 - OpenMAX编程-实现一个组件 02 - OpenMAX编程-数据结构 01 - OpenMAX编程-组件 00 - OpenMAX编程初识 导读: 本文着重介绍 ...

  2. OpenMAX编程-组件

    阅读原文 OpenMAX的重点组成部分就是组件,OpenMAX通过将meida流过程中的各个模块抽象化为组件来进行耦合,在OpenMAX标准下,数据流通过组件来进行传递.处理.显示.在该篇文章里,不需 ...

  3. Python GUI界面编程-初识

    图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面.与早期计算机使用的命令行界面相比,图形界面对于用户来说在视觉上 ...

  4. Python升级之路( Lv14 ) 并发编程初识

    Python系列文章目录 第一章 Python 入门 第二章 Python基本概念 第三章 序列 第四章 控制语句 第五章 函数 第六章 面向对象基础 第七章 面向对象深入 第八章 异常机制 第九章 ...

  5. Java并发编程——初识JUC

    文章目录 初识JUC 一.什么是JUC 二.进程和线程 2.1 进程和线程 2.2 并行和并发 2.3 Java线程有几个状态 2.4 wait/sleep的区别 初识JUC 一.什么是JUC JUC ...

  6. 网络编程--初识网络

    目录 前言 一丶初识网络 <1>关于局域网LAN <2>关于广域网WAN 二丶网络通信基础 <1>IP地址 <2>端口号 <3>认识协议 & ...

  7. 51单片机模块化编程初识

    在51单片机C语言编程中,为了提高程序的可移植性,有必要用可移植的变量类型的别名进行编程. 把以下内容保存到编程软件的Include目录,并保存为了mytype.h文件. 如果你用的是Keil,这个目 ...

  8. go语言游戏编程初识--`Ebiten`

    Ebiten ebiten是一个简单的使用纯go实现的游戏,使用这个库即可以实现go语言代码的学习,又可以实现对游戏编程的了解. Hello world 让我们以一个Hello world!开始ebi ...

  9. python学习笔记7--面向对象进阶,异常处理,socket编程初识

    一.类的特殊方法 1.静态方法 静态方法只是封装在类中的一个普通函数,其和类没有什么关系,但只可以通过类来调用,不能访问实例或类中的任何属性. 使用 @staticmethod 声明可以将一个方法声明 ...

最新文章

  1. 【golang程序包推荐分享】分享亿点点golang json操作及myJsonMarshal程序包开发的踩坑经历 :)
  2. 主题:CS0016: 未能写入输出文件“c:#92;WINDOWS#92;Microsoft.NET#92;***.dll”错误处理...
  3. 【位运算DFS/DLX】【HDU1426】【数独】
  4. 【SSH网上商城项目实战20】在线支付平台的介绍
  5. 深入源码理解.NET Core中Startup的注册及运行
  6. P4111 [HEOI2015]小Z的房间
  7. 光端机和收发器的区别有哪些?
  8. 文件系统、mkdir、touch、nano、cp笔记
  9. LVS负载均衡(3)——LVS工作模式与工作原理
  10. c语言delay_单片机模拟流星雨,电路图和程序,一起来感受下,其实C语言不难...
  11. mysql触发器对同一张表做操作_mysql的触发器同数据库 多表的数据操作
  12. Bash shell脚本打印出正在执行的命令
  13. 嘿!你的“苹果”已经被盯上啦
  14. 十三周二次课(6月20日)
  15. matlab 矢量化编程(三) —— 软阈值函数
  16. AD19 DRC 时弹出 Design contains shelved or modified (but not repoured) polygons
  17. 已知计算组合的公式如下,用递归算法写出一个计算组合Cmn的值的函数zh(m,n),并写出主函数调用该函数。
  18. 使用calibre导出pdf格式时调整行间距
  19. html封面设计图片手绘大全,本子封面设计手绘素描图片欣赏
  20. 二、基于根轨迹法的PID控制器分析与设计

热门文章

  1. 【读书笔记】打开心智
  2. 实验室GPU管理神器Determined
  3. Timeout of 60000ms expired before the position for partition could be determined踩坑flink消费kafka2.3.0
  4. IOS .pch 文件详解
  5. 计算机网络:IEEE 802.11无线局域网
  6. 3月28日服务器维护,神武3月28日维护公告:新场景地图开放
  7. 36.超市微信促销活动2
  8. 怎么在条码打印软件中制作超市价签
  9. opencv调用ip摄像头实现人脸识别自动拍照
  10. Python_OpenCV调用摄像头完成人脸识别