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 |
|