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 : }
|