这篇文章我们将聚焦Control API的功能与用法,为实现OMX Core、Component打下坚实的基础。

1、OMX_Core.h

OMX Core在OpenMAX IL架构中的位置位于IL Client与实际的OMX组件之间,OMX Core提供了两组API给IL Client使用,一组API用于管理OMX组件,另一组API用于操作/使用创建的OMX组件。

1.1

OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_Init(void);
  • OMX_Init:OMX_Init用来初始化OMX Core,在第一次使用OMX组件前它需要先被调用,并且只被调用一次;初始化可能包含以下几个步骤:

    • 分配并初始化使用OMX组件所需的内存和资源;
    • 扫描系统中的所有可用OXM组件,并将它们加载到OMX Core中;
OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_Deinit(void);
  • OMX_Deinit:与OMX_Init功能相反,它用作于卸载OMX_Init加载的资源;
OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_ComponentNameEnum(
OMX_OUT OMX_STRING cComponentName,
OMX_IN OMX_U32 nNameLength,
OMX_IN OMX_U32 nIndex);
  • OMX_ComponentNameEnum:用于枚举OMX Core中可用的所有组件,该API包含三个参数,第一个参数cComponentName用于返回找到的组件名称(输出参数),第二个参数是字符串的长度(输入参数),第三个参数是遍历OMX Core组件列表的索引,通过递增索引并反复调用这个函数,就可以枚举出OMX Core中所有的组件名称,该API有两个作用:

    • 当需要查看 OMX Core 中有哪些可用的组件时,可以使用这个函数来获取所有组件的名称;
    • 当需要通过名称来查找特定的组件时,可以使用这个函数来对所有组件进行遍历,直到找到与给定名称匹配的组件;
OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_GetHandle(
OMX_OUT OMX_HANDLETYPE* pHandle,
OMX_IN OMX_STRING cComponentName,
OMX_IN OMX_PTR pAppData,
OMX_IN OMX_CALLBACKTYPE* pCallBacks);
  • OMX_GetHandle:用于创建一个OMX组件,返回的句柄就是我们前面学过的OMX_COMPONENTTYPE,该函数需要传递四个参数:

    • OMX_HANDLETYPE* pHandle:这是一个二级指针void**,用于接收创建的OMX_COMPONENTTYPE指针;
    • OMX_STRING cComponentName:组件名称,根据该名称创建对应的组件;
    • OMX_PTR pAppData:调用者(Application/IL Client)的指针;
    • OMX_CALLBACKTYPE* pCallBacks:给OMX_COMPONENTTYPE注册的回调函数,用于回传消息;
OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_FreeHandle(
OMX_IN OMX_HANDLETYPE hComponent);
  • OMX_FreeHandle:销毁创建的OMX组件,传入参数为OMX_HANDLETYPE hComponent
OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_SetupTunnel(
OMX_IN OMX_HANDLETYPE hOutput,
OMX_IN OMX_U32 nPortOutput,
OMX_IN OMX_HANDLETYPE hInput,
OMX_IN OMX_U32 nPortInput); OMX_API OMX_ERRORTYPE OMX_GetContentPipe(
OMX_OUT OMX_HANDLETYPE *hPipe,
OMX_IN OMX_STRING szURI);

这两个API Android中没有用到,暂不了解。

OMX_API OMX_ERRORTYPE OMX_GetComponentsOfRole (
OMX_IN OMX_STRING role,
OMX_INOUT OMX_U32 *pNumComps,
OMX_INOUT OMX_U8 **compNames);
  • OMX_GetComponentsOfRole:用于获取在给定role(角色)下可以使用的所有OMX组件的列表,包含三个参数:

    • OMX_STRING role:Role是用来描述OMX组件功能的字符串,每个OMX组件都拥有一个或多个角色,需要用role去指定OMX组件执行什么任务,role的名字规律"video_decoder.avc"、"audio_encoder.aac",第一个字段表示音频/视频,下划线后表示编码/解码,后缀表示具体的编解码类型;
    • OMX_U32 *pNumComps:输出参数,返回role对应的组件的数量;
    • OMX_U8 **compNames:输出参数,返回role对应的所有组件的名称
OMX_API OMX_ERRORTYPE OMX_GetRolesOfComponent (
OMX_IN OMX_STRING compName,
OMX_INOUT OMX_U32 *pNumRoles,
OMX_OUT OMX_U8 **roles);
  • OMX_GetRolesOfComponent:获取一个组件名对应的所有的Role,功能和OMX_GetComponentsOfRole类似;

根据OMX_Init和OMX_ComponentNameEnum等API中的描述,我们大致可以猜到,OMX Core中需要维护一个列表(map),列表中的内容是一组一组的Role和Component Name。

1.2

在OpenMAX IL框架设计中,IL Client不能直接访问OMX组件的函数,它需要调用OMX Core提供的宏来间接操作OMX组件。要注意的是,OMX Core没有为OMX组件的所有函数都提供宏,换言之有些OMX组件函数不是给IL Client使用的。

首先来看定义的宏:

#define OMX_SendCommand(                                    \
hComponent, \
Cmd, \
nParam, \
pCmdData) \
((OMX_COMPONENTTYPE*)(hComponent))->SendCommand( \
hComponent, \
Cmd, \
nParam, \
pCmdData)

OMX_SendCommand用于发送控制命令到组件,可用命令参考上文的枚举,该方法是非阻塞的,命令执行完成后需要发送callback通知IL Client。包含有四个参数:

  • hComponent:组件句柄;
  • Cmd:要发送的命令类型;
  • nParam:int类型的命令参数;
  • pCmdData:无法使用int表示的命令参数;
#define OMX_GetParameter(                                   \
hComponent, \
nParamIndex, \
pComponentParameterStructure) \
((OMX_COMPONENTTYPE*)(hComponent))->GetParameter( \
hComponent, \
nParamIndex, \
pComponentParameterStructure)

OMX_GetParameter用于从组件获取参数设置,该方法为阻塞调用:

  • nParamIndex:参数索引,用来指定获取什么参数;
  • pComponentParameterStructure:指针,用于装载获取到的参数;
#define OMX_SetParameter(                                   \
hComponent, \
nParamIndex, \
pComponentParameterStructure) \
((OMX_COMPONENTTYPE*)(hComponent))->SetParameter( \
hComponent, \
nParamIndex, \
pComponentParameterStructure)

OMX_SetParameter用于给组件设定参数,该方法为阻塞调用,参数功能与OMX_GetParameter类似。

#define OMX_GetConfig(                                      \
hComponent, \
nConfigIndex, \
pComponentConfigStructure) \
((OMX_COMPONENTTYPE*)(hComponent))->GetConfig( \
hComponent, \
nConfigIndex, \
pComponentConfigStructure) #define OMX_SetConfig( \
hComponent, \
nConfigIndex, \
pComponentConfigStructure) \
((OMX_COMPONENTTYPE*)(hComponent))->SetConfig( \
hComponent, \
nConfigIndex, \
pComponentConfigStructure)

OMX_GetConfig和OMX_SetConfig分别用于从组件获取配置、给组件设定配置,组件加载完成后可以

随时调用这两个方法,都是阻塞调用。不同于OMX_SetParameter设置的是组件的静态参数值,SetConfig设置的是运行时可更改的配置信息,例如视频的播放速度、音频的音量、视频的亮度等。

#define OMX_GetExtensionIndex(                              \
hComponent, \
cParameterName, \
pIndexType) \
((OMX_COMPONENTTYPE*)(hComponent))->GetExtensionIndex( \
hComponent, \
cParameterName, \
pIndexType)

OMX_GetExtensionIndex用于将OMX IL或厂商定义的扩展字符串转换为相应的结构体索引,该方法是阻塞的。许多音频和视频处理硬件具有特定的特性和特性,这些在OpenMAX IL标准中并未明确定义,为了使这些功能可以被利用,硬件厂商会提供特定的扩展;当应用程序需要访问这些特定的扩展功能时,就需要使用OMX_GetExtensionIndex来获取相关扩展的索引,然后使用这个索引去访问或者操作这些特定的扩展功能。

#define OMX_GetState(                                       \
hComponent, \
pState) \
((OMX_COMPONENTTYPE*)(hComponent))->GetState( \
hComponent, \
pState)

OMX_GetState用于获取组件的当前状态。

#define OMX_UseBuffer(                                      \
hComponent, \
ppBufferHdr, \
nPortIndex, \
pAppPrivate, \
nSizeBytes, \
pBuffer) \
((OMX_COMPONENTTYPE*)(hComponent))->UseBuffer( \
hComponent, \
ppBufferHdr, \
nPortIndex, \
pAppPrivate, \
nSizeBytes, \
pBuffer)

OMX_UseBuffer用于让组件使用由IL Client已经分配的buffer,或者使用tunneled组件已经提供的buffer。OMX_UseBuffer的实现应该分配出buffer header,并用参数填充它,最后通过ppBufferHdr返回。该方法是阻塞调用的,可以在LoadedToIdle状态下使用,也可在OMX_StateExecuting、OMX_StateIdle且端口被禁用的情况下使用。

关注公众号《青山渺渺》 获取更多音视频开发内容

Android Media Framework(三)OpenMAX API阅读与分析的更多相关文章

  1. 【Android】完善Android学习(三:API 3.0)

    备注:之前Android入门学习的书籍使用的是杨丰盛的<Android应用开发揭秘>,这本书是基于Android 2.2API的,目前Android已经到4.4了,更新了很多的API,也增 ...

  2. Android Media (Audio) Framework 多媒体系统框架

    http://blog.csdn.net/lskshz/article/details/17264113 原址:http://blog.csdn.net/myzhzygh/article/detail ...

  3. Android media媒体库分析之:MediaProvider

    在做Android媒体应用程序时(Audio.Image.Video)需要对Android的媒体提供者(MediaProvider)做详细的分析,下面记录一下我的收获: 一.获取MediaProvid ...

  4. Android 9 新功能 及 API 介绍(提供了实用的模块化的功能支持,包括 人工智能)

      Android 9(API 级别 28)为用户和开发者引入了众多新特性和新功能. 本文重点介绍面向开发者的新功能. 要了解新 API,请阅读 API 差异报告或访问 Android API 参考. ...

  5. 【多端应用开发系列1.1.1 —— Android:使用新浪API V2】服务器Json数据处理——Json数据概述

    [前白] 一些基础的东西本系列中就不再详述了,争取尽量写些必不可少的技术要点. 由于本系列把Web Service 构建放到了第二部分,Android项目就采用新浪微博API v2作为服务器端. [原 ...

  6. Android 8.0 功能和 API

    Android 8.0 为用户和开发者引入多种新功能.本文重点介绍面向开发者的新功能. 用户体验 通知 在 Android 8.0 中,我们已重新设计通知,以便为管理通知行为和设置提供更轻松和更统一的 ...

  7. 【Android】完善Android学习(六:API 4.0)

    备注:之前Android入门学习的书籍使用的是杨丰盛的<Android应用开发揭秘>,这本书是基于Android 2.2API的,目前Android已经到4.4了,更新了很多的API,也增 ...

  8. 【Android】完善Android学习(五:API 3.2)

    备注:之前Android入门学习的书籍使用的是杨丰盛的<Android应用开发揭秘>,这本书是基于Android 2.2API的,目前Android已经到4.4了,更新了很多的API,也增 ...

  9. 【Android】完善Android学习(一:API 2.3.3)

    备注:之前Android入门学习的书籍使用的是杨丰盛的<Android应用开发揭秘>,这本书是基于Android 2.2API的,目前Android已经到4.4了,更新了很多的API,也增 ...

  10. grape动态PHP结构(三)——API接口

    一.app视图与控制器

随机推荐

  1. 在Windows电脑上快速运行AI大语言模型-Llama3

    概述 近期 Meta 发布了最新的 Llama3 模型,并开源了开源代码.Meta Llama 3 现已推出 8B 和 70B 预训练和指令调整版本,可支持广泛的应用程序. 并且 Llama 3 在语 ...

  2. 力扣1077(MySQL)-项目员工Ⅲ(中等)

    题目: 写 一个 SQL 查询语句,报告在每一个项目中经验最丰富的雇员是谁.如果出现经验年数相同的情况,请报告所有具有最大经验年数的员工. 查询结果格式在以下示例中: employee_id 为 1 ...

  3. 力扣1768(java&python)-交替合并字符串(简单)

    题目: 给你两个字符串 word1 和 word2 .请你从 word1 开始,通过交替添加字母来合并字符串.如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾. 返回 合并后的 ...

  4. 牛客网-SQL专项训练18

    ①在下列sql语句错误的是?B 解析: 在sql中若要取得NULL,则必须通过IS NULL或者IS NOT NULL进行获取,无法直接使用等号. 一个等号(=)表示把1赋值给变量啊 ==:称为等值符 ...

  5. 即学即会 Serverless | 初识 Serverless

    简介:Serverless 架构被越来越多的业务所采纳,成为其技术选型,大多数开发者已经跨越对 Serverless 概念了解,切实向落地实践出发.本文带大家一探究竟,为什么说 Serverless ...

  6. DTCC 2020 | 阿里云王涛:阿里巴巴电商数据库上云实践

    简介: 第十一届中国数据库技术大会(DTCC2020),在北京隆重召开.大会以"架构革新 高效可控"为主题,重点围绕数据架构.AI与大数据.传统企业数据库实践和国产开源数据库等内容 ...

  7. 数据智能构建管理平台Dataphin V2.9.4.3版本发布

    简介: Dataphin发布V2.9.4.3版本升级多项产品能力,该版本在产品功能和用户体验上都进行了优化和提升,旨在为用户提供更完善的产品能力和体验,以加速企业数据中台建设进程. -更多关于数智化转 ...

  8. [FAQ] 阿里云一口价域名购买之后在哪里看

    进入控制台,产品和服务中找到"域名",进去后在左侧菜单有 "已买到的域名". 如图: Link:https://www.cnblogs.com/farwish/ ...

  9. [PHP] Laravel cast array 数据库存 json 时的 unicode 编码问题

    在模型上设置 accessor 和 mutator,将数组转为 json,并设置 json 选项. class User extends Model { public function setOpti ...

  10. cs61a回顾

    从1月25开始到2.20,完成第一个项目hog. 总结让自己进度慢的主观因素: 妄图一次阅读掌握所有知识:违反了<为什么学生不喜欢上学>中大脑不是用来思考的,它的真正作用在于使你避免思考的 ...