[x265] [PATCH] Fix memory leak in SBRC

Mahesh Pittala mahesh at multicorewareinc.com
Fri Nov 4 10:38:36 UTC 2022


Pushed to master branch, Thanks

On Wed, Nov 2, 2022 at 6:53 PM Snehaa Giridharan <
snehaa at multicorewareinc.com> wrote:

> From 6b8db060a7ee5850758b05c9ff0119a8269bf6f8 Mon Sep 17 00:00:00 2001
> From: Snehaa Giridharan <snehaa at multicorewareinc.com>
> Date: Tue, 1 Nov 2022 16:50:45 +0530
> Subject: [PATCH] Fix memory leak in SBRC
>
> ---
>  source/common/frame.cpp      |  2 +-
>  source/encoder/slicetype.cpp | 73 +++++++++++++++++++-----------------
>  source/encoder/slicetype.h   |  1 +
>  source/x265.h                |  1 -
>  4 files changed, 40 insertions(+), 37 deletions(-)
>
> diff --git a/source/common/frame.cpp b/source/common/frame.cpp
> index d7f8ce2a8..019a5cb76 100644
> --- a/source/common/frame.cpp
> +++ b/source/common/frame.cpp
> @@ -63,7 +63,7 @@ Frame::Frame()
>      m_thetaPic = NULL;
>      m_edgeBitPlane = NULL;
>      m_edgeBitPic = NULL;
> -    m_frameSegment = X265_AQ_NONE;
> +    m_frameSegment = 0;
>      m_isInsideWindow = 0;
>
>      // mcstf
> diff --git a/source/encoder/slicetype.cpp b/source/encoder/slicetype.cpp
> index 79541e5cb..5a1500716 100644
> --- a/source/encoder/slicetype.cpp
> +++ b/source/encoder/slicetype.cpp
> @@ -481,9 +481,9 @@ void LookaheadTLD::calcAdaptiveQuantFrame(Frame
> *curFrame, x265_param* param)
>      if (!(param->rc.bStatRead && param->rc.cuTree &&
> IS_REFERENCED(curFrame)))
>      {
>          /* Calculate Qp offset for each 16x16 or 8x8 block in the frame */
> -        if (curFrame->m_frameSegment == X265_AQ_NONE ||
> param->rc.aqStrength == 0)
> +        if (param->rc.aqMode == X265_AQ_NONE || param->rc.aqStrength == 0)
>          {
> -            if (curFrame->m_frameSegment && param->rc.aqStrength == 0)
> +            if (param->rc.aqMode && param->rc.aqStrength == 0)
>              {
>                  if (quantOffsets)
>                  {
> @@ -524,17 +524,17 @@ void LookaheadTLD::calcAdaptiveQuantFrame(Frame
> *curFrame, x265_param* param)
>                  double bias_strength = 0.f;
>                  double strength = 0.f;
>
> -                if (curFrame->m_frameSegment == X265_AQ_EDGE )
> +                if (param->rc.aqMode == X265_AQ_EDGE)
>                      edgeFilter(curFrame, param);
>
> -                if (curFrame->m_frameSegment == X265_AQ_EDGE &&
> param->recursionSkipMode == EDGE_BASED_RSKIP)
> +                if (param->rc.aqMode == X265_AQ_EDGE &&
> param->recursionSkipMode == EDGE_BASED_RSKIP)
>                  {
>                      pixel* src = curFrame->m_edgePic +
> curFrame->m_fencPic->m_lumaMarginY * curFrame->m_fencPic->m_stride +
> curFrame->m_fencPic->m_lumaMarginX;
>                      primitives.planecopy_pp_shr(src,
> curFrame->m_fencPic->m_stride, curFrame->m_edgeBitPic,
>                          curFrame->m_fencPic->m_stride,
> curFrame->m_fencPic->m_picWidth, curFrame->m_fencPic->m_picHeight,
> SHIFT_TO_BITPLANE);
>                  }
>
> -                if (curFrame->m_frameSegment == X265_AQ_AUTO_VARIANCE ||
> curFrame->m_frameSegment == X265_AQ_AUTO_VARIANCE_BIASED ||
> curFrame->m_frameSegment == X265_AQ_EDGE)
> +                if (param->rc.aqMode == X265_AQ_AUTO_VARIANCE ||
> param->rc.aqMode == X265_AQ_AUTO_VARIANCE_BIASED || param->rc.aqMode ==
> X265_AQ_EDGE)
>                  {
>                      double bit_depth_correction = 1.f / (1 << (2 *
> (X265_DEPTH - 8)));
>                      for (int blockY = 0; blockY < maxRow; blockY +=
> loopIncr)
> @@ -543,7 +543,7 @@ void LookaheadTLD::calcAdaptiveQuantFrame(Frame
> *curFrame, x265_param* param)
>                          {
>                              uint32_t energy, edgeDensity, avgAngle;
>                              energy = acEnergyCu(curFrame, blockX, blockY,
> param->internalCsp, param->rc.qgSize);
> -                            if (curFrame->m_frameSegment == X265_AQ_EDGE)
> +                            if (param->rc.aqMode == X265_AQ_EDGE)
>                              {
>                                  edgeDensity = edgeDensityCu(curFrame,
> avgAngle, blockX, blockY, param->rc.qgSize);
>                                  if (edgeDensity)
> @@ -583,17 +583,17 @@ void LookaheadTLD::calcAdaptiveQuantFrame(Frame
> *curFrame, x265_param* param)
>                  {
>                      for (int blockX = 0; blockX < maxCol; blockX +=
> loopIncr)
>                      {
> -                        if (curFrame->m_frameSegment ==
> X265_AQ_AUTO_VARIANCE_BIASED)
> +                        if (param->rc.aqMode ==
> 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 (curFrame->m_frameSegment ==
> X265_AQ_AUTO_VARIANCE)
> +                        else if (param->rc.aqMode ==
> X265_AQ_AUTO_VARIANCE)
>                          {
>                              qp_adj =
> curFrame->m_lowres.qpCuTreeOffset[blockXY];
>                              qp_adj = strength * (qp_adj - avg_adj);
>                          }
> -                        else if (curFrame->m_frameSegment == X265_AQ_EDGE)
> +                        else if (param->rc.aqMode == X265_AQ_EDGE)
>                          {
>                              inclinedEdge =
> curFrame->m_lowres.edgeInclined[blockXY];
>                              qp_adj =
> curFrame->m_lowres.qpCuTreeOffset[blockXY];
> @@ -1732,6 +1732,34 @@ void LookaheadTLD::collectPictureStatistics(Frame
> *curFrame)
>      curFrame->m_lowres.bHistScenecutAnalyzed = false;
>  }
>
> +void LookaheadTLD::calcFrameSegment(Frame *preFrame)
> +{
> +    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 < FRAME_EDGE_THRESHOLD)
> +        preFrame->m_frameSegment = brightnessIntensity >
> FRAME_BRIGHTNESS_THRESHOLD ? X265_AQ_AUTO_VARIANCE :
> X265_AQ_AUTO_VARIANCE_BIASED;
> +    else
> +        preFrame->m_frameSegment = brightnessIntensity >
> FRAME_BRIGHTNESS_THRESHOLD ? X265_AQ_EDGE : X265_AQ_VARIANCE;
> +
> +    preFrame->m_param->rc.aqMode = preFrame->m_frameSegment;
> +}
> +
>  void PreLookaheadGroup::processTasks(int workerThreadID)
>  {
>      if (workerThreadID < 0)
> @@ -1749,32 +1777,7 @@ void PreLookaheadGroup::processTasks(int
> workerThreadID)
>
>          /* SBRC */
>          if (preFrame->m_param->rc.frameSegment)
> -        {
> -            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 < FRAME_EDGE_THRESHOLD)
> -                preFrame->m_frameSegment = brightnessIntensity >
> FRAME_BRIGHTNESS_THRESHOLD? X265_AQ_AUTO_VARIANCE :
> X265_AQ_AUTO_VARIANCE_BIASED;
> -            else
> -                preFrame->m_frameSegment = brightnessIntensity >
> FRAME_BRIGHTNESS_THRESHOLD? X265_AQ_EDGE : X265_AQ_EDGE_BIASED;
> -        }
> -        else
> -            preFrame->m_frameSegment = preFrame->m_param->rc.aqMode;
> +            tld.calcFrameSegment(preFrame);
>
>          if (m_lookahead.m_bAdaptiveQuant)
>              tld.calcAdaptiveQuantFrame(preFrame, m_lookahead.m_param);
> diff --git a/source/encoder/slicetype.h b/source/encoder/slicetype.h
> index d0a39506a..05cef800b 100644
> --- a/source/encoder/slicetype.h
> +++ b/source/encoder/slicetype.h
> @@ -133,6 +133,7 @@ struct LookaheadTLD
>      uint32_t calcVariance(pixel* src, intptr_t stride, intptr_t
> blockOffset, uint32_t plane);
>
>      void calcAdaptiveQuantFrame(Frame *curFrame, x265_param* param);
> +    void calcFrameSegment(Frame *curFrame);
>      void lowresIntraEstimate(Lowres& fenc, uint32_t qgSize);
>
>      void weightsAnalyse(Lowres& fenc, Lowres& ref);
> diff --git a/source/x265.h b/source/x265.h
> index 4f1c52d56..e77d4e019 100644
> --- a/source/x265.h
> +++ b/source/x265.h
> @@ -581,7 +581,6 @@ typedef enum
>  #define X265_AQ_AUTO_VARIANCE        2
>  #define X265_AQ_AUTO_VARIANCE_BIASED 3
>  #define X265_AQ_EDGE                 4
> -#define X265_AQ_EDGE_BIASED          1
>  #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 */
> --
> 2.37.2.windows.2
>
> _______________________________________________
> 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/20221104/1aa1f459/attachment-0001.htm>


More information about the x265-devel mailing list