openmax

来源:互联网 发布:马云做淘宝靠什么赚钱 编辑:程序博客网 时间:2024/04/27 08:46
IT168技术】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_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枚举类型,内容如下所示: 
typedef enum OMX_PORTDOMAINTYPE { 
    OMX_PortDomainAudio,         
/* 音频类型端口 */ 
    OMX_PortDomainVideo,         
/* 视频类型端口 */ 
    OMX_PortDomainImage,         
/* 图像类型端口 */ 
    OMX_PortDomainOther,         
/* 其他类型端口 */ 
    OMX_PortDomainKhronosExtensions 
= 0x6F000000, 
    OMX_PortDomainVendorStartUnused 
= 0x7F000000 
    OMX_PortDomainMax 
= 0x7ffffff 
} OMX_PORTDOMA 


  音频类型,视频类型,图像类型,其他类型是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就是改变状态机的命令。
原创粉丝点击