Android Media Framework(四)Non-Tunneled组件的状态转换与buffer分配过程分析
必读:Android Media Framework - 开篇
本篇将继续深入OpenMAX IL Spec,详细解析Non-tunneled(非隧道)组件的初始化、数据传递以及组件销毁过程。通过阅读本篇内容,我们应能对Non-tunneled组件的buffer分配与状态转换过程有一个清晰的了解。
1、组件初始化
以下是IL Spec给的Non-tunneled组件初始化时序图:
IL Client首先调用OMX IL Core的接口创建OMX组件,接着调用IL Core定义的宏函数操作OMX组件,详细调用过程如下:
- IL Client调用 OMX_GetHandle 方法创建组件,组件所有的配置与资源都被初始化,进入StateLoaded状态。IL Core调用组件的SetCallbacks方法将回调函数注册到OMX组件当中。组件创建成功,OMX_GetHandle将组件句柄返回给IL Client。
- 组件处于StateLoaded状态下,IL Client通过调用OMX_SetParameter函数将所需的参数设定给OMX组件。
- 参数设定完成后,IL Client调用OMX_SendCommand向OMX组件发送CommandStateSet命令,请求组件将状态转换为OMX_StateIdle,只有在发出此请求后,IL Client才能为OMX组件配置端口所用的buffer。
- 如果某个端口的buffer是由组件自己分配,那么IL Client要调用OMX_AllocateBuffer请求组件为该端口分配具有指定大小的buffer,同时还要分配出对应的buffer header。
- 如果某个端口需要共享IL Client的buffer,那么IL Client需要分配出buffer,再调用OMX_UseBuffer将buffer传递给OMX组件,组件接收buffer后需要分配出buffer header回传给IL Client。
- 组件检测到所有端口都拿到了所需的buffer,它就正式进入到StateIdle状态,并发送Callback通知IL Client状态转换请求已经完成。
阅读以上流程我们会发现,无论是用OMX_AllocateBuffer还是用OMX_UseBuffer,buffer header都是由组件分配再回传给IL Client。
2、数据传输
以下是IL Spec中的Non-tunneled组件数据传输时序图:
收到组件StateIdle状态设定完成发送的callback后,IL Client会调用OMX_SendCommand再向OMX组件发送CommandStateSet命令,请求组件将状态转换为OMX_StateExecuting,组件收到此请求不需要执行一些复杂动作(时序图没有标出这个流程),状态设置完成后组件同样会发送callback给IL Client。
组件的OMX_StateExecuting状态设定完成后,IL Client启动数据传输流程:
- IL Client调用OMX_FillThisBuffer将一个空的output buffer传递给OMX组件的output port;
- IL Client调用OMX_EmptyThisBuffer将一个写有数据的input buffer传输给OMX组件的input port;
全文阅读:Android Media Framework(四)Non-Tunneled组件的状态转换与buffer分配过程分析