From edab3e30d68dc47ad8e4fabcca78b62dbd930d4c Mon Sep 17 00:00:00 2001
From: Fraunhofer IIS FDK <audio-fdk@iis.fraunhofer.de>
Date: Fri, 17 Apr 2020 15:11:03 +0200
Subject: Overcome SBR encoder coupling quality issue in ELD.

Bug 177604812
Test: see SBR/PS encoder

Change-Id: Ie7b9f8d1dec3708557d1e1189d45bc0e3bf5444c
---
 libSBRenc/src/env_est.cpp     | 22 +++++++++++++++-------
 libSBRenc/src/sbr_encoder.cpp |  5 ++---
 2 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/libSBRenc/src/env_est.cpp b/libSBRenc/src/env_est.cpp
index 0eb8425..cc8780a 100644
--- a/libSBRenc/src/env_est.cpp
+++ b/libSBRenc/src/env_est.cpp
@@ -1,7 +1,7 @@
 /* -----------------------------------------------------------------------------
 Software License for The Fraunhofer FDK AAC Codec Library for Android
 
-© Copyright  1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
+© Copyright  1995 - 2020 Fraunhofer-Gesellschaft zur Förderung der angewandten
 Forschung e.V. All rights reserved.
 
  1.    INTRODUCTION
@@ -1267,6 +1267,7 @@ void FDKsbrEnc_extractSbrEnvelope2(
     sbrExtrEnv->pre_transient_info[1] = ed->transient_info[1]; /* tran_flag */
     hEnvChan->encEnvData.noOfEnvelopes = ed->nEnvelopes =
         ed->frame_info->nEnvelopes; /* number of envelopes of current frame */
+    hEnvChan->encEnvData.currentAmpResFF = (AMP_RES)h_con->initAmpResFF;
 
     /*
       Check if the current frame is divided into one envelope only. If so, set
@@ -1274,8 +1275,9 @@ void FDKsbrEnc_extractSbrEnvelope2(
     */
     if ((hEnvChan->encEnvData.hSbrBSGrid->frameClass == FIXFIX) &&
         (ed->nEnvelopes == 1)) {
+      AMP_RES currentAmpResFF = SBR_AMP_RES_1_5;
       if (h_con->sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) {
-        /* Note: global_tonaliy_float_value ==
+        /* Note: global_tonality_float_value ==
            ((float)hEnvChan->encEnvData.global_tonality/((INT64)(1)<<(31-(19+2)))/0.524288*(2.0/3.0)));
                  threshold_float_value ==
            ((float)h_con->thresholdAmpResFF_m/((INT64)(1)<<(31-(h_con->thresholdAmpResFF_e)))/0.524288*(2.0/3.0)));
@@ -1289,14 +1291,13 @@ void FDKsbrEnc_extractSbrEnvelope2(
         } else {
           hEnvChan->encEnvData.currentAmpResFF = SBR_AMP_RES_3_0;
         }
-      } else
-        hEnvChan->encEnvData.currentAmpResFF = SBR_AMP_RES_1_5;
+        currentAmpResFF = hEnvChan->encEnvData.currentAmpResFF;
+      }
 
-      if (hEnvChan->encEnvData.currentAmpResFF !=
-          hEnvChan->encEnvData.init_sbr_amp_res) {
+      if (currentAmpResFF != hEnvChan->encEnvData.init_sbr_amp_res) {
         FDKsbrEnc_InitSbrHuffmanTables(
             &hEnvChan->encEnvData, &hEnvChan->sbrCodeEnvelope,
-            &hEnvChan->sbrCodeNoiseFloor, hEnvChan->encEnvData.currentAmpResFF);
+            &hEnvChan->sbrCodeNoiseFloor, currentAmpResFF);
       }
     } else {
       if (sbrHeaderData->sbr_amp_res != hEnvChan->encEnvData.init_sbr_amp_res) {
@@ -1355,6 +1356,13 @@ void FDKsbrEnc_extractSbrEnvelope2(
     }
   }
 
+  if (h_con->sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY &&
+      stereoMode == SBR_SWITCH_LRC &&
+      h_envChan[0]->encEnvData.currentAmpResFF !=
+          h_envChan[1]->encEnvData.currentAmpResFF) {
+    stereoMode = SBR_LEFT_RIGHT;
+  }
+
   /*
     Extract envelope of current frame.
   */
diff --git a/libSBRenc/src/sbr_encoder.cpp b/libSBRenc/src/sbr_encoder.cpp
index df9e996..9f1ede2 100644
--- a/libSBRenc/src/sbr_encoder.cpp
+++ b/libSBRenc/src/sbr_encoder.cpp
@@ -1,7 +1,7 @@
 /* -----------------------------------------------------------------------------
 Software License for The Fraunhofer FDK AAC Codec Library for Android
 
-© Copyright  1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
+© Copyright  1995 - 2020 Fraunhofer-Gesellschaft zur Förderung der angewandten
 Forschung e.V. All rights reserved.
 
  1.    INTRODUCTION
@@ -1450,8 +1450,6 @@ static INT initEnvChannel(HANDLE_SBR_CONFIG_DATA sbrConfigData,
                                     params->deltaTAcrossFrames, 0, 0))
     return (1);
 
-  sbrConfigData->initAmpResFF = params->init_amp_res_FF;
-
   if (FDKsbrEnc_InitSbrHuffmanTables(&hEnv->encEnvData, &hEnv->sbrCodeEnvelope,
                                      &hEnv->sbrCodeNoiseFloor,
                                      sbrHeaderData->sbr_amp_res))
@@ -1749,6 +1747,7 @@ static INT FDKsbrEnc_EnvInit(HANDLE_SBR_ELEMENT hSbrElement,
     hSbrElement->sbrHeaderData.sbr_data_extra = 1;
 
   hSbrElement->sbrHeaderData.sbr_amp_res = (AMP_RES)params->amp_res;
+  hSbrElement->sbrConfigData.initAmpResFF = params->init_amp_res_FF;
 
   /* header_extra_1 */
   hSbrElement->sbrHeaderData.freqScale = params->freqScale;
-- 
cgit v1.2.3