OpenMax的接口与实现
OpenMax IL层的接口定义由若干个头文件组成,这也是实现它需要实现的内容,它们的基本描述如下所示。
OMX_Types.h:OpenMax Il的数据类型定义
OMX_Core.h:OpenMax IL核心的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标准只有头文件,没有标准的库,设置没有定义函数接口。对于实现者,需要实现的主要是包含函数指针的结构体。
其中,OMX_Component.h中定义的OMX_COMPONENTTYPE结构体是OpenMax IL层的核心内容,表示一个组件,其内容如下所示:
- typedef struct OMX_COMPONENTTYPE
- {
- OMX_U32 nSize; /* 这个结构体的大小 */
- OMX_VERSIONTYPE nVersion; /* 版本号 */
- OMX_PTR pComponentPrivate; /* 这个
组件的私有数据指针. */ - /* 调用者(IL client)设置的指针,用于保存它的
私有数据,传回给所有的回调函数 */ - OMX_PTR pApplicationPrivate;
- /* 以下的函数指针返回OMX_core.h中的对应内容 */
- OMX_ERRORTYPE (*GetComponentVersion)(
/* 获得组件的版本*/ - OMX_IN OMX_HANDLETYPE hComponent,
- OMX_OUT OMX_STRING pComponentName,
- OMX_OUT OMX_VERSIONTYPE* pComponentVersion,
- OMX_OUT OMX_VERSIONTYPE* pSpecVersion,
- OMX_OUT OMX_UUIDTYPE* pComponentUUID);
- OMX_ERRORTYPE (*SendCommand)(
/* 发送命令 */ - OMX_IN OMX_HANDLETYPE hComponent,
- OMX_IN OMX_COMMANDTYPE Cmd,
- OMX_IN OMX_U32 nParam1,
- OMX_IN OMX_PTR pCmdData);
- OMX_ERRORTYPE (*GetParameter)(
/* 获得参数 */ - OMX_IN OMX_HANDLETYPE hComponent,
- OMX_IN OMX_INDEXTYPE nParamIndex,
- OMX_INOUT OMX_PTR pComponentParameterStructure);
- OMX_ERRORTYPE (*SetParameter)(
/* 设置参数 */ - OMX_IN OMX_HANDLETYPE hComponent,
- OMX_IN OMX_INDEXTYPE nIndex,
- OMX_IN OMX_PTR pComponentParameterStructure);
- OMX_ERRORTYPE (*GetConfig)( /* 获得配置 */
- OMX_IN OMX_HANDLETYPE hComponent,
- OMX_IN OMX_INDEXTYPE nIndex,
- OMX_INOUT OMX_PTR pComponentConfigStructure);
- OMX_ERRORTYPE (*SetConfig)(
/* 设置配置 */ - OMX_IN OMX_HANDLETYPE hComponent,
- OMX_IN OMX_INDEXTYPE nIndex,
- OMX_IN OMX_PTR pComponentConfigStructure);
- OMX_ERRORTYPE (*GetExtensionIndex)(
/* 转换成OMX结构的索引 */ - OMX_IN OMX_HANDLETYPE hComponent,
- OMX_IN OMX_STRING cParameterName,
- OMX_OUT OMX_INDEXTYPE* pIndexType);
- OMX_ERRORTYPE (*GetState)(
/* 获得组件当前的状态 */ - OMX_IN OMX_HANDLETYPE hComponent,
- OMX_OUT OMX_STATETYPE* pState);
- OMX_ERRORTYPE (*ComponentTunnelRequest)(
/* 用于连接到另一个组件*/ - OMX_IN OMX_HANDLETYPE hComp,
- OMX_IN OMX_U32 nPort,
- OMX_IN OMX_HANDLETYPE hTunneledComp,
- OMX_IN OMX_U32 nTunneledPort,
- OMX_INOUT OMX_TUNNELSETUPTYPE* pTunnelSetup);
- OMX_ERRORTYPE (*UseBuffer)(
/* 为某个端口使用Buffer */ - OMX_IN OMX_HANDLETYPE hComponent,
- OMX_INOUT OMX_BUFFERHEADERTYPE** ppBufferHdr,
- OMX_IN OMX_U32 nPortIndex,
- OMX_IN OMX_PTR pAppPrivate,
- OMX_IN OMX_U32 nSizeBytes,
- OMX_IN OMX_U8* pBuffer);
- OMX_ERRORTYPE (*AllocateBuffer)(
/* 在某个端口分配Buffer */ - OMX_IN OMX_HANDLETYPE hComponent,
- OMX_INOUT OMX_BUFFERHEADERTYPE** ppBuffer,
- OMX_IN OMX_U32 nPortIndex,
- OMX_IN OMX_PTR pAppPrivate,
- OMX_IN OMX_U32 nSizeBytes);
- OMX_ERRORTYPE (*FreeBuffer)(
/*将某个端口Buffer释放*/ - OMX_IN OMX_HANDLETYPE hComponent,
- OMX_IN OMX_U32 nPortIndex,
- OMX_IN OMX_BUFFERHEADERTYPE* pBuffer);
- OMX_ERRORTYPE (*EmptyThisBuffer)(
/* 让组件消耗这个Buffer */ - OMX_IN OMX_HANDLETYPE hComponent,
- OMX_IN OMX_BUFFERHEADERTYPE* pBuffer);
- OMX_ERRORTYPE (*FillThisBuffer)(
/* 让组件填充这个Buffer */ - OMX_IN OMX_HANDLETYPE hComponent,
- OMX_IN OMX_BUFFERHEADERTYPE* pBuffer);
- OMX_ERRORTYPE (*SetCallbacks)(
/* 设置回调函数 */ - OMX_IN OMX_HANDLETYPE hComponent,
- OMX_IN OMX_CALLBACKTYPE* pCallbacks,
- OMX_IN OMX_PTR pAppData);
- OMX_ERRORTYPE (*ComponentDeInit)(
/* 反初始化组件 */ - OMX_IN OMX_HANDLETYPE hComponent);
- OMX_ERRORTYPE (*UseEGLImage)(
- OMX_IN OMX_HANDLETYPE hComponent,
- OMX_INOUT OMX_BUFFERHEADERTYPE** ppBufferHdr,
- OMX_IN OMX_U32 nPortIndex,
- OMX_IN OMX_PTR pAppPrivate,
- OMX_IN void* eglImage);
- OMX_ERRORTYPE (*ComponentRoleEnum)(
- OMX_IN OMX_HANDLETYPE hComponent,
- OMX_OUT OMX_U8 *cRole,
- OMX_IN OMX_U32 nIndex);
- } OMX_COMPONENTTYPE;
OMX_COMPONENTTYPE结构体实现后,其中的各个函数指针就是调用者可以使用的内容。各个函数指针和OMX_core.h中定义的内容相对应。
EmptyThisBuffer和FillThisBuffer是驱动组件运行的基本的机制,前者表示让组件消耗缓冲区,表示对应组件输入的内容;后者表示让组件填充缓冲区,表示对应组件输出的内容。
UseBuffer,AllocateBuffer,FreeBuffer为和端口相关的缓冲区管理函数,对于组件的端口有些可以自己分配缓冲区,有些可以使用外部的缓冲区,因此有不同的接口对其进行操作。
SendCommand表示向组件发送控制类的命令。GetParameter,SetParameter,GetConfig,SetConfig几个接口用于辅助的参数和配置的设置和获取。
ComponentTunnelRequest用于组件之间的隧道化连接,其中需要制定两个组件及其相连的端口。
ComponentDeInit用于组件的反初始化。
提示:OpenMax函数的参数中,经常包含OMX_IN和OMX_OUT等宏,它们的实际内容为空,只是为了标记参数的方向是输入还是输出。
OMX_Component.h中端口类型的定义为OMX_PORTDOMAINTYPE枚举类型,内容如下所示:
- typedef enum OMX_PORTDOMAINTYPE {
- OMX_PortDomainAudio, /* 音频类型端口 */
- OMX_PortDomainVideo, /* 视频类型端口 */
- OMX_PortDomainImage, /* 图像类型端口 */
- OMX_PortDomainOther, /* 其他类型端口 */
- OMX_PortDomainKhronosExtensions
=
0x6F000000
, - OMX_PortDomainVendorStartUnused
=
0x7F000000 - OMX_PortDomainMax
=
0x7ffffff - } OMX_PORTDOMAINTYPE;
音频类型,视频类型,图像类型,其他类型是OpenMax IL层此所定义的四种端口的类型。
端口具体内容的定义使用OMX_PARAM_PORTDEFINITIONTYPE类(也在OMX_Component.h中定义)来表示,其内容如下所示:
- typedef struct OMX_PARAM_PORTDEFINITIONTYPE {
- OMX_U32 nSize; /* 结构体大小 */
- OMX_VERSIONTYPE nVersion; /* 版本*/
- OMX_U32 nPortIndex; /* 端口号 */
- OMX_DIRTYPE eDir; /* 端口的方向 */
- OMX_U32 nBufferCountActual; /* 为这
个端口实际分配的Buffer的数目 */ - OMX_U32 nBufferCountMin; /* 这个
端口最小Buffer的数目*/ - OMX_U32 nBufferSize; /* 缓冲区的字节数 */
- OMX_BOOL bEnabled; /* 是否使能 */
- OMX_BOOL bPopulated; /* 是否在填充 */
- OMX_PORTDOMAINTYPE eDomain; /* 端口的类型 */
- union { /* 端口实际
的内容,由类型确定具体结构 */ - OMX_AUDIO_PORTDEFINITIONTYPE audio;
- OMX_VIDEO_PORTDEFINITIONTYPE video;
- OMX_IMAGE_PORTDEFINITIONTYPE image;
- OMX_OTHER_PORTDEFINITIONTYPE other;
- } format;
- OMX_BOOL bBuffersContiguous;
- OMX_U32 nBufferAlignment;
- } OMX_PARAM_PORTDEFINITIONTYPE;
对于一个端口,其重点的内容如下。
端口的方向(OMX_DIRTYPE):包含OMX_DirInput(输入)和OMX_DirOutput(输出)两种
端口分配的缓冲区数目和最小缓冲区数目
端口的类型(OMX_PORTDOMAINTYPE):可以是四种类型
端口格式的数据结构:使用format联合体来表示,具体由四种不同类型来表示,与端口的类型相对应
OMX_AUDIO_PORTDEFINITIONTYPE,OMX_VIDEO_PORTDEFINITIONTYPE,OMX_IMAGE_PORTDEFINITIONTYPE 和OMX_OTHER_PORTDEFINITIONTYPE等几个具体的格式类型,分别在 OMX_Audio.h,OMX_Video.h,OMX_Image.h和OMX_Other.h这四个头文件中定义。
OMX_BUFFERHEADERTYPE是在OMX_Core.h中定义的,表示一个缓冲区的头部结构。
OMX_Core.h中定义的枚举类型OMX_STATETYPE命令表示OpenMax的状态机,内容如下所示:
- typedef enum OMX_STATETYPE
- {
- OMX_StateInvalid, /* 组件监
测到内部的数据结构被破坏 */ - OMX_StateLoaded, /* 组件被
加载但是没有完成初始化 */ - OMX_StateIdle, /* 组件初
始化完成,准备开始 */ - OMX_StateExecuting, /* 组件接受了
开始命令,正在树立数据 */ - OMX_StatePause, /* 组件接受暂停命令*/
- OMX_StateWaitForResources, /* 组件正在等待资源 */
- OMX_StateKhronosExtensions
=
0x6F000000
, /* 保留 */ - OMX_StateVendorStartUnused
=
0x7F000000
, /* 保留 */ - OMX_StateMax
=
0X7FFFFFFF - } OMX_STATETYPE;
OpenMax组件的状态机可以由外部的命令改变,也可以由内部发生的情况改变。OpenMax IL组件的状态机的迁移关系如图18-6所示。
|
| 图18-6 OpenMax IL组件的状态机的迁移关系 |
OMX_Core.h中定义的枚举类型OMX_COMMANDTYPE表示对组件的命令类型,内容如下所示:
- typedef enum OMX_COMMANDTYPE
- {
- OMX_CommandStateSet, /* 改变状态机器 */
- OMX_CommandFlush, /* 刷新数据队列 */
- OMX_CommandPortDisable, /* 禁止端口 */
- OMX_CommandPortEnable, /* 使能端口 */
- OMX_CommandMarkBuffer, /* 标
记组件或Buffer用于观察 */ - OMX_CommandKhronosExtensions
=
0x6F000000
, /* 保留 */ - OMX_CommandVendorStartUnused
=
0x7F000000
, /* 保留 */ - OMX_CommandMax
=
0X7FFFFFFF - } OMX_COMMANDTYPE;
OMX_COMMANDTYPE类型在SendCommand调用中作为参数被使用,其中OMX_CommandStateSet就是改变状态机的命令。
对于OpenMax IL层的实现,一般的方式并不调用OpenMax DL层。具体实现的内容就是各个不同的组件。OpenMax IL组件的实现包含以下两个步骤。
组件的初始化函数:硬件和OpenMax数据结构的初始化,一般分成函数指针初始化、私有数据结构的初始化、端口的初始化等几个步骤,使用其中的 pComponentPrivate成员保留本组件的私有数据为上下文,最后获得填充完成OMX_COMPONENTTYPE类型的结构体
OMX_COMPONENTTYPE类型结构体的各个指针:实现其中的各个函数指针,需要使用私有数据的时候,从其中的pComponentPrivate得到指针,转化成实际的数据结构使用
端口的定义是OpenMax IL组件对外部的接口。OpenMax IL常用的组件大都是输入和输出端口各一个。对于最常用的编解码(Codec)组件,通常需要在每个组件的实现过程中,调用硬件的编解码接口来实现。在组 件的内部处理中,可以建立线程来处理。OpenMax的组件的端口有默认参数,但也可以在运行时设置,因此一个端口也可以支持不同的编码格式。音频编码组 件的输出和音频编码组件的输入通常是原始数据格式(PCM格式),视频编码组件的输出和视频编码组件的输入通常是原始数据格式(YUV格式)。
提示:在一种特定的硬件实现中,编解码部分具有相似性,因此通常可以构建一个OpenMax组件的"基类"或者公共函数,来完成公共性的操作。
OpenMax的接口与实现的更多相关文章
- Android Multimedia框架总结(十三)CodeC部分之OpenMAX框架初识及接口与适配层实现
转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52629598 前言:上篇中介绍O ...
- Android多媒体开发-- OpenMax IL简介
1.openmax 简介 http://www.khronos.org/openmax/ OpenMax是一个多媒体应用程序的框架标准,由NVIDIA公司和Khronos在2006年推出. OpenM ...
- OpenMax概述
一.OpenMax简介 OpenMAX是一个多媒体应用程序的标准.由NVIDIA公司和Khronos™在2006年推出. 它是无授权费的.跨平台的C语言程序接口序列,这些接口对音频.视频.静态图片的常 ...
- Android多媒体开发-stagefright及AwesomePlayer相关知识梳理
android的多媒体框架中, stagefright其实是AwesomePlayer的代理,就是个皮包公司. status_t StagefrightPlayer::setDataSource( c ...
- 【第一篇章-android平台buffer播放探索】native media
在android平台,从4.0开始,提出了openmax架构,所以在DNK的R7版本中有了openmax AL层播放的DEMO即native media,这个DEMO就是读本地文件,然后把所读buff ...
- 几个平台环境里视频编解码和图像scale的硬件加速的方法
记录一下遇到几个平台里的视频编解码和图像scale的硬件加速的方法 1,intel平台当包含GEN系列的集成GPU时,可用libva实现视频codec.颜色空间转换和图像scale的硬件加速,具体可使 ...
- android openmax hardware decoder 整合记录
欢迎访问我的blog:http://blog.thinkinside.me 关于android中openmax中hardware decoder的调用中,整合过程比较简单.主要是对OMXCodec的封 ...
- Android多媒体开发-- android中OpenMax的实现整体框架
1.android中用openmax来干啥? android中的AwesomePlayer就 是用openmax来做(code)编解码,其实在openmax接口设计中,他不光能用来当编解码.通过他的组 ...
- vlc源码分析(六) 调用OpenMAX硬解码H.265
H.265(HEVC)编码格式能够在得到相同编码质量视频的前提下,使用相当于H.264(AVC)一半的存储容量,虽然H.265的算法复杂度比H.264高一个数量级,但是硬件水平在不断提高,因此H.26 ...
随机推荐
- logstash结合es,日志收集
1.下载好logstash后,解压目录 2.进入bin目录,新建文件 logstash_default.conf input { tcp { port => 4560 codec => & ...
- PHP+MySql实现图书管理系统
这个图书管理系统是我学完PHP时写的一个练手项目,功能参考了自己学校的图书管理系统.为了锻炼自己的动手能力以及加深对代码的理解,前端和后端均由自己完成,前端使用了一些基本的框架(毕竟我主攻后端开发方向 ...
- js控制input text字符键入/字符长度限制/字母自动大写
功能: 1.仅允许指定字符键入 2.限制长度 实现代码: <input type="text" style="width: 6em" name=" ...
- @media print样式 关于table断页
<html> <head> <style> @media print { table { page-break-after:auto } tr { page-bre ...
- 利用setTimeoutc处理javascript ajax请求超时
用过jquery的人都知道里面的$.ajax能设置超时处理及各种错误的抛出,确实好用.原生的js没有对应的方法,还得写各种兼容.在实际运用中,不管请求是否成功都应该做容错处理, 不然用户不知道到底发生 ...
- Qt 资料大全
https://blog.csdn.net/liang19890820/article/details/51752029 简述 发福利了.发福利了.发福利了,重要的事情说三遍... 为了方便更多Qte ...
- Oracle基础之Merge into
Merge into语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句. 通过MERGE语句,根据一张表或多表联合查询的连接条件对另外一张表进行查询,连接条件匹配上的进行UPDA ...
- 微软发布Azure Stack第一个技术预览版
为了提升商业灵敏度和加快创新步伐,各个企业都在迅速地转向云服务.在微软,我们已经见到微软智能云Azure的飞速发展和使用,每月我们都有近十万的新增订阅量.然而,我们也了解到还有很多企业在完全移到公有云 ...
- 【Leetcode】【Medium】Two Sum
Given an array of integers, find two numbers such that they add up to a specific target number. The ...
- 定制UITabBar显示样式
定制UITabBar显示样式 思路是这样子的: 1. 初始化UITabBarController,并装载进来几个其他的ViewController 2. 获取每个控制器的UITabBarItem 3. ...