BMS/VTM代码学习:CodingStructure和CodingUnit

在BMS中对CU类进行了简化,看起来好舒服啊,代码量少了很多。今天就从指定CU的提取入手,来说下BMS中的CodingStructureCodingUnit

HM/JEM:TComDataCU

先来看HM和JEM。CU信息存储在TComDataCU中,来看官方给的介绍:
BMS/VTM代码学习:CodingStructure和CodingUnit_第1张图片
TComDataCU里面的确存放了大量信息,在日常使用中从这样一个cu对象就可以取到大部分所需要的信息。这里就不贴TComDataCU的代码了。

但是在使用时会发现,定位一个CU很容易,它里面自带坐标信息,但要去拿到一个CU相当繁琐。首先根据ctuRsAddr找到所在的CTU,然后根据划分信息一层一层递归直到找到所需的CU。可能是我太笨了,没有找到便捷的方式,如果有哪位知道请分享一下。

以解码端为例,首先需要根据ctuRsAddr找到所在的CTU。

TComDataCU* pCtu = pcPic->getCtu( ctuRsAddr );

然后根据划分信息递归去找CU,如xDecodeCU

for ( UInt uiPartUnitIdx = 0; uiPartUnitIdx < 4; uiPartUnitIdx++ )
{
        xDecodeCU( pcCU, uiIdx, uiDepth+1, uiWidth>>1, uiHeight>>1, isLastCtuOfSliceSegment );
}

实现起来很繁琐。

BMS:CodingStructure和CodingUnit

下面来看BMS的新结构:CodingStructureCodingUnit,官方介绍:
BMS/VTM代码学习:CodingStructure和CodingUnit_第2张图片
BMS/VTM代码学习:CodingStructure和CodingUnit_第3张图片
BMS中CU信息存储在CodingUnit中,CodingUnit有两个兄弟结构:PredictionUnitTranformUnit,用于存放预测和变换的信息。大致可以看做把TComDataCU拆分成了CodingUnitPredictionUnitTranformUnit三个结构体。

为了便于管理,新增了一个类CodingStructure把一帧中的CU全都放在了这里,这样对CU的操作变得更加方便,可以直接通过坐标来取得你所要的CU了。
同时,
BMS/VTM代码学习:CodingStructure和CodingUnit_第4张图片
BMS在CU管理这里的更新真的很不错。

你可能感兴趣的:(H.266/VVC,H.266/VVC视频编码技术)