
HM
文章平均质量分 59
岳麓吹雪
现在努力,以后就可以休息
展开
-
HEVC代码学习42:estIntraPredLumaQT函数
在之前的 HEVC代码学习37:帧内预测代码整体学习 中已经提到,estIntraPredLumaQT是亮度帧内预测的入口函数,下面将对该函数进行详细学习。estIntraPredLumaQT中完成了亮度分量的帧内预测,其主要流程如下: 一、初始化各种参数。 二、为了减少率失真优化次数,HEVC中默认使用帧内快速搜索算法,将分粗选和细选两个阶段进行。如果不使用快速搜索,将对所有帧内预测模式...原创 2018-05-30 11:43:35 · 4293 阅读 · 12 评论 -
HEVC代码学习34:compressSlice函数
compressSlice,是Slice层编码的入口函数,主要完成的功能就是Slice层编码参数的初始化,其中会调用compressCtu(其中会调用xCompressCU,对CU进行划分)和encodeCtu(其中对调用xEncodeCU,对CU进行编码)。主要工作流程: 1.计算Slice的起始CTU和边界CTU。 2.初始化率失真参数:bit、RD cost、失真。 3.初始化Sbac熵原创 2017-11-30 11:15:13 · 2943 阅读 · 0 评论 -
HEVC代码学习35:xEncodeCU函数
xEncodeCU是由encodeCtu调用,其作用是从CTU开始迭代对每个CU进行编码。注意,xEncodeCU是在最优分块已经划分完成后进行编码时使用的,在xCompressCU中没有使用。xEncodeCU会调用以下函数来完成各部分的编码: encodeSplitFlag编码块是否划分 encodeSkipFlag编码是否是skip模式 encodeMergeIndex如果是ski...原创 2017-12-01 17:21:58 · 2842 阅读 · 14 评论 -
HEVC代码学习32:getInterMergeCandidates函数
今天来看xCheckRDCostMerge2Nx2N函数中提到的重要函数getInterMergeCandidates,其功能是创建merge候选列表,这里重点来看空域候选列表的建立。首先来回忆一下merge的空域候选列表。merge候选列表长度为5,空域最多提供4个候选,按顺序依次遍历A1-B1-B0-A0-B2,选出4个候选填入候选列表。注意,空域最终可能提供的候选数量可能少于4个。 下面来看原创 2017-11-19 11:24:30 · 1662 阅读 · 0 评论 -
HEVC代码学习30:fillMvpCand函数
fillMvpCand函数的功能就是为AMVP建立候选列表。AMVP的理论见: http://blog.youkuaiyun.com/lin453701006/article/details/54340405fillMvpCand主要流程如下,主要来看空域候选列表: 一、建立空域候选列表: 1. 按顺序搜索左侧块A0-A1-scaled A0-scaled A1,只要有一个MV存在,写入候选列表,跳出进行原创 2017-11-01 22:16:00 · 2142 阅读 · 2 评论 -
HEVC代码学习15:AMVP相关函数
在HEVC中,使用了AMVP技术,利用空域和时域上的运动向量的相关性,为当前PU建立候选预测MV(MVP)列表。 xCheckBestMVP的功能就是在已知MV的情况下,将当前的MVP和之前最优的MVP比较,选择最优MVP。//已知MV的情况下,找最优MVPVoid TEncSearch::xCheckBestMVP ( TComDataCU* pcCU, RefPicList eRefPicL原创 2017-06-02 10:55:25 · 4467 阅读 · 3 评论 -
HEVC代码学习2:TAppEncTop::encode函数
HM中TAppEncTop::encode函数学习原创 2016-10-11 22:11:50 · 5438 阅读 · 2 评论 -
HEVC代码学习28:setLambda函数
在之前的TComRdCost类学习中,我们提到,要计算率失真代价,需要三个量:失真D、拉格朗日因子λ和码率R。下面就来看一下λ的设置函数。 在TComRdCost类中定义了setLambda函数,来对λ值进行设置。//设置λVoid TComRdCost::setLambda( Double dLambda, const BitDepths &bitDepths ){ m_dLambda原创 2017-10-02 11:03:24 · 1995 阅读 · 0 评论 -
HEVC代码学习27:calcRdCost函数
之前在率失真代价TComRdCost类中提到,计算率失真代价的函数为:calcRdCost,下面就来学习一下。calcRdCost工作流程如下: 1、根据输入的失真类型eDFunc来设置λ。 2、根据公式计算RD Cost。其中标记一下,有一点疑问,在DF_SAD下的代价为什么多除了65536.0,猜想应该是之前多乘了一个65536.0,在这除掉了。待看完其它代码估计会有答案,留此疑问后边看懂后原创 2017-09-30 20:53:39 · 2878 阅读 · 2 评论 -
HEVC代码学习26:率失真代价类TComRdCost
HEVC代码学习25:xDecompressCU函数原创 2017-09-28 15:39:31 · 3267 阅读 · 0 评论 -
HEVC代码学习33:量化相关代码学习
今天来看量化相关的代码。HEVC中,变换和量化是相互结合的,这里重点关注量化部分。在HM的TLibCommon中,有TComTrQuant.h,从名字上可知是变换量化相关的,就从这个头文件入手开始学习吧。其中使用结构体QpParam定义了QP的信息:/// QP structstruct QpParam{ //QP = floor(QP/6)+QP%6 Int Qp; Int pe原创 2017-11-23 15:23:14 · 1677 阅读 · 13 评论 -
HEVC代码学习11:xCompressCU函数
今天接着之前进行了全局最小CU分块,来看进行CU分块的xCompressCU函数。xCompressCU主要作用是完成块划分,确定最优预测模式。主要可以分为: 1.帧间预测xCheckRDCostInter、xCheckRDCostMerge2Nx2N 2.帧内预测xCheckRDCostIntra 3.PCM模式xCheckIntraPCM 这里PCM模式是一种无损编码模式,该模式下原创 2017-05-17 16:08:34 · 6339 阅读 · 4 评论 -
HEVC代码学习41:解码器代码整体学习
最近看了一些解码端的代码,为了方便阅读,写个总结梳理一下思路,之后会不断补充。这里借用雷神的图: decmain.cppHM解码器入口是TAppDecoder的decmain.cpp,调用了四个入口函数cTAppDecTop.create()(创建解码器),cTAppDecTop.parseCfg( argc, argv )(分析配置信息),cTAppDecTop.decode()(...原创 2018-05-15 10:15:55 · 2344 阅读 · 1 评论 -
HEVC代码学习40:decodePredInfo和decodePUWise函数
在之前的 HEVC代码学习39:decodeCtu和xDecodeCU函数 中提到,xDecodeCU通过迭代完成每个CU的解码,其中skip模式会直接解码merge列表和索引,取出对应MV;PCM模式也会直接进行解码;其他模式会调用decodePredInfo解码预测模式信息(帧内预测、帧间预测)。下面就来学习decodePredInfo及其调用的重要函数decodePUWise。decod...原创 2018-05-15 09:33:34 · 1038 阅读 · 0 评论 -
HEVC代码学习39:decodeCtu和xDecodeCU函数
在之前 HEVC代码学习38:decompressSlice函数 学习中提到,解码slice会遍历所有CTU,调用decodeCtu和decompressCtu解码每一个CTU。下面就来学习一下decodeCtu和xDecodeCU函数。decodeCtu该函数是解码CTU的入口函数,有两个输入参数:待解码的CTU和一个标识是否是slice最后一个CTU的flag。代码很短,其中调用x...原创 2018-05-11 16:02:53 · 1479 阅读 · 0 评论 -
HEVC代码学习38:decompressSlice函数
好久没看HEVC了,今天回归,来学习一下解码端的decompressSlice函数,有两个,一个是TDecGop类的成员函数,另一个是TDecSlice类的。TDecGop::decompressSlice该函数比较简单,是解码一帧图像的上层入口函数,在TDecGop::xDecodeSlice中被调用。主要功能是完成熵解码器初始化和计时工作,并会调用TDecSlice::decompre...原创 2018-05-11 10:04:31 · 1245 阅读 · 0 评论 -
HEVC代码学习0:HM使用+码流分析教程
第一次面对如此浩大的工程代码,真的不知如何下手。拜读HEVC_CJL大神的博客,受益匪浅。以下将记录个人学习过程,有不对的地方请谅解指正,十分感谢。更新·2016.10.10:对HM使用方法进行了描述。·2018.01.23:对原HM使用方法进行了较大更新,增加了HM下载和码流分析部分。·2018.03.05:增加HM常见问题及解决方法。·2018.03.28:增加针对编...原创 2020-09-21 11:08:35 · 39241 阅读 · 149 评论 -
HEVC代码学习31:xCheckRDCostMerge2Nx2N函数
推荐阅读 http://blog.youkuaiyun.com/nb_vol_1/article/details/51163625 http://blog.youkuaiyun.com/guoyaoyao1990/article/details/35339717今天来学习HM中merge部分的代码,其入口函数为xCheckRDCostMerge2Nx2N。这里需要注意的是,merge是借用空间邻近块的MV作为原创 2017-11-16 17:55:41 · 2805 阅读 · 2 评论 -
HEVC代码学习36:xTrMxN函数
之前在transformNxN的学习中提到,xT函数是前向变换的入口函数,实际上xT完成的是变换前的准备工作,真正的前向变换由xTrMxN函数实现。先来看下xT函数。xT只是一个入口函数,首先定义了残差块和系数块,然后调用xTrMxN进行前向变换。/** Wrapper function between HM interface and core NxN forward transfo原创 2018-01-15 16:17:19 · 1041 阅读 · 0 评论 -
HEVC代码学习36:transformNxN函数
今天来学习变换相关的函数,帧内帧间最终都会调用transformNxN来进行变换。下面来对transformNxN进行学习。其工作流程如下: 1.RDPCM,对残差进行PCM处理,利用周围临近残差值预测当前残差。 2.检测是否为Trans-quant-bypass模式,则直接使用RDPCM的残差。否则执行3。 3.Transform skip flag为真,调用xTransformSki原创 2018-01-15 11:55:30 · 1996 阅读 · 0 评论 -
HEVC代码学习37:帧内预测代码整体学习
最近一直在看变换部分的东西,由于很多变换模式是针对帧内预测模式设计的,来简单学习一下帧内预测流程。通过之前xCompressCU的学习,我们知道了帧内、帧间的入口函数都在xCompressCU中,下面回顾一下xCompressCU函数。xCompressCUxCompressCU主要作用是完成块划分,确定最优预测模式,其流程为: 1.帧间预测xCheckRDCostInter、xCheckRDCo原创 2018-01-22 17:53:16 · 3775 阅读 · 12 评论 -
HEVC代码学习29:getDistPart函数
getDistPart的功能是根据输入的当前图像和原始图像的信息来计算失真,分为失真参数初始化和计算失真两部分。计算失真是通过函数指针FpDistFunc DistFunc来实现的,DistFunc会根据cDtParam调用对应失真计算函数来计算失真。//计算失真Distortion TComRdCost::getDistPart( Int bitDepth, Pel* piCur, Int iC原创 2017-10-02 19:50:02 · 1443 阅读 · 0 评论 -
HEVC代码学习24:encodeResAndCalcRdInterCU函数
推荐http://blog.youkuaiyun.com/nb_vol_1/article/details/51190324在http://blog.youkuaiyun.com/lin453701006/article/details/72403936学习中,我们提到xCheckRDCostInter调用了encodeResAndCalcRdInterCU来计算残差和RD cost。今天来学习encodeResAndCa原创 2017-08-16 16:14:31 · 3142 阅读 · 5 评论 -
HEVC代码学习16:运动矢量MV的数据结构
今天学习MV的数据结构,进一步理解MV的存储、处理等各种操作。TComMv先来看基本的MV类TComMv。可以看到MV是以水平分量m_iHor和垂直分量m_iVer的形式存储的,类中包含了设置、获取、加减、比较等函数。class TComMv{private: //MV水平和垂直分量 Short m_iHor; ///< horizontal component of motio原创 2017-06-12 15:51:17 · 5354 阅读 · 31 评论 -
HEVC代码学习8:xMotionEstimation函数
之前学习了xPatternSearchFracDIF函数,今天来学习其上层的xMotionEstimation函数,从字面就可以理解,功能是进行运动估计。xMotionEstimation主要工作流程是:进行一些初始化,设置搜索范围,然后通过整像素搜索得到一个最优点,将这个最优点作为起点进行亚像素搜索,最终得到以1/4精度为单位的MV。Void TEncSearch::xMotionEstimati原创 2017-04-27 17:01:51 · 6596 阅读 · 8 评论 -
HEVC代码学习9:getInterMergeCandidates函数
今天需要统计Merge的候选列表信息,来看下getInterMergeCandidates函数,用于建立merge候选列表。 其主要工作流程: 1.建立空间列表,如果达到最大候选数,退出。 2.空间列表不能填满候选列表,建立时域列表补足,如果达到最大候选数,退出。 3.空间+时域列表不能填满候选列表,建立组合列表补足,如果达到最大候选数,退出。 4.若依然为填满,则使用零MV补足。//!原创 2017-05-08 21:35:56 · 1896 阅读 · 0 评论 -
HEVC代码学习10:实现全局使用最小CU划分
今天算是来进行一次练手,实现全局使用最小CU和PU划分进行编码。HEVC中,支持CU最大尺寸为64x64,最小为16x16,在代码中在xCompressCU中进行CU的划分。首先输入的CU为最大尺寸,由cfg文件中的MaxCUWidth和MaxCUHeight指定,计算各种划分模式的cost,通过xCheckBestMode选择最优模式进行划分,迭代处理,直到达到最大深度结束。 因此,我们可以从x原创 2017-05-16 09:40:12 · 3244 阅读 · 11 评论 -
HEVC代码学习7:xPatternSearchFracDIF函数
上一次我们学习了运动估计中使用的插值滤波器函数,这次来看具体的分像素差值函数xPatternSearchFracDIF。在运动估计中,首先进行整像素的搜索,确定一个最优MV,然后在进行分像素搜索,得到以1/4为单位的MV。其分像素搜索通过xPatternSearchFracDIF函数实现,代码如下,主要功能是对Y分量进行亚像素搜索。首先进行1/2像素插值,然后进行1/4像素插值,最终得到以1/4为单原创 2017-04-13 17:25:57 · 2891 阅读 · 5 评论 -
HEVC代码学习6:filterHor和filterVer函数
帧间预测分为运动估计ME和运动补偿MV,其中用到了MV的亚像素搜索,需要使用filterHor和filterVer进行插值。 这里使用的是HM16,在之前版本中分为filterHorLuma、filterHorChroma和filterHorLuma、filterVerChroma。在HM16已经将亮度和色度插值滤波器整合。 filterHor和filterVer代码如下:/** *原创 2017-04-12 23:13:49 · 2778 阅读 · 0 评论 -
HEVC代码学习5:cross-component prediction代码实现2
在之前的学习中,主要对CCP的整体代码思路进行了学习,下面将再进一步研究一下其相关的函数以及其重要参数。原创 2016-10-26 15:33:44 · 2268 阅读 · 4 评论 -
HEVC代码学习1:TAppEncoder的main函数
这里使用的是HM16.6。TAppEncoder是编码器工程,完成视频序列的编码。下图为TAppEncoder的函数调用关系。运行时,首先调用encmain.cpp中的main函数int main(int argc, char* argv[]){ TAppEncTop cTAppEncTop; // print information fp原创 2016-10-10 14:47:42 · 5704 阅读 · 24 评论 -
HEVC代码学习3:TEncTop::encode函数
在之前学习的TAppEncTop::encode函数中,通过调用了TEncTop::encode对视频帧进行编码,下面将对TEncTop::encode进行学习。按照HM代码理解来看,TEncTop::encode主要作用是为GOP压缩之前做一些准备工作,包括创建当前图像缓冲区、设定QP是否自适应、根据码率控制模式来确定是否需要先初始化GOP,然后调用TEncGop::compress原创 2016-10-13 09:59:35 · 4796 阅读 · 11 评论 -
HEVC代码学习17:m_filteredBlockTmp[]和m_filteredBlock[][]
在之前的运动估计的亚像素搜索中,提到了插值之后的数据存放在m_filteredBlock[][]中,最近在学习中,发现其中涉及很多问题,不容易研究明白一些,记录一下。基本结构m_filteredBlockTmp[]大小为4,m_filteredBlock[][]大小为4x4,类型为TComYuv。//LUMA_INTERPOLATION_FILTER_SUB_SAMPLE_POSITIONS = 4原创 2017-06-13 17:13:34 · 2188 阅读 · 0 评论 -
HEVC代码学习14:motionCompensation函数
今天来看运动补偿,推荐两篇博文: http://blog.youkuaiyun.com/hevc_cjl/article/details/8457642 http://blog.youkuaiyun.com/nb_vol_1/article/details/55253979 运动补偿的功能是根据之前的局部图像来预测补偿当前的局部图像。而实际代码来看,主要完成的是亚像素插值补偿的工作。在运动估计中,得到的MV是亚像素精原创 2017-05-24 17:27:25 · 5813 阅读 · 14 评论 -
HEVC代码学习21:xTZSearch函数
今天来继续学习运动估计的整像素搜索,来看下xTZSearch函数。昨天已经说了xTZSearch是Diamond搜索的入口函数,其中调用了重要函数xTZSearchHelp和xTZ8PointDiamondSearch 。其主要工作流程如下: 1、使用宏TZ_SEARCH_CONFIGURATION,配置相关的搜索参数,初始化搜索范围、跨度、像素值和SAD。 2、假设中值预测MV为最优点。 3原创 2017-08-11 16:36:09 · 3181 阅读 · 0 评论 -
HEVC代码学习23:xTZ8PointDiamondSearch函数
今天来学习xTZ8PointDiamondSearch函数。 xTZ8PointDiamondSearch是xTZSearch调用的一个重要函数,实现的是菱形模板搜索。xTZ8PointDiamondSearch的菱形模板如下图: 理论可以见之前帧间预测的运动估计-搜索算法部分,这里不再赘述。 http://blog.youkuaiyun.com/lin453701006/article/details/原创 2017-08-14 23:21:19 · 1701 阅读 · 0 评论 -
HEVC代码学习22:xTZSearchHelp函数
xTZSearchHelp是整像素搜索中的重要函数,在xTZSearch中多次被调用,今天就来学习一下这个函数。xTZSearchHelp的主要功能是,计算输入搜索点__inline Void TEncSearch::xTZSearchHelp( TComPattern* pcPatternKey, IntTZSearchStruct& rcStruct, const Int iSearchX, c原创 2017-08-13 20:53:24 · 1898 阅读 · 1 评论 -
HEVC代码学习18:运动估计和运动补偿总结
经过了这段时间对帧间预测部分代码的学习,算是大体上了解了其工作原理。只看理论不看代码,体会不深刻,在看了代码后,有了一种恍然大悟的感觉,很多算法实现和看原理时理解的不一样。下面来整理一下之前写的博客,总结一下运动估计和运动补偿具体的代码实现思路,主要谈一下代码处理的思路,运动估计运动估计实际就是当前块在参考图像中搜索找到匹配块的处理过程。在实际代码中入口函数是xMotionEstima...原创 2017-06-25 10:29:00 · 11988 阅读 · 15 评论 -
HEVC代码学习25:xDecompressCU函数
今天来看解码端的xDecompressCU函数。对应x CompressCU,解码端有xDecompressCU函数,来完成CU的划分即各CU模式的选择。相比编码端,解码端就简单多了,只需要按照编码端传递的参数来进行划分即可,不需要在进行复杂的选择。主要流程如下: 1、初始化,读取各种信息 2、判断是否越界 3、当深度小于CU最大深度和设定的最大深度且不越界时,递归调用xDecompress原创 2017-08-18 15:54:27 · 1264 阅读 · 0 评论 -
HEVC代码学习20:xPatternSearchFast函数
之前主要集中在亚像素部分,整像素搜索没仔细看,只看过理论部分,现在来看下整像素部分的代码。之前已经说过,运动估计中首先进行整像素搜索,找到了一个局部最优点,作为亚像素搜索的起点继续搜索,得到最优MV。整像素搜索的入口函数是xPatternSearch(Full search)和xPatternSearchFast(TZ search),两者的选择由m_iFastSearch决定。m_iFastSea原创 2017-08-10 17:38:48 · 1611 阅读 · 1 评论