Merge pi-platform-release to stage-aosp-master - DO NOT MERGE

Change-Id: I040acde299d9f3e7556a2dd9393080aabfa20936
diff --git a/Android.bp b/Android.bp
index 50cc092..b322d07 100644
--- a/Android.bp
+++ b/Android.bp
@@ -22,6 +22,7 @@
         "-Wno-#warnings",
         "-Wuninitialized",
         "-Wno-self-assign",
+        "-Wno-implicit-fallthrough",
     ],
     sanitize: {
         misc_undefined:["unsigned-integer-overflow", "signed-integer-overflow"],
diff --git a/libAACdec/src/aacdecoder_lib.cpp b/libAACdec/src/aacdecoder_lib.cpp
index d98cf5a..ea52bb5 100644
--- a/libAACdec/src/aacdecoder_lib.cpp
+++ b/libAACdec/src/aacdecoder_lib.cpp
@@ -368,6 +368,23 @@
   return errTp;
 }
 
+static INT aacDecoder_SbrCallback(
+    void *handle, HANDLE_FDK_BITSTREAM hBs, const INT sampleRateIn,
+    const INT sampleRateOut, const INT samplesPerFrame,
+    const AUDIO_OBJECT_TYPE coreCodec, const MP4_ELEMENT_ID elementID,
+    const INT elementIndex, const UCHAR harmonicSBR,
+    const UCHAR stereoConfigIndex, const UCHAR configMode, UCHAR *configChanged,
+    const INT downscaleFactor) {
+  HANDLE_SBRDECODER self = (HANDLE_SBRDECODER)handle;
+
+  INT errTp = sbrDecoder_Header(self, hBs, sampleRateIn, sampleRateOut,
+                                samplesPerFrame, coreCodec, elementID,
+                                elementIndex, harmonicSBR, stereoConfigIndex,
+                                configMode, configChanged, downscaleFactor);
+
+  return errTp;
+}
+
 static INT aacDecoder_SscCallback(void *handle, HANDLE_FDK_BITSTREAM hBs,
                                   const AUDIO_OBJECT_TYPE coreCodec,
                                   const INT samplingRate,
@@ -959,7 +976,7 @@
     goto bail;
   }
   aacDec->qmfModeUser = NOT_DEFINED;
-  transportDec_RegisterSbrCallback(aacDec->hInput, (cbSbr_t)sbrDecoder_Header,
+  transportDec_RegisterSbrCallback(aacDec->hInput, aacDecoder_SbrCallback,
                                    (void *)aacDec->hSbrDecoder);
 
   if (mpegSurroundDecoder_Open(
diff --git a/libFDK/src/FDK_decorrelate.cpp b/libFDK/src/FDK_decorrelate.cpp
index 8e665b7..c5de79a 100644
--- a/libFDK/src/FDK_decorrelate.cpp
+++ b/libFDK/src/FDK_decorrelate.cpp
@@ -1086,8 +1086,9 @@
     pb = SpatialDecGetProcessingBand(maxHybBand, self->mapHybBands2ProcBands);
     for (qs = startHybBand; qs <= maxHybBand; qs++) {
       pb = SpatialDecGetProcessingBand(qs, self->mapHybBands2ProcBands);
-      energy[pb] +=
-          (fPow2Div2(inputReal[qs] << clz) + fPow2Div2(inputImag[qs] << clz));
+      energy[pb] =
+          fAddSaturate(energy[pb], fPow2Div2(inputReal[qs] << clz) +
+                                       fPow2Div2(inputImag[qs] << clz));
     }
     pb++;
 
@@ -1100,7 +1101,7 @@
       FIXP_DBL nrg = 0;
       qs_next = (int)self->qs_next[pb];
       for (; qs < qs_next; qs++) {
-        nrg += fPow2Div2(inputReal[qs] << clz);
+        nrg = fAddSaturate(nrg, fPow2Div2(inputReal[qs] << clz));
       }
       energy[pb] = nrg;
     }
@@ -1138,13 +1139,14 @@
 #else
     for (qs = startHybBand; qs <= maxHybBand; qs++) {
       int pb = SpatialDecGetProcessingBand(qs, self->mapHybBands2ProcBands);
-      energy[pb] +=
-          (fPow2Div2(inputReal[qs] << clz) + fPow2Div2(inputImag[qs] << clz));
+      energy[pb] =
+          fAddSaturate(energy[pb], fPow2Div2(inputReal[qs] << clz) +
+                                       fPow2Div2(inputImag[qs] << clz));
     }
 
     for (; qs <= maxHybridBand; qs++) {
       int pb = SpatialDecGetProcessingBand(qs, self->mapHybBands2ProcBands);
-      energy[pb] += fPow2Div2(inputReal[qs] << clz);
+      energy[pb] = fAddSaturate(energy[pb], fPow2Div2(inputReal[qs] << clz));
     }
 #endif /* FUNCTION_DuckerCalcEnergy_func4 */
   }
@@ -1237,9 +1239,9 @@
 
       tmp1 = scaleValue(tmp1, scaleSmoothDirRevNrg_asExponent);
       tmp2 = scaleValue(tmp2, scaleSmoothDirRevNrg_asExponent);
-      tmp1 = fMultAddDiv2(tmp1, directNrg[pb] >> scaleDirectNrg,
+      tmp1 = fMultAddDiv2(tmp1, scaleValue(directNrg[pb], -scaleDirectNrg),
                           DUCK_ONE_MINUS_ALPHA_X4_FDK);
-      tmp2 = fMultAddDiv2(tmp2, reverbNrg[pb] >> scaleReverbNrg,
+      tmp2 = fMultAddDiv2(tmp2, scaleValue(reverbNrg[pb], -scaleReverbNrg),
                           DUCK_ONE_MINUS_ALPHA_X4_FDK);
     } else {
       tmp1 = fMultAddDiv2(tmp1, directNrg[pb], DUCK_ONE_MINUS_ALPHA_X4_FDK);