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

Generated by: LCOV version 1.14