转载:openmax bellagio
https://wenku.baidu.com/view/18472c1387c24028915fc3e9.html
https://wenku.baidu.com/view/1e380bc20c22590102029d3f.html
Bellagio 目录结构:
src/:
omxcore.c包含一些IL clinet 调用的core function.
omxregister.c 注册component.
st_static_component_loader.c 包含load 静态component的function.
src/base/:
base component和base port
src/components/:
包含已经实现的components.自己新加的component也可以放此目录,实现component时需要实现libbrary_entry_pointer.c
test/:
包含已经实现的IL clients.
IL client的调用flow:
IL core functions:
OMX_Init()/OMX_DeInit()
1.初始化core环境。
2.调用st_static_InitComponentLoader(): load ST_static_loader function to ComponentLoader.
3.调用BOSA_InitComponentLoader(loadsList[i]):Load所有的Component,依照omxregister file中所注册的share libraries name取出omx_component_library_Setup()执行。
4.omx_component_library_Setup():初始化该components的role,name等参数,并将信息存进loader(每个component一定要自己实现此function)
OMX_GetHandle()/OMX_FreeHandle()
1.调用BOSA_ST_CreateComponent() scan 所有存在loader的components找出request的components,运行该component的constructor,最后把所有的信息存入OMX_HANDLETYPE的hComponent结构体中。
2.component的constructor是要自己实现的,constructor调用omx_base_component_constructor(),并可以覆盖base component的一些成员函数(如SetParameter(),GetParameter(), SetConfig(), GetConfig(), BufferMgmtFunction())。在omx_base_component_constructor()内,创建compMessageHandleFunction线程,该线程接受并处理来自IL client所下的Command.
3.调用omx_base_port_Constructor()来construct component的input和output port.
4.调用setCallbacks()即omx_base_component_SetCallbacks注册IL client的三个callback(EventHandler, EmptyBufferDone, FillBufferDone)。component完成任务后(state change, fill buffer, empty buffer)会通过callback通知到IL client.目的是为了达到同步。
EventHandler:当component收到sendCommand的request被执行完后被调用。
EmptyBufferDone:当component消耗完input port 的buffer后被调用,来通知IL client来填充input port的buffer。
FillBufferDone:当component填充完output port的buffer后被调用,来通知IL client来取走output port的buffer。
OMX_SetupTunnel()
1.在两个commponent的两个port之间创建tunnel.
2.一定要在StateLoaded执行。
OMX_SendCommand()
向指定的component 发送命令.将command放入message queue中等待component的message Handler处理。

对于Client来说,命令的发送是非阻塞的,当Client把命令发送给component 时,component 会把收到的命令放到一个命令队列(或管道)里面,然后函数就会立刻返回了。当component内部的线程compMessageHandleFunction取出某个命令并执行完毕之后会进行一个事件回调来通知Client某个命令已经执行完毕,并返回命令执行的状态(失败/成功)。
OMX_SetParameter()/OMX_GetParameter()
向compnent设置参数/从component获取参数。
GetParameter:OMX_StateInvalid状态不能执行
SetParameter:只有在OMX_StateLoaded与OMX_StateWaitForResources状态下可以执行,其余状态均需要返回状态错误的错误码。
OMX_AllocateBuffer()/OMX_FreeBuffer()
在Non-Tunnel mode,由IL client向compnent发请求allocate某个port上的 buffer.
在Tunnel mode,由相邻的component向提供buffer的component发请求allocate某个port上的 buffer.
allocate的buffer包含buffer header和buffer两部分。
OMX_EmptyThisBuffer()
向指定component传递buffer数据,传递buffer数据到component的input port, 该component从buffer中取走数据。component将buffer 发送到一个queue中,component的BufferMgmtFunction从queue中取走数据后,会调用ReturnBufferFunction,在此函数中会调用IL client的callback 函数EmptyBufferDone. 在callback EmptyBufferDone中,可以继续将数据填充到buffer并调用OMX_EmptyThisBuffer来通知component取走数据。
OMX_FillThisBuffer()
向指定component还回空的buffer,传递空buffer到组件的output port, 该component往buffer填入数据。component将空buffer 发送到一个queue中,component的BufferMgmtFunction从queue中拿到空buffer后往buffer中填充数据,会调用ReturnBufferFunction,在此函数中会调用IL client的callback 函数FillBufferDone. 在callback FillBufferDone中,读走component填充的数据并调用继续调用OMX_FillThisBuffer来通知component填充数据。
IL client的调用时序图:





Tunnel mode buffer flow:

Setup Tunnel:
将组件A的端口A1与组件B的端口B0进行绑定,整个过程的步骤如下所示:
1.ComponentTunnelRequest(A,1,B,0,*pTunnelSetup)调用传入A1与B0端口号以及A、B组件实例句柄,组件A返回pTunnelSetup,该参数表明了绑定标志位与buffer提供者。
2.ComponentTunnelRequest(B,0,A,1,*pTunnelSetup)调用传入B0与A1端口号以及B、A组件实例句柄,在组件B的该函数回调内又会去调用组件A的getParameter获取相关参数,并调用组件A的SetParameter(A, OMX_IndexParamCompBufferSupplier, supplierStructure)设置组件A的buffer supplier。组件B也返回一个pTunnelSetup。
3.判断返回值是否正确,如不正确就对组件A解绑ComponentTunnelRequest(A, 1, NULL, 0, NULL)并返回错误。


当state 从load 切换到Idle时,DoStateSet() 调用base port的Port_AllocateBuffer() allocate tunneled buffer:


转载:openmax bellagio的更多相关文章
- 转载:openmax基本概念
https://yellowmax.blog.csdn.net/article/details/78080168 https://yellowmax.blog.csdn.net/article/det ...
- Android Multimedia框架总结(十三)CodeC部分之OpenMAX框架初识及接口与适配层实现
转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52629598 前言:上篇中介绍O ...
- Crystal Clear Applied: The Seven Properties of Running an Agile Project (转载)
作者Alistair Cockburn, Crystal Clear的7个成功要素,写得挺好. 敏捷方法的关注点,大家可以参考,太激动所以转载了. 原文:http://www.informit.com ...
- RTP与RTCP协议介绍(转载)
RTSP发起/终结流媒体.RTP传输流媒体数据 .RTCP对RTP进行控制,同步.RTP中没有连接的概念,本身并不能为按序传输数据包提供可靠的保证,也不提供流量控制和拥塞控制,这些都由RTCP来负责完 ...
- 《Walking the callstack(转载)》
本文转载自:https://www.codeproject.com/articles/11132/walking-the-callstack Download demo project with so ...
- [转载]MVVM模式原理分析及实践
没有找到很好的MVVM模式介绍文章,简单找了一篇,分享一下.MVVM实现了UI\UE设计师(Expression Blend 4设计界面)和软件工程师的合理分工,在SilverLight.WPF.Wi ...
- [转载]:STM32为什么必须先配置时钟再配置GPIO
转载来源 :http://blog.csdn.net/fushiqianxun/article/details/7926442 [原创]:我来添两句,就是很多同学(包括我)之前搞低端单片机,到了stm ...
- [转载]从MyEclipse到IntelliJ IDEA-让你摆脱鼠标,全键盘操作
从MyEclipse转战到IntelliJ IDEA的经历 注转载址:http://blog.csdn.net/luoweifu/article/details/13985835 我一个朋友写了一篇“ ...
- TCP同步与异步,长连接与短连接【转载】
原文地址:TCP同步与异步,长连接与短连接作者:1984346023 [转载说明:http://zjj1211.blog.51cto.com/1812544/373896 这是今天看到的一篇讲到T ...
随机推荐
- Shiro知识初探(更新中)
Shiro 是当下常见的安全框架,主要用于用户验证和授权操作. RBAC 是当下权限系统的设计基础,同时有两种解释:一: Role-Based Access Control,基于角色的访问控制即,你要 ...
- pikachu-越权漏洞(Over Permission)
一.越权漏洞概述 1.1 概述 由于没有用户权限进行严格的判断,导致低权限的账户(例如普通用户)可以去完成高权限账户(例如管理员账户)范围内的操作. 1.2 越权漏洞的分类 (1)平行越权 ...
- C#设计模式学习笔记:(16)观察者模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7928521.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第四个模式--观 ...
- maven导入sqlserver驱动jar包依赖包到本地仓库
maven导入sqlserver驱动jar包依赖包到本地仓库 maven项目使用sqlserver的依赖,先下载一个sqlserver的驱动,网址:https://www.microsoft.com/ ...
- 股票数据获取到了,导入MT4中,是否可以做出很好的量化交易策略呢?
寻找了很久,看到有tushare这个python的类库,但研究了几个小时都没有研究明白,anaconda安装和pycharm的使用都不是特别顺手,最后也是失败告终.还有就是我的低配的平板suerfac ...
- 《Git 从入门到体系》- 写给自己的话
我听过的对我很有冲击力的观点是:知识不成体系就是垃圾.这个观点不一定对,但是却是给我的冲击很大. 我记得以前在咖啡馆和一个博士医生聊天,他提出了这个观点:知识不成体系就是垃圾.听了这个观点我很想反驳他 ...
- 关于...corresponds to your MySQL server version for the right syntax to use near '?' at line 1的解决办法
完整报错信息: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual tha ...
- 将short类型转换为char类型
void short2char(uint8_t *arr1, uint16_t *arr2, int len) { ; ; for (x; x < len; x++) { arr1[x++] = ...
- SQL Server无备份误删数据的恢复
在正式生产数据库中,因为客户现场管理不规范产生了一条错误数据,由于自身睡眠不佳加上客户方言表达,将编号记错,在没有备份的情况下,直接连远程数据库执行了delete操作. 由于备份设置的是每日0点,当天 ...
- 自用浏览器的 User-agent 表
浏览器版本号见请求. 浏览器 User-agent Internet Explorer Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11. ...
