getAffineMergeCand函数中调用的子函数分析
1. 子块级ATMVP相关函数
-
getInterMergeSubPuMvpCand: 获取子块级ATMVP运动向量候选
- 作用:用于获取子块级别的时空运动向量预测候选
- 提供的MV候选类型:MRG_TYPE_SUBPU_ATMVP类型的运动向量候选
-
deriveSubTmvpTMMv2Pel: 进行运动向量精细化处理
- 作用:对子块TMVP进行精细化处理,提高运动向量精度
- 提供的MV候选类型:MRG_TYPE_SUBPU_ATMVP类型的精细化运动向量候选
2. 仿射运动向量继承相关函数
-
getOneSbSmvpCand: 获取子块SMVP候选
- 作用:获取子块级的时空运动向量预测候选
- 提供的MV候选类型:子块SMVP类型的运动向量候选
-
getAvailableAffineNeighboursForLeftPredictor: 获取左侧仿射邻居PU
- 作用:查找并获取当前PU左侧可用的仿射运动邻居
- 提供的MV候选类型:继承的仿射运动向量候选
-
getAvailableAffineNeighboursForAbovePredictor: 获取上方仿射邻居PU
- 作用:查找并获取当前PU上方可用的仿射运动邻居
- 提供的MV候选类型:继承的仿射运动向量候选
-
xInheritedAffineMv: 从邻居PU继承仿射运动向量
- 作用:从已识别的仿射邻居中继承运动向量信息
- 提供的MV候选类型:继承的仿射MV候选
3. 仿射合并候选冗余检查函数
- checkLastAffineMergeCandRedundancy : 检查仿射合并候选的冗余性
- 作用:检查新生成的仿射合并候选是否与已有候选重复
- 提供的MV候选类型:经过冗余检查后的仿射合并类型的MV候选
4. 仿射运动向量候选获取函数
- getColocatedAffineCMVP : 获取仿射运动向量候选
- 作用:根据时域信息获取仿射运动向量候选
- 提供的MV候选类型:
- L0/L1方向的仿射运动向量候选
- 区分AFFINEMODEL_4PARAM和AFFINEMODEL_6PARAM两种仿射模型类型
5. HMVP历史运动向量候选相关函数
-
addSpatialAffineMergeHMVPCand: 添加空间仿射HMVP候选
- 作用:从历史运动向量表中添加空间仿射合并候选
- 提供的MV候选类型:历史运动向量预测的仿射合并候选
-
addOneInheritedHMVPAffineMergeCand: 添加继承的HMVP仿射合并候选
- 作用:添加从历史运动向量表继承的仿射合并候选
- 提供的MV候选类型:继承的历史运动向量仿射合并候选
-
addOneAffineMergeHMVPCand: 添加单个仿射HMVP合并候选
- 作用:添加单个来自历史运动向量表的仿射合并候选
- 提供的MV候选类型:历史运动向量仿射合并候选
6. 控制点候选生成函数
- getAffineControlPointCand : 获取仿射控制点候选
- 作用:基于空间邻居的运动信息构造仿射控制点候选
- 提供的MV候选类型:构造的仿射合并候选(基于LT、RT、LB、RB控制点的不同组合)
7. 非相邻候选相关函数
- getNonAdjCstMergeCand : 获取非相邻约束合并候选
- 作用:获取非相邻位置的约束仿射合并候选
- 提供的MV候选类型:非相邻仿射合并候选
8. 链式候选相关函数
- getChainedCstMergeCand : 获取链式约束合并候选
- 作用:获取通过链式方式构造的约束仿射合并候选
- 提供的MV候选类型:链式仿射合并候选
9. 相似性检查函数
- xCPMVSimCheck : 检查CPMV相似性
- 作用:检查控制点运动向量的相似性,避免重复候选
- 提供的MV候选类型:经过相似性检查的仿射合并候选
10. 运动向量处理辅助函数
- roundAffineMv : 四舍五入仿射运动向量
- 作用:对仿射运动向量进行四舍五入处理
- 提供的MV候选类型:处理后的仿射运动向量候选
这些子函数协同工作,共同完成仿射合并候选的生成过程,包括:
- 从时空邻居获取初始候选
- 继承历史运动信息
- 构造新的仿射候选
- 去除冗余和重复候选
- 填充候选列表至最大数量要求
调用位置
EncCu::xCheckRDCostMerge2Nx2N
子函数及其对应的宏条件
1. 函数入口和初始化阶段
- 初始化逻辑 : 包括
maxNumAffineMergeCand计算和affMrgCtx上下文初始化- 涉及宏:
JVET_AA0107_RMVF_AFFINE_MERGE_DERIVATION,JVET_W0090_ARMC_TM,ADDITIONAL_AFFINE_CAND_NUM
- 涉及宏:
2. 空间运动向量获取阶段
- getPURestricted(): 获取相邻PU
- getMotionInfo(): 提取运动信息
- 涉及宏:
JVET_Y0065_GPM_INTRA(用于isDiffMER检查)
3. 基于历史的仿射合并候选生成阶段
- xInheritedAffineMv() : 仿射运动向量继承
- 条件宏:
JVET_AG0164_AFFINE_GPM
- 条件宏:
- xCPMVSimCheck() : 运动相似性检查
- 条件宏:
JVET_AC0185_ENHANCED_TEMPORAL_MOTION_DERIVATION
- 条件宏:
4. 时间运动向量预测(TMVP)阶段
- getColocatedAffineCMVP() : 获取共置仿射运动向量
- 条件宏:
JVET_AK0095_ENHANCED_AFFINE_CANDIDATE,JVET_AC0185_ENHANCED_TEMPORAL_MOTION_DERIVATION
- 条件宏:
- refineTmvpCoverGetColocatedMVP() 和 getColocatedMVP() : 获取共置运动向量
- 条件宏:
JVET_AL0214_MV_REFINEMENT_FOR_TMVP,JVET_Y0134_TMVP_NAMVP_CAND_REORDERING
- 条件宏:
5. 冗余检查和候选验证阶段
- checkLastAffineMergeCandRedundancy() : 冗余检查
- 条件宏:
JVET_Z0139_HIST_AFF
- 条件宏:
- xCheckSimilarMotion(): 相似运动检查
6. 非相邻仿射合并候选生成阶段
- getNonAdjAvailableAffineNeighboursByDistance(): 获取非相邻仿射邻居
- collectNeiMotionInfo(): 收集邻居运动信息
- getRMVFAffineGuideCand() : 获取RMVF指导的仿射候选
- 条件宏:
JVET_AH0314_LIC_INHERITANCE_FOR_MRG,JVET_AG0164_AFFINE_GPM
- 条件宏:
7. 候选调整阶段
- adjustAffineMergeCandidatesOneGroup() : 调整仿射合并候选
- 条件宏:
JVET_W0090_ARMC_TM,JVET_AE0174_NONINTER_TM_TOOLS_CONTROL
- 条件宏:
8. 零填充阶段
- 最后的零填充逻辑,确保候选数量达到最大值
这些子函数按照上述顺序依次执行,每个阶段都可能根据不同的宏定义条件进行编译时的条件编译,从而影响最终的功能实现。