H264/AVC-帧内预测
I宏块使用帧内预测编码压缩数据,根据相邻宏块数据恢复当前宏块信息。值得注意的一点是,帧内预测所参考的相邻宏块数据是deblocking之前的像素值,因为上一宏块的deblocking依赖当前宏块像素值,但当前宏块数据还未重建。
1.帧内预测类型
帧内预测包含4种类型:
- 亮度4x4块Intra_4x4预测方式
- 亮度8x8块Intra_8x8预测方式
- 亮度16x16宏块Intra_16x16预测方式
- 色度8x8块预测方式。
帧内预测的输入为预测模式和相邻块像素值,输出为当前块的预测值。
2. 亮度Intra_4x4预测
该模式下,16x16宏块中的亮度块,可分为16个4x4块,每个4x4块都使用Intra_4x4预测方式。其中16个4x4块的扫描顺序如下图:
对于索引号luma4x4BlkIdx为0-15的4x4块,预测过程如下:
1) 根据相邻块Intra4x4PredMode推导当前块Intra4x4PredMode;
2) 根据Intra4x4PredMode和相邻块像素值,得到当前块预测像素值。
2.1 当前块Intra4x4PredMode的推导过程
本过程的输入是 4x4 亮度块的索引 luma4x4BlkIdx 和先前(按照解码顺序)已经得到的相邻宏块的预测方式 Intra4x4PredMode (如果可用) 和 Intra8x8PredMode(如果可用)。 本过程的输出是变量 每个4x4块的Intra4x4PredMode[ luma4x4BlkIdx ]。
下表定义了 Intra4x4PredMode[ luma4x4BlkIdx ]的值和相应的名称。
Intra4x4PredMode[ luma4x4BlkIdx ]的值为 0、1、2、3、4、5、6、7 和 8,这些值分别代表不同预测方向,如下图:
Intra4x4PredMode[ luma4x4BlkIdx ] 由以下方式得到:
1) 以下任一条件满足则使用DC预测(Intra_4x4_DC):
- 宏块mbAddrA(当前宏块左相邻宏块)不可用;
- 宏块mbAddrB(当前宏块上相邻宏块)不可用;
- 宏块mbAddrA可用,并且以帧间预测方式进行编码、constrained_intra_ pred_flag为1;
- 宏块mbAddrB可用,并且以帧间预测方式进行编码、constrained_intra_ pred_flag为1;
举个例子,I slice的第一个宏块必定使用DC预测,因为它的相邻块mbAddrA、mbAddrB都不可用。
2) 不满足上述条件,则通过相邻块预测模式预测当前块Intra4x4PredMode。
已知以下信息:mbAddrA的预测模式、mbAddrB的预测模式、码流中读取的语法元素prev_intra4x4_pred_mode_flag。
- 从mbAddrA和mbAddrB的预测模式中选取较小的一个作为预先定义模式。
- 判断码流中读取的标志位prev_intra4x4_pred_mode_flag,如果该标志位为1,则预先定义模式就是当前块的预测模式;
- 如果标志位prev_intra4x4_pred_mode_flag为0,则根据码流中解析出的语法元素 rem_intra4x4_pred_mode判断。如果rem_intra4x4_pred_mode的值小于预定义模式的值则选用rem_intra4x4_pred_mode;如果大于等于预定义模式,则当前块的预测模式设为rem_intra4x4_pred_mode + 1。
伪代码如下:
predIntra4x4PredMode = Min( intraMxMPredModeA, intraMxMPredModeB )
if( prev_intra4x4_pred_mode_flag[ luma4x4BlkIdx ] )Intra4x4PredMode[ luma4x4BlkIdx ] = predIntra4x4PredMode
elseif( rem_intra4x4_pred_mode[ luma4x4BlkIdx ] < predIntra4x4PredMode )Intra4x4PredMode[ luma4x4BlkIdx ] = rem_intra4x4_pred_mode[ luma4x4BlkIdx ]
elseIntra4x4PredMode[ luma4x4BlkIdx ] = rem_intra4x4_pred_mode[ luma4x4BlkIdx ] + 1
标准文档中这部分内容比较繁杂,其实可以总结为:
- 如果不能获取相邻宏块的预测方式,则当前块的预测模式为DC预测;
- 否则选择相邻块预测方式较小的一个作为当前的模式预测值;
- 码流中指定了要不要使用这个预测值。如果用,那么这个预测值就是当前块的帧内预测模式;否则就从后续读取的预测模式中计算。
2.2 获取预测数据
Intra_4x4预测需要用到的13个相邻像素值如下图所示:
相邻像素如何获取可参考帧内预测相邻像素推导过程.
首先需要判断这13个像素值是否有效。当下列4个条件满足任意一个,那么该像素便被判定为无效,不能用于预测:
- 宏块mbAddrN不可获得;
- 宏块mbAddrN为帧间预测模式,且标识位constrained_intra_pred_flag为1;
- 宏块mbAddrN为SI类型,,且标识位constrained_intra_pred_flag为1,且当前宏块不是SI类型;
- 块索引luma4x4BlkIdx为3或11时,EFGH4个像素值不可用;(如下图所示,当解码到第3个块时,4还未解码,所以块4中的预测像素值不能使用,也就是EFGH这4个像素值)。
2.3 Intra4x4预测
Intra4x4预测根据相邻的13个像素值得到当前4x4块预测像素值。预测方式共有9种;
2.3.1 Intra4x4_Vertical预测模式
2.3.2 Intra4x4_Horizontal预测模式
2.3.3 Intra4x4_DC预测模式
Dc数值为相邻像素值的均值:
1)A、B、C、D、I、J、K、L都存在时,dc为这8个像素值的均值;
2)A、B、C、D不可用时,dc为I、J、K、L这4个像素的均值;
3)I、J、K、L不可用时,dc为A、B、C、D这4个像素的均值;
4)当这8个像素都不可用时,dc为(1<<(bit_depth-1))。
2.3.4 Intra4x4_Diagonal_Down_left预测模式
当A、B、C、D、E、F、G、H 8个像素存在时才能使用这种预测模式;
- 当(x,y)=(3,3),即计算一个4×4像素块最右下方的像素p时:
pred4x4L[ x, y ] = ( p[ 6, −1 ] + 3 * p[ 7, −1 ] + 2 ) >> 2 - 其他情况计算方式如下:
pred4x4L[ x, y ] = ( p[ x + y, −1 ] + 2 * p[ x + y + 1, −1 ] + p[ x + y + 2, −1 ] + 2 ) >> 2;
以像素点a为例,做一条左下方向成45°直线,会穿过预测像素点B,预测计算过程依赖A、B、C三个像素值,pred_a = (A+2B+C+2)/4
2.3.5 Intra4x4_Diagonal_Down_right预测模式
2.3.6 Intra_4x4_Vertical_Right预测模式
后面的几种预测方向不是45°整数倍,要分成两种情况分别计算。
以Intra_4x4_Vertical_Right为例,像素a、j的预测值为(A+Q+1)/2;
像素f、o的预测值为(Q+2A+B+2)/4
2.3.7 Intra_4x4_Horizontal_Down预测模式
2.3.8 Intra_4x4_Vertical_Left预测模式
2.3.9 Intra_4x4_Horizontal_Up预测模式
2.亮度Intra_8x8预测
一个宏块种的16x16亮度分量可分为4个8x8亮度块,每个8x8块都是用Intra_8x8预测方式。其中4个8x8块的扫描顺序如下:
对于索引号luma8x8BlkIdx为0-3的8x8块,预测方式推导过程、预测像素计算过程与Intra4x4类似,在此不再赘述。获取8x8块预测像素值流程如下:
1) 根据相邻块Intra8x8PredMode推导当前块Intra8x8PredMode;
2) 确定预测过程使用的相邻块预测像素是否可用
3)根据Intra8x8PredMode和相邻块预测像素值,得到当前块预测像素值。
3.亮度Intra_16x16预测
相比于Intra_4x4和Intra_8x8,Intra_16x16的区别主要有以下几点:
- 预测模式可以直接从mb_type得到,不需要通过相邻块预测;
- 预测模式只有4种
Intra_16x16需要33个参考像素点,分别为当前宏块左侧16个像素点,上方16个像素点以及左上方一个像素点。这些参考像素点是否可用的判断方式于Intra_4x4类似。
4种预测模式如下:
3.1 Intra_16x16_Vertical预测模式
只有上方16个参考像素有效时才可以使用,计算方法为
predL[ x, y ] = p[ x, −1 ], x, y = 0…15
3.2 Intra_16x16_Horizontal预测模式
只有左侧16个参考像素有效时才可以使用,计算方法为
predL[ x, y ] = p[ −1, y ], x, y = 0…15
3.3 Intra_16x16_DC预测模式
16×16模式的DC预测模式同4×4模式的DC预测方法类似,判断左侧16个像素和上方16个像素的有效性,将其中有效部分的均值作为整个预测块的像素值。如果32个像素都无效,则预测块像素值为( 1 << ( bit_depth − 1 ) )。
一般码流中第一个I slice的第一个宏块会使用Intra_16x16_DC预测模式,对于8bit像素,其宏块预测值为128.
3.4 Intra_16x16_Plane预测模式
Intra_16x16_Plane模式要求33个像素值都存在时才能使用。计算方式如下:
predL[ x, y ] = Clip1Y( ( a + b * ( x − 7 ) + c * ( y − 7 ) + 16 ) >> 5 ),x,y = 0…15
其中,
a = 16 * ( p[−1, 15 ] + p[ 15, −1 ] )
b = ( 5 * H + 32 ) >> 6
c = ( 5 * V + 32 ) >> 6
4.色度8x8块预测
一个宏块包含两个8x8色度块,分别为cb分量和cr分量。这两个分量使用相同的预测方式,由mb header中的语法元素intra_chroma_pred_mode决定。
这4种预测模式与Intra_16x16类似,不再赘述。
H264/AVC-帧内预测相关推荐
- Overview of HEVC之4 帧内预测
帧内预测是根据传输块的尺寸进行操作的,并且空间上相邻传输块的先前解码的边界像素被用来形成预测信号,对4*4到32*32的传输块定义了33种不同的方向预测.图6显示了可能的预测方向.另外也用到了平面预测 ...
- 音视频开发之旅(58) -H.264 帧内预测
目录 编码流程和数据格式回顾 4 × 4亮度块的9中预测模式 16 × 16亮度块的4种预测模式 8 × 8 色度块的4种预测模式 JM代码 资料 收获 一.编码流程和数据格式回顾 我们先看下下图来回 ...
- JM模型I帧帧内预测流程
原文转自:http://blog.163.com/huangchao198311@126/blog/static/1370282702010014112311995/ I帧只存在帧内编码,没有帧间运动 ...
- 2.H.265/HEVC —— 帧内预测
在H.265/HEVC中,35种预测模式是在PU的基础上定义的,而具体帧内预测过程的实现则是以TU为单位的.编撰规定PU可以以四叉树的形式划分TU,且一个PU内所有TU共享同一种预测模式的形式划分TU ...
- 音视频开发(四十九)H.264 帧内预测
目录 编码流程和数据格式回顾 4 × 4亮度块的9中预测模式 16 × 16亮度块的4种预测模式 8 × 8 色度块的4种预测模式 JM代码 一.编码流程和数据格式回顾 我们先看下下图来回顾下编码流程 ...
- 从HEVC到VVC:帧内预测技术的演进(2) – 多划分及多参考行帧内预测
当前主流的视频编码标准(如H.264/AVC,VP9,AVS1,HEVC等)均使用当前预测单元最邻近的已重构像素对当前预测单元进行帧内预测.因为当前预测单元与其临近的像素之间有很强的相关性,该帧内预测 ...
- H.264 入门篇 - 05 (帧内预测)
目录 0.前言 1.帧内预测类型 2.亮度 Intra_4x4 预测 2.1.当前块 Intra4x4PredMode 的推导过程 2.1.1.预测模式获取情况 2.2.获取预测数据 2.3.Intr ...
- 【H2645】帧内预测
1.帧内预测的原理 帧内预测的原理:预测值是该像素周围像素值加权求和(比如平均值)P,它和实际值相减后得到的差值q,如果差值q很小,说明该像素的值可以通过预测得出,可以丢弃了,这就达到压缩编码的目的. ...
- AVS 帧内预测模式的汇编优化
王瑞* 基金项目:本课题得到国家自然科学基金资助项目基金(项目编号:60772101)的资助. 作者简介:王瑞(1986-), 男, 山东莱芜人, 硕士, 主要从事视频压缩方面的研究. E-mail: ...
- 宏块帧内预测的具体过程
对一个宏块进行帧内预测的具体过程如下: (1)对于8x8色度块就选择一种帧内色度预测模式建立相应的帧内预测块: (2)按遍历的方法分别计算4种Intra_16x16帧内预测模式的代价(Rdcost16 ...
最新文章
- 最大值(3.3)(java)
- 错误:pytube.exceptions.RegexMatchError
- GoCart 分类和产品 测试一
- 【GVA】gin gorm多对多many2many更新数据时级联更新关联表数据的正确写法
- Linux 如何安装 SRPM 包(源代码 rpm 软件包,以 .src.rpm 为后缀名)/rpm 格式的源码软件包/源码包
- linux bash and,linux bash shell中for的用法and示例
- ProPublica Illinois如何每天使用GNU Make加载1.4GB数据
- 万字教你如何用 Python 实现线性规划
- 【opencv+python】下载安装教程
- IE 首页被改为www.1188.com的恢复办法
- 魔兽世界python脚本拍卖行_Python大法之告别脚本小子系列—信息资产收集类脚本编写(上)...
- foremost文件删除恢复
- JS根据身份证计算年龄
- 计算机在饲养管理方面的应用,高新技术对奶牛业的应用
- Android 国内集成使用谷歌地图
- RESTful理解与实践
- 高通败诉,授权专利技术之后高通的优势不再?
- 如何使用ansible管理多台远程服务器
- 「Nginx实战」中学到的东西用在面试上,面试官都被怼得哑口无言
- Android集成环信IM,实现为某一个好友设置消息免打扰
热门文章
- UniGui iconCls字符图标的引用
- Win10下ANSA安装完后打不开的解决方案
- 基于javaweb+jsp的仓库进销存管理系统(JavaWeb MySQL JSP Bootstrap Servlet SSM SpringBoot)
- 离散数学/组合数学:序列与其对应的生成函数;多项式函数的系数与序列的联系;重复组合数的理解方法即----全1序列对应的生成函数做n重卷积(不严谨说法)之后得到的序列的x的k次方项的系数;莫比乌斯反演。
- css3 火焰文字,CSS3-CSS3源码之火焰文字特效
- 机器学习入门2--回归之线性回归及梯度下降
- 给力的同事、周到的福利——揭秘万达电商(5)
- 中国移动首次出现营收下滑,中国联通和中国电信的策略凑效
- 华为机考攻略(python)--入门题【5题】(第一题HJ5进制转换)
- 如何将一连串图片做成动图?怎么把图片做成gif动态图?