OpenMax系统的结构(2)-程序员宅基地

技术标签: 移动开发  

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

AD:

18.1.1  OpenMax系统的结构(2)

图18-3中的虚线中的内容是OpenMax IL层的内容,其主要实现了OpenMax IL中的各个组件(Component)。对下层,OpenMax IL可以调用OpenMax DL层的接口,也可以直接调用各种Codec实现。对上层,OpenMax IL可以给OpenMax AL 层等框架层(Middleware)调用,也可以给应用程序直接调用。

OpenMax IL主要内容如下所示。

客户端(Client):OpenMax IL的调用者

组件(Component):OpenMax IL的单元,每一个组件实现一种功能

端口(Port):组件的输入输出接口

隧道化(Tunneled):让两个组件直接连接的方式

OpenMax IL的基本运作过程如图18-4所示。

 
(点击查看大图)图18-4  OpenMax IL的基本运作过程

如图18-4所示,OpenMAL IL的客户端,通过调用四个OpenMAL IL组件,实现了一个功能。四个组件分别是Source组件、Host组件、Accelerator组件和Sink组件。Source组件只有一个输出端口;而Host组件有一个输入端口和一个输出端口;Accelerator组件具有一个输入端口,调用了硬件的编解码器,加速主要体现在这个环节上。Accelerator组件和Sink组件通过私有通讯方式在内部进行连接,没有经过明确的组件端口。

OpenMAL IL在使用的时候,其数据流也有不同的处理方式:既可以经由客户端,也可以不经由客户端。图18-4中,Source组件到Host组件的数据流就是经过客户端的;而Host组件到Accelerator组件的数据流就没有经过客户端,使用了隧道化的方式;Accelerator组件和Sink组件甚至可以使用私有的通讯方式。

OpenMax Core是辅助各个组件运行的部分,它通常需要完成各个组件的初始化等工作,在真正运行过程中,重点的是各个OpenMax IL的组件,OpenMax Core不是重点,也不是标准。

OpenMAL IL的组件是OpenMax IL实现的核心内容,一个组件以输入、输出端口为接口,端口可以被连接到另一个组件上。外部对组件可以发送命令,还进行设置/获取参数、配置等内容。组件的端口可以包含缓冲区(Buffer)的队列。

组件的处理的核心内容是:通过输入端口消耗Buffer,通过输出端口填充Buffer,由此多组件相联接可以构成流式的处理。

OpenMAL IL中一个组件的结构如图18-5所示。

 
(点击查看大图)图18-5  OpenMAL IL中一个组件的结构

组件的功能和其定义的端口类型密切相关,通常情况下:只有一个输出端口的,为Source组件;只有一个输入端口的,为Sink组件;有多个输入端口,一个输出端口的为Mux组件;有一个输入端口,多个输出端口的为DeMux组件;输入输出端口各一个组件的为中间处理环节,这是最常见的组件。

端口具体支持的数据也有不同的类型。例如,对于一个输入、输出端口各一个组件,其输入端口使用MP3格式的数据,输出端口使用PCM格式的数据,那么这个组件就是一个MP3解码组件。

隧道化(Tunneled)是一个关于组件连接方式的概念。通过隧道化可以将不同的组件的一个输入端口和一个输出端口连接到一起,在这种情况下,两个组件的处理过程合并,共同处理。尤其对于单输入和单输出的组件,两个组件将作为类似一个使用。

3.Android中OpenMax的使用情况

Android系统的一些部分对OpenMax IL层进行使用,基本使用的是标准OpenMax IL层的接口,只是进行了简单的封装。标准的OpenMax IL实现很容易以插件的形式加入到Android系统中。

Android的多媒体引擎OpenCore和StageFright都可以使用OpenMax作为多媒体编解码的插件,只是没有直接使用OpenMax IL层提供的纯C接口,而是对其进行了一定的封装。

在Android2.x版本之后,Android的框架层也对OpenMax IL层的接口进行了封装定义,甚至使用Android中的Binder IPC机制。Stagefright使用了这个层次的接口,OpenCore没有使用。

提示:OpenCore使用OpenMax IL层作为编解码插件在前,Android框架层封装OpenMax接口在后面的版本中才引入。

转载于:https://www.cnblogs.com/weinyzhou/archive/2013/02/18/2970290.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30788239/article/details/97232698

智能推荐

LINQ查询语句案例学生表、成绩表、课程表_linq查询学生是否考完三科的-程序员宅基地

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace LINQ3{ class Student { /// <summary> ///学生..._linq查询学生是否考完三科的

hibernate 映射文件中id 及id Generator的详解 -程序员宅基地

本文翻译自hibernate3.3.1有参考资料(hibernate reference)的5.1.4 id及5.1.4.1 Generator。一、id被映射的实体类必须声明一个对应数据库表主键列的属性。大多数类有一个JavaBeans风格的代表此实例唯一标识的属性。&lt;id&gt; 元素定义了该属性到数据库表主键字段的映射。&lt;id name="propertyName"...

用centos解压文件是出现gzip: stdin: unexpected end of file tar: Child returned status 1 tar: Error is not rec-程序员宅基地

用cnetos解压文件是出现gzip: stdin: unexpected end of filetar: Child returned status 1tar: Error is not recoverable: exiting now的错误上网百度了好久,都说是上传的压缩包损坏了,一看在centos里的压缩包大小跟主机上的确实不一样。但是重新上传压缩包还是出现一样的问题。反思之后,...

Multi-task learning 中的Loss设计-程序员宅基地

Multi-task learning 中的Loss设计核心问题:在Multi-task learning的一个核心的问题是loss的设计: 1、如何控制各子任务loss的权重? 2、起始训练时各子任务loss的数量级不同会对收敛造成哪些影响? 这两个问题归结起来是Gradient Balancing(梯度平衡)的问题,不同任务的loss的梯度相差过大, 导致梯度小的loss在训练过程...

html通过输入值自动选择,下拉框根据输入的值变化-程序员宅基地

当下拉框的值改变后另一个下拉框的值跟着变。用JS当下拉框的值改变后另一个下拉框的值跟着变。用JS怎么实现?把下拉框的数据全部读出,并存放在JS的Array中。 当选择下拉框的时候触发onChange()事件动态的添加或改变级联 下拉框的内容。 var areaArray = new Array(); areaArray[areaArray.length]=new Array("1","杭州"); ..._html下拉列表做值改变事件

elementUI的table默认全选,并解决跨分页取消选中回显的问题,并拿到取消选中的集合(一般用于table数据很多需要给选中的项发短信等需求)_elmentui table filter selection-程序员宅基地

table表格数据过多,默认全选,传给后端不太实用,此时获取取消的数据传给后端;并解决跨分页取消选中回显的问题._elmentui table filter selection

随便推点

Windows环境下Composer的安装和使用说明,从零开始熟悉安装composer,不会者、不常用者和遗忘者的幸福_windows composer-程序员宅基地

[本文摘抄至网络-本人整理测试]Windows环境下Composer的安装和使用教程(本人亲测可用)1.先下载Composer-Setup.exe 。会自动搜索php.exe的安装路径,如果没有,就手动找到php安装路径下的php.exe。(你跟我的路径可能会不一样)2.在PHP目录下,打开php.ini文件,开启openssl扩展。去掉extension=php_openssl.dll前面的..._windows composer

使用 time库进行时间戳和日期的转换_tiem 转化日期-程序员宅基地

time库相关方法struct_time:time库定义的时间类型,包含一个 9元元组,其中 tm_isdist 表示是否为闰年。例如:time.struct_time(tm_year=2018, tm_mon=10, tm_mday=12, tm_hour=13, tm_min=51, tm_sec=29, tm_wday=4, tm_yday..._tiem 转化日期

(六) AVFoundation 人脸检测_avmediatypemetadata avmediatypemetadataobject区别-程序员宅基地

秦明概述AVFoundation 是一个可以用来使用和创建基于时间的视听媒体数据的框架.AVFoundation 的构建考虑到了目前的硬件环境和应用程序,其设计过程高度依赖多线程机制. 充分利用了多核硬件的优势并大量使用了Block 和GCD机制, 将复杂的计算机进程放到了后台线程运行. 会自动提供硬件加速操作, 确保在大部分设备上应用程序都能以最佳的性能运行. 框架的设计就是针对64位处理..._avmediatypemetadata avmediatypemetadataobject区别

【001】配置深度学习GPU加速环境(win10系统+pytorch-GPU框架+GPU2080 Ti+NVIDA显卡驱动+CUNA+cuDNN)_cuna驱动-程序员宅基地

1、实验环境 【1】基础操作系统win10、Anaconda3.5.1、Python:base环境是Python3.7,可以创建独立环境编译器:Pycharm2019.2 【2】GPU:NVIDIA RTX 2080 Ti显卡驱动:441.66,要和cuda版本适配CUDA:10.1cuDNN:7.6 【3】 框架pytorch-gpu,TensorFlow-..._cuna驱动

如何检查JavaScript对象属性是否未定义-程序员宅基地

In a JavaScript program, the correct way to check if an object property is undefined is to use the typeof operator. 在JavaScript程序中,检查对象属性是否未定义的正确方法是使用typeof运算符。 typeof returns a string that tells t..._js 判断对象未定义

LinqToSql查询-程序员宅基地

Linq查询累继承与DataContext有省市区的数据表如图:现在需要查询Type=3的所有名称首先需要建立一个和现有表结构相同的实体对象namespace Mode{ //表明可以自定义 [Table(Name = "Area")] public class Area { //列字段,注意,字段类型必须和数据..._linqtosql查询数据

推荐文章

热门文章

相关标签