在x265的Stable分支v2.4版本中出现了一个新的参数”–limit-tu”:
“Slow and veryslow presets receive a 20% speed boost at iso-quality by enabling the –limit-tu option.” x265 reliasenotes
按照官方文档说法是可以再目视效果接近的前提下,在Slow/Veryslow预设状态下提升20%编码速度。
–limit-tu <0..4>
总述为:在帧间编码时,允许TU深度递归的提前退出。
参考具体预设可知,–limit-tu参数默认值为0,而Slower/Veryslower两个预设均设定为–limit-tu 4。
0为不开启,也就是说不会提前退出,level 4的参数涵义直译:根据邻域/同位置 CU的变换树深度来限制第一个子TU的深度。第一个TU子深度作为其他TU的子深度的限制。
首先是简单的测试:
选取了不同的片源,截取0-5000帧。仅做编码,不做预处理,得到以下编码耗时数据:
Amaama_to_Inazuma | Netoge_no_Yome | Ajin_The_Movie | Relife | |
limit-tu 0 | 942.18s | 1657.23s | 1629.40s | 816.28s |
limit-tu 4 | 782.91s | 1259.43s | 1365.83s | 688.93s |
rate | 83.10% | 76.45% | 83.82% | 84.40% |
结论基本与文档的叙述相符。
同时选取其中的一部分场景作比较:
limit-tu 0________________________________________limit-tu 4____________________________________
limit-tu 0________________________________________limit-tu 4____________________________________
可以发现主要是一些线条以及暗场纹理的区别。而且就1080P无缩放的情况下看,目视效果非常接近。
那么这个–limit-tu实际上是怎么做的呢?
首先是几个概念:TU 变换单元,Residual Quadtree 残量四叉树,Maximum Depth of Transform Tree变换树最大深度。
Residual Quadtree 残量四叉树:
通过基于PU的分割类型预处理获得残量Residual后,根据四叉树结构将其划分为多个TU。对于每一个TU,应用一个整数转换。由于残块被四叉树结构划分,同时对四叉树每一个叶的节点应用变换,这就称作变换树或者残量四叉树(RQT)。( “After obtaining the residual block by prediction process…”– Block Partitioning Structure in the HEVC Standard . IEEE Transactions on Circuits and Systems for Video Technology. 2012-12.)
TU 变换单元:
“TU表示用于执行变换和产生对应一组变换系数的目的的一组像素差值的大小。因而,变换块或TU可指被应用变换的一组残余数据,或一组变换系数值。”(CN 104081777 Page6 [0041])
TU的大小可以等于CU,当然也可以小于CU,也就是分成了多个TU。“较大TU一般来说提供在经重建图像中具有较容易察觉的“成块效应”的较多压缩,而较小TU一般来说提供具有较不容易察觉的“成块效应”的较少压缩。”(CN 104081777 Page6 [0041])简单说来就是较大的TU数值可以有更好的压缩效率,但是会导致Block,而较小的TU数值会有更少的block,但是压缩效率就降低了。
Maximum Depth of Transform Tree变换树最大深度:
“变换树的深度与编码复杂度密切相关,为了提供这项功能的灵活性,HEVC制定了两个语法元素分别控制帧内和帧间编码CU的变换树最大深度。”(CN 104081777 Page6 [0041])变换树最大深度可以控制是否继续分解TU的四叉树。(默认情况下最大深度为1,在Slower/Veryslow设定下最大深度分别为2和3,举例来说就是CU为16×16时,如果是Slower设置,那么可以最多分解到4×4的大小)
根据这些文档叙述以及x265文档的描述可以知道,这个参数就是通过限制四叉树继续分解使得编码器的计算量减小,以此方法做到加速的效果。level 4就是通过帧间的参考控制TU四叉树深度,而不是直接按照tu-max-depth进行分解递归。
比如对于I帧而言,是帧内参考,根据叙述来看,并不会影响TU分解决策,最后是否使用limit-tu 4在I帧上没有区别。
limit-tu 0________________________________________limit-tu 4____________________________________
但是对于其他的P/B帧来说有帧间参考,那就首先满足了limit-tu 4的条件之一,如果邻域或者相同位置的帧间参考出现了depth0或者1的情况就能够成功限制变换树的分解。而且根据最后的CU/PU/TU计数分析来看,我选取了同一个B帧在limit-tu 0 时 8×8 16×16以及32×32大小的分割数量分别为881 5504 2433,limit-tu 4时则变为690 4447 2701,可以明显看到32×32大小的分割增加而8×8的减少了。由于这两帧编码策略的区别仅仅在于TU四叉树分裂提前退出的这个条件,可以推断这个参数有抑制TU分裂的作用。我也可以从这一帧的两种参数截图对比中看到明显的区别。就最终的画面效果而言,我认为在这一部番剧的几个场景中实际目视效果差距不大。
limit-tu 0________________________________________limit-tu 4____________________________________
根据以上的测试结果可以得到一些结论:
- –limit-tu参数确实是有效的,比较level 0 与level 4确实有接近20%的速度提升(仅编码,无预处理),特别是编码难度较高的番剧使用这个参数可以一定程度上降低运算压力,同时损失也不会太大。
- 根据最后成品体积来判断,对于编码难度较低的番剧,体积有明显减小的现象,因此推断可能会有损失细节的副作用。根据一些随机的比较,limit-tu 4容易造成线条周围变脏,出现较大的block,而且确实在低编码难度的画面中更加容易出现(比如说下图中手的线条周围)。
limit-tu 0________________________________________limit-tu 4____________________________________
Amaama_to_Inazuma | Netoge_no_Yome | Ajin_The_Movie | Relife | |
limit-tu 0 | 188,502,206Byte | 360,455,184Byte | 225,049,132Byte | 102,866,760Byte |
limit-tu 4 | 171,344,247Byte | 348,641,073Byte | 218,586,731Byte | 87,807,309Byte |
rate | 90.90% | 96.72% | 97.13% | 85.36% |
以上结论属于个人观点。可能存在疏漏。
参考内容:
http://x265.readthedocs.io/en/stable/cli.html
http://x265.readthedocs.io/en/stable/presets.html
http://x265.readthedocs.io/en/stable/releasenotes.html
http://ieeexplore.ieee.org/document/6324412/
https://patentimages.storage.googleapis.com/pdfs/34d7493c550454cd847b/CN104081777A.pdf
https://zh.wikipedia.org/wiki/%E7%B7%A8%E7%A2%BC%E6%A8%B9%E5%96%AE%E5%85%83