Opencore and OMX core/component interaction (二)

来源:互联网 发布:php架构师培训 编辑:程序博客网 时间:2024/04/26 07:54

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