<div style="line-height:1.7;color:#000000;font-size:14px;font-family:arial"><div># HG changeset patch</div><div># User Min Chen <min.chen@multicorewareinc.com></div><div># Date 1478030336 18000</div><div># Node ID 201758801366fb5e5b59710d87f4b8da911d6b73</div><div># Parent  5fe7ac3068ebedc3d58451518c54c501e3c41103</div><div>[slices] restrict mv never beyond boundary in both slices and non-slices mode</div><div>---</div><div> source/encoder/motion.cpp |   57 +++++++++++++++++++++++----------------------</div><div> 1 files changed, 29 insertions(+), 28 deletions(-)</div><div><br></div><div>diff -r 5fe7ac3068eb -r 201758801366 source/encoder/motion.cpp</div><div>--- a/source/encoder/motion.cpp<span class="Apple-tab-span" style="white-space:pre">    </span>Tue Nov 01 14:58:53 2016 -0500</div><div>+++ b/source/encoder/motion.cpp<span class="Apple-tab-span" style="white-space:pre">        </span>Tue Nov 01 14:58:56 2016 -0500</div><div>@@ -278,13 +278,13 @@</div><div>         costs[1] += mvcost((omv + MV(m1x, m1y)) << 2); \</div><div>         costs[2] += mvcost((omv + MV(m2x, m2y)) << 2); \</div><div>         costs[3] += mvcost((omv + MV(m3x, m3y)) << 2); \</div><div>-        if ((g_maxSlices == 1) | ((omv.y + m0y >= mvmin.y) & (omv.y + m0y <= mvmax.y))) \</div><div>+        if ((omv.y + m0y >= mvmin.y) & (omv.y + m0y <= mvmax.y)) \</div><div>             COPY2_IF_LT(bcost, costs[0], bmv, omv + MV(m0x, m0y)); \</div><div>-        if ((g_maxSlices == 1) | ((omv.y + m1y >= mvmin.y) & (omv.y + m1y <= mvmax.y))) \</div><div>+        if ((omv.y + m1y >= mvmin.y) & (omv.y + m1y <= mvmax.y)) \</div><div>             COPY2_IF_LT(bcost, costs[1], bmv, omv + MV(m1x, m1y)); \</div><div>-        if ((g_maxSlices == 1) | ((omv.y + m2y >= mvmin.y) & (omv.y + m2y <= mvmax.y))) \</div><div>+        if ((omv.y + m2y >= mvmin.y) & (omv.y + m2y <= mvmax.y)) \</div><div>             COPY2_IF_LT(bcost, costs[2], bmv, omv + MV(m2x, m2y)); \</div><div>-        if ((g_maxSlices == 1) | ((omv.y + m3y >= mvmin.y) & (omv.y + m3y <= mvmax.y))) \</div><div>+        if ((omv.y + m3y >= mvmin.y) & (omv.y + m3y <= mvmax.y)) \</div><div>             COPY2_IF_LT(bcost, costs[3], bmv, omv + MV(m3x, m3y)); \</div><div>     }</div><div> </div><div>@@ -631,6 +631,7 @@</div><div>         {</div><div>             bcost = cost;</div><div>             bmv = 0;</div><div>+            bmv.y = X265_MAX(X265_MIN(0, mvmax.y), mvmin.y);</div><div>         }</div><div>     }</div><div> </div><div>@@ -663,9 +664,9 @@</div><div>         do</div><div>         {</div><div>             COST_MV_X4_DIR(0, -1, 0, 1, -1, 0, 1, 0, costs);</div><div>-            if ((g_maxSlices == 1) | ((bmv.y - 1 >= mvmin.y) & (bmv.y - 1 <= mvmax.y)))</div><div>+            if ((bmv.y - 1 >= mvmin.y) & (bmv.y - 1 <= mvmax.y))</div><div>                 COPY1_IF_LT(bcost, (costs[0] << 4) + 1);</div><div>-            if ((g_maxSlices == 1) | ((bmv.y + 1 >= mvmin.y) & (bmv.y + 1 <= mvmax.y)))</div><div>+            if ((bmv.y + 1 >= mvmin.y) & (bmv.y + 1 <= mvmax.y))</div><div>                 COPY1_IF_LT(bcost, (costs[1] << 4) + 3);</div><div>             COPY1_IF_LT(bcost, (costs[2] << 4) + 4);</div><div>             COPY1_IF_LT(bcost, (costs[3] << 4) + 12);</div><div>@@ -704,18 +705,18 @@</div><div>       /* equivalent to the above, but eliminates duplicate candidates */</div><div>         COST_MV_X3_DIR(-2, 0, -1, 2,  1, 2, costs);</div><div>         bcost <<= 3;</div><div>-        if ((g_maxSlices == 1) | ((bmv.y >= mvmin.y) & (bmv.y <= mvmax.y)))</div><div>+        if ((bmv.y >= mvmin.y) & (bmv.y <= mvmax.y))</div><div>             COPY1_IF_LT(bcost, (costs[0] << 3) + 2);</div><div>-        if ((g_maxSlices == 1) | ((bmv.y + 2 >= mvmin.y) & (bmv.y + 2 <= mvmax.y)))</div><div>+        if ((bmv.y + 2 >= mvmin.y) & (bmv.y + 2 <= mvmax.y))</div><div>         {</div><div>             COPY1_IF_LT(bcost, (costs[1] << 3) + 3);</div><div>             COPY1_IF_LT(bcost, (costs[2] << 3) + 4);</div><div>         }</div><div> </div><div>         COST_MV_X3_DIR(2, 0,  1, -2, -1, -2, costs);</div><div>-        if ((g_maxSlices == 1) | ((bmv.y >= mvmin.y) & (bmv.y <= mvmax.y)))</div><div>+        if ((bmv.y >= mvmin.y) & (bmv.y <= mvmax.y))</div><div>             COPY1_IF_LT(bcost, (costs[0] << 3) + 5);</div><div>-        if ((g_maxSlices == 1) | ((bmv.y - 2 >= mvmin.y) & (bmv.y - 2 <= mvmax.y)))</div><div>+        if ((bmv.y - 2 >= mvmin.y) & (bmv.y - 2 <= mvmax.y))</div><div>         {</div><div>             COPY1_IF_LT(bcost, (costs[1] << 3) + 6);</div><div>             COPY1_IF_LT(bcost, (costs[2] << 3) + 7);</div><div>@@ -725,7 +726,7 @@</div><div>         {</div><div>             int dir = (bcost & 7) - 2;</div><div> </div><div>-            if ((g_maxSlices == 1) | ((bmv.y + hex2[dir + 1].y >= mvmin.y) & (bmv.y + hex2[dir + 1].y <= mvmax.y)))</div><div>+            if ((bmv.y + hex2[dir + 1].y >= mvmin.y) & (bmv.y + hex2[dir + 1].y <= mvmax.y))</div><div>             {</div><div>                 bmv += hex2[dir + 1];</div><div> </div><div>@@ -738,13 +739,13 @@</div><div>                         costs);</div><div>                     bcost &= ~7;</div><div> </div><div>-                    if ((g_maxSlices == 1) | ((bmv.y + hex2[dir + 0].y >= mvmin.y) & (bmv.y + hex2[dir + 0].y <= mvmax.y)))</div><div>+                    if ((bmv.y + hex2[dir + 0].y >= mvmin.y) & (bmv.y + hex2[dir + 0].y <= mvmax.y))</div><div>                         COPY1_IF_LT(bcost, (costs[0] << 3) + 1);</div><div> </div><div>-                    if ((g_maxSlices == 1) | ((bmv.y + hex2[dir + 1].y >= mvmin.y) & (bmv.y + hex2[dir + 1].y <= mvmax.y)))</div><div>+                    if ((bmv.y + hex2[dir + 1].y >= mvmin.y) & (bmv.y + hex2[dir + 1].y <= mvmax.y))</div><div>                         COPY1_IF_LT(bcost, (costs[1] << 3) + 2);</div><div> </div><div>-                    if ((g_maxSlices == 1) | ((bmv.y + hex2[dir + 2].y >= mvmin.y) & (bmv.y + hex2[dir + 2].y <= mvmax.y)))</div><div>+                    if ((bmv.y + hex2[dir + 2].y >= mvmin.y) & (bmv.y + hex2[dir + 2].y <= mvmax.y))</div><div>                         COPY1_IF_LT(bcost, (costs[2] << 3) + 3);</div><div> </div><div>                     if (!(bcost & 7))</div><div>@@ -754,7 +755,7 @@</div><div>                     dir = mod6m1[dir + 1];</div><div>                     bmv += hex2[dir + 1];</div><div>                 }</div><div>-            } // if ((g_maxSlices == 1) | ((bmv.y + hex2[dir + 1].y >= mvmin.y) & (bmv.y + hex2[dir + 1].y <= mvmax.y)))</div><div>+            } // if ((bmv.y + hex2[dir + 1].y >= mvmin.y) & (bmv.y + hex2[dir + 1].y <= mvmax.y))</div><div>         }</div><div>         bcost >>= 3;</div><div> #endif // if 0</div><div>@@ -762,20 +763,20 @@</div><div>         /* square refine */</div><div>         int dir = 0;</div><div>         COST_MV_X4_DIR(0, -1,  0, 1, -1, 0, 1, 0, costs);</div><div>-        if ((g_maxSlices == 1) | ((bmv.y - 1 >= mvmin.y) & (bmv.y - 1 <= mvmax.y)))</div><div>+        if ((bmv.y - 1 >= mvmin.y) & (bmv.y - 1 <= mvmax.y))</div><div>             COPY2_IF_LT(bcost, costs[0], dir, 1);</div><div>-        if ((g_maxSlices == 1) | ((bmv.y + 1 >= mvmin.y) & (bmv.y + 1 <= mvmax.y)))</div><div>+        if ((bmv.y + 1 >= mvmin.y) & (bmv.y + 1 <= mvmax.y))</div><div>             COPY2_IF_LT(bcost, costs[1], dir, 2);</div><div>         COPY2_IF_LT(bcost, costs[2], dir, 3);</div><div>         COPY2_IF_LT(bcost, costs[3], dir, 4);</div><div>         COST_MV_X4_DIR(-1, -1, -1, 1, 1, -1, 1, 1, costs);</div><div>-        if ((g_maxSlices == 1) | ((bmv.y - 1 >= mvmin.y) & (bmv.y - 1 <= mvmax.y)))</div><div>+        if ((bmv.y - 1 >= mvmin.y) & (bmv.y - 1 <= mvmax.y))</div><div>             COPY2_IF_LT(bcost, costs[0], dir, 5);</div><div>-        if ((g_maxSlices == 1) | ((bmv.y + 1 >= mvmin.y) & (bmv.y + 1 <= mvmax.y)))</div><div>+        if ((bmv.y + 1 >= mvmin.y) & (bmv.y + 1 <= mvmax.y))</div><div>             COPY2_IF_LT(bcost, costs[1], dir, 6);</div><div>-        if ((g_maxSlices == 1) | ((bmv.y - 1 >= mvmin.y) & (bmv.y - 1 <= mvmax.y)))</div><div>+        if ((bmv.y - 1 >= mvmin.y) & (bmv.y - 1 <= mvmax.y))</div><div>             COPY2_IF_LT(bcost, costs[2], dir, 7);</div><div>-        if ((g_maxSlices == 1) | ((bmv.y + 1 >= mvmin.y) & (bmv.y + 1 <= mvmax.y)))</div><div>+        if ((bmv.y + 1 >= mvmin.y) & (bmv.y + 1 <= mvmax.y))</div><div>             COPY2_IF_LT(bcost, costs[3], dir, 8);</div><div>         bmv += square1[dir];</div><div>         break;</div><div>@@ -789,7 +790,7 @@</div><div>         /* refine predictors */</div><div>         omv = bmv;</div><div>         ucost1 = bcost;</div><div>-        X265_CHECK((g_maxSlices == 1) | ((pmv.y >= mvmin.y) & (pmv.y <= mvmax.y)), "pmv outside of search range!");</div><div>+        X265_CHECK(((pmv.y >= mvmin.y) & (pmv.y <= mvmax.y)), "pmv outside of search range!");</div><div>         DIA1_ITER(pmv.x, pmv.y);</div><div>         if (pmv.notZero())</div><div>             DIA1_ITER(0, 0);</div><div>@@ -913,7 +914,7 @@</div><div>            stride, costs + 4 * k); \</div><div>     fref_base += 2 * dy;</div><div> #define ADD_MVCOST(k, x, y) costs[k] += p_cost_omvx[x * 4 * i] + p_cost_omvy[y * 4 * i]</div><div>-#define MIN_MV(k, x, y)     COPY2_IF_LT(bcost, costs[k], dir, x * 16 + (y & 15))</div><div>+#define MIN_MV(k, dx, dy)     if ((omv.y + (dy) >= mvmin.y) & (omv.y + (dy) <= mvmax.y)) { COPY2_IF_LT(bcost, costs[k], dir, dx * 16 + (dy & 15)) }</div><div> </div><div>                 SADS(0, +0, -4, +0, +4, -2, -3, +2, -3);</div><div>                 SADS(1, -4, -2, +4, -2, -4, -1, +4, -1);</div><div>@@ -1150,7 +1151,7 @@</div><div>             MV qmv = bmv + square1[i] * 2;</div><div> </div><div>             /* skip invalid range */</div><div>-            if ((g_maxSlices > 1) & ((qmv.y < qmvmin.y) | (qmv.y > qmvmax.y)))</div><div>+            if ((qmv.y < qmvmin.y) | (qmv.y > qmvmax.y))</div><div>                 continue;</div><div> </div><div>             int cost = ref->lowresQPelCost(fenc, blockOffset, qmv, sad) + mvcost(qmv);</div><div>@@ -1166,7 +1167,7 @@</div><div>             MV qmv = bmv + square1[i];</div><div> </div><div>             /* skip invalid range */</div><div>-            if ((g_maxSlices > 1) & ((qmv.y < qmvmin.y) | (qmv.y > qmvmax.y)))</div><div>+            if ((qmv.y < qmvmin.y) | (qmv.y > qmvmax.y))</div><div>                 continue;</div><div> </div><div>             int cost = ref->lowresQPelCost(fenc, blockOffset, qmv, satd) + mvcost(qmv);</div><div>@@ -1195,7 +1196,7 @@</div><div>                 MV qmv = bmv + square1[i] * 2;</div><div> </div><div>                 // check mv range for slice bound</div><div>-                if ((g_maxSlices > 1) & ((qmv.y < qmvmin.y) | (qmv.y > qmvmax.y)))</div><div>+                if ((qmv.y < qmvmin.y) | (qmv.y > qmvmax.y))</div><div>                     continue;</div><div> </div><div>                 int cost = subpelCompare(ref, qmv, hpelcomp) + mvcost(qmv);</div><div>@@ -1220,7 +1221,7 @@</div><div>                 MV qmv = bmv + square1[i];</div><div> </div><div>                 // check mv range for slice bound</div><div>-                if ((g_maxSlices > 1) & ((qmv.y < qmvmin.y) | (qmv.y > qmvmax.y)))</div><div>+                if ((qmv.y < qmvmin.y) | (qmv.y > qmvmax.y))</div><div>                     continue;</div><div> </div><div>                 int cost = subpelCompare(ref, qmv, satd) + mvcost(qmv);</div><div>@@ -1235,7 +1236,7 @@</div><div>     }</div><div> </div><div>     // check mv range for slice bound</div><div>-    X265_CHECK((g_maxSlices == 1) | ((bmv.y >= qmvmin.y) & (bmv.y <= qmvmax.y)), "mv beyond range!");</div><div>+    X265_CHECK(((bmv.y >= qmvmin.y) & (bmv.y <= qmvmax.y)), "mv beyond range!");</div><div> </div><div>     x265_emms();</div><div>     outQMv = bmv;</div><div><br></div></div>