From 725ee76c63079807d9ce4ce2194c0b566006a743 Mon Sep 17 00:00:00 2001 From: Brian Heng <brian.heng@broadcom.com> Date: Sat, 9 Feb 2019 14:31:41 -0800 Subject: [PATCH] Fix for Ticket #152 - Sub-PU TMVP can generate an invalid inter candidate. - Simplify previous solution and eliminate duplicated code. --- source/Lib/CommonLib/UnitTools.cpp | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/source/Lib/CommonLib/UnitTools.cpp b/source/Lib/CommonLib/UnitTools.cpp index bc348c7c..19200be7 100644 --- a/source/Lib/CommonLib/UnitTools.cpp +++ b/source/Lib/CommonLib/UnitTools.cpp @@ -4541,6 +4541,11 @@ bool PU::getInterMergeSubPuMvpCand(const PredictionUnit &pu, MergeCtx& mrgCtx, b MotionInfo mi; + // initialize to default vector in case no motion vector is available + mi.mv[0] = mrgCtx.mvFieldNeighbours[(count << 1) + 0].mv; + mi.mv[1] = mrgCtx.mvFieldNeighbours[(count << 1) + 1].mv; + mi.refIdx[0] = mrgCtx.mvFieldNeighbours[(count << 1) + 0].refIdx; + mi.refIdx[1] = mrgCtx.mvFieldNeighbours[(count << 1) + 1].refIdx; mi.isInter = true; mi.sliceIdx = slice.getIndependentSliceIdx(); #if JVET_M0483_IBC @@ -4550,7 +4555,6 @@ bool PU::getInterMergeSubPuMvpCand(const PredictionUnit &pu, MergeCtx& mrgCtx, b if (colMi.isInter && !((colMi.interDir == 1 || colMi.interDir == 3) && (pColPic->cs->slice->getRefPOC(REF_PIC_LIST_0, colMi.refIdx[0]) == pColPic->cs->slice->getPOC()) && pu.cs->sps->getIBCMode())) #endif { - bool foundMV = false; for (unsigned currRefListId = 0; currRefListId < (bBSlice ? 2 : 1); currRefListId++) { RefPicList currRefPicList = RefPicList(currRefListId); @@ -4558,25 +4562,8 @@ bool PU::getInterMergeSubPuMvpCand(const PredictionUnit &pu, MergeCtx& mrgCtx, b { mi.refIdx[currRefListId] = 0; mi.mv[currRefListId] = cColMv; - foundMV = true; } } - if (foundMV == false) - { - // no motion vector is available so use default - mi.mv[0] = mrgCtx.mvFieldNeighbours[(count << 1) + 0].mv; - mi.mv[1] = mrgCtx.mvFieldNeighbours[(count << 1) + 1].mv; - mi.refIdx[0] = mrgCtx.mvFieldNeighbours[(count << 1) + 0].refIdx; - mi.refIdx[1] = mrgCtx.mvFieldNeighbours[(count << 1) + 1].refIdx; - } - } - else - { - // intra coded, in this case, no motion vector is available for list 0 or list 1, so use default - mi.mv[0] = mrgCtx.mvFieldNeighbours[(count << 1) + 0].mv; - mi.mv[1] = mrgCtx.mvFieldNeighbours[(count << 1) + 1].mv; - mi.refIdx[0] = mrgCtx.mvFieldNeighbours[(count << 1) + 0].refIdx; - mi.refIdx[1] = mrgCtx.mvFieldNeighbours[(count << 1) + 1].refIdx; } mi.interDir = (mi.refIdx[0] != -1 ? 1 : 0) + (mi.refIdx[1] != -1 ? 2 : 0); -- GitLab