Android Media Framework(二)OpenMAX 类型阅读与分析

news/2025/3/13 3:32:22/文章来源:https://www.cnblogs.com/rongmiao/p/18236333

OMX IL Spec将API划分为Control API、Data API、Extension API,所谓Control API指的是IL Client用于控制组件的接口,包含调用OMX Core和OMX Component要用的接口与相关结构体,这一篇我们将重点阅读与Control API相关的宏、结构体与枚举。

1、OMX IL目录结构

OMX IL API由一组头文件定义,包含以下内容:

  • OMX_Types.h:OMX使用的数据类型;
  • OMX_Core.h:OMX Core API以及相关结构体类型;
  • OMX_Component.h:OMX Component API以及相关结构体类型;
  • OMX_Audio.h:audio domain(域)相关的结构体,domain表示范围的意思,这里表示audio范围内的,后续将audio domain简称为audio;
  • OMX_IVCommon.h:audio、image和video公用的结构体;
  • OMX_Video.h:video相关的结构体;
  • OMX_Image.h:image相关的结构体;
  • OMX_Other.h:其他域用到的结构体;
  • OMX_Index.h:所有OMX定义的数据结构的索引,上面所说的所有结构体都有一个索引与之相对应;

在Android中,OMX IL API放在 frameworks/native/headers/media_plugin/media/openmax 目录下,进入目录可以看到包含所有上述提到的文件,除此之外还多了几个Ext结尾的文件,比如OMX_AudioExt.hOMX_VideoExt.h,与之相对应的要添加索引文件OMX_IndexExt.h,Ext表示扩展,意为这是Android在OMX IL基础上扩展的内容。

2、OMX_Types.h

OMX IL使用的基本数据类型存放在OMX_Types.h中,里面有一些宏定义,枚举和结构体,这里我们挑一些比较常见的来阅读。

OMX IL API在函数声明中使用宏参数功能进行描述:

  • OMX_IN:指定参数是一个输入参数,由调用者设定,由函数体读取;
  • OMX_OUT:指定参数是一个输出参数,参数值由函数体设定并回传给调用者,函数返回时调用者可以从参数中读到新的值,属于引用传递;
  • OMX_INOUT:指定函数调用者可以设置的参数类型为输入/输出参数,函数体可以读到参数值,也可以将

还有另外一个宏OMX_ALL,用于选择相同类型下的所有内容,在端口选择中会用到这个宏,表示选择所有端口。

接下来是一组typedef定义的数据类型:

typedef unsigned char       OMX_U8;
typedef signed char         OMX_S8;
typedef unsigned short      OMX_U16;
typedef signed short        OMX_S16;
typedef uint32_t            OMX_U32;
typedef int32_t             OMX_S32;
typedef unsigned long long  OMX_U64;
typedef signed long long    OMX_S64;typedef void*               OMX_PTR;
typedef char*               OMX_STRING;
typedef unsigned char*      OMX_BYTE;typedef OMX_PTR             OMX_HANDLETYPE;

上篇文章中提到组件句柄,它使用的类型是OMX_HANDLETYPE,在这我们可以知道组件句柄就是一个void*指针。

最后是一些枚举类型:

typedef enum OMX_DIRTYPE
{OMX_DirInput,              /**< Port is an input port */OMX_DirOutput,             /**< Port is an output port */OMX_DirMax = 0x7FFFFFFF
} OMX_DIRTYPE;

Dir是Direction的缩写,表示方向,用于表示端口数据的流向。如果数据向组件流入,端口用OMX_DirInput描述,表示输入端口;相对的如果数据从组件流出,用OMX_DirOutput表示输出端口。

为了跨平台OMX IL用枚举定义了布尔类型:

typedef enum OMX_BOOL {OMX_FALSE = 0,OMX_TRUE = !OMX_FALSE,OMX_BOOL_MAX = 0x7FFFFFFF
} OMX_BOOL;

3、OMX_Core.h

OMX Core API主要用于动态加载卸载组件,调用组件方法,所有调用组件用到的参数枚举、结构体类型,加载卸载函数,组件调用函数都存放在OMX_Core.h。

OMX_COMMANDTYPE包含了OMX IL可能发送给OMX组件的所有命令:

typedef enum OMX_COMMANDTYPE
{OMX_CommandStateSet,OMX_CommandFlush,OMX_CommandPortDisable,OMX_CommandPortEnable,OMX_CommandMarkBuffer,OMX_CommandKhronosExtensions = 0x6F000000,OMX_CommandVendorStartUnused = 0x7F000000,OMX_CommandMax = 0X7FFFFFFF
} OMX_COMMANDTYPE;

Android中常用的有:

  • OMX_CommandStateSet:用于改变组件的状态;
  • OMX_CommandFlush:刷新组件端口上的缓冲区队列;
  • OMX_CommandPortDisable:禁用组件的一个端口;
  • OMX_CommandPortEnable:启用组件的一个端口;
  • OMX_CommandVendorStartUnused:除了OMX IL定义的这些命令外,厂商也可以自定义命令,命令值从0x7F000001开始;
typedef enum OMX_STATETYPE
{OMX_StateInvalid,OMX_StateLoaded,OMX_StateIdle,OMX_StateExecuting,OMX_StatePause,OMX_StateWaitForResources,OMX_StateVendorStartUnused = 0x7F000000,OMX_StateMax = 0X7FFFFFFF
} OMX_STATETYPE;

OMX_STATETYPE定义了OMX组件的状态类型,Android中只用到了前四个:

  • OMX_StateInvalid:组件已损坏或遇到无法恢复的错误进入到该状态;
  • OMX_StateLoaded:组件加载/创建完成,但是资源还未分配,资源指的是端口中的buffer;
  • OMX_StateIdle:组件拥有所有的资源,但尚未传输任何缓冲区或开始处理数据;
  • OMX_StateExecuting:组件正在传输缓冲区并正在处理数据;

由于Android用到的状态只有四种,所以我把组件状态转换图做了简化:

image

图中的四个红色的状态并不是OMX IL的标准内容,所以在头文件中是找不到的,但是它们在spec中有所描述。组件做状态切换时可能要处理一些事务,事务处理完成后才能完成状态切换,红色状态描述的是处理事务的中间过程。

  • OMX_StateLoadedToIdle:当IL Client请求让组件从OMX_StateLoaded状态进入OMX_StateIdle状态时,组件在完成状态转换前需要获取到所有的资源(buffers),等待获取资源的过程用OMX_StateLoadedToIdle来描述。

组件连接IL Client的端口,端口中的buffer可由IL Client分配,通过调用OMX_UseBuffer将buffer传递给组件,也可由IL Client调用OMX_AllocateBuffer方法让组件来分配。

image

以上图为例,IL Client调用OMX_UseBuffer将buffer传递给OMX组件,OMX组件in port共享IL Client的buffer,in port获取到需要的资源;OMX组件out port由自己分配buffer,IL Client调用OMX_AllocateBuffer让组件分配出所要用的buffer,out port获取到需要的资源;当所有端口buffer获取完成,OMX组件即可进入Idle状态。

如果端口用于隧道模式,supplier port中的buffer可由自己分配,也可以复用其他buffer,简单来说我们并不在意供应端口的buffer是怎么来的;供应端口组件调用OMX_UseBuffer把buffer传递给非供应端口。

关注公众号《青山渺渺》阅读全文:
Android Media Framework(二)OpenMAX 类型阅读与分析

image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/721173.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

zabbix企业微信报警

1.微信报警原理流程注册微信企业号,通过企业号提供的信息ID、以及获取微信的API接口,就可以将服务器的报警数据,发给API,发给微信,发给关注这个公众号的所有用户、2.注册企业微信https://work.weixin.qq.com/wework_admin/frame3.修改通讯录组名4.创建自定义zabbix应用5.查…

Win 开机自启动顺序

所有 Windows 系列都没有提供调整开机自启动优先级的功能,但 Windows 可以间接延迟启动顺序。1:自启动方式 开机自启动一般有以下三种方式,启动顺序根据设置方式决定。 系统启动时执行的顺序大于用户登录时执行的顺序。方式 解释计划任务 用户登录时执行 和 系统启动时执行 …

zabbix钉钉报警

1.钉钉报警原理流程和微信报警类似,发送指定的数据到钉钉官方提供的API接口,钉钉会将报警信息,发送到指定的钉钉群聊,提醒所有的群成员查看,实现告警通知。具体操作流程 创建钉钉群聊 创建自定义机器人 创建报警关键词 生成webhook认证信息 开发报警脚本 填写zabbix-UI界面…

如何在Windows系统下配置最新的MinGW(GCC14)环境,同时应用到Dev-C++中

本文手把手地介绍了如何配置安装好最新的MinGW环境,然后进一步教了如何给Dev-C++加新的GCC编译器。如何在Windows系统下配置最新的MinGW(GCC14)环境,同时应用到Dev-C++中 前言 本教程只面向小白,目的是配置出一个Windows能用的新GCC环境,未深入涉及细节配置。 在访问文中…

Github Discussions使用指南(建议收藏)

序言 之所以想着翻译这篇文章,是因为我看到国内不管是开源爱好者,还是开发者都不怎么了解 Github Discussions,以致于在 Github 仓库中提问时,总是忘记使用这个好东西,或者问错地方。 翻译自:What is GitHub Discussions? A complete guide引言 GitHub Discussions 可将…

BUUCTF-Misc(111-120)

[UTCTF2020]File Carving 010editor打开发现了一个压缩包解压出来一个ELF文件我们拖到虚拟机去运行一下吧得到flag flag{2fbe9adc2ad89c71da48cabe90a121c0}二维码 参考: BUUCTF:二维码 - B0mbax - 博客园 (cnblogs.com) ps修复一下,我也不会,用的大佬的flag{7bf116c8ec2545…

spring security 指定了 failureForwardUrl 的请求接口 但是没有效果

springboot版本:3.3.0 spring security版本:3.3.0代码如下: spring security 配置类import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.buil…

C++和MySQL的连接

CPlusPlus-MySQL 这个项目是C++和MySQL连接的代码DEMO-V1这个是C语言的版本 DEMO-V2 这个是C++的版本找到你的数据库安装目录复制到你的工程里然后加一个查询景点信息管理员不用注册游客的预约预约成功之后要输出一个预约票显示预约人信息和预约时段取消修改预约和代预约好像也…

Gin框架下的JWT

Gin框架下的JWT 什么是JWT 我们都知道,HTTP协议是无状态的,click here,那么服务端怎么知道用户状态的呢(比如是否登录呢),这里就需要用到中间件来进行用户认证。 中间件认证有这么几种方式sessiontokentoken和session最大的区别就是token是存储在客户端的: 我们都知道,s…

实验6

实验1点击查看代码 // P286例8.17 // 对教材上的程序作了微调整,把输出学生信息单独编写成一个函数模块 // 打印不及格学生信息和所有学生信息程分别调用 #include <stdio.h> #include <string.h> #define N 10 // 运行程序输入测试时,可以把这个数组改小一些输…

[转][翻译]深入理解Win32结构化异常处理(一)

在所有的Win32操作系统提供的功能里,最常用但是描述最不全的(underdocument)恐怕就是结构化异常处理了(structured exception handling (SEH))。当你想到Win32的结构化异常处理,你会想到 _try, _finally, 和 _except这些东西,你可以从任何一本Win32的书中找到SEH的很好的…