音视频Media内核学习——OpenMax浅析

news2025/1/11 10:03:43

一、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的潜在的加速功能,而不关心下层的硬件结构。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/94832.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[激光原理与应用-57]:激光器 - 光学 - 常见光学镜片介绍

目录 第1章 光学镜片和普通镜片 1.1 光学镜片和普通镜片的区别 1.2 什么是光学镜片 1.3 反射镜 1.4 透镜 1.5 镜片镀膜 第2章 光学镜片的类型 2.1 半透镜 2.2 半透半反反射镜 - 分束镜 2.3 凸透镜 2.4 凹透镜 2.5 准直镜 2.6 偏振镜片 2.7 分色镜与分色反射镜 2…

【SAP ABAP】SAP Webservice RESTful 接口服务发布教程

SAP Webservice & RESTful 接口服务发布教程1、SAP Webservice 类型2、SAP Webservice 服务发布2.1、准备 RFC2.2、通过 RFC 创建服务2.3、查看 WSDL2.4、访问服务2.5、删除服务3、SAP RESTful 服务发布3.1、创建数据服务类3.2、维护服务3.3、访问服务3.4、删除服务4、SAP …

Ajax(五) Ajax加强

1. 模板引擎的实现原理 1.1 正则与字符串操作 exec() 函数用于检索字符串中的正则表达式的匹配。 如果字符串中有匹配的值,则返回该匹配值,否则返回 null。 1.基本语法:正则表达式 2.分组 正则表达式中 ( ) 包起来的内容表示一个分组&#…

【AIOT】QT样式QSS

使用桌面的PyQt或者web的flaskweb方便快捷的部署搭建可视化AI应用演示Demo,这里记录使用PyQt搭建基于Mediapipe和MixMLP网络的识别控制系统QSS样式代码。 Styles sheets are textual specifications that can be set on the whole application using QApplication::…

基于MOdel的自治交通模拟框架,用于故障-错误-故障链分析(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

二叠氮聚乙二醇,N3-PEG-N3,点击化学试剂简介 CAS 82055-94-5, Azide-PEG-Azide双边活性PEG衍生物

名称 二叠氮聚乙二醇 N3-PEG-N3 中文名称 叠氮PEG叠氮 聚乙二醇二叠氮 二叠氮聚乙二醇 英文名称 N3-PEG-N3 Azide-PEG-Azide CAS 82055-94-5 溶剂 溶于水和大部分有机溶剂 存储条件 -20读冷冻保存,惰性气体保护 N3-PEG-N3是一种双边活性PEG衍生物,可…

Ubuntu服务器Docker及常用库件安装

wshanshi:嗯…是从有道云笔记里弄出来的… 一、安装步骤 1.1、 检查并卸载已安装的docker $ sudo apt-get remove docker docker-engine docker.io containerd runc1.2、使用存储库安装 $ sudo apt-get update$ sudo apt-get install \apt-transport-https \ca-c…

[SCTF2019]Flag Shop (RUBY模板注入)

打开界面发现一个通过金钱来获得flag的,然后点击work或增加金钱但都是个位数 首先想了一下如果做一个脚本一直点击work不就好了吗,但是又想了一下服务器响应太快也不行,如果设置sleep那时间太长了 然后换一个思路,burp抓包看了一…

网络技术基础测试(一)

在一般布线中双绞线最长不可超过:100米网络拓扑图中路由器的图形为: Pv4地址由哪俩部分组成:网段地址和主机地址查询DNS域名信息的CMD命令为:NSLOOKUP关于局域网交换机,描述错误的是:用户可以有不同权限某…

Linux 性能分析工具大全

出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章。本文也可以作为检验基础知识的指标,另外文章涵盖了一个系统的方方面面。如果没有完善的计算机系统知识,网络知识和操作系统知识,文档中的工具…

12月编程语言排行榜公布!C+首超 Java

前言 日前,全球知名TIOBE编程语言社区发布了12月编程语言排行榜,有哪些新变化? C 首超 Java 和上个月相比,12 月榜单中最大的变化莫过于 C 以 0.12% 微弱的优势,凭借 11.94% 的市场份额首次超过了 11.82% 的 Java。…

重磅!阿里巴巴三入Java 全球管理组织执行委员会 龙蜥拥抱上游开源生态

近日,Java 全球管理组织 Java Community Process(以下简称 JCP)经过公平公正的投票,披露了入选最高执行委员会的成员名单,阿里巴巴作为唯一中国代表实现第三次连任。作为龙蜥社区理事长单位,阿里巴巴的此次…

“双重主要上市”潮流来袭,中通快递“赶时髦”意欲何为?

“双重主要上市”的风今年悄然在资本市场刮起。 7月26日,阿里巴巴申请将香港新增为主要上市地,7月27日,雷军的金山云递交了港股双重主要上市申请,据不完全统计,已有贝壳、小鹏、理想、知乎、B站等9家中概股公司&#…

20 个基础实用的 JavaScript 技巧

1.确定对象的数据类型 function myType(type) { return Object.prototype.toString.call(type).slice(8, -1); 使用Object.prototype.toString,通过传入不同类型的判断返回不同的判断函数,一行代码,简洁优雅灵活; 2.循环遍历数…

HylicOS --- 内存抽象

HylicOS已经完成了部分硬件抽象层的工作,包括MMU的初始化并对虚拟内存到物理内存做了映射,创建了页表目录。对串口进行了初始化,实现了printk格式化打印函数,方便了日志输出和程序调试。建立了异常向量表。 现在要做的是内存管理…

复方一枝蒿复合磷脂/IgG二性霉素B/阿糖胞苷修饰载甲氨喋呤/酶促合成半乳糖配体脂质体制备

小编今天为大家分享的科研知识是复方一枝蒿复合磷脂/IgG二性霉素B/阿糖胞苷修饰载甲氨喋呤/酶促合成半乳糖配体脂质体,一起来看! 点击输入图片描述(最多30字) 复方一枝蒿复合磷脂脂质体: 采用硫酸铵梯度法制备复方一枝…

gunicorn走私漏洞

gunicorn走私漏洞 源码:https://github.com/benoitc/gunicorn漏洞定位:https://github.com/benoitc/gunicorn/blob/20.x/gunicorn/http/message.py#142 漏洞分析 只要header里面存在Sec-Websocket-Key1 那么就将content_length强制赋值为8 比较简单直接…

【java】java JSR 269 自定义注解实战 Lombok @Data注解

1.概述 本节会演示一个实际的例子,使用JSR 269 API为类中的字段自动生成get、set 方法。首先定义一个自定义注解类Data,如下所示。 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import

智能工业之数据采集

现状 工业物联网飞速发展,但是相对于实时IT技术还是明显滞后的。个人理解,有两点原因:一是因为涉及的知识面也比较广,工业物联网开发成本比较高,不像做一个纯软件的管理系统,坐在电脑前借助开源框架就能完成…

你好,Ultrachess 里程碑更新了。

Cartesi Labs 资助的完全去中心化国际象棋项目即将来到你的面前。在10月,我们宣布了第一个由Cartesi Rollup 技术支持的完全链上国际象棋应用程序Ultrachess。Ultrachess允许用户将真正的价值放在赌注上,并在下棋时考虑的不仅仅是他们的隐藏分值。此外&…