[x265] [X265][PATCH][RELEASE_3.5] Modify Window offsets relative to slice-types for --scenecut-aware-qp

Aruna Matheswaran aruna at multicorewareinc.com
Wed Feb 10 17:34:34 UTC 2021


Pushed to Release_3.5

On Fri, Feb 5, 2021 at 3:29 PM Niranjan Bala <niranjan at multicorewareinc.com>
wrote:

> From 50d1b4a2ad5e3c817b60141b6371d3dd59c89e9c Mon Sep 17 00:00:00 2001
> From: Niranjan <niranjan at multicorewareinc.com>
> Date: Mon, 1 Feb 2021 14:24:19 +0530
> Subject: [PATCH] Modify Window offsets relative to slice-types for
>  --scenecut-aware-qp
>
> ---
>  source/common/param.cpp        | 75 ++++++++++++++++++++++------------
>  source/encoder/ratecontrol.cpp | 36 ++++++++--------
>  source/encoder/ratecontrol.h   |  6 +--
>  3 files changed, 71 insertions(+), 46 deletions(-)
>
> diff --git a/source/common/param.cpp b/source/common/param.cpp
> index 8a6a974f1..8695ad686 100755
> --- a/source/common/param.cpp
> +++ b/source/common/param.cpp
> @@ -1355,41 +1355,62 @@ int x265_param_parse(x265_param* p, const char*
> name, const char* value)
>
>              if (p->bEnableSceneCutAwareQp == FORWARD)
>              {
> -                sscanf(value, "%d,%lf,%lf", &window1, &refQpDelta1,
> &nonRefQpDelta1);
> -                if (window1 > 0)
> -                    p->fwdScenecutWindow = window1;
> -                if (refQpDelta1 > 0)
> -                    p->fwdRefQpDelta = refQpDelta1;
> -                if (nonRefQpDelta1 > 0)
> -                    p->fwdNonRefQpDelta = nonRefQpDelta1;
> +                if (3 == sscanf(value, "%d,%lf,%lf", &window1,
> &refQpDelta1, &nonRefQpDelta1))
> +                {
> +                    if (window1 > 0)
> +                        p->fwdScenecutWindow = window1;
> +                    if (refQpDelta1 > 0)
> +                        p->fwdRefQpDelta = refQpDelta1;
> +                    if (nonRefQpDelta1 > 0)
> +                        p->fwdNonRefQpDelta = nonRefQpDelta1;
> +                }
> +                else
> +                {
> +                    x265_log(NULL, X265_LOG_ERROR, "Specify all the
> necessary offsets for masking-strength \n");
> +                    bError = true;
> +                }
>              }
>              else if (p->bEnableSceneCutAwareQp == BACKWARD)
>              {
> -                sscanf(value, "%d,%lf,%lf", &window1, &refQpDelta1,
> &nonRefQpDelta1);
> -                if (window1 > 0)
> -                    p->bwdScenecutWindow = window1;
> -                if (refQpDelta1 > 0)
> -                    p->bwdRefQpDelta = refQpDelta1;
> -                if (nonRefQpDelta1 > 0)
> -                    p->bwdNonRefQpDelta = nonRefQpDelta1;
> +                if (3 == sscanf(value, "%d,%lf,%lf", &window1,
> &refQpDelta1, &nonRefQpDelta1))
> +                {
> +                    if (window1 > 0)
> +                        p->bwdScenecutWindow = window1;
> +                    if (refQpDelta1 > 0)
> +                        p->bwdRefQpDelta = refQpDelta1;
> +                    if (nonRefQpDelta1 > 0)
> +                        p->bwdNonRefQpDelta = nonRefQpDelta1;
> +                }
> +                else
> +                {
> +                    x265_log(NULL, X265_LOG_ERROR, "Specify all the
> necessary offsets for masking-strength \n");
> +                    bError = true;
> +                }
>              }
>              else if (p->bEnableSceneCutAwareQp == BI_DIRECTIONAL)
>              {
>                  int window2;
>                  double refQpDelta2, nonRefQpDelta2;
> -                sscanf(value, "%d,%lf,%lf,%d,%lf,%lf", &window1,
> &refQpDelta1, &nonRefQpDelta1, &window2, &refQpDelta2, &nonRefQpDelta2);
> -                if (window1 > 0)
> -                    p->fwdScenecutWindow = window1;
> -                if (refQpDelta1 > 0)
> -                    p->fwdRefQpDelta = refQpDelta1;
> -                if (nonRefQpDelta1 > 0)
> -                    p->fwdNonRefQpDelta = nonRefQpDelta1;
> -                if (window2 > 0)
> -                    p->bwdScenecutWindow = window2;
> -                if (refQpDelta2 > 0)
> -                    p->bwdRefQpDelta = refQpDelta2;
> -                if (nonRefQpDelta2 > 0)
> -                    p->bwdNonRefQpDelta = nonRefQpDelta2;
> +                if (6 == sscanf(value, "%d,%lf,%lf,%d,%lf,%lf", &window1,
> &refQpDelta1, &nonRefQpDelta1, &window2, &refQpDelta2, &nonRefQpDelta2))
> +                {
> +                    if (window1 > 0)
> +                        p->fwdScenecutWindow = window1;
> +                    if (refQpDelta1 > 0)
> +                        p->fwdRefQpDelta = refQpDelta1;
> +                    if (nonRefQpDelta1 > 0)
> +                        p->fwdNonRefQpDelta = nonRefQpDelta1;
> +                    if (window2 > 0)
> +                        p->bwdScenecutWindow = window2;
> +                    if (refQpDelta2 > 0)
> +                        p->bwdRefQpDelta = refQpDelta2;
> +                    if (nonRefQpDelta2 > 0)
> +                        p->bwdNonRefQpDelta = nonRefQpDelta2;
> +                }
> +                else
> +                {
> +                    x265_log(NULL, X265_LOG_ERROR, "Specify all the
> necessary offsets for masking-strength \n");
> +                    bError = true;
> +                }
>              }
>          }
>          OPT("field") p->bField = atobool( value );
> diff --git a/source/encoder/ratecontrol.cpp
> b/source/encoder/ratecontrol.cpp
> index 1b46c0148..a4756de39 100644
> --- a/source/encoder/ratecontrol.cpp
> +++ b/source/encoder/ratecontrol.cpp
> @@ -3193,9 +3193,8 @@ double RateControl::forwardMasking(Frame* curFrame,
> double q)
>      double fwdRefQpDelta = double(m_param->fwdRefQpDelta);
>      double fwdNonRefQpDelta = double(m_param->fwdNonRefQpDelta);
>      double sliceTypeDelta = SLICE_TYPE_DELTA * fwdRefQpDelta;
> -    double window2Delta = WINDOW2_DELTA * fwdRefQpDelta;
> -    double window3Delta = WINDOW3_DELTA * fwdRefQpDelta;
>
> +    //Check whether the current frame is within the forward window
>      if (curFrame->m_poc > lastScenecut && curFrame->m_poc <=
> (lastScenecut + int(maxWindowSize)))
>          curFrame->m_isInsideWindow = FORWARD_WINDOW;
>      if (curFrame->m_isInsideWindow == FORWARD_WINDOW)
> @@ -3209,11 +3208,13 @@ double RateControl::forwardMasking(Frame*
> curFrame, double q)
>              if (!(lastIFrame > lastScenecut && lastIFrame <=
> (lastScenecut + int(maxWindowSize))
>                  && curFrame->m_poc >= lastIFrame))
>              {
> -                qp += fwdRefQpDelta - sliceTypeDelta;
> -                if (((curFrame->m_poc) > (lastScenecut +
> int(windowSize))) && ((curFrame->m_poc) <= (lastScenecut + 2 *
> int(windowSize))))
> -                    qp -= window2Delta;
> +                //Add offsets corresponding to the window in which the
> P-frame occurs
> +                if (curFrame->m_poc <= (lastScenecut + int(windowSize)))
> +                    qp += WINDOW1_DELTA * (fwdRefQpDelta -
> sliceTypeDelta);
> +                else if (((curFrame->m_poc) > (lastScenecut +
> int(windowSize))) && ((curFrame->m_poc) <= (lastScenecut + 2 *
> int(windowSize))))
> +                    qp += WINDOW2_DELTA * (fwdRefQpDelta -
> sliceTypeDelta);
>                  else if (curFrame->m_poc > lastScenecut + 2 *
> int(windowSize))
> -                    qp -= window3Delta;
> +                    qp += WINDOW3_DELTA * (fwdRefQpDelta -
> sliceTypeDelta);
>              }
>          }
>          else if (curFrame->m_lowres.sliceType == X265_TYPE_BREF)
> @@ -3221,11 +3222,13 @@ double RateControl::forwardMasking(Frame*
> curFrame, double q)
>              if (!(lastIFrame > lastScenecut && lastIFrame <=
> (lastScenecut + int(maxWindowSize))
>                  && curFrame->m_poc >= lastIFrame))
>              {
> -                qp += fwdRefQpDelta;
> -                if (((curFrame->m_poc) > (lastScenecut +
> int(windowSize))) && ((curFrame->m_poc) <= (lastScenecut + 2 *
> int(windowSize))))
> -                    qp -= window2Delta;
> +                //Add offsets corresponding to the window in which the
> B-frame occurs
> +                if (curFrame->m_poc <= (lastScenecut + int(windowSize)))
> +                    qp += WINDOW1_DELTA * fwdRefQpDelta;
> +                else if (((curFrame->m_poc) > (lastScenecut +
> int(windowSize))) && ((curFrame->m_poc) <= (lastScenecut + 2 *
> int(windowSize))))
> +                    qp += WINDOW2_DELTA * fwdRefQpDelta;
>                  else if (curFrame->m_poc > lastScenecut + 2 *
> int(windowSize))
> -                    qp -= window3Delta;
> +                    qp += WINDOW3_DELTA * fwdRefQpDelta;
>              }
>          }
>          else if (curFrame->m_lowres.sliceType == X265_TYPE_B)
> @@ -3233,11 +3236,13 @@ double RateControl::forwardMasking(Frame*
> curFrame, double q)
>              if (!(lastIFrame > lastScenecut && lastIFrame <=
> (lastScenecut + int(maxWindowSize))
>                  && curFrame->m_poc >= lastIFrame))
>              {
> -                qp += fwdNonRefQpDelta;
> -                if (((curFrame->m_poc) > (lastScenecut +
> int(windowSize))) && ((curFrame->m_poc) <= (lastScenecut + 2 *
> int(windowSize))))
> -                    qp -= window2Delta;
> +                //Add offsets corresponding to the window in which the
> b-frame occurs
> +                if (curFrame->m_poc <= (lastScenecut + int(windowSize)))
> +                    qp += WINDOW1_DELTA * fwdNonRefQpDelta;
> +                else if (((curFrame->m_poc) > (lastScenecut +
> int(windowSize))) && ((curFrame->m_poc) <= (lastScenecut + 2 *
> int(windowSize))))
> +                    qp += WINDOW2_DELTA * fwdNonRefQpDelta;
>                  else if (curFrame->m_poc > lastScenecut + 2 *
> int(windowSize))
> -                    qp -= window3Delta;
> +                    qp += WINDOW3_DELTA * fwdNonRefQpDelta;
>              }
>          }
>      }
> @@ -3248,14 +3253,13 @@ double RateControl::backwardMasking(Frame*
> curFrame, double q)
>  {
>      double qp = x265_qScale2qp(q);
>      double fwdRefQpDelta = double(m_param->fwdRefQpDelta);
> -    double window3Delta = WINDOW3_DELTA * fwdRefQpDelta;
>      double bwdRefQpDelta = double(m_param->bwdRefQpDelta);
>      double bwdNonRefQpDelta = double(m_param->bwdNonRefQpDelta);
>
>      if (curFrame->m_isInsideWindow == BACKWARD_WINDOW)
>      {
>          if (bwdRefQpDelta < 0)
> -            bwdRefQpDelta = fwdRefQpDelta - window3Delta;
> +            bwdRefQpDelta = WINDOW3_DELTA * fwdRefQpDelta;
>          double sliceTypeDelta = SLICE_TYPE_DELTA * bwdRefQpDelta;
>          if (bwdNonRefQpDelta < 0)
>              bwdNonRefQpDelta = bwdRefQpDelta + sliceTypeDelta;
> diff --git a/source/encoder/ratecontrol.h b/source/encoder/ratecontrol.h
> index 148269b6f..996465eeb 100644
> --- a/source/encoder/ratecontrol.h
> +++ b/source/encoder/ratecontrol.h
> @@ -47,9 +47,9 @@ struct SPS;
>  #define CLIP_DURATION(f) x265_clip3(MIN_FRAME_DURATION,
> MAX_FRAME_DURATION, f)
>
>  /*Scenecut Aware QP*/
> -#define WINDOW1_DELTA           0   /* The offset for the frames coming
> in the window-1*/
> -#define WINDOW2_DELTA           0.3 /* The offset for the frames coming
> in the window-2*/
> -#define WINDOW3_DELTA           0.6 /* The offset for the frames coming
> in the window-3*/
> +#define WINDOW1_DELTA           1.0 /* The offset for the frames coming
> in the window-1*/
> +#define WINDOW2_DELTA           0.7 /* The offset for the frames coming
> in the window-2*/
> +#define WINDOW3_DELTA           0.4 /* The offset for the frames coming
> in the window-3*/
>
>  struct Predictor
>  {
> --
> 2.18.0.windows.1
>
>
> --
>
> Thanks & Regards
> *Niranjan Kumar B*
> Video Codec Engineer
> Media & AI Analytics
> +91 958 511 1449
> <https://multicorewareinc.com/>
> _______________________________________________
> 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,
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20210210/dee2325c/attachment-0001.html>


More information about the x265-devel mailing list