一、CCLM技术原理
CCLM,即交叉分量线性模型(CCLM)预测模式,该技术的核心思想是为了减少交叉分量冗余,进行跨分量预测,主要是利用同一编码块的重建亮度像素构造色度像素的预测值。
其中表示当前CU的色度预测像素,表示当前CU的下采样重建亮度像素,和称为线性模型参数,由相邻的4个色度像素和对应的下采样的亮度像素生成导出。假设当前色度块尺寸为W×H,则W’和H’设为
- W’ = W, H’ = H 当前模式是LM模式时;
- W’ =W + H 当前模式是LM-A模式时;
- H’ = H + W 当前模式是LM-L模式时;
上方相邻像素的位置表示为S[0,−1]…S[W'−1,−1],左侧相邻像素的位置表示为S[−1,0]…S[−1,H'−1]。则需要的四个像素的选取方式如下:
- 当应用LM模式且上方和左侧相邻像素均可用时,S[W’ / 4, −1 ], S[ 3 * W’ / 4, −1 ], S[ −1, H’ / 4 ], S[ −1, 3 * H’ / 4 ];
- 当应用LM-A模式或只有上方相邻像素可用时,S[ W’ / 8, −1 ], S[ 3 * W’ / 8, −1 ], S[ 5 * W’ / 8, −1 ], S[ 7 * W’ / 8, −1 ] ;
- 当应用LM-L模式或只有左侧相邻像素可用时,S[ −1, H’ / 8 ], S[ −1, 3 * H’ / 8 ], S[ −1, 5 * H’ / 8 ], S[ −1, 7 * H’ / 8 ] ;
对所选位置的四个相邻的下采样亮度像素,并经过四次比较找出两个较小的值:和,以及两个较大的值和。它们对应的色度采样值表示为、、和,然后由下式可以计算相关参数:
下图展示了所需左侧相邻像素和上方相邻像素的位置示例,以及CCLM模式中涉及的当前块的示例。
从上面公式可以看出α计算过程中出现了除法,为了避免除法运算采用查表法计算α。同时为了减少存储表的空间,将diff值(最大值和最小值的差值)和α使用指数形式表示。例如,diff用4位有效部分和指数近似表示。因此,对于16个有效位值,1/diff表被缩减为16个元素,如下所示:
DivTable [ ] = { 0, 7, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 1, 1, 0 }
这样做的好处是既降低了计算的复杂性,又减少了存储所需表所需的内存大小。
除了亮度所有的上方参考像素和左侧参考像素联合计算线性模型的参数外,模型参数还有另外两种计算方式,即CCLM还有两位两种模式,称之为LM-A和LM-L模式。
- 在LM-A模式中,只使用上方的参考像素计算线性模型参数,为了获得更多的参考像素需要将上方的参考像素扩展为(W+H)。
- 在LM-L模式中,只使用左方的参考像素计算线性模型参数,为了获得更多的参考像素需要将左方的参考像素扩展为(H+W)。
对于非正方形块,上方的参考像素扩展为(W+W),左方的参考像素扩展为(H+H)。
为了匹配4:2:0视频序列的色度采样位置,提供了2种下采样滤波器使亮度分量在水平和垂直方向进行2:1的下采样。下采样滤波器的选择由SPS标志指定。两个下采样过滤器如下,分别对应于“type-0”和“type-2”:
注意,当上方的参考像素位于CTU边界时,只使用一行亮度像素进行下采样。
此参数计算作为解码过程的一部分执行,而不仅仅是作为编码器搜索操作。因此,不使用语法将α和β值传送到解码器。
二、CCLM技术编码
对于色度帧内模式编码,共允许8种帧内模式用于色度帧内模式编码。这些模式包括五种传统的帧内模式和三种跨分量线性模型模式(CCLM、LM_A和LM_L)。色度模式信号编码和推导过程如下表所示。色度模式编码直接依赖于相应亮度块的帧内预测模式。由于在I片中为亮度和色度分量启用了单独的块划分结构,因此一个色度块可以对应于多个亮度块。因此,对于色度DM模式,直接使用当前色度块中心像素对应的亮度块的帧内预测模式。
Chroma prediction mode |
Corresponding luma intra prediction mode |
||||
0 |
50 |
18 |
1 |
X ( 0 <= X <= 66 ) |
|
0 |
66 |
0 |
0 |
0 |
0 |
1 |
50 |
66 |
50 |
50 |
50 |
2 |
18 |
18 |
66 |
18 |
18 |
3 |
1 |
1 |
1 |
66 |
1 |
4 |
0 |
50 |
18 |
1 |
X |
5 |
81 |
81 |
81 |
81 |
81 |
6 |
82 |
82 |
82 |
82 |
82 |
7 |
83 |
83 |
83 |
83 |
83 |
无论sps_cclm_enabled_flag的值如何,都使用一个二进制化表,如下表所示。
Value of intra_chroma_pred_mode |
Bin string |
4 |
00 |
0 |
0100 |
1 |
0101 |
2 |
0110 |
3 |
0111 |
5 |
10 |
6 |
110 |
7 |
111 |
在上表中,第一个bin表示它是常规模式(0)还是LM模式(1)。如果是LM模式,则下一个bin指示它是否为LM_CHROMA(0)。如果不是LM_CHROMA,下一个 bin表示它是LM-L(0)还是LM-A(1)。对于这种情况,当sps_cclm_enabled_flag为0时,可以在熵编码之前丢弃对应的帧内色度预测模式的二值化表的第一个bin。或者,换句话说,第一个bin被推断为0,因此不进行编码。此单一的二值化表用于等于0和1的sps_cclm_enabled_flag。上表中的前两个bins用它自己的上下文模型进行上下文编码,其余的bins用旁路编码。
另外,为了减少双树中的luma-chroma延迟,当64x64亮度编码树节点不使用Not Split(并且64x64 CU不使用ISP)或QT进行分区时,允许32x32/32x16色度编码树节点中的色度CUs按以下方式使用CCLM:
–如果32x32 chroma节点没有分割或分区QT分割,那么32x32节点中的所有chroma CUs都可以使用CCLM
–如果32x32 chroma节点使用水平BT分区,并且32x16子节点不拆分或使用垂直BT拆分,则32x16 chroma节点中的所有chroma CUs都可以使用CCLM。
在所有其他luma和chroma编码树分割条件下,对于chroma-CU,不允许使用CCLM。