HEVC整个程序调用流程:
Encode -> compressGOP -> compressCU
->xCompressCU->copyFromPicYuv
->xCheckRDCostIntra-> initEstData
->xCheckRDCostInter ->xCheckRDCostMerge2Nx2N
->getNumberOfWrittenBits
->copyToPic->xCopyYuv2Pic
编码流程可简单画图如下:
其中帧间以及各层级划分省略.
由于画图比较繁琐,而且还不一定直观, 下面都按照结构抓图贴出来, 注意所有子函数都是按照函数复杂度排序的.
从xCompressCU函数这里开始进行4叉树多层划分嵌套,从下图也能看出.
编码的层次结构:
1: 下面分析帧内编码的主要函数:
进一步展开帧内最耗时estIntraPredQT函数如下:
再把xIntraCodingLumaBlk这一层展开如下:
2.下面分析帧间编码:
把第2层展开xTZSearch函数如下:
TEncSearch::xEstimateResidualQT函数展开: 也是一个嵌套.
TEncSearch::predInterSearch函数展开:
进一步把TEncSearch::xMotionEstimation函数展开:
把第4层展开 xTZSearch函数如下:
下面是各个模块在整个编码中的复杂度(占用CPU百分比), 测试按照标准encoder_lowdelay_P_main.cfg来测试!
TEncSearch::encodeResAndCalcRdInterCU |
57.22 |
TEncSearch::xEstimateResidualQT |
54.76 |
TEncCu::xCheckRDCostInter |
43.97 |
TEncCu::xCheckRDCostMerge2Nx2N |
28.46 |
TEncSbac::codeCoeffNxN |
25.37 |
TComTrQuant::transformNxN |
20.17 |
TEncCu::xCheckRDCostIntra |
19.04 |
TComTrQuant::xQuant |
16.4 |
TEncSearch::predInterSearch |
14.35 |
TEncSearch::estIntraPredQT |
14.34 |
TComTrQuant::xRateDistOptQuant |
11.84 |
TEncSearch::xMotionEstimation |
9.7 |
TEncSearch::xTZSearch |
8.37 |
TEncSearch::xRecurIntraCodingQT |
8.16 |
TEncSearch::xTZSearchHelp |
7.21 |
从表中可以看出: 帧内编码小于20%, I帧间隔大的话,应该是小于10%.
帧间编码60%左右, xRateDistOptQuant占用11%左右, transform占用5%, xQuant实际占用5%.
大家分析的结果如何啊,讨论下,看下一步怎么做才能更好的优化出效果了!