音视频Media内核学习——OpenMax浅析
创始人
2024-04-24 17:09:31
0

一、OpenMax简介(缩写为:OMX)

OpenMAX是一个多媒体应用程序的标准。由NVIDIA公司和Khronos™在2006年推出。

它是无授权费的、跨平台的C语言程序接口序列,这些接口对音频、视频、静态图片的常用操作进行封装。

它包括三层,分别是应用层(AI)、集成层(IL)和开发层(DL)。其中IL层已经成为了事实上的多媒体框架标准。嵌入式处理器或者多媒体编解码模块的硬件生产者,通常提供标准的OpenMax IL层的软件接口,这样软件的开发者就可以基于这个层次的标准化接口进行多媒体程序的开发。

二、OpenMax在Android中的位置

在Android中,OpenMax IL层,通常可以用于多媒体引擎的插件,Android的多媒体引擎OpenCore和StageFright都可以使用OpenMax作为插件,主要用于编解码(Codec)处理。在Android的框架层,也定义了由Android封装的OpenMax接口,和标准的接口概念基本相同,但是使用C++类型的接口,并且使用了Android的Binder IPC机制。Android封装OpenMax的接口被StageFright使用,OpenCore没有使用这个接口,而是使用其他形式对OpenMax IL层接口进行封装。

三、OpenMax的主要概念

  • 客户端(Client):访问IL core或IL component的软件层,可能是位于GUI应用程序的下层,如GStreamer。IL client是一个典型的功能块,如filter graph multimedia framework, OpenMAX AL, 或application都可以调用它。IL client与OpenMAX IL core进行交互,利用IL core加载和卸载组件、在组件间建立直接通信以及获得组件方法的入口。
  • core:相关平台的代码,具有将IL component载入主存储器的功能,当应用程序不再需要某组件时,IL core将负责把该组件从存储器卸去。一般来说,组件一旦载入存储器,IL core将不在参与应用程序与组件之间的通信。
  • 端口(Port):组件的输入输出接口
  • 组件(Component):OpenMax IL的单元,每一个组件实现一种功能。组件按照端口可分类为Source(只有一个输出端口)、Sink(只有一个输入端口)和Host组件(一个输入端口和一个输出端口),此外有一个Accelerator组件,它具有一个输入端口,调用了硬件的编解码器,加速主要体现在这个环节上。
  • 隧道化(Tunneled):让两个组件直接连接的方式。通过隧道化可以将不同的组件的一个输入端口和一个输出端口连接到一起,在这种情况下,两个组件的处理过程合并,共同处理。尤其对于单输入和单输出的组件,两个组件将作为类似一个使用。

四、OpenMax的工作方式

首先,搭建好OpenMax的工作环境:设置组件端口、加载组件,建立连接方式等等。

然后通过输入端口消耗Buffer,通过输出端口填充Buffer,由此多组件相联接可以构成流式的处理。

五、OpenMax的测试方式

参考《Build OpenCORE 2.05 on x86 Linux.PDF》和《omx_decoder_test_app_guide.pdf》

六、OpenMax接口和集成过程(以android平台的为例)

七、android中支持的组件和Role

根据pv_omxregistry.cpp,得到如下表格(其中黄绿色部分表示没有相应编码器)

组件角色动态库名
OMX.PV.mpeg4decvideo_decoder.mpeg4libomx_m4vdec_sharedlibrary
OMX.PV.h263decvideo_decoder.h263libomx_m4vdec_sharedlibrary
OMX.PV.avcdecvideo_decoder.avclibomx_avcdec_sharedlibrary
OMX.PV.wmvdecvideo_decoder.wmvlibomx_wmvdec_sharedlibrary
OMX.PV.rvdecvideo_decoder.rvlibomx_rvdec_sharedlibrary
OMX.PV.aacdecaudio_decoder.aaclibomx_aacdec_sharedlibrary
OMX.PV.amrdecaudio_decoder.amraudio_decoder.amrnbaudio_decoder.amrwblibomx_amrdec_sharedlibrary
OMX.PV.mp3decaudio_decoder.mp3libomx_mp3dec_sharedlibrary
OMX.PV.wmadecaudio_decoder.wmalibomx_wmadec_sharedlibrary
OMX.PV.radecaudio_decoder.ralibomx_radec_sharedlibrary
OMX.PV.amrencnbaudio_encoder.amrnblibomx_amrenc_sharedlibrary
OMX.PV.mpeg4encvideo_encoder.mpeg4libomx_m4venc_sharedlibrary
OMX.PV.h263encvideo_encoder.h263libomx_m4venc_sharedlibrary
OMX.PV.avcencvideo_encoder.avclibomx_avcenc_sharedlibrary
OMX.PV.aacencaudio_encoder.aaclibomx_aacenc_sharedlibrary

八、Openmax 一些函数的简单介绍

1、OMX core methods

1)OMX_Init 2)OMX_Deinit 3)OMX_GetHandle 4)OMX_FreeHandle 5)OMX_ComponentNameEnum 6)OMX_GetComponentsOfRole 7)OMX_GetRolesOfComponent 8)OMX_SetupTunnel 9)OMX_GetContentPipe

2、The configuration parser API

除了以上methods,强烈推荐OMX核心插件库包含此API

2.1函数原型

OMX_BOOL OMXConfigParser ( OMX_PTR aInputParameters,OMX_PTR aOutputParameters);

2.2 传递参数

aInputParameters 指向如下结构
typedef struct
{
OMX_U8* inPtr;  //codec 配置头部指针
OMX_U32 inBytes;  //codec 配置头部长度
OMX_STRING cComponentRole; //OMX codec类型 eg "video_decoder.mpeg4"
OMX_STRING cComponentName; //OMX 组件名称
} OMXConfigParserInputs;

2.3 返回值

OMX_FALSE : 处理codec配置头部错误或不支持该格式
OMX_TURE : 正确处理codec配置头部

2.4 函数作用

填充aOutputParameters,有两种选择:audio coded or vedio codec

for audio
typedef struct
{
OMX_U16 Channels;  //通道:单声道、立体声、5.1
OMX_U16 BitsPerSample;  //位宽(eg16)
OMX_U32 SamplesPerSec;  //采样率
} AudioOMXConfigParserOutputs;
​
typedef struct
{
OMX_U32 width;  //检测到的视频剪辑宽度
OMX_U32 height;  //检测到的视频剪辑高度
OMX_U32 profile;  //参数
OMX_U32 level;  //级别?
} VideoOMXConfigParserOutputs;

3、动态加载OMX内核

解释了\system\system\etc\pvplayer.cfg文件中最后一行的含义 (0xa054369c,0x22c5,0x412e,0x19,0x17,0x87,0x4c,0x1a,0x19,0xd4,0x5f),“libomx_sharedlibrary.so”

作用:将OMX内核动态加载进OpenCORE框架 位置:\system\system\etc\pvplayer.cfg 形式:(OMX Core API OsclUuid), “shared library name.so”

eg:

(0xa054369c,0x22c5,0x412e,0x19,0x17,0x87,0x4c,0x1a,0x19,0xd4,0x5f),“libomx_core_vendorXYZ.so”

以上就是OpenMax的简单解析,音视频属于大范围学习的岗位开发;更多有关音视频开发进阶可以浏览这篇《音视频简单到精通手册》里面内容包含几十个大大小小技术。对于新手非常友好从基础语言C++开始解析学习。

优势

  • 1.加速跨OS和silicon平台的多媒体组件的开发、整合和编程;
  • 2.使library和codec实现者能够快速有效的利用新silicon的潜在的加速功能,而不关心下层的硬件结构。

相关内容

热门资讯

安卓更换别的手机系统,轻松切换... 你有没有想过,你的安卓手机用久了,是不是有点审美疲劳了呢?或者,你最近是不是对其他手机系统产生了浓厚...
安卓系统单机神雕侠侣,指尖重温 你有没有想过,在手机上也能体验一把江湖恩怨、侠骨柔肠?没错,就是那个让人心驰神往的《神雕侠侣》!今天...
安卓系统键盘语言切换,安卓系统... 你有没有发现,手机上的安卓系统键盘语言切换功能,简直就像是个神奇的魔法棒,轻轻一点,就能让文字飞舞在...
oppok1安卓系统,性能与体... 你有没有发现,最近手机圈里又掀起了一股热潮?没错,就是OPPO K1这款新机!这款手机不仅外观时尚,...
安卓系统环境的搭建,从零开始构... 想要在电脑上体验安卓系统的魅力,是不是已经跃跃欲试了呢?别急,今天就来手把手教你如何搭建一个属于自己...
【MySQL】锁 锁 文章目录锁全局锁表级锁表锁元数据锁(MDL)意向锁AUTO-INC锁...
【内网安全】 隧道搭建穿透上线... 文章目录内网穿透-Ngrok-入门-上线1、服务端配置:2、客户端连接服务端ÿ...
GCN的几种模型复现笔记 引言 本篇笔记紧接上文,主要是上一篇看写了快2w字,再去接入代码感觉有点...
数据分页展示逻辑 import java.util.Arrays;import java.util.List;impo...
Redis为什么选择单线程?R... 目录专栏导读一、Redis版本迭代二、Redis4.0之前为什么一直采用单线程?三、R...
【已解决】ERROR: Cou... 正确指令: pip install pyyaml
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
Lock 接口解读 前置知识点Synchronized synchronized 是 Java 中的关键字,...
Win7 专业版安装中文包、汉... 参考资料:http://www.metsky.com/archives/350.htm...
3 ROS1通讯编程提高(1) 3 ROS1通讯编程提高3.1 使用VS Code编译ROS13.1.1 VS Code的安装和配置...
大模型未来趋势 大模型是人工智能领域的重要发展趋势之一,未来有着广阔的应用前景和发展空间。以下是大模型未来的趋势和展...
python实战应用讲解-【n... 目录 如何在Python中计算残余的平方和 方法1:使用其Base公式 方法2:使用statsmod...
学习u-boot 需要了解的m... 一、常用函数 1. origin 函数 origin 函数的返回值就是变量来源。使用格式如下...
常用python爬虫库介绍与简... 通用 urllib -网络库(stdlib)。 requests -网络库。 grab – 网络库&...
药品批准文号查询|药融云-中国... 药品批文是国家食品药品监督管理局(NMPA)对药品的审评和批准的证明文件...