<div dir="ltr">From ae2b7213475a6708f8e53a8e3c1319effcbdd142 Mon Sep 17 00:00:00 2001<br>From: AnusuyaKumarasamy <<a href="mailto:anusuya.kumarasamy@multicorewareinc.com" target="_blank">anusuya.kumarasamy@multicorewareinc.com</a>><br>Date: Thu, 25 Jul 2024 22:24:28 +0530<br>Subject: [PATCH 7/9] Fix build warnings and Code cleanup<br><br>---<br> source/common/cudata.cpp    |   9 +-<br> source/common/slice.cpp     |   8 +-<br> source/common/slice.h       |   5 +-<br> source/encoder/analysis.cpp | 186 +++++++++---------------<br> source/encoder/analysis.h   |   5 +-<br> source/encoder/search.cpp   | 272 +++++++++++++++---------------------<br> source/encoder/search.h     |   6 +-<br> 7 files changed, 194 insertions(+), 297 deletions(-)<br><br>diff --git a/source/common/cudata.cpp b/source/common/cudata.cpp<br>index 395b80fcd..e95f4830d 100644<br>--- a/source/common/cudata.cpp<br>+++ b/source/common/cudata.cpp<br>@@ -2346,7 +2346,7 @@ bool CUData::getColMVPIBC(int ctuRsAddr, int partUnitIdx, MV& rcMv)<br>     CUData* colCU = m_encData->getPicCTU(ctuRsAddr);<br>     MVField tempMv;<br>     colCU->getMvField(colCU, absPartAddr, 0, tempMv);<br>-    if (&tempMv == NULL)<br>+    if (tempMv.refIdx == REF_NOT_VALID)<br>         return false;<br> <br>     rcMv = tempMv.mv;<br>@@ -2354,14 +2354,11 @@ bool CUData::getColMVPIBC(int ctuRsAddr, int partUnitIdx, MV& rcMv)<br>     return true;<br> }<br> <br>-void CUData::getIntraBCMVPsEncOnly(uint32_t tabsPartIdx, MV* MvPred, int& nbPred, int puIdx)<br>+void CUData::getIntraBCMVPsEncOnly(uint32_t absPartIdx, MV* MvPred, int& nbPred, int puIdx)<br> {<br>     uint32_t        tempPartIdx;<br>     uint32_t        left, above;<br>-    PartSize        ePartSize = (PartSize)m_partSize[tabsPartIdx];<br>-    const MVField* mvField;<br>     MVField         tempMvField;<br>-    uint32_t        absPartIdx;<br> <br>     int width, height;<br>     getPartIndexAndSize(puIdx, absPartIdx, width, height);<br>@@ -2515,7 +2512,7 @@ void CUData::getIntraBCMVPsEncOnly(uint32_t tabsPartIdx, MV* MvPred, int& nbPred<br> <br> void CUData::roundMergeCandidates(MVField(*pcMvFieldNeighbours)[2], int iCount) const<br> {<br>-    if (0) //m_pcSlice->getUseIntegerMv()<br>+    if (m_slice->m_useIntegerMv)<br>     {<br>         for (int i = 0; i < iCount; i++)<br>         {<br>diff --git a/source/common/slice.cpp b/source/common/slice.cpp<br>index 337112e07..d67aaae0b 100644<br>--- a/source/common/slice.cpp<br>+++ b/source/common/slice.cpp<br>@@ -67,8 +67,8 @@ void Slice::setRefPicList(PicList& picList, PicList& refPicSetInterLayer0, PicLi<br>         {<br>             if (m_rps.numberOfPictures == 0)<br>             {<br>-                Frame* prevPic = picList.getPOC(max(0, m_poc - 1));<br>-                if (prevPic->m_poc != max(0, m_poc - 1))<br>+                Frame* prevPic = picList.getPOC(X265_MAX(0, m_poc - 1));<br>+                if (prevPic->m_poc != X265_MAX(0, m_poc - 1))<br>                 {<br>                     prevPic = picList.getPOC(m_poc);<br>                 }<br>@@ -91,8 +91,8 @@ void Slice::setRefPicList(PicList& picList, PicList& refPicSetInterLayer0, PicLi<br> <br>     if (!checkNumPocTotalCurr && m_rps.numberOfPictures == 0)<br>     {<br>-        Frame* prevPic = picList.getPOC(max(0, m_poc - 1));<br>-        if (prevPic->m_poc != max(0, m_poc - 1))<br>+        Frame* prevPic = picList.getPOC(X265_MAX(0, m_poc - 1));<br>+        if (prevPic->m_poc != X265_MAX(0, m_poc - 1))<br>         {<br>             prevPic = picList.getPOC(m_poc);<br> <br>diff --git a/source/common/slice.h b/source/common/slice.h<br>index 57ef1afee..b5be561fd 100644<br>--- a/source/common/slice.h<br>+++ b/source/common/slice.h<br>@@ -403,9 +403,10 @@ public:<br>     int         m_fieldNum;<br>     Frame*      m_mcstfRefFrameList[2][MAX_MCSTF_TEMPORAL_WINDOW_LENGTH];<br> <br>-    Frame*      m_lastEncPic;<br>+    Frame* m_lastEncPic;<br>     bool        m_bLMvdL1Zero;<br>     bool        m_bTemporalMvp;<br>+    bool        m_useIntegerMv;<br> <br>     Slice()<br>     {<br>@@ -423,6 +424,8 @@ public:<br>         m_chromaQpOffset[0] = m_chromaQpOffset[1] = 0;<br>         m_fieldNum = 0;<br>         m_bTemporalMvp = false;<br>+        m_lastEncPic = NULL;<br>+        m_useIntegerMv = false;<br>     }<br> <br>     void disableWeights();<br>diff --git a/source/encoder/analysis.cpp b/source/encoder/analysis.cpp<br>index 033c781a9..7a910cbb9 100644<br>--- a/source/encoder/analysis.cpp<br>+++ b/source/encoder/analysis.cpp<br>@@ -573,52 +573,39 @@ uint64_t Analysis::compressIntraCU(const CUData& parentCTU, const CUGeom& cuGeom<br>             checkBestMode(md.pred[PRED_INTRA_NxN], depth);<br>         }<br> <br>-        bool intraBlockCopyFastSearch = (m_param->bEnableSCC == 1) ? true : false, bSkipIntraBlockCopySearch = false, bUse1DSearchFor8x8 = true;<br>-        uint32_t cost;<br>-        double intracost = MAX_DOUBLE;<br>+        bool intraBlockCopyFastSearch = (m_param->bEnableSCC == 1) ? true : false, bUse1DSearchFor8x8 = false;<br>         if (m_param->bEnableSCC)<br>         {<br>             md.pred[PRED_MERGE_IBC].cu.initSubCU(parentCTU, cuGeom, qp, ibc.m_lastIntraBCMv);<br>             checkRDCostIntraBCMerge2Nx2N(md.pred[PRED_MERGE_IBC], cuGeom);<br> <br>-            if (!bSkipIntraBlockCopySearch)<br>-            {<br>-                md.pred[PRED_IBC_2Nx2N].cu.initSubCU(parentCTU, cuGeom, qp, ibc.m_lastIntraBCMv);<br>-                checkIntraBC_rd5_6(md.pred[PRED_IBC_2Nx2N], cuGeom, SIZE_2Nx2N, false, bUse1DSearchFor8x8, &MV(0, 0), ibc);<br>-                checkBestMode(md.pred[PRED_IBC_2Nx2N], depth);<br>+            md.pred[PRED_IBC_2Nx2N].cu.initSubCU(parentCTU, cuGeom, qp, ibc.m_lastIntraBCMv);<br>+            checkIntraBC_rd5_6(md.pred[PRED_IBC_2Nx2N], cuGeom, SIZE_2Nx2N, false, bUse1DSearchFor8x8, ibc);<br>+            checkBestMode(md.pred[PRED_IBC_2Nx2N], depth);<br> <br>-                if (intraBlockCopyFastSearch)<br>+            if (intraBlockCopyFastSearch)<br>+            {<br>+                if ((int)depth == m_slice->m_sps->log2DiffMaxMinCodingBlockSize)<br>                 {<br>-                    if (depth == m_slice->m_sps->log2DiffMaxMinCodingBlockSize)<br>-                    {<br>-                        intracost = min(intracost, md.pred[PRED_IBC_2Nx2N].rdCost);<br>-                        double dTH2 = max(60 * m_rdCost.m_lambda, 56.0);<br>-                        double dTH3 = max(66 * m_rdCost.m_lambda, 800.0);<br>-<br>-<br>-                        md.pred[PRED_IBC_Nx2N].cu.initSubCU(parentCTU, cuGeom, qp, ibc.m_lastIntraBCMv);<br>-                        checkIntraBC_rd5_6(md.pred[PRED_IBC_Nx2N], cuGeom, SIZE_Nx2N, false, bUse1DSearchFor8x8, &MV(0, 0), ibc);<br>-                        checkBestMode(md.pred[PRED_IBC_Nx2N], depth);<br>-                        intracost = min(intracost, md.pred[PRED_IBC_Nx2N].rdCost);<br>+                    md.pred[PRED_IBC_Nx2N].cu.initSubCU(parentCTU, cuGeom, qp, ibc.m_lastIntraBCMv);<br>+                    checkIntraBC_rd5_6(md.pred[PRED_IBC_Nx2N], cuGeom, SIZE_Nx2N, false, bUse1DSearchFor8x8, ibc, (iMVCandList[SIZE_Nx2N] + 8));<br>+                    checkBestMode(md.pred[PRED_IBC_Nx2N], depth);<br> <br>-                        md.pred[PRED_IBC_2NxN].cu.initSubCU(parentCTU, cuGeom, qp, ibc.m_lastIntraBCMv);<br>-                        checkIntraBC_rd5_6(md.pred[PRED_IBC_2NxN], cuGeom, SIZE_2NxN, false, bUse1DSearchFor8x8, &MV(0, 0), ibc);<br>-                        checkBestMode(md.pred[PRED_IBC_2NxN], depth);<br>-                        intracost = min(intracost, md.pred[PRED_IBC_2NxN].rdCost);<br>-                    }<br>-                }<br>-                else<br>-                {<br>-                    md.pred[PRED_IBC_2NxN].cu.initSubCU(parentCTU, cuGeom, qp);<br>-                    checkIntraBC_rd5_6(md.pred[PRED_IBC_2NxN], cuGeom, SIZE_2NxN, false, bUse1DSearchFor8x8, &MV(0, 0), ibc);<br>+                    md.pred[PRED_IBC_2NxN].cu.initSubCU(parentCTU, cuGeom, qp, ibc.m_lastIntraBCMv);<br>+                    checkIntraBC_rd5_6(md.pred[PRED_IBC_2NxN], cuGeom, SIZE_2NxN, false, bUse1DSearchFor8x8, ibc, (iMVCandList[SIZE_2NxN] + 8));<br>                     checkBestMode(md.pred[PRED_IBC_2NxN], depth);<br>-<br>-                    md.pred[PRED_IBC_Nx2N].cu.initSubCU(parentCTU, cuGeom, qp);<br>-                    checkIntraBC_rd5_6(md.pred[PRED_IBC_Nx2N], cuGeom, SIZE_Nx2N, false, bUse1DSearchFor8x8, &MV(0, 0), ibc);<br>-                    checkBestMode(md.pred[PRED_IBC_Nx2N], depth);<br>                 }<br>             }<br>+            else<br>+            {<br>+                md.pred[PRED_IBC_2NxN].cu.initSubCU(parentCTU, cuGeom, qp);<br>+                checkIntraBC_rd5_6(md.pred[PRED_IBC_2NxN], cuGeom, SIZE_2NxN, false, bUse1DSearchFor8x8, ibc, (iMVCandList[SIZE_2NxN] + 8));<br>+                checkBestMode(md.pred[PRED_IBC_2NxN], depth);<br> <br>+                md.pred[PRED_IBC_Nx2N].cu.initSubCU(parentCTU, cuGeom, qp);<br>+                checkIntraBC_rd5_6(md.pred[PRED_IBC_Nx2N], cuGeom, SIZE_Nx2N, false, bUse1DSearchFor8x8, ibc, (iMVCandList[SIZE_Nx2N] + 8));<br>+                checkBestMode(md.pred[PRED_IBC_Nx2N], depth);<br>+            }<br>         }<br> <br>         if (m_bTryLossless)<br>@@ -2326,7 +2313,7 @@ SplitData Analysis::compressInterCU_rd5_6(const CUData& parentCTU, const CUGeom&<br>                             refMasks[0] = splitData[0].splitRefs | splitData[1].splitRefs; /* top */<br>                             refMasks[1] = splitData[2].splitRefs | splitData[3].splitRefs; /* bot */<br>                             md.pred[PRED_2NxN].cu.initSubCU(parentCTU, cuGeom, qp);<br>-                            checkInter_rd5_6(md.pred[PRED_2NxN], cuGeom, SIZE_2NxN, refMasks);<br>+                            checkInter_rd5_6(md.pred[PRED_2NxN], cuGeom, SIZE_2NxN, refMasks, iMVCandList[SIZE_2NxN]);<br>                             checkBestMode(md.pred[PRED_2NxN], cuGeom.depth);<br>                             interBest = (md.pred[PRED_2NxN].rdCost < interBest->rdCost) ? &md.pred[PRED_2NxN] : interBest;<br>                         }<br>@@ -2336,7 +2323,7 @@ SplitData Analysis::compressInterCU_rd5_6(const CUData& parentCTU, const CUGeom&<br>                             refMasks[0] = splitData[0].splitRefs | splitData[2].splitRefs; /* left */<br>                             refMasks[1] = splitData[1].splitRefs | splitData[3].splitRefs; /* right */<br>                             md.pred[PRED_Nx2N].cu.initSubCU(parentCTU, cuGeom, qp);<br>-                            checkInter_rd5_6(md.pred[PRED_Nx2N], cuGeom, SIZE_Nx2N, refMasks);<br>+                            checkInter_rd5_6(md.pred[PRED_Nx2N], cuGeom, SIZE_Nx2N, refMasks, iMVCandList[SIZE_Nx2N]);<br>                             checkBestMode(md.pred[PRED_Nx2N], cuGeom.depth);<br>                             interBest = (md.pred[PRED_Nx2N].rdCost < interBest->rdCost) ? &md.pred[PRED_Nx2N] : interBest;<br>                         }<br>@@ -2346,7 +2333,7 @@ SplitData Analysis::compressInterCU_rd5_6(const CUData& parentCTU, const CUGeom&<br>                             refMasks[0] = splitData[0].splitRefs | splitData[1].splitRefs; /* top */<br>                             refMasks[1] = splitData[2].splitRefs | splitData[3].splitRefs; /* bot */<br>                             md.pred[PRED_2NxN].cu.initSubCU(parentCTU, cuGeom, qp);<br>-                            checkInter_rd5_6(md.pred[PRED_2NxN], cuGeom, SIZE_2NxN, refMasks);<br>+                            checkInter_rd5_6(md.pred[PRED_2NxN], cuGeom, SIZE_2NxN, refMasks, iMVCandList[SIZE_2NxN]);<br>                             checkBestMode(md.pred[PRED_2NxN], cuGeom.depth);<br>                             interBest = (md.pred[PRED_2NxN].rdCost < interBest->rdCost) ? &md.pred[PRED_2NxN] : interBest;<br>                         }<br>@@ -2462,62 +2449,50 @@ SplitData Analysis::compressInterCU_rd5_6(const CUData& parentCTU, const CUGeom&<br> <br>                 if (m_param->bEnableSCC)<br>                 {<br>-                    interBest = md.bestMode;<br>-                    bool intraBlockCopyFastSearch = (m_param->bEnableSCC == 1) ? true : false, bSkipIntraBlockCopySearch = false, bUse1DSearchFor8x8 = false, bValid;<br>-                    double intracost = MAX_DOUBLE;<br>+                    bool intraBlockCopyFastSearch = (m_param->bEnableSCC == 1) ? true : false, bUse1DSearchFor8x8 = false, bValid;<br>+                    md.pred[PRED_IBC_2Nx2N].cu.initSubCU(parentCTU, cuGeom, qp, ibc.m_lastIntraBCMv);<br>+                    checkIntraBC_rd5_6(md.pred[PRED_IBC_2Nx2N], cuGeom, SIZE_2Nx2N, false, bUse1DSearchFor8x8, ibc);<br>+                    checkBestMode(md.pred[PRED_IBC_2Nx2N], depth);<br> <br>-                    if (!bSkipIntraBlockCopySearch)<br>+                    if (intraBlockCopyFastSearch)<br>                     {<br>-                        md.pred[PRED_IBC_2Nx2N].cu.initSubCU(parentCTU, cuGeom, qp, ibc.m_lastIntraBCMv);<br>-                        checkIntraBC_rd5_6(md.pred[PRED_IBC_2Nx2N], cuGeom, SIZE_2Nx2N, false, bUse1DSearchFor8x8, &MV(0, 0), ibc);<br>-                        checkBestMode(md.pred[PRED_IBC_2Nx2N], depth);<br>-<br>-                        if (intraBlockCopyFastSearch)<br>+                        if ((int)depth == m_slice->m_sps->log2DiffMaxMinCodingBlockSize)<br>                         {<br>-                            if (depth == m_slice->m_sps->log2DiffMaxMinCodingBlockSize)<br>-                            {<br>-                                intracost = min(intracost, md.pred[PRED_IBC_2Nx2N].rdCost);<br>-                                double dTH2 = max(60 * m_rdCost.m_lambda, 56.0);<br>-                                double dTH3 = max(66 * m_rdCost.m_lambda, 800.0);<br>-<br>-                                md.pred[PRED_IBC_Nx2N].cu.initSubCU(parentCTU, cuGeom, qp, ibc.m_lastIntraBCMv);<br>-                                checkIntraBC_rd5_6(md.pred[PRED_IBC_Nx2N], cuGeom, SIZE_Nx2N, false, bUse1DSearchFor8x8, (iMVCandList[SIZE_Nx2N] + 8), ibc);<br>-                                checkBestMode(md.pred[PRED_IBC_Nx2N], depth);<br>-                                intracost = min(intracost, md.pred[PRED_IBC_Nx2N].rdCost);<br>-<br>-                                md.pred[PRED_MIXED_IBC_NX2N].cu.initSubCU(parentCTU, cuGeom, qp, ibc.m_lastIntraBCMv);<br>-                                bValid = predMixedIntraBCInterSearch(md.pred[PRED_MIXED_IBC_NX2N], cuGeom, m_csp != X265_CSP_I400 && m_frame->m_fencPic->m_picCsp != X265_CSP_I400, SIZE_Nx2N, false, iMVCandList[SIZE_Nx2N]);<br>-                                if (bValid)<br>-                                    encodeResAndCalcRdInterCU(md.pred[PRED_MIXED_IBC_NX2N], cuGeom);<br>-                                else<br>-                                    md.pred[PRED_MIXED_IBC_NX2N].rdCost = UINT64_MAX;<br>-                                checkBestMode(md.pred[PRED_MIXED_IBC_NX2N], depth);<br>-<br>-                                md.pred[PRED_IBC_2NxN].cu.initSubCU(parentCTU, cuGeom, qp, ibc.m_lastIntraBCMv);<br>-                                checkIntraBC_rd5_6(md.pred[PRED_IBC_2NxN], cuGeom, SIZE_2NxN, false, bUse1DSearchFor8x8, (iMVCandList[SIZE_2NxN] + 8), ibc);<br>-                                checkBestMode(md.pred[PRED_IBC_2NxN], depth);<br>-                                intracost = min(intracost, md.pred[PRED_IBC_2NxN].rdCost);<br>-<br>-                                md.pred[PRED_MIXED_IBC_2NXN].cu.initSubCU(parentCTU, cuGeom, qp, ibc.m_lastIntraBCMv);<br>-                                bValid = predMixedIntraBCInterSearch(md.pred[PRED_MIXED_IBC_2NXN], cuGeom, m_csp != X265_CSP_I400 && m_frame->m_fencPic->m_picCsp != X265_CSP_I400, SIZE_2NxN, false, iMVCandList[SIZE_2NxN]);<br>-                                if (bValid)<br>-                                    encodeResAndCalcRdInterCU(md.pred[PRED_MIXED_IBC_2NXN], cuGeom);<br>-                                else<br>-                                    md.pred[PRED_MIXED_IBC_2NXN].rdCost = UINT64_MAX;<br>-                                checkBestMode(md.pred[PRED_MIXED_IBC_2NXN], depth);<br>-                            }<br>-                        }<br>-                        else // full search<br>-                        {<br>-                            md.pred[PRED_IBC_2NxN].cu.initSubCU(parentCTU, cuGeom, qp);<br>-                            checkIntraBC_rd5_6(md.pred[PRED_IBC_2NxN], cuGeom, SIZE_2NxN, false, bUse1DSearchFor8x8, &MV(0, 0), ibc);<br>+                            md.pred[PRED_IBC_Nx2N].cu.initSubCU(parentCTU, cuGeom, qp, ibc.m_lastIntraBCMv);<br>+                            checkIntraBC_rd5_6(md.pred[PRED_IBC_Nx2N], cuGeom, SIZE_Nx2N, false, bUse1DSearchFor8x8, ibc, (iMVCandList[SIZE_Nx2N] + 8));<br>+                            checkBestMode(md.pred[PRED_IBC_Nx2N], depth);<br>+<br>+                            md.pred[PRED_MIXED_IBC_NX2N].cu.initSubCU(parentCTU, cuGeom, qp, ibc.m_lastIntraBCMv);<br>+                            bValid = predMixedIntraBCInterSearch(md.pred[PRED_MIXED_IBC_NX2N], cuGeom, m_csp != X265_CSP_I400 && m_frame->m_fencPic->m_picCsp != X265_CSP_I400, SIZE_Nx2N, iMVCandList[SIZE_Nx2N]);<br>+                            if (bValid)<br>+                                encodeResAndCalcRdInterCU(md.pred[PRED_MIXED_IBC_NX2N], cuGeom);<br>+                            else<br>+                                md.pred[PRED_MIXED_IBC_NX2N].rdCost = UINT64_MAX;<br>+                            checkBestMode(md.pred[PRED_MIXED_IBC_NX2N], depth);<br>+<br>+                            md.pred[PRED_IBC_2NxN].cu.initSubCU(parentCTU, cuGeom, qp, ibc.m_lastIntraBCMv);<br>+                            checkIntraBC_rd5_6(md.pred[PRED_IBC_2NxN], cuGeom, SIZE_2NxN, false, bUse1DSearchFor8x8, ibc, (iMVCandList[SIZE_2NxN] + 8));<br>                             checkBestMode(md.pred[PRED_IBC_2NxN], depth);<br> <br>-                            md.pred[PRED_IBC_Nx2N].cu.initSubCU(parentCTU, cuGeom, qp);<br>-                            checkIntraBC_rd5_6(md.pred[PRED_IBC_Nx2N], cuGeom, SIZE_Nx2N, false, bUse1DSearchFor8x8, &MV(0, 0), ibc);<br>-                            checkBestMode(md.pred[PRED_IBC_Nx2N], depth);<br>+                            md.pred[PRED_MIXED_IBC_2NXN].cu.initSubCU(parentCTU, cuGeom, qp, ibc.m_lastIntraBCMv);<br>+                            bValid = predMixedIntraBCInterSearch(md.pred[PRED_MIXED_IBC_2NXN], cuGeom, m_csp != X265_CSP_I400 && m_frame->m_fencPic->m_picCsp != X265_CSP_I400, SIZE_2NxN, iMVCandList[SIZE_2NxN]);<br>+                            if (bValid)<br>+                                encodeResAndCalcRdInterCU(md.pred[PRED_MIXED_IBC_2NXN], cuGeom);<br>+                            else<br>+                                md.pred[PRED_MIXED_IBC_2NXN].rdCost = UINT64_MAX;<br>+                            checkBestMode(md.pred[PRED_MIXED_IBC_2NXN], depth);<br>                         }<br>                     }<br>+                    else // full search<br>+                    {<br>+                        md.pred[PRED_IBC_2NxN].cu.initSubCU(parentCTU, cuGeom, qp);<br>+                        checkIntraBC_rd5_6(md.pred[PRED_IBC_2NxN], cuGeom, SIZE_2NxN, false, bUse1DSearchFor8x8, ibc, (iMVCandList[SIZE_2NxN] + 8));<br>+                        checkBestMode(md.pred[PRED_IBC_2NxN], depth);<br>+<br>+                        md.pred[PRED_IBC_Nx2N].cu.initSubCU(parentCTU, cuGeom, qp);<br>+                        checkIntraBC_rd5_6(md.pred[PRED_IBC_Nx2N], cuGeom, SIZE_Nx2N, false, bUse1DSearchFor8x8, ibc, (iMVCandList[SIZE_Nx2N] + 8));<br>+                        checkBestMode(md.pred[PRED_IBC_Nx2N], depth);<br>+                    }<br>                 }<br> <br>                 if ((m_slice->m_sliceType != B_SLICE || m_param->bIntraInBFrames) && (cuGeom.log2CUSize != MAX_LOG2_CU_SIZE) && !((m_param->bCTUInfo & 4) && bCtuInfoCheck))<br>@@ -3477,7 +3452,7 @@ void Analysis::checkInter_rd0_4(Mode& interMode, const CUGeom& cuGeom, PartSize<br>     }<br> }<br> <br>-void Analysis::checkInter_rd5_6(Mode& interMode, const CUGeom& cuGeom, PartSize partSize, uint32_t refMask[2])<br>+void Analysis::checkInter_rd5_6(Mode& interMode, const CUGeom& cuGeom, PartSize partSize, uint32_t refMask[2], MV* iMVCandList)<br> {<br>     interMode.initCosts();<br>     interMode.cu.setPartSizeSubParts(partSize);<br>@@ -3514,7 +3489,7 @@ void Analysis::checkInter_rd5_6(Mode& interMode, const CUGeom& cuGeom, PartSize<br>         }<br>     }<br> <br>-    predInterSearch(interMode, cuGeom, m_csp != X265_CSP_I400 && m_frame->m_fencPic->m_picCsp != X265_CSP_I400, refMask);<br>+    predInterSearch(interMode, cuGeom, m_csp != X265_CSP_I400 && m_frame->m_fencPic->m_picCsp != X265_CSP_I400, refMask, iMVCandList);<br> <br>     /* predInterSearch sets interMode.sa8dBits, but this is ignored */<br>     encodeResAndCalcRdInterCU(interMode, cuGeom);<br>@@ -3534,7 +3509,7 @@ void Analysis::checkInter_rd5_6(Mode& interMode, const CUGeom& cuGeom, PartSize<br>     }<br> }<br> <br>-void Analysis::checkIntraBC_rd5_6(Mode& intraBCMode, const CUGeom& cuGeom, PartSize ePartSize, bool testOnlyPred, bool bUse1DSearchFor8x8, MV* iMVCandList, IBC& ibc)<br>+void Analysis::checkIntraBC_rd5_6(Mode& intraBCMode, const CUGeom& cuGeom, PartSize ePartSize, bool testOnlyPred, bool bUse1DSearchFor8x8, IBC& ibc, MV* iMVCandList)<br> {<br>     intraBCMode.initCosts();<br>     intraBCMode.cu.setPartSizeSubParts(ePartSize);<br>@@ -4210,36 +4185,3 @@ int Analysis::findSameContentRefCount(const CUData& parentCTU, const CUGeom& cuG<br>     return sameContentRef;<br> }<br> <br>-int Analysis::CalculateMinimumHVLumaActivity(const CUGeom & cuGeom, const uint32_t uiAbsPartIdx, Yuv ppcOrigYuv)<br>-{<br>-    Yuv * pOrgYuv = &ppcOrigYuv;<br>-    const int      stride = pOrgYuv->m_size;<br>-    const int      width = 1 << cuGeom.log2CUSize;<br>-    const int      height = 1 << cuGeom.log2CUSize;<br>-<br>-    // Get activity<br>-    int hAct = 0;<br>-    const pixel * pY = pOrgYuv->getLumaAddr(uiAbsPartIdx);<br>-    for (int y = 0; y < height; y++)<br>-    {<br>-        for (int x = 1; x < width; x++)<br>-        {<br>-            hAct += abs(pY[x] - pY[x - 1]);<br>-        }<br>-        pY += stride;<br>-    }<br>-<br>-    int vAct = 0;<br>-    pY = pOrgYuv->getLumaAddr(0) + stride;<br>-    for (int y = 1; y < height; y++)<br>-    {<br>-        for (int x = 0; x < width; x++)<br>-        {<br>-            vAct += abs(pY[x] - pY[x - stride]);<br>-        }<br>-        pY += stride;<br>-    }<br>-<br>-    return min(hAct, vAct);<br>-}<br>-<br>diff --git a/source/encoder/analysis.h b/source/encoder/analysis.h<br>index e672d3554..7f4f1c988 100644<br>--- a/source/encoder/analysis.h<br>+++ b/source/encoder/analysis.h<br>@@ -128,7 +128,6 @@ public:<br>     Mode& compressCTU(CUData& ctu, Frame& frame, const CUGeom& cuGeom, const Entropy& initialContext);<br>     int32_t loadTUDepth(CUGeom cuGeom, CUData parentCTU);<br> <br>-    static int CalculateMinimumHVLumaActivity(const CUGeom& cuGeom, const uint32_t uiAbsPartIdx, Yuv ppcOrigYuv);<br> protected:<br>     /* Analysis data for save/load mode, writes/reads data based on absPartIdx */<br>     x265_analysis_inter_data*  m_reuseInterDataCTU;<br>@@ -186,12 +185,12 @@ protected:<br> <br>     /* measure inter options */<br>     void checkInter_rd0_4(Mode& interMode, const CUGeom& cuGeom, PartSize partSize, uint32_t refmask[2]);<br>-    void checkInter_rd5_6(Mode& interMode, const CUGeom& cuGeom, PartSize partSize, uint32_t refmask[2]);<br>+    void checkInter_rd5_6(Mode& interMode, const CUGeom& cuGeom, PartSize partSize, uint32_t refmask[2], MV* iMVCandList = NULL);<br> <br>     void checkBidir2Nx2N(Mode& inter2Nx2N, Mode& bidir2Nx2N, const CUGeom& cuGeom);<br> <br>     void checkRDCostIntraBCMerge2Nx2N(Mode& merge, const CUGeom& cuGeom);<br>-    void checkIntraBC_rd5_6(Mode& intraBCMode, const CUGeom& cuGeom, PartSize ePartSize, bool testOnlyPred, bool bUse1DSearchFor8x8, MV* iMVCandList ,IBC& ibc);<br>+    void checkIntraBC_rd5_6(Mode& intraBCMode, const CUGeom& cuGeom, PartSize ePartSize, bool testOnlyPred, bool bUse1DSearchFor8x8, IBC& ibc, MV* iMVCandList = NULL);<br> <br>     /* encode current bestMode losslessly, pick best RD cost */<br>     void tryLossless(const CUGeom& cuGeom);<br>diff --git a/source/encoder/search.cpp b/source/encoder/search.cpp<br>index f72ea8c9c..4fd3b21b1 100644<br>--- a/source/encoder/search.cpp<br>+++ b/source/encoder/search.cpp<br>@@ -2186,7 +2186,7 @@ void Search::searchMV(Mode& interMode, int list, int ref, MV& outmv, MV mvp[3],<br>     }<br> }<br> /* find the best inter prediction for each PU of specified mode */<br>-void Search::predInterSearch(Mode& interMode, const CUGeom& cuGeom, bool bChromaMC, uint32_t refMasks[2])<br>+void Search::predInterSearch(Mode& interMode, const CUGeom& cuGeom, bool bChromaMC, uint32_t refMasks[2], MV* iMVCandList)<br> {<br>     ProfileCUScope(interMode.cu, motionEstimationElapsedTime, countMotionEstimate);<br> <br>@@ -2473,6 +2473,11 @@ void Search::predInterSearch(Mode& interMode, const CUGeom& cuGeom, bool bChroma<br>                     /* Refine MVP selection, updates: mvpIdx, bits, cost */<br>                     mvp = checkBestMVP(amvp, outmv, mvpIdx, bits, cost);<br> <br>+                    if (list <= 1 && ref <= 1 && (cu.m_partSize[0] == SIZE_2NxN || cu.m_partSize[0] == SIZE_Nx2N) && (1 << cu.m_log2CUSize[0]) <= 16)<br>+                    {<br>+                        iMVCandList[4 * list + 2 * ref + puIdx] = outmv;<br>+                    }<br>+<br>                     if (cost < bestME[list].cost)<br>                     {<br>                         bestME[list].mv      = outmv;<br>@@ -2822,7 +2827,7 @@ uint32_t Search::mergeCandLists(MV* dst, uint32_t dn, MV* src, uint32_t sn, bool<br>         {<br>             TempMv <<= 2;<br>         }<br>-        for (int j = 0; j < dn; j++)<br>+        for (uint32_t j = 0; j < dn; j++)<br>         {<br>             if (TempMv == dst[j])<br>             {<br>@@ -2840,7 +2845,7 @@ uint32_t Search::mergeCandLists(MV* dst, uint32_t dn, MV* src, uint32_t sn, bool<br>     return dn;<br> }<br> <br>-void Search::restrictBipredMergeCand(CUData* cu, uint32_t puIdx, MVField(*mvFieldNeighbours)[2], uint8_t* interDirNeighbours, int numValidMergeCand)<br>+void Search::restrictBipredMergeCand(CUData* cu, uint32_t puIdx, MVField(*mvFieldNeighbours)[2], uint8_t* interDirNeighbours, uint32_t numValidMergeCand)<br> {<br>     {<br>         for (uint32_t mergeCand = 0; mergeCand < numValidMergeCand; ++mergeCand)<br>@@ -2954,6 +2959,7 @@ bool Search::isValidIntraBCSearchArea(CUData* cu, int predX, int predY, int roiW<br>     {<br>         return false;<br>     }<br>+    return true;<br> }<br> <br> void Search::intraPatternSearch(Mode& intraBCMode, const CUGeom& cuGeom, int puIdx, uint32_t partAddr, pixel* refY, int refStride, MV* searchRangeLT, MV* searchRangeRB,<br>@@ -2977,7 +2983,6 @@ void Search::intraPatternSearch(Mode& intraBCMode, const CUGeom& cuGeom, int puI<br>     int         bestX = 0;<br>     int         bestY = 0;<br>     pixel* refSrch;<br>-    pixel* origPic;<br> <br>     int         bestCandIdx = 0;<br>     uint32_t    partOffset = 0;<br>@@ -2997,6 +3002,7 @@ void Search::intraPatternSearch(Mode& intraBCMode, const CUGeom& cuGeom, int puI<br>     const int chromaROIWidthInPixels = roiWidth;<br>     const int chromaROIHeightInPixels = roiHeight;<br>     bool fastsearch = (m_param->bEnableSCC == 1) ? true : false;<br>+    bool  isFullFrameSearchrangeEnabled = false; // disabled by default<br> <br>     if (fastsearch)<br>     {<br>@@ -3005,7 +3011,7 @@ void Search::intraPatternSearch(Mode& intraBCMode, const CUGeom& cuGeom, int puI<br>         const uint32_t picWidth = m_slice->m_sps->picWidthInLumaSamples;<br>         const uint32_t picHeight = m_slice->m_sps->picHeightInLumaSamples;<br> <br>-        if (1)//full frame search<br>+        if (isFullFrameSearchrangeEnabled)//full frame search<br>         {<br>             srLeft = -1 * cuPelX;<br>             srTop = -1 * cuPelY;<br>@@ -3013,11 +3019,11 @@ void Search::intraPatternSearch(Mode& intraBCMode, const CUGeom& cuGeom, int puI<br>             srRight = picWidth - cuPelX - roiWidth;<br>             srBottom = lcuHeight - cuPelY % lcuHeight - roiHeight;<br> <br>-            if (cuPelX + srRight + roiWidth > picWidth)<br>+            if (cuPelX + srRight + roiWidth > (int)picWidth)<br>             {<br>                 srRight = picWidth % lcuWidth - cuPelX % lcuWidth - roiWidth;<br>             }<br>-            if (cuPelY + srBottom + roiHeight > picHeight)<br>+            if (cuPelY + srBottom + roiHeight > (int)picHeight)<br>             {<br>                 srBottom = picHeight % lcuHeight - cuPelY % lcuHeight - roiHeight;<br>             }<br>@@ -3035,7 +3041,7 @@ void Search::intraPatternSearch(Mode& intraBCMode, const CUGeom& cuGeom, int puI<br>         cu.getIntraBCMVPsEncOnly(partAddr, mvPredEncOnly, nbPreds, puIdx);<br>         ibc.m_numBVs = mergeCandLists(ibc.m_BVs, ibc.m_numBVs, mvPredEncOnly, nbPreds, true);<br> <br>-        for (uint32_t cand = 0; cand < ibc.m_numBVs; cand++)<br>+        for (int cand = 0; cand < ibc.m_numBVs; cand++)<br>         {<br>             int xPred = ibc.m_BVs[cand].x >> 2;<br>             int yPred = ibc.m_BVs[cand].y >> 2;<br>@@ -3045,13 +3051,13 @@ void Search::intraPatternSearch(Mode& intraBCMode, const CUGeom& cuGeom, int puI<br>                 int tempX = xPred + relCUPelX + roiWidth - 1;<br>                 bool validCand = isValidIntraBCSearchArea(&cu, xPred, yPred, chromaROIWidthInPixels, chromaROIHeightInPixels, partOffset);<br> <br>-                if ((tempX >= (int)lcuWidth) && (tempY >= 0) && 1)<br>+                if ((tempX >= (int)lcuWidth) && (tempY >= 0) && isFullFrameSearchrangeEnabled)<br>                     validCand = false;<br> <br>                 if ((tempX >= 0) && (tempY >= 0))<br>                 {<br>                     int tempRasterIdx = (tempY / 4) * cu.s_numPartInCUSize + (tempX / 4);<br>-                    int tempZscanIdx = g_rasterToZscan[tempRasterIdx];<br>+                    uint32_t tempZscanIdx = g_rasterToZscan[tempRasterIdx];<br>                     if (tempZscanIdx >= cu.m_absIdxInCTU)<br>                     {<br>                         validCand = false;<br>@@ -3064,9 +3070,6 @@ void Search::intraPatternSearch(Mode& intraBCMode, const CUGeom& cuGeom, int puI<br> <br>                     refSrch = refY + yPred * refStride + xPred;<br> <br>-                    const pixel* curr = intraBCMode.fencYuv->getLumaAddr(partAddr);<br>-                    intptr_t currStride = intraBCMode.fencYuv->m_size;<br>-<br>                     sad += m_me.bufSAD(refSrch, refStride);<br>                     if (sad > sadBestCand[CHROMA_REFINEMENT_CANDIDATES - 1])<br>                     {<br>@@ -3089,8 +3092,8 @@ void Search::intraPatternSearch(Mode& intraBCMode, const CUGeom& cuGeom, int puI<br>         }<br> <br>         const int boundY = (0 - roiHeight - puPelOffsetY);<br>-        int lowY = ((cu.m_partSize[partAddr] == SCM_S0067_IBC_FULL_1D_SEARCH_FOR_PU) && 1)<br>-            ? -cuPelY : max(srchRngVerTop, 0 - cuPelY);<br>+        int lowY = ((cu.m_partSize[partAddr] == SCM_S0067_IBC_FULL_1D_SEARCH_FOR_PU) && isFullFrameSearchrangeEnabled)<br>+            ? -cuPelY : X265_MAX(srchRngVerTop, 0 - cuPelY);<br>         for (int y = boundY; y >= lowY; y--)<br>         {<br>             if (!isValidIntraBCSearchArea(&cu, 0, y, chromaROIWidthInPixels, chromaROIHeightInPixels, partOffset))<br>@@ -3102,8 +3105,6 @@ void Search::intraPatternSearch(Mode& intraBCMode, const CUGeom& cuGeom, int puI<br> <br>             refSrch = refY + y * refStride;<br> <br>-            const pixel* curr = intraBCMode.fencYuv->getLumaAddr(partAddr);<br>-            intptr_t currStride = intraBCMode.fencYuv->m_size;<br>             sad += m_me.bufSAD(refSrch, refStride);<br>             if (sad > sadBestCand[CHROMA_REFINEMENT_CANDIDATES - 1])<br>             {<br>@@ -3125,8 +3126,8 @@ void Search::intraPatternSearch(Mode& intraBCMode, const CUGeom& cuGeom, int puI<br>             }<br>         }<br> <br>-        const int boundX = ((cu.m_partSize[partAddr] == SCM_S0067_IBC_FULL_1D_SEARCH_FOR_PU) && 1)<br>-            ? -cuPelX : max(srchRngHorLeft, -cuPelX);<br>+        const int boundX = ((cu.m_partSize[partAddr] == SCM_S0067_IBC_FULL_1D_SEARCH_FOR_PU) && isFullFrameSearchrangeEnabled)<br>+            ? -cuPelX : X265_MAX(srchRngHorLeft, -cuPelX);<br>         for (int x = 0 - roiWidth - puPelOffsetX; x >= boundX; --x)<br>         {<br>             if (!isValidIntraBCSearchArea(&cu, x, 0, chromaROIWidthInPixels, chromaROIHeightInPixels, partOffset))<br>@@ -3137,9 +3138,6 @@ void Search::intraPatternSearch(Mode& intraBCMode, const CUGeom& cuGeom, int puI<br>             sad = m_me.mvcost(MV(x, 0));<br> <br>             refSrch = refY + x;<br>-<br>-            const pixel* curr = intraBCMode.fencYuv->getLumaAddr(partAddr);<br>-            intptr_t currStride = intraBCMode.fencYuv->m_size;<br>             sad += m_me.bufSAD(refSrch, refStride);<br> <br>             if (sad > sadBestCand[CHROMA_REFINEMENT_CANDIDATES - 1])<br>@@ -3180,20 +3178,20 @@ void Search::intraPatternSearch(Mode& intraBCMode, const CUGeom& cuGeom, int puI<br>             return;<br>         }<br> <br>-        if (cuGeom.depth > 2 && bUse1DSearchFor8x8)<br>+        if (cuGeom.depth > 2 && !bUse1DSearchFor8x8)<br>         {<br>-            for (int y = max(srchRngVerTop, -cuPelY); y <= srchRngVerBottom; y += 2)<br>+            for (int y = X265_MAX(srchRngVerTop, -cuPelY); y <= srchRngVerBottom; y += 2)<br>             {<br>-                if ((y == 0) || ((int)(cuPelY + y + roiHeight) >= picHeight))<br>+                if ((y == 0) || ((int)(cuPelY + y + roiHeight) >= (int)picHeight))<br>                 {<br>                     continue;<br>                 }<br> <br>                 int tempY = y + relCUPelY + roiHeight - 1;<br> <br>-                for (int x = max(srchRngHorLeft, -cuPelX); x <= srchRngHorRight; x++)<br>+                for (int x = X265_MAX(srchRngHorLeft, -cuPelX); x <= srchRngHorRight; x++)<br>                 {<br>-                    if ((x == 0) || ((int)(cuPelX + x + roiWidth) >= picWidth))<br>+                    if ((x == 0) || ((int)(cuPelX + x + roiWidth) >= (int)picWidth))<br>                     {<br>                         continue;<br>                     }<br>@@ -3203,7 +3201,7 @@ void Search::intraPatternSearch(Mode& intraBCMode, const CUGeom& cuGeom, int puI<br>                     if ((tempX >= 0) && (tempY >= 0))<br>                     {<br>                         int iTempRasterIdx = (tempY / 4) * cu.s_numPartInCUSize + (tempX / 4);<br>-                        int iTempZscanIdx = g_rasterToZscan[iTempRasterIdx];<br>+                        uint32_t iTempZscanIdx = g_rasterToZscan[iTempRasterIdx];<br>                         if (iTempZscanIdx >= cu.m_absIdxInCTU)<br>                         {<br>                             continue;<br>@@ -3218,9 +3216,6 @@ void Search::intraPatternSearch(Mode& intraBCMode, const CUGeom& cuGeom, int puI<br>                     sad = m_me.mvcost(MV(x, y));<br> <br>                     refSrch = refY + y * refStride + x;<br>-<br>-                    const pixel* curr = intraBCMode.fencYuv->getLumaAddr(partAddr);<br>-                    intptr_t currStride = intraBCMode.fencYuv->m_size;<br>                     sad += m_me.bufSAD(refSrch, refStride);<br> <br>                     intraBCSearchMVCandUpdate(sad, x, y, sadBestCand, MVCand);<br>@@ -3244,18 +3239,18 @@ void Search::intraPatternSearch(Mode& intraBCMode, const CUGeom& cuGeom, int puI<br>                 return;<br>             }<br> <br>-            for (int y = (max(srchRngVerTop, -cuPelY) + 1); y <= srchRngVerBottom; y += 2)<br>+            for (int y = (X265_MAX(srchRngVerTop, -cuPelY) + 1); y <= srchRngVerBottom; y += 2)<br>             {<br>-                if ((y == 0) || ((int)(cuPelY + y + roiHeight) >= picHeight))<br>+                if ((y == 0) || ((int)(cuPelY + y + roiHeight) >= (int)picHeight))<br>                 {<br>                     continue;<br>                 }<br> <br>                 int tempY = y + relCUPelY + roiHeight - 1;<br> <br>-                for (int x = max(srchRngHorLeft, -cuPelX); x <= srchRngHorRight; x += 2)<br>+                for (int x = X265_MAX(srchRngHorLeft, -cuPelX); x <= srchRngHorRight; x += 2)<br>                 {<br>-                    if ((x == 0) || ((int)(cuPelX + x + roiWidth) >= picWidth))<br>+                    if ((x == 0) || ((int)(cuPelX + x + roiWidth) >= (int)picWidth))<br>                     {<br>                         continue;<br>                     }<br>@@ -3265,7 +3260,7 @@ void Search::intraPatternSearch(Mode& intraBCMode, const CUGeom& cuGeom, int puI<br>                     if ((tempX >= 0) && (tempY >= 0))<br>                     {<br>                         int tempRasterIdx = (tempY / 4) * cu.s_numPartInCUSize + (tempX / 4);<br>-                        int tempZscanIdx = g_rasterToZscan[tempRasterIdx];<br>+                        uint32_t tempZscanIdx = g_rasterToZscan[tempRasterIdx];<br>                         if (tempZscanIdx >= cu.m_absIdxInCTU)<br>                         {<br>                             continue;<br>@@ -3280,9 +3275,6 @@ void Search::intraPatternSearch(Mode& intraBCMode, const CUGeom& cuGeom, int puI<br>                     sad = m_me.mvcost(MV(x, y));<br> <br>                     refSrch = refY + y * refStride + x;<br>-<br>-                    const pixel* curr = intraBCMode.fencYuv->getLumaAddr(partAddr);<br>-                    intptr_t currStride = intraBCMode.fencYuv->m_size;<br>                     sad += m_me.bufSAD(refSrch, refStride);<br> <br>                     if (sad > sadBestCand[CHROMA_REFINEMENT_CANDIDATES - 1])<br>@@ -3328,19 +3320,19 @@ void Search::intraPatternSearch(Mode& intraBCMode, const CUGeom& cuGeom, int puI<br>             tempSadBest = sadBestCand[0];<br> <br> <br>-            for (int y = (max(srchRngVerTop, -cuPelY) + 1); y <= srchRngVerBottom; y += 2)<br>+            for (int y = (X265_MAX(srchRngVerTop, -cuPelY) + 1); y <= srchRngVerBottom; y += 2)<br>             {<br>-                if ((y == 0) || ((int)(cuPelY + y + roiHeight) >= picHeight))<br>+                if ((y == 0) || ((int)(cuPelY + y + roiHeight) >= (int)picHeight))<br>                 {<br>                     continue;<br>                 }<br> <br>                 int tempY = y + relCUPelY + roiHeight - 1;<br> <br>-                for (int x = (max(srchRngHorLeft, -cuPelX) + 1); x <= srchRngHorRight; x += 2)<br>+                for (int x = (X265_MAX(srchRngHorLeft, -cuPelX) + 1); x <= srchRngHorRight; x += 2)<br>                 {<br> <br>-                    if ((x == 0) || ((int)(cuPelX + x + roiWidth) >= picWidth))<br>+                    if ((x == 0) || ((int)(cuPelX + x + roiWidth) >= (int)picWidth))<br>                     {<br>                         continue;<br>                     }<br>@@ -3350,7 +3342,7 @@ void Search::intraPatternSearch(Mode& intraBCMode, const CUGeom& cuGeom, int puI<br>                     if ((tempX >= 0) && (tempY >= 0))<br>                     {<br>                         int tempRasterIdx = (tempY / 4) * cu.s_numPartInCUSize + (tempX / 4);<br>-                        int tempZscanIdx = g_rasterToZscan[tempRasterIdx];<br>+                        uint32_t tempZscanIdx = g_rasterToZscan[tempRasterIdx];<br>                         if (tempZscanIdx >= cu.m_absIdxInCTU)<br>                         {<br>                             continue;<br>@@ -3365,9 +3357,6 @@ void Search::intraPatternSearch(Mode& intraBCMode, const CUGeom& cuGeom, int puI<br>                     sad = m_me.mvcost(MV(x, y));<br> <br>                     refSrch = refY + y * refStride + x;<br>-<br>-                    const pixel* curr = intraBCMode.fencYuv->getLumaAddr(partAddr);<br>-                    intptr_t currStride = intraBCMode.fencYuv->m_size;<br>                     sad += m_me.bufSAD(refSrch, refStride);<br>                     if (sad > sadBestCand[CHROMA_REFINEMENT_CANDIDATES - 1])<br>                     {<br>@@ -3400,7 +3389,7 @@ void Search::intraPatternSearch(Mode& intraBCMode, const CUGeom& cuGeom, int puI<br> <br>         for (int y = srchRngVerBottom; y >= srchRngVerTop; y--)<br>         {<br>-            if (((int)(cuPelY + y) < 0) || ((int)(cuPelY + y + roiHeight) >= picHeight))<br>+            if (((int)(cuPelY + y) < 0) || ((int)(cuPelY + y + roiHeight) >= (int)picHeight))<br>             {<br>                 refY -= refStride;<br>                 continue;<br>@@ -3409,7 +3398,7 @@ void Search::intraPatternSearch(Mode& intraBCMode, const CUGeom& cuGeom, int puI<br>             for (int x = srchRngHorLeft; x <= srchRngHorRight; x++)<br>             {<br> <br>-                if (((int)(cuPelX + x) < 0) || ((int)(cuPelX + x + roiWidth) >= picWidth))<br>+                if (((int)(cuPelX + x) < 0) || ((int)(cuPelX + x + roiWidth) >= (int)picWidth))<br>                 {<br>                     continue;<br>                 }<br>@@ -3419,7 +3408,7 @@ void Search::intraPatternSearch(Mode& intraBCMode, const CUGeom& cuGeom, int puI<br>                 if ((tempX >= 0) && (tempY >= 0))<br>                 {<br>                     int iTempRasterIdx = (tempY / 4) * cu.s_numPartInCUSize + (tempX / 4);<br>-                    int iTempZscanIdx = g_rasterToZscan[iTempRasterIdx];<br>+                    uint32_t iTempZscanIdx = g_rasterToZscan[iTempRasterIdx];<br>                     if (iTempZscanIdx >= cu.m_absIdxInCTU)<br>                     {<br>                         continue;<br>@@ -3477,8 +3466,8 @@ void Search::setIntraSearchRange(Mode& intraBCMode, MV& pred, int puIdx, int roi<br> <br>     const uint32_t picWidth = m_slice->m_sps->picWidthInLumaSamples;<br>     const uint32_t picHeight = m_slice->m_sps->picHeightInLumaSamples;<br>-<br>-    if (cu.m_cuDepth[0] == 2 && cu.m_partSize[0] == SIZE_2Nx2N && m_param->bEnableSCC == 2)// full frame search<br>+    bool  isFullFrameSearchrangeEnabled = false; // disabled by default<br>+    if (cu.m_cuDepth[0] == 2 && cu.m_partSize[0] == SIZE_2Nx2N && isFullFrameSearchrangeEnabled)// full frame search<br>     {<br>         srLeft = -1 * cuPelX;<br>         srTop = -1 * cuPelY;<br>@@ -3488,7 +3477,14 @@ void Search::setIntraSearchRange(Mode& intraBCMode, MV& pred, int puIdx, int roi<br>     }<br>     else<br>     {<br>-        uint32_t maxXsr = cuPelX % lcuWidth;<br>+        const uint32_t searchWidthInCTUs = cu.m_cuDepth[0] == 3 ? 1 : (isFullFrameSearchrangeEnabled) ? -1 : 1;<br>+        uint32_t width = 0, maxWidth = searchWidthInCTUs * lcuWidth;<br>+        for (const CUData* pTestCU = cu.m_cuLeft;<br>+            width < maxWidth && pTestCU != NULL && pTestCU->m_slice != NULL;<br>+            pTestCU = pTestCU->m_cuLeft, width += lcuWidth)<br>+        {<br>+        }<br>+        uint32_t maxXsr = (cuPelX % lcuWidth) + X265_MIN(maxWidth, width);<br>         uint32_t maxYsr = cuPelY % lcuHeight;<br> <br>         if (cu.m_chromaFormat == X265_CSP_I420 || cu.m_chromaFormat == X265_CSP_I422) maxXsr &= ~0x4;<br>@@ -3532,26 +3528,8 @@ void Search::intraBlockCopyEstimate(Mode& intraBCMode, const CUGeom& cuGeom, int<br>     const MV predictors = *pred;<br> <br>     CUData& cu = intraBCMode.cu;<br>-    const Yuv* fencYuv = intraBCMode.fencYuv;<br>     cu.getPartIndexAndSize(puIdx, partAddr, roiWidth, roiHeight);<br> <br>-    /* calculate the location of upper-left corner pixel and size of the current PU */<br>-    int xP, yP, nPSW, nPSH;<br>-<br>-    int cuSize = 1 << cu.m_log2CUSize[0];<br>-    int partMode = cu.m_partSize[0];<br>-<br>-    int tmp = partTable[partMode][puIdx][0];<br>-    nPSW = ((tmp >> 4) * cuSize) >> 2;<br>-    nPSH = ((tmp & 0xF) * cuSize) >> 2;<br>-<br>-    tmp = partTable[partMode][puIdx][1];<br>-    xP = ((tmp >> 4) * cuSize) >> 2;<br>-    yP = ((tmp & 0xF) * cuSize) >> 2;<br>-<br>-    assert(nPSW == roiWidth);<br>-    assert(nPSH == roiHeight);<br>-<br>     int ref = m_slice->m_numRefIdx[0] - 1;<br>     pixel* refY = m_slice->m_refFrameList[0][ref]->m_reconPic[1]->getLumaAddr(cu.m_cuAddr, cu.m_absIdxInCTU + partAddr);<br>     int  strideY = m_slice->m_refFrameList[0][ref]->m_reconPic[1]->m_stride;<br>@@ -3570,10 +3548,12 @@ bool Search::predIntraBCSearch(Mode& intraBCMode, const CUGeom& cuGeom, bool bCh<br>     Yuv* predYuv = &intraBCMode.predYuv;<br>     Yuv& tmpPredYuv = m_rqt[cuGeom.depth].tmpPredYuv;<br>     int  numPart = cu.getNumPartInter(0);<br>+    int log2ParallelMergeLevelMinus2 = 0;<br> <br>+    // 12 mv candidates including lowresMV<br>     MV mvc[(MD_ABOVE_LEFT + 1) * 2 + 2];<br> <br>-    if (m_param->bEnableSCC == 1 && cuGeom.depth < 1) // fast search<br>+    if (m_param->bEnableSCC == 1 && (1 << cu.m_log2CUSize[0]) > SCM_S0067_MAX_CAND_SIZE) // fast search<br>         return false;<br> <br>     uint32_t totalCost = 0;<br>@@ -3583,19 +3563,17 @@ bool Search::predIntraBCSearch(Mode& intraBCMode, const CUGeom& cuGeom, bool bCh<br>         uint32_t partAddr = 0;<br>         MotionData* bestME = intraBCMode.bestME[puIdx];<br>         PredictionUnit pu(cu, cuGeom, puIdx);<br>-        MV  mv, mvd, mvPred[2];<br>+        MV  mv, mvPred[2];<br>         cu.getPartIndexAndSize(puIdx, pu.puAbsPartIdx, width, height);<br>         partAddr = pu.puAbsPartIdx;<br>-        bool bChromaMC = 1;<br>         m_me.setSourcePU(*intraBCMode.fencYuv, pu.ctuAddr, pu.cuAbsPartIdx, pu.puAbsPartIdx, pu.width, pu.height, m_param->searchMethod, m_param->subpelRefine, bChromaMC);<br> <br>         cu.getNeighbourMV(puIdx, pu.puAbsPartIdx, intraBCMode.interNeighbours);<br>-        int numMvc = cu.getPMV(intraBCMode.interNeighbours, 0, m_slice->m_numRefIdx[0] - 1, intraBCMode.amvpCand[0][m_slice->m_numRefIdx[0] - 1], mvc);<br>+        cu.getPMV(intraBCMode.interNeighbours, 0, m_slice->m_numRefIdx[0] - 1, intraBCMode.amvpCand[0][m_slice->m_numRefIdx[0] - 1], mvc, puIdx, pu.puAbsPartIdx);<br> <br>         mvPred[0].set(intraBCMode.amvpCand[0][m_slice->m_numRefIdx[0] - 1][0].x >> 2, intraBCMode.amvpCand[0][m_slice->m_numRefIdx[0] - 1][0].y >> 2);<br>         mvPred[1].set(intraBCMode.amvpCand[0][m_slice->m_numRefIdx[0] - 1][1].x >> 2, intraBCMode.amvpCand[0][m_slice->m_numRefIdx[0] - 1][1].y >> 2);<br> <br>-        MVField mvField;<br>         uint32_t cost;<br>         mv.set(0, 0);<br>         intraBlockCopyEstimate(intraBCMode, cuGeom, puIdx, mvPred, mv, cost, testOnlyPred, bUse1DSearchFor8x8, ibc);<br>@@ -3612,7 +3590,6 @@ bool Search::predIntraBCSearch(Mode& intraBCMode, const CUGeom& cuGeom, bool bCh<br>             return false;<br>         }<br> <br>-        uint32_t depth = cu.m_cuDepth[0];<br>         int bitsAMVPBest, bitsAMVPTemp, bitsMergeTemp;<br>         int distAMVPBest, distMergeTemp;<br>         int costAMVPBest, costMergeBest, costMergeTemp;<br>@@ -3639,7 +3616,6 @@ bool Search::predIntraBCSearch(Mode& intraBCMode, const CUGeom& cuGeom, bool bCh<br>             yStartInCU = 0;<br>         }<br>         const pixel* currStart;<br>-        pixel* curr;<br>         pixel* ref;<br>         int currStride, refStride;<br>         distAMVPBest = 0;<br>@@ -3649,10 +3625,10 @@ bool Search::predIntraBCSearch(Mode& intraBCMode, const CUGeom& cuGeom, bool bCh<br>         cu.setPUMv(0, cMvQuaterPixl, pu.puAbsPartIdx, puIdx);<br>         cu.setPURefIdx(0, (int8_t)m_slice->m_numRefIdx[0] - 1, pu.puAbsPartIdx, puIdx);<br>         cu.setPUMv(1, MV(0, 0), pu.puAbsPartIdx, puIdx);<br>-        cu.setPURefIdx(1, -1, pu.puAbsPartIdx, puIdx);<br>+        cu.setPURefIdx(1, REF_NOT_VALID, pu.puAbsPartIdx, puIdx);<br>         cu.setPUInterDir(1, pu.puAbsPartIdx, puIdx);<br>         motionCompensation(cu, pu, tmpPredYuv, 1, 1);<br>-<br>+        int temp;<br>         for (uint32_t ch = TEXT_LUMA; ch < MAX_NUM_COMPONENT; ch++)<br>         {<br>             int tempHeight, tempWidth;<br>@@ -3660,10 +3636,9 @@ bool Search::predIntraBCSearch(Mode& intraBCMode, const CUGeom& cuGeom, bool bCh<br>             {<br>                 tempHeight = height;<br>                 tempWidth = width;<br>-                currStart = intraBCMode.fencYuv->getLumaAddr(partAddr);<br>-                currStride = intraBCMode.fencYuv->m_size;<br>                 ref = tmpPredYuv.getLumaAddr(partAddr);<br>                 refStride = tmpPredYuv.m_size;<br>+                distAMVPBest += m_me.bufSAD(ref, refStride);<br>             }<br>             else<br>             {<br>@@ -3674,25 +3649,21 @@ bool Search::predIntraBCSearch(Mode& intraBCMode, const CUGeom& cuGeom, bool bCh<br>                 currStride = intraBCMode.fencYuv->m_csize;<br>                 ref = tmpPredYuv.getChromaAddr(ch, partAddr);<br>                 refStride = tmpPredYuv.m_csize;<br>+                distAMVPBest += getSAD(ref, refStride, currStart, currStride, tempWidth, tempHeight);<br>             }<br>-            distAMVPBest += getSAD(ref, refStride, currStart, currStride, tempWidth, tempHeight);<br>         }<br> <br>         mvPred[0].set(intraBCMode.amvpCand[0][m_slice->m_numRefIdx[0] - 1][0].x >> 2, intraBCMode.amvpCand[0][m_slice->m_numRefIdx[0] - 1][0].y >> 2);<br>         mvPred[1].set(intraBCMode.amvpCand[0][m_slice->m_numRefIdx[0] - 1][1].x >> 2, intraBCMode.amvpCand[0][m_slice->m_numRefIdx[0] - 1][1].y >> 2);<br> <br>-        MV check;<br>         for (mvpIdxTemp = 0; mvpIdxTemp < AMVP_NUM_CANDS; mvpIdxTemp++)<br>         {<br>-            if (!(mvPred[mvpIdxTemp].x == check.x >> 2))<br>+            m_me.setMVP(mvPred[mvpIdxTemp]);<br>+            bitsAMVPTemp = m_me.bitcost(mv, mvPred[mvpIdxTemp]);<br>+            if (bitsAMVPTemp < bitsAMVPBest)<br>             {<br>-                m_me.setMVP(mvPred[mvpIdxTemp]);<br>-                bitsAMVPTemp = m_me.bitcost(mv, mvPred[mvpIdxTemp]);<br>-                if (bitsAMVPTemp < bitsAMVPBest)<br>-                {<br>-                    bitsAMVPBest = bitsAMVPTemp;<br>-                    mvpIdxBest = mvpIdxTemp;<br>-                }<br>+                bitsAMVPBest = bitsAMVPTemp;<br>+                mvpIdxBest = mvpIdxTemp;<br>             }<br>         }<br> <br>@@ -3711,7 +3682,7 @@ bool Search::predIntraBCSearch(Mode& intraBCMode, const CUGeom& cuGeom, bool bCh<br> <br>         if (ePartSize != SIZE_2Nx2N)<br>         {<br>-            if (0 && ePartSize != SIZE_2Nx2N && cu.m_cuDepth[0] >= 3)<br>+            if (log2ParallelMergeLevelMinus2 && ePartSize != SIZE_2Nx2N && cu.m_cuDepth[0] >= 3)<br>             {<br>                 cu.setPartSizeSubParts(SIZE_2Nx2N);<br>                 if (puIdx == 0)<br>@@ -3744,15 +3715,14 @@ bool Search::predIntraBCSearch(Mode& intraBCMode, const CUGeom& cuGeom, bool bCh<br>                 {<br>                     continue;<br>                 }<br>-                bitsMergeTemp = mrgIdxTemp == m_param->maxNumMergeCand ? mrgIdxTemp : mrgIdxTemp + 1;<br>-                bitsMergeTemp = getTUBits(mrgIdxTemp, m_param->maxNumMergeCand);<br>+                bitsMergeTemp = mrgIdxTemp == (int)m_param->maxNumMergeCand ? mrgIdxTemp : mrgIdxTemp + 1;<br> <br>                 distMergeTemp = 0;<br> <br>                 cu.setPUMv(0, cMvFieldNeighbours[mrgIdxTemp][0].mv, pu.puAbsPartIdx, puIdx);<br>                 cu.setPURefIdx(0, (int8_t)(m_slice->m_numRefIdx[0] - 1), pu.puAbsPartIdx, puIdx);<br>                 cu.setPUMv(1, MV(0, 0), pu.puAbsPartIdx, puIdx);<br>-                cu.setPURefIdx(1, -1, pu.puAbsPartIdx, puIdx);<br>+                cu.setPURefIdx(1, REF_NOT_VALID, pu.puAbsPartIdx, puIdx);<br>                 cu.setPUInterDir(1, pu.puAbsPartIdx, puIdx);<br>                 motionCompensation(cu, pu, tmpPredYuv, 1, 1);<br> <br>@@ -3763,10 +3733,9 @@ bool Search::predIntraBCSearch(Mode& intraBCMode, const CUGeom& cuGeom, bool bCh<br>                     {<br>                         tempHeight = height;<br>                         tempWidth = width;<br>-                        currStart = intraBCMode.fencYuv->getLumaAddr(partAddr);<br>-                        currStride = intraBCMode.fencYuv->m_size;<br>                         ref = tmpPredYuv.getLumaAddr(partAddr);<br>                         refStride = tmpPredYuv.m_size;<br>+                        distMergeTemp += m_me.bufSAD(ref, refStride);<br>                     }<br>                     else<br>                     {<br>@@ -3777,9 +3746,8 @@ bool Search::predIntraBCSearch(Mode& intraBCMode, const CUGeom& cuGeom, bool bCh<br>                         currStride = intraBCMode.fencYuv->m_csize;<br>                         ref = tmpPredYuv.getChromaAddr(ch, partAddr);<br>                         refStride = tmpPredYuv.m_csize;<br>+                        distMergeTemp += getSAD(ref, refStride, currStart, currStride, tempWidth, tempHeight);<br>                     }<br>-                    distMergeTemp += getSAD(ref, refStride, currStart, currStride, tempWidth, tempHeight);<br>-<br>                 }<br>                 costMergeTemp = distMergeTemp + m_rdCost.getCost(bitsMergeTemp);<br> <br>@@ -3792,13 +3760,12 @@ bool Search::predIntraBCSearch(Mode& intraBCMode, const CUGeom& cuGeom, bool bCh<br>         }<br>         if (costAMVPBest < costMergeBest)<br>         {<br>-            MV zeroMv(0, 0);<br>             MV tempmv((mv.x << 2), (mv.y << 2));<br>             MVField mvField[2];<br>             mvField[0].mv = tempmv;<br>             mvField[0].refIdx = m_slice->m_numRefIdx[0] - 1;   // the current picture is at the last position of list0<br>             mvField[1].mv = zeroMv;<br>-            mvField[1].refIdx = -1;<br>+            mvField[1].refIdx = REF_NOT_VALID;<br> <br>             cu.m_mergeFlag[pu.puAbsPartIdx] = false;<br>             cu.setPUInterDir(1, pu.puAbsPartIdx, puIdx);  // list 0 prediction<br>@@ -3819,12 +3786,12 @@ bool Search::predIntraBCSearch(Mode& intraBCMode, const CUGeom& cuGeom, bool bCh<br>         }<br>         else<br>         {<br>-            MV mv(cMvFieldNeighbours[mrgIdxBest][0].mv.x, cMvFieldNeighbours[mrgIdxBest][0].mv.y);<br>+            MV MV(cMvFieldNeighbours[mrgIdxBest][0].mv.x, cMvFieldNeighbours[mrgIdxBest][0].mv.y);<br>             MVField mvField[2];<br>-            mvField[0].mv = mv;<br>+            mvField[0].mv = MV;<br>             mvField[0].refIdx = cu.m_slice->m_numRefIdx[0] - 1;   // the current picture is at the last position of list0<br>             mvField[1].mv = zeroMv;<br>-            mvField[1].refIdx = -1;<br>+            mvField[1].refIdx = REF_NOT_VALID;<br> <br>             cu.m_mergeFlag[pu.puAbsPartIdx] = true;<br>             cu.m_mvpIdx[0][pu.puAbsPartIdx] = (uint8_t)mrgIdxBest; /* merge candidate ID is stored in L0 MVP idx */<br>@@ -3859,21 +3826,17 @@ bool Search::predIntraBCSearch(Mode& intraBCMode, const CUGeom& cuGeom, bool bCh<br>     return true;<br> }<br> <br>-bool Search::predMixedIntraBCInterSearch(Mode& intraBCMixedMode, const CUGeom& cuGeom, bool bChromaMC, PartSize ePartSize, bool testOnlyPred, MV* iMvCandList)<br>+bool Search::predMixedIntraBCInterSearch(Mode& intraBCMixedMode, const CUGeom& cuGeom, bool bChromaMC, PartSize ePartSize, MV* iMvCandList)<br> {<br>     intraBCMixedMode.initCosts();<br>     intraBCMixedMode.cu.setPartSizeSubParts(ePartSize);<br>     intraBCMixedMode.cu.setPredModeSubParts(MODE_INTER);<br>     CUData& cu = intraBCMixedMode.cu;<br>-    uint32_t depth = cuGeom.depth;<br>     int numComb = 2;<br>     int numPart = 2;<br>     uint32_t cost[2] = { 0,0 };<br>     uint32_t maxCost = UINT32_MAX;<br> <br>-    MVField  cMvFieldNeighbours[MRG_MAX_NUM_CANDS][2]; // double length for mv of both lists<br>-    uint8_t  uhInterDirNeighbours[MRG_MAX_NUM_CANDS];<br>-    int      numValidMergeCand[2] = { MRG_MAX_NUM_CANDS, MRG_MAX_NUM_CANDS };<br>     int      numPredDir = m_slice->isInterP() ? 1 : 2;<br>     MV       cMvZero(0, 0);<br> <br>@@ -3887,14 +3850,14 @@ bool Search::predMixedIntraBCInterSearch(Mode& intraBCMixedMode, const CUGeom& c<br>     bool isIBCMergeMode[2] = { false, false };<br>     MVField cMRGMvField[2][2];<br>     MVField cMRGMvFieldIBC[2][2];<br>-<br>+    int log2ParallelMergeLevelMinus2 = 0;<br>     // 12 mv candidates including lowresMV<br>     MV mvc[(MD_ABOVE_LEFT + 1) * 2 + 2];<br> <br>     Yuv* predYuv = &intraBCMixedMode.predYuv;<br>     Yuv& tmpPredYuv = m_rqt[cuGeom.depth].tmpPredYuv;<br> <br>-    for (int combo = 0; combo < numComb; combo++)<br>+    for (int combo = 0; combo < numComb; combo++) // number of combination<br>     {<br>         for (int partIdx = 0; partIdx < numPart; ++partIdx)<br>         {<br>@@ -3906,7 +3869,6 @@ bool Search::predMixedIntraBCInterSearch(Mode& intraBCMixedMode, const CUGeom& c<br> <br>             MV mvPred[2];<br>             MV bvPred[2];<br>-            uint32_t   biPDistTemp = UINT32_MAX;<br>             if ((combo == 0 && partIdx == 0) || (combo == 1 && partIdx == 1)) // intraBC<br>             {<br>                 MV cMv = iMvCandList[8 + partIdx];<br>@@ -3918,13 +3880,17 @@ bool Search::predMixedIntraBCInterSearch(Mode& intraBCMixedMode, const CUGeom& c<br>                 }<br> <br>                 cu.getNeighbourMV(partIdx, pu.puAbsPartIdx, intraBCMixedMode.interNeighbours);<br>-                int numMvc = cu.getPMV(intraBCMixedMode.interNeighbours, 0, m_slice->m_numRefIdx[0] - 1, intraBCMixedMode.amvpCand[0][m_slice->m_numRefIdx[0] - 1], mvc);<br>+                cu.getPMV(intraBCMixedMode.interNeighbours, 0, m_slice->m_numRefIdx[0] - 1, intraBCMixedMode.amvpCand[0][m_slice->m_numRefIdx[0] - 1], mvc, partIdx, pu.puAbsPartIdx);<br> <br>                 bvPred[0] = intraBCMixedMode.amvpCand[0][m_slice->m_numRefIdx[0] - 1][0];<br>                 bvPred[1] = intraBCMixedMode.amvpCand[0][m_slice->m_numRefIdx[0] - 1][1];<br>                 bvPred[0] >>= 2;<br>                 bvPred[1] >>= 2;<br> <br>+                /////////////////////////////////////////////////////////////<br>+                // ibc merge<br>+                // choose one MVP and compare with merge mode<br>+<br>                 int bitsAMVPBest, bitsAMVPTemp, bitsMergeTemp;<br>                 int distAMVPBest, distMergeTemp;<br>                 int costAMVPBest, costMergeBest, costMergeTemp;<br>@@ -3952,16 +3918,14 @@ bool Search::predMixedIntraBCInterSearch(Mode& intraBCMixedMode, const CUGeom& c<br>                 }<br>                 const pixel* currStart;<br>                 int currStride;<br>-                pixel* pCurr;<br>                 int refStride;<br>-                pixel* pRef;<br>                 distAMVPBest = 0;<br>                 pixel* ref;<br> <br>                 cu.setPUMv(0, cMv, pu.puAbsPartIdx, partIdx);<br>                 cu.setPURefIdx(0, (int8_t)m_slice->m_numRefIdx[0] - 1, pu.puAbsPartIdx, partIdx);<br>                 cu.setPUMv(1, MV(0, 0), pu.puAbsPartIdx, partIdx);<br>-                cu.setPURefIdx(1, -1, pu.puAbsPartIdx, partIdx);<br>+                cu.setPURefIdx(1, REF_NOT_VALID, pu.puAbsPartIdx, partIdx);<br>                 cu.setPUInterDir(1, pu.puAbsPartIdx, partIdx);<br>                 motionCompensation(cu, pu, tmpPredYuv, 1, 1);<br> <br>@@ -3972,10 +3936,9 @@ bool Search::predMixedIntraBCInterSearch(Mode& intraBCMixedMode, const CUGeom& c<br>                     {<br>                         tempHeight = dummyHeight;<br>                         tempWidth = dummyWidth;<br>-                        currStart = intraBCMixedMode.fencYuv->getLumaAddr(partAddr);<br>-                        currStride = intraBCMixedMode.fencYuv->m_size;<br>                         ref = tmpPredYuv.getLumaAddr(partAddr);<br>                         refStride = tmpPredYuv.m_size;<br>+                        distAMVPBest += m_me.bufSAD(ref, refStride);<br>                     }<br>                     else<br>                     {<br>@@ -3986,22 +3949,19 @@ bool Search::predMixedIntraBCInterSearch(Mode& intraBCMixedMode, const CUGeom& c<br>                         currStride = intraBCMixedMode.fencYuv->m_csize;<br>                         ref = tmpPredYuv.getChromaAddr(ch, partAddr);<br>                         refStride = tmpPredYuv.m_csize;<br>+                        distAMVPBest += getSAD(ref, refStride, currStart, currStride, tempWidth, tempHeight);<br>                     }<br>-                    distAMVPBest += getSAD(ref, refStride, currStart, currStride, tempWidth, tempHeight);<br>                 }<br> <br>                 MV check;<br>                 for (mvpIdxTemp = 0; mvpIdxTemp < AMVP_NUM_CANDS; mvpIdxTemp++)<br>                 {<br>-                    if (!(mvPred[mvpIdxTemp].x == check.x >> 2))<br>+                    m_me.setMVP(bvPred[mvpIdxTemp]);<br>+                    bitsAMVPTemp = m_me.bitcost(cMv >> 2, bvPred[mvpIdxTemp]);<br>+                    if (bitsAMVPTemp < bitsAMVPBest)<br>                     {<br>-                        m_me.setMVP(bvPred[mvpIdxTemp]);<br>-                        bitsAMVPTemp = m_me.bitcost(cMv >> 2, bvPred[mvpIdxTemp]);<br>-                        if (bitsAMVPTemp < bitsAMVPBest)<br>-                        {<br>-                            bitsAMVPBest = bitsAMVPTemp;<br>-                            mvpIdxBest = mvpIdxTemp;<br>-                        }<br>+                        bitsAMVPBest = bitsAMVPTemp;<br>+                        mvpIdxBest = mvpIdxTemp;<br>                     }<br>                 }<br> <br>@@ -4014,7 +3974,7 @@ bool Search::predMixedIntraBCInterSearch(Mode& intraBCMixedMode, const CUGeom& c<br> <br>                 if (ePartSize != SIZE_2Nx2N)<br>                 {<br>-                    if (0 && ePartSize != SIZE_2Nx2N && cu.m_cuDepth[0] >= 3)<br>+                    if (log2ParallelMergeLevelMinus2 && ePartSize != SIZE_2Nx2N && cu.m_cuDepth[0] >= 3)<br>                     {<br>                         cu.setPartSizeSubParts(SIZE_2Nx2N);<br>                         if (partIdx == 0)<br>@@ -4047,13 +4007,13 @@ bool Search::predMixedIntraBCInterSearch(Mode& intraBCMixedMode, const CUGeom& c<br>                         {<br>                             continue;<br>                         }<br>-                        bitsMergeTemp = mrgIdxTemp == m_param->maxNumMergeCand ? mrgIdxTemp : mrgIdxTemp + 1;<br>-                        distMergeTemp = 0;<br>+                        bitsMergeTemp = mrgIdxTemp == (int)m_param->maxNumMergeCand ? mrgIdxTemp : mrgIdxTemp + 1;<br> <br>+                        distMergeTemp = 0;<br>                         cu.setPUMv(0, cMvFieldNeighboursIBC[mrgIdxTemp][0].mv, pu.puAbsPartIdx, partIdx);<br>                         cu.setPURefIdx(0, (int8_t)(m_slice->m_numRefIdx[0] - 1), pu.puAbsPartIdx, partIdx);<br>                         cu.setPUMv(1, MV(0, 0), pu.puAbsPartIdx, partIdx);<br>-                        cu.setPURefIdx(1, -1, pu.puAbsPartIdx, partIdx);<br>+                        cu.setPURefIdx(1, REF_NOT_VALID, pu.puAbsPartIdx, partIdx);<br>                         cu.setPUInterDir(1, pu.puAbsPartIdx, partIdx);<br>                         motionCompensation(cu, pu, tmpPredYuv, 1, 1);<br> <br>@@ -4064,10 +4024,9 @@ bool Search::predMixedIntraBCInterSearch(Mode& intraBCMixedMode, const CUGeom& c<br>                             {<br>                                 tempHeight = dummyHeight;<br>                                 tempWidth = dummyWidth;<br>-                                currStart = intraBCMixedMode.fencYuv->getLumaAddr(partAddr);<br>-                                currStride = intraBCMixedMode.fencYuv->m_size;<br>                                 ref = tmpPredYuv.getLumaAddr(partAddr);<br>                                 refStride = tmpPredYuv.m_size;<br>+                                distMergeTemp += m_me.bufSAD(ref, refStride);<br>                             }<br>                             else<br>                             {<br>@@ -4078,8 +4037,8 @@ bool Search::predMixedIntraBCInterSearch(Mode& intraBCMixedMode, const CUGeom& c<br>                                 currStride = intraBCMixedMode.fencYuv->m_csize;<br>                                 ref = tmpPredYuv.getChromaAddr(ch, partAddr);<br>                                 refStride = tmpPredYuv.m_csize;<br>+                                distMergeTemp += getSAD(ref, refStride, currStart, currStride, tempWidth, tempHeight);<br>                             }<br>-                            distMergeTemp += getSAD(ref, refStride, currStart, currStride, tempWidth, tempHeight);<br>                         }<br>                         costMergeTemp = distMergeTemp + m_rdCost.getCost(bitsMergeTemp);<br> <br>@@ -4102,7 +4061,7 @@ bool Search::predMixedIntraBCInterSearch(Mode& intraBCMixedMode, const CUGeom& c<br>                     mvField[0].mv = mv;<br>                     mvField[0].refIdx = m_slice->m_numRefIdx[0] - 1;   // the current picture is at the last position of list0<br>                     mvField[1].mv = cMvZero;<br>-                    mvField[1].refIdx = -1;<br>+                    mvField[1].refIdx = REF_NOT_VALID;<br>                     cMRGMvFieldIBC[combo][0] = mvField[0];<br>                     cMRGMvFieldIBC[combo][1] = mvField[1];<br>                 }<br>@@ -4123,9 +4082,10 @@ bool Search::predMixedIntraBCInterSearch(Mode& intraBCMixedMode, const CUGeom& c<br>                 {<br>                     cu.setPUMv(0, iMvCandList[8 + partIdx], pu.puAbsPartIdx, partIdx);<br>                     cu.setPURefIdx(0, (int8_t)(m_slice->m_numRefIdx[0] - 1), pu.puAbsPartIdx, partIdx);<br>-                    cu.setPURefIdx(1, -1, pu.puAbsPartIdx, partIdx);<br>+                    cu.setPURefIdx(1, REF_NOT_VALID, pu.puAbsPartIdx, partIdx);<br>                 }<br>                 // ibc merge<br>+                /////////////////////////////////////////////////////////////<br>             }<br>             else // is inter PU<br>             {<br>@@ -4133,21 +4093,19 @@ bool Search::predMixedIntraBCInterSearch(Mode& intraBCMixedMode, const CUGeom& c<br>                 uint32_t  costInterBest = UINT32_MAX;<br>                 const pixel* currStart;<br>                 int currStride;<br>-                pixel* pCurr;<br>                 pixel* ref;<br>                 int refStride;<br>                 MergeData merge;<br>                 memset(&merge, 0, sizeof(merge));<br>-<br>                 for (int refList = 0; refList < numPredDir; refList++)<br>                 {<br>                     uint32_t numRef = refList ? ((m_slice->m_numRefIdx[1] > 1) ? 2 : 1) : ((m_slice->m_numRefIdx[0] - 1 > 1) ? 2 : 1);<br>-                    for (int refIdx = 0; refIdx < numRef; refIdx++)<br>+                    for (uint32_t refIdx = 0; refIdx < numRef; refIdx++)<br>                     {<br>                         MV cMv = iMvCandList[4 * refList + 2 * refIdx + partIdx];<br> <br>                         cu.getNeighbourMV(partIdx, pu.puAbsPartIdx, intraBCMixedMode.interNeighbours);<br>-                        int numMvc = cu.getPMV(intraBCMixedMode.interNeighbours, refList, refIdx, intraBCMixedMode.amvpCand[refList][refIdx], mvc);<br>+                        cu.getPMV(intraBCMixedMode.interNeighbours, refList, refIdx, intraBCMixedMode.amvpCand[refList][refIdx], mvc, partIdx, pu.puAbsPartIdx);<br>                         int mvpIdx;<br> <br>                         uint32_t  tempCost0 = 0;<br>@@ -4171,7 +4129,7 @@ bool Search::predMixedIntraBCInterSearch(Mode& intraBCMixedMode, const CUGeom& c<br>                         bitsTemp += getTUBits(refIdx, numRef);<br> <br>                         m_me.setMVP(mvPred[mvpIdx]);<br>-                        if (0) //UseIntegerMv<br>+                        if (cu.m_slice->m_useIntegerMv)<br>                         {<br>                             cu.setPUMv(refList, (cMv >> 2) << 2, pu.puAbsPartIdx, partIdx);<br>                         }<br>@@ -4191,10 +4149,9 @@ bool Search::predMixedIntraBCInterSearch(Mode& intraBCMixedMode, const CUGeom& c<br>                             {<br>                                 tempHeight = dummyHeight;<br>                                 tempWidth = dummyWidth;<br>-                                currStart = intraBCMixedMode.fencYuv->getLumaAddr(partAddr);<br>-                                currStride = intraBCMixedMode.fencYuv->m_size;<br>                                 ref = tmpPredYuv.getLumaAddr(partAddr);<br>                                 refStride = tmpPredYuv.m_size;<br>+                                costInterTemp += m_me.bufSAD(ref, refStride);<br>                             }<br>                             else<br>                             {<br>@@ -4205,15 +4162,15 @@ bool Search::predMixedIntraBCInterSearch(Mode& intraBCMixedMode, const CUGeom& c<br>                                 currStride = intraBCMixedMode.fencYuv->m_csize;<br>                                 ref = tmpPredYuv.getChromaAddr(ch, partAddr);<br>                                 refStride = tmpPredYuv.m_csize;<br>+                                costInterTemp += getSAD(ref, refStride, currStart, currStride, tempWidth, tempHeight);<br>                             }<br>-                            costInterTemp += getSAD(ref, refStride, currStart, currStride, tempWidth, tempHeight);<br> <br>                             if (costInterTemp >= costInterBest)<br>                             {<br>                                 break;<br>                             }<br>                         }<br>-                        cu.setPURefIdx(refList, -1, pu.puAbsPartIdx, partIdx);<br>+                        cu.setPURefIdx(refList, REF_NOT_VALID, pu.puAbsPartIdx, partIdx);<br> <br>                         costInterTemp += m_me.bitcost(cMv, mvPred[mvpIdx]);<br>                         costInterTemp += m_rdCost.getCost(bitsTemp);<br>@@ -4227,7 +4184,7 @@ bool Search::predMixedIntraBCInterSearch(Mode& intraBCMixedMode, const CUGeom& c<br>                             cMvPredCand[combo][partIdx] = mvPred[mvpIdx];<br>                         }<br>                     }<br>-                }<br>+                } // end RefIdx and RefList search<br> <br>                 uint32_t MRGInterDir = 0;<br>                 uint32_t MRGIndex = 0;<br>@@ -4241,8 +4198,8 @@ bool Search::predMixedIntraBCInterSearch(Mode& intraBCMixedMode, const CUGeom& c<br>                 cMRGMvField[combo][0] = merge.mvField[0];<br>                 cMRGMvField[combo][1] = merge.mvField[1];<br>                 MRGIndex = merge.index;<br>-                cu.setPURefIdx(0, -1, pu.puAbsPartIdx, partIdx);<br>-                cu.setPURefIdx(1, -1, pu.puAbsPartIdx, partIdx);<br>+                cu.setPURefIdx(0, REF_NOT_VALID, pu.puAbsPartIdx, partIdx);<br>+                cu.setPURefIdx(1, REF_NOT_VALID, pu.puAbsPartIdx, partIdx);<br> <br>                 if (MRGCost < costInterBest)<br>                 {<br>@@ -4265,7 +4222,7 @@ bool Search::predMixedIntraBCInterSearch(Mode& intraBCMixedMode, const CUGeom& c<br>                 {<br>                     int refListOpt = bestInterDir[combo];<br>                     int refIdxOpt = bestRefIdx[combo];<br>-                    if (0) //UseIntegerMv<br>+                    if (cu.m_slice->m_useIntegerMv)<br>                     {<br>                         cu.setPUMv(refListOpt, (iMvCandList[partIdx + 2 * refIdxOpt + 4 * refListOpt] >> 2) << 2, pu.puAbsPartIdx, partIdx);<br>                     }<br>@@ -4274,7 +4231,7 @@ bool Search::predMixedIntraBCInterSearch(Mode& intraBCMixedMode, const CUGeom& c<br>                         cu.setPUMv(refListOpt, iMvCandList[partIdx + 2 * refIdxOpt + 4 * refListOpt], pu.puAbsPartIdx, partIdx);<br>                     }<br>                     cu.setPURefIdx(refListOpt, refIdxOpt, pu.puAbsPartIdx, partIdx);<br>-                    cu.setPURefIdx(1 - refListOpt, -1, pu.puAbsPartIdx, partIdx);<br>+                    cu.setPURefIdx(1 - refListOpt, REF_NOT_VALID, pu.puAbsPartIdx, partIdx);<br>                     cu.setPUInterDir(1 + refListOpt, pu.puAbsPartIdx, partIdx);<br>                     cu.m_mvpIdx[refListOpt][pu.puAbsPartIdx] = bestInterMvpIdx[combo];<br>                 }<br>@@ -4318,7 +4275,7 @@ bool Search::predMixedIntraBCInterSearch(Mode& intraBCMixedMode, const CUGeom& c<br>             cu.m_mvd[0][partAddr] = cMvd;<br>             cu.m_mvpIdx[0][partAddr] = bestIBCMvpIdx[0];<br>             cu.setPURefIdx(0, m_slice->m_numRefIdx[0] - 1, partAddr, partIdx);<br>-            cu.setPURefIdx(1, -1, partAddr, partIdx);<br>+            cu.setPURefIdx(1, REF_NOT_VALID, partAddr, partIdx);<br>             cu.setPUInterDir(1, partAddr, partIdx);  // list 0 prediction<br>         }<br> <br>@@ -4336,14 +4293,13 @@ bool Search::predMixedIntraBCInterSearch(Mode& intraBCMixedMode, const CUGeom& c<br>             cu.setPURefIdx(1, cMRGMvField[0][1].refIdx, partAddr, partIdx);<br> <br>             cu.m_mvd[0][partAddr] = cMvZero;<br>-<br>             cu.m_mvd[1][partAddr] = cMvZero;<br>         }<br>         else<br>         {<br>             int refListOpt = bestInterDir[0];<br>             int refIdxOpt = bestRefIdx[0];<br>-            if (0) //UseIntegerMv<br>+            if (cu.m_slice->m_useIntegerMv)<br>             {<br>                 cMvd.set(((iMvCandList[1 + 2 * refIdxOpt + 4 * refListOpt].x >> 2) - (cMvPredCand[0][1].x >> 2)), ((iMvCandList[1 + 2 * refIdxOpt + 4 * refListOpt].y >> 2) - (cMvPredCand[0][1].y >> 2)));<br>                 cu.setPUMv(refListOpt, (iMvCandList[1 + 2 * refIdxOpt + 4 * refListOpt] >> 2) << 2, partAddr, partIdx);<br>@@ -4355,7 +4311,7 @@ bool Search::predMixedIntraBCInterSearch(Mode& intraBCMixedMode, const CUGeom& c<br>             }<br>             cu.m_mvd[refListOpt][partAddr] = cMvd;<br>             cu.setPURefIdx(refListOpt, refIdxOpt, partAddr, partIdx);<br>-            cu.setPURefIdx(1 - refListOpt, -1, partAddr, partIdx);<br>+            cu.setPURefIdx(1 - refListOpt, REF_NOT_VALID, partAddr, partIdx);<br>             cu.setPUInterDir(1 + refListOpt, partAddr, partIdx);<br>             cu.m_mergeFlag[partAddr] = false;<br>             cu.m_mvpIdx[refListOpt][partAddr] = bestInterMvpIdx[0];<br>@@ -4386,7 +4342,7 @@ bool Search::predMixedIntraBCInterSearch(Mode& intraBCMixedMode, const CUGeom& c<br>         {<br>             int refListOpt = bestInterDir[1];<br>             int refIdxOpt = bestRefIdx[1];<br>-            if (0)//UseIntegerMv<br>+            if (cu.m_slice->m_useIntegerMv)<br>             {<br>                 cMvd.set((iMvCandList[2 * refIdxOpt + 4 * refListOpt].x >> 2) - (cMvPredCand[1][0].x >> 2), (iMvCandList[2 * refIdxOpt + 4 * refListOpt].y >> 2) - (cMvPredCand[1][0].y >> 2));<br>                 cu.setPUMv(refListOpt, (iMvCandList[2 * refIdxOpt + 4 * refListOpt] >> 2) << 2, partAddr, partIdx);<br>@@ -4398,7 +4354,7 @@ bool Search::predMixedIntraBCInterSearch(Mode& intraBCMixedMode, const CUGeom& c<br>             }<br>             cu.m_mvd[refListOpt][partAddr] = cMvd;<br>             cu.setPURefIdx(refListOpt, refIdxOpt, partAddr, partIdx);<br>-            cu.setPURefIdx(1 - refListOpt, -1, partAddr, partIdx);<br>+            cu.setPURefIdx(1 - refListOpt, REF_NOT_VALID, partAddr, partIdx);<br>             cu.setPUInterDir(1 + refListOpt, partAddr, partIdx);<br>             cu.m_mergeFlag[partAddr] = false;<br>             cu.m_mvpIdx[refListOpt][partAddr] = bestInterMvpIdx[1];<br>@@ -4429,7 +4385,7 @@ bool Search::predMixedIntraBCInterSearch(Mode& intraBCMixedMode, const CUGeom& c<br>             cu.m_mvd[0][partAddr] = cMvd;<br>             cu.m_mvpIdx[0][partAddr] = bestIBCMvpIdx[1];<br>             cu.setPURefIdx(0, m_slice->m_numRefIdx[0] - 1, partAddr, partIdx);<br>-            cu.setPURefIdx(1, -1, partAddr, partIdx);<br>+            cu.setPURefIdx(1, REF_NOT_VALID, partAddr, partIdx);<br>             cu.setPUInterDir(1, partAddr, partIdx);  // list 0 prediction<br>         }<br>     }<br>diff --git a/source/encoder/search.h b/source/encoder/search.h<br>index 948ea1883..3ae3655b1 100644<br>--- a/source/encoder/search.h<br>+++ b/source/encoder/search.h<br>@@ -316,7 +316,7 @@ public:<br>     void     encodeIntraInInter(Mode& intraMode, const CUGeom& cuGeom);<br> <br>     // estimation inter prediction (non-skip)<br>-    void     predInterSearch(Mode& interMode, const CUGeom& cuGeom, bool bChromaMC, uint32_t masks[2]);<br>+    void      predInterSearch(Mode& interMode, const CUGeom& cuGeom, bool bChromaMC, uint32_t masks[2], MV* iMVCandList = NULL);<br>     void     searchMV(Mode& interMode, int list, int ref, MV& outmv, MV mvp[3], int numMvc, MV* mvc);<br>     // encode residual and compute rd-cost for inter mode<br>     void     encodeResAndCalcRdInterCU(Mode& interMode, const CUGeom& cuGeom);<br>@@ -350,8 +350,8 @@ public:<br>         uint32_t partOffset, int puIdx);<br>     static    uint32_t mergeCandLists(MV* dst, uint32_t dn, MV* src, uint32_t sn, bool isSrcQuarPel);<br>     uint32_t  getSAD(pixel* ref, int refStride, const pixel* curr, int currStride, int width, int height);<br>-    bool      predMixedIntraBCInterSearch(Mode& intraBCMode, const CUGeom& cuGeom, bool bChromaMC, PartSize ePartSize, bool testOnlyPred, MV* iMVCandList = (0, 0));<br>-    void      restrictBipredMergeCand(CUData* cu, uint32_t puIdx, MVField(*mvFieldNeighbours)[2], uint8_t* interDirNeighbours, int numValidMergeCand);<br>+    bool      predMixedIntraBCInterSearch(Mode& intraBCMode, const CUGeom& cuGeom, bool bChromaMC, PartSize ePartSize, MV* iMVCandList);<br>+    void      restrictBipredMergeCand(CUData* cu, uint32_t puIdx, MVField(*mvFieldNeighbours)[2], uint8_t* interDirNeighbours, uint32_t numValidMergeCand);<br> <br>     class PME : public BondedTaskGroup<br>     {<br>-- <br>2.36.0.windows.1<br><br></div>