VVC之四:VTM中的数据结构(CS、CU、PU、TU等)

时间:2024-04-05 09:36:58

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. 基本数据模型示意图

VVC之四:VTM中的数据结构(CS、CU、PU、TU等)

3. CodingStructure 详解

  • 包含CodingUnit, PredictionUnit等对象,链接其与picture的映射关系。
  • 替代HM中TComDataCU类,但是CS并不局限于CTU,全局分配。CS区域大到可以覆盖整个帧,小到一个CU。
    – 上层CodingStructure包含了一帧中所有的CodingUnit, PredictionUnitTransformUnit
    – 下层CodingStructure是一个特定UnitArea的描述。
  • CodingStructure实例化后,内容为空
    – 使用addCU/PU/TU方法创建并映射到特定对象
    – 使用getCU/PU/TU获取处于全局绝对位置上的特定对象
  • 通过dynamic_cache动态申请资源以提升性能

使用CodingStructure进行自顶向下的RD搜索

  • 允许使用全局上下文transparent的局部编码
  • 遵循经典的best-temp向上传播方案
  • CodingStructure以表示一个局部UnitArea而建立,访问UnitArea之外的信息需要返回上层CodingStructure
  • 父节点不知道子节点,但是最好的子节点将传递给父节点