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。