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

posted @ 2008-10-09 23:53  quanben  阅读(315)  评论(0编辑  收藏  举报