[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