[x265] [PATCH] slicetype: Add bias used in scenecut detection as param option
gopi.satykrishna at multicorewareinc.com
gopi.satykrishna at multicorewareinc.com
Mon Oct 24 14:11:24 CEST 2016
# HG changeset patch
# User Gopi Satykrishna Akisetty <gopi.satykrishna at multicorewareinc.com>
# Date 1477033375 -19800
# Fri Oct 21 12:32:55 2016 +0530
# Node ID db7c63ebc3908369c604264e494cc22ccfa52529
# Parent 0e9e5264054606a38a3fe6c87272a1737b340b1a
slicetype: Add bias used in scenecut detection as param option.
diff -r 0e9e52640546 -r db7c63ebc390 doc/reST/cli.rst
--- a/doc/reST/cli.rst Wed Oct 12 17:58:49 2016 +0530
+++ b/doc/reST/cli.rst Fri Oct 21 12:32:55 2016 +0530
@@ -1163,6 +1163,13 @@
:option:`--scenecut` 0 or :option:`--no-scenecut` disables adaptive
I frame placement. Default 40
+.. option:: --bias-for-scenecut <0..100.0>
+
+ This value represents the percentage difference between the inter cost and
+ intra cost of a frame used in scenecut detection. For example, a value of 5 indicates,
+ if the inter cost of a frame is greater than or equal to 95 percent of the intra cost of the frame,
+ then detect this frame as scenecut. Values between 5 and 15 are recommended. Default 5.
+
.. option:: --intra-refresh
Enables Periodic Intra Refresh(PIR) instead of keyframe insertion.
diff -r 0e9e52640546 -r db7c63ebc390 source/CMakeLists.txt
--- a/source/CMakeLists.txt Wed Oct 12 17:58:49 2016 +0530
+++ b/source/CMakeLists.txt Fri Oct 21 12:32:55 2016 +0530
@@ -30,7 +30,7 @@
mark_as_advanced(FPROFILE_USE FPROFILE_GENERATE NATIVE_BUILD)
# X265_BUILD must be incremented each time the public API is changed
-set(X265_BUILD 98)
+set(X265_BUILD 99)
configure_file("${PROJECT_SOURCE_DIR}/x265.def.in"
"${PROJECT_BINARY_DIR}/x265.def")
configure_file("${PROJECT_SOURCE_DIR}/x265_config.h.in"
diff -r 0e9e52640546 -r db7c63ebc390 source/common/param.cpp
--- a/source/common/param.cpp Wed Oct 12 17:58:49 2016 +0530
+++ b/source/common/param.cpp Fri Oct 21 12:32:55 2016 +0530
@@ -149,6 +149,7 @@
param->bBPyramid = 1;
param->scenecutThreshold = 40; /* Magic number pulled in from x264 */
param->lookaheadSlices = 8;
+ param->bBiasForScenecut = 5.0;
/* Intra Coding Tools */
param->bEnableConstrainedIntra = 0;
@@ -915,6 +916,7 @@
OPT("limit-tu") p->limitTU = atoi(value);
OPT("opt-qp-pps") p->bOptQpPPS = atobool(value);
OPT("opt-ref-list-length-pps") p->bOptRefListLengthPPS = atobool(value);
+ OPT("bias-for-scenecut") p->bBiasForScenecut = atof(value);
else
return X265_PARAM_BAD_NAME;
}
@@ -1217,6 +1219,8 @@
"Valid Logging level -1:none 0:error 1:warning 2:info 3:debug 4:full");
CHECK(param->scenecutThreshold < 0,
"scenecutThreshold must be greater than 0");
+ CHECK(param->bBiasForScenecut < 0 || 100 < param->bBiasForScenecut,
+ "bias-for-scenecut must be between 0 and 100");
CHECK(param->rdPenalty < 0 || param->rdPenalty > 2,
"Valid penalty for 32x32 intra TU in non-I slices. 0:disabled 1:RD-penalty 2:maximum");
CHECK(param->keyframeMax < -1,
@@ -1467,6 +1471,7 @@
s += sprintf(s, " keyint=%d", p->keyframeMax);
s += sprintf(s, " min-keyint=%d", p->keyframeMin);
s += sprintf(s, " scenecut=%d", p->scenecutThreshold);
+ s += sprintf(s, " bias-for-scenecut=%.2f", p->bBiasForScenecut);
s += sprintf(s, " rc-lookahead=%d", p->lookaheadDepth);
s += sprintf(s, " lookahead-slices=%d", p->lookaheadSlices);
s += sprintf(s, " bframes=%d", p->bframes);
diff -r 0e9e52640546 -r db7c63ebc390 source/encoder/encoder.cpp
--- a/source/encoder/encoder.cpp Wed Oct 12 17:58:49 2016 +0530
+++ b/source/encoder/encoder.cpp Fri Oct 21 12:32:55 2016 +0530
@@ -1921,6 +1921,7 @@
m_bframeDelay = p->bframes ? (p->bBPyramid ? 2 : 1) : 0;
p->bFrameBias = X265_MIN(X265_MAX(-90, p->bFrameBias), 100);
+ p->bBiasForScenecut = (double)(p->bBiasForScenecut / 100);
if (p->logLevel < X265_LOG_INFO)
{
diff -r 0e9e52640546 -r db7c63ebc390 source/encoder/slicetype.cpp
--- a/source/encoder/slicetype.cpp Wed Oct 12 17:58:49 2016 +0530
+++ b/source/encoder/slicetype.cpp Fri Oct 21 12:32:55 2016 +0530
@@ -1617,7 +1617,7 @@
/* magic numbers pulled out of thin air */
float threshMin = (float)(threshMax * 0.25);
- double bias = 0.05;
+ double bias = m_param->bBiasForScenecut;
if (bRealScenecut)
{
if (m_param->keyframeMin == m_param->keyframeMax)
diff -r 0e9e52640546 -r db7c63ebc390 source/x265.h
--- a/source/x265.h Wed Oct 12 17:58:49 2016 +0530
+++ b/source/x265.h Fri Oct 21 12:32:55 2016 +0530
@@ -1323,6 +1323,10 @@
/* Opitmize ref list length in PPS based on stats from previous GOP*/
int bOptRefListLengthPPS;
+ /* This value represents the percentage difference between the inter cost and
+ * intra cost of a frame used in scenecut detection. Default 5. */
+ double bBiasForScenecut;
+
} x265_param;
/* x265_param_alloc:
diff -r 0e9e52640546 -r db7c63ebc390 source/x265cli.h
--- a/source/x265cli.h Wed Oct 12 17:58:49 2016 +0530
+++ b/source/x265cli.h Fri Oct 21 12:32:55 2016 +0530
@@ -121,6 +121,7 @@
{ "min-keyint", required_argument, NULL, 'i' },
{ "scenecut", required_argument, NULL, 0 },
{ "no-scenecut", no_argument, NULL, 0 },
+ { "bias-for-scenecut", required_argument, NULL, 0 },
{ "intra-refresh", no_argument, NULL, 0 },
{ "rc-lookahead", required_argument, NULL, 0 },
{ "lookahead-slices", required_argument, NULL, 0 },
@@ -365,6 +366,7 @@
H0("-i/--min-keyint <integer> Scenecuts closer together than this are coded as I, not IDR. Default: auto\n");
H0(" --no-scenecut Disable adaptive I-frame decision\n");
H0(" --scenecut <integer> How aggressively to insert extra I-frames. Default %d\n", param->scenecutThreshold);
+ H1(" --bias-for-scenecut<0..100.0> Bias for scenecut detection. Default %.2f\n", param->bBiasForScenecut);
H0(" --intra-refresh Use Periodic Intra Refresh instead of IDR frames\n");
H0(" --rc-lookahead <integer> Number of frames for frame-type lookahead (determines encoder latency) Default %d\n", param->lookaheadDepth);
H1(" --lookahead-slices <0..16> Number of slices to use per lookahead cost estimate. Default %d\n", param->lookaheadSlices);
More information about the x265-devel
mailing list