转载: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 ...
随机推荐
- Java Lamada
Collection: ->stream:返回一个以 colleciotn 元素为数据源的数据流. -->map: 入参 Function 对象,将此流中的元素依次作用于传入的 Funct ...
- ABP框架迁移到Mysql
ABP框架 .NetCore3.x版本 1.首先找到xxx.Core 项目,添加引用Microsoft.EntityFrameworkCore.Tools 2.找到xxx.EntityFramewor ...
- .net core 部署到IIS 后出现 w3wp.exe 【】发生了未经处理的win32异常……
抗疫时期,想到弄个微信程序用于社区出入和复工复产人员流动登记,老早就买的盛派的书和视频,一直没时间看,趁这个需求,下载盛派weixinDSK开始学习,先是打开盛派的网站陆续无法打开, 帮助文档也没能抢 ...
- windows系统中如何删除文件路径过长的文件
Q:通常在使用npm安装包后,路径会变的非常的长,有时候无法手动删除文件: 这个时候可以选中文件点击>添加文件到压缩文件,在弹出出来的框中勾选 压缩后删除原文件,>最后删除压缩包
- day 8 函数编程_byets
定义 bytes类型是指一堆字节的集合,在python中以b开头的字符串都是bytes类型 b'\xe5\xb0\x8f\xe7\x8c\xbf\xe5\x9c\x88' #b开头的都代表是bytes ...
- 将CGCS2000的坐标值转换为WGS84的坐标值
打开图层数据,或者将已有的Excel数据导入到ArcMap中,然后打开Toolbox, ArcToolbox --> Projections and Transformations --> ...
- java 实现大顶堆
Java实现堆排序(大根堆) 堆排序是一种树形选择排序方法,它的特点是:在排序的过程中,将array[0,...,n-1]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲节点和孩子结点之间 ...
- 报错:无法加载文件 D:\nodejs\node_global\webpack.ps1,因为在此系统上禁止运行脚本...
解决报错:(1)以管理员身份运行vs code (2)在终端执行:get-ExecutionPolicy,显示Restricted(表示状态是禁止的) [受限制的.保密的] (3)在终端执行:set ...
- C# WPF 表单更改提示
微信公众号:Dotnet9,网站:Dotnet9,问题或建议,请网站留言: 如果您觉得Dotnet9对您有帮助,欢迎赞赏 C# WPF 表单更改提示 内容目录 实现效果 业务场景 编码实现 本文参考 ...
- Dell 工作站M4800 安装macOs Mojave
前言 最近,入手了一台二手Dell工作站M4800,价格为3600,配置如下 个人感觉还是很好用的,配置够用,关键是用料真的足!虽然是16年的机器,但是做工吊打一众游戏本. 然后,重点来了,我安装上了 ...