OpenMax框架

OpenMAX

open media acceleration:开放多媒体加速器。跨平台的软件抽象层,用来处理多媒体。
注意:这是一个标准,而不是具体的实现。

  1. openmax建立了三个层次上的标准。

    AL层:应用层。完全免费,跨平台的开放标准。提供创建,控制player和recorder对象;连接player,recoreder与配置输入和输出对象(content reader/writer,audio inputs/outputs,display windows)

    IL层:集成层。IL层的API定义了一套标准化的media组件接口,使得开发者和平台提供者去和以硬件或软件实现的多媒体编解码器相互集成和交流

    DL层:开发层。DL层的APIs包含了一套综合的audio,video和imaging 函数接口。这套接口可以在最新的CPUs,硬件引擎,和DSPs上实现和优化并用于更加广泛的加速编解码功能如: MPEG-4, H.264, MP3, AAC and JPEG


OpenMax IL层的接口定义由若干个头文件组成,这也是实现它需要实现的内容,它们的基本描述如下所示。

OMX_Types.h:OpenMax IL的数据类型定义

OMX_Core.h:OpenMax IL core的API

OMX_Component.h:OpenMax IL 组件相关的 API

OMX_Audio.h:音频相关的常量和数据结构

OMX_IVCommon.h:图像和视频公共的常量和数据结构

OMX_Image.h:图像相关的常量和数据结构

OMX_Video.h:视频相关的常量和数据结构

OMX_Other.h:其他数据结构(包括A/V 同步)

OMX_Index.h:OpenMax IL定义的数据结构索引

OMX_ContentPipe.h:内容的管道定义

提示:OpenMax标准只有头文件,没有标准的库,设置没有定义函数接口。对于实现者,需要实现的主要是包含函数指针的结构体


IL关键概念

Component:

代表了独立的功能单元,可以是:sources、sinks、codecs、filters、spliters、mixers。组件可以是硬件,软件,另外的处理器,或者是这些的结合体。一个IL组件包含如下几部分:

  1. 组件句柄:类似于文件描述符,通过这个句柄可以访问一组标准函数,这些函数允许client去获取或设置组件或端口设置选项、获取或设置组件的状态、向组件发送命令、接收消息通知、分配buffer、建立组件之间的连接
  2. 配置相关的结构体:设置和获取组件的各个属性
  3. port:用于组件之间相互通信
  4. Buffer:用于缓存输入输出到组件的数据的描述信息
  5. component event handle:组件事件句柄,用于向IL Client发送事件或消息—IL Client是用于综合管理所有组件的一个较高层次)
  6. 命令序列:存储和处理用户或程序输入的命令
  7. tunnel:组件之间进行通信的通路

在这里插入图片描述

IL Client:

可以是OpenMAX AL或一个应用程序。IL Client的核心是IL Core。通过IL core可以:

  1. 加载或卸载组件
  2. 在两个组件之间直接建立联系
  3. 访问组件的方法

  1. 概述

  2. omx il介绍和构架
    考虑一个系统需要实现4个不同的多媒体处理函数,记作f1,f2,f3,f4。这些函数可能来自于不同的厂商或者是一个组织中的不同团队开发者开发的。每一个函数可能对安装和卸载有不同的要求,可能有不同的方法去执行配置和数据传输。amx il的api提供了一种方式将这些函数,singlu或者逻辑组封装为组件。这些api包含一套标准的协议使得来自于不同开发商/团队合规的组件彼此之间交换数据。

2.1 系统组件

​ omx框架中有三种数据传输方式

​ non-tunneled:用于omx il client与component之间交换数据buffers

​ tunneled:用于组件之间进行数据buffers的交换

​ proprietary:组件之间直接的数据交换(不用buffer)

2.2 隧道化buffer分配

2.3 组件状态
在这里插入图片描述

​ 所有组件首先都是处于unloaded状态,从unloaded转为loaded状态必须由omx il core来完成,然后其他状态就可以由组件数据交流来完成转换。

2.4 组件结构

在这里插入图片描述

2.5 数据交流方式

2.6 端口重连

2.7 队列和刷新

2.8 标记buffer

2.9 事件和回调

​ 组件可以发送6种事件给il client
在这里插入图片描述

2.10 buffer payload

2.11 buffer的flag和时间戳

2.12 同步

2.13 速率控制

2.14 组件注册

  1. omx il控制api
    3.1 omx il的数据类型
    枚举类型:

​ OMX_COMMANDTYPE
在这里插入图片描述

​ OMX_STATETYPE
在这里插入图片描述

​ OMX_ERRORTYPE
在这里插入图片描述
在这里插入图片描述

​ OMX_EVENTTYPE
​ OMX_BUFFERSUPPLIERTYPE
​ 结构体类型:
​ OMX_COMPONENTREGISTERTYPE
​ OMX_COMPONENTINITTYPE
​ OMX_VERSIONTYPE
​ OMX_PRIORITYMGMTTYE
​ OMX_RESOURCECOCEALMENTTYPE
​ OMX_BUFFERHEADERTYPE
​ OMX_PORT_PARAM_TYPE
​ …
3.2 omx il core的方法和宏(//omx il core是组件的管理者。是一个中间层,处于omx il client和components之间,实现了client想要使用的主要接口,为了效率考虑,omx il定义了一系列的核心宏,一对一映射到了omx il的组件方法。)

​ 宏:

​ OMX_GetComponentVersion

​ OMX_SendCommand

​ OMX_CommandStateSet

​ OMX_CommandFlush

​ OMX_CommandPortDisable

​ OMX_CommandPortEnable

​ OMX_CommandMarkBuffer

​ OMX_GetParameter:从组件获得参数设置

​ OMX_SetParameter:设置组件参数设置

​ OMX_GetConfig:

​ OMX_SetConfig

​ OMX_GetExtensionIndex:

​ OMX_GetState:获得组件的状态

​ OMX_UseBuffer

​ OMX_AllocateBuffer

​ OMX_FreeBuffer

​ OMX_EmptyThisBuffer

​ OMX_FillThisBuffer

​ OMX_UseEGLImage

​ 函数:
​ omx_init:初始化整个omx il core接口层
​ omx_deinit:销毁core接口层
​ omx_componentnameenum
​ omx_gethandle:获得一个omx il组件的句柄
​ omx_freehandle:释放一个omx il组件的句柄
​ omx_setuptunnel:在组件之间建立起一个数据通道
​ omx_getcontentpipe:获得一个内容导管
3.3 omx il组件的相关方法和数据结构

​ pComponentPrivate(指针)

​ pApplicationPrivate(指针)

​ getcomponentversion:omx il client通过omx_getcomponentversion宏来调用这个函数
​ sendcommand:client通过core对应宏来调用该函数
​ getparameter
​ setparameter
​ getconfig
​ setconfig
​ getstate

​ componenttunnelrequest:获取组件间的tunnel是否可用

​ userbuffer
​ allocatebuffer
​ freebuffer
​ emptythisbuffer
​ fillthisbuffer
​ setcallbacks

  1. omx il数据api

  2. omx il组件扩展api

  3. 同步

  4. 容器解析

  5. 标准组件

  6. 内容管道

  7. 实现缓冲区共享

OMX IL初始化流程

  1. omx_init、omx_componentnameenum

  2. omx_gethandle 创建组件,返回组件句柄

  3. 调用OMX_SetParameter和OMX_IndexParamStandardComponentRole这个index去设置组件的role

  4. 调用omx_setparameter和OMX_IndexParamSetResourceInfo这个index去设置组件的resource信息

  5. 调用omx_setparameter和OMX_IndexParamVideoPortFormat这个index设置组件输入输出port的format

  6. OMX_IndexParamPortDefinition设置组件port的通用属性

    1)调用OMX_GetParameter获取输入端口缓冲参数(最小/实际缓冲区数目,缓冲区大小等等)
    2)检查有效的输入缓冲参数(修改一些参数,比如帧的长度和宽度,以及缓冲区的数目等等)
    3)调用OMX_SetParameter函数设置输入缓冲参数
    4)调用OMX_GetParameter获取输出端口缓冲参数(最小/实际缓冲区数目,缓冲区大小等等)
    5)检查有效的输出缓冲参数(修改一些参数,比如帧的长度和宽度,以及缓冲区的数目等等)
    6)调用OMX_SetParameter函数设置输出缓冲参数

  7. omx_setcommand将组件状态从loaded转为idle状态

  8. 为输入输出port的缓冲区分配内存omx_usebuffer或OMX_AllocateBuffer

  9. 组件状态转为executing,开始工作

  10. omx_emptybuffer===omx_emptybufferdone

  11. omx_fillthisbuffer===omx_fillthisbufferdone

Android系统使用OMX框架实现音视频操作

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值