g_aucConvertBlockOrder的理解参考H.264 2005.3中文标准中P26,6.4.3 反向4*4亮度块扫描过程。
下面是我初步的理解,不一定正确:
class LumaIdx:一般是指4*4的块在光栅扫描下的索引。里面的成员变量m_iIdx就表示这个索引值。索引标示如下图所示,大的方框表示16*16的MB,小的方框表示4*4的block。
0 | 1 | 2 | 3 |
4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 |
通过数组g_aucConvertBlockOrder
const UChar g_aucConvertBlockOrder[17] =
{
0, 1, 4, 5,
2, 3, 6, 7,
8, 9, 12, 13,
10, 11, 14, 15, 0xff,
};
可以将索引转为反向4*4亮度块扫描过程中的扫描顺序,详见H.264 2005.3中文标准中P26,6.4.3。 该顺序与上面数组显示是一致的,如下图。
0 | 1 | 4 | 5 |
2 | 3 | 6 | 7 |
8 | 9 | 12 | 13 |
10 | 11 | 14 | 15 |
成员函数Int b4x4():返回成员变量m_iIdx的值,就是光栅扫描下的索引。
Int x(),Int y():返回光栅扫描顺序下每个4*4块索引相对于最左上4*4块的坐标。
0 | 1 | 2 | 3 |
4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 |
坐标图如下(x,y):
0,0 | 1,0 | 2,0 | 3,0 |
0,1 | 1,1 | 2,1 | 3,1 |
0,2 | 1,2 | 2,2 | 3,2 |
0,3 | 1,3 | 2,3 | 3,3 |
成员函数Par8x8 getPar8x8()作用:获取当前索引下的4*4块所在的8*8块的索引值。
比如,当m_iIdx=2,getPar8x8()返回的结果就是B_8x8_1(其值就是1,这是一个枚举数据),表明该4*4块在索引值为1的8*8块中。8*8的块索引如下图所示。
0 | 1 |
2 | 3 |
成员函数getS4x4:获取4*4的快在所在的8*8块中的反向扫描顺序号。在每个8*8块中4个4*4块都是按照下面的顺序反向扫描的。
0 | 1 |
2 | 3 |
比如当m_iIdx=2时,所在8*8中的位置如下:
2 | 3 |
6 | 7 |
getS4x4返回结果为0,同理:当m_iIdx=3,6,7时候,分别返回1,2,3。
函数operator + ( SParIdx4x4 eSParIdx )作用:根据当前m_iIdx的值,可以求8*8块中所有4*4块的索引值。比如当m_iIdx=2,eSParIdx= SPART_4x4_1,表明求8*8块中位置为1的4*4块的索引值,结果为3。同理,eSParIdx分别=SPART_4x4_2,SPART_4x4_3,返回的结果分别为6和7。
函数operator + ( ParIdx8x8 eParIdx )作用:也比较模糊。
operator + ( NeighbourBlock eBlock )作用:尚未搞清楚。
以上分析是个人意见,未必全对。待续。。。
根据后面代码发现,对于class LumaIdx的理解是有偏差的,可以指任何大小的块索引,后面再补充。