帧内预测代码

原文(本文是自己的摘抄):H.265/HEVC 帧内编码详解:CU/TU层次结构、预测、变换、量化、编码、编码端整体流程 - 知乎 (zhihu.com)

每个 CU 可以划分为一个或多个 PU ,每个 PU 独立持有一个预测模式 (prediction mode)。 PU 的划分不是递归的,一个 CU 要么不划分,要么划分为4个PU,而这些PU不能再划分为多个PU。

对于 8x8 的 CU ,可选两种 PU 划分方式 (part_mode):

  • PART_2Nx2N:不划分,CU本身就是一个PU。
  • PART_NxN:划分为4个PU。

64x64, 32x32 和 16x16 的 CU 只能选择 PART_2Nx2N ,也即只能自身作为一个 PU。即只需要对 8x8 的 CU 编码 part_mode 语法元素。

对于 CU ,在码流中编码一个语法元素 part_mode 来指示它的 PU 划分方式:

  • part_mode=PART_2Nx2N 时,说明 CU 自身就是一个 PU ,此时码流中的 part_mode 后面应该紧跟着1个预测模式 (也即该 PU 的预测模式),然后编码 PU 的其它数据。
  • part_mode=PART_NxN 时,说明 CU 被划分为 4 个 PU ,此时码流中的 part_mode 位后面应该紧跟4个预测模式 (也即这4个PU 的预测模式) ,然后先后编码 4 个 PU 的其它数据。

每个 CU 可以按四叉树递归的方式划分为多个 TU 。TU 的尺寸可以是 32x32, 16x16, 8x8, 4x4 。

在帧内编码中,TU 不能大于 PU (不能跨越 PU 的边界),因此 TU 的划分只存在以下几种情况 :

  • 对于 64x64 的 CU ,它必须划分为 4 个 32x32 的 TU (因为 TU 的最大尺寸为 32x32) 。当然,这些 TU 也可以继续递归划分。划分出的所有小 TU 都共享同一个预测模式,也即这个 64x64 CU 所对应的 64x64 PU 的预测模式。
  • 对于 32x32, 16x16 的 CU 或 TU , 它可以不划分 (自身就是一个 TU),也可以继续划分为更小的 TU 。当然,这些 TU 也可以继续递归划分。划分出的所有小 TU 都共享同一个预测模式,也即它们所在的 32x32 CU 或 16x16 CU 所对应的 PU 的预测模式。
  • 对于一个 8x8 CU,若它没有划分为 4 个 4x4 的 PU (part_mode=PART_2Nx2N), 则它可以不划分 (自身就是一个 8x8 的 TU),也可以继续划分为 4 个 4x4 的 TU ,此时 4 个 TU 共享同一个预测模式,也即它们所在的 8x8 CU 所对应的 8x8 PU 的预测模式。图8中最下面的例子就对应了这种情况。
  • 对于一个 8x8 CU,若它被划分为 4 个 4x4 的 PU (part_mode=PART_NxN) ,则它也必须划分为 4 个 4x4 的 TU ,每个 TU 的预测模式就是他所在的 4x4 PU 的预测模式。

CU 中划分 TU 的最大深度是可以设定的,由 HEVC 码流头部的 SPS 中的 max_transform_hierarchy_depth_intra 语法元素决定。例如,当 max_transform_hierarchy_depth_intra=0 时,表示任何CU都不能划分为更小的TU。再例如,当 max_transform_hierarchy_depth_intra=1 时,表示任何CU最多只能划分成4个TU,而这些 TU 不能再划分为更小的 TU 。

需要在码流中编码一个 split_tu_flag 来决定这个 TU 是否要继续划分为 4 个 sub-TU 。split_tu_flag=1 代表划分;split_tu_flag=0 代表不划分。

在没有歧义的地方不需要编码split_tu_flag ,包括以下4种情况:

  • 对于 64x64 的 CU ,不需要编码 split_tu_flag ,因为它一定要划分为 4 个 32x32 TU。
  • 对于 4x4 的 TU ,不需要编码 split_tu_flag ,因为它一定不能再划分为更小的 TU。
  • 对于被划分为 4 个 4x4 PU 的 8x8 CU ,不需要编码 split_tu_flag ,因为它一定要划分为 4 个 4x4 TU 。
  • 当受限于 max_transform_hierarchy_depth_intra 的取值,也即当前 TU 在 CU 中的深度等于设定的最大深度时,不需要编码 split_tu_flag ,因为它一定不能再划分为更小的 TU。

HEVC 规定在某些情况时,需要先对边界像素进行平滑滤波,然后再进行预测。对于 U, V 分量块,在任何情况下都不用滤波。而对于 Y 分量块,需要查询表来确定是否需要进行滤波。

对于需要滤波的情况,有两种滤波方式:常规滤波和强滤波。码流头部的 SPS 中的 strong_intra_smoothing_enable_flag 语法元素规定了是否开启强滤波,只有在开启时并满足一定条件时,才使用强滤波。

常规滤波的方法是:把 (4×N+1) 个边界像素“放平”成一个 (4×N+1) 个元素的数组。对于相邻的3个元素,使用3抽头的 FIR 滤波器进行滤波,抽头参数为 [0.25, 0.5, 0.25] 。对于最左下边和最右上边的像素,因为它们两边缺少像素,无法进行滤波,所以不用滤波,直接复制。

在预测算法中,对于 Y 分量的小于等于 16x16 的 TU 的 DC 模式 (模式1)、水平向右角度模式 (模式10) 和垂直向下角度模式 (模式26) ,需要采用一个简单的边缘滤波器,让边界像素到预测出的 TU 之间的变化不那么突兀。

用 TU 的原始像素块减去预测块就能得到残差块 (residual block)。注意原始像素块和预测块中的像素都是 8-bit 无符号整数 (C 语言中的 unsigned char 或 uint8_t 类型),取值范围为 0~255 。经过减法后,残差块中每个像素的可能的取值范围为 -255~+255 ,推荐使用 32-bit 有符号整数 (C语言中的 int 或 int32_t 类型) 来表示。

HEVC 使用的变换有 DCT (离散余弦变换) 和 DST (离散正弦变换) 。本质上都是两次矩阵乘法。为了降低计算复杂度,HEVC 规定使用整数近似的 DCT 或 DST ,也即上述公式中的所有矩阵元素都使用32位有符号整数 (C语言中的 int 类型) 来表示和计算。另外,为了避免两次矩阵乘法导致32位有符号整数的溢出,HEVC 规定在每次矩阵乘法后,将结果加一个值然后除以一个值 (相当于除法之后再四舍五入) 。

在使用 HEVC 进行图像压缩时,用户需要指定量化参数 (Quantize Parameter, 简称QP) ,QP 是整数,范围为 0~51 ,越大则“量化力度”越大,也即压缩率越高,但图像失真也严重。QP的值会被存在 HEVC 码流头部的 slice_header 字段中,因为只有知道 QP 的取值,解码器才能正确地进行反量化。

QP的取值决定了量化器对系数块的除数,QP每大6,除数就变为原来的2倍。

反量化得到的是重建后的残差块,我们给重建残差块加上预测块,就能得到重建像素块。由于中间经历了有损的量化操作,所以重建像素块与原始像素块并不完全相同 (量化参数QP越大,则差异越大)。

在实际实现中,预测块的数据类型为 8-bit 无符号整数 (C 语言中的 unsigned char 或 uint8_t 类型) ,取值范围为 0~255;而重建后的残差块的数据类型为 32-bit 有符号整数 (C语言中的 int 或 int32_t 类型) 。二者相加得到的重建像素块中的极少数数据会超出 0~255 的范围,因此还需要对重建像素块进行 CLIP 操作:

  • 如果该值小于 0 ,就把它设为 0;
  • 如果该值大于 255 ,就把它设为 255;
  • 其他情况下,值不变。

这样,最终生成的重建像素块可以用 8-bit 无符号整数表示。用来作为后续块预测的边界像素。

为了寻找最优的编码方案,HEVC 规定了 RD-cost 指标 (Rate Distortion Cost) 用来评价各种方案的优劣。对任何一个 block (CTU, CU, PU, 或TU) ,我们都可以计算其 RD-cost。得到的 RD-cost 就是综合考虑失真和大小的指标,越大则效果越差。

// 编码器搜索一个 CTU 的最优方案的过程日志 -------------------------------------------------------------------------
ProcessCU开始: CU(y= 0 x= 0 size=32)  初始化设置最优RDcost=99999
      ProcessCU开始: CU(y= 0 x= 0 size=16)  初始化设置最优RDcost=99999
            ProcessCU开始: CU(y= 0 x= 0 size= 8)  初始化设置最优RDcost=99999
               把 CU(y= 0 x= 0 size= 8) 当作1个TU, 尝试35种预测模式, 其中最佳预测模式是 0 (RDcost=369), 小于之前最优RDcost (99999), 更新为当前最优方案
               把 CU(y= 0 x= 0 size= 8) 分成4个TU, 尝试35种预测模式, 其中最佳预测模式是 1 (RDcost=748), 不小于之前最优RDcost (369)
               把 CU(y= 0 x= 0 size= 8) 分成4个PU, 对每个PU分别尝试35种预测模式, 4个最佳的预测模式={ 0,19,31,18}, RDcost=801, 不小于之前最优RDcost (369)
            ProcessCU结束: CU(y= 0 x= 0 size= 8), 最终 RDcost=369
            ProcessCU开始: CU(y= 0 x= 8 size= 8)  初始化设置最优RDcost=99999
               把 CU(y= 0 x= 8 size= 8) 当作1个TU, 尝试35种预测模式, 其中最佳预测模式是 4 (RDcost=238), 小于之前最优RDcost (99999), 更新为当前最优方案
               把 CU(y= 0 x= 8 size= 8) 分成4个TU, 尝试35种预测模式, 其中最佳预测模式是 2 (RDcost=270), 不小于之前最优RDcost (238)
               把 CU(y= 0 x= 8 size= 8) 分成4个PU, 对每个PU分别尝试35种预测模式, 4个最佳的预测模式={ 3, 2,34, 3}, RDcost=309, 不小于之前最优RDcost (238)
            ProcessCU结束: CU(y= 0 x= 8 size= 8), 最终 RDcost=238
            ProcessCU开始: CU(y= 8 x= 0 size= 8)  初始化设置最优RDcost=99999
               把 CU(y= 8 x= 0 size= 8) 当作1个TU, 尝试35种预测模式, 其中最佳预测模式是26 (RDcost=217), 小于之前最优RDcost (99999), 更新为当前最优方案
               把 CU(y= 8 x= 0 size= 8) 分成4个TU, 尝试35种预测模式, 其中最佳预测模式是26 (RDcost=232), 不小于之前最优RDcost (217)
               把 CU(y= 8 x= 0 size= 8) 分成4个PU, 对每个PU分别尝试35种预测模式, 4个最佳的预测模式={25,17,22,20}, RDcost=291, 不小于之前最优RDcost (217)
            ProcessCU结束: CU(y= 8 x= 0 size= 8), 最终 RDcost=217
            ProcessCU开始: CU(y= 8 x= 8 size= 8)  初始化设置最优RDcost=99999
               把 CU(y= 8 x= 8 size= 8) 当作1个TU, 尝试35种预测模式, 其中最佳预测模式是 0 (RDcost=225), 小于之前最优RDcost (99999), 更新为当前最优方案
               把 CU(y= 8 x= 8 size= 8) 分成4个TU, 尝试35种预测模式, 其中最佳预测模式是10 (RDcost=269), 不小于之前最优RDcost (225)
               把 CU(y= 8 x= 8 size= 8) 分成4个PU, 对每个PU分别尝试35种预测模式, 4个最佳的预测模式={26,24,17, 7}, RDcost=282, 不小于之前最优RDcost (225)
            ProcessCU结束: CU(y= 8 x= 8 size= 8), 最终 RDcost=225
         已尝试把 CU(y= 0 x= 0 size=16) 拆分成4个CU, 总 RDcost=369+238+217+225=1049  暂时以该方案作为当前最优方案
         把 CU(y= 0 x= 0 size=16) 当作1个TU, 尝试35种预测模式, 其中最佳预测模式是 0 (RDcost=818), 小于之前最优RDcost (1049), 更新为当前最优方案
         把 CU(y= 0 x= 0 size=16) 分成4个TU, 尝试35种预测模式, 其中最佳预测模式是 2 (RDcost=951), 不小于之前最优RDcost (818)
      ProcessCU结束: CU(y= 0 x= 0 size=16), 最终 RDcost=818
      ProcessCU开始: CU(y= 0 x=16 size=16)  初始化设置最优RDcost=99999
            ProcessCU开始: CU(y= 0 x=16 size= 8)  初始化设置最优RDcost=99999
               把 CU(y= 0 x=16 size= 8) 当作1个TU, 尝试35种预测模式, 其中最佳预测模式是 1 (RDcost=214), 小于之前最优RDcost (99999), 更新为当前最优方案
               把 CU(y= 0 x=16 size= 8) 分成4个TU, 尝试35种预测模式, 其中最佳预测模式是 0 (RDcost=237), 不小于之前最优RDcost (214)
               把 CU(y= 0 x=16 size= 8) 分成4个PU, 对每个PU分别尝试35种预测模式, 4个最佳的预测模式={ 2, 3,14,17}, RDcost=370, 不小于之前最优RDcost (214)
            ProcessCU结束: CU(y= 0 x=16 size= 8), 最终 RDcost=214
            ProcessCU开始: CU(y= 0 x=24 size= 8)  初始化设置最优RDcost=99999
               把 CU(y= 0 x=24 size= 8) 当作1个TU, 尝试35种预测模式, 其中最佳预测模式是26 (RDcost=416), 小于之前最优RDcost (99999), 更新为当前最优方案
               把 CU(y= 0 x=24 size= 8) 分成4个TU, 尝试35种预测模式, 其中最佳预测模式是 0 (RDcost=503), 不小于之前最优RDcost (416)
               把 CU(y= 0 x=24 size= 8) 分成4个PU, 对每个PU分别尝试35种预测模式, 4个最佳的预测模式={ 1,16,19,21}, RDcost=525, 不小于之前最优RDcost (416)
            ProcessCU结束: CU(y= 0 x=24 size= 8), 最终 RDcost=416
            ProcessCU开始: CU(y= 8 x=16 size= 8)  初始化设置最优RDcost=99999
               把 CU(y= 8 x=16 size= 8) 当作1个TU, 尝试35种预测模式, 其中最佳预测模式是 0 (RDcost=216), 小于之前最优RDcost (99999), 更新为当前最优方案
               把 CU(y= 8 x=16 size= 8) 分成4个TU, 尝试35种预测模式, 其中最佳预测模式是 0 (RDcost=247), 不小于之前最优RDcost (216)
               把 CU(y= 8 x=16 size= 8) 分成4个PU, 对每个PU分别尝试35种预测模式, 4个最佳的预测模式={ 0,26, 7,19}, RDcost=223, 不小于之前最优RDcost (216)
            ProcessCU结束: CU(y= 8 x=16 size= 8), 最终 RDcost=216
            ProcessCU开始: CU(y= 8 x=24 size= 8)  初始化设置最优RDcost=99999
               把 CU(y= 8 x=24 size= 8) 当作1个TU, 尝试35种预测模式, 其中最佳预测模式是 8 (RDcost=1986), 小于之前最优RDcost (99999), 更新为当前最优方案
               把 CU(y= 8 x=24 size= 8) 分成4个TU, 尝试35种预测模式, 其中最佳预测模式是 3 (RDcost=1404), 小于之前最优RDcost (1986), 更新为当前最优方案
               把 CU(y= 8 x=24 size= 8) 分成4个PU, 对每个PU分别尝试35种预测模式, 4个最佳的预测模式={ 0,16,23, 3}, RDcost=1345, 小于当前最优RDcost (1404), 更新为当前最优方案
            ProcessCU结束: CU(y= 8 x=24 size= 8), 最终 RDcost=1345
         已尝试把 CU(y= 0 x=16 size=16) 拆分成4个CU, 总 RDcost=214+416+216+1345=2192  暂时以该方案作为当前最优方案
         把 CU(y= 0 x=16 size=16) 当作1个TU, 尝试35种预测模式, 其中最佳预测模式是 3 (RDcost=5377), 不小于之前最优RDcost (2192)
         把 CU(y= 0 x=16 size=16) 分成4个TU, 尝试35种预测模式, 其中最佳预测模式是15 (RDcost=2717), 不小于之前最优RDcost (2192)
      ProcessCU结束: CU(y= 0 x=16 size=16), 最终 RDcost=2192
      ProcessCU开始: CU(y=16 x= 0 size=16)  初始化设置最优RDcost=99999
            ProcessCU开始: CU(y=16 x= 0 size= 8)  初始化设置最优RDcost=99999
               把 CU(y=16 x= 0 size= 8) 当作1个TU, 尝试35种预测模式, 其中最佳预测模式是 1 (RDcost=219), 小于之前最优RDcost (99999), 更新为当前最优方案
               把 CU(y=16 x= 0 size= 8) 分成4个TU, 尝试35种预测模式, 其中最佳预测模式是17 (RDcost=289), 不小于之前最优RDcost (219)
               把 CU(y=16 x= 0 size= 8) 分成4个PU, 对每个PU分别尝试35种预测模式, 4个最佳的预测模式={ 1,16,22,12}, RDcost=344, 不小于之前最优RDcost (219)
            ProcessCU结束: CU(y=16 x= 0 size= 8), 最终 RDcost=219
            ProcessCU开始: CU(y=16 x= 8 size= 8)  初始化设置最优RDcost=99999
               把 CU(y=16 x= 8 size= 8) 当作1个TU, 尝试35种预测模式, 其中最佳预测模式是24 (RDcost=1300), 小于之前最优RDcost (99999), 更新为当前最优方案
               把 CU(y=16 x= 8 size= 8) 分成4个TU, 尝试35种预测模式, 其中最佳预测模式是 0 (RDcost=654), 小于之前最优RDcost (1300), 更新为当前最优方案
               把 CU(y=16 x= 8 size= 8) 分成4个PU, 对每个PU分别尝试35种预测模式, 4个最佳的预测模式={17,31,19,22}, RDcost=649, 小于当前最优RDcost (654), 更新为当前最优方案
            ProcessCU结束: CU(y=16 x= 8 size= 8), 最终 RDcost=649
            ProcessCU开始: CU(y=24 x= 0 size= 8)  初始化设置最优RDcost=99999
               把 CU(y=24 x= 0 size= 8) 当作1个TU, 尝试35种预测模式, 其中最佳预测模式是26 (RDcost=181), 小于之前最优RDcost (99999), 更新为当前最优方案
               把 CU(y=24 x= 0 size= 8) 分成4个TU, 尝试35种预测模式, 其中最佳预测模式是 0 (RDcost=221), 不小于之前最优RDcost (181)
               把 CU(y=24 x= 0 size= 8) 分成4个PU, 对每个PU分别尝试35种预测模式, 4个最佳的预测模式={31,26,19,29}, RDcost=306, 不小于之前最优RDcost (181)
            ProcessCU结束: CU(y=24 x= 0 size= 8), 最终 RDcost=181
            ProcessCU开始: CU(y=24 x= 8 size= 8)  初始化设置最优RDcost=99999
               把 CU(y=24 x= 8 size= 8) 当作1个TU, 尝试35种预测模式, 其中最佳预测模式是28 (RDcost=1302), 小于之前最优RDcost (99999), 更新为当前最优方案
               把 CU(y=24 x= 8 size= 8) 分成4个TU, 尝试35种预测模式, 其中最佳预测模式是27 (RDcost=907), 小于之前最优RDcost (1302), 更新为当前最优方案
               把 CU(y=24 x= 8 size= 8) 分成4个PU, 对每个PU分别尝试35种预测模式, 4个最佳的预测模式={29,28,23,27}, RDcost=937, 不小于之前最优RDcost (907)
            ProcessCU结束: CU(y=24 x= 8 size= 8), 最终 RDcost=907
         已尝试把 CU(y=16 x= 0 size=16) 拆分成4个CU, 总 RDcost=219+649+181+907=1958  暂时以该方案作为当前最优方案
         把 CU(y=16 x= 0 size=16) 当作1个TU, 尝试35种预测模式, 其中最佳预测模式是14 (RDcost=4343), 不小于之前最优RDcost (1958)
         把 CU(y=16 x= 0 size=16) 分成4个TU, 尝试35种预测模式, 其中最佳预测模式是28 (RDcost=3091), 不小于之前最优RDcost (1958)
      ProcessCU结束: CU(y=16 x= 0 size=16), 最终 RDcost=1958
      ProcessCU开始: CU(y=16 x=16 size=16)  初始化设置最优RDcost=99999
            ProcessCU开始: CU(y=16 x=16 size= 8)  初始化设置最优RDcost=99999
               把 CU(y=16 x=16 size= 8) 当作1个TU, 尝试35种预测模式, 其中最佳预测模式是 3 (RDcost=1641), 小于之前最优RDcost (99999), 更新为当前最优方案
               把 CU(y=16 x=16 size= 8) 分成4个TU, 尝试35种预测模式, 其中最佳预测模式是 4 (RDcost=1332), 小于之前最优RDcost (1641), 更新为当前最优方案
               把 CU(y=16 x=16 size= 8) 分成4个PU, 对每个PU分别尝试35种预测模式, 4个最佳的预测模式={ 4, 5, 3, 0}, RDcost=1254, 小于当前最优RDcost (1332), 更新为当前最优方案
            ProcessCU结束: CU(y=16 x=16 size= 8), 最终 RDcost=1254
            ProcessCU开始: CU(y=16 x=24 size= 8)  初始化设置最优RDcost=99999
               把 CU(y=16 x=24 size= 8) 当作1个TU, 尝试35种预测模式, 其中最佳预测模式是33 (RDcost=1670), 小于之前最优RDcost (99999), 更新为当前最优方案
               把 CU(y=16 x=24 size= 8) 分成4个TU, 尝试35种预测模式, 其中最佳预测模式是 0 (RDcost=875), 小于之前最优RDcost (1670), 更新为当前最优方案
               把 CU(y=16 x=24 size= 8) 分成4个PU, 对每个PU分别尝试35种预测模式, 4个最佳的预测模式={34,31, 6, 0}, RDcost=919, 不小于之前最优RDcost (875)
            ProcessCU结束: CU(y=16 x=24 size= 8), 最终 RDcost=875
            ProcessCU开始: CU(y=24 x=16 size= 8)  初始化设置最优RDcost=99999
               把 CU(y=24 x=16 size= 8) 当作1个TU, 尝试35种预测模式, 其中最佳预测模式是 0 (RDcost=322), 小于之前最优RDcost (99999), 更新为当前最优方案
               把 CU(y=24 x=16 size= 8) 分成4个TU, 尝试35种预测模式, 其中最佳预测模式是27 (RDcost=395), 不小于之前最优RDcost (322)
               把 CU(y=24 x=16 size= 8) 分成4个PU, 对每个PU分别尝试35种预测模式, 4个最佳的预测模式={34,29, 1,28}, RDcost=421, 不小于之前最优RDcost (322)
            ProcessCU结束: CU(y=24 x=16 size= 8), 最终 RDcost=322
            ProcessCU开始: CU(y=24 x=24 size= 8)  初始化设置最优RDcost=99999
               把 CU(y=24 x=24 size= 8) 当作1个TU, 尝试35种预测模式, 其中最佳预测模式是26 (RDcost=359), 小于之前最优RDcost (99999), 更新为当前最优方案
               把 CU(y=24 x=24 size= 8) 分成4个TU, 尝试35种预测模式, 其中最佳预测模式是26 (RDcost=335), 小于之前最优RDcost (359), 更新为当前最优方案
               把 CU(y=24 x=24 size= 8) 分成4个PU, 对每个PU分别尝试35种预测模式, 4个最佳的预测模式={24,27,24,26}, RDcost=415, 不小于之前最优RDcost (335)
            ProcessCU结束: CU(y=24 x=24 size= 8), 最终 RDcost=335
         已尝试把 CU(y=16 x=16 size=16) 拆分成4个CU, 总 RDcost=1254+875+322+335=2787  暂时以该方案作为当前最优方案
         把 CU(y=16 x=16 size=16) 当作1个TU, 尝试35种预测模式, 其中最佳预测模式是 5 (RDcost=5745), 不小于之前最优RDcost (2787)
         把 CU(y=16 x=16 size=16) 分成4个TU, 尝试35种预测模式, 其中最佳预测模式是 0 (RDcost=4150), 不小于之前最优RDcost (2787)
      ProcessCU结束: CU(y=16 x=16 size=16), 最终 RDcost=2787
   已尝试把 CU(y= 0 x= 0 size=32) 拆分成4个CU, 总 RDcost=818+2192+1958+2787=7754  暂时以该方案作为当前最优方案
   把 CU(y= 0 x= 0 size=32) 当作1个TU, 尝试35种预测模式, 其中最佳预测模式是 0 (RDcost=20321), 不小于之前最优RDcost (7754)
   把 CU(y= 0 x= 0 size=32) 分成4个TU, 尝试35种预测模式, 其中最佳预测模式是 3 (RDcost=15969), 不小于之前最优RDcost (7754)
ProcessCU结束: CU(y= 0 x= 0 size=32), 最终 RDcost=7754
posted @ 2023-10-17 18:13  师映川  阅读(142)  评论(0)    收藏  举报