OpenMax 初始化和数据流调用时序

1.初始化

本节描述OpenMax组件初始化的时序。组件可以直接被IL client操作,或者组件之间建立隧道化,或者两者皆可。

1.1 非隧道化初始化

首先,IL client通过调用OMX_GetHandle函数触使OpenMax core创建一个真正的组件实体,与此同时组件的配置信息也被加载到内存中。core把IL client的callback函数通过 SetCallbacks函数设置给组件。如果这些步骤都成功了,那么会返回一个组件句柄给IL client,同时组件进入OMX_StateLoaded状态。


IL client可以调用一次或者多次OMX_SetParameter 函数来配置组件和它的端口。

配置完成后,IL client请求组件进入 OMX_StateIdle状态。只有进行这一步之后,IL client才能为组件设置它的端口所需要的内存。IL client可以调用OMX_AllocateBuffer 或者OMX_UseBuffer来设置内存。设置内存的步骤可能会进行多次,取决于端口的数目和每一个端口所需的内存总数。

当完成这些之后,组件会发送一个事件给IL client,作为 SendCommand 请求完成的应答。

1.2 隧道化初始化

为了避免在IL client和组件之间来回的移动数据buffer,可以在组件链上建立隧道化,这样一个组件的输出buffer可以直接传递到下一个组件的输入端口。考虑下图的情况,IL client为三个隧道化的组件,A,B,C,生产数据。组件C是一个sink组件不会返回数据给IL client。

组件之间隧道化的建立依照以下步骤:

1.通过OMX_GetHandle函数构建组件

2.建立隧道化,将第一个组件的输出端口和第二个组件的输入端口连接。这个步骤中要确定是哪一个端口提供buffer

3.OMX_SetupTunnel 函数完成后IL client也可以通过设置buffer提供者到输入端口,改变输入端口 buffer提供者的选择。

当从OMX_StateLoaded 转变 为 OMX_StateIdle,直到所有启用的端口的内存都得到分配,状态转换才会完成。只有当组件处于OMX_StateLoaded
状态或者端口禁用,才能调用OMX_SetupTunnel函数。

OMX_TUNNELSETUPTYPE 结构体用于ComponentTunnelRequest的输出端口传递数据到输入端口。

下图说明IL client如何改变输入端口的buffer提供者:

隧道化初始化的最后一个步骤就是组件状态从OMX_StateLoaded 转变为OMX_StateIdle。

组件A和组件B隧道化,组件B是buffer提供者。组件B和组件C隧道化,组件C是buffer提供者。

下图说明了在组件状态转换期间的时序:

组件的buffer提供端口都必须通过 OMX_UseBuffer将它的buffer传递到与之隧道化的非buffer提供者端口。

2.数据流

OpenMax定义了两种数据交流的方式:

1.隧道化,一个端口直接和另一个组件的端口交换数据

2.非隧道化,端口直接和IL client交换数据

2.1 非隧道化数据流

IL client通过OMX_EmptyThisBuffer函数调用将一块数据buffer分发给组件的输入端口。反之,IL client应该为输出端口提供一个或者多个空的buffer,一遍组件可以写入输出数据。通过调用OMX_FillThisBuffer函数来完成这一任务。一旦组件的输出端口上有有效的buffer,它就会调用OMX_FillBufferDone函数。

1.2 隧道化数据流



  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenMAX是一种多媒体编解码器开发框架,它可以用于在嵌入式设备上实现硬件加速的视频编解码。如果需要在嵌入式设备上使用OpenMAX调用Cedar硬解码MJPEG,可以按照以下步骤进行操作: 1. 首先,需要在嵌入式设备上安装支持Cedar硬解码的驱动程序。Cedar是一种硬件编解码器,它通常用于实现MJPEG、H.264等格式的硬件加速解码。 2. 接下来,需要使用OpenMAX的OMX IL API(OpenMAX Integration Layer API)来调用Cedar硬解码器。OMX IL API是OpenMAX的标准API,它可以用于在嵌入式设备上实现多媒体编解码功能。 3. 在OMX IL API中,需要使用OMX_ComponentNameEnum()函数来获取Cedar硬解码器的组件名称。然后,使用OMX_GetHandle()函数来获取解码器组件的句柄。 4. 接下来,需要使用OMX_SetParameter()函数来设置解码器的参数,例如解码器的输入和输出格式、分辨率、帧率等。在设置参数之前,需要先使用OMX_GetParameter()函数获取解码器的参数列表。 5. 然后,可以从解码器中获取解码后的视频帧。在使用OMX_GetParameter()函数获取参数时,需要设置解码器的状态为OMX_StateExecuting,以启动解码器的运行。然后,使用OMX_FillThisBuffer()函数将解码器的输出缓冲区填充到解码器中,获取解码器的输出数据。 需要注意的是,使用OpenMAX调用Cedar硬解码MJPEG需要一定的编程经验和技能。此外,不同的硬件平台和驱动程序可能有所不同,因此在实际操作中需要注意相应的差异。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值