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

g_aucConvertBlockOrder的理解参考H.264 2005.3中文标准中P266.4.3 反向4*4亮度块扫描过程。

下面是我初步的理解,不一定正确:

class LumaIdx:一般是指4*4的块在光栅扫描下的索引。里面的成员变量m_iIdx就表示这个索引值。索引标示如下图所示,大的方框表示16*16MB,小的方框表示4*4block

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中文标准中P266.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

 

坐标图如下(xy):

00

10

20

30

01

11

21

31

02

12

22

32

03

13

23

33

 

成员函数Par8x8 getPar8x8()作用:获取当前索引下的4*4块所在的8*8块的索引值。

比如,当m_iIdx=2getPar8x8()返回的结果就是B_8x8_1(其值就是1,这是一个枚举数据),表明该4*4块在索引值为18*8块中。8*8的块索引如下图所示。

0

1

2

3

 

成员函数getS4x4:获取4*4的快在所在的8*8块中的反向扫描顺序号。在每个8*8块中44*4块都是按照下面的顺序反向扫描的。

0

1

2

3

比如当m_iIdx=2时,所在8*8中的位置如下:

2

3

6

7

getS4x4返回结果为0,同理:当m_iIdx=367时候,分别返回123

 

函数operator + ( SParIdx4x4     eSParIdx )作用:根据当前m_iIdx的值,可以求8*8块中所有4*4块的索引值。比如当m_iIdx=2eSParIdx= SPART_4x4_1,表明求8*8块中位置为14*4块的索引值,结果为3。同理,eSParIdx分别=SPART_4x4_2SPART_4x4_3,返回的结果分别为67

 

函数operator + ( ParIdx8x8      eParIdx )作用:也比较模糊。

 

 

operator + ( NeighbourBlock eBlock )作用:尚未搞清楚。

 

以上分析是个人意见,未必全对。待续。。。

根据后面代码发现,对于class LumaIdx的理解是有偏差的,可以指任何大小的块索引,后面再补充。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值