h.264宏塊與子宏塊類型


宏塊類型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  分割后的塊的高度


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM