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

h.264宏块与子宏块类型的更多相关文章

  1. 【H.264/AVC视频编解码技术具体解释】十三、熵编码算法(4):H.264使用CAVLC解析宏块的残差数据

    <H.264/AVC视频编解码技术具体解释>视频教程已经在"CSDN学院"上线,视频中详述了H.264的背景.标准协议和实现,并通过一个实战project的形式对H.2 ...

  2. FFmpeg的H.264解码器源代码简单分析:宏块解码(Decode)部分-帧间宏块(Inter)

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  3. h.264并行解码算法分析

    并行算法类型可以分为两类 Function-level Decomposition,按照功能模块进行并行 Data-level Decomposition,按照数据划分进行并行 Function-le ...

  4. h.264语法结构分析

    NAL Unit Stream Network Abstraction Layer,简称NAL. h.264把原始的yuv文件编码成码流文件,生成的码流文件就是NAL单元流(NAL unit Stre ...

  5. h.264 Mode Decision

    Mode Decision(模式选择)决定一个宏块以何种类型进行分割.宏块的分割类型有以下几种: //P_Skip and B_Skip means that nothing need to be e ...

  6. 【视频编解码·学习笔记】2. H.264简介

    一.H.264视频编码标准 H.264视频编码标准是ITU-T与MPEG合作产生的又一巨大成果,自颁布之日起就在业界产生了巨大影响.严格地讲,H.264标准是属于MPEG-4家族的一部分,即MPEG- ...

  7. FFmpeg的H.264解码器源代码简单分析:熵解码(Entropy Decoding)部分

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  8. 7. H.264的句法和语义

    1.句法 在编码器输出的码流中,数据的基本单位是句法元素,每个句法元素由若干比特组成,它表示某个特定的物理意义,例如:宏块类型.量化参数等. 句法表征句法元素的组织结构,语义阐述句法元素的具体含义. ...

  9. 6. H.264/AVC编码器原理

    1. H.264/AVC的应用 H.264 不仅具有优异的压缩性能,而且具有良好的网络亲和性,这对实时的视频通信是十分重要的.和 MPEG-4 中的重点是灵活性不同,H.264 着重在压缩的高效率和传 ...

随机推荐

  1. Windows Server 2008中关闭事件跟踪程序的方法

    Windows Server 2008跟Windows Server 2003一样,在关机的时候会弹出一个“关闭事件跟踪程序”窗口,当然微软这么做是处于安全的考虑啦,但是如果我们只是个人用用的话,那就 ...

  2. FolderBrowserDialog使用

    private void button_browse_Click(object sender, EventArgs e) { FolderBrowserDialog fbd = new FolderB ...

  3. HTML+CSS基础学习笔记(5)

    一.文字排版--字体 Eg: body{font-family:"宋体";} body{font-family:"Microsoft Yahei";}//微软雅 ...

  4. (转)教你如何使用php session

    PHP session用法其实很简单它可以把用户提交的数据以全局变量形式保存在一个session中并且会生成一个唯一的session_id,这样就是为了多了不会产生混乱了,并且session中同一浏览 ...

  5. [配置文件] C#修改App.config,Web.config文件帮助类,ConfigHelper (转载)

    点击下载 ConfigHelper-sufei.rar 主要功能如下 .根据Key取Value值 .根据Key修改Value .添加新的Key ,Value键值对 .根据Key删除项 /// < ...

  6. OPENQUERY

    SELECT * FROM OPENQUERY(saql007,' SELECT  col1,col2,col3 FROM dbname.shemaname.tablename WHERE  (1=1 ...

  7. Java之final的解析

    在Java中,final关键字可以用来修饰类.方法和变量(包括成员变量和局部变量). 当用final修饰一个类时,表明这个类不能被继承. 对于一个final变量,如果是基本数据类型的变量,则其数值一旦 ...

  8. 祭奠一年前写 Direct2D demo

    一年前, 用Direct2D实现了不怎么样的UI库. 用不怎么样的UI库实现了这个Demo. 当时放进某群共享, 以此装逼. 今天无意中翻出来, 解压, 什么都没变, 还是压缩前的模样. 不经意看见被 ...

  9. MFC中cannot find the definition (implementation) of this function 解决方法

    问题:使用vc6 在点击左侧class view中的一个方法实现时出现下面错误:    cannot find the definition (implementation) of this func ...

  10. Windows phone 之XML序列化与反序列化

    为什么要做序列化和反序列化? 一个回答: 我们都知道对象是不能在网络中直接传输的,不过还有补救的办法.XML(Extensible Markup Language)可扩展标记语言,本身就被设计用来存储 ...