[AV1] Recursive Intra Prediction

2021-02-24 11:07:10 浏览数 (2)

返回AV1专栏目录

Recursive Intra Prediction是AV1新引入的预测技术。

下面的图展示了这种预测模式的一个块的划分的情况。

如上图我们可以看到,一个8x4的块,会划分为了4个部分,每个部分分别为4x2的大小,预测的方式是这样的,先利用左上的带有序号的reference pixels去预测蓝色块,当蓝色块的predictor生成后,然后预测绿色块,而绿色块使用的左边的reference是蓝色块的生成预测值,所以有这么曾层级依赖关系的存在,recursive prediction 因此而得名。

在实际的使用中,该模式受到的一定的限制,首先仅针对luma 块使用,且 YMode必须为DC_PRED,还需块的syntax:use_filter_intra 值为1时才开启recursive 模式。开启了recursive 模式后,针对周边的第0到第6号像素,需要赋予不同的权重值来体现预测的多方向性。所以recursive 模式根据周边像素的权重值的不同又细分了以下五种模式:

filter_intra_mode

Name of filter_intra_mode

0

FILTER_DC_PRED

1

FILTER_V_PRED

2

FILTER_H_PRED

3

FILTER_D157_PRED

4

FILTER_PAETH_PRED

权重值在标准中以名为Intra_Filter_Taps的 5x8x7的三维数组存储(其中第一维的5为INTRA_FILTER_MODES),参见标准419页。

代码语言:javascript复制
Intra_Filter_Taps[ INTRA_FILTER_MODES ][ 8 ][ 7 ] = { { { -6, 10, 0, 0, 0, 12, 0 },
{ -5, 2, 10, 0, 0, 9, 0 },
{ -3, 1, 1, 10, 0, 7, 0 },
{ -3, 1, 1, 2, 10, 5, 0 },
{ -4, 6, 0, 0, 0, 2, 12 },
{ -3, 2, 6, 0, 0, 2, 9 },
{ -3, 2, 2, 6, 0, 2, 7 },
{ -3, 1, 2, 2, 6, 3, 5 },
},
{ { -10, 16, 0, 0, 0, 10, 0 },
{ -6, 0, 16, 0, 0, 6, 0 },
{ -4, 0, 0, 16, 0, 4, 0 },
{ -2, 0, 0, 0, 16, 2, 0 },
{ -10, 16, 0, 0, 0, 0, 10 },
{ -6, 0, 16, 0, 0, 0, 6 },
{ -4, 0, 0, 16, 0, 0, 4 },
{ -2, 0, 0, 0, 16, 0, 2 },
},
{ { -8, 8, 0, 0, 0, 16, 0 },
{ -8, 0, 8, 0, 0, 16, 0 },
{ -8, 0, 0, 8, 0, 16, 0 },
{ -8, 0, 0, 0, 8, 16, 0 },
{ -4, 4, 0, 0, 0, 0, 16 },
{ -4, 0, 4, 0, 0, 0, 16 },
{ -4, 0, 0, 4, 0, 0, 16 },
{ -4, 0, 0, 0, 4, 0, 16 },
},
{ { -2, 8, 0, 0, 0, 10, 0 },
{ -1, 3, 8, 0, 0, 6, 0 },
{ -1, 2, 3, 8, 0, 4, 0 },
{ 0, 1, 2, 3, 8, 2, 0 },
{ -1, 4, 0, 0, 0, 3, 10 },
{ -1, 3, 4, 0, 0, 4, 6 },
{ -1, 2, 3, 4, 0, 4, 4 },
{ -1, 2, 2, 3, 4, 3, 3 },
},
{ { -12, 14, 0, 0, 0, 14, 0 },
{ -10, 0, 14, 0, 0, 12, 0 },
{ -9, 0, 0, 14, 0, 11, 0 },
{ -8, 0, 0, 0, 14, 10, 0 },
{ -10, 12, 0, 0, 0, 0, 14 },
{ -9, 1, 12, 0, 0, 0, 12 },
{ -8, 0, 0, 12, 0, 1, 11 },
{ -7, 0, 0, 1, 12, 1, 9 },
}
}

具体软件的实现上可能根据优化情况会略有不同,比如Libaom AV1中,其定义为5x8x8维,其中最后第三维的最后一列全为0。

0 人点赞