<div dir="auto"><div dir="ltr"># HG changeset patch<br># User Pooja Venkatesan <<a href="mailto:pooja@multicorewareinc.com" target="_blank" rel="noreferrer">pooja@multicorewareinc.com</a>><br># Date 1568196486 -19800<br>#      Wed Sep 11 15:38:06 2019 +0530<br># Node ID c31884e780444d00ee7a25ccbb32a9b9fd52f47a<br># Parent  4a29e0c5bfaf30aaed2c5224bcba1f464d68de83<br>Add option hme-range to modify search range for HME levels L0, L1 and L2.<br><br>diff -r 4a29e0c5bfaf -r c31884e78044 doc/reST/cli.rst<br>--- a/doc/reST/cli.rst     Fri Nov 08 15:30:50 2019 +0530<br>+++ b/doc/reST/cli.rst  Wed Sep 11 15:38:06 2019 +0530<br>@@ -1290,6 +1290,11 @@<br>        which will apply to all levels. Default is hex,umh,umh for <br>        levels 0,1,2 respectively.<br> <br>+.. option:: --hme-range <integer>,<integer>,<integer><br>+<br>+     Search range for HME level 0, 1 and 2. <br>+      Default search range is 16,32,48 for level 0,1,2 respectively.<br>+<br> Spatial/intra options<br> =====================<br> <br>diff -r 4a29e0c5bfaf -r c31884e78044 source/CMakeLists.txt<br>--- a/source/CMakeLists.txt        Fri Nov 08 15:30:50 2019 +0530<br>+++ b/source/CMakeLists.txt     Wed Sep 11 15:38:06 2019 +0530<br>@@ -29,7 +29,7 @@<br> option(STATIC_LINK_CRT "Statically link C runtime for release builds" OFF)<br> mark_as_advanced(FPROFILE_USE FPROFILE_GENERATE NATIVE_BUILD)<br> # X265_BUILD must be incremented each time the public API is changed<br>-set(X265_BUILD 183)<br>+set(X265_BUILD 184)<br> configure_file("${PROJECT_SOURCE_DIR}/<a href="http://x265.def.in" target="_blank" rel="noreferrer">x265.def.in</a>"<br>                "${PROJECT_BINARY_DIR}/x265.def")<br> configure_file("${PROJECT_SOURCE_DIR}/<a href="http://x265_config.h.in" target="_blank" rel="noreferrer">x265_config.h.in</a>"<br>diff -r 4a29e0c5bfaf -r c31884e78044 source/common/param.cpp<br>--- a/source/common/param.cpp      Fri Nov 08 15:30:50 2019 +0530<br>+++ b/source/common/param.cpp   Wed Sep 11 15:38:06 2019 +0530<br>@@ -210,6 +210,9 @@<br>     param->bEnableHME = 0;<br>     param->hmeSearchMethod[0] = X265_HEX_SEARCH;<br>     param->hmeSearchMethod[1] = param->hmeSearchMethod[2] = X265_UMH_SEARCH;<br>+    param->hmeRange[0] = 16;<br>+    param->hmeRange[1] = 32;<br>+    param->hmeRange[2] = 48;<br>     param->bSourceReferenceEstimation = 0;<br>     param->limitTU = 0;<br>     param->dynamicRd = 0;<br>@@ -1344,6 +1347,11 @@<br>             }<br>             p->bEnableHME = true;<br>         }<br>+        OPT("hme-range")<br>+        {<br>+            sscanf(value, "%d,%d,%d", &p->hmeRange[0], &p->hmeRange[1], &p->hmeRange[2]);<br>+            p->bEnableHME = true;<br>+        }<br>         else<br>             return X265_PARAM_BAD_NAME;<br>     }<br>@@ -1734,6 +1742,9 @@<br>         "Invalid scenecut Window duration. Value must be between 0 and 1000(inclusive)");<br>     CHECK(param->maxQpDelta < 0 || param->maxQpDelta > 10,<br>         "Invalid maxQpDelta value. Value must be between 0 and 10 (inclusive)");<br>+    for(int level=0; level < 3; level++)<br>+        CHECK(param->hmeRange[level] < 0 || param->hmeRange[level] >= 32768,<br>+            "Search Range for HME levels must be between 0 and 32768");<br> #if !X86_64<br>     CHECK(param->searchMethod == X265_SEA && (param->sourceWidth > 840 || param->sourceHeight > 480),<br>         "SEA motion search does not support resolutions greater than 480p in 32 bit build");<br>@@ -2018,8 +2029,10 @@<br>     if(p->bEnableFrameDuplication)<br>         s += sprintf(s, " dup-threshold=%d", p->dupThreshold);<br>     BOOL(p->bEnableHME, "hme");<br>-    if (p->bEnableHME)<br>+    if (p->bEnableHME){<br>         s += sprintf(s, " Level 0,1,2=%d,%d,%d", p->hmeSearchMethod[0], p->hmeSearchMethod[1], p->hmeSearchMethod[2]);<br>+        s += sprintf(s, " merange L0,L1,L2=%d,%d,%d", p->hmeRange[0], p->hmeRange[1], p->hmeRange[2]);<br>+    }<br>     BOOL(p->bEnableWeightedPred, "weightp");<br>     BOOL(p->bEnableWeightedBiPred, "weightb");<br>     BOOL(p->bSourceReferenceEstimation, "analyze-src-pics");<br>@@ -2320,7 +2333,10 @@<br>     if (src->bEnableHME)<br>     {<br>         for (int level = 0; level < 3; level++)<br>+        {<br>             dst->hmeSearchMethod[level] = src->hmeSearchMethod[level];<br>+            dst->hmeRange[level] = src->hmeRange[level];<br>+        }<br>     }<br>     dst->bEnableWeightedBiPred = src->bEnableWeightedBiPred;<br>     dst->bEnableWeightedPred = src->bEnableWeightedPred;<br>diff -r 4a29e0c5bfaf -r c31884e78044 source/encoder/encoder.cpp<br>--- a/source/encoder/encoder.cpp       Fri Nov 08 15:30:50 2019 +0530<br>+++ b/source/encoder/encoder.cpp        Wed Sep 11 15:38:06 2019 +0530<br>@@ -4077,11 +4077,12 @@<br>             x265_log(p, X265_LOG_WARNING, "Source height < 540p is too low for HME. Disabling HME.\n");<br>             p->bEnableHME = 0;<br>         }<br>-        if (m_param->bEnableHME && m_param->searchMethod != m_param->hmeSearchMethod[2])<br>-        {<br>-            m_param->searchMethod = m_param->hmeSearchMethod[2];<br>-        }<br>-    }<br>+    }<br>+<br>+    if (m_param->bEnableHME && m_param->searchMethod != m_param->hmeSearchMethod[2])<br>+        m_param->searchMethod = m_param->hmeSearchMethod[2];<br>+    if (m_param->bEnableHME && m_param->searchRange != m_param->hmeRange[2])<br>+        m_param->searchRange = m_param->hmeRange[2];<br> <br>    if (p->bHistBasedSceneCut && !p->edgeTransitionThreshold)<br>    {<br>diff -r 4a29e0c5bfaf -r c31884e78044 source/encoder/slicetype.cpp<br>--- a/source/encoder/slicetype.cpp        Fri Nov 08 15:30:50 2019 +0530<br>+++ b/source/encoder/slicetype.cpp      Wed Sep 11 15:38:06 2019 +0530<br>@@ -3240,12 +3240,13 @@<br>             }<br>         }<br> <br>+        int searchRange = m_lookahead.m_param->bEnableHME ? (hme ? m_lookahead.m_param->hmeRange[0] : m_lookahead.m_param->hmeRange[1]) : s_merange;<br>         /* ME will never return a cost larger than the cost @MVP, so we do not<br>          * have to check that ME cost is more than the estimated merge cost */<br>         if(!hme)<br>-            fencCost = tld.me.motionEstimate(fref, mvmin, mvmax, mvp, 0, NULL, s_merange, *fencMV, m_lookahead.m_param->maxSlices);<br>+            fencCost = tld.me.motionEstimate(fref, mvmin, mvmax, mvp, 0, NULL, searchRange, *fencMV, m_lookahead.m_param->maxSlices);<br>         else<br>-            fencCost = tld.me.motionEstimate(fref, mvmin, mvmax, mvp, 0, NULL, s_merange, *fencMV, m_lookahead.m_param->maxSlices, fref->lowerResPlane[0]);<br>+            fencCost = tld.me.motionEstimate(fref, mvmin, mvmax, mvp, 0, NULL, searchRange, *fencMV, m_lookahead.m_param->maxSlices, fref->lowerResPlane[0]);<br>         if (skipCost < 64 && skipCost < fencCost && bBidir)<br>         {<br>             fencCost = skipCost;<br>diff -r 4a29e0c5bfaf -r c31884e78044 source/x265.h<br>--- a/source/x265.h      Fri Nov 08 15:30:50 2019 +0530<br>+++ b/source/x265.h     Wed Sep 11 15:38:06 2019 +0530<br>@@ -1856,6 +1856,9 @@<br> <br>     /* Enables histogram based scenecut detection algorithm to detect scenecuts. Default disabled */<br>     int      bHistBasedSceneCut;<br>+<br>+    /* Enable HME search ranges for L0, L1 and L2 respectively. */<br>+    int       hmeRange[3];<br> } x265_param;<br> <br> /* x265_param_alloc:<br>diff -r 4a29e0c5bfaf -r c31884e78044 source/x265cli.h<br>--- a/source/x265cli.h    Fri Nov 08 15:30:50 2019 +0530<br>+++ b/source/x265cli.h  Wed Sep 11 15:38:06 2019 +0530<br>@@ -351,6 +351,7 @@<br> #endif<br>     { "cll", no_argument, NULL, 0 },<br>     { "no-cll", no_argument, NULL, 0 },<br>+    { "hme-range", required_argument, NULL, 0 },<br>     { 0, 0, 0, 0 },<br>     { 0, 0, 0, 0 },<br>     { 0, 0, 0, 0 },<br>@@ -479,6 +480,7 @@<br>     H1("   --[no-]temporal-mvp           Enable temporal MV predictors. Default %s\n", OPT(param->bEnableTemporalMvp));<br>     H1("   --[no-]hme                    Enable Hierarchical Motion Estimation. Default %s\n", OPT(param->bEnableHME));<br>     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]);<br>+    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]);<br>     H0("\nSpatial / intra options:\n");<br>     H0("   --[no-]strong-intra-smoothing Enable strong intra smoothing for 32x32 blocks. Default %s\n", OPT(param->bEnableStrongIntraSmoothing));<br>     H0("   --[no-]constrained-intra      Constrained intra prediction (use only intra coded reference pixels) Default %s\n", OPT(param->bEnableConstrainedIntra));<br></div></div>