Bug fixes in AAC decoder, AAC encoder, FDK library

Latest code drop from Fraunhofer:

* AAC-Decoder

   - Expanded AAC-LD/ELD decoder TNS max band tables to avoid wrong data
     access for sampling rates <22kHz and >48kHz.
     Modified file(s):
        libAACdec\src\aacdec_tns.cpp
        libAACdec\src\aac_rom.h
        libAACdec\src\aac_rom.cpp

  - Fixed ELD synthesis QMF filterbank scaling for downsampled SBR.
    Modified file(s):
        libFDK\src\qmf.cpp

* AAC-Encoder

  - Fixed bit rate limiting for lower limit as introduced in the Delivery 2012-05-11.
    Modified file(s):
        libAACenc\include\aacenc_lib.h
        libAACenc\src\aacenc.h
        libAACenc\src\aacenc.cpp
        libSBRenc\src\sbr_rom.h
        libSBRenc\src\sbr_rom.cpp

  - Allow negative prediction gain as meaning that there is no coding gain.
    Make use of scaleValueSaturate in gauss window calculation.
    Modified file(s):
        libAACenc\src\aacenc_tns.cpp

  - Added energy saturation to prevent overflow in short blocks.
    Modified file(s):
        libAACenc\src\grp_data.cpp

  - Perform scalefactor adaption in case quantized lines are out of valid range.
    Modified file(s):
        libAACenc\src\quantize.cpp

  - Interrupt quantization loop when no spectral data is available.
    Adjustments in bitreservoir adaption.
    Modified file(s):
        libAACenc\src\qc_main.cpp

  - Indroduced dynamic scaling in none missing harmonic energy lowering compensation.
    Modified file(s):
        libSBRenc\src\env_est.cpp

* FDK-Library

  - Fixed saturation for negative values in scaleValueSaturate.
    Modified file(s):
        libFDK\include\scale.h

Change-Id: If830ea65caef6b5554281e4b7a77a8b2e08825ce
diff --git a/documentation/aacDecoder.pdf b/documentation/aacDecoder.pdf
index b94cbb0..0d42e79 100644
--- a/documentation/aacDecoder.pdf
+++ b/documentation/aacDecoder.pdf
Binary files differ
diff --git a/documentation/aacEncoder.pdf b/documentation/aacEncoder.pdf
index 409e2fc..2af41ae 100644
--- a/documentation/aacEncoder.pdf
+++ b/documentation/aacEncoder.pdf
Binary files differ
diff --git a/libAACdec/src/aac_rom.cpp b/libAACdec/src/aac_rom.cpp
index 13da0f6..dd51919 100644
--- a/libAACdec/src/aac_rom.cpp
+++ b/libAACdec/src/aac_rom.cpp
@@ -1729,20 +1729,36 @@
   { 39, 14 }, /*  7350 */
 };
 
-/* TNS_MAX_BANDS for low delay. The array index is sampleRateIndex-3 */
-const UCHAR tns_max_bands_tbl_480[5] = {
-  31, /* 48000  */
+/* TNS_MAX_BANDS for low delay. The array index is the sampleRateIndex */
+const UCHAR tns_max_bands_tbl_480[13] = {
+  31, /* 96000 */
+  31, /* 88200 */
+  31, /* 64000 */
+  31, /* 48000 */
   32, /* 44100 */
   37, /* 32000 */
   30, /* 24000 */
-  30  /* 22050 */
+  30, /* 22050 */
+  30, /* 16000 */
+  30, /* 12000 */
+  30, /* 11025 */
+  30, /*  8000 */
+  30  /*  7350 */
 };
-const UCHAR tns_max_bands_tbl_512[5] = {
-  31, /* 48000  */
+const UCHAR tns_max_bands_tbl_512[13] = {
+  31, /* 96000 */
+  31, /* 88200 */
+  31, /* 64000 */
+  31, /* 48000 */
   32, /* 44100 */
   37, /* 32000 */
   31, /* 24000 */
-  31  /* 22050 */
+  31, /* 22050 */
+  31, /* 16000 */
+  31, /* 12000 */
+  31, /* 11025 */
+  31, /*  8000 */
+  31  /*  7350 */
 };
 
 #define TCC(x) (FIXP_DBL(x))
diff --git a/libAACdec/src/aac_rom.h b/libAACdec/src/aac_rom.h
index ca971fe..beec2ee 100644
--- a/libAACdec/src/aac_rom.h
+++ b/libAACdec/src/aac_rom.h
@@ -164,8 +164,8 @@
 
 extern const UCHAR tns_max_bands_tbl[13][2];
 
-extern const UCHAR tns_max_bands_tbl_480[5];
-extern const UCHAR tns_max_bands_tbl_512[5];
+extern const UCHAR tns_max_bands_tbl_480[13];
+extern const UCHAR tns_max_bands_tbl_512[13];
 
 #define FIXP_TCC FIXP_DBL
 
diff --git a/libAACdec/src/aacdec_tns.cpp b/libAACdec/src/aacdec_tns.cpp
index db67c9b..702196f 100644
--- a/libAACdec/src/aacdec_tns.cpp
+++ b/libAACdec/src/aacdec_tns.cpp
@@ -374,10 +374,10 @@
 
              switch (granuleLength) {
                case 480:
-                 tns_max_bands = tns_max_bands_tbl_480[pSamplingRateInfo->samplingRateIndex-3];
+                 tns_max_bands = tns_max_bands_tbl_480[pSamplingRateInfo->samplingRateIndex];
                  break;
                case 512:
-                 tns_max_bands = tns_max_bands_tbl_512[pSamplingRateInfo->samplingRateIndex-3];
+                 tns_max_bands = tns_max_bands_tbl_512[pSamplingRateInfo->samplingRateIndex];
                  break;
                default:
                  tns_max_bands = GetMaximumTnsBands(pIcsInfo, pSamplingRateInfo->samplingRateIndex);
diff --git a/libAACdec/src/aacdecoder_lib.cpp b/libAACdec/src/aacdecoder_lib.cpp
index 451d659..87f9ab0 100644
--- a/libAACdec/src/aacdecoder_lib.cpp
+++ b/libAACdec/src/aacdecoder_lib.cpp
@@ -110,7 +110,7 @@
 /* Decoder library info */
 #define AACDECODER_LIB_VL0 2
 #define AACDECODER_LIB_VL1 4
-#define AACDECODER_LIB_VL2 4
+#define AACDECODER_LIB_VL2 5
 #define AACDECODER_LIB_TITLE "AAC Decoder Lib"
 #define AACDECODER_LIB_BUILD_DATE __DATE__
 #define AACDECODER_LIB_BUILD_TIME __TIME__
diff --git a/libAACenc/include/aacenc_lib.h b/libAACenc/include/aacenc_lib.h
index 4635119..862dcb5 100644
--- a/libAACenc/include/aacenc_lib.h
+++ b/libAACenc/include/aacenc_lib.h
@@ -424,102 +424,11 @@
 AAC-LC core encoder operates in dual rate mode at its lowest possible sampling frequency, which is 8 kHz.
 HE-AAC v2 requires stereo input audio data.
 
-The following table lists the supported bitrates for AAC-LC, HE-AAC and HE-AAC v2 encoding depending
-on input sampling frequency ("Hz") and number of input channels ("chan"). The minimum and maximum
-allowed bitrate ("BR Min", "BR Max") is given in bits per second.
-In case the desired combination of bitrate and sampling frequency is not available ("NA") for HE-AAC or
-HE-AAC v2 then the encoder will automatically switch to AAC-LC and give a command line warning.
 Please note that in HE-AAC or HE-AAC v2 mode the encoder supports much higher bitrates than are
 appropriate for HE-AAC or HE-AAC v2. For example, at a bitrate of more than 64 kbit/s for a stereo
 audio signal at 44.1 kHz it usually makes sense to use AAC-LC, which will produce better audio
 quality at that bitrate than HE-AAC or HE-AAC v2.
 
-
-\verbatim
-  Config            AAC-LC                  HE-AAC (SBR)          HE-AACv2 (SBR+PS)
-
- Hz   chan       BR Min   BR Max          BR Min   BR Max          BR Min   BR Max
-
-8000    1        758      48000           NA       NA               NA       NA
-11025   1        1045     66150           NA       NA               NA       NA
-12000   1        1137     72000           NA       NA               NA       NA
-16000   1        1516     96000           8000     48000            NA       NA
-22050   1        2089     132300          8000     64000            NA       NA
-24000   1        2274     144000          8000     64000            NA       NA
-32000   1        3032     192000          8000     64000            NA       NA
-44100   1        4178     264576          8000     64000            NA       NA
-48000   1        4547     288000          12000    64000            NA       NA
-64000   1        6063     384000          24000    160000           NA       NA
-88200   1        8355     529200          24000    160000           NA       NA
-96000   1        9094     576000          24000    160000           NA       NA
------------------------------------------------------------------------------------
-8000    2        1071     96000           NA       NA               NA       NA
-11025   2        1476     132300          NA       NA               NA       NA
-12000   2        1606     144000          NA       NA               NA       NA
-16000   2        2141     192000          16000    96000            8000     48000
-22050   2        2951     264600          16000    128000           8000     64000
-24000   2        3211     288000          16000    128000           8000     64000
-32000   2        4282     384000          16000    128000           8000     64000
-44100   2        5900     529152          16000    128000           8000     64000
-48000   2        6422     576000          16000    128000           12000    64000
-64000   2        8563     768000          32000    256000           24000    160000
-88200   2        11801    1058400         32000    256000           24000    160000
-96000   2        12844    1152000         32000    256000           24000    160000
------------------------------------------------------------------------------------
-8000    3        1383     144000          NA       NA               NA       NA
-11025   3        1906     198450          NA       NA               NA       NA
-12000   3        2075     216000          NA       NA               NA       NA
-16000   3        2766     288000          26667    120000           NA       NA
-22050   3        3812     396900          26667    160000           NA       NA
-24000   3        4149     432000          26667    160000           NA       NA
-32000   3        5532     576000          26667    160000           NA       NA
-44100   3        7623     793728          26667    160000           NA       NA
-48000   3        8297     864000          29996    160000           NA       NA
-64000   3        11063    1152000         59996    400000           NA       NA
-88200   3        15246    1587600         59996    400000           NA       NA
-96000   3        16594    1728000         59996    400000           NA       NA
------------------------------------------------------------------------------------
-8000    4        1696     192000          NA       NA               NA       NA
-11025   4        2337     264600          NA       NA               NA       NA
-12000   4        2543     288000          NA       NA               NA       NA
-16000   4        3391     384000          40000    160000           NA       NA
-22050   4        4673     529200          40000    213330           NA       NA
-24000   4        5086     576000          40000    213330           NA       NA
-32000   4        6782     768000          40000    213330           NA       NA
-44100   4        9345     1058304         40000    213330           NA       NA
-48000   4        10172    1152000         40000    213330           NA       NA
-64000   4        13563    1536000         80000    533330           NA       NA
-88200   4        18691    2116800         80000    533330           NA       NA
-96000   4        20344    2304000         80000    533330           NA       NA
------------------------------------------------------------------------------------
-8000    5        2008     240000          NA       NA               NA       NA
-11025   5        2768     330750          NA       NA               NA       NA
-12000   5        3012     360000          NA       NA               NA       NA
-16000   5        4016     480000          43244    184612           NA       NA
-22050   5        5535     661500          43244    246152           NA       NA
-24000   5        6024     720000          43244    246152           NA       NA
-32000   5        8032     960000          43244    246152           NA       NA
-44100   5        11068    1322880         43244    246152           NA       NA
-48000   5        12047    1440000         46140    246152           NA       NA
-64000   5        16063    1920000         92296    615384           NA       NA
-88200   5        22137    2646000         92296    615384           NA       NA
-96000   5        24094    2880000         92296    615384           NA       NA
------------------------------------------------------------------------------------
-8000    5.1      2321     240000          NA       NA               NA       NA
-11025   5.1      3198     330750          NA       NA               NA       NA
-12000   5.1      3481     360000          NA       NA               NA       NA
-16000   5.1      4641     480000          45715    199990           NA       NA
-22050   5.1      6396     661500          45715    266658           NA       NA
-24000   5.1      6961     720000          45715    266658           NA       NA
-32000   5.1      9282     960000          45715    266658           NA       NA
-44100   5.1      12790    1322880         45715    266658           NA       NA
-48000   5.1      13922    1440000         49982    266658           NA       NA
-64000   5.1      18563    1920000         99982    666658           NA       NA
-88200   5.1      25582    2646000         99982    666658           NA       NA
-96000   5.1      27844    2880000         99982    666658           NA       NA
-
-\endverbatim \n
-
 \section reommendedConfig Recommended Sampling Rate and Bitrate Combinations
 
 The following table provides an overview of recommended encoder configuration parameters
@@ -956,8 +865,8 @@
 
   AACENC_GRANULE_LENGTH           = 0x0105,  /*!< Core encoder (AAC) audio frame length in samples:
                                                   - 1024: Default configuration.
-                                                  - 512: Optional length in LD/ELD configuration.
-                                                  - 480: Default LD/ELD configuration. */
+                                                  - 512: Default LD/ELD configuration.
+                                                  - 480: Optional length in LD/ELD configuration. */
 
   AACENC_CHANNELMODE              = 0x0106,  /*!< Set explicit channel mode. Channel mode must match with number of input channels.
                                                   - 1-6: MPEG channel modes supported, see ::CHANNEL_MODE in FDK_audio.h. */
diff --git a/libAACenc/src/aacenc.cpp b/libAACenc/src/aacenc.cpp
index 85083cd..d3f36aa 100644
--- a/libAACenc/src/aacenc.cpp
+++ b/libAACenc/src/aacenc.cpp
@@ -149,7 +149,7 @@
       transportBits = 208;
     }
 
-    bitRate = FDKmax(bitRate, ((((40 * nChannels) + transportBits + frameLength) * (coreSamplingRate)) / frameLength) );
+    bitRate = FDKmax(bitRate, ((((40 * nChannels) + transportBits) * (coreSamplingRate)) / frameLength) );
     FDK_ASSERT(bitRate >= 0);
 
     bitRate = FDKmin(bitRate, ((nChannelsEff * MIN_BUFSIZE_PER_EFF_CHAN)*(coreSamplingRate>>shift)) / (frameLength>>shift)) ;
@@ -280,7 +280,7 @@
     config->useTns          = TNS_ENABLE_MASK;      /* tns enabled completly */
     config->usePns          = 1;                    /* depending on channelBitrate this might be set to 0 later */
     config->useIS           = 1;                    /* Intensity Stereo Configuration */
-    config->framelength     = DEFAULT_FRAMELENGTH;  /* used frame size */
+    config->framelength     = -1;                   /* Framesize not configured */
     config->syntaxFlags     = 0;                    /* default syntax with no specialities */
     config->epConfig        = -1;                   /* no ER syntax -> no additional error protection */
     config->nSubFrames      = 1;                    /* default, no sub frames */
@@ -451,11 +451,8 @@
   switch (config->framelength)
   {
     case 1024:
-      if ( config->audioObjectType != AOT_AAC_LC
-        && config->audioObjectType != AOT_SBR
-        && config->audioObjectType != AOT_PS
-        && config->audioObjectType != AOT_ER_AAC_LC
-        && config->audioObjectType != AOT_AAC_SCAL )
+      if ( config->audioObjectType == AOT_ER_AAC_LD
+        || config->audioObjectType == AOT_ER_AAC_ELD )
       {
         return AAC_ENC_INVALID_FRAME_LENGTH;
       }
diff --git a/libAACenc/src/aacenc.h b/libAACenc/src/aacenc.h
index 8242248..942f686 100644
--- a/libAACenc/src/aacenc.h
+++ b/libAACenc/src/aacenc.h
@@ -153,7 +153,6 @@
 /*-------------------------- defines --------------------------------------*/
 
 #define ANC_DATA_BUFFERSIZE 1024      /* ancBuffer size */
-#define DEFAULT_FRAMELENGTH 1024      /* size of AAC core frame in (new) PCM samples */
 
 #define MAX_TOTAL_EXT_PAYLOADS  (((6) * (1)) + (2+2))
 
diff --git a/libAACenc/src/aacenc_lib.cpp b/libAACenc/src/aacenc_lib.cpp
index cbb0e2a..a245358 100644
--- a/libAACenc/src/aacenc_lib.cpp
+++ b/libAACenc/src/aacenc_lib.cpp
@@ -98,7 +98,7 @@
 /* Encoder library info */
 #define AACENCODER_LIB_VL0 3
 #define AACENCODER_LIB_VL1 3
-#define AACENCODER_LIB_VL2 1
+#define AACENCODER_LIB_VL2 2
 #define AACENCODER_LIB_TITLE "AAC Encoder"
 #define AACENCODER_LIB_BUILD_DATE __DATE__
 #define AACENCODER_LIB_BUILD_TIME __TIME__
diff --git a/libAACenc/src/aacenc_tns.cpp b/libAACenc/src/aacenc_tns.cpp
index 933e4e7..00b2bca 100644
--- a/libAACenc/src/aacenc_tns.cpp
+++ b/libAACenc/src/aacenc_tns.cpp
@@ -1067,11 +1067,11 @@
         const INT timeResolution_e
         )
 {
-  #define PI_SCALE         (2)
-  #define PI_FIX           FL2FXCONST_DBL(3.1416f/(float)(1<<PI_SCALE))
+  #define PI_E           (2)
+  #define PI_M           FL2FXCONST_DBL(3.1416f/(float)(1<<PI_E))
 
-  #define EULER_SCALE      (2)
-  #define EULER_FIX        FL2FXCONST_DBL(2.7183/(float)(1<<EULER_SCALE))
+  #define EULER_E        (2)
+  #define EULER_M        FL2FXCONST_DBL(2.7183/(float)(1<<EULER_E))
 
   #define COEFF_LOOP_SCALE (4)
 
@@ -1083,9 +1083,9 @@
    *   gaussExp = PI * samplingRate * 0.001f * timeResolution / transformResolution;
    *   gaussExp = -0.5f * gaussExp * gaussExp;
    */
-  gaussExp_m = fMultNorm(timeResolution, fMult(PI_FIX, fDivNorm( (FIXP_DBL)(samplingRate), (FIXP_DBL)(LONG)(transformResolution*1000.f), &e1)), &e2);
+  gaussExp_m = fMultNorm(timeResolution, fMult(PI_M, fDivNorm( (FIXP_DBL)(samplingRate), (FIXP_DBL)(LONG)(transformResolution*1000.f), &e1)), &e2);
   gaussExp_m = -fPow2Div2(gaussExp_m);
-  gaussExp_e = 2*(e1+e2+timeResolution_e+PI_SCALE);
+  gaussExp_e = 2*(e1+e2+timeResolution_e+PI_E);
 
   FDK_ASSERT( winSize < (1<<COEFF_LOOP_SCALE) );
 
@@ -1095,13 +1095,13 @@
   for( i=0; i<winSize; i++) {
 
     win[i] = fPow(
-            EULER_FIX,
-            EULER_SCALE,
+            EULER_M,
+            EULER_E,
             fMult(gaussExp_m, fPow2((i*FL2FXCONST_DBL(1.f/(float)(1<<COEFF_LOOP_SCALE)) + FL2FXCONST_DBL(.5f/(float)(1<<COEFF_LOOP_SCALE))))),
             gaussExp_e + 2*COEFF_LOOP_SCALE,
            &e1);
 
-    win[i] = scaleValue(win[i], e1);
+    win[i] = scaleValueSaturate(win[i], e1);
   }
 }
 
@@ -1157,7 +1157,10 @@
     workBuffer++;
   }
 
-  tmp = fMult((FIXP_DBL)((LONG)TNS_PREDGAIN_SCALE<<21), fDivNorm(autoCorr_0, input[0], &scale));
+  tmp = fMult((FIXP_DBL)((LONG)TNS_PREDGAIN_SCALE<<21), fDivNorm(fAbs(autoCorr_0), fAbs(input[0]), &scale));
+  if ( fMultDiv2(autoCorr_0, input[0])<FL2FXCONST_DBL(0.0f) ) {
+    tmp = -tmp;
+  }
   predictionGain = (LONG)scaleValue(tmp,scale-21);
 
   return (predictionGain);
diff --git a/libAACenc/src/grp_data.cpp b/libAACenc/src/grp_data.cpp
index 03d4976..4355295 100644
--- a/libAACenc/src/grp_data.cpp
+++ b/libAACenc/src/grp_data.cpp
@@ -94,6 +94,10 @@
 * this routine does not work in-place
 */
 
+static inline FIXP_DBL nrgAddSaturate(const FIXP_DBL a, const FIXP_DBL b) {
+  return ( (a>=(FIXP_DBL)MAXVAL_DBL-b) ? (FIXP_DBL)MAXVAL_DBL : (a + b) );
+}
+
 void
 FDKaacEnc_groupShortData(FIXP_DBL      *mdctSpectrum,     /* in-out                           */
                SFB_THRESHOLD *sfbThreshold,     /* in-out                           */
@@ -177,7 +181,7 @@
       FIXP_DBL thresh = sfbThreshold->Short[wnd][sfb];
       for (j=1; j<groupLen[grp]; j++)
       {
-        thresh += sfbThreshold->Short[wnd+j][sfb];
+        thresh = nrgAddSaturate(thresh, sfbThreshold->Short[wnd+j][sfb]);
       }
       sfbThreshold->Long[i++] = thresh;
     }
@@ -195,7 +199,7 @@
       FIXP_DBL energy = sfbEnergy->Short[wnd][sfb];
       for (j=1; j<groupLen[grp]; j++)
       {
-        energy += sfbEnergy->Short[wnd+j][sfb];
+        energy = nrgAddSaturate(energy, sfbEnergy->Short[wnd+j][sfb]);
       }
       sfbEnergy->Long[i++] = energy;
     }
@@ -213,7 +217,7 @@
       FIXP_DBL energy = sfbEnergyMS->Short[wnd][sfb];
       for (j=1; j<groupLen[grp]; j++)
       {
-        energy += sfbEnergyMS->Short[wnd+j][sfb];
+        energy = nrgAddSaturate(energy, sfbEnergyMS->Short[wnd+j][sfb]);
       }
       sfbEnergyMS->Long[i++] = energy;
     }
@@ -231,7 +235,7 @@
       FIXP_DBL energy = sfbSpreadEnergy->Short[wnd][sfb];
       for (j=1; j<groupLen[grp]; j++)
       {
-         energy += sfbSpreadEnergy->Short[wnd+j][sfb];
+         energy = nrgAddSaturate(energy, sfbSpreadEnergy->Short[wnd+j][sfb]);
       }
       sfbSpreadEnergy->Long[i++] = energy;
     }
diff --git a/libAACenc/src/qc_main.cpp b/libAACenc/src/qc_main.cpp
index 749398a..d7e76c7 100644
--- a/libAACenc/src/qc_main.cpp
+++ b/libAACenc/src/qc_main.cpp
@@ -797,7 +797,7 @@
 {
   int i, c;
   AAC_ENCODER_ERROR ErrorStatus = AAC_ENC_OK;
-  INT avgTotalDynBits = 0; /* maximal allowd dynamic bits for all frames */
+  INT avgTotalDynBits = 0; /* maximal allowed dynamic bits for all frames */
   INT totalAvailableBits = 0;
   INT nSubFrames = 1;
 
@@ -1092,7 +1092,7 @@
                 int sumBitsConsumedTotal = FDKaacEnc_getTotalConsumedBits(qcOut, qcElement, cm, hQC->globHdrBits, nSubFrames);
 
                 /* in all frames are valid dynamic bits */
-                if (sumBitsConsumedTotal < totalAvailableBits && (decreaseBitConsumption==1) && checkMinFrameBitsDemand(qcOut,hQC->minBitsPerFrame,nSubFrames)
+                if ( ((sumBitsConsumedTotal < totalAvailableBits) || qcOut[c]->usedDynBits==0) && (decreaseBitConsumption==1) && checkMinFrameBitsDemand(qcOut,hQC->minBitsPerFrame,nSubFrames)
                       /*()*/  )
                 {
                     quantizationDone = 1; /* exit bit adjustment */
@@ -1365,42 +1365,54 @@
   QC_OUT_EXTENSION fillExtPayload;
   INT totFillBits, alignBits;
 
-  {
-    int exactTpBits;
-    int max_iter = 3;
+  /* Get total consumed bits in AU */
+  qcOut->totalBits = qcOut->staticBits + qcOut->usedDynBits  + qcOut->totFillBits +
+                     qcOut->elementExtBits + qcOut->globalExtBits;
 
-    /* Get total consumed bits in AU */
-    qcOut->totalBits = qcOut->staticBits + qcOut->usedDynBits  + qcOut->totFillBits +
-                       qcOut->elementExtBits + qcOut->globalExtBits;
+  if (qcKernel->bitrateMode==QCDATA_BR_MODE_CBR) {
 
     /* Now we can get the exact transport bit amount, and hopefully it is equal to the estimated value */
-    exactTpBits = transportEnc_GetStaticBits(hTpEnc, qcOut->totalBits);
+    INT exactTpBits = transportEnc_GetStaticBits(hTpEnc, qcOut->totalBits);
 
     if (exactTpBits != qcKernel->globHdrBits) {
       INT diffFillBits = 0;
 
+      /* How many bits can be taken by bitreservoir */
+      const INT bitresSpace = qcKernel->bitResTotMax - (qcKernel->bitResTot + (qcOut->grantedDynBits - (qcOut->usedDynBits + qcOut->totFillBits) ) );
+
       /* Number of bits which can be moved to bitreservoir. */
-      INT bitsToBitres = qcKernel->globHdrBits - exactTpBits;
+      const INT bitsToBitres = qcKernel->globHdrBits - exactTpBits;
+      FDK_ASSERT(bitsToBitres>=0); /* is always positive */
 
-      if (bitsToBitres>0) {
-        /* if bitreservoir can not take all bits, move ramaining bits to fillbits */
-        diffFillBits = FDKmax(0, bitsToBitres - (qcKernel->bitResTotMax-qcKernel->bitResTot));
-      }
-      else if (bitsToBitres<0) {
-        /* if bits mus be taken from bitreservoir, reduce fillbits first. */
-        diffFillBits = (FDKmax(FDKmax(bitsToBitres, -qcKernel->bitResTot), -qcOut->totFillBits));
-      }
+      /* If bitreservoir can not take all bits, move ramaining bits to fillbits */
+      diffFillBits = FDKmax(0, bitsToBitres - bitresSpace);
 
-      diffFillBits = (diffFillBits+7)&~7; /* assure previous alignment */
+      /* Assure previous alignment */
+      diffFillBits = (diffFillBits+7)&~7;
 
+      /* Move as many bits as possible to bitreservoir */
+      qcKernel->bitResTot    += (bitsToBitres-diffFillBits);
+
+      /* Write remaing bits as fill bits */
       qcOut->totFillBits     += diffFillBits;
       qcOut->totalBits       += diffFillBits;
       qcOut->grantedDynBits  += diffFillBits;
 
-      /* new header bits */
+      /* Get new header bits */
       qcKernel->globHdrBits = transportEnc_GetStaticBits(hTpEnc, qcOut->totalBits);
+
+      if (qcKernel->globHdrBits != exactTpBits) {
+        /* In previous step, fill bits and corresponding total bits were changed when bitreservoir was completely filled.
+           Now we can take the too much taken bits caused by header overhead from bitreservoir.
+         */
+        qcKernel->bitResTot -= (qcKernel->globHdrBits - exactTpBits);
+      }
     }
-  }
+
+  } /* MODE_CBR */
+
+  /* Update exact number of consumed header bits. */
+  qcKernel->globHdrBits = transportEnc_GetStaticBits(hTpEnc, qcOut->totalBits);
 
   /* Save total fill bits and distribut to alignment and fill bits */
   totFillBits = qcOut->totFillBits;
diff --git a/libAACenc/src/quantize.cpp b/libAACenc/src/quantize.cpp
index dc85a6d..a1698a8 100644
--- a/libAACenc/src/quantize.cpp
+++ b/libAACenc/src/quantize.cpp
@@ -127,10 +127,7 @@
       accu = fMultDiv2(FDKaacEnc_mTab_3_4[tabIndex],FDKaacEnc_quantTableE[totalShift&3]);
       totalShift = (16-4)-(3*(totalShift>>2));
       FDK_ASSERT(totalShift >=0); /* MAX_QUANT_VIOLATION */
-      if (totalShift < 32)
-          accu>>=totalShift;
-      else
-          accu = 0;
+      accu>>=totalShift;
       quaSpectrum[line] = (SHORT)(-((LONG)(k + accu) >> (DFRACT_BITS-1-16)));
     }
     else if(accu > FL2FXCONST_DBL(0.0f))
@@ -143,10 +140,7 @@
       accu = fMultDiv2(FDKaacEnc_mTab_3_4[tabIndex],FDKaacEnc_quantTableE[totalShift&3]);
       totalShift = (16-4)-(3*(totalShift>>2));
       FDK_ASSERT(totalShift >=0); /* MAX_QUANT_VIOLATION */
-      if (totalShift < 32)
-          accu>>=totalShift;
-      else
-          accu = 0;
+      accu>>=totalShift;
       quaSpectrum[line] = (SHORT)((LONG)(k + accu) >> (DFRACT_BITS-1-16));
     }
     else
@@ -319,6 +313,9 @@
                  &mdctSpectrum[i],
                  &quantSpectrum[i]);
 
+    if (fAbs(quantSpectrum[i])>MAX_QUANT) {
+      return FL2FXCONST_DBL(0.0f);
+    }
     /* inverse quantization */
     FDKaacEnc_invQuantizeLines(gain,1,&quantSpectrum[i],&invQuantSpec);
 
@@ -361,15 +358,22 @@
   FIXP_DBL invQuantSpec;
   FIXP_DBL diff;
 
-  *en   = FL2FXCONST_DBL(0.0f);
-  *dist = FL2FXCONST_DBL(0.0f);
+  FIXP_DBL energy = FL2FXCONST_DBL(0.0f);
+  FIXP_DBL distortion = FL2FXCONST_DBL(0.0f);
 
   for (i=0; i<noOfLines; i++) {
+
+    if (fAbs(quantSpectrum[i])>MAX_QUANT) {
+      *en   = FL2FXCONST_DBL(0.0f);
+      *dist = FL2FXCONST_DBL(0.0f);
+      return;
+    }
+
     /* inverse quantization */
     FDKaacEnc_invQuantizeLines(gain,1,&quantSpectrum[i],&invQuantSpec);
 
     /* energy */
-    *en += fPow2(invQuantSpec);
+    energy += fPow2(invQuantSpec);
 
     /* dist */
     diff = fixp_abs(fixp_abs(invQuantSpec) - fixp_abs(mdctSpectrum[i]>>1));
@@ -382,10 +386,10 @@
 
     diff = scaleValue(diff, -scale);
 
-    *dist += diff;
+    distortion += diff;
   }
 
-  *en   = CalcLdData(*en)+FL2FXCONST_DBL(0.03125f);
-  *dist = CalcLdData(*dist);
+  *en   = CalcLdData(energy)+FL2FXCONST_DBL(0.03125f);
+  *dist = CalcLdData(distortion);
 }
 
diff --git a/libFDK/include/common_fix.h b/libFDK/include/common_fix.h
index 83d4ba3..a39548e 100644
--- a/libFDK/include/common_fix.h
+++ b/libFDK/include/common_fix.h
@@ -225,7 +225,6 @@
 FDK_INLINE FIXP_SGL fAbs(FIXP_SGL x)
                 { return fixabs_S(x); }
 
-
 /* workaround for TI C6x compiler but not for TI ARM9E compiler */
 #if (!defined(__TI_COMPILER_VERSION__) || defined(__TI_TMS470_V5__)) && !defined(__x86_64__)
 FDK_INLINE INT  fAbs(INT x)
@@ -336,7 +335,6 @@
 FDK_INLINE FIXP_SGL fMax(FIXP_SGL a, FIXP_SGL b)
                 { return fixmax_S(a,b); }
 
-
 /* workaround for TI C6x compiler but not for TI ARM9E */
 #if ((!defined(__TI_COMPILER_VERSION__) || defined(__TI_TMS470_V5__)) && !defined(__x86_64__)) || (FIX_FRACT == 1)
 FDK_INLINE INT fMax(INT a, INT b)
diff --git a/libFDK/include/mips/cplx_mul.h b/libFDK/include/mips/cplx_mul.h
index 4e8f26f..e0781dd 100644
--- a/libFDK/include/mips/cplx_mul.h
+++ b/libFDK/include/mips/cplx_mul.h
@@ -108,9 +108,20 @@
                           FIXP_DBL  b_Im)
 {
    INT result;
-   result = (((long long)a_Re * b_Re) - ((long long) a_Im * b_Im)) >> 32;
+
+   __asm__ ("mult %[a_Re], %[b_Re];\n"
+            "msub %[a_Im], %[b_Im];\n"
+       : "=hi"(result)
+       : [a_Re]"r"(a_Re), [b_Re]"r"(b_Re),  [a_Im]"r"(a_Im), [b_Im]"r"(b_Im)
+       : "lo");
+
    *c_Re = result;
-   result = (((long long)a_Re * b_Im) - ((long long) a_Im * b_Re)) >> 32;
+
+   __asm__ ("mult %[a_Re], %[b_Im];\n"
+            "madd %[a_Im], %[b_Re];\n"
+       : "=hi"(result)
+       : [a_Re]"r"(a_Re), [b_Im]"r"(b_Im), [a_Im]"r"(a_Im), [b_Re]"r"(b_Re)
+       : "lo");
    *c_Im = result;
 }
 #endif
@@ -124,9 +135,18 @@
                       FIXP_DBL  b_Im)
 {
    INT result;
-   result = (((long long)a_Re * b_Re) - ((long long) a_Im * b_Im)) >> 32;
+   __asm__ ("mult %[a_Re], %[b_Re];\n"
+            "msub %[a_Im], %[b_Im];\n"
+        : "=hi"(result)
+        : [a_Re]"r"(a_Re), [b_Re]"r"(b_Re), [a_Im]"r"(a_Im), [b_Im]"r"(b_Im)
+        : "lo");
    *c_Re = result<<1;
-   result = (((long long)a_Re * b_Im) - ((long long) a_Im * b_Re)) >> 32;
+
+   __asm__ ("mult %[a_Re], %[b_Im];\n"
+            "madd %[a_Im], %[b_Re];\n"
+        : "=hi"(result)
+        : [a_Re]"r"(a_Re), [b_Im]"r"(b_Im), [a_Im]"r"(a_Im), [b_Re]"r"(b_Re)
+        : "lo");
    *c_Im = result<<1;
 }
 #endif
diff --git a/libFDK/include/mips/fixmul_mips.h b/libFDK/include/mips/fixmul_mips.h
index 0e7af0d..4fb72f7 100644
--- a/libFDK/include/mips/fixmul_mips.h
+++ b/libFDK/include/mips/fixmul_mips.h
@@ -100,8 +100,14 @@
 
 inline INT fixmuldiv2_DD (const INT a, const INT b)
 {
+  INT result ;
 
-  return ((long long) a * b) >> 32;
+  asm ("mult %1,%2;\n"
+	     : "=hi" (result)
+	     : "d" (a), "r" (b)
+             : "lo");
+
+  return result ;
 }
 
 #endif /* (__GNUC__) && defined(__mips__) */
diff --git a/libFDK/include/scale.h b/libFDK/include/scale.h
index fcb6c48..d60ed2c 100644
--- a/libFDK/include/scale.h
+++ b/libFDK/include/scale.h
@@ -148,12 +148,20 @@
 {
   if(scalefactor > 0) {
     if (fNorm(value) < scalefactor && value != (FIXP_DBL)0) {
-      return (FIXP_DBL)MAXVAL_DBL;
+      if (value > (FIXP_DBL)0) {
+        return (FIXP_DBL)MAXVAL_DBL;
+      } else {
+        return (FIXP_DBL)MINVAL_DBL;
+      }
     } else {
       return (value<<scalefactor);
     }
   } else {
+    if (-(DFRACT_BITS-1) > scalefactor) {
+      return (FIXP_DBL)0;
+    } else {
     return (value>>(-scalefactor));
+    }
   }
 }
 #endif
diff --git a/libFDK/src/FDK_core.cpp b/libFDK/src/FDK_core.cpp
index 37d88ee..98a051f 100644
--- a/libFDK/src/FDK_core.cpp
+++ b/libFDK/src/FDK_core.cpp
@@ -93,7 +93,7 @@
 /* FDK tools library info */
 #define FDK_TOOLS_LIB_VL0 2
 #define FDK_TOOLS_LIB_VL1 2
-#define FDK_TOOLS_LIB_VL2 6
+#define FDK_TOOLS_LIB_VL2 7
 #define FDK_TOOLS_LIB_TITLE "FDK Tools"
 #define FDK_TOOLS_LIB_BUILD_DATE __DATE__
 #define FDK_TOOLS_LIB_BUILD_TIME __TIME__
diff --git a/libFDK/src/qmf.cpp b/libFDK/src/qmf.cpp
index e410f55..314b9fe 100644
--- a/libFDK/src/qmf.cpp
+++ b/libFDK/src/qmf.cpp
@@ -1040,7 +1040,8 @@
 
   h_Qmf->outScalefactor = ALGORITHMIC_SCALING_IN_ANALYSIS_FILTERBANK + ALGORITHMIC_SCALING_IN_SYNTHESIS_FILTERBANK + h_Qmf->filterScale;
 
-  if (h_Qmf->p_stride == 2) {
+  if ( (h_Qmf->p_stride == 2)
+    || ((flags & QMF_FLAG_CLDFB) && (no_channels == 32)) ) {
     h_Qmf->outScalefactor -= 1;
   }
   h_Qmf->outGain = (FIXP_DBL)0x80000000; /* default init value will be not applied */
@@ -1147,7 +1148,8 @@
   /* Add internal filterbank scale */
   outScalefactor += ALGORITHMIC_SCALING_IN_ANALYSIS_FILTERBANK + ALGORITHMIC_SCALING_IN_SYNTHESIS_FILTERBANK + synQmf->filterScale;
 
-  if (synQmf->p_stride == 2) {
+  if ( (synQmf->p_stride == 2)
+    || ((synQmf->flags & QMF_FLAG_CLDFB) && (synQmf->no_channels == 32)) ) {
     outScalefactor -= 1;
   }
 
diff --git a/libSBRdec/src/sbr_dec.cpp b/libSBRdec/src/sbr_dec.cpp
index 208120c..5a8b320 100644
--- a/libSBRdec/src/sbr_dec.cpp
+++ b/libSBRdec/src/sbr_dec.cpp
@@ -581,7 +581,7 @@
       outScalefactor += (SCAL_HEADROOM+1); /* psDiffScale! */
 
     {
-      C_ALLOC_SCRATCH_START(pWorkBuffer, FIXP_DBL, 2*(64));
+      C_AALLOC_SCRATCH_START(pWorkBuffer, FIXP_DBL, 2*(64));
 
       int maxShift = 0;
 
@@ -682,7 +682,7 @@
                               synQmf->lsb,
                               synQmf->no_col );
 
-      C_ALLOC_SCRATCH_END(pWorkBuffer, FIXP_DBL, 2*(64));
+      C_AALLOC_SCRATCH_END(pWorkBuffer, FIXP_DBL, 2*(64));
     }
   }
 
diff --git a/libSBRenc/src/env_est.cpp b/libSBRenc/src/env_est.cpp
index 9423f27..a9a7881 100644
--- a/libSBRenc/src/env_est.cpp
+++ b/libSBRenc/src/env_est.cpp
@@ -536,13 +536,18 @@
   \return void
 
 ****************************************************************************/
-static FIXP_DBL
-nmhLoweringEnergy(FIXP_DBL nrg, FIXP_DBL nrgSum, INT M)
+static FIXP_DBL nmhLoweringEnergy(
+        FIXP_DBL nrg,
+        const FIXP_DBL nrgSum,
+        const INT nrgSum_scale,
+        const INT M
+        )
 {
   if (nrg>FL2FXCONST_DBL(0)) {
     int sc=0;
     /* gain = nrgSum / (nrg*(M+1)) */
     FIXP_DBL gain = fMult(fDivNorm(nrgSum, nrg, &sc), GetInvInt(M+1));
+    sc += nrgSum_scale;
 
     /* reduce nrg if gain smaller 1.f */
     if ( !((sc>=0) && ( gain > ((FIXP_DBL)MAXVAL_DBL>>sc) )) ) {
@@ -616,6 +621,7 @@
 
     FIXP_DBL pNrgLeft[QMF_MAX_TIME_SLOTS];
     FIXP_DBL pNrgRight[QMF_MAX_TIME_SLOTS];
+    int envNrg_scale;
     FIXP_DBL envNrgLeft  = FL2FXCONST_DBL(0.0f);
     FIXP_DBL envNrgRight = FL2FXCONST_DBL(0.0f);
     int      missingHarmonic[QMF_MAX_TIME_SLOTS];
@@ -625,6 +631,7 @@
     stop_pos = timeStep * frame_info->borders[i + 1];
     freq_res = frame_info->freqRes[i];
     no_of_bands = h_con->nSfb[freq_res];
+    envNrg_scale = DFRACT_BITS-fNormz((FIXP_DBL)no_of_bands);
 
     if (i == short_env) {
       stop_pos -= fixMax(2, timeStep);  /* consider at least 2 QMF slots less for short envelopes (envelopes just before transients) */
@@ -762,9 +769,8 @@
       /* save energies */
       pNrgLeft[j]  = nrgLeft;
       pNrgRight[j] = nrgRight;
-      envNrgLeft  += nrgLeft;
-      envNrgRight += nrgRight;
-
+      envNrgLeft  += (nrgLeft>>envNrg_scale);
+      envNrgRight += (nrgRight>>envNrg_scale);
     } /* j */
 
     for (j = 0; j < no_of_bands; j++) {
@@ -777,9 +783,9 @@
       if(!missingHarmonic[j] && h_sbr->fLevelProtect) {
         /* in case of missing energy in base band,
            reduce reference energy to prevent overflows in decoder output */
-        nrgLeft = nmhLoweringEnergy(nrgLeft, envNrgLeft, no_of_bands);
+        nrgLeft = nmhLoweringEnergy(nrgLeft, envNrgLeft, envNrg_scale, no_of_bands);
         if (stereoMode == SBR_COUPLING) {
-          nrgRight = nmhLoweringEnergy(nrgRight, envNrgRight, no_of_bands);
+          nrgRight = nmhLoweringEnergy(nrgRight, envNrgRight, envNrg_scale, no_of_bands);
         }
       }
 
diff --git a/libSBRenc/src/sbr_encoder.cpp b/libSBRenc/src/sbr_encoder.cpp
index 0dcc1b2..e991199 100644
--- a/libSBRenc/src/sbr_encoder.cpp
+++ b/libSBRenc/src/sbr_encoder.cpp
@@ -103,7 +103,7 @@
 
 #define SBRENCODER_LIB_VL0 3
 #define SBRENCODER_LIB_VL1 2
-#define SBRENCODER_LIB_VL2 1
+#define SBRENCODER_LIB_VL2 2
 
 
 
diff --git a/libSBRenc/src/sbr_rom.cpp b/libSBRenc/src/sbr_rom.cpp
index 6fd51a2..c8b945f 100644
--- a/libSBRenc/src/sbr_rom.cpp
+++ b/libSBRenc/src/sbr_rom.cpp
@@ -588,7 +588,7 @@
   { 100000,160001, 44100, 1, 13,13,11,11,  2, 0, 3, SBR_MONO, 1 }, /* backwards compatible */
 
   /* 48/96 kHz dual rate */  /* not yet finally tuned */
-  {  24000, 36000, 48000, 1,  4, 4, 9, 9,  2, 0, 3, SBR_MONO, 3 }, /* lowest range (multichannel rear) */
+  {  32000, 36000, 48000, 1,  4, 4, 9, 9,  2, 0, 3, SBR_MONO, 3 }, /* lowest range (multichannel rear) */
   {  36000, 60000, 48000, 1,  7, 7,10,10,  2, 0, 3, SBR_MONO, 2 }, /* nominal: 40 */
   {  60000, 72000, 48000, 1,  9, 9,10,10,  2, 0, 3, SBR_MONO, 1 }, /* nominal: 64 */
   {  72000,100000, 48000, 1, 11,11,11,11,  2, 0, 3, SBR_MONO, 1 }, /* nominal: 80 */
@@ -671,7 +671,7 @@
   { 144000,256001, 44100, 2, 13,13,11,11,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* backwards compatible */
 
   /* 48/96 kHz dual rate */  /* not yet finally tuned */
-  {  32000, 60000, 48000, 2,  4, 4, 9, 9,  2, 0, -3, SBR_SWITCH_LRC, 3 }, /* lowest range (multichannel rear) */
+  {  36000, 60000, 48000, 2,  4, 4, 9, 9,  2, 0, -3, SBR_SWITCH_LRC, 3 }, /* lowest range (multichannel rear) */
   {  60000, 80000, 48000, 2,  7, 7, 9, 9,  3, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 64 */
   {  80000,112000, 48000, 2,  9, 9,10,10,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 96 */
   { 112000,144000, 48000, 2, 11,11,11,11,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 128 */
@@ -680,9 +680,6 @@
   /** AAC LOW DELAY SECTION **/
 
   /* 22.05/44.1 kHz dual rate */
-  {  8000, 11369,  22050, 1,  1, 1, 1, 1,  1, 0, 6, SBR_MONO, 3 }, /* nominal:  8 kbit/s */ /**changed (not changed !!)*/
-  { 11369, 16000,  22050, 1,  1, 0, 3, 3,  1, 0, 6, SBR_MONO, 3 }, /* nominal: 12 kbit/s */
-  { 16000, 18000,  22050, 1,  2, 4, 4, 3,  1, 0, 6, SBR_MONO, 3 }, /* nominal: 16 kbit/s */
   { 18000, 22000,  22050, 1,  4, 4, 5, 5,  2, 0, 6, SBR_MONO, 2 }, /* nominal: 20 kbit/s */
   { 22000, 28000,  22050, 1,  4, 4, 6, 5,  2, 0, 6, SBR_MONO, 2 }, /* nominal: 24 kbit/s */
   { 28000, 36000,  22050, 1,  7, 8, 8, 8,  2, 0, 3, SBR_MONO, 2 }, /* nominal: 32 kbit/s */
@@ -691,10 +688,7 @@
   { 52000, 64001,  22050, 1, 12,11,11,11,  2, 0, 3, SBR_MONO, 1 }, /* nominal: 56 kbit/s */
 
   /* 24/48 kHz dual rate */
-  {  8000, 12000,  24000, 1,  1, 1, 1, 1,  1, 0, 6, SBR_MONO, 3 }, /* nominal:  8 kbit/s */ /**changed (not changed !!)*/
-  { 12000, 16000,  24000, 1,  1, 0, 3, 3,  1, 0, 6, SBR_MONO, 3 }, /* nominal: 12 kbit/s */
-  { 16000, 18000,  24000, 1,  2, 4, 4, 3,  1, 0, 6, SBR_MONO, 3 }, /* nominal: 16 kbit/s */
-  { 18000, 22000,  24000, 1,  4, 4, 5, 5,  2, 0, 6, SBR_MONO, 2 }, /* nominal: 20 kbit/s */
+  { 20000, 22000,  24000, 1,  4, 4, 5, 5,  2, 0, 6, SBR_MONO, 2 }, /* nominal: 20 kbit/s */
   { 22000, 28000,  24000, 1,  4, 4, 6, 5,  2, 0, 6, SBR_MONO, 2 }, /* nominal: 24 kbit/s */
   { 28000, 36000,  24000, 1,  6, 8, 8, 8,  2, 0, 3, SBR_MONO, 2 }, /* nominal: 32 kbit/s */
   { 36000, 44000,  24000, 1,  8, 9, 9, 9,  2, 0, 3, SBR_MONO, 1 }, /* nominal: 40 kbit/s */
@@ -702,8 +696,6 @@
   { 52000, 64001,  24000, 1, 13,11,11,10,  2, 0, 3, SBR_MONO, 1 }, /* nominal: 48 kbit/s */
 
   /* 22.05/44.1 kHz dual rate */
-  { 24000, 28000,  22050, 2,  3, 2, 5, 4,  1, 0, -3, SBR_SWITCH_LRC, 3 }, /* nominal: 24 kbit/s */
-  { 28000, 32000,  22050, 2,  3, 2, 7, 6,  2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 28 kbit/s */
   { 32000, 36000,  22050, 2,  5, 4, 7, 6,  2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 32 kbit/s */
   { 36000, 44000,  22050, 2,  5, 8, 8, 8,  2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 40 kbit/s */
   { 44000, 52000,  22050, 2,  7,10, 8, 8,  3, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 48 kbit/s */
@@ -713,8 +705,7 @@
   { 82000,128001,  22050, 2, 13,12,11,11,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 80 kbit/s */
 
   /* 24/48 kHz dual rate */
-  { 24000, 28000,  24000, 2,  3, 3, 5, 5,  1, 0, -3, SBR_SWITCH_LRC, 3 }, /* nominal: 24 kbit/s */
-  { 28000, 36000,  24000, 2,  5, 4, 7, 6,  2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 32 kbit/s */
+  { 32000, 36000,  24000, 2,  5, 4, 7, 6,  2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 32 kbit/s */
   { 36000, 44000,  24000, 2,  4, 8, 8, 8,  2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 40 kbit/s */
   { 44000, 52000,  24000, 2,  6,10, 8, 8,  3, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 48 kbit/s */
   { 52000, 60000,  24000, 2,  9,11, 9, 9,  3, 0, -3, SBR_SWITCH_LRC, 1 }, /* nominal: 56 kbit/s */
diff --git a/libSBRenc/src/sbr_rom.h b/libSBRenc/src/sbr_rom.h
index 4cd1ba5..e79a730 100644
--- a/libSBRenc/src/sbr_rom.h
+++ b/libSBRenc/src/sbr_rom.h
@@ -119,8 +119,8 @@
 extern const UCHAR         bookSbrNoiseBalanceL11T[25];
 
 #define SBRENC_AACLC_TUNING_SIZE   124
-#define SBRENC_AACELD_TUNING_SIZE   35
-#define SBRENC_AACELD2_TUNING_SIZE  31
+#define SBRENC_AACELD_TUNING_SIZE   (26)
+#define SBRENC_AACELD2_TUNING_SIZE  (26)
 
 #define SBRENC_TUNING_SIZE (SBRENC_AACLC_TUNING_SIZE + SBRENC_AACELD_TUNING_SIZE)
 
diff --git a/libSYS/include/genericStds.h b/libSYS/include/genericStds.h
index 756935b..2d6eea6 100644
--- a/libSYS/include/genericStds.h
+++ b/libSYS/include/genericStds.h
@@ -96,6 +96,8 @@
 
 #include "machine_type.h"
 
+/* Work around for broken android toolchain: sys/types.h:137: error: 'uint64_t' does not name a type */
+#define _SYS_TYPES_H_
 
 
 /* Always increase verbosity of memory allocation in case of a debug built. DEBUG is defined globally in that case. */
diff --git a/libSYS/include/machine_type.h b/libSYS/include/machine_type.h
index d04a8e8..b5642b2 100644
--- a/libSYS/include/machine_type.h
+++ b/libSYS/include/machine_type.h
@@ -173,7 +173,7 @@
 
 
 /* Define 64 bit base integer type. */
-#ifdef _MSC_VER
+#ifdef _WIN32
   typedef __int64 INT64;
   typedef unsigned __int64 UINT64;
 #else
diff --git a/libSYS/src/cmdl_parser.cpp b/libSYS/src/cmdl_parser.cpp
index bf020ee..a93a2f4 100644
--- a/libSYS/src/cmdl_parser.cpp
+++ b/libSYS/src/cmdl_parser.cpp
@@ -92,6 +92,9 @@
 
 #define _CRT_SECURE_NO_WARNINGS
 
+/* Work around for broken android toolchain: sys/types.h:137: error: 'uint64_t' does not name a type */
+#define _SYS_TYPES_H_
+
 #include <stdarg.h>
 #include <stdio.h>
 #include <string.h>