OpenMAX大意(五) OpenMAX端口
OpenMAX端口基类在omx_base_port.c中定义。
1. 端口构造和析构
端口常用的数据包括
sPortParam - 端口参数,包含:
nPortIndex - 端口索引
nBufferCountActual - 端口的缓冲个数
nBufferCountMin - 端口最小缓冲个数
bEnabled - 端口使能
bPopulated - 端口活动
eDir - 端口方向(输入或输出)
2. 端口方法
- Port_AllocateBuffer
- Port_UseBuffer
- Port_FreeBuffer
- Port_DisablePort
- Port_EnablePort
- Port_SendBufferFunction
该函数将指定Buffer装入队列
首先进行一些必要的检查
然后在当前端口并未正在被冲刷的情况下,将Buffer装入队列并拉升队列信号量pBufferSem,同时提升bMgmtSem信号量通知缓冲处理线程;
如果当前端口正被冲刷,则如果当前端口是主动方,则进行队列操作,否则报错。
- FlushProcessingBuffers
冲刷该端口的所有缓冲
if 缓冲管理线程在等待缓冲
拉起信号量bMgmtSem
if 在Pause状态
脉冲bStateSem信号量以击穿Pause态的等待
[? 如此击穿是否导致缓冲处理线程若干时间后在Pause态下发生一次循环并处理若干Buffer,这一过程是否对主动或被动方而言都是合理的?]
清零bMgmtSem信号量
[这样应该能致使缓冲处理线程在获取Buffer处阻塞,但是否合理?]
取出队列中的Buffer,对每个Buffer
if 当前端口是Tunneled模式下的被动方(非Supplier)
则调用对端组件的FillThisBuffer或EmptyThisBuffer
else if 当前端口是Tunneled模式下主动方
则将Buffer加回队列,由本侧(缓冲处理线程)处理该缓冲
else
调用当前端口BufferProcessedCallback通知应用层,让应用层处理Buffer。
如果当前是Tunneled模式下主动方但尚未获得其全部Buffer(队列的nelem值不等于端口的nNumAssignedBuffers)则等待直到全部获取。
总结:对于主动方,该过程就是等待集齐所有的Buffer,对于被动方就是将所有的Buffer转到对方。对于非Tunneled模式则交由应用层干预。 虽然均是将Buffer交到主动方,但在被动方调用冲刷和在主动方调用效果略有不同:如果在被动方调用,则将缓冲立即送到主动方,这样主动方收到了需要它 进行处理的Buffer可能是:输出情形:取走一部分的需要填的输出Buffer,或输入情形:填入了一部分的需要取的输入Buffer;如果主动方调 用,则当他收到被动方送来的Buffer时,这些Buffer已经是被动方处理完毕的,即:输出情形:完全取空的输出Buffer,或输入情形:完全填满 的输入Buffer。
- ReturnBufferFunction
if 端口是Tunneled模式下被动方
如果它是输入口,则通过调用对应输出口组件的FillThisBuffer方法将Buffer还给对方(主动方),并要求其向Buffer中提供数据;如 果它是输出口,则通过调用对应输入口组件的EmptyThisBuffer方法返还Buffer并要求其从Buffer中排空数据。
else if 端口是Tunneled模式下主动方且不在冲刷过程中
如果它是输入口,则调用对端组件FillThisBuffer方法递送Buffer并其向Buffer中提供数据,如果失败则将该Buffer加回队列; 如果是输出口,则调用对端组件FillThisBuffer方法递送Buffer并要求其取走数据,如果失败则将该Buffer加回队列。加回队列即将 Buffer收回本处。
else if 非Tunneled模式
调用端口的BufferProcessedCallback方法通知应用层,由应用层处理数据。
else(Tunneled模式主动方且在冲刷过程中)
直接将Buffer装入队列。(冲刷过程正在等待收集缓冲)
- ComponentTunnelRequest
- Port_AllocateTunnelBuffer
- Port_FreeTunnelBuffer
1. 端口构造和析构
端口常用的数据包括
sPortParam - 端口参数,包含:
nPortIndex - 端口索引
nBufferCountActual - 端口的缓冲个数
nBufferCountMin - 端口最小缓冲个数
bEnabled - 端口使能
bPopulated - 端口活动
eDir - 端口方向(输入或输出)
2. 端口方法
- Port_AllocateBuffer
- Port_UseBuffer
- Port_FreeBuffer
- Port_DisablePort
- Port_EnablePort
- Port_SendBufferFunction
该函数将指定Buffer装入队列
首先进行一些必要的检查
然后在当前端口并未正在被冲刷的情况下,将Buffer装入队列并拉升队列信号量pBufferSem,同时提升bMgmtSem信号量通知缓冲处理线程;
如果当前端口正被冲刷,则如果当前端口是主动方,则进行队列操作,否则报错。
- FlushProcessingBuffers
冲刷该端口的所有缓冲
if 缓冲管理线程在等待缓冲
拉起信号量bMgmtSem
if 在Pause状态
脉冲bStateSem信号量以击穿Pause态的等待
[? 如此击穿是否导致缓冲处理线程若干时间后在Pause态下发生一次循环并处理若干Buffer,这一过程是否对主动或被动方而言都是合理的?]
清零bMgmtSem信号量
[这样应该能致使缓冲处理线程在获取Buffer处阻塞,但是否合理?]
取出队列中的Buffer,对每个Buffer
if 当前端口是Tunneled模式下的被动方(非Supplier)
则调用对端组件的FillThisBuffer或EmptyThisBuffer
else if 当前端口是Tunneled模式下主动方
则将Buffer加回队列,由本侧(缓冲处理线程)处理该缓冲
else
调用当前端口BufferProcessedCallback通知应用层,让应用层处理Buffer。
如果当前是Tunneled模式下主动方但尚未获得其全部Buffer(队列的nelem值不等于端口的nNumAssignedBuffers)则等待直到全部获取。
总结:对于主动方,该过程就是等待集齐所有的Buffer,对于被动方就是将所有的Buffer转到对方。对于非Tunneled模式则交由应用层干预。 虽然均是将Buffer交到主动方,但在被动方调用冲刷和在主动方调用效果略有不同:如果在被动方调用,则将缓冲立即送到主动方,这样主动方收到了需要它 进行处理的Buffer可能是:输出情形:取走一部分的需要填的输出Buffer,或输入情形:填入了一部分的需要取的输入Buffer;如果主动方调 用,则当他收到被动方送来的Buffer时,这些Buffer已经是被动方处理完毕的,即:输出情形:完全取空的输出Buffer,或输入情形:完全填满 的输入Buffer。
- ReturnBufferFunction
if 端口是Tunneled模式下被动方
如果它是输入口,则通过调用对应输出口组件的FillThisBuffer方法将Buffer还给对方(主动方),并要求其向Buffer中提供数据;如 果它是输出口,则通过调用对应输入口组件的EmptyThisBuffer方法返还Buffer并要求其从Buffer中排空数据。
else if 端口是Tunneled模式下主动方且不在冲刷过程中
如果它是输入口,则调用对端组件FillThisBuffer方法递送Buffer并其向Buffer中提供数据,如果失败则将该Buffer加回队列; 如果是输出口,则调用对端组件FillThisBuffer方法递送Buffer并要求其取走数据,如果失败则将该Buffer加回队列。加回队列即将 Buffer收回本处。
else if 非Tunneled模式
调用端口的BufferProcessedCallback方法通知应用层,由应用层处理数据。
else(Tunneled模式主动方且在冲刷过程中)
直接将Buffer装入队列。(冲刷过程正在等待收集缓冲)
- ComponentTunnelRequest
- Port_AllocateTunnelBuffer
- Port_FreeTunnelBuffer
enjoy every minute of an appless, googless and oracless life