zoukankan      html  css  js  c++  java
  • 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层的核心内容,表示一个组件,其内容如下所示:

    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组件的"基类"或者公共函数,来完成公共性的操作。

  • 相关阅读:
    gain 基尼系数
    luogu P5826 【模板】子序列自动机 主席树 vector 二分
    牛客挑战赛39 树与异或 离线 树上莫队 树状数组 约数
    4.22 省选模拟赛 三元组 manacher 回文自动机
    4.22 省选模拟赛 最优价值 网络流 最大权闭合子图
    4.18 省选模拟赛 消息传递 树剖 倍增 线段树维护等比数列
    luogu P4008 [NOI2003]文本编辑器 splay 块状链表
    牛客挑战赛39 密码系统 后缀数组
    luogu P1526 [NOI2003]智破连环阵 搜索+最大匹配+剪枝
    luogu P4095 [HEOI2013]Eden 的新背包问题 多重背包 背包的合并
  • 原文地址:https://www.cnblogs.com/nsnow/p/3808189.html
Copyright © 2011-2022 走看看