OpenMAX大意(六) OpenMAX过滤器

    OpenMAX过滤器基类由OpenMAX直接继承,在omx_base_port.c中定义。

    Filter组件含输入输出各一个端口。
    Filter组件主要定义了BufferMgmtFunction方法,即Filter组件进行数据处理的通常行为。
    函数主体是一个在OMX_StateIdle、OMX_StateExecuting或OMX_StatePause状态下,或OMX_TransStateLoadedToIdle转换过程中执行的死循环。
    
    if 输入或输出端口正在被冲刷
      等待冲刷完毕

    if 需要输入缓冲且该缓冲队列信号量pInputSem非正(输入缓冲不可得),且当前状态并非Loaded或Invalid
      阻塞本线程在bMgmtSem,等待情况发生变化

    if 组件状态转为Loaded或Invalid
      退出循环

    if 需要输出缓冲且该缓冲队列信号量pOutputSem非正(输入缓冲不可得),且当前状态并非Loaded或Invalid
      阻塞本线程在bMgmtSem,等待情况发生变化

    if 组件状态转为Loaded或Invalid
      退出循环

    if 需要输入缓冲且缓冲队列信号量pInputSem为正
      尝试从队列获取输入缓冲

    if 需要输出缓冲且缓冲队列信号量pOutputSem为正
      尝试从队列获取输出缓冲

    if 输入和输出端口的Buffer都已得到
      Mark处理,以及Mark事件。
      输出缓冲的TimeStamp同步到输入缓冲。

      调用BufferMgmtCallback回调函数进行Filter处理。

      if 输入缓冲消耗殆尽(输入缓冲nFlags的EOS位置位)
        将isInputBufferNeeded置为TRUE,表示后续需要获取输入缓冲。

      if 输入码流完毕
        将输入缓冲的nFlags赋给输出缓冲,并将输入缓冲的nFlags置为0
        事件通知应用层

      if 组件处于Pause态,并且其端口并未处于冲刷状态
        阻塞在bStateSem信号量上(该信号量在Pause切换到Idle或Executing过程中脉冲)

      if 输出码流非空或者输入殆尽  // 返还输出缓冲
        调用ReturnBufferFunction返还输出端口缓冲pOutputBuffer并将isOutputBufferNeeded置为TRUE,表示将输出缓冲送给后级,并后续需要再获取输出缓冲。

    if 组件处于Pause态,并且其端口并未处于冲刷状态
      阻塞在bStateSem信号量上(该信号量在Pause切换到Idle或Executing过程中脉冲)

    if 需要输入缓冲且当前输入缓冲pInputBuffer指针非空 // 返还输入缓冲
      调用ReturnBufferFunction将pInputBuffer返还
posted @ 2008-10-09 23:54  quanben  阅读(257)  评论(0编辑  收藏  举报