本节描述OpenMax组件初始化的时序。组件可以直接被IL client操作,或者组件之间建立隧道化,或者两者皆可。
首先,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 请求完成的应答。
为了避免在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提供者端口。
OpenMax定义了两种数据交流的方式:
1.隧道化,一个端口直接和另一个组件的端口交换数据
2.非隧道化,端口直接和IL client交换数据
IL client通过OMX_EmptyThisBuffer函数调用将一块数据buffer分发给组件的输入端口。反之,IL client应该为输出端口提供一个或者多个空的buffer,一遍组件可以写入输出数据。通过调用OMX_FillThisBuffer函数来完成这一任务。一旦组件的输出端口上有有效的buffer,它就会调用OMX_FillBufferDone函数。