VTM的编码结构

基本数据

Position: (x,y)

对应一个像素点的位置;

Size: (width,height);

对应一个(width * height)的矩形区域;

Area: (position,size) / (x,y,width,height);

对应一个像素位置为(x,y),大小为(width * height)的矩形区域。

CompArea: (Area, ChromaFormat, ComponentID)

对应一个多分量(Y,U,V)信号的一个指定分量的一个Area
ChromaFormat是指视频的采样格式400、420、422、444.
ComponentID是指Y、Cb、Cr.

UnitArea:(ChromaFormat, Area/CompArea)

对应多通道信号的一个Area;
由不同分量的CompArea组成的编码块;

CodingUnit: (UnitArea),描述用这个UnitArea描述的area是如何编码的;
PredictionUnit: (UnitArea),描述这个UnitArea的预测信号是怎么生成;
TransfromUnit: (UnitArea),描述这个UnitArea的变化编码是如何应用的;

CodingStructrue:

管理CodingUnit,将他们和picture相关联;
包含用于从上至下的RD 搜索的额外的函数;

Picture:

包含输入输出信号还有元数据(Slice 信息等);

信号存储

AreaBuf

描述单分量二维信号在线性存储器中的存储布局;
包含简单的操作(复制、填充等);

UnitAreaBuf

描述多分量二维信号在线性存储器中的存储布局;
包含点的操作(复制、填充等)

PelStorage

一个分配内存的UnitAreaBuf;

基础模型

VTM的编码结构

CodingStructure

结构

– 包含CodingUnit等对象,将他们映射到picture中

– 全局变量
Top-Level的CodingStructrue包含一帧中所有的CU,PU和TU
Sub-Level的CodingStructrue包含一个指定的UnitArea的表示

–在构建后是空的,需要填充
addCU/PU/TU 方法构建并且映射特定的对象
getCU/PU/TU获取特定的对象的地址,通过使用全局Position

–动态分配所需要的内存
使用dynamic_cache
CodingStructure的具体代码是参照 Aidoneus_y 同学的博客学习的。
附上链接:link.

分层链接

VTM的编码结构

RD搜索

– 为自顶向下方法设计

– 允许使用“透明的”全局上下文进行本地测试编码
使用众所周知的上传播的最佳临时方案

– 等级级联
建立CodingStructure来表示局部单元区域
这个Unitarea之外的调用被转发给parent CodingStructure
(所以cs2.getCu({16,32})返回的是cs1上的cu1)

– 父节点不知道子节点
(所以cs1.getCu({32,32})返回的是空)
最好的候选人需要传给parents.

Partitioner*

– 一个简单的管理划分(CU和TU,四叉树和混合叉树)的类

– 建模成一个堆,在当前处理的区域上创建一个新的划分

– 对于QTBT或者further
允许设置划分限制
允许执行划分可行性检查