[x265] [PATCH] Disable fall-back on traditional scenecut algorithm with --hist-scenecut

Pooja Venkatesan pooja at multicorewareinc.com
Fri Jul 30 09:54:28 UTC 2021


On Fri, Jul 30, 2021 at 2:18 PM Aruna Matheswaran <
aruna at multicorewareinc.com> wrote:

>
>
> On Thu, Jun 24, 2021 at 2:18 PM Pooja Venkatesan <
> pooja at multicorewareinc.com> wrote:
>
>> From f6c1b86d99ab3a0dd57204f930e526a07e28fed7 Mon Sep 17 00:00:00 2001
>> From: Praveen Karadugattu <praveenkumar at multicorewareinc.com>
>> Date: Sun, 20 Jun 2021 21:20:50 +0530
>> Subject: [PATCH] Disable fall-back on traditional scenecut algorithm with
>>  --hist-scenecut
>>
>> ---
>>  doc/reST/cli.rst                 |  9 +++++++--
>>  source/CMakeLists.txt            |  2 +-
>>  source/common/param.cpp          |  8 +++++++-
>>  source/encoder/encoder.cpp       | 17 ++++++++++++-----
>>  source/encoder/slicetype.cpp     | 15 ++++++++++-----
>>  source/test/regression-tests.txt |  1 +
>>  source/x265.h                    |  4 ++++
>>  source/x265cli.h                 |  1 +
>>  8 files changed, 43 insertions(+), 14 deletions(-)
>>
>> diff --git a/doc/reST/cli.rst b/doc/reST/cli.rst
>> index 4154221af..280b734b3 100755
>> --- a/doc/reST/cli.rst
>> +++ b/doc/reST/cli.rst
>> @@ -1470,7 +1470,8 @@ Slice decision options
>>  .. option:: --hist-scenecut, --no-hist-scenecut
>>
>>   Indicates that scenecuts need to be detected using luma edge and chroma
>> histograms.
>> - :option:`--hist-scenecut` enables scenecut detection using the
>> histograms and disables the default scene cut algorithm.
>> + :option:`--hist-scenecut` enables scenecut detection using the
>> histograms.
>> + It also uses the intra and inter cost info to arrive at a scenecut
>> decision from the default scenecut method.
>>   :option:`--no-hist-scenecut` disables histogram based scenecut
>> algorithm.
>>
>>  .. option:: --hist-threshold <0.0..1.0>
>> @@ -1480,7 +1481,11 @@ Slice decision options
>>   greater than 0.2 against the previous frame as scenecut.
>>   Increasing the threshold reduces the number of scenecuts detected.
>>   Default 0.03.
>> -
>> +
>> +.. option:: --disable-traditional-scenecut
>> +
>> + Indicates that the usage of traditional scenecut detection using intra
>> and inter cost should be disabled when :option:`--hist-scenecut` is used.
>> +
>>  .. option:: --radl <integer>
>>
>>   Number of RADL pictures allowed infront of IDR. Requires closed gop
>> interval.
>> diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt
>> index b4e57b592..f4a9cb793 100755
>> --- a/source/CMakeLists.txt
>> +++ b/source/CMakeLists.txt
>> @@ -29,7 +29,7 @@ option(NATIVE_BUILD "Target the build CPU" OFF)
>>  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 200)
>> +set(X265_BUILD 201)
>>  configure_file("${PROJECT_SOURCE_DIR}/x265.def.in"
>>                 "${PROJECT_BINARY_DIR}/x265.def")
>>  configure_file("${PROJECT_SOURCE_DIR}/x265_config.h.in"
>> diff --git a/source/common/param.cpp b/source/common/param.cpp
>> index 8a27aaef3..3b84415c3 100755
>> --- a/source/common/param.cpp
>> +++ b/source/common/param.cpp
>> @@ -172,6 +172,7 @@ void x265_param_default(x265_param* param)
>>      param->scenecutThreshold = 40; /* Magic number pulled in from x264 */
>>      param->edgeTransitionThreshold = 0.03;
>>      param->bHistBasedSceneCut = 0;
>> +    param->bDisableTradScdInHscd = 0;
>>      param->lookaheadSlices = 8;
>>      param->lookaheadThreads = 0;
>>      param->scenecutBias = 5.0;
>> @@ -598,6 +599,7 @@ int x265_param_default_preset(x265_param* param,
>> const char* preset, const char*
>>              param->lookaheadDepth = 0;
>>              param->scenecutThreshold = 0;
>>              param->bHistBasedSceneCut = 0;
>> +            param->bDisableTradScdInHscd = 0;
>>              param->rc.cuTree = 0;
>>              param->frameNumThreads = 1;
>>          }
>> @@ -953,6 +955,7 @@ int x265_param_parse(x265_param* p, const char* name,
>> const char* value)
>>             bError = false;
>>             p->scenecutThreshold = atoi(value);
>>             p->bHistBasedSceneCut = 0;
>> +           p->bDisableTradScdInHscd = 0;
>>         }
>>      }
>>      OPT("temporal-layers") p->bEnableTemporalSubLayers = atobool(value);
>> @@ -1234,6 +1237,7 @@ int x265_param_parse(x265_param* p, const char*
>> name, const char* value)
>>              }
>>          }
>>          OPT("hist-threshold") p->edgeTransitionThreshold = atof(value);
>> +        OPT("disable-traditional-scenecut") p->bDisableTradScdInHscd =
>> atobool(value);
>>          OPT("rskip-edge-threshold") p->edgeVarThreshold =
>> atoi(value)/100.0f;
>>          OPT("lookahead-threads") p->lookaheadThreads = atoi(value);
>>          OPT("opt-cu-delta-qp") p->bOptCUDeltaQP = atobool(value);
>> @@ -2151,7 +2155,8 @@ char *x265_param2string(x265_param* p, int padx,
>> int pady)
>>      s += sprintf(s, " rc-lookahead=%d", p->lookaheadDepth);
>>      s += sprintf(s, " lookahead-slices=%d", p->lookaheadSlices);
>>      s += sprintf(s, " scenecut=%d", p->scenecutThreshold);
>> -    s += sprintf(s, " hist-scenecut=%d", p->bHistBasedSceneCut);
>> +    BOOL(p->bHistBasedSceneCut, "hist-scenecut");
>> +    BOOL(p->bDisableTradScdInHscd, "disable-traditional-scenecut");
>>
> [AM] This will add invalid CLI option "no-disable-traditional-scenecut" to
> info-sei. Please fix this.
>
[PV] Will modify CLI to take both options to enable/disable traditional
scene cut and resend the patch.

>      s += sprintf(s, " radl=%d", p->radl);
>>      BOOL(p->bEnableHRDConcatFlag, "splice");
>>      BOOL(p->bIntraRefresh, "intra-refresh");
>> @@ -2467,6 +2472,7 @@ void x265_copy_params(x265_param* dst, x265_param*
>> src)
>>      dst->lookaheadThreads = src->lookaheadThreads;
>>      dst->scenecutThreshold = src->scenecutThreshold;
>>      dst->bHistBasedSceneCut = src->bHistBasedSceneCut;
>> +    dst->bDisableTradScdInHscd = src->bDisableTradScdInHscd;
>>      dst->bIntraRefresh = src->bIntraRefresh;
>>      dst->maxCUSize = src->maxCUSize;
>>      dst->minCUSize = src->minCUSize;
>> diff --git a/source/encoder/encoder.cpp b/source/encoder/encoder.cpp
>> index c1e1cb46d..dfb872889 100644
>> --- a/source/encoder/encoder.cpp
>> +++ b/source/encoder/encoder.cpp
>> @@ -3680,6 +3680,7 @@ void Encoder::configure(x265_param *p)
>>          p->keyframeMax = INT_MAX;
>>          p->scenecutThreshold = 0;
>>          p->bHistBasedSceneCut = 0;
>> +        p->bDisableTradScdInHscd = 0;
>>      }
>>      else if (p->keyframeMax <= 1)
>>      {
>> @@ -3694,6 +3695,7 @@ void Encoder::configure(x265_param *p)
>>          p->bframes = 0;
>>          p->scenecutThreshold = 0;
>>          p->bHistBasedSceneCut = 0;
>> +        p->bDisableTradScdInHscd = 0;
>>          p->bFrameAdaptive = 0;
>>          p->rc.cuTree = 0;
>>          p->bEnableWeightedPred = 0;
>> @@ -4421,12 +4423,17 @@ void Encoder::configure(x265_param *p)
>>              m_param->searchRange = m_param->hmeRange[2];
>>      }
>>
>> -   if (p->bHistBasedSceneCut && !p->edgeTransitionThreshold)
>> -   {
>> -       p->edgeTransitionThreshold = 0.03;
>> -       x265_log(p, X265_LOG_WARNING, "using  default threshold %.2lf for
>> scene cut detection\n", p->edgeTransitionThreshold);
>> -   }
>> +    if (p->bHistBasedSceneCut && !p->edgeTransitionThreshold)
>> +    {
>> +        p->edgeTransitionThreshold = 0.03;
>> +        x265_log(p, X265_LOG_WARNING, "using  default threshold %.2lf
>> for scene cut detection.\n", p->edgeTransitionThreshold);
>> +    }
>>
>> +    if (!p->bHistBasedSceneCut && p->bDisableTradScdInHscd)
>> +    {
>> +        p->bDisableTradScdInHscd = 0;
>> +        x265_log(p, X265_LOG_WARNING, "option
>> --disable-traditional-scenecut requires --hist-scenecut to be enabled.\n");
>> +    }
>>  }
>>
>>  void Encoder::readAnalysisFile(x265_analysis_data* analysis, int curPoc,
>> const x265_picture* picIn, int paramBytes)
>> diff --git a/source/encoder/slicetype.cpp b/source/encoder/slicetype.cpp
>> index 0adb0d0db..ace3b5469 100644
>> --- a/source/encoder/slicetype.cpp
>> +++ b/source/encoder/slicetype.cpp
>> @@ -2014,7 +2014,7 @@ void Lookahead::slicetypeAnalyse(Lowres **frames,
>> bool bKeyframe)
>>      bool isScenecut = false;
>>
>>      /* Temporal computations for scenecut detection */
>> -    if (m_param->bHistBasedSceneCut)
>> +    if (m_param->bHistBasedSceneCut && !m_param->bDisableTradScdInHscd)
>>      {
>>          for (int i = numFrames - 1; i > 0; i--)
>>          {
>> @@ -2047,8 +2047,10 @@ void Lookahead::slicetypeAnalyse(Lowres **frames,
>> bool bKeyframe)
>>      }
>>
>>      /* When scenecut threshold is set, use scenecut detection for I
>> frame placements */
>> -    if (!m_param->bHistBasedSceneCut || (m_param->bHistBasedSceneCut &&
>> frames[1]->bScenecut))
>> +    if (!m_param->bHistBasedSceneCut || (m_param->bHistBasedSceneCut &&
>> !m_param->bDisableTradScdInHscd && frames[1]->bScenecut))
>>          isScenecut = scenecut(frames, 0, 1, true, origNumFrames);
>> +    else if (m_param->bHistBasedSceneCut && frames[1]->bScenecut)
>> +        isScenecut = true;
>>
>>      if (isScenecut && (m_param->bHistBasedSceneCut ||
>> m_param->scenecutThreshold))
>>      {
>> @@ -2061,14 +2063,17 @@ void Lookahead::slicetypeAnalyse(Lowres **frames,
>> bool bKeyframe)
>>          m_extendGopBoundary = false;
>>          for (int i = m_param->bframes + 1; i < origNumFrames; i +=
>> m_param->bframes + 1)
>>          {
>> -            if (!m_param->bHistBasedSceneCut ||
>> (m_param->bHistBasedSceneCut && frames[i + 1]->bScenecut))
>> +            if (!m_param->bHistBasedSceneCut ||
>> (m_param->bHistBasedSceneCut && !m_param->bDisableTradScdInHscd && frames[i
>> + 1]->bScenecut))
>>                  scenecut(frames, i, i + 1, true, origNumFrames);
>>
>>              for (int j = i + 1; j <= X265_MIN(i + m_param->bframes + 1,
>> origNumFrames); j++)
>>              {
>> -                if (frames[j]->bScenecut && scenecutInternal(frames, j -
>> 1, j, true))
>> +                if (frames[j]->bScenecut)
>>                  {
>> -                    m_extendGopBoundary = true;
>> +                    if (!m_param->bDisableTradScdInHscd)
>> +                        m_extendGopBoundary = scenecutInternal(frames, j
>> - 1, j, true);
>> +                    else
>> +                        m_extendGopBoundary = true;
>>                      break;
>>                  }
>>              }
>> diff --git a/source/test/regression-tests.txt
>> b/source/test/regression-tests.txt
>> index 971c854df..828157cab 100644
>> --- a/source/test/regression-tests.txt
>> +++ b/source/test/regression-tests.txt
>> @@ -160,6 +160,7 @@ Traffic_4096x2048_30p.y4m, --preset medium
>> --frame-dup --dup-threshold 60 --hrd
>>  Kimono1_1920x1080_24_400.yuv,--preset superfast --qp 28 --zones
>> 0,139,q=32
>>  sintel_trailer_2k_1920x1080_24.yuv, --preset medium --hist-scenecut
>> --hist-threshold 0.02 --frame-dup --dup-threshold 60 --hrd --bitrate 10000
>> --vbv-bufsize 15000 --vbv-maxrate 12000
>>  sintel_trailer_2k_1920x1080_24.yuv, --preset medium --hist-scenecut
>> --hist-threshold 0.02
>> +sintel_trailer_2k_1920x1080_24.yuv, --preset medium --hist-scenecut
>> --hist-threshold 0.02 --disable-traditional-scenecut
>>  sintel_trailer_2k_1920x1080_24.yuv, --preset ultrafast --hist-scenecut
>> --hist-threshold 0.02
>>  crowd_run_1920x1080_50.yuv, --preset faster --ctu 32 --rskip 2
>> --rskip-edge-threshold 5
>>  crowd_run_1920x1080_50.yuv, --preset fast --ctu 64 --rskip 2
>> --rskip-edge-threshold 5 --aq-mode 4
>> diff --git a/source/x265.h b/source/x265.h
>> index 324f3163f..3a65fdda6 100644
>> --- a/source/x265.h
>> +++ b/source/x265.h
>> @@ -1963,6 +1963,10 @@ typedef struct x265_param
>>      /* Flag indicating whether the encoder should emit an End of Sequence
>>       * NAL at the end of every Coded Video Sequence. Default false */
>>      int      bEnableEndOfSequence;
>> +
>> +    /* Flag to turn off traditional scenecut detection in histogram
>> based scenecut detection so that
>> +     * only spatial properties are used for scenecut detection. Default
>> false */
>> +    int      bDisableTradScdInHscd;
>>  } x265_param;
>>
>>  /* x265_param_alloc:
>> diff --git a/source/x265cli.h b/source/x265cli.h
>> index 46a2b68ae..86136fbfb 100644
>> --- a/source/x265cli.h
>> +++ b/source/x265cli.h
>> @@ -144,6 +144,7 @@ static const struct option long_options[] =
>>      { "hist-scenecut",        no_argument, NULL, 0},
>>      { "no-hist-scenecut",     no_argument, NULL, 0},
>>      { "hist-threshold", required_argument, NULL, 0},
>> +    { "disable-traditional-scenecut", no_argument, NULL, 0},
>>      { "fades",                no_argument, NULL, 0 },
>>      { "no-fades",             no_argument, NULL, 0 },
>>      { "scenecut-aware-qp", required_argument, NULL, 0 },
>> --
>> 2.24.0.windows.2
>>
>> Regards,
>> *Pooja Venkatesan*,
>> Video Codec Engineer,
>> Media & AI analytics BU
>>
>> _______________________________________________
>> x265-devel mailing list
>> x265-devel at videolan.org
>> https://mailman.videolan.org/listinfo/x265-devel
>>
>
>
> --
> Regards,
> *Aruna Matheswaran,*
> Video Codec Engineer,
> Media & AI analytics BU,
>
>
>
> _______________________________________________
> 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/20210730/ca7da532/attachment-0001.html>


More information about the x265-devel mailing list