注:HM代码版本为HM-16.2+SCM-3.0rc1/。
在介绍逆扫描的过程之前,先说明扫描表的存储和初始化过程(初始化只在解码器启动时进行,对应函数为initROM())。
HEVC扫描方式中提到:对于超过 4x4 的块,先将块分成若干个4x4的CG(Coefficient Group),CG之间和每个CG内部都使用选定的扫描顺序进行扫描。所以,存在两种扫描表:像素点扫描表和CG扫描表。
在源程序中,扫描表是保存在一个四维数组g_scanOrder中,该数组的申明如下图。
图4 扫描数组的申明
该数组维度说明如下表所示。
表1 扫描表维度说明
维度 |
意义 |
取值范围 |
备注 |
1 |
像素点扫描表/CG扫描表 |
SCAN_UNGROUPED/ SCAN_GROUPED_4x4 |
SCAN_UNGROUPED对应CG扫描表;SCAN_GROUPED_4x4对应像素点扫描表。 |
2 |
扫描方式 |
对角、水平、垂直三种扫描方式 |
下面以最复杂的对角扫描为例说明对角扫描方式下的扫描过程。 |
3 |
宽度的深度值 |
[0, 6] |
对应1x1~64x64,包含非对称尺寸。 |
4 |
高度的深度值 |
[0, 6] |
注:该数组为指针数组,该数组的每一个元素对应一张具体的扫描表。
下面以一个8x8的亮度TU、扫描方式为对角扫描为例,说明其对应的两个扫描表。光栅扫描顺序表如下。
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
图5 8x8光栅扫描顺序表
对应的像素点扫描表如下:
0 |
8 |
1 |
16 |
9 |
2 |
24 |
17 |
10 |
3 |
25 |
18 |
11 |
26 |
19 |
27 |
32 |
40 |
33 |
48 |
41 |
34 |
56 |
49 |
42 |
35 |
57 |
50 |
43 |
58 |
51 |
59 |
4 |
12 |
5 |
20 |
13 |
6 |
28 |
21 |
14 |
7 |
29 |
22 |
15 |
30 |
23 |
31 |
36 |
44 |
37 |
52 |
45 |
38 |
60 |
53 |
46 |
39 |
61 |
54 |
47 |
62 |
55 |
63 |
图6 8x8像素点扫描表
对应的CG扫描表如下:
0 |
2 |
1 |
3 |
图7 8x8 CG扫描表
原文地址:http://blog.csdn.net/chfe007/article/details/42213615