OpenMAX基本过滤器组件。该组件并没有执行任何多媒体处理,他直接从基本组件中继承过来,并包含两个端口。对于编解码器,他可作为一个基类而被使用。Filter组件含输入输出各一个端口。在omx_base_filter.c中定义。
一、filter定义
OMX_BASE_FILTER_INPUTPORT_INDEX (0)输入端口索引
OMX_BASE_FILTER_OUTPUTPORT_INDEX (1)输出端口索引
OMX_BASE_FILTER_ALLPORT_INDEX(-1) 指向所有端口的索引
pPendingOutputBuffer 未定的输出Buffer指针
二、filter方法
--omx_base_filter_Constructor
--omx_base_filter_Destructor
--omx_base_filter_BufferMgmtFunction
1、-- omx_base_filter_Constructor()
参数:该函数有两个参数:要被初始化的标准OpenMAX组件openmaxStandComp和描述该组件的组件名cComponentName。
返回值:当内存分配失败时,返回OMX_ErrorInsufficientResources。
首先进行必要的判断,如果标准组件的私有组件指针不为空,则直接将其赋给滤波器组件的私有类型指针。否则要分配一定的空间,并将其赋给标准组件的私有组件指针。
然后调用基类的构造函数完成基本的设定和方法的注册,并重载BufferMgmtFunction方法。
2、--omx_base_filter_Destructor()
参数:该函数有一个参数:要被销毁的标准OpenMAX组件openmaxStandComp
返回值:直接调用标准组件的销毁函数。
3、--omx_base_filter_BufferMgmtFunction()
对组件处理来说,该函数是一个关键函数。他是在一个单独的线程中执行的,使用信号量与每个端口保持同步,每当所给的端口上有一个新Buffer可以使用时将释放该端口。
Filter组件进行数据处理的通常行为,负责管理Buffer。
函数主体是一个在OMX_StateIdle、OMX_StateExecuting或OMX_StatePause状态下,或OMX_TransStateLoadedToIdle转换过程中执行的死循环。
while(组件处于OMX_StateIdle、OMX_StateExecuting或OMX_StatePause状态下或OMX_TransStateLoadedToIdle)
{
while( 输入或输出端口正在被flush) //等待flush完毕
{
If(不需要输出Buffer且端口正在被flush)
{
调用ReturnBufferFunction向IL客户端或隧道组件返回输出Buffer;
将输出端Buffer设为空,将标志位置为TRUE,需要Buffer。
}
If(不需要输入Buffer且端口正在被flush)
{
调用ReturnBufferFunction向IL客户端或隧道组件返回输出Buffer;
将输入端Buffer设为空,将标志位置为TRUE,需要Buffer。
}
提升Buffer flush状态信号量,通知进行flush,并等待flush完成。
}
if (需要输入buffer且该Buffer队列信号量pInputSem->semval为0(没有Buffer处理),且当前状态并非Loaded或invalid)
{
等待信号量bMgmtSem。该信号量在base_port_SendBufferFunction中被提升。
}
if (组件状态转为Loaded或Invalid)
{
退出循环(退出Buffer管理线程)。
}
if (需要输出buffer且该Buffer队列信号量pOutputSem->semval为0(没有Buffer处理),且当前状态并非Loaded 或Invalid,且端口没有被flush)
{
等待信号量bMgmtSem。该信号量在base_port_SendBufferFunction中被提升。
}
if (组件状态为Loaded或Invalid)
{
退出循环
}
if (Buffer队列信号量pInputSem->semval>0(有输入Buffer需要处理)且需要输入Buffer)
{
等待Buffer队列信号量。
If(Buffer队列中有Buffer)
{
从队列中获取输入Buffer,若为空,则退出循环。
}
}
if (Buffer队列信号量pOutputSem->semval>0(有输出Buffer需要处理)且需要输出Buffer) //有输出Buffer需要处理
{
等待Buffer队列信号量。
If(Buffer队列中有Buffer)
{
从队列中获取输出Buffer,若为空,则退出循环。
}
}
If(不需要输入Buffer)
{
If(组件对正在处理的Buffer产生mark事件)
{
如果是目标组件,调用callback,处理mark事件。如果不是目标组件,则传递mark。然后清除mark。
}
}
if (输入和输出端口都不再需要Buffer)
{
If(有mark目标组件)
需要对mark事件进行处理。
输出Buffer的TimeStamp同步到输入Buffer。
If(在输入Buffer中检测到开始时间标志)
{
输入Buffer的nFlags同步到输出Buffer的nFlags,并将输入Buffer的nFlags置为0。
}
If(组件处于Executing状态)
{
如果有callback函数且输入Buffer长度大于0,应调用BufferMgmtCallback回调函数进行Filter处理。
如果没有Buffer管理callback函数,将输入Buffer长度清零。
}
Else if(在非执行状态下接收到Buffer)
什么也不处理。
Else
将输入Buffer长度清零。
If(输入Buffer收到EOS且输入Buffer长度为0) //输入Buffer消耗殆尽
{
输入Buffer的nFlags同步到输出Buffer的nFlags,并将输入Buffer的nFlags置为0。调用callback通知IL客户端或对端Buffer处理结束。并设为EOS状态。
}
If( 组件处于Pause态,且其端口并未处于flush状态)
等待bStateSem信号量 //(该信号量为Pause切换到Idle或Executing的脉冲).
If(输出Buffer非空或者输入殆尽(收到EOS)) // 返还输出缓冲
{
调用ReturnBufferFunction立即返回输出Buffer,并将isOutputBufferNeeded置为TRUE,表示将输出Buffer送给IL客户端,并后续需要再获取输出Buffer。
}
}
If( 组件处于Pause态,且其端口并未处于flush状态)
等待bStateSem信号量 //(该信号量为Pause切换到Idle或Executing的脉冲).
If(不需要输入Buffer且当前输入Buffer的长度为0)
{
调用ReturnBufferFunction将pInputBuffer返还.
将isInputBufferNeeded置为TRUE,表示后续需要获取输入缓冲。
}
}
return NULL;
联系客服