[x265] [PATCH] Add option hme-range to modify search range for HME levels L0, L1 and L2

Pooja Venkatesan pooja at multicorewareinc.com
Fri Nov 29 17:35:34 CET 2019


# HG changeset patch
# User Pooja Venkatesan <pooja at multicorewareinc.com>
# Date 1568196486 -19800
#      Wed Sep 11 15:38:06 2019 +0530
# Node ID c31884e780444d00ee7a25ccbb32a9b9fd52f47a
# Parent  4a29e0c5bfaf30aaed2c5224bcba1f464d68de83
Add option hme-range to modify search range for HME levels L0, L1 and L2.

diff -r 4a29e0c5bfaf -r c31884e78044 doc/reST/cli.rst
--- a/doc/reST/cli.rst Fri Nov 08 15:30:50 2019 +0530
+++ b/doc/reST/cli.rst Wed Sep 11 15:38:06 2019 +0530
@@ -1290,6 +1290,11 @@
        which will apply to all levels. Default is hex,umh,umh for
        levels 0,1,2 respectively.

+.. option:: --hme-range <integer>,<integer>,<integer>
+
+ Search range for HME level 0, 1 and 2.
+ Default search range is 16,32,48 for level 0,1,2 respectively.
+
 Spatial/intra options
 =====================

diff -r 4a29e0c5bfaf -r c31884e78044 source/CMakeLists.txt
--- a/source/CMakeLists.txt Fri Nov 08 15:30:50 2019 +0530
+++ b/source/CMakeLists.txt Wed Sep 11 15:38:06 2019 +0530
@@ -29,7 +29,7 @@
 option(STATIC_LINK_CRT "Statically link C runtime for release builds" OFF)
 mark_as_advanced(FPROFILE_USE FPROFILE_GENERATE NATIVE_BUILD)
 # X265_BUILD must be incremented each time the public API is changed
-set(X265_BUILD 183)
+set(X265_BUILD 184)
 configure_file("${PROJECT_SOURCE_DIR}/x265.def.in"
                "${PROJECT_BINARY_DIR}/x265.def")
 configure_file("${PROJECT_SOURCE_DIR}/x265_config.h.in"
diff -r 4a29e0c5bfaf -r c31884e78044 source/common/param.cpp
--- a/source/common/param.cpp Fri Nov 08 15:30:50 2019 +0530
+++ b/source/common/param.cpp Wed Sep 11 15:38:06 2019 +0530
@@ -210,6 +210,9 @@
     param->bEnableHME = 0;
     param->hmeSearchMethod[0] = X265_HEX_SEARCH;
     param->hmeSearchMethod[1] = param->hmeSearchMethod[2] =
X265_UMH_SEARCH;
+    param->hmeRange[0] = 16;
+    param->hmeRange[1] = 32;
+    param->hmeRange[2] = 48;
     param->bSourceReferenceEstimation = 0;
     param->limitTU = 0;
     param->dynamicRd = 0;
@@ -1344,6 +1347,11 @@
             }
             p->bEnableHME = true;
         }
+        OPT("hme-range")
+        {
+            sscanf(value, "%d,%d,%d", &p->hmeRange[0], &p->hmeRange[1],
&p->hmeRange[2]);
+            p->bEnableHME = true;
+        }
         else
             return X265_PARAM_BAD_NAME;
     }
@@ -1734,6 +1742,9 @@
         "Invalid scenecut Window duration. Value must be between 0 and
1000(inclusive)");
     CHECK(param->maxQpDelta < 0 || param->maxQpDelta > 10,
         "Invalid maxQpDelta value. Value must be between 0 and 10
(inclusive)");
+    for(int level=0; level < 3; level++)
+        CHECK(param->hmeRange[level] < 0 || param->hmeRange[level] >=
32768,
+            "Search Range for HME levels must be between 0 and 32768");
 #if !X86_64
     CHECK(param->searchMethod == X265_SEA && (param->sourceWidth > 840 ||
param->sourceHeight > 480),
         "SEA motion search does not support resolutions greater than 480p
in 32 bit build");
@@ -2018,8 +2029,10 @@
     if(p->bEnableFrameDuplication)
         s += sprintf(s, " dup-threshold=%d", p->dupThreshold);
     BOOL(p->bEnableHME, "hme");
-    if (p->bEnableHME)
+    if (p->bEnableHME){
         s += sprintf(s, " Level 0,1,2=%d,%d,%d", p->hmeSearchMethod[0],
p->hmeSearchMethod[1], p->hmeSearchMethod[2]);
+        s += sprintf(s, " merange L0,L1,L2=%d,%d,%d", p->hmeRange[0],
p->hmeRange[1], p->hmeRange[2]);
+    }
     BOOL(p->bEnableWeightedPred, "weightp");
     BOOL(p->bEnableWeightedBiPred, "weightb");
     BOOL(p->bSourceReferenceEstimation, "analyze-src-pics");
@@ -2320,7 +2333,10 @@
     if (src->bEnableHME)
     {
         for (int level = 0; level < 3; level++)
+        {
             dst->hmeSearchMethod[level] = src->hmeSearchMethod[level];
+            dst->hmeRange[level] = src->hmeRange[level];
+        }
     }
     dst->bEnableWeightedBiPred = src->bEnableWeightedBiPred;
     dst->bEnableWeightedPred = src->bEnableWeightedPred;
diff -r 4a29e0c5bfaf -r c31884e78044 source/encoder/encoder.cpp
--- a/source/encoder/encoder.cpp Fri Nov 08 15:30:50 2019 +0530
+++ b/source/encoder/encoder.cpp Wed Sep 11 15:38:06 2019 +0530
@@ -4077,11 +4077,12 @@
             x265_log(p, X265_LOG_WARNING, "Source height < 540p is too low
for HME. Disabling HME.\n");
             p->bEnableHME = 0;
         }
-        if (m_param->bEnableHME && m_param->searchMethod !=
m_param->hmeSearchMethod[2])
-        {
-            m_param->searchMethod = m_param->hmeSearchMethod[2];
-        }
-    }
+    }
+
+    if (m_param->bEnableHME && m_param->searchMethod !=
m_param->hmeSearchMethod[2])
+        m_param->searchMethod = m_param->hmeSearchMethod[2];
+    if (m_param->bEnableHME && m_param->searchRange !=
m_param->hmeRange[2])
+        m_param->searchRange = m_param->hmeRange[2];

    if (p->bHistBasedSceneCut && !p->edgeTransitionThreshold)
    {
diff -r 4a29e0c5bfaf -r c31884e78044 source/encoder/slicetype.cpp
--- a/source/encoder/slicetype.cpp Fri Nov 08 15:30:50 2019 +0530
+++ b/source/encoder/slicetype.cpp Wed Sep 11 15:38:06 2019 +0530
@@ -3240,12 +3240,13 @@
             }
         }

+        int searchRange = m_lookahead.m_param->bEnableHME ? (hme ?
m_lookahead.m_param->hmeRange[0] : m_lookahead.m_param->hmeRange[1]) :
s_merange;
         /* ME will never return a cost larger than the cost @MVP, so we do
not
          * have to check that ME cost is more than the estimated merge
cost */
         if(!hme)
-            fencCost = tld.me.motionEstimate(fref, mvmin, mvmax, mvp, 0,
NULL, s_merange, *fencMV, m_lookahead.m_param->maxSlices);
+            fencCost = tld.me.motionEstimate(fref, mvmin, mvmax, mvp, 0,
NULL, searchRange, *fencMV, m_lookahead.m_param->maxSlices);
         else
-            fencCost = tld.me.motionEstimate(fref, mvmin, mvmax, mvp, 0,
NULL, s_merange, *fencMV, m_lookahead.m_param->maxSlices,
fref->lowerResPlane[0]);
+            fencCost = tld.me.motionEstimate(fref, mvmin, mvmax, mvp, 0,
NULL, searchRange, *fencMV, m_lookahead.m_param->maxSlices,
fref->lowerResPlane[0]);
         if (skipCost < 64 && skipCost < fencCost && bBidir)
         {
             fencCost = skipCost;
diff -r 4a29e0c5bfaf -r c31884e78044 source/x265.h
--- a/source/x265.h Fri Nov 08 15:30:50 2019 +0530
+++ b/source/x265.h Wed Sep 11 15:38:06 2019 +0530
@@ -1856,6 +1856,9 @@

     /* Enables histogram based scenecut detection algorithm to detect
scenecuts. Default disabled */
     int      bHistBasedSceneCut;
+
+    /* Enable HME search ranges for L0, L1 and L2 respectively. */
+    int       hmeRange[3];
 } x265_param;

 /* x265_param_alloc:
diff -r 4a29e0c5bfaf -r c31884e78044 source/x265cli.h
--- a/source/x265cli.h Fri Nov 08 15:30:50 2019 +0530
+++ b/source/x265cli.h Wed Sep 11 15:38:06 2019 +0530
@@ -351,6 +351,7 @@
 #endif
     { "cll", no_argument, NULL, 0 },
     { "no-cll", no_argument, NULL, 0 },
+    { "hme-range", required_argument, NULL, 0 },
     { 0, 0, 0, 0 },
     { 0, 0, 0, 0 },
     { 0, 0, 0, 0 },
@@ -479,6 +480,7 @@
     H1("   --[no-]temporal-mvp           Enable temporal MV predictors.
Default %s\n", OPT(param->bEnableTemporalMvp));
     H1("   --[no-]hme                    Enable Hierarchical Motion
Estimation. Default %s\n", OPT(param->bEnableHME));
     H1("   --hme-search <string>         Motion search-method for HME
L0,L1 and L2. Default(L0,L1,L2) is %d,%d,%d\n", param->hmeSearchMethod[0],
param->hmeSearchMethod[1], param->hmeSearchMethod[2]);
+    H1("   --hme-range <int>,<int>,<int> Motion search-range for HME L0,L1
and L2. Default(L0,L1,L2) is %d,%d,%d\n", param->hmeRange[0],
param->hmeRange[1], param->hmeRange[2]);
     H0("\nSpatial / intra options:\n");
     H0("   --[no-]strong-intra-smoothing Enable strong intra smoothing for
32x32 blocks. Default %s\n", OPT(param->bEnableStrongIntraSmoothing));
     H0("   --[no-]constrained-intra      Constrained intra prediction (use
only intra coded reference pixels) Default %s\n",
OPT(param->bEnableConstrainedIntra));
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20191129/739a1435/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: x265.patch
Type: application/x-patch
Size: 7938 bytes
Desc: not available
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20191129/739a1435/attachment-0001.bin>


More information about the x265-devel mailing list