打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
OpenMAX学习--omx_base_filter.c

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;

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
OpenMax在Android上的实现
OpenMAX Call Sequences
Android-StageFright之OpenMAX的实现
不可不知的socket和TCP连接过程
Android的多媒体框架OpenCore介绍 第四部分 文件格式处理和编解码部分简介
Media | Android Developers
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服