[x265] [PATCH] Add option hme-range to modify search range for HME levels L0, L1 and L2
Pooja Venkatesan
pooja at multicorewareinc.com
Fri Nov 29 17:35:34 CET 2019
# 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.
+
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));
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20191129/739a1435/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: x265.patch
Type: application/x-patch
Size: 7938 bytes
Desc: not available
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20191129/739a1435/attachment-0001.bin>
More information about the x265-devel
mailing list