>From fe0ea37e566305be56d2a23ad34ba87e6336c0c7 Mon Sep 17 00:00:00 2001
From: Min Chen <chenm...@163.com>
Date: Fri, 14 Mar 2025 22:27:02 -0700
Subject: [PATCH] Improve with check zeroMv for Slices option

---
 source/encoder/analysis.cpp | 20 ++++++++++++++++----
 source/encoder/motion.cpp   |  8 ++++++++
 2 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/source/encoder/analysis.cpp b/source/encoder/analysis.cpp
index 5475e4800..b219d5da4 100644
--- a/source/encoder/analysis.cpp
+++ b/source/encoder/analysis.cpp
@@ -3172,12 +3172,18 @@ void Analysis::checkMerge2Nx2N_rd0_4(Mode& skip, Mode& 
merge, const CUGeom& cuGe
             if (m_param->maxSlices > 1)
             {
                 // NOTE: First row in slice can't negative
-                if (X265_MIN(candMvField[i][0].mv.y, candMvField[i][1].mv.y) < 
m_sliceMinY)
+                if (candMvField[i][0].refIdx >= 0 && 
candMvField[i][0].mv.notZero() && candMvField[i][0].mv.y < m_sliceMinY)
+                    continue;
+
+                if (candMvField[i][1].refIdx >= 0 && 
candMvField[i][1].mv.notZero() && candMvField[i][1].mv.y < m_sliceMinY)
                     continue;

                 // Last row in slice can't reference beyond bound since it is 
another slice area
                 // TODO: we may beyond bound in future since these area have a 
chance to finish because we use parallel slices. Necessary prepare research on 
load balance
-                if (X265_MAX(candMvField[i][0].mv.y, candMvField[i][1].mv.y) > 
m_sliceMaxY)
+                if (candMvField[i][0].refIdx >= 0 && 
candMvField[i][0].mv.notZero() && candMvField[i][0].mv.y > m_sliceMaxY)
+                    continue;
+
+                if (candMvField[i][1].refIdx >= 0 && 
candMvField[i][1].mv.notZero() && candMvField[i][1].mv.y > m_sliceMaxY)
                     continue;
             }

@@ -3306,12 +3312,18 @@ void Analysis::checkMerge2Nx2N_rd5_6(Mode& skip, Mode& 
merge, const CUGeom& cuGe
             if (m_param->maxSlices > 1)
             {
                 // NOTE: First row in slice can't negative
-                if (X265_MIN(candMvField[i][0].mv.y, candMvField[i][1].mv.y) < 
m_sliceMinY)
+                if (candMvField[i][0].refIdx >= 0 && 
candMvField[i][0].mv.notZero() && candMvField[i][0].mv.y < m_sliceMinY)
+                    continue;
+
+                if (candMvField[i][1].refIdx >= 0 && 
candMvField[i][1].mv.notZero() && candMvField[i][1].mv.y < m_sliceMinY)
                     continue;

                 // Last row in slice can't reference beyond bound since it is 
another slice area
                 // TODO: we may beyond bound in future since these area have a 
chance to finish because we use parallel slices. Necessary prepare research on 
load balance
-                if (X265_MAX(candMvField[i][0].mv.y, candMvField[i][1].mv.y) > 
m_sliceMaxY)
+                if (candMvField[i][0].refIdx >= 0 && 
candMvField[i][0].mv.notZero() && candMvField[i][0].mv.y > m_sliceMaxY)
+                    continue;
+
+                if (candMvField[i][1].refIdx >= 0 && 
candMvField[i][1].mv.notZero() && candMvField[i][1].mv.y > m_sliceMaxY)
                     continue;
             }

diff --git a/source/encoder/motion.cpp b/source/encoder/motion.cpp
index 58e943652..86f413c3d 100644
--- a/source/encoder/motion.cpp
+++ b/source/encoder/motion.cpp
@@ -1596,6 +1596,14 @@ me_hex2:
     // check mv range for slice bound
     X265_CHECK(((bmv.y >= qmvmin.y) & (bmv.y <= qmvmax.y)), "mv beyond 
range!");

+    // Get a chance to ZeroMv
+    if (bmv.notZero())
+    {
+      int cost = subpelCompare(ref, MV(0, 0), satd) + mvcost(MV(0, 0));
+      if (cost <= bcost)
+        bmv = MV(0, 0);
+    }
+
     x265_emms();
     outQMv = bmv;
     return bcost;
--
2.43.0.windows.1



Attachment: 0001-Improve-with-check-zeroMv-Slices.patch
Description: 0001-Improve-with-check-zeroMv-Slices.patch

_______________________________________________
x265-devel mailing list
x265-devel@videolan.org
https://mailman.videolan.org/listinfo/x265-devel

Reply via email to