mirror of
https://gitlab.com/ecodis/exhale.git
synced 2025-02-02 08:36:54 +01:00
fix previous commits
This commit is contained in:
parent
7d9e0db956
commit
28ba11cf57
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
||||
|
@ -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_
|
||||
|
Loading…
x
Reference in New Issue
Block a user