宏塊類型mb_type
宏塊類型表示的是宏塊不同的分割和編碼方式,在h.264的語法結構中,宏塊類型在宏塊層(macroblock_layer)中用mb_type表示(請參考h.264語法結構分析中的macroblock_layer)。而mb_type是與當前宏塊所在的slice相關的,相同數值的mb_type在不同類型的slice中表示的類型會不一樣。
I slice的宏塊類型
I slice中的宏塊類型只能是I宏塊類型(I開頭),下標列出了所有的I宏塊類型
mb_type | name | transform_size_8x8_flag | MbPartPredMode (mb_type, 0) |
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 宏塊類型的名稱,其中
- 名稱開頭的I表示I宏塊類型
- I_NxN表示的是I_8x8或者I_4x4
- I_16x16_a_b_c中的I_16x16代表以intra_16x16為預測方式
- I_16x16_a_b_c中的a代表intra_16x16當中的4種模式
- I_16x16_a_b_c中的b代表使用intra_16x16預測方式時的Chroma CBP
- I_16x16_a_b_c中的c代表使用intra_16x16預測方式時的Luma CBP
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的宏塊類型
P slice中包含了I宏塊類型(I開頭)與P宏塊類型(P開頭)。I宏塊類型mb_type數值為5~30,見上面I宏塊類型的表格,其序號為mb_type-5。P宏塊類型為0~4,見下表
mb_type | name | NumMbPart (mb_type) |
MbPartPredMode (mb_type,0) |
MbPartPredMode (mb_type,1) |
MbPartWidth (mb_type) |
MbPartHeight (mb_type) |
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 宏塊類型的名稱,其中
- 開頭的P表示P宏塊類型
- 末尾的mxn代表宏塊的分割方式
- P_L0_16x16表示宏塊的分割方式為16x16,也就是不進行分割,那么它只有一個前向參考圖像L0
- P_L0_L0_16x8表示宏塊的的分割方式為16x8,也就是宏塊被分成倆個16x8的塊,每個16x8的塊都有一個前向參考圖像L0,即兩個L0,按順序寫成P_L0_L0_16x8
- P_L0_L0_16x8表示宏塊的的分割方式為8x16,也就是宏塊被分成倆個8x16的塊,每個8x16的塊都有一個前向參考圖像L0,即兩個L0,按順序寫成P_L0_L0_8x16
- P_8x8表示宏塊分成4個8x8的子宏塊,對每個子宏塊會采用sub_mb_type來表明該子宏塊的類型,下面一節會進行分析
- P_8x8ref0表示同上,不過該宏塊的4個子宏塊采用的參考圖像都是ref0,在sub_mb_pred(請參考h.264語法結構分析中的sub_mb_pred部分)語法結構中不會包含他們的refIdx
- P_Skip表示該宏塊在碼流中沒有更多的數據了。請注意他的mb_type為inferred,不過它並不在mb_type中表示,而是在slice_data處就已經用skip_run或者skip_flag來表示,請參考h.264語法結構分析中的slice_data部分
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的宏塊類型
B slice中包含了I宏塊類型(I開頭)與B宏塊類型(B開頭)。I宏塊類型mb_type數值為23~48,見上面I宏塊類型的表格,其序號為mb_type-23。P宏塊類型為0~22,見下表
mb_type | name | NumMbPart (mb_type) |
MbPartPredMode (mb_type,0) |
MbPartPredMode (mb_type,1) |
MbPartWidth (mb_type) |
MbPartHeight (mb_type) |
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 宏塊類型的名稱,其中
- 開頭的B代表B宏塊類型
- 末尾的mxn代表宏塊的分割方式
- B_Direct_16x16 整個宏塊都采用Direct的方式進行預測(請參考h.264直接預測),不需要編碼mvd以及refIdx,在解碼時重建宏塊所用的mv與refIdx靠直接預測進行推導,只需要編碼residual(請參考h.264語法結構分析)
- B_X0_mxn 當宏塊的分割方式為16x16時,意味着宏塊不需要進行分割,因此只需要用一個字段(L0:前向預測;L1:后向預測;Bi:雙向預測)來表示當前宏塊的預測類型
- B_X0_X1_mxn 當前宏塊的分割方式為16x8或者8x16時,意味着宏塊會被分割成兩部分,因此需要用兩個字段來分別表示這兩個部分的預測類型(如L0_Bi表示第一部分為前向預測,第二部分為雙向預測)
- B_8x8表示宏塊分成4個8x8的子宏塊,對每個子宏塊會采用sub_mb_type來表明該子宏塊的類型,下面一節會進行分析
- B_Skip表示該宏塊在碼流中沒有更多的數據了。請注意他的mb_type為inferred,不過它並不在mb_type中表示,而是在slice_data處就已經用skip_run或者skip_flag來表示,請參考h.264語法結構分析中的slice_data部分
NumMbPart(mb_type) 宏塊被分割成多少部分
MbPartPredMode(mb_type,0) 宏塊分割后的第一部分的預測模式為前向預測,還是后向預測,還是雙向預測
MbPartPredMode(mb_type,1) 宏塊分割后的第二部分的預測模式為前向預測,還是后向預測,還是雙向預測
MbPartWidth(mb_type) 分割后的塊的寬度
MbPartHeight(mb_type) 分割后的塊的高度
子宏塊類型sub_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 slice的子宏塊類型只包含了以下P子宏塊類型(P開頭),數值為0~3,見下表
sub_mb_type [mbPartIdx ] | name | NumSubMbPart ( sub_mb_type [mbPartIdx ] ) |
SubMbPredMode ( sub_mb_type [mbPartIdx ] ) |
SubMbPartWidth ( sub_mb_type [mbPartIdx ] ) |
SubMbPartHeight ( sub_mb_type [mbPartIdx ] ) |
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 子宏塊類型的名稱,其中
- P表示為P子宏塊類型
- P_L0_mxn中的L0表示子宏塊的預測方式
- P_L0_mxn中的mxn表示子宏塊的分割方式
NumSubMbPart 子宏塊會被分割成多少部分
SubMbPredMode 子宏塊預測模式,由於是P slice,因此只能是前向預測Pred_L0
SubMbPartWidth 分割后的塊的寬度
SubMbPartHeight 分割后的塊的高度
B slice的子宏塊類型
B slice的子宏塊類型只包含了以下B子宏塊類型(B開頭),數值為0~12,見下表
sub_mb_type [mbPartIdx ] | name | NumSubMbPart ( sub_mb_type [mbPartIdx ] ) |
SubMbPredMode ( sub_mb_type [mbPartIdx ] ) |
SubMbPartWidth ( sub_mb_type [mbPartIdx ] ) |
SubMbPartHeight ( sub_mb_type [mbPartIdx ] ) |
inferred | na | na | na | na | na |
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 子宏塊類型的名稱,其中
- B表示為B子宏塊類型
- B_X0_mxn中的X0表示子宏塊的預測模式,由於參考圖像索引refIdx是以8x8塊為單位的,因此一個子宏塊中的所有子塊共用參考圖像索引(請參考h.264語法結構分析中的sub_mb_pred部分),也就是說整個子宏塊的預測模式只能是是前向預測Pred_L0、后向預測Pred_L1、雙向預測BiPred中的某一種。
- B_X0_mxn中的mxn表示子宏塊的分割方式
NumSubMbPart 子宏塊會被分割成多少部分
SubMbPredMode 子宏塊預測模式,由於是B slice,因此預測模式相比P slice的前向預測Pred_L0增加了后向預測Pred_L1以及雙向預測BiPred中。
SubMbPartWidth 分割后的塊的寬度
SubMbPartHeight 分割后的塊的高度