多媒体编解码】Openmax IL (一)官方文档概述

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。code

主要包含四种组件:component

Sink :只有一个input port 
Souece:只有一个output port 
host: 彻底在主机上运行,有一个input和一个output 
accelerator : 运行在松散耦合的加速器上,有一个inputblog

组件之间的三种通讯方式:接口

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 (平台不相关):

相关文章
相关标签/搜索