在BMS中对CU类进行了简化,看起来好舒服啊,代码量少了很多。今天就从指定CU的提取入手,来说下BMS中的CodingStructure
和CodingUnit
。
HM/JEM:TComDataCU
先来看HM和JEM。CU信息存储在TComDataCU
中,来看官方给的介绍:
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的新结构:CodingStructure
和CodingUnit
,官方介绍:
BMS中CU信息存储在CodingUnit
中,CodingUnit
有两个兄弟结构:PredictionUnit
和TranformUnit
,用于存放预测和变换的信息。大致可以看做把TComDataCU
拆分成了CodingUnit
、PredictionUnit
、TranformUnit
三个结构体。
为了便于管理,新增了一个类CodingStructure
把一帧中的CU全都放在了这里,这样对CU的操作变得更加方便,可以直接通过坐标来取得你所要的CU了。
同时,
BMS在CU管理这里的更新真的很不错。