1.Raster扫描:即从左到右,从上到下
2.Z-扫描(不同于zigzag扫描):对于任何一个边长为偶数的正方形来说,都先扫描左上角,再是右上角,然后是左下角,最后是右下角,如下图的数字增大顺序所示。
3.垂直扫描:从变换块的最后一个系数开始扫描,终止于DC系数,在每个小块内从下到上,从右到左扫描;
4.水平扫描:从变换块的最后一个系数开始扫描,终止于DC系数,在每个小块内从右到左,从下到上扫描,块之间的扫描顺序为右下块,右上块,左下块,左上块,具体不画了;
5.对角扫描:从变换块的最后一个系数开始扫描,终止于DC系数,在每个小块内的扫描顺序如下所示,其他小块于此相同,块之间的扫描顺序为右下块,右上块,左下块,左上块(楼主太懒了,只画了1/4)。
其中,Raste扫描和Z扫描的作用是定位CU,他们两之间可以相互转换;
g_auiZscanToRaster[]存放从Zscan索引到Raster索引的映射,g_auiRasteToZscan[]存放从Raster索引到Zscan索引的映射。
如上图所示,以8*8块为例(在H.266中是32*32块,每个块表示4*4的基本单元)。我们可以写出
g_auiZscanToRaster[]的详细映射数组为:
g_auiZscanToRaster[]={0,1,8,9,2,3,10,11,16,17,24,25,18,19,26,27,......}----即把Raster的顺序索引按照Zscan的扫描顺序再扫描一遍;
g_auiRasteToZscan[]的详细映射数组为:
g_auiRasteToZscan[]={0,1,4,5,16,17,20,21,2,3,6,7,18,19,22,23,......}---即把Zscan的顺序索引按照Raste的扫描顺序重新扫描一遍;
剩余三个扫描方式--水平,垂直和对角扫描用于变换系数在熵编码前的扫描,通过扫描将二维的变换系数变为一维变换系数序列。根据预测模式来选择扫描方式。水平预测模式一般采用垂直扫描,因为水平预测的帧内块,变换后的能量很大程度集中在前几列;垂直预测一般使用水平扫描,因为垂直预测的帧内块,变换后的能量很大程度集中在前几行。
在H.266中,扫描顺序的选择如下:
A.如果是帧间模式,默认使用对角扫描;
B.如果是帧内模式:a.亮度块时,宽或高大于8用对角扫描;色度块时,宽或高大于4用对角扫描;
b.否则,垂直模式及其附近的18个模式用水平扫描; 水平模式及其附近的18个模式用垂直扫描;剩余的模 式用对角扫描。