https://yellowmax.blog.csdn.net/article/details/78080168

https://yellowmax.blog.csdn.net/article/details/78242464

https://yellowmax.blog.csdn.net/article/details/78997854

https://wenku.baidu.com/view/18472c1387c24028915fc3e9.html    (OpenMax_IL_Bellagio_代码分析_-_台湾清华RTlab实验室_OpenMax_IL_代码分析)

组件

从上图可以看出组件内部大概有这么几个组成部分:

1.组件句柄(组件的描述符,类似文件描述符一样)。
2.配置相关的结构体方法(set/get parameter/configuration)。
3.命令队列。
4.端口(port)。
5.端口的buffer管理。
6.组件事件句柄(用于向IL Client发送事件)。
7.buffer发送模块。

IL Clinet

顾名思义,IL Client就是指IL的客户端,可以在上图里面看到有IL Clinet的字样,对于组件来说,IL Client就是组件的管理者,Client通过组件内部提供的相关回调函数来对组件进行管理,应用程序可以调用Client的代码来操作组件,包括设置组件的状态、添加一个组件、销毁一个组件等等。

IL Client对组件的操作流程大概如下:

端口

1.PORT(端口)是用来干什么的?
PORT充当了组件之间数据交流的代理人(驻外大使馆),通过PORT端口,两个组件之间可以互相传递数据,同时也可以进行其它的一些控制。
2.如何通过PORT(端口)来交换数据?
组件之间是可以进行绑定的,在组件绑定完成之后,绑定组件的双方PORT口里面就存放了绑定双方组件的实例化组件句柄以及绑定端口信息等数据,然后通过PORT来调用绑定组件的buffer相关的回调函数,这样就可以实现组件之间互相调用对方的内部方法来实现数据交换(包括数据发送与数据回收)。
3.如何定义一个PORT?
一个PORT的定义需要三个结构体来完成,在OpenMAX标准下,这三个结构体分别是:OMX_PARAM_PORTDEFINITIONTYPE,OMX_VIDEO_PARAM_PORTFORMATTYPE,OMX_PARAM_BUFFERSUPPLIERTYPE,其中第二个结构体是跟组件的PORT端口类型有关的,分别有video、image、audio等类型,这里给出的就是video类型。这三个结构体描述囊括了了PORT类型,端口号,COMP句柄等信息。
4.如何通过PORT建立连接?
调用组件的内部方法进行协商连接(协商建立外交),具体到OpenMAX里面就是OMX_SetupTunnel这个宏定义,在绑定组件的时候需要调用双方组件的这个宏定义,最终可以回调到双方组件内部的一个ComponentTunnelRequest方法来完成组件的绑定(该方法的具体代码内容需要自行实现)。

两个组件通过port进行相互链接,然后组件内部自行协调进行数据交流。整个链接过程是由组件的管理者连续调用两个组件的链接函数完成的,组件的链接函数里面会判断两个port是否适合链接,如果适合的话就将对方port以及COMP的句柄信息记录下来,存放到一个port结构体描述当中,这样的话两个组件就可以通过port来进行通信以及数据传输了。

组件的事件句柄

组件在初始化的时候会向IL Client注册一个OMX_CALLBACKTYPE类型的回调函数集

里面的三个回调成员由IL Client实现,在组件内部可以通过某种事件触发这三种回调成员的回调,比如EventHandler回调成员就会在组件状态转换完成的时候被回调,其余两个则会在EmptyBuffer,FillThisBuffer操作完成的时候被调用,利用这几个回调函数,IL Client可以接收来自于组件内部的若干消息事件,从而达到某种同步以及接收组件的反馈。

buffer发送模块

1.tunnel模式

由图中可以看出,如果组件A是数据的提供者,那么完整的一帧数据传递就是:

1.组件A调用组件B(通过PORT端口实现)的OMX_EmptyThisBuffer(B, pBuffer)宏来实现数据从A传递到B。
2.组件B调用组件A(通过PORT端口实现)的OMX_FillThisBuffer(A, pBuffer)宏来完成数据从B到A的还回过程。

2.Non-tunnel模式

在该模式下,数据传递的双方变为IL Client与组件了,整个过程变成了:

1.IL Client通过OMX_FillThisBuffer(pHandle,1,pBufferOut)向组件A的Output端口提供一个空的buffer结构体以待填充,该宏是通过IL Core来最终完成对A组件的FillThisBuffer回调方法的调用的。
2.然后IL Client向组件A传递一个pBufferIn数据,这时组件A可以对pBufferIn内的buffer数据进行处理,然后处理完毕之后生成的新的buffer数据填充到上一步接收到的空pBufferOut的buffer结构体里。
3.等待组件A将pBufferOut里的buffer填充完毕,组件A就会调用OMX_FillBufferDone(pBufferOut)方法来通知IL Client接收处理后的数据。
4.IL Client数据处理完毕之后就会再次调用OMX_FillThisBuffer(pHandle,1,pBufferOut)来还回buffer到Output列表等待再次填充。
5.组件A处理完接收到的buffer数据之后就会调用OMX_EmptyBufferDone(pBufferIn)方法来通知IL Client,说明组件A已完成接收buffer的数据处理。

组件的状态转换

1.组件状态转换有什么作用?

状态转换用于控制组件运行、暂停、恢复、销毁等等。多个组件同时运行的时候状态转换就可以用来进行多组件之间的数据同步,协调组件之间的工作节奏。
2.由谁来进行状态转换控制,如何去实现控制
状态转换一般是由IL Client调用需要控制的组件的SendCommand来进行状态转换命令的发送,Cmd参数填充OMX_CommandStateSet枚举成员,nParam1参数填充需要转换的命令。当然除了IL Client的控制,组件内部也可能会主动给产生一些状态转换的命令,比如在组件发生严重错误的时候,此时组件内部就需要主动转入Invalid状态。组件内部需要实现OMX_CommandStateSet命令的获取与解析,通常在组件的内部线程里面完成,在接收到该命令之后,组件内部线程需要根据命令指定的状态进行相关的动作。
3.有哪些状态,分别对应什么场景
组件内部有6种状态,分别对应如下:
OMX_StateLoaded:该状态在组件被OMX_GetHandle调用初始化之后就转入,此时相关的buffer资源还没有被分配,IL Client可以使用OMX_SetParameter函数回调来进行参数的设定,使用OMX_SetupTunnel函数进行组件之间的绑定操作,最后控制组件从该状态转入OMX_StateIdle或者OMX_StateWaitForResources状态,后者是在组件尝试分配相关的buffer资源并转入OMX_StateIdle状态失败的时候才转入。
OMX_StateIdle:表明组件所有的资源都已经准备好了,正等待正式运行,该状态下,组件持有buffer,但是不传输也不处理buffer。当组件从OMX_StateExecuting或者OMX_StatePause状态转入该状态时需要归还所有处理完毕的buffer到buffer提供者。
OMX_StateExecuting:该状态下,组件持有buffer,传输同时处理buffer。此时组件应该接受其它组件对该组件的OMX_EmptyThisBuffer与OMX_FillThisBuffer函数回调,同时在非绑定的情况下使用EmptyBufferDone与FillBufferDone来归还Empty以及full buffer。绑定情况下就使用OMX_FillThisBuffer与OMX_EmptyThisBuffer来进行buffer的传递。
OMX_StatePause:该状态下,组件持有buffer,不传输也不理buffer,但是组件不必归还buffer到buffer的提供者。为了避免丢失数据,此时组件可以选择将接收到的数据存放到自己的buffer队列里面,但是不进一步传输也不去处理,当然也可以选择不去存放,这跟组件的具体类型与功能有关系。
OMX_StateWaitForResources:顾名思义,在该状态下,组件正在等待资源被分配并变得可用。通常情况下该状态由组件自己主动转入,原因前面说过,是因为资源分配失败导致。
OMX_StateInvalid:该状态是在组件发生不可修复的错误时转入,此时组件需要产生一个事件,类型为OMX_ErrorEvent,值为OMX_ErrorInvalidState,最后转入OMX_StateInvalid状态,当IL Client接收到该消息的时候就需要调用OMX_FreeHandle来释放所有组件持有的资源。
组件之间的状态转换图如下:

转载:openmax基本概念的更多相关文章

  1. [转载]oracle游标概念讲解

    原文URL:http://www.2cto.com/database/201203/122387.html ORACLE游标概念讲解 什么是游标?  ①从表中检索出结果集,从中每次指向一条记录进行交互 ...

  2. [转载]hashmap hashtable 的区别

    Hashtable 和 HashMap 做为 Map 的基本特性 两者都实现了Map接口,基本特性相同 -          对同一个Key,只会有一个对应的value值存在 -          如 ...

  3. 《机器学习实战》——k-近邻算法Python实现问题记录(转载)

    py2.7 : <机器学习实战> k-近邻算法 11.19 更新完毕 原文链接 <机器学习实战>第二章k-近邻算法,自己实现时遇到的问题,以及解决方法.做个记录. 1.写一个k ...

  4. iOS沙盒机制介绍,Block 的介绍

    一.iOS沙盒机制介绍 (转载) 1)概念:每个ios应用都有自己的应用沙盒,应用沙盒就是文件系统目录,与其他应用放入文件 系统隔离,ios系统不允许访问 其他应用的应用沙盒,但在ios8中已经开放访 ...

  5. Java 集合系列 11 hashmap 和 hashtable 的区别

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  6. 我的Spark SQL单元测试实践

    最近加入一个Spark项目,作为临时的开发人员协助进行开发工作.该项目中不存在测试的概念,开发人员按需求进行编码工作后,直接向生产系统部署,再由需求的提出者在生产系统检验程序运行结果的正确性.在这种原 ...

  7. IEnumerator<TItem>和IEnumerator Java 抽象类和普通类、接口的区别——看完你就顿悟了

    IEnumerable 其原型至少可以说有15年历史,或者更长,它是通过 IEnumerator 来定义的,而后者中使用装箱的 object 方式来定义,也就是弱类型的.弱类型不但会有性能问题,最主要 ...

  8. (转)hashmap hashtable 的区别 Hash table 内部的数据结构

    转自:http://www.cnblogs.com/carbs/archive/2012/07/04/2576995.html Hashtable 和 HashMap 做为 Map 的基本特性 两者都 ...

  9. 转载文章----C#基础概念

    转载地址:http://www.cnblogs.com/zhouzhou-aspnet/articles/2591596.html 1.值类型和引用类型 1.1堆和栈 简单的说值类型存放在堆栈上面,引 ...

随机推荐

  1. (数据科学学习手札78)基于geopandas的空间数据分析——基础可视化

    本文对应代码和数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 通过前面的文章,我们已经对geopanda ...

  2. .Net core webapi使用httpClient发送异步请求遇到TaskCanceledException: A task was canceled

    前言:本人最近较多使用.net core的项目,最近在使用httpClient发送请求的时候,遇到服务器处理时间较长时,就老是会报异常:TaskCanceledException: A task wa ...

  3. 【57】目标检测之Anchor Boxes

    Anchor Boxes 到目前为止,对象检测中存在的一个问题是每个格子只能检测出一个对象,如果你想让一个格子检测出多个对象,你可以这么做,就是使用anchor box这个概念. 我们还是先吃一颗栗子 ...

  4. PMP--1.7 项目治理

    治理凌驾于管理之上 组织治理用于影响项目治理. 组织治理需要组织根据组织文化.项目类型和组织需求裁剪治理框架,适用于当前组织. 其实组织治理的内容,在项目管理初期不需要详细了解,组织治理的内容都是高层 ...

  5. KVM | centos 安装 window 虚拟机

    KVM | centos 安装 window 虚拟机 环境: CENTOS 7.3 1. 准备 1.1 检查是否支持虚拟化 cat /proc/cpuinfo | egrep 'vmx|svm' 要求 ...

  6. TP6文档-邓士鹏

    2019年5月11日 - 教程为您提供<ThinkPHP6.0极速入门(视频教程)>之 TP6的目录结构 章节的在线实战教程供您学习,你可以进行笔记.提问.讨论和资料下载 https:// ...

  7. C# Winform初体验

    设计一个简单的登录窗口,要求输入用户名:小金,密码:123456时候点登录能正确转到另一个窗口. 1.建立窗体应用. 2.这里创建一个login和一个NewForm的窗体. 3.在login的窗体拖拉 ...

  8. 获取Windows平台下 安装office 版本位数信息

    最近在处理客户端安装程序过程,有一个需求:需要检测Windows平台下安装office 版本信息以及获取使用的office是32 位还是64 位: 当检测出office 位数为64位时,提示当前off ...

  9. 让我们纯手写一个js继承吧

    继承在前端逻辑操作中是比较常见的,今天我们就从零开始写一个js的继承方式 在es5中继承实质上是先创建子类的实例对象,然后再将父类的方法添加到this上Parent.call(this),在es6中则 ...

  10. Jquery开发电商网站实战(带源码)

    组件化思想,包含: 下拉菜单项封装 + 按需加载 搜索功能组件化,显示数据 + 下拉显示 + 缓存 分类导航按需加载 幻灯片效果组件封装及按需加载 商品楼层模块组件化 + 商品数据按需加载 + Tab ...