标签:
宏块类型表示的是宏块不同的分割和编码方式,在h.264的语法结构中,宏块类型在宏块层(macroblock_layer)中用mb_type表示(请参考h.264语法结构分析中的macroblock_layer)。而mb_type是与当前宏块所在的slice相关的,相同数值的mb_type在不同类型的slice中表示的类型会不一样。
I slice中的宏块类型只能是I宏块类型(I开头),下标列出了所有的I宏块类型
mb_type | name | transform_size_8x8_flag |
MbPartPredMode |
Intra16x16PredMode | CodedBlockPatternChroma | CodedBlockPatternLuma |
0 | I_NxN | 0 | Intra_4x4 | na | ||
0 | I_NxN | 1 | Intra_8x8 | na | ||
1 | I_16x16_0_0_0 | na | Intra_16x16 | 0 | 0 | 0 |
2 | I_16x16_1_0_0 | na | Intra_16x16 | 1 | 0 | 0 |
3 | I_16x16_2_0_0 | na | Intra_16x16 | 2 | 0 | 0 |
4 | I_16x16_3_0_0 | na | Intra_16x16 | 3 | 0 | 0 |
5 | I_16x16_0_1_0 | na | Intra_16x16 | 0 | 1 | 0 |
6 | I_16x16_1_1_0 | na | Intra_16x16 | 1 | 1 | 0 |
7 | I_16x16_2_1_0 | na | Intra_16x16 | 2 | 1 | 0 |
8 | I_16x16_3_1_0 | na | Intra_16x16 | 3 | 1 | 0 |
9 | I_16x16_0_2_0 | na | Intra_16x16 | 0 | 2 | 0 |
10 | I_16x16_1_2_0 | na | Intra_16x16 | 1 | 2 | 0 |
11 | I_16x16_2_2_0 | na | Intra_16x16 | 2 | 2 | 0 |
12 | I_16x16_3_2_0 | na | Intra_16x16 | 3 | 2 | 0 |
13 | I_16x16_0_0_1 | na | Intra_16x16 | 0 | 0 | 15 |
14 | I_16x16_1_0_1 | na | Intra_16x16 | 1 | 0 | 15 |
15 | I_16x16_2_0_1 | na | Intra_16x16 | 2 | 0 | 15 |
16 | I_16x16_3_0_1 | na | Intra_16x16 | 3 | 0 | 15 |
17 | I_16x16_0_1_1 | na | Intra_16x16 | 0 | 1 | 15 |
18 | I_16x16_1_1_1 | na | Intra_16x16 | 1 | 1 | 15 |
19 | I_16x16_2_1_1 | na | Intra_16x16 | 2 | 1 | 15 |
20 | I_16x16_3_1_1 | na | Intra_16x16 | 3 | 1 | 15 |
21 | I_16x16_0_2_1 | na | Intra_16x16 | 0 | 2 | 15 |
22 | I_16x16_1_2_1 | na | Intra_16x16 | 1 | 2 | 15 |
23 | I_16x16_2_2_1 | na | Intra_16x16 | 2 | 2 | 15 |
24 | I_16x16_3_2_1 | na | Intra_16x16 | 3 | 2 | 15 |
25 | I_PCM | na | na | na | na | na |
mb_type 宏块类型的数值,I slice共有26个数值
name 宏块类型的名称,其中
transform_size_8x8_flag 1表示采用8x8的块进行熵编码,0表示采用4x4块进行熵编码,na的情况同0
MbPartPredMode(mb_type, 0) 表明当前宏块类型所采用的Intra预测方式,关于Intra预测方式参考Intra Luma Prediction
Intra16x16PredMode 如果当前宏块类型采用的预测方式为Intra_16x16,那么该字段有效,它用0~3表示了Intra_16x16中的四种模式,请参考Intra Luma Prediction中的Intra16x16 部分
CodedBlockPatternChroma 如果当前宏块类型采用的预测方式为Intra_16x16,那么该字段有效,它用0~2表示了Chroma宏块中的CBP,请参考h.264语法结构分析中的coded_block_pattern
CodedBlockPatternLuma 如果当前宏块类型采用的预测方式为Intra_16x16,那么该字段有效,它表示了Luma宏块中的CBP。从h.264语法结构分析的residual部分,我们知道当预测模式为Intra_16x16时,宏块需要分开AC level与DC level进行熵编码。0:表示宏块内的16个4x4块中的AC level全部都为0,15:宏块内的16个4x4块中知识有一个块的AC level不全为0
从中能看出mb_type表中用较大的篇幅表示了Intra_16x16的情况,当预测方式为Intra_16x16时,mb_type还表示了Intra_16x16的模式,Chroma CBP以及Luma CBP,而Intra_8x8与Intra_4x4的模式与CBP是需要单独用语法元素来进行表达的。请参考h.264语法结构分析macroblock_layer以及mb_pred部分。
P slice中包含了I宏块类型(I开头)与P宏块类型(P开头)。I宏块类型mb_type数值为5~30,见上面I宏块类型的表格,其序号为mb_type-5。P宏块类型为0~4,见下表
mb_type | name |
NumMbPart |
MbPartPredMode |
MbPartPredMode |
MbPartWidth |
MbPartHeight |
0 | P_L0_16x16 | 1 | Pred_L0 | na | 16 | 16 |
1 | P_L0_L0_16x8 | 2 | Pred_L0 | Pred_L0 | 16 | 8 |
2 | P_L0_L0_8x16 | 3 | Pred_L0 | Pred_L0 | 8 | 16 |
3 | P_8x8 | 4 | na | na | 8 | 8 |
4 | P_8x8ref0 | 4 | na | na | 8 | 8 |
inferred | P_Skip | 1 | Pred_L0 | na | 16 | 16 |
mb_type 宏块类型的数值,P slice共有31个数值
name 宏块类型的名称,其中
NumMbPart(mb_type) 宏块被分割成多少部分
MbPartPredMode(mb_type,0) 宏块分割后的第一部分的预测模式为前向预测,还是后向预测,还是双向预测,由于是P slice,这里只能是前向预测Pred_L0
MbPartPredMode(mb_type,1) 宏块分割后的第二部分的预测模式为前向预测,还是后向预测,还是双向预测,由于是P slice,这里只能是前向预测Pred_L0
MbPartWidth(mb_type) 分割后的块的宽度
MbPartHeight(mb_type) 分割后的块的高度
B slice中包含了I宏块类型(I开头)与B宏块类型(B开头)。I宏块类型mb_type数值为23~48,见上面I宏块类型的表格,其序号为mb_type-23。P宏块类型为0~22,见下表
mb_type | name |
NumMbPart |
MbPartPredMode |
MbPartPredMode |
MbPartWidth |
MbPartHeight |
0 | B_Direct_16x16 | na | Direct | na | 8 | 8 |
1 | B_L0_16x16 | 1 | Pred_L0 | na | 16 | 16 |
2 | B_L1_16x16 | 1 | Pred_L1 | na | 16 | 16 |
3 | B_Bi_16x16 | 1 | BiPred | na | 16 | 16 |
4 | B_L0_L0_16x8 | 2 | Pred_L0 | Pred_L0 | 16 | 8 |
5 | B_L0_L0_8x16 | 2 | Pred_L0 | Pred_L0 | 8 | 16 |
6 | B_L1_L1_16x8 | 2 | Pred_L1 | Pred_L1 | 16 | 8 |
7 | B_L1_L1_8x16 | 2 | Pred_L1 | Pred_L1 | 8 | 16 |
8 | B_L0_L1_16x8 | 2 | Pred_L0 | Pred_L1 | 16 | 8 |
9 | B_L0_L1_8x16 | 2 | Pred_L0 | Pred_L1 | 8 | 16 |
10 | B_L1_L0_16x8 | 2 | Pred_L1 | Pred_L0 | 16 | 8 |
11 | B_L1_L0_8x16 | 2 | Pred_L1 | Pred_L0 | 8 | 16 |
12 | B_L0_Bi_16x8 | 2 | Pred_L0 | BiPred | 16 | 8 |
13 | B_L0_Bi_8x16 | 2 | Pred_L0 | BiPred | 8 | 16 |
14 | B_L1_Bi_16x8 | 2 | Pred_L1 | BiPred | 16 | 8 |
15 | B_L1_Bi_8x16 | 2 | Pred_L1 | BiPred | 8 | 16 |
16 | B_Bi_L0_16x8 | 2 | BiPred | Pred_L0 | 16 | 8 |
17 | B_Bi_L0_8x16 | 2 | BiPred | Pred_L0 | 8 | 16 |
18 | B_Bi_L1_16x8 | 2 | BiPred | Pred_L1 | 16 | 8 |
19 | B_Bi_L1_8x16 | 2 | BiPred | Pred_L1 | 8 | 16 |
20 | B_Bi_Bi_16x8 | 2 | BiPred | BiPred | 16 | 8 |
21 | B_Bi_Bi_8x16 | 2 | BiPred | BiPred | 8 | 16 |
22 | B_8x8 | 4 | na | na | 8 | 8 |
inferred | B_Skip | na | na | 8 | 8 |
mb_type 宏块类型的数值,P slice共有49个数值
name 宏块类型的名称,其中
NumMbPart(mb_type) 宏块被分割成多少部分
MbPartPredMode(mb_type,0) 宏块分割后的第一部分的预测模式为前向预测,还是后向预测,还是双向预测
MbPartPredMode(mb_type,1) 宏块分割后的第二部分的预测模式为前向预测,还是后向预测,还是双向预测
MbPartWidth(mb_type) 分割后的块的宽度
MbPartHeight(mb_type) 分割后的块的高度
子宏块即8x8块,一个16x16的宏块分为4个子宏块,每个子宏块类型表示都是一个8x8块的分割、预测方式,因此,采用子宏块预测的宏块其语法结构中会有4个子宏块类型。在h.264码流结构中,子宏块类型在sub_mb_pred中用sub_mb_type表示(请参考h.264语法结构分析中的sub_mb_pred)。sub_mb_type也是与slice类型相关的,在I slice中是没有子宏块类型的,因为I slice中只包含intra预测,而子宏块类型是inter预测中的部分。另外,数值相同的sub_mb_type在P slice与B slice中表示的是不同的类型。
P slice的子宏块类型只包含了以下P子宏块类型(P开头),数值为0~3,见下表
sub_mb_type[ mbPartIdx ] | name |
NumSubMbPart |
SubMbPredMode |
SubMbPartWidth |
SubMbPartHeight |
inferred | na | na | na | na | na |
0 | P_L0_8x8 | 1 | Pred_L0 | 8 | 8 |
1 | P_L0_8x4 | 2 | Pred_L0 | 8 | 4 |
2 | P_L0_4x8 | 2 | Pred_L0 | 4 | 8 |
3 | P_L0_4x4 | 4 | Pred_L0 | 4 | 4 |
sub_mb_type 子宏块类型的值
mbPartIdx 由于一个宏块可以分割成4个子宏块,因此用这个符号来表示这四个子宏块
name 子宏块类型的名称,其中
NumSubMbPart 子宏块会被分割成多少部分
SubMbPredMode 子宏块预测模式,由于是P slice,因此只能是前向预测Pred_L0
SubMbPartWidth 分割后的块的宽度
SubMbPartHeight 分割后的块的高度
B slice的子宏块类型只包含了以下B子宏块类型(B开头),数值为0~3,见下表
sub_mb_type[ mbPartIdx ] | name |
NumSubMbPart |
SubMbPredMode |
SubMbPartWidth |
SubMbPartHeight |
inferred | mb_type | 4 | Direct | 4 | 4 |
0 | B_Direct_8x8 | 4 | Direct | 4 | 4 |
1 | B_L0_8x8 | 1 | Pred_L0 | 8 | 8 |
2 | B_L1_8x8 | 1 | Pred_L1 | 8 | 8 |
3 | B_Bi_8x8 | 1 | BiPred | 8 | 8 |
4 | B_L0_8x4 | 2 | Pred_L0 | 8 | 4 |
5 | B_L0_4x8 | 2 | Pred_L0 | 4 | 8 |
6 | B_L1_8x4 | 2 | Pred_L1 | 8 | 4 |
7 | B_L1_4x8 | 2 | Pred_L1 | 4 | 8 |
8 | B_Bi_8x4 | 2 | BiPred | 8 | 4 |
9 | B_Bi_4x8 | 2 | BiPred | 4 | 8 |
10 | B_L0_4x4 | 4 | Pred_L0 | 4 | 4 |
11 | B_L1_4x4 | 4 | Pred_L1 | 4 | 4 |
12 | B_Bi_4x4 | 4 | BiPred | 4 | 4 |
sub_mb_type 子宏块类型的值
mbPartIdx 由于一个宏块可以分割成4个子宏块,因此用这个符号来表示这四个子宏块
name 子宏块类型的名称,其中
NumSubMbPart 子宏块会被分割成多少部分
SubMbPredMode 子宏块预测模式,由于是B slice,因此预测模式相比P slice的前向预测Pred_L0增加了后向预测Pred_L1以及双向预测BiPred中。
SubMbPartWidth 分割后的块的宽度
SubMbPartHeight 分割后的块的高度
标签:
原文地址:http://www.cnblogs.com/TaigaCon/p/5229392.html