Android CCodec Codec2 (十九)C2LinearBlock

在上一篇文章的结尾,我们看到fetchLinearBlock方法最终创建了一个C2LinearBlock对象。这一节,我们将深入了解C2LinearBlock是什么,它的作用是什么,以及它是如何被创建的。

1、_C2BlockFactory

先对上一篇文章的结尾内容做简单回顾:

  1. BufferPoolClient持有clone的native_handle_t以及bufferId;
  2. BufferPoolClient将bufferId和ConnectionId封装为BufferPoolData,将它与native_handle_t一并返回给调用者;
  3. C2PooledBlockPool拿到返回之后,先用native_handle_t创建出一个C2LinearAllocation,然后将BufferPoolData封装为_C2BlockPoolData;
  4. C2PooledBlockPool调用_C2BlockFactory的CreateLinearBlock方法,将C2LinearAllocation和_C2BlockPoolData作为参数创建出C2LinearBlock。

为什么要大费周章再封装一层C2LinearBlock呢?拿到C2LinearAllocation后我们可以调用它的map方法拿到虚拟内存,从而实现buffer读写。但是框架设计者可能是希望对buffer提供读写控制,比如应用层可以拿到input buffer的读写权限,而在组件只能拿到input buffer的读权限。接下来就先来看C2LinearBlock是如何创建的。

_C2BlockFactory是一个内部的工厂类,提供了一组静态方法,部分方法有多个重载:

这一章只看CreateLinearBlock方法:

cpp 复制代码
std::shared_ptr<C2LinearBlock> _C2BlockFactory::CreateLinearBlock(
        const std::shared_ptr<C2LinearAllocation> &alloc,
        const std::shared_ptr<_C2BlockPoolData> &data, size_t offset, size_t size) {
    std::shared_ptr<C2Block1D::Impl> impl =
        std::make_shared<C2Block1D::Impl>(alloc, data, offset, size);
    return std::shared_ptr<C2LinearBlock>(new C2LinearBlock(impl, *impl));
}

方法内部先使用C2LinearAllocation、_C2BlockPoolData、offset和capacity创建了一个C2Block1D::Impl对象,然后再创建了一个C2LinearBlock对象。

先来看C2Block1D相关的类图:

2、C2Acquirable

3、C2WriteView

4、C2ReadView

5、小结


原文阅读:
Android Codec2(十九)C2LinearBlock

相关推荐
AFinalStone2 小时前
Android 7系统异常问题排查(四)Framework层(上)—System Server Watchdog
android·系统异常
沐禾安信3 小时前
将AVCHD转换为AVI的3种简单方法
音视频·格式转换·视频转换·gif动图
宝杰X74 小时前
Android Room3 多平台数据库
android·数据库
mardelan5 小时前
2026年iOS短视频总结工具测评强识别提效率 整理清晰更省心
ios·音视频
山顶夕景6 小时前
【VQA】VideoChat3长视频理解模型
音视频·多模态·视频理解·长视频
huibin1478523696 小时前
热缓解学习记录
android·学习
MindUp9 小时前
面试录音视频的AI复盘方案:从语音转录到RAG问答的技术实践
人工智能·面试·音视频
小田的博客9 小时前
SAP MM 供应商银行主数据更新报错!message R1228!
android·java·服务器
一笑的小酒馆11 小时前
Android智能猫砂盆视频加载慢卡顿问题分析
android
EasyDSS11 小时前
企业培训视频散落各处?EasyDSS视频直播点播平台模块如何让知识资产“活“起来
音视频·媒体·直播·点播·easydss