Android Media Framework(八)OMXNodeInstance - Ⅰ

news2024/11/16 17:41:33

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.coloradmin.cn/o/1859345.html

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

相关文章

我原以为政务类网站不追求漂亮,打脸啦,漂亮得颠覆你认知。

我原本以为政务类网站一定时沉稳、工整、信息量大的,这些和漂流都关联不上,直到最近看了一些网站,发现我的认识狭隘了。 政务类网站的设计风格通常需要注重以下几个方面: 稳重和专业感: 政务类网站需要给人以稳重、正…

c++分隔字符串

可以使用getline函数。 有两个版本: 至于为什么可以使用getline函数返回值作为while的判断条件,cprimer中表述如下:

51-60 CVPR 2024 最佳论文 | Generative Image Dynamics

在2023年11月,谷歌研究院发布了一项令人瞩目的研究成果——Generative Image Dynamics(生成图像动力学)。这项技术的核心是将静态的图片转化为动态的、无缝循环的视频,而且更令人兴奋的是,这些生成的视频还具有交互性。…

【Web APIs】JavaScript 事件基础 ② ( “ 事件 “ 开发步骤 | 常见鼠标 “ 事件 “ )

文章目录 一、" 事件 " 开发步骤1、" 事件 " 开发步骤2、完整代码示例 二、常见鼠标 " 事件 "1、常见鼠标 " 事件 "2、鼠标 " 事件 " 代码示例 Web APIs 博客相关参考文档 : WebAPIs 参考文档 : https://developer.mozilla…

计算机组成原理 | CPU子系统(1)基本概述

基本结构模型 运算与缓存部件 数据寄存部件 PSW不是很清楚 存储器是什么?属于那个结构里? 时序处理部件 cpu是大脑,控制器是神经元 ①通过硬件产生控制信号 ②通过软件产生控制信号 外频(系统时钟信号),…

Springboot整合cxf进行WebService发布和WebService调用

import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; /** 测试接口 author Μr.ηobοdy date 2019-12-29 */ WebService(name “UserService”, // 暴露服务名称 targetNamespace “http://servic…

后端数据null前端统一显示成空

handleNullValues方法在封装请求接口返回数据时统一处理 // null 转 function handleNullValues(data) {// 使用递归处理多层嵌套的对象或数组function processItem(item) {if (Array.isArray(item)) {return item.map(processItem);} else if (typeof item object &&…

深入解析 Python dataclass:类属性与类方法解释

文章目录 dataclass实例属性和类属性自动设置属性 实例方法静态方法(staticmethod)和 类方法(classmethod)静态方法类方法 dataclass dataclass 是 Python 3.7 引入的一个装饰器,用于简化类的定义。 使用 dataclass …

Unity的ScrollView滚动视图复用

发现问题 在游戏开发中有一个常见的需求,就是需要在屏幕显示多个(多达上百)显示item,然后用户用手指滚动视图可以选择需要查看的item。 现在的情况是在100个data的时候,Unity引擎是直接创建出对应的100个显示item。 …

0801功率放大问题

3个学时讲一个电路(两个共集共集并联),4个问题,发展线索 丙类放大电路用在高频通讯行业,低频功放是甲类,乙类,甲乙类 PT三极管的损耗 Pv电源提供的功率 现代模电通常使用方法b 只有交流…

聊聊 golang 中 channel

1、引言 Do not communicate by sharing memory; instead, share memory by communicating Golang 的并发哲学是“不要通过共享内存进行通信,而要通过通信来共享内存”,提倡通过 channel 进行 goroutine 之间的数据传递和同步,而不是通过共享…

YashanDB为新质生产力赋能 灌注合肥区域转型源动力

当前,数据要素已成为我国数字经济的“核心引擎”与“关键生产要素”,为全面激发数据要素的价值,各地区正积极探索数据要素交易平台的可行模式,加快在数据要素领域的布局。近日,深圳计算科学研究院崖山数据库系列产品受…

JDBC从入门到精通-笔记(一):JDBC基本概念与开发基础

视频资源:JDBC从入门到精通视频教程-JDBC实战精讲_哔哩哔哩_bilibili JDBC定义与本质 概念 什么是JDBC:Java DataBase Connectivity JDBC本质:SUN公司制定的一套接口(interface),java.sql.*。 面向接口调…

【progressBar-js】优雅的 前端进度条 构建!

progressBar-js JS 前端进度条小工具 您可以通过此工具来构建一个有效的工具条&#xff0c;接下来就是一个示例&#xff01; 使用示例 引入 progressBar-js 库 直接在这里将 css 和 js 文件引入进来就算是成功导入了哦&#xff01;&#xff01;&#xff01; <link href&…

SVN学习(001 svn安装)

尚硅谷SVN高级教程(svn操作详解) 总时长 4:53:00 共72P 此文章包含第1p-第p19的内容 介绍 为什么使用版本控制工具 版本控制工具的功能 版本控制简介 客户端服务器结构 c/s结构 服务端的结构&#xff1a; 服务程序 、版本库(存放我们上传的文件) 客户端的三个基本操作&#…

高考填报志愿,选专业和选学校,哪个优先?

一、 专业优先&#xff0c;还是学校优先&#xff1f; 专业和学校都非常重要&#xff0c;好的学校可以给你提供较高的学习平台&#xff0c;好的专业能够给将来的职业生涯提供便利。高考报考&#xff0c;每一个学校的每一个专业的分数都会不同&#xff0c;热门的专业分数较高&am…

Swift 周报 第五十三期

文章目录 前言新闻和社区苹果公司取得基于波束组合的信道状态信息&#xff08;CSI&#xff09;反馈专利&#xff0c;为 5G 网络中的信道状态信息&#xff08;CSI&#xff09;报告提供新方案关于在欧盟分发 App 的最新信息公司快评&#xff5c;新广告引发不满&#xff0c;苹果也…

大模型揭秘:AI与CatGPT在实体识别中的创新应用

摘要 尽管大规模语言模型 (LLM) 在各种 NLP 任务上已经取得了 SOTA 性能&#xff0c;但它在 NER 上的性能仍然明显低于监督基线。这是由于 NER 和 LLMs 这两个任务之间的差距&#xff1a;前者本质上是序列标记任务&#xff0c;而后者是文本生成模型。在本文中&#xff0c;我们…

被年轻人买爆的转运能量石,戴一天竟等于拍千次胸片?

离谱的事年年有&#xff0c;这几年可以说非常多&#xff01;‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ 尤其是这届年轻人&#xff0c;不知道什么时候开始&#xff0c;越来越迷信了&#xff01; 比如去年很…

基于在校学习平台MOOC的选课推荐系统

基于在校学习平台MOOC的选课推荐系统 1、效果 在线demo&#xff0c;点我查看 2、功能 根据学生于在校学习平台MOOC学习期间的选课记录等相关特征来对学生进行课程推荐。 采用数据挖掘技术&#xff0c;包括BPR、FM、CF&#xff0c;神经网络推荐&#xff0c;用户协同过滤推荐…