十五帧内编码:4生成预测像素块
Posted 叮咚咕噜
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了十五帧内编码:4生成预测像素块相关的知识,希望对你有一定的参考价值。
在获取了13个预测像素点之后,再根据第2节计算出的预测模式,便可以获取相应的预测块数据。该部分在标准文档的8.3.1.2.1到8.3.1.2.9节定义。
模式0:垂直模式
当前块的帧内预测模式为0时,使用垂直模式生成预测块。该模式只有预测像素p(0,-1)~p(3,-1)有效的条件下可用。预测块的计算方法为:
pred4x4L[ x, y ] = p[ x, −1 ], with x, y = 0..3
//其实就是x的一整列都是同一个值
模式1:水平模式
当前块的帧内预测模式为1时,使用水平模式生成预测块。该模式只有预测像素p(-1,0)~p(-1,3)的条件下可用。预测块的计算方法为:
pred4x4L[ x, y ] = p[ −1, y ], with x,y = 0..3
模式2:DC模式
当前块的帧内预测模式为2时,使用DC模式生成预测块。DC模式下预测块的所有16个像素点取值一致,计算需要根据预测像素有效性分为一下不同情况:(上边沿和下边沿所有有效数据的和除以一个值)
- 如果上方相邻像素p(0,-1) ~ p(3,-1)和左方相邻像素p(-1,0)~p(-1,3)这8个点都有效,预测块的计算方法为
pred4x4L[x,y] = (p[0,−1] + p[1,−1] + p[2,−1] + p[3,−1] + p[−1,0] + p[−1,1] + p[−1,2] + p[−1,3] + 4) >> 3
- 如果上方相邻像素p(0,-1) ~ p(3,-1)无效,而左方相邻像素p(-1,0)~p(-1,3)有效,预测块的计算方法
pred4x4L[ x, y ] = ( p[ −1, 0 ] + p[ −1, 1 ] + p[ −1, 2 ] + p[ −1, 3 ] + 2 ) >> 2
- 如果左方相邻像素p(-1,0) ~ p(-1,3)无效,而上方相邻像素p(0,-1)~p(3,-1)有效,预测块的计算方法为
pred4x4L[ x, y ] = ( p[ 0, −1 ] + p[ 1, −1 ] + p[ 2, −1 ] + p[ 3, −1 ] + 2 ) >> 2
- 如果上述8个相邻像素均无效,预测块的计算方法为:
pred4x4L[ x, y ] = ( 1 << ( BitDepthY − 1 ) )
BitDepthY是bit深度,我们用到的都是8位
模式3:左下对角线模式
当前块的帧内预测模式为3时,使用左下对角线模式生成预测块。该模式只有预测像素p(0,-1)~p(7,-1)有效的条件下可用。预测块的计算方法为:
- 当(x,y)=(3,3),即计算一个4×4像素块最右下方的一个点时:
pred4x4L[3,3] = ( 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
模式4:右下对角线模式
当前块的帧内预测模式为4时,使用左下对角线模式生成预测块。该模式只有上方预测像素p(0,-1)p(3,-1)、左方预测像素p(-1,0)p(-1,3)和左上角对角像素点p(-1,-1)有效的条件下可用。预测块的计算方法为:
- x > y :
pred4x4L[ x, y ] = ( p[ x − y − 2, −1] + 2 * p[ x − y − 1, −1 ] + p[ x − y, −1 ] + 2 ) >> 2
- x < y :
pred4x4L[ x, y ] = ( p[ −1, y − x − 2 ] + 2 * p[ −1, y − x − 1 ] + p[ −1, y − x ] + 2 ) >> 2
- x == y:
pred4x4L[ x, y ] = ( p[ 0, −1 ] + 2 * p[ −1, −1 ] + p[ −1, 0 ] + 2 ) >> 2
模式5:右垂直模式
当前块的帧内预测模式为5时,使用右垂直模式生成预测块。该模式只有上方预测像素p(0,-1) ~ p(3,-1)、左方预测像素p(-1,0) ~ p(-1,3)和左上角对角像素点p(-1,-1)有效的条件下可用。预测块的计算方法为:
首先计算中间变量:zVR = 2 * x - y,根据zVR取值(需要先计算出斜率)
- 若zVR等于0/2/4/6:
pred4x4L[ x, y ] = ( p[ x − ( y >> 1 ) − 1, −1 ] + p[ x − ( y >> 1 ), −1 ] + 1 ) >> 1
- 若zVR等于1/3/5:
pred4x4L[ x, y ] = ( p[ x − ( y >> 1 ) − 2, −1] + 2 * p[ x − ( y >> 1 ) − 1, −1 ] + p[ x − ( y >> 1 ), −1 ] + 2 ) >> 2
- 若zVR等于-1:
pred4x4L[ x, y ] = ( p[ −1, 0 ] + 2 * p[ −1, −1 ] + p[ 0, −1 ] + 2 ) >> 2
- 其他情况,即zVR等于-2或-3:
pred4x4L[ x, y ] = ( p[ −1, y − 1 ] + 2 * p[ −1, y − 2 ] + p[ −1, y − 3 ] + 2 ) >> 2
模式6:下水平模式
当前块的帧内预测模式为6时,使用下水平模式生成预测块。该模式只有上方预测像素p(0,-1)p(3,-1)、左方预测像素p(-1,0)p(-1,3)和左上角对角像素点p(-1,-1)有效的条件下可用。预测块的计算方法为:
首先计算中间变量:zHD = 2 * y - x,根据zHD的取值
- 若zHD等于0/2/4/6:
pred4x4L[ x, y ] = ( p[ −1, y − ( x >> 1 ) − 1 ] + p[ −1, y − ( x >> 1 ) ] + 1 ) >> 1
- 若zHD等于1/3/5:
pred4x4L[ x, y ] = ( p[ −1, y − ( x >> 1 ) − 2 ] + 2 * p[ −1, y − ( x >> 1 ) − 1 ] + p[ −1, y − ( x >> 1 ) ] + 2 ) >> 2
- 若zHD等于-1:
pred4x4L[ x, y ] = ( p[ −1, 0 ] + 2 * p[ −1, −1 ] + p[ 0, −1 ] + 2 ) >> 2
- 其他情况,即zHD等于-2或-3:
pred4x4L[ x, y ] = ( p[ x − 1, −1 ] + 2 * p[ x − 2, −1 ] + p[ x − 3, −1 ] + 2 ) >> 2
模式7:左垂直模式
当前块的帧内预测模式为7时,使用左垂直模式生成预测块。该模式只有预测像素p(0,-1)~p(7,-1)有效的条件下可用。预测块的计算方法为:
- 若y等于0或2;
pred4x4L[ x, y ] = ( p[ x + ( y >> 1 ), −1 ] + p[ x + ( y >> 1 ) + 1, −1 ] + 1) >> 1
- 若y等于1或3:
pred4x4L[ x, y ] = ( p[ x + ( y >> 1 ), −1 ] + 2 * p[ x + ( y >> 1 ) + 1, −1 ] + p[ x + ( y >> 1 ) + 2, −1 ] + 2 ) >> 2
模式8:上水平模式
当前块的帧内预测模式为8时,使用上水平模式生成预测块。该模式只有预测像素p(-1,0)~p(-1,3)的条件下可用。预测块的计算方法为:
首先计算中间变量zHU:zHU = x + 2 * y;
- 若zHU等于0/2/4:
pred4x4L[ x, y ] = ( p[ −1, y + ( x >> 1 ) ] + p[ −1, y + ( x >> 1 ) + 1 ] + 1 ) >> 1
- 若zHU等于1或3:
pred4x4L[ x, y ] = ( p[ −1, y + ( x >> 1 ) ] + 2 * p[ −1, y + ( x >> 1 ) + 1 ] + p[ −1, y + ( x >> 1 ) + 2 ] + 2 ) >> 2
- 若zHU等于5:
pred4x4L[ x, y ] = ( p[ −1, 2 ] + 3 * p[ −1, 3 ] + 2 ) >> 2
- 其他情况,即zHU大于5:
pred4x4L[ x, y ] = p[ −1, 3 ]
以上是关于十五帧内编码:4生成预测像素块的主要内容,如果未能解决你的问题,请参考以下文章