LCOV - code coverage report
Current view: top level - lib_enc - igf_enc.c (source / functions) Hit Total Coverage
Test: Coverage on main -- short test vectors @ 6c9ddc4024a9c0e1ecb8f643f114a84a0e26ec6b Lines: 712 719 99.0 %
Date: 2025-05-23 08:37:30 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     7516611 : 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     7516611 :     if ( hBstr )
      67             :     {
      68     3804480 :         push_next_indice( hBstr, value, 1 );
      69             :     }
      70             : 
      71     7516611 :     ( *bitCount )++;
      72             : 
      73     7516611 :     return;
      74             : }
      75             : 
      76             : 
      77             : /*-------------------------------------------------------------------*
      78             :  * IGF_write_bits()
      79             :  *
      80             :  * write bits to stream
      81             :  *-------------------------------------------------------------------*/
      82             : 
      83     6316423 : 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    12632846 :     while ( bits-- )
      91             :     {
      92     6316423 :         IGF_write_bit( hBstr, bitCount, ( ( value & ( 1 << bits ) ) == 0 ) ? 0 : 1 );
      93             :     }
      94             : 
      95     6316423 :     return;
      96             : }
      97             : 
      98             : 
      99             : /*-------------------------------------------------------------------*
     100             :  * IGF_getCrest_new()
     101             :  *
     102             :  * crest factor calculation
     103             :  *-------------------------------------------------------------------*/
     104             : 
     105             : /*! r: crest factor */
     106     5530593 : 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     5530593 :     int32_t x_eff = 0;
     115     5530593 :     int16_t x_max = 0;
     116     5530593 :     float crest = 1.f;
     117             : 
     118   381195451 :     for ( i = start; i < stop; i++ )
     119             :     {
     120   375664858 :         x = logSpec[i];
     121   375664858 :         x_eff += x * x;
     122             : 
     123   375664858 :         if ( x > x_max )
     124             :         {
     125    17272360 :             x_max = x;
     126             :         }
     127             :     }
     128             : 
     129     5530593 :     x_eff /= ( stop - start );
     130             : 
     131     5530593 :     if ( x_eff > 0 && x_max > 0 )
     132             :     {
     133     4940277 :         crest = max( 1.f, (float) x_max / sqrtf( (float) x_eff ) );
     134             :     }
     135             : 
     136     5530593 :     return crest;
     137             : }
     138             : 
     139             : 
     140             : /*-------------------------------------------------------------------*
     141             :  * IGF_getSFM_new()
     142             :  *
     143             :  * calculates spectral flatness measurement
     144             :  *-------------------------------------------------------------------*/
     145             : 
     146             : /*! r: SFM value */
     147     5530593 : 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     5530593 :     num = 0;
     163     5530593 :     denom = 1.f;
     164     5530593 :     sfm = 1.f;
     165             : 
     166   381195451 :     for ( i = start; i < stop; i++ )
     167             :     {
     168   375664858 :         tmp = powerSpectrum[i];
     169   375664858 :         n = logSpec[i /*-start*/];
     170   375664858 :         num += n;
     171   375664858 :         denom += tmp;
     172             :     }
     173             : 
     174     5530593 :     numf = (float) num / (float) ( stop - start );
     175     5530593 :     denom /= (float) ( stop - start );
     176             : 
     177     5530593 :     if ( denom != 0 )
     178             :     {
     179     5530593 :         sfm = min( ( powf( 2.0f, numf + 0.5f ) / denom ), 1.0f );
     180             :     }
     181             : 
     182     5530593 :     return sfm;
     183             : }
     184             : 
     185             : 
     186             : /*-------------------------------------------------------------------*
     187             :  * IGF_getTilt()
     188             :  *
     189             :  * calculates spectral tilt
     190             :  *-------------------------------------------------------------------*/
     191             : 
     192             : /*! r: spectral tilt value */
     193       12968 : 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       12968 :     x = 1;
     207       12968 :     mean_x = mean_y = mean_xy = mean_x2 = 0.f;
     208             : 
     209       12968 :     width = stop - start;
     210      793982 :     for ( i = start; i < stop; i++ )
     211             :     {
     212      781014 :         mean_x += x;
     213      781014 :         mean_x2 += x * x;
     214      781014 :         y = 20.f * log10f( max( 1.f, powerSpectrum[i] ) );
     215      781014 :         mean_y += y;
     216      781014 :         mean_xy += y * x;
     217             : 
     218      781014 :         x++;
     219             :     }
     220       12968 :     mean_y /= width;
     221       12968 :     mean_x /= width;
     222       12968 :     mean_xy /= width;
     223       12968 :     mean_x2 /= width;
     224       12968 :     slope = ( mean_xy - mean_x * mean_y ) / ( mean_x2 - mean_x * mean_x );
     225             : 
     226       12968 :     return slope;
     227             : }
     228             : 
     229             : 
     230             : /*-------------------------------------------------------------------*
     231             :  * IGF_getTNR()
     232             :  *
     233             :  * calculates tonal-to-noise ratio
     234             :  *-------------------------------------------------------------------*/
     235             : 
     236             : /*! r: spectral tilt value */
     237       14453 : 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       14453 :     float avg = 0.f;
     247       14453 :     float tonal = 0.f;
     248       14453 :     float noise = EPSILON;
     249             :     float tonalToNoise;
     250             :     float rootSpec[300];
     251             : 
     252       14453 :     set_f( rootSpec, 0, 300 );
     253             : 
     254       14453 :     width = stop - start;
     255      877459 :     for ( i = start; i < stop; i++ )
     256             :     {
     257      863006 :         rootSpec[i - start] = sqrtf( powerSpectrum[i] );
     258      863006 :         avg += rootSpec[i - start];
     259             :     }
     260       14453 :     avg /= width;
     261             : 
     262      877459 :     for ( i = start; i < stop; i++ )
     263             :     {
     264      863006 :         float normSpec = rootSpec[i - start] / avg;
     265      863006 :         if ( normSpec > 1 + adap )
     266             :         {
     267       69453 :             tonal += rootSpec[i - start];
     268             :         }
     269      793553 :         else if ( normSpec < 1 )
     270             :         {
     271      701169 :             noise += rootSpec[i - start];
     272             :         }
     273             :     }
     274             : 
     275       14453 :     tonalToNoise = 20.f * log10f( max( 1e-018f, tonal / noise ) );
     276             : 
     277       14453 :     return tonalToNoise;
     278             : }
     279             : 
     280             : 
     281             : /*-------------------------------------------------------------------*
     282             :  * IGF_getCrest()
     283             :  *
     284             :  * crest factor calculation
     285             :  *-------------------------------------------------------------------*/
     286             : 
     287             : /*! r: crest factor */
     288      815367 : 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      815367 :     int32_t x_eff = 0;
     297      815367 :     int16_t x_max = 0;
     298      815367 :     float crest = 1.f;
     299             : 
     300    43578207 :     for ( i = start; i < stop; i++ )
     301             :     {
     302    42762840 :         x = max( 0, (int16_t) ( logf( max( FLT_MIN, powerSpectrum[i] ) ) * INV_LOG_2 ) );
     303    42762840 :         x_eff += x * x;
     304             : 
     305    42762840 :         if ( x > x_max )
     306             :         {
     307     2453059 :             x_max = x;
     308             :         }
     309             :     }
     310             : 
     311      815367 :     x_eff /= ( stop - start );
     312             : 
     313      815367 :     if ( x_eff > 0 && x_max > 0 )
     314             :     {
     315      752389 :         crest = max( 1.f, (float) x_max / sqrtf( (float) x_eff ) );
     316             :     }
     317             : 
     318      815367 :     return crest;
     319             : }
     320             : 
     321             : 
     322             : /*-------------------------------------------------------------------*
     323             :  * IGF_getSFM()
     324             :  *
     325             :  * calculates spectral flatness measurement
     326             :  *-------------------------------------------------------------------*/
     327             : 
     328             : /*! r: SFM value */
     329      815367 : 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      815367 :     num = 0;
     344      815367 :     denom = 1.f;
     345      815367 :     sfm = 1.f;
     346             : 
     347    43578207 :     for ( i = start; i < stop; i++ )
     348             :     {
     349    42762840 :         tmp = powerSpectrum[i];
     350    42762840 :         n = max( 0, (int16_t) ( logf( max( FLT_MIN, tmp ) ) * INV_LOG_2 ) );
     351    42762840 :         num += n;
     352    42762840 :         denom += tmp;
     353             :     }
     354             : 
     355      815367 :     numf = (float) num / (float) ( stop - start );
     356      815367 :     denom /= (float) ( stop - start );
     357             : 
     358      815367 :     if ( denom != 0 )
     359             :     {
     360      815367 :         sfm = min( ( powf( 2.0f, numf + 0.5f ) / denom ), 1.0f );
     361             :     }
     362             : 
     363      815367 :     return sfm;
     364             : }
     365             : 
     366             : 
     367             : /*-------------------------------------------------------------------*
     368             :  * IGF_CalculateEnvelope()
     369             :  *
     370             :  * envelope estimation
     371             :  *-------------------------------------------------------------------*/
     372             : 
     373      509215 : 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      509215 :     hPrivateData = &hIGFEnc->igfData;
     403      509215 :     hGrid = &hPrivateData->igfInfo.grid[(int16_t) igfGridIdx];
     404      509215 :     swb_offset = hGrid->swb_offset;
     405             : 
     406      509215 :     if ( element_mode > EVS_MONO )
     407             :     {
     408      508569 :         if ( igfGridIdx != IGF_GRID_LB_NORM )
     409             :         {
     410      168084 :             for ( sfbCnt = 0; sfbCnt < hGrid->sfbWrap[hGrid->nTiles] - hGrid->sfbWrap[0]; sfbCnt++ )
     411             :             {
     412             :                 /* reset filter */
     413      140256 :                 hPrivateData->prevSFM_FIR_SFB_TB[sfbCnt] = 0.f;
     414      140256 :                 hPrivateData->prevSFM_IIR_SFB_TB[sfbCnt] = 0.f;
     415      140256 :                 hPrivateData->prevSFM_FIR_SFB_SB[sfbCnt] = 0.f;
     416      140256 :                 hPrivateData->prevSFM_IIR_SFB_SB[sfbCnt] = 0.f;
     417      140256 :                 hPrivateData->prevDampingFactor_IIR[sfbCnt] = -1.f;
     418      140256 :                 hPrivateData->dampingFactorSmoothing[sfbCnt] = 2;
     419             :             }
     420             :         }
     421             :     }
     422             : 
     423      509215 :     if ( pPowerSpectrum )
     424             :     {
     425   234313035 :         for ( sb = hGrid->sbWrap[0]; sb < swb_offset[hGrid->sfbWrap[hGrid->nTiles]]; sb++ )
     426             :         {
     427   233867132 :             hPrivateData->logSpec[sb] = max( 0, (int16_t) ( log( max( FLT_MIN, pPowerSpectrum[sb] ) ) * INV_LOG_2 ) );
     428             :         }
     429             :     }
     430             : 
     431     2254268 :     for ( tile_idx = 0; tile_idx < hGrid->nTiles; tile_idx++ )
     432             :     {
     433     1745053 :         strt_cpy = hGrid->sbWrap[tile_idx];
     434             : 
     435     4421181 :         for ( sfb = hGrid->sfbWrap[tile_idx]; sfb < hGrid->sfbWrap[tile_idx + 1]; sfb++ )
     436             :         {
     437     2676128 :             width = swb_offset[sfb + 1] - swb_offset[sfb];
     438             : 
     439     2676128 :             sfbEnergyTileR = EPSILON;
     440     2676128 :             sfbEnergyTileC = EPSILON;
     441     2676128 :             sfbEnergyC = EPSILON;
     442             : 
     443     2676128 :             if ( pPowerSpectrum )
     444             :             {
     445     2387863 :                 tmp = strt_cpy;
     446   138582643 :                 for ( sb = swb_offset[sfb]; sb < swb_offset[sfb + 1]; sb++ )
     447             :                 {
     448   136194780 :                     sfbEnergyC += pPowerSpectrum[sb];
     449   136194780 :                     sfbEnergyTileR += pMDCTSpectrum[strt_cpy] * pMDCTSpectrum[strt_cpy];
     450   136194780 :                     sfbEnergyTileC += pPowerSpectrum[strt_cpy];
     451             : 
     452   136194780 :                     strt_cpy++;
     453             :                 }
     454             : 
     455     2387863 :                 sfbEnergyTileR /= width;
     456     2387863 :                 gain = (float) ( sfbEnergyTileR * ( sfbEnergyC / sfbEnergyTileC ) );
     457             : 
     458     2387863 :                 if ( element_mode > EVS_MONO )
     459             :                 {
     460     2383253 :                     if ( !isTransient )
     461             :                     {
     462             :                         float diffSFM;
     463     2376726 :                         float shiftedSFM = 0.f;
     464             : 
     465     2376726 :                         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     2376726 :                         tmp_sb = IGF_getSFM_new( pPowerSpectrum, hPrivateData->logSpec, tmp, strt_cpy ) / IGF_getCrest_new( hPrivateData->logSpec, tmp, strt_cpy );
     467             : 
     468     2376726 :                         if ( last_core_acelp || hPrivateData->wasTransient )
     469             :                         {
     470       91375 :                             hPrivateData->prevSFM_FIR_SFB_TB[sfb] = hPrivateData->prevSFM_IIR_SFB_TB[sfb] = tmp_tb;
     471       91375 :                             hPrivateData->prevSFM_FIR_SFB_SB[sfb] = hPrivateData->prevSFM_IIR_SFB_SB[sfb] = tmp_sb;
     472             :                         }
     473             : 
     474     2376726 :                         hPrivateData->SFM_tb[sfb] = tmp_tb + hPrivateData->prevSFM_FIR_SFB_TB[sfb] + 0.5f * hPrivateData->prevSFM_IIR_SFB_TB[sfb];
     475     2376726 :                         hPrivateData->SFM_tb[sfb] = min( 2.7f, hPrivateData->SFM_tb[sfb] );
     476     2376726 :                         hPrivateData->SFM_sb[sfb] = tmp_sb + hPrivateData->prevSFM_FIR_SFB_SB[sfb] + 0.5f * hPrivateData->prevSFM_IIR_SFB_SB[sfb];
     477     2376726 :                         hPrivateData->SFM_sb[sfb] = min( 2.7f, hPrivateData->SFM_sb[sfb] );
     478             : 
     479     2376726 :                         diffSFM = hPrivateData->SFM_sb[sfb] - hPrivateData->SFM_tb[sfb];
     480             : 
     481     2376726 :                         if ( diffSFM > 0.f && hPrivateData->SFM_tb[sfb] < 0.1f ) /* check whether target SFB is more tonal than source SFB */
     482       12968 :                         {
     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       12968 :                             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       12968 :                             threshold = 60.f / ( (float) width );
     494       12968 :                             if ( slope < -threshold )
     495             :                             {
     496         229 :                                 int16_t shift = width >> 1;
     497         229 :                                 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       12739 :                             else if ( ( slope > 1.f * threshold ) && ( sfb != hGrid->sfbWrap[hGrid->nTiles] - 1 ) )
     500             :                             {
     501          53 :                                 int16_t shift = width >> 1;
     502          53 :                                 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       12968 :                             if ( shiftedSFM > 0.04f )
     506             :                             {
     507          32 :                                 currDampingFactor = 1.f;
     508             :                             }
     509             :                             else
     510             :                             {
     511       12936 :                                 alpha = min( 320.f / (float) swb_offset[sfb + 1], 1.25f );
     512       12936 :                                 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       12936 :                                 adap = (float) width / 40.f;
     517       12936 :                                 tonalToNoise = IGF_getTNR( pPowerSpectrum, swb_offset[sfb], swb_offset[sfb + 1], adap );
     518       12936 :                                 if ( ( tonalToNoise - ( 10 + adap ) ) < 0 )
     519             :                                 {
     520        9315 :                                     currDampingFactor += 0.03f * ( ( 10 + adap ) - tonalToNoise );
     521             :                                 }
     522             :                             }
     523             : 
     524       12968 :                             if ( last_core_acelp || hPrivateData->wasTransient || hPrivateData->prevDampingFactor_IIR[sfb] == -1 )
     525             :                             {
     526        4529 :                                 hPrivateData->prevDampingFactor_IIR[sfb] = max( currDampingFactor, 0.1f );
     527             :                             }
     528       12968 :                             if ( last_core_acelp )
     529             :                             {
     530         572 :                                 hPrivateData->dampingFactorSmoothing[sfb] = 2;
     531             :                             }
     532             : 
     533       12968 :                             dampingFactor = ( currDampingFactor + hPrivateData->prevDampingFactor_IIR[sfb] ) / 2;
     534             : 
     535       12968 :                             gain *= min( dampingFactor + hPrivateData->dampingFactorSmoothing[sfb] * 0.1f, 1 );
     536             : 
     537       12968 :                             hPrivateData->prevDampingFactor_IIR[sfb] = dampingFactor;
     538       12968 :                             if ( hPrivateData->dampingFactorSmoothing[sfb] > 0 )
     539             :                             {
     540        5810 :                                 hPrivateData->dampingFactorSmoothing[sfb]--;
     541             :                             }
     542             :                         }
     543             :                         else
     544             :                         {
     545     2363758 :                             hPrivateData->prevDampingFactor_IIR[sfb] = -1;
     546     2363758 :                             hPrivateData->dampingFactorSmoothing[sfb] = 1;
     547             :                         }
     548             : 
     549     2376726 :                         hPrivateData->prevSFM_FIR_SFB_TB[sfb] = tmp_tb;
     550     2376726 :                         hPrivateData->prevSFM_IIR_SFB_TB[sfb] = hPrivateData->SFM_tb[sfb];
     551     2376726 :                         hPrivateData->prevSFM_FIR_SFB_SB[sfb] = tmp_sb;
     552     2376726 :                         hPrivateData->prevSFM_IIR_SFB_SB[sfb] = hPrivateData->SFM_sb[sfb];
     553             :                     }
     554             :                     else
     555             :                     {
     556        6527 :                         hPrivateData->prevSFM_FIR_SFB_TB[sfb] = 0.f;
     557        6527 :                         hPrivateData->prevSFM_IIR_SFB_TB[sfb] = 0.f;
     558        6527 :                         hPrivateData->prevSFM_FIR_SFB_SB[sfb] = 0.f;
     559        6527 :                         hPrivateData->prevSFM_IIR_SFB_SB[sfb] = 0.f;
     560        6527 :                         hPrivateData->prevDampingFactor_IIR[sfb] = -1.f;
     561        6527 :                         hPrivateData->dampingFactorSmoothing[sfb] = 2;
     562             :                     }
     563             :                 }
     564             :             }
     565             :             else
     566             :             {
     567      288265 :                 sfbEnergyR = EPSILON + sum2_f( pMDCTSpectrum + swb_offset[sfb], width ) / width;
     568      288265 :                 gain = (float) ( sfbEnergyR );
     569             : 
     570      288265 :                 if ( element_mode > EVS_MONO )
     571             :                 {
     572      288257 :                     hPrivateData->prevSFM_FIR_SFB_TB[sfb] = 0.f;
     573      288257 :                     hPrivateData->prevSFM_IIR_SFB_TB[sfb] = 0.f;
     574      288257 :                     hPrivateData->prevSFM_FIR_SFB_SB[sfb] = 0.f;
     575      288257 :                     hPrivateData->prevSFM_IIR_SFB_SB[sfb] = 0.f;
     576      288257 :                     hPrivateData->prevDampingFactor_IIR[sfb] = -1.f;
     577      288257 :                     hPrivateData->dampingFactorSmoothing[sfb] = 2;
     578             :                 }
     579             :             }
     580             : 
     581     2676128 :             gain *= att;
     582             : 
     583     2676128 :             gain = 0.5f + (float) ( 2.885390081777927f * logf( gain ) + 16.f );
     584     2676128 :             if ( !isTransient && ( hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_SWB_48000_CPE || hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_FB_48000_CPE ) )
     585             :             {
     586      382467 :                 gain += 0.25f; /* better preservation of original HF band energy */
     587             :             }
     588     2676128 :             if ( !isTransient && ( hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_SWB_64000_CPE || hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_FB_64000_CPE ) )
     589             :             {
     590      494912 :                 gain += 0.125f;
     591             :             }
     592     2676128 :             gain = min( gain, 91.f ); /* 13+15+63, see arithcode encode residual */
     593     2676128 :             gain = max( gain, 0.f );
     594             : 
     595     2676128 :             hPrivateData->igfScfQuantized[sfb] = (int16_t) ( gain );
     596             :         }
     597             :     }
     598             : 
     599      509215 :     return;
     600             : }
     601             : 
     602             : 
     603             : /*-------------------------------------------------------------------*
     604             :  * IGF_CalculateStereoEnvelope()
     605             :  *
     606             :  * envelope estimation
     607             :  *-------------------------------------------------------------------*/
     608             : 
     609      102686 : 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      102686 :     hPrivateData = &hIGFEnc->igfData;
     643      102686 :     hGrid = &hPrivateData->igfInfo.grid[(int16_t) igfGridIdx];
     644      102686 :     swb_offset = hGrid->swb_offset;
     645             : 
     646      102686 :     if ( igfGridIdx != IGF_GRID_LB_NORM )
     647             :     {
     648       24302 :         for ( sfbCnt = 0; sfbCnt < hGrid->sfbWrap[hGrid->nTiles] - hGrid->sfbWrap[0]; sfbCnt++ )
     649             :         {
     650             :             /* reset filter */
     651       19908 :             hPrivateData->prevSFM_FIR_SFB_TB[sfbCnt] = 0.f;
     652       19908 :             hPrivateData->prevSFM_IIR_SFB_TB[sfbCnt] = 0.f;
     653       19908 :             hPrivateData->prevSFM_FIR_SFB_SB[sfbCnt] = 0.f;
     654       19908 :             hPrivateData->prevSFM_IIR_SFB_SB[sfbCnt] = 0.f;
     655             :         }
     656             :     }
     657             : 
     658      102686 :     if ( pPowerSpectrum )
     659             :     {
     660    39114020 :         for ( sb = hGrid->sbWrap[0]; sb < swb_offset[hGrid->sfbWrap[hGrid->nTiles]]; sb++ )
     661             :         {
     662    39030504 :             hPrivateData->logSpec[sb] = max( 0, (int16_t) ( logf( max( FLT_MIN, pPowerSpectrum[sb] ) ) * INV_LOG_2 ) );
     663             :         }
     664             :     }
     665             : 
     666      400774 :     for ( tile_idx = 0; tile_idx < hGrid->nTiles; tile_idx++ )
     667             :     {
     668      298088 :         strt_cpy = hGrid->sbWrap[tile_idx];
     669             : 
     670      798876 :         for ( sfb = hGrid->sfbWrap[tile_idx]; sfb < hGrid->sfbWrap[tile_idx + 1]; sfb++ )
     671             :         {
     672      500788 :             width = swb_offset[sfb + 1] - swb_offset[sfb];
     673      500788 :             sfbEnergyTileR = EPSILON;
     674      500788 :             sfbEnergyTileC = EPSILON;
     675      500788 :             sfbEnergyC = EPSILON;
     676             : 
     677      500788 :             if ( pPowerSpectrum )
     678             :             {
     679      407672 :                 tmp = strt_cpy;
     680             : 
     681    21788488 :                 for ( sb = swb_offset[sfb]; sb < swb_offset[sfb + 1]; sb++ )
     682             :                 {
     683    21380816 :                     if ( coreMsMask[sb] != coreMsMask[strt_cpy] )
     684             :                     {
     685    12688452 :                         sfbEnergyC += pPowerSpectrum[sb];
     686    12688452 :                         sfbEnergyTileR += pMDCTSpectrumMsInv[strt_cpy] * pMDCTSpectrumMsInv[strt_cpy];
     687    12688452 :                         sfbEnergyTileC += pPowerSpectrumMsInv[strt_cpy];
     688    12688452 :                         tileSrcSpec[strt_cpy - tmp] = pPowerSpectrumMsInv[strt_cpy];
     689             :                     }
     690             :                     else
     691             :                     {
     692     8692364 :                         sfbEnergyC += pPowerSpectrum[sb];
     693     8692364 :                         sfbEnergyTileR += pMDCTSpectrum[strt_cpy] * pMDCTSpectrum[strt_cpy];
     694     8692364 :                         sfbEnergyTileC += pPowerSpectrum[strt_cpy];
     695     8692364 :                         tileSrcSpec[strt_cpy - tmp] = pPowerSpectrum[strt_cpy];
     696             :                     }
     697    21380816 :                     strt_cpy++;
     698             :                 }
     699             : 
     700      407672 :                 sfbEnergyTileR /= width;
     701      407672 :                 gain = (float) ( sfbEnergyTileR * ( sfbEnergyC / sfbEnergyTileC ) );
     702             : 
     703      407672 :                 if ( !isTransient )
     704             :                 {
     705             :                     float diffSFM;
     706      407672 :                     float shiftedSFM = 0.f;
     707             : 
     708      407672 :                     tmp_tb = IGF_getSFM( pPowerSpectrum, swb_offset[sfb], swb_offset[sfb + 1] ) / IGF_getCrest( pPowerSpectrum, swb_offset[sfb], swb_offset[sfb + 1] );
     709      407672 :                     tmp_sb = IGF_getSFM( tileSrcSpec, 0, strt_cpy - tmp ) / IGF_getCrest( tileSrcSpec, 0, strt_cpy - tmp );
     710             : 
     711      407672 :                     if ( last_core_acelp || hPrivateData->wasTransient )
     712             :                     {
     713        7823 :                         hPrivateData->prevSFM_FIR_SFB_TB[sfb] = hPrivateData->prevSFM_IIR_SFB_TB[sfb] = tmp_tb;
     714        7823 :                         hPrivateData->prevSFM_FIR_SFB_SB[sfb] = hPrivateData->prevSFM_IIR_SFB_SB[sfb] = tmp_sb;
     715             :                     }
     716             : 
     717      407672 :                     hPrivateData->SFM_tb[sfb] = tmp_tb + hPrivateData->prevSFM_FIR_SFB_TB[sfb] + 0.5f * hPrivateData->prevSFM_IIR_SFB_TB[sfb];
     718      407672 :                     hPrivateData->SFM_tb[sfb] = min( 2.7f, hPrivateData->SFM_tb[sfb] );
     719      407672 :                     hPrivateData->SFM_sb[sfb] = tmp_sb + hPrivateData->prevSFM_FIR_SFB_SB[sfb] + 0.5f * hPrivateData->prevSFM_IIR_SFB_SB[sfb];
     720      407672 :                     hPrivateData->SFM_sb[sfb] = min( 2.7f, hPrivateData->SFM_sb[sfb] );
     721             : 
     722      407672 :                     diffSFM = hPrivateData->SFM_sb[sfb] - hPrivateData->SFM_tb[sfb];
     723             : 
     724      407672 :                     if ( diffSFM > 0.f && hPrivateData->SFM_tb[sfb] < 0.1f ) /* check whether target SFB is more tonal than source SFB */
     725        1517 :                     {
     726             :                         float currDampingFactor, dampingFactor, threshold, alpha;
     727             : 
     728             :                         /* calculate spectral tilt to detect sudden drops (or increases) in energy in the current SFB */
     729        1517 :                         x = 1;
     730        1517 :                         mean_x = mean_y = mean_xy = mean_x2 = 0;
     731       85193 :                         for ( sb = swb_offset[sfb]; sb < swb_offset[sfb + 1]; sb++ )
     732             :                         {
     733       83676 :                             mean_x += x;
     734       83676 :                             mean_x2 += x * x;
     735       83676 :                             y = 20 * (int16_t) log10f( max( 1e-018f, pPowerSpectrum[sb] ) );
     736       83676 :                             mean_y += y;
     737       83676 :                             mean_xy += y * x;
     738             : 
     739       83676 :                             x++;
     740             :                         }
     741        1517 :                         mean_y /= width;
     742        1517 :                         mean_x /= width;
     743        1517 :                         mean_xy /= width;
     744        1517 :                         mean_x2 /= width;
     745        1517 :                         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        1517 :                         threshold = 60.f / ( (float) width );
     750        1517 :                         if ( slope < -threshold )
     751             :                         {
     752          15 :                             int16_t shift = width >> 1;
     753          15 :                             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        1502 :                         else if ( ( slope > 1.f * threshold ) && ( sfb != hGrid->sfbWrap[hGrid->nTiles] - 1 ) )
     756             :                         {
     757           8 :                             int16_t shift = width >> 1;
     758           8 :                             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        1517 :                         alpha = min( 320.f / (float) swb_offset[sfb + 1], 1.25f );
     762        1517 :                         currDampingFactor = expf( alpha * logf( hPrivateData->SFM_tb[sfb] / hPrivateData->SFM_sb[sfb] ) );
     763             : 
     764        1517 :                         if ( shiftedSFM > 0.04f )
     765             :                         {
     766           7 :                             currDampingFactor = 1.f;
     767             :                         }
     768             : 
     769        1517 :                         if ( last_core_acelp || hPrivateData->wasTransient || hPrivateData->prevDampingFactor_IIR[sfb] == -1 )
     770             :                         {
     771         727 :                             hPrivateData->prevDampingFactor_IIR[sfb] = max( currDampingFactor, 0.1f );
     772             :                         }
     773             : 
     774             :                         {
     775             :                             float tonalToNoise;
     776        1517 :                             float adap = ( (float) width ) / 30.f;
     777        1517 :                             tonalToNoise = IGF_getTNR( pPowerSpectrum, swb_offset[sfb], swb_offset[sfb + 1], adap );
     778        1517 :                             if ( ( tonalToNoise - ( 10 + adap ) ) < 0 )
     779             :                             {
     780        1371 :                                 currDampingFactor += 0.1f * ( ( 10 + adap ) - tonalToNoise );
     781             :                             }
     782             :                         }
     783             : 
     784        1517 :                         dampingFactor = ( currDampingFactor + hPrivateData->prevDampingFactor_IIR[sfb] ) / 2;
     785        1517 :                         dampingFactor = max( dampingFactor, hPrivateData->prevDampingFactor_IIR[sfb] / 2 );
     786             : 
     787        1517 :                         gain *= min( dampingFactor + hPrivateData->dampingFactorSmoothing[sfb] * 0.1f, 1 );
     788             : 
     789        1517 :                         hPrivateData->prevDampingFactor_IIR[sfb] = dampingFactor;
     790        1517 :                         if ( hPrivateData->dampingFactorSmoothing[sfb] > 0 )
     791             :                         {
     792         874 :                             hPrivateData->dampingFactorSmoothing[sfb]--;
     793             :                         }
     794             :                     }
     795             :                     else
     796             :                     {
     797      406155 :                         hPrivateData->prevDampingFactor_IIR[sfb] = -1;
     798      406155 :                         hPrivateData->dampingFactorSmoothing[sfb] = 1;
     799             :                     }
     800             : 
     801      407672 :                     hPrivateData->prevSFM_FIR_SFB_TB[sfb] = tmp_tb;
     802      407672 :                     hPrivateData->prevSFM_IIR_SFB_TB[sfb] = hPrivateData->SFM_tb[sfb];
     803      407672 :                     hPrivateData->prevSFM_FIR_SFB_SB[sfb] = tmp_sb;
     804      407672 :                     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       93116 :                 sfbEnergyR = EPSILON + sum2_f( pMDCTSpectrum + swb_offset[sfb], width ) / width;
     819       93116 :                 gain = (float) ( sfbEnergyR );
     820             : 
     821       93116 :                 hPrivateData->prevSFM_FIR_SFB_TB[sfb] = 0.f;
     822       93116 :                 hPrivateData->prevSFM_IIR_SFB_TB[sfb] = 0.f;
     823       93116 :                 hPrivateData->prevSFM_FIR_SFB_SB[sfb] = 0.f;
     824       93116 :                 hPrivateData->prevSFM_IIR_SFB_SB[sfb] = 0.f;
     825             :             }
     826             : 
     827      500788 :             gain = 0.5f + (float) ( 2.885390081777927f * logf( gain ) + 16.f );
     828      500788 :             if ( !isTransient && ( hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_SWB_48000_CPE || hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_FB_48000_CPE ) )
     829             :             {
     830      108845 :                 gain += 0.25f; /* better preservation of original HF band energy */
     831             :             }
     832      500788 :             if ( !isTransient && ( hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_SWB_64000_CPE || hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_FB_64000_CPE ) )
     833             :             {
     834      177625 :                 gain += 0.125f;
     835             :             }
     836      500788 :             gain = min( gain, 91.f ); /* 13+15+63, see arithcode encode residual */
     837      500788 :             gain = max( gain, 0.f );
     838             : 
     839      500788 :             hPrivateData->igfScfQuantized[sfb] = (int16_t) ( gain );
     840             :         }
     841             :     }
     842             : 
     843      102686 :     return;
     844             : }
     845             : 
     846             : 
     847             : /*-------------------------------------------------------------------*
     848             :  * IGF_WriteEnvelope()
     849             :  *
     850             :  * writes IGF SCF values
     851             :  *-------------------------------------------------------------------*/
     852             : 
     853             : /*! r: number of bits writen */
     854     1200188 : 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     1200188 :     startBitCount = *pBitOffset;
     870     1200188 :     totBitCount = 0;
     871     1200188 :     *igfAllZero = 1;
     872     1200188 :     hPrivateData = &hIGFEnc->igfData;
     873     1200188 :     hGrid = &hPrivateData->igfInfo.grid[igfGridIdx];
     874             : 
     875     1206300 :     for ( sfb = hGrid->startSfb; sfb < hGrid->stopSfb; sfb++ )
     876             :     {
     877     1205414 :         if ( hPrivateData->igfScfQuantized[sfb] != 0 )
     878             :         {
     879     1199302 :             *igfAllZero = 0;
     880     1199302 :             break;
     881             :         }
     882             :     }
     883             : 
     884     1200188 :     if ( *igfAllZero )
     885             :     {
     886         886 :         IGF_write_bit( hBstr, pBitOffset, 1 );
     887             : 
     888         886 :         if ( hBstr == NULL )
     889             :         {
     890         440 :             IGFSCFEncoderSaveContextState( &hPrivateData->hIGFSCFArithEnc, igfGridIdx );
     891             :         }
     892             : 
     893         886 :         IGFSCFEncoderReset( &hPrivateData->hIGFSCFArithEnc );
     894             : 
     895         886 :         if ( hBstr == NULL )
     896             :         {
     897         440 :             IGFSCFEncoderRestoreContextState( &hPrivateData->hIGFSCFArithEnc, igfGridIdx );
     898             :         }
     899             :     }
     900             :     else
     901             :     {
     902     1199302 :         IGF_write_bit( hBstr, pBitOffset, 0 );
     903             : 
     904     1199302 :         if ( hBstr == NULL )
     905             :         {
     906      587847 :             IGFSCFEncoderSaveContextState( &hPrivateData->hIGFSCFArithEnc, igfGridIdx );
     907             :         }
     908             : 
     909     1199302 :         *pBitOffset = IGFSCFEncoderEncode( &hPrivateData->hIGFSCFArithEnc, hBstr, *pBitOffset, &hPrivateData->igfScfQuantized[hGrid->startSfb], igfGridIdx, isIndepFlag );
     910             : 
     911     1199302 :         if ( hBstr == NULL )
     912             :         {
     913      587847 :             IGFSCFEncoderRestoreContextState( &hPrivateData->hIGFSCFArithEnc, igfGridIdx );
     914             :         }
     915             :     }
     916     1200188 :     totBitCount = *pBitOffset - startBitCount;
     917             : 
     918     1200188 :     return totBitCount;
     919             : }
     920             : 
     921             : 
     922             : /*-------------------------------------------------------------------*
     923             :  * IGF_ErodeSpectrum()
     924             :  *
     925             :  * identifies significant spectral content
     926             :  *-------------------------------------------------------------------*/
     927             : 
     928             : /*! r: highPassEnergy */
     929      611901 : 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      611901 :     highPassEner = 0.f;
     955      611901 :     hPrivateData = &hIGFEnc->igfData;
     956      611901 :     hGrid = &hPrivateData->igfInfo.grid[(int16_t) igfGridIdx];
     957      611901 :     igfBgn = hGrid->startLine;
     958      611901 :     igfEnd = hGrid->stopLine;
     959      611901 :     startSfb = hGrid->startSfb;
     960      611901 :     stopSfb = hGrid->stopSfb;
     961      611901 :     swb_offset = hGrid->swb_offset;
     962      611901 :     igfScaleF = hPrivateData->igfScfQuantized;
     963             : 
     964      611901 :     if ( pPowerSpectrum == NULL )
     965             :     {
     966     4753054 :         for ( i = igfBgn; i < hGrid->infoGranuleLen; i++ )
     967             :         {
     968     4729440 :             pSpectrum[i] = 0.f;
     969             :         }
     970       23614 :         return 0;
     971             :     }
     972             : 
     973      588287 :     if ( igfBgn > 0 )
     974             :     {
     975   268632303 :         for ( i = 0; i < igfBgn; i++ )
     976             :         {
     977   268044016 :             highPassEner += (float) i * pPowerSpectrum[i];
     978             :         }
     979             : 
     980      588287 :         if ( hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_SWB_9600 ||
     981      588287 :              hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_RF_SWB_13200 ||
     982      588287 :              hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_SWB_13200 ||
     983      588012 :              hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_SWB_16400_CPE )
     984             :         {
     985       27492 :             factor = 1.f;
     986             :         }
     987      560795 :         else if ( mct_on && ( hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_SWB_48000_CPE || hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_SWB_64000_CPE ) )
     988             :         {
     989        4076 :             factor = 0.7f;
     990             :         }
     991             :         else
     992             :         {
     993      556719 :             factor = 2.f;
     994             :         }
     995      588287 :         highPassEner /= igfBgn * factor; /* for 9.6kbs use 1.f */
     996      588287 :         lastLine = pSpectrum[i - 1];
     997      588287 :         nextLine = ( pPowerSpectrum[i - 1] < highPassEner ) ? 0.0f : pSpectrum[i];
     998             : 
     999   173370624 :         for ( /*i*/; i < igfEnd - 1; i++ )
    1000             :         {
    1001   172782337 :             if ( pPowerSpectrum[i] < highPassEner )
    1002             :             {
    1003   172737031 :                 lastLine = pSpectrum[i];
    1004   172737031 :                 pSpectrum[i] = nextLine;
    1005   172737031 :                 nextLine = 0.0f;
    1006             :             }
    1007             :             else
    1008             :             {
    1009       45306 :                 pSpectrum[i - 1] = lastLine;
    1010       45306 :                 lastLine = pSpectrum[i];
    1011       45306 :                 nextLine = pSpectrum[i + 1];
    1012             :             }
    1013             :         }
    1014             : 
    1015             :         /* i == igfEnd - 1 */
    1016      588287 :         if ( pPowerSpectrum[i] < highPassEner )
    1017             :         {
    1018      588163 :             pSpectrum[i] = 0.f;
    1019             :         }
    1020             :     }
    1021             : 
    1022             :     /* delete spectrum above igfEnd: */
    1023    70848447 :     for ( i = igfEnd; i < hGrid->infoGranuleLen; i++ )
    1024             :     {
    1025    70260160 :         pSpectrum[i] = 0.f;
    1026    70260160 :         pPowerSpectrum[i] = 0.f;
    1027             :     }
    1028             : 
    1029      588287 :     if ( NULL != pPowerSpectrum )
    1030             :     {
    1031     3663755 :         for ( sfb = startSfb; sfb < stopSfb; sfb++ )
    1032             :         {
    1033     3075468 :             tmp = 0;
    1034   176446092 :             for ( line = swb_offset[sfb]; line < swb_offset[sfb + 1]; line++ )
    1035             :             {
    1036   173370624 :                 if ( pSpectrum[line] != 0.f )
    1037             :                 {
    1038       15562 :                     tmp++;
    1039             :                 }
    1040             :             }
    1041             : 
    1042     3075468 :             if ( tmp && igfScaleF[sfb] )
    1043             :             {
    1044        2574 :                 igfScaleF[sfb]--;
    1045             :             }
    1046             :         }
    1047             :     }
    1048             : 
    1049      588287 :     return highPassEner;
    1050             : }
    1051             : 
    1052             : 
    1053             : /*-------------------------------------------------------------------*
    1054             :  * IGF_Whitening()
    1055             :  *
    1056             :  * calculates the IGF whitening levels by SFM and crest
    1057             :  *-------------------------------------------------------------------*/
    1058             : 
    1059      611901 : 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      611901 :     SFM = -1.f;
    1081             : 
    1082      611901 :     hPrivateData = &hIGFEnc->igfData;
    1083      611901 :     hGrid = &hPrivateData->igfInfo.grid[(int16_t) igfGridIdx];
    1084             : 
    1085      611901 :     if ( igfGridIdx != IGF_GRID_LB_NORM )
    1086             :     {
    1087      139072 :         for ( p = 0; p < hGrid->nTiles; p++ )
    1088             :         {
    1089             :             /* reset filter */
    1090      106812 :             hPrivateData->prevSFM_FIR[p] = 0.f;
    1091      106812 :             hPrivateData->prevSFM_IIR[p] = 0.f;
    1092             : 
    1093             :             /* preset values: */
    1094      106812 :             hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_OFF;
    1095             :         }
    1096             :     }
    1097             : 
    1098     6730911 :     for ( p = 0; p < IGF_MAX_TILES; p++ )
    1099             :     {
    1100             :         /* update prev data: */
    1101     6119010 :         hPrivateData->igfPrevWhiteningLevel[p] = hPrivateData->igfCurrWhiteningLevel[p];
    1102             :         /* preset values: */
    1103     6119010 :         hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_OFF;
    1104             :     }
    1105             : 
    1106      611901 :     if ( !( isTransient || hPrivateData->wasTransient ) )
    1107             :     {
    1108      576378 :         if ( powerSpectrum )
    1109             :         {
    1110     2517979 :             for ( p = 0; p < hGrid->nTiles; p++ )
    1111             :             {
    1112             :                 int16_t sb;
    1113             : 
    1114     1942907 :                 if ( isTNSActive )
    1115             :                 {
    1116    14874869 :                     for ( sb = hGrid->tile[p]; sb < hGrid->tile[p + 1]; sb++ )
    1117             :                     {
    1118    14726182 :                         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     1942907 :                 if ( element_mode > EVS_MONO && ( hGrid->sfbWrap[p + 1] - hGrid->sfbWrap[p] ) == 1 )
    1124             :                 {
    1125     1166048 :                     tmp = hPrivateData->SFM_tb[p];
    1126             :                 }
    1127             :                 else
    1128             :                 {
    1129      776859 :                     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     1942907 :                 if ( last_core_acelp || hPrivateData->wasTransient )
    1133             :                 {
    1134       49670 :                     hPrivateData->prevSFM_FIR[p] = hPrivateData->prevSFM_IIR[p] = tmp;
    1135             :                 }
    1136             : 
    1137     1942907 :                 if ( brate <= IVAS_48k && element_mode == IVAS_CPE_MDCT )
    1138             :                 {
    1139      447475 :                     num_Tiles = 0;
    1140      447475 :                     SFM_src = 0.f;
    1141      447475 :                     SFM_tar = 0.f;
    1142             : 
    1143      922215 :                     for ( sb = hGrid->sfbWrap[p]; sb < hGrid->sfbWrap[p + 1]; sb++ )
    1144             :                     {
    1145      474740 :                         num_Tiles++;
    1146      474740 :                         SFM_src += hPrivateData->SFM_sb[sb];
    1147      474740 :                         SFM_tar += hPrivateData->SFM_tb[sb];
    1148             :                     }
    1149             : 
    1150             :                     /* compute the average */
    1151      447475 :                     SFM_src /= num_Tiles;
    1152      447475 :                     SFM_tar /= num_Tiles;
    1153             : 
    1154      447475 :                     if ( ( p > 0 ) && ( hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_SWB_48000_CPE || hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_FB_48000_CPE ) )
    1155             :                     {
    1156      377440 :                         if ( ( p == 1 ) && ( abs( hPrivateData->igfCurrWhiteningLevel[0] - hPrivateData->igfCurrWhiteningLevel[1] ) == 2 ) ) /* OFF vs. STRONG */
    1157             :                         {
    1158        6304 :                             hPrivateData->igfCurrWhiteningLevel[0] = IGF_WHITENING_MID;
    1159             :                         }
    1160      377440 :                         hPrivateData->igfCurrWhiteningLevel[p] = hPrivateData->igfCurrWhiteningLevel[p - 1];
    1161             :                     }
    1162       70035 :                     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       33715 :                         if ( ( SFM_tar <= SFM_src ) || ( SFM_tar <= ( SFM_src + 0.5f ) ) )
    1167             :                         {
    1168       27948 :                             hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_OFF;
    1169             :                         }
    1170             : 
    1171             :                         /* whitening mid:  */
    1172       33715 :                         if ( ( SFM_tar > ( SFM_src + 0.5f ) ) && ( SFM_tar <= ( SFM_src + 1.25f ) ) )
    1173             :                         {
    1174        5278 :                             hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_MID;
    1175             :                         }
    1176             : 
    1177             :                         /* whitening strong */
    1178       33715 :                         if ( SFM_tar > ( SFM_src + 1.25f ) )
    1179             :                         {
    1180         489 :                             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       36320 :                         if ( ( SFM_tar <= SFM_src ) || ( SFM_tar <= ( SFM_src + 0.1f ) ) )
    1188             :                         {
    1189       18183 :                             hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_OFF;
    1190             :                         }
    1191             : 
    1192             :                         /* whitening mid:  */
    1193       36320 :                         if ( ( SFM_tar > ( SFM_src + 0.1f ) ) && ( SFM_tar <= ( SFM_src + 0.5f ) ) )
    1194             :                         {
    1195       11666 :                             hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_MID;
    1196             :                         }
    1197             : 
    1198             :                         /* whitening strong */
    1199       36320 :                         if ( SFM_tar > ( SFM_src + 0.5f ) )
    1200             :                         {
    1201        6471 :                             hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_STRONG;
    1202             :                         }
    1203             :                     }
    1204             : 
    1205      447475 :                     SFM = SFM_tar;
    1206             :                 }
    1207             :                 else
    1208             :                 {
    1209     1495432 :                     if ( element_mode > EVS_MONO && ( hGrid->sfbWrap[p + 1] - hGrid->sfbWrap[p] ) == 1 )
    1210             :                     {
    1211      745838 :                         SFM = tmp;
    1212             :                     }
    1213             :                     else
    1214             :                     {
    1215      749594 :                         SFM = tmp + hPrivateData->prevSFM_FIR[p] + 0.5f * hPrivateData->prevSFM_IIR[p];
    1216      749594 :                         SFM = min( 2.7f, SFM );
    1217             :                     }
    1218             : 
    1219     1495432 :                     hPrivateData->prevSFM_FIR[p] = tmp;
    1220     1495432 :                     hPrivateData->prevSFM_IIR[p] = SFM;
    1221             : 
    1222     1495432 :                     if ( SFM > hGrid->whiteningThreshold[1][p] )
    1223             :                     {
    1224      571563 :                         hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_STRONG;
    1225             :                     }
    1226      923869 :                     else if ( SFM > hGrid->whiteningThreshold[0][p] )
    1227             :                     {
    1228      589658 :                         hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_MID;
    1229             :                     }
    1230             :                     else
    1231             :                     {
    1232      334211 :                         hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_OFF;
    1233             :                     }
    1234             :                 }
    1235             : 
    1236     1942907 :                 if ( element_mode > EVS_MONO )
    1237             :                 {
    1238     1941282 :                     if ( last_core_acelp ) /* reset */
    1239             :                     {
    1240       49574 :                         set_f( hPrivateData->igfPastSFM[p], -1.f, IGF_PAST_SFM_LEN );
    1241       49574 :                         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     1891708 :                         if ( hPrivateData->igfCurrWhiteningLevel[p] != hPrivateData->igfPrevWhiteningLevel[p] &&
    1247      532755 :                              ( ( SFM > hGrid->whiteningThreshold[0][p] - 0.15f && SFM < hGrid->whiteningThreshold[0][p] + 0.15f ) ||
    1248      428244 :                                ( SFM > hGrid->whiteningThreshold[1][p] - 0.15f && SFM < hGrid->whiteningThreshold[1][p] + 0.15f ) ) )
    1249             :                         {
    1250      265183 :                             float mean_past_SFM = 0.f;
    1251      265183 :                             int16_t countable = 0;
    1252             :                             int16_t i;
    1253             : 
    1254             :                             /* compute mean of last (available) SFM values */
    1255     1591098 :                             for ( i = 0; i < IGF_PAST_SFM_LEN; i++ )
    1256             :                             {
    1257     1325915 :                                 if ( hPrivateData->igfPastSFM[p][i] >= 0.f )
    1258             :                                 {
    1259     1132183 :                                     mean_past_SFM += hPrivateData->igfPastSFM[p][i];
    1260     1132183 :                                     countable++;
    1261             :                                 }
    1262             :                             }
    1263      265183 :                             if ( countable )
    1264             :                             {
    1265      260164 :                                 mean_past_SFM /= countable;
    1266             : 
    1267             :                                 /* deny change in whitening level for small deviations from mean SFM */
    1268      260164 :                                 if ( fabs( SFM - mean_past_SFM ) < 0.2f )
    1269             :                                 {
    1270      124679 :                                     hPrivateData->igfCurrWhiteningLevel[p] = hPrivateData->igfPrevWhiteningLevel[p];
    1271             :                                 }
    1272             :                             }
    1273             :                         }
    1274             :                     }
    1275             : 
    1276     1941282 :                     hPrivateData->igfPastSFM[p][hPrivateData->igfPastSFM_pos] = SFM;
    1277             :                 }
    1278             :             }
    1279             : 
    1280      575072 :             switch ( hPrivateData->igfInfo.bitRateIndex )
    1281             :             {
    1282       84476 :                 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       84476 :                     hPrivateData->igfCurrWhiteningLevel[hGrid->nTiles - 1] = hPrivateData->igfCurrWhiteningLevel[hGrid->nTiles - 2];
    1300       84476 :                     break;
    1301      490596 :                 default:
    1302      490596 :                     break;
    1303             :             }
    1304             :         }
    1305             :         else
    1306             :         {
    1307        5727 :             for ( p = 0; p < hGrid->nTiles; p++ )
    1308             :             {
    1309        4421 :                 hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_MID;
    1310             :             }
    1311             :         }
    1312             :     }
    1313             :     else
    1314             :     {
    1315             :         /* reset filter */
    1316      390753 :         for ( p = 0; p < IGF_MAX_TILES; p++ )
    1317             :         {
    1318      355230 :             hPrivateData->prevSFM_FIR[p] = 0.f;
    1319      355230 :             hPrivateData->prevSFM_IIR[p] = 0.f;
    1320             :         }
    1321             :     }
    1322             : 
    1323      611901 :     if ( element_mode > EVS_MONO )
    1324             :     {
    1325      611255 :         if ( SFM == -1.f ) /* reset */
    1326             :         {
    1327      137006 :             for ( p = 0; p < hGrid->nTiles; p++ )
    1328             :             {
    1329      100196 :                 set_f( hPrivateData->igfPastSFM[p], -1.f, IGF_PAST_SFM_LEN );
    1330      100196 :                 hPrivateData->igfWhiteningHangoverCnt[p] = 2;
    1331             :             }
    1332             :         }
    1333             : 
    1334             :         /* vibrato handling */
    1335     1836617 :         for ( p = 0; p < hGrid->nTiles; p = p + 2 )
    1336             :         {
    1337     1225362 :             if ( ( hPrivateData->igfPrevWhiteningLevel[p] == IGF_WHITENING_OFF && hPrivateData->igfCurrWhiteningLevel[p] != IGF_WHITENING_OFF ) ||
    1338     1075486 :                  ( 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      928190 :                 for ( i = 0; i < 4; i++ )
    1345             :                 {
    1346      742552 :                     pastSfm_a[i] = hPrivateData->igfPastSFM[p][( hPrivateData->igfPastSFM_pos + 4 - i ) % IGF_PAST_SFM_LEN];
    1347      742552 :                     pastSfm_b[i] = hPrivateData->igfPastSFM[p + 1][( hPrivateData->igfPastSFM_pos + 4 - i ) % IGF_PAST_SFM_LEN];
    1348             :                 }
    1349      185638 :                 pastSfmDiffSum_a = pastSfmDiffSum_b = 0;
    1350      523194 :                 for ( i = 0; i < 3; i++ )
    1351             :                 {
    1352      432484 :                     if ( pastSfm_a[i + 1] != -1.f )
    1353             :                     {
    1354      337556 :                         pastSfmDiffSum_a += ( pastSfm_a[i] - pastSfm_a[i + 1] );
    1355      337556 :                         pastSfmDiffSum_b += ( pastSfm_b[i] - pastSfm_b[i + 1] );
    1356             :                     }
    1357             :                     else
    1358             :                     {
    1359       94928 :                         break;
    1360             :                     }
    1361             :                 }
    1362             : 
    1363             :                 /* if tonality oscillates between two tiles, turn whitening off in both */
    1364      185638 :                 if ( ( ( pastSfmDiffSum_a > 0.f && pastSfmDiffSum_b < 0.f ) ||
    1365       20516 :                        ( pastSfmDiffSum_a < 0.f && pastSfmDiffSum_b > 0.f ) ) &&
    1366       21920 :                      ( fabs( pastSfmDiffSum_a - pastSfmDiffSum_b ) > 0.5f ) )
    1367             :                 {
    1368        9263 :                     hPrivateData->igfCurrWhiteningLevel[p] = hPrivateData->igfCurrWhiteningLevel[p + 1] = IGF_WHITENING_OFF;
    1369             :                 }
    1370             :             }
    1371             :         }
    1372             : 
    1373             :         /* hangover */
    1374     2652733 :         for ( p = 0; p < hGrid->nTiles; p++ )
    1375             :         {
    1376     2041478 :             if ( hPrivateData->igfCurrWhiteningLevel[p] != hPrivateData->igfPrevWhiteningLevel[p] )
    1377             :             {
    1378      417618 :                 hPrivateData->igfWhiteningHangoverCnt[p]++;
    1379      417618 :                 if ( hPrivateData->igfWhiteningHangoverCnt[p] == 3 )
    1380             :                 {
    1381      116140 :                     hPrivateData->igfWhiteningHangoverCnt[p] = 0;
    1382             :                 }
    1383             :                 else
    1384             :                 {
    1385      301478 :                     hPrivateData->igfCurrWhiteningLevel[p] = hPrivateData->igfPrevWhiteningLevel[p];
    1386             :                 }
    1387             :             }
    1388             :             else
    1389             :             {
    1390     1623860 :                 hPrivateData->igfWhiteningHangoverCnt[p] = 0;
    1391             :             }
    1392             :         }
    1393             : 
    1394      611255 :         hPrivateData->igfPastSFM_pos = ( hPrivateData->igfPastSFM_pos + 1 ) % IGF_PAST_SFM_LEN;
    1395             :     }
    1396             : 
    1397      611901 :     hPrivateData->wasTransient = isTransient;
    1398             : 
    1399      611901 :     return;
    1400             : }
    1401             : 
    1402             : 
    1403             : /*-------------------------------------------------------------------*
    1404             :  * IGF_WriteWhiteningTile()
    1405             :  *
    1406             :  * write whitening levels into bitstream
    1407             :  *-------------------------------------------------------------------*/
    1408             : 
    1409             : /*! r: number of bits written */
    1410     2500670 : 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     2500670 :     totBitCount = 0;
    1420     2500670 :     startBitCount = *pBitOffset;
    1421             : 
    1422     2500670 :     if ( whiteningLevel == IGF_WHITENING_MID )
    1423             :     {
    1424      939030 :         IGF_write_bits( hBstr, pBitOffset, 0, 1 );
    1425             :     }
    1426             :     else
    1427             :     {
    1428     1561640 :         IGF_write_bits( hBstr, pBitOffset, 1, 1 );
    1429     1561640 :         if ( whiteningLevel == IGF_WHITENING_OFF )
    1430             :         {
    1431      777948 :             IGF_write_bits( hBstr, pBitOffset, 0, 1 );
    1432             :         }
    1433             :         else
    1434             :         {
    1435      783692 :             IGF_write_bits( hBstr, pBitOffset, 1, 1 );
    1436             :         }
    1437             :     }
    1438     2500670 :     totBitCount = *pBitOffset - startBitCount;
    1439             : 
    1440     2500670 :     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     1200188 : 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     1200188 :     totBitCount = 0;
    1468     1200188 :     isSame = 1;
    1469     1200188 :     startBitCount = *pBitOffset;
    1470     1200188 :     hPrivateData = &hIGFEnc->igfData;
    1471     1200188 :     hGrid = &hPrivateData->igfInfo.grid[igfGridIdx];
    1472     1200188 :     nTiles = hGrid->nTiles;
    1473             : 
    1474     1200188 :     if ( isIndepFlag )
    1475             :     {
    1476     1188381 :         isSame = 0;
    1477             :     }
    1478             :     else
    1479             :     {
    1480       37829 :         for ( p = 0; p < nTiles; p++ )
    1481             :         {
    1482       26691 :             if ( hPrivateData->igfCurrWhiteningLevel[p] != hPrivateData->igfPrevWhiteningLevel[p] )
    1483             :             {
    1484         669 :                 isSame = 0;
    1485         669 :                 break;
    1486             :             }
    1487             :         }
    1488             :     }
    1489             : 
    1490     1200188 :     if ( isSame )
    1491             :     {
    1492       11138 :         IGF_write_bits( hBstr, pBitOffset, 1, 1 );
    1493             :     }
    1494             :     else
    1495             :     {
    1496     1189050 :         if ( !isIndepFlag )
    1497             :         {
    1498         669 :             IGF_write_bits( hBstr, pBitOffset, 0, 1 );
    1499             :         }
    1500             : 
    1501     1189050 :         IGF_WriteWhiteningTile( hBstr, pBitOffset, hPrivateData->igfCurrWhiteningLevel[0] );
    1502             : 
    1503     1189050 :         if ( hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_SWB_48000_CPE || hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_FB_48000_CPE )
    1504             :         {
    1505      146932 :             isSame = 1;
    1506             :         }
    1507             :         else
    1508             :         {
    1509     2068821 :             for ( p = 1; p < nTiles; p++ )
    1510             :             {
    1511     1324207 :                 isSame = 1;
    1512     1324207 :                 if ( hPrivateData->igfCurrWhiteningLevel[p] != hPrivateData->igfCurrWhiteningLevel[p - 1] )
    1513             :                 {
    1514      297504 :                     isSame = 0;
    1515      297504 :                     break;
    1516             :                 }
    1517             :             }
    1518             :         }
    1519             : 
    1520     1189050 :         if ( !isSame )
    1521             :         {
    1522      804140 :             IGF_write_bits( hBstr, pBitOffset, 1, 1 );
    1523             : 
    1524     2115760 :             for ( p = 1; p < nTiles; p++ )
    1525             :             {
    1526     1311620 :                 IGF_WriteWhiteningTile( hBstr, pBitOffset, hPrivateData->igfCurrWhiteningLevel[p] );
    1527             :             }
    1528             :         }
    1529      384910 :         else if ( hPrivateData->igfInfo.bitRateIndex != IGF_BITRATE_SWB_48000_CPE && hPrivateData->igfInfo.bitRateIndex != IGF_BITRATE_FB_48000_CPE )
    1530             :         {
    1531      237978 :             IGF_write_bits( hBstr, pBitOffset, 0, 1 );
    1532             :         }
    1533             :     }
    1534             : 
    1535     1200188 :     totBitCount = *pBitOffset - startBitCount;
    1536             : 
    1537     1200188 :     return totBitCount;
    1538             : }
    1539             : 
    1540             : 
    1541             : /*-------------------------------------------------------------------*
    1542             :  * IGF_WriteFlatteningTrigger()
    1543             :  *
    1544             :  * write flattening trigger
    1545             :  *-------------------------------------------------------------------*/
    1546             : 
    1547             : /*! r: number of bits written */
    1548     1200188 : 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     1200188 :     totBitCount = 0;
    1559     1200188 :     startBitCount = *pBitOffset;
    1560     1200188 :     flatteningTrigger = hIGFEnc->flatteningTrigger;
    1561             : 
    1562     1200188 :     IGF_write_bits( hBstr, pBitOffset, flatteningTrigger, 1 );
    1563             : 
    1564     1200188 :     totBitCount = *pBitOffset - startBitCount;
    1565             : 
    1566     1200188 :     return totBitCount;
    1567             : }
    1568             : 
    1569             : 
    1570             : /*-------------------------------------------------------------------*
    1571             :  * IGF_UpdateInfo()
    1572             :  *
    1573             :  * updates the start/stop frequency of IGF according to igfGridIdx
    1574             :  *-------------------------------------------------------------------*/
    1575             : 
    1576     1223802 : 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     1223802 :     hGrid = &hIGFEnc->igfData.igfInfo.grid[igfGridIdx];
    1584     1223802 :     hIGFEnc->infoStartFrequency = hGrid->startFrequency;
    1585     1223802 :     hIGFEnc->infoStopFrequency = hGrid->stopFrequency;
    1586     1223802 :     hIGFEnc->infoStartLine = hGrid->startLine;
    1587     1223802 :     hIGFEnc->infoStopLine = hGrid->stopLine;
    1588             : 
    1589     1223802 :     return;
    1590             : }
    1591             : 
    1592             : 
    1593             : /*-------------------------------------------------------------------*
    1594             :  * IGFEncWriteBitstream()
    1595             :  *
    1596             :  * IGF bitstream writer
    1597             :  *-------------------------------------------------------------------*/
    1598             : 
    1599             : /*! r: number of bits written per frame */
    1600     1200188 : 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     1200188 :     int16_t startBitCount = *pBitOffset;
    1610             : 
    1611     1200188 :     hIGFEnc->infoTotalBitsPerFrameWritten = 0;
    1612     1200188 :     if ( isIndepFlag )
    1613             :     {
    1614     1188381 :         hIGFEnc->infoTotalBitsWritten = 0;
    1615             :     }
    1616             : 
    1617     1200188 :     IGF_WriteEnvelope( hIGFEnc, hBstr, pBitOffset, igfGridIdx, isIndepFlag, &igfAllZero );
    1618             : 
    1619     1200188 :     IGF_WriteWhiteningLevels( hIGFEnc, hBstr, pBitOffset, igfGridIdx, isIndepFlag );
    1620             : 
    1621     1200188 :     IGF_WriteFlatteningTrigger( hIGFEnc, hBstr, pBitOffset );
    1622             : 
    1623     1200188 :     hIGFEnc->infoTotalBitsPerFrameWritten = ( *pBitOffset - startBitCount );
    1624     1200188 :     hIGFEnc->infoTotalBitsWritten += hIGFEnc->infoTotalBitsPerFrameWritten;
    1625             : 
    1626     1200188 :     return hIGFEnc->infoTotalBitsPerFrameWritten;
    1627             : }
    1628             : 
    1629             : 
    1630             : /*-------------------------------------------------------------------*
    1631             :  * IGFEncSetMode()
    1632             :  *
    1633             :  * sets the IGF mode according to given bitrate
    1634             :  *-------------------------------------------------------------------*/
    1635             : 
    1636       37463 : 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       37463 :     hPrivateData = &hIGFEnc->igfData;
    1648       37463 :     hPrivateData->igfBitstreamBits = 0;
    1649       37463 :     set_s( hPrivateData->igfScfQuantized, 0, IGF_MAX_SFB );
    1650       37463 :     set_s( hPrivateData->igfCurrWhiteningLevel, 0, IGF_MAX_TILES );
    1651       37463 :     set_s( hPrivateData->igfPrevWhiteningLevel, 0, IGF_MAX_TILES );
    1652       37463 :     set_s( hPrivateData->igfWhiteningHangoverCnt, 0, IGF_MAX_TILES );
    1653             : 
    1654      412093 :     for ( i = 0; i < IGF_MAX_TILES; i++ )
    1655             :     {
    1656      374630 :         set_f( hPrivateData->igfPastSFM[i], -1.f, IGF_PAST_SFM_LEN );
    1657             :     }
    1658             : 
    1659       37463 :     hPrivateData->igfPastSFM_pos = 0;
    1660             : 
    1661    12025623 :     for ( i = 0; i < IGF_BITBUFSIZE / 8; i++ )
    1662             :     {
    1663    11988160 :         hPrivateData->igfBitstream[i] = 0;
    1664             :     }
    1665             : 
    1666       37463 :     hPrivateData->wasTransient = 0;
    1667       37463 :     set_f( hPrivateData->prevSFM_FIR, 0, IGF_MAX_TILES );
    1668       37463 :     set_f( hPrivateData->prevSFM_IIR, 0, IGF_MAX_TILES );
    1669       37463 :     set_s( hPrivateData->dampingFactorSmoothing, 2, IGF_MAX_SFB );
    1670       37463 :     set_f( hPrivateData->prevSFM_FIR_SFB_SB, 0, IGF_MAX_SFB );
    1671       37463 :     set_f( hPrivateData->prevSFM_IIR_SFB_SB, 0, IGF_MAX_SFB );
    1672       37463 :     set_f( hPrivateData->prevSFM_FIR_SFB_TB, 0, IGF_MAX_SFB );
    1673       37463 :     set_f( hPrivateData->prevSFM_IIR_SFB_TB, 0, IGF_MAX_SFB );
    1674       37463 :     set_f( hPrivateData->prevDampingFactor_IIR, -1, IGF_MAX_SFB );
    1675       37463 :     set_s( hPrivateData->logSpec, 0, L_FRAME_PLUS );
    1676       37463 :     set_f( hPrivateData->SFM_sb, 0.f, IGF_MAX_SFB );
    1677       37463 :     set_f( hPrivateData->SFM_tb, 0.f, IGF_MAX_SFB );
    1678             : 
    1679       37463 :     if ( IGFCommonFuncsIGFConfiguration( total_brate, bwidth, element_mode, &hPrivateData->igfInfo, rf_mode ) )
    1680             :     {
    1681       37444 :         IGFSCFEncoderOpen( &hPrivateData->hIGFSCFArithEnc, &hPrivateData->igfInfo, total_brate, bwidth, element_mode, rf_mode );
    1682             : 
    1683       37444 :         hIGFEnc->infoSamplingRate = hPrivateData->igfInfo.sampleRate;
    1684       37444 :         hIGFEnc->infoStartFrequency = hPrivateData->igfInfo.grid[0].startFrequency;
    1685       37444 :         hIGFEnc->infoStopFrequency = hPrivateData->igfInfo.grid[0].stopFrequency;
    1686       37444 :         hIGFEnc->infoStartLine = hPrivateData->igfInfo.grid[0].startLine;
    1687       37444 :         hIGFEnc->infoStopLine = hPrivateData->igfInfo.grid[0].stopLine;
    1688             :     }
    1689             :     else
    1690             :     {
    1691             :         /* IGF configuration failed -> error! */
    1692          19 :         hIGFEnc->infoSamplingRate = 0;
    1693          19 :         hIGFEnc->infoStartFrequency = -1;
    1694          19 :         hIGFEnc->infoStopFrequency = -1;
    1695          19 :         hIGFEnc->infoStartLine = -1;
    1696          19 :         hIGFEnc->infoStopLine = -1;
    1697          19 :         IVAS_ERROR( IVAS_ERR_INTERNAL, "IGFEncSetMode: initialization error!" );
    1698             :     }
    1699             : 
    1700             :     /* reset remaining variables */
    1701       37463 :     hIGFEnc->infoTotalBitsWritten = 0;
    1702       37463 :     hIGFEnc->infoTotalBitsPerFrameWritten = 0;
    1703       37463 :     hIGFEnc->flatteningTrigger = 0;
    1704       37463 :     hIGFEnc->tns_predictionGain = 0;
    1705       37463 :     set_f( hIGFEnc->spec_be_igf, 0, N_MAX_TCX - IGF_START_MN );
    1706             : 
    1707       37463 :     return;
    1708             : }
    1709             : 
    1710             : 
    1711             : /*-------------------------------------------------------------------*
    1712             :  * pack_bit()
    1713             :  *
    1714             :  * insert a bit into packed octet
    1715             :  *-------------------------------------------------------------------*/
    1716             : 
    1717      528122 : 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      528122 :     if ( *omask == 0x80 )
    1724             :     {
    1725       71348 :         **pt = 0;
    1726             :     }
    1727             : 
    1728      528122 :     if ( bit != 0 )
    1729             :     {
    1730      283012 :         **pt = **pt | *omask;
    1731             :     }
    1732             : 
    1733      528122 :     *omask >>= 1;
    1734      528122 :     if ( *omask == 0 )
    1735             :     {
    1736       60864 :         *omask = 0x80;
    1737       60864 :         ( *pt )++;
    1738             :     }
    1739             : 
    1740      528122 :     return;
    1741             : }
    1742             : 
    1743             : 
    1744             : /*-------------------------------------------------------------------*
    1745             :  * IGFEncConcatenateBitstream()
    1746             :  *
    1747             :  * IGF bitstream concatenation for TCX10 modes
    1748             :  *-------------------------------------------------------------------*/
    1749             : 
    1750       23614 : 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       23614 :     hPrivateData = &hIGFEnc->igfData;
    1766             : 
    1767       23614 :     ind_list = &hBstr->ind_list[hBstr->nb_ind_tot - bsBits]; /* here, we assume that each bit has been written as a single indice */
    1768       23614 :     pFrame = hPrivateData->igfBitstream;
    1769       23614 :     pFrame_size = &hPrivateData->igfBitstreamBits;
    1770       23614 :     nb_bits_written = 0;
    1771             : 
    1772       23614 :     omask = ( 0x80 >> ( *pFrame_size & 0x7 ) );
    1773       23614 :     pFrame += *pFrame_size >> 3;
    1774             : 
    1775             :     /* bitstream packing (conversion of individual indices into a serial stream) */
    1776      551736 :     for ( i = 0; i < bsBits; i++ )
    1777             :     {
    1778      528122 :         if ( ind_list[i].nb_bits > 0 )
    1779             :         {
    1780             :             /* mask from MSB to LSB */
    1781      528122 :             imask = 1 << ( ind_list[i].nb_bits - 1 );
    1782             : 
    1783             :             /* write bit by bit */
    1784     1056244 :             for ( k = 0; k < ind_list[i].nb_bits; k++ )
    1785             :             {
    1786      528122 :                 pack_bit( ind_list[i].value & imask, &pFrame, &omask );
    1787      528122 :                 imask >>= 1;
    1788             :             }
    1789      528122 :             nb_bits_written += ind_list[i].nb_bits;
    1790             : 
    1791             :             /* delete the indice */
    1792      528122 :             ind_list[i].nb_bits = -1;
    1793             :         }
    1794             :     }
    1795             : 
    1796       23614 :     *pFrame_size += nb_bits_written;
    1797             : 
    1798             :     /* update list of indices */
    1799       23614 :     hBstr->nb_ind_tot -= bsBits;
    1800       23614 :     hBstr->nb_bits_tot -= nb_bits_written;
    1801             : 
    1802       23614 :     return;
    1803             : }
    1804             : 
    1805             : 
    1806             : /*-------------------------------------------------------------------*
    1807             :  * IGFEncResetTCX10BitCounter()
    1808             :  *
    1809             :  * IGF reset bitstream bit counter for TCX10 modes
    1810             :  *-------------------------------------------------------------------*/
    1811             : 
    1812       11807 : 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       11807 :     hPrivateData = &hIGFEnc->igfData;
    1819       11807 :     hPrivateData->igfBitstreamBits = 0;
    1820       11807 :     hIGFEnc->infoTotalBitsWritten = 0;
    1821             : 
    1822       11807 :     return;
    1823             : }
    1824             : 
    1825             : 
    1826             : /*-------------------------------------------------------------------*
    1827             :  * IGFEncWriteConcatenatedBitstream()
    1828             :  *
    1829             :  *
    1830             :  *-------------------------------------------------------------------*/
    1831             : 
    1832             : /*! r: total number of bits written */
    1833       11807 : 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       11807 :     hPrivateData = &hIGFEnc->igfData;
    1844       11807 :     pBitstream = hPrivateData->igfBitstream;
    1845             : 
    1846       72671 :     for ( i = 0; i < ( hPrivateData->igfBitstreamBits >> 3 ); i++ )
    1847             :     {
    1848       60864 :         push_next_indice( hBstr, pBitstream[i], 8 );
    1849             :     }
    1850             : 
    1851       11807 :     bitsLeft = hPrivateData->igfBitstreamBits & 0x7;
    1852       11807 :     if ( bitsLeft > 0 )
    1853             :     {
    1854       10484 :         push_next_indice( hBstr, pBitstream[i] >> ( 8 - bitsLeft ), bitsLeft );
    1855             :     }
    1856             : 
    1857       11807 :     return hIGFEnc->infoTotalBitsWritten;
    1858             : }
    1859             : 
    1860             : 
    1861             : /*-------------------------------------------------------------------*
    1862             :  * IGFEncApplyMono()
    1863             :  *
    1864             :  * apply the IGF encoder, main encoder interface
    1865             :  *-------------------------------------------------------------------*/
    1866             : 
    1867      509215 : 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      509215 :     float att = 1.0f;
    1880             :     int16_t last_core_acelp;
    1881             : 
    1882      509215 :     last_core_acelp = ( st->last_core == ACELP_CORE );
    1883             : 
    1884      509215 :     pPowerSpectrumParameter = !isTNSActive && isTCX20 ? pPowerSpectrum : NULL;
    1885             : 
    1886      509215 :     IGF_UpdateInfo( st->hIGFEnc, igfGridIdx );
    1887             : 
    1888      509215 :     if ( st->element_mode == IVAS_CPE_DFT || st->element_mode == IVAS_CPE_TD )
    1889             :     {
    1890       12773 :         calculate_hangover_attenuation_gain( st, &att, vad_hover_flag );
    1891             :     }
    1892             : 
    1893             : 
    1894      509215 :     IGF_CalculateEnvelope( st->hIGFEnc, pMDCTSpectrum, pPowerSpectrumParameter, igfGridIdx, st->hTranDet->transientDetector.bIsAttackPresent, last_core_acelp, st->element_mode, att );
    1895             : 
    1896      509215 :     pPowerSpectrumParameter = isTCX20 ? pPowerSpectrum : NULL;
    1897             : 
    1898      509215 :     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      509215 :     IGF_ErodeSpectrum( st->hIGFEnc, pMDCTSpectrum, pPowerSpectrumParameter, igfGridIdx, 0 );
    1901             : 
    1902      509215 :     return;
    1903             : }
    1904             : 
    1905             : 
    1906             : /*-------------------------------------------------------------------*
    1907             :  * IGFEncApplyStereo()
    1908             :  *
    1909             :  * apply the IGF encoder, main encoder interface
    1910             :  *-------------------------------------------------------------------*/
    1911             : 
    1912       51343 : 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       51343 :     assert( ( sts[0]->core == sts[1]->core ) );
    1941             : 
    1942             :     /* initialization */
    1943       51343 :     sfbConf = ( sts[0]->core == TCX_20_CORE ) ? &hStereoMdct->stbParamsTCX20 : &hStereoMdct->stbParamsTCX10;
    1944       51343 :     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       51343 :     set_s( coreMsMask, 0, N_MAX );
    1951     2190304 :     for ( sfb = 0; sfb < sfbConf->sfbCnt; sfb++ )
    1952             :     {
    1953     2138961 :         set_s( &coreMsMask[sfbConf->sfbOffset[sfb]], ms_mask[frameno][sfb], sfbConf->sfbOffset[sfb + 1] - sfbConf->sfbOffset[sfb] );
    1954             :     }
    1955             : 
    1956       51343 :     if ( sts[0]->core == TCX_20_CORE && !sts[0]->hTcxEnc->fUseTns[frameno] && !sts[1]->hTcxEnc->fUseTns[frameno] )
    1957             :     {
    1958       41758 :         pPowerSpectrumParameter[0] = &pPowerSpectrum[0][0];
    1959       41758 :         pPowerSpectrumParameter[1] = &pPowerSpectrum[1][0];
    1960       41758 :         pPowerSpectrumParameterMsInv[0] = pPowerSpectrumMsInv[0][0];
    1961       41758 :         pPowerSpectrumParameterMsInv[1] = pPowerSpectrumMsInv[1][0];
    1962             :     }
    1963             :     else
    1964             :     {
    1965        9585 :         pPowerSpectrumParameter[0] = NULL;
    1966        9585 :         pPowerSpectrumParameter[1] = NULL;
    1967        9585 :         pPowerSpectrumParameterMsInv[0] = NULL;
    1968        9585 :         pPowerSpectrumParameterMsInv[1] = NULL;
    1969             :     }
    1970             : 
    1971      154029 :     for ( ch = 0; ch < CPE_CHANNELS; ch++ )
    1972             :     {
    1973      102686 :         last_core_acelp = ( sts[ch]->last_core == ACELP_CORE );
    1974             : 
    1975      102686 :         IGF_UpdateInfo( hIGFEnc[ch], igfGridIdx );
    1976             : 
    1977      102686 :         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      102686 :         pPowerSpectrumParameter[ch] = sts[ch]->core == TCX_20_CORE ? pPowerSpectrum[ch] : NULL;
    1980             : 
    1981      102686 :         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      102686 :         IGF_ErodeSpectrum( hIGFEnc[ch], sts[ch]->hTcxEnc->spectrum[frameno], pPowerSpectrumParameter[ch], igfGridIdx, mct_on );
    1984             :     }
    1985             : 
    1986       51343 :     return;
    1987             : }
    1988             : 
    1989             : 
    1990             : /*-------------------------------------------------------------------*
    1991             :  * IGFSaveSpectrumForITF()
    1992             :  *
    1993             :  *
    1994             :  *-------------------------------------------------------------------*/
    1995             : 
    1996      611901 : 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      611901 :     IGF_UpdateInfo( hIGFEnc, igfGridIdx );
    2003             : 
    2004      611901 :     mvr2r( pITFSpectrum + IGF_START_MN, hIGFEnc->spec_be_igf, hIGFEnc->infoStopLine - IGF_START_MN );
    2005             : 
    2006      611901 :     return;
    2007             : }
    2008             : 
    2009             : 
    2010       17800 : 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       17800 :     error = IVAS_ERR_OK;
    2023             : 
    2024       17800 :     if ( igf && *hIGFEnc == NULL )
    2025             :     {
    2026        1493 :         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        1493 :         IGFEncSetMode( *hIGFEnc, brate, bwidth, element_mode, rf_mode );
    2031             :     }
    2032       16307 :     else if ( igf && reset )
    2033             :     {
    2034        1971 :         IGFEncSetMode( *hIGFEnc, brate, bwidth, element_mode, rf_mode );
    2035             :     }
    2036       14336 :     else if ( !igf && *hIGFEnc != NULL )
    2037             :     {
    2038        1905 :         free( *hIGFEnc );
    2039        1905 :         *hIGFEnc = NULL;
    2040             :     }
    2041             : 
    2042       17800 :     return error;
    2043             : }

Generated by: LCOV version 1.14