3.5 进入 Idle 状态以后, OMX component 就可以进入执行状态处理数据 ,并与 PVMF 进行数据交换。
@首先 PVMF 还是发送 command 给 omx component 来改变状态,从 OMX_StateIdle 到 OMX_Executing 。
@同样 PVMF 会等待 component 通过 EventHandler callback 返回的 OMX_EventCmdComplete ,表明 component 已经完成状态转换。
@进入执行状态以后, PCMF 会通过 OMX_EmptyThisBuffer() 来向 component 的某个 input port 发送数据,并要求 component 取得 buffer 中的数据进行处理 , 同时通过 OMX_FillThisBuffer() 要求 component 向其的某个 output port 填充解码或者编码完的数据。 Component 会通过 callback 来返回 buffer 。
因为 inputbuffer 和 outputbuffer 的个数都是有限的,一旦使用 emptythisbuffer 将所有的 inputbuffer 都填满数据,如果此时 component 不返回,则就不能再有新的数据能进来。对 outputbuffer 同样,如果所有的 outputbuffer 都被 fillthisbuffer 占用,等待填充数据,在 component 返回之前将不再有新的 buffer 能用来填充输出数据。
在 PCMF 没有重新将 buffer 分配给 omx component 之前, component 不能对一个 buffer 进行多次返回。一旦 component 返回 buffer ,在 PCMF 没有使用 emptythisbuffer 或者 fillthisbuffer 将这个 buffer 的所有权分给 component 之前, component 不能对buffer 进行操作。
[有点小疑问:从上面的原来分析可以看出来,实际上虽然分配了 NumiputBuffer 和 NumoutputBuffer ,但这些 buffer 的所有权并不是 component ,对这个向 "component 发送 buffer “总是无法了解,在分配 buffer 的时候不是根据 port 来进行分配的么,为什么现在所有权不属于 component ,而且好像跟 port 也不是相对应的]
具体过程:
3.6 pausing 和 resuming 是在播放器中经常用到的,从执行状态到暂停,再从暂停回到播放都是通过 OMX_SendCommand 来实现的,过程同前面的状态改变一样 OMX_StateExecuting-----> OMX_StatePause ------> OMX_StateExecuting 。一旦进入停止状态,PVMF 就不再向 component 发送 input/output buffer ,直到收到从 component 发送来的进入执行状态的 callback 。
具体过程:
3.7 port flush 主要用在解码器中,比如说播放器复位的时候,这里的也是通过 OMX_SendCommand 来实现的。另外 port flush 也用在 IL client 释放动态 port 的过程中。[也有个小疑问,这里冲刷的究竟是哪个 buffer 里面的内容呢?]
具体过程:
3.8 在执行和暂停状态都可以通过发送 stop command 使 component 进入 Idle 状态。一旦进入 Idle 状态, PVMF 就会假定 component 已经返回了所有的 buffer 。
具体过程:
3.9 从 Idle 状态进入 Loaded 状态的过程如下:
@首先通过 OMX_SendCommand ,将状态从 OMX_StateIdle 转变成 OMX_StateLoaded 。
@然后调用 OMX_FreeBuffer 释放掉 input/output buffers ,调用次数根据 NumInput/outputBuffers 。
@然后等待 comonent 的 call back
@最后调用 OMX_FreeHandle 使 OMX core 释放掉所有的 comonent 的 handle 。
在进行状态转换之前, PVMF 会等待 component 返回所有的 input/output buffer ,因为是异步调用, EmptyBufferDone/FillBufferDone call back 可能在 omx component 从 executing 到 idle 状态转变的 call back 之后到达。
具体过程:
3.10 最后 PVMF 调用 OMX_Deinit() 来释放 omx core 。