From 28ba11cf572f5bc86bc5d27d95e292c309981dda Mon Sep 17 00:00:00 2001 From: "Christian R. Helmrich" Date: Sun, 14 Jun 2020 23:00:00 +0200 Subject: [PATCH] fix previous commits --- src/app/exhaleApp.cpp | 2 +- src/lib/exhaleEnc.cpp | 7 ++++--- src/lib/specGapFilling.cpp | 30 ++++++++++++++++++------------ src/lib/specGapFilling.h | 3 ++- 4 files changed, 25 insertions(+), 17 deletions(-) diff --git a/src/app/exhaleApp.cpp b/src/app/exhaleApp.cpp index d45ec65..970527c 100644 --- a/src/app/exhaleApp.cpp +++ b/src/app/exhaleApp.cpp @@ -30,7 +30,7 @@ #include #endif -#if defined (_MSC_VER) || defined (__INTEL_COMPILER) || defined (__MINGW32__) +#if defined (_MSC_VER) || defined (__INTEL_COMPILER) // || defined (__GNUC__) || defined (__MINGW32__) #define EXHALE_APP_WCHAR #define _SOPENS _wsopen_s #else diff --git a/src/lib/exhaleEnc.cpp b/src/lib/exhaleEnc.cpp index a347ebb..1d00d67 100644 --- a/src/lib/exhaleEnc.cpp +++ b/src/lib/exhaleEnc.cpp @@ -758,7 +758,7 @@ unsigned ExhaleEncoder::psychBitAllocation () // perceptual bit-allocation via s const unsigned samplingRate = toSamplingRate (m_frequencyIdx); const unsigned lfeChannelIndex = (m_channelConf >= CCI_6_CH ? __max (5, nChannels - 1) : USAC_MAX_NUM_CHANNELS); const uint32_t maxSfbLong = (samplingRate < 37566 ? 51 /*32 kHz*/ : brModeAndFsToMaxSfbLong (m_bitRateMode, samplingRate)); - const uint64_t scaleSr = (samplingRate < 27713 ? (samplingRate < 24000 ? 32 : 34) - m_bitRateMode : 37) - (nChannels >> 1); + const uint64_t scaleSr = (samplingRate < 27713 ? (samplingRate < 24000 ? 32 : 34) - __min (3, m_bitRateMode) : 37) - (nChannels >> 1); const uint64_t scaleBr = (m_bitRateMode == 0 ? __min (38, 3 + (samplingRate >> 10) + (samplingRate >> 13)) - (nChannels >> 1) : scaleSr - eightTimesSqrt256Minus[256 - m_bitRateMode] - __min (3, (m_bitRateMode - 1) >> 1)); uint32_t* sfbStepSizes = (uint32_t*) m_tempIntBuf; @@ -916,6 +916,7 @@ unsigned ExhaleEncoder::psychBitAllocation () // perceptual bit-allocation via s { SfbGroupData& grpData = coreConfig.groupingData[ch]; const bool eightShorts = (coreConfig.icsInfoCurr[ch].windowSequence == EIGHT_SHORT); + const bool saveBitRate = (meanSpecFlat[ci] > (SCHAR_MAX >> 1) && samplingRate >= 32000 + (unsigned) m_bitRateMode * 12000); const uint8_t maxSfbCh = grpData.sfbsPerGroup; const uint8_t numSwbCh = (eightShorts ? m_numSwbShort : m_numSwbLong); const uint16_t mSfmFac = UCHAR_MAX - ((9u * meanSpecFlat[ci]) >> 4); @@ -968,7 +969,7 @@ unsigned ExhaleEncoder::psychBitAllocation () // perceptual bit-allocation via s for (b = 0; b < maxSfbCh; b++) { const unsigned lfConst = (samplingRate < 27713 && !eightShorts ? 1 : 2); // LF SNR boost, cf my M.Sc. thesis - const unsigned lfAtten = (b <= 5 ? (eightShorts ? 1 : 4) + b * lfConst : 5 * lfConst - 1 + b + ((b + 5) >> 4)); + const unsigned lfAtten = (saveBitRate || b <= 5 ? (eightShorts ? 1 : 4) + b * lfConst : 5 * lfConst - 1 + b + ((b + 5) >> 4)); const uint8_t sfbWidth = grpOff[b + 1] - grpOff[b]; const uint64_t rateFac = mSfmFac * s * __min (32, lfAtten * grpData.numWindowGroups); // rate control part 1 const uint64_t sScaled = ((1u << 24) + __max (grpRmsMin, grpStepSizes[b]) * scaleBr * rateFac) >> 25; @@ -1291,7 +1292,7 @@ unsigned ExhaleEncoder::quantizationCoding () // apply MDCT quantization and en #if !RESTRICT_TO_AAC s = 22050 + 7350 * m_bitRateMode; // compute channel-wise noise_level and noise_offset coreConfig.specFillData[ch] = (!m_noiseFilling[el] ? 0 : m_specGapFiller.getSpecGapFillParams (m_sfbQuantizer, m_mdctQuantMag[ci], m_numSwbShort, - grpData, nSamplesInFrame, samplingRate >= s, + grpData, nSamplesInFrame, samplingRate, s, shortWinCurr ? 0 : meanSpecFlat[ci])); // NOTE: gap-filling SFB bit count might be inaccurate now since scale factors changed if (coreConfig.specFillData[ch] == 1) errorValue |= 1; diff --git a/src/lib/specGapFilling.cpp b/src/lib/specGapFilling.cpp index 51a0b26..34f63f5 100644 --- a/src/lib/specGapFilling.cpp +++ b/src/lib/specGapFilling.cpp @@ -34,13 +34,15 @@ static inline unsigned huffBitCountEstimate (const int scaleFactorDelta) // public functions uint8_t SpecGapFiller::getSpecGapFillParams (const SfbQuantizer& sfbQuantizer, const uint8_t* const quantMagn, const uint8_t numSwbShort, SfbGroupData& grpData /*modified*/, - const unsigned nSamplesInFrame, const bool saveRate, const uint8_t specFlat) + const unsigned nSamplesInFrame, const unsigned samplingRate, + const unsigned sampRateBitSave, const uint8_t specFlat) { const unsigned* const coeffMagn = sfbQuantizer.getCoeffMagnPtr (); const double* const sfNormFacs = sfbQuantizer.getSfNormTabPtr (); const uint16_t sfbsPerGrp = grpData.sfbsPerGroup; const uint16_t windowNfso = noiseFillingStartOffset[grpData.numWindowGroups == 1 ? 0 : 1][nSamplesInFrame >> 10]; - uint8_t scaleFactorLimit = 0; + const bool saveRate = (samplingRate >= sampRateBitSave); + uint8_t scaleFacLim = 0; // limit range of scale factors uint16_t u = 0; short diff = 0, s = 0; double magnSum = 0.0; @@ -78,14 +80,14 @@ uint8_t SpecGapFiller::getSpecGapFillParams (const SfbQuantizer& sfbQuantizer, c const uint16_t sfbWidth = grpOff[b + 1] - sfbStart; const unsigned* const sfbMagn = &coeffMagn[sfbStart]; const uint8_t* sfbQuant = &quantMagn[sfbStart]; - const uint8_t sFac = grpScFacs[b]; + const uint8_t scaleFacB = grpScFacs[b]; if (sfbStart < grpNfso) // SFBs below noiseFillingStartOffset { if ((grpRms[b] >> 16) > 0) // the SFB is non-zero quantized { if (m_1stNonZeroSfb[gr] < 0) m_1stNonZeroSfb[gr] = b; - if (scaleFactorLimit < sFac) scaleFactorLimit = sFac; + if (scaleFacLim < scaleFacB) scaleFacLim = scaleFacB; } } else // sfbStart >= grpNfso, so above noiseFillingStartOffset @@ -95,9 +97,9 @@ uint8_t SpecGapFiller::getSpecGapFillParams (const SfbQuantizer& sfbQuantizer, c if ((grpRms[b] >> 16) > 0) // the SFB is non-zero quantized { - unsigned sfbMagnSum = 0; // NOTE: may overflow, but unlikely, and 32 bit is faster + uint64_t sfbMagnSum = 0; - if (scaleFactorLimit < sFac) scaleFactorLimit = sFac; + if (scaleFacLim < scaleFacB) scaleFacLim = scaleFacB; #if SGF_OPT_SHORT_WIN_CALC if (grpLength > 1) // eight-short windows: SFB ungrouping { @@ -140,7 +142,7 @@ uint8_t SpecGapFiller::getSpecGapFillParams (const SfbQuantizer& sfbQuantizer, c u++; } } - magnSum += sfbMagnSum * sfNormFacs[sFac]; + magnSum += sfbMagnSum * sfNormFacs[scaleFacB]; } } } // for b @@ -183,7 +185,7 @@ uint8_t SpecGapFiller::getSpecGapFillParams (const SfbQuantizer& sfbQuantizer, c // --- calculate gap-fill scale factors for zero quantized SFBs, then determine noise_offset u <<= 5; // left-shift for bit-stream - if (scaleFactorLimit < SGF_LIMIT) scaleFactorLimit = SGF_LIMIT; + if (scaleFacLim < SGF_LIMIT) scaleFacLim = SGF_LIMIT; for (uint16_t gr = 0; gr < grpData.numWindowGroups; gr++) { @@ -203,7 +205,7 @@ uint8_t SpecGapFiller::getSpecGapFillParams (const SfbQuantizer& sfbQuantizer, c const int16_t sfbWidthM1 = grpOff[b + 1] - sfbStart - 1; const unsigned* sfbMagn = &coeffMagn[sfbStart]; unsigned sfbMagnMax = 0; - unsigned sfbMagnSum = 0; // NOTE: may overflow, but unlikely, and 32 bit is faster + uint64_t sfbMagnSum = 0; for (int i = sfbWidthM1; i >= 0; i--) { @@ -212,7 +214,11 @@ uint8_t SpecGapFiller::getSpecGapFillParams (const SfbQuantizer& sfbQuantizer, c } grpScFacs[b] = sfbQuantizer.getScaleFacOffset (((sfbMagnSum - sfbMagnMax) * magnSum) / (double) sfbWidthM1); - if (grpScFacs[b] > scaleFactorLimit) grpScFacs[b] = scaleFactorLimit; + if ((samplingRate <= 32000) && (b < m_1stGapFillSfb + 4)) // lower mid-freq. noise + { + grpScFacs[b] = __max (1, grpScFacs[b] - int ((m_1stGapFillSfb + 4 - b) << 1)); + } + if (grpScFacs[b] > scaleFacLim) grpScFacs[b] = scaleFacLim; } #if SGF_SF_PEAK_SMOOTHING // save delta-code bits by smoothing scale factor peaks in zero quantized SFB ranges @@ -286,7 +292,7 @@ uint8_t SpecGapFiller::getSpecGapFillParams (const SfbQuantizer& sfbQuantizer, c else if (diff >= 16) diff = 15; } - s = __max (-diff, (short) scaleFactorLimit - SGF_LIMIT); // limit + s = __max (-diff, (short) scaleFacLim - SGF_LIMIT); // limit diff for (uint16_t gr = 0; gr < grpData.numWindowGroups; gr++) { @@ -299,7 +305,7 @@ uint8_t SpecGapFiller::getSpecGapFillParams (const SfbQuantizer& sfbQuantizer, c { grpScFacs[b] = (uint8_t) __max (s, grpScFacs[b] - diff); - if (grpScFacs[b] > scaleFactorLimit) grpScFacs[b] = scaleFactorLimit; + if (grpScFacs[b] > scaleFacLim) grpScFacs[b] = scaleFacLim; } } // for b diff --git a/src/lib/specGapFilling.h b/src/lib/specGapFilling.h index 1359ae9..f51686b 100644 --- a/src/lib/specGapFilling.h +++ b/src/lib/specGapFilling.h @@ -38,7 +38,8 @@ public: uint16_t getFirstGapFillSfb () const { return m_1stGapFillSfb; } uint8_t getSpecGapFillParams (const SfbQuantizer& sfbQuantizer, const uint8_t* const quantMagn, const uint8_t numSwbShort, SfbGroupData& grpData /*modified*/, - const unsigned nSamplesInFrame, const bool saveRate, const uint8_t specFlat); + const unsigned nSamplesInFrame, const unsigned samplingRate, + const unsigned sampRateBitSave, const uint8_t specFlat); }; // SpecGapFiller #endif // _SPEC_GAP_FILLING_H_