• Android Media Framework(一)OpenMAX 框架简介


    学习开源代码最快的方式是先阅读它的文档,再查看它的头文件,最后研读代码实现并进行编译调试。Android早期引入OpenMAX IL作为使用音视频编解码器的标准接口,了解Android Media框架的底层运行原理要从OMX IL开始。在这一节,我们将阅读整理OpenMAX IL Spec中的介绍和架构部分,以便对整个框架有一个初步的概念。

    阅读材料openmax_il_spec_1_0.pdf可在khronos官网下载,也可在公众号后台回复ILSpec获取下载链接。

    1、OMX IL简介

    OpenMAX Integration Layer(OMX IL,集成层)是由Khronos Group开发的一套低层级标准接口,旨在为编解码器提供一定程度的抽象,使得嵌入式或移动设备能够统一调用音频、视频和图像编解码器,从而实现编解码器实现代码和调用代码的跨平台性。

    OMX IL API由两大主要部分组成,分别是Core API和Component API。

    • OMX IL Component:在OMX IL中组件表示独立的功能模块,组件可能是source(源)、sinks(接收器)、codecs(编解码器)、filters(过滤器)或任何其他数据处理模块,组件需要依据Component API来实现。与组件之间的数据通信是通过称为端口的接口进行的,用户可以通过输入端口向组件发送数据,也可以通过输出端口接收数据。
    • OMX IL Core:Core API主要用于动态加载卸载组件,调用组件方法;

    将OMX IL API封装并向上层提供高层级接口的部分被称为IL Client(客户端),IL Client使用OMX Core来加载组件,卸载组件,调用组件的方法。

    为什么Android要引入OMX IL?

    • Android系统可以跑在多种类型的设备上,比如说手机、电视、平板或者是现在的车机上,这些设备会有不同的芯片,手机用的比较多的是海思、高通、联发科,电视见的比较多的是AML、RTK,这些芯片厂商会有自己编解码器的实现(VPU API),Android作为一个通用平台为了调用不同芯片的编解码器引入了OMX IL框架,各大vendor(厂商)实现OMX IL提供的接口之后,开发者就可以用统一的接口使用硬件编解码了。

    2、OMX Component States

    OMX IL为组件定义了一些状态,组件使用过程中会经历一系列的状态转换。OMX IL定义的状态有Unloaded、Loaded、Idle、Executing、Paused、WaitForResources、Invalid,但Android中实际用到的只有Loaded、Idle、Executing、Invalid,因此后文中我们只介绍这么多。

    • Loaded:组件创建后就会进入Loaded状态,表示组件已经加载完成。
    • Idle:组件获取到运行所需要的资源,但是还没开始处理数据,这时候处在Idle(空闲)状态。
    • Executing:组件正在运行、处理数据,这时候处在Executing状态。
    • Invalid:组件运行或配置过程中出现错误进入到Invalid状态。

    3、OMX Component Architecture

    spec中有一个OMX IL组件的架构图,看懂它大致就能了解一个OMX组件应该如何实现了,这里对架构图做简单描述:

    • OMX IL Client或其他组件需要使用组件句柄操作组件,组件操作可以划分为三类:
      • 参数、配置的设定与获取,这些操作是同步执行的,调用完即返回结果;
      • 命令的发送,OMX组件需要维护一个Command Queue,OMX IL API使用异步编程的思想,应用层可能会连续下发多个命令,因此使用队列处理命令事务;
      • input、output buffer的发送,input buffer填充完成后送给编解码器使用,output buffer使用完成后送给编解码器重新填充;
    • 在Android中组件会有两个端口input、output port,每个port维护有一个队列,队列中存储的是Buffer Header的指针,Buffer Header是一个结构体,指向真正的数据缓冲区。
    • OMX组件的数据输出通过Callback完成,总共有三个callback:
      • input port callback:将用完的input buffer送回给IL Client;
      • output port callback:将填充好的output buffer送回给IL Client;
      • event callback:将OMX组件生成的事件发送给IL Client;

    4、Communication Behavior

    这一节对port有更多的描述,port存储有组件定义的要用的buffer的最小数量,buffer可能是由OMX组件自己分配,也有可能是使用预先分配的。port中的每一个buffer都会关联到一个Buffer Header,Buffer Header除了指向缓冲区外还存储有与缓冲区关联的metadata(元数据)。

    5、Tunneled Buffer Allocation and Sharing

    关注公众号《青山渺渺》 获取更多音视频开发内容

    image

  • 相关阅读:
    基于单片机的太阳能灯(声控)电路设计(#0221)
    数据结构---栈(数组栈 & 链式栈 & 双端栈 & 括号匹配问题)
    计算机网络
    去中心化应用的终极是应用链?
    遇到一个异步任务后是否会直接加入到异步队列当中
    网络安全系列-四十一: arkime的docker-compose安装及可视化pcap文件示例
    HONEYWELL 0574-A-012 0574-A-0131 工控DCS系统模块
    RustDesk 搭建一个自己的远程桌面中继服务器
    RabbitMQ-交换机(发布订阅模式/fanout/direct/topics)
    本科生学深度学习-Attention机制
  • 原文地址:https://www.cnblogs.com/rongmiao/p/18219130