2018-02-26 20:17:00 +01:00
|
|
|
/* -----------------------------------------------------------------------------
|
2012-07-11 10:15:24 -07:00
|
|
|
Software License for The Fraunhofer FDK AAC Codec Library for Android
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
|
|
|
|
Forschung e.V. All rights reserved.
|
2012-07-11 10:15:24 -07:00
|
|
|
|
|
|
|
1. INTRODUCTION
|
2018-02-26 20:17:00 +01:00
|
|
|
The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
|
|
|
|
that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
|
|
|
|
scheme for digital audio. This FDK AAC Codec software is intended to be used on
|
|
|
|
a wide variety of Android devices.
|
|
|
|
|
|
|
|
AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
|
|
|
|
general perceptual audio codecs. AAC-ELD is considered the best-performing
|
|
|
|
full-bandwidth communications codec by independent studies and is widely
|
|
|
|
deployed. AAC has been standardized by ISO and IEC as part of the MPEG
|
|
|
|
specifications.
|
|
|
|
|
|
|
|
Patent licenses for necessary patent claims for the FDK AAC Codec (including
|
|
|
|
those of Fraunhofer) may be obtained through Via Licensing
|
|
|
|
(www.vialicensing.com) or through the respective patent owners individually for
|
|
|
|
the purpose of encoding or decoding bit streams in products that are compliant
|
|
|
|
with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
|
|
|
|
Android devices already license these patent claims through Via Licensing or
|
|
|
|
directly from the patent owners, and therefore FDK AAC Codec software may
|
|
|
|
already be covered under those patent licenses when it is used for those
|
|
|
|
licensed purposes only.
|
|
|
|
|
|
|
|
Commercially-licensed AAC software libraries, including floating-point versions
|
|
|
|
with enhanced sound quality, are also available from Fraunhofer. Users are
|
|
|
|
encouraged to check the Fraunhofer website for additional applications
|
|
|
|
information and documentation.
|
2012-07-11 10:15:24 -07:00
|
|
|
|
|
|
|
2. COPYRIGHT LICENSE
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
Redistribution and use in source and binary forms, with or without modification,
|
|
|
|
are permitted without payment of copyright license fees provided that you
|
|
|
|
satisfy the following conditions:
|
2012-07-11 10:15:24 -07:00
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
You must retain the complete text of this software license in redistributions of
|
|
|
|
the FDK AAC Codec or your modifications thereto in source code form.
|
2012-07-11 10:15:24 -07:00
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
You must retain the complete text of this software license in the documentation
|
|
|
|
and/or other materials provided with redistributions of the FDK AAC Codec or
|
|
|
|
your modifications thereto in binary form. You must make available free of
|
|
|
|
charge copies of the complete source code of the FDK AAC Codec and your
|
2012-07-11 10:15:24 -07:00
|
|
|
modifications thereto to recipients of copies in binary form.
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
The name of Fraunhofer may not be used to endorse or promote products derived
|
|
|
|
from this library without prior written permission.
|
2012-07-11 10:15:24 -07:00
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
You may not charge copyright license fees for anyone to use, copy or distribute
|
|
|
|
the FDK AAC Codec software or your modifications thereto.
|
2012-07-11 10:15:24 -07:00
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
Your modified versions of the FDK AAC Codec must carry prominent notices stating
|
|
|
|
that you changed the software and the date of any change. For modified versions
|
|
|
|
of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
|
|
|
|
must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
|
|
|
|
AAC Codec Library for Android."
|
2012-07-11 10:15:24 -07:00
|
|
|
|
|
|
|
3. NO PATENT LICENSE
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
|
|
|
|
limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
|
|
|
|
Fraunhofer provides no warranty of patent non-infringement with respect to this
|
|
|
|
software.
|
2012-07-11 10:15:24 -07:00
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
You may use this FDK AAC Codec software or modifications thereto only for
|
|
|
|
purposes that are authorized by appropriate patent licenses.
|
2012-07-11 10:15:24 -07:00
|
|
|
|
|
|
|
4. DISCLAIMER
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
|
|
|
|
holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
|
|
|
|
including but not limited to the implied warranties of merchantability and
|
|
|
|
fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
|
|
|
CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
|
|
|
|
or consequential damages, including but not limited to procurement of substitute
|
|
|
|
goods or services; loss of use, data, or profits, or business interruption,
|
|
|
|
however caused and on any theory of liability, whether in contract, strict
|
|
|
|
liability, or tort (including negligence), arising in any way out of the use of
|
|
|
|
this software, even if advised of the possibility of such damage.
|
2012-07-11 10:15:24 -07:00
|
|
|
|
|
|
|
5. CONTACT INFORMATION
|
|
|
|
|
|
|
|
Fraunhofer Institute for Integrated Circuits IIS
|
|
|
|
Attention: Audio and Multimedia Departments - FDK AAC LL
|
|
|
|
Am Wolfsmantel 33
|
|
|
|
91058 Erlangen, Germany
|
|
|
|
|
|
|
|
www.iis.fraunhofer.de/amm
|
|
|
|
amm-info@iis.fraunhofer.de
|
2018-02-26 20:17:00 +01:00
|
|
|
----------------------------------------------------------------------------- */
|
|
|
|
|
|
|
|
/**************************** AAC encoder library ******************************
|
2012-07-11 10:15:24 -07:00
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
Author(s): M.Werner
|
2012-07-11 10:15:24 -07:00
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
Description: Quantization
|
2012-07-11 10:15:24 -07:00
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
*******************************************************************************/
|
2012-07-11 10:15:24 -07:00
|
|
|
|
|
|
|
#include "quantize.h"
|
|
|
|
|
|
|
|
#include "aacEnc_rom.h"
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
|
|
|
|
|
|
functionname: FDKaacEnc_quantizeLines
|
|
|
|
description: quantizes spectrum lines
|
|
|
|
returns:
|
|
|
|
input: global gain, number of lines to process, spectral data
|
|
|
|
output: quantized spectrum
|
|
|
|
|
|
|
|
*****************************************************************************/
|
2018-02-26 20:17:00 +01:00
|
|
|
static void FDKaacEnc_quantizeLines(INT gain, INT noOfLines,
|
|
|
|
const FIXP_DBL *mdctSpectrum,
|
|
|
|
SHORT *quaSpectrum, INT dZoneQuantEnable) {
|
|
|
|
int line;
|
2016-04-08 10:52:42 -07:00
|
|
|
FIXP_DBL k = FL2FXCONST_DBL(0.0f);
|
2018-02-26 20:17:00 +01:00
|
|
|
FIXP_QTD quantizer = FDKaacEnc_quantTableQ[(-gain) & 3];
|
|
|
|
INT quantizershift = ((-gain) >> 2) + 1;
|
|
|
|
const INT kShift = 16;
|
2012-07-11 10:15:24 -07:00
|
|
|
|
2016-04-08 10:52:42 -07:00
|
|
|
if (dZoneQuantEnable)
|
2018-02-26 20:17:00 +01:00
|
|
|
k = FL2FXCONST_DBL(0.23f) >> kShift;
|
2016-04-08 10:52:42 -07:00
|
|
|
else
|
2018-02-26 20:17:00 +01:00
|
|
|
k = FL2FXCONST_DBL(-0.0946f + 0.5f) >> kShift;
|
2012-07-11 10:15:24 -07:00
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
for (line = 0; line < noOfLines; line++) {
|
|
|
|
FIXP_DBL accu = fMultDiv2(mdctSpectrum[line], quantizer);
|
2012-07-11 10:15:24 -07:00
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
if (accu < FL2FXCONST_DBL(0.0f)) {
|
|
|
|
accu = -accu;
|
2012-07-11 10:15:24 -07:00
|
|
|
/* normalize */
|
2018-02-26 20:17:00 +01:00
|
|
|
INT accuShift = CntLeadingZeros(accu) - 1; /* CountLeadingBits() is not
|
|
|
|
necessary here since test
|
|
|
|
value is always > 0 */
|
2012-07-11 10:15:24 -07:00
|
|
|
accu <<= accuShift;
|
2018-02-26 20:17:00 +01:00
|
|
|
INT tabIndex =
|
|
|
|
(INT)(accu >> (DFRACT_BITS - 2 - MANT_DIGITS)) & (~MANT_SIZE);
|
|
|
|
INT totalShift = quantizershift - accuShift + 1;
|
|
|
|
accu = fMultDiv2(FDKaacEnc_mTab_3_4[tabIndex],
|
|
|
|
FDKaacEnc_quantTableE[totalShift & 3]);
|
|
|
|
totalShift = (16 - 4) - (3 * (totalShift >> 2));
|
|
|
|
FDK_ASSERT(totalShift >= 0); /* MAX_QUANT_VIOLATION */
|
|
|
|
accu >>= fixMin(totalShift, DFRACT_BITS - 1);
|
|
|
|
quaSpectrum[line] =
|
|
|
|
(SHORT)(-((LONG)(k + accu) >> (DFRACT_BITS - 1 - 16)));
|
|
|
|
} else if (accu > FL2FXCONST_DBL(0.0f)) {
|
2012-07-11 10:15:24 -07:00
|
|
|
/* normalize */
|
2018-02-26 20:17:00 +01:00
|
|
|
INT accuShift = CntLeadingZeros(accu) - 1; /* CountLeadingBits() is not
|
|
|
|
necessary here since test
|
|
|
|
value is always > 0 */
|
2012-07-11 10:15:24 -07:00
|
|
|
accu <<= accuShift;
|
2018-02-26 20:17:00 +01:00
|
|
|
INT tabIndex =
|
|
|
|
(INT)(accu >> (DFRACT_BITS - 2 - MANT_DIGITS)) & (~MANT_SIZE);
|
|
|
|
INT totalShift = quantizershift - accuShift + 1;
|
|
|
|
accu = fMultDiv2(FDKaacEnc_mTab_3_4[tabIndex],
|
|
|
|
FDKaacEnc_quantTableE[totalShift & 3]);
|
|
|
|
totalShift = (16 - 4) - (3 * (totalShift >> 2));
|
|
|
|
FDK_ASSERT(totalShift >= 0); /* MAX_QUANT_VIOLATION */
|
|
|
|
accu >>= fixMin(totalShift, DFRACT_BITS - 1);
|
|
|
|
quaSpectrum[line] = (SHORT)((LONG)(k + accu) >> (DFRACT_BITS - 1 - 16));
|
|
|
|
} else {
|
|
|
|
quaSpectrum[line] = 0;
|
2012-07-11 10:15:24 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
|
|
|
|
|
|
functionname:iFDKaacEnc_quantizeLines
|
|
|
|
description: iquantizes spectrum lines
|
|
|
|
mdctSpectrum = iquaSpectrum^4/3 *2^(0.25*gain)
|
|
|
|
input: global gain, number of lines to process,quantized spectrum
|
|
|
|
output: spectral data
|
|
|
|
|
|
|
|
*****************************************************************************/
|
2018-02-26 20:17:00 +01:00
|
|
|
static void FDKaacEnc_invQuantizeLines(INT gain, INT noOfLines,
|
|
|
|
SHORT *quantSpectrum,
|
|
|
|
FIXP_DBL *mdctSpectrum)
|
2012-07-11 10:15:24 -07:00
|
|
|
|
|
|
|
{
|
|
|
|
INT iquantizermod;
|
|
|
|
INT iquantizershift;
|
|
|
|
INT line;
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
iquantizermod = gain & 3;
|
|
|
|
iquantizershift = gain >> 2;
|
2012-07-11 10:15:24 -07:00
|
|
|
|
|
|
|
for (line = 0; line < noOfLines; line++) {
|
2018-02-26 20:17:00 +01:00
|
|
|
if (quantSpectrum[line] < 0) {
|
2012-07-11 10:15:24 -07:00
|
|
|
FIXP_DBL accu;
|
2018-02-26 20:17:00 +01:00
|
|
|
INT ex, specExp, tabIndex;
|
|
|
|
FIXP_DBL s, t;
|
2012-07-11 10:15:24 -07:00
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
accu = (FIXP_DBL)-quantSpectrum[line];
|
2012-07-11 10:15:24 -07:00
|
|
|
|
|
|
|
ex = CountLeadingBits(accu);
|
|
|
|
accu <<= ex;
|
2018-02-26 20:17:00 +01:00
|
|
|
specExp = (DFRACT_BITS - 1) - ex;
|
2012-07-11 10:15:24 -07:00
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
FDK_ASSERT(specExp < 14); /* this fails if abs(value) > 8191 */
|
2012-07-11 10:15:24 -07:00
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
tabIndex = (INT)(accu >> (DFRACT_BITS - 2 - MANT_DIGITS)) & (~MANT_SIZE);
|
2012-07-11 10:15:24 -07:00
|
|
|
|
|
|
|
/* calculate "mantissa" ^4/3 */
|
|
|
|
s = FDKaacEnc_mTab_4_3Elc[tabIndex];
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
/* get approperiate exponent multiplier for specExp^3/4 combined with
|
|
|
|
* scfMod */
|
2012-07-11 10:15:24 -07:00
|
|
|
t = FDKaacEnc_specExpMantTableCombElc[iquantizermod][specExp];
|
|
|
|
|
|
|
|
/* multiply "mantissa" ^4/3 with exponent multiplier */
|
2018-02-26 20:17:00 +01:00
|
|
|
accu = fMult(s, t);
|
2012-07-11 10:15:24 -07:00
|
|
|
|
|
|
|
/* get approperiate exponent shifter */
|
2018-02-26 20:17:00 +01:00
|
|
|
specExp = FDKaacEnc_specExpTableComb[iquantizermod][specExp] -
|
|
|
|
1; /* -1 to avoid overflows in accu */
|
2012-07-11 10:15:24 -07:00
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
if ((-iquantizershift - specExp) < 0)
|
|
|
|
accu <<= -(-iquantizershift - specExp);
|
2012-07-11 10:15:24 -07:00
|
|
|
else
|
2018-02-26 20:17:00 +01:00
|
|
|
accu >>= -iquantizershift - specExp;
|
2012-07-11 10:15:24 -07:00
|
|
|
|
|
|
|
mdctSpectrum[line] = -accu;
|
2018-02-26 20:17:00 +01:00
|
|
|
} else if (quantSpectrum[line] > 0) {
|
2012-07-11 10:15:24 -07:00
|
|
|
FIXP_DBL accu;
|
2018-02-26 20:17:00 +01:00
|
|
|
INT ex, specExp, tabIndex;
|
|
|
|
FIXP_DBL s, t;
|
2012-07-11 10:15:24 -07:00
|
|
|
|
|
|
|
accu = (FIXP_DBL)(INT)quantSpectrum[line];
|
|
|
|
|
|
|
|
ex = CountLeadingBits(accu);
|
|
|
|
accu <<= ex;
|
2018-02-26 20:17:00 +01:00
|
|
|
specExp = (DFRACT_BITS - 1) - ex;
|
2012-07-11 10:15:24 -07:00
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
FDK_ASSERT(specExp < 14); /* this fails if abs(value) > 8191 */
|
2012-07-11 10:15:24 -07:00
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
tabIndex = (INT)(accu >> (DFRACT_BITS - 2 - MANT_DIGITS)) & (~MANT_SIZE);
|
2012-07-11 10:15:24 -07:00
|
|
|
|
|
|
|
/* calculate "mantissa" ^4/3 */
|
|
|
|
s = FDKaacEnc_mTab_4_3Elc[tabIndex];
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
/* get approperiate exponent multiplier for specExp^3/4 combined with
|
|
|
|
* scfMod */
|
2012-07-11 10:15:24 -07:00
|
|
|
t = FDKaacEnc_specExpMantTableCombElc[iquantizermod][specExp];
|
|
|
|
|
|
|
|
/* multiply "mantissa" ^4/3 with exponent multiplier */
|
2018-02-26 20:17:00 +01:00
|
|
|
accu = fMult(s, t);
|
2012-07-11 10:15:24 -07:00
|
|
|
|
|
|
|
/* get approperiate exponent shifter */
|
2018-02-26 20:17:00 +01:00
|
|
|
specExp = FDKaacEnc_specExpTableComb[iquantizermod][specExp] -
|
|
|
|
1; /* -1 to avoid overflows in accu */
|
2012-07-11 10:15:24 -07:00
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
if ((-iquantizershift - specExp) < 0)
|
|
|
|
accu <<= -(-iquantizershift - specExp);
|
2012-07-11 10:15:24 -07:00
|
|
|
else
|
2018-02-26 20:17:00 +01:00
|
|
|
accu >>= -iquantizershift - specExp;
|
2012-07-11 10:15:24 -07:00
|
|
|
|
|
|
|
mdctSpectrum[line] = accu;
|
2018-02-26 20:17:00 +01:00
|
|
|
} else {
|
2012-07-11 10:15:24 -07:00
|
|
|
mdctSpectrum[line] = FL2FXCONST_DBL(0.0f);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
|
|
|
|
|
|
functionname: FDKaacEnc_QuantizeSpectrum
|
|
|
|
description: quantizes the entire spectrum
|
|
|
|
returns:
|
|
|
|
input: number of scalefactor bands to be quantized, ...
|
|
|
|
output: quantized spectrum
|
|
|
|
|
|
|
|
*****************************************************************************/
|
2018-02-26 20:17:00 +01:00
|
|
|
void FDKaacEnc_QuantizeSpectrum(INT sfbCnt, INT maxSfbPerGroup, INT sfbPerGroup,
|
|
|
|
const INT *sfbOffset,
|
|
|
|
const FIXP_DBL *mdctSpectrum, INT globalGain,
|
|
|
|
const INT *scalefactors,
|
|
|
|
SHORT *quantizedSpectrum,
|
|
|
|
INT dZoneQuantEnable) {
|
|
|
|
INT sfbOffs, sfb;
|
2012-07-11 10:15:24 -07:00
|
|
|
|
|
|
|
/* in FDKaacEnc_quantizeLines quaSpectrum is calculated with:
|
|
|
|
spec^(3/4) * 2^(-3/16*QSS) * 2^(3/4*scale) + k
|
|
|
|
simplify scaling calculation and reduce QSS before:
|
|
|
|
spec^(3/4) * 2^(-3/16*(QSS - 4*scale)) */
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
for (sfbOffs = 0; sfbOffs < sfbCnt; sfbOffs += sfbPerGroup)
|
|
|
|
for (sfb = 0; sfb < maxSfbPerGroup; sfb++) {
|
|
|
|
INT scalefactor = scalefactors[sfbOffs + sfb];
|
2012-07-11 10:15:24 -07:00
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
FDKaacEnc_quantizeLines(
|
|
|
|
globalGain - scalefactor, /* QSS */
|
|
|
|
sfbOffset[sfbOffs + sfb + 1] - sfbOffset[sfbOffs + sfb],
|
|
|
|
mdctSpectrum + sfbOffset[sfbOffs + sfb],
|
|
|
|
quantizedSpectrum + sfbOffset[sfbOffs + sfb], dZoneQuantEnable);
|
|
|
|
}
|
2012-07-11 10:15:24 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
|
|
|
|
|
|
functionname: FDKaacEnc_calcSfbDist
|
|
|
|
description: calculates distortion of quantized values
|
|
|
|
returns: distortion
|
|
|
|
input: gain, number of lines to process, spectral data
|
|
|
|
output:
|
|
|
|
|
|
|
|
*****************************************************************************/
|
2018-02-26 20:17:00 +01:00
|
|
|
FIXP_DBL FDKaacEnc_calcSfbDist(const FIXP_DBL *mdctSpectrum,
|
|
|
|
SHORT *quantSpectrum, INT noOfLines, INT gain,
|
|
|
|
INT dZoneQuantEnable) {
|
|
|
|
INT i, scale;
|
2012-07-11 10:15:24 -07:00
|
|
|
FIXP_DBL xfsf;
|
|
|
|
FIXP_DBL diff;
|
|
|
|
FIXP_DBL invQuantSpec;
|
|
|
|
|
|
|
|
xfsf = FL2FXCONST_DBL(0.0f);
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
for (i = 0; i < noOfLines; i++) {
|
2012-07-11 10:15:24 -07:00
|
|
|
/* quantization */
|
2018-02-26 20:17:00 +01:00
|
|
|
FDKaacEnc_quantizeLines(gain, 1, &mdctSpectrum[i], &quantSpectrum[i],
|
|
|
|
dZoneQuantEnable);
|
2012-07-11 10:15:24 -07:00
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
if (fAbs(quantSpectrum[i]) > MAX_QUANT) {
|
2012-09-09 11:48:51 -07:00
|
|
|
return FL2FXCONST_DBL(0.0f);
|
|
|
|
}
|
2012-07-11 10:15:24 -07:00
|
|
|
/* inverse quantization */
|
2018-02-26 20:17:00 +01:00
|
|
|
FDKaacEnc_invQuantizeLines(gain, 1, &quantSpectrum[i], &invQuantSpec);
|
2012-07-11 10:15:24 -07:00
|
|
|
|
|
|
|
/* dist */
|
2018-02-26 20:17:00 +01:00
|
|
|
diff = fixp_abs(fixp_abs(invQuantSpec) - fixp_abs(mdctSpectrum[i] >> 1));
|
2012-07-11 10:15:24 -07:00
|
|
|
|
|
|
|
scale = CountLeadingBits(diff);
|
|
|
|
diff = scaleValue(diff, scale);
|
|
|
|
diff = fPow2(diff);
|
2018-02-26 20:17:00 +01:00
|
|
|
scale = fixMin(2 * (scale - 1), DFRACT_BITS - 1);
|
2012-07-11 10:15:24 -07:00
|
|
|
|
|
|
|
diff = scaleValue(diff, -scale);
|
|
|
|
|
|
|
|
xfsf = xfsf + diff;
|
|
|
|
}
|
|
|
|
|
|
|
|
xfsf = CalcLdData(xfsf);
|
|
|
|
|
|
|
|
return xfsf;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
|
|
|
|
|
|
functionname: FDKaacEnc_calcSfbQuantEnergyAndDist
|
|
|
|
description: calculates energy and distortion of quantized values
|
|
|
|
returns:
|
|
|
|
input: gain, number of lines to process, quantized spectral data,
|
|
|
|
spectral data
|
|
|
|
output: energy, distortion
|
|
|
|
|
|
|
|
*****************************************************************************/
|
|
|
|
void FDKaacEnc_calcSfbQuantEnergyAndDist(FIXP_DBL *mdctSpectrum,
|
2018-02-26 20:17:00 +01:00
|
|
|
SHORT *quantSpectrum, INT noOfLines,
|
|
|
|
INT gain, FIXP_DBL *en,
|
|
|
|
FIXP_DBL *dist) {
|
|
|
|
INT i, scale;
|
2012-07-11 10:15:24 -07:00
|
|
|
FIXP_DBL invQuantSpec;
|
|
|
|
FIXP_DBL diff;
|
|
|
|
|
2012-09-09 11:48:51 -07:00
|
|
|
FIXP_DBL energy = FL2FXCONST_DBL(0.0f);
|
|
|
|
FIXP_DBL distortion = FL2FXCONST_DBL(0.0f);
|
2012-07-11 10:15:24 -07:00
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
for (i = 0; i < noOfLines; i++) {
|
|
|
|
if (fAbs(quantSpectrum[i]) > MAX_QUANT) {
|
|
|
|
*en = FL2FXCONST_DBL(0.0f);
|
2012-09-09 11:48:51 -07:00
|
|
|
*dist = FL2FXCONST_DBL(0.0f);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2012-07-11 10:15:24 -07:00
|
|
|
/* inverse quantization */
|
2018-02-26 20:17:00 +01:00
|
|
|
FDKaacEnc_invQuantizeLines(gain, 1, &quantSpectrum[i], &invQuantSpec);
|
2012-07-11 10:15:24 -07:00
|
|
|
|
|
|
|
/* energy */
|
2012-09-09 11:48:51 -07:00
|
|
|
energy += fPow2(invQuantSpec);
|
2012-07-11 10:15:24 -07:00
|
|
|
|
|
|
|
/* dist */
|
2018-02-26 20:17:00 +01:00
|
|
|
diff = fixp_abs(fixp_abs(invQuantSpec) - fixp_abs(mdctSpectrum[i] >> 1));
|
2012-07-11 10:15:24 -07:00
|
|
|
|
|
|
|
scale = CountLeadingBits(diff);
|
|
|
|
diff = scaleValue(diff, scale);
|
|
|
|
diff = fPow2(diff);
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
scale = fixMin(2 * (scale - 1), DFRACT_BITS - 1);
|
2012-07-11 10:15:24 -07:00
|
|
|
|
|
|
|
diff = scaleValue(diff, -scale);
|
|
|
|
|
2012-09-09 11:48:51 -07:00
|
|
|
distortion += diff;
|
2012-07-11 10:15:24 -07:00
|
|
|
}
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
*en = CalcLdData(energy) + FL2FXCONST_DBL(0.03125f);
|
2012-09-09 11:48:51 -07:00
|
|
|
*dist = CalcLdData(distortion);
|
2012-07-11 10:15:24 -07:00
|
|
|
}
|