解码端最上层函数在之前的学习中已经讲过,下面我们从帧一级继续向下探索,也算是对整个框架穿个线。这里主要以JVET-O1001为参考,掺入我自己的一部分理解,将整个视频编码的大体框架理清。
1 划分
slice最上层,遍历brick(代码中尚未体现)和各个CTU。随后进行CTU级别的操作。最后进行最后一行或一列的标记及比特对齐。
1、进行CTU的划分:对大于64x64的块,只能进行四叉树划分。
2、在划分过程中,递归调用自身完成对划分方式的读取。
3、对帧内块,可以选择是否进行色度独立划分。
4、先进行几次四叉树划分后,进行二叉树和三叉树的划分。一旦进行二叉树和三叉树的划分时,将不再进行四叉树划分。
5、对帧内块:1)4x16、16x4、8x8的块且进行QT或BT或TT划分; 2)4x8、8x4且进行BT划分;3)4x32、32x4、16x8、8x16的块进行TT划分
6、对帧间块:1) 4x16、16x4、8x8的块进行BT划分;2)4x32、32x4、16x8、8x16的块且TT划分
7、cqtDepth:四叉树的分割深度;mttDepth:多类型多叉树的深度
随后进行预测解码的准备操作:分别看是不是skip模式、是何种预测模式(帧内、帧间、IBC)、是不是调色板模式。
2 帧内
1、对亮度预测,有两种最主要的模式:MIP模式和传统帧内模式。
下图为MIP模式及之前的解码解析,可见前面还有bdpcm的解析:
对于传统亮度模式,需要处理很多内容,如参考行、ISP、MPM,之后才会得到对应的预测模式。
2、对色度预测,分为开CCLM和不开CCLM两种。先判断调色板模式,随后处理CCLM,DM和传统四种模式位于其后。
3 帧间
帧间的解析顺序为:merge、affine、、amvr、smvd、bcw。最终落脚于mvd的解码
1、对于merge模式:最先判断subblock,如果不是subblock则为一般的merge,分别判断mmvd、ciip和tmp即可确定最终使用的是哪种帧间merge模式。
2、对于非merge模式,则一定是编码mvd,判断各方向的mvd绝对值是否大于1,是否大于2,如果超过2再编码超过2的部分。最后解码该绝对值的正负号。
4 变换
1、外层函数:对帧间有sbt变换块划分,随后进行变化块划分解析,此外还有lfnst的操作。
2、递归调用对大块进行变换块的划分,受到帧内ISP和帧间sbt两种技术的影响。
3、对变换系数有一系列操作:首先判断三个通道是否都有cbf。在确定了TU块位置时,对于亮度分量,先解析是否进行了transformSkip,若否则解析多核变换mts,随后进行残差编码。对于色度分量,判断是否joint_CbCr进行残差编码,否则进行正常的残差编码。
后续进行残差编码。
5 残差操作
1、变换系数扫描:基于4x4的子块,从右下角到左上角,得到多个“16个连续系数”的系数组(后称CG)。
2、进行非零位置信息编码:确定当前CG有无非零系数,若有则找到非零系数位置,否则进入下一个CG。
3、对非零系数进行编码:同mvd的编解码方式,看是否大于1及2,对超过2的部分进行解码,还有符号位。
4、根据以上内容即可解析出CG的残差。