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

这里简单了解下Tunnel Mode(隧道模式),Tunnel Mode指的是将两个组件的端口直接连接,减少中间层的使用,从而减少数据的中间传递过程,提高运行效率。

举个例子我们有一个OMX解码组件,普通的输出流程是解码器将解码后的数据写到output buffer中,应用层拿到output buffer之后做Avsync,最后送给surface渲染,这里有将数据传到上层,上层作Avsync、执行渲染三个动作。

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

Android Media Framework(一)OpenMAX框架简介的更多相关文章

  1. 六款值得推荐的android(安卓)开源框架简介

    1.volley 项目地址 https://github.com/smanikandan14/Volley-demo (1)  JSON,图像等的异步下载: (2)  网络请求的排序(scheduli ...

  2. [转]六款值得推荐的android(安卓)开源框架简介

    本文转自:http://www.jb51.net/article/51052.htm .volley 项目地址 https://github.com/smanikandan14/Volley-demo ...

  3. 六款值得推荐的android(安卓)开源框架简介(转)

    1.volley 项目地址 https://github.com/smanikandan14/Volley-demo (1)  JSON,图像等的异步下载: (2)  网络请求的排序(scheduli ...

  4. 几款值得推荐的android(安卓)开源框架简介

    技术不再多,知道一些常用的.不错的就够了. 该文章自有需要的时候,mark一下. 顺序不代表排名,根据自己需求进行选择即可. 1.volley 项目地址 https://github.com/sman ...

  5. 六款值得推荐的android(安卓)开源框架简介【转】

    http://my.oschina.net/u/1244156/blog/380647 1.volley 项目地址 https://github.com/smanikandan14/Volley-de ...

  6. Android Media (Audio) Framework 多媒体系统框架

    http://blog.csdn.net/lskshz/article/details/17264113 原址:http://blog.csdn.net/myzhzygh/article/detail ...

  7. Android Multimedia框架总结(十三)CodeC部分之OpenMAX框架初识及接口与适配层实现

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52629598 前言:上篇中介绍O ...

  8. 王家林的81门一站式云计算分布式大数据&移动互联网解决方案课程第14门课程:Android软硬整合设计与框架揭秘: HAL&Framework &Native Service &App&HTML5架构设计与实战开发

    掌握Android从底层开发到框架整合技术到上层App开发及HTML5的全部技术: 一次彻底的Android架构.思想和实战技术的洗礼: 彻底掌握Andorid HAL.Android Runtime ...

  9. Android多媒体开发-- OpenMax IL简介

    1.openmax 简介 http://www.khronos.org/openmax/ OpenMax是一个多媒体应用程序的框架标准,由NVIDIA公司和Khronos在2006年推出. OpenM ...

  10. Core Animation之框架简介(一)

    Core Animation之框架简介(一) 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/11180241 转载请注明 ...

随机推荐

  1. Linux之sudo

    [摘要] 生产环境中为了系统的安全性,Linux主机的root权限是只能管理器使用,普通用户不具有root权限,但是可以通过sudo获取root权限执行一些操作. 一.知识要点 wheel组 在Lin ...

  2. 鸿蒙HarmonyOS实战-ArkUI组件(页面路由)

    一.路由导航 路由导航是指在应用程序中通过路径导航定位到特定页面的过程.路由导航的实现通常采用路由器(router)来进行管理,路由器根据路径的不同值将用户请求导向到不同的页面. 在HarmonyOS ...

  3. 因果推断review

    什么是因果推断? 因果推断(Causal Inference):就是预估对某个对象/群体/人 等 做不做某种干预后产生的结果. 常说'关系不代表因果'. 比如,一项研究表面,吃早餐的女孩比不吃早餐的女 ...

  4. Spring Cloud组件之 Spring Cloud Ribbon:负载均衡的服务调用

    Spring Cloud Ribbon:负载均衡的服务调用 SpringCloud学习教程 SpringCloud Spring Cloud Ribbon 是Spring Cloud Netflix ...

  5. 「开源人说」|AI普惠,阿里灵杰开源历程与思考

    简介: 施兴 阿里巴巴资深技术专家 阿里巴巴开源项目EasyRec负责人 以下为开发者社区「开源人说」第四期--大数据&AI专场的主题分享,点击链接了解更多精彩详情 https://devel ...

  6. RocketMQ 消息集成:多类型业务消息-普通消息

    简介: 本篇将从业务集成场景的诉求开始,介绍 RocketMQ 作为业务消息集成方案的核心能力和优势,通过功能场景.应用案例以及最佳实践等角度介绍 RocketMQ 普通消息类型的使用. 引言 Apa ...

  7. 基于 KubeVela 的机器学习实践

    ​简介:本文主要介绍如何使用 KubeVela 的 AI 插件,来帮助工程师更便捷地完成模型训练及模型服务. 作者:KubeVela 社区 在机器学习浪潮迸发的当下,AI 工程师除了需要训练.调试自己 ...

  8. 工商银行分布式服务C10K场景的解决方案

    简介: 未来,中国工商银行将持续致力于 Dubbo 的金融级规模化应用. 作者:颜高飞,微服务领域架构师,主要从事服务发现.高性能网络通信等研发工作,擅长 ZooKeeper.Dubbo.RPC 协议 ...

  9. 一图速览 | DTCC 2021大会,阿里云数据库技术大咖都聊了些什么?

    ​简介: 3天9场干货分享,快来收藏吧! 10月18日~10月20日, 由国内知名IT技术社区主办的数据库技术交流盛会--DTCC 2021 (第十一届中国数据库技术大会)在京圆满落幕.大会以&quo ...

  10. HttpClient配置SSL绕过https证书以及双向认证

    HttpClient简介 1.HTTP 协议是 Internet 上使用得最多.最重要的协议之一,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源.虽然在 JDK 的 java ...