h.264宏块与子宏块类型
宏块类型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 |
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 |
MbPartPredMode |
MbPartPredMode |
MbPartWidth |
MbPartHeight |
| 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 |
MbPartPredMode |
MbPartPredMode |
MbPartWidth |
MbPartHeight |
| 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 |
SubMbPredMode |
SubMbPartWidth |
SubMbPartHeight |
| 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 |
SubMbPredMode |
SubMbPartWidth |
SubMbPartHeight |
| 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宏块与子宏块类型的更多相关文章
- 【H.264/AVC视频编解码技术具体解释】十三、熵编码算法(4):H.264使用CAVLC解析宏块的残差数据
<H.264/AVC视频编解码技术具体解释>视频教程已经在"CSDN学院"上线,视频中详述了H.264的背景.标准协议和实现,并通过一个实战project的形式对H.2 ...
- FFmpeg的H.264解码器源代码简单分析:宏块解码(Decode)部分-帧间宏块(Inter)
===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...
- h.264并行解码算法分析
并行算法类型可以分为两类 Function-level Decomposition,按照功能模块进行并行 Data-level Decomposition,按照数据划分进行并行 Function-le ...
- h.264语法结构分析
NAL Unit Stream Network Abstraction Layer,简称NAL. h.264把原始的yuv文件编码成码流文件,生成的码流文件就是NAL单元流(NAL unit Stre ...
- h.264 Mode Decision
Mode Decision(模式选择)决定一个宏块以何种类型进行分割.宏块的分割类型有以下几种: //P_Skip and B_Skip means that nothing need to be e ...
- 【视频编解码·学习笔记】2. H.264简介
一.H.264视频编码标准 H.264视频编码标准是ITU-T与MPEG合作产生的又一巨大成果,自颁布之日起就在业界产生了巨大影响.严格地讲,H.264标准是属于MPEG-4家族的一部分,即MPEG- ...
- FFmpeg的H.264解码器源代码简单分析:熵解码(Entropy Decoding)部分
===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...
- 7. H.264的句法和语义
1.句法 在编码器输出的码流中,数据的基本单位是句法元素,每个句法元素由若干比特组成,它表示某个特定的物理意义,例如:宏块类型.量化参数等. 句法表征句法元素的组织结构,语义阐述句法元素的具体含义. ...
- 6. H.264/AVC编码器原理
1. H.264/AVC的应用 H.264 不仅具有优异的压缩性能,而且具有良好的网络亲和性,这对实时的视频通信是十分重要的.和 MPEG-4 中的重点是灵活性不同,H.264 着重在压缩的高效率和传 ...
随机推荐
- 使用Java辅助类(CountDownLatch、CyclicBarrier、Semaphore)并发编程
在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法 一.C ...
- python学习笔记--Django入门四 管理站点--二
接上一节 python学习笔记--Django入门四 管理站点 设置字段可选 编辑Book模块在email字段上加上blank=True,指定email字段为可选,代码如下: class Autho ...
- [转]cookie、session、sessionid 与jsessionid
cookie.session.sessionid 与jsessionid,要想明白他们之间的关系,下面来看个有趣的场景来帮你理解. 我们都知道银行,银行的收柜台每天要接待客户存款/取款业务,可以有几种 ...
- Memcache简介
简介 Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像.视频.文件以及数据库检索的结果等.简单的说就是将数据调 ...
- 简洁JS 日历控件 支持日期和月份选择
原文出处 以下这个JS日历控件是我的闲暇之余自己编写的,所有的代码全部在IE7/IE8/Firefox下面测试通过, 而且可以解决被iframe层遮盖的问题.现在只提供两种风格(简洁版和古典版)和两种 ...
- 关于自己的ES6使用姿势
ES6今年开始学的,从看文档到实践,以下是自己使用过的一些ES6的东西: 1:for-of 语法: 最喜欢的还是它支持了break/continue的语法,而且还修改了for-in的缺陷,简要写法: ...
- iOS开发的技能树
1.UI2.多线程 3.网络 4.多媒体 5.存储 6.分布式 7.支付,第三方 8.地图,动画,二维码,打包 9.特效10.apple watch/ apple tv 11.swift 12.web ...
- HUST 4681 String (DP LCS变形)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4681 题目大意:给定三个字符串A,B,C 求最长的串D,要求(1)D是A的字序列 (2)D是B的子序列 ...
- AdaBoost原理,算法实现
前言: 当做重要决定时,大家可能综合考虑多个专家而不是一个人的意见.机器学习处理问题也是如此,这就是元算法背后的思路.元算法是对其他算法进行组合的一种方式,前几天看了一个称作adaboost方法的介绍 ...
- c、c++混编实现查询本地IP地址
一.思路 1.要想得到本地IP地址,可以通过本机名来查询,所以首先得得到本机名. 2.牵涉到IP地址,首先想到牵涉到网络协议,因此得加载套接字协议,所以先使用WSAStartup函数完成对Winsoc ...