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