【多媒体编解码】Openmax IL (一)官方文档概述
OpenMax IL 概述
PS:被博客主要是对官方文档前三章的学习于记录。
官网文档请移步:
https://www.khronos.org/openmax/
Openmax 框架图:
openmax il API概述
openmax il API 是基于组件的的多媒体API,包括core API和conponent API
core :
动态的加载和卸载conponent,允许用户层和conponent直接通信,允许用户在两个conponent之间建立隧道化通信(tunnel
communication)
component:
在il层,conponent代表独立的功能模块,可以有四种角色:sources,sinks,codecs,filters,splitters,mixers或者其他的数据处理模块,具体取决于其实现。但是在我们的多媒体处理当中,一个组件,很可能是
某个硬件,软件编解码器,处理器或者以上组合。 系统组件概述。 参数描述包括 Buffer状态,错误,一系列的回调函数等。
组件之间的通信接口,称之为Port,代表组件和数据流之间的链接,以及保持链接所需要维护的buffers。
主要包含四种组件:
Sink :只有一个input port
Souece:只有一个output port
host: 完全在主机上运行,有一个input和一个output
accelerator : 运行在松散耦合的加速器上,有一个input
组件之间的三种通信方式:
Non-tunneled:IL client和conponent之间进行数据交换的机制>Tunneling :组件之间的数据交换
Proprietary:组件之间可选的通信方式
通信方式参考如下截图:
组件状态(OMX_STATETYPE)
组件的状态变化,如下图:
需要注意的是:
1,每个组件的初始状态都是 ubloaded
2,LOADED->IDLE 状态迁移,需要申请所有需要的资源,资源不够就会发生LOADED->WAIT FOR RESOURCES 状态迁移。系统中存在一个厂商定制的resource manager来监控资源的变化并且发出通知,并且控制状态迁移。处于IDLE意味着组件已经获得所有需要的资源。IL client会发出除了INVALID以外的状态迁移控制。
3,EXECUTING 意味着组件正在等待接收buffer以处理数据,IDLE不会处理数据
4,PAUSED :维护缓冲区执行的上下文,并且不处理数据或交换缓冲区。 从PAUSED->EXECUTING 使缓存处理恢复到组件停止的位置。
5,PAUSED->IDLE EXECUTING->IDLE会导致数据处理所在的上下文确实
6,IDLE->LOADED 会导致操作资源的丢失,比如communication buffers丢失
通信行为:
和组件的数据通信是非阻塞的,并且一旦ports的数量被配置,通信就被使能。每个port被配置特定的数据格式,并且组件也被置于正确的状态。组件port的通信方式都是不一样的,比如:IL Client通过OMX_EmptyThisBuffer调用input port;通过OMX_FillThisBuffer 调用output port,相应的OMX_EmptyBufferDone OMX_FillBufferDone 回调函数在调用返回之前被触发,如下图示意:
关于port,需要明白:
1,每个port都有基于组件定义的需要申请(Allocate)和使用(use)的最小buffer数。
2,一个port 将一个buffer header和buffer关联。一个buffer header 指向buffer中间的数据,并且提供和buffer内容相关的metadate(元数据)。
tunneled buffer的申请和共享:
在一个tunnel中,一个port 把buffer提供给另一个non-supplier port并且传递给它。提供者也会申请buffer。在某些正常情况下,隧道组件可以选择从另一个端口重新使用缓冲区,以避免内存复制并优化内存使用。 这种做法是buffer共享。
在buffer共享的情况下,一个组件通过OMX_EmptyThisBuffer从output port端向input port端传输buffer。
conponent profiles
base profile :只支持Proprietary 通信,不支持tunnled
interop profile:和base的区别在于,支持tunnled 通信。
一些专业术语:
supplier port:在一对tunneling中的两个port之间,在邻居port上调用UseBuffer的是 supplier
port,这个buffer supplier不需要申请新的buffer,而是重用其他port的buffer。
tunneling port :
sharing port :
tunneling component:
关于所需的buffer要求,查阅结构体OMX_PORTDEFINITIONTYPE,port通过OMX_GetParameter。
在之后的学习中间,要解决的问题如下:
问题1:如何集成一个新的编解码器?
问题2:如何确定使用那个编解码器?
问题3:openmax解码流程?
集成到平台商的自定义框架:如QCOM
集成到Android (平台不相关):
【多媒体编解码】Openmax IL (一)官方文档概述相关推荐
- FFmpeg总结(一)FFmpeg官方文档分块
FFmpeg总结(一)FFmpeg官方文档分块 转载:http://blog.csdn.net/hejjunlin/article/details/68483899 http://ffmpeg.org ...
- ExoPlayer详解(官方文档-入门)
目录 ExoPlayer详解系列文章-入门 一.前言 二.优缺点比较 三.概述 ExoPlayer详解--入门(官方文档) 添加ExoPlayer作为依赖项 1.添加依赖 2.添加ExoPlayer模 ...
- protocal buffers 官方文档学习
protocal buffers 官方文档学习 文章目录 protocal buffers 官方文档学习 1.What are protocol buffers? 2.选择你喜欢的语言 3.怎么开始, ...
- 【Android 命令行工具】Android 命令行工具简介 ( 官方文档 | SDK 命令行工具 | SDK 构建工具 | SDK 平台工具 | 模拟器工具 | Jetifier 工具 )
文章目录 一.官方文档 二.Android 命令行工具简介 1.SDK 命令行工具 2.SDK 构建工具 3.SDK 平台工具 4.模拟器工具 5.Jetifier 工具 一.官方文档 Android ...
- AsyncDisplayKit官方文档个人翻译
迁移老文章到掘金 文档比较老了,不适用最新的2.0 AsyncDisplayKit 官方文档 最近在拆解学习AsyncDisplayKit这个很知名的轮子,发现这个轮子内容还是非常庞大的,想要分解学习 ...
- 《Spring5官方文档》新功能(4,3)
<Spring5官方文档>新功能 原文链接 译者:supriseli Spring框架的新功能 这一章主要提供Spring框架新的功能和变更. 升级到新版本的框架可以参考.Spring g ...
- Mybatis官方文档及使用简记
Mybatis官方文档及使用简记 数据库建表 入门案例 无mapper类最传统的用法 使用mybatis generator 使用mybatis-generator mybatis-spring整合 ...
- 对 Windows 官方文档的一点吐槽
对 Windows 官方文档的一点吐槽 正文 当你在百度搜 Windows 系统的一些问题,所见之处尽是<小编来教大家><第一步第二步第三步第四步第五步--><方法一方法 ...
- C#_08_官方文档_语言介绍
C# 官方文档_C#语言介绍篇章 https://docs.microsoft.com/zh-cn/dotnet/csharp/tour-of-csharp/ C# 语言介绍 C#(读作"S ...
最新文章
- RxPermission原理解析
- OpenCV神经网络ANN代码编译运行与解读(二)
- harmonyos2.0三大技术特点,一文解析HarmonyOS的技术特性、子系统架构、四大技术特性...
- python中__init__和__new__方法的使用
- MySQL 高级 函数
- C语言重新定位文件,C语言代码重定位 (原创)
- Mysql查看和修改时区
- 聊一聊Load Average
- Taro+react开发(51) 数组对象和数组得处理
- 题解 牛客【「水」悠悠碧波】
- 安卓手机浏览器排行_安卓手机性价比排行:小米10至尊纪念版仅排第三
- 三星w609 java_完美复刻叫板三星W2019,这款商务手机有点牛
- css实现动态箭头_Jerry的反省:程序员不要轻易说出quot;这个功能技术上无法实现quot;...
- 对计算机病毒防治最科学的方法是,计算机病毒防治(复习-3
- [FJWC2018]欧拉函数
- 线性四叉树的实现C++
- 【Java面试题】线程的生命周期包括哪几个阶段?
- Layui实现多条件查询
- Win11怎么关闭开机自启动软件
- 关于农业害虫解决的6个办法