Hi Aruna, I have incorporated the changes suggested by you. Thanks and PFA the modified patch.
# HG changeset patch # User Pooja Venkatesan <[email protected]> # 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 < [email protected]> wrote: > > > On Fri, Nov 29, 2019 at 10:06 PM Pooja Venkatesan < > [email protected]> wrote: > >> # HG changeset patch >> # User Pooja Venkatesan <[email protected]> >> # 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 >> [email protected] >> https://mailman.videolan.org/listinfo/x265-devel >> > > > -- > Regards, > *Aruna Matheswaran,* > Video Codec Engineer, > Media & AI analytics BU, > > > > _______________________________________________ > x265-devel mailing list > [email protected] > https://mailman.videolan.org/listinfo/x265-devel >
# HG changeset patch # User Pooja Venkatesan <[email protected]> # 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));
_______________________________________________ x265-devel mailing list [email protected] https://mailman.videolan.org/listinfo/x265-devel
