[x265] [PATCH]Auto AQ Mode

Pradeep Ramachandran pradeep at multicorewareinc.com
Fri Feb 21 06:59:44 CET 2020


On Wed, Feb 19, 2020 at 11:16 AM Niranjan Bala <
niranjan at multicorewareinc.com> wrote:

> # HG changeset patch
> # User Niranjan <niranjan at multicorewareinc.com>
> # Date 1581402757 -19800
> #      Tue Feb 11 12:02:37 2020 +0530
> # Node ID 196a29866e4eb52a37937e517c7dc4fb85dc224d
> # Parent  fdbd4e4a2aff93bfc14b10efcd9e681a7ebae311
> Auto AQ Mode.
>

This patch implements aq-mode 5 & auto-aq. Either split into two patches
(preferred), or update the commit message accordingly.

Needs to be rebased to apply on current tip of default.


>
> This patch does the following:
> 1. Automatically decides the AQ Mode for each frame using its scene
> statistics
> such as luma intensity and edge density.
> 2. Add option "--auto-aq" to enable auto detection of AQ Mode per frame.
> 3. Add AQ mode 5 which is suitable for frames with dark edge content.
>
> diff -r fdbd4e4a2aff -r 196a29866e4e doc/reST/cli.rst
> --- a/doc/reST/cli.rst Sat Jan 25 18:08:03 2020 +0530
> +++ b/doc/reST/cli.rst Tue Feb 11 12:02:37 2020 +0530
> @@ -1687,7 +1687,7 @@
>   ignored. Slower presets will generally achieve better compression
>   efficiency (and generate smaller bitstreams). Default disabled.
>
> -.. option:: --aq-mode <0|1|2|3|4>
> +.. option:: --aq-mode <0|1|2|3|4|5>
>
>   Adaptive Quantization operating mode. Raise or lower per-block
>   quantization based on complexity analysis of the source image. The
> @@ -1695,13 +1695,20 @@
>   the tendency of the encoder to spend too many bits on complex areas
>   and not enough in flat areas.
>
> - 0. disabled
> - 1. AQ enabled
> - 2. AQ enabled with auto-variance **(default)**
> + 0. disabled.
> + 1. Uniform AQ.
> + 2. AQ enabled with auto-variance **(default)**.
>   3. AQ enabled with auto-variance and bias to dark scenes. This is
>   recommended for 8-bit encodes or low-bitrate 10-bit encodes, to
>   prevent color banding/blocking.
>   4. AQ enabled with auto-variance and edge information.
> + 5. Same as AQ mode 3, but uses edge density instead of auto-variance.
> i.e, AQ with bias towards dark scenes which have high edge density.
> +
> +.. option:: --auto-aq --no-auto-aq
> +
> + To enable and disable automatic AQ mode detection per frame.
> + This option adaptively sets the AQ mode for each frame between 2, 3, 4
> and 5 based on the scene statistics.
> + Default: disabled.
>
>  .. option:: --aq-strength <float>
>
> diff -r fdbd4e4a2aff -r 196a29866e4e source/CMakeLists.txt
> --- a/source/CMakeLists.txt Sat Jan 25 18:08:03 2020 +0530
> +++ b/source/CMakeLists.txt Tue Feb 11 12:02:37 2020 +0530
> @@ -29,7 +29,7 @@
>  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 188)
> +set(X265_BUILD 190)
>  configure_file("${PROJECT_SOURCE_DIR}/x265.def.in"
>                 "${PROJECT_BINARY_DIR}/x265.def")
>  configure_file("${PROJECT_SOURCE_DIR}/x265_config.h.in"
> diff -r fdbd4e4a2aff -r 196a29866e4e source/common/common.h
> --- a/source/common/common.h Sat Jan 25 18:08:03 2020 +0530
> +++ b/source/common/common.h Tue Feb 11 12:02:37 2020 +0530
> @@ -130,6 +130,7 @@
>  typedef uint64_t pixel4;
>  typedef int64_t  ssum2_t;
>  #define HISTOGRAM_BINS 1024
> +#define BRIGHTNESS_THRESHOLD 120 // The threshold above which a pixel is
> bright
>  #define SHIFT 1
>  #else
>  typedef uint8_t  pixel;
> @@ -138,6 +139,7 @@
>  typedef uint32_t pixel4;
>  typedef int32_t  ssum2_t; // Signed sum
>  #define HISTOGRAM_BINS 256
> +#define BRIGHTNESS_THRESHOLD 30 // The threshold above which a pixel is
> bright
>  #define SHIFT 0
>  #endif // if HIGH_BIT_DEPTH
>
> @@ -163,6 +165,8 @@
>  #define MIN_QPSCALE     0.21249999999999999
>  #define MAX_MAX_QPSCALE 615.46574234477100
>
> +#define AQ_2_THRESHOLD  50.0 // The threshold to determine whether a
> frame is bright.
> +#define AQ_4_THRESHOLD  10.0 // The threshold to determine whether a
> frame has a lot of edges.
>

Rename above macros to denote 'what they represent', and not what the
decision taken based on the threshold is.


>
>  template<typename T>
>  inline T x265_min(T a, T b) { return a < b ? a : b; }
> diff -r fdbd4e4a2aff -r 196a29866e4e source/common/frame.cpp
> --- a/source/common/frame.cpp Sat Jan 25 18:08:03 2020 +0530
> +++ b/source/common/frame.cpp Tue Feb 11 12:02:37 2020 +0530
> @@ -61,6 +61,7 @@
>      m_edgePic = NULL;
>      m_gaussianPic = NULL;
>      m_thetaPic = NULL;
> +    m_frameAq = 0;
>

Use macro X265_AQ_NONE instead of 0 as default value.

 }
>
>  bool Frame::create(x265_param *param, float* quantOffsets)
> @@ -101,7 +102,7 @@
>          CHECKED_MALLOC_ZERO(m_classifyCount, uint32_t, size);
>      }
>
> -    if (param->rc.aqMode == X265_AQ_EDGE || (param->rc.zonefileCount &&
> param->rc.aqMode != 0))
> +    if (param->rc.aqMode == X265_AQ_EDGE || param->rc.aqMode ==
> X265_AQ_EDGE_BIASED || param->rc.bAutoAq || (param->rc.zonefileCount &&
> param->rc.aqMode != 0))
>      {
>          uint32_t numCuInWidth = (param->sourceWidth + param->maxCUSize -
> 1) / param->maxCUSize;
>          uint32_t numCuInHeight = (param->sourceHeight + param->maxCUSize
> - 1) / param->maxCUSize;
> @@ -261,7 +262,7 @@
>          X265_FREE_ZERO(m_classifyCount);
>      }
>
> -    if (m_param->rc.aqMode == X265_AQ_EDGE || (m_param->rc.zonefileCount
> && m_param->rc.aqMode != 0))
> +    if (m_param->rc.aqMode == X265_AQ_EDGE || m_param->rc.aqMode ==
> X265_AQ_EDGE_BIASED || m_param->rc.bAutoAq || (m_param->rc.zonefileCount &&
> m_param->rc.aqMode != 0))
>

Given that X265_FREE() already checks for valid pointer before free-ing, is
the above if() even required?


>      {
>          X265_FREE(m_edgePic);
>          X265_FREE(m_gaussianPic);
> diff -r fdbd4e4a2aff -r 196a29866e4e source/common/frame.h
> --- a/source/common/frame.h Sat Jan 25 18:08:03 2020 +0530
> +++ b/source/common/frame.h Tue Feb 11 12:02:37 2020 +0530
> @@ -137,6 +137,9 @@
>      pixel*                 m_gaussianPic;
>      pixel*                 m_thetaPic;
>
> +    /* AQ mode for each frame */
> +    int                    m_frameAq;
> +
>      Frame();
>
>      bool create(x265_param *param, float* quantOffsets);
> diff -r fdbd4e4a2aff -r 196a29866e4e source/common/lowres.cpp
> --- a/source/common/lowres.cpp Sat Jan 25 18:08:03 2020 +0530
> +++ b/source/common/lowres.cpp Tue Feb 11 12:02:37 2020 +0530
> @@ -190,6 +190,9 @@
>          }
>      }
>
> +    if (param->rc.bAutoAq)
> +        lowresEdgePlane = X265_MALLOC(pixel, lumaStride * (lines +
> (origPic->m_lumaMarginY * 2)));
> +
>

Needs to be freed in destructor if allocated


>      return true;
>
>  fail:
> diff -r fdbd4e4a2aff -r 196a29866e4e source/common/lowres.h
> --- a/source/common/lowres.h Sat Jan 25 18:08:03 2020 +0530
> +++ b/source/common/lowres.h Tue Feb 11 12:02:37 2020 +0530
> @@ -44,6 +44,9 @@
>      pixel*   fpelLowerResPlane[3];
>      pixel*   lowerResPlane[4];
>
> +    /* Edge Plane in Lowres */
> +    pixel*   lowresEdgePlane;
> +
>      bool     isWeighted;
>      bool     isLowres;
>      bool     isHMELowres;
> diff -r fdbd4e4a2aff -r 196a29866e4e source/common/param.cpp
> --- a/source/common/param.cpp Sat Jan 25 18:08:03 2020 +0530
> +++ b/source/common/param.cpp Tue Feb 11 12:02:37 2020 +0530
> @@ -285,6 +285,7 @@
>      param->rc.bEnableConstVbv = 0;
>      param->bResetZoneConfig = 1;
>      param->reconfigWindowSize = 0;
> +    param->rc.bAutoAq = 0;
>
>      /* Video Usability Information (VUI) */
>      param->vui.aspectRatioIdc = 0;
> @@ -1226,6 +1227,7 @@
>          OPT("multi-pass-opt-analysis") p->analysisMultiPassRefine =
> atobool(value);
>          OPT("multi-pass-opt-distortion") p->analysisMultiPassDistortion =
> atobool(value);
>          OPT("aq-motion") p->bAQMotion = atobool(value);
> +        OPT("auto-aq") p->rc.bAutoAq = atobool(value);
>          OPT("dynamic-rd") p->dynamicRd = atof(value);
>          OPT("analysis-reuse-level")
>          {
> @@ -1609,7 +1611,7 @@
>            "Lookahead depth must be less than 256");
>      CHECK(param->lookaheadSlices > 16 || param->lookaheadSlices < 0,
>            "Lookahead slices must between 0 and 16");
> -    CHECK(param->rc.aqMode < X265_AQ_NONE || X265_AQ_EDGE <
> param->rc.aqMode,
> +    CHECK(param->rc.aqMode < X265_AQ_NONE || param->rc.aqMode >
> X265_AQ_EDGE_BIASED,
>            "Aq-Mode is out of range");
>      CHECK(param->rc.aqStrength < 0 || param->rc.aqStrength > 3,
>            "Aq-Strength is out of range");
> @@ -1867,9 +1869,12 @@
>               param->maxNumReferences, (param->limitReferences &
> X265_REF_LIMIT_CU) ? "on" : "off",
>               (param->limitReferences & X265_REF_LIMIT_DEPTH) ? "on" :
> "off");
>
> -    if (param->rc.aqMode)
> +    if (param->rc.aqMode && !param->rc.bAutoAq)
>          x265_log(param, X265_LOG_INFO, "AQ: mode / str / qg-size /
> cu-tree  : %d / %0.1f / %d / %d\n", param->rc.aqMode,
>                   param->rc.aqStrength, param->rc.qgSize,
> param->rc.cuTree);
> +    else if (param->rc.bAutoAq)
> +        x265_log(param, X265_LOG_INFO, "AQ: mode / str / qg-size /
> cu-tree  : Auto / %0.1f / %d / %d\n", param->rc.aqStrength,
> +                 param->rc.qgSize, param->rc.cuTree);
>

Nice!


>
>      if (param->bLossless)
>          x265_log(param, X265_LOG_INFO, "Rate Control
>    : Lossless\n");
> @@ -2172,6 +2177,7 @@
>      s += sprintf(s, " hist-threshold=%.2f", p->edgeTransitionThreshold);
>      BOOL(p->bOptCUDeltaQP, "opt-cu-delta-qp");
>      BOOL(p->bAQMotion, "aq-motion");
> +    BOOL(p->rc.bAutoAq, "auto-aq");
>      BOOL(p->bEmitHDR10SEI, "hdr10");
>      BOOL(p->bHDR10Opt, "hdr10-opt");
>      BOOL(p->bDhdr10opt, "dhdr10-opt");
> @@ -2452,6 +2458,7 @@
>      dst->rc.bEnableConstVbv = src->rc.bEnableConstVbv;
>      dst->rc.hevcAq = src->rc.hevcAq;
>      dst->rc.qpAdaptationRange = src->rc.qpAdaptationRange;
> +    dst->rc.bAutoAq = src->rc.bAutoAq;
>
>      dst->vui.aspectRatioIdc = src->vui.aspectRatioIdc;
>      dst->vui.sarWidth = src->vui.sarWidth;
> diff -r fdbd4e4a2aff -r 196a29866e4e source/encoder/slicetype.cpp
> --- a/source/encoder/slicetype.cpp Sat Jan 25 18:08:03 2020 +0530
> +++ b/source/encoder/slicetype.cpp Tue Feb 11 12:02:37 2020 +0530
> @@ -473,9 +473,9 @@
>      if (!(param->rc.bStatRead && param->rc.cuTree &&
> IS_REFERENCED(curFrame)))
>      {
>          /* Calculate Qp offset for each 16x16 or 8x8 block in the frame */
> -        if (param->rc.aqMode == X265_AQ_NONE || param->rc.aqStrength == 0)
> +        if (curFrame->m_frameAq == X265_AQ_NONE || param->rc.aqStrength
> == 0)
>          {
> -            if (param->rc.aqMode && param->rc.aqStrength == 0)
> +            if (curFrame->m_frameAq && param->rc.aqStrength == 0)
>              {
>                  if (quantOffsets)
>                  {
> @@ -516,10 +516,11 @@
>                  double bias_strength = 0.f;
>                  double strength = 0.f;
>
> -                if (param->rc.aqMode == X265_AQ_EDGE)
> +                if (curFrame->m_frameAq == X265_AQ_EDGE ||
> curFrame->m_frameAq == X265_AQ_EDGE_BIASED)
>                      edgeFilter(curFrame, param);
>
> -                if (param->rc.aqMode == X265_AQ_AUTO_VARIANCE ||
> param->rc.aqMode == X265_AQ_AUTO_VARIANCE_BIASED || param->rc.aqMode ==
> X265_AQ_EDGE)
> +                if (curFrame->m_frameAq == X265_AQ_AUTO_VARIANCE ||
> curFrame->m_frameAq == X265_AQ_AUTO_VARIANCE_BIASED ||
> +                    curFrame->m_frameAq == X265_AQ_EDGE ||
> curFrame->m_frameAq == X265_AQ_EDGE_BIASED)
>                  {
>                      double bit_depth_correction = 1.f / (1 << (2 *
> (X265_DEPTH - 8)));
>                      for (int blockY = 0; blockY < maxRow; blockY +=
> loopIncr)
> @@ -528,7 +529,7 @@
>                          {
>                              uint32_t energy, edgeDensity, avgAngle;
>                              energy = acEnergyCu(curFrame, blockX, blockY,
> param->internalCsp, param->rc.qgSize);
> -                            if (param->rc.aqMode == X265_AQ_EDGE)
> +                            if (curFrame->m_frameAq == X265_AQ_EDGE ||
> curFrame->m_frameAq == X265_AQ_EDGE_BIASED)
>                              {
>                                  edgeDensity = edgeDensityCu(curFrame,
> avgAngle, blockX, blockY, param->rc.qgSize);
>                                  if (edgeDensity)
> @@ -568,17 +569,17 @@
>                  {
>                      for (int blockX = 0; blockX < maxCol; blockX +=
> loopIncr)
>                      {
> -                        if (param->rc.aqMode ==
> X265_AQ_AUTO_VARIANCE_BIASED)
> +                        if (curFrame->m_frameAq ==
> X265_AQ_AUTO_VARIANCE_BIASED)
>                          {
>                              qp_adj =
> curFrame->m_lowres.qpCuTreeOffset[blockXY];
>                              qp_adj = strength * (qp_adj - avg_adj) +
> bias_strength * (1.f - modeTwoConst / (qp_adj * qp_adj));
>                          }
> -                        else if (param->rc.aqMode ==
> X265_AQ_AUTO_VARIANCE)
> +                        else if (curFrame->m_frameAq ==
> X265_AQ_AUTO_VARIANCE)
>                          {
>                              qp_adj =
> curFrame->m_lowres.qpCuTreeOffset[blockXY];
>                              qp_adj = strength * (qp_adj - avg_adj);
>                          }
> -                        else if (param->rc.aqMode == X265_AQ_EDGE)
> +                        else if (curFrame->m_frameAq == X265_AQ_EDGE)
>                          {
>                              inclinedEdge =
> curFrame->m_lowres.edgeInclined[blockXY];
>                              qp_adj =
> curFrame->m_lowres.qpCuTreeOffset[blockXY];
> @@ -587,6 +588,15 @@
>                              else
>                                  qp_adj = strength * (qp_adj - avg_adj);
>                          }
> +                        else if (curFrame->m_frameAq ==
> X265_AQ_EDGE_BIASED)
> +                        {
> +                            inclinedEdge =
> curFrame->m_lowres.edgeInclined[blockXY];
> +                            qp_adj =
> curFrame->m_lowres.qpCuTreeOffset[blockXY];
> +                            if (inclinedEdge && (qp_adj - avg_adj > 0))
> +                                qp_adj = ((strength + AQ_EDGE_BIAS) *
> (qp_adj - avg_adj)) + bias_strength * (1.f - modeTwoConst / (qp_adj *
> qp_adj));
> +                            else
> +                                qp_adj = strength * (qp_adj - avg_adj) +
> bias_strength * (1.f - modeTwoConst / (qp_adj * qp_adj));
> +                        }
>                          else
>                          {
>                              uint32_t energy = acEnergyCu(curFrame,
> blockX, blockY, param->internalCsp, param->rc.qgSize);
> @@ -1370,6 +1380,44 @@
>      }
>  }
>
> +double computeBrightnessIntensity(pixel *inPlane, int width, int height,
> intptr_t stride)
> +{
> +    pixel* rowStart = inPlane;
> +    double count = 0;
> +
> +    for (int i = 0; i < height; i++)
> +    {
> +        for (int j = 0; j < width; j++)
> +        {
> +            if (rowStart[j] > BRIGHTNESS_THRESHOLD)
> +                count++;
> +        }
> +        rowStart += stride;
> +    }
> +
> +    /* Returns the brightness percentage of the input plane */
> +    return (count / (width * height)) * 100;
> +}
> +
> +double computeEdgeIntensity(pixel *inPlane, int width, int height,
> intptr_t stride)
> +{
> +    pixel* rowStart = inPlane;
> +    double count = 0;
> +
> +    for (int i = 0; i < height; i++)
> +    {
> +        for (int j = 0; j < width; j++)
> +        {
> +            if (rowStart[j] > 0)
> +                count++;
> +        }
> +        rowStart += stride;
> +    }
> +
> +    /* Returns the edge percentage of the input plane */
> +    return (count / (width * height)) * 100;
> +}
> +
>  void PreLookaheadGroup::processTasks(int workerThreadID)
>  {
>      if (workerThreadID < 0)
> @@ -1384,6 +1432,36 @@
>          ProfileScopeEvent(prelookahead);
>          m_lock.release();
>          preFrame->m_lowres.init(preFrame->m_fencPic, preFrame->m_poc);
> +
> +        /* Auto AQ */
> +        if (preFrame->m_param->rc.bAutoAq)
> +        {
> +            int heightL = preFrame->m_lowres.lines;
> +            int widthL = preFrame->m_lowres.width;
> +            pixel *lumaPlane = preFrame->m_lowres.fpelPlane[0];
> +            intptr_t stride = preFrame->m_lowres.lumaStride;
> +            double brightnessIntensity = 0, edgeIntensity = 0;
> +
> +            /* Edge plane computation */
> +            memset(preFrame->m_lowres.lowresEdgePlane, 0, stride *
> (heightL + (preFrame->m_fencPic->m_lumaMarginY * 2)) * sizeof(pixel));
> +            pixel* lowresEdgePic = preFrame->m_lowres.lowresEdgePlane +
> preFrame->m_fencPic->m_lumaMarginY * stride +
> preFrame->m_fencPic->m_lumaMarginX;
> +            computeEdge(lowresEdgePic, lumaPlane, NULL, stride, heightL,
> widthL, false);
> +
> +            /*Frame edge percentage computation */
> +            edgeIntensity = computeEdgeIntensity(lowresEdgePic, widthL,
> heightL, stride);
> +
> +            /* Frame Brightness percentage computation */
> +            brightnessIntensity = computeBrightnessIntensity(lumaPlane,
> widthL, heightL, stride);
> +
> +            /* AQ mode switch */
> +            if (edgeIntensity < AQ_4_THRESHOLD)
> +                preFrame->m_frameAq = brightnessIntensity >
> AQ_2_THRESHOLD ? X265_AQ_AUTO_VARIANCE : X265_AQ_AUTO_VARIANCE_BIASED;
> +            else
> +                preFrame->m_frameAq = brightnessIntensity >
> AQ_2_THRESHOLD ? X265_AQ_EDGE : X265_AQ_EDGE_BIASED;
> +        }
> +        else
> +            preFrame->m_frameAq = preFrame->m_param->rc.aqMode;
> +
>          if (m_lookahead.m_bAdaptiveQuant)
>              tld.calcAdaptiveQuantFrame(preFrame, m_lookahead.m_param);
>          tld.lowresIntraEstimate(preFrame->m_lowres,
> m_lookahead.m_param->rc.qgSize);
> @@ -1392,6 +1470,7 @@
>          m_lock.acquire();
>      }
>      m_lock.release();
> +
>  }
>
>  /* called by API thread or worker thread with inputQueueLock acquired */
> diff -r fdbd4e4a2aff -r 196a29866e4e source/test/regression-tests.txt
> --- a/source/test/regression-tests.txt Sat Jan 25 18:08:03 2020 +0530
> +++ b/source/test/regression-tests.txt Tue Feb 11 12:02:37 2020 +0530
> @@ -162,6 +162,8 @@
>  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 ultrafast --hist-scenecut
> --hist-threshold 0.02
> +ducks_take_off_420_720p50.y4m, --preset medium --auto-aq --aq-strength 1.5
>

I don't see a reason to have this command-line regressed in addition to the
one below; please remove.


> +ducks_take_off_420_720p50.y4m, --preset slow --auto-aq --aq-strength 1.5
> --aq-motion
>
>  # Main12 intraCost overflow bug test
>  720p50_parkrun_ter.y4m,--preset medium
> diff -r fdbd4e4a2aff -r 196a29866e4e source/x265.h
> --- a/source/x265.h Sat Jan 25 18:08:03 2020 +0530
> +++ b/source/x265.h Tue Feb 11 12:02:37 2020 +0530
> @@ -574,6 +574,8 @@
>  #define X265_AQ_AUTO_VARIANCE        2
>  #define X265_AQ_AUTO_VARIANCE_BIASED 3
>  #define X265_AQ_EDGE                 4
> +#define X265_AQ_EDGE_BIASED          5
> +
>  #define x265_ADAPT_RD_STRENGTH   4
>  #define X265_REFINE_INTER_LEVELS 3
>  /* NOTE! For this release only X265_CSP_I420 and X265_CSP_I444 are
> supported */
> @@ -1475,6 +1477,9 @@
>          /* internally enable if tune grain is set */
>          int      bEnableConstVbv;
>
> +        /* automatically switch AQ mode for each frame */
> +        int      bAutoAq;
> +
>      } rc;
>
>      /*== Video Usability Information ==*/
> diff -r fdbd4e4a2aff -r 196a29866e4e source/x265cli.h
> --- a/source/x265cli.h Sat Jan 25 18:08:03 2020 +0530
> +++ b/source/x265cli.h Tue Feb 11 12:02:37 2020 +0530
> @@ -172,6 +172,8 @@
>      { "qp",             required_argument, NULL, 'q' },
>      { "aq-mode",        required_argument, NULL, 0 },
>      { "aq-strength",    required_argument, NULL, 0 },
> +    { "auto-aq",              no_argument, NULL, 0 },
> +    { "no-auto-aq",           no_argument, NULL, 0 },
>      { "rc-grain",             no_argument, NULL, 0 },
>      { "no-rc-grain",          no_argument, NULL, 0 },
>      { "ipratio",        required_argument, NULL, 0 },
> @@ -580,11 +582,19 @@
>          "                                    - 0 : Disabled.\n"
>          "                                    - 1 : Store/Load ctu
> distortion to/from the file specified in analysis-save/load.\n"
>          "                                Default 0 - Disabled\n");
> -    H0("   --aq-mode <integer>           Mode for Adaptive Quantization -
> 0:none 1:uniform AQ 2:auto variance 3:auto variance with bias to dark
> scenes 4:auto variance with edge information. Default %d\n",
> param->rc.aqMode);
> +    H0("   --aq-mode <integer>           Mode for Adaptive
> Quantization.\n"
> +       "                                     - 0 : none.\n"
> +       "                                     - 1 : uniform AQ.\n"
> +       "                                     - 2 : auto variance.\n"
> +       "                                     - 3 : auto variance with
> bias to dark scenes.\n"
> +       "                                     - 4 : auto variance with
> edge density.\n"
> +       "                                     - 5 : auto variance with
> edge density and bias towards dark scenes.\n"
> +       "                                 Default %d\n", param->rc.aqMode);
>      H0("   --[no-]hevc-aq                Mode for HEVC Adaptive
> Quantization. Default %s\n", OPT(param->rc.hevcAq));
>      H0("   --aq-strength <float>         Reduces blocking and blurring in
> flat and textured areas (0 to 3.0). Default %.2f\n", param->rc.aqStrength);
>      H0("   --qp-adaptation-range <float> Delta QP range by QP adaptation
> based on a psycho-visual model (1.0 to 6.0). Default %.2f\n",
> param->rc.qpAdaptationRange);
>      H0("   --[no-]aq-motion              Block level QP adaptation based
> on the relative motion between the block and the frame. Default %s\n",
> OPT(param->bAQMotion));
> +    H1("   --[no-]auto-aq                Auto AQ. Default %s\n",
> OPT(param->rc.bAutoAq));
>

Please add more info in help to give a 1-liner about the feature


>      H0("   --qg-size <int>               Specifies the size of the
> quantization group (64, 32, 16, 8). Default %d\n", param->rc.qgSize);
>      H0("   --[no-]cutree                 Enable cutree for Adaptive
> Quantization. Default %s\n", OPT(param->rc.cuTree));
>      H0("   --[no-]rc-grain               Enable ratecontrol mode to
> handle grains specifically. turned on with tune grain. Default %s\n",
> OPT(param->rc.bEnableGrain));
> Thanks & Regards
> *Niranjan Kumar B*
> Video Codec Engineer
> Media & AI Analytics
> +91 958 511 1449
> <https://multicorewareinc.com/>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20200221/0130d975/attachment-0001.html>


More information about the x265-devel mailing list