LCOV - code coverage report
Current view: top level - lib_enc - igf_enc.c (source / functions) Hit Total Coverage
Test: Coverage on main @ 6baab0c613aa6c7100498ed7b93676aa8198a493 Lines: 712 719 99.0 %
Date: 2025-05-28 04:28:20 Functions: 27 27 100.0 %

          Line data    Source code
       1             : /******************************************************************************************************
       2             : 
       3             :    (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
       4             :    Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
       5             :    Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
       6             :    Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
       7             :    contributors to this repository. All Rights Reserved.
       8             : 
       9             :    This software is protected by copyright law and by international treaties.
      10             :    The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
      11             :    Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
      12             :    Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
      13             :    Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
      14             :    contributors to this repository retain full ownership rights in their respective contributions in
      15             :    the software. This notice grants no license of any kind, including but not limited to patent
      16             :    license, nor is any license granted by implication, estoppel or otherwise.
      17             : 
      18             :    Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
      19             :    contributions.
      20             : 
      21             :    This software is provided "AS IS", without any express or implied warranties. The software is in the
      22             :    development stage. It is intended exclusively for experts who have experience with such software and
      23             :    solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
      24             :    and fitness for a particular purpose are hereby disclaimed and excluded.
      25             : 
      26             :    Any dispute, controversy or claim arising under or in relation to providing this software shall be
      27             :    submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
      28             :    accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
      29             :    the United Nations Convention on Contracts on the International Sales of Goods.
      30             : 
      31             : *******************************************************************************************************/
      32             : 
      33             : /*====================================================================================
      34             :     EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0
      35             :   ====================================================================================*/
      36             : 
      37             : #include <assert.h>
      38             : #include <stdint.h>
      39             : #include "options.h"
      40             : #ifdef DEBUGGING
      41             : #include "debug.h"
      42             : #endif
      43             : #include <math.h>
      44             : #include "prot.h"
      45             : #include "ivas_prot.h"
      46             : #include "cnst.h"
      47             : #include "stat_enc.h"
      48             : #include "wmc_auto.h"
      49             : #ifdef DEBUG_PLOT
      50             : #include "deb_out.h"
      51             : #endif
      52             : 
      53             : 
      54             : /*-------------------------------------------------------------------*
      55             :  * IGF_write_bit()
      56             :  *
      57             :  * write single bit to stream
      58             :  *-------------------------------------------------------------------*/
      59             : 
      60   106551021 : static void IGF_write_bit(
      61             :     BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */
      62             :     int16_t *bitCount,     /* i/o: bit counter              */
      63             :     const int16_t value    /* i  : value                    */
      64             : )
      65             : {
      66   106551021 :     if ( hBstr )
      67             :     {
      68    53926609 :         push_next_indice( hBstr, value, 1 );
      69             :     }
      70             : 
      71   106551021 :     ( *bitCount )++;
      72             : 
      73   106551021 :     return;
      74             : }
      75             : 
      76             : 
      77             : /*-------------------------------------------------------------------*
      78             :  * IGF_write_bits()
      79             :  *
      80             :  * write bits to stream
      81             :  *-------------------------------------------------------------------*/
      82             : 
      83    89439647 : static void IGF_write_bits(
      84             :     BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */
      85             :     int16_t *bitCount,     /* i/o: bit counter              */
      86             :     const int16_t value,   /* i/o: value                    */
      87             :     int16_t bits           /* i  : number of bits           */
      88             : )
      89             : {
      90   178879294 :     while ( bits-- )
      91             :     {
      92    89439647 :         IGF_write_bit( hBstr, bitCount, ( ( value & ( 1 << bits ) ) == 0 ) ? 0 : 1 );
      93             :     }
      94             : 
      95    89439647 :     return;
      96             : }
      97             : 
      98             : 
      99             : /*-------------------------------------------------------------------*
     100             :  * IGF_getCrest_new()
     101             :  *
     102             :  * crest factor calculation
     103             :  *-------------------------------------------------------------------*/
     104             : 
     105             : /*! r: crest factor */
     106    83352468 : static float IGF_getCrest_new(
     107             :     const int16_t *logSpec, /* i  : power spectrum           */
     108             :     const int16_t start,    /* i  : start subband index      */
     109             :     const int16_t stop      /* i  : stop subband index       */
     110             : )
     111             : {
     112             :     int16_t i;
     113             :     int16_t x;
     114    83352468 :     int32_t x_eff = 0;
     115    83352468 :     int16_t x_max = 0;
     116    83352468 :     float crest = 1.f;
     117             : 
     118  5520753782 :     for ( i = start; i < stop; i++ )
     119             :     {
     120  5437401314 :         x = logSpec[i];
     121  5437401314 :         x_eff += x * x;
     122             : 
     123  5437401314 :         if ( x > x_max )
     124             :         {
     125   246725229 :             x_max = x;
     126             :         }
     127             :     }
     128             : 
     129    83352468 :     x_eff /= ( stop - start );
     130             : 
     131    83352468 :     if ( x_eff > 0 && x_max > 0 )
     132             :     {
     133    70136953 :         crest = max( 1.f, (float) x_max / sqrtf( (float) x_eff ) );
     134             :     }
     135             : 
     136    83352468 :     return crest;
     137             : }
     138             : 
     139             : 
     140             : /*-------------------------------------------------------------------*
     141             :  * IGF_getSFM_new()
     142             :  *
     143             :  * calculates spectral flatness measurement
     144             :  *-------------------------------------------------------------------*/
     145             : 
     146             : /*! r: SFM value */
     147    83352468 : static float IGF_getSFM_new(
     148             :     const float *powerSpectrum, /* i  : power spectrum            */
     149             :     const int16_t *logSpec,     /* i  : log of power spectrum     */
     150             :     const int16_t start,        /* i  : start subband index       */
     151             :     const int16_t stop          /* i  : stop subband index        */
     152             : )
     153             : {
     154             :     int16_t n;
     155             :     int16_t i;
     156             :     int16_t num;
     157             :     float denom;
     158             :     float numf;
     159             :     float tmp;
     160             :     float sfm;
     161             : 
     162    83352468 :     num = 0;
     163    83352468 :     denom = 1.f;
     164    83352468 :     sfm = 1.f;
     165             : 
     166  5520753782 :     for ( i = start; i < stop; i++ )
     167             :     {
     168  5437401314 :         tmp = powerSpectrum[i];
     169  5437401314 :         n = logSpec[i /*-start*/];
     170  5437401314 :         num += n;
     171  5437401314 :         denom += tmp;
     172             :     }
     173             : 
     174    83352468 :     numf = (float) num / (float) ( stop - start );
     175    83352468 :     denom /= (float) ( stop - start );
     176             : 
     177    83352468 :     if ( denom != 0 )
     178             :     {
     179    83352468 :         sfm = min( ( powf( 2.0f, numf + 0.5f ) / denom ), 1.0f );
     180             :     }
     181             : 
     182    83352468 :     return sfm;
     183             : }
     184             : 
     185             : 
     186             : /*-------------------------------------------------------------------*
     187             :  * IGF_getTilt()
     188             :  *
     189             :  * calculates spectral tilt
     190             :  *-------------------------------------------------------------------*/
     191             : 
     192             : /*! r: spectral tilt value */
     193      156050 : static float IGF_getTilt(
     194             :     const float *powerSpectrum, /* i  : energies               */
     195             :     const int16_t start,        /* i  : start subband index    */
     196             :     const int16_t stop          /* i  : stop subband index     */
     197             : )
     198             : {
     199             :     int16_t i;
     200             :     int16_t x;
     201             :     int16_t width;
     202             :     float y;
     203             :     float mean_x, mean_y, mean_xy, mean_x2;
     204             :     float slope;
     205             : 
     206      156050 :     x = 1;
     207      156050 :     mean_x = mean_y = mean_xy = mean_x2 = 0.f;
     208             : 
     209      156050 :     width = stop - start;
     210     9105622 :     for ( i = start; i < stop; i++ )
     211             :     {
     212     8949572 :         mean_x += x;
     213     8949572 :         mean_x2 += x * x;
     214     8949572 :         y = 20.f * log10f( max( 1.f, powerSpectrum[i] ) );
     215     8949572 :         mean_y += y;
     216     8949572 :         mean_xy += y * x;
     217             : 
     218     8949572 :         x++;
     219             :     }
     220      156050 :     mean_y /= width;
     221      156050 :     mean_x /= width;
     222      156050 :     mean_xy /= width;
     223      156050 :     mean_x2 /= width;
     224      156050 :     slope = ( mean_xy - mean_x * mean_y ) / ( mean_x2 - mean_x * mean_x );
     225             : 
     226      156050 :     return slope;
     227             : }
     228             : 
     229             : 
     230             : /*-------------------------------------------------------------------*
     231             :  * IGF_getTNR()
     232             :  *
     233             :  * calculates tonal-to-noise ratio
     234             :  *-------------------------------------------------------------------*/
     235             : 
     236             : /*! r: spectral tilt value */
     237      175696 : static float IGF_getTNR(
     238             :     const float *powerSpectrum, /* i  : energies               */
     239             :     const int16_t start,        /* i  : start subband index    */
     240             :     const int16_t stop,         /* i  : stop subband index     */
     241             :     const float adap            /* i  : SFB width adaptation   */
     242             : )
     243             : {
     244             :     int16_t i;
     245             :     int16_t width;
     246      175696 :     float avg = 0.f;
     247      175696 :     float tonal = 0.f;
     248      175696 :     float noise = EPSILON;
     249             :     float tonalToNoise;
     250             :     float rootSpec[300];
     251             : 
     252      175696 :     set_f( rootSpec, 0, 300 );
     253             : 
     254      175696 :     width = stop - start;
     255    10140676 :     for ( i = start; i < stop; i++ )
     256             :     {
     257     9964980 :         rootSpec[i - start] = sqrtf( powerSpectrum[i] );
     258     9964980 :         avg += rootSpec[i - start];
     259             :     }
     260      175696 :     avg /= width;
     261             : 
     262    10140676 :     for ( i = start; i < stop; i++ )
     263             :     {
     264     9964980 :         float normSpec = rootSpec[i - start] / avg;
     265     9964980 :         if ( normSpec > 1 + adap )
     266             :         {
     267      851880 :             tonal += rootSpec[i - start];
     268             :         }
     269     9113100 :         else if ( normSpec < 1 )
     270             :         {
     271     7962221 :             noise += rootSpec[i - start];
     272             :         }
     273             :     }
     274             : 
     275      175696 :     tonalToNoise = 20.f * log10f( max( 1e-018f, tonal / noise ) );
     276             : 
     277      175696 :     return tonalToNoise;
     278             : }
     279             : 
     280             : 
     281             : /*-------------------------------------------------------------------*
     282             :  * IGF_getCrest()
     283             :  *
     284             :  * crest factor calculation
     285             :  *-------------------------------------------------------------------*/
     286             : 
     287             : /*! r: crest factor */
     288    16349110 : static float IGF_getCrest(
     289             :     const float *powerSpectrum, /* i  : power spectrum          */
     290             :     const int16_t start,        /* i  : start subband index     */
     291             :     const int16_t stop          /* i  : stop subband index      */
     292             : )
     293             : {
     294             :     int16_t i;
     295             :     int16_t x;
     296    16349110 :     int32_t x_eff = 0;
     297    16349110 :     int16_t x_max = 0;
     298    16349110 :     float crest = 1.f;
     299             : 
     300   886012918 :     for ( i = start; i < stop; i++ )
     301             :     {
     302   869663808 :         x = max( 0, (int16_t) ( logf( max( FLT_MIN, powerSpectrum[i] ) ) * INV_LOG_2 ) );
     303   869663808 :         x_eff += x * x;
     304             : 
     305   869663808 :         if ( x > x_max )
     306             :         {
     307    50350912 :             x_max = x;
     308             :         }
     309             :     }
     310             : 
     311    16349110 :     x_eff /= ( stop - start );
     312             : 
     313    16349110 :     if ( x_eff > 0 && x_max > 0 )
     314             :     {
     315    15174775 :         crest = max( 1.f, (float) x_max / sqrtf( (float) x_eff ) );
     316             :     }
     317             : 
     318    16349110 :     return crest;
     319             : }
     320             : 
     321             : 
     322             : /*-------------------------------------------------------------------*
     323             :  * IGF_getSFM()
     324             :  *
     325             :  * calculates spectral flatness measurement
     326             :  *-------------------------------------------------------------------*/
     327             : 
     328             : /*! r: SFM value */
     329    16349110 : static float IGF_getSFM(
     330             :     const float *powerSpectrum, /* i  : energies                */
     331             :     const int16_t start,        /* i  : start subband index     */
     332             :     const int16_t stop          /* i  : stop subband index      */
     333             : )
     334             : {
     335             :     int16_t n;
     336             :     int16_t i;
     337             :     int16_t num;
     338             :     float denom;
     339             :     float numf;
     340             :     float tmp;
     341             :     float sfm;
     342             : 
     343    16349110 :     num = 0;
     344    16349110 :     denom = 1.f;
     345    16349110 :     sfm = 1.f;
     346             : 
     347   886012918 :     for ( i = start; i < stop; i++ )
     348             :     {
     349   869663808 :         tmp = powerSpectrum[i];
     350   869663808 :         n = max( 0, (int16_t) ( logf( max( FLT_MIN, tmp ) ) * INV_LOG_2 ) );
     351   869663808 :         num += n;
     352   869663808 :         denom += tmp;
     353             :     }
     354             : 
     355    16349110 :     numf = (float) num / (float) ( stop - start );
     356    16349110 :     denom /= (float) ( stop - start );
     357             : 
     358    16349110 :     if ( denom != 0 )
     359             :     {
     360    16349110 :         sfm = min( ( powf( 2.0f, numf + 0.5f ) / denom ), 1.0f );
     361             :     }
     362             : 
     363    16349110 :     return sfm;
     364             : }
     365             : 
     366             : 
     367             : /*-------------------------------------------------------------------*
     368             :  * IGF_CalculateEnvelope()
     369             :  *
     370             :  * envelope estimation
     371             :  *-------------------------------------------------------------------*/
     372             : 
     373     6905107 : static void IGF_CalculateEnvelope(
     374             :     const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i  : instance handle of IGF Encoder                  */
     375             :     const float *pMDCTSpectrum,            /* i  : MDCT spectrum                                   */
     376             :     const float *pPowerSpectrum,           /* i  : MDCT^2 + MDST^2 spectrum, or estimate           */
     377             :     const int16_t igfGridIdx,              /* i  : IGF grid index                                  */
     378             :     const int16_t isTransient,             /* i  : flag indicating if transient is detected        */
     379             :     const int16_t last_core_acelp,         /* i  : indicator if last frame was ACELP core          */
     380             :     const int16_t element_mode,            /* i  : IVAS element_mode                               */
     381             :     const float att                        /* i  : attenuation                                     */
     382             : )
     383             : {
     384             :     IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData;
     385             :     H_IGF_GRID hGrid;
     386             :     int16_t *swb_offset;
     387             :     int16_t sfb;   /* this is the actual scalefactor band */
     388             :     int16_t width; /* this is width in subbands of the actual scalefactor band */
     389             :     int16_t tile_idx;
     390             :     int16_t strt_cpy;
     391             :     float gain; /* the gain which has to be applied to the source tile to get the destination energy */
     392             :     int16_t sb;
     393             :     float sfbEnergyR;
     394             :     float sfbEnergyC; /* the energy of the destination region of the tile */
     395             :     float sfbEnergyTileR;
     396             :     float sfbEnergyTileC; /* the energy of the destination region of the tile */
     397             :     int16_t tmp;
     398             :     float tmp_tb;
     399             :     float tmp_sb;
     400             :     int16_t sfbCnt;
     401             : 
     402     6905107 :     hPrivateData = &hIGFEnc->igfData;
     403     6905107 :     hGrid = &hPrivateData->igfInfo.grid[(int16_t) igfGridIdx];
     404     6905107 :     swb_offset = hGrid->swb_offset;
     405             : 
     406     6905107 :     if ( element_mode > EVS_MONO )
     407             :     {
     408     6884045 :         if ( igfGridIdx != IGF_GRID_LB_NORM )
     409             :         {
     410     2229692 :             for ( sfbCnt = 0; sfbCnt < hGrid->sfbWrap[hGrid->nTiles] - hGrid->sfbWrap[0]; sfbCnt++ )
     411             :             {
     412             :                 /* reset filter */
     413     1881561 :                 hPrivateData->prevSFM_FIR_SFB_TB[sfbCnt] = 0.f;
     414     1881561 :                 hPrivateData->prevSFM_IIR_SFB_TB[sfbCnt] = 0.f;
     415     1881561 :                 hPrivateData->prevSFM_FIR_SFB_SB[sfbCnt] = 0.f;
     416     1881561 :                 hPrivateData->prevSFM_IIR_SFB_SB[sfbCnt] = 0.f;
     417     1881561 :                 hPrivateData->prevDampingFactor_IIR[sfbCnt] = -1.f;
     418     1881561 :                 hPrivateData->dampingFactorSmoothing[sfbCnt] = 2;
     419             :             }
     420             :         }
     421             :     }
     422             : 
     423     6905107 :     if ( pPowerSpectrum )
     424             :     {
     425  3332174437 :         for ( sb = hGrid->sbWrap[0]; sb < swb_offset[hGrid->sfbWrap[hGrid->nTiles]]; sb++ )
     426             :         {
     427  3325989826 :             hPrivateData->logSpec[sb] = max( 0, (int16_t) ( log( max( FLT_MIN, pPowerSpectrum[sb] ) ) * INV_LOG_2 ) );
     428             :         }
     429             :     }
     430             : 
     431    33671400 :     for ( tile_idx = 0; tile_idx < hGrid->nTiles; tile_idx++ )
     432             :     {
     433    26766293 :         strt_cpy = hGrid->sbWrap[tile_idx];
     434             : 
     435    66213998 :         for ( sfb = hGrid->sfbWrap[tile_idx]; sfb < hGrid->sfbWrap[tile_idx + 1]; sfb++ )
     436             :         {
     437    39447705 :             width = swb_offset[sfb + 1] - swb_offset[sfb];
     438             : 
     439    39447705 :             sfbEnergyTileR = EPSILON;
     440    39447705 :             sfbEnergyTileC = EPSILON;
     441    39447705 :             sfbEnergyC = EPSILON;
     442             : 
     443    39447705 :             if ( pPowerSpectrum )
     444             :             {
     445    35711406 :                 tmp = strt_cpy;
     446  2003434588 :                 for ( sb = swb_offset[sfb]; sb < swb_offset[sfb + 1]; sb++ )
     447             :                 {
     448  1967723182 :                     sfbEnergyC += pPowerSpectrum[sb];
     449  1967723182 :                     sfbEnergyTileR += pMDCTSpectrum[strt_cpy] * pMDCTSpectrum[strt_cpy];
     450  1967723182 :                     sfbEnergyTileC += pPowerSpectrum[strt_cpy];
     451             : 
     452  1967723182 :                     strt_cpy++;
     453             :                 }
     454             : 
     455    35711406 :                 sfbEnergyTileR /= width;
     456    35711406 :                 gain = (float) ( sfbEnergyTileR * ( sfbEnergyC / sfbEnergyTileC ) );
     457             : 
     458    35711406 :                 if ( element_mode > EVS_MONO )
     459             :                 {
     460    35596326 :                     if ( !isTransient )
     461             :                     {
     462             :                         float diffSFM;
     463    35528358 :                         float shiftedSFM = 0.f;
     464             : 
     465    35528358 :                         tmp_tb = IGF_getSFM_new( pPowerSpectrum, hPrivateData->logSpec, swb_offset[sfb], swb_offset[sfb + 1] ) / IGF_getCrest_new( hPrivateData->logSpec, swb_offset[sfb], swb_offset[sfb + 1] );
     466    35528358 :                         tmp_sb = IGF_getSFM_new( pPowerSpectrum, hPrivateData->logSpec, tmp, strt_cpy ) / IGF_getCrest_new( hPrivateData->logSpec, tmp, strt_cpy );
     467             : 
     468    35528358 :                         if ( last_core_acelp || hPrivateData->wasTransient )
     469             :                         {
     470     1178460 :                             hPrivateData->prevSFM_FIR_SFB_TB[sfb] = hPrivateData->prevSFM_IIR_SFB_TB[sfb] = tmp_tb;
     471     1178460 :                             hPrivateData->prevSFM_FIR_SFB_SB[sfb] = hPrivateData->prevSFM_IIR_SFB_SB[sfb] = tmp_sb;
     472             :                         }
     473             : 
     474    35528358 :                         hPrivateData->SFM_tb[sfb] = tmp_tb + hPrivateData->prevSFM_FIR_SFB_TB[sfb] + 0.5f * hPrivateData->prevSFM_IIR_SFB_TB[sfb];
     475    35528358 :                         hPrivateData->SFM_tb[sfb] = min( 2.7f, hPrivateData->SFM_tb[sfb] );
     476    35528358 :                         hPrivateData->SFM_sb[sfb] = tmp_sb + hPrivateData->prevSFM_FIR_SFB_SB[sfb] + 0.5f * hPrivateData->prevSFM_IIR_SFB_SB[sfb];
     477    35528358 :                         hPrivateData->SFM_sb[sfb] = min( 2.7f, hPrivateData->SFM_sb[sfb] );
     478             : 
     479    35528358 :                         diffSFM = hPrivateData->SFM_sb[sfb] - hPrivateData->SFM_tb[sfb];
     480             : 
     481    35528358 :                         if ( diffSFM > 0.f && hPrivateData->SFM_tb[sfb] < 0.1f ) /* check whether target SFB is more tonal than source SFB */
     482      156050 :                         {
     483             :                             float currDampingFactor, dampingFactor;
     484             :                             float slope, threshold;
     485             :                             float tonalToNoise, adap;
     486             :                             float alpha;
     487             : 
     488             :                             /* calculate spectral tilt to detect sudden drops (or increases) in energy in the current SFB */
     489      156050 :                             slope = IGF_getTilt( pPowerSpectrum, swb_offset[sfb], swb_offset[sfb + 1] );
     490             : 
     491             :                             /* determine whether strong tilt is due to a step in the spectrum (e.g. band limitation, no damping)
     492             :                                or a tonal component close the band border (apply damping) by calculating SFM for a shift of 1/2 SFB width*/
     493      156050 :                             threshold = 60.f / ( (float) width );
     494      156050 :                             if ( slope < -threshold )
     495             :                             {
     496        8339 :                                 int16_t shift = width >> 1;
     497        8339 :                                 shiftedSFM = IGF_getSFM_new( pPowerSpectrum, hPrivateData->logSpec, swb_offset[sfb] - shift, swb_offset[sfb + 1] - shift ) / IGF_getCrest_new( hPrivateData->logSpec, swb_offset[sfb] - shift, swb_offset[sfb + 1] - shift );
     498             :                             }
     499      147711 :                             else if ( ( slope > 1.f * threshold ) && ( sfb != hGrid->sfbWrap[hGrid->nTiles] - 1 ) )
     500             :                             {
     501        2611 :                                 int16_t shift = width >> 1;
     502        2611 :                                 shiftedSFM = IGF_getSFM_new( pPowerSpectrum, hPrivateData->logSpec, swb_offset[sfb] + shift, swb_offset[sfb + 1] + shift ) / IGF_getCrest_new( hPrivateData->logSpec, swb_offset[sfb] + shift, swb_offset[sfb + 1] + shift );
     503             :                             }
     504             : 
     505      156050 :                             if ( shiftedSFM > 0.04f )
     506             :                             {
     507        5767 :                                 currDampingFactor = 1.f;
     508             :                             }
     509             :                             else
     510             :                             {
     511      150283 :                                 alpha = min( 320.f / (float) swb_offset[sfb + 1], 1.25f );
     512      150283 :                                 currDampingFactor = expf( 1.25f * alpha * logf( hPrivateData->SFM_tb[sfb] / hPrivateData->SFM_sb[sfb] ) );
     513             : 
     514             : 
     515             :                                 /* calculate tonal-to-noise ratio and reduce damping for low values*/
     516      150283 :                                 adap = (float) width / 40.f;
     517      150283 :                                 tonalToNoise = IGF_getTNR( pPowerSpectrum, swb_offset[sfb], swb_offset[sfb + 1], adap );
     518      150283 :                                 if ( ( tonalToNoise - ( 10 + adap ) ) < 0 )
     519             :                                 {
     520      118174 :                                     currDampingFactor += 0.03f * ( ( 10 + adap ) - tonalToNoise );
     521             :                                 }
     522             :                             }
     523             : 
     524      156050 :                             if ( last_core_acelp || hPrivateData->wasTransient || hPrivateData->prevDampingFactor_IIR[sfb] == -1 )
     525             :                             {
     526       77587 :                                 hPrivateData->prevDampingFactor_IIR[sfb] = max( currDampingFactor, 0.1f );
     527             :                             }
     528      156050 :                             if ( last_core_acelp )
     529             :                             {
     530        5709 :                                 hPrivateData->dampingFactorSmoothing[sfb] = 2;
     531             :                             }
     532             : 
     533      156050 :                             dampingFactor = ( currDampingFactor + hPrivateData->prevDampingFactor_IIR[sfb] ) / 2;
     534             : 
     535      156050 :                             gain *= min( dampingFactor + hPrivateData->dampingFactorSmoothing[sfb] * 0.1f, 1 );
     536             : 
     537      156050 :                             hPrivateData->prevDampingFactor_IIR[sfb] = dampingFactor;
     538      156050 :                             if ( hPrivateData->dampingFactorSmoothing[sfb] > 0 )
     539             :                             {
     540       93887 :                                 hPrivateData->dampingFactorSmoothing[sfb]--;
     541             :                             }
     542             :                         }
     543             :                         else
     544             :                         {
     545    35372308 :                             hPrivateData->prevDampingFactor_IIR[sfb] = -1;
     546    35372308 :                             hPrivateData->dampingFactorSmoothing[sfb] = 1;
     547             :                         }
     548             : 
     549    35528358 :                         hPrivateData->prevSFM_FIR_SFB_TB[sfb] = tmp_tb;
     550    35528358 :                         hPrivateData->prevSFM_IIR_SFB_TB[sfb] = hPrivateData->SFM_tb[sfb];
     551    35528358 :                         hPrivateData->prevSFM_FIR_SFB_SB[sfb] = tmp_sb;
     552    35528358 :                         hPrivateData->prevSFM_IIR_SFB_SB[sfb] = hPrivateData->SFM_sb[sfb];
     553             :                     }
     554             :                     else
     555             :                     {
     556       67968 :                         hPrivateData->prevSFM_FIR_SFB_TB[sfb] = 0.f;
     557       67968 :                         hPrivateData->prevSFM_IIR_SFB_TB[sfb] = 0.f;
     558       67968 :                         hPrivateData->prevSFM_FIR_SFB_SB[sfb] = 0.f;
     559       67968 :                         hPrivateData->prevSFM_IIR_SFB_SB[sfb] = 0.f;
     560       67968 :                         hPrivateData->prevDampingFactor_IIR[sfb] = -1.f;
     561       67968 :                         hPrivateData->dampingFactorSmoothing[sfb] = 2;
     562             :                     }
     563             :                 }
     564             :             }
     565             :             else
     566             :             {
     567     3736299 :                 sfbEnergyR = EPSILON + sum2_f( pMDCTSpectrum + swb_offset[sfb], width ) / width;
     568     3736299 :                 gain = (float) ( sfbEnergyR );
     569             : 
     570     3736299 :                 if ( element_mode > EVS_MONO )
     571             :                 {
     572     3732073 :                     hPrivateData->prevSFM_FIR_SFB_TB[sfb] = 0.f;
     573     3732073 :                     hPrivateData->prevSFM_IIR_SFB_TB[sfb] = 0.f;
     574     3732073 :                     hPrivateData->prevSFM_FIR_SFB_SB[sfb] = 0.f;
     575     3732073 :                     hPrivateData->prevSFM_IIR_SFB_SB[sfb] = 0.f;
     576     3732073 :                     hPrivateData->prevDampingFactor_IIR[sfb] = -1.f;
     577     3732073 :                     hPrivateData->dampingFactorSmoothing[sfb] = 2;
     578             :                 }
     579             :             }
     580             : 
     581    39447705 :             gain *= att;
     582             : 
     583    39447705 :             gain = 0.5f + (float) ( 2.885390081777927f * logf( gain ) + 16.f );
     584    39447705 :             if ( !isTransient && ( hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_SWB_48000_CPE || hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_FB_48000_CPE ) )
     585             :             {
     586     6768653 :                 gain += 0.25f; /* better preservation of original HF band energy */
     587             :             }
     588    39447705 :             if ( !isTransient && ( hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_SWB_64000_CPE || hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_FB_64000_CPE ) )
     589             :             {
     590     8985304 :                 gain += 0.125f;
     591             :             }
     592    39447705 :             gain = min( gain, 91.f ); /* 13+15+63, see arithcode encode residual */
     593    39447705 :             gain = max( gain, 0.f );
     594             : 
     595    39447705 :             hPrivateData->igfScfQuantized[sfb] = (int16_t) ( gain );
     596             :         }
     597             :     }
     598             : 
     599     6905107 :     return;
     600             : }
     601             : 
     602             : 
     603             : /*-------------------------------------------------------------------*
     604             :  * IGF_CalculateStereoEnvelope()
     605             :  *
     606             :  * envelope estimation
     607             :  *-------------------------------------------------------------------*/
     608             : 
     609     1818534 : static void IGF_CalculateStereoEnvelope(
     610             :     const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i  : instance handle of IGF Encoder                   */
     611             :     const float *pMDCTSpectrum,            /* i  : MDCT spectrum                                    */
     612             :     const float *pMDCTSpectrumMsInv,       /* i  : MDCT spectrum                                    */
     613             :     const float *pPowerSpectrum,           /* i  : MDCT^2 + MDST^2 spectrum, or estimate            */
     614             :     const float *pPowerSpectrumMsInv,      /* i  : inverse power spectrum                           */
     615             :     const int16_t igfGridIdx,              /* i  : IGF grid index                                   */
     616             :     const int16_t coreMsMask[N_MAX],       /* i  : line wise ms Mask                                */
     617             :     const int16_t isTransient,             /* i  : flag indicating if transient is detected         */
     618             :     const int16_t last_core_acelp          /* i  : indicator if last frame was ACELP core           */
     619             : )
     620             : {
     621             :     IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData;
     622             :     H_IGF_GRID hGrid;
     623             :     int16_t *swb_offset;
     624             :     int16_t sfb;   /* this is the actual scalefactor band */
     625             :     int16_t width; /* this is width in subbands of the actual scalefactor band */
     626             :     int16_t tile_idx;
     627             :     int16_t strt_cpy;
     628             :     float gain; /* the gain which has to be applied to the source tile to get the destination energy */
     629             :     int16_t sb;
     630             :     float sfbEnergyR;
     631             :     float sfbEnergyC; /* the energy of the destination region of the tile */
     632             :     float sfbEnergyTileR;
     633             :     float sfbEnergyTileC; /* the energy of the destination region of the tile */
     634             :     int16_t tmp, x, y;
     635             :     float mean_x, mean_y, mean_xy, mean_x2;
     636             :     float slope;
     637             :     float tmp_tb;
     638             :     float tmp_sb;
     639             :     int16_t sfbCnt;
     640             :     float tileSrcSpec[MAX_IGF_SFB_LEN];
     641             : 
     642     1818534 :     hPrivateData = &hIGFEnc->igfData;
     643     1818534 :     hGrid = &hPrivateData->igfInfo.grid[(int16_t) igfGridIdx];
     644     1818534 :     swb_offset = hGrid->swb_offset;
     645             : 
     646     1818534 :     if ( igfGridIdx != IGF_GRID_LB_NORM )
     647             :     {
     648      470946 :         for ( sfbCnt = 0; sfbCnt < hGrid->sfbWrap[hGrid->nTiles] - hGrid->sfbWrap[0]; sfbCnt++ )
     649             :         {
     650             :             /* reset filter */
     651      389414 :             hPrivateData->prevSFM_FIR_SFB_TB[sfbCnt] = 0.f;
     652      389414 :             hPrivateData->prevSFM_IIR_SFB_TB[sfbCnt] = 0.f;
     653      389414 :             hPrivateData->prevSFM_FIR_SFB_SB[sfbCnt] = 0.f;
     654      389414 :             hPrivateData->prevSFM_IIR_SFB_SB[sfbCnt] = 0.f;
     655             :         }
     656             :     }
     657             : 
     658     1818534 :     if ( pPowerSpectrum )
     659             :     {
     660   762588190 :         for ( sb = hGrid->sbWrap[0]; sb < swb_offset[hGrid->sfbWrap[hGrid->nTiles]]; sb++ )
     661             :         {
     662   761065648 :             hPrivateData->logSpec[sb] = max( 0, (int16_t) ( logf( max( FLT_MIN, pPowerSpectrum[sb] ) ) * INV_LOG_2 ) );
     663             :         }
     664             :     }
     665             : 
     666     7739964 :     for ( tile_idx = 0; tile_idx < hGrid->nTiles; tile_idx++ )
     667             :     {
     668     5921430 :         strt_cpy = hGrid->sbWrap[tile_idx];
     669             : 
     670    15662406 :         for ( sfb = hGrid->sfbWrap[tile_idx]; sfb < hGrid->sfbWrap[tile_idx + 1]; sfb++ )
     671             :         {
     672     9740976 :             width = swb_offset[sfb + 1] - swb_offset[sfb];
     673     9740976 :             sfbEnergyTileR = EPSILON;
     674     9740976 :             sfbEnergyTileC = EPSILON;
     675     9740976 :             sfbEnergyC = EPSILON;
     676             : 
     677     9740976 :             if ( pPowerSpectrum )
     678             :             {
     679     8174256 :                 tmp = strt_cpy;
     680             : 
     681   442992016 :                 for ( sb = swb_offset[sfb]; sb < swb_offset[sfb + 1]; sb++ )
     682             :                 {
     683   434817760 :                     if ( coreMsMask[sb] != coreMsMask[strt_cpy] )
     684             :                     {
     685   271528936 :                         sfbEnergyC += pPowerSpectrum[sb];
     686   271528936 :                         sfbEnergyTileR += pMDCTSpectrumMsInv[strt_cpy] * pMDCTSpectrumMsInv[strt_cpy];
     687   271528936 :                         sfbEnergyTileC += pPowerSpectrumMsInv[strt_cpy];
     688   271528936 :                         tileSrcSpec[strt_cpy - tmp] = pPowerSpectrumMsInv[strt_cpy];
     689             :                     }
     690             :                     else
     691             :                     {
     692   163288824 :                         sfbEnergyC += pPowerSpectrum[sb];
     693   163288824 :                         sfbEnergyTileR += pMDCTSpectrum[strt_cpy] * pMDCTSpectrum[strt_cpy];
     694   163288824 :                         sfbEnergyTileC += pPowerSpectrum[strt_cpy];
     695   163288824 :                         tileSrcSpec[strt_cpy - tmp] = pPowerSpectrum[strt_cpy];
     696             :                     }
     697   434817760 :                     strt_cpy++;
     698             :                 }
     699             : 
     700     8174256 :                 sfbEnergyTileR /= width;
     701     8174256 :                 gain = (float) ( sfbEnergyTileR * ( sfbEnergyC / sfbEnergyTileC ) );
     702             : 
     703     8174256 :                 if ( !isTransient )
     704             :                 {
     705             :                     float diffSFM;
     706     8174256 :                     float shiftedSFM = 0.f;
     707             : 
     708     8174256 :                     tmp_tb = IGF_getSFM( pPowerSpectrum, swb_offset[sfb], swb_offset[sfb + 1] ) / IGF_getCrest( pPowerSpectrum, swb_offset[sfb], swb_offset[sfb + 1] );
     709     8174256 :                     tmp_sb = IGF_getSFM( tileSrcSpec, 0, strt_cpy - tmp ) / IGF_getCrest( tileSrcSpec, 0, strt_cpy - tmp );
     710             : 
     711     8174256 :                     if ( last_core_acelp || hPrivateData->wasTransient )
     712             :                     {
     713      149817 :                         hPrivateData->prevSFM_FIR_SFB_TB[sfb] = hPrivateData->prevSFM_IIR_SFB_TB[sfb] = tmp_tb;
     714      149817 :                         hPrivateData->prevSFM_FIR_SFB_SB[sfb] = hPrivateData->prevSFM_IIR_SFB_SB[sfb] = tmp_sb;
     715             :                     }
     716             : 
     717     8174256 :                     hPrivateData->SFM_tb[sfb] = tmp_tb + hPrivateData->prevSFM_FIR_SFB_TB[sfb] + 0.5f * hPrivateData->prevSFM_IIR_SFB_TB[sfb];
     718     8174256 :                     hPrivateData->SFM_tb[sfb] = min( 2.7f, hPrivateData->SFM_tb[sfb] );
     719     8174256 :                     hPrivateData->SFM_sb[sfb] = tmp_sb + hPrivateData->prevSFM_FIR_SFB_SB[sfb] + 0.5f * hPrivateData->prevSFM_IIR_SFB_SB[sfb];
     720     8174256 :                     hPrivateData->SFM_sb[sfb] = min( 2.7f, hPrivateData->SFM_sb[sfb] );
     721             : 
     722     8174256 :                     diffSFM = hPrivateData->SFM_sb[sfb] - hPrivateData->SFM_tb[sfb];
     723             : 
     724     8174256 :                     if ( diffSFM > 0.f && hPrivateData->SFM_tb[sfb] < 0.1f ) /* check whether target SFB is more tonal than source SFB */
     725       25413 :                     {
     726             :                         float currDampingFactor, dampingFactor, threshold, alpha;
     727             : 
     728             :                         /* calculate spectral tilt to detect sudden drops (or increases) in energy in the current SFB */
     729       25413 :                         x = 1;
     730       25413 :                         mean_x = mean_y = mean_xy = mean_x2 = 0;
     731     1335201 :                         for ( sb = swb_offset[sfb]; sb < swb_offset[sfb + 1]; sb++ )
     732             :                         {
     733     1309788 :                             mean_x += x;
     734     1309788 :                             mean_x2 += x * x;
     735     1309788 :                             y = 20 * (int16_t) log10f( max( 1e-018f, pPowerSpectrum[sb] ) );
     736     1309788 :                             mean_y += y;
     737     1309788 :                             mean_xy += y * x;
     738             : 
     739     1309788 :                             x++;
     740             :                         }
     741       25413 :                         mean_y /= width;
     742       25413 :                         mean_x /= width;
     743       25413 :                         mean_xy /= width;
     744       25413 :                         mean_x2 /= width;
     745       25413 :                         slope = ( mean_xy - mean_x * mean_y ) / ( mean_x2 - mean_x * mean_x );
     746             : 
     747             :                         /* determine whether strong tilt is due to a step in the spectrum (e.g. band limitation, no damping)
     748             :                                or a tonal component close the band border (apply damping) by calculating SFM for a shift of 1/2 SFB width*/
     749       25413 :                         threshold = 60.f / ( (float) width );
     750       25413 :                         if ( slope < -threshold )
     751             :                         {
     752         494 :                             int16_t shift = width >> 1;
     753         494 :                             shiftedSFM = IGF_getSFM( pPowerSpectrum, swb_offset[sfb] - shift, swb_offset[sfb + 1] - shift ) / IGF_getCrest( pPowerSpectrum, swb_offset[sfb] - shift, swb_offset[sfb + 1] - shift );
     754             :                         }
     755       24919 :                         else if ( ( slope > 1.f * threshold ) && ( sfb != hGrid->sfbWrap[hGrid->nTiles] - 1 ) )
     756             :                         {
     757         104 :                             int16_t shift = width >> 1;
     758         104 :                             shiftedSFM = IGF_getSFM( pPowerSpectrum, swb_offset[sfb] + shift, swb_offset[sfb + 1] + shift ) / IGF_getCrest( pPowerSpectrum, swb_offset[sfb] + shift, swb_offset[sfb + 1] + shift );
     759             :                         }
     760             : 
     761       25413 :                         alpha = min( 320.f / (float) swb_offset[sfb + 1], 1.25f );
     762       25413 :                         currDampingFactor = expf( alpha * logf( hPrivateData->SFM_tb[sfb] / hPrivateData->SFM_sb[sfb] ) );
     763             : 
     764       25413 :                         if ( shiftedSFM > 0.04f )
     765             :                         {
     766         412 :                             currDampingFactor = 1.f;
     767             :                         }
     768             : 
     769       25413 :                         if ( last_core_acelp || hPrivateData->wasTransient || hPrivateData->prevDampingFactor_IIR[sfb] == -1 )
     770             :                         {
     771       12297 :                             hPrivateData->prevDampingFactor_IIR[sfb] = max( currDampingFactor, 0.1f );
     772             :                         }
     773             : 
     774             :                         {
     775             :                             float tonalToNoise;
     776       25413 :                             float adap = ( (float) width ) / 30.f;
     777       25413 :                             tonalToNoise = IGF_getTNR( pPowerSpectrum, swb_offset[sfb], swb_offset[sfb + 1], adap );
     778       25413 :                             if ( ( tonalToNoise - ( 10 + adap ) ) < 0 )
     779             :                             {
     780       21086 :                                 currDampingFactor += 0.1f * ( ( 10 + adap ) - tonalToNoise );
     781             :                             }
     782             :                         }
     783             : 
     784       25413 :                         dampingFactor = ( currDampingFactor + hPrivateData->prevDampingFactor_IIR[sfb] ) / 2;
     785       25413 :                         dampingFactor = max( dampingFactor, hPrivateData->prevDampingFactor_IIR[sfb] / 2 );
     786             : 
     787       25413 :                         gain *= min( dampingFactor + hPrivateData->dampingFactorSmoothing[sfb] * 0.1f, 1 );
     788             : 
     789       25413 :                         hPrivateData->prevDampingFactor_IIR[sfb] = dampingFactor;
     790       25413 :                         if ( hPrivateData->dampingFactorSmoothing[sfb] > 0 )
     791             :                         {
     792       14431 :                             hPrivateData->dampingFactorSmoothing[sfb]--;
     793             :                         }
     794             :                     }
     795             :                     else
     796             :                     {
     797     8148843 :                         hPrivateData->prevDampingFactor_IIR[sfb] = -1;
     798     8148843 :                         hPrivateData->dampingFactorSmoothing[sfb] = 1;
     799             :                     }
     800             : 
     801     8174256 :                     hPrivateData->prevSFM_FIR_SFB_TB[sfb] = tmp_tb;
     802     8174256 :                     hPrivateData->prevSFM_IIR_SFB_TB[sfb] = hPrivateData->SFM_tb[sfb];
     803     8174256 :                     hPrivateData->prevSFM_FIR_SFB_SB[sfb] = tmp_sb;
     804     8174256 :                     hPrivateData->prevSFM_IIR_SFB_SB[sfb] = hPrivateData->SFM_sb[sfb];
     805             :                 }
     806             :                 else
     807             :                 {
     808           0 :                     hPrivateData->prevSFM_FIR_SFB_TB[sfb] = 0.f;
     809           0 :                     hPrivateData->prevSFM_IIR_SFB_TB[sfb] = 0.f;
     810           0 :                     hPrivateData->prevSFM_FIR_SFB_SB[sfb] = 0.f;
     811           0 :                     hPrivateData->prevSFM_IIR_SFB_SB[sfb] = 0.f;
     812             : 
     813           0 :                     hPrivateData->dampingFactorSmoothing[sfb] = 2;
     814             :                 }
     815             :             }
     816             :             else
     817             :             {
     818     1566720 :                 sfbEnergyR = EPSILON + sum2_f( pMDCTSpectrum + swb_offset[sfb], width ) / width;
     819     1566720 :                 gain = (float) ( sfbEnergyR );
     820             : 
     821     1566720 :                 hPrivateData->prevSFM_FIR_SFB_TB[sfb] = 0.f;
     822     1566720 :                 hPrivateData->prevSFM_IIR_SFB_TB[sfb] = 0.f;
     823     1566720 :                 hPrivateData->prevSFM_FIR_SFB_SB[sfb] = 0.f;
     824     1566720 :                 hPrivateData->prevSFM_IIR_SFB_SB[sfb] = 0.f;
     825             :             }
     826             : 
     827     9740976 :             gain = 0.5f + (float) ( 2.885390081777927f * logf( gain ) + 16.f );
     828     9740976 :             if ( !isTransient && ( hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_SWB_48000_CPE || hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_FB_48000_CPE ) )
     829             :             {
     830     2617567 :                 gain += 0.25f; /* better preservation of original HF band energy */
     831             :             }
     832     9740976 :             if ( !isTransient && ( hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_SWB_64000_CPE || hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_FB_64000_CPE ) )
     833             :             {
     834     3020602 :                 gain += 0.125f;
     835             :             }
     836     9740976 :             gain = min( gain, 91.f ); /* 13+15+63, see arithcode encode residual */
     837     9740976 :             gain = max( gain, 0.f );
     838             : 
     839     9740976 :             hPrivateData->igfScfQuantized[sfb] = (int16_t) ( gain );
     840             :         }
     841             :     }
     842             : 
     843     1818534 :     return;
     844             : }
     845             : 
     846             : 
     847             : /*-------------------------------------------------------------------*
     848             :  * IGF_WriteEnvelope()
     849             :  *
     850             :  * writes IGF SCF values
     851             :  *-------------------------------------------------------------------*/
     852             : 
     853             : /*! r: number of bits writen */
     854    17111374 : static int16_t IGF_WriteEnvelope(
     855             :     const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i  : instance handle of IGF Encoder                                               */
     856             :     BSTR_ENC_HANDLE hBstr,                 /* i/o: encoder bitstream handle                                                     */
     857             :     int16_t *pBitOffset,                   /* i  : ptr to bitOffset counter                                                     */
     858             :     const int16_t igfGridIdx,              /* i  : igf grid index see declaration of IGF_GRID_IDX for details                   */
     859             :     const int16_t isIndepFlag,             /* i  : if 1 frame is independent, 0 = frame is coded with data from previous frame  */
     860             :     int16_t *igfAllZero                    /* i  : returns 1 if all IGF scfs are zero, else 0                                   */
     861             : )
     862             : {
     863             :     IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData;
     864             :     H_IGF_GRID hGrid;
     865             :     int16_t totBitCount;
     866             :     int16_t startBitCount;
     867             :     int16_t sfb;
     868             : 
     869    17111374 :     startBitCount = *pBitOffset;
     870    17111374 :     totBitCount = 0;
     871    17111374 :     *igfAllZero = 1;
     872    17111374 :     hPrivateData = &hIGFEnc->igfData;
     873    17111374 :     hGrid = &hPrivateData->igfInfo.grid[igfGridIdx];
     874             : 
     875    19984498 :     for ( sfb = hGrid->startSfb; sfb < hGrid->stopSfb; sfb++ )
     876             :     {
     877    19626588 :         if ( hPrivateData->igfScfQuantized[sfb] != 0 )
     878             :         {
     879    16753464 :             *igfAllZero = 0;
     880    16753464 :             break;
     881             :         }
     882             :     }
     883             : 
     884    17111374 :     if ( *igfAllZero )
     885             :     {
     886      357910 :         IGF_write_bit( hBstr, pBitOffset, 1 );
     887             : 
     888      357910 :         if ( hBstr == NULL )
     889             :         {
     890      178212 :             IGFSCFEncoderSaveContextState( &hPrivateData->hIGFSCFArithEnc, igfGridIdx );
     891             :         }
     892             : 
     893      357910 :         IGFSCFEncoderReset( &hPrivateData->hIGFSCFArithEnc );
     894             : 
     895      357910 :         if ( hBstr == NULL )
     896             :         {
     897      178212 :             IGFSCFEncoderRestoreContextState( &hPrivateData->hIGFSCFArithEnc, igfGridIdx );
     898             :         }
     899             :     }
     900             :     else
     901             :     {
     902    16753464 :         IGF_write_bit( hBstr, pBitOffset, 0 );
     903             : 
     904    16753464 :         if ( hBstr == NULL )
     905             :         {
     906     8209521 :             IGFSCFEncoderSaveContextState( &hPrivateData->hIGFSCFArithEnc, igfGridIdx );
     907             :         }
     908             : 
     909    16753464 :         *pBitOffset = IGFSCFEncoderEncode( &hPrivateData->hIGFSCFArithEnc, hBstr, *pBitOffset, &hPrivateData->igfScfQuantized[hGrid->startSfb], igfGridIdx, isIndepFlag );
     910             : 
     911    16753464 :         if ( hBstr == NULL )
     912             :         {
     913     8209521 :             IGFSCFEncoderRestoreContextState( &hPrivateData->hIGFSCFArithEnc, igfGridIdx );
     914             :         }
     915             :     }
     916    17111374 :     totBitCount = *pBitOffset - startBitCount;
     917             : 
     918    17111374 :     return totBitCount;
     919             : }
     920             : 
     921             : 
     922             : /*-------------------------------------------------------------------*
     923             :  * IGF_ErodeSpectrum()
     924             :  *
     925             :  * identifies significant spectral content
     926             :  *-------------------------------------------------------------------*/
     927             : 
     928             : /*! r: highPassEnergy */
     929     8723641 : static float IGF_ErodeSpectrum(
     930             :     const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i  : instance handle of IGF Encoder   */
     931             :     float *pSpectrum,                      /* i/o: MDCT spectrum                    */
     932             :     float *pPowerSpectrum,                 /* i/o: power spectrum                   */
     933             :     const int16_t igfGridIdx,              /* i  : IGF grid index                   */
     934             :     const int16_t mct_on                   /* i  : flag mct block (1) or stereo (0) */
     935             : )
     936             : {
     937             :     IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData;
     938             :     H_IGF_GRID hGrid;
     939             :     int16_t i;
     940             :     int16_t igfBgn;
     941             :     int16_t igfEnd;
     942             :     float highPassEner;
     943             :     float lastLine;
     944             :     float nextLine;
     945             :     float factor;
     946             :     int16_t *igfScaleF;
     947             :     int16_t startSfb;
     948             :     int16_t stopSfb;
     949             :     int16_t *swb_offset;
     950             :     int16_t tmp;
     951             :     int16_t sfb;
     952             :     int16_t line;
     953             : 
     954     8723641 :     highPassEner = 0.f;
     955     8723641 :     hPrivateData = &hIGFEnc->igfData;
     956     8723641 :     hGrid = &hPrivateData->igfInfo.grid[(int16_t) igfGridIdx];
     957     8723641 :     igfBgn = hGrid->startLine;
     958     8723641 :     igfEnd = hGrid->stopLine;
     959     8723641 :     startSfb = hGrid->startSfb;
     960     8723641 :     stopSfb = hGrid->stopSfb;
     961     8723641 :     swb_offset = hGrid->swb_offset;
     962     8723641 :     igfScaleF = hPrivateData->igfScfQuantized;
     963             : 
     964     8723641 :     if ( pPowerSpectrum == NULL )
     965             :     {
     966    72465340 :         for ( i = igfBgn; i < hGrid->infoGranuleLen; i++ )
     967             :         {
     968    72129432 :             pSpectrum[i] = 0.f;
     969             :         }
     970      335908 :         return 0;
     971             :     }
     972             : 
     973     8387733 :     if ( igfBgn > 0 )
     974             :     {
     975  3733012113 :         for ( i = 0; i < igfBgn; i++ )
     976             :         {
     977  3724624380 :             highPassEner += (float) i * pPowerSpectrum[i];
     978             :         }
     979             : 
     980     8387733 :         if ( hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_SWB_9600 ||
     981     8387172 :              hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_RF_SWB_13200 ||
     982     8387044 :              hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_SWB_13200 ||
     983     8382566 :              hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_SWB_16400_CPE )
     984             :         {
     985      269014 :             factor = 1.f;
     986             :         }
     987     8118719 :         else if ( mct_on && ( hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_SWB_48000_CPE || hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_SWB_64000_CPE ) )
     988             :         {
     989       73666 :             factor = 0.7f;
     990             :         }
     991             :         else
     992             :         {
     993     8045053 :             factor = 2.f;
     994             :         }
     995     8387733 :         highPassEner /= igfBgn * factor; /* for 9.6kbs use 1.f */
     996     8387733 :         lastLine = pSpectrum[i - 1];
     997     8387733 :         nextLine = ( pPowerSpectrum[i - 1] < highPassEner ) ? 0.0f : pSpectrum[i];
     998             : 
     999  2598641248 :         for ( /*i*/; i < igfEnd - 1; i++ )
    1000             :         {
    1001  2590253515 :             if ( pPowerSpectrum[i] < highPassEner )
    1002             :             {
    1003  2516390651 :                 lastLine = pSpectrum[i];
    1004  2516390651 :                 pSpectrum[i] = nextLine;
    1005  2516390651 :                 nextLine = 0.0f;
    1006             :             }
    1007             :             else
    1008             :             {
    1009    73862864 :                 pSpectrum[i - 1] = lastLine;
    1010    73862864 :                 lastLine = pSpectrum[i];
    1011    73862864 :                 nextLine = pSpectrum[i + 1];
    1012             :             }
    1013             :         }
    1014             : 
    1015             :         /* i == igfEnd - 1 */
    1016     8387733 :         if ( pPowerSpectrum[i] < highPassEner )
    1017             :         {
    1018     8102438 :             pSpectrum[i] = 0.f;
    1019             :         }
    1020             :     }
    1021             : 
    1022             :     /* delete spectrum above igfEnd: */
    1023  1029917145 :     for ( i = igfEnd; i < hGrid->infoGranuleLen; i++ )
    1024             :     {
    1025  1021529412 :         pSpectrum[i] = 0.f;
    1026  1021529412 :         pPowerSpectrum[i] = 0.f;
    1027             :     }
    1028             : 
    1029     8387733 :     if ( NULL != pPowerSpectrum )
    1030             :     {
    1031    55979598 :         for ( sfb = startSfb; sfb < stopSfb; sfb++ )
    1032             :         {
    1033    47591865 :             tmp = 0;
    1034  2646233113 :             for ( line = swb_offset[sfb]; line < swb_offset[sfb + 1]; line++ )
    1035             :             {
    1036  2598641248 :                 if ( pSpectrum[line] != 0.f )
    1037             :                 {
    1038    30305596 :                     tmp++;
    1039             :                 }
    1040             :             }
    1041             : 
    1042    47591865 :             if ( tmp && igfScaleF[sfb] )
    1043             :             {
    1044     1184193 :                 igfScaleF[sfb]--;
    1045             :             }
    1046             :         }
    1047             :     }
    1048             : 
    1049     8387733 :     return highPassEner;
    1050             : }
    1051             : 
    1052             : 
    1053             : /*-------------------------------------------------------------------*
    1054             :  * IGF_Whitening()
    1055             :  *
    1056             :  * calculates the IGF whitening levels by SFM and crest
    1057             :  *-------------------------------------------------------------------*/
    1058             : 
    1059     8723641 : static void IGF_Whitening(
    1060             :     const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i  :     | instance handle of IGF Encoder               */
    1061             :     float *powerSpectrum,                  /* i  : Q31 | MDCT/MDST power spectrum                     */
    1062             :     const int16_t igfGridIdx,              /* i  : Q0  | IGF grid index                               */
    1063             :     const int16_t isTransient,             /* i  : Q0  | flag indicating if transient is detected     */
    1064             :     const int16_t last_core_acelp,         /* i  : Q0  | indicator if last frame was ACELP core       */
    1065             :     const int16_t isTNSActive,             /* i  : Q0  | indicator if TNS is active                   */
    1066             :     const int16_t sp_aud_decision0,        /* i  : Q0  | first stage classifier decision              */
    1067             :     const int32_t brate,                   /* i  : Q0  | bitrate                                      */
    1068             :     const int16_t element_mode             /* i  : Q0  | element mode                                 */
    1069             : )
    1070             : {
    1071             :     IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData;
    1072             :     H_IGF_GRID hGrid;
    1073             :     int16_t p;
    1074             :     float tmp;
    1075             :     float SFM_src;
    1076             :     float SFM_tar;
    1077             :     int16_t num_Tiles;
    1078             :     float SFM;
    1079             : 
    1080     8723641 :     SFM = -1.f;
    1081             : 
    1082     8723641 :     hPrivateData = &hIGFEnc->igfData;
    1083     8723641 :     hGrid = &hPrivateData->igfInfo.grid[(int16_t) igfGridIdx];
    1084             : 
    1085     8723641 :     if ( igfGridIdx != IGF_GRID_LB_NORM )
    1086             :     {
    1087     1982973 :         for ( p = 0; p < hGrid->nTiles; p++ )
    1088             :         {
    1089             :             /* reset filter */
    1090     1552272 :             hPrivateData->prevSFM_FIR[p] = 0.f;
    1091     1552272 :             hPrivateData->prevSFM_IIR[p] = 0.f;
    1092             : 
    1093             :             /* preset values: */
    1094     1552272 :             hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_OFF;
    1095             :         }
    1096             :     }
    1097             : 
    1098    95960051 :     for ( p = 0; p < IGF_MAX_TILES; p++ )
    1099             :     {
    1100             :         /* update prev data: */
    1101    87236410 :         hPrivateData->igfPrevWhiteningLevel[p] = hPrivateData->igfCurrWhiteningLevel[p];
    1102             :         /* preset values: */
    1103    87236410 :         hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_OFF;
    1104             :     }
    1105             : 
    1106     8723641 :     if ( !( isTransient || hPrivateData->wasTransient ) )
    1107             :     {
    1108     8222711 :         if ( powerSpectrum )
    1109             :         {
    1110    39228831 :             for ( p = 0; p < hGrid->nTiles; p++ )
    1111             :             {
    1112             :                 int16_t sb;
    1113             : 
    1114    31022048 :                 if ( isTNSActive )
    1115             :                 {
    1116   183839530 :                     for ( sb = hGrid->tile[p]; sb < hGrid->tile[p + 1]; sb++ )
    1117             :                     {
    1118   181749932 :                         hPrivateData->logSpec[sb] = max( 0, (int16_t) ( logf( max( FLT_MIN, powerSpectrum[sb] ) ) * INV_LOG_2 ) );
    1119             :                     }
    1120             :                 }
    1121             : 
    1122             :                 /* if current tile contains only a single SFB, reuse already computed SFM values */
    1123    31022048 :                 if ( element_mode > EVS_MONO && ( hGrid->sfbWrap[p + 1] - hGrid->sfbWrap[p] ) == 1 )
    1124             :                 {
    1125    18737246 :                     tmp = hPrivateData->SFM_tb[p];
    1126             :                 }
    1127             :                 else
    1128             :                 {
    1129    12284802 :                     tmp = IGF_getSFM_new( powerSpectrum, hPrivateData->logSpec, hGrid->tile[p], hGrid->tile[p + 1] ) / IGF_getCrest_new( hPrivateData->logSpec, hGrid->tile[p], hGrid->tile[p + 1] );
    1130             :                 }
    1131             : 
    1132    31022048 :                 if ( last_core_acelp || hPrivateData->wasTransient )
    1133             :                 {
    1134      581007 :                     hPrivateData->prevSFM_FIR[p] = hPrivateData->prevSFM_IIR[p] = tmp;
    1135             :                 }
    1136             : 
    1137    31022048 :                 if ( brate <= IVAS_48k && element_mode == IVAS_CPE_MDCT )
    1138             :                 {
    1139     8292641 :                     num_Tiles = 0;
    1140     8292641 :                     SFM_src = 0.f;
    1141     8292641 :                     SFM_tar = 0.f;
    1142             : 
    1143    17350623 :                     for ( sb = hGrid->sfbWrap[p]; sb < hGrid->sfbWrap[p + 1]; sb++ )
    1144             :                     {
    1145     9057982 :                         num_Tiles++;
    1146     9057982 :                         SFM_src += hPrivateData->SFM_sb[sb];
    1147     9057982 :                         SFM_tar += hPrivateData->SFM_tb[sb];
    1148             :                     }
    1149             : 
    1150             :                     /* compute the average */
    1151     8292641 :                     SFM_src /= num_Tiles;
    1152     8292641 :                     SFM_tar /= num_Tiles;
    1153             : 
    1154     8292641 :                     if ( ( p > 0 ) && ( hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_SWB_48000_CPE || hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_FB_48000_CPE ) )
    1155             :                     {
    1156     7038091 :                         if ( ( p == 1 ) && ( abs( hPrivateData->igfCurrWhiteningLevel[0] - hPrivateData->igfCurrWhiteningLevel[1] ) == 2 ) ) /* OFF vs. STRONG */
    1157             :                         {
    1158       97063 :                             hPrivateData->igfCurrWhiteningLevel[0] = IGF_WHITENING_MID;
    1159             :                         }
    1160     7038091 :                         hPrivateData->igfCurrWhiteningLevel[p] = hPrivateData->igfCurrWhiteningLevel[p - 1];
    1161             :                     }
    1162     1254550 :                     else if ( sp_aud_decision0 )
    1163             :                     {
    1164             :                         /* Music */
    1165             :                         /* whitening Off: when tonality of target is more than source or tonality of target is close to that of source */
    1166      594662 :                         if ( ( SFM_tar <= SFM_src ) || ( SFM_tar <= ( SFM_src + 0.5f ) ) )
    1167             :                         {
    1168      467069 :                             hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_OFF;
    1169             :                         }
    1170             : 
    1171             :                         /* whitening mid:  */
    1172      594662 :                         if ( ( SFM_tar > ( SFM_src + 0.5f ) ) && ( SFM_tar <= ( SFM_src + 1.25f ) ) )
    1173             :                         {
    1174      111710 :                             hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_MID;
    1175             :                         }
    1176             : 
    1177             :                         /* whitening strong */
    1178      594662 :                         if ( SFM_tar > ( SFM_src + 1.25f ) )
    1179             :                         {
    1180       15883 :                             hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_STRONG;
    1181             :                         }
    1182             :                     }
    1183             :                     else
    1184             :                     {
    1185             :                         /* Speech */
    1186             :                         /* whitening Off: when tonality of target is more than source or tonality of target is close to that of source */
    1187      659888 :                         if ( ( SFM_tar <= SFM_src ) || ( SFM_tar <= ( SFM_src + 0.1f ) ) )
    1188             :                         {
    1189      381079 :                             hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_OFF;
    1190             :                         }
    1191             : 
    1192             :                         /* whitening mid:  */
    1193      659888 :                         if ( ( SFM_tar > ( SFM_src + 0.1f ) ) && ( SFM_tar <= ( SFM_src + 0.5f ) ) )
    1194             :                         {
    1195      189092 :                             hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_MID;
    1196             :                         }
    1197             : 
    1198             :                         /* whitening strong */
    1199      659888 :                         if ( SFM_tar > ( SFM_src + 0.5f ) )
    1200             :                         {
    1201       89717 :                             hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_STRONG;
    1202             :                         }
    1203             :                     }
    1204             : 
    1205     8292641 :                     SFM = SFM_tar;
    1206             :                 }
    1207             :                 else
    1208             :                 {
    1209    22729407 :                     if ( element_mode > EVS_MONO && ( hGrid->sfbWrap[p + 1] - hGrid->sfbWrap[p] ) == 1 )
    1210             :                     {
    1211    11209946 :                         SFM = tmp;
    1212             :                     }
    1213             :                     else
    1214             :                     {
    1215    11519461 :                         SFM = tmp + hPrivateData->prevSFM_FIR[p] + 0.5f * hPrivateData->prevSFM_IIR[p];
    1216    11519461 :                         SFM = min( 2.7f, SFM );
    1217             :                     }
    1218             : 
    1219    22729407 :                     hPrivateData->prevSFM_FIR[p] = tmp;
    1220    22729407 :                     hPrivateData->prevSFM_IIR[p] = SFM;
    1221             : 
    1222    22729407 :                     if ( SFM > hGrid->whiteningThreshold[1][p] )
    1223             :                     {
    1224     9869997 :                         hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_STRONG;
    1225             :                     }
    1226    12859410 :                     else if ( SFM > hGrid->whiteningThreshold[0][p] )
    1227             :                     {
    1228     8021585 :                         hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_MID;
    1229             :                     }
    1230             :                     else
    1231             :                     {
    1232     4837825 :                         hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_OFF;
    1233             :                     }
    1234             :                 }
    1235             : 
    1236    31022048 :                 if ( element_mode > EVS_MONO )
    1237             :                 {
    1238    30976909 :                     if ( last_core_acelp ) /* reset */
    1239             :                     {
    1240      579431 :                         set_f( hPrivateData->igfPastSFM[p], -1.f, IGF_PAST_SFM_LEN );
    1241      579431 :                         hPrivateData->igfWhiteningHangoverCnt[p] = 2;
    1242             :                     }
    1243             :                     else
    1244             :                     {
    1245             :                         /* check whether change in whitening level should be allowed or not (if SFM is inside a certain margin around thresholds) */
    1246    30397478 :                         if ( hPrivateData->igfCurrWhiteningLevel[p] != hPrivateData->igfPrevWhiteningLevel[p] &&
    1247     8154385 :                              ( ( SFM > hGrid->whiteningThreshold[0][p] - 0.15f && SFM < hGrid->whiteningThreshold[0][p] + 0.15f ) ||
    1248     6623415 :                                ( SFM > hGrid->whiteningThreshold[1][p] - 0.15f && SFM < hGrid->whiteningThreshold[1][p] + 0.15f ) ) )
    1249             :                         {
    1250     3914661 :                             float mean_past_SFM = 0.f;
    1251     3914661 :                             int16_t countable = 0;
    1252             :                             int16_t i;
    1253             : 
    1254             :                             /* compute mean of last (available) SFM values */
    1255    23487966 :                             for ( i = 0; i < IGF_PAST_SFM_LEN; i++ )
    1256             :                             {
    1257    19573305 :                                 if ( hPrivateData->igfPastSFM[p][i] >= 0.f )
    1258             :                                 {
    1259    17026972 :                                     mean_past_SFM += hPrivateData->igfPastSFM[p][i];
    1260    17026972 :                                     countable++;
    1261             :                                 }
    1262             :                             }
    1263     3914661 :                             if ( countable )
    1264             :                             {
    1265     3833569 :                                 mean_past_SFM /= countable;
    1266             : 
    1267             :                                 /* deny change in whitening level for small deviations from mean SFM */
    1268     3833569 :                                 if ( fabs( SFM - mean_past_SFM ) < 0.2f )
    1269             :                                 {
    1270     1888764 :                                     hPrivateData->igfCurrWhiteningLevel[p] = hPrivateData->igfPrevWhiteningLevel[p];
    1271             :                                 }
    1272             :                             }
    1273             :                         }
    1274             :                     }
    1275             : 
    1276    30976909 :                     hPrivateData->igfPastSFM[p][hPrivateData->igfPastSFM_pos] = SFM;
    1277             :                 }
    1278             :             }
    1279             : 
    1280     8206783 :             switch ( hPrivateData->igfInfo.bitRateIndex )
    1281             :             {
    1282     1283570 :                 case IGF_BITRATE_WB_9600:
    1283             :                 case IGF_BITRATE_RF_WB_13200:
    1284             :                 case IGF_BITRATE_WB_13200_CPE:
    1285             :                 case IGF_BITRATE_WB_16400_CPE:
    1286             :                 case IGF_BITRATE_RF_SWB_13200:
    1287             :                 case IGF_BITRATE_SWB_9600:
    1288             :                 case IGF_BITRATE_SWB_13200_CPE:
    1289             :                 case IGF_BITRATE_SWB_16400:
    1290             :                 case IGF_BITRATE_SWB_24400:
    1291             :                 case IGF_BITRATE_SWB_24400_CPE:
    1292             :                 case IGF_BITRATE_SWB_32000_CPE:
    1293             :                 case IGF_BITRATE_SWB_32000:
    1294             :                 case IGF_BITRATE_FB_16400:
    1295             :                 case IGF_BITRATE_FB_24400:
    1296             :                 case IGF_BITRATE_FB_24400_CPE:
    1297             :                 case IGF_BITRATE_FB_32000_CPE:
    1298             :                 case IGF_BITRATE_FB_32000:
    1299     1283570 :                     hPrivateData->igfCurrWhiteningLevel[hGrid->nTiles - 1] = hPrivateData->igfCurrWhiteningLevel[hGrid->nTiles - 2];
    1300     1283570 :                     break;
    1301     6923213 :                 default:
    1302     6923213 :                     break;
    1303             :             }
    1304             :         }
    1305             :         else
    1306             :         {
    1307       71865 :             for ( p = 0; p < hGrid->nTiles; p++ )
    1308             :             {
    1309       55937 :                 hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_MID;
    1310             :             }
    1311             :         }
    1312             :     }
    1313             :     else
    1314             :     {
    1315             :         /* reset filter */
    1316     5510230 :         for ( p = 0; p < IGF_MAX_TILES; p++ )
    1317             :         {
    1318     5009300 :             hPrivateData->prevSFM_FIR[p] = 0.f;
    1319     5009300 :             hPrivateData->prevSFM_IIR[p] = 0.f;
    1320             :         }
    1321             :     }
    1322             : 
    1323     8723641 :     if ( element_mode > EVS_MONO )
    1324             :     {
    1325     8702579 :         if ( SFM == -1.f ) /* reset */
    1326             :         {
    1327     2180596 :             for ( p = 0; p < hGrid->nTiles; p++ )
    1328             :             {
    1329     1664561 :                 set_f( hPrivateData->igfPastSFM[p], -1.f, IGF_PAST_SFM_LEN );
    1330     1664561 :                 hPrivateData->igfWhiteningHangoverCnt[p] = 2;
    1331             :             }
    1332             :         }
    1333             : 
    1334             :         /* vibrato handling */
    1335    27667246 :         for ( p = 0; p < hGrid->nTiles; p = p + 2 )
    1336             :         {
    1337    18964667 :             if ( ( hPrivateData->igfPrevWhiteningLevel[p] == IGF_WHITENING_OFF && hPrivateData->igfCurrWhiteningLevel[p] != IGF_WHITENING_OFF ) ||
    1338    16680885 :                  ( hPrivateData->igfPrevWhiteningLevel[p + 1] == IGF_WHITENING_OFF && hPrivateData->igfCurrWhiteningLevel[p + 1] != IGF_WHITENING_OFF ) )
    1339             :             {
    1340             :                 int16_t i;
    1341             :                 float pastSfm_a[4], pastSfm_b[4];
    1342             :                 float pastSfmDiffSum_a, pastSfmDiffSum_b;
    1343             : 
    1344    14198950 :                 for ( i = 0; i < 4; i++ )
    1345             :                 {
    1346    11359160 :                     pastSfm_a[i] = hPrivateData->igfPastSFM[p][( hPrivateData->igfPastSFM_pos + 4 - i ) % IGF_PAST_SFM_LEN];
    1347    11359160 :                     pastSfm_b[i] = hPrivateData->igfPastSFM[p + 1][( hPrivateData->igfPastSFM_pos + 4 - i ) % IGF_PAST_SFM_LEN];
    1348             :                 }
    1349     2839790 :                 pastSfmDiffSum_a = pastSfmDiffSum_b = 0;
    1350     8239868 :                 for ( i = 0; i < 3; i++ )
    1351             :                 {
    1352     6717204 :                     if ( pastSfm_a[i + 1] != -1.f )
    1353             :                     {
    1354     5400078 :                         pastSfmDiffSum_a += ( pastSfm_a[i] - pastSfm_a[i + 1] );
    1355     5400078 :                         pastSfmDiffSum_b += ( pastSfm_b[i] - pastSfm_b[i + 1] );
    1356             :                     }
    1357             :                     else
    1358             :                     {
    1359     1317126 :                         break;
    1360             :                     }
    1361             :                 }
    1362             : 
    1363             :                 /* if tonality oscillates between two tiles, turn whitening off in both */
    1364     2839790 :                 if ( ( ( pastSfmDiffSum_a > 0.f && pastSfmDiffSum_b < 0.f ) ||
    1365      408088 :                        ( pastSfmDiffSum_a < 0.f && pastSfmDiffSum_b > 0.f ) ) &&
    1366      439076 :                      ( fabs( pastSfmDiffSum_a - pastSfmDiffSum_b ) > 0.5f ) )
    1367             :                 {
    1368      198030 :                     hPrivateData->igfCurrWhiteningLevel[p] = hPrivateData->igfCurrWhiteningLevel[p + 1] = IGF_WHITENING_OFF;
    1369             :                 }
    1370             :             }
    1371             :         }
    1372             : 
    1373             :         /* hangover */
    1374    41344049 :         for ( p = 0; p < hGrid->nTiles; p++ )
    1375             :         {
    1376    32641470 :             if ( hPrivateData->igfCurrWhiteningLevel[p] != hPrivateData->igfPrevWhiteningLevel[p] )
    1377             :             {
    1378     6291278 :                 hPrivateData->igfWhiteningHangoverCnt[p]++;
    1379     6291278 :                 if ( hPrivateData->igfWhiteningHangoverCnt[p] == 3 )
    1380             :                 {
    1381     1623397 :                     hPrivateData->igfWhiteningHangoverCnt[p] = 0;
    1382             :                 }
    1383             :                 else
    1384             :                 {
    1385     4667881 :                     hPrivateData->igfCurrWhiteningLevel[p] = hPrivateData->igfPrevWhiteningLevel[p];
    1386             :                 }
    1387             :             }
    1388             :             else
    1389             :             {
    1390    26350192 :                 hPrivateData->igfWhiteningHangoverCnt[p] = 0;
    1391             :             }
    1392             :         }
    1393             : 
    1394     8702579 :         hPrivateData->igfPastSFM_pos = ( hPrivateData->igfPastSFM_pos + 1 ) % IGF_PAST_SFM_LEN;
    1395             :     }
    1396             : 
    1397     8723641 :     hPrivateData->wasTransient = isTransient;
    1398             : 
    1399     8723641 :     return;
    1400             : }
    1401             : 
    1402             : 
    1403             : /*-------------------------------------------------------------------*
    1404             :  * IGF_WriteWhiteningTile()
    1405             :  *
    1406             :  * write whitening levels into bitstream
    1407             :  *-------------------------------------------------------------------*/
    1408             : 
    1409             : /*! r: number of bits written */
    1410    35293263 : static int16_t IGF_WriteWhiteningTile(
    1411             :     BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle   */
    1412             :     int16_t *pBitOffset,   /* i  : ptr to bitOffset counter   */
    1413             :     int16_t whiteningLevel /* i  : whitening levels to write  */
    1414             : )
    1415             : {
    1416             :     int16_t totBitCount;
    1417             :     int16_t startBitCount;
    1418             : 
    1419    35293263 :     totBitCount = 0;
    1420    35293263 :     startBitCount = *pBitOffset;
    1421             : 
    1422    35293263 :     if ( whiteningLevel == IGF_WHITENING_MID )
    1423             :     {
    1424    12737242 :         IGF_write_bits( hBstr, pBitOffset, 0, 1 );
    1425             :     }
    1426             :     else
    1427             :     {
    1428    22556021 :         IGF_write_bits( hBstr, pBitOffset, 1, 1 );
    1429    22556021 :         if ( whiteningLevel == IGF_WHITENING_OFF )
    1430             :         {
    1431    11454997 :             IGF_write_bits( hBstr, pBitOffset, 0, 1 );
    1432             :         }
    1433             :         else
    1434             :         {
    1435    11101024 :             IGF_write_bits( hBstr, pBitOffset, 1, 1 );
    1436             :         }
    1437             :     }
    1438    35293263 :     totBitCount = *pBitOffset - startBitCount;
    1439             : 
    1440    35293263 :     return totBitCount;
    1441             : }
    1442             : 
    1443             : 
    1444             : /*-------------------------------------------------------------------*
    1445             :  * IGF_WriteWhiteningLevels()
    1446             :  *
    1447             :  * writes the whitening levels
    1448             :  *-------------------------------------------------------------------*/
    1449             : 
    1450             : /*! r: total number of bits written */
    1451    17111374 : static int16_t IGF_WriteWhiteningLevels(
    1452             :     const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i  : instance handle of IGF encoder                                               */
    1453             :     BSTR_ENC_HANDLE hBstr,                 /* i/o: encoder bitstream handle                                                     */
    1454             :     int16_t *pBitOffset,                   /* i  : ptr to bitOffset counter                                                     */
    1455             :     const int16_t igfGridIdx,              /* i  : igf grid index see declaration of IGF_GRID_IDX for details                   */
    1456             :     const int16_t isIndepFlag              /* i  : if 1 frame is independent, 0 = frame is coded with data from previous frame  */
    1457             : )
    1458             : {
    1459             :     IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData;
    1460             :     H_IGF_GRID hGrid;
    1461             :     int16_t p;
    1462             :     int16_t nTiles;
    1463             :     int16_t totBitCount;
    1464             :     int16_t isSame;
    1465             :     int16_t startBitCount;
    1466             : 
    1467    17111374 :     totBitCount = 0;
    1468    17111374 :     isSame = 1;
    1469    17111374 :     startBitCount = *pBitOffset;
    1470    17111374 :     hPrivateData = &hIGFEnc->igfData;
    1471    17111374 :     hGrid = &hPrivateData->igfInfo.grid[igfGridIdx];
    1472    17111374 :     nTiles = hGrid->nTiles;
    1473             : 
    1474    17111374 :     if ( isIndepFlag )
    1475             :     {
    1476    16943420 :         isSame = 0;
    1477             :     }
    1478             :     else
    1479             :     {
    1480      622008 :         for ( p = 0; p < nTiles; p++ )
    1481             :         {
    1482      462195 :             if ( hPrivateData->igfCurrWhiteningLevel[p] != hPrivateData->igfPrevWhiteningLevel[p] )
    1483             :             {
    1484        8141 :                 isSame = 0;
    1485        8141 :                 break;
    1486             :             }
    1487             :         }
    1488             :     }
    1489             : 
    1490    17111374 :     if ( isSame )
    1491             :     {
    1492      159813 :         IGF_write_bits( hBstr, pBitOffset, 1, 1 );
    1493             :     }
    1494             :     else
    1495             :     {
    1496    16951561 :         if ( !isIndepFlag )
    1497             :         {
    1498        8141 :             IGF_write_bits( hBstr, pBitOffset, 0, 1 );
    1499             :         }
    1500             : 
    1501    16951561 :         IGF_WriteWhiteningTile( hBstr, pBitOffset, hPrivateData->igfCurrWhiteningLevel[0] );
    1502             : 
    1503    16951561 :         if ( hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_SWB_48000_CPE || hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_FB_48000_CPE )
    1504             :         {
    1505     2640526 :             isSame = 1;
    1506             :         }
    1507             :         else
    1508             :         {
    1509    32212662 :             for ( p = 1; p < nTiles; p++ )
    1510             :             {
    1511    22475715 :                 isSame = 1;
    1512    22475715 :                 if ( hPrivateData->igfCurrWhiteningLevel[p] != hPrivateData->igfCurrWhiteningLevel[p - 1] )
    1513             :                 {
    1514     4574088 :                     isSame = 0;
    1515     4574088 :                     break;
    1516             :                 }
    1517             :             }
    1518             :         }
    1519             : 
    1520    16951561 :         if ( !isSame )
    1521             :         {
    1522     9845679 :             IGF_write_bits( hBstr, pBitOffset, 1, 1 );
    1523             : 
    1524    28187381 :             for ( p = 1; p < nTiles; p++ )
    1525             :             {
    1526    18341702 :                 IGF_WriteWhiteningTile( hBstr, pBitOffset, hPrivateData->igfCurrWhiteningLevel[p] );
    1527             :             }
    1528             :         }
    1529     7105882 :         else if ( hPrivateData->igfInfo.bitRateIndex != IGF_BITRATE_SWB_48000_CPE && hPrivateData->igfInfo.bitRateIndex != IGF_BITRATE_FB_48000_CPE )
    1530             :         {
    1531     4465356 :             IGF_write_bits( hBstr, pBitOffset, 0, 1 );
    1532             :         }
    1533             :     }
    1534             : 
    1535    17111374 :     totBitCount = *pBitOffset - startBitCount;
    1536             : 
    1537    17111374 :     return totBitCount;
    1538             : }
    1539             : 
    1540             : 
    1541             : /*-------------------------------------------------------------------*
    1542             :  * IGF_WriteFlatteningTrigger()
    1543             :  *
    1544             :  * write flattening trigger
    1545             :  *-------------------------------------------------------------------*/
    1546             : 
    1547             : /*! r: number of bits written */
    1548    17111374 : static int16_t IGF_WriteFlatteningTrigger(
    1549             :     const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i  : instance handle of IGF Encoder  */
    1550             :     BSTR_ENC_HANDLE hBstr,                 /* i/o: encoder bitstream handle        */
    1551             :     int16_t *pBitOffset                    /* i  : ptr to bitOffset counter        */
    1552             : )
    1553             : {
    1554             :     int16_t totBitCount;
    1555             :     int16_t startBitCount;
    1556             :     int16_t flatteningTrigger;
    1557             : 
    1558    17111374 :     totBitCount = 0;
    1559    17111374 :     startBitCount = *pBitOffset;
    1560    17111374 :     flatteningTrigger = hIGFEnc->flatteningTrigger;
    1561             : 
    1562    17111374 :     IGF_write_bits( hBstr, pBitOffset, flatteningTrigger, 1 );
    1563             : 
    1564    17111374 :     totBitCount = *pBitOffset - startBitCount;
    1565             : 
    1566    17111374 :     return totBitCount;
    1567             : }
    1568             : 
    1569             : 
    1570             : /*-------------------------------------------------------------------*
    1571             :  * IGF_UpdateInfo()
    1572             :  *
    1573             :  * updates the start/stop frequency of IGF according to igfGridIdx
    1574             :  *-------------------------------------------------------------------*/
    1575             : 
    1576    17447282 : static void IGF_UpdateInfo(
    1577             :     const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i  : instance handle of IGF Encoder  */
    1578             :     const int16_t igfGridIdx               /* i  : IGF grid index                  */
    1579             : )
    1580             : {
    1581             :     H_IGF_GRID hGrid;
    1582             : 
    1583    17447282 :     hGrid = &hIGFEnc->igfData.igfInfo.grid[igfGridIdx];
    1584    17447282 :     hIGFEnc->infoStartFrequency = hGrid->startFrequency;
    1585    17447282 :     hIGFEnc->infoStopFrequency = hGrid->stopFrequency;
    1586    17447282 :     hIGFEnc->infoStartLine = hGrid->startLine;
    1587    17447282 :     hIGFEnc->infoStopLine = hGrid->stopLine;
    1588             : 
    1589    17447282 :     return;
    1590             : }
    1591             : 
    1592             : 
    1593             : /*-------------------------------------------------------------------*
    1594             :  * IGFEncWriteBitstream()
    1595             :  *
    1596             :  * IGF bitstream writer
    1597             :  *-------------------------------------------------------------------*/
    1598             : 
    1599             : /*! r: number of bits written per frame */
    1600    17111374 : int16_t IGFEncWriteBitstream(
    1601             :     const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i  : instance handle of IGF Encoder                                              */
    1602             :     BSTR_ENC_HANDLE hBstr,                 /* i/o: encoder bitstream handle                                                    */
    1603             :     int16_t *pBitOffset,                   /* i  : ptr to bitOffset counter                                                    */
    1604             :     const int16_t igfGridIdx,              /* i  : igf grid index see declaration of IGF_GRID_IDX for details                  */
    1605             :     const int16_t isIndepFlag              /* i  : if 1 frame is independent, 0 = frame is coded with data from previous frame */
    1606             : )
    1607             : {
    1608             :     int16_t igfAllZero;
    1609    17111374 :     int16_t startBitCount = *pBitOffset;
    1610             : 
    1611    17111374 :     hIGFEnc->infoTotalBitsPerFrameWritten = 0;
    1612    17111374 :     if ( isIndepFlag )
    1613             :     {
    1614    16943420 :         hIGFEnc->infoTotalBitsWritten = 0;
    1615             :     }
    1616             : 
    1617    17111374 :     IGF_WriteEnvelope( hIGFEnc, hBstr, pBitOffset, igfGridIdx, isIndepFlag, &igfAllZero );
    1618             : 
    1619    17111374 :     IGF_WriteWhiteningLevels( hIGFEnc, hBstr, pBitOffset, igfGridIdx, isIndepFlag );
    1620             : 
    1621    17111374 :     IGF_WriteFlatteningTrigger( hIGFEnc, hBstr, pBitOffset );
    1622             : 
    1623    17111374 :     hIGFEnc->infoTotalBitsPerFrameWritten = ( *pBitOffset - startBitCount );
    1624    17111374 :     hIGFEnc->infoTotalBitsWritten += hIGFEnc->infoTotalBitsPerFrameWritten;
    1625             : 
    1626    17111374 :     return hIGFEnc->infoTotalBitsPerFrameWritten;
    1627             : }
    1628             : 
    1629             : 
    1630             : /*-------------------------------------------------------------------*
    1631             :  * IGFEncSetMode()
    1632             :  *
    1633             :  * sets the IGF mode according to given bitrate
    1634             :  *-------------------------------------------------------------------*/
    1635             : 
    1636      529210 : void IGFEncSetMode(
    1637             :     const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i/o: instance handle of IGF Encoder */
    1638             :     const int32_t total_brate,             /* i  : encoder total bitrate          */
    1639             :     const int16_t bwidth,                  /* i  : encoder audio bandwidth        */
    1640             :     const int16_t element_mode,            /* i  : IVAS element mode              */
    1641             :     const int16_t rf_mode                  /* i  : flag to signal the RF mode     */
    1642             : )
    1643             : {
    1644             :     int16_t i;
    1645             :     IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData;
    1646             : 
    1647      529210 :     hPrivateData = &hIGFEnc->igfData;
    1648      529210 :     hPrivateData->igfBitstreamBits = 0;
    1649      529210 :     set_s( hPrivateData->igfScfQuantized, 0, IGF_MAX_SFB );
    1650      529210 :     set_s( hPrivateData->igfCurrWhiteningLevel, 0, IGF_MAX_TILES );
    1651      529210 :     set_s( hPrivateData->igfPrevWhiteningLevel, 0, IGF_MAX_TILES );
    1652      529210 :     set_s( hPrivateData->igfWhiteningHangoverCnt, 0, IGF_MAX_TILES );
    1653             : 
    1654     5821310 :     for ( i = 0; i < IGF_MAX_TILES; i++ )
    1655             :     {
    1656     5292100 :         set_f( hPrivateData->igfPastSFM[i], -1.f, IGF_PAST_SFM_LEN );
    1657             :     }
    1658             : 
    1659      529210 :     hPrivateData->igfPastSFM_pos = 0;
    1660             : 
    1661   169876410 :     for ( i = 0; i < IGF_BITBUFSIZE / 8; i++ )
    1662             :     {
    1663   169347200 :         hPrivateData->igfBitstream[i] = 0;
    1664             :     }
    1665             : 
    1666      529210 :     hPrivateData->wasTransient = 0;
    1667      529210 :     set_f( hPrivateData->prevSFM_FIR, 0, IGF_MAX_TILES );
    1668      529210 :     set_f( hPrivateData->prevSFM_IIR, 0, IGF_MAX_TILES );
    1669      529210 :     set_s( hPrivateData->dampingFactorSmoothing, 2, IGF_MAX_SFB );
    1670      529210 :     set_f( hPrivateData->prevSFM_FIR_SFB_SB, 0, IGF_MAX_SFB );
    1671      529210 :     set_f( hPrivateData->prevSFM_IIR_SFB_SB, 0, IGF_MAX_SFB );
    1672      529210 :     set_f( hPrivateData->prevSFM_FIR_SFB_TB, 0, IGF_MAX_SFB );
    1673      529210 :     set_f( hPrivateData->prevSFM_IIR_SFB_TB, 0, IGF_MAX_SFB );
    1674      529210 :     set_f( hPrivateData->prevDampingFactor_IIR, -1, IGF_MAX_SFB );
    1675      529210 :     set_s( hPrivateData->logSpec, 0, L_FRAME_PLUS );
    1676      529210 :     set_f( hPrivateData->SFM_sb, 0.f, IGF_MAX_SFB );
    1677      529210 :     set_f( hPrivateData->SFM_tb, 0.f, IGF_MAX_SFB );
    1678             : 
    1679      529210 :     if ( IGFCommonFuncsIGFConfiguration( total_brate, bwidth, element_mode, &hPrivateData->igfInfo, rf_mode ) )
    1680             :     {
    1681      529056 :         IGFSCFEncoderOpen( &hPrivateData->hIGFSCFArithEnc, &hPrivateData->igfInfo, total_brate, bwidth, element_mode, rf_mode );
    1682             : 
    1683      529056 :         hIGFEnc->infoSamplingRate = hPrivateData->igfInfo.sampleRate;
    1684      529056 :         hIGFEnc->infoStartFrequency = hPrivateData->igfInfo.grid[0].startFrequency;
    1685      529056 :         hIGFEnc->infoStopFrequency = hPrivateData->igfInfo.grid[0].stopFrequency;
    1686      529056 :         hIGFEnc->infoStartLine = hPrivateData->igfInfo.grid[0].startLine;
    1687      529056 :         hIGFEnc->infoStopLine = hPrivateData->igfInfo.grid[0].stopLine;
    1688             :     }
    1689             :     else
    1690             :     {
    1691             :         /* IGF configuration failed -> error! */
    1692         154 :         hIGFEnc->infoSamplingRate = 0;
    1693         154 :         hIGFEnc->infoStartFrequency = -1;
    1694         154 :         hIGFEnc->infoStopFrequency = -1;
    1695         154 :         hIGFEnc->infoStartLine = -1;
    1696         154 :         hIGFEnc->infoStopLine = -1;
    1697         154 :         IVAS_ERROR( IVAS_ERR_INTERNAL, "IGFEncSetMode: initialization error!" );
    1698             :     }
    1699             : 
    1700             :     /* reset remaining variables */
    1701      529210 :     hIGFEnc->infoTotalBitsWritten = 0;
    1702      529210 :     hIGFEnc->infoTotalBitsPerFrameWritten = 0;
    1703      529210 :     hIGFEnc->flatteningTrigger = 0;
    1704      529210 :     hIGFEnc->tns_predictionGain = 0;
    1705      529210 :     set_f( hIGFEnc->spec_be_igf, 0, N_MAX_TCX - IGF_START_MN );
    1706             : 
    1707      529210 :     return;
    1708             : }
    1709             : 
    1710             : 
    1711             : /*-------------------------------------------------------------------*
    1712             :  * pack_bit()
    1713             :  *
    1714             :  * insert a bit into packed octet
    1715             :  *-------------------------------------------------------------------*/
    1716             : 
    1717     8355926 : static void pack_bit(
    1718             :     const int16_t bit, /* i  : bit to be packed */
    1719             :     uint8_t **pt,      /* i/o: pointer to octet array into which bit will be placed */
    1720             :     uint8_t *omask     /* i/o: output mask to indicate where in the octet the bit is to be written */
    1721             : )
    1722             : {
    1723     8355926 :     if ( *omask == 0x80 )
    1724             :     {
    1725     1118254 :         **pt = 0;
    1726             :     }
    1727             : 
    1728     8355926 :     if ( bit != 0 )
    1729             :     {
    1730     4379202 :         **pt = **pt | *omask;
    1731             :     }
    1732             : 
    1733     8355926 :     *omask >>= 1;
    1734     8355926 :     if ( *omask == 0 )
    1735             :     {
    1736      971513 :         *omask = 0x80;
    1737      971513 :         ( *pt )++;
    1738             :     }
    1739             : 
    1740     8355926 :     return;
    1741             : }
    1742             : 
    1743             : 
    1744             : /*-------------------------------------------------------------------*
    1745             :  * IGFEncConcatenateBitstream()
    1746             :  *
    1747             :  * IGF bitstream concatenation for TCX10 modes
    1748             :  *-------------------------------------------------------------------*/
    1749             : 
    1750      335908 : void IGFEncConcatenateBitstream(
    1751             :     const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i  : instance handle of IGF Encoder                  */
    1752             :     const int16_t bsBits,                  /* i  : number of IGF bits written to list of indices   */
    1753             :     BSTR_ENC_HANDLE hBstr                  /* i/o: bitstream handle                                */
    1754             : )
    1755             : {
    1756             :     int16_t i;
    1757             :     IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData;
    1758             :     Indice *ind_list;
    1759             :     uint8_t *pFrame;      /* byte array with bit packet and byte aligned coded speech data */
    1760             :     int16_t *pFrame_size; /* number of bits in the binary encoded access unit [bits]       */
    1761             :     int16_t k, nb_bits_written;
    1762             :     int32_t imask;
    1763             :     uint8_t omask;
    1764             : 
    1765      335908 :     hPrivateData = &hIGFEnc->igfData;
    1766             : 
    1767      335908 :     ind_list = &hBstr->ind_list[hBstr->nb_ind_tot - bsBits]; /* here, we assume that each bit has been written as a single indice */
    1768      335908 :     pFrame = hPrivateData->igfBitstream;
    1769      335908 :     pFrame_size = &hPrivateData->igfBitstreamBits;
    1770      335908 :     nb_bits_written = 0;
    1771             : 
    1772      335908 :     omask = ( 0x80 >> ( *pFrame_size & 0x7 ) );
    1773      335908 :     pFrame += *pFrame_size >> 3;
    1774             : 
    1775             :     /* bitstream packing (conversion of individual indices into a serial stream) */
    1776     8691834 :     for ( i = 0; i < bsBits; i++ )
    1777             :     {
    1778     8355926 :         if ( ind_list[i].nb_bits > 0 )
    1779             :         {
    1780             :             /* mask from MSB to LSB */
    1781     8355926 :             imask = 1 << ( ind_list[i].nb_bits - 1 );
    1782             : 
    1783             :             /* write bit by bit */
    1784    16711852 :             for ( k = 0; k < ind_list[i].nb_bits; k++ )
    1785             :             {
    1786     8355926 :                 pack_bit( ind_list[i].value & imask, &pFrame, &omask );
    1787     8355926 :                 imask >>= 1;
    1788             :             }
    1789     8355926 :             nb_bits_written += ind_list[i].nb_bits;
    1790             : 
    1791             :             /* delete the indice */
    1792     8355926 :             ind_list[i].nb_bits = -1;
    1793             :         }
    1794             :     }
    1795             : 
    1796      335908 :     *pFrame_size += nb_bits_written;
    1797             : 
    1798             :     /* update list of indices */
    1799      335908 :     hBstr->nb_ind_tot -= bsBits;
    1800      335908 :     hBstr->nb_bits_tot -= nb_bits_written;
    1801             : 
    1802      335908 :     return;
    1803             : }
    1804             : 
    1805             : 
    1806             : /*-------------------------------------------------------------------*
    1807             :  * IGFEncResetTCX10BitCounter()
    1808             :  *
    1809             :  * IGF reset bitstream bit counter for TCX10 modes
    1810             :  *-------------------------------------------------------------------*/
    1811             : 
    1812      167954 : void IGFEncResetTCX10BitCounter(
    1813             :     const IGF_ENC_INSTANCE_HANDLE hIGFEnc /* i  : instance handle of IGF Encoder */
    1814             : )
    1815             : {
    1816             :     IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData;
    1817             : 
    1818      167954 :     hPrivateData = &hIGFEnc->igfData;
    1819      167954 :     hPrivateData->igfBitstreamBits = 0;
    1820      167954 :     hIGFEnc->infoTotalBitsWritten = 0;
    1821             : 
    1822      167954 :     return;
    1823             : }
    1824             : 
    1825             : 
    1826             : /*-------------------------------------------------------------------*
    1827             :  * IGFEncWriteConcatenatedBitstream()
    1828             :  *
    1829             :  *
    1830             :  *-------------------------------------------------------------------*/
    1831             : 
    1832             : /*! r: total number of bits written */
    1833      167954 : int16_t IGFEncWriteConcatenatedBitstream(
    1834             :     const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i  : instance handle of IGF Encoder */
    1835             :     BSTR_ENC_HANDLE hBstr                  /* i/o: encoder bitstream handle       */
    1836             : )
    1837             : {
    1838             :     IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData;
    1839             :     int16_t i;
    1840             :     int16_t bitsLeft;
    1841             :     UWord8 *pBitstream;
    1842             : 
    1843      167954 :     hPrivateData = &hIGFEnc->igfData;
    1844      167954 :     pBitstream = hPrivateData->igfBitstream;
    1845             : 
    1846     1139467 :     for ( i = 0; i < ( hPrivateData->igfBitstreamBits >> 3 ); i++ )
    1847             :     {
    1848      971513 :         push_next_indice( hBstr, pBitstream[i], 8 );
    1849             :     }
    1850             : 
    1851      167954 :     bitsLeft = hPrivateData->igfBitstreamBits & 0x7;
    1852      167954 :     if ( bitsLeft > 0 )
    1853             :     {
    1854      146741 :         push_next_indice( hBstr, pBitstream[i] >> ( 8 - bitsLeft ), bitsLeft );
    1855             :     }
    1856             : 
    1857      167954 :     return hIGFEnc->infoTotalBitsWritten;
    1858             : }
    1859             : 
    1860             : 
    1861             : /*-------------------------------------------------------------------*
    1862             :  * IGFEncApplyMono()
    1863             :  *
    1864             :  * apply the IGF encoder, main encoder interface
    1865             :  *-------------------------------------------------------------------*/
    1866             : 
    1867     6905107 : void IGFEncApplyMono(
    1868             :     Encoder_State *st,              /* i  : Encoder state                                          */
    1869             :     const int16_t igfGridIdx,       /* i  : IGF grid index                                         */
    1870             :     float *pMDCTSpectrum,           /* i/o: MDCT spectrum                                          */
    1871             :     float *pPowerSpectrum,          /* i/o: MDCT^2 + MDST^2 spectrum, or estimate                  */
    1872             :     const int16_t isTCX20,          /* i  : flag indicating if the input is TCX20 or TCX10/2xTCX5  */
    1873             :     const int16_t isTNSActive,      /* i  : flag indicating if the TNS is active                   */
    1874             :     const int16_t sp_aud_decision0, /* i  : first stage switching decision                         */
    1875             :     const int16_t vad_hover_flag    /* i  : VAD hangover flag                                      */
    1876             : )
    1877             : {
    1878             :     float *pPowerSpectrumParameter; /* If it is NULL it informs a function that specific handling is needed */
    1879     6905107 :     float att = 1.0f;
    1880             :     int16_t last_core_acelp;
    1881             : 
    1882     6905107 :     last_core_acelp = ( st->last_core == ACELP_CORE );
    1883             : 
    1884     6905107 :     pPowerSpectrumParameter = !isTNSActive && isTCX20 ? pPowerSpectrum : NULL;
    1885             : 
    1886     6905107 :     IGF_UpdateInfo( st->hIGFEnc, igfGridIdx );
    1887             : 
    1888     6905107 :     if ( st->element_mode == IVAS_CPE_DFT || st->element_mode == IVAS_CPE_TD )
    1889             :     {
    1890      294835 :         calculate_hangover_attenuation_gain( st, &att, vad_hover_flag );
    1891             :     }
    1892             : 
    1893             : 
    1894     6905107 :     IGF_CalculateEnvelope( st->hIGFEnc, pMDCTSpectrum, pPowerSpectrumParameter, igfGridIdx, st->hTranDet->transientDetector.bIsAttackPresent, last_core_acelp, st->element_mode, att );
    1895             : 
    1896     6905107 :     pPowerSpectrumParameter = isTCX20 ? pPowerSpectrum : NULL;
    1897             : 
    1898     6905107 :     IGF_Whitening( st->hIGFEnc, pPowerSpectrumParameter, igfGridIdx, st->hTranDet->transientDetector.bIsAttackPresent, last_core_acelp, isTNSActive, sp_aud_decision0, ( st->element_mode == IVAS_CPE_MDCT ? st->element_brate : st->total_brate ), st->element_mode );
    1899             : 
    1900     6905107 :     IGF_ErodeSpectrum( st->hIGFEnc, pMDCTSpectrum, pPowerSpectrumParameter, igfGridIdx, 0 );
    1901             : 
    1902     6905107 :     return;
    1903             : }
    1904             : 
    1905             : 
    1906             : /*-------------------------------------------------------------------*
    1907             :  * IGFEncApplyStereo()
    1908             :  *
    1909             :  * apply the IGF encoder, main encoder interface
    1910             :  *-------------------------------------------------------------------*/
    1911             : 
    1912      909267 : void IGFEncApplyStereo(
    1913             :     STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct,             /* i/o: MDCT stereo encoder structure           */
    1914             :     int16_t ms_mask[2][MAX_SFB],                         /* i  : bandwise MS mask                        */
    1915             :     const IGF_ENC_INSTANCE_HANDLE hIGFEnc[CPE_CHANNELS], /* i  : instance handle of IGF Encoder          */
    1916             :     const int16_t igfGridIdx,                            /* i  : IGF grid index                          */
    1917             :     Encoder_State *sts[CPE_CHANNELS],                    /* i  : Encoder state                           */
    1918             :     float *pPowerSpectrum[CPE_CHANNELS],                 /* i/o: MDCT^2 + MDST^2 spectrum, or estimate   */
    1919             :     float *pPowerSpectrumMsInv[CPE_CHANNELS][NB_DIV],    /* i/o: inverse power spectrum                  */
    1920             :     float *inv_spectrum[CPE_CHANNELS][NB_DIV],           /* i  : inverse spectrum                        */
    1921             :     const int16_t frameno,                               /* i  : flag indicating index of current subfr. */
    1922             :     const int16_t sp_aud_decision0,                      /* i  : sp_aud_decision0                        */
    1923             :     const int32_t element_brate,                         /* i  : element bitrate                         */
    1924             :     const int16_t mct_on                                 /* i  : flag mct block (1) or stereo (0)        */
    1925             : )
    1926             : {
    1927             :     float *pPowerSpectrumParameter[NB_DIV]; /* If it is NULL it informs a function that specific handling is needed */
    1928             :     float *pPowerSpectrumParameterMsInv[NB_DIV];
    1929             :     int16_t coreMsMask[N_MAX];
    1930             :     int16_t sfb, ch, last_core_acelp;
    1931             :     STEREO_MDCT_BAND_PARAMETERS *sfbConf;
    1932             : 
    1933             :     /* assumptions: stereo filling was already done on the flattened spectra
    1934             :      *               IGF region is always coded M/S, never L/R (to be done in the encoder)
    1935             :      *               for residual bands with stereo filling infoTcxNoise is set to zero
    1936             :      *               both channels have the same IGF configuration
    1937             :      */
    1938             : 
    1939             :     /* sanity checks: check if both channels have the same configuration...*/
    1940      909267 :     assert( ( sts[0]->core == sts[1]->core ) );
    1941             : 
    1942             :     /* initialization */
    1943      909267 :     sfbConf = ( sts[0]->core == TCX_20_CORE ) ? &hStereoMdct->stbParamsTCX20 : &hStereoMdct->stbParamsTCX10;
    1944      909267 :     if ( sts[0]->last_core == ACELP_CORE )
    1945             :     {
    1946           0 :         sfbConf = &hStereoMdct->stbParamsTCX20afterACELP;
    1947             :     }
    1948             : 
    1949             :     /* create line wise ms mask for the core bands */
    1950      909267 :     set_s( coreMsMask, 0, N_MAX );
    1951    38611117 :     for ( sfb = 0; sfb < sfbConf->sfbCnt; sfb++ )
    1952             :     {
    1953    37701850 :         set_s( &coreMsMask[sfbConf->sfbOffset[sfb]], ms_mask[frameno][sfb], sfbConf->sfbOffset[sfb + 1] - sfbConf->sfbOffset[sfb] );
    1954             :     }
    1955             : 
    1956      909267 :     if ( sts[0]->core == TCX_20_CORE && !sts[0]->hTcxEnc->fUseTns[frameno] && !sts[1]->hTcxEnc->fUseTns[frameno] )
    1957             :     {
    1958      761271 :         pPowerSpectrumParameter[0] = &pPowerSpectrum[0][0];
    1959      761271 :         pPowerSpectrumParameter[1] = &pPowerSpectrum[1][0];
    1960      761271 :         pPowerSpectrumParameterMsInv[0] = pPowerSpectrumMsInv[0][0];
    1961      761271 :         pPowerSpectrumParameterMsInv[1] = pPowerSpectrumMsInv[1][0];
    1962             :     }
    1963             :     else
    1964             :     {
    1965      147996 :         pPowerSpectrumParameter[0] = NULL;
    1966      147996 :         pPowerSpectrumParameter[1] = NULL;
    1967      147996 :         pPowerSpectrumParameterMsInv[0] = NULL;
    1968      147996 :         pPowerSpectrumParameterMsInv[1] = NULL;
    1969             :     }
    1970             : 
    1971     2727801 :     for ( ch = 0; ch < CPE_CHANNELS; ch++ )
    1972             :     {
    1973     1818534 :         last_core_acelp = ( sts[ch]->last_core == ACELP_CORE );
    1974             : 
    1975     1818534 :         IGF_UpdateInfo( hIGFEnc[ch], igfGridIdx );
    1976             : 
    1977     1818534 :         IGF_CalculateStereoEnvelope( hIGFEnc[ch], sts[ch]->hTcxEnc->spectrum[frameno], inv_spectrum[ch][frameno], pPowerSpectrumParameter[ch], pPowerSpectrumParameterMsInv[ch], igfGridIdx, coreMsMask, sts[ch]->hTranDet->transientDetector.bIsAttackPresent, last_core_acelp );
    1978             : 
    1979     1818534 :         pPowerSpectrumParameter[ch] = sts[ch]->core == TCX_20_CORE ? pPowerSpectrum[ch] : NULL;
    1980             : 
    1981     1818534 :         IGF_Whitening( hIGFEnc[ch], pPowerSpectrumParameter[ch], igfGridIdx, sts[ch]->hTranDet->transientDetector.bIsAttackPresent, last_core_acelp, ( sts[0]->hTcxEnc->fUseTns[frameno] || sts[1]->hTcxEnc->fUseTns[frameno] ), sp_aud_decision0, element_brate, sts[ch]->element_mode );
    1982             : 
    1983     1818534 :         IGF_ErodeSpectrum( hIGFEnc[ch], sts[ch]->hTcxEnc->spectrum[frameno], pPowerSpectrumParameter[ch], igfGridIdx, mct_on );
    1984             :     }
    1985             : 
    1986      909267 :     return;
    1987             : }
    1988             : 
    1989             : 
    1990             : /*-------------------------------------------------------------------*
    1991             :  * IGFSaveSpectrumForITF()
    1992             :  *
    1993             :  *
    1994             :  *-------------------------------------------------------------------*/
    1995             : 
    1996     8723641 : void IGFSaveSpectrumForITF(
    1997             :     IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i/o: instance handle of IGF Encoder  */
    1998             :     const int16_t igfGridIdx,        /* i  : IGF grid index                  */
    1999             :     const float *pITFSpectrum        /* i  : MDCT spectrum                   */
    2000             : )
    2001             : {
    2002     8723641 :     IGF_UpdateInfo( hIGFEnc, igfGridIdx );
    2003             : 
    2004     8723641 :     mvr2r( pITFSpectrum + IGF_START_MN, hIGFEnc->spec_be_igf, hIGFEnc->infoStopLine - IGF_START_MN );
    2005             : 
    2006     8723641 :     return;
    2007             : }
    2008             : 
    2009             : 
    2010      298280 : ivas_error IGF_Reconfig(
    2011             :     IGF_ENC_INSTANCE_HANDLE *hIGFEnc, /* i/o: instance handle of IGF Encoder  */
    2012             :     const int16_t igf,                /* i  : IGF on/off                      */
    2013             :     const int16_t reset,              /* i  : reset flag                      */
    2014             :     const int32_t brate,              /* i  : bitrate for configuration       */
    2015             :     const int16_t bwidth,             /* i  : signal bandwidth                */
    2016             :     const int16_t element_mode,       /* i  : IVAS element mode               */
    2017             :     const int16_t rf_mode             /* i  : flag to signal the RF mode      */
    2018             : )
    2019             : {
    2020             :     ivas_error error;
    2021             : 
    2022      298280 :     error = IVAS_ERR_OK;
    2023             : 
    2024      298280 :     if ( igf && *hIGFEnc == NULL )
    2025             :     {
    2026       24313 :         if ( ( *hIGFEnc = (IGF_ENC_INSTANCE_HANDLE) malloc( sizeof( IGF_ENC_INSTANCE ) ) ) == NULL )
    2027             :         {
    2028           0 :             return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hIGFEnc\n" ) );
    2029             :         }
    2030       24313 :         IGFEncSetMode( *hIGFEnc, brate, bwidth, element_mode, rf_mode );
    2031             :     }
    2032      273967 :     else if ( igf && reset )
    2033             :     {
    2034       39661 :         IGFEncSetMode( *hIGFEnc, brate, bwidth, element_mode, rf_mode );
    2035             :     }
    2036      234306 :     else if ( !igf && *hIGFEnc != NULL )
    2037             :     {
    2038       29179 :         free( *hIGFEnc );
    2039       29179 :         *hIGFEnc = NULL;
    2040             :     }
    2041             : 
    2042      298280 :     return error;
    2043             : }

Generated by: LCOV version 1.14