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;
基础模型
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.
分层链接
RD搜索
– 为自顶向下方法设计
– 允许使用“透明的”全局上下文进行本地测试编码
使用众所周知的上传播的最佳临时方案
– 等级级联
建立CodingStructure来表示局部单元区域
这个Unitarea之外的调用被转发给parent CodingStructure
(所以cs2.getCu({16,32})返回的是cs1上的cu1)
– 父节点不知道子节点
(所以cs1.getCu({32,32})返回的是空)
最好的候选人需要传给parents.
Partitioner*
– 一个简单的管理划分(CU和TU,四叉树和混合叉树)的类
– 建模成一个堆,在当前处理的区域上创建一个新的划分
– 对于QTBT或者further
允许设置划分限制
允许执行划分可行性检查