注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

东月之神

在单纯的观念里面,生命就容易变得比较深刻!

 
 
 

日志

 
 
关于我

别驻足,梦想要不停追逐,别认输,熬过黑暗才有日出,要记住,成功就在下一步,路很苦,汗水是最美的书!

网易考拉推荐

OpenMax IL层的接口  

2011-12-22 11:48:16|  分类: Audio/Video |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

  OpenMax的接口与实现  
 OpenMax IL层的接口(1)

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; 
  89. OpenMax IL层的接口(2)

    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就是改变状态机的命令。

  90. OpenMax IL实现的内容

    对于OpenMax IL层的实现,一般的方式并不调用OpenMax DL层。具体实现的内容就是各个不同的组件。OpenMax IL组件的实现包含以下两个步骤。


    组件的初始化函数:硬件和OpenMax数据结构的初始化,一般分成函数指针初始化、私有数据结构的初始化、端口的初始化等几个步骤,使用其中的
    pComponentPrivate成员保留本组件的私有数据为上下文,最后获得填充完成OMX_COMPONENTTYPE类型的结构体


    OMX_COMPONENTTYPE类型结构体的各个指针:实现其中的各个函数指针,需要使用私有数据的时候,从其中的pComponentPrivate得到指针,转化成实际的数据结构使用


    端口的定义是OpenMax IL组件对外部的接口。OpenMax
    IL常用的组件大都是输入和输出端口各一个。对于最常用的编解码(Codec)组件,通常需要在每个组件的实现过程中,调用硬件的编解码接口来实现。在组
    件的内部处理中,可以建立线程来处理。OpenMax的组件的端口有默认参数,但也可以在运行时设置,因此一个端口也可以支持不同的编码格式。音频编码组
    件的输出和音频编码组件的输入通常是原始数据格式(PCM格式),视频编码组件的输出和视频编码组件的输入通常是原始数据格式(YUV格式)。


    提示:在一种特定的硬件实现中,编解码部分具有相似性,因此通常可以构建一个OpenMax组件的"基类"或者公共函数,来完成公共性的操作。

  评论这张
 
阅读(1232)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017