zoukankan      html  css  js  c++  java
  • 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  分割后的块的高度

  • 相关阅读:
    jmeter(46) redis
    jmeter(45) tcp/ip协议
    Codeforces Round #538 (Div. 2)D(区间DP,思维)
    Codeforces Global Round 1D(DP,思维)
    Educational Codeforces Round 57D(DP,思维)
    UPC11073(DP,思维)
    Yahoo Progamming Contest 2019D(DP,思维)
    Atcoder Beginner Contest 118D(DP,完全背包,贪心)
    Xuzhou Winter Camp 1C(模拟)
    Educational Codeforces Round 57 (Rated for Div. 2)D(动态规划)
  • 原文地址:https://www.cnblogs.com/TaigaCon/p/5229392.html
Copyright © 2011-2022 走看看