从今天开始研究新的266的参考软件啦----VTM,先来看看新代码中的数据结构。
在以前的HM中,有三个很重要的数据结构,分别为TComDataCU,TComTU,TComPicYuv;
TComDataCU---- 存储编码信息;表示一个CU或者CTU;图像位置到编码信息的的映射;
TComTU----允许更简单的TU结构指引的对象; 不包含实际的数据;
TComPicYuv----储存视频信号;
在新的测试模型中,上面提到的数据结构全部被抛弃,提出了一些新的数据结构;’
一 .VTM模型
1.Navigation
Size,Position,Area(Position+Size)
---- 表示基本你的二维指引信息
CompArea
----给定一个分量(块)的面积
UnitArea
----表示多信道信号中的面积
----描述同位分量的组成的块的集合
2.Signal Storage
AreaBuf
----描述二维信号在一维内存中的排版
----包含简单的操作(复制,填充等)
UnitAreaBuf
----描述多分量二维信号在一维内存中的排版
----包含简单的操作(复制,填充等)
PelStorage
----一个分配了内存的UnitAreaBuf
3.Coding Information
Picture
----包含输入输出信号还有元数据(Slice 信息)
CodingUnit ,PredictionUnit,TransformUnit
----单一单元的单一对象
----包含对应的信息
----包含位置信息
CodingStructrue
----管理CodingUnit,将他们和picture相关联
----包含用于从上至下的RD 搜索的额外的函数
4.框图
5.HM与VTM的比较
二.VTM模型的细节描述
1.CodingStructrue基础知识
----包含CodingUnit等对象,将他们映射到图像中
----TComDataCU的替代,但是是全局变量
——Top-Level的CodingStructrue包含一帧中所有的CU,PU和TU
——Sub-Level的CodingStructrue包含一个指定的UnitArea的表示
----在构建后是空的,需要填充
——addCU/PU/TU 方法构建并且映射特定的对象
——getCU/PU/TU获取特定的对象的地址,通过使用全局Position
----动态分配所需要的内存
——使用dynamic_cache
2.RD-Search with CodingStructure
----Designed for Top-Down approach
----Allows for local test encoding with “transparent” global context
——Follows the well known best-temp scheme with up-propagation
----Hierarchically cascaded
——A CodingStructure is set up to represent a local UnitArea
——Calls outside of this UnitArea are forwarded to the parent CodingStructure
----Parent nodes are not aware of the children nodes
——Best candidates need to be propagated to the parents
3.Hierarchial Cascading with CodingStructrue
4.Partitioner
----一个简单的管理划分(CU和TU,四叉树和可能的其他划分)的类
----建模成一个堆,在当前处理的区域上创建一个新的划分
----对于HEVC
——包含当前划分信息的访问器
——深度还有actual的当前UnitArea
----对于QTBT或者further
——允许设置划分限制
——允许执行划分可行性检查
5.Data Ownership
----每一块数据都属于一些对象,这些对象需要分配和释放
----Picture
——被EncLib和DecLib拥有
——拥有信号缓存,Slice 对象和SEI信息和TileMap
----AreaBuf, UnitBuf
——没有任何数据
----PelStorage
——可能拥有缓存
——拥有的数据存储在m_origin成员中
----CodingStructrue
——Top-Layer:被Picture拥有
——链接到Picture的信号缓存
——Other:被EncCU或者IntraSearch拥有
——包含信号缓存区
——总是拥有描述结构和排版(不是信号的)的缓存
——拥有变换系数的缓存
——没有拥有CodingUnit等,只是通过dynamic_cache链接到他们上
----CodingUnit, PredictionUnit, TransformUnit
——为dynamic_cache所有
----TransformUnit
——没有变换系数缓存
——从CodingStructure链接到缓存上
----dynamic_cache
——Top-Level的缓存是全局的
——RD-Search 的缓存为EncCu和IntraSearch所有
三.常见问题
1.运动信息存储在哪里
----在HEVC中,运动矢量存储的最小分辨率是PU
----而在H.266标准新提出的工具中打破了这个传统
——需要运动矢量信息的子CU的分辨率
——将子PU存储为PU将破坏PU的逻辑目的
——对子PU的运动信息分配额外的缓存
----PU::spanMotionInfo 设置缓存
四.参考
1.Size,Position,Area,UnitArea,CodingUnit,PredictionUnit,TransformUnit,AreaBuf
Size----宽度和高度,描述矩形的大小
Position----x,y,描述一个点的二维位置
Area-----Size,Position,位于一个特定Position的一个指定Size的矩形
CompArea----Area,一个多分量(Y,U,V)信号的一个指定分量的一个Area
UnitArea----block:CompArea ;由N个block组成的多分量的compound
CodingUnit---- UnitArea,描述用这个UnitArea描述的area是如何编码的
PredictionUnit----UnitArea,描述这个UnitArea的预测信号是怎么生成
TransfromUnit----UnitArea,描述这个UnitArea的变化编码是如何应用的
AreaBuf----AreaBuf
----at(x, y) ,返回位置(x,y)的信号值
----bufAt(x, y) ,返回指向位置(x,y)缓存的原始指针
----subBuf(x, y, w, h) ,返回一个AreaBuf,描述an area offset by (x,y) of size (w,h)
-----fill(val),用指定的值填充指定的区域
----copyFrom(other),从other area复制内容
----substract, addAvg, reconstruct, removeHighFreq ,替代TComYuv的函数
UnitBuf
CodingStructrue
---- area:UnitArea,描述CodingStructrue跨越图像中的哪些区域
----addCU(UnitArea) ,构建并定位一个跨越UnitArea的CodingUnit
----getCU(Position),返回位于指定Position的CodingUnit
----setDecomp(CompArea),将指定的CompArea设置为重建的
----setDecomp(UnitArea),类似于多信道操作???
----isDecomp(Position),分辨Position的重建信号是否生成
----initStructData(),清除所有当前包含的数据(信号的编码信息)
----initSubStructure(),链接到一个新的CodingStructureat the bottom of the hierarchy
----useSubStructure(),从sub-structrue中复制编码数据
----copyStructrue(),从另一个structure复制编码数据,