Android CCodec Codec2 (四)C2Param - Ⅱ

news2024/9/21 18:44:50

这一篇内容我们来解答复杂参数定义过程中提出的疑问,本文有大量的模板和宏展开,请耐心阅读。

1、不含灵活数组的复杂结构体定义

DEFINE_AND_DESCRIBE_C2STRUCT和C2FIELD是不能分开的,使用时必须要按顺序依次调用这两个宏定义。宏定义比较复杂,我们以C2StoreIonUsageStruct为例直接看展开后的样子。

将DEFINE_AND_DESCRIBE_C2STRUCT(StoreIonUsage)展开变成:

    public: 
      enum : uint32_t { CORE_INDEX = kParamIndexStoreIonUsage }; 
    private: 
      const static std::vector<C2FieldDescriptor> _FIELD_LIST__unused; /**< structure fields */ 
    public: 
      typedef C2StoreIonUsageStruct _type; /**< type name shorthand */ 
      static const std::vector<C2FieldDescriptor> FieldList(); /**< structure fields factory */
} C2_PACK; 

const std::vector<C2FieldDescriptor> C2StoreIonUsageStruct::FieldList() { return _FIELD_LIST; } 

const std::vector<C2FieldDescriptor> C2StoreIonUsageStruct::_FIELD_LIST = {

将所有的C2FIELD展开变成:

    C2FieldDescriptor(&((_type*)(nullptr))->usage, "usage"),
    C2FieldDescriptor(&((_type*)(nullptr))->capacity, "capacity"),
    C2FieldDescriptor(&((_type*)(nullptr))->heapMask, "heap-mask"),
    C2FieldDescriptor(&((_type*)(nullptr))->allocFlags, "alloc-flags"),
    C2FieldDescriptor(&((_type*)(nullptr))->minAlignment, "min-alignment"),

将所有的内容拼接起来得到完整的结构体定义:

struct C2StoreIonUsageStruct {
    inline C2StoreIonUsageStruct() {
        memset(this, 0, sizeof(*this));
    }

    inline C2StoreIonUsageStruct(uint64_t usage_, uint32_t capacity_)
        : usage(usage_), capacity(capacity_), heapMask(0), allocFlags(0), minAlignment(0) { }

    uint64_t usage;        ///< C2MemoryUsage
    uint32_t capacity;     ///< capacity
    int32_t heapMask;      ///< ion heapMask
    int32_t allocFlags;    ///< ion allocation flags
    uint32_t minAlignment; ///< minimum alignment
    
    public: 
      enum : uint32_t { CORE_INDEX = kParamIndexStoreIonUsage }; 
    private: 
      const static std::vector<C2FieldDescriptor> _FIELD_LIST __unused; /**< structure fields */ 
    public: 
      typedef C2StoreIonUsageStruct _type; /**< type name shorthand */ 
      static const std::vector<C2FieldDescriptor> FieldList(); /**< structure fields factory */
} C2_PACK; 

const std::vector<C2FieldDescriptor> C2StoreIonUsageStruct::FieldList() { return _FIELD_LIST; } 

const std::vector<C2FieldDescriptor> C2StoreIonUsageStruct::_FIELD_LIST = {
    C2FieldDescriptor(&((_type*)(nullptr))->usage, "usage"),
    C2FieldDescriptor(&((_type*)(nullptr))->capacity, "capacity"),
    C2FieldDescriptor(&((_type*)(nullptr))->heapMask, "heap-mask"),
    C2FieldDescriptor(&((_type*)(nullptr))->allocFlags, "alloc-flags"),
    C2FieldDescriptor(&((_type*)(nullptr))->minAlignment, "min-alignment"),
};

好家伙,难道这就是宏魔法吗?!

DEFINE_AND_DESCRIBE_C2STRUCT定义在C2Param.h中,它的作用是给结构体定义一个匹配的CORE_INDEX,并且开始描述结构体的字段,该宏必须要在结构体定义的最后面使用。

从展开后的代码中我们可以看到,它定义了一个枚举常量CORE_INDEX,值为kParamIndexStoreIonUsage。
这里的CORE_INDEX就是上一篇文章中所说的BaseIndex,与结构体相绑定的独一无二的索引。所以在定义复杂结构体时除了结构体本身和对应的字符串外,还要定义一个索引值。索引的命名规则是以kParamIndex为前缀,加上结构体名称中的自定义部分。

索引值的定义参考C2Config.h中的C2ParamIndexKind,里面定义了框架使用的所有结构体索引。如果要自定义索引应该怎么办呢,索引值应该从什么地方开始?在C2Param.h中也有一个枚举,厂商自定义的索引从0x8000开始。

IS_VENDOR_FLAG  = 0x00008000,

除了CORE_INDEX外,DEFINE_AND_DESCRIBE_C2STRUCT还提供了描述结构体的方法FieldList,此方法会返回一个C2FieldDescriptor列表,构建C2FieldDescriptor对象需要传入字段相对结构体的偏移量,以及字段名称,具体C2FieldDescriptor是做什么用的,我们会在参数反射一文中做了解。

C2FIELD用于帮助生成C2FieldDescriptor的,它会自动帮助我们计算偏移量,有两点需要注意:

  • 填入的参数的顺序需要和结构体字段定义顺序相同;
  • 第二个宏参数填入的字段名称可以和结构体成员名称不同。

2、包含灵活数组的复杂结构体定义

3、No-Flex C2GlobalParam

4、Flex C2GlobalParam

5、C2PortParam

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【机器学习-监督学习】神经网络与多层感知机

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科&#xff0c;通过算法和模型让计算机从数据中学习&#xff0c;进行模型训练和优化&#xff0c;做出预测、分类和决策支持。Python成为机器学习的首选语言&#xff0c;…

java-Mybaits框架01

1.框架概念 在基础语言之上&#xff0c;对各种基础功能进行封装&#xff0c;方便开发者&#xff0c;提高开发效率&#xff1b; java后端框架 mybaits&#xff1a;对jdbc进行封装 Spring&#xff1a;对整个java后端架构进行管理。 SpringWeb&#xff1a;对web&#xff08;S…

vxe-grid 利用dayjs提供的方法来格式化, 计算二个日期之间的年数/年龄

1、安装dayjs pnpm add dayjs yarn add dayjs npm install dayjs 2、导入 import dayjs from dayjs; 3、vxe-grid列&#xff1a; export const UserColumns: VxeGridPropTypes.Columns [ ... {title: 年龄,width: 70,field: old,showOverflow: tooltip,align: center,sortabl…

android studio 设置gradle jdk

1. 左上角点击file 2. 按照如下点击&#xff1a; 3. 即可修改gradle jdk

EasyExcel文件导出简洁版

1. EasyExcel简介 EasyExcel是一个基于Java的简单、快速、lightweight的Excel处理库。它的主要特点包括: 轻量级设计: EasyExcel的jar包大小仅约1MB,相比较其他Excel处理库如Apache POI来说更加轻量。 采用内存友好的流式读写模式,无需一次性加载整个Excel文件到内存,大大减少…

Linux的CPU调度优化详解

一、引言 随着计算机硬件技术的不断发展和进步&#xff0c;现代服务器和工作站通常都配备了多核CPU&#xff0c;为了充分发挥多核处理器的性能优势&#xff0c;Linux系统提供了多种CPU调度器以及相关的参数设置&#xff0c;以便进行CPU调度优化&#xff0c;提高系统的整体性能…

AI 音频/文本对话机器人:Whisper+Edge TTS+OpenAI API构建语音与文本交互系统(简易版)

文章目录 前言思路&#xff1a;环境配置代码1. 加载Whisper模型2. 使用Whisper语音转文本3. 使用OpenAI API生成文本进行智能问答4. 实现文本转语音功能5. 合并音频文件6. 构建Gradio界面注意 总结 前言 在本篇博客中&#xff0c;我将分享如何利用Whisper模型进行语音转文本&a…

GFS系统架构

GFS系统架构 针对上述观察&#xff0c;我们发现它们与早期文件系统的设计假设存在显著差异。为此&#xff0c;我们采取了以下解决方案&#xff1a; 组件故障&#xff1a;我们接受故障为常态&#xff0c;系统设计以自我监控和快速恢复为原则&#xff0c;适应低成本硬件环境下的…

基础算法--递推算法[信奥一本通]

本节所讲题源自【信奥一本通】C版&#xff1a;基础算法-第三章-递推算法 相信大家应该都接触过数列的概念。哎哟&#xff0c;一直在跟数组打交道&#xff0c;说数列感觉好陌生&#xff0c;哈哈。数列中的迭代法大家都还记得吗&#xff1a;通过反复应用特定规则&#xff0c;推导…

Linux系统中的Btrfs技术

在Linux操作系统中&#xff0c;文件系统扮演着至关重要的角色&#xff0c;负责管理数据存储、文件访问以及系统的稳定性。其中&#xff0c;Btrfs&#xff08;B-tree file system&#xff09;作为一种先进的文件系统技术&#xff0c;正在逐渐引起广泛关注和应用。本文将深入探讨…

【算法】深入浅出聚类算法:原理、应用与Java实现

一、引言 在数据分析和机器学习中&#xff0c;聚类算法是一种无监督学习技术&#xff0c;用于将数据集中的对象自动划分为多个子集&#xff0c;每个子集称为一个簇。聚类算法在多个领域有着广泛的应用&#xff0c;如图像处理、信息检索、市场细分、生物信息学等。本文将介绍聚…

匿名函数详解

lambda表达式&#xff1a; [](){} []捕获列表 () 函数的参数列表 {}函数的函数体 #include<iostream> #include<string> using std::cout; using std::endl; using std::string; void func() {cout << "hello func" << endl; }void tes…

【系统分析师】-WEB开发技术

目录 1、负载均衡技术 1.1、应用层负载均衡 1.2、传输层负载均衡 2、有状态和无状态问题 3、CDN内容分发网络 4、持久化技术 1、负载均衡技术 1.1、应用层负载均衡 1&#xff09;http 重定向 HTTP 重定向就是应用层的请求转发。用户的请求其实已经到了HTTP重定向负载均…

深度学习--负采样技术及其扩展详解

负采样技术及其扩展详解 负采样&#xff08;Negative Sampling&#xff09;是一种常用于自然语言处理和推荐系统中的技术&#xff0c;主要目的是优化模型的训练效率和效果。负采样技术的典型应用场景包括词向量训练&#xff08;如Word2Vec&#xff09;、推荐系统中的隐语义模型…

使用 Nuxt 的 showError 显示全屏错误页面

title: 使用 Nuxt 的 showError 显示全屏错误页面 date: 2024/8/26 updated: 2024/8/26 author: cmdragon excerpt: 摘要:本文介绍Nuxt.js中的showError方法用于显示全屏错误页面,包括其参数类型及使用方式,并演示了如何在页面中捕获并展示错误,还介绍了useError用于管理…

MySQL笔记-对mysql.sock.lock认识(2024-06-12)

此篇博文记录到个人笔记的时间为2024-06-12。 背景 每次服务器非正常关机&#xff0c;或者制作的docker镜像有问题时或没手动停mysql时&#xff0c;运行 mysqld --userroot 时&#xff0c;mysql总会启动失败&#xff0c;查看/var/log/mysqld.log时会有如下报错信息&#xff…

你的软件系统安全吗

如果你的软件系统可以通过网络访问, 可以由多人操作, 可以访问或操作敏感数据, 或者可能暴露隐私, 等等, 请一定要保护你的系统. 那么你的软件系统安全吗? 一. 先问自己如下 4 个问题 1. What are we working on? 我们的系统在干啥? 例如电商系统: 我们在卖啥?提供什么售前…

【变化检测】基于Tinycd建筑物(LEVIR-CD)变化检测实战及ONNX推理

主要内容如下&#xff1a; 1、LEVIR-CD数据集介绍及下载 2、运行环境安装 3、Tinycd模型训练与预测 4、Onnx运行及可视化 运行环境&#xff1a;Python3.8&#xff0c;torch1.12.0cu113 likyoo变化检测源码&#xff1a;https://github.com/likyoo/open-cd 使用情况&#xff1a…

在vue2中,使用计算属性,具体代码如下:

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

爆改YOLOv8 | 利用CPA-Enhancer提高低照度物体检测(适用于雨,雪,雾天)

1&#xff0c;本文介绍 CPA-Enhancer通过链式思考提示机制实现了对未知退化条件下图像的自适应增强&#xff0c;显著提升了物体检测性能。其插件式设计便于集成到现有检测框架中&#xff0c;并在物体检测及其他视觉任务中设立了新的性能标准&#xff0c;展现了广泛的应用潜力。…