`
omygege
  • 浏览: 1349311 次
文章分类
社区版块
存档分类
最新评论

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返还
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics