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

Pooja Venkatesan pooja at multicorewareinc.com
Mon Dec 2 13:07:18 CET 2019


Hi Aruna,
I have incorporated the changes suggested by you. Thanks and PFA the
modified patch.

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

diff -r f8a38d6ef1eb -r 7685a9d072a2 doc/reST/cli.rst
--- a/doc/reST/cli.rst Thu Nov 28 18:37:53 2019 +0530
+++ b/doc/reST/cli.rst Wed Sep 11 15:38:06 2019 +0530
@@ -1290,6 +1290,12 @@
        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.
+ The Search Range for each HME level must be between 0 and
32768(excluding).
+ Default search range is 16,32,48 for level 0,1,2 respectively.
+
 Spatial/intra options
 =====================

diff -r f8a38d6ef1eb -r 7685a9d072a2 source/CMakeLists.txt
--- a/source/CMakeLists.txt Thu Nov 28 18:37:53 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 f8a38d6ef1eb -r 7685a9d072a2 source/common/param.cpp
--- a/source/common/param.cpp Thu Nov 28 18:37:53 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");
@@ -2019,7 +2030,10 @@
         s += sprintf(s, " dup-threshold=%d", p->dupThreshold);
     BOOL(p->bEnableHME, "hme");
     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 +2334,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 f8a38d6ef1eb -r 7685a9d072a2 source/encoder/encoder.cpp
--- a/source/encoder/encoder.cpp Thu Nov 28 18:37:53 2019 +0530
+++ b/source/encoder/encoder.cpp Wed Sep 11 15:38:06 2019 +0530
@@ -4079,10 +4079,14 @@
             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])
-        {
+    }
+
+    if (m_param->bEnableHME)
+    {
+        if (m_param->searchMethod != m_param->hmeSearchMethod[2])
             m_param->searchMethod = m_param->hmeSearchMethod[2];
-        }
+        if (m_param->searchRange != m_param->hmeRange[2])
+            m_param->searchRange = m_param->hmeRange[2];
     }

    if (p->bHistBasedSceneCut && !p->edgeTransitionThreshold)
diff -r f8a38d6ef1eb -r 7685a9d072a2 source/encoder/slicetype.cpp
--- a/source/encoder/slicetype.cpp Thu Nov 28 18:37:53 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 f8a38d6ef1eb -r 7685a9d072a2 source/x265.h
--- a/source/x265.h Thu Nov 28 18:37:53 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 f8a38d6ef1eb -r 7685a9d072a2 source/x265cli.h
--- a/source/x265cli.h Thu Nov 28 18:37:53 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));

On Sun, Dec 1, 2019 at 10:53 PM Aruna Matheswaran <
aruna at multicorewareinc.com> wrote:

>
>
> On Fri, Nov 29, 2019 at 10:06 PM Pooja Venkatesan <
> pooja at multicorewareinc.com> wrote:
>
>> # 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.
>> +
>>
> Please specify the search range allowed at each level.
>
>>  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++)
>>
> Indentation issue here.
>
>> +        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){
>>
> Indentation issue.
>
>>          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];
>>
> Could avoid redundant checks on m_param->bEnableHME.
>
>
>>     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));
>> _______________________________________________
>> x265-devel mailing list
>> x265-devel at videolan.org
>> https://mailman.videolan.org/listinfo/x265-devel
>>
>
>
> --
> Regards,
> *Aruna Matheswaran,*
> Video Codec Engineer,
> Media & AI analytics BU,
>
>
>
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20191202/40e0eedf/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: x265-hme.patch
Type: application/x-patch
Size: 7898 bytes
Desc: not available
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20191202/40e0eedf/attachment-0001.bin>


More information about the x265-devel mailing list