14 patches pushed to the master branch. On Wed, Oct 19, 2022 at 1:10 PM Snehaa Giridharan < [email protected]> wrote:
> From 7532117d7a4161b05df3f80103ff149699688d82 Mon Sep 17 00:00:00 2001 > From: Snehaa Giridharan <[email protected]> > Date: Wed, 19 Oct 2022 12:40:51 +0530 > Subject: [PATCH] Cleanup and Fix warnings > > Also modifies cli.rst > --- > doc/reST/cli.rst | 5 + > source/CMakeLists.txt | 2 +- > source/common/temporalfilter.cpp | 228 +------------------------------ > source/common/temporalfilter.h | 11 -- > source/encoder/dpb.cpp | 2 +- > 5 files changed, 10 insertions(+), 238 deletions(-) > > diff --git a/doc/reST/cli.rst b/doc/reST/cli.rst > index be32fc6cc..9fa12fa92 100755 > --- a/doc/reST/cli.rst > +++ b/doc/reST/cli.rst > @@ -1328,6 +1328,11 @@ Temporal / motion search options > Search range for HME level 0, 1 and 2. > The Search Range for each HME level must be between 0 and > 32768(excluding). > Default search range is 16,32,48 for level 0,1,2 respectively. > + > +.. option:: --mcstf, --no-mcstf > + > + Enable Motion Compensated Temporal filtering. > + Default: disabled > > Spatial/intra options > ===================== > diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt > index 8a93a8bc4..04ceea0ec 100755 > --- a/source/CMakeLists.txt > +++ b/source/CMakeLists.txt > @@ -29,7 +29,7 @@ option(NATIVE_BUILD "Target the build CPU" OFF) > 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 205) > +set(X265_BUILD 206) > configure_file("${PROJECT_SOURCE_DIR}/x265.def.in" > "${PROJECT_BINARY_DIR}/x265.def") > configure_file("${PROJECT_SOURCE_DIR}/x265_config.h.in" > diff --git a/source/common/temporalfilter.cpp > b/source/common/temporalfilter.cpp > index d178c5800..01a6ddf15 100644 > --- a/source/common/temporalfilter.cpp > +++ b/source/common/temporalfilter.cpp > @@ -494,113 +494,6 @@ void TemporalFilter::applyMotion(MV *mvs, uint32_t > mvsStride, PicYuv *input, Pic > } > } > > -#if 0 > -/* > -* Old Version: bilateralFilter > -*/ > -void TemporalFilter::bilateralFilter(Frame* frame, > - TemporalFilterRefPicInfo* m_mcstfRefList, > - double overallStrength) > -{ > - > - const int numRefs = frame->m_mcstf->m_numRef; > - > - for (int i = 0; i < numRefs; i++) > - { > - TemporalFilterRefPicInfo *ref = &m_mcstfRefList[i]; > - applyMotion(m_mcstfRefList[i].mvs, m_mcstfRefList[i].mvsStride, > m_mcstfRefList[i].picBuffer, ref->compensatedPic); > - } > - > - int refStrengthRow = 2; > - if (numRefs == m_range * 2) > - { > - refStrengthRow = 0; > - } > - else if (numRefs == m_range) > - { > - refStrengthRow = 1; > - } > - > - const double lumaSigmaSq = (m_QP - m_sigmaZeroPoint) * (m_QP - > m_sigmaZeroPoint) * m_sigmaMultiplier; > - const double chromaSigmaSq = 30 * 30; > - > - PicYuv* orgPic = frame->m_fencPic; > - > - for (int c = 0; c < m_numComponents; c++) > - { > - int height, width; > - pixel *srcPelRow = NULL; > - intptr_t srcStride, correctedPicsStride = 0; > - > - if (!c) > - { > - height = orgPic->m_picHeight; > - width = orgPic->m_picWidth; > - srcPelRow = orgPic->m_picOrg[c]; > - srcStride = orgPic->m_stride; > - } > - else > - { > - int csx = CHROMA_H_SHIFT(m_internalCsp); > - int csy = CHROMA_V_SHIFT(m_internalCsp); > - > - height = orgPic->m_picHeight >> csy; > - width = orgPic->m_picWidth >> csx; > - srcPelRow = orgPic->m_picOrg[c]; > - srcStride = (int)orgPic->m_strideC; > - } > - > - const double sigmaSq = (!c) ? lumaSigmaSq : chromaSigmaSq; > - const double weightScaling = overallStrength * ((!c) ? 0.4 : > m_chromaFactor); > - > - const pixel maxSampleValue = (1 << m_bitDepth) - 1; > - const double bitDepthDiffWeighting = 1024.0 / (maxSampleValue + > 1); > - > - for (int y = 0; y < height; y++, srcPelRow += srcStride) > - { > - pixel *srcPel = srcPelRow; > - > - for (int x = 0; x < width; x++, srcPel++) > - { > - const int orgVal = (int)*srcPel; > - double temporalWeightSum = 1.0; > - double newVal = (double)orgVal; > - > - for (int i = 0; i < numRefs; i++) > - { > - TemporalFilterRefPicInfo *refPicInfo = > &m_mcstfRefList[i]; > - > - if (!c) > - correctedPicsStride = > refPicInfo->compensatedPic->m_stride; > - else > - correctedPicsStride = > refPicInfo->compensatedPic->m_strideC; > - > - const pixel *pCorrectedPelPtr = > refPicInfo->compensatedPic->m_picOrg[c] + (y * correctedPicsStride + x); > - const int refVal = (int)*pCorrectedPelPtr; > - double diff = (double)(refVal - orgVal); > - diff *= bitDepthDiffWeighting; > - double diffSq = diff * diff; > - > - const int index = X265_MIN(1, > std::abs(refPicInfo->origOffset) - 1); > - const double weight = weightScaling * > s_refStrengths[refStrengthRow][index] * exp(-diffSq / (2 * sigmaSq)); > - > - newVal += weight * refVal; > - temporalWeightSum += weight; > - } > - newVal /= temporalWeightSum; > - pixel sampleVal = (pixel)round(newVal); > - sampleVal = (sampleVal < 0 ? 0 : (sampleVal > > maxSampleValue ? maxSampleValue : sampleVal)); > - *srcPel = sampleVal; > - } > - } > - } > -} > - > -#else > - > -/* > -* New Version: bilateralFilter > -*/ > void TemporalFilter::bilateralFilter(Frame* frame, > TemporalFilterRefPicInfo* m_mcstfRefList, > double overallStrength) > @@ -656,7 +549,7 @@ void TemporalFilter::bilateralFilter(Frame* frame, > const double sigmaSq = (!c) ? lumaSigmaSq : chromaSigmaSq; > const double weightScaling = overallStrength * ( (!c) ? 0.4 : > m_chromaFactor); > > - const pixel maxSampleValue = (1 << m_bitDepth) - 1; > + const double maxSampleValue = (1 << m_bitDepth) - 1; > const double bitDepthDiffWeighting = 1024.0 / (maxSampleValue + > 1); > > const int blkSize = (!c) ? 8 : 4; > @@ -742,128 +635,14 @@ void TemporalFilter::bilateralFilter(Frame* frame, > temporalWeightSum += weight; > } > newVal /= temporalWeightSum; > - pixel sampleVal = (pixel)round(newVal); > + double sampleVal = round(newVal); > sampleVal = (sampleVal < 0 ? 0 : (sampleVal > > maxSampleValue ? maxSampleValue : sampleVal)); > - *srcPel = sampleVal; > - } > - } > - } > -} > -#endif > - > -#if 0 > -/*Old Version: motionEstimationLuma*/ > - > -void TemporalFilter::motionEstimationLuma(MV *mvs, uint32_t mvStride, > PicYuv *orig, PicYuv *buffer, int blockSize, > - MV *previous, uint32_t prevMvStride, int factor, bool doubleRes, int* > minError) > -{ > - > - int range = 5; > - > - > - const int stepSize = blockSize; > - > - const int origWidth = orig->m_picWidth; > - const int origHeight = orig->m_picHeight; > - > - > - for (int blockY = 0; blockY + blockSize < origHeight; blockY += > stepSize) > - { > - for (int blockX = 0; blockX + blockSize < origWidth; blockX += > stepSize) > - { > - MV best(0, 0); > - int leastError = INT_MAX; > - > - if (previous == NULL) > - { > - range = 8; > - } > - else > - { > - > - for (int py = -2; py <= 2; py++) > - { > - int testy = blockY / (2 * blockSize) + py; > - > - for (int px = -2; px <= 2; px++) > - { > - > - int testx = blockX / (2 * blockSize) + px; > - if ((testx >= 0) && (testx < origWidth / (2 * > blockSize)) && (testy >= 0) && (testy < origHeight / (2 * blockSize))) > - { > - int mvIdx = testy * prevMvStride + testx; > - MV old = previous[mvIdx]; > - > - int error = motionErrorLuma(orig, buffer, > blockX, blockY, old.x * factor, old.y * factor, blockSize, leastError); > - if (error < leastError) > - { > - best.set(old.x * factor, old.y * factor); > - leastError = error; > - } > - } > - } > - } > - > - } > - > - MV prevBest = best; > - for (int y2 = prevBest.y / s_motionVectorFactor - range; y2 > <= prevBest.y / s_motionVectorFactor + range; y2++) > - { > - for (int x2 = prevBest.x / s_motionVectorFactor - range; > x2 <= prevBest.x / s_motionVectorFactor + range; x2++) > - { > - int error = motionErrorLuma(orig, buffer, blockX, > blockY, x2 * s_motionVectorFactor, y2 * s_motionVectorFactor, blockSize, > leastError/*best.error*/); > - if (error < leastError) > - { > - best.set(x2 * s_motionVectorFactor, y2 * > s_motionVectorFactor); > - leastError = error; > - } > - } > - } > - > - if (doubleRes) > - { // merge into one loop, probably with precision array (here > [12, 3] or maybe [4, 1]) with setable number of iterations > - prevBest = best; > - int doubleRange = 3 * 4; > - for (int y2 = prevBest.y - doubleRange; y2 <= prevBest.y > + doubleRange; y2 += 4) > - { > - for (int x2 = prevBest.x - doubleRange; x2 <= > prevBest.x + doubleRange; x2 += 4) > - { > - int error = motionErrorLuma(orig, buffer, blockX, > blockY, x2, y2, blockSize, leastError); > - if (error < leastError) > - { > - best.set(x2, y2); > - leastError = error; > - } > - } > - } > - > - prevBest = best; > - doubleRange = 3; > - for (int y2 = prevBest.y - doubleRange; y2 <= prevBest.y > + doubleRange; y2++) > - { > - for (int x2 = prevBest.x - doubleRange; x2 <= > prevBest.x + doubleRange; x2++) > - { > - int error = motionErrorLuma(orig, buffer, blockX, > blockY, x2, y2, blockSize, leastError); > - if (error < leastError) > - { > - best.set(x2, y2); > - leastError = error; > - } > - } > - } > + *srcPel = (pixel)sampleVal; > } > - > - int mvIdx = (blockY / stepSize) * mvStride + (blockX / > stepSize); > - mvs[mvIdx] = best; > - if (doubleRes) > - minError[mvIdx] = leastError; > } > } > } > > -#else > - > -/*New Version: motionEstimationLuma*/ > void TemporalFilter::motionEstimationLuma(MV *mvs, uint32_t mvStride, > PicYuv *orig, PicYuv *buffer, int blockSize, > MV *previous, uint32_t prevMvStride, int factor) > { > @@ -1211,7 +990,6 @@ void TemporalFilter::motionEstimationLumaDoubleRes(MV > *mvs, uint32_t mvStride, P > } > } > } > -#endif > > void TemporalFilter::destroyRefPicInfo(TemporalFilterRefPicInfo* curFrame) > { > diff --git a/source/common/temporalfilter.h > b/source/common/temporalfilter.h > index 55ae6736d..10f0c52b4 100644 > --- a/source/common/temporalfilter.h > +++ b/source/common/temporalfilter.h > @@ -35,8 +35,6 @@ > > using namespace X265_NS; > > -#define BILTERAL_FILTER_NEW_VERSION 1 > - > const int s_interpolationFilter[16][8] = > { > { 0, 0, 0, 64, 0, 0, 0, 0 }, //0 > @@ -57,7 +55,6 @@ const int s_interpolationFilter[16][8] = > { 0, 0, -2, 4, 64, -3, 1, 0 } //15-->--> > }; > > -#if BILTERAL_FILTER_NEW_VERSION > const double s_refStrengths[3][4] = > { // abs(POC offset) > // 1, 2 3 4 > @@ -65,14 +62,6 @@ const double s_refStrengths[3][4] = > {1.13, 0.97, 0.81, 0.57}, // m_range > {0.30, 0.30, 0.30, 0.30} // otherwise > }; > -#else > -const double s_refStrengths[2][2] = > -{ // abs(POC offset) > - // 1, 2 > - {0.85, 0.60}, // w future refs > - {1.20, 1.00}, // w/o future refs > -}; > -#endif > > class OrigPicBuffer > { > diff --git a/source/encoder/dpb.cpp b/source/encoder/dpb.cpp > index 9292b6c75..79274f5dd 100644 > --- a/source/encoder/dpb.cpp > +++ b/source/encoder/dpb.cpp > @@ -73,7 +73,7 @@ void DPB::recycleUnreferenced() > bool isMCSTFReferenced = false; > > if (curFrame->m_param->bEnableTemporalFilter) > - isMCSTFReferenced = curFrame->m_refPicCnt[1]; > + isMCSTFReferenced =!!(curFrame->m_refPicCnt[1]); > > if (!curFrame->m_encData->m_bHasReferences && > !curFrame->m_countRefEncoders && !isMCSTFReferenced) > { > -- > 2.37.2.windows.2 > > > *Thanks and Regards,* > > > > > > *Snehaa.GVideo Codec Engineer,Media & AI analytics > <https://multicorewareinc.com/>* > _______________________________________________ > 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
