VTM中的数据结构
HM的代码复杂难懂,结构混乱,缺少数据和逻辑封装,Z-order和raster-order换来换去让人头痛不已,代码可读性比较差。同时HM中很多数据结构的设计都是针对其CU尺寸都是正方形而设计的,扩展性也不好。
为了解决HM数据结构复杂、代码可读性差、内存管理负责的问题,VTM使用的数据结构,使用了OO设计理念,对琐碎的计算进行封装,并跟内存管理逻辑,增强代码的可读性。 (移除了Z-index的概念,数据访问的两级参数也移除了(CTU->Z-index)).
OO设计原则:SOLID
- SRP:The Single Responsibility Principle 单一责任原则:接口或类与责任一一对应
- OCP: The Open-closed principle 开放-封闭原则:模块的行为是可扩展的,但是模块自身的代码是不应该被修改的
- LSP:The liskov substitution principle liskov 替换原则:所有引用基类的地方必须能够透明的使用其子类的对象。
- ISP: The Interface segregation principle 接口聚合原则:
- DIP:The dependency inversion principle 依赖转置原则:高层模块不应该依赖底层模块,两者都应该依赖抽象;抽象不应该依赖细节,细节应该依赖抽象
(水平有限,并没有完全理解)
参考:OO Design Principles(OO设计原则): SOLID
1. 数据结构概述
类 | 描述 |
---|---|
Size, Position, Area | 基本二维信息,size+position=area |
CompArea | 特定分量/通道的二维信息 |
UnitArea | 多通道信号的二维信息 |
AreaBuf | 管理线性内存中的一个二维信号的存储结构,包含内存操作方法(copy,fill 等) |
UnitAreaBuf | 管理线性内存中的多通道二维信号的存储结构,包含内存操作方法(copy,fill 等) |
PelStorage | 需要分配额外内存的UnitAreaBuf |
Picture | 包含元数据(slice信息等)以及输入输入数据 |
CodingUnit, PredictionUnit, TransformUnit | 与功能一一对应,包含相应信息(模式信息,深度信息等) |
CodingStructure | 管理CU、PU和TU等,链接基本单元与图片帧;包含自定向下进行RD搜索的方法 |
2. 基本数据模型示意图
3. CodingStructure 详解
- 包含
CodingUnit
,PredictionUnit
等对象,链接其与picture
的映射关系。 - 替代HM中
TComDataCU
类,但是CS并不局限于CTU,全局分配。CS区域大到可以覆盖整个帧,小到一个CU。
– 上层CodingStructure
包含了一帧中所有的CodingUnit
,PredictionUnit
和TransformUnit
。
– 下层CodingStructure
是一个特定UnitArea
的描述。 -
CodingStructure
实例化后,内容为空
– 使用addCU/PU/TU
方法创建并映射到特定对象
– 使用getCU/PU/TU
获取处于全局绝对位置上的特定对象 - 通过
dynamic_cache
动态申请资源以提升性能
使用CodingStructure
进行自顶向下的RD搜索
- 允许使用全局上下文transparent的局部编码
- 遵循经典的best-temp向上传播方案
-
CodingStructure
以表示一个局部UnitArea
而建立,访问UnitArea
之外的信息需要返回上层CodingStructure
- 父节点不知道子节点,但是最好的子节点将传递给父节点