Android CCodec Codec2 (二十)C2Buffer与Codec2Buffer

ops/2024/11/13 9:57:51/

在阅读Codec2框架代码时,我们可能会发现好几个名称中都带有“buffer”的类,如MediaCodecBuffer、ABuffer、CCodecBuffers、Codec2Buffer以及C2Buffer。它们分别是什么?各自承担着什么功能?它们之间有何联系?本文将围绕这三个问题展开了解。

1、ABuffer

ABuffer不是Codec2框架中的类型,它是由Android Media Framework定义的,类型声明于 /frameworks/av/media/module/foundation/include/media/stagefright/foundation/ABuffer.h。从Android 14开始,这个头文件的路径不再置于libstagefright下,改到module下。

ABuffer是对裸指针的封装,可以记录buffer的大小,buffer地址,写入数据长度等信息。ABuffer提供了两种构造函数:

  • 指定buffer大小,在ABuffer内部进行malloc
ABuffer::ABuffer(size_t capacity): mRangeOffset(0),mInt32Data(0),mOwnsData(true) {mData = malloc(capacity);if (mData == NULL) {mCapacity = 0;mRangeLength = 0;} else {mCapacity = capacity;mRangeLength = capacity;}
}
  • 使用已有的buffer来创建ABuffer,此时除了要传入裸指针外,还要提供buffer的容量(capacity)
ABuffer::ABuffer(void *data, size_t capacity): mData(data),mCapacity(capacity),mRangeOffset(0),mRangeLength(capacity),mInt32Data(0),mOwnsData(false) {
}

ABuffer有如下几个成员含义需要了解:

  • mData:裸指针,buffer的起始地址;
  • mCapacity:buffer的大小/容量;
  • mRangeOffset:它是对buffer可用范围限定的一部分,表示可用地址相对起始地址的偏移量;
  • mRangeLength:它是对buffer可用范围限定的另一部分,表示buffer可用长度;

限定范围可以用setRange方法完成:

void ABuffer::setRange(size_t offset, size_t size) {CHECK_LE(offset, mCapacity);CHECK_LE(size, mCapacity - offset);mRangeOffset = offset;mRangeLength = size;
}

了解这几个成员后,ABuffer的其他方法就很好理解了:

uint8_t *base() { return (uint8_t *)mData; }
uint8_t *data() { return (uint8_t *)mData + mRangeOffset; }
size_t capacity() const { return mCapacity; }
size_t size() const { return mRangeLength; }
size_t offset() const { return mRangeOffset; }
  • base:返回buffer起始地址;
  • data:返回可写起始地址,如果不调用setRange,默认起始等于base;
  • capacity:返回buffer容量;
  • size:返回buffer可用长度,如果不调用setRange,默认大小等于capacity;
  • offset:返回可用buffer的偏移量;

2、MediaCodecBuffer

MediaCodecBuffer是对ABuffer的封装,在数据的基础上增加了格式信息。创建MediaCodecBuffer需要传入参数format和一个ABuffer:

MediaCodecBuffer(const sp<AMessage> &format, const sp<ABuffer> &buffer);

MediaCodec的base、data、capacity等方法调用的是ABuffer对应方法,这里不再展开。要了解的是MediaCodecBuffer内部有三个为Codec2设计的虚函数:

virtual std::shared_ptr<C2Buffer> asC2Buffer() { return nullptr; }virtual bool canCopy(const std::shared_ptr<C2Buffer> &buffer) const {(void)buffer;return false;
}virtual bool copy(const std::shared_ptr<C2Buffer> &buffer) {(void)buffer;return false;
}

我们现在还不知道C2Buffer是什么,所以暂且知道有这三个方法就好:

  • asC2Buffer:使用当前buffer创建一个C2Buffer对象;
  • canCopy:测试是否能将数据从C2Buffer拷贝到当前buffer中;
  • copy:将数据从C2Buffer拷贝到buffer中;

3、C2Buffer

C2Buffer所在的头文件没有对该类做详细注释,要了解它的功能还要从它的结构来看。先来看C2Buffer的UML类图:

C2Buffer的构造函数都是protected,想要创建C2Buffer实例需要调用静态方法CreateLinearBuffer或者CreateGraphicBuffer。以CreateLinearBuffer为例看一下C2Buffer实例化过程:
请添加图片描述

Codec2Buffer_97">4、Codec2Buffer

5、小结


原文阅读:
Android Codec2(二十)C2Buffer与Codec2Buffer


http://www.ppmy.cn/ops/132899.html

相关文章

昇思大模型平台打卡体验活动:项目1基于MindSpore实现BERT对话情绪识别

基于MindSpore实现BERT对话情绪识别 1. 模型简介 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是由Google于2018年末开发并发布的一种新型语言模型&#xff0c;基于Transformer架构中的Encoder&#xff0c;并且具有双向编码的特性。…

Java中的时间类型:从java.util.Date到java.time

引言 在Java编程中&#xff0c;时间处理是一个常见且重要的任务。无论是记录日志、处理日期、计算时间差&#xff0c;还是进行定时任务&#xff0c;我们都需要与时间类型打交道。随着Java版本的迭代&#xff0c;时间处理的API也在不断演进&#xff0c;从早期的java.util.Date到…

Android Framework 框架层主要功能类的基本介绍

Android 框架层简介 Android框架层(Android Framework)是Android操作系统中负责提供应用程序编程接口(API)的一部分,它构成了Android的中间层,位于操作系统核心与应用层之间。框架层的主要功能是为应用开发者提供各种服务和功能,以便他们能够更容易地构建Android应用。…

【360】基于springboot的志愿服务管理系统

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装志愿服务管理系统软件来发挥其高效地信息处理的作用&#x…

贪心算法day3(最长递增序列问题)

目录 1.最长递增三元子序列 2.最长连续递增序列 1.最长递增三元子序列 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;我们只需要设置两个数进行比较就好。设a为nums[0]&#xff0c;b 为一个无穷大的数&#xff0c;只要有比a小的数字就赋值…

Linux命令学习,diff 命令

diff 是 Linux 和 Unix 系统中的一个命令行工具&#xff0c;用于比较两个文件的内容&#xff0c;并显示它们之间的差异。diff 命令非常有用&#xff0c;特别是在代码审查、文件同步和版本控制中。 基本用法 diff [选项] 文件1 文件2 常见参数&#xff1a; -i 或 --ignore-ca…

深度学习为什么不用二阶优化?

1. 计算复杂度与资源开销 Hessian矩阵的规模&#xff1a;在神经网络中&#xff0c;二阶优化需要计算损失函数相对于所有模型参数的二阶偏导数&#xff0c;这形成了一个巨大的 Hessian 矩阵。假设一个神经网络有 n 个参数&#xff0c;那么 Hessian 矩阵的大小是 nn&#xff0c;…

机器学习系列----介绍前馈神经网络和卷积神经网络 (CNN)

前言 在深度学习领域&#xff0c;神经网络是一种模拟人脑神经元结构和功能的数学模型。它通过大量的层次结构和参数调整来实现模式识别、分类、回归等任务。常见的神经网络结构有前馈神经网络&#xff08;Feedforward Neural Networks&#xff0c;简称 FNN&#xff09;和卷积神…