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

Generated by: LCOV version 1.14