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层的核心内容,表示一个组件,其内容如下所示:

  1. typedef struct OMX_COMPONENTTYPE
  2. {
  3. OMX_U32 nSize;                          /* 这个结构体的大小 */
  4. OMX_VERSIONTYPE nVersion;           /* 版本号 */
  5. OMX_PTR pComponentPrivate;          /* 这个
    组件的私有数据指针. */
  6. /* 调用者(IL client)设置的指针,用于保存它的
    私有数据,传回给所有的回调函数 */
  7. OMX_PTR pApplicationPrivate;
  8. /* 以下的函数指针返回OMX_core.h中的对应内容 */
  9. OMX_ERRORTYPE (*GetComponentVersion)(       
    /* 获得组件的版本*/
  10. OMX_IN  OMX_HANDLETYPE hComponent,
  11. OMX_OUT OMX_STRING pComponentName,
  12. OMX_OUT OMX_VERSIONTYPE* pComponentVersion,
  13. OMX_OUT OMX_VERSIONTYPE* pSpecVersion,
  14. OMX_OUT OMX_UUIDTYPE* pComponentUUID);
  15. OMX_ERRORTYPE (*SendCommand)(               
    /* 发送命令 */
  16. OMX_IN  OMX_HANDLETYPE hComponent,
  17. OMX_IN  OMX_COMMANDTYPE Cmd,
  18. OMX_IN  OMX_U32 nParam1,
  19. OMX_IN  OMX_PTR pCmdData);
  20. OMX_ERRORTYPE (*GetParameter)(               
    /* 获得参数 */
  21. OMX_IN  OMX_HANDLETYPE hComponent,
  22. OMX_IN  OMX_INDEXTYPE nParamIndex,
  23. OMX_INOUT OMX_PTR pComponentParameterStructure);
  24. OMX_ERRORTYPE (*SetParameter)(                
    /* 设置参数 */
  25. OMX_IN  OMX_HANDLETYPE hComponent,
  26. OMX_IN  OMX_INDEXTYPE nIndex,
  27. OMX_IN  OMX_PTR pComponentParameterStructure);
  28. OMX_ERRORTYPE (*GetConfig)(                         /* 获得配置 */
  29. OMX_IN  OMX_HANDLETYPE hComponent,
  30. OMX_IN  OMX_INDEXTYPE nIndex,
  31. OMX_INOUT OMX_PTR pComponentConfigStructure);
  32. OMX_ERRORTYPE (*SetConfig)(                    
    /* 设置配置 */
  33. OMX_IN  OMX_HANDLETYPE hComponent,
  34. OMX_IN  OMX_INDEXTYPE nIndex,
  35. OMX_IN  OMX_PTR pComponentConfigStructure);
  36. OMX_ERRORTYPE (*GetExtensionIndex)(            
    /* 转换成OMX结构的索引 */
  37. OMX_IN  OMX_HANDLETYPE hComponent,
  38. OMX_IN  OMX_STRING cParameterName,
  39. OMX_OUT OMX_INDEXTYPE* pIndexType);
  40. OMX_ERRORTYPE (*GetState)(                   
    /* 获得组件当前的状态 */
  41. OMX_IN  OMX_HANDLETYPE hComponent,
  42. OMX_OUT OMX_STATETYPE* pState);
  43. OMX_ERRORTYPE (*ComponentTunnelRequest)(      
    /* 用于连接到另一个组件*/
  44. OMX_IN  OMX_HANDLETYPE hComp,
  45. OMX_IN  OMX_U32 nPort,
  46. OMX_IN  OMX_HANDLETYPE hTunneledComp,
  47. OMX_IN  OMX_U32 nTunneledPort,
  48. OMX_INOUT  OMX_TUNNELSETUPTYPE* pTunnelSetup);
  49. OMX_ERRORTYPE (*UseBuffer)(                    
    /* 为某个端口使用Buffer */
  50. OMX_IN OMX_HANDLETYPE hComponent,
  51. OMX_INOUT OMX_BUFFERHEADERTYPE** ppBufferHdr,
  52. OMX_IN OMX_U32 nPortIndex,
  53. OMX_IN OMX_PTR pAppPrivate,
  54. OMX_IN OMX_U32 nSizeBytes,
  55. OMX_IN OMX_U8* pBuffer);
  56. OMX_ERRORTYPE (*AllocateBuffer)(         
    /* 在某个端口分配Buffer */
  57. OMX_IN OMX_HANDLETYPE hComponent,
  58. OMX_INOUT OMX_BUFFERHEADERTYPE** ppBuffer,
  59. OMX_IN OMX_U32 nPortIndex,
  60. OMX_IN OMX_PTR pAppPrivate,
  61. OMX_IN OMX_U32 nSizeBytes);
  62. OMX_ERRORTYPE (*FreeBuffer)(            
    /*将某个端口Buffer释放*/
  63. OMX_IN  OMX_HANDLETYPE hComponent,
  64. OMX_IN  OMX_U32 nPortIndex,
  65. OMX_IN  OMX_BUFFERHEADERTYPE* pBuffer);
  66. OMX_ERRORTYPE (*EmptyThisBuffer)(            
    /* 让组件消耗这个Buffer */
  67. OMX_IN  OMX_HANDLETYPE hComponent,
  68. OMX_IN  OMX_BUFFERHEADERTYPE* pBuffer);
  69. OMX_ERRORTYPE (*FillThisBuffer)(             
    /* 让组件填充这个Buffer */
  70. OMX_IN  OMX_HANDLETYPE hComponent,
  71. OMX_IN  OMX_BUFFERHEADERTYPE* pBuffer);
  72. OMX_ERRORTYPE (*SetCallbacks)(              
    /* 设置回调函数 */
  73. OMX_IN  OMX_HANDLETYPE hComponent,
  74. OMX_IN  OMX_CALLBACKTYPE* pCallbacks,
  75. OMX_IN  OMX_PTR pAppData);
  76. OMX_ERRORTYPE (*ComponentDeInit)(            
    /* 反初始化组件 */
  77. OMX_IN  OMX_HANDLETYPE hComponent);
  78. OMX_ERRORTYPE (*UseEGLImage)(
  79. OMX_IN OMX_HANDLETYPE hComponent,
  80. OMX_INOUT OMX_BUFFERHEADERTYPE** ppBufferHdr,
  81. OMX_IN OMX_U32 nPortIndex,
  82. OMX_IN OMX_PTR pAppPrivate,
  83. OMX_IN void* eglImage);
  84. OMX_ERRORTYPE (*ComponentRoleEnum)(
  85. OMX_IN OMX_HANDLETYPE hComponent,
  86. OMX_OUT OMX_U8 *cRole,
  87. OMX_IN OMX_U32 nIndex);
  88. } 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枚举类型,内容如下所示:

  1. typedef enum OMX_PORTDOMAINTYPE {
  2. OMX_PortDomainAudio,        /* 音频类型端口 */
  3. OMX_PortDomainVideo,        /* 视频类型端口 */
  4. OMX_PortDomainImage,        /* 图像类型端口 */
  5. OMX_PortDomainOther,        /* 其他类型端口 */
  6. OMX_PortDomainKhronosExtensions
     = 
    0x6F000000
    ,
  7. OMX_PortDomainVendorStartUnused
     = 
    0x7F000000
  8. OMX_PortDomainMax
     = 
    0x7ffffff
  9. } OMX_PORTDOMAINTYPE;

音频类型,视频类型,图像类型,其他类型是OpenMax IL层此所定义的四种端口的类型。

端口具体内容的定义使用OMX_PARAM_PORTDEFINITIONTYPE类(也在OMX_Component.h中定义)来表示,其内容如下所示:

  1. typedef struct OMX_PARAM_PORTDEFINITIONTYPE {
  2. OMX_U32 nSize;                      /* 结构体大小 */
  3. OMX_VERSIONTYPE nVersion;           /* 版本*/
  4. OMX_U32 nPortIndex;             /* 端口号 */
  5. OMX_DIRTYPE eDir;                   /* 端口的方向 */
  6. OMX_U32 nBufferCountActual;         /* 为这
    个端口实际分配的Buffer的数目 */
  7. OMX_U32 nBufferCountMin;            /* 这个
    端口最小Buffer的数目*/
  8. OMX_U32 nBufferSize;                /* 缓冲区的字节数 */
  9. OMX_BOOL bEnabled;                  /* 是否使能 */
  10. OMX_BOOL bPopulated;                /* 是否在填充 */
  11. OMX_PORTDOMAINTYPE eDomain;         /* 端口的类型 */
  12. union {                         /* 端口实际
    的内容,由类型确定具体结构 */
  13. OMX_AUDIO_PORTDEFINITIONTYPE audio;
  14. OMX_VIDEO_PORTDEFINITIONTYPE video;
  15. OMX_IMAGE_PORTDEFINITIONTYPE image;
  16. OMX_OTHER_PORTDEFINITIONTYPE other;
  17. } format;
  18. OMX_BOOL bBuffersContiguous;
  19. OMX_U32 nBufferAlignment;
  20. } 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的状态机,内容如下所示:

  1. typedef enum OMX_STATETYPE
  2. {
  3. OMX_StateInvalid,                   /* 组件监
    测到内部的数据结构被破坏 */
  4. OMX_StateLoaded,                    /* 组件被
    加载但是没有完成初始化 */
  5. OMX_StateIdle,                      /* 组件初
    始化完成,准备开始 */
  6. OMX_StateExecuting,             /* 组件接受了
    开始命令,正在树立数据 */
  7. OMX_StatePause,                     /* 组件接受暂停命令*/
  8. OMX_StateWaitForResources,      /* 组件正在等待资源 */
  9. OMX_StateKhronosExtensions
     = 
    0x6F000000
    , /* 保留 */
  10. OMX_StateVendorStartUnused
     = 
    0x7F000000
    , /* 保留 */
  11. OMX_StateMax
     = 
    0X7FFFFFFF
  12. } OMX_STATETYPE;

OpenMax组件的状态机可以由外部的命令改变,也可以由内部发生的情况改变。OpenMax IL组件的状态机的迁移关系如图18-6所示。

 
图18-6  OpenMax IL组件的状态机的迁移关系

OMX_Core.h中定义的枚举类型OMX_COMMANDTYPE表示对组件的命令类型,内容如下所示:

  1. typedef enum OMX_COMMANDTYPE
  2. {
  3. OMX_CommandStateSet,                /* 改变状态机器 */
  4. OMX_CommandFlush,                   /* 刷新数据队列 */
  5. OMX_CommandPortDisable,             /* 禁止端口 */
  6. OMX_CommandPortEnable,              /* 使能端口 */
  7. OMX_CommandMarkBuffer,              /* 标
    记组件或Buffer用于观察 */
  8. OMX_CommandKhronosExtensions
     = 
    0x6F000000
    , /* 保留 */
  9. OMX_CommandVendorStartUnused
     = 
    0x7F000000
    , /* 保留 */
  10. OMX_CommandMax
     = 
    0X7FFFFFFF
  11. } 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的接口与实现的更多相关文章

  1. Android Multimedia框架总结(十三)CodeC部分之OpenMAX框架初识及接口与适配层实现

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52629598 前言:上篇中介绍O ...

  2. Android多媒体开发-- OpenMax IL简介

    1.openmax 简介 http://www.khronos.org/openmax/ OpenMax是一个多媒体应用程序的框架标准,由NVIDIA公司和Khronos在2006年推出. OpenM ...

  3. OpenMax概述

    一.OpenMax简介 OpenMAX是一个多媒体应用程序的标准.由NVIDIA公司和Khronos™在2006年推出. 它是无授权费的.跨平台的C语言程序接口序列,这些接口对音频.视频.静态图片的常 ...

  4. Android多媒体开发-stagefright及AwesomePlayer相关知识梳理

    android的多媒体框架中, stagefright其实是AwesomePlayer的代理,就是个皮包公司. status_t StagefrightPlayer::setDataSource( c ...

  5. 【第一篇章-android平台buffer播放探索】native media

    在android平台,从4.0开始,提出了openmax架构,所以在DNK的R7版本中有了openmax AL层播放的DEMO即native media,这个DEMO就是读本地文件,然后把所读buff ...

  6. 几个平台环境里视频编解码和图像scale的硬件加速的方法

    记录一下遇到几个平台里的视频编解码和图像scale的硬件加速的方法 1,intel平台当包含GEN系列的集成GPU时,可用libva实现视频codec.颜色空间转换和图像scale的硬件加速,具体可使 ...

  7. android openmax hardware decoder 整合记录

    欢迎访问我的blog:http://blog.thinkinside.me 关于android中openmax中hardware decoder的调用中,整合过程比较简单.主要是对OMXCodec的封 ...

  8. Android多媒体开发-- android中OpenMax的实现整体框架

    1.android中用openmax来干啥? android中的AwesomePlayer就 是用openmax来做(code)编解码,其实在openmax接口设计中,他不光能用来当编解码.通过他的组 ...

  9. vlc源码分析(六) 调用OpenMAX硬解码H.265

    H.265(HEVC)编码格式能够在得到相同编码质量视频的前提下,使用相当于H.264(AVC)一半的存储容量,虽然H.265的算法复杂度比H.264高一个数量级,但是硬件水平在不断提高,因此H.26 ...

随机推荐

  1. IDEA集成 SpringBoot+Mybaties 之 @Autowired注入报错

    原因分析: 因为@Mapper注解是由ibates提供的,需要在application.yml里加上下图配置 以及在启动类入口加上 扫描你mapper接口所在的包 ,所以Spring容器是不认识这个注 ...

  2. Light OJ 1422 - Halloween Costumes(区间DP 最少穿几件)

    http://www.cnblogs.com/kuangbin/archive/2013/04/29/3051392.html http://www.cnblogs.com/ziyi--caolu/a ...

  3. pyhton基础中的要点一

    1.python变量的命名规范: (1)变量必须以数字,字母,下划线的任意组合 (2)变量建议用驼峰标识,或下划线 (3)变量要有可描述性 (4)不能以数字开头 (5)不能用python的关键字 (6 ...

  4. 第11章 Media Queries 与Responsive 设计

    Media Queries--媒体类型(一) 随着科学技术不断的向前发展,网页的浏览终端越来越多样化,用户可以通过:宽屏电视.台式电脑.笔记本电脑.平板电脑和智能手机来访问你的网站.尽管你无法保证一个 ...

  5. if(!IsPostBack)

    作用: Page.IsPostBack 是用来检查目前网页是否为第一次加载,当使用者第一次浏览这个网页时Page.IsPostBack 会传回False,不是第一次浏览这个网页时就传回True:所以当 ...

  6. 07_Redis事务

    [简述] 事务是指一系列的操作步骤,着一些列的操作步骤,要么完全地执行,要不完全地不执行. 比如微博中: A用户关注了B用户,那么A的关注列表里就会有B用户,B用户的粉丝列表里就会有A用户. 这个关注 ...

  7. 创建第一个windows服务

    windows服务应用程序是一种长期运行在操作系统后台的程序,它对于服务器环境特别适合,它没有用户界面,不会产生任何可视输出,任何用户输出都回被写进windows事件日志. 计算机启动时,服务会自动开 ...

  8. 通过游戏学敏捷:只通过Specification来传递需求

    转自:https://mp.weixin.qq.com/s/jAYbAMUTNYGh4RxGPAZ1AQ 活动把每个小组(4-5个人)中的2人留在屋子里,其他人到屋子外面等待.在屋子里的人,会得到一张 ...

  9. 微软发布Azure Stack第一个技术预览版

    为了提升商业灵敏度和加快创新步伐,各个企业都在迅速地转向云服务.在微软,我们已经见到微软智能云Azure的飞速发展和使用,每月我们都有近十万的新增订阅量.然而,我们也了解到还有很多企业在完全移到公有云 ...

  10. 云计算之概念——IaaS、SaaS、PaaS、Daas

    云计算通俗来说就是输入/输出和计算不在一个主机上.计算要用到计算设备,计算设备一般是指CPU.内存和硬盘,输入/输出设备一般是指键盘.鼠标.显示器.耳机.音响.话筒等外设.而我们的个人计算机是使用主板 ...