Opencore and OMX core/component interaction (一)

在这里讲的是Opencore和OMX 的调用sequence,基本来说是根据OMX的API过程来实现的,属于将OMX集成到Opencore的原理 部分
对于omx IL的API,大家可以参考http://omxil.sourceforge.net/docs/modules.html 

Opencore and OMX core/component interaction 

 

1 、将一个 CODEC 集成到 PV Opencore multimedia framewok 下的方式主要有三种:作为一个 compressed MIO(media I/O) component ,或者作为个 node ,或者作为一个 Openmax component 集成到 Opencore framework 下的 Openmax codecs nodes 。对于各种codec 尤其是那些包含了 HW acceleratin  codec 来说, Openmax IL interface 是最直接的和有效的集成方式,为上层提供统一的接口。

2 、具体 omx component  omxcore 的实现在 developer 文档在讨论,在这里只讨论 Opencore  omx core/component 的交互作用过程,即 call sequence  PVMF  omx 的调用大概可以用下面的图来描述:

 

所有这些过程都是通过 PVMF 来控制的,由 PVMF 发出 command 来控制 Opencore component 的状态转换。

3  Opencore  OMX core/component  interaction 过程分为下面几个过程,所有这些过程都是根据 API 的典型 sequence 来实现的。

3.1  PVMF  OMX 的调用首先是从对 OMX core 的初始化开始的:

 PVMF 首先调用 OMX_Init 来初始化 omx core

@ 然后 PVMF 会向 omx core 请求所有他所拥有的 component ,并根据获得的 component name ,来请求有效 component  role, 然后对有效的组件及其 role 建立一个 registry 

OMX_Init() 用来对 omx core 进行初始化,它必须是进入 omx 前调用的第一个函数,而且在调用 deinit 之前只能被调用一次。

OMX_ComponentNameEnum() 实质上就是检测出 system run  time 时所有的有效 component 

OMX_GetRolesOfComponent() 实际上根据 component name 来取得 component 所支持的 role  number 

具体流程如下:

 

3.2 、完成对 omx core 的初始化之后就要根据开始获得的 comonent name ,对 omx component 进行初始化,并且列举出相应 component  capabilities 以及获得 port 目录。 PVMF 的工作流程如下:

@根据 component name  role 使用 OMX_GetHandle 来初始化指定的 omx component 

@使用所有权 index“PV_OMX_CAPABILITY_TYPE_INDEX” 根据 OMX_GetParameter() 取得 component  capabilities ,根据 capabilities 就可以知道 component 是否支持部分祯,是否支持 UseBuffer 或者 AllocateBuffer 等等内容。如果 OMX componentd 对所有权 index 返回“ OMX_ErrorUnsupportedIndex” 或者其他错误信息, PVMF 必须为 component capabilities 指定一组默认的数据 

@使用 OMX_GetParameter 来获得 Audio/Video component 的有效 port 数[ input/output port ],然后遍历所有的输入输出端口,来获得输入输出端口的索引。

PVMF 对“ PV_OMX_COMPONENT_CAPABILITY_TYPE_INDEX” index 的定义如下:

#define PV_OMX_COMPONENT_CAPABILITY_TYPE_INDEX 0xFF7A347

实际上所谓的 index 包括后面获取 Audio/Video component port 数使用的“ OMX_IndexAudioInit” 和“ OMX_IndexAudioInit” index 都是传到 OMX_GetParameter() 函数的第一个参数。

PVMF 需要从 component 取得的 capabilities 被包裹在下面的 structure 中,需要 component 对这个 structure 进行赋值:

typedef struct PV_OMXComponentCapabilityFlagsType

{

OMX_BOOL ilsOMXComponentMultiThreaded;

OMX_BOOL iOMXComponentSupportsExternalOutputBufferAlloc;

OMX_BOOL iOMXComponentSupportsExtrenalInputBufferAlloc;

OMX_BOOL iOMXComponentSupportsMovableInputBuffers;

OMX_BOOL iOMXComponentSupportsPartialFrames;

OMX_BOOL iOMXComponentUsesNALStartCode;

OMX_BOOL iOMXComponentCanHandleIncompleteFrames;

OMX_BOOL iOMXComponentUsesFullAVCFrames;

}

iIsOMXComponentMultiThread 默认值为 OMX_TRUE, 虽然 OMX component 一般运行在一个独立的线程,但是通过同步调用等方式也可以使其和 PVMF 运行在一个线程。

iOMXComponentSupportExternalOutput/inputBufferAlloc 的默认值为 OMX_TRUE  OMX spec 要求 OMX component 必须支持在外部分配的额外 buffer( 比如 OMX_UseBuffer 调用外部的 buffer) ,如果 Component 不支持这个,它必须将其值设为 OMX_FALSE ,并且和 PVMF 进行协商,从而使 PVMF 使用 OMX_AllocateBuffer 

IOMXComponentSupportsMovableInputBuffers 这个值默认也是 OMX_TRUE, 他类似于一种动态存储的概念,就是对于 external allocated input buffer ,可以将其的 omx 头部和实际数据进行分离,由 omx 头部的指针来指定实际数据的位置,如果这个指针可变,则 component 的可以访问不同的数据区域。如果 omx component 要求其起 header 总是指向同一个数据区域,则这个值必须设置  false 

iOMXComponentSupportsPartialFrames 这个值的默认值为 OMX_TRUE, 根其字面意义一样,就是 component 是否支持部分桢,当桢 /NAL 的大小大于 buffer 的大小的时候,必须把桢 /NAL 分割成几块, PVMF 会在每个桢的结束位添加“OMX_BUFFERFLAG_ENDOFFRAME”, 从而使桢的组装变得很简单,如果 component 需要由 PVMF 完成对祯 /NAL 的组装并提供给 component 完整的桢 /NAL, 则必须设置这个值为 false ,不支持部分桢会对性能造成很大的影响。

iOMXComponentUsesNALStartCode 这个值默认是 OMX_false ,这个标志位主要影响到 H264 的解码,主要是设计到 H264 NAL 格式的问题,就是说 PVMF 能够重构 H264  NAL ,不需要再让 omx component 来解些比特流,如果 OMX H264 component 要求解些比特流,需要提供 0x0001 NAL start codes ,则这个值必须设置为 true 

iOMXComponentCanHandleIncompleteFrames 这个值默认为 OMX_TRUE ,与对 partial 的支持不同,不完整的桢的是指由于丢包或其他原因导致的桢 /NAL 不完整,即已经被破坏的桢, comopnent 是否能提供恰当的处理,如果 component 不能相应的处理则必须设置这个值为 false 

iOMXComponentUsesFullAVCFrames 的值默认为 OMX_FALSE ,这个值定义了 PVMF 在使用 AVC 的情况下,以何种模式为 Component 提供数据。在 OMX_FALSE 情况下是采用 NAL mode ,即 PCMF 提供给 comonent 的数据是 NAL 单元,相反的在 OMX_TRUE 情况下采用的是Frame. mode ,在 Frame. mode 情况下 PVMF 必须将 NAL 单元累在一起,然后为 component 提供完整的一桢数据。

OMX_GetHandle() 根据 component name 载入指定的 component 到内存,并根据 component 的方法来为其创建一个 component  instance 

OMX_GetParameter() 这实际是一个宏,用来获得 component 的参数,根据第一个参数 handle pointer 的不同,可能返回值也是不同的。

具体过程如下:

 

3.3 完成对 omx core  omx component 的初始化之后,第三个过程就是对 omx component input/output buffer 的协商。

@首先使用 OMX_GetParameter() 获得 input/output port buffer parameters ,然后对获得的 parameters 进行一个 verify ,最后调用 OMX_SetParameter()  input/output port 设置一些 buffer parameters 

Component input/output port Buffer size 在很大程度上影响着 component 的性能,如果一个 buffer 能载入多个桢 /NAL 就不存在分割的问题, PVMF 在每个 full  /NAL 后面添加一个“ OMX_BUFFERFLAG_ENDOFFRAME” 标记。如果一个 buffer 不够容纳一个桢/NAL ,则不管是在输入还是输出都要把桢 /NAL 分割成多个 buffer ,并在最后一部分上打上一个 end flag 的标记。

 OMX API  OMX_AllocateBuffer  OMX_UseBuffer 的定义后觉得,所谓分配 buffer 就是, component 每次都要自己分配一个新的 buffer  buffer   header ,而使用 buffer ,是指可以使用其他 component 或者 IL client 分配好的 buffer ,但必须自己分配一个相应的 buffer   header ,两种方式

具体过程如下:

3.4 完成初始化以及对交换区 buffer 的协商之后, OMX component 就被 loaded 了,载入后的 component 首先要进入 Idle 状态。

@首先 PVMF 会通过 OMX_SendCommand 函数向 OMX component 发送状态改变命令 ,将其状态从 OMX_StateLoaded 变为 OMX_StateIdle 

@然后使用两种分配 buffer 方式 (use or allocate) 的任一种来为所有的 input/output port 分配 buffer ,分配 buffer 的函数会根据 NumInputBuffer  NumOutputBuffer 的值被调用多次 [ 这里有点小疑问,这个 Num 是不是就是 port 的数目? ]

@当 component 完成 state transition 以后,会通过 envenhandle callback 来通知 PVMF  OMX_EventCmdComplete )。

根据 OMX spec ,所有的标准 OMX component 必须支持 OMX_UseBuffer/Allocate 两种分配 buffer 的方式,如果由于内部限制等原因不支持的话, component 必须与 PVMF 进行协商。

一般来说 INPUT bufferes 一般分配在 component 外部,这样输入数据就可以省去不必要的 copy 操作。

具体过程如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据你提供的引用信息,"omx_core.c: No such file or directory"是一个文件或目录不存在的错误。这个错误可能是由于编译环境缺少必要的文件或目录导致的。根据引用中的信息,可能是由于缺少某个名为"/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-gcc"的文件或目录。另外,引用中的信息提到了内存分配的问题,这也可能导致文件或目录无法访问。 为了解决这个问题,你可以尝试以下几个步骤: 1. 确认编译环境是否完整:检查一下你的编译环境是否缺少了某些必要的文件或目录。确保"/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-gcc"文件或目录存在,并且具有正确的权限。 2. 检查内存使用情况:由于引用中提到了内存分配问题,你可以检查一下你的系统内存使用情况。如果系统内存不足,可能会导致无法分配足够的内存给编译过程,从而导致文件或目录无法访问。你可以尝试释放一些不必要的内存,或者增加系统内存容量。 3. 检查依赖库:根据引用中的信息,可能还存在一个缺少"libstdc.so.6"的问题。这可能是由于缺少某个依赖库文件导致的。你可以尝试安装或更新相应的依赖库,以确保编译过程中所需的库文件齐全。 请根据以上步骤逐一检查和解决问题,希望能帮到你。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Ubuntu16.04下搭建开发环境及编译tiny4412 Android系统](https://blog.csdn.net/zdf511391565/article/details/78363285)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值