fix previous commits

This commit is contained in:
Christian R. Helmrich 2020-06-14 23:00:00 +02:00
parent 7d9e0db956
commit 28ba11cf57
4 changed files with 25 additions and 17 deletions

View File

@ -30,7 +30,7 @@
#include <share.h>
#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

View File

@ -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;

View File

@ -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

View File

@ -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_