Android CCodec Codec2 (二十)C2Buffer与Codec2Buffer

news/2024/11/8 7:34:34 标签: android, 音视频, Android, Codec2, CCodec

在阅读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.niftyadmin.cn/n/5743516.html

相关文章

macos中安装和设置ninja

1、在安装ninja的过程中需要先安装re2c(github地址&#xff1a;https://github.com/skvadrik/re2c): git clone https://github.com/skvadrik/re2c.git&#xff08;也可直接下载最新的release压缩包&#xff0c;并解压。下载地址&#xff1a;https://github.com/skvadrik/re2c…

[论文阅读]Secure IP Address Allocation at Cloud Scale

Secure IP Address Allocation at Cloud Scale http://arxiv.org/abs/2210.14999 NDSS - Network and Distributed Systems Security Symposium (2025) 随着云计算和云基础设施的广泛应用&#xff0c;云服务提供商必须管理大量的网络资源&#xff0c;其中IP地址分配是重要的…

【Linux】Linux下查看cpu信息指令(top/mpstat/iostat/pidstat)说明

top命令 top(1) - Linux manual page (man7.org) top查看总的CPU利用率 us: 用户空间消耗的CPU资源占比&#xff0c;进程在用户态执行函数调用&#xff0c;编解码消耗的都是us sy: 内核空间消耗的CPU资源占比&#xff0c;进程调用系统调用达到内核后会增加sy的消耗 ni&…

浅谈语言模型推理框架 vLLM 0.6.0性能优化

在此前的大模型技术实践中&#xff0c;我们介绍了加速并行框架Accelerate、DeepSpeed及Megatron-LM。得益于这些框架的助力&#xff0c;大模型的分布式训练得以化繁为简。 然而&#xff0c;企业又该如何将训练完成的模型实际应用部署&#xff0c;持续优化服务吞吐性能&#xf…

salesforce case可以新建一个roll up 字段,统计出这个case下的email数量吗

在 Salesforce 中&#xff0c;标准的 Roll-Up Summary 字段仅支持在主对象和子对象之间的聚合统计&#xff0c;而邮件&#xff08;Email Message&#xff09;通常与 Case 是通过活动&#xff08;Activity&#xff09;或任务&#xff08;Task&#xff09;间接关联的&#xff0c;…

【Ubuntu20】VSCode Python代码规范工具配置 Pylint + Black + MyPy + isort

​ 常用工具&#xff1a; 在 Ubuntu20 下&#xff0c;有以下常见的 Python 代码工具&#xff1a; 静态分析工具&#xff1a; Pylint 和 Flake8 功能范围&#xff1a;Pylint功能非常强大&#xff0c;能够检查代码质量、潜在错误、代码风格、复杂度等多个方面, 并生成详细的报…

网站架构知识之Ansible(day020)

1.Ansible架构 Inventory 主机清单:被管理主机的ip列表,分类 ad-hoc模式: 命令行批量管理(使用ans模块),临时任务 playbook 剧本模式: 类似于把操作写出脚本,可以重复运行这个脚本 2.修改配置 配置文件&#xff1a;/etc/ansible/ansible.cfg 修改配置文件关闭主机Host_key…

使用亚马逊 S3 连接器为 PyTorch 和 MinIO 创建地图式数据集

在深入研究 Amazon 的 PyTorch S3 连接器之前&#xff0c;有必要介绍一下它要解决的问题。许多 AI 模型需要使用无法放入内存的数据进行训练。此外&#xff0c;许多为计算机视觉和生成式 AI 构建的真正有趣的模型使用的数据甚至无法容纳在单个服务器附带的磁盘驱动器上。解决存…