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