more rate reduction

This commit is contained in:
Christian R. Helmrich 2020-06-11 00:00:07 +02:00
parent 119fa691eb
commit 1e41f67026
2 changed files with 29 additions and 3 deletions

View File

@ -759,7 +759,8 @@ unsigned ExhaleEncoder::psychBitAllocation () // perceptual bit-allocation via s
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 scaleBr = (m_bitRateMode == 0 ? 4 + (samplingRate >> 10) : scaleSr - eightTimesSqrt256Minus[256 - m_bitRateMode] - __min (3, (m_bitRateMode - 1) >> 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;
uint8_t meanSpecFlat[USAC_MAX_NUM_CHANNELS];
//uint8_t meanTempFlat[USAC_MAX_NUM_CHANNELS];

View File

@ -21,6 +21,16 @@ SpecGapFiller::SpecGapFiller ()
memset (m_1stNonZeroSfb, 0, sizeof (m_1stNonZeroSfb));
}
#if SGF_SF_PEAK_SMOOTHING
static const unsigned smallDeltaHuffBitCount[15] = {8, 7, 6, 6, 5, 4, 3, 1, 4, 4, 5, 6, 6, 7, 7};
static inline unsigned huffBitCountEstimate (const int scaleFactorDelta)
{
if (abs (scaleFactorDelta) < 8) return smallDeltaHuffBitCount[scaleFactorDelta + 7];
return (abs (scaleFactorDelta) >> 1) + 4;
}
#endif
// public functions
uint8_t SpecGapFiller::getSpecGapFillParams (const SfbQuantizer& sfbQuantizer, const uint8_t* const quantMagn,
const uint8_t numSwbShort, SfbGroupData& grpData /*modified*/,
@ -239,16 +249,31 @@ uint8_t SpecGapFiller::getSpecGapFillParams (const SfbQuantizer& sfbQuantizer, c
for (x = start + 1; x < sfbsPerGrp; x++)
{
const int32_t xZ = size * (x - start) - xSum; // zero-mean
const int32_t xZ = size * (x - start) - xSum; // zero-mean
a += xZ * xZ;
b += xZ * (size * grpScFacs[x] - ySum);
}
if (a > 0) // complete line and adjust gap-fill scale factors
{
unsigned countOld = 0, countNew = 0;
b = CLIP_PM (((b << 8) + (a >> 1)) / a, SHRT_MAX);
a = ((ySum << 8) - b * xSum + (size >> 1)) / size;
for (x = start + 1; x < sfbsPerGrp; x++) grpScFacs[x] = CLIP_UCHAR ((a + b * (x - start) - SCHAR_MIN) >> 8);
ySum = grpScFacs[start];
for (x = start + 1; x < sfbsPerGrp; x++)
{
const int32_t y = CLIP_UCHAR ((a + b * (x - start) - SCHAR_MIN) >> 8);
countOld += huffBitCountEstimate ((int) grpScFacs[x] - grpScFacs[x - 1]);
countNew += huffBitCountEstimate (y - ySum);
ySum = y;
}
if (countNew < countOld)
{
for (x = start + 1; x < sfbsPerGrp; x++) grpScFacs[x] = CLIP_UCHAR ((a + b * (x - start) - SCHAR_MIN) >> 8);
}
}
}
#endif