[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