getAffineControlPointCand函数在getAffineMergeCand函数中被调用,用来得到AffineMerge候选列表中的“构造对候选”。
参数:pu即当前pu、mi[4]为构造候选的pu四个角控制点的mv、isAvailable记录四个控制点中哪个可用哪个不可用。
verIdx[4]为6组预定义组合候选的一种组合、modelIdx指明当前要test的候选在6组中的标号idx。
verNum表示当前要test的组合候选是4参数/6参数Affine、AffineMergeCtx即Affine候选列表。
void PU::getAffineControlPointCand( const PredictionUnit &pu, MotionInfo mi[4], bool isAvailable[4], int verIdx[4], int modelIdx, int verNum, AffineMergeCtx& affMrgType )
{
int cuW = pu.Y().width;
int cuH = pu.Y().height;
int vx, vy;
int shift = MAX_CU_DEPTH; //7
int shiftHtoW = shift + g_aucLog2[cuW] - g_aucLog2[cuH];
// motion info
Mv cMv[2][4]; //构造的Affine候选,前向后向4控制点
int refIdx[2] = {
-1, -1 };
int dir = 0;
EAffineModel curType = (verNum == 2) ? AFFINEMODEL_4PARAM : AFFINEMODEL_6PARAM;
if ( verNum == 2 ) //两个控制点,即4参数Affine
{
int idx0 = verIdx[0], idx1 = verIdx[1];
if ( !isAvailable[idx0] || !isAvailable[idx1] ) //控制点有一个不可用,直接return
{
return;
}
for ( int l = 0; l < 2; l++ )
{
if ( mi[idx0].refIdx[l] >= 0 && mi[idx1].refIdx[l] >= 0 )
{
// check same refidx and different mv
if ( mi[idx0].