HM+SCM中IBC的编码流程

本文是基于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、输出一帧重构图像

上一篇:微信分享接口


下一篇:百度统计