深入剖析H.264帧间预测(B宏块)

来源:互联网 发布:网络mba 编辑:程序博客网 时间:2024/04/25 08:56

       B宏块可以只向前参考,可以只向后参考,也可以同时向前后两个方向参考,下面分别予以详述. ( 所用视频序列为foreman, 编码器为JM8.6, profile是main profile, 分析工具是H.264visa, 参考帧数默认为5,编码结构为:IBPBPBIBPBPBI...)

 

 

一、只向前参考

       在第二帧(B帧)中选一宏块,该宏块基本信息为:

 

==== MB 38(5, 3) ====
    Location : (80, 48),
    Slice No. : 0
    Slice Type : B Slice
    MB Type : (1)B_L0_16x16
    NumMbPart : 1
    MbPartSize : (16, 16)

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

Pos(0, 0):
    L0=MV(-16, 4),POC: 0,refIdx:0,DecNo:1

 

    由L0=MV(-16, 4)可知,该宏块只向前参考(参考第一帧),真正的运动矢量为: (-4, 1), 该宏块的预测值为:

 

====================== Y Data ======================
+----------------+----------------+----------------+----------------+
|103, 95, 87, 87,| 88, 89, 88, 87,| 87, 86, 86, 86,| 86, 86, 87, 87,|
|106, 98, 91, 92,| 97, 99,101,101,|104,110,112,113,|113,113,113,113,|
|108,112,115,116,|117,118,118,118,|117,118,117,117,|118,118,118,118,|
|113,117,124,125,|124,124,122,121,|120,119,120,120,|120,120,119,120,|
+----------------+----------------+----------------+----------------+
|120,123,128,128,|127,127,126,125,|125,124,121,121,|120,119,119,119,|
|121,120,118,117,|116,115,115,115,|116,116,117,119,|119,118,118,118,|
|116,114,108,106,|103,102,103,103,|104,105,107,108,|110,113,115,117,|
|103, 98, 94, 93,| 91, 90, 92, 93,| 95, 97,100,102,|105,109,112,114,|
+----------------+----------------+----------------+----------------+
| 81, 81, 81, 81,| 83, 84, 86, 89,| 95, 97,100,102,|105,108,110,112,|
| 81, 81, 80, 83,| 88, 91, 93, 94,| 98, 99,102,104,|107,108,110,112,|
| 94, 96, 97, 98,| 99,100,100,103,|104,103,105,106,|108,109,110,112,|
|116,118,121,119,|114,111,111,108,|107,107,108,108,|110,110,111,112,|
+----------------+----------------+----------------+----------------+
|120,121,121,119,|114,111,111,109,|109,109,110,110,|111,111,112,113,|
|121,121,121,119,|114,111,111,111,|111,110,111,111,|112,112,113,114,|
|121,121,121,119,|114,111,111,111,|111,109,110,111,|112,112,113,114,|
|113,110,108,107,|105,105,105,105,|107,106,108,110,|111,111,113,114,|
+----------------+----------------+----------------+----------------+

 

        第一帧对应宏块的重建值为:

 

====================== Y Data ======================
+----------------+----------------+----------------+----------------+
|104,103,103,102,|101, 94, 83, 84,| 84, 84, 82, 81,| 76, 78, 81, 85,|
| 88, 89, 88, 87,|87, 86, 86, 86,| 86, 86, 87, 87,| 90, 95, 97, 97,|
| 97, 99,101,101,|104,110,112,113,|113,113,113,113,|112,109,107,106,|
|117,118,118,118,|117,118,117,117,|118,118,118,118,|117,114,112,111,|
+----------------+----------------+----------------+----------------+
|124,124,122,121,|120,119,120,120,|120,120,119,120,|119,117,115,114,|
|127,127,126,125,|125,124,121,121,|120,119,119,119,|119,117,116,116,|
|116,115,115,115,|116,116,117,119,|119,118,118,118,|118,117,116,116,|
|103,102,103,103,|104,105,107,108,|110,113,115,117,|118,117,116,116,|
+----------------+----------------+----------------+----------------+
| 91, 90, 92, 93,| 95, 97,100,102,|105,109,112,114,|115,116,116,117,|
| 83, 84, 86, 89,| 95, 97,100,102,|105,108,110,112,|114,115,116,116,|
| 88, 91, 93, 94,| 98, 99,102,104,|107,108,110,112,|113,114,115,115,|
| 99,100,100,103,|104,103,105,106,|108,109,110,112,|113,114,115,115,|
+----------------+----------------+----------------+----------------+
|114,111,111,108,|107,107,108,108,|110,110,111,112,|113,113,114,114,|
|114,111,111,109,|109,109,110,110,|111,111,112,113,|114,114,114,114,|
|114,111,111,111,|111,110,111,111,|112,112,113,114,|114,114,115,115,|
|114,111,111,111,|111,109,110,111,|112,112,113,114,|115,115,115,115,|
+----------------+----------------+----------------+----------------+

 

        可见,运动矢量刚好为(-4, 1).

 

 

 

二、只向后参考

        在第十帧中选择一宏块,宏块基本信息为:

 

==== MB 48(4, 4) ====
    Location : (64, 64),
    Slice No. : 0
    Slice Type : B Slice
    MB Type : (2)B_L1_16x16
    NumMbPart : 1
    MbPartSize : (16, 16)

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

Pos(0, 0):
    L1=MV( 4, 0),POC:20,refIdx:0,DecNo:10

 

     由宏块基本信息可知,只向后参考,且实际运行矢量为(1, 0). 该宏块的预测值为:

 

====================== Y Data ======================
+----------------+----------------+----------------+----------------+
| 95, 77, 59, 53,| 57, 57, 60, 63,| 65, 65, 68, 73,| 79, 88, 96, 97,|
| 72, 59, 51, 53,| 57, 60, 62, 63,| 64, 64, 67, 74,| 80, 86, 95, 98,|
| 69, 61, 55, 51,| 56, 63, 64, 60,| 61, 65, 67, 73,| 79, 85, 96,100,|
|106, 95, 80, 65,| 59, 61, 63, 59,| 62, 68, 75, 81,| 84, 88, 97,104,|
+----------------+----------------+----------------+----------------+
|130,128,119,102,| 76, 64, 65, 67,| 71, 76, 82, 85,| 86, 91,100,110,|
|120,120,126,124,|103, 84, 78, 78,| 81, 82, 82, 81,| 82, 92,104,120,|
|110,112,118,121,|117,109,104,100,| 89, 85, 87, 81,| 82, 95,110,126,|
|116,119,120,116,|116,119,118,116,|102, 98,103, 96,| 94,106,120,135,|
+----------------+----------------+----------------+----------------+
|127,127,117,107,|115,121,120,119,|119,117,115,116,|119,129,139,146,|
|134,133,117,106,|118,126,125,125,|124,124,124,125,|130,138,148,155,|
|140,137,129,127,|131,130,128,129,|128,128,128,128,|133,142,152,166,|
|146,144,147,149,|130,119,127,134,|131,132,132,133,|135,146,156,169,|
+----------------+----------------+----------------+----------------+
|150,150,159,138,|101,103,127,134,|134,134,134,136,|137,145,154,155,|
|169,157,143,110,| 86,108,124,134,|138,139,138,137,|138,142,147,147,|
|168,152,121, 94,| 95,112,121,134,|145,145,141,139,|139,141,141,143,|
|171,146,110,100,|104,109,127,150,|153,150,145,142,|140,140,141,140,|
+----------------+----------------+----------------+----------------+

 

        第十一帧中,对应宏块的重建值为:

 

====================== Y Data ======================
+----------------+----------------+----------------+----------------+
|108, 95, 77, 59,| 53, 57, 57, 60,| 63, 65, 65, 68,| 73, 79, 88, 96,|
| 80, 72, 59, 51,| 53, 57, 60, 62,| 63, 64, 64, 67,| 74, 80, 86, 95,|
| 76, 69, 61, 55,| 51, 56, 63, 64,| 60, 61, 65, 67,| 73, 79, 85, 96,|
|108,106, 95, 80,| 65, 59, 61, 63,| 59, 62, 68, 75,| 81, 84, 88, 97,|
+----------------+----------------+----------------+----------------+
|131,130,128,119,|102, 76, 64, 65,| 67, 71, 76, 82,| 85, 86, 91,100,|
|121,120,120,126,|124,103, 84, 78,| 78, 81, 82, 82,| 81, 82, 92,104,|
|108,110,112,118,|121,117,109,104,|100, 89, 85, 87,| 81, 82, 95,110,|
|114,116,119,120,|116,116,119,118,|116,102, 98,103,| 96, 94,106,120,|
+----------------+----------------+----------------+----------------+
|123,127,127,117,|107,115,121,120,|119,119,117,115,|116,119,129,139,|
|128,134,133,117,|106,118,126,125,|125,124,124,124,|125,130,138,148,|
|132,140,137,129,|127,131,130,128,|129,128,128,128,|128,133,142,152,|
|139,146,144,147,|149,130,119,127,|134,131,132,132,|133,135,146,156,|
+----------------+----------------+----------------+----------------+
|148,150,150,159,|138,101,103,127,|134,134,134,134,|136,137,145,154,|
|168,169,157,143,|110, 86,108,124,|134,138,139,138,|137,138,142,147,|
|162,168,152,121,| 94, 95,112,121,|134,145,145,141,|139,139,141,141,|
|156,171,146,110,|100,104,109,127,|150,153,150,145,|142,140,140,141,|
+----------------+----------------+----------------+----------------+

 

        可见,运动矢量刚好为(1, 0).

 

 

 

三、同时向前向后参考

       在第二帧(B帧)中选择第六个宏块,宏块基本信息为:

 

==== MB 5(5, 0) ====
    Location : (80, 0),
    Slice No. : 0
    Slice Type : B Slice
    MB Type : B_Skip    (为了简化分析,突出主要问题,姑且选择非常特殊的B_Skip宏块吧)
    NumMbPart : 4
    MbPartSize : (8, 8)

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

Block(0, 0):
  (0,0) L0=MV( 0, 0),POC: 0,refIdx:0,DecNo: 1
  (0,0) L1=MV( 0, 0),POC: 4,refIdx:0,DecNo: 2
  (1,0) L0=MV( 0, 0),POC: 0,refIdx:0,DecNo: 1
  (1,0) L1=MV( 0, 0),POC: 4,refIdx:0,DecNo: 2
  (0,1) L0=MV( 0, 0),POC: 0,refIdx:0,DecNo: 1
  (0,1) L1=MV( 0, 0),POC: 4,refIdx:0,DecNo: 2
  (1,1) L0=MV( 0, 0),POC: 0,refIdx:0,DecNo: 1
  (1,1) L1=MV( 0, 0),POC: 4,refIdx:0,DecNo: 2

Block(1, 0):
  (0,0) L0=MV( 0, 0),POC: 0,refIdx:0,DecNo: 1
  (0,0) L1=MV( 0, 0),POC: 4,refIdx:0,DecNo: 2
  (1,0) L0=MV( 0, 0),POC: 0,refIdx:0,DecNo: 1
  (1,0) L1=MV( 0, 0),POC: 4,refIdx:0,DecNo: 2
  (0,1) L0=MV( 0, 0),POC: 0,refIdx:0,DecNo: 1
  (0,1) L1=MV( 0, 0),POC: 4,refIdx:0,DecNo: 2
  (1,1) L0=MV( 0, 0),POC: 0,refIdx:0,DecNo: 1
  (1,1) L1=MV( 0, 0),POC: 4,refIdx:0,DecNo: 2

Block(0, 1):
  (0,0) L0=MV( 0, 0),POC: 0,refIdx:0,DecNo: 1
  (0,0) L1=MV( 0, 0),POC: 4,refIdx:0,DecNo: 2
  (1,0) L0=MV( 0, 0),POC: 0,refIdx:0,DecNo: 1
  (1,0) L1=MV( 0, 0),POC: 4,refIdx:0,DecNo: 2
  (0,1) L0=MV( 0, 0),POC: 0,refIdx:0,DecNo: 1
  (0,1) L1=MV( 0, 0),POC: 4,refIdx:0,DecNo: 2
  (1,1) L0=MV( 0, 0),POC: 0,refIdx:0,DecNo: 1
  (1,1) L1=MV( 0, 0),POC: 4,refIdx:0,DecNo: 2

Block(1, 1):
  (0,0) L0=MV( 0, 0),POC: 0,refIdx:0,DecNo: 1
  (0,0) L1=MV( 0, 0),POC: 4,refIdx:0,DecNo: 2
  (1,0) L0=MV( 0, 0),POC: 0,refIdx:0,DecNo: 1
  (1,0) L1=MV( 0, 0),POC: 4,refIdx:0,DecNo: 2
  (0,1) L0=MV( 0, 0),POC: 0,refIdx:0,DecNo: 1
  (0,1) L1=MV( 0, 0),POC: 4,refIdx:0,DecNo: 2
  (1,1) L0=MV( 0, 0),POC: 0,refIdx:0,DecNo: 1
  (1,1) L1=MV( 0, 0),POC: 4,refIdx:0,DecNo: 2

 

      可见,既向前参考,也向后参考, 且运动矢量都为(0,0),该宏块的预测值为:

 

+----------------+----------------+----------------+----------------+
|116,120,136,167,|216,223,221,222,|222,220,216,213,|206,217,220,207,|
|135,170,207,219,|221,221,222,222,|222,221,216,213,|209,215,215,208,|
|208,226,231,219,|221,223,223,223,|223,222,217,214,|212,212,212,211,|
|232,225,219,226,|224,222,223,224,|225,225,222,220,|218,216,214,213,|
+----------------+----------------+----------------+----------------+
|223,223,225,227,|225,224,225,228,|228,229,229,228,|226,225,223,222,|
|213,214,217,221,|225,227,230,233,|234,234,234,234,|233,234,234,232,|
|216,219,223,227,|228,231,232,234,|235,235,235,235,|235,235,236,236,|
|227,230,232,235,|235,234,234,235,|235,235,235,235,|234,235,235,235,|
+----------------+----------------+----------------+----------------+
|231,232,233,234,|234,235,235,235,|235,235,235,235,|235,234,234,234,|
|233,233,233,234,|234,234,234,235,|235,235,235,235,|235,235,235,235,|
|233,233,233,234,|234,234,234,235,|235,235,235,235,|235,235,235,235,|
|233,233,233,234,|234,234,234,235,|235,235,235,235,|235,235,235,235,|
+----------------+----------------+----------------+----------------+
|233,233,234,234,|235,235,235,235,|235,235,235,235,|235,235,235,235,|
|233,233,234,234,|235,235,235,235,|235,235,235,235,|235,235,235,235,|
|234,234,234,235,|235,235,235,235,|235,235,235,235,|235,235,235,235,|
|234,234,234,235,|235,235,235,235,|235,235,235,235,|235,235,235,235,|
+----------------+----------------+----------------+----------------+

 

         前向参考帧(I帧)对应宏块的重建值为:

 

====================== Y Data ======================
+----------------+----------------+----------------+----------------+
|115,121,138,172,|221,221,221,222,|221,220,215,212,|203,221,221,203,|
|137,175,210,219,|221,221,221,222,|221,220,215,212,|206,219,219,206,|
|212,227,230,217,|222,222,222,223,|222,222,215,212,|211,212,212,211,|
|232,223,219,226,|223,222,222,223,|223,222,215,213,|212,212,211,211,|
+----------------+----------------+----------------+----------------+
|223,223,225,227,|224,224,224,226,|225,225,225,223,|218,215,213,212,|
|213,214,217,221,|225,227,230,233,|233,233,232,232,|232,231,231,227,|
|216,219,223,227,|228,231,232,234,|234,234,234,234,|235,236,236,236,|
|227,230,232,235,|235,234,234,235,|235,235,235,235,|234,235,236,236,|
+----------------+----------------+----------------+----------------+
|231,232,233,234,|234,235,235,235,|235,235,234,234,|234,234,234,234,|
|233,233,233,234,|234,234,234,235,|235,235,235,235,|234,234,234,234,|
|233,233,233,234,|234,234,234,235,|235,235,235,235,|234,234,234,234,|
|233,233,233,234,|234,234,234,235,|235,235,235,235,|235,235,235,235,|
+----------------+----------------+----------------+----------------+
|233,233,234,234,|235,235,235,235,|235,235,235,235,|235,235,235,235,|
|233,233,234,234,|235,235,235,235,|235,235,235,235,|235,235,235,235,|
|234,234,234,235,|235,235,235,235,|235,235,235,235,|235,235,235,235,|
|234,234,234,235,|235,235,235,235,|235,235,235,235,|235,235,235,235,|
+----------------+----------------+----------------+----------------+

 

         后向参考帧对应宏块的重建值为:

====================== Y Data ======================
+----------------+----------------+----------------+----------------+
|116,119,133,162,|211,224,221,222,|222,220,217,213,|208,213,219,211,|
|132,165,203,218,|221,221,222,222,|223,222,217,213,|212,211,211,210,|
|204,225,231,220,|220,223,223,223,|223,222,219,215,|213,212,211,211,|
|231,226,219,225,|225,222,223,225,|226,227,228,227,|223,220,217,214,|
+----------------+----------------+----------------+----------------+
|223,223,225,227,|225,224,225,229,|231,233,233,233,|234,234,233,232,|
|213,214,216,220,|224,227,230,233,|234,234,235,235,|234,236,236,236,|
|215,219,222,226,|228,230,232,234,|235,235,235,235,|234,234,235,235,|
|226,230,232,235,|235,234,234,235,|235,235,235,234,|234,234,234,234,|
+----------------+----------------+----------------+----------------+
|231,232,233,234,|234,235,235,235,|235,235,235,235,|235,234,234,234,|
|233,233,233,234,|234,234,234,235,|235,235,235,235,|235,235,235,235,|
|233,233,233,234,|234,234,234,235,|235,235,235,235,|235,235,235,235,|
|233,233,233,234,|234,234,234,235,|235,235,235,235,|235,235,235,235,|
+----------------+----------------+----------------+----------------+
|233,233,234,234,|235,235,235,235,|235,235,235,235,|235,235,235,235,|
|233,233,234,234,|235,235,235,235,|235,235,235,235,|235,235,235,235,|
|234,234,234,235,|235,235,235,235,|235,235,235,235,|235,235,235,235,|
|234,234,234,235,|235,235,235,235,|235,235,235,235,|235,235,235,235,|
+----------------+----------------+----------------+----------------+

 

       由于运动矢量为(0,0),所以补偿帧和重建帧相等,设该B宏块的预测值为predictedMB, 前向补偿帧和后向补偿帧对应的宏块分写为preMcMB和postMcMB, 显而易见有:predictedMB = ceil ( ( preMcMB + postMcMB ) / 2 ).

 

       最后说一句:在MPEG2中,B帧不做参考帧,但是在H.264中,B帧可以做参考帧,JM8.6的配置文件(main profile)中的StoredBPictures就是一个对应的开关.

原创粉丝点击