HEVC中CU、TU、PU划分和扫描方式简析
作者:66
(转载请务必注明出处)
在进一步看代码前,先了解一下图像划分方式:
HEVC中,一帧图像分为多个slice,每个slice进行独立编解码。每个slice分为多个树形编码单元CTU,一个CTU分为一个亮度CTB和两个色度CTB,CTB大小有16、32、64(CTU同)。进一步再划分为CU编码单元、PU预测单元、TU变换单元,使得编码、预测、变换分离,处理的时候更灵活。它们的关系时,CTU以四叉树方式划分为CU,CU最大为64x64,最小为8x8,CU以四叉树方式划分为TU、PU,TU最大为32x32,最小为8x8,其中PU与TU无确定关系,允许TU跨越多个PU,但在帧内预测中一个PU可对应多个TU,一个TU至多对应一个PU。另外,HM中数据最小处理单元为4x4,而不是每次处理一个像素。
图一.4x4最小单元
CTU与CU的关系如图:
图二 CTU中CU的划分
CU的大小在代码中用划分深度(下一篇代码中可见)来表示,PU与TU的划分均基于CU。(Visio还没装上,这图抄网上的也不规范)
扫描方式:
前辈HEVC_CJL提到了帧内预测的扫描方式,感谢前辈,原文链接:http://blog.****.net/hevc_cjl/article/details/8183144
HEVC对像素有两种扫描方式:光栅扫描和Z扫描。指对像素的读取顺序,两种组织顺序如下:
图三 Z扫描与光栅扫描
如图,左边为Z扫描,右边为光栅扫描。HEVC中为方便两种扫描方式数据转换,定义了转换数组g_auiRasterToZscan, g_auiZscanToRaster, g_auiRasterToX, g_auiRasterToY,即将上图中数据放到另一个组中对应的位置。转换数组如下:
图四 Raster与Zscan的转换
图五 Raster按4x4块为单位的偏移
由上一篇的代码就能知道,HM处理数据按4x4块,如果不理解,去翻一下fillReferenceSample代码中参考像素不全部可用时的处理。
(转载请务必注明出处)