首页 > 代码库 > OpenMax 初始化和数据流调用时序

OpenMax 初始化和数据流调用时序

1.初始化

本节描述OpenMax组件初始化的时序。组件可以直接被IL client操作,或者组件之间建立隧道化,或者两者皆可。

1.1 非隧道化初始化

首先,IL client通过调用OMX_GetHandle函数触使OpenMax core创建一个真正的组件实体,与此同时组件的配置信息也被加载到内存中。core把IL client的callback函数通过 SetCallbacks函数设置给组件。如果这些步骤都成功了,那么会返回一个组件句柄给IL client,同时组件进入OMX_StateLoaded状态。


IL client可以调用一次或者多次OMX_SetParameter 函数来配置组件和它的端口。

配置完成后,IL client请求组件进入 OMX_StateIdle状态。只有进行这一步之后,IL client才能为组件设置它的端口所需要的内存。IL client可以调用OMX_AllocateBuffer 或者OMX_UseBuffer来设置内存。设置内存的步骤可能会进行多次,取决于端口的数目和每一个端口所需的内存总数。

当完成这些之后,组件会发送一个事件给IL client,作为 SendCommand 请求完成的应答。

1.2 隧道化初始化

为了避免在IL client和组件之间来回的移动数据buffer,可以在组件链上建立隧道化,这样一个组件的输出buffer可以直接传递到下一个组件的输入端口。考虑下图的情况,IL client为三个隧道化的组件,A,B,C,生产数据。组件C是一个sink组件不会返回数据给IL client。

组件之间隧道化的建立依照以下步骤:

1.通过OMX_GetHandle函数构建组件

2.建立隧道化,将第一个组件的输出端口和第二个组件的输入端口连接。这个步骤中要确定是哪一个端口提供buffer

3.OMX_SetupTunnel 函数完成后IL client也可以通过设置buffer提供者到输入端口,改变输入端口 buffer提供者的选择。

当从OMX_StateLoaded 转变 为 OMX_StateIdle,直到所有启用的端口的内存都得到分配,状态转换才会完成。只有当组件处于OMX_StateLoaded
状态或者端口禁用,才能调用OMX_SetupTunnel函数。

OMX_TUNNELSETUPTYPE 结构体用于ComponentTunnelRequest的输出端口传递数据到输入端口。

下图说明IL client如何改变输入端口的buffer提供者:

隧道化初始化的最后一个步骤就是组件状态从OMX_StateLoaded 转变为OMX_StateIdle。

组件A和组件B隧道化,组件B是buffer提供者。组件B和组件C隧道化,组件C是buffer提供者。

下图说明了在组件状态转换期间的时序:

组件的buffer提供端口都必须通过 OMX_UseBuffer将它的buffer传递到与之隧道化的非buffer提供者端口。

2.数据流

OpenMax定义了两种数据交流的方式:

1.隧道化,一个端口直接和另一个组件的端口交换数据

2.非隧道化,端口直接和IL client交换数据

2.1 非隧道化数据流

IL client通过OMX_EmptyThisBuffer函数调用将一块数据buffer分发给组件的输入端口。反之,IL client应该为输出端口提供一个或者多个空的buffer,一遍组件可以写入输出数据。通过调用OMX_FillThisBuffer函数来完成这一任务。一旦组件的输出端口上有有效的buffer,它就会调用OMX_FillBufferDone函数。

1.2 隧道化数据流