Android CCodec Codec2 (十八)C2PooledBlockPool

news/2024/10/27 21:13:38/

在这篇文章中,我们首先将了解C2BlockPool是什么,随后会探讨C2BlockPool与buffer pool以及C2Allocator之间的关系。最后,我们将深入了解C2BlockPool的一个子类—C2PooledBlockPool的具体实现方式,以及它是如何分配buffers的。

1、C2BlockPool

Codec2框架使用BlockPool封装C2Allocator和bufferpool,我们可以通过它来分配/管理buffer。我们可以用C2BlockPool分配linear(1D),circular(1D)以及graphic(2D) blocks,block翻译为内存块,可以理解为一块buffer。C2BlockPool声明于C2Buffer.h,它定义了两个纯虚函数:

  • getLocalId:创建C2BlockPool子类实例时,需要传入一个独一无二的id,此方法返回该id;
  • getAllocatorId:返回C2BlockPool依赖的C2Allocator id;

此外,C2BlockPool还定义了5个虚函数并提供了默认空实现,下面列出三个:

  • fetchLinearBlock:获取一块1D buffer;
  • fetchCircularBlock:获取一块环形buffer,暂不了解;
  • fetchGraphicBlock:获取一块2D buffer;

在大多数情况下,C2BlockPool需要依赖于C2Allocator来分配buffer。我们之前了解到,C2Allocator的实现通常专注于1D或2D buffer的分配,因此,一个C2BlockPool实例通常只能专注于分配一种特定类型的buffer。

另外,C2Allocator和C2BlockPool还有一层对应关系,具体可以参考如下代码:

c2_status_t _createBlockPool(C2PlatformAllocatorStore::id_t allocatorId,std::vector<std::shared_ptr<const C2Component>> components,C2BlockPool::local_id_t poolId,std::shared_ptr<C2BlockPool> *pool) {// ......switch(allocatorId) {case C2PlatformAllocatorStore::ION: /* also ::DMABUFHEAP */res = allocatorStore->fetchAllocator(C2PlatformAllocatorStore::ION, &allocator);std::shared_ptr<C2BlockPool> ptr(new C2PooledBlockPool(allocator, poolId), deleter);break;case C2PlatformAllocatorStore::BLOB:res = allocatorStore->fetchAllocator(C2PlatformAllocatorStore::BLOB, &allocator);std::shared_ptr<C2BlockPool> ptr(new C2PooledBlockPool(allocator, poolId), deleter);break;case C2PlatformAllocatorStore::GRALLOC:case C2AllocatorStore::DEFAULT_GRAPHIC:res = allocatorStore->fetchAllocator(C2AllocatorStore::DEFAULT_GRAPHIC, &allocator);std::shared_ptr<C2BlockPool> ptr(new C2PooledBlockPool(allocator, poolId), deleter);break;case C2PlatformAllocatorStore::BUFFERQUEUE:res = allocatorStore->fetchAllocator(C2PlatformAllocatorStore::BUFFERQUEUE, &allocator);std::shared_ptr<C2BlockPool> ptr(new C2BufferQueueBlockPool(allocator, poolId), deleter);break;default:std::shared_ptr<C2BlockPool> ptr;res = C2PlatformStorePluginLoader::GetInstance()->createBlockPool(allocatorId, poolId, &ptr, deleter);break;}return res;
}

对于Codec2框架提供的C2Allocator和C2BlockPool:

  • 如果Allocator id为BUFFERQUEUE,需要创建C2BufferQueueBlockPool;
  • 如果Allocator id为ION或GRALLOC,则需要创建C2PooledBlockPool;

如果厂商需要自定义Allocator,那么也要实现一个对应的C2BlockPool,实例创建使用C2PlatformStorePluginLoader的createBlockPool来完成。

2、C2PooledBlockPool

C2PooledBlockPool用于管理一组预先分配的内存块,这些内存块可以被重复使用,以避免频繁的内存分配和释放操作。C2PooledBlockPool通常用于那些对内存块的大小和数量有一定需求,但这些需求相对固定的情况。

先来看一下C2PooledBlockPool的UML类图:

在这里插入图片描述

C2PooledBlockPool::C2PooledBlockPool(const std::shared_ptr<C2Allocator> &allocator,const local_id_t localId,BufferPoolVer ver): mAllocator(allocator), mLocalId(localId), mBufferPoolVer(ver) {if (mBufferPoolVer == VER_HIDL) {mImpl = std::make_unique<Impl>(allocator);}if (mBufferPoolVer == VER_AIDL2) {mImpl2 = std::make_unique<Impl2>(allocator);}
}

创建C2PooledBlockPool需要传入两个参数:

  • allocator:C2BlockPool内部使用的C2Allocator;
  • localId:当前进程独一无二的C2BlockPool id;

3、buffer获取过程分析(一)

4、buffer获取过程分析(二)

5、小结


原文阅读:
Android Codec2(十八)C2PooledBlockPool

扫描下方二维码,关注公众号《青山渺渺》阅读音视频开发内容。


http://www.ppmy.cn/news/1542432.html

相关文章

Python爬虫教程:从入门到精通

Python爬虫教程&#xff1a;从入门到精通 前言 在信息爆炸的时代&#xff0c;数据是最宝贵的资源之一。Python作为一种简洁而强大的编程语言&#xff0c;因其丰富的库和框架&#xff0c;成为了数据爬取的首选工具。本文将带您深入了解Python爬虫的基本概念、实用技巧以及应用…

第六章 6.8 List

List基础知识 List家族特点&#xff1a;有序可重复 List接口常用方法&#xff1a; List接口特有迭代 源码LisrIterator继承Iterator 通用方法特有方法 void add&#xff08;E e&#xff09; 添加元素 ListIterator<String> li names.listIterator(); while (li.hasNe…

ProteinMPNN中的优化器封装类

NoamOpt 类实现了一个优化器的封装器,它用于动态调整学习率,并且特别常用于 Transformer 模型的训练中。这个类主要实现了 Noam 学习率调度(Noam learning rate schedule),它的学习率会随着训练步数的增加而变化,结合 warmup 步骤来达到稳定和高效的训练效果。 NoamOpt类…

网络空间安全之一个WH的超前沿全栈技术深入学习之路(8-1):主动信息收集之ping、Nmap 就怕你学成黑客啦!

欢迎各位彦祖与热巴畅游本人专栏与博客 你的三连是我最大的动力 以下图片仅代表专栏特色 [点击箭头指向的专栏名即可闪现] 专栏跑道一 ➡️网络空间安全——全栈前沿技术持续深入学习 专栏跑道二 ➡️ 24 Network Security -LJS ​ ​ ​ 专栏跑道三 ➡️ MYSQL REDIS Advan…

VUE中文本域默认展示最底部内容

文本域内容 <textarea ref"textareaRef" style"width: 100%; resize: none;" readonly v-model"errorLog" rows"15"></textarea> 样式展示 this.$nextTick(() > { // 使用$refs获取文本域的DOM元素 const textareaInfo…

window. print()打印input的值

网页打印input的值为空&#xff0c;使用console.log打印网页代码&#xff0c;input的值发生改变后网页代码是没有变化的&#xff0c;所以打印input是空值。 解决思路是将input的值给上一级的div。 比如 < input class" layui-input-inline" name" name"…

【FISCO BCOS】二十二、使用Key Manager加密区块链节点

#1024程序员节&#xff5c;征文# 落盘加密是对节点存储在硬盘上的内容进行加密&#xff0c;加密的内容包括&#xff1a;合约的数据、节点的私钥。具体的落盘加密介绍&#xff0c;可参考&#xff1a;落盘加密的介绍&#xff0c;今天我们来部署并对节点进行落盘加密。 环境&a…

软件分享丨PDF Shaper

【资源名】PDF Shaper 【地址】https://www.pdfshaper.com/ 【资源介绍】 PDF Shaper Professional是一款功能强大的PDF文档编辑与转换工具&#xff0c;使用它可以对PDF文件进行各种转换、提取、合并、旋转、加密、解密等编辑操作&#xff0c;主要功能有分割和合并PDF文件&…