Android CCodec Codec2 (二十)C2Buffer与Codec2Buffer

在阅读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实例化过程:
请添加图片描述

4、Codec2Buffer

5、小结


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

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

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

相关文章

WPF怎么通过RestSharp向后端发请求

1.下载RestSharpNuGet包 2.请求类和响应类 public class ApiRequest {/// <summary>/// 请求地址/// </summary>public string Route { get; set; }/// <summary>/// 请求方式/// </summary>public Method Method { get; set; }/// <summary>//…

SQL Server 日志记录

SQL Server是一个关系数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;旨在有效地存储、组织、检索和操作大量结构化数据。SQL Server日志是监控数据库活动、排查问题和确保数据一致性的基础&#xff0c;这些日志记录了SQL Server实例中发生的事件的时间顺序。它们充当…

书生实战营第四期-基础岛第三关-浦语提示词工程实践

一、基础任务 任务要求&#xff1a;利用对提示词的精确设计&#xff0c;引导语言模型正确回答出“strawberry”中有几个字母“r”。 1.提示词设计 你是字符计数专家&#xff0c;能够准确回答关于文本中特定字符数量的问题。 - 技能&#xff1a; - &#x1f4ca; 分析文本&…

默认 iOS 设置使已锁定的 iPhone 容易受到攻击

苹果威胁研究的八个要点 苹果手机间谍软件问题日益严重 了解 Apple 苹果的设备和服务器基础模型发布 尽管人们普遍认为锁定的 iPhone 是安全的&#xff0c;但 iOS 中的默认设置可能会让用户面临严重的隐私和安全风险。 安全研究员 Lambros 通过Pen Test Partners透露&#…

双指针算法篇——一快一慢须臾之间解决问题的飘逸与灵动(3)

前言&#xff1a;本篇来到双指针算法介绍的最终篇&#xff0c;该文将通过三个同类型但难度逐渐累增的题目&#xff0c;再次强化对双指针算法的理解和运用。 相关题目及讲解 一. 两数之和 题目链接&#xff1a;LCR 179. 查找总价格为目标值的两个商品 - 力扣&#xff08;LeetC…

sparkSQL的UDF,最常用的regeister方式自定义函数和udf注册方式定义UDF函数 (详细讲解)

- UDF&#xff1a;一对一的函数【User Defined Functions】 - substr、split、concat、instr、length、from_unixtime - UDAF&#xff1a;多对一的函数【User Defined Aggregation Functions】 聚合函数 - count、sum、max、min、avg、collect_set/list - UDTF&#xff1a;…

Springcloud高校选课管理系统-计算机毕业设计源码27115

摘 要 随着信息技术的快速发展和高校信息化建设的深入推进&#xff0c;选课管理系统作为高校教育信息化建设的重要组成部分&#xff0c;其重要性和紧迫性日益凸显。传统的选课管理系统往往采用单体架构&#xff0c;存在系统耦合度高、可维护性差、扩展性不强等问题&#xff0c;…

ChatGPT 新体验:AI 搜索功能与订阅支付指南

就在凌晨&#xff0c;在 ChatGPT 迎来两周岁生日之际&#xff0c;OpenAI 重磅发布了 ChatGPT 的全新人工智能搜索体验。 期待已久的时刻终于到来&#xff0c; ChatGPT 正式转型成为一款革命性的 AI 搜索引擎&#xff01; 先来看看 ChatGPT 搜索&#xff1a;这次不是简单的加个…

奇瑞汽车:降阶模型在新能源汽车热管理仿真上的应用

随着新能源汽车的发展&#xff0c;对仿真技术的要求也越来越高。那么奇瑞汽车利用降阶模型在新能源汽车热管理仿真上做了哪些应用呢&#xff1f;本次内容主要从四个方面展开介绍&#xff1a; 1、 奇瑞汽车简介&#xff1b; 2、 热管理降阶模型开发的背景&#xff1b; 3、 高低…

RPC核心实现原理

目录 一、基本原理 二、详细步骤 三、额外考虑因素 RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;是一种计算机通信协议&#xff0c;也是一种用于实现分布式系统中不同节点之间进行通信和调用的技术。其实现原理主要可以分为以下几个步骤&…

HTML前端页面设计静态网站-仿百度

浅浅分享一下前端作业&#xff0c;大佬轻喷~ <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>百度&#xff08;伪&#xff09;</title><style>body {margin: 0;padding: 0;}.top-bar {dis…

Linux多线程(个人笔记)

Linux多线程 1.Linux线程概念1.1线程的优点1.2线程的缺点 2.Linux线程VS进程3.Linux线程控制3.1创建线程3.2线程tid及进程地址空间布局3.3线程终止3.4线程等待 4.分离线程5.线程互斥5.1互斥锁mutex5.2互斥锁接口5.3互斥锁实现原理5.4可重入VS线程安全 6.线程同步6.1条件变量6.2…

【MacOS实操】如何基于SSH连接远程linux服务器

MacOS上远程连接linux服务器&#xff0c;可以使用ssh命令pem秘钥文件连接。 一、准备pem秘钥文件 如果已经有pem文件&#xff0c;则跳过这一步。如果手上有ppk文件&#xff0c;那么需要先转换为pem文件。 macOS 的默认 SSH 客户端不支持 PPK 格式&#xff0c;你需要将 PPK 文…

基于CNN-LSTM的时间序列数据预测,15个输入1个输出,可以更改数据集,MATLAB代码

1. 数据收集与预处理 数据清洗&#xff1a;处理缺失值、异常值等。特征工程&#xff1a;提取有助于预测的特征。数据标准化&#xff1a;将时间序列数据标准化&#xff0c;使其具有零均值和单位方差&#xff0c;有助于模型训练。滑动窗口划分&#xff1a;将时间序列数据划分为多…

win 查看显卡支持 CUDA版本

在cmd 中执行 nvidia-smi 二、nvcc -V

Java算法OJ(6)归并分治

目录 1.前言 2.正文 2.1归并分治的概念 2.2计算数组的小和 2.2.1题目 2.2.2示例 2.2.3代码 2.3翻转对 2.3.1题目 2.3.2示例 2.3.3代码 3.小结 1.前言 哈喽大家好吖&#xff0c;今天继续来给大家带来Java算法——归并分治的讲解&#xff0c;学习这篇的前提可以先把…

QML项目实战:自定义Combox

目录 一.添加模块 import QtQuick.Controls 2.4 import QtQuick.Templates 2.4 as T import QtGraphicalEffects 1.15 import QtQuick 2.15 as T2 二.自定义Combox 1.combox文字显示 2.设置下拉图标显示 3.下拉框中选中背景设置 4.下拉框中选中文字设置 5.下拉框设置…

招聘系统哪个最好用?

在当今竞争激烈的商业环境中&#xff0c;企业为了保持竞争优势&#xff0c;对人才的需求愈发迫切。然而&#xff0c;面对海量的简历和繁杂的招聘流程&#xff0c;如何高效、精准地找到合适的人才&#xff0c;成为许多企业面临的难题。招聘系统因此应运而生&#xff0c;为企业提…

基于C语言实现的图书管理系统

使用Visual Studio 2022编译工具进行编写代码的。 项目源码直接奉上: book1.h头文件: #ifndef __BOOK1_H //预处理用于条件编译 避免头文件反复包含 #define __BOOK1_H#include<stdio.h> #include <string.h> #include<stdlib.h> #include<stdbool.h&g…

带你用Go实现二维码小游戏(下)

本篇文章我们进入项目最后的部署和监控搭建阶段&#xff0c;这一节会有很少的编码量&#xff0c;但是却能够带来最实用的知识和技术&#xff0c;快来阅读吧~ 5 Docker镜像打包部署 接下来就到了我们项目的部署阶段&#xff0c;优雅的项目必须要搭配优雅的部署方式&#xff01…