CU-tree
x265中CU-tree的主要思想同x264的MB-tree一样,无较大改动。其目的是通过预估当前块在帧间预测中被未来帧所参考的信息多少,来调整当前块的QP值。如果当前块贡献给后续帧的信息越多,则其重要性越高,应当提高该区域的编码质量,减少QP,反之,则增大该区域的QP。(有点感知压缩的意思)
计算流程如下:(加入后缀cur及ref以区分当前块及其参考块)
- 获取当前块的 i n t r a _ c o s t _ c u r intra\_cost\_cur intra_cost_cur , i n t e r _ c o s t _ c u r inter\_cost\_cur inter_cost_cur,以及 p r o p a g a t e _ c o s t _ c u r propagate\_cost\_cur propagate_cost_cur(叠加 参考了当前块的未来帧 而得到)来计算当前块给其参考块带来的遗传代价即 p r o p a g a t e _ c o s t _ r e f propagate\_cost\_ref propagate_cost_ref
- 计算继承率 p r o p a g a t e _ f r a c t i o n _ c u r = 1 − i n t e r _ c o s t _ c u r i n t r a _ c o s t _ c u r propagate\_fraction\_cur=1- \frac{inter\_cost\_cur}{intra\_cost\_cur} propagate_fraction_cur=1−intra_cost_curinter_cost_cur。假设当前块 i n t e r _ c o s t _ c u r inter\_cost\_cur inter_cost_cur只有 i n t r a _ c o s t _ c u r intra\_cost\_cur intra_cost_cur的80%,说明帧间预测节省了20% 的编码消耗,则当前块的信息有20%来自于其参考帧, p r o p a g a t e _ f r a c t i o n _ c u r = 0.2 propagate\_fraction\_cur=0.2 propagate_fraction_cur=0.2。
- 当前块传递其给参考块的总传递代价量 p r o p a g a t e _ a m o u n t _ r e f = ( i n t r a _ c o s t _ c u r ∗ i n v Q S c a l e s + p r o p a g a t e _ c o s t _ c u r ) ∗ p r o p a g a t e _ f r a c t i o n _ c u r propagate\_amount\_ref=(intra\_cost\_cur*invQScales+propagate\_cost\_cur)*propagate\_fraction\_cur propagate_amount_ref=(intra_cost_cur∗invQScales+propagate_cost_cur)∗propagate_fraction_cur
- 当前单元在邻近帧中的匹配块可能覆盖4个块,按照当前块实际参考像素面积估算代价传递权重 w e i g h t 1 , w e i g h t 2 , w e i g h t 3 , w e i g h t 4 weight1,weight2,weight3,weight4 weight1,weight2,weight3,weight4。将上面计算的 p r o p a g a t e _ a m o u n t _ r e f propagate\_amount\_ref propagate_amount_ref按照权重比例分配给这四个参考块。如: p r o p a g a t e _ c o s t _ r e f 1 = p r o p a g a t e _ a m o u n t _ r e f ∗ w e i g h t 1 propagate\_cost\_ref1=propagate\_amount\_ref*weight1 propagate_cost_ref1=propagate_amount_ref∗weight1 。
若当前帧为b帧,在第一步我们获得了当前块的 p r o p a g a t e _ c o s t _ c u r propagate\_cost\_cur propagate_cost_cur,便可根据此公式 c u T r e e Q P O f f s e t = − c u T r e e S t r e n g t h ∗ l o g 2 ( 1 + p r o p a g a t e _ c o s t _ c u r i n t r a _ c o s t _ c u r ) cuTreeQPOffset=-cuTreeStrength*log2( 1+\frac{propagate\_cost\_cur}{intra\_cost\_cur}) cuTreeQPOffset=−cuTreeStrength∗log2(1+intra_cost_curpropagate_cost_cur)计算CU-tree算法为当前块计算的 Q P O f f s e t QPOffset QPOffset。其中 c u T r e e S t r e n g t h cuTreeStrength cuTreeStrength为cuTree的强度,最大为2.
需要注意的点:
- 在cuTree算法执行之前,会对当前图像进行1/2下采样,即将256x256的图像下采样至128x128再进行 i n t r a _ c o s t , i n t e r _ c o s t intra\_cost,inter\_cost intra_cost,inter_cost等的计算。
- x265中仍以16x16的块为单位( 也就是下采样后8x8的块)计算 c u T r e e Q P O f f s e t cuTreeQPOffset cuTreeQPOffset,32x32的块 c u T r e e Q P O f f s e t cuTreeQPOffset cuTreeQPOffset是其4个16x16块offset的平均。