您的位置:首页 > 理论基础 > 数据结构算法

关于JSVM9.19.9代码CommonTypes.h中数据结构的解释

2010-09-26 08:44 337 查看
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的理解是有偏差的,可以指任何大小的块索引,后面再补充。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: