Android Media Framework(一)OpenMAX Spec阅读与框架简介

学习开源代码最快的方式是先阅读它的文档,再查看它的头文件,最后研读代码实现并进行编译调试。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

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

相关推荐
EasyDSS23 分钟前
视频监控从安装到优化的技术指南,视频汇聚系统EasyCVR智能安防系统构建之道
大数据·网络·网络协议·音视频
似霰1 小时前
安卓adb shell串口基础指令
android·adb
fatiaozhang95273 小时前
中兴云电脑W102D_晶晨S905X2_2+16G_mt7661无线_安卓9.0_线刷固件包
android·adb·电视盒子·魔百盒刷机·魔百盒固件
CYRUS_STUDIO4 小时前
Android APP 热修复原理
android·app·hotfix
阿酷tony4 小时前
将视频生成视频二维码步骤
音视频·视频格式·视频二维码·视频生成二维码
鸿蒙布道师4 小时前
鸿蒙NEXT开发通知工具类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
鸿蒙布道师4 小时前
鸿蒙NEXT开发网络相关工具类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
9527华安4 小时前
国产紫光同创FPGA视频采集转SDI编码输出,基于HSSTHP高速接口,提供2套工程源码和技术支持
fpga开发·音视频·紫光同创·sdi·高速接口·hssthp
大耳猫5 小时前
【解决】Android Gradle Sync 报错 Could not read workspace metadata
android·gradle·android studio
ta叫我小白5 小时前
实现 Android 图片信息获取和 EXIF 坐标解析
android·exif·经纬度