宏块类型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. 分分钟解决iOS开发中App启动广告的功能

    前不久有朋友需要一个启动广告的功能,我说网上有挺多的,他说,看的不是很理想.想让我写一个,于是乎,抽空写了一个,代码通俗易懂,简单的封装了一下,各种事件用block回调的,有俩种样式的广告,一种是全屏 ...

  2. git 删除配置的远程地址

    删除(origin 名称需根据你本地查询出来的想删除的名字, 查询命令为 git remote -v) git remote rm origin 添加(origin 名称可根据需要添加) git re ...

  3. at91sam9x5 linux 4.1.0下dts驱动编程模型

    测试环境:  CPU: AT91SAM9X35      Linux: Atmel提供的linux-at91-linux4sam_5.3 (Linux-4.1.0) 转载请注明: 凌云物网智科嵌入式实 ...

  4. 使用API在DigitalOcean上创建VPS

    1.生成Personal Access Token(API-Token) 密钥类似如下格式: 81d58e36224b63fc2gedac14342d0cfb16vf5451c798b2a38f976 ...

  5. [日历] C#修改CNDate日历帮助类 (转载)

    点击下载 CNDate.rar 主要功能如下 .传回公历y年m月的总天数 .根据日期值获得周一的日期 .获取农历 #region 私有方法 private static long[] lunarInf ...

  6. JS一些应用脚本

    脚本一: //重置下标(可以修改成自己所需要的脚本) function ReSetBoxOrder() { var q = 0;//下标值 var a = 0;//暂未用到 //循环当前tbody下的 ...

  7. Python编写相关注意事项

    1.# -*- coding: utf-8 -*-代码首部添加这个,不然会报Non_ASCII charater错误 python闭包:实际应用场景1.保持闭包运行完后的环境: 2.根据外部作用域的局 ...

  8. Java5中的线程池实例讲解

    Java5增加了新的类库并发集java.util.concurrent,该类库为并发程序提供了丰富的API多线程编程在Java 5中更加容易,灵活.本文通过一个网络服务器模型,来实践Java5的多线程 ...

  9. iOS 知识-常用小技巧大杂烩

    原文链接:http://www.jianshu.com/p/7c3ee5e67d03. 自己看的. 1,打印View所有子视图 po [[self view]recursiveDescription] ...

  10. The version of CocoaPods used to generate the lockfile (*) is higher than the version of the current executable (*). Incompatibility issues may arise.

    解决方法: sudo gem update cocoapod