107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch/* -----------------------------------------------------------------------------------------------------------
307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochSoftware License for The Fraunhofer FDK AAC Codec Library for Android
407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch� Copyright  1995 - 2013 Fraunhofer-Gesellschaft zur F�rderung der angewandten Forschung e.V.
607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  All rights reserved.
707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 1.    INTRODUCTION
9a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben MurdochThe Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements
10a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochthe MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio.
11a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben MurdochThis FDK AAC Codec software is intended to be used on a wide variety of Android devices.
1207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
1307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochAAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual
1407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochaudio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by
15a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochindependent studies and is widely deployed. AAC has been standardized by ISO and IEC as part
16a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochof the MPEG specifications.
1707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
1807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochPatent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer)
1907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochmay be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners
2007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochindividually for the purpose of encoding or decoding bit streams in products that are compliant with
2107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochthe ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license
2207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochthese patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec
2307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochsoftware may already be covered under those patent licenses when it is used for those licensed purposes only.
2407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
2507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochCommercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality,
2607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochare also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional
2707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochapplications information and documentation.
2807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
2907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch2.    COPYRIGHT LICENSE
30f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
3107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochRedistribution and use in source and binary forms, with or without modification, are permitted without
3207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochpayment of copyright license fees provided that you satisfy the following conditions:
3307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
3407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochYou must retain the complete text of this software license in redistributions of the FDK AAC Codec or
3507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochyour modifications thereto in source code form.
3607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
3707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochYou must retain the complete text of this software license in the documentation and/or other materials
3807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochprovided with redistributions of the FDK AAC Codec or your modifications thereto in binary form.
3907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochYou must make available free of charge copies of the complete source code of the FDK AAC Codec and your
4007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochmodifications thereto to recipients of copies in binary form.
4107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
4207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochThe name of Fraunhofer may not be used to endorse or promote products derived from this library without
4307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochprior written permission.
4407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
4507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochYou may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec
4607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochsoftware or your modifications thereto.
4707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
4807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochYour modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software
4907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochand the date of any change. For modified versions of the FDK AAC Codec, the term
5007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch"Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term
5107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch"Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android."
5207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
5307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch3.    NO PATENT LICENSE
5407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
5507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochNO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer,
5607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with
5707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochrespect to this software.
5807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
59a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben MurdochYou may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized
6007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochby appropriate patent licenses.
6107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
6207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch4.    DISCLAIMER
6307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
6407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochThis FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors
6507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch"AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties
6607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochof merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
6707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochCONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages,
6807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochincluding but not limited to procurement of substitute goods or services; loss of use, data, or profits,
6907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochor business interruption, however caused and on any theory of liability, whether in contract, strict
7007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochliability, or tort (including negligence), arising in any way out of the use of this software, even if
7107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochadvised of the possibility of such damage.
7207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
7307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch5.    CONTACT INFORMATION
7407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
7507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochFraunhofer Institute for Integrated Circuits IIS
7607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochAttention: Audio and Multimedia Departments - FDK AAC LL
7707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochAm Wolfsmantel 33
7807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch91058 Erlangen, Germany
7907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
8007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochwww.iis.fraunhofer.de/amm
81a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochamm-info@iis.fraunhofer.de
8207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch----------------------------------------------------------------------------------------------------------- */
8307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
8407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch/******************************** MPEG Audio Encoder **************************
8507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
8607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch   Initial author:       M. Werner
8707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch   contents/description: Perceptual entropie module
8807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
8907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch******************************************************************************/
9007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
9107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch#include "line_pe.h"
9207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch#include "sf_estim.h"
9307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch#include "bit_cnt.h"
9407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
9507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch#include "genericStds.h"
96323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
9707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochstatic const FIXP_DBL C1LdData = FL2FXCONST_DBL(3.0/LD_DATA_SCALING);        /* C1 = 3.0 = log(8.0)/log(2) */
9807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochstatic const FIXP_DBL C2LdData = FL2FXCONST_DBL(1.3219281/LD_DATA_SCALING);  /* C2 = 1.3219281 = log(2.5)/log(2) */
9907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochstatic const FIXP_DBL C3LdData = FL2FXCONST_DBL(0.5593573);                  /* 1-C2/C1 */
10007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
10107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
10207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch/* constants that do not change during successive pe calculations */
10307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochvoid FDKaacEnc_prepareSfbPe(PE_CHANNEL_DATA *peChanData,
10407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch                  const FIXP_DBL  *sfbEnergyLdData,
10507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch                  const FIXP_DBL  *sfbThresholdLdData,
10607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch                  const FIXP_DBL  *sfbFormFactorLdData,
10707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch                  const INT       *sfbOffset,
10807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch                  const INT       sfbCnt,
10907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch                  const INT       sfbPerGroup,
11007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch                  const INT       maxSfbPerGroup)
11107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
11207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch   INT sfbGrp,sfb;
11307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch   INT sfbWidth;
11407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch   FIXP_DBL avgFormFactorLdData;
11507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch   const FIXP_DBL formFacScaling = FL2FXCONST_DBL((float)FORM_FAC_SHIFT/LD_DATA_SCALING);
11607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
11707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch   for (sfbGrp = 0;sfbGrp < sfbCnt;sfbGrp+=sfbPerGroup) {
11807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    for (sfb=0; sfb<maxSfbPerGroup; sfb++) {
11907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch      if ((FIXP_DBL)sfbEnergyLdData[sfbGrp+sfb] > (FIXP_DBL)sfbThresholdLdData[sfbGrp+sfb]) {
12007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch         sfbWidth = sfbOffset[sfbGrp+sfb+1] - sfbOffset[sfbGrp+sfb];
12107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch         /* estimate number of active lines */
12207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch         avgFormFactorLdData = ((-sfbEnergyLdData[sfbGrp+sfb]>>1) + (CalcLdInt(sfbWidth)>>1))>>1;
12307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch         peChanData->sfbNLines[sfbGrp+sfb] =
12407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch           (INT)CalcInvLdData( (sfbFormFactorLdData[sfbGrp+sfb] + formFacScaling) + avgFormFactorLdData);
12507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch         /* Make sure sfbNLines is never greater than sfbWidth due to unaccuracies (e.g. sfbEnergyLdData[sfbGrp+sfb] = 0x80000000) */
12607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch         peChanData->sfbNLines[sfbGrp+sfb] = fMin(sfbWidth, peChanData->sfbNLines[sfbGrp+sfb]);
12707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch      }
12807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch      else {
12907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch         peChanData->sfbNLines[sfbGrp+sfb] = 0;
13007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch      }
131323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    }
13207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch   }
13307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
13407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
13507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch/*
13607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch   formula for one sfb:
13707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch   pe = n * ld(en/thr),                if ld(en/thr) >= C1
13807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch   pe = n * (C2 + C3 * ld(en/thr)),    if ld(en/thr) <  C1
13907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch   n: estimated number of lines in sfb,
14007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch   ld(x) = log(x)/log(2)
14107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
14207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch   constPart is sfbPe without the threshold part n*ld(thr) or n*C3*ld(thr)
14307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch*/
144f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)void FDKaacEnc_calcSfbPe(PE_CHANNEL_DATA  *RESTRICT peChanData,
14507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch               const FIXP_DBL   *RESTRICT sfbEnergyLdData,
14607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch               const FIXP_DBL   *RESTRICT sfbThresholdLdData,
14707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch               const INT        sfbCnt,
14807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch               const INT        sfbPerGroup,
14907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch               const INT        maxSfbPerGroup,
15007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch               const INT       *isBook,
15107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch               const INT       *isScale)
15207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
15307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch   INT sfbGrp,sfb;
15407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch   INT nLines;
155d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)   FIXP_DBL logDataRatio;
15607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch   INT lastValIs = 0;
1576f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
15807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch   peChanData->pe = 0;
159a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch   peChanData->constPart = 0;
16007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch   peChanData->nActiveLines = 0;
16107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
16207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch   for(sfbGrp = 0;sfbGrp < sfbCnt;sfbGrp+=sfbPerGroup){
16307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    for (sfb=0; sfb<maxSfbPerGroup; sfb++) {
16407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch      if ((FIXP_DBL)sfbEnergyLdData[sfbGrp+sfb] > (FIXP_DBL)sfbThresholdLdData[sfbGrp+sfb]) {
16507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch         logDataRatio = (FIXP_DBL)(sfbEnergyLdData[sfbGrp+sfb] - sfbThresholdLdData[sfbGrp+sfb]);
16607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch         nLines = peChanData->sfbNLines[sfbGrp+sfb];
16707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch         if (logDataRatio >= C1LdData) {
16810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch            /* scale sfbPe and sfbConstPart with PE_CONSTPART_SHIFT */
16907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            peChanData->sfbPe[sfbGrp+sfb] = fMultDiv2(logDataRatio, (FIXP_DBL)(nLines<<(LD_DATA_SHIFT+PE_CONSTPART_SHIFT+1)));
17007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            peChanData->sfbConstPart[sfbGrp+sfb] =
17107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch                    fMultDiv2(sfbEnergyLdData[sfbGrp+sfb], (FIXP_DBL)(nLines<<(LD_DATA_SHIFT+PE_CONSTPART_SHIFT+1))); ;
17207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
17307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch         }
17407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch         else {
17507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            /* scale sfbPe and sfbConstPart with PE_CONSTPART_SHIFT */
17607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            peChanData->sfbPe[sfbGrp+sfb] =
17707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch                     fMultDiv2(((FIXP_DBL)C2LdData + fMult(C3LdData,logDataRatio)), (FIXP_DBL)(nLines<<(LD_DATA_SHIFT+PE_CONSTPART_SHIFT+1)));
17807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
17907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            peChanData->sfbConstPart[sfbGrp+sfb] =
18007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch                     fMultDiv2(((FIXP_DBL)C2LdData + fMult(C3LdData,sfbEnergyLdData[sfbGrp+sfb])),
18107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch                           (FIXP_DBL)(nLines<<(LD_DATA_SHIFT+PE_CONSTPART_SHIFT+1))) ;
18207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
18307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            nLines = fMultI(C3LdData, nLines);
18407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch         }
18507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch         peChanData->sfbNActiveLines[sfbGrp+sfb] = nLines;
18607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch      }
18707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch      else if( isBook[sfbGrp+sfb] ) {
18807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        /* provide for cost of scale factor for Intensity */
18907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        INT delta = isScale[sfbGrp+sfb] - lastValIs;
19007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        lastValIs = isScale[sfbGrp+sfb];
19107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        peChanData->sfbPe[sfbGrp+sfb] = FDKaacEnc_bitCountScalefactorDelta(delta)<<PE_CONSTPART_SHIFT;
19207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        peChanData->sfbConstPart[sfbGrp+sfb] = 0;
19307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        peChanData->sfbNActiveLines[sfbGrp+sfb] = 0;
19407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch      }
19507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch      else {
19607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch         peChanData->sfbPe[sfbGrp+sfb] = 0;
19707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch         peChanData->sfbConstPart[sfbGrp+sfb] = 0;
19807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch         peChanData->sfbNActiveLines[sfbGrp+sfb] = 0;
19907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch      }
20007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch      /* sum up peChanData values */
20107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch      peChanData->pe += peChanData->sfbPe[sfbGrp+sfb];
20207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch      peChanData->constPart += peChanData->sfbConstPart[sfbGrp+sfb];
20307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch      peChanData->nActiveLines += peChanData->sfbNActiveLines[sfbGrp+sfb];
20407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    }
20507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch   }
20607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch   /* correct scaled pe and constPart values */
20707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch   peChanData->pe>>=PE_CONSTPART_SHIFT;
20807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch   peChanData->constPart>>=PE_CONSTPART_SHIFT;
20907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
21007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch