<div dir="ltr"><div dir="ltr">Pushed to default.</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Jul 10, 2019 at 9:47 AM <<a href="mailto:pooja@multicorewareinc.com">pooja@multicorewareinc.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"># HG changeset patch<br>
# User Pooja Venkatesan <<a href="mailto:pooja@multicorewareinc.com" target="_blank">pooja@multicorewareinc.com</a>><br>
# Date 1562305646 -19800<br>
#      Fri Jul 05 11:17:26 2019 +0530<br>
# Node ID 14a235657a2011aa28d45544f33b7186c33b9218<br>
# Parent  4f6dde51a5db4f9229bddb60db176f16ac98f505<br>
motion: Implement 3-level Hierarchial Motion Estimation<br>
<br>
This patch does the following:<br>
1) Create HME-level 0 planes<br>
2) Add option "--hme" and "--hme-search" to enable HME<br>
and to select search method for levels 0, 1 and 2<br>
<br>
diff -r 4f6dde51a5db -r 14a235657a20 doc/reST/cli.rst<br>
--- a/doc/reST/cli.rst  Fri Jul 05 10:47:15 2019 +0530<br>
+++ b/doc/reST/cli.rst  Fri Jul 05 11:17:26 2019 +0530<br>
@@ -1261,6 +1261,18 @@<br>
        Enable motion estimation with source frame pixels, in this mode, <br>
        motion estimation can be computed independently. Default disabled.<br>
<br>
+.. option:: --hme, --no-hme<br>
+<br>
+       Enable 3-level Hierarchical motion estimation at One-Sixteenth, <br>
+       Quarter and Full resolution. Default disabled.<br>
+<br>
+.. option:: --hme-search <integer|string>,<integer|string>,<integer|string><br>
+<br>
+       Motion search method for HME Level 0, 1 and 2. Refer to :option:`--me` for values.<br>
+       Specify search method for each level. Alternatively, specify a single value<br>
+       which will apply to all levels. Default is hex,umh,umh for <br>
+       levels 0,1,2 respectively.<br>
+<br>
 Spatial/intra options<br>
 =====================<br>
<br>
diff -r 4f6dde51a5db -r 14a235657a20 source/CMakeLists.txt<br>
--- a/source/CMakeLists.txt     Fri Jul 05 10:47:15 2019 +0530<br>
+++ b/source/CMakeLists.txt     Fri Jul 05 11:17:26 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 176)<br>
+set(X265_BUILD 177)<br>
 configure_file("${PROJECT_SOURCE_DIR}/<a href="http://x265.def.in" rel="noreferrer" target="_blank">x265.def.in</a>"<br>
                "${PROJECT_BINARY_DIR}/x265.def")<br>
 configure_file("${PROJECT_SOURCE_DIR}/<a href="http://x265_config.h.in" rel="noreferrer" target="_blank">x265_config.h.in</a>"<br>
diff -r 4f6dde51a5db -r 14a235657a20 source/common/lowres.cpp<br>
--- a/source/common/lowres.cpp  Fri Jul 05 10:47:15 2019 +0530<br>
+++ b/source/common/lowres.cpp  Fri Jul 05 11:17:26 2019 +0530<br>
@@ -55,6 +55,7 @@<br>
     heightFullRes = origPic->m_picHeight;<br>
     width = origPic->m_picWidth / 2;<br>
     lines = origPic->m_picHeight / 2;<br>
+    bEnableHME = param->bEnableHME ? 1 : 0;<br>
     lumaStride = width + 2 * origPic->m_lumaMarginX;<br>
     if (lumaStride & 31)<br>
         lumaStride += 32 - (lumaStride & 31);<br>
@@ -137,6 +138,26 @@<br>
     lowresPlane[2] = buffer[2] + padoffset;<br>
     lowresPlane[3] = buffer[3] + padoffset;<br>
<br>
+    if (bEnableHME)<br>
+    {<br>
+        intptr_t lumaStrideHalf = lumaStride / 2;<br>
+        if (lumaStrideHalf & 31)<br>
+            lumaStrideHalf += 32 - (lumaStrideHalf & 31);<br>
+        size_t planesizeHalf = planesize / 2;<br>
+        size_t padoffsetHalf = padoffset / 2;<br>
+        /* allocate lower-res buffers */<br>
+        CHECKED_MALLOC_ZERO(lowerResBuffer[0], pixel, 4 * planesizeHalf);<br>
+<br>
+        lowerResBuffer[1] = lowerResBuffer[0] + planesizeHalf;<br>
+        lowerResBuffer[2] = lowerResBuffer[1] + planesizeHalf;<br>
+        lowerResBuffer[3] = lowerResBuffer[2] + planesizeHalf;<br>
+<br>
+        lowerResPlane[0] = lowerResBuffer[0] + padoffsetHalf;<br>
+        lowerResPlane[1] = lowerResBuffer[1] + padoffsetHalf;<br>
+        lowerResPlane[2] = lowerResBuffer[2] + padoffsetHalf;<br>
+        lowerResPlane[3] = lowerResBuffer[3] + padoffsetHalf;<br>
+    }<br>
+<br>
     CHECKED_MALLOC(intraCost, int32_t, cuCount);<br>
     CHECKED_MALLOC(intraMode, uint8_t, cuCount);<br>
<br>
@@ -166,6 +187,8 @@<br>
 void Lowres::destroy()<br>
 {<br>
     X265_FREE(buffer[0]);<br>
+    if(bEnableHME)<br>
+        X265_FREE(lowerResBuffer[0]);<br>
     X265_FREE(intraCost);<br>
     X265_FREE(intraMode);<br>
<br>
@@ -253,5 +276,18 @@<br>
     extendPicBorder(lowresPlane[1], lumaStride, width, lines, origPic->m_lumaMarginX, origPic->m_lumaMarginY);<br>
     extendPicBorder(lowresPlane[2], lumaStride, width, lines, origPic->m_lumaMarginX, origPic->m_lumaMarginY);<br>
     extendPicBorder(lowresPlane[3], lumaStride, width, lines, origPic->m_lumaMarginX, origPic->m_lumaMarginY);<br>
+    <br>
+    if (origPic->m_param->bEnableHME)<br>
+    {<br>
+        primitives.frameInitLowerRes(lowresPlane[0],<br>
+            lowerResPlane[0], lowerResPlane[1], lowerResPlane[2], lowerResPlane[3],<br>
+            lumaStride, lumaStride/2, (width / 2), (lines / 2));<br>
+        extendPicBorder(lowerResPlane[0], lumaStride/2, width/2, lines/2, origPic->m_lumaMarginX/2, origPic->m_lumaMarginY/2);<br>
+        extendPicBorder(lowerResPlane[1], lumaStride/2, width/2, lines/2, origPic->m_lumaMarginX/2, origPic->m_lumaMarginY/2);<br>
+        extendPicBorder(lowerResPlane[2], lumaStride/2, width/2, lines/2, origPic->m_lumaMarginX/2, origPic->m_lumaMarginY/2);<br>
+        extendPicBorder(lowerResPlane[3], lumaStride/2, width/2, lines/2, origPic->m_lumaMarginX/2, origPic->m_lumaMarginY/2);<br>
+        fpelLowerResPlane[0] = lowerResPlane[0];<br>
+    }<br>
+<br>
     fpelPlane[0] = lowresPlane[0];<br>
 }<br>
diff -r 4f6dde51a5db -r 14a235657a20 source/common/lowres.h<br>
--- a/source/common/lowres.h    Fri Jul 05 10:47:15 2019 +0530<br>
+++ b/source/common/lowres.h    Fri Jul 05 11:17:26 2019 +0530<br>
@@ -40,6 +40,10 @@<br>
     pixel*   lowresPlane[4];<br>
     PicYuv*  reconPic;<br>
<br>
+    /* 1/16th resolution : Level-0 HME planes */<br>
+    pixel*   fpelLowerResPlane[3];<br>
+    pixel*   lowerResPlane[4];<br>
+<br>
     bool     isWeighted;<br>
     bool     isLowres;<br>
<br>
@@ -150,6 +154,7 @@<br>
 struct Lowres : public ReferencePlanes<br>
 {<br>
     pixel *buffer[4];<br>
+    pixel *lowerResBuffer[4]; // Level-0 buffer<br>
<br>
     int    frameNum;         // Presentation frame number<br>
     int    sliceType;        // Slice type decided by lookahead<br>
@@ -181,6 +186,9 @@<br>
     uint32_t  maxBlocksInRowFullRes;<br>
     uint32_t  maxBlocksInColFullRes;<br>
<br>
+    /* Hierarchical Motion Estimation */<br>
+    bool      bEnableHME;<br>
+<br>
     /* used for vbvLookahead */<br>
     int       plannedType[X265_LOOKAHEAD_MAX + 1];<br>
     int64_t   plannedSatd[X265_LOOKAHEAD_MAX + 1];<br>
diff -r 4f6dde51a5db -r 14a235657a20 source/common/param.cpp<br>
--- a/source/common/param.cpp   Fri Jul 05 10:47:15 2019 +0530<br>
+++ b/source/common/param.cpp   Fri Jul 05 11:17:26 2019 +0530<br>
@@ -201,6 +201,9 @@<br>
     param->bEnableTSkipFast = 0;<br>
     param->maxNumReferences = 3;<br>
     param->bEnableTemporalMvp = 1;<br>
+    param->bEnableHME = 0;<br>
+    param->hmeSearchMethod[0] = X265_HEX_SEARCH;<br>
+    param->hmeSearchMethod[1] = param->hmeSearchMethod[2] = X265_UMH_SEARCH;<br>
     param->bSourceReferenceEstimation = 0;<br>
     param->limitTU = 0;<br>
     param->dynamicRd = 0;<br>
@@ -1282,6 +1285,27 @@<br>
         OPT("fades") p->bEnableFades = atobool(value);<br>
         OPT("field") p->bField = atobool( value );<br>
         OPT("cll") p->bEmitCLL = atobool(value);<br>
+        OPT("hme") p->bEnableHME = atobool(value);<br>
+        OPT("hme-search")<br>
+        {<br>
+            char search[3][5];<br>
+            memset(search, '\0', 15 * sizeof(char));<br>
+            if(3 == sscanf(value, "%d,%d,%d", &p->hmeSearchMethod[0], &p->hmeSearchMethod[1], &p->hmeSearchMethod[2]) ||<br>
+               3 == sscanf(value, "%4[^,],%4[^,],%4[^,]", search[0], search[1], search[2]))<br>
+            {<br>
+                if(search[0][0])<br>
+                    for(int level = 0; level < 3; level++)<br>
+                        p->hmeSearchMethod[level] = parseName(search[level], x265_motion_est_names, bError);<br>
+            }<br>
+            else if (sscanf(value, "%d", &p->hmeSearchMethod[0]) || sscanf(value, "%s", search[0]))<br>
+            {<br>
+                if (search[0][0]) {<br>
+                    p->hmeSearchMethod[0] = parseName(search[0], x265_motion_est_names, bError);<br>
+                    p->hmeSearchMethod[1] = p->hmeSearchMethod[2] = p->hmeSearchMethod[0];<br>
+                }<br>
+            }<br>
+            p->bEnableHME = true;<br>
+        }<br>
         else<br>
             return X265_PARAM_BAD_NAME;<br>
     }<br>
@@ -1732,8 +1756,13 @@<br>
     x265_log(param, X265_LOG_INFO, "Residual QT: max TU size, max depth : %d / %d inter / %d intra\n",<br>
              param->maxTUSize, param->tuQTMaxInterDepth, param->tuQTMaxIntraDepth);<br>
<br>
-    x265_log(param, X265_LOG_INFO, "ME / range / subpel / merge         : %s / %d / %d / %d\n",<br>
-             x265_motion_est_names[param->searchMethod], param->searchRange, param->subpelRefine, param->maxNumMergeCand);<br>
+    if (param->bEnableHME)<br>
+        x265_log(param, X265_LOG_INFO, "HME L0,1,2 / range / subpel / merge : %s, %s, %s / %d / %d / %d\n",<br>
+            x265_motion_est_names[param->hmeSearchMethod[0]], x265_motion_est_names[param->hmeSearchMethod[1]], x265_motion_est_names[param->hmeSearchMethod[2]], param->searchRange, param->subpelRefine, param->maxNumMergeCand);<br>
+    else<br>
+        x265_log(param, X265_LOG_INFO, "ME / range / subpel / merge         : %s / %d / %d / %d\n",<br>
+            x265_motion_est_names[param->searchMethod], param->searchRange, param->subpelRefine, param->maxNumMergeCand);<br>
+<br>
     if (param->keyframeMax != INT_MAX || param->scenecutThreshold)<br>
         x265_log(param, X265_LOG_INFO, "Keyframe min / max / scenecut / bias: %d / %d / %d / %.2lf\n", param->keyframeMin, param->keyframeMax, param->scenecutThreshold, param->scenecutBias * 100);<br>
     else<br>
@@ -1928,6 +1957,9 @@<br>
     s += sprintf(s, " subme=%d", p->subpelRefine);<br>
     s += sprintf(s, " merange=%d", p->searchRange);<br>
     BOOL(p->bEnableTemporalMvp, "temporal-mvp");<br>
+    BOOL(p->bEnableHME, "hme");<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>
     BOOL(p->bEnableWeightedPred, "weightp");<br>
     BOOL(p->bEnableWeightedBiPred, "weightb");<br>
     BOOL(p->bSourceReferenceEstimation, "analyze-src-pics");<br>
@@ -2215,6 +2247,12 @@<br>
     dst->subpelRefine = src->subpelRefine;<br>
     dst->searchRange = src->searchRange;<br>
     dst->bEnableTemporalMvp = src->bEnableTemporalMvp;<br>
+    dst->bEnableHME = src->bEnableHME;<br>
+    if (src->bEnableHME)<br>
+    {<br>
+        for (int level = 0; level < 3; level++)<br>
+            dst->hmeSearchMethod[level] = src->hmeSearchMethod[level];<br>
+    }<br>
     dst->bEnableWeightedBiPred = src->bEnableWeightedBiPred;<br>
     dst->bEnableWeightedPred = src->bEnableWeightedPred;<br>
     dst->bSourceReferenceEstimation = src->bSourceReferenceEstimation;<br>
diff -r 4f6dde51a5db -r 14a235657a20 source/common/pixel.cpp<br>
--- a/source/common/pixel.cpp   Fri Jul 05 10:47:15 2019 +0530<br>
+++ b/source/common/pixel.cpp   Fri Jul 05 11:17:26 2019 +0530<br>
@@ -1309,6 +1309,7 @@<br>
     p.scale1D_128to64[NONALIGNED] = p.scale1D_128to64[ALIGNED] = scale1D_128to64;<br>
     p.scale2D_64to32 = scale2D_64to32;<br>
     p.frameInitLowres = frame_init_lowres_core;<br>
+    p.frameInitLowerRes = frame_init_lowres_core;<br>
     p.ssim_4x4x2_core = ssim_4x4x2_core;<br>
     p.ssim_end_4 = ssim_end_4;<br>
<br>
diff -r 4f6dde51a5db -r 14a235657a20 source/common/primitives.h<br>
--- a/source/common/primitives.h        Fri Jul 05 10:47:15 2019 +0530<br>
+++ b/source/common/primitives.h        Fri Jul 05 11:17:26 2019 +0530<br>
@@ -349,6 +349,7 @@<br>
     saoCuStatsE3_t        saoCuStatsE3;<br>
<br>
     downscale_t           frameInitLowres;<br>
+    downscale_t           frameInitLowerRes;<br>
     cutree_propagate_cost propagateCost;<br>
     cutree_fix8_unpack    fix8Unpack;<br>
     cutree_fix8_pack      fix8Pack;<br>
diff -r 4f6dde51a5db -r 14a235657a20 source/common/x86/asm-primitives.cpp<br>
--- a/source/common/x86/asm-primitives.cpp      Fri Jul 05 10:47:15 2019 +0530<br>
+++ b/source/common/x86/asm-primitives.cpp      Fri Jul 05 11:17:26 2019 +0530<br>
@@ -1090,6 +1090,7 @@<br>
         LUMA_VSS_FILTERS(sse2);<br>
<br>
         p.frameInitLowres = PFX(frame_init_lowres_core_sse2);<br>
+        p.frameInitLowerRes = PFX(frame_init_lowres_core_sse2);<br>
         // TODO: the planecopy_sp is really planecopy_SC now, must be fix it <br>
         //p.planecopy_sp = PFX(downShift_16_sse2);<br>
         p.planecopy_sp_shl = PFX(upShift_16_sse2);<br>
@@ -1132,6 +1133,7 @@<br>
         <a href="http://p.cu" rel="noreferrer" target="_blank">p.cu</a>[BLOCK_8x8].idct = PFX(idct8_ssse3);<br>
<br>
         p.frameInitLowres = PFX(frame_init_lowres_core_ssse3);<br>
+        p.frameInitLowerRes = PFX(frame_init_lowres_core_ssse3);<br>
<br>
         ALL_LUMA_PU(convert_p2s[ALIGNED], filterPixelToShort, ssse3);<br>
         ALL_LUMA_PU(convert_p2s[NONALIGNED], filterPixelToShort, ssse3);<br>
@@ -1453,6 +1455,7 @@<br>
         <a href="http://p.cu" rel="noreferrer" target="_blank">p.cu</a>[BLOCK_64x64].copy_sp = (copy_sp_t)PFX(blockcopy_ss_64x64_avx);<br>
<br>
         p.frameInitLowres = PFX(frame_init_lowres_core_avx);<br>
+        p.frameInitLowerRes = PFX(frame_init_lowres_core_avx);<br>
<br>
         p.pu[LUMA_64x16].copy_pp = (copy_pp_t)PFX(blockcopy_ss_64x16_avx);<br>
         p.pu[LUMA_64x32].copy_pp = (copy_pp_t)PFX(blockcopy_ss_64x32_avx);<br>
@@ -1469,6 +1472,7 @@<br>
 #endif<br>
         LUMA_VAR(xop);<br>
         p.frameInitLowres = PFX(frame_init_lowres_core_xop);<br>
+        p.frameInitLowerRes = PFX(frame_init_lowres_core_xop);<br>
     }<br>
     if (cpuMask & X265_CPU_AVX2)<br>
     {<br>
@@ -2296,6 +2300,7 @@<br>
         p.chroma[X265_CSP_I444].pu[LUMA_64x64].filter_vsp = PFX(interp_4tap_vert_sp_64x64_avx2);<br>
<br>
         p.frameInitLowres = PFX(frame_init_lowres_core_avx2);<br>
+        p.frameInitLowerRes = PFX(frame_init_lowres_core_avx2);<br>
         p.propagateCost = PFX(mbtree_propagate_cost_avx2);<br>
         p.fix8Unpack = PFX(cutree_fix8_unpack_avx2);<br>
         p.fix8Pack = PFX(cutree_fix8_pack_avx2);<br>
@@ -3294,6 +3299,7 @@<br>
<br>
         //p.frameInitLowres = PFX(frame_init_lowres_core_mmx2);<br>
         p.frameInitLowres = PFX(frame_init_lowres_core_sse2);<br>
+        p.frameInitLowerRes = PFX(frame_init_lowres_core_sse2);<br>
<br>
         ALL_LUMA_TU(blockfill_s[NONALIGNED], blockfill_s, sse2);<br>
         ALL_LUMA_TU(blockfill_s[ALIGNED], blockfill_s, sse2);<br>
@@ -3414,6 +3420,7 @@<br>
         p.pu[LUMA_8x8].luma_hvpp = PFX(interp_8tap_hv_pp_8x8_ssse3);<br>
<br>
         p.frameInitLowres = PFX(frame_init_lowres_core_ssse3);<br>
+        p.frameInitLowerRes = PFX(frame_init_lowres_core_ssse3);<br>
         ASSIGN2(p.scale1D_128to64, scale1D_128to64_ssse3);<br>
         p.scale2D_64to32 = PFX(scale2D_64to32_ssse3);<br>
<br>
@@ -3682,6 +3689,7 @@<br>
         p.pu[LUMA_48x64].copy_pp = PFX(blockcopy_pp_48x64_avx);<br>
<br>
         p.frameInitLowres = PFX(frame_init_lowres_core_avx);<br>
+        p.frameInitLowerRes = PFX(frame_init_lowres_core_avx);<br>
         p.propagateCost = PFX(mbtree_propagate_cost_avx);<br>
     }<br>
     if (cpuMask & X265_CPU_XOP)<br>
@@ -3693,6 +3701,8 @@<br>
         <a href="http://p.cu" rel="noreferrer" target="_blank">p.cu</a>[BLOCK_8x8].sse_pp = PFX(pixel_ssd_8x8_xop);<br>
         <a href="http://p.cu" rel="noreferrer" target="_blank">p.cu</a>[BLOCK_16x16].sse_pp = PFX(pixel_ssd_16x16_xop);<br>
         p.frameInitLowres = PFX(frame_init_lowres_core_xop);<br>
+        p.frameInitLowerRes = PFX(frame_init_lowres_core_xop);<br>
+<br>
     }<br>
 #if X86_64<br>
     if (cpuMask & X265_CPU_AVX2)<br>
@@ -4667,6 +4677,7 @@<br>
         p.chroma[X265_CSP_I444].pu[LUMA_64x16].filter_vpp = PFX(interp_4tap_vert_pp_64x16_avx2);<br>
<br>
         p.frameInitLowres = PFX(frame_init_lowres_core_avx2);<br>
+        p.frameInitLowerRes = PFX(frame_init_lowres_core_avx2);<br>
         p.propagateCost = PFX(mbtree_propagate_cost_avx2);<br>
         p.saoCuStatsE0 = PFX(saoCuStatsE0_avx2);<br>
         p.saoCuStatsE1 = PFX(saoCuStatsE1_avx2);<br>
diff -r 4f6dde51a5db -r 14a235657a20 source/encoder/encoder.cpp<br>
--- a/source/encoder/encoder.cpp        Fri Jul 05 10:47:15 2019 +0530<br>
+++ b/source/encoder/encoder.cpp        Fri Jul 05 11:17:26 2019 +0530<br>
@@ -3379,6 +3379,15 @@<br>
         p->bRepeatHeaders = 1;<br>
         x265_log(p, X265_LOG_WARNING, "Turning on repeat - headers for zone encoding\n");<br>
     }<br>
+<br>
+    if (m_param->bEnableHME)<br>
+    {<br>
+        if (m_param->sourceHeight < 540)<br>
+        {<br>
+            x265_log(p, X265_LOG_WARNING, "Source height < 540p is too low for HME. Disabling HME.\n");<br>
+            p->bEnableHME = 0;<br>
+        }<br>
+    }<br>
 }<br>
<br>
 void Encoder::readAnalysisFile(x265_analysis_data* analysis, int curPoc, const x265_picture* picIn, int paramBytes)<br>
diff -r 4f6dde51a5db -r 14a235657a20 source/test/regression-tests.txt<br>
--- a/source/test/regression-tests.txt  Fri Jul 05 10:47:15 2019 +0530<br>
+++ b/source/test/regression-tests.txt  Fri Jul 05 11:17:26 2019 +0530<br>
@@ -153,6 +153,7 @@<br>
 big_buck_bunny_360p24.y4m, --keyint 60 --min-keyint 40 --gop-lookahead 14<br>
 BasketballDrive_1920x1080_50.y4m, --preset medium --no-open-gop --keyint 50 --min-keyint 50 --radl 2 --vbv-maxrate 5000 --vbv-bufsize 5000<br>
 big_buck_bunny_360p24.y4m, --bitrate 500 --fades<br>
+720p50_parkrun_ter.y4m,--preset medium --bitrate 400 --hme<br>
<br>
 # Main12 intraCost overflow bug test<br>
 720p50_parkrun_ter.y4m,--preset medium<br>
diff -r 4f6dde51a5db -r 14a235657a20 source/x265.h<br>
--- a/source/x265.h     Fri Jul 05 10:47:15 2019 +0530<br>
+++ b/source/x265.h     Fri Jul 05 11:17:26 2019 +0530<br>
@@ -1172,6 +1172,14 @@<br>
     /* Enable availability of temporal motion vector for AMVP, default is enabled */<br>
     int       bEnableTemporalMvp;<br>
<br>
+    /* Enable 3-level Hierarchical motion estimation at One-Sixteenth, Quarter and Full resolution.<br>
+     * Default is disabled */<br>
+    int       bEnableHME;<br>
+<br>
+    /* Enable HME search method (DIA, HEX, UMH, STAR, SEA, FULL) for level 0, 1 and 2.<br>
+     * Default is hex, umh, umh for L0, L1 and L2 respectively. */<br>
+    int       hmeSearchMethod[3];<br>
+<br>
     /* Enable weighted prediction in P slices.  This enables weighting analysis<br>
      * in the lookahead, which influences slice decisions, and enables weighting<br>
      * analysis in the main encoder which allows P reference samples to have a<br>
diff -r 4f6dde51a5db -r 14a235657a20 source/x265cli.h<br>
--- a/source/x265cli.h  Fri Jul 05 10:47:15 2019 +0530<br>
+++ b/source/x265cli.h  Fri Jul 05 11:17:26 2019 +0530<br>
@@ -95,6 +95,9 @@<br>
     { "max-merge",      required_argument, NULL, 0 },<br>
     { "no-temporal-mvp",      no_argument, NULL, 0 },<br>
     { "temporal-mvp",         no_argument, NULL, 0 },<br>
+    { "hme",                  no_argument, NULL, 0 },<br>
+    { "no-hme",               no_argument, NULL, 0 },<br>
+    { "hme-search",     required_argument, NULL, 0 },<br>
     { "rdpenalty",      required_argument, NULL, 0 },<br>
     { "no-rect",              no_argument, NULL, 0 },<br>
     { "rect",                 no_argument, NULL, 0 },<br>
@@ -464,6 +467,8 @@<br>
     H0("   --[no-]amp                    Enable asymmetric motion partitions, requires --rect. Default %s\n", OPT(param->bEnableAMP));<br>
     H0("   --[no-]limit-modes            Limit rectangular and asymmetric motion predictions. Default %d\n", param->limitModes);<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>
     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>
_______________________________________________<br>
x265-devel mailing list<br>
<a href="mailto:x265-devel@videolan.org" target="_blank">x265-devel@videolan.org</a><br>
<a href="https://mailman.videolan.org/listinfo/x265-devel" rel="noreferrer" target="_blank">https://mailman.videolan.org/listinfo/x265-devel</a><br>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr"><font face="georgia, serif">Regards,</font><div><font face="georgia, serif">Aruna</font></div></div></div></div>