Opencore and OMX core/component interaction (二)

来源:互联网 发布:企业邮箱域名格式 编辑:程序博客网 时间:2024/04/26 10:16
 

3.5进入Idle状态以后,OMX component就可以进入执行状态处理数据,并与PVMF进行数据交换。

@首先PVMF还是发送commandomx component来改变状态,从OMX_StateIdleOMX_Executing

@同样PVMF会等待component通过EventHandler callback返回的OMX_EventCmdComplete,表明component已经完成状态转换。

@进入执行状态以后,PCMF会通过OMX_EmptyThisBuffer()来向component的某个input port发送数据,并要求component取得buffer中的数据进行处理,同时通过OMX_FillThisBuffer()要求component向其的某个output port填充解码或者编码完的数据。Component会通过callback来返回buffer

因为inputbufferoutputbuffer的个数都是有限的,一旦使用emptythisbuffer将所有的inputbuffer都填满数据,如果此时component不返回,则就不能再有新的数据能进来。对outputbuffer同样,如果所有的outputbuffer都被fillthisbuffer占用,等待填充数据,在component返回之前将不再有新的buffer能用来填充输出数据。

PCMF没有重新将buffer分配给omx component之前,component不能对一个buffer进行多次返回。一旦component返回buffer,在PCMF没有使用emptythisbuffer或者fillthisbuffer将这个buffer的所有权分给component之前,component不能对buffer进行操作。

[有点小疑问:从上面的原来分析可以看出来,实际上虽然分配了NumiputBufferNumoutputBuffer,但这些buffer的所有权并不是component,对这个向"component发送buffer“总是无法了解,在分配buffer的时候不是根据port来进行分配的么,为什么现在所有权不属于component,而且好像跟port也不是相对应的]

具体过程:


 

3.6 pausingresuming是在播放器中经常用到的,从执行状态到暂停,再从暂停回到播放都是通过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.9Idle状态进入Loaded状态的过程如下:

@首先通过OMX_SendCommand,将状态从OMX_StateIdle转变成OMX_StateLoaded

@然后调用OMX_FreeBuffer释放掉input/output buffers,调用次数根据NumInput/outputBuffers

@然后等待comonentcall back

@最后调用OMX_FreeHandle使OMX core释放掉所有的comonenthandle

在进行状态转换之前,PVMF会等待component返回所有的input/output buffer,因为是异步调用,EmptyBufferDone/FillBufferDone call back可能在omx componentexecutingidle状态转变的call back之后到达。

具体过程:



3.10最后PVMF调用OMX_Deinit()来释放omx core

原创粉丝点击