本文是基于HM-16.9+SCM-8.0写的
1、解析cfg中的参数;
2、初始化SPS、PPS;
3、读取YUV文件;
4、进入compressGOP函数,这个函数的功能是将视频序列分为图像组,对每组图像编码。在这个函数中,设置当前图像为长期参考图像,调用setRefPicList()函数设置参考图片列表list0和list1,然后调用compressSlice()函数编码一帧图像;
5、调用compressCtu()函数编码一个CTU,在这个函数中调用initCtu()用来初始化ctu,初始化ctu的过程中设置使用的最后2个IBC MV的值为0–m_lastIntraBCMv[2],这个变量用来标识最近的使用IBC的那个Cu
6、调用xCompressCU(),在这个函数中,IBC模式是从32x32大小的CU开始做,调用xCheckRDCostIntraBC()函数做IBC模式的预测。xCheckRDCostIntraBC()函数调用过程如下:
xCheckRDCostIntraBC()调用以下函数
- predIntraBCSearch():intra BV搜索并且预测
- encodeResAndCalcRdInterCU():获取重构像素值,计算残差和失真率,并对残差进行 变换、量化、编码系数、反变换、反量化。这里进行编码系数是为了求比特数来做RDO
predIntraBCSearch()调用以下函数
- fillMvpCand():获取MVP Cand,包含2个MV
- xIntraBlockCopyEstimation:获取最佳MV
- motionCompensation():获取预测值
fillMvpCand()调用以下函数
- deriveLeftRightTopIdx():计算相邻left-top和right-top Z扫描的part index
- deriveLeftBottomIdx():计算相邻left-bottom Z扫描的part index
- getPULeft():判断是否存在左边pu(这里只写了左边pu,还有上边pu等)
- xAddMVPCandUnscaled():获取相邻PU的MV并存入到mvCand中
- xAddMVPCandWithScaling():获取相邻PU的MV,然后满足一定的条件时对MV的坐标进行修改,并存入mvCand中
xIntraBlockCopyEstimation()调用以下函数
- xSetIntraSearchRange():设置BV的搜索范围
- xIntraPatternSearch():搜索可用的BV并选取最佳BV
xIntraPatternSearch()调用以下函数
- getIntraBCMVPsEncOnly():获取相邻PU的可用的BV数及BV值
- MergeCandLists():合并相同的BV,得到不同的BV数m_uiNumBVs及BV值m_acBVs
- xIntraBCSearchMVCandUpdate():把m_uiNumBVs个BV按照sad值从小到大的顺序对m_acBVs进行排序,选择sad值最小的那个BV
7、比较RDCost,选择最佳预测模式,intra还是IBC
8、获取一个CU的重构图像
9、做完一个CTU的预测之后调用encodeCtu()进行熵编码,这里是真正的编码,IBC只编码系数
10、编码完一帧之后调用loopFilterPic()做去方块滤波,调用SAOProcess()做SAO滤波
11、输出一帧重构图像