>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
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