diff --git a/src/lib/bitStreamWriter.cpp b/src/lib/bitStreamWriter.cpp index f133453..97dea0a 100644 --- a/src/lib/bitStreamWriter.cpp +++ b/src/lib/bitStreamWriter.cpp @@ -116,62 +116,61 @@ unsigned BitStreamWriter::writeChannelWiseSbrData (const int32_t* const sbrDataC const bool indepFlag /*= false*/) { const unsigned nb = (sbrDataCh0 != nullptr ? 2 * ((sbrDataCh0[0] >> 23) & 1) + 2 : 0); // noise bits/ch = 2 or 4 -#if ENABLE_INTERTES - const bool issTes = (nb > 0 ? ((sbrDataCh0[0] >> 30) & 1) : false); - const int8_t res = (nb > 0 ? (sbrDataCh0[0] >> 29) & 1 : 0); // bs_amp_res -#else - const int16_t res = (nb > 0 ? sbrDataCh0[0] >> 29 : 0); // short bs_amp_res -#endif + const unsigned ob = (indepFlag ? 1 : 0); // indepFlag dependent bit offset const bool stereo = (sbrDataCh1 != nullptr); - const bool couple = (stereo ? ((sbrDataCh1[0] >> 23) & 1) : false); + const int32_t ch0 = (nb > 0 ? sbrDataCh0[0] : 0); + const int32_t ch1 = (stereo ? sbrDataCh1[0] : 0); +#if ENABLE_INTERTES + const bool issTes = (((ch0 >> 30) & 1) != 0); + const int8_t res = (ch0 >> 29) & 1; // bs_amp_res +#else + const int16_t res = ch0 >> 29; // short bs_amp_res +#endif + const bool couple = (((ch1 >> 23) & 1) != 0); unsigned bitCount = (stereo ? (couple ? 2 : 7 + nb) : 0) + 6 + nb; unsigned i, envCh0, envCh1, resCh0, resCh1; // bs_num_env[], bs_freq_res[] if (nb == 0) return 0; - envCh0 = 1 << ((sbrDataCh0[0] >> 21) & 3); - resCh0 = (sbrDataCh0[0] >> 20) & 1; - envCh1 = 1 << (((stereo && !couple ? sbrDataCh1[0] : sbrDataCh0[0]) >> 21) & 3); - resCh1 = ((stereo && !couple ? sbrDataCh1[0] : sbrDataCh0[0]) >> 20) & 1; + envCh0 = 1 << ((ch0 >> 21) & 3); + resCh0 = (ch0 >> 20) & 1; + envCh1 = 1 << (((stereo && !couple ? ch1 : ch0) >> 21) & 3); + resCh1 = ((stereo && !couple ? ch1 : ch0) >> 20) & 1; if (stereo) m_auBitStream.write (couple ? 1 : 0, 1); // _coupling // sbr_grid(), assumes bs_frame_class[ch] == 0, i.e. class FIXFIX - m_auBitStream.write ((sbrDataCh0[0] >> 20) & 7, 5); // class data - if (stereo && !couple) m_auBitStream.write ((sbrDataCh1[0] >> 20) & 7, 5); + m_auBitStream.write ((ch0 >> 20) & 7, 5); + if (stereo && !couple) m_auBitStream.write ((ch1 >> 20) & 7, 5); // sbr_dtdf(), assumes bs_pvc == 0, i.e. no PVC like rest of code - i = envCh0 - (indepFlag ? 1 : 0); - if (i > 0) m_auBitStream.write ((sbrDataCh0[0] >> 12) & 255, i); // _df_env - bitCount += i; - i = __min (2, envCh0) - (indepFlag ? 1 : 0); - if (i > 0) m_auBitStream.write ((sbrDataCh0[0] >> 4) & 255, i); // df_noise - bitCount += i; + for (i = ob; i < envCh0; i++) m_auBitStream.write ((ch0 >> (12 + i)) & 1, 1); + bitCount += i - ob; + for (i = ob; i < __min (2, envCh0); i++) m_auBitStream.write ((ch0 >> (4 + i)) & 1, 1); + bitCount += i - ob; if (stereo) { - i = envCh1 - (indepFlag ? 1 : 0); - if (i > 0) m_auBitStream.write ((sbrDataCh1[0] >> 12) & 255, i); - bitCount += i; - i = __min (2, envCh1) - (indepFlag ? 1 : 0); - if (i > 0) m_auBitStream.write ((sbrDataCh1[0] >> 4) & 255, i); - bitCount += i; + for (i = ob; i < envCh1; i++) m_auBitStream.write ((ch1 >> (12 + i)) & 1, 1); + bitCount += i - ob; + for (i = ob; i < __min (2, envCh1); i++) m_auBitStream.write ((ch1 >> (4 + i)) & 1, 1); + bitCount += i - ob; } // sbr_invf(), assumes dflt_noise_bands < 3, i.e. 1-2 noise bands - i = 6 * nb - 9; // bitmask = 3 or 15 - m_auBitStream.write (sbrDataCh0[0] & i, nb); // bs_invf_mode[0][] - if (stereo && !couple) m_auBitStream.write (sbrDataCh1[0] & i, nb); + i = 6 * nb - 9; + m_auBitStream.write (ch0 & i, nb); // 3 or 15-bit bs_invf_mode[0] + if (stereo && !couple) m_auBitStream.write (ch1 & i, nb); // sbr_envelope() for mono/left channel, assumes bs_df_env[] == 0 for (i = 1; i <= envCh0; i++) // dt loop { - const uint8_t bits = (res > 0 && envCh0 > 1 ? 6 : 7); // start + const uint8_t bits = ((ch0 & (1 << (11 + i))) != 0 ? 2 : (res > 0 && envCh0 > 1 ? 6 : 7)); const uint8_t bitd = (2 + 3 * resCh0) * 2; // differential, <25 TODO: VLC words m_auBitStream.write (sbrDataCh0[i] & 127, bits); // bs_data_env bitCount += bits; - m_auBitStream.write (sbrDataCh0[i] >> 7, bitd); + m_auBitStream.write ((sbrDataCh0[i] >> 7) & ((1 << bitd) - 1), bitd); bitCount += bitd; #if ENABLE_INTERTES if (issTes) @@ -191,12 +190,12 @@ unsigned BitStreamWriter::writeChannelWiseSbrData (const int32_t* const sbrDataC { for (i = 1; i <= envCh1; i++) // decoup. sbr_envelope() dt loop { - const uint8_t bits = (res > 0 && envCh1 > 1 ? 6 : 7); + const uint8_t bits = ((ch1 & (1 << (11 + i))) != 0 ? 2 : (res > 0 && envCh1 > 1 ? 6 : 7)); const uint8_t bitd = (2 + 3 * resCh1) * 2; // TODO: VLC words m_auBitStream.write (sbrDataCh1[i] & 127, bits); bitCount += bits; - m_auBitStream.write (sbrDataCh1[i] >> 7, bitd); + m_auBitStream.write ((sbrDataCh1[i] >> 7) & ((1 << bitd) - 1), bitd); bitCount += bitd; #if ENABLE_INTERTES if (issTes) @@ -214,10 +213,12 @@ unsigned BitStreamWriter::writeChannelWiseSbrData (const int32_t* const sbrDataC } // sbr_noise() for mono/left channel, assumes bs_df_noise[i] == 0 - for (i = __min (2, envCh0); i > 0; i--) // dt loop + for (i = 1; i <= __min (2, envCh0); i++) // dt loop { - m_auBitStream.write ((sbrDataCh0[9] >> (13 * i)) & 31, 5); // _data_noise - bitCount += 5; + const uint8_t bits = ((ch0 & (1 << (3 + i))) != 0 ? 1 : 5); + + m_auBitStream.write ((sbrDataCh0[9] >> (13 * i)) & 31, bits); // _noise[] + bitCount += bits; if (nb == 4) { m_auBitStream.write ((sbrDataCh0[9] >> (13 * i - 5)) & 31, 1); // TODO: VLC word @@ -231,12 +232,12 @@ unsigned BitStreamWriter::writeChannelWiseSbrData (const int32_t* const sbrDataC { for (i = 1; i <= envCh1; i++) // coup. sbr_envelope() dt loop { - const uint8_t bits = (res > 0 && envCh1 > 1 ? 5 : 6); - const uint8_t bitd = (2 + 3 * resCh1) * 2; // TODO: VLC words + const uint8_t bits = ((ch1 & (1 << (11 + i))) != 0 ? 1 : (res > 0 && envCh1 > 1 ? 5 : 6)); + const uint8_t bitd = (2 + 3 * resCh1) * 1; // TODO: VLC words m_auBitStream.write (sbrDataCh1[i] & 63, bits); bitCount += bits; - m_auBitStream.write (sbrDataCh1[i] >> 7, bitd); + m_auBitStream.write ((sbrDataCh1[i] >> 7) & ((1 << bitd) - 1), bitd); bitCount += bitd; #if ENABLE_INTERTES if (issTes) @@ -253,10 +254,12 @@ unsigned BitStreamWriter::writeChannelWiseSbrData (const int32_t* const sbrDataC } } - for (i = __min (2, envCh1); i > 0; i--) // sbr_noise() dt loop + for (i = 1; i <= __min (2, envCh1); i++) // sbr_noise() dt loop { - m_auBitStream.write ((sbrDataCh1[9] >> (13 * i)) & 31, 5); - bitCount += 5; + const uint8_t bits = ((ch1 & (1 << (3 + i))) != 0 ? 1 : 5); + + m_auBitStream.write ((sbrDataCh1[9] >> (13 * i)) & 31, bits); + bitCount += bits; if (nb == 4) { m_auBitStream.write ((sbrDataCh1[9] >> (13 * i - 5)) & 31, 1); // TODO: VLC word diff --git a/src/lib/exhaleEnc.cpp b/src/lib/exhaleEnc.cpp index 2a388df..999e7f9 100644 --- a/src/lib/exhaleEnc.cpp +++ b/src/lib/exhaleEnc.cpp @@ -464,6 +464,8 @@ static const uint8_t tnsScaleFactorBandLimit[2 /*long/short*/][USAC_NUM_FREQ_TAB #endif }; +static const uint8_t sbrRateOffset[10] = {8, 6, 6, 8, 7, 8, 8, 8, 8, 8}; // used for scaleSBR + // scale_factor_grouping map // group lengths based on transient location: 1133, 1115, 2114, 3113, 4112, 5111, 3311, 1331 static const uint8_t scaleFactorGrouping[8] = {0x1B, 0x0F, 0x47, 0x63, 0x71, 0x78, 0x6C, 0x36}; @@ -767,8 +769,8 @@ 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 bool useMaxBandwidth = (samplingRate < 37566 || m_shiftValSBR > 0); - const uint32_t maxSfbLong = (useMaxBandwidth ? m_numSwbLong : brModeAndFsToMaxSfbLong (m_bitRateMode, samplingRate)); - const uint32_t scaleSBR = (m_shiftValSBR > 0 || m_nonMpegExt ? (m_bitRateMode == 0 ? 8 : 6 + ((m_bitRateMode + 2 - samplingRate/24000) >> 2)) : 0); // -25% rate + const uint8_t maxSfbLong = (useMaxBandwidth ? m_numSwbLong : brModeAndFsToMaxSfbLong (m_bitRateMode, samplingRate)); + const uint16_t scaleSBR = (m_shiftValSBR > 0 || m_nonMpegExt ? sbrRateOffset[m_bitRateMode] : 0); // -25% rate const uint64_t scaleSr = (samplingRate < 27713 ? (samplingRate < 23004 ? 32 : 34) - __min (3 << m_shiftValSBR, m_bitRateMode) : (samplingRate < 37566 && m_bitRateMode != 3u ? 36 : 37)) - (nChannels >> 1); const uint64_t scaleBr = (m_bitRateMode == 0 ? __min (32, 3 + (samplingRate >> 10) + (samplingRate >> 13) - (nChannels >> 1)) @@ -972,7 +974,7 @@ unsigned ExhaleEncoder::psychBitAllocation () // perceptual bit-allocation via s : brModeAndFsToMaxSfbShort (m_bitRateMode, samplingRate)) : maxSfbLong); const bool keepMaxSfbCurr = ((samplingRate < 37566) || (samplingRate >= 46009 && samplingRate < 55426 && eightShorts)); const uint8_t numSwbFrame = __min ((numSwbCh * ((maxSfbCh == maxSfbCurr) || (m_bitRateMode <= 2) || (m_shiftValSBR > 0) ? 4u : 3u)) >> 2, - (eightShorts ? maxSfbCh : maxSfbLong) + (m_bitRateMode < 2 || m_bitRateMode > 3 || keepMaxSfbCurr ? 0 : 1)); + (eightShorts ? maxSfbCh : maxSfbLong) + (m_bitRateMode < 2 || m_bitRateMode > 3 || keepMaxSfbCurr ? 0u : 1u)); #ifndef NO_DTX_MODE if ((m_bitRateMode < 1) && (m_numElements == 1) && (samplingRate < 27713) && eightShorts) { @@ -1312,9 +1314,7 @@ unsigned ExhaleEncoder::quantizationCoding () // apply MDCT quantization and en memset (m_coreSignals[ci], 0, 10 * sizeof (int32_t)); #if ENABLE_INTERTES - m_coreSignals[ci][0] = (shortWinPrev ? 0x40000000 : 0x40100000); // freq_res, interTes -#else - m_coreSignals[ci][0] = (shortWinPrev ? 0 : 1) << 20; // bs_freq_res = low resp. high + m_coreSignals[ci][0] = 0x40000000; // bs_interTes = 1 for all frames #endif m_coreSignals[ci][0] |= 4 - int32_t (sqrt (0.75 * msfVal)); // filter mode, 0 = none @@ -1326,11 +1326,12 @@ unsigned ExhaleEncoder::quantizationCoding () // apply MDCT quantization and en } m_coreSignals[ci][0] |= getSbrEnvelopeAndNoise (&m_coreSignals[ci][nSamplesTempAna - 64 + nSamplesInFrame], msfVal, __max (m_meanTempPrev[ci], meanTempFlat[ci]) >> 3, m_bitRateMode == 0, - msfSte, tmpValSynch, nSamplesInFrame, &m_coreSignals[ci][1]) << 21; + m_indepFlag, msfSte, tmpValSynch, nSamplesInFrame, &m_coreSignals[ci][1]); if (ch + 1 == nrChannels) // update the flatness histories { m_meanSpecPrev[ci] = meanSpecFlat[ci]; m_meanSpecPrev[s] = meanSpecFlat[s]; m_meanTempPrev[ci] = meanTempFlat[ci]; m_meanTempPrev[s] = meanTempFlat[s]; + // TODO: coupling (m_coreSignals[ci][0] |= 1 << 23;) } } ci++; diff --git a/src/lib/exhaleLibPch.cpp b/src/lib/exhaleLibPch.cpp index 307ff5b..4a8ca09 100644 --- a/src/lib/exhaleLibPch.cpp +++ b/src/lib/exhaleLibPch.cpp @@ -60,8 +60,8 @@ static int8_t quantizeSbrEnvelopeLevel (const uint64_t energy, const uint32_t di } // public SBR related functions -int32_t getSbrEnvelopeAndNoise (int32_t* const sbrLevels, const uint8_t specFlat5b, const uint8_t tempFlat5b, const bool lowBitRateMode, - const uint8_t specFlatSte, const int32_t tmpValSte, const uint32_t frameSize, int32_t* sbrArray) +int32_t getSbrEnvelopeAndNoise (int32_t* const sbrLevels, const uint8_t specFlat5b, const uint8_t tempFlat5b, const bool lr, const bool ind, + const uint8_t specFlatSte, const int32_t tmpValSte, const uint32_t frameSize, int32_t* sbrData) { const uint64_t enValue[8] = {(uint64_t) sbrLevels[22] * (uint64_t) sbrLevels[22], (uint64_t) sbrLevels[23] * (uint64_t) sbrLevels[23], @@ -104,50 +104,76 @@ int32_t getSbrEnvelopeAndNoise (int32_t* const sbrLevels, const uint8_t specFlat tmpBest = t; } } - if ((errBest >> 3) > envTmp0[0]) tmpBest = (lowBitRateMode ? 2 : 3); + if ((errBest >> 3) > envTmp0[0]) tmpBest = (lr ? 2 : 3); if (tmpBest < tmpValSte) tmpBest = tmpValSte; /*Q*/if (tmpBest == 0) // quantized envelopes for optimal tmp value { - sbrArray[0] = quantizeSbrEnvelopeLevel (envTmp0[0], frameSize, specFlat5b); + sbrData[0] = quantizeSbrEnvelopeLevel (envTmp0[0], frameSize, specFlat5b); } else if (tmpBest == 1) { - sbrArray[0] = quantizeSbrEnvelopeLevel (envTmp1[0], frameSize, specFlat5b); - sbrArray[1] = quantizeSbrEnvelopeLevel (envTmp1[1], frameSize, specFlat5b); + sbrData[0] = quantizeSbrEnvelopeLevel (envTmp1[0], frameSize, specFlat5b); + sbrData[1] = quantizeSbrEnvelopeLevel (envTmp1[1], frameSize, specFlat5b); } else if (tmpBest == 2) { - sbrArray[0] = quantizeSbrEnvelopeLevel (envTmp2[0], frameSize, specFlat5b); - sbrArray[1] = quantizeSbrEnvelopeLevel (envTmp2[1], frameSize, specFlat5b); - sbrArray[2] = quantizeSbrEnvelopeLevel (envTmp2[2], frameSize, specFlat5b); - sbrArray[3] = quantizeSbrEnvelopeLevel (envTmp2[3], frameSize, specFlat5b); + sbrData[0] = quantizeSbrEnvelopeLevel (envTmp2[0], frameSize, specFlat5b); + sbrData[1] = quantizeSbrEnvelopeLevel (envTmp2[1], frameSize, specFlat5b); + sbrData[2] = quantizeSbrEnvelopeLevel (envTmp2[2], frameSize, specFlat5b); + sbrData[3] = quantizeSbrEnvelopeLevel (envTmp2[3], frameSize, specFlat5b); } else // (tmpBest == 3) { - sbrArray[0] = quantizeSbrEnvelopeLevel (envTmp3[0], frameSize, specFlat5b); - sbrArray[1] = quantizeSbrEnvelopeLevel (envTmp3[1], frameSize, specFlat5b); - sbrArray[2] = quantizeSbrEnvelopeLevel (envTmp3[2], frameSize, specFlat5b); - sbrArray[3] = quantizeSbrEnvelopeLevel (envTmp3[3], frameSize, specFlat5b); - sbrArray[4] = quantizeSbrEnvelopeLevel (envTmp3[4], frameSize, specFlat5b); - sbrArray[5] = quantizeSbrEnvelopeLevel (envTmp3[5], frameSize, specFlat5b); - sbrArray[6] = quantizeSbrEnvelopeLevel (envTmp3[6], frameSize, specFlat5b); - sbrArray[7] = quantizeSbrEnvelopeLevel (envTmp3[7], frameSize, specFlat5b); + sbrData[0] = quantizeSbrEnvelopeLevel (envTmp3[0], frameSize, specFlat5b); + sbrData[1] = quantizeSbrEnvelopeLevel (envTmp3[1], frameSize, specFlat5b); + sbrData[2] = quantizeSbrEnvelopeLevel (envTmp3[2], frameSize, specFlat5b); + sbrData[3] = quantizeSbrEnvelopeLevel (envTmp3[3], frameSize, specFlat5b); + sbrData[4] = quantizeSbrEnvelopeLevel (envTmp3[4], frameSize, specFlat5b); + sbrData[5] = quantizeSbrEnvelopeLevel (envTmp3[5], frameSize, specFlat5b); + sbrData[6] = quantizeSbrEnvelopeLevel (envTmp3[6], frameSize, specFlat5b); + sbrData[7] = quantizeSbrEnvelopeLevel (envTmp3[7], frameSize, specFlat5b); } // quantized noise level for up to two temporal units, 30 = no noise t = __min (30, __max (specFlat5b, specFlatSte)); - sbrArray[8] = ((int32_t) t << 13) | ((int32_t) t << 26); + sbrData[8] = ((int32_t) t << 13) | ((int32_t) t << 26); #if ENABLE_INTERTES - if ((t < 12) && (tempFlat5b > (lowBitRateMode ? 15 : 26)) && (tmpBest < 3)) + if ((t < 12) && (tempFlat5b > (lr ? 15 : 26)) && (tmpBest < 3)) { - sbrArray[8] |= (1 << (1 << tmpBest)) - 1; // TODO: inter-TES mode = inv. filter mode + sbrData[8] |= (1 << (1 << tmpBest)) - 1; // TODO: inter-TES mode = inv. filter mode? } #endif memcpy (&sbrLevels[20], &sbrLevels[10] /*last*/, 10 * sizeof (int32_t)); // update the memcpy (&sbrLevels[10], sbrLevels /*& current*/, 10 * sizeof (int32_t)); // delay line + tmpBest <<= 21; // config bits + for (t = 0; t < (1 << (tmpBest >> 21)); t++) + { + const int32_t sbrEnvel = sbrData[t] & 127; + const int32_t d = sbrLevels[30] - sbrEnvel; // two length-2 words! + + if ((t > 0 || !ind) && (d == 0 || d == 1)) + { + tmpBest |= 1 << (12 + t); // delta-time coding flag for envelope + sbrData[t] -= sbrEnvel; + sbrData[t] |= d | (d << 7) | (d << 9) | (d << 11) | (d << 13) | (d << 15); + } + sbrLevels[30] = sbrEnvel; + } + for (t = 0; t < ((tmpBest >> 21) == 0 ? 1 : 2); t++) + { + const int32_t sbrNoise = (sbrData[8] >> (13 * (t + 1))) & 31; + + if ((t > 0 || !ind) && (sbrNoise == sbrLevels[31])) + { + tmpBest |= 1 << (4 + t); // and delta-time coding flag for noise + sbrData[8] -= sbrNoise << (13 * (t + 1)); + } + sbrLevels[31] = sbrNoise; + } + return tmpBest; } diff --git a/src/lib/exhaleLibPch.h b/src/lib/exhaleLibPch.h index ce10451..2e34573 100644 --- a/src/lib/exhaleLibPch.h +++ b/src/lib/exhaleLibPch.h @@ -197,8 +197,8 @@ static const ELEM_TYPE elementTypeConfig[USAC_MAX_NUM_ELCONFIGS][USAC_MAX_NUM_EL const uint8_t oneTwentyEightOver[14] = {0, 128, 64, 43, 32, 26, 22, 19, 16, 15, 13, 12, 11, 10}; // public SBR related functions -int32_t getSbrEnvelopeAndNoise (int32_t* const sbrLevels, const uint8_t specFlat5b, const uint8_t tempFlat5b, const bool lowBitRateMode, - const uint8_t specFlatSte, const int32_t tmpValSte, const uint32_t frameSize, int32_t* sbrArray); +int32_t getSbrEnvelopeAndNoise (int32_t* const sbrLevels, const uint8_t specFlat5b, const uint8_t tempFlat5b, const bool lr, const bool ind, + const uint8_t specFlatSte, const int32_t tmpValSte, const uint32_t frameSize, int32_t* sbrData); // public sampling rate functions int8_t toSamplingFrequencyIndex (const unsigned samplingRate); unsigned toSamplingRate (const int8_t samplingFrequencyIndex); diff --git a/src/lib/tempAnalysis.cpp b/src/lib/tempAnalysis.cpp index baac0e6..607dd29 100644 --- a/src/lib/tempAnalysis.cpp +++ b/src/lib/tempAnalysis.cpp @@ -31,10 +31,10 @@ static const int16_t lpfc34[128] = { // 25% low-pass filter coefficients }; // static helper functions -static unsigned updateAbsStats (const int32_t* const chSig, const int nSamples, unsigned* const maxAbsVal, int16_t* const maxAbsIdx) +static uint64_t updateAbsStats (const int32_t* const chSig, const int nSamples, unsigned* const maxAbsVal, int16_t* const maxAbsIdx) { const int32_t* const chSigM1 = chSig - 1; // for first-order high-pass - unsigned sumAbs = 0; + uint64_t sumAbs = 0; for (int s = nSamples - 1; s >= 0; s--) { @@ -51,12 +51,12 @@ static unsigned updateAbsStats (const int32_t* const chSig, const int nSamples, return sumAbs; } -static unsigned applyPitchPred (const int32_t* const chSig, const int nSamples, const int pitchLag, const int pitchSign = 1) +static uint64_t applyPitchPred (const int32_t* const chSig, const int nSamples, const int pitchLag, const int pitchSign = 1) { const int32_t* const chSigM1 = chSig - 1; // for first-order high-pass const int32_t* const plSig = chSig - pitchLag; // & pitch prediction const int32_t* const plSigM1 = plSig - 1; - unsigned sumAbs = 0; + uint64_t sumAbs = 0; for (int s = nSamples - 1; s >= 0; s--) { @@ -66,8 +66,8 @@ static unsigned applyPitchPred (const int32_t* const chSig, const int nSamples, return sumAbs; } -static inline uint32_t packAvgTempAnalysisStats (const unsigned avgAbsHpL, const unsigned avgAbsHpR, const unsigned avgAbsHpP, - const unsigned avgAbsPpLR, const unsigned maxAbsHpLR) +static inline uint32_t packAvgTempAnalysisStats (const uint64_t avgAbsHpL, const uint64_t avgAbsHpR, const unsigned avgAbsHpP, + const uint64_t avgAbsPpLR, const unsigned maxAbsHpLR) { // spectral flatness, normalized for a value of 256 for noise-like, spectrally flat waveform const unsigned flatSpec = 256 - int ((int64_t (avgAbsPpLR/*L+R sum*/ + TA_EPS) * 256) / (int64_t (avgAbsHpL + avgAbsHpR + TA_EPS))); @@ -145,7 +145,7 @@ unsigned TempAnalyzer::temporalAnalysis (const int32_t* const timeSignals[USAC_M const int32_t* const chSigM1 = chSig - 1; // for first-order high-pass const int32_t* const chSigPH = chSig + halfFrameOffset; // --- get L1 norm and pitch lag of both sides - unsigned sumAbsValL = 0, sumAbsValR = 0; + uint64_t sumAbsValL = 0, sumAbsValR = 0; unsigned maxAbsValL = 0, maxAbsValR = 0; int32_t maxHfrLevL = 0, maxHfrLevR = 0; int16_t maxAbsIdxL = 0, maxAbsIdxR = 0; @@ -193,7 +193,7 @@ unsigned TempAnalyzer::temporalAnalysis (const int32_t* const timeSignals[USAC_M const unsigned numUnits = nSamplesInFrame >> (sbrShift + 7); int32_t* const hfrLevel = &lrCoreTimeSignals[ch][(resamplerOffset + nSamplesInFrame) >> sbrShift]; - for (u = numUnits; u > 0; /*u*/) + for (u = numUnits; u > 0; ) { ue[8] += ue[--u]; hfrLevel[numUnits - u] = int32_t (0.5 + sqrt ((double) ue[u])); @@ -276,8 +276,8 @@ unsigned TempAnalyzer::temporalAnalysis (const int32_t* const timeSignals[USAC_M else // nonzero signal in the current frame { const int maxAbsIdxP = __max ((int) m_maxIdxHpPrev[ch] - nSamplesInFrame, 1 - (int) lookaheadOffset); - unsigned sumAbsHpL = sumAbsValL, sumAbsHpR = sumAbsValR; // after high-pass filter - unsigned sumAbsPpL = sumAbsValL, sumAbsPpR = sumAbsValR; // after pitch prediction + uint64_t sumAbsHpL = sumAbsValL, sumAbsHpR = sumAbsValR; // after high-pass filter + uint64_t sumAbsPpL = sumAbsValL, sumAbsPpR = sumAbsValR; // after pitch prediction int pLag, pLagBestR = 0, pSgn; // test left-side pitch lag on this frame @@ -344,7 +344,7 @@ unsigned TempAnalyzer::temporalAnalysis (const int32_t* const timeSignals[USAC_M m_tempAnaStats[ch] = packAvgTempAnalysisStats (sumAbsHpL, sumAbsHpR, m_avgAbsHpPrev[ch], sumAbsPpL + sumAbsPpR, maxAbsValL + maxAbsValR); u = maxAbsValR; - if ((m_maxHfLevPrev[ch] < (maxHfrLevL >> 4)) || (maxHfrLevL < (maxHfrLevR >> 4))) // transient + if ((m_maxHfLevPrev[ch] < (maxHfrLevL >> 4)) || (maxHfrLevL < (maxHfrLevR >> 4))) // HF { maxAbsValL = maxHfrLevL; maxAbsValR = maxHfrLevR; @@ -353,7 +353,7 @@ unsigned TempAnalyzer::temporalAnalysis (const int32_t* const timeSignals[USAC_M m_transientLoc[ch] = packTransLocWithPitchLag (maxAbsValL, maxAbsValR, m_maxAbsHpPrev[ch], maxAbsIdxL, maxAbsIdxR, __max (1, pLagBestR)); // update stats history for this channel - m_avgAbsHpPrev[ch] = sumAbsHpR; + m_avgAbsHpPrev[ch] = (unsigned) sumAbsHpR; m_maxAbsHpPrev[ch] = u; m_maxIdxHpPrev[ch] = (unsigned) maxAbsIdxR; m_pitchLagPrev[ch] = (unsigned) pLagBestR;