博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多媒体编解码】Openmax IL (一)官方文档概述
阅读量:6006 次
发布时间:2019-06-20

本文共 2264 字,大约阅读时间需要 7 分钟。

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

转载于:https://www.cnblogs.com/yangjies145/p/8910688.html

你可能感兴趣的文章
android APP实现更新 PHP后台服务器
查看>>
Oracle 12c 多租户 手工创建 pdb 与 手工删除 pdb
查看>>
关于MYSQLUPDATE嵌套子查寻IN无法更新的解决方法
查看>>
shell初涉
查看>>
mysql安装文档
查看>>
ISA之2006简单部署
查看>>
Android游戏开发十九】(必看篇)SurfaceView运行机制详解
查看>>
shell脚本:监控HTTP服务的状态(测试返回码)
查看>>
linux下文件打包和压缩
查看>>
oracle数据库中的内容全部丢失,只有RMAN的备份文件(包括数据,参数,控制文件),恢复数据库到备份状态...
查看>>
文件查找工具find命令总结
查看>>
web服务之httpd及其新特性
查看>>
(三)开源IT资产管理系统-->OCS(unix)客户端代理安装
查看>>
.NET操作Excel
查看>>
匹配html input img标签中的value name位置不固定
查看>>
【高级】思科设备部署电信运营商城域网架构及配置实战
查看>>
SCCM TP4部署Office2013
查看>>
SmartAuditor Player error
查看>>
技术支持人员容易犯的4个错误
查看>>
HttpModule与HttpHandler详解
查看>>