Zero MV is only one special case of the problem.

The code of MV restriction calculation:
    tld.analysis.m_sliceMinY = -(int32_t)(rowInSlice * 
m_param->maxCUSize * 4) + 3 * 4;
    tld.analysis.m_sliceMaxY = (int32_t)((endRowInSlicePlus1 - 1 - 
row) * (m_param->maxCUSize * 4) - 4 * 4);


The constants will cause MVs to be restricted to &gt;12 or <-16 in slice 
boundaries.
example:
&nbsp; &nbsp; minY: -2036, maxY: -16
or
&nbsp; &nbsp; minY: 12, maxY: 1776
So any MV that has its Y-axis in the range of -16 to 12 will have problem.


         Original
         
       




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

 
 ---
 &nbsp;source/encoder/analysis.cpp | 4 ++--
 &nbsp;source/encoder/motion.cpp &nbsp; | 8 ++++++++
 &nbsp;2 files changed, 10 insertions(+), 2 deletions(-)

 
 diff --git a/source/encoder/analysis.cpp b/source/encoder/analysis.cpp
 index 5475e4800..e3c410e59 100644
 --- a/source/encoder/analysis.cpp
 +++ b/source/encoder/analysis.cpp
 @@ -3166,7 +3166,7 @@ void Analysis::checkMerge2Nx2N_rd0_4(Mode&amp; skip, 
Mode&amp; merge, const CUGeom&amp; cuGe
 &nbsp; &nbsp; &nbsp;}
 &nbsp; &nbsp; &nbsp;for (uint32_t i = 0; i < numMergeCand; ++i)
 &nbsp; &nbsp; &nbsp;{
 - &nbsp; &nbsp; &nbsp; &nbsp;if (m_bFrameParallel)
 + &nbsp; &nbsp; &nbsp; &nbsp;if (m_bFrameParallel &amp;&amp; 
candMvField[i][0].mv.notZero())
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Parallel slices bound check
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (m_param-&gt;maxSlices &gt; 
1)
 @@ -3300,7 +3300,7 @@ void Analysis::checkMerge2Nx2N_rd5_6(Mode&amp; skip, 
Mode&amp; merge, const CUGeom&amp; cuGe
 &nbsp; &nbsp; &nbsp;}
 &nbsp; &nbsp; &nbsp;for (uint32_t i = 0; i < numMergeCand; i++)
 &nbsp; &nbsp; &nbsp;{
 - &nbsp; &nbsp; &nbsp; &nbsp;if (m_bFrameParallel)
 + &nbsp; &nbsp; &nbsp; &nbsp;if (m_bFrameParallel &amp;&amp; 
candMvField[i][0].mv.notZero())
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Parallel slices bound check
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (m_param-&gt;maxSlices &gt; 
1)
 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:
 &nbsp; &nbsp; &nbsp;// check mv range for slice bound
 &nbsp; &nbsp; &nbsp;X265_CHECK(((bmv.y &gt;= qmvmin.y) &amp; (bmv.y <= 
qmvmax.y)), "mv beyond range!");
 &nbsp;
 + &nbsp; &nbsp;// Get a chance to ZeroMv
 + &nbsp; &nbsp;if (bmv.notZero())
 + &nbsp; &nbsp;{
 + &nbsp; &nbsp; &nbsp;int cost = subpelCompare(ref, MV(0, 0), satd) + 
mvcost(MV(0, 0));
 + &nbsp; &nbsp; &nbsp;if (cost <= bcost)
 + &nbsp; &nbsp; &nbsp; &nbsp;bmv = MV(0, 0);
 + &nbsp; &nbsp;}
 +
 &nbsp; &nbsp; &nbsp;x265_emms();
 &nbsp; &nbsp; &nbsp;outQMv = bmv;
 &nbsp; &nbsp; &nbsp;return bcost;
 --&nbsp;
 2.43.0.windows.1
_______________________________________________
x265-devel mailing list
x265-devel@videolan.org
https://mailman.videolan.org/listinfo/x265-devel

Reply via email to