[x265] [PATCH] slicetype: Add bias used in scenecut detection as param option

Pradeep Ramachandran pradeep at multicorewareinc.com
Mon Oct 24 07:52:12 CEST 2016


On Fri, Oct 21, 2016 at 3:45 PM, <gopi.satykrishna at multicorewareinc.com>
wrote:

> # 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 51a81cb49d988b890040a4e8254b3159258ae89e
> # Parent  0e9e5264054606a38a3fe6c87272a1737b340b1a
> slicetype: Add bias used in scenecut detection as param option.
>
> diff -r 0e9e52640546 -r 51a81cb49d98 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 <5..10.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. Default 5.
> +
>

Why not expose the range as 0..100 so that the user has the option of being
more aggressive wrt scenecut decisions?


>  .. option:: --intra-refresh
>
>         Enables Periodic Intra Refresh(PIR) instead of keyframe insertion.
> diff -r 0e9e52640546 -r 51a81cb49d98 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 51a81cb49d98 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 < 5 || 10 < param->bBiasForScenecut,
> +           "bias-for-scenecut must be between 5 and 10");
>

Check will have to change based on proposed new range.

     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 51a81cb49d98 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 51a81cb49d98 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 51a81cb49d98 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
> @@ -775,6 +775,10 @@
>       * should detect scene cuts. The default (40) is recommended. */
>      int       scenecutThreshold;
>
> +    /* This value represents the percentage difference between the inter
> cost and
> +     * intra cost of a frame used in scenecut detection. Default 5. */
> +    double     bBiasForScenecut;
> +
>

Please add all new params only to the end of the x265_param_t structure to
allow for backwards compatibility with existing applications that just want
to use the new .dll as a drop-in replacement without recompiling the entire
application.


>      /* Replace keyframes by using a column of intra blocks that move
> across the video
>       * from one side to the other, thereby "refreshing" the image. In
> effect, instead of a
>       * big keyframe, the keyframe is "spread" over many frames. */
> diff -r 0e9e52640546 -r 51a81cb49d98 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<5..10.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);
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20161024/457cb6ce/attachment.html>


More information about the x265-devel mailing list