zoukankan      html  css  js  c++  java
  • 宏块都有哪些类型?

    宏块类型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~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 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  子宏块类型的名称,其中

    • 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  分割后的块的高度

            

         先说PSkip宏块,再说BSkip宏块.

           P-Skip宏块是一种特殊的P宏块,在H.264中非常常见,那么P-Skip宏块特殊在什么地方呢?下面会慢慢道来.

           对于一般的P宏块而言,像素残差和运动矢量残差都会写入码流,从编码端传到解码端,但是P-Skip宏块的特殊之处就在于,既不传送像素残差,也不传送运动矢量残差(在这种情况下,像素残差和运动矢量残差必定都为零,所以根本不需要传送).编码端除了传送一些标识该宏块是PSkip宏块的很少量的bit外,不在需要传送关于该宏块的其他信息,那么解码端如何恢复出像素呢?

           我们知道,mvd = mv - mvp, 刚才说了,运动矢量残差mvd为零,而从解码端可以得到mvp, 所以,在解码端也就知道了mv. 在解码端有参考帧对应宏块的重建像素,根据这个重建像素和mv, 就可以恢复出本帧本宏块的像素值(如果mv是分数,则需要插值),这就是所谓的P-skip宏块原理,从字面理解就是跳过了这个宏块,相当于这个宏块没有编码,在解码端采取了近似替代的恢复办法.

           为什么要引入P-skip宏块呢?如果本帧的一宏块和参考帧的一宏块像素(不要求两宏块在同一位置)几乎完全一致,很显然,当前帧的宏块压根就不用编码,在解码端,直接就可以用近似替代的办法恢复出本帧本宏块的像素值. 比如在第一帧中有个乒乓球,在第二帧中也有个乒乓球,那个第二帧中乒乓球这个宏块就很可能编成了PSkip宏块.

           小结一下:用Elecard分析码流可以见,在H.264视频中, PSkip非常常见,一般而言,视频运动越小,QP越大,PSkip宏块出现的概率就会越高,对于PSkip宏块而言,像素残差和运动矢量残差必定为零(运动矢量不一定为零),下面给出用H.264visa分析的运动矢量不为零(运动矢量为(-1/2, 0))的一个PSkip宏块:

    ==== MB 17(6, 1) ====
        Location : (96, 16), 
        Slice No. : 0
        Slice Type : P Slice
        MB Type : P_Skip
        NumMbPart : 1
        MbPartSize : (16, 16)

    ****** Inter Info ******

    Pos(0, 0): 
        L0=MV(-2, 0),POC: 2,refIdx:0,DecNo:2

          BSkip宏块的原理和PSkip宏块的原理一样,只不过是从前后两个方向进行罢了,所以对于BSkip宏块就不在赘述.(之前博文在剖析B宏块编码原理时就有一个地方选用了BSkip宏块简化分析)

               

    原文链接:

    https://www.cnblogs.com/TaigaCon/p/5229392.html

  • 相关阅读:
    C语言初学者代码中的常见错误与瑕疵(22)
    ANSI C (83)和87 ANSI C 这两个标准存在么?
    常见的认证
    python入门(一)
    Altium Designer重装后图标都变白板或都变一样的解决方法
    转:关于S参数的一些理解
    射频与微波测量之S参数
    驻波比
    PCB特征阻抗计算
    函数的形参(非引用形参、指针形参、引用形参)
  • 原文地址:https://www.cnblogs.com/ranson7zop/p/7603766.html
Copyright © 2011-2022 走看看