转载: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 ...
随机推荐
- bootstrap-table.js 自适应窗体设置
$(window).resize(function () { $('#dtOrder').bootstrapTable('resetView') })
- MySQL安全管理
数据库服务器通常包含关键的数据,确保这些数据的安全和完整需要利用访问控制. 一.访问控制 MySQL服务器的安全基础:用户应该对他们需要的数据具有适当的访问权,既不能多也不能少. 访问控制:你需要给用 ...
- 探究Redis两种持久化方式下的数据恢复
对长期奋战在一线的后端开发人员来说,都知道redis有两种持久化方式RDB和AOF,虽说大家都知道这两种方式大概运作方式,但想必有实操的人不会太多. 这里是自己实操两种持久化方式的一点点记录. 先看以 ...
- Mac 下如何快速重启 Dock 栏?
两种方法. 如果Dock栏出现了问题或是没有反应,请打开Launchpad并按下Command+D键. 这样就可以关闭Dock栏并重启它,效果和经常用到的killall Dock命令相同.
- 41.Python中加载静态文件
在一个网页中,不仅仅只有一个html骨架,还需要css样式文件,js执行文件以及一些图片等.因此在DTL中加载静态文件时一个必须要解决的问题.在DTL中,使用static标签来加载静态文件.要使用st ...
- 牛客网剑指offer第19题——顺时针打印矩阵
这个题看似很简单: 题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 ...
- 安装ubuntu到移动硬盘(UEFI+GPT),实现在别的电脑也可以使用(详细教程)
前置说明:博主小白,第一次安装ubuntu,参考了网上很多人的教程,发博记录一下自己的安装过程.由于有些地方博主理解较浅或者因为机器硬件等各方面原因,本教程适用有限,仅供参考. 1.准备工作 win系 ...
- maven的核心概念——坐标
7.1 几何中的坐标 [1]在一个平面中使用x.y两个向量可以唯一的确定平面中的一个点. [2]在空间中使用x.y.z三个向量可以唯一的确定空间中的一个点. 7.2 Maven的坐标 使用如下三个向量 ...
- [PKUWC2018]Minimax [dp,线段树合并]
好妙的一个题- 我们设 \(f_{i,j}\) 为 \(i\) 节点出现 \(j\) 的概率 设 \(l = ch[i][0] , r = ch[i][1]\) 即左儿子右儿子 设 \(m\) 为叶子 ...
- Android_Service的一些零散知识点_1
service与线程不甚相同,service是Android提供的可供一个允许常驻后台的组件. 可通过StartService()启动Service和BindService()启动Service St ...