zoukankan      html  css  js  c++  java
  • OpenMax IL层的接口 3

    《Android系统级深入开发--移植与调试》第18章OpenMax多媒体引擎,本章开始介绍编结码较下层的标准模块OpenMax插件。本节为大家介绍OpenMax IL层的接口。

    AD:

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

  • 相关阅读:
    Go安装
    Redis 安装与使用
    scala总结
    C++学习笔记4
    LeetCode 22.将数组分成和相等的三个部分
    LeetCode 21.二叉树的直径 DFS深度遍历
    LeetCode 20.买卖股票的最佳时机 暴力破解法与动态规划
    LeetCode 19.凑零钱问题 动态规划
    LeetCode 18.队列的最大值
    Java SSM Spring MVC 三层架构和MVC+SpringMVC的入门案例+请求参数的绑定+常用的注解
  • 原文地址:https://www.cnblogs.com/weinyzhou/p/2970289.html
Copyright © 2011-2022 走看看