OpenMAX/IL: OMX IL 学习笔记【1】- 结构框架

来源:互联网 发布:淘宝怎么修改密码 编辑:程序博客网 时间:2024/05/17 21:51
    OpenMAX IL 层 API 旨在为媒体组件提供跨平台的可移植能力。这些接口将系统的软硬件结构进行抽象化。每个组件及其相关的转换都被封装在组件接口的内部。OpenMAX IL API 允许用户去加载,控制,连接以及卸载各独立的组件。这种极具灵活性的内核结构使得 Intergration Layer 能够很容易的实现几乎所有的多媒体应用情形,并且能够很好的与现有的基于图像的多媒体框架相结合。

1.  主要的功能和优点

    OpenMAX IL API 能够在应用程序、多媒体框架和编解码库,以及其支持的组件(比如,sources 和 sinks)之间建立统一的接口。对于用户来说,组件自身及其内部的软硬件结合情况都是完全透明的。其主要功能如下:
•  A flexible component-based API core; 
•  Ability to easily plug in new components ;
•  Coverage of targeted domains (audio, video, and imaging) while remaining easily extensible by both the Khronos Group and individual vendors;
•  Capable of being implemented as either static or dynamic libraries;
•  Retention of key features and configuration options needed by parent software (such as media frameworks);
•  Ease of communication between the client and the components and between components themselves;
•  Standardized definition of key components so all implementations of such “standard components” expose the same external interface (i.e. same inputs, outputs, and controls).

2.  OpenMAX IL 软件结构

    

3.  OpenMAX IL 接口

    core API:负责动态加载和卸载组件,协助组件间通信。一旦加载组件,API 允许用户直接与组件进行通信,类似的,core API 允许用户在组件之间建立tunnel通信通道,一旦建立,core API 不再被需要,其通信直接发生在两个组件之间。
    component API:在IL层,组件代表了独立的功能模块。一个组件可以是sources, sinks, codecs, filters, splitters, mixers, or any other data operator.各个组件的参数可以通过一组相关的数据结构,枚举类型和接口来设置或者获取。buffer状态,错误信息,以及其他的时间敏感信息会通过回调函数转发给应用程序。与组件进行数据的交换是通过端口(ports)完成的。类似哦,组件间的tunnel通道也是通过将一个组件的输出端口连接到另一个组件的输入端口来建立的。

4.  System components

    OpenMAX IL 定义了三种通信方式:
    1)Non-tunneled:用于client 与 component 之间交换data buffers;
    2)Tunneling:用于组件之间互相交换data buffers的标准机制;
    3)Proprietary communication:用于两个组件之间直接数据交换的专属机制,并且可以作为tunneling的备选机制。
    

5.  Component profiles

    OpenMAX IL 组件的功能被分成两种profiles:base profiles 和 interop profiles。
    

6.  Component states

    
    1)无效的数据会导致组件进入invalid状态;
    2)在IDEL状态,组件应该获取了所有所需的静态资源;
    3)在executing状态,组件不再接收buffer,而是进行处理数据;
    4)在paused状态,组件维护一个buffer context,且不再处理数据和交换buffers;

7.  Component architecture

    

8.  Communication behavior

    Client与component之间的通信:client通过OMX_EmptyThisBuffer来调用component的输入端口;
                               client通过OMX_FillThisBuffer来调用component的输出端口。

9.  Tunneled buffer allocation

    对于tunnel的两个端口,supplier端口会调用UseBuffer函数来要求邻接的端口来处理buffers;non-supplier端口会接受UseBuffer调用。Component需要遵循以下规则:
    1)supplier端口都要提供buffers;
    2)在端口上可靠的传输buffer配置;
    3)通过OMX_EmptyThisBuffer调用将buffer从输出端口传递到另一component的输入端口;
    4)通过OMX_Fill_This_Buffer调用将buffer从输入端口返回给component的输出端口。

10. Buffer payload

    一般情况下,buffer中可用数据的起始点和范围由定义在buffer头中的 pBuffer,nOffset 和 nFilledLen 三个参数来决定。pBuffer指向buffer的起始地址;nOffset代表了buffer起始地址与实际可用数据地址之间的偏移量;nFilledLen表示buffer中连续可用的数据的大小。因此,buffer中可用数据的起始范围分别为pBuffer + nOffset 和 pBuffer + nOffset + nFilledLen 。
   在buffer中数据的存放方式有三种:
   1)每个buffer要么填满,要么部分填满;
   2)每个buffer中存放的压缩数据都是以完整的帧为单位的;
   3)每个buffer中只存放一帧的压缩数据。
前两种都要求解码器在解码的之前对每帧数据进行解析,第三种情况则不需要解析。

11. Buffer flags and timestamps

    Buffer flags 是存放在buffer中的表示特定属性的数据,比如数据流结束;
    Timestamps 是以微秒为单位的存放在buffer中的数据,用来在播放时确定各buffer的播放时刻。

12. OMX IL 示例结构

    
0 0