LCOV - code coverage report
Current view: top level - lib_enc - bw_detect_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main @ 43b7b28dcb1471ff5d355252c4b8f37ee7ecc268 Lines: 556 592 93.9 %
Date: 2025-11-02 02:02:47 Functions: 4 4 100.0 %

          Line data    Source code
       1             : /*====================================================================================
       2             :     EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0
       3             :   ====================================================================================*/
       4             : 
       5             : #include <stdint.h>
       6             : #include "options.h" /* Compilation switches                   */
       7             : #include "cnst.h"    /* Common constants                       */
       8             : #include "rom_enc.h" /* Encoder static table prototypes        */
       9             : #include "rom_com.h"
      10             : #include "basop_util.h"
      11             : #include "ivas_cnst.h"
      12             : #include "prot_fx.h"      /* Function prototypes               */
      13             : #include "ivas_prot_fx.h" /* Function prototypes               */
      14             : #include "prot_fx_enc.h"  /* Function prototypes               */
      15             : 
      16             : /*-------------------------------------------------------------------*
      17             :  * Local constants
      18             :  *-------------------------------------------------------------------*/
      19             : #define BWD_MIN_BRATE_WIDER_BW_MDCT IVAS_48k
      20             : #define BWD_MIN_BRATE_WIDER_BW_ISM  IVAS_32k
      21             : #define BWD_MAX_BRATE_WIDER_BW_MDCT IVAS_80k
      22             : #define BWD_MAX_BRATE_WIDER_BW_ISM  IVAS_64k
      23             : 
      24             : #define ALPHA_BWD_FX     24576 /* 0.75 in Q15*/
      25             : #define BWD_LT_THRESH_FX 19661 /* 0.6 in Q15*/
      26             : 
      27             : #define BWD_COUNT_MAX           100
      28             : #define BWD_COUNT_WIDER_BW      10
      29             : #define BWD_COUNT_WIDER_BW_MDCT 0
      30             : 
      31             : #define BWD_N_BINS_MAX 13
      32             : 
      33             : #define CLDFB_ENER_OFFSET_FX 26214 /* 1.6 in Q14 */
      34             : 
      35             : /*-------------------------------------------------------------------*
      36             :  * bw_detect()
      37             :  *
      38             :  * WB, SWB and FB bandwidth detector
      39             :  *--------------------------------------------------------------------*/
      40             : 
      41     1083327 : void bw_detect_fx(
      42             :     Encoder_State *st,               /* i/o: Encoder State           */
      43             :     const Word16 signal_in[],        /* i  : input signal           */
      44             :     Word16 *spectrum,                /* i  : MDCT spectrum       Q_spec   */
      45             :     const Word32 *enerBuffer,        /* i  : CLDFB Energy   Q31      */
      46             :     const Word16 *cldfbBuf_Ener_Exp, /* i  : CLDFB Energy Exponent   */
      47             :     const IVAS_FORMAT ivas_format,   /* i  : IVAS format             */
      48             :     const Word16 mct_on,             /* i  : flag MCT mode           */
      49             :     const Word16 Q_spec )
      50             : {
      51             :     Word16 Q_dct, E_spect_bin, tmp_1;
      52             :     Word16 i, j, k, bw_max, bin_width, n_bins;
      53             :     Word16 max_NB, max_WB, max_SWB, max_FB, mean_NB, mean_WB, mean_SWB, mean_FB; /* Q11*/
      54             :     const Word16 *pt, *pt1;
      55             :     Word16 spect[L_FRAME48k], spect_bin[BWD_N_BINS_MAX];
      56             :     Word32 spect32[L_FRAME48k], in_win32[BWD_TOTAL_WIDTH];
      57             :     Word16 e_tmp, f_tmp;
      58             :     Word32 L_tmp, sum32;
      59             : 
      60             :     Word32 L_tmp1, L_tmp2, L_tmp3;
      61             :     Word16 scale;
      62             :     Word16 ScalFac, ScalFacInv;
      63             :     Word32 cldfb_bin[9];
      64             :     Word16 cldfb_bin_Exp[9];
      65     1083327 :     Word16 cldfb_bin_width = 4;
      66     1083327 :     move16();
      67             :     const Word32 *pt32;
      68             :     Word32 max_NB32, max_WB32, max_SWB32, max_FB32, mean_NB32, mean_WB32, mean_SWB32, mean_FB32; /* Q11*/ /* we need Word32 for the new cldfb energy vectors */
      69             :     Word16 bwd_count_wider_bw;
      70             :     Word16 lp_noise_fx;
      71             : 
      72     1083327 :     bwd_count_wider_bw = BWD_COUNT_WIDER_BW;
      73     1083327 :     move16();
      74     1083327 :     test();
      75     1083327 :     test();
      76     1083327 :     test();
      77     1083327 :     test();
      78     1083327 :     test();
      79     1497704 :     if ( st->ini_frame > 0 && ( ( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && ( GE_32( st->element_brate, BWD_MIN_BRATE_WIDER_BW_MDCT ) || mct_on ) ) ||
      80      691823 :                                 ( EQ_16( ivas_format, ISM_FORMAT ) && GE_32( st->element_brate, BWD_MIN_BRATE_WIDER_BW_ISM ) ) ) )
      81             :     {
      82      812509 :         bwd_count_wider_bw = BWD_COUNT_WIDER_BW_MDCT;
      83      812509 :         move16();
      84             :     }
      85     1083327 :     IF( GT_32( st->input_Fs, 8000 ) )
      86             :     {
      87             : 
      88     1083327 :         IF( enerBuffer != NULL )
      89             :         {
      90      417483 :             n_bins = 9;
      91      417483 :             move16();
      92      417483 :             scale = st->cldfbAnaEnc->scale;
      93      417483 :             move16(); /* 7Q8 */
      94             : 
      95             :             /*ScalFac =  1/ ( st->cldfbAnaEnc->scale * st->cldfbAnaEnc->scale * 8.f);*/
      96             :             /*hs->CLDFBscalingFactor = div_s(1, shl(i_mult2(CLDFBscale, CLDFBscale), 3));*/
      97             : 
      98      417483 :             assert( 2048 /*1.0/(1<<4) Q15*/ < mult( scale, scale ) );
      99             :             /* Exponent ScalFacInv: -16 = -(2*7 (CLDFBscale) + 2 (8.0) */
     100      417483 :             ScalFacInv = shl( mult( scale, scale ), 1 ); /* Q8*Q8 = Q16 + shl -> Q17 -16 -> Q1; shl ->  Q2 */
     101             :             /* Exponent ScalFac: -15 = -(2*7 (CLDFBscale) + 2 (8.0) - 1 (1.0)) */
     102      417483 :             ScalFac = div_s( 0x4000, ScalFacInv ); /* bin(17214) *2^-15 * 2^-15 = 0.0000160 , use CLDFBscalingFactor_EXP for this*/ /*Q15*/
     103             : 
     104             : 
     105             :             /*set_f( cldfb_bin, 0.001f, 9 );*/
     106      417483 :             set32_fx( cldfb_bin, 1, n_bins ); /* Q31*/
     107      417483 :             set16_fx( cldfb_bin_Exp, -15, n_bins );
     108             : 
     109             :             /* NB: 1.2 - 2.8 kHz, 4 cldfb-bands */
     110     2087415 :             FOR( i = 0; i < cldfb_bin_width; i++ )
     111             :             {
     112     1669932 :                 cldfb_bin[0] = BASOP_Util_Add_Mant32Exp( cldfb_bin[0], cldfb_bin_Exp[0], enerBuffer[3 + i], cldfbBuf_Ener_Exp[3 + i], &( cldfb_bin_Exp[0] ) );
     113     1669932 :                 move32(); /* result: Q31 */
     114             :             }
     115             : 
     116      417483 :             cldfb_bin[0] = Mpy_32_16_1( cldfb_bin[0], ScalFac ); // Q(31-cldfb_bin_Exp)
     117      417483 :             move32();                                            /* Q31 */
     118      417483 :             cldfb_bin_Exp[0] = add( cldfb_bin_Exp[0], CLDFBscalingFactor_EXP );
     119      417483 :             move16();
     120             : #ifdef FIX_2141_ASSERT_IN_OMASA_BITRATE_SWITSCHING
     121      417483 :             if ( cldfb_bin[0] == 0 )
     122             :             {
     123          29 :                 cldfb_bin[0] = L_deposit_l( 1 );
     124          29 :                 move32();
     125             :             }
     126             : #else
     127             :             if ( cldfb_bin[i] == 0 )
     128             :             {
     129             :                 cldfb_bin[i] = L_deposit_l( 1 );
     130             :                 move32();
     131             :             }
     132             : #endif
     133      417483 :             L_tmp = BASOP_Util_Log2( cldfb_bin[0] ); /*(log2(660423549*2^(-31))/64)*2^31*/
     134             : #ifdef FIX_2141_ASSERT_IN_OMASA_BITRATE_SWITSCHING
     135      417483 :             L_tmp = L_add_sat( L_tmp, L_shl_sat( L_deposit_l( cldfb_bin_Exp[0] ), 31 - LD_DATA_SCALE ) ); /* Q25 */
     136             : #else
     137             :             L_tmp = L_add_sat( L_tmp, L_shl( L_deposit_l( cldfb_bin_Exp[0] ), 31 - LD_DATA_SCALE ) );     /* Q25 */
     138             : #endif
     139      417483 :             cldfb_bin[0] = Mpy_32_16_1( L_tmp, 9864 /*1.0f/3.3219280948873623478703194294894f Q15*/ );
     140      417483 :             move32(); /* 1/log2(10) */ /* Q25 */
     141             : 
     142             :             /* WB: 4.4 - 7.2 kHz, 8 cldfb-bands, mid band(14) counted twice */
     143      417483 :             IF( GE_32( st->input_Fs, 16000 ) )
     144             :             {
     145             :                 /*
     146             :                 cldfb_bin[1] += Sum( &(enerBuffer[11]), cldfb_bin_width );
     147             :                 cldfb_bin[2] += Sum( &(enerBuffer[14]), cldfb_bin_width );*/
     148     2087415 :                 FOR( i = 0; i < cldfb_bin_width; i++ )
     149             :                 {
     150     1669932 :                     cldfb_bin[1] = BASOP_Util_Add_Mant32Exp( cldfb_bin[1], cldfb_bin_Exp[1], enerBuffer[11 + i], cldfbBuf_Ener_Exp[11 + i], &( cldfb_bin_Exp[1] ) );
     151     1669932 :                     move32();
     152     1669932 :                     cldfb_bin[2] = BASOP_Util_Add_Mant32Exp( cldfb_bin[2], cldfb_bin_Exp[2], enerBuffer[14 + i], cldfbBuf_Ener_Exp[14 + i], &( cldfb_bin_Exp[2] ) );
     153     1669932 :                     move32();
     154             :                 }
     155     1252449 :                 FOR( i = 1; i <= 2; i++ )
     156             :                 {
     157      834966 :                     cldfb_bin[i] = Mpy_32_16_1( cldfb_bin[i], ScalFac ); // Q(31-(cldfv_bin_Exp+CLDFBscalingFactor_EXP))
     158      834966 :                     move32();
     159      834966 :                     cldfb_bin_Exp[i] = add( cldfb_bin_Exp[i], CLDFBscalingFactor_EXP );
     160      834966 :                     move16();
     161             : 
     162      834966 :                     if ( cldfb_bin[i] == 0 )
     163             :                     {
     164          58 :                         cldfb_bin[i] = L_deposit_l( 1 );
     165          58 :                         move32();
     166             :                     }
     167      834966 :                     L_tmp = BASOP_Util_Log2( cldfb_bin[i] ); /*(log2(660423549*2^(-31))/64)*2^31*/
     168             : #ifdef FIX_2141_ASSERT_IN_OMASA_BITRATE_SWITSCHING
     169      834966 :                     L_tmp = L_add( L_tmp, L_shl_sat( L_deposit_l( cldfb_bin_Exp[i] ), 31 - LD_DATA_SCALE ) ); /* Q25 */
     170             : #else
     171             :                     L_tmp = L_add( L_tmp, L_shl( L_deposit_l( cldfb_bin_Exp[i] ), 31 - LD_DATA_SCALE ) ); /* Q25 */
     172             : #endif
     173      834966 :                     cldfb_bin[i] = Mpy_32_16_1( L_tmp, 9864 /*1.0f/3.3219280948873623478703194294894f Q15*/ );
     174      834966 :                     move32(); /* 1/log2(10) */ /* Q25 */
     175             :                 }
     176             :             }
     177             : 
     178             :             /* SWB: 9.2 - 15.6 kHz, 16 cldfb-bands */
     179      417483 :             IF( GE_32( st->input_Fs, 32000 ) )
     180             :             {
     181             :                 /*
     182             :                 cldfb_bin[3] += Sum( &(enerBuffer[23]), cldfb_bin_width );
     183             :                 cldfb_bin[4] += Sum( &(enerBuffer[27]), cldfb_bin_width );
     184             :                 cldfb_bin[5] += Sum( &(enerBuffer[31]), cldfb_bin_width );
     185             :                 cldfb_bin[6] += Sum( &(enerBuffer[35]), cldfb_bin_width );
     186             :                  */
     187     1996415 :                 FOR( i = 0; i < cldfb_bin_width; i++ )
     188             :                 {
     189     1597132 :                     cldfb_bin[3] = BASOP_Util_Add_Mant32Exp( cldfb_bin[3], cldfb_bin_Exp[3], enerBuffer[23 + i], cldfbBuf_Ener_Exp[23 + i], &( cldfb_bin_Exp[3] ) );
     190     1597132 :                     move32();
     191     1597132 :                     cldfb_bin[4] = BASOP_Util_Add_Mant32Exp( cldfb_bin[4], cldfb_bin_Exp[4], enerBuffer[27 + i], cldfbBuf_Ener_Exp[27 + i], &( cldfb_bin_Exp[4] ) );
     192     1597132 :                     move32();
     193     1597132 :                     cldfb_bin[5] = BASOP_Util_Add_Mant32Exp( cldfb_bin[5], cldfb_bin_Exp[5], enerBuffer[31 + i], cldfbBuf_Ener_Exp[31 + i], &( cldfb_bin_Exp[5] ) );
     194     1597132 :                     move32();
     195     1597132 :                     cldfb_bin[6] = BASOP_Util_Add_Mant32Exp( cldfb_bin[6], cldfb_bin_Exp[6], enerBuffer[35 + i], cldfbBuf_Ener_Exp[35 + i], &( cldfb_bin_Exp[6] ) );
     196     1597132 :                     move32();
     197             :                 }
     198     1996415 :                 FOR( i = 3; i <= 6; i++ )
     199             :                 {
     200     1597132 :                     cldfb_bin[i] = Mpy_32_16_1( cldfb_bin[i], ScalFac ); // Q(31-(cldfv_bin_Exp+CLDFBscalingFactor_EXP))
     201     1597132 :                     move32();
     202     1597132 :                     cldfb_bin_Exp[i] = add( cldfb_bin_Exp[i], CLDFBscalingFactor_EXP );
     203     1597132 :                     move16();
     204             : 
     205     1597132 :                     if ( cldfb_bin[i] == 0 )
     206             :                     {
     207        5776 :                         cldfb_bin[i] = L_deposit_l( 1 );
     208        5776 :                         move32();
     209             :                     }
     210     1597132 :                     L_tmp = BASOP_Util_Log2( cldfb_bin[i] ); /*(log2(660423549*2^(-31))/64)*2^31*/
     211             : #ifdef FIX_2141_ASSERT_IN_OMASA_BITRATE_SWITSCHING
     212     1597132 :                     L_tmp = L_add( L_tmp, L_shl_sat( L_deposit_l( cldfb_bin_Exp[i] ), 31 - LD_DATA_SCALE ) ); /* Q25 */
     213             : #else
     214             :                     L_tmp = L_add( L_tmp, L_shl( L_deposit_l( cldfb_bin_Exp[i] ), 31 - LD_DATA_SCALE ) ); /* Q25 */
     215             : #endif
     216     1597132 :                     cldfb_bin[i] = Mpy_32_16_1( L_tmp, 9864 /*1.0f/3.3219280948873623478703194294894f Q15*/ );
     217     1597132 :                     move32(); /* 1/log2(10) */ /* Q25 */
     218             :                 }
     219             :             }
     220             : 
     221             :             /* FB:  16.8 - 20.0 kHz, 8 cldfb-bands */
     222      417483 :             IF( GE_32( st->input_Fs, 48000 ) )
     223             :             {
     224             :                 /*
     225             :                 cldfb_bin[7] += Sum( &(enerBuffer[42]), cldfb_bin_width );
     226             :                 cldfb_bin[8] += Sum( &(enerBuffer[46]), cldfb_bin_width );
     227             :                  */
     228     1713525 :                 FOR( i = 0; i < cldfb_bin_width; i++ )
     229             :                 {
     230     1370820 :                     cldfb_bin[7] = BASOP_Util_Add_Mant32Exp( cldfb_bin[7], cldfb_bin_Exp[7], enerBuffer[42 + i], cldfbBuf_Ener_Exp[42 + i], &( cldfb_bin_Exp[7] ) );
     231     1370820 :                     move32();
     232     1370820 :                     cldfb_bin[8] = BASOP_Util_Add_Mant32Exp( cldfb_bin[8], cldfb_bin_Exp[8], enerBuffer[46 + i], cldfbBuf_Ener_Exp[46 + i], &( cldfb_bin_Exp[8] ) );
     233     1370820 :                     move32();
     234             :                 }
     235     1028115 :                 FOR( i = 7; i <= 8; i++ )
     236             :                 {
     237      685410 :                     cldfb_bin[i] = Mpy_32_16_1( cldfb_bin[i], ScalFac );
     238      685410 :                     move32();
     239      685410 :                     cldfb_bin_Exp[i] = add( cldfb_bin_Exp[i], CLDFBscalingFactor_EXP );
     240      685410 :                     move16();
     241             : 
     242      685410 :                     if ( cldfb_bin[i] == 0 )
     243             :                     {
     244       19642 :                         cldfb_bin[i] = L_deposit_l( 1 );
     245       19642 :                         move32();
     246             :                     }
     247      685410 :                     L_tmp = BASOP_Util_Log2( cldfb_bin[i] ); /*(log2(660423549*2^(-31))/64)*2^31*/
     248             : #ifdef FIX_2141_ASSERT_IN_OMASA_BITRATE_SWITSCHING
     249      685410 :                     L_tmp = L_add( L_tmp, L_shl_sat( L_deposit_l( cldfb_bin_Exp[i] ), 31 - LD_DATA_SCALE ) ); /* Q25 */
     250             : #else
     251             :                     L_tmp = L_add( L_tmp, L_shl( L_deposit_l( cldfb_bin_Exp[i] ), 31 - LD_DATA_SCALE ) ); /* Q25 */
     252             : #endif
     253      685410 :                     cldfb_bin[i] = Mpy_32_16_1( L_tmp, 9864 /*1.0f/3.3219280948873623478703194294894f Q15*/ );
     254      685410 :                     move32(); /* 1/log2(10) */ /* Q25 */
     255             :                 }
     256             :             }
     257             :             /* cldfb_bin_Exp[] are applied now in cldfb_bin[i] -> don't use again */
     258      417483 :             set16_fx( cldfb_bin_Exp, 0, n_bins );
     259             :         }
     260             :         ELSE
     261             :         {
     262             : 
     263             :             /* set width of a speactral bin (corresponds to 1.5kHz) */
     264      665844 :             IF( EQ_32( st->input_Fs, 16000 ) )
     265             :             {
     266       41982 :                 bw_max = WB;
     267       41982 :                 move16();
     268       41982 :                 bin_width = 60;
     269       41982 :                 move16();
     270       41982 :                 n_bins = 5;
     271       41982 :                 move16(); /* spectrum to 7.5 kHz */
     272             :             }
     273      623862 :             ELSE IF( EQ_32( st->input_Fs, 32000 ) )
     274             :             {
     275      163907 :                 bw_max = SWB;
     276      163907 :                 move16();
     277      163907 :                 bin_width = 30;
     278      163907 :                 move16();
     279      163907 :                 n_bins = 10;
     280      163907 :                 move16(); /* spectrum to 15.0 kHz */
     281             :             }
     282             :             ELSE /* st->input_Fs == 48000 */
     283             :             {
     284      459955 :                 bw_max = FB;
     285      459955 :                 move16();
     286      459955 :                 bin_width = 20;
     287      459955 :                 move16();
     288      459955 :                 n_bins = BWD_N_BINS_MAX;
     289      459955 :                 move16(); /* spectrum to 19.5 kHz */
     290             :             }
     291      665844 :             Q_dct = 0;
     292      665844 :             move16();
     293      665844 :             IF( signal_in != NULL )
     294             :             {
     295             :                 /*---------------------------------------------------------------------*
     296             :                  * windowing of the input signal
     297             :                  *---------------------------------------------------------------------*/
     298           0 :                 pt = signal_in;
     299           0 :                 pt1 = hann_window_320_fx;
     300             :                 /* 1st half of the window */
     301           0 :                 FOR( i = 0; i < BWD_TOTAL_WIDTH / 2; i++ )
     302             :                 {
     303             :                     /*in_win[i] = *pt++ * *pt1++;*/
     304           0 :                     in_win32[i] = L_mult( *pt++, *pt1++ );
     305           0 :                     move32(); /* Q0*Q15 -> Q16*/
     306             :                 }
     307           0 :                 pt1--;
     308             :                 /* 2nd half of the window */
     309           0 :                 FOR( ; i < BWD_TOTAL_WIDTH; i++ )
     310             :                 {
     311             :                     /*in_win[i] = *pt++ * *pt1--;*/
     312           0 :                     in_win32[i] = L_mult( *pt++, *pt1-- );
     313           0 :                     move32();
     314             :                 }
     315           0 :                 edct_fx( in_win32, spect32, BWD_TOTAL_WIDTH, &Q_dct /*,st->element_mode*/ );
     316             : 
     317           0 :                 FOR( i = 0; i < BWD_TOTAL_WIDTH; i++ )
     318             :                 {
     319           0 :                     spect[i] = round_fx_sat( L_shr_sat( spect32[i], Q_dct ) );
     320           0 :                     move16();
     321             :                 }
     322           0 :                 Q_dct = -2;
     323           0 :                 move16();
     324             :             }
     325             :             ELSE
     326             :             {
     327      665844 :                 Word16 l_frame = extract_l( st->input_Fs / FRAMES_PER_SEC );
     328      665844 :                 IF( EQ_16( st->core, TCX_10_CORE ) )
     329             :                 {
     330       29640 :                     l_frame = shr( l_frame, 1 );
     331             :                 }
     332             : 
     333      665844 :                 bin_width = i_mult( bin_width, l_frame / BWD_TOTAL_WIDTH );
     334      665844 :                 Copy( spectrum, spect, l_frame );
     335      665844 :                 if ( st->element_mode != EVS_MONO )
     336             :                 {
     337      665844 :                     Q_dct = Q_spec;
     338      665844 :                     move16();
     339             :                 }
     340             :             }
     341             :             /*---------------------------------------------------------------------*
     342             :              * compute energy per spectral bins
     343             :              *---------------------------------------------------------------------*/
     344             : 
     345      665844 :             set16_fx( spect_bin, 1, n_bins );
     346      665844 :             Q_dct = shl( Q_dct, 1 );
     347      665844 :             E_spect_bin = sub( Q31, Q_dct );
     348             : 
     349     3081349 :             FOR( k = 0; k <= bw_max; k++ )
     350             :             {
     351     7828395 :                 FOR( i = bwd_start_bin[k]; i <= bwd_end_bin[k]; i++ )
     352             :                 {
     353     5412890 :                     sum32 = L_deposit_l( 1 );
     354     5412890 :                     pt1 = &spect[i_mult2( i, bin_width )];
     355   320946170 :                     FOR( j = 0; j < bin_width; j++ )
     356             :                     {
     357   315533280 :                         sum32 = L_mac0_sat( sum32, *pt1, *pt1 );
     358   315533280 :                         pt1++;
     359             :                     }
     360     5412890 :                     tmp_1 = BASOP_Util_Cmp_Mant32Exp( sum32, E_spect_bin, MAX_32, Q31 - 41 ); /* Any sum32 in Q_dct if it is less than MAX_32 in Q41 will be less than 0.001 */
     361     5412890 :                     test();
     362     5412890 :                     IF( st->element_mode != EVS_MONO && tmp_1 < 0 )
     363             :                     {
     364       55689 :                         spect_bin[i] = -6144; /* log10f( 0.00100000005 ) in Q11 */
     365       55689 :                         move16();
     366             :                     }
     367             :                     ELSE
     368             :                     {
     369     5357201 :                         IF( LE_32( sum32, 1 ) )
     370             :                         {
     371             :                             /*deal with zero spectrum*/
     372        4569 :                             spect_bin[i] = -1;
     373        4569 :                             move16();
     374             :                         }
     375             :                         ELSE
     376             :                         {
     377             :                             /* spect_bin[i] = (float)log10(spect_bin[i]);
     378             :                                                     = log2(spect_bin[i])*log10(2);  */
     379     5352632 :                             e_tmp = norm_l( sum32 );
     380     5352632 :                             L_tmp = L_shl( sum32, e_tmp );
     381     5352632 :                             f_tmp = Log2_norm_lc( L_tmp );
     382     5352632 :                             e_tmp = sub( sub( 30, e_tmp ), Q_dct );
     383     5352632 :                             L_tmp = Mpy_32_16( e_tmp, f_tmp, 9864 );       /* Q16 */
     384     5352632 :                             spect_bin[i] = round_fx( L_shl( L_tmp, 11 ) ); /* Q11 */
     385     5352632 :                             move16();
     386             :                         }
     387             :                     }
     388             :                 }
     389             :             }
     390             :         }
     391             : 
     392     1083327 :         IF( enerBuffer != NULL )
     393             :         {
     394             :             Word16 cldfb_ener_offset;
     395             :             Word32 cldfb_ener_offset_32;
     396             : 
     397      417483 :             pt32 = cldfb_bin; /* Q25 */
     398             :             /* cldfb detections */
     399             : 
     400             :             /* NB: 1,6 - 3,2 kHz, 4 cldfb-bands (1 bin)   */
     401      417483 :             mean_NB32 = L_add( *pt32++, 0 );
     402      417483 :             max_NB32 = L_add( mean_NB32, 0 );
     403             : 
     404             :             /* WB: 4,4 - 7,6 kHz, 8 cldfb-bands (2 bins)  */
     405             : 
     406      417483 :             maximum_32_fx( pt32, 2, &max_WB32 );
     407             : 
     408      417483 :             L_tmp = L_shr( *pt32++, 1 );
     409      417483 :             mean_WB32 = L_add( L_tmp, L_shr( *pt32++, 1 ) ); /* FL2WORD32( 0.5)*/
     410             :             /*L_tmp = L_mac(L_tmp,*pt32++,16384);*/
     411             :             /*mean_WB = round_fx(L_tmp);*/
     412             : 
     413             :             /* Q25 + Q14*/
     414             : 
     415      417483 :             cldfb_ener_offset = (Word16) CLDFB_ENER_OFFSET_FX; /* Q14 */
     416      417483 :             move16();
     417      417483 :             cldfb_ener_offset_32 = L_deposit_l( cldfb_ener_offset );       /* Q14 in 32bit var */
     418      417483 :             cldfb_ener_offset_32 = L_shl( cldfb_ener_offset_32, 25 - 14 ); /* Q14 -> Q25 */
     419             : 
     420      417483 :             mean_NB = extract_l( L_shr( L_add( mean_NB32, cldfb_ener_offset_32 ), 25 - 11 ) ); /* (Q25 + Q25) -> Q11 */
     421      417483 :             max_NB = extract_l( L_shr( L_add( max_NB32, cldfb_ener_offset_32 ), 25 - 11 ) );   /* (Q25 + Q25) -> Q11 */
     422      417483 :             mean_WB = extract_l( L_shr( L_add( mean_WB32, cldfb_ener_offset_32 ), 25 - 11 ) ); /* (Q25 + Q25) -> Q11 */
     423      417483 :             max_WB = extract_l( L_shr( L_add( max_WB32, cldfb_ener_offset_32 ), 25 - 11 ) );   /* (Q25 + Q25) -> Q11 */
     424             : 
     425             : 
     426             :             /*if WB */
     427      417483 :             IF( EQ_32( st->input_Fs, 16000 ) )
     428             :             {
     429             :                 /* for 16kHz sampled inputs, do not check SWB & FB */
     430       18200 :                 mean_SWB = 0;
     431       18200 :                 move16();
     432       18200 :                 max_SWB = 0;
     433       18200 :                 move16();
     434       18200 :                 mean_FB = 0;
     435       18200 :                 move16();
     436       18200 :                 max_FB = 0;
     437       18200 :                 move16();
     438             :             }
     439             :             ELSE
     440             :             {
     441             :                 /* else if SWB */
     442      399283 :                 IF( EQ_32( st->input_Fs, 32000 ) )
     443             :                 {
     444             : 
     445             :                     /* for 32kHz sampled inputs, do not check FB */
     446       56578 :                     mean_FB = 0;
     447       56578 :                     move16();
     448       56578 :                     max_FB = 0;
     449       56578 :                     move16();
     450             : 
     451             :                     /*  SWB: 8,8 - 15,2 kHz, 16 cldfb-bands (4 bins) */
     452             : 
     453       56578 :                     maximum_32_fx( pt32, 4, &max_SWB32 );
     454             : 
     455       56578 :                     L_tmp = L_shr( *pt32++, 2 ); /*  /4 */
     456       56578 :                     L_tmp = L_add( L_tmp, L_shr( *pt32++, 2 ) );
     457       56578 :                     L_tmp = L_add( L_tmp, L_shr( *pt32++, 2 ) );
     458       56578 :                     mean_SWB32 = L_add( L_tmp, L_shr( *pt32++, 2 ) );
     459             : 
     460       56578 :                     mean_SWB = extract_l( L_shr( L_add( mean_SWB32, cldfb_ener_offset_32 ), 25 - 11 ) ); /* (Q25 + Q25) -> Q11 */
     461       56578 :                     max_SWB = extract_l( L_shr( L_add( max_SWB32, cldfb_ener_offset_32 ), 25 - 11 ) );   /* (Q25 + Q25) -> Q11 */
     462             :                 }
     463             :                 ELSE
     464             :                 { /* FB */
     465             :                     /*  SWB: 8,8 - 15,2 kHz, 16 cldfb-bands (4 bins) */
     466             : 
     467      342705 :                     maximum_32_fx( pt32, 4, &max_SWB32 );
     468             : 
     469      342705 :                     L_tmp = L_shr( *pt32++, 2 ); /*  /4 */
     470      342705 :                     L_tmp = L_add( L_tmp, L_shr( *pt32++, 2 ) );
     471      342705 :                     L_tmp = L_add( L_tmp, L_shr( *pt32++, 2 ) );
     472      342705 :                     mean_SWB32 = L_add( L_tmp, L_shr( *pt32++, 2 ) );
     473             : 
     474      342705 :                     mean_SWB = extract_l( L_shr( L_add( mean_SWB32, cldfb_ener_offset_32 ), 25 - 11 ) ); /* (Q25 + Q25) -> Q11 */
     475      342705 :                     max_SWB = extract_l( L_shr( L_add( max_SWB32, cldfb_ener_offset_32 ), 25 - 11 ) );   /* (Q25 + Q25) -> Q11 */
     476             : 
     477             : 
     478             :                     /*  FB: 16,4 - 19,6 kHz, 8 cldfb-bands (2 bins) */
     479             : 
     480      342705 :                     maximum_32_fx( pt32, 2, &max_FB32 );
     481             : 
     482      342705 :                     L_tmp = L_shr( *pt32++, 1 );
     483      342705 :                     mean_FB32 = L_add( L_tmp, L_shr( *pt32++, 1 ) );
     484             : 
     485      342705 :                     mean_FB = extract_l( L_shr( L_add( mean_FB32, cldfb_ener_offset_32 ), 25 - 11 ) ); /* (Q25 + Q25) -> Q11 */
     486      342705 :                     max_FB = extract_l( L_shr( L_add( max_FB32, cldfb_ener_offset_32 ), 25 - 11 ) );   /* (Q25 + Q25) -> Q11 */
     487             :                 }
     488             :             }
     489             :         }
     490             :         ELSE
     491             :         {
     492      665844 :             pt = (const Word16 *) spect_bin;
     493             :             /* NB:  1.5-3.0kHz (1 bin)   */
     494      665844 :             pt++;
     495      665844 :             mean_NB = *pt++;
     496      665844 :             move16();
     497      665844 :             max_NB = mean_NB;
     498      665844 :             move16();
     499             : 
     500             :             /* WB:  4.5-7.5kHz (2 bins)  */
     501      665844 :             pt++;
     502      665844 :             maximum_fx( pt, 2, &max_WB );
     503      665844 :             L_tmp = L_mult( *pt++, 16384 );
     504      665844 :             L_tmp = L_mac( L_tmp, *pt++, 16384 );
     505      665844 :             mean_WB = round_fx( L_tmp );
     506             : 
     507      665844 :             IF( EQ_32( st->input_Fs, 16000 ) )
     508             :             {
     509             :                 /* for 16kHz sampled inputs, do not check SWB & FB */
     510       41982 :                 mean_SWB = 0;
     511       41982 :                 move16();
     512       41982 :                 max_SWB = 0;
     513       41982 :                 move16();
     514       41982 :                 mean_FB = 0;
     515       41982 :                 move16();
     516       41982 :                 max_FB = 0;
     517       41982 :                 move16();
     518             :             }
     519             :             ELSE
     520             :             {
     521             :                 /* SWB: 9.0-15.0kHz (4 bins) */
     522      623862 :                 pt++;
     523      623862 :                 maximum_fx( pt, 4, &max_SWB );
     524      623862 :                 L_tmp = L_mult( *pt++, 8192 );
     525      623862 :                 L_tmp = L_mac( L_tmp, *pt++, 8192 );
     526      623862 :                 L_tmp = L_mac( L_tmp, *pt++, 8192 );
     527      623862 :                 L_tmp = L_mac( L_tmp, *pt++, 8192 );
     528      623862 :                 mean_SWB = round_fx( L_tmp );
     529             : 
     530      623862 :                 IF( EQ_32( st->input_Fs, 48000 ) )
     531             :                 {
     532             :                     /* FB: 16.5-19.5kHz (2 bins) */
     533      459955 :                     pt++;
     534      459955 :                     maximum_fx( pt, 2, &max_FB );
     535      459955 :                     L_tmp = L_mult( *pt++, 16384 );
     536      459955 :                     L_tmp = L_mac( L_tmp, *pt++, 16384 );
     537      459955 :                     mean_FB = round_fx( L_tmp );
     538             :                 }
     539             :                 ELSE
     540             :                 {
     541             :                     /* for 32kHz sampled inputs, do not check FB */
     542      163907 :                     mean_FB = 0;
     543      163907 :                     move16();
     544      163907 :                     max_FB = 0;
     545      163907 :                     move16();
     546             :                 }
     547             :             }
     548             :         }
     549             :         /*---------------------------------------------------------------------*
     550             :          * update LT counters and energies
     551             :          *---------------------------------------------------------------------*/
     552             : 
     553             :         /*if( localVAD || st->lp_noise > 30 )*/
     554     1083327 :         test();
     555     1083327 :         IF( EQ_16( st->element_mode, EVS_MONO ) )
     556             :         {
     557        3100 :             lp_noise_fx = st->lp_noise_fx;
     558        3100 :             move16();
     559             :         }
     560             :         ELSE
     561             :         {
     562     1080227 :             lp_noise_fx = extract_h( st->lp_noise_32fx );
     563             :         }
     564             : 
     565     1083327 :         IF( st->localVAD || GT_32( ( lp_noise_fx ), 7680 /*30 in Q8*/ ) )
     566             :         {
     567             :             /*st->lt_mean_NB_fx = ALPHA_BWD * st->lt_mean_NB_fx + (1-ALPHA_BWD) * mean_NB;*/
     568     1015365 :             L_tmp = L_mult( ALPHA_BWD_FX, st->lt_mean_NB_fx );     /* Q15 * Q11 -> Q27 */
     569     1015365 :             L_tmp = L_mac( L_tmp, 32768 - ALPHA_BWD_FX, mean_NB ); /* Q15 * Q11) -> L_mac(Q27, Q27) -> Q27*/
     570     1015365 :             st->lt_mean_NB_fx = round_fx( L_tmp );                 /* Q11 (27-16) */
     571     1015365 :             move16();
     572             : 
     573             :             /*st->lt_mean_WB_fx = ALPHA_BWD * st->lt_mean_WB_fx + (1-ALPHA_BWD) * mean_WB;*/
     574     1015365 :             L_tmp = L_mult( ALPHA_BWD_FX, st->lt_mean_WB_fx );
     575     1015365 :             L_tmp = L_mac( L_tmp, 32768 - ALPHA_BWD_FX, mean_WB );
     576     1015365 :             st->lt_mean_WB_fx = round_fx( L_tmp );
     577     1015365 :             move16();
     578             : 
     579             :             /*st->lt_mean_SWB_fx = ALPHA_BWD * st->lt_mean_SWB_fx + (1-ALPHA_BWD) * mean_SWB;*/
     580     1015365 :             L_tmp = L_mult( ALPHA_BWD_FX, st->lt_mean_SWB_fx );
     581     1015365 :             L_tmp = L_mac( L_tmp, 32768 - ALPHA_BWD_FX, mean_SWB );
     582     1015365 :             st->lt_mean_SWB_fx = round_fx( L_tmp );
     583     1015365 :             move16();
     584             : 
     585     1015365 :             IF( enerBuffer != NULL )
     586             :             {
     587             :                 /*if( 0.9f * max_WB > BWD_LT_THRESH_FX * st->lt_mean_NB_fx )*/
     588             : 
     589             :                 /* optim: if(  max_WB > (BWD_LT_THRESH_FX / 0.9) * st->lt_mean_NB_fx )*/
     590             : 
     591      373634 :                 L_tmp = L_mult( 3686, max_WB ); /* (0.9 in Q12) x Q11 -> Q24*/
     592             : 
     593      373634 :                 L_tmp1 = L_mult( BWD_LT_THRESH_FX, st->lt_mean_NB_fx ); /* Q15 x Q11 -> Q27 */
     594      373634 :                 L_tmp1 = L_shl( L_tmp1, 24 - 27 );                      /* Q27 -> Q24) */
     595      373634 :                 L_tmp1 = L_sub( L_tmp, L_tmp1 );
     596             : 
     597      373634 :                 IF( L_tmp1 > 0 )
     598             :                 {
     599             :                     /*if( 2.5f * max_WB > max_NB )*/
     600      259005 :                     L_tmp = L_mult( 10240, max_WB ); /* 2.5 in Q12 x Q11 -> Q24 */
     601      259005 :                     L_tmp1 = L_mult( max_NB, 4096 ); /* Q11 x (1 in Q12) -> Q24 */
     602      259005 :                     IF( GT_32( L_tmp, L_tmp1 ) )     /* Q24 */
     603             :                     {
     604      258756 :                         st->count_WB = add( st->count_WB, 1 );
     605      258756 :                         move16();
     606             :                     }
     607             :                 }
     608             :                 ELSE
     609             :                 {
     610             :                     /*if( 3.5f * mean_WB < mean_NB )*/
     611      114629 :                     L_tmp = L_mult( 14336, mean_WB ); /* 3.5 in Q12 x Q11 -> Q24*/
     612      114629 :                     L_tmp1 = L_mult( mean_NB, 4096 );
     613      114629 :                     L_tmp = L_sub( L_tmp, L_tmp1 );
     614      114629 :                     IF( L_tmp < 0 )
     615             :                     {
     616        6782 :                         st->count_WB = sub( st->count_WB, 1 );
     617        6782 :                         move16();
     618             :                     }
     619             :                 }
     620             : 
     621             :                 /*if( 0.83f * max_SWB > BWD_LT_THRESH_FX * st->lt_mean_WB_fx   &&   max_WB > BWD_LT_THRESH_FX * st->lt_mean_NB_fx )*/
     622             :                 /*    IF( L_msu( L_tmp,BWD_LT_THRESH_FX,st->lt_mean_WB_fx) > 0 && L_msu( L_deposit_h(max_WB),BWD_LT_THRESH_FX,st->lt_mean_NB_fx) > 0 )
     623             :                     {*/
     624             : 
     625      373634 :                 L_tmp = L_mult( 3400, max_SWB );                        /* (0.83 in Q12) x Q11 -> Q24*/
     626      373634 :                 L_tmp1 = L_mult( BWD_LT_THRESH_FX, st->lt_mean_WB_fx ); /* Q15 x Q11 -> Q27 */
     627      373634 :                 L_tmp1 = L_shl( L_tmp1, 24 - 27 );                      /* Q27 -> Q24) */
     628      373634 :                 L_tmp1 = L_sub( L_tmp, L_tmp1 );
     629             : 
     630      373634 :                 L_tmp = L_mult( max_WB, 4096 );
     631      373634 :                 L_tmp2 = L_mult( BWD_LT_THRESH_FX, st->lt_mean_NB_fx ); /* Q15 x Q11 -> Q27 */
     632      373634 :                 L_tmp2 = L_shl( L_tmp2, 24 - 27 );                      /* Q27 -> Q24) */
     633      373634 :                 L_tmp2 = L_sub( L_tmp, L_tmp2 );
     634             : 
     635      373634 :                 test();
     636      373634 :                 IF( L_tmp1 > 0 && L_tmp2 > 0 )
     637             :                 {
     638             :                     /*if( 2 * max_SWB > max_WB )*/
     639      265960 :                     L_tmp = L_mult( max_WB, 4096 );
     640      265960 :                     L_tmp1 = L_mult( 8192, max_SWB ); /* 2.0 in Q12 x Q11 -> Q24*/
     641      265960 :                     L_tmp1 = L_sub( L_tmp1, L_tmp );  /* Q24 - (Q11 x (1 in Q12) ) = Q24 */
     642      265960 :                     IF( L_tmp1 > 0 )
     643             :                     {
     644      265300 :                         st->count_SWB = add( st->count_SWB, 1 );
     645      265300 :                         move16();
     646             :                     }
     647             :                 }
     648             :                 ELSE
     649             :                 {
     650             :                     /*if( 3 * mean_SWB < mean_WB )*/
     651      107674 :                     L_tmp = L_mult( mean_WB, 4096 );
     652      107674 :                     L_tmp1 = L_mult( 12288, mean_SWB ); /* 3.0 in Q12 x Q11 -> Q24*/
     653      107674 :                     L_tmp1 = L_sub( L_tmp1, L_tmp );    /* Q24 - (Q11 x (1 in Q12) ) = Q24 */
     654      107674 :                     IF( L_tmp1 < 0 )
     655             :                     {
     656       23246 :                         st->count_SWB = sub( st->count_SWB, 1 );
     657       23246 :                         move16();
     658             :                     }
     659             :                 }
     660             :                 /*if( max_FB > BWD_LT_THRESH_FX * st->lt_mean_SWB_fx && 0.83f * max_SWB > BWD_LT_THRESH_FX * st->lt_mean_WB_fx && max_WB > BWD_LT_THRESH_FX * st->lt_mean_NB_fx )*/
     661             : 
     662      373634 :                 L_tmp = L_mult( max_FB, 4096 );                          /* Q11 x (1 in Q12) = Q24 */
     663      373634 :                 L_tmp1 = L_mult( BWD_LT_THRESH_FX, st->lt_mean_SWB_fx ); /* Q15 x Q11 -> Q27 */
     664      373634 :                 L_tmp1 = L_shl( L_tmp1, 24 - 27 );                       /* Q27 -> Q24) */
     665      373634 :                 L_tmp1 = L_sub( L_tmp, L_tmp1 );                         /* Q24 */
     666             : 
     667      373634 :                 L_tmp = L_mult( max_SWB, 3400 );                        /* (0.83 in Q12) x Q11) =  Q24 */
     668      373634 :                 L_tmp2 = L_mult( BWD_LT_THRESH_FX, st->lt_mean_WB_fx ); /* Q15 x Q11 -> Q27 */
     669      373634 :                 L_tmp2 = L_shl( L_tmp2, 24 - 27 );                      /* Q27 -> Q24) */
     670      373634 :                 L_tmp2 = L_sub( L_tmp, L_tmp2 );                        /* Q24 */
     671             : 
     672      373634 :                 L_tmp = L_mult( max_WB, 4096 ); /* Q11 x (1 in Q12) = Q24*/
     673             : 
     674      373634 :                 L_tmp3 = L_mult( BWD_LT_THRESH_FX, st->lt_mean_NB_fx ); /* Q15 x Q11 -> Q27 */
     675      373634 :                 L_tmp3 = L_shl( L_tmp3, 24 - 27 );                      /* Q27 -> Q24) */
     676      373634 :                 L_tmp3 = L_sub( L_tmp, L_tmp3 );
     677             : 
     678      373634 :                 test();
     679      373634 :                 test();
     680      373634 :                 IF( L_tmp1 > 0 && L_tmp2 > 0 && L_tmp3 > 0 )
     681             :                 {
     682             :                     /*if( 3 * max_FB > max_SWB )*/
     683      187955 :                     L_tmp = L_mult( max_SWB, 4096 );  /* Q11 x (1 in Q12) = Q24*/
     684      187955 :                     L_tmp1 = L_mult( 12288, max_FB ); /* 3.0 in Q12 x Q11 -> Q24*/
     685      187955 :                     L_tmp1 = L_sub( L_tmp1, L_tmp );  /* Q24 */
     686      187955 :                     IF( L_tmp1 > 0 )
     687             :                     {
     688      187466 :                         st->count_FB = add( st->count_FB, 1 );
     689      187466 :                         move16();
     690             :                     }
     691             :                 }
     692             :                 ELSE
     693             :                 {
     694             :                     /* if( 4.1f * mean_FB < mean_SWB )*/
     695      185679 :                     L_tmp = L_mult( mean_SWB, 4096 );  /* Q11 x (1 in Q12) = Q24 */
     696      185679 :                     L_tmp1 = L_mult( 16794, mean_FB ); /* 4.1 in Q12 x Q11 -> Q24*/
     697      185679 :                     L_tmp1 = L_sub( L_tmp1, L_tmp );   /* Q24 */
     698      185679 :                     IF( L_tmp1 < 0 )
     699             :                     {
     700       86622 :                         st->count_FB = sub( st->count_FB, 1 );
     701       86622 :                         move16();
     702             :                     }
     703             :                 }
     704             :             }
     705             :             ELSE /* DCT based detection */
     706             :             {
     707             :                 /*if( max_WB > BWD_LT_THRESH * st->lt_mean_NB_fx )*/
     708      641731 :                 IF( L_msu( L_deposit_h( max_WB ), BWD_LT_THRESH_FX, st->lt_mean_NB_fx ) > 0 )
     709             :                 {
     710             :                     /*if( 2 * max_WB > max_NB )*/
     711      550921 :                     L_tmp = L_mult( 8192, max_WB ); /* 2.0 in Q12 x Q11 -> Q24*/
     712      550921 :                     IF( L_msu( L_tmp, max_NB, 4096 ) > 0 )
     713             :                     {
     714      549572 :                         st->count_WB = add( st->count_WB, 1 );
     715      549572 :                         move16();
     716             :                     }
     717             :                 }
     718             :                 ELSE
     719             :                 {
     720             :                     /*if( 2.6f * mean_WB < mean_NB )*/
     721       90810 :                     L_tmp = L_mult( 10650, mean_WB ); /* 2.6 in Q12 x Q11 -> Q24*/
     722       90810 :                     L_tmp = L_msu( L_tmp, mean_NB, 4096 );
     723       90810 :                     test();
     724       90810 :                     test();
     725       90810 :                     IF( L_tmp < 0 && !( EQ_16( mean_WB, -1 ) && EQ_16( mean_NB, -1 ) ) )
     726             :                     {
     727       16999 :                         st->count_WB = sub( st->count_WB, 1 );
     728       16999 :                         move16();
     729             :                     }
     730             :                 }
     731             : 
     732             :                 /*if( max_SWB > BWD_LT_THRESH * st->lt_mean_WB_fx && max_WB > BWD_LT_THRESH * st->lt_mean_NB_fx )*/
     733      641731 :                 test();
     734      641731 :                 IF( L_msu( L_deposit_h( max_SWB ), BWD_LT_THRESH_FX, st->lt_mean_WB_fx ) > 0 && L_msu( L_deposit_h( max_WB ), BWD_LT_THRESH_FX, st->lt_mean_NB_fx ) > 0 )
     735             :                 {
     736             :                     /*if( 2 * max_SWB > max_WB )*/
     737      503431 :                     L_tmp = L_mult( 8192, max_SWB ); /* 2.0 in Q12 x Q11 -> Q24*/
     738      503431 :                     IF( L_msu( L_tmp, max_WB, 4096 ) > 0 )
     739             :                     {
     740      501439 :                         st->count_SWB = add( st->count_SWB, 1 );
     741      501439 :                         move16();
     742             :                     }
     743             :                 }
     744             :                 ELSE
     745             :                 {
     746             :                     /*if( 3 * mean_SWB < mean_WB )*/
     747      138300 :                     L_tmp = L_mult( 12288, mean_SWB ); /* 3.0 in Q12 x Q11 -> Q24*/
     748      138300 :                     L_tmp = L_msu( L_tmp, mean_WB, 4096 );
     749      138300 :                     test();
     750      138300 :                     test();
     751      138300 :                     IF( L_tmp < 0 && !( EQ_16( mean_SWB, -1 ) && EQ_16( mean_WB, -1 ) ) )
     752             :                     {
     753       44187 :                         st->count_SWB = sub( st->count_SWB, 1 );
     754       44187 :                         move16();
     755             :                     }
     756             :                 }
     757             : 
     758      641731 :                 test();
     759      641731 :                 test();
     760             :                 /*if( max_FB > BWD_LT_THRESH * st->lt_mean_SWB_fx && max_SWB > BWD_LT_THRESH * st->lt_mean_WB_fx && max_WB > BWD_LT_THRESH * st->lt_mean_NB_fx )*/
     761      641731 :                 IF( L_msu( L_deposit_h( max_FB ), BWD_LT_THRESH_FX, st->lt_mean_SWB_fx ) > 0 && L_msu( L_deposit_h( max_SWB ), BWD_LT_THRESH_FX, st->lt_mean_WB_fx ) > 0 && L_msu( L_deposit_h( max_WB ), BWD_LT_THRESH_FX, st->lt_mean_NB_fx ) > 0 )
     762             :                 {
     763             :                     /*if( 2 * max_FB > max_SWB )*/
     764      348200 :                     L_tmp = L_mult( 8192, max_FB ); /* 2.0 in Q12 x Q11 -> Q24*/
     765      348200 :                     IF( L_msu( L_tmp, max_SWB, 4096 ) > 0 )
     766             :                     {
     767      344677 :                         st->count_FB = add( st->count_FB, 1 );
     768      344677 :                         move16();
     769             :                     }
     770             :                 }
     771             :                 ELSE
     772             :                 {
     773             :                     /*if( 3 * mean_FB < mean_SWB )*/
     774      293531 :                     L_tmp = L_mult( 12288, mean_FB ); /* 3.0 in Q12 x Q11 -> Q24*/
     775      293531 :                     test();
     776      293531 :                     test();
     777      293531 :                     IF( L_msu( L_tmp, mean_SWB, 4096 ) < 0 && !( EQ_16( mean_FB, -1 ) && EQ_16( mean_SWB, -1 ) ) )
     778             :                     {
     779      161545 :                         st->count_FB = sub( st->count_FB, 1 );
     780      161545 :                         move16();
     781             :                     }
     782             :                 }
     783             :             }
     784             : 
     785     1015365 :             st->count_WB = s_min( st->count_WB, BWD_COUNT_MAX );
     786     1015365 :             move16();
     787     1015365 :             st->count_SWB = s_min( st->count_SWB, BWD_COUNT_MAX );
     788     1015365 :             move16();
     789     1015365 :             st->count_FB = s_min( st->count_FB, BWD_COUNT_MAX );
     790     1015365 :             move16();
     791     1015365 :             st->count_WB = s_max( st->count_WB, 0 );
     792     1015365 :             move16();
     793     1015365 :             st->count_SWB = s_max( st->count_SWB, 0 );
     794     1015365 :             move16();
     795     1015365 :             st->count_FB = s_max( st->count_FB, 0 );
     796     1015365 :             move16();
     797             : 
     798             :             /*---------------------------------------------------------------------*
     799             :              * check against thresholds
     800             :              * detect a band-width change
     801             :              *---------------------------------------------------------------------*/
     802             : 
     803             :             /* switching to a higher BW */
     804     1015365 :             IF( EQ_16( st->last_input_bwidth, NB ) )
     805             :             {
     806        3297 :                 IF( GT_16( st->count_WB, bwd_count_wider_bw ) )
     807             :                 {
     808          59 :                     st->input_bwidth = WB;
     809          59 :                     move16();
     810          59 :                     st->count_WB = BWD_COUNT_MAX;
     811          59 :                     move16();
     812             : 
     813          59 :                     IF( GT_16( st->count_SWB, bwd_count_wider_bw ) )
     814             :                     {
     815          17 :                         st->input_bwidth = SWB;
     816          17 :                         move16();
     817          17 :                         st->count_SWB = BWD_COUNT_MAX;
     818          17 :                         move16();
     819             : 
     820          17 :                         IF( GT_16( st->count_FB, bwd_count_wider_bw ) )
     821             :                         {
     822           0 :                             st->input_bwidth = FB;
     823           0 :                             move16();
     824           0 :                             st->count_FB = BWD_COUNT_MAX;
     825           0 :                             move16();
     826             :                         }
     827             :                     }
     828             :                 }
     829             :             }
     830             : 
     831     1015365 :             test();
     832     1015365 :             IF( EQ_16( st->last_input_bwidth, WB ) && GT_32( st->input_Fs, 16000 ) )
     833             :             {
     834       28166 :                 IF( GT_16( st->count_SWB, bwd_count_wider_bw ) )
     835             :                 {
     836       28058 :                     st->input_bwidth = SWB;
     837       28058 :                     move16();
     838       28058 :                     st->count_SWB = BWD_COUNT_MAX;
     839       28058 :                     move16();
     840             : 
     841       28058 :                     IF( GT_16( st->count_FB, bwd_count_wider_bw ) )
     842             :                     {
     843       28041 :                         st->input_bwidth = FB;
     844       28041 :                         move16();
     845       28041 :                         st->count_FB = BWD_COUNT_MAX;
     846       28041 :                         move16();
     847             :                     }
     848             :                 }
     849             :             }
     850             : 
     851     1015365 :             test();
     852     1015365 :             IF( EQ_16( st->last_input_bwidth, SWB ) && GT_32( st->input_Fs, 32000 ) )
     853             :             {
     854      123010 :                 IF( GT_16( st->count_FB, bwd_count_wider_bw ) )
     855             :                 {
     856      109276 :                     st->input_bwidth = FB;
     857      109276 :                     move16();
     858      109276 :                     st->count_FB = BWD_COUNT_MAX;
     859      109276 :                     move16();
     860             :                 }
     861             :             }
     862             : 
     863             :             /* switching to a lower BW */
     864     1015365 :             IF( EQ_16( st->last_input_bwidth, FB ) )
     865             :             {
     866      602981 :                 IF( LT_16( st->count_FB, 10 ) )
     867             :                 {
     868          28 :                     st->input_bwidth = SWB;
     869          28 :                     move16();
     870          28 :                     st->count_FB = 0;
     871          28 :                     move16();
     872             :                 }
     873      602981 :                 IF( LT_16( st->count_SWB, 10 ) )
     874             :                 {
     875           0 :                     st->input_bwidth = WB;
     876           0 :                     move16();
     877           0 :                     st->count_SWB = 0;
     878           0 :                     move16();
     879           0 :                     st->count_FB = 0;
     880           0 :                     move16();
     881             :                 }
     882      602981 :                 IF( LT_16( st->count_WB, 10 ) )
     883             :                 {
     884          20 :                     st->input_bwidth = NB;
     885          20 :                     move16();
     886          20 :                     st->count_WB = 0;
     887          20 :                     move16();
     888          20 :                     st->count_SWB = 0;
     889          20 :                     move16();
     890          20 :                     st->count_FB = 0;
     891          20 :                     move16();
     892             :                 }
     893             :             }
     894             : 
     895     1015365 :             IF( EQ_16( st->last_input_bwidth, SWB ) )
     896             :             {
     897      323825 :                 IF( LT_16( st->count_SWB, 10 ) )
     898             :                 {
     899           8 :                     st->input_bwidth = WB;
     900           8 :                     move16();
     901           8 :                     st->count_SWB = 0;
     902           8 :                     move16();
     903           8 :                     st->count_FB = 0;
     904           8 :                     move16();
     905             :                 }
     906      323825 :                 IF( LT_16( st->count_WB, 10 ) )
     907             :                 {
     908          45 :                     st->input_bwidth = NB;
     909          45 :                     move16();
     910          45 :                     st->count_WB = 0;
     911          45 :                     move16();
     912          45 :                     st->count_SWB = 0;
     913          45 :                     move16();
     914          45 :                     st->count_FB = 0;
     915          45 :                     move16();
     916             :                 }
     917             :             }
     918             : 
     919     1015365 :             IF( EQ_16( st->last_input_bwidth, WB ) )
     920             :             {
     921       85262 :                 IF( LT_16( st->count_WB, 10 ) )
     922             :                 {
     923          20 :                     st->input_bwidth = NB;
     924          20 :                     move16();
     925          20 :                     st->count_WB = 0;
     926          20 :                     move16();
     927          20 :                     st->count_SWB = 0;
     928          20 :                     move16();
     929          20 :                     st->count_FB = 0;
     930          20 :                     move16();
     931             :                 }
     932             :             }
     933             :         }
     934             :     }
     935             : 
     936             : 
     937             :     /* verify that maximum encoded bandwidth (specified on the command line) is not exceeded */
     938     1083327 :     if ( GT_16( st->input_bwidth, st->max_bwidth ) )
     939             :     {
     940      137430 :         st->input_bwidth = st->max_bwidth;
     941      137430 :         move16();
     942             :     }
     943     1083327 :     IF( st->element_mode == EVS_MONO )
     944             :     {
     945        3100 :         set_bw_fx( -1, -1, st, st->codec_mode );
     946             :     }
     947             : 
     948             : 
     949     1083327 :     return;
     950             : }
     951             : 
     952             : /*-------------------------------------------------------------------*
     953             :  * set_bw_fx()
     954             :  *
     955             :  * Set and limit the encoded bandwidth
     956             :  *-------------------------------------------------------------------*/
     957             : 
     958      454203 : void set_bw_fx(
     959             :     const Word16 element_mode,  /* i  : element mode            */
     960             :     const Word32 element_brate, /* i  : element bitrate         */
     961             :     Encoder_State *st,          /* i/o: Encoder State           */
     962             :     const Word16 codec_mode     /* i  : codec mode              */
     963             : )
     964             : {
     965             :     Word32 total_brate_fx, L_tmp;
     966             :     /* initialization */
     967      454203 :     st->bwidth = st->input_bwidth;
     968      454203 :     move16();
     969             : 
     970             :     /* Set and limit the encoded bandwidth */
     971      454203 :     IF( EQ_16( st->codec_mode, MODE1 ) )
     972             :     {
     973             : 
     974      453153 :         st->bwidth = st->input_bwidth;
     975      453153 :         move16();
     976             : 
     977      453153 :         total_brate_fx = st->total_brate;
     978      453153 :         move32();
     979             :         /* change the encoded bandwidth, if not supported at particular bitrate */
     980      453153 :         test();
     981      453153 :         test();
     982      453153 :         test();
     983      453153 :         test();
     984      453153 :         IF( GT_16( element_mode, IVAS_SCE ) )
     985             :         {
     986             :             // PMT("this IVAS_SCE section has not been verified ")
     987       67281 :             IF( LT_32( element_brate, MIN_BRATE_SWB_STEREO ) )
     988             :             {
     989           0 :                 st->bwidth = WB;
     990           0 :                 move16();
     991             :             }
     992             :             ELSE
     993             :             {
     994       67281 :                 test();
     995       67281 :                 IF( st->idchan == 0 || EQ_16( element_mode, IVAS_CPE_MDCT ) )
     996             :                 {
     997       63470 :                     IF( GE_32( element_brate, MIN_BRATE_FB_STEREO ) )
     998             :                     {
     999       23350 :                         st->bwidth = s_min( st->bwidth, FB );
    1000       23350 :                         move16();
    1001             :                     }
    1002             :                     ELSE
    1003             :                     {
    1004       40120 :                         st->bwidth = s_min( st->bwidth, SWB );
    1005       40120 :                         move16();
    1006             :                     }
    1007       63470 :                     st->bwidth = s_max( st->bwidth, WB );
    1008       63470 :                     move16();
    1009             :                 }
    1010             :                 ELSE
    1011             :                 {
    1012        3811 :                     st->bwidth = WB;
    1013        3811 :                     move16();
    1014             :                 }
    1015             :             }
    1016             :         }
    1017      385872 :         ELSE IF( EQ_16( element_mode, IVAS_SCE ) )
    1018             :         {
    1019      383822 :             test();
    1020      383822 :             test();
    1021      383822 :             test();
    1022      383822 :             test();
    1023      383822 :             test();
    1024      383822 :             IF( LT_32( element_brate, MIN_BRATE_SWB_SCE ) || LT_16( st->bwidth, WB ) )
    1025             :             {
    1026        9710 :                 st->bwidth = WB;
    1027        9710 :                 move16();
    1028             :             }
    1029      374112 :             ELSE IF( GT_16( st->bwidth, SWB ) && ( ( LT_32( element_brate, MIN_BRATE_FB_STEREO ) && !st->is_ism_format ) || ( LT_32( element_brate, MIN_BRATE_FB_ISM ) && st->is_ism_format ) ) )
    1030             :             {
    1031        1983 :                 st->bwidth = SWB;
    1032        1983 :                 move16();
    1033             :             }
    1034      372129 :             ELSE IF( GT_32( element_brate, BWD_MAX_BRATE_WIDER_BW_ISM ) )
    1035             :             {
    1036       28308 :                 st->bwidth = st->max_bwidth;
    1037       28308 :                 move16();
    1038             :             }
    1039             :         }
    1040             :         /* element_mode == EVS_MONO */
    1041        2050 :         ELSE IF( LE_32( total_brate_fx, ACELP_9k60 ) && GT_16( st->bwidth, WB ) )
    1042             :         {
    1043           0 :             st->bwidth = WB;
    1044           0 :             move16();
    1045             :         }
    1046        2050 :         ELSE IF( GE_32( st->total_brate, ACELP_13k20 ) && LE_32( st->total_brate, ACELP_16k40 ) && GT_16( st->bwidth, SWB ) )
    1047             :         {
    1048           0 :             st->bwidth = SWB;
    1049           0 :             move16();
    1050             :         }
    1051        2050 :         ELSE IF( GE_32( st->total_brate, ACELP_32k ) && LT_16( st->bwidth, WB ) )
    1052             :         {
    1053           0 :             st->bwidth = WB;
    1054           0 :             move16();
    1055             :         }
    1056             :     }
    1057        1050 :     ELSE IF( EQ_16( codec_mode, MODE2 ) )
    1058             :     {
    1059             :         Word16 n, bits_frame_nominal;
    1060             : 
    1061             :         UWord16 lsb;
    1062             :         Word16 tmpbandwidthMin;
    1063             : 
    1064        1050 :         Mpy_32_16_ss( st->total_brate, 5243, &L_tmp, &lsb ); /* 5243 is 1/50 in Q18. (0+18-15=3) */
    1065        1050 :         bits_frame_nominal = extract_l( L_shr( L_tmp, 3 ) ); /* Q0 */
    1066             : 
    1067        8400 :         FOR( n = 0; n < FRAME_SIZE_NB; n++ )
    1068             :         {
    1069        8400 :             IF( EQ_16( FrameSizeConfig[n].frame_bits, bits_frame_nominal ) )
    1070             :             {
    1071        1050 :                 BREAK;
    1072             :             }
    1073             :         }
    1074        1050 :         IF( EQ_16( n, FRAME_SIZE_NB ) )
    1075             :         {
    1076           0 :             assert( !"Bitrate not supported: not part of EVS" );
    1077             :         }
    1078        1050 :         tmpbandwidthMin = FrameSizeConfig[n].bandwidth_min;
    1079        1050 :         move16();
    1080        1050 :         if ( EQ_16( st->rf_mode, 1 ) )
    1081             :         {
    1082           0 :             tmpbandwidthMin = WB;
    1083           0 :             move16();
    1084             :         }
    1085        1050 :         st->bwidth = s_max( s_min( st->input_bwidth, FrameSizeConfig[n].bandwidth_max ), tmpbandwidthMin );
    1086        1050 :         move16();
    1087             :     }
    1088      454203 : }
    1089             : 
    1090             : 
    1091             : /*-------------------------------------------------------------------*
    1092             :  * set_bw_stereo()
    1093             :  *
    1094             :  * Set encoded bandwidth for stereo (CPE) channels
    1095             :  *-------------------------------------------------------------------*/
    1096             : 
    1097       83783 : void set_bw_stereo_fx(
    1098             :     CPE_ENC_HANDLE hCPE /* i/o: CPE encoder structures     */
    1099             : )
    1100             : {
    1101       83783 :     Encoder_State **sts = hCPE->hCoreCoder;
    1102             : 
    1103       83783 :     IF( GT_32( hCPE->element_brate, BWD_MAX_BRATE_WIDER_BW_MDCT ) )
    1104             :     {
    1105       14925 :         sts[0]->bwidth = sts[0]->max_bwidth;
    1106       14925 :         move16();
    1107       14925 :         sts[1]->bwidth = sts[1]->max_bwidth;
    1108       14925 :         move16();
    1109             :     }
    1110       68858 :     ELSE IF( EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) )
    1111             :     {
    1112             :         /* ensure that both CPE channels have the same audio band-width */
    1113       68858 :         IF( EQ_16( sts[0]->input_bwidth, sts[1]->input_bwidth ) )
    1114             :         {
    1115       68049 :             sts[0]->bwidth = sts[0]->input_bwidth;
    1116       68049 :             move16();
    1117       68049 :             sts[1]->bwidth = sts[0]->input_bwidth;
    1118       68049 :             move16();
    1119             :         }
    1120             :         ELSE
    1121             :         {
    1122         809 :             sts[0]->bwidth = s_max( sts[0]->input_bwidth, sts[1]->input_bwidth );
    1123         809 :             move16();
    1124         809 :             sts[1]->bwidth = s_max( sts[0]->input_bwidth, sts[1]->input_bwidth );
    1125         809 :             move16();
    1126             :         }
    1127             :     }
    1128             : 
    1129       83783 :     sts[0]->bwidth = s_max( sts[0]->bwidth, WB );
    1130       83783 :     move16();
    1131       83783 :     sts[1]->bwidth = s_max( sts[1]->bwidth, WB );
    1132       83783 :     move16();
    1133             : 
    1134       83783 :     return;
    1135             : }
    1136             : 
    1137             : 
    1138             : /*-------------------------------------------------------------------*
    1139             :  * set_bw_mct()
    1140             :  *
    1141             :  * Set encoded bandwidth for MCT
    1142             :  *-------------------------------------------------------------------*/
    1143             : 
    1144             : /*! r: flag indicating whether the coded BW has changed */
    1145      101939 : Word16 set_bw_mct_fx(
    1146             :     CPE_ENC_HANDLE hCPE[MCT_MAX_BLOCKS], /* i/o: CPE encoder structures      */
    1147             :     const Word16 nCPE                    /* i  : number of CPEs              */
    1148             : )
    1149             : {
    1150             :     Encoder_State *st;
    1151             :     Word16 ch, cpe_id;
    1152             :     Word16 mct_bwidth, last_mct_bwidth, bw_changed;
    1153             : 
    1154      101939 :     mct_bwidth = WB;                                       /* minimum coded audio band-width */
    1155      101939 :     last_mct_bwidth = hCPE[0]->hCoreCoder[0]->last_bwidth; /* supposes that LFE is not in the first channel */
    1156      101939 :     move16();
    1157      101939 :     move16();
    1158             : 
    1159      374247 :     FOR( cpe_id = 0; cpe_id < nCPE; cpe_id++ )
    1160             :     {
    1161      816924 :         FOR( ch = 0; ch < CPE_CHANNELS; ch++ )
    1162             :         {
    1163      544616 :             st = hCPE[cpe_id]->hCoreCoder[ch];
    1164      544616 :             IF( EQ_32( st->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) )
    1165             :             {
    1166       59829 :                 CONTINUE;
    1167             :             }
    1168             : 
    1169      484787 :             mct_bwidth = s_max( mct_bwidth, st->input_bwidth );
    1170             :         }
    1171             :     }
    1172             : 
    1173      374247 :     FOR( cpe_id = 0; cpe_id < nCPE; cpe_id++ )
    1174             :     {
    1175      272308 :         IF( GT_32( hCPE[cpe_id]->element_brate, BWD_MAX_BRATE_WIDER_BW_MDCT ) )
    1176             :         {
    1177      224148 :             mct_bwidth = s_max( mct_bwidth, hCPE[cpe_id]->hCoreCoder[0]->max_bwidth );
    1178             :         }
    1179             :     }
    1180             : 
    1181      101939 :     bw_changed = 0;
    1182      101939 :     move16();
    1183      101939 :     IF( NE_16( mct_bwidth, last_mct_bwidth ) )
    1184             :     {
    1185         179 :         bw_changed = 1;
    1186         179 :         move16();
    1187             :     }
    1188             : 
    1189             :     /*
    1190             :      * always set bw for all CPEs even if it is the same value as before,
    1191             :      * in case of bw + br switching when changing to MCT, this overwrites
    1192             :      * potentially incorrect initial values
    1193             :      */
    1194      374247 :     FOR( cpe_id = 0; cpe_id < nCPE; cpe_id++ )
    1195             :     {
    1196      816924 :         FOR( ch = 0; ch < CPE_CHANNELS; ch++ )
    1197             :         {
    1198      544616 :             st = hCPE[cpe_id]->hCoreCoder[ch];
    1199      544616 :             st->bwidth = mct_bwidth;
    1200      544616 :             move16();
    1201             :         }
    1202             :     }
    1203      101939 :     return bw_changed;
    1204             : }

Generated by: LCOV version 1.14