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

  • 相关阅读:
    中国历史朝代公元对照简表
    [Solved] DashBoard – Excel Service: The data sources may be unreachable, may not be responding, or may have denied you access.
    Delete/Remove Project from TFS 2010
    Sharepoint site showing system account instead of my username on the top right corner.
    你的成功在于你每天养成的习惯
    Internet Information Services is running in 32bit emulation mode. Correct the issue listed above and rerun setup.
    Prepare to back up and restore a farm (Office SharePoint Server 2007)
    Word中字号与磅值的对应关系
    How to: Change the Frequency for Refreshing the Data Warehouse for Team System
    UI Automation in WPF/Silverlight
  • 原文地址:https://www.cnblogs.com/ranson7zop/p/7603766.html
Copyright © 2011-2022 走看看