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组件,详细调用过程如下:

  1. IL Client调用 OMX_GetHandle 方法创建组件,组件所有的配置与资源都被初始化,进入StateLoaded状态。IL Core调用组件的SetCallbacks方法将回调函数注册到OMX组件当中。组件创建成功,OMX_GetHandle将组件句柄返回给IL Client。
  2. 组件处于StateLoaded状态下,IL Client通过调用OMX_SetParameter函数将所需的参数设定给OMX组件。
  3. 参数设定完成后,IL Client调用OMX_SendCommand向OMX组件发送CommandStateSet命令,请求组件将状态转换为OMX_StateIdle,只有在发出此请求后,IL Client才能为OMX组件配置端口所用的buffer。
  4. 如果某个端口的buffer是由组件自己分配,那么IL Client要调用OMX_AllocateBuffer请求组件为该端口分配具有指定大小的buffer,同时还要分配出对应的buffer header。
  5. 如果某个端口需要共享IL Client的buffer,那么IL Client需要分配出buffer,再调用OMX_UseBuffer将buffer传递给OMX组件,组件接收buffer后需要分配出buffer header回传给IL Client。
  6. 组件检测到所有端口都拿到了所需的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启动数据传输流程:

  1. IL Client调用OMX_FillThisBuffer将一个空的output buffer传递给OMX组件的output port;
  2. IL Client调用OMX_EmptyThisBuffer将一个写有数据的input buffer传输给OMX组件的input port;

全文阅读:Android Media Framework(四)Non-Tunneled组件的状态转换与buffer分配过程分析

image

posted @ 2024-06-08 10:00  青山渺渺  阅读(29)  评论(0编辑  收藏  举报