首先说明本文引自:http://blog.csdn.net/shaqoneal/article/details/44759561
这里我看的就没有上一篇那么懂了,所以很多地方都只是单纯的复制,另外也有一些个人的理解
(1)亮度帧内预测模式的预测
HEVC对每种PU大小共支持总计33种角度模式,外加上DC和平面模式。由于支持的模式更多,类似于H.264的单一最可能模式在HEVC中效率不高。HEVC针对每种PU大小定义了三个最可能模式,其选择依赖于相邻PU所选的模式。同时,由于最可能模式之外的模式概率分布接近平均,这样也可以由一个不经过CABAC的定长编码表示的结构来从剩余32个模式中指定一个模式。
最可能模式的选择根据左侧和上方的相邻块的模式确定。如果某一个相邻块不是帧内编码或者编码模式为PCM模式,或左边PU处于当前CTU之外,那么该块的模式在这个过程中等同于DC模式。设左侧和上方PU的模式分别为A和B,如果A≠B,那么这两个模式分别设为MPM[0]和MPM[1]。对于MPM[2]的确定需要遵循以下原则:①如果A或B都不是平面模式,那么MPM[2]设为平面模式;②否则,若A或B都不是DC模式,那么MPM[2]设为DC模式;③否则(即AB中有一个平面一个DC模式),MPM[2]设为模式26,即垂直模式。如果A=B,那么确定MPM的方法如下:①如果A和B都不是角度预测模式,那么MPM分别设定为平面、DC和垂直模式;②否则,MPM[0]设为A/B,MPM[1]和MPM[2]选择A的相邻模式,公式如下:
三个最可能模式确定后,会按照模式序号进行排序。如果当前预测模式等同于三个最可能模式之一,那么只有该模式在MPM的索引值会传递给解码器,否则将会传递一个5位且不经过CABAC的语法元素表示在MPM之外所选择的帧内预测模式。
该部分的实现如下(这里我先按照自己的想法找这段代码,我认为应该在estIntraPredLumaQT,因为是讲亮度预测的,但是看原文不对O(∩_∩)O哈哈~,不过不要紧,我也建议大家思考一下当前说的代码可能在哪里,有助于理解结构,现在没找到,切到雷神的那个图中去,没找到,所以我切换到TEncCU.cpp找到了TComDataCU这个类,然后在类里搜索getIntraDirLumaPredictor,没找到,想到前面博客中,原博中带Luma的,HM16.3常常不带,于是搜索getIntraDirPredictor成功找到!):
/** Get most probable intra modes
*\param uiAbsPartIdx part