织梦CMS - 轻松建站从此开始!

罗索

当前位置: 主页>嵌入式开发>Android>

Android开发之:OpenMax的接口与实现

落鹤生 发布于 2012-10-11 09:25 点击:次 
OpenMax IL层的接口定义由若干个头文件组成,这也是实现它需要实现的内容,它们的基本描述如下所示。
TAG:

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

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_PORTDOMA 

音频类型,视频类型,图像类型,其他类型是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.     OMX_StateInvalid,                   /* 组件监测到内部的数据结构被破坏 */ 
  3.     OMX_StateLoaded,                    /* 组件被加载但是没有完成初始化 */ 
  4.     OMX_StateIdle,                      /* 组件初始化完成,准备开始 */ 
  5.     OMX_StateExecuting,                /* 组件接受了开始命令,正在树立数据 */ 
  6.     OMX_StatePause,                     /* 组件接受暂停命令*/ 
  7.     OMX_StateWaitForResources,        /* 组件正在等待资源 */ 
  8.     OMX_StateKhronosExtensions = 0x6F000000, /* 保留 */ 
  9.     OMX_StateVendorStartUnused = 0x7F000000, /* 保留 */ 
  10.     OMX_StateMax = 0X7FFFFFFF 
  11. } OMX_STATETYPE; 

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

OpenMax的接口与实现
▲图18-6 OpenMax IL组件的状态机的迁移关系

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

  1. typedef enum OMX_COMMANDTYPE 
  2.     OMX_CommandStateSet,                /* 改变状态机器 */ 
  3.     OMX_CommandFlush,                    /* 刷新数据队列 */ 
  4.     OMX_CommandPortDisable,             /* 禁止端口 */ 
  5.     OMX_CommandPortEnable,              /* 使能端口 */ 
  6.     OMX_CommandMarkBuffer,              /* 标记组件或Buffer用于观察 */ 
  7.     OMX_CommandKhronosExtensions = 0x6F000000, /* 保留 */ 
  8.     OMX_CommandVendorStartUnused = 0x7F000000, /* 保留 */ 
  9.     OMX_CommandMax = 0X7FFFFFFF 
  10. } OMX_COMMANDTYPE; 

OMX_COMMANDTYPE类型在SendCommand调用中作为参数被使用,其中OMX_CommandStateSet就是改变状态机的命令。

(韩超 梁泉)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201210/16309.html]
本文出处:电子工业出版社 作者:韩超 梁泉 原文
顶一下
(2)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容