Android Media Framework(八)OMXNodeInstance - Ⅰ

OpenMAX框架的学习有两大难点,一是组件的状态切换与buffer的流转过程,这部分内容我们已经在IL Spec中学习过了;二是OMX组件使用的buffer类型与buffer分配过程,这一节我们来重点剖析OMX组件使用的buffer类型。

1、引言

在实际应用中,OMX组件可能需要能够处理多种类型的输入数据。对于编码组件而言,其输入可能包括未压缩的视频流,例如来自设备屏幕的录屏数据或相机录制的原始视频。而对于解码组件,它可能需要处理普通的压缩视频文件,或者是加密的视频流。为了存储不同类型的输入数据,Android定义了不同类型的buffer。待处理的数据以不同的形式存储在这些缓冲区中,因此OMX组件需要明确即将处理的输入缓冲区类型,从而能够正确地解析buffer中的数据。

同样的,OMX组件输出结果时,会把数据填充到不同类型的buffer中,以适应不同的用途。对于编码组件,编码后的数据通常会被填充到一块普通的buffer中,应用获取到buffer后,会读取其中的数据并进行封装;对于解码组件,解码后的数据通常会被发送到surface进行渲染,因此数据需要填充到native window buffer中。为了让组件能够正确地将数据填充到buffer中,我们需要提前配置好需要使用的输出缓冲区类型,从而能够让组件正确地向buffer填充数据。

接下来会有两部分内容需要讨论:

  1. Android上有哪些可用的input buffer和output buffer类型?

  2. 这些buffer的格式是怎样的?

2、Buffer Types

在了解Buffer Types之前,我们先简单说明一下OMXNodeInstance的作用。在之前的学习中,我们提到OMXNodeInstance在框架中扮演的角色是IL Client,它封装了OMX Core提供的低层级接口,并进行了新的抽象。然而,在阅读源码的过程中我们会发现,OMXNodeInstance的接口仍然暴露了过多的细节,使用起来相对困难。因此,Android在OMXNodeInstance之上又进行了封装,这一层就是我们后续要学习的ACodec。查看ACodec对外开放的接口,已经完全没有了OMX框架的身影,所以ACodec的接口算是比较高层级的接口。因为ACodec封装了OMXNodeInstance的调用,所以笔者认为它也算的上是IL Client的一部分。

接下来让我们正式进入主题。

Android并没有直接定义具体的buffer类型,而是通过OMXNodeInstance抽象出的PortMode(端口模式)来指明组件端口所使用的buffer类型及其分配方式。相应地,为组件配置使用的buffer类型的方法就被命名为setPortMode。

PortMode是一个枚举,定义在IOMX.h中:

enum PortMode {kPortModePresetStart = 0,kPortModePresetByteBuffer,kPortModePresetANWBuffer,kPortModePresetSecureBuffer,kPortModePresetEnd,kPortModeDynamicStart = 100,kPortModeDynamicANWBuffer,kPortModeDynamicNativeHandle,kPortModeDynamicEnd,
};

很多读者在看到PortMode时可能会心生疑惑:PortMode是如何体现buffer类型与分配方式的呢?这正是这部分内容显得晦涩难懂的原因所在。

我们将PortMode中的枚举名拆成三部分:kPortMode(前缀,忽略),Preset/Dynamic(分配方式),buffer类型(后缀)。

先来了解与buffer类型(也就是后缀部分)中的关键词:


关注公众号《青山渺渺》阅读全文

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/34514.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

业务架构交付物

背景 业务的核心元素、扩展元素以及它们的协同关系,业务架构和其他架构的关系等等已经有了不少认识,那么,通过对业务架构的还原和分析,到底能够得到什么业务架构的内容呢?它可以是一套流程框架体系,也可以…

探索约束LLM输出JSON的应用

0、 引言 JSON(JavaScript Object Notation)因其简洁、易读和易于解析的特性,已成为全球使用最广泛的数据交换格式之一。它能够满足各种数据交换需求,特别是在构建人工智能驱动的应用程序时,工程师们经常需要将大型语…

深度学习工具|LabelImg(标注工具)的安装与使用教程

1 简介 Label是一款免费的图像标注软件,可以以矩形框的形式对图像中的物体进行标记,常用于分类和目标检测。并可以将标记信息保存为PasclVOC(xml)、YOLO(txt)、CreateML(json)格式。…

Python中对含有转义字符的变量,如何处理

file_path C:\Users\EDY\PJ-IPAStudio\designer\project 这是一个路径的字符串,要访问这个路径下的文件,是会报错的 file_path rC:\Users\EDY\PJ-IPAStudio\designer\project 需要在前面添加 r 如果他是一个变量,如何对变量里的字符修改呢&…

0802功放2

功放要记一般的式子,而非最大的式子,因为总不能总开到最大音量上工作,而是在比较合适的音量上工作 运放的最大电压也是比电源低1~2V 饱和三极管的功率,电流越大,饱和压降越大???不…

STM32G474的浮点数四则运算速度实测

一、FPU的启用 FPU 即浮点运算单元(Float Point Unit)。浮点运算,对于定点 CPU(没有 FPU 的 CPU)来说必须要按照 IEEE-754 标准的算法来完成运算,是相当耗费时间的。而对于有 FPU 的 CPU来说,浮…

【Golang】Steam 创意工坊 Mod 文件夹批量重命名

本文将介绍一个使用Go语言编写的脚本,其主要功能是解析XML文件并基于解析结果重命名文件夹。这个脚本适用于需要对文件夹进行批量重命名,并且重命名规则依赖于XML文件内容的情况。 脚本功能概述 Steam创意工坊下载的Mod文件夹批量重命名为id名称 运行前…

Tomcat get请求传数组集合参数

前言 最近做项目,需要通过GET传参,来实现查询的能力,本来是RPC调用,直接参数序列化即可。但是服务最近修改为HTTP,本来Spring Cloud的feign也可以直接传参数,但是当使用Nginx访问时参数到底传啥呢&#xf…

iOS Swift5 视频播放

文章目录 1.截图2.代码3.导入本地文件 1.截图 2.代码 import UIKit import AVKit import AVFoundationclass ViewController: UIViewController {override func viewDidLoad() {super.viewDidLoad()view.backgroundColor .white// 创建按钮let button UIButton(type: .syste…

【学习】程序员资源网站

1 书栈网 简介:书栈网是程序员互联网IT开源编程书籍、资源免费阅读的网站,在书栈网你可以找到很多书籍、笔记资源。在这里,你可以根据热门收藏和阅读查看大家都在看什么,也可以根据技术栈分类找到对应模块的编程资源,…

通过InoDriverShop伺服调试软件连接汇川SV660F系列伺服的具体方法(以太网)

通过InoDriverShop伺服调试软件连接汇川SV660F系列伺服的具体方法(以太网) 具体连接伺服驱动器的步骤可参考以下内容: 启动InoDriverShop, 新建或打开工程 如下图所示,选择在线,选中SV660F图标,右侧通信类型选择“TCP—DCP”,点击下一步,同时要选择自己当前使用的网卡…

【扩散模型(一)】Stable Diffusion中的重建分支(reconstruction branch)和条件分支(condition branch)

Stable Diffusion 是一种基于扩散模型的生成模型,用于生成图像等数据。在解释 Stable Diffusion 的过程中,经常会提到两个主要的分支:重建分支(reconstruction branch)和条件分支(condition branch&#xf…

C++多线程异步日志实现

使用C11标准&#xff0c;构建了一个方便使用的、轻量化的日志系统。封装线程安全的lockQueue&#xff0c;实现对每条日志添加信息、push到lockQueue中的LogTmp类&#xff0c;实现一个多线程异步的日志系统Logger。 lockqueue.h #pragma once #include <queue> #include…

Go微服务: redis分布式锁保证数据原子操作的一致性

概述 随着云计算和大数据技术的飞速发展&#xff0c;分布式系统已经成为现代IT架构的重要组成部分在分布式系统中&#xff0c;数据的一致性是一个至关重要的挑战&#xff0c;特别是在并发访问和修改共享资源的场景下分布式锁是一种跨进程、跨机器节点的互斥锁&#xff0c;用于…

如何模拟一个具有网络管理功能的被测件的一些思路

不知道大家有没有遇到过这个问题&#xff1f; 当我们在学习如何测试网络管理时&#xff0c;难题不在于如何编写测试脚本&#xff0c;而是编写完测试脚本后&#xff0c;没有真实被测件来让我们执行测试脚本&#xff0c;进而调试脚本。这也是我在给大家讲CANoe工具和CAPL编程语言…

08.QT控件:QWidget

一、Widget 简介 Widget 是 Qt 中的核⼼概念.。英⽂原意是 "小部件"&#xff0c;我们此处也把它翻译为 "控件"。控件是构成⼀个图形化界⾯的基本要素。 Qt 作为⼀个成熟的 GUI 开发框架, 内置了⼤量的常⽤控件。并且 Qt 也提供了 "⾃定义控件" 的…

《第一行代码 第3版》学习笔记——第十一章 网络技术

1 webview用法 class MainActivity : ComponentActivity() {SuppressLint("SetJavaScriptEnabled")override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {NetWorkDemoTheme {// A surface container using the bac…

AI如何让办公更智能?WPS AI海外版给出答案

导读&#xff1a;从语义检查到一键生成PPT&#xff0c;WPS Office海外版如何面向2亿月活用户快速推出AI功能&#xff1f; 近日&#xff0c;WPS Office海外版应用亚马逊云科技Amazon Bedrock等生成式AI技术与服务&#xff0c;在海外正式推出人工智能应用WPS AI海外版&#xff0c…

Postman测试,如何保持用户登录状态?

为了在Postman中保持用户登录状态&#xff0c;我们可以使用以下步骤&#xff1a; 1. 下载和安装Postman 首先&#xff0c;我们需要下载和安装Postman。Postman是一个流行的API开发和测试工具&#xff0c;可以帮助我们发送HTTP请求并测试API的功能。 2. 创建一个新的Postman …

【Vue】vue-router路由使用

前言 Vue Router是Vue框架中非常重要的一个功能。 目标 1 单页面应用与多页面应用的区别; 2 vue-router的具体实现方法; 3 路由模式有哪几种,有什么区别; 4 如何进行路由守卫与路由缓存; 一 路由的概念 概念 Vue Router是Vue提供的路由管理器。将组件与路由一一对应起来,…