十五帧内编码: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生成预测像素块的主要内容,如果未能解决你的问题,请参考以下文章

十五帧内编码:2预测当前块的预测模式

十五帧内编码:1帧内编码的基本原理

H264解析Demo11帧内预测编码_2_获得参考的像素值

音视频开发之旅(58) -H.264 帧内预测

音视频开发之旅(58) -H.264 帧内预测

H264帧内预测模式编号的编码过程