Pushed to master branch, Thanks On Wed, Nov 2, 2022 at 6:53 PM Snehaa Giridharan < [email protected]> wrote:
> From 6b8db060a7ee5850758b05c9ff0119a8269bf6f8 Mon Sep 17 00:00:00 2001 > From: Snehaa Giridharan <[email protected]> > 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 > [email protected] > https://mailman.videolan.org/listinfo/x265-devel >
_______________________________________________ x265-devel mailing list [email protected] https://mailman.videolan.org/listinfo/x265-devel
