HM代码粗略介绍

论坛 期权论坛     
匿名技术用户   2021-1-11 22:01   384   0
<p align="center"><span style="font-size:14px">北京工业大学 朱维佳</span></p>
<p align="center"><span style="font-size:14px">邮箱: </span><span style="font-size:14px; color:#0000ff">sparkjj&#64;emails.bjut.edu.cn</span><u><span style="font-size:14px; color:#0000ff">(欢迎探讨任何关于编码的问题)</span></u></p>
<p align="center"><u><span style="font-size:14px; color:#0000ff">如转发本文章,请注明出处</span></u></p>
<p><span style="font-size:14px">1.</span> <span style="font-size:14px">环境配置</span></p>
<p><span style="font-size:14px">这个文档描述的版本是HM6.0</span></p>
<p><span style="font-size:14px">运行的方法如下可参考之前的文章:</span></p>
<p><span style="font-size:14px">2.</span> <span style="font-size:14px">编码端主函数的调用</span></p>
<p align="center"><img alt="" src="https://201907.oss-cn-shanghai.aliyuncs.com/cs/5606289-ea3fdc3fb72a2ede8c607a71cf778648"></p>
<div align="left"></div>
<p></p>
<p></p>
<p><span style="font-size:14px">主函数中会调用create函数,但是这里面是空函数,所以不做任何操作</span></p>
<p><span style="font-size:14px">encode是非常重要的函数,负责了实际的编码工作,在里面调用m_cTEncTop的encode</span></p>
<p><span style="font-size:14px">函数对每个GOP进行编码,并对每个GOP调用compressGOP。GOP的概念在HEVC中规定的并没有H.264/AVC那么严格,在H.264/AVC中,GOP是以I slice开始,而HEVC中并没有这样的规定,相当于弱化了HEVC中GOP的概念。</span></p>
<p><span style="font-size:14px"></span></p>
<p><span style="font-size:14px">3.</span> <span style="font-size:14px">GOP划分为Slice</span></p>
<p><span style="font-size:14px">GOP进而会划分为slice,有raster顺序的划分和tile的划分方式,对每个slice会调用</span></p>
<p><span style="font-size:14px">compressSlice来的对其选出最优的参数。然后调用encodeSlice来对其进行实际的熵编码工作。</span></p>
<p align="center"><img alt="" src="https://201907.oss-cn-shanghai.aliyuncs.com/cs/5606289-5a5e9b797f7a7524d00214b3a398bbee"></p>
<div align="left"></div>
<p></p>
<p></p>
<p><span style="font-size:14px">4.</span> <span style="font-size:14px">Slice的划分(Slice到LCU)</span></p>
<p><span style="font-size:14px">到Slice层面后,会划分等大的LCU,对每个CU进行compress和encode的工作,调用的函数分别为compressCU和encodeCU。而在CompressSlice和EncoderSlice中都会调用encodeCU,是为了保证后续计算码率的准确性,重点在于保证了cabac的状态是准确的。下面将介绍compressCU和encodeCU,由于RDO的时候会编码CU的信息,所以着重介绍compressCU</span></p>
<p><span style="font-size:14px"></span></p>
<p><span style="font-size:14px">5.</span> <span style="font-size:14px">compressCU</span></p>
<p align="left"><span style="font-size:14px">把一个slice内部的图像划分为K个LCU,同时这K个LCU是以raster的顺序来进行扫描的。LCU的尺寸默认为64x64,可以通过配置文件中的MaxCUWidth,MaxCUHeight来进行设置。而每个LCU会调用如下的compressCU函数去决定编码的参数。 而LCU是采用四叉树的表示结构,每个LCU会被递归的划分为4个子CU,并根据RD代价来确定是否进行划分,而每个LCU相当于树的第1层,所以他会调用xCompressCU。且在</span><a name="OLE_LINK2"></a><a name="OLE_LINK1" style="width:149px; height:17px"><span style="font-size:14px">xCompressCU</span></a><span style="font-size:14px">中会对每个子CU递归的调用xCompressCU,如下图所示,当然子CU的尺寸是当前CU的四分之一。</span></p>
<p align="center"><img alt="" src="https://201907.oss-cn-shanghai.aliyuncs.com/cs/5606289-101df4901397791cba5799a4612f4558"><br> <span style="font-size:14px"><br> <br> </span></p>
<p><span style="font-size:14px">然而在每次xCompressCU时,会对当前CU进行intra模式的测试,如果是B或Pslice,还对其进行merge和inter模式的测试。下面分别介绍intra,inter和merge相关的代码</span></p>
<p><span style="font-size:14px">5.1</span> <span style="font-size:14px">帧内</span></p>
<p><span style="font-size:14px">intra的调用流程如下:</span></p>
<p></p>
<span style="font-size:14px"></span>
<p></p>
<p align="center"><img alt="" src="https://201907.oss-cn-shanghai.aliyuncs.com/cs/5606289-23266d5bbe255a6015e402b1273b2d8f"></p>
<div align="left"></div>
<p></p>
<p></p>
<p align="center"></p>
<p align="center"></p>
<p><span style="font-size:14px">estIntraPredQT主要做模式选择的工作,负责选出对于当前PU的最优模式,如DC,或方向性,或planar。estIntraPredChromaQT做了类似的工作,不过是针对于色度。xRecurIntraCodingQT和xRecurIntraChromaCodingQT函数是依据给定的候选模式进行PU的分割,进而依据TU进行重建estIntraPredQT。</span></p>
<p><span style="font-size:14px">5.1.1</span> <span style="font-size:14px">estIntraPredQT</span></p>
<p><span style="font-size:14px">在这里面首先对N个候选模式进行粗粒度筛选</span></p>
<p>
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP