# HG changeset patch # User Pooja Venkatesan <po...@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));
# HG changeset patch # User Pooja Venkatesan <pooja@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));
_______________________________________________ x265-devel mailing list x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel