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"
7 : #include "cnst.h"
8 : #include "rom_enc.h"
9 : #include "rom_com.h" /* Common constants */
10 : #include "prot_fx.h" /* Function prototypes */
11 : #include "prot_fx_enc.h" /* Function prototypes */
12 : #include "basop_util.h" /* Function prototypes */
13 :
14 :
15 : /*--------------------------------------------------------------------------*
16 : * Local function prototypes
17 : *--------------------------------------------------------------------------*/
18 :
19 : static Word16 band_energy_quant_fx( BSTR_ENC_HANDLE hBstr, const Word32 *L_t_audio /*Q12*/, const Word16 band_start_fx[], const Word16 band_end_fx[], Word32 L_band_energy[] /*Q14*/, const Word16 bands_fx, const Word32 L_qint /*Q29*/, const Word16 eref_fx /*Q10*/, const Word16 is_transient_fx );
20 :
21 : static Word16 p2a_threshold_quant_fx( BSTR_ENC_HANDLE hBstr, const Word32 *L_t_audio /*Q12*/, const Word16 band_start[], const Word16 band_end[], const Word16 band_width[], const Word16 bands, const Word16 p2a_bands, const Word16 p2a_th /*Q11*/, Word16 *p2a_flags );
22 :
23 : static void mdct_spectrum_fine_gain_enc_fx( Encoder_State *st_fx, const Word32 L_ybuf[] /*Q12*/, Word32 L_y2[] /*Q12*/, const Word16 band_start[], const Word16 band_end[], const Word16 k_sort[], const Word16 bands, const Word32 L_qint /*Q29*/, const Word16 Ngq, const Word16 gqlevs, const Word16 gqbits );
24 :
25 :
26 : static Word16 p2a_threshold_quant_ivas_fx( BSTR_ENC_HANDLE hBstr, const Word32 *L_t_audio /*Q12*/, const Word16 band_start[], const Word16 band_end[], const Word16 band_width[], const Word16 bands, const Word16 p2a_bands, const Word16 p2a_th /*Q11*/, Word16 *p2a_flags );
27 : static void mdct_spectrum_fine_gain_enc_ivas_fx(
28 : Encoder_State *st_fx, /* i/o: encoder state structure */
29 : const Word32 L_ybuf[], /* i : Q12 : input spectrum */
30 : Word32 L_y2[], /* i/o: Q12 : decoded spectrum */
31 : const Word16 band_start[], /* i : Q0 : table of start freq for every subband */
32 : const Word16 band_end[], /* i : Q0 : table of end freq for every subband */
33 : const Word16 k_sort[], /* i : Q0 : sort table by band_energy */
34 : const Word16 bands, /* i : Q0 : nubmber of subbands */
35 : const Word32 L_qint, /* i : Q29 : */
36 : const Word16 Ngq, /* i : Q0 : */
37 : const Word16 gqlevs, /* i : Q0 : quantized level */
38 : const Word16 gqbits /* i : Q0 : quantized bits */
39 : );
40 :
41 : static Word16 band_energy_quant_ivas_fx(
42 : BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */
43 : const Word32 *L_t_audio, /* Q12 */
44 : const Word16 band_start[], /* Q0 */
45 : const Word16 band_end[], /* Q0 */
46 : Word32 L_band_energy[], /* Q14 */
47 : const Word16 bands_fx, /* Q0 */
48 : const Word32 L_qint, /* Q29 */
49 : const Word16 eref_fx, /* Q10 */
50 : const Word16 is_transient /* Q0 */ );
51 :
52 : /*--------------------------------------------------------------------------*
53 : * spt_shorten_domain_set()
54 : *
55 : * Track the spectral peak based on peak -avg analysis
56 : *--------------------------------------------------------------------------*/
57 :
58 38 : static void spt_shorten_domain_set_fx(
59 : Encoder_State *st_fx, /* i: encoder state structure */
60 : const Word32 L_t_audio[], /* i: input spectrum Q12*/
61 : const Word16 p2a_flags[], /* i: p2a anlysis information Q0*/
62 : const Word16 new_band_start[], /* i: new band start position Q0*/
63 : const Word16 new_band_end[], /* i: new band end position Q0*/
64 : const Word16 new_band_width[], /* i: new subband band width Q0*/
65 : const Word16 bands, /* i: total number of subbands Q0*/
66 : Word16 band_start[], /* i/o: band start position Q0*/
67 : Word16 band_end[], /* i/o: band end position Q0*/
68 : Word16 band_width[], /* i: sub band band width Q0*/
69 : Word16 *bit_budget /* i/o: bit budget Q0*/
70 : )
71 : {
72 : Word16 i, j, k;
73 : Word16 kpos;
74 : Word32 L_max_y2;
75 : Word16 max_y2_pos;
76 : Word16 spt_shorten_flag[SPT_SHORTEN_SBNUM];
77 38 : HQ_ENC_HANDLE hHQ_core = st_fx->hHQ_core;
78 :
79 38 : kpos = 0;
80 38 : j = 0;
81 38 : move16();
82 38 : move16();
83 190 : FOR( k = ( bands - SPT_SHORTEN_SBNUM ); k < bands; k++ )
84 : {
85 152 : IF( EQ_16( p2a_flags[k], 1 ) )
86 : {
87 7 : spt_shorten_flag[j] = 0;
88 7 : move16();
89 7 : IF( hHQ_core->prev_SWB_peak_pos[kpos] != 0 )
90 : {
91 2 : L_max_y2 = L_deposit_l( 0 );
92 2 : max_y2_pos = 0;
93 2 : move16();
94 212 : FOR( i = band_start[k]; i <= band_end[k]; i++ )
95 : {
96 210 : IF( LT_32( L_max_y2, L_abs( L_t_audio[i] ) ) )
97 : {
98 12 : L_max_y2 = L_abs( L_t_audio[i] ); /* Q12 */
99 12 : move32();
100 12 : max_y2_pos = i;
101 12 : move16();
102 : }
103 : }
104 2 : test();
105 2 : IF( GE_16( max_y2_pos, new_band_start[j] ) && LE_16( max_y2_pos, new_band_end[j] ) )
106 : {
107 2 : band_start[k] = new_band_start[j]; /* Q0 */
108 2 : move16();
109 2 : band_end[k] = new_band_end[j]; /* Q0 */
110 2 : move16();
111 2 : band_width[k] = new_band_width[j]; /* Q0 */
112 2 : move16();
113 2 : spt_shorten_flag[j] = 1;
114 2 : move16();
115 : }
116 : }
117 7 : push_indice( st_fx->hBstr, IND_HQ2_SPT_SHORTEN, spt_shorten_flag[j], 1 );
118 7 : *bit_budget = sub( *bit_budget, 1 ); /* Q0 */
119 7 : move16();
120 : }
121 :
122 152 : kpos += 1;
123 152 : j += 1;
124 : }
125 :
126 38 : return;
127 : }
128 :
129 0 : static void spt_shorten_domain_set_ivas_fx(
130 : Encoder_State *st_fx, /* i: encoder state structure */
131 : const Word32 L_t_audio[], /* i: input spectrum Q12*/
132 : const Word16 p2a_flags[], /* i: p2a anlysis information Q0*/
133 : const Word16 new_band_start[], /* i: new band start position Q0*/
134 : const Word16 new_band_end[], /* i: new band end position Q0*/
135 : const Word16 new_band_width[], /* i: new subband band width Q0*/
136 : const Word16 bands, /* i: total number of subbands Q0*/
137 : Word16 band_start[], /* i/o: band start position Q0*/
138 : Word16 band_end[], /* i/o: band end position Q0*/
139 : Word16 band_width[], /* i: sub band band width Q0*/
140 : Word16 *bit_budget /* i/o: bit budget Q0*/
141 : )
142 : {
143 : Word16 i, j, k;
144 : Word16 kpos;
145 : Word32 L_max_y2;
146 : Word16 max_y2_pos;
147 : Word16 spt_shorten_flag[SPT_SHORTEN_SBNUM];
148 0 : HQ_ENC_HANDLE hHQ_core = st_fx->hHQ_core;
149 :
150 0 : kpos = 0;
151 0 : j = 0;
152 0 : move16();
153 0 : move16();
154 0 : FOR( k = ( bands - SPT_SHORTEN_SBNUM ); k < bands; k++ )
155 : {
156 0 : IF( EQ_16( p2a_flags[k], 1 ) )
157 : {
158 0 : spt_shorten_flag[j] = 0;
159 0 : move16();
160 0 : IF( hHQ_core->prev_SWB_peak_pos[kpos] != 0 )
161 : {
162 0 : L_max_y2 = L_deposit_l( 0 );
163 0 : max_y2_pos = 0;
164 0 : move16();
165 0 : FOR( i = band_start[k]; i <= band_end[k]; i++ )
166 : {
167 0 : IF( LT_32( L_max_y2, L_abs( L_t_audio[i] ) ) )
168 : {
169 0 : L_max_y2 = L_abs( L_t_audio[i] ); /* Q12 */
170 0 : move32();
171 0 : max_y2_pos = i;
172 0 : move16();
173 : }
174 : }
175 0 : test();
176 0 : IF( GE_16( max_y2_pos, new_band_start[j] ) && LE_16( max_y2_pos, new_band_end[j] ) )
177 : {
178 0 : band_start[k] = new_band_start[j]; /* Q0 */
179 0 : move16();
180 0 : band_end[k] = new_band_end[j]; /* Q0 */
181 0 : move16();
182 0 : band_width[k] = new_band_width[j]; /* Q0 */
183 0 : move16();
184 0 : spt_shorten_flag[j] = 1;
185 0 : move16();
186 : }
187 : }
188 0 : push_indice( st_fx->hBstr, IND_HQ2_SPT_SHORTEN, spt_shorten_flag[j], 1 );
189 0 : *bit_budget = sub( *bit_budget, 1 ); /* Q0 */
190 0 : move16();
191 : }
192 :
193 0 : kpos += 1;
194 0 : j += 1;
195 : }
196 :
197 0 : return;
198 : }
199 :
200 :
201 : /*--------------------------------------------------------------------------*
202 : * hq_lr_enc_fx()
203 : *
204 : * HQ Low rate encoding routine
205 : *--------------------------------------------------------------------------*/
206 :
207 39 : void hq_lr_enc_fx(
208 : Encoder_State *st_fx, /* i/o: : encoder state structure */
209 : Word32 L_t_audio[], /* i/o: Q12 : transform-domain coefs. */
210 : const Word16 inner_frame_fx, /* i : Q0 : inner frame length */
211 : Word16 *num_bits_fx, /* i/o: Q0 : number of available bits */
212 : const Word16 is_transient_fx /* i : Q0 : transient flag */
213 : )
214 : {
215 : Word16 i, k1_fx, k2_fx;
216 : Word16 bit_budget_fx, pbits_fx;
217 : Word16 bands_fx, length_fx, ni_seed_fx, gqlevs_fx, gqbits_fx, Ngq_fx, p2a_bands_fx;
218 : Word16 p2a_flags_fx[BANDS_MAX];
219 : Word16 band_start[BANDS_MAX], band_end[BANDS_MAX], band_width[BANDS_MAX];
220 : Word32 L_band_energy[BANDS_MAX], L_Rk[BANDS_MAX];
221 : Word16 ebits_fx;
222 :
223 : Word32 L_qint;
224 : /*Word16 Qqint=29;*/
225 : Word16 eref_fx /*, Qeref=10*/;
226 : Word16 bit_alloc_weight_fx /*, Qbaw=13*/;
227 : Word16 ld_slope_fx /*, Qldslope=15*/;
228 : Word16 p2a_th_fx /*, Qp2ath=11*/;
229 : Word16 pd_thresh_fx /*, Qpdth=15*/;
230 : Word16 ni_coef_fx /*, Qnicoef=14*/;
231 :
232 : Word16 k_sort_fx[BANDS_MAX];
233 : Word16 npulses_fx[BANDS_MAX];
234 : Word16 inp_vector_fx[L_FRAME48k];
235 : Word32 L_y2[L_FRAME48k];
236 : Word32 L_y2_ni[L_FRAME48k];
237 : Word16 hqswb_clas_fx;
238 : Word16 lowlength_fx;
239 : Word16 highlength_fx;
240 : Word32 L_m[L_FRAME32k];
241 : Word16 har_bands_fx;
242 : Word16 bw_low, bw_high;
243 : Word32 L_band_energy_tmp[BANDS_MAX];
244 : Word32 L_bwe_br;
245 : Word16 trans_bit;
246 : Word16 adjustFlag;
247 : Word16 prev_SWB_peak_pos_tmp_fx[SPT_SHORTEN_SBNUM];
248 : Word16 k, j;
249 : Word16 flag_spt_fx;
250 : Word16 org_band_start[SPT_SHORTEN_SBNUM];
251 : Word16 org_band_end[SPT_SHORTEN_SBNUM];
252 : Word16 org_band_width[SPT_SHORTEN_SBNUM];
253 : Word16 new_band_start[SPT_SHORTEN_SBNUM];
254 : Word16 new_band_end[SPT_SHORTEN_SBNUM];
255 : Word16 new_band_width[SPT_SHORTEN_SBNUM];
256 :
257 : Word16 k1_step_fx, k2_step_fx;
258 : Word16 exp_norm;
259 :
260 : Word16 lowband, highband, p2a_flags_tmp[BANDS_MAX];
261 : Word32 L_tmp, L_tmp2, L_tmp3;
262 : Word16 exp, exp2, tmp, tmp1, tmp2, tmp3, frac1, alpha_fx, Q_band_energy;
263 : Word32 enerH_fx;
264 : Word32 enerL_fx;
265 : Word32 Ep_fx[BANDS_MAX];
266 : Word32 Ep_avrg_fx, Ep_vari_fx;
267 : Word32 Ep_avrgL_fx;
268 : Word32 Ep_peak_fx;
269 : Word32 Ep_tmp_fx[BANDS_MAX];
270 : Word16 gama_fx; /*Q15 0.85f;// */
271 : Word16 beta_fx; /*Q14 1.05f; */
272 39 : HQ_ENC_HANDLE hHQ_core = st_fx->hHQ_core;
273 39 : BSTR_ENC_HANDLE hBstr = st_fx->hBstr;
274 :
275 39 : set32_fx( L_y2, 0x0L, L_FRAME48k );
276 39 : set16_fx( inp_vector_fx, 0, inner_frame_fx );
277 39 : flag_spt_fx = 0;
278 39 : move16();
279 39 : set16_fx( prev_SWB_peak_pos_tmp_fx, 0, SPT_SHORTEN_SBNUM );
280 39 : adjustFlag = 0;
281 39 : move16();
282 39 : bw_low = 0;
283 39 : move16();
284 39 : bw_high = 20;
285 39 : move16();
286 39 : enerL_fx = L_deposit_l( 0 );
287 39 : enerH_fx = L_deposit_l( 0 );
288 :
289 39 : tmp2 = 0; /* to avoid compilation warnings */
290 39 : move16();
291 :
292 39 : L_bwe_br = L_add( st_fx->core_brate, 0 );
293 39 : hqswb_clas_fx = HQ_NORMAL;
294 39 : move16();
295 39 : test();
296 39 : test();
297 39 : IF( EQ_16( st_fx->bwidth, SWB ) && ( EQ_32( L_bwe_br, HQ_16k40 ) || EQ_32( L_bwe_br, HQ_13k20 ) ) )
298 : {
299 39 : IF( EQ_16( is_transient_fx, 1 ) )
300 : {
301 1 : hqswb_clas_fx = HQ_TRANSIENT;
302 1 : move16();
303 : }
304 : ELSE
305 : {
306 38 : hqswb_clas_fx = peak_avrg_ratio_fx( st_fx->total_brate, L_t_audio, NUMC_N, &hHQ_core->mode_count, &hHQ_core->mode_count1, SWB_BWE_LR_Qs ); /* Q0 */
307 : }
308 :
309 : /* write the classification information into the bitstream */
310 39 : push_indice( hBstr, IND_HQ2_SWB_CLAS, hqswb_clas_fx, 2 );
311 39 : ( *num_bits_fx ) = sub( *num_bits_fx, 2 );
312 39 : move16();
313 39 : IF( EQ_16( hqswb_clas_fx, HQ_NORMAL ) )
314 : {
315 38 : flag_spt_fx = 1;
316 38 : move16();
317 : }
318 : }
319 : ELSE
320 : {
321 : /* write the transient bit into the bitstream */
322 0 : push_indice( st_fx->hBstr, IND_HQ2_SWB_CLAS, is_transient_fx, 1 );
323 :
324 : /* subtract one bit for the transient flag */
325 0 : ( *num_bits_fx ) = sub( ( *num_bits_fx ), 1 );
326 0 : move16();
327 : }
328 :
329 39 : hq2_core_configure_fx( inner_frame_fx, *num_bits_fx, is_transient_fx, &bands_fx, &length_fx, band_width, band_start, band_end,
330 : &L_qint, &eref_fx, &bit_alloc_weight_fx, &gqlevs_fx, &Ngq_fx, &p2a_bands_fx, &p2a_th_fx, &pd_thresh_fx, &ld_slope_fx, &ni_coef_fx, L_bwe_br );
331 :
332 39 : highlength_fx = band_end[( bands_fx - 1 )]; /* Q0 */
333 39 : move16();
334 39 : har_bands_fx = bands_fx; /* Q0 */
335 39 : move16();
336 :
337 39 : test();
338 39 : test();
339 39 : test();
340 39 : IF( EQ_16( st_fx->bwidth, SWB ) && is_transient_fx == 0 && ( EQ_32( L_bwe_br, HQ_16k40 ) || EQ_32( L_bwe_br, HQ_13k20 ) ) )
341 : {
342 : /* reserve bits for HQ_NORMAL2 and HQ_HARMONIC modes */
343 38 : test();
344 38 : IF( EQ_16( hqswb_clas_fx, HQ_NORMAL ) || EQ_16( hqswb_clas_fx, HQ_HARMONIC ) )
345 : {
346 38 : ( *num_bits_fx ) = sub( *num_bits_fx, get_usebit_npswb_fx( hqswb_clas_fx ) );
347 38 : move16();
348 : }
349 : }
350 :
351 39 : test();
352 39 : test();
353 39 : IF( ( EQ_32( L_bwe_br, HQ_16k40 ) || EQ_32( L_bwe_br, HQ_13k20 ) ) && EQ_16( st_fx->bwidth, SWB ) )
354 : {
355 39 : IF( NE_16( hHQ_core->prev_hqswb_clas, HQ_NORMAL ) )
356 : {
357 1 : j = 0;
358 1 : move16();
359 5 : FOR( k = ( bands_fx - SPT_SHORTEN_SBNUM ); k < bands_fx; k++ )
360 : {
361 4 : hHQ_core->prev_SWB_peak_pos[j] = 0;
362 4 : move16();
363 4 : j = add( j, 1 );
364 : }
365 : }
366 : }
367 :
368 : /* Check if input frame is larger than coded bandwidth */
369 39 : test();
370 39 : IF( GT_16( inner_frame_fx, length_fx ) && is_transient_fx )
371 : {
372 : /* If so, collapse transient frame (4 short transforms) to remove uncoded coefficients */
373 :
374 1 : k1_step_fx = shr( length_fx, 2 ); /* k1 = length/NUM_TIME_SWITCHING_BLOCKS Q0*/
375 1 : k2_step_fx = shr( inner_frame_fx, 2 ); /* k2 = inner_frame/NUM_TIME_SWITCHING_BLOCKS Q0*/
376 1 : k1_fx = k1_step_fx; /* Q0 */
377 1 : k2_fx = k2_step_fx; /* Q0 */
378 1 : move16();
379 1 : move16();
380 4 : FOR( i = 1; i < NUM_TIME_SWITCHING_BLOCKS; i++ )
381 : {
382 : /*k1 = i*length/NUM_TIME_SWITCHING_BLOCKS; */
383 : /*k2 = i*inner_frame/NUM_TIME_SWITCHING_BLOCKS; */
384 :
385 3 : Copy32( &L_t_audio[k2_fx], &L_t_audio[k1_fx], k1_step_fx ); /* Q12 */
386 :
387 3 : k1_fx = add( k1_fx, k1_step_fx );
388 3 : k2_fx = add( k2_fx, k2_step_fx );
389 : }
390 : }
391 :
392 : /* Spectral energy calculation/quantization */
393 39 : ebits_fx = band_energy_quant_fx( hBstr, L_t_audio, band_start, band_end, L_band_energy, bands_fx,
394 : L_qint, eref_fx, is_transient_fx ); /* Q0 */
395 :
396 : /* First pass bit budget for TCQ of spectral band information */
397 39 : exp_norm = norm_s( gqlevs_fx ); /* gqbits_fx = (short int) log2_f ((float) gqlevs_fx); */
398 39 : gqbits_fx = sub( 14, exp_norm );
399 :
400 39 : bit_budget_fx = sub( sub( *num_bits_fx, ebits_fx ), round_fx( L_shl( L_mult( Ngq_fx, gqbits_fx ), 15 ) ) ); /* (*num_bits) - (short) ceil (ebits) - Ngq * gqbits; Q0*/
401 :
402 :
403 39 : pbits_fx = 0;
404 39 : move16();
405 :
406 39 : test();
407 39 : test();
408 39 : IF( EQ_16( st_fx->bwidth, SWB ) && ( EQ_32( L_bwe_br, HQ_16k40 ) || EQ_32( L_bwe_br, HQ_13k20 ) ) )
409 : {
410 39 : IF( EQ_16( hqswb_clas_fx, HQ_HARMONIC ) )
411 : {
412 0 : set16_fx( p2a_flags_fx, 1, har_bands_fx );
413 : }
414 : ELSE
415 : {
416 : /* High band tonality detector based on per band peak-to-average ratio */
417 39 : pbits_fx = p2a_threshold_quant_fx( hBstr, L_t_audio, band_start, band_end, band_width, bands_fx, p2a_bands_fx, p2a_th_fx, p2a_flags_fx ); /* Q0 */
418 39 : bit_budget_fx = sub( bit_budget_fx, pbits_fx );
419 :
420 39 : IF( EQ_16( hqswb_clas_fx, HQ_NORMAL ) )
421 : {
422 38 : return_bits_normal2_fx( &bit_budget_fx, p2a_flags_fx, bands_fx, bits_lagIndices_modeNormal );
423 : }
424 : }
425 : }
426 : ELSE
427 : {
428 : /* High band tonality detector based on per band peak-to-average ratio */
429 0 : pbits_fx = p2a_threshold_quant_fx( hBstr, L_t_audio, band_start, band_end, band_width, bands_fx, p2a_bands_fx, p2a_th_fx, p2a_flags_fx ); /* Q0 */
430 0 : bit_budget_fx = sub( bit_budget_fx, pbits_fx );
431 : }
432 :
433 39 : IF( EQ_16( flag_spt_fx, 1 ) )
434 : {
435 38 : spt_shorten_domain_band_save_fx( bands_fx, band_start, band_end, band_width, org_band_start, org_band_end, org_band_width );
436 38 : spt_shorten_domain_pre_fx( band_start, band_end, hHQ_core->prev_SWB_peak_pos, bands_fx, L_bwe_br, new_band_start, new_band_end, new_band_width );
437 38 : spt_shorten_domain_set_fx( st_fx, L_t_audio, p2a_flags_fx, new_band_start, new_band_end, new_band_width, bands_fx, band_start, band_end, band_width, &bit_budget_fx );
438 : }
439 :
440 : /* Estimate number of bits per band */
441 39 : Q_band_energy = SWB_BWE_LR_Qbe;
442 39 : move16();
443 :
444 907 : FOR( i = 0; i < bands_fx; i++ )
445 : {
446 868 : L_tmp = L_shl( L_band_energy[i], sub( 16, Q_band_energy ) ); /*Q16 */
447 :
448 868 : frac1 = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */
449 868 : L_tmp = Pow2( 30, frac1 );
450 868 : exp = sub( exp, 30 );
451 868 : Ep_fx[i] = L_shl_sat( L_tmp, s_max( sub( exp, 6 ), -31 ) ); /* Q -6 */
452 : }
453 :
454 907 : FOR( i = 0; i < bands_fx; i++ )
455 : {
456 868 : L_tmp2 = Ep_fx[i]; /* Q -6 */
457 868 : L_tmp = L_max( 1, L_tmp2 ); /* Q -6 */
458 868 : exp = norm_l( L_tmp );
459 868 : tmp = extract_h( L_shl( L_tmp, exp ) ); /* Q -6 + exp - 16 */
460 :
461 868 : L_tmp3 = L_deposit_l( band_width[i] ); /* Q0 */
462 868 : exp2 = norm_l( L_tmp3 );
463 868 : tmp2 = extract_h( L_shl( L_tmp3, exp2 ) ); /* exp2 - 16 */
464 :
465 868 : exp2 = sub( exp, exp2 ); /* Denormalize and substract */
466 :
467 868 : tmp3 = sub( tmp2, tmp );
468 868 : IF( tmp3 > 0 )
469 : {
470 390 : tmp2 = shr( tmp2, 1 );
471 : }
472 868 : IF( tmp3 > 0 )
473 : {
474 390 : exp2 = add( exp2, 1 );
475 : }
476 868 : tmp = div_s( tmp2, tmp );
477 868 : L_tmp = L_deposit_h( tmp );
478 868 : L_tmp = Isqrt_lc( L_tmp, &exp2 ); /*Q(31-exp2) */
479 868 : Ep_tmp_fx[i] = L_shr( L_tmp, sub( 15, exp2 ) ); /*Q13 */
480 868 : move32();
481 : }
482 :
483 39 : test();
484 39 : test();
485 39 : test();
486 39 : test();
487 39 : test();
488 39 : test();
489 39 : IF( is_transient_fx == 0 && EQ_16( inner_frame_fx, L_FRAME8k ) && LE_32( st_fx->core_brate, ACELP_13k20 ) )
490 : {
491 0 : lowband = 6;
492 0 : move16();
493 0 : trans_bit = 2;
494 0 : move16();
495 0 : bit_budget_fx = sub( bit_budget_fx, trans_bit );
496 0 : gama_fx = 27852; /*Q15 0.85f;// */
497 0 : beta_fx = 17203; /*Q14 1.05f; */
498 0 : move16();
499 0 : move16();
500 :
501 0 : set16_fx( &p2a_flags_tmp[( bands_fx - trans_bit )], 0, 2 );
502 :
503 0 : IF( EQ_32( st_fx->core_brate, ACELP_13k20 ) )
504 : {
505 0 : beta_fx = 13107; /*14 1.25f; */
506 0 : move16();
507 0 : gama_fx = 31130; /*0.95f; */
508 0 : move16();
509 0 : Copy( &p2a_flags_fx[( bands_fx - trans_bit )], &p2a_flags_tmp[( bands_fx - trans_bit )], trans_bit ); /* Q0 */
510 : }
511 : /* calculate the the low band/high band energy and the variance/avrage of the envelopes */
512 0 : Ep_vari_fx = L_deposit_l( 0 );
513 0 : Ep_avrg_fx = L_deposit_l( 0 );
514 0 : Ep_avrgL_fx = L_deposit_l( 0 );
515 0 : Ep_peak_fx = L_deposit_l( 0 );
516 0 : FOR( i = 0; i < bands_fx; i++ )
517 : {
518 0 : IF( GE_16( i, lowband ) )
519 : {
520 0 : Ep_vari_fx = L_add_sat( Ep_vari_fx, L_abs( L_sub( Ep_tmp_fx[i], Ep_tmp_fx[sub( i, 1 )] ) ) ); /*Q15 */
521 0 : Ep_avrg_fx = L_add_sat( Ep_avrg_fx, Ep_tmp_fx[i] ); /*Q15 */
522 0 : move32();
523 : }
524 : ELSE
525 : {
526 0 : Ep_avrgL_fx = L_add_sat( Ep_avrgL_fx, Ep_tmp_fx[i] ); /*Q15 */
527 0 : IF( GT_32( Ep_tmp_fx[i], Ep_peak_fx ) )
528 : {
529 0 : Ep_peak_fx = L_add( Ep_tmp_fx[i], 0 ); /*Q15 */
530 : }
531 : }
532 : }
533 : /* modify the last p2a_bands subbands band_energies */
534 0 : Copy32( L_band_energy, L_band_energy_tmp, bands_fx ); /*Q_band_energy */
535 0 : L_tmp = Mult_32_16( Ep_peak_fx, 24576 ); /*Q(13+14-15 = 12) 1.5 lowband = 6; */
536 0 : L_tmp2 = Mult_32_16( Ep_peak_fx, shl( sub( bands_fx, lowband ), 9 ) ); /*Q(13+9-15 = 7) */
537 0 : L_tmp3 = Mult_32_16( Ep_avrg_fx, 1126 ); /*Q(13+9-15 = 7) */
538 :
539 0 : test();
540 0 : test();
541 0 : test();
542 0 : test();
543 0 : IF( ( ( LT_32( L_tmp, L_shr( Ep_avrgL_fx, 1 ) ) && EQ_32( st_fx->core_brate, ACELP_13k20 ) ) || LT_32( st_fx->core_brate, ACELP_13k20 ) ) &&
544 : LT_32( L_tmp2, L_tmp3 ) && GT_32( L_tmp2, L_shr( Ep_avrg_fx, 7 ) ) )
545 : {
546 0 : FOR( i = lowband; i < bands_fx; i++ )
547 : {
548 0 : L_tmp = Mult_32_16( Ep_avrg_fx, 24576 ); /*Q(13+14-15 = 12) 1.5 */
549 0 : IF( LT_32( L_shr( Ep_tmp_fx[i], 1 ), L_tmp ) )
550 : {
551 0 : L_tmp = Mult_32_16( Ep_peak_fx, sub( bands_fx, lowband ) ); /*Q(13+0-15 = -2) */
552 0 : tmp = extract_h( L_shl( L_tmp, 14 ) ); /*Q-4 */
553 0 : IF( tmp != 0 )
554 : {
555 0 : exp = norm_s( tmp );
556 0 : tmp = shl( tmp, exp ); /*Q(exp) */
557 0 : tmp = div_s( 16384, tmp ); /*Q(15+14-exp=29-exp) */
558 0 : exp = sub( 29, exp );
559 : }
560 : ELSE
561 : {
562 : /*when the divisor is zero, happens rarely*/
563 0 : tmp = 0x7fff;
564 0 : move16();
565 0 : exp = 0;
566 0 : move16();
567 : }
568 0 : L_tmp = L_shl( Mult_32_16( Ep_avrg_fx, tmp ), sub( 13, exp ) ); /*Q(13+exp-15 +13-exp +4 = 15) */
569 0 : L_tmp2 = L_add( L_tmp, 13107 ); /*15 */
570 0 : tmp2 = extract_l( L_min( L_max( L_tmp2, 16384 ), gama_fx ) ); /*15 = 15 */
571 0 : L_band_energy_tmp[i] = Mult_32_16( L_band_energy_tmp[i], tmp2 ); /*Q(Q_band_energy+15-15 = Q_band_energy) */
572 0 : move32();
573 : }
574 : }
575 : }
576 : ELSE
577 : {
578 0 : j = 0;
579 0 : move16();
580 0 : FOR( i = ( bands_fx - trans_bit ); i < bands_fx; i++ )
581 : {
582 0 : alpha_fx = 16384; /*Q14 */
583 0 : move16();
584 0 : IF( EQ_16( p2a_flags_tmp[i], 1 ) )
585 : {
586 0 : L_tmp = Mult_32_16( Ep_tmp_fx[i], sub( bands_fx, lowband ) ); /*Q(13+0-15 = -2) */
587 0 : tmp = extract_h( L_shl( L_tmp, 14 ) ); /*Q-4 */
588 0 : IF( tmp != 0 )
589 : {
590 0 : exp = norm_s( tmp );
591 0 : tmp = shl( tmp, exp ); /*Q(exp) */
592 0 : tmp = div_s( 16384, tmp ); /*Q(15+14-exp=29-exp) */
593 0 : exp = sub( 29, exp );
594 : }
595 : ELSE
596 : {
597 : /*when the divisor is zero, happens rarely*/
598 0 : tmp = 0x7fff;
599 0 : move16();
600 0 : exp = 0;
601 0 : move16();
602 : }
603 0 : L_tmp = Mult_32_16( Ep_vari_fx, 3277 ); /*13+15-15=13 */
604 0 : L_tmp = L_shl_sat( Mult_32_16( L_tmp, tmp ), sub( 12, exp ) ); /*Q(13+exp-15 +12-exp +4 = 14) */
605 0 : tmp2 = extract_h( Ep_avrg_fx ); /*Q13-16=-3 */
606 0 : IF( tmp2 != 0 )
607 : {
608 0 : exp = norm_s( tmp2 );
609 0 : tmp2 = shl( tmp2, exp ); /*Q(exp) */
610 0 : tmp2 = div_s( 16384, tmp2 ); /*Q(15+14-exp=29-exp) */
611 0 : exp = sub( 29, exp );
612 : }
613 : ELSE
614 : {
615 0 : tmp2 = 0x7fff;
616 0 : move16();
617 0 : exp = 0;
618 0 : move16();
619 : }
620 0 : L_tmp2 = Mult_32_16( Ep_vari_fx, 6554 ); /*13+15-15=13 */
621 0 : L_tmp2 = L_shl_sat( Mult_32_16( L_tmp2, tmp2 ), sub( 13, exp ) ); /*Q(13+exp-15 +13-exp +3 = 14) */
622 0 : L_tmp = L_min( L_tmp, L_tmp2 ); /*Q14 */
623 0 : tmp = extract_l( L_min( L_tmp, 13107 ) ); /*Q14 */
624 0 : alpha_fx = add( 16384, tmp );
625 : }
626 0 : IF( EQ_16( hHQ_core->last_bitalloc_max_band[j++], 1 ) )
627 : {
628 0 : L_tmp = Mult_32_16( Ep_tmp_fx[i], sub( bands_fx, lowband ) ); /*Q(13+0-15 = -2) */
629 0 : tmp = extract_h( L_shl_sat( L_tmp, 14 ) ); /*Q-4 */
630 0 : IF( tmp != 0 )
631 : {
632 0 : exp = norm_s( tmp );
633 0 : tmp = shl( tmp, exp ); /*Q(exp) */
634 0 : tmp = div_s( 16384, tmp ); /*Q(15+14-exp=29-exp) */
635 0 : exp = sub( 29, exp );
636 : }
637 : ELSE
638 : {
639 0 : tmp = 0x7fff;
640 0 : move16();
641 0 : exp = 0;
642 0 : move16();
643 : }
644 0 : L_tmp = L_shl_sat( Mult_32_16( Ep_avrg_fx, tmp ), sub( 14, exp ) ); /*Q(13+exp-15 +14-exp+2 = 14) */
645 0 : L_tmp = L_max( L_tmp, 16384 ); /*Q14 */
646 0 : tmp = extract_l( L_min( L_tmp, beta_fx ) ); /*Q14 */
647 0 : alpha_fx = shl( mult( alpha_fx, tmp ), 1 ); /*14+14-15 +1=Q14 */
648 : }
649 : ELSE
650 : {
651 0 : tmp2 = extract_h( Ep_avrg_fx ); /*13 -16 =-3 */
652 0 : IF( tmp2 != 0 )
653 : {
654 0 : exp = norm_s( tmp2 );
655 0 : tmp2 = shl( tmp2, exp ); /*Q(exp) */
656 0 : tmp2 = div_s( 16384, tmp2 ); /*Q(15+14-exp=29-exp) */
657 0 : exp = sub( 29, exp );
658 : }
659 : ELSE
660 : {
661 : /*when the divisor is zero, happens rarely*/
662 0 : tmp2 = 0x7fff;
663 0 : move16();
664 0 : exp = 0;
665 0 : move16();
666 : }
667 0 : L_tmp = L_shl_sat( Mult_32_16( Ep_tmp_fx[i], tmp2 ), sub( 19, exp ) ); /*Q(13+exp-15 +19-exp +3 = 20) */
668 0 : L_tmp = Mult_32_16( L_tmp, shl( sub( bands_fx, lowband ), 9 ) ); /*20 +9 -15 =Q14 */
669 0 : L_tmp = L_max( L_tmp, 13926 ); /*Q14 */
670 0 : tmp2 = extract_l( L_min( L_tmp, 16384 ) ); /*Q14 */
671 0 : alpha_fx = shl( mult( alpha_fx, tmp2 ), 1 ); /*14+14-15+1 =Q14 */
672 : }
673 0 : L_band_energy_tmp[i] = L_shl( Mult_32_16( L_band_energy_tmp[i], alpha_fx ), 1 ); /*Q(Q_band_energy+14-15 +1= Q_band_energy) */
674 0 : move32();
675 : }
676 : }
677 0 : lowband = 3;
678 0 : move16();
679 0 : Ep_avrg_fx = L_deposit_l( 0 );
680 0 : Ep_avrgL_fx = L_deposit_l( 0 );
681 0 : Ep_peak_fx = L_deposit_l( 0 );
682 0 : FOR( i = 0; i < bands_fx; i++ )
683 : {
684 0 : IF( GE_16( i, lowband ) )
685 : {
686 0 : Ep_avrg_fx = L_add_sat( Ep_avrg_fx, Ep_tmp_fx[i] ); /*Q15 */
687 : }
688 : ELSE
689 : {
690 0 : Ep_avrgL_fx = L_add_sat( Ep_avrgL_fx, L_shr( Ep_tmp_fx[i], 1 ) ); /*Q12 */
691 0 : IF( GT_32( Ep_tmp_fx[i], Ep_peak_fx ) )
692 : {
693 0 : Ep_peak_fx = L_add( Ep_tmp_fx[i], 0 ); /*Q13 */
694 : }
695 : }
696 : }
697 0 : L_tmp = Mult_32_16( Ep_peak_fx, 28262 ); /*Q(13+14-15 = 12) 1.725 lowband = 3; */
698 0 : L_tmp2 = Mult_32_16( Ep_avrgL_fx, 24576 ); /*Q(12+14-15 = 11) */
699 0 : test();
700 0 : test();
701 0 : IF( GT_32( L_shr( Ep_avrg_fx, 2 ), L_tmp2 ) && LT_32( L_shr( Ep_avrg_fx, 4 ), L_tmp2 ) && GT_32( L_tmp, Ep_avrgL_fx ) )
702 : {
703 0 : adjustFlag = 1;
704 0 : move16();
705 0 : FOR( i = 0; i < lowband; i++ )
706 : {
707 0 : tmp = extract_h( Ep_avrgL_fx ); /*Q-4 */
708 0 : IF( tmp != 0 )
709 : {
710 0 : exp = norm_s( tmp );
711 0 : tmp = shl( tmp, exp ); /*Q(exp) */
712 0 : tmp = div_s( 16384, tmp ); /*Q(15+14-exp=29-exp) */
713 0 : exp = sub( 29, exp );
714 : }
715 : ELSE
716 : {
717 : /*when the divisor is zero, happens rarely*/
718 0 : tmp = 0x7fff;
719 0 : move16();
720 0 : exp = 0;
721 0 : move16();
722 : }
723 0 : L_tmp = Mult_32_16( Ep_peak_fx, tmp ); /*Q(13+exp-15+4 = exp+2) */
724 0 : L_tmp = Mult_32_16( L_tmp, lowband ); /*Q(exp+2+0-15 = exp-13) */
725 0 : L_tmp = Mult_32_16( L_tmp, 18842 ); /*Q(exp-13+16-16 = exp-13) */
726 0 : L_tmp = L_shl( L_tmp, sub( 27, exp ) ); /*Q14 0.5 */
727 0 : tmp2 = extract_l( L_min( L_tmp, 19661 ) ); /*Q14 */
728 0 : L_tmp = Mult_32_16( L_band_energy_tmp[i], tmp2 ); /*Q(Q_band_energy+14-15 = Q_band_energy-1) */
729 0 : L_band_energy_tmp[i] = L_shl( L_tmp, 1 ); /*Q_band_energy */
730 : }
731 : }
732 0 : hq2_bit_alloc_fx( L_band_energy_tmp, bands_fx, L_Rk, &bit_budget_fx, p2a_flags_fx, bit_alloc_weight_fx, band_width,
733 0 : *num_bits_fx, hqswb_clas_fx, st_fx->bwidth, is_transient_fx );
734 :
735 : /* encode the last p2a_bands-1 subbands bit-allocation index of the previous frame */
736 0 : FOR( i = 0; i < 2; i++ )
737 : {
738 0 : push_indice( st_fx->hBstr, IND_HQ2_LAST_BA_MAX_BAND, hHQ_core->last_bitalloc_max_band[i], 1 );
739 : }
740 : }
741 39 : ELSE IF( is_transient_fx == 0 && EQ_16( inner_frame_fx, L_FRAME16k ) )
742 : {
743 0 : bit_budget_fx = sub( bit_budget_fx, 2 ); /* bits in high bands to indicate the last 2 subbands is allocated bits or not Q0*/
744 0 : FOR( i = 0; i < bands_fx; i++ )
745 : {
746 0 : Ep_tmp_fx[i] = L_shl_sat( Ep_tmp_fx[i], 2 ); /* Q15 */
747 0 : move32();
748 : }
749 0 : IF( EQ_32( st_fx->core_brate, ACELP_13k20 ) )
750 : {
751 0 : lowband = 8;
752 0 : move16();
753 0 : highband = 15;
754 0 : move16();
755 0 : bw_low = sub( band_start[highband], band_start[lowband] ); /* Q0 */
756 0 : bw_high = sub( add( band_end[( bands_fx - 1 )], 1 ), band_start[highband] ); /* Q0 */
757 : }
758 : ELSE
759 : {
760 0 : lowband = 8;
761 0 : move16();
762 0 : highband = 16;
763 0 : move16();
764 0 : bw_low = sub( band_start[highband], band_start[lowband] ); /* Q0 */
765 0 : bw_high = sub( add( band_end[( bands_fx - 1 )], 1 ), band_start[highband] ); /* Q0 */
766 : }
767 : /* calculate the the low band/high band energy and the variance/avrage of the envelopes */
768 0 : enerL_fx = L_deposit_l( 0 );
769 0 : enerH_fx = L_deposit_l( 0 );
770 0 : Ep_vari_fx = L_deposit_l( 0 );
771 0 : Ep_avrg_fx = L_deposit_l( 0 );
772 0 : FOR( i = 0; i < bands_fx; i++ )
773 : {
774 0 : test();
775 0 : IF( GE_16( i, lowband ) && add( sub( i, bands_fx ), p2a_bands_fx ) < 0 )
776 : {
777 0 : Ep_vari_fx = L_add_sat( Ep_vari_fx, L_abs( L_sub_sat( Ep_tmp_fx[i], Ep_tmp_fx[( i - 1 )] ) ) ); /*Q15 */
778 0 : Ep_avrg_fx = L_add_sat( Ep_avrg_fx, Ep_tmp_fx[i] ); /*Q15 */
779 : }
780 :
781 0 : IF( GE_16( i, highband ) )
782 : {
783 0 : enerH_fx = L_add_sat( enerH_fx, L_shl_sat( Ep_fx[i], 2 ) ); /*Q0 */
784 : }
785 0 : ELSE IF( GE_16( i, lowband ) )
786 : {
787 0 : enerL_fx = L_add_sat( enerL_fx, L_shl_sat( Ep_fx[i], 2 ) ); /*Q0 */
788 : }
789 : }
790 :
791 : /* modify the last p2a_bands subbands band_energies */
792 0 : Copy32( L_band_energy, L_band_energy_tmp, bands_fx ); /*Q_band_energy */
793 0 : L_tmp = L_max( enerH_fx, enerL_fx );
794 0 : tmp = s_max( bw_low, bw_high );
795 0 : i = norm_l( L_tmp );
796 0 : j = norm_s( tmp );
797 0 : L_tmp = Mult_32_16( L_shl( enerH_fx, i ), shl( bw_low, j ) ); /* i + j -15 */
798 0 : L_tmp2 = Mult_32_16( L_shl( enerL_fx, i ), shl( bw_high, j ) ); /*i + j -15 */
799 0 : L_tmp2 = L_sub( L_tmp, L_tmp2 );
800 0 : FOR( i = ( bands_fx - p2a_bands_fx ); i < bands_fx; i++ )
801 : {
802 0 : test();
803 0 : IF( EQ_16( p2a_flags_fx[i], 1 ) || L_tmp2 > 0 )
804 : {
805 0 : tmp = sub( bands_fx, p2a_bands_fx );
806 0 : tmp = sub( tmp, lowband ); /*Q0 */
807 :
808 0 : tmp1 = extract_h( L_shl_sat( Ep_avrg_fx, 1 ) ); /*Q0 */
809 0 : IF( tmp1 != 0 )
810 : {
811 0 : exp = norm_s( tmp1 );
812 0 : tmp1 = shl( tmp1, exp ); /*Q(exp) */
813 0 : tmp1 = div_s( 16384, tmp1 ); /*Q(15+14-exp = 29-exp) */
814 0 : exp = sub( 29, exp );
815 : }
816 : ELSE
817 : {
818 0 : tmp1 = 0x7fff;
819 0 : move16();
820 0 : exp = 0;
821 0 : move16();
822 : }
823 0 : L_tmp = Mult_32_16( Ep_tmp_fx[i], tmp1 ); /*Q(15+exp-15 = exp) */
824 0 : L_tmp = Mult_32_16( L_tmp, tmp ); /*Q(exp+0-15 = exp-15) */
825 0 : L_tmp = Mult_32_16( L_tmp, 16384 ); /*Q(exp-15+13-15 = exp-17) */
826 0 : L_tmp = L_shl( L_tmp, sub( 32, exp ) ); /*Q15 */
827 0 : tmp = extract_l( L_min( L_tmp, 6554 ) ); /*Q15 */
828 0 : L_tmp = Mult_32_16( Ep_vari_fx, tmp1 ); /*Q(15+exp-15 = exp) */
829 0 : L_tmp = Mult_32_16( L_tmp, tmp ); /*Q(exp+15-15 = exp) */
830 0 : L_tmp = L_shl( L_tmp, sub( 15, exp ) ); /*Q15 */
831 0 : tmp = extract_l( L_shr( L_min( L_tmp, 13107 ), 1 ) ); /*Q14 */
832 0 : alpha_fx = add( tmp, 16384 ); /*Q14 */
833 : }
834 : ELSE
835 : {
836 0 : alpha_fx = 16384; /*Q14 */
837 0 : move16();
838 : }
839 :
840 0 : IF( add( sub( i, bands_fx ), p2a_bands_fx ) > 0 )
841 : {
842 0 : tmp = sub( bands_fx, p2a_bands_fx );
843 0 : IF( EQ_16( hHQ_core->last_bitalloc_max_band[sub( i, add( tmp, 1 ) )], 1 ) )
844 : {
845 0 : tmp = sub( tmp, lowband );
846 0 : L_tmp = Mult_32_16( Ep_tmp_fx[i], tmp ); /*Q(15+0-15 = 0) */
847 0 : tmp = extract_h( L_shl_sat( L_tmp, 16 ) ); /*Q0 */
848 0 : IF( tmp != 0 )
849 : {
850 0 : exp = norm_s( tmp );
851 0 : tmp = shl( tmp, exp ); /*Q(exp) */
852 0 : tmp = div_s( 16384, tmp ); /*Q(15+14-exp=29-exp) */
853 0 : exp = sub( 29, exp );
854 : }
855 : ELSE
856 : {
857 0 : tmp = 0x7fff;
858 0 : move16();
859 0 : exp = 0;
860 0 : move16();
861 : }
862 0 : L_tmp = Mult_32_16( Ep_avrg_fx, tmp ); /*Q(15+exp-15 = exp) */
863 0 : L_tmp = L_shl( L_tmp, sub( 14, exp ) ); /*Q14 */
864 0 : tmp = extract_l( L_min( L_max( L_tmp, 16384 ), 20480 ) ); /*Q14 */
865 0 : L_tmp = L_mult( alpha_fx, tmp ); /*Q(14+14+1=29) */
866 0 : alpha_fx = extract_l( L_shr( L_tmp, 15 ) ); /*Q14 */
867 : }
868 : ELSE
869 : {
870 0 : tmp = sub( tmp, lowband );
871 :
872 0 : tmp1 = extract_h( L_shl_sat( Ep_avrg_fx, 1 ) ); /*Q0 */
873 0 : IF( tmp1 != 0 )
874 : {
875 0 : exp = norm_s( tmp1 );
876 0 : tmp1 = shl( tmp1, exp ); /*Q(exp) */
877 0 : tmp1 = div_s( 16384, tmp1 ); /*Q(15+14-exp=29-exp) */
878 0 : exp = sub( 29, exp );
879 : }
880 : ELSE
881 : {
882 0 : tmp1 = 0x7fff;
883 0 : move16();
884 0 : exp = 0;
885 0 : move16();
886 : }
887 0 : L_tmp = Mult_32_16( Ep_tmp_fx[i], tmp1 ); /*Q(15+exp-15 = exp) */
888 0 : L_tmp = Mult_32_16( L_tmp, tmp ); /*Q(exp+0-15 = exp-15) */
889 0 : L_tmp = L_shl( L_tmp, sub( 29, exp ) ); /*Q14 */
890 0 : tmp = extract_l( L_min( L_max( L_tmp, 13926 ), 16384 ) ); /*Q14 */
891 0 : L_tmp = L_mult( alpha_fx, tmp ); /*Q(14+14+1=29) */
892 0 : alpha_fx = extract_l( L_shr( L_tmp, 15 ) ); /*Q14 */
893 : }
894 : }
895 0 : L_tmp = Mult_32_16( L_band_energy_tmp[i], alpha_fx ); /*Q(Q_band_energy+14-15=Q_band_energy-1) */
896 0 : L_band_energy_tmp[i] = L_shl( L_tmp, 1 ); /*Q Q_band_energy */
897 0 : move32();
898 : }
899 0 : lowband = 6;
900 0 : move16();
901 0 : Ep_avrg_fx = L_deposit_l( 0 );
902 0 : Ep_avrgL_fx = L_deposit_l( 0 );
903 0 : Ep_peak_fx = L_deposit_l( 0 );
904 0 : FOR( i = 0; i < bands_fx; i++ )
905 : {
906 0 : IF( GE_16( i, lowband ) )
907 : {
908 0 : Ep_avrg_fx = L_add_sat( Ep_avrg_fx, Ep_tmp_fx[i] ); /*Q15 */
909 : }
910 : ELSE
911 : {
912 0 : Ep_avrgL_fx = L_add_sat( Ep_avrgL_fx, Ep_tmp_fx[i] ); /*Q15 */
913 0 : IF( GT_32( Ep_tmp_fx[i], Ep_peak_fx ) )
914 : {
915 0 : Ep_peak_fx = L_add( Ep_tmp_fx[i], 0 ); /*Q15 */
916 : }
917 : }
918 : }
919 :
920 0 : L_tmp = Mult_32_16( Ep_peak_fx, 24576 ); /*Q(15+12-15 = 12) lowband = 6; */
921 0 : L_tmp2 = Mult_32_16( Ep_peak_fx, 19661 ); /*Q(15+14-15 = 14) */
922 0 : L_tmp3 = Mult_32_16( Ep_avrgL_fx, 24576 ); /*Q(15+12-15 = 12) */
923 :
924 0 : test();
925 0 : test();
926 0 : test();
927 0 : test();
928 0 : test();
929 0 : IF( ( GT_32( L_shr( Ep_avrgL_fx, 1 ), Ep_avrg_fx ) && GT_32( L_tmp, L_shr( Ep_avrgL_fx, 2 ) ) && LT_32( L_shr( Ep_avrgL_fx, 1 ), L_tmp2 ) ) ||
930 : ( GT_32( L_shr( Ep_avrg_fx, 1 ), Ep_avrgL_fx ) && LT_32( L_shr( Ep_avrg_fx, 3 ), L_tmp3 ) && GT_32( L_tmp, L_shr( Ep_avrgL_fx, 2 ) ) ) )
931 : {
932 0 : adjustFlag = 1;
933 0 : move16();
934 0 : FOR( i = 0; i < lowband; i++ )
935 : {
936 0 : tmp = extract_h( L_shl_sat( Ep_avrgL_fx, 1 ) ); /*Q0 */
937 0 : IF( tmp != 0 )
938 : {
939 0 : exp = norm_s( tmp );
940 0 : tmp = shl( tmp, exp ); /*Q(exp) */
941 0 : tmp = div_s( 16384, tmp ); /*Q(15+14-exp=29-exp) */
942 0 : exp = sub( 29, exp );
943 : }
944 : ELSE
945 : {
946 0 : tmp = 0x7fff;
947 0 : move16();
948 0 : exp = 0;
949 0 : move16();
950 : }
951 0 : L_tmp = Mult_32_16( Ep_peak_fx, tmp ); /*Q(15+exp-15 = exp) */
952 0 : L_tmp = Mult_32_16( L_tmp, lowband ); /*Q(exp+0-15 = exp-15) */
953 0 : L_tmp = L_shl( L_tmp, sub( 28, exp ) ); /*Q14 0.5 */
954 0 : tmp = extract_l( L_min( L_tmp, 19661 ) ); /*//Q14 */
955 0 : L_tmp = Mult_32_16( L_band_energy_tmp[i], tmp ); /*Q(Q_band_energy+14-15 = Q_band_energy-1) */
956 0 : L_band_energy_tmp[i] = L_shl( L_tmp, 1 ); /*Q_band_energy */
957 0 : move32();
958 : }
959 : }
960 :
961 0 : hq2_bit_alloc_fx( L_band_energy_tmp, bands_fx, L_Rk, &bit_budget_fx, p2a_flags_fx, bit_alloc_weight_fx, band_width,
962 0 : *num_bits_fx, hqswb_clas_fx, st_fx->bwidth, is_transient_fx );
963 :
964 : /* encode the last p2a_bands-1 subbands bit-allocation index of the previous frame */
965 0 : FOR( i = 0; i < 2; i++ )
966 : {
967 0 : push_indice( st_fx->hBstr, IND_HQ2_LAST_BA_MAX_BAND, hHQ_core->last_bitalloc_max_band[i], 1 );
968 : }
969 : }
970 39 : ELSE IF( EQ_16( st_fx->bwidth, SWB ) && EQ_16( hqswb_clas_fx, HQ_HARMONIC ) && ( EQ_32( L_bwe_br, HQ_16k40 ) || EQ_32( L_bwe_br, HQ_13k20 ) ) )
971 : {
972 : /* bit allocation for harmonic mode */
973 0 : hq2_bit_alloc_har_fx( L_band_energy, bit_budget_fx, bands_fx, L_Rk, p2a_bands_fx, L_bwe_br, p2a_flags_fx, band_width );
974 : }
975 : ELSE
976 : {
977 :
978 : /* estimate number of bits per band */
979 39 : hq2_bit_alloc_fx(
980 : L_band_energy, bands_fx, L_Rk, &bit_budget_fx, p2a_flags_fx, bit_alloc_weight_fx, band_width,
981 39 : *num_bits_fx, hqswb_clas_fx, st_fx->bwidth, is_transient_fx );
982 : }
983 :
984 39 : tcq_core_LR_enc_fx( hBstr, /*st_fx->idchan, */ inp_vector_fx, /*t_audio, */ L_t_audio, /*y2, */ L_y2, bit_budget_fx, bands_fx, band_start, band_end, band_width, /*Rk*/ L_Rk, npulses_fx, k_sort_fx,
985 39 : p2a_flags_fx, p2a_bands_fx, hHQ_core->last_bitalloc_max_band, inner_frame_fx, adjustFlag, is_transient_fx );
986 :
987 39 : test();
988 39 : test();
989 39 : IF( ( EQ_16( inner_frame_fx, L_FRAME8k ) && LE_32( st_fx->core_brate, ACELP_13k20 ) ) || EQ_16( inner_frame_fx, L_FRAME16k ) )
990 : {
991 0 : j = 0;
992 0 : move16();
993 0 : FOR( i = 2; i > 0; i-- )
994 : {
995 0 : IF( npulses_fx[bands_fx - i] > 0 )
996 : {
997 0 : hHQ_core->last_bitalloc_max_band[j] = 1; /* Q0 */
998 0 : move16();
999 : }
1000 : ELSE
1001 : {
1002 0 : hHQ_core->last_bitalloc_max_band[j] = 0; /* Q0 */
1003 0 : move16();
1004 : }
1005 0 : j += 1;
1006 : }
1007 : }
1008 :
1009 : /* Denormalize the coded MDCT spectrum */
1010 39 : mdct_spectrum_denorm_fx( inp_vector_fx, L_y2, band_start, band_end, band_width, L_band_energy, npulses_fx, bands_fx, ld_slope_fx, pd_thresh_fx );
1011 :
1012 : /* Apply fine gain quantization to denormalized coded spectrum */
1013 39 : mdct_spectrum_fine_gain_enc_fx( st_fx, L_t_audio, L_y2, band_start, band_end, k_sort_fx, bands_fx,
1014 : L_qint, Ngq_fx, gqlevs_fx, gqbits_fx );
1015 :
1016 :
1017 : /* Restore the band information */
1018 39 : IF( EQ_16( flag_spt_fx, 1 ) )
1019 : {
1020 38 : spt_shorten_domain_band_restore_fx( bands_fx, band_start, band_end, band_width, org_band_start, org_band_end, org_band_width );
1021 : }
1022 :
1023 : /* Inject noise into components having relatively low pulse energy per band */
1024 39 : ni_seed_fx = add( add( add( npulses_fx[0], npulses_fx[1] ), npulses_fx[2] ), npulses_fx[3] );
1025 :
1026 39 : Copy32( L_y2, L_y2_ni, band_end[bands_fx - 1] + 1 ); /* Q12 */
1027 39 : hq2_noise_inject_fx( L_y2_ni, band_start, band_end, band_width, Ep_fx, L_Rk, npulses_fx, ni_seed_fx, bands_fx, 0, bw_low, bw_high, enerL_fx, enerH_fx,
1028 39 : hHQ_core->last_ni_gain_fx, hHQ_core->last_env_fx, &hHQ_core->last_max_pos_pulse, p2a_flags_fx, p2a_bands_fx,
1029 39 : hqswb_clas_fx, st_fx->bwidth, L_bwe_br );
1030 :
1031 39 : test();
1032 39 : test();
1033 39 : IF( EQ_16( st_fx->bwidth, SWB ) && ( EQ_32( L_bwe_br, HQ_16k40 ) || EQ_32( L_bwe_br, HQ_13k20 ) ) )
1034 : {
1035 39 : test();
1036 39 : IF( EQ_16( hqswb_clas_fx, HQ_NORMAL ) || EQ_16( hqswb_clas_fx, HQ_HARMONIC ) )
1037 : {
1038 38 : preset_hq2_swb_fx( hqswb_clas_fx, band_end, &har_bands_fx, p2a_bands_fx, length_fx, bands_fx, &lowlength_fx, &highlength_fx, L_m );
1039 :
1040 38 : swb_bwe_enc_lr_fx( st_fx, L_y2, SWB_BWE_LR_Qs, L_t_audio, L_m, L_bwe_br,
1041 : bands_fx, band_start, band_end, L_band_energy, SWB_BWE_LR_Qbe, p2a_flags_fx, hqswb_clas_fx, lowlength_fx, highlength_fx,
1042 38 : hHQ_core->prev_frm_index, har_bands_fx, &hHQ_core->prev_frm_hfe2, &hHQ_core->prev_stab_hfe2, band_width, L_y2_ni, &ni_seed_fx );
1043 :
1044 38 : post_hq2_swb_fx( L_m, lowlength_fx, highlength_fx, hqswb_clas_fx, har_bands_fx, bands_fx, p2a_flags_fx, band_start, band_end, L_y2, npulses_fx );
1045 :
1046 38 : IF( EQ_16( hqswb_clas_fx, HQ_NORMAL ) )
1047 : {
1048 38 : spt_swb_peakpos_tmp_save_fx( L_y2, bands_fx, band_start, band_end, prev_SWB_peak_pos_tmp_fx );
1049 190 : FOR( k = 0; k < SPT_SHORTEN_SBNUM; k++ )
1050 : {
1051 152 : test();
1052 152 : IF( p2a_flags_fx[bands_fx - SPT_SHORTEN_SBNUM + k] == 0 || npulses_fx[bands_fx - SPT_SHORTEN_SBNUM + k] == 0 )
1053 : {
1054 147 : prev_SWB_peak_pos_tmp_fx[k] = 0;
1055 147 : move16();
1056 : }
1057 : }
1058 : }
1059 38 : Copy32( L_y2_ni, L_y2, lowlength_fx ); /* Q12 */
1060 : }
1061 : ELSE
1062 : {
1063 1 : Copy32( L_y2_ni, L_y2, add( band_end[bands_fx - 1], 1 ) ); /* HQ_TRANSIENT Q12*/
1064 : }
1065 : }
1066 :
1067 39 : updat_prev_frm_fx( L_y2, L_t_audio, L_bwe_br, length_fx, inner_frame_fx, bands_fx, st_fx->bwidth, is_transient_fx, hqswb_clas_fx, &hHQ_core->prev_hqswb_clas,
1068 39 : hHQ_core->prev_SWB_peak_pos, prev_SWB_peak_pos_tmp_fx, &hHQ_core->prev_frm_hfe2, &hHQ_core->prev_stab_hfe2, 0 );
1069 :
1070 39 : IF( NE_16( st_fx->bwidth, SWB ) )
1071 : {
1072 : /* reset HQ classifier memories */
1073 0 : hHQ_core->mode_count = 0;
1074 0 : move16();
1075 0 : hHQ_core->mode_count1 = 0;
1076 0 : move16();
1077 : }
1078 :
1079 39 : test();
1080 39 : test();
1081 39 : test();
1082 39 : IF( NE_16( hqswb_clas_fx, HQ_HARMONIC ) && ( EQ_32( L_bwe_br, HQ_16k40 ) || EQ_32( L_bwe_br, HQ_13k20 ) ) && EQ_16( st_fx->bwidth, SWB ) )
1083 : {
1084 39 : hHQ_core->prev_frm_index[0] = -1;
1085 39 : move16();
1086 39 : hHQ_core->prev_frm_index[1] = -1;
1087 39 : move16();
1088 : }
1089 :
1090 : /* update number of unused bits */
1091 39 : *num_bits_fx = 0;
1092 39 : move16();
1093 :
1094 39 : hHQ_core->hvq_hangover = 0;
1095 39 : move16();
1096 :
1097 39 : return;
1098 : }
1099 :
1100 0 : void hq_lr_enc_ivas_fx(
1101 : Encoder_State *st, /* i/o: encoder state structure */
1102 : Word32 L_t_audio[], /* i/o: transform-domain coefs. Q12*/
1103 : const Word16 inner_frame, /* i : inner frame length Q0*/
1104 : Word16 *num_bits, /* i/o: number of available bits Q0*/
1105 : const Word16 is_transient /* i : transient flag Q0*/
1106 : )
1107 : {
1108 : Word16 i;
1109 : Word16 bit_budget, pbits;
1110 : Word16 bands, length, ni_seed, gqlevs, gqbits, Ngq, p2a_bands;
1111 : Word16 p2a_flags[BANDS_MAX];
1112 : Word16 band_start[BANDS_MAX], band_end[BANDS_MAX], band_width[BANDS_MAX];
1113 : Word32 L_band_energy[BANDS_MAX];
1114 : Word16 ebits_fx;
1115 :
1116 : Word32 Rk_fx[BANDS_MAX];
1117 : Word16 k1_step_fx, k2_step_fx;
1118 : Word16 k1_fx, k2_fx;
1119 :
1120 : Word32 L_qint; /* Q29 */
1121 : Word16 eref_fx; /* Q10 */
1122 : Word16 bit_alloc_weight_fx; /* Q13 */
1123 : Word16 k_sort[BANDS_MAX];
1124 : Word16 npulses[BANDS_MAX];
1125 : Word32 inp_vector[L_FRAME48k];
1126 :
1127 : Word16 ld_slope_fx /*, Qldslope=15*/;
1128 : Word16 p2a_th_fx /*, Qp2ath=11*/;
1129 : Word16 pd_thresh_fx /*, Qpdth=15*/;
1130 : Word16 ni_coef_fx /*, Qnicoef=14*/;
1131 :
1132 : Word32 L_y2[L_FRAME48k];
1133 : Word32 L_y2_ni[L_FRAME48k];
1134 :
1135 : Word16 hqswb_clas;
1136 : Word16 lowlength;
1137 : Word16 highlength;
1138 : Word16 exp_norm;
1139 : Word32 L_m[L_FRAME32k];
1140 :
1141 : Word16 har_bands;
1142 :
1143 0 : Word16 lowband, highband, bw_low = 0, bw_high = 20;
1144 0 : move16();
1145 0 : move16();
1146 :
1147 : Word32 bwe_br;
1148 : Word16 trans_bit, p2a_flags_tmp[BANDS_MAX];
1149 0 : Word16 adjustFlag = 0;
1150 0 : move16();
1151 : Word16 prev_SWB_peak_pos_tmp[SPT_SHORTEN_SBNUM];
1152 : Word16 k, j;
1153 : Word16 flag_spt;
1154 : Word16 org_band_start[SPT_SHORTEN_SBNUM];
1155 : Word16 org_band_end[SPT_SHORTEN_SBNUM];
1156 : Word16 org_band_width[SPT_SHORTEN_SBNUM];
1157 : Word16 new_band_start[SPT_SHORTEN_SBNUM];
1158 : Word16 new_band_end[SPT_SHORTEN_SBNUM];
1159 : Word16 new_band_width[SPT_SHORTEN_SBNUM];
1160 0 : Word16 bws_cnt = 0;
1161 0 : move16();
1162 : Word32 L_tmp, L_tmp2, L_tmp3;
1163 : Word16 exp, tmp, exp2, tmp1, tmp2, tmp3, alpha_fx, frac1;
1164 : Word32 enerH_fx;
1165 : Word32 enerL_fx;
1166 : Word32 Ep_fx[BANDS_MAX];
1167 : Word32 Ep_avrg_fx, Ep_vari_fx;
1168 : Word32 Ep_avrgL_fx;
1169 : Word32 Ep_peak_fx;
1170 : Word32 Ep_tmp_fx[BANDS_MAX];
1171 : Word16 gama_fx; /*Q15 0.85f; */
1172 : Word16 beta_fx; /*Q14 1.05f; */
1173 : Word32 L_band_energy_tmp[BANDS_MAX];
1174 : UWord16 lo;
1175 : Word16 Q_band_energy;
1176 0 : BSTR_ENC_HANDLE hBstr = st->hBstr;
1177 0 : HQ_ENC_HANDLE hHQ_core = st->hHQ_core;
1178 :
1179 0 : set32_fx( L_y2, 0x0L, L_FRAME48k );
1180 0 : set32_fx( inp_vector, 0, inner_frame );
1181 0 : flag_spt = 0;
1182 0 : move16();
1183 0 : set16_fx( prev_SWB_peak_pos_tmp, 0, SPT_SHORTEN_SBNUM );
1184 0 : adjustFlag = 0;
1185 0 : move16();
1186 0 : bw_low = 0;
1187 0 : move16();
1188 0 : bw_high = 20;
1189 0 : move16();
1190 0 : enerL_fx = L_deposit_l( 0 );
1191 0 : enerH_fx = L_deposit_l( 0 );
1192 :
1193 :
1194 0 : bwe_br = st->core_brate;
1195 0 : hqswb_clas = HQ_NORMAL;
1196 0 : move16();
1197 :
1198 0 : test();
1199 0 : test();
1200 0 : IF( EQ_16( st->bwidth, SWB ) && ( EQ_32( bwe_br, HQ_16k40 ) || EQ_32( bwe_br, HQ_13k20 ) ) )
1201 : {
1202 0 : IF( EQ_16( is_transient, 1 ) )
1203 : {
1204 0 : hqswb_clas = HQ_TRANSIENT; /* Q0 */
1205 0 : move16();
1206 : }
1207 : ELSE
1208 : {
1209 0 : hqswb_clas = peak_avrg_ratio_fx( st->total_brate, L_t_audio, NUMC_N, &hHQ_core->mode_count, &hHQ_core->mode_count1, SWB_BWE_LR_Qs ); /* Q0 */
1210 : }
1211 :
1212 : /* write the classification information into the bitstream */
1213 0 : push_indice( hBstr, IND_HQ2_SWB_CLAS, hqswb_clas, 2 );
1214 0 : ( *num_bits ) = sub( *num_bits, 2 );
1215 0 : move16();
1216 0 : IF( EQ_16( hqswb_clas, HQ_NORMAL ) )
1217 : {
1218 0 : flag_spt = 1;
1219 0 : move16();
1220 : }
1221 : }
1222 : ELSE
1223 : {
1224 : /* write the transient bit into the bitstream */
1225 0 : push_indice( st->hBstr, IND_HQ2_SWB_CLAS, is_transient, 1 );
1226 :
1227 : /* subtract one bit for the transient flag */
1228 0 : ( *num_bits ) = sub( *num_bits, 1 );
1229 0 : move16();
1230 : }
1231 :
1232 : /* Configure encoder for different bandwidths, bitrates, etc. */
1233 :
1234 0 : hq2_core_configure_fx( inner_frame, *num_bits, is_transient, &bands, &length, band_width, band_start, band_end,
1235 : &L_qint, &eref_fx, &bit_alloc_weight_fx, &gqlevs, &Ngq, &p2a_bands, &p2a_th_fx, &pd_thresh_fx, &ld_slope_fx, &ni_coef_fx, bwe_br );
1236 :
1237 :
1238 0 : highlength = band_end[( bands - 1 )]; /* Q0 */
1239 0 : move16();
1240 0 : har_bands = bands; /* Q0 */
1241 0 : move16();
1242 :
1243 :
1244 0 : test();
1245 0 : test();
1246 0 : test();
1247 0 : IF( EQ_16( st->bwidth, SWB ) && is_transient == 0 && ( EQ_32( bwe_br, HQ_16k40 ) || EQ_32( bwe_br, HQ_13k20 ) ) )
1248 : {
1249 : /* reserve bits for HQ_NORMAL2 and HQ_HARMONIC modes */
1250 0 : test();
1251 0 : IF( EQ_16( hqswb_clas, HQ_NORMAL ) || EQ_16( hqswb_clas, HQ_HARMONIC ) )
1252 : {
1253 0 : ( *num_bits ) = sub( *num_bits, get_usebit_npswb_fx( hqswb_clas ) );
1254 0 : move16();
1255 : }
1256 : }
1257 :
1258 0 : test();
1259 0 : test();
1260 0 : IF( ( EQ_32( bwe_br, HQ_16k40 ) || EQ_32( bwe_br, HQ_13k20 ) ) && EQ_16( st->bwidth, SWB ) )
1261 : {
1262 0 : IF( NE_16( hHQ_core->prev_hqswb_clas, HQ_NORMAL ) )
1263 : {
1264 0 : j = 0;
1265 0 : move16();
1266 0 : FOR( k = ( bands - SPT_SHORTEN_SBNUM ); k < bands; k++ )
1267 : {
1268 0 : hHQ_core->prev_SWB_peak_pos[j] = 0;
1269 0 : move16();
1270 0 : j += 1;
1271 : }
1272 : }
1273 : }
1274 :
1275 0 : test();
1276 0 : IF( GT_16( inner_frame, length ) && is_transient )
1277 : {
1278 : /* If so, collapse transient frame (4 short transforms) to remove uncoded coefficients */
1279 :
1280 0 : k1_step_fx = shr( length, 2 ); /* k1 = length/NUM_TIME_SWITCHING_BLOCKS Q0*/
1281 0 : k2_step_fx = shr( inner_frame, 2 ); /* k2 = inner_frame/NUM_TIME_SWITCHING_BLOCKS Q0*/
1282 0 : k1_fx = k1_step_fx; /* Q0 */
1283 0 : k2_fx = k2_step_fx; /* Q0 */
1284 0 : move16();
1285 0 : move16();
1286 0 : FOR( i = 1; i < NUM_TIME_SWITCHING_BLOCKS; i++ )
1287 : {
1288 : /*k1 = i*length/NUM_TIME_SWITCHING_BLOCKS; */
1289 : /*k2 = i*inner_frame/NUM_TIME_SWITCHING_BLOCKS; */
1290 :
1291 0 : Copy32( &L_t_audio[k2_fx], &L_t_audio[k1_fx], k1_step_fx ); /* Q12 */
1292 :
1293 0 : k1_fx = add( k1_fx, k1_step_fx );
1294 0 : k2_fx = add( k2_fx, k2_step_fx );
1295 : }
1296 : }
1297 :
1298 : /* Spectral energy calculation/quantization */
1299 :
1300 0 : ebits_fx = band_energy_quant_ivas_fx( hBstr, L_t_audio, band_start, band_end, L_band_energy, bands,
1301 : L_qint, eref_fx, is_transient ); /* Q0 */
1302 :
1303 : /* First pass bit budget for TCQ of spectral band information */
1304 0 : exp_norm = norm_s( gqlevs ); /* gqbits_fx = (short int) log2_f ((float) gqlevs_fx); */
1305 0 : gqbits = sub( 14, exp_norm );
1306 :
1307 0 : bit_budget = sub( sub( *num_bits, ebits_fx ), round_fx( L_shl( L_mult( Ngq, gqbits ), 15 ) ) ); /* (*num_bits) - (short) ceil (ebits) - Ngq * gqbits; Q0*/
1308 :
1309 :
1310 0 : pbits = 0;
1311 0 : move16();
1312 :
1313 0 : test();
1314 0 : test();
1315 0 : IF( EQ_16( st->bwidth, SWB ) && ( EQ_32( bwe_br, HQ_16k40 ) || EQ_32( bwe_br, HQ_13k20 ) ) )
1316 : {
1317 0 : IF( EQ_16( hqswb_clas, HQ_HARMONIC ) )
1318 : {
1319 0 : set16_fx( p2a_flags, 1, har_bands );
1320 : }
1321 : ELSE
1322 : {
1323 : /* High band tonality detector based on per band peak-to-average ratio */
1324 0 : pbits = p2a_threshold_quant_ivas_fx( hBstr, L_t_audio, band_start, band_end, band_width, bands, p2a_bands, p2a_th_fx, p2a_flags ); /* Q0 */
1325 0 : bit_budget = sub( bit_budget, pbits );
1326 :
1327 0 : IF( EQ_16( hqswb_clas, HQ_NORMAL ) )
1328 : {
1329 0 : return_bits_normal2_fx( &bit_budget, p2a_flags, bands, bits_lagIndices_modeNormal );
1330 : }
1331 : }
1332 : }
1333 : ELSE
1334 : {
1335 : /* High band tonality detector based on per band peak-to-average ratio */
1336 0 : pbits = p2a_threshold_quant_ivas_fx( hBstr, L_t_audio, band_start, band_end, band_width, bands, p2a_bands, p2a_th_fx, p2a_flags ); /* Q0 */
1337 0 : bit_budget = sub( bit_budget, pbits );
1338 : }
1339 :
1340 0 : IF( EQ_16( flag_spt, 1 ) )
1341 : {
1342 : /* initialize the desired parameters for SPT */
1343 0 : spt_shorten_domain_band_save_fx( bands, band_start, band_end, band_width, org_band_start, org_band_end, org_band_width );
1344 0 : spt_shorten_domain_pre_fx( band_start, band_end, hHQ_core->prev_SWB_peak_pos, bands, bwe_br, new_band_start, new_band_end, new_band_width );
1345 0 : spt_shorten_domain_set_ivas_fx( st, L_t_audio, p2a_flags, new_band_start, new_band_end, new_band_width, bands, band_start, band_end, band_width, &bit_budget );
1346 : }
1347 :
1348 : #define WMC_TOOL_SKIP
1349 : /* Estimate number of bits per band */
1350 0 : Q_band_energy = SWB_BWE_LR_Qbe;
1351 0 : move16();
1352 0 : FOR( i = 0; i < bands; i++ )
1353 : {
1354 0 : L_tmp = L_shl( L_band_energy[i], sub( 16, Q_band_energy ) ); /*Q16 */
1355 :
1356 0 : frac1 = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */
1357 0 : L_tmp = Pow2( 30, frac1 );
1358 0 : exp = sub( exp, 30 );
1359 0 : Ep_fx[i] = L_shl( L_tmp, sub( exp, 6 ) ); /* Q -6 */
1360 0 : move32();
1361 : }
1362 :
1363 0 : FOR( i = 0; i < bands; i++ )
1364 : {
1365 0 : L_tmp2 = Ep_fx[i]; /* Q -6 */
1366 0 : L_tmp = L_max( 1, L_tmp2 );
1367 0 : exp = norm_l( L_tmp );
1368 0 : tmp = extract_h( L_shl( L_tmp, exp ) ); /* Q -6 + exp - 16 */
1369 :
1370 0 : L_tmp3 = L_deposit_l( band_width[i] ); /* Q0 */
1371 0 : exp2 = norm_l( L_tmp3 );
1372 0 : tmp2 = extract_h( L_shl( L_tmp3, exp2 ) ); /* exp2 - 16 */
1373 :
1374 0 : exp2 = sub( exp, exp2 ); /* Denormalize and substract */
1375 :
1376 0 : tmp3 = sub( tmp2, tmp );
1377 0 : IF( tmp3 > 0 )
1378 : {
1379 0 : tmp2 = shr( tmp2, 1 );
1380 : }
1381 0 : IF( tmp3 > 0 )
1382 : {
1383 0 : exp2 = add( exp2, 1 );
1384 : }
1385 0 : tmp = div_s( tmp2, tmp ); /* Q15 */
1386 0 : L_tmp = L_deposit_h( tmp ); /* Q31 */
1387 0 : L_tmp = Isqrt_lc1( L_tmp, &exp2 ); /*Q(31-exp2) */
1388 0 : move32();
1389 0 : Ep_tmp_fx[i] = L_shr( L_tmp, sub( 15, exp2 ) ); /*Q16 */
1390 0 : move32();
1391 : }
1392 : #undef WMC_TOOL_SKIP
1393 :
1394 0 : test();
1395 0 : test();
1396 0 : test();
1397 0 : test();
1398 0 : test();
1399 0 : test();
1400 0 : IF( is_transient == 0 && EQ_16( inner_frame, L_FRAME8k ) && LE_32( st->core_brate, ACELP_13k20 ) )
1401 : {
1402 : #define WMC_TOOL_SKIP
1403 0 : lowband = 6;
1404 0 : move16();
1405 0 : trans_bit = 2;
1406 0 : move16();
1407 0 : bit_budget = sub( bit_budget, trans_bit );
1408 0 : gama_fx = 27852; /*Q15 0.85f */
1409 0 : beta_fx = 17203; /*Q14 1.05f */
1410 0 : move16();
1411 0 : move16();
1412 0 : set_s( &p2a_flags_tmp[bands - trans_bit], 0, 2 );
1413 :
1414 0 : IF( EQ_32( st->core_brate, ACELP_13k20 ) )
1415 : {
1416 0 : beta_fx = 13107; /* Q14 1.25f */
1417 0 : move16();
1418 0 : gama_fx = 31130; /* 0.95f Q15 */
1419 0 : move16();
1420 0 : mvs2s( &p2a_flags[( bands - trans_bit )], &p2a_flags_tmp[( bands - trans_bit )], trans_bit );
1421 : }
1422 :
1423 : /* calculate the the low band/high band energy and the variance/avrage of the envelopes */
1424 0 : Ep_vari_fx = 0;
1425 0 : move32();
1426 0 : Ep_avrg_fx = 0;
1427 0 : move32();
1428 0 : Ep_avrgL_fx = 0;
1429 0 : move32();
1430 0 : Ep_peak_fx = 0;
1431 0 : move32();
1432 0 : FOR( i = 0; i < bands; i++ )
1433 : {
1434 0 : IF( sub( i, lowband ) >= 0 )
1435 : {
1436 0 : Ep_vari_fx = L_add( Ep_vari_fx, L_abs( L_sub( Ep_tmp_fx[i], Ep_tmp_fx[( i - 1 )] ) ) ); /*Q15 */
1437 0 : Ep_avrg_fx = L_add( Ep_avrg_fx, Ep_tmp_fx[i] ); /*Q15 */
1438 : }
1439 : ELSE
1440 : {
1441 0 : Ep_avrgL_fx = L_add_sat( Ep_avrgL_fx, Ep_tmp_fx[i] ); /*Q15 */
1442 0 : IF( L_sub( Ep_tmp_fx[i], Ep_peak_fx ) > 0 )
1443 : {
1444 0 : Ep_peak_fx = Ep_tmp_fx[i]; /*Q15 */
1445 0 : move32();
1446 : }
1447 : }
1448 : }
1449 : /* modify the last p2a_bands subbands band_energies */
1450 0 : k = bands;
1451 0 : move16();
1452 0 : mvl2l( L_band_energy, L_band_energy_tmp, k ); /*Q_band_energy */
1453 0 : Mpy_32_16_ss( Ep_peak_fx, 24576, &L_tmp, &lo );
1454 0 : Mpy_32_16_ss( Ep_peak_fx, shl( sub( bands, lowband ), 9 ), &L_tmp2, &lo );
1455 0 : Mpy_32_16_ss( Ep_avrg_fx, 1126, &L_tmp3, &lo );
1456 :
1457 0 : test();
1458 0 : test();
1459 0 : test();
1460 0 : IF( ( ( L_sub( L_tmp, L_shr( Ep_avrgL_fx, 1 ) ) < 0 && EQ_32( st->core_brate, ACELP_13k20 ) ) || LT_32( st->core_brate, ACELP_13k20 ) ) &&
1461 : L_sub( L_tmp2, L_tmp3 ) < 0 && L_sub( L_tmp2, L_shr( Ep_avrg_fx, 7 ) ) > 0 )
1462 : {
1463 0 : FOR( i = lowband; i < bands; i++ )
1464 : {
1465 0 : Mpy_32_16_ss( Ep_avrg_fx, 24576, &L_tmp, &lo );
1466 0 : IF( L_sub( L_shr( Ep_tmp_fx[i], 1 ), L_tmp ) < 0 )
1467 : {
1468 0 : Mpy_32_16_ss( Ep_peak_fx, sub( bands, lowband ), &L_tmp, &lo );
1469 0 : tmp = extract_h( L_shl( L_tmp, 14 ) ); /*Q-4 */
1470 0 : IF( tmp != 0 )
1471 : {
1472 0 : exp = norm_s( tmp );
1473 0 : tmp = shl( tmp, exp ); /*Q(exp) */
1474 0 : tmp = div_s( 16384, tmp ); /*Q(15+14-exp=29-exp) */
1475 0 : exp = sub( 29, exp );
1476 : }
1477 : ELSE
1478 : {
1479 : /*when the divisor is zero, happens rarely*/
1480 0 : tmp = 0x7fff;
1481 0 : move16();
1482 0 : exp = 0;
1483 0 : move16();
1484 : }
1485 0 : Mpy_32_16_ss( Ep_avrg_fx, tmp, &L_tmp, &lo );
1486 0 : L_tmp = L_shl( L_tmp, sub( 13, exp ) ); /*Q(13+exp-15 +13-exp +4 = 15) */
1487 0 : L_tmp2 = L_add( L_tmp, 13107 ); /*15 */
1488 0 : tmp2 = extract_l( L_min( L_max( L_tmp2, 16384 ), gama_fx ) ); /*15 = 15 */
1489 0 : Mpy_32_16_ss( L_band_energy_tmp[i], tmp2, &L_band_energy_tmp[i], &lo );
1490 : }
1491 : }
1492 : }
1493 : ELSE
1494 : {
1495 0 : j = 0;
1496 0 : move16();
1497 0 : FOR( i = ( bands - trans_bit ); i < bands; i++ )
1498 : {
1499 0 : alpha_fx = 16384; /*Q14 */
1500 0 : move16();
1501 0 : IF( sub( p2a_flags_tmp[i], 1 ) == 0 )
1502 : {
1503 0 : Mpy_32_16_ss( Ep_tmp_fx[i], sub( bands, lowband ), &L_tmp, &lo );
1504 0 : tmp = extract_h( L_shl( L_tmp, 14 ) ); /*Q-4 */
1505 0 : IF( tmp != 0 )
1506 : {
1507 0 : exp = norm_s( tmp );
1508 0 : tmp = shl( tmp, exp ); /*Q(exp) */
1509 0 : tmp = div_s( 16384, tmp ); /*Q(15+14-exp=29-exp) */
1510 0 : exp = sub( 29, exp );
1511 : }
1512 : ELSE
1513 : {
1514 : /*when the divisor is zero, happens rarely*/
1515 0 : tmp = 0x7fff;
1516 0 : move16();
1517 0 : exp = 0;
1518 0 : move16();
1519 : }
1520 0 : Mpy_32_16_ss( Ep_vari_fx, 3277, &L_tmp, &lo );
1521 0 : Mpy_32_16_ss( L_tmp, tmp, &L_tmp, &lo );
1522 0 : L_tmp = L_shl( L_tmp, sub( 12, exp ) ); /*Q(13+exp-15 +12-exp +4 = 14) */
1523 :
1524 0 : tmp2 = extract_h( Ep_avrg_fx ); /*Q13-16=-3 */
1525 0 : IF( tmp2 != 0 )
1526 : {
1527 0 : exp = norm_s( tmp2 );
1528 0 : tmp2 = shl( tmp2, exp ); /*Q(exp) */
1529 0 : tmp2 = div_s( 16384, tmp2 ); /*Q(15+14-exp=29-exp) */
1530 0 : exp = sub( 29, exp );
1531 : }
1532 : ELSE
1533 : {
1534 0 : tmp2 = 0x7fff;
1535 0 : move16();
1536 0 : exp = 0;
1537 0 : move16();
1538 : }
1539 0 : Mpy_32_16_ss( Ep_vari_fx, 6554, &L_tmp2, &lo );
1540 0 : Mpy_32_16_ss( L_tmp2, tmp2, &L_tmp2, &lo );
1541 0 : L_tmp2 = L_shl( L_tmp2, sub( 13, exp ) ); /*Q(13+exp-15 +13-exp +3 = 14) */
1542 0 : L_tmp = L_min( L_tmp, L_tmp2 ); /*14 */
1543 0 : tmp = extract_l( L_min( L_tmp, 13107 ) ); /*14 */
1544 0 : alpha_fx = add( 16384, tmp ); /* Q14 */
1545 : }
1546 0 : IF( sub( hHQ_core->last_bitalloc_max_band[j++], 1 ) == 0 )
1547 : {
1548 0 : Mpy_32_16_ss( Ep_tmp_fx[i], sub( bands, lowband ), &L_tmp, &lo );
1549 0 : tmp = extract_h( L_shl( L_tmp, 14 ) ); /*Q-2 */
1550 0 : IF( tmp != 0 )
1551 : {
1552 0 : exp = norm_s( tmp );
1553 0 : tmp = shl( tmp, exp ); /*Q(exp) */
1554 0 : tmp = div_s( 16384, tmp ); /*Q(15+14-exp=29-exp) */
1555 0 : exp = sub( 29, exp );
1556 : }
1557 : ELSE
1558 : {
1559 0 : tmp = 0x7fff;
1560 0 : move16();
1561 0 : exp = 0;
1562 0 : move16();
1563 : }
1564 0 : Mpy_32_16_ss( Ep_avrg_fx, tmp, &L_tmp, &lo );
1565 0 : L_tmp = L_shl_sat( L_tmp, sub( 14, exp ) ); /*Q(13+exp-15 +14-exp+2 = 14) */
1566 0 : L_tmp = L_max( L_tmp, 16384 ); /*14 */
1567 0 : tmp = extract_l( L_min( L_tmp, beta_fx ) ); /*14 */
1568 0 : alpha_fx = shl( mult( alpha_fx, tmp ), 1 ); /*14+14-15 +1=14 */
1569 : }
1570 : ELSE
1571 : {
1572 0 : tmp2 = extract_h( Ep_avrg_fx ); /*13 -16 =-3 */
1573 0 : IF( tmp2 != 0 )
1574 : {
1575 0 : exp = norm_s( tmp2 );
1576 0 : tmp2 = shl( tmp2, exp ); /*Q(exp) */
1577 0 : tmp2 = div_s( 16384, tmp2 ); /*Q(15+14-exp=29-exp) */
1578 0 : exp = sub( 29, exp );
1579 : }
1580 : ELSE
1581 : {
1582 : /*when the divisor is zero, happens rarely*/
1583 0 : tmp2 = 0x7fff;
1584 0 : move16();
1585 0 : exp = 0;
1586 0 : move16();
1587 : }
1588 0 : Mpy_32_16_ss( Ep_tmp_fx[i], tmp2, &L_tmp, &lo );
1589 0 : L_tmp = L_shl( L_tmp, sub( 19, exp ) ); /*Q(13+exp-15 +19-exp +3 = 20) */
1590 0 : Mpy_32_16_ss( L_tmp, shl( sub( bands, lowband ), 9 ), &L_tmp, &lo );
1591 0 : L_tmp = L_max( L_tmp, 13926 ); /*14 */
1592 0 : tmp2 = extract_l( L_min( L_tmp, 16384 ) ); /*14 */
1593 0 : alpha_fx = shl( mult( alpha_fx, tmp2 ), 1 ); /*14+14-15+1 =14 */
1594 : }
1595 0 : Mpy_32_16_ss( L_band_energy_tmp[i], alpha_fx, &L_tmp, &lo );
1596 0 : L_band_energy_tmp[i] = L_shl( L_tmp, 1 ); /*Q(Q_band_energy+14-15 +1= Q_band_energy) */
1597 0 : move32();
1598 : }
1599 : }
1600 0 : lowband = 3;
1601 0 : move16();
1602 0 : Ep_avrg_fx = 0;
1603 0 : move32();
1604 0 : Ep_avrgL_fx = 0;
1605 0 : move32();
1606 0 : Ep_peak_fx = 0;
1607 0 : move32();
1608 0 : FOR( i = 0; i < bands; i++ )
1609 : {
1610 0 : IF( sub( i, lowband ) >= 0 )
1611 : {
1612 0 : Ep_avrg_fx = L_add_sat( Ep_avrg_fx, Ep_tmp_fx[i] ); /*Q15 */
1613 : }
1614 : ELSE
1615 : {
1616 0 : Ep_avrgL_fx = L_add( Ep_avrgL_fx, L_shr( Ep_tmp_fx[i], 1 ) ); /*Q12 */
1617 0 : IF( L_sub( Ep_tmp_fx[i], Ep_peak_fx ) > 0 )
1618 : {
1619 0 : Ep_peak_fx = Ep_tmp_fx[i]; /*Q13 */
1620 0 : move32();
1621 : }
1622 : }
1623 : }
1624 0 : Mpy_32_16_ss( Ep_peak_fx, 28262, &L_tmp, &lo );
1625 0 : Mpy_32_16_ss( Ep_avrgL_fx, 24576, &L_tmp2, &lo );
1626 :
1627 0 : test();
1628 0 : test();
1629 0 : IF( L_sub( L_shr( Ep_avrg_fx, 2 ), L_tmp2 ) > 0 && L_sub( L_shr( Ep_avrg_fx, 4 ), L_tmp2 ) < 0 && L_sub( L_tmp, Ep_avrgL_fx ) > 0 )
1630 : {
1631 0 : adjustFlag = 1;
1632 0 : move16();
1633 0 : FOR( i = 0; i < lowband; i++ )
1634 : {
1635 0 : tmp = extract_h( Ep_avrgL_fx ); /*Q-4 */
1636 0 : IF( tmp != 0 )
1637 : {
1638 0 : exp = norm_s( tmp );
1639 0 : tmp = shl( tmp, exp ); /*Q(exp) */
1640 0 : tmp = div_s( 16384, tmp ); /*Q(15+14-exp=29-exp) */
1641 0 : exp = sub( 29, exp );
1642 : }
1643 : ELSE
1644 : {
1645 : /*when the divisor is zero, happens rarely*/
1646 0 : tmp = 0x7fff;
1647 0 : move16();
1648 0 : exp = 0;
1649 0 : move16();
1650 : }
1651 0 : Mpy_32_16_ss( Ep_peak_fx, tmp, &L_tmp, &lo );
1652 0 : Mpy_32_16_ss( L_tmp, lowband, &L_tmp, &lo );
1653 0 : Mpy_32_16_ss( L_tmp, 18842, &L_tmp, &lo );
1654 0 : L_tmp = L_shl_sat( L_tmp, sub( 27, exp ) ); /*Q14 0.5 */
1655 0 : tmp2 = extract_l( L_min( L_tmp, 19661 ) ); /*14 */
1656 0 : Mpy_32_16_ss( L_band_energy_tmp[i], tmp2, &L_tmp, &lo );
1657 0 : L_band_energy_tmp[i] = L_shl( L_tmp, 1 ); /*Q_band_energy */
1658 0 : move32();
1659 : }
1660 : }
1661 : #undef WMC_TOOL_SKIP
1662 :
1663 :
1664 0 : hq2_bit_alloc_fx( L_band_energy_tmp, bands, Rk_fx, &bit_budget, p2a_flags, bit_alloc_weight_fx, band_width, *num_bits, hqswb_clas, st->bwidth, is_transient );
1665 :
1666 : /* encode the last p2a_bands-1 subbands bit-allocation index of the previous frame */
1667 0 : FOR( i = 0; i < 2; i++ )
1668 : {
1669 0 : push_indice( hBstr, IND_HQ2_LAST_BA_MAX_BAND, hHQ_core->last_bitalloc_max_band[i], 1 );
1670 : }
1671 : }
1672 0 : ELSE IF( is_transient == 0 && EQ_16( inner_frame, L_FRAME16k ) )
1673 : {
1674 : #define WMC_TOOL_SKIP
1675 0 : bit_budget = sub( bit_budget, 2 ); /* bits in high bands to indicate the last 2 subbands is allocated bits or not */
1676 0 : FOR( i = 0; i < bands; i++ )
1677 : {
1678 0 : Ep_tmp_fx[i] = L_shl_sat( Ep_tmp_fx[i], 2 ); /* Q15 */
1679 0 : move32();
1680 : }
1681 0 : IF( EQ_32( st->core_brate, ACELP_13k20 ) )
1682 : {
1683 0 : lowband = 8;
1684 0 : move16();
1685 0 : highband = 15;
1686 0 : move16();
1687 0 : bw_low = sub( band_start[highband], band_start[lowband] ); /* Q0 */
1688 0 : bw_high = sub( add( band_end[( bands - 1 )], 1 ), band_start[highband] ); /* Q0 */
1689 : }
1690 : ELSE
1691 : {
1692 0 : lowband = 8;
1693 0 : move16();
1694 0 : highband = 16;
1695 0 : move16();
1696 0 : bw_low = sub( band_start[highband], band_start[lowband] ); /* Q0 */
1697 0 : bw_high = sub( add( band_end[( bands - 1 )], 1 ), band_start[highband] ); /* Q0 */
1698 : }
1699 : /* calculate the the low band/high band energy and the variance/avrage of the envelopes */
1700 0 : enerL_fx = 0;
1701 0 : move32();
1702 0 : enerH_fx = 0;
1703 0 : move32();
1704 0 : Ep_vari_fx = 0;
1705 0 : move32();
1706 0 : Ep_avrg_fx = 0;
1707 0 : move32();
1708 0 : FOR( i = 0; i < bands; i++ )
1709 : {
1710 0 : test();
1711 0 : IF( sub( i, lowband ) >= 0 && add( sub( i, bands ), p2a_bands ) < 0 )
1712 : {
1713 0 : Ep_vari_fx = L_add( Ep_vari_fx, L_abs( L_sub( Ep_tmp_fx[i], Ep_tmp_fx[sub( i, 1 )] ) ) ); /*Q15 */
1714 0 : Ep_avrg_fx = L_add_sat( Ep_avrg_fx, Ep_tmp_fx[i] ); /*Q15 */
1715 : }
1716 :
1717 0 : IF( sub( i, highband ) >= 0 )
1718 : {
1719 0 : enerH_fx = L_add( enerH_fx, L_shl( Ep_fx[i], 2 ) ); /*Q0 */
1720 : }
1721 0 : ELSE IF( sub( i, lowband ) >= 0 )
1722 : {
1723 0 : enerL_fx = L_add( enerL_fx, L_shl( Ep_fx[i], 2 ) ); /*Q0 */
1724 : }
1725 : }
1726 : /* modify the last p2a_bands subbands band_energies */
1727 0 : k = bands;
1728 0 : move16();
1729 0 : mvl2l( L_band_energy, L_band_energy_tmp, k ); /*Q_band_energy */
1730 :
1731 0 : L_tmp = L_max( enerH_fx, enerL_fx );
1732 0 : tmp = s_max( bw_low, bw_high );
1733 0 : i = norm_l( L_tmp );
1734 0 : j = norm_s( tmp );
1735 0 : Mpy_32_16_ss( L_shl( enerH_fx, i ), shl( bw_low, j ), &L_tmp, &lo );
1736 0 : Mpy_32_16_ss( L_shl( enerL_fx, i ), shl( bw_high, j ), &L_tmp2, &lo );
1737 0 : L_tmp2 = L_sub( L_tmp, L_tmp2 );
1738 :
1739 0 : FOR( i = ( bands - p2a_bands ); i < bands; i++ )
1740 : {
1741 0 : test();
1742 0 : IF( sub( p2a_flags[i], 1 ) == 0 || L_tmp2 > 0 )
1743 : {
1744 0 : tmp = sub( bands, p2a_bands );
1745 0 : tmp = sub( tmp, lowband ); /*Q0 */
1746 :
1747 0 : tmp1 = extract_h( L_shl_sat( Ep_avrg_fx, 1 ) ); /*Q0 */
1748 0 : IF( tmp1 != 0 )
1749 : {
1750 0 : exp = norm_s( tmp1 );
1751 0 : tmp1 = shl( tmp1, exp ); /*Q(exp) */
1752 0 : tmp1 = div_s( 16384, tmp1 ); /*Q(15+14-exp = 29-exp) */
1753 0 : exp = sub( 29, exp );
1754 : }
1755 : ELSE
1756 : {
1757 0 : tmp1 = 0x7fff;
1758 0 : move16();
1759 0 : exp = 0;
1760 0 : move16();
1761 : }
1762 0 : Mpy_32_16_ss( Ep_tmp_fx[i], tmp1, &L_tmp, &lo );
1763 0 : Mpy_32_16_ss( L_tmp, tmp, &L_tmp, &lo );
1764 0 : Mpy_32_16_ss( L_tmp, 16384, &L_tmp, &lo );
1765 0 : L_tmp = L_shl( L_tmp, sub( 32, exp ) ); /*Q15 */
1766 0 : tmp = extract_l( L_min( L_tmp, 6554 ) ); /*Q15 */
1767 0 : Mpy_32_16_ss( Ep_vari_fx, tmp1, &L_tmp, &lo );
1768 0 : Mpy_32_16_ss( L_tmp, tmp, &L_tmp, &lo );
1769 0 : L_tmp = L_shl( L_tmp, sub( 15, exp ) ); /*Q15 */
1770 0 : tmp = extract_l( L_shr( L_min( L_tmp, 13107 ), 1 ) ); /*Q14 */
1771 0 : alpha_fx = add( tmp, 16384 ); /*Q14 */
1772 : }
1773 : ELSE
1774 : {
1775 0 : alpha_fx = 16384; /* Q14 */
1776 0 : move16();
1777 : }
1778 :
1779 0 : IF( add( sub( i, bands ), p2a_bands ) > 0 )
1780 : {
1781 0 : tmp = sub( bands, p2a_bands );
1782 0 : IF( sub( hHQ_core->last_bitalloc_max_band[( i - ( tmp + 1 ) )], 1 ) == 0 )
1783 : {
1784 0 : tmp = sub( tmp, lowband );
1785 0 : Mpy_32_16_ss( Ep_tmp_fx[i], tmp, &L_tmp, &lo );
1786 0 : tmp = extract_h( L_shl_sat( L_tmp, 16 ) ); /*Q0 */
1787 0 : IF( tmp != 0 )
1788 : {
1789 0 : exp = norm_s( tmp );
1790 0 : tmp = shl( tmp, exp ); /*Q(exp) */
1791 0 : tmp = div_s( 16384, tmp ); /*Q(15+14-exp=29-exp) */
1792 0 : exp = sub( 29, exp );
1793 : }
1794 : ELSE
1795 : {
1796 0 : tmp = 0x7fff;
1797 0 : move16();
1798 0 : exp = 0;
1799 0 : move16();
1800 : }
1801 0 : Mpy_32_16_ss( Ep_avrg_fx, tmp, &L_tmp, &lo );
1802 0 : L_tmp = L_shl( L_tmp, sub( 14, exp ) ); /*Q14 */
1803 0 : tmp = extract_l( L_min( L_max( L_tmp, 16384 ), 20480 ) ); /*Q14 */
1804 0 : L_tmp = L_mult( alpha_fx, tmp ); /*Q(14+14+1=29) */
1805 0 : alpha_fx = extract_l( L_shr( L_tmp, 15 ) ); /*Q14*/
1806 : }
1807 : ELSE
1808 : {
1809 0 : tmp = sub( tmp, lowband );
1810 0 : tmp1 = extract_h( L_shl_sat( Ep_avrg_fx, 1 ) ); /*Q0 */
1811 0 : IF( tmp1 != 0 )
1812 : {
1813 0 : exp = norm_s( tmp1 );
1814 0 : tmp1 = shl( tmp1, exp ); /*Q(exp) */
1815 0 : tmp1 = div_s( 16384, tmp1 ); /*Q(15+14-exp=29-exp) */
1816 0 : exp = sub( 29, exp );
1817 : }
1818 : ELSE
1819 : {
1820 0 : tmp1 = 0x7fff;
1821 0 : move16();
1822 0 : exp = 0;
1823 0 : move16();
1824 : }
1825 0 : Mpy_32_16_ss( Ep_tmp_fx[i], tmp1, &L_tmp, &lo );
1826 0 : Mpy_32_16_ss( L_tmp, tmp, &L_tmp, &lo );
1827 0 : L_tmp = L_shl( L_tmp, sub( 29, exp ) ); /*Q14 */
1828 0 : tmp = extract_l( L_min( L_max( L_tmp, 13926 ), 16384 ) ); /*Q14 */
1829 0 : L_tmp = L_mult( alpha_fx, tmp ); /*Q(14+14+1=29) */
1830 0 : alpha_fx = extract_l( L_shr( L_tmp, 15 ) ); /*Q14 */
1831 : }
1832 : }
1833 0 : Mpy_32_16_ss( L_band_energy_tmp[i], alpha_fx, &L_tmp, &lo );
1834 0 : L_band_energy_tmp[i] = L_shl( L_tmp, 1 ); /*Q Q_band_energy */
1835 0 : move32();
1836 : }
1837 0 : lowband = 6;
1838 0 : move16();
1839 0 : Ep_avrg_fx = 0;
1840 0 : move32();
1841 0 : Ep_avrgL_fx = 0;
1842 0 : move32();
1843 0 : Ep_peak_fx = 0;
1844 0 : move32();
1845 0 : FOR( i = 0; i < bands; i++ )
1846 : {
1847 0 : IF( sub( i, lowband ) >= 0 )
1848 : {
1849 0 : Ep_avrg_fx = L_add_sat( Ep_avrg_fx, Ep_tmp_fx[i] ); /*Q15 */
1850 : }
1851 : ELSE
1852 : {
1853 0 : Ep_avrgL_fx = L_add_sat( Ep_avrgL_fx, Ep_tmp_fx[i] ); /*Q15 */
1854 0 : IF( L_sub( Ep_tmp_fx[i], Ep_peak_fx ) > 0 )
1855 : {
1856 0 : Ep_peak_fx = Ep_tmp_fx[i]; /* Q15 */
1857 0 : move32();
1858 : }
1859 : }
1860 : }
1861 :
1862 0 : Mpy_32_16_ss( Ep_peak_fx, 24576, &L_tmp, &lo );
1863 0 : Mpy_32_16_ss( Ep_peak_fx, 19661, &L_tmp2, &lo );
1864 0 : Mpy_32_16_ss( Ep_avrgL_fx, 24576, &L_tmp3, &lo );
1865 :
1866 0 : test();
1867 0 : test();
1868 0 : test();
1869 0 : test();
1870 0 : test();
1871 0 : IF( ( L_sub( L_shr( Ep_avrgL_fx, 1 ), Ep_avrg_fx ) > 0 && L_sub( L_tmp, L_shr( Ep_avrgL_fx, 2 ) ) > 0 && L_sub( L_shr( Ep_avrgL_fx, 1 ), L_tmp2 ) < 0 ) ||
1872 : ( L_sub( L_shr( Ep_avrg_fx, 1 ), Ep_avrgL_fx ) > 0 && L_sub( L_shr( Ep_avrg_fx, 3 ), L_tmp3 ) < 0 && L_sub( L_tmp, L_shr( Ep_avrgL_fx, 2 ) ) > 0 ) )
1873 : {
1874 0 : adjustFlag = 1;
1875 0 : move16();
1876 0 : FOR( i = 0; i < lowband; i++ )
1877 : {
1878 0 : tmp = extract_h( L_shl_sat( Ep_avrgL_fx, 1 ) ); /*Q0 */
1879 0 : IF( tmp != 0 )
1880 : {
1881 0 : exp = norm_s( tmp );
1882 0 : tmp = shl( tmp, exp ); /*Q(exp) */
1883 0 : tmp = div_s( 16384, tmp ); /*Q(15+14-exp=29-exp) */
1884 0 : exp = sub( 29, exp );
1885 : }
1886 : ELSE
1887 : {
1888 0 : tmp = 0x7fff;
1889 0 : move16();
1890 0 : exp = 0;
1891 0 : move16();
1892 : }
1893 0 : Mpy_32_16_ss( Ep_peak_fx, tmp, &L_tmp, &lo );
1894 0 : Mpy_32_16_ss( L_tmp, lowband, &L_tmp, &lo );
1895 0 : L_tmp = L_shl( L_tmp, sub( 28, exp ) ); /*Q14 0.5 */
1896 0 : tmp = extract_l( L_min( L_tmp, 19661 ) ); /*Q14 */
1897 0 : Mpy_32_16_ss( L_band_energy_tmp[i], tmp, &L_tmp, &lo );
1898 0 : L_band_energy_tmp[i] = L_shl( L_tmp, 1 ); /*Q_band_energy */
1899 0 : move32();
1900 : }
1901 : }
1902 : #undef WMC_TOOL_SKIP
1903 :
1904 0 : hq2_bit_alloc_fx( L_band_energy_tmp, bands, Rk_fx, &bit_budget, p2a_flags, bit_alloc_weight_fx, band_width, *num_bits, hqswb_clas, st->bwidth, is_transient );
1905 :
1906 : /* encode the last p2a_bands-1 subbands bit-allocation index of the previous frame */
1907 0 : FOR( i = 0; i < 2; i++ )
1908 : {
1909 0 : push_indice( hBstr, IND_HQ2_LAST_BA_MAX_BAND, hHQ_core->last_bitalloc_max_band[i], 1 );
1910 : }
1911 : }
1912 0 : ELSE IF( EQ_16( st->bwidth, SWB ) && EQ_16( hqswb_clas, HQ_HARMONIC ) && ( EQ_32( bwe_br, HQ_16k40 ) || EQ_32( bwe_br, HQ_13k20 ) ) )
1913 : {
1914 : /* bit allocation for harmonic mode */
1915 0 : hq2_bit_alloc_har_fx( L_band_energy, bit_budget, bands, Rk_fx, p2a_bands, bwe_br, p2a_flags, band_width );
1916 : }
1917 : ELSE
1918 : {
1919 :
1920 : /* estimate number of bits per band */
1921 0 : hq2_bit_alloc_fx( L_band_energy, bands, Rk_fx, &bit_budget, p2a_flags, bit_alloc_weight_fx, band_width, *num_bits, hqswb_clas, st->bwidth, is_transient );
1922 : }
1923 :
1924 0 : tcq_core_LR_enc_ivas_fx( hBstr, inp_vector, L_t_audio, L_y2, bit_budget, bands, band_start, band_end, band_width, Rk_fx, npulses, k_sort, p2a_flags, p2a_bands, hHQ_core->last_bitalloc_max_band, inner_frame, adjustFlag, is_transient );
1925 :
1926 0 : test();
1927 0 : test();
1928 0 : IF( ( EQ_16( inner_frame, L_FRAME8k ) && LE_32( st->core_brate, ACELP_13k20 ) ) || EQ_16( inner_frame, L_FRAME16k ) )
1929 : {
1930 0 : j = 0;
1931 0 : FOR( i = 2; i > 0; i-- )
1932 : {
1933 0 : IF( npulses[bands - i] > 0 )
1934 : {
1935 0 : hHQ_core->last_bitalloc_max_band[j] = 1;
1936 0 : move16();
1937 : }
1938 : ELSE
1939 : {
1940 0 : hHQ_core->last_bitalloc_max_band[j] = 0;
1941 0 : move16();
1942 : }
1943 0 : j++;
1944 : }
1945 : }
1946 :
1947 : /* Denormalize the coded MDCT spectrum */
1948 0 : mdct_spectrum_denorm_ivas_fx( inp_vector, L_y2, band_start, band_end, band_width, L_band_energy, npulses, bands, ld_slope_fx, pd_thresh_fx );
1949 :
1950 : /* Apply fine gain quantization to denormalized coded spectrum */
1951 0 : mdct_spectrum_fine_gain_enc_ivas_fx( st, L_t_audio, L_y2, band_start, band_end, k_sort, bands, L_qint, Ngq, gqlevs, gqbits );
1952 :
1953 : /* reStore the subband information*/
1954 0 : IF( EQ_16( flag_spt, 1 ) )
1955 : {
1956 0 : spt_shorten_domain_band_restore_fx( bands, band_start, band_end, band_width, org_band_start, org_band_end, org_band_width );
1957 : }
1958 :
1959 : /* Inject noise into components having relatively low pulse energy per band */
1960 0 : ni_seed = add( add( add( npulses[0], npulses[1] ), npulses[2] ), npulses[3] ); /* Q0 */
1961 :
1962 0 : Copy32( L_y2, L_y2_ni, band_end[bands - 1] + 1 ); /* Q12 */
1963 0 : test();
1964 0 : test();
1965 0 : IF( EQ_16( st->bwidth, SWB ) && ( EQ_32( bwe_br, HQ_16k40 ) || EQ_32( bwe_br, HQ_13k20 ) ) )
1966 : {
1967 0 : test();
1968 0 : IF( EQ_16( hqswb_clas, HQ_NORMAL ) || EQ_16( hqswb_clas, HQ_HARMONIC ) )
1969 : {
1970 0 : preset_hq2_swb_fx( hqswb_clas, band_end, &har_bands, p2a_bands, length, bands, &lowlength, &highlength, L_m );
1971 :
1972 0 : swb_bwe_enc_lr_ivas_fx( st, L_y2, SWB_BWE_LR_Qs, L_t_audio, L_m, bwe_br,
1973 : bands, band_start, band_end, L_band_energy, SWB_BWE_LR_Qbe, p2a_flags, hqswb_clas, lowlength, highlength,
1974 0 : hHQ_core->prev_frm_index, har_bands, &hHQ_core->prev_frm_hfe2, &hHQ_core->prev_stab_hfe2, band_width, L_y2_ni, &ni_seed );
1975 :
1976 0 : post_hq2_swb_fx( L_m, lowlength, highlength, hqswb_clas, har_bands, bands, p2a_flags, band_start, band_end, L_y2, npulses );
1977 :
1978 0 : IF( EQ_16( hqswb_clas, HQ_NORMAL ) )
1979 : {
1980 0 : spt_swb_peakpos_tmp_save_fx( L_y2, bands, band_start, band_end, prev_SWB_peak_pos_tmp );
1981 0 : FOR( k = 0; k < SPT_SHORTEN_SBNUM; k++ )
1982 : {
1983 0 : test();
1984 0 : IF( p2a_flags[bands - SPT_SHORTEN_SBNUM + k] == 0 || npulses[bands - SPT_SHORTEN_SBNUM + k] == 0 )
1985 : {
1986 0 : prev_SWB_peak_pos_tmp[k] = 0;
1987 0 : move16();
1988 : }
1989 : }
1990 : }
1991 0 : Copy32( L_y2_ni, L_y2, lowlength ); /* Q12 */
1992 : }
1993 : ELSE
1994 : {
1995 0 : Copy32( L_y2_ni, L_y2, band_end[bands - 1] + 1 ); /* HQ_TRANSIENT Q12*/
1996 : }
1997 : }
1998 : ELSE
1999 : {
2000 0 : Copy32( L_y2_ni, L_y2, band_end[bands - 1] + 1 ); /* NB, WB Q12*/
2001 : }
2002 :
2003 0 : updat_prev_frm_fx( L_y2, L_t_audio, bwe_br, length, inner_frame, bands, st->bwidth, is_transient, hqswb_clas, &hHQ_core->prev_hqswb_clas, hHQ_core->prev_SWB_peak_pos, prev_SWB_peak_pos_tmp, &hHQ_core->prev_frm_hfe2, &hHQ_core->prev_stab_hfe2, bws_cnt );
2004 :
2005 0 : IF( NE_16( st->bwidth, SWB ) )
2006 : {
2007 : /* reset HQ classifier memories */
2008 0 : hHQ_core->mode_count = 0;
2009 0 : move16();
2010 0 : hHQ_core->mode_count1 = 0;
2011 0 : move16();
2012 : }
2013 :
2014 :
2015 0 : test();
2016 0 : test();
2017 0 : test();
2018 0 : IF( NE_16( hqswb_clas, HQ_HARMONIC ) && ( EQ_32( bwe_br, HQ_16k40 ) || EQ_32( bwe_br, HQ_13k20 ) ) && EQ_16( st->bwidth, SWB ) )
2019 : {
2020 0 : hHQ_core->prev_frm_index[0] = -1;
2021 0 : move16();
2022 0 : hHQ_core->prev_frm_index[1] = -1;
2023 0 : move16();
2024 : }
2025 :
2026 : /* update number of unused bits */
2027 0 : *num_bits = 0;
2028 0 : move16();
2029 :
2030 0 : hHQ_core->hvq_hangover = 0;
2031 0 : move16();
2032 :
2033 0 : return;
2034 : }
2035 :
2036 :
2037 : /*--------------------------------------------------------------------------*
2038 : * small_symbol_enc_tran()
2039 : *
2040 : * Huffman encoding of differential energies, estimating or packing bits
2041 : * if flag_pack = 0, LC mode info. is output else LC mode info. is input
2042 : * if flag_pack = 0, estimatng else packing bits
2043 : *--------------------------------------------------------------------------*/
2044 :
2045 2 : static Word16 small_symbol_enc_tran_fx( /* o : bits */
2046 : BSTR_ENC_HANDLE hBstr, /* i : handle to the bitstream */
2047 : const Word16 *qbidx, /* i : input of dequantized differential energy Q0*/
2048 : const Word16 BANDS, /* i : number of bands Q0*/
2049 : Word16 *hLCmode, /* i/o: LC mode info Q0*/
2050 : const Word16 flag_pack, /* i : indicator of packing or estimating bits Q0*/
2051 : const Word16 is_transient /* Q0 */ )
2052 : {
2053 : Word16 i, bits;
2054 : Word16 difidx[BANDS_MAX];
2055 :
2056 66 : FOR( i = 0; i < BANDS; i++ )
2057 : {
2058 64 : difidx[i] = add( qbidx[i], LRMDCT_BE_OFFSET ); /* Q0 */
2059 64 : move16();
2060 : }
2061 :
2062 66 : FOR( i = 0; i < BANDS; ++i )
2063 : {
2064 64 : test();
2065 64 : IF( GT_16( difidx[i], LRMDCT_BE_LIMIT ) || difidx[i] < 0 )
2066 : {
2067 : /* Huffman cannot encode this vector */
2068 0 : return -1;
2069 : }
2070 : }
2071 :
2072 : /* Preparing lossless coding input */
2073 2 : IF( flag_pack == 0 )
2074 : {
2075 : /* estimating # of bits */
2076 1 : bits = encode_envelope_indices_fx( hBstr, BANDS, -1, difidx, hLCmode, flag_pack, LOW_RATE_HQ_CORE_TRAN, is_transient ); /* Q0 */
2077 1 : bits = add( bits, BITS_DE_FCOMP ); /* xx bits for diff. energies + BITS_DE_FCOMP bits for first energies */
2078 : }
2079 : ELSE
2080 : {
2081 1 : bits = 0;
2082 1 : move16();
2083 1 : encode_envelope_indices_fx( hBstr, BANDS, -1, difidx, hLCmode, flag_pack, LOW_RATE_HQ_CORE_TRAN, is_transient );
2084 : }
2085 :
2086 2 : return add( bits, BITS_DE_HMODE ); /* xx bits for diff. energies + 1 bit for LC coding mode Q0*/
2087 : }
2088 :
2089 :
2090 0 : static Word16 small_symbol_enc_tran_ivas_fx( /* o : bits */
2091 : BSTR_ENC_HANDLE hBstr, /* i : handle to the bitstream */
2092 : const Word16 *qbidx, /* i : input of dequantized differential energy Q0*/
2093 : const Word16 BANDS, /* i : number of bands Q0*/
2094 : Word16 *hLCmode, /* i/o: LC mode info Q0*/
2095 : const Word16 flag_pack, /* i : indicator of packing or estimating bits Q0*/
2096 : const Word16 is_transient /* Q0 */ )
2097 : {
2098 : Word16 i, bits;
2099 : Word16 difidx[BANDS_MAX];
2100 :
2101 0 : FOR( i = 0; i < BANDS; i++ )
2102 : {
2103 0 : difidx[i] = add( qbidx[i], LRMDCT_BE_OFFSET ); /* Q0 */
2104 0 : move16();
2105 : }
2106 :
2107 0 : FOR( i = 0; i < BANDS; ++i )
2108 : {
2109 0 : test();
2110 0 : IF( GT_16( difidx[i], LRMDCT_BE_LIMIT ) || difidx[i] < 0 )
2111 : {
2112 : /* Huffman cannot encode this vector */
2113 0 : return -1;
2114 : }
2115 : }
2116 :
2117 : /* Preparing lossless coding input */
2118 0 : IF( flag_pack == 0 )
2119 : {
2120 : /* estimating # of bits */
2121 0 : bits = encode_envelope_indices_ivas_fx( hBstr, BANDS, -1, difidx, hLCmode, flag_pack, LOW_RATE_HQ_CORE_TRAN, is_transient ); /* Q0 */
2122 0 : bits = add( bits, BITS_DE_FCOMP ); /* xx bits for diff. energies + BITS_DE_FCOMP bits for first energies */
2123 : }
2124 : ELSE
2125 : {
2126 0 : bits = 0;
2127 0 : move16();
2128 0 : encode_envelope_indices_ivas_fx( hBstr, BANDS, -1, difidx, hLCmode, flag_pack, LOW_RATE_HQ_CORE_TRAN, is_transient );
2129 : }
2130 :
2131 0 : return add( bits, BITS_DE_HMODE ); /* xx bits for diff. energies + 1 bit for LC coding mode Q0*/
2132 : }
2133 :
2134 :
2135 : /*--------------------------------------------------------------------------*
2136 : * small_symbol_enc()
2137 : *
2138 : * Huffman encoding of differential energies, estimating or packing bits
2139 : * if flag_pack = 0, LC mode info. is output else LC mode info. is input
2140 : * if flag_pack = 0, estimatng else packing bits
2141 : *--------------------------------------------------------------------------*/
2142 :
2143 : /* o : bits */
2144 76 : static Word16 small_symbol_enc_fx(
2145 : BSTR_ENC_HANDLE hBstr, /* i : handle to the bitstream */
2146 : const Word16 *qbidx, /* i : input of dequantized differential energy Q0*/
2147 : const Word16 BANDS, /* i : number of bands Q0*/
2148 : Word16 *hLCmode, /* i/o: LC mode info Q0*/
2149 : const Word16 flag_pack, /* i : indicator of packing or estimating bits Q0*/
2150 : const Word16 is_transient /* Q0 */ )
2151 : {
2152 : Word16 i, bits;
2153 : Word16 difidx[BANDS_MAX], LSB[BANDS_MAX];
2154 :
2155 : /* Preparing lossless coding input */
2156 76 : difidx[0] = add( qbidx[0], DE_OFFSET0 ); /* Q0 */
2157 76 : move16();
2158 :
2159 1672 : FOR( i = 1; i < BANDS; ++i )
2160 : {
2161 1596 : difidx[i] = add( qbidx[i], DE_OFFSET1 ); /* Q0 */
2162 1596 : move16();
2163 : }
2164 :
2165 1748 : FOR( i = 0; i < BANDS; ++i )
2166 : {
2167 1672 : test();
2168 1672 : IF( GE_16( difidx[i], DE_LIMIT ) || difidx[i] < 0 )
2169 : {
2170 : /* Huffman cannot encode this vector */
2171 0 : return -1;
2172 : }
2173 : }
2174 :
2175 : /* splitting MSB and LSB */
2176 1748 : FOR( i = 0; i < BANDS; ++i )
2177 : {
2178 1672 : LSB[i] = s_and( difidx[i], 1 ); /* Q0 */
2179 1672 : move16();
2180 1672 : difidx[i] = shr( difidx[i], 1 ); /* Q0 */
2181 1672 : move16();
2182 : }
2183 :
2184 : /* Preparing lossless coding input */
2185 76 : IF( flag_pack == 0 )
2186 : {
2187 : /* estimating # of bits */
2188 : /* Encoding MSB bits */
2189 38 : bits = encode_envelope_indices_fx( hBstr, BANDS, -1, difidx, hLCmode, flag_pack, LOW_RATE_HQ_CORE, is_transient ); /* Q0 */
2190 38 : bits = add( bits, BITS_DE_FCOMP ); /* xx bits for diff. energies + BITS_DE_FCOMP bits for first energies */
2191 :
2192 : /* Encoding LSB bit packing */
2193 38 : bits = add( bits, BANDS ); /* Q0 */
2194 : }
2195 : ELSE
2196 : {
2197 : /* Encoding MSB bits */
2198 38 : bits = 0;
2199 38 : move16();
2200 38 : encode_envelope_indices_fx( hBstr, BANDS, -1, difidx, hLCmode, flag_pack, LOW_RATE_HQ_CORE, is_transient );
2201 :
2202 : /* Encoding LSB bit packing */
2203 874 : FOR( i = 0; i < BANDS; ++i )
2204 : {
2205 836 : push_indice( hBstr, IND_HQ2_DIFF_ENERGY, LSB[i], BITS_DE_LSB );
2206 : }
2207 : }
2208 :
2209 76 : return add( bits, BITS_DE_HMODE ); /* xx bits for diff. energies + 1 bit for LC coding mode Q0*/
2210 : }
2211 :
2212 0 : static Word16 small_symbol_enc_ivas_fx(
2213 : BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */
2214 : const Word16 *qbidx, /* i : input of dequantized differential energy Q0*/
2215 : const Word16 BANDS, /* i : number of bands Q0*/
2216 : Word16 *hLCmode, /* i/o: LC mode info Q0*/
2217 : const Word16 flag_pack, /* i : indicator of packing or estimating bits Q0*/
2218 : const Word16 is_transient /* Q0 */ )
2219 : {
2220 : Word16 i, bits;
2221 : Word16 difidx[BANDS_MAX], LSB[BANDS_MAX];
2222 :
2223 : /* Preparing lossless coding input */
2224 0 : difidx[0] = add( qbidx[0], DE_OFFSET0 ); /* Q0 */
2225 0 : move16();
2226 :
2227 0 : FOR( i = 1; i < BANDS; ++i )
2228 : {
2229 0 : difidx[i] = add( qbidx[i], DE_OFFSET1 ); /* Q0 */
2230 0 : move16();
2231 : }
2232 :
2233 0 : FOR( i = 0; i < BANDS; ++i )
2234 : {
2235 0 : test();
2236 0 : IF( GE_16( difidx[i], DE_LIMIT ) || difidx[i] < 0 )
2237 : {
2238 : /* Huffman cannot encode this vector */
2239 0 : return -1;
2240 : }
2241 : }
2242 :
2243 : /* splitting MSB and LSB */
2244 0 : FOR( i = 0; i < BANDS; ++i )
2245 : {
2246 0 : LSB[i] = s_and( difidx[i], 1 ); /* Q0 */
2247 0 : move16();
2248 0 : difidx[i] = shr( difidx[i], 1 ); /* Q0 */
2249 0 : move16();
2250 : }
2251 :
2252 : /* Preparing lossless coding input */
2253 0 : IF( flag_pack == 0 )
2254 : {
2255 : /* estimating # of bits */
2256 : /* Encoding MSB bits */
2257 0 : bits = encode_envelope_indices_ivas_fx( hBstr, BANDS, -1, difidx, hLCmode, flag_pack, LOW_RATE_HQ_CORE, is_transient ); /* Q0 */
2258 0 : bits = add( bits, BITS_DE_FCOMP ); /* xx bits for diff. energies + BITS_DE_FCOMP bits for first energies Q0*/
2259 :
2260 : /* Encoding LSB bit packing */
2261 0 : bits = add( bits, BANDS ); /* Q0 */
2262 : }
2263 : ELSE
2264 : {
2265 : /* Encoding MSB bits */
2266 0 : bits = 0;
2267 0 : move16();
2268 0 : encode_envelope_indices_ivas_fx( hBstr, BANDS, -1, difidx, hLCmode, flag_pack, LOW_RATE_HQ_CORE, is_transient );
2269 :
2270 : /* Encoding LSB bit packing */
2271 0 : FOR( i = 0; i < BANDS; ++i )
2272 : {
2273 0 : push_indice( hBstr, IND_HQ2_DIFF_ENERGY, LSB[i], BITS_DE_LSB );
2274 : }
2275 : }
2276 :
2277 0 : return add( bits, BITS_DE_HMODE ); /* xx bits for diff. energies + 1 bit for LC coding mode Q0*/
2278 : }
2279 :
2280 :
2281 : /* o : bits Q0 */
2282 39 : static Word16 large_symbol_enc_fx(
2283 : BSTR_ENC_HANDLE hBstr, /* i : handle to the bitstream */
2284 : Word16 *qbidx, /* i : input of dequantized differential energy Q0*/
2285 : const Word16 BANDS, /* i : number of bands Q0*/
2286 : Word16 *hLCmode0, /* i/o: LC mode info Q0*/
2287 : const Word16 flag_pack /* i : indicator of packing or estimating bits Q0*/
2288 : )
2289 : {
2290 : Word16 i, bits, tmp;
2291 : Word16 LSB1[BANDS_MAX];
2292 : Word16 min_q, max_q, offset0;
2293 : Word16 min_bits, min_bits_pos;
2294 : Word16 tdifidx0[BANDS_MAX], tdifidx1[BANDS_MAX];
2295 : Word16 basic_shift;
2296 : Word16 bitsmode0, bitsmode1;
2297 : Word16 lsbdepth1;
2298 : Word16 cnt_outlyer, pos_outlyer, cnt_outlyer0;
2299 :
2300 39 : min_q = 513; /* Q0 */
2301 39 : move16();
2302 39 : max_q = -1;
2303 39 : move16();
2304 :
2305 39 : cnt_outlyer0 = 0;
2306 39 : move16();
2307 39 : cnt_outlyer = 0;
2308 39 : move16();
2309 39 : bitsmode0 = 0;
2310 39 : move16();
2311 39 : bitsmode1 = 0;
2312 39 : move16();
2313 39 : pos_outlyer = 0;
2314 39 : move16();
2315 39 : lsbdepth1 = 0;
2316 39 : move16();
2317 :
2318 39 : test();
2319 39 : test();
2320 39 : IF( flag_pack == 0 || ( EQ_16( flag_pack, 1 ) && *hLCmode0 == 0 ) )
2321 : {
2322 39 : test();
2323 39 : test();
2324 39 : IF( GT_16( qbidx[0], sub( ABS_ENG_OFFSET, 1 ) ) || LT_16( qbidx[0], -ABS_ENG_OFFSET ) )
2325 : {
2326 0 : cnt_outlyer0 = 2;
2327 0 : move16();
2328 : }
2329 39 : ELSE IF( GT_16( qbidx[0], 3 ) || LT_16( qbidx[0], -4 ) )
2330 : {
2331 35 : cnt_outlyer0 = 1;
2332 35 : move16();
2333 : }
2334 : ELSE
2335 : {
2336 4 : cnt_outlyer0 = 0;
2337 4 : move16();
2338 : }
2339 :
2340 39 : cnt_outlyer = 0;
2341 39 : move16();
2342 39 : pos_outlyer = -1;
2343 39 : move16();
2344 868 : FOR( i = 1; i < BANDS; ++i )
2345 : {
2346 829 : test();
2347 829 : IF( GT_16( qbidx[i], 3 ) || LT_16( qbidx[i], -4 ) )
2348 : {
2349 237 : cnt_outlyer = add( cnt_outlyer, 1 ); /* Q0 */
2350 237 : pos_outlyer = i;
2351 237 : move16();
2352 : }
2353 :
2354 829 : test();
2355 829 : IF( GT_16( qbidx[i], ( ABS_ENG_OFFSET - 1 ) ) || LT_16( qbidx[i], -ABS_ENG_OFFSET ) )
2356 : {
2357 0 : cnt_outlyer = add( cnt_outlyer, 1 ); /* Q0 */
2358 : }
2359 : }
2360 :
2361 39 : test();
2362 39 : test();
2363 39 : IF( cnt_outlyer0 == 0 && LE_16( cnt_outlyer, 1 ) )
2364 : {
2365 2 : bitsmode0 = ( BITS_DE_8SMODE + BITS_DE_8SMODE_N0 ) + BITS_DE_8SMODE_N1; /* Q0 */
2366 2 : move16();
2367 2 : IF( EQ_16( cnt_outlyer, 1 ) )
2368 : {
2369 : /* 01 */
2370 1 : bitsmode0 = add( bitsmode0, ( BITS_DE_8SPOS + BITS_ABS_ENG ) ); /* Q0 */
2371 : }
2372 :
2373 3 : FOR( i = 0; i < pos_outlyer; ++i )
2374 : {
2375 1 : tdifidx0[i] = qbidx[i]; /* Q0 */
2376 1 : move16();
2377 1 : bitsmode0 = add( bitsmode0, hessize[tdifidx0[i] + 4] ); /* Q0 */
2378 : }
2379 :
2380 54 : FOR( i = add( pos_outlyer, 1 ); i < BANDS; ++i )
2381 : {
2382 52 : tdifidx0[i] = qbidx[i]; /* Q0 */
2383 52 : move16();
2384 52 : bitsmode0 = add( bitsmode0, hessize[tdifidx0[i] + 4] ); /* Q0 */
2385 : }
2386 : }
2387 37 : ELSE IF( EQ_16( cnt_outlyer0, 1 ) && LE_16( cnt_outlyer, 1 ) )
2388 : {
2389 5 : bitsmode0 = ( BITS_DE_8SMODE + BITS_DE_8SMODE_N0 ) + BITS_DE_8SMODE_N1; /* Q0 */
2390 5 : move16();
2391 5 : tdifidx0[0] = qbidx[0]; /* Q0 */
2392 5 : move16();
2393 5 : bitsmode0 = add( bitsmode0, BITS_ABS_ENG );
2394 5 : IF( EQ_16( cnt_outlyer, 1 ) )
2395 : {
2396 : /* 11 */
2397 5 : bitsmode0 = add( bitsmode0, ( BITS_DE_8SPOS + BITS_ABS_ENG ) ); /* Q0 */
2398 : }
2399 : ELSE
2400 : {
2401 0 : pos_outlyer = 0;
2402 0 : move16();
2403 : }
2404 :
2405 11 : FOR( i = 1; i < pos_outlyer; ++i )
2406 : {
2407 6 : tdifidx0[i] = qbidx[i]; /* Q0 */
2408 6 : move16();
2409 6 : bitsmode0 = add( bitsmode0, hessize[tdifidx0[i] + 4] ); /* Q0 */
2410 : }
2411 :
2412 99 : FOR( i = add( pos_outlyer, 1 ); i < BANDS; ++i )
2413 : {
2414 94 : tdifidx0[i] = qbidx[i]; /* Q0 */
2415 94 : move16();
2416 94 : bitsmode0 = add( bitsmode0, hessize[tdifidx0[i] + 4] ); /* Q0 */
2417 : }
2418 : }
2419 : ELSE
2420 : {
2421 32 : bitsmode0 = 20000;
2422 32 : move16();
2423 : }
2424 : }
2425 :
2426 39 : test();
2427 39 : IF( flag_pack == 0 || EQ_16( *hLCmode0, 1 ) )
2428 : {
2429 : /* components 0 range : -256~255 */
2430 39 : max_q = MINIMUM_ENERGY_LOWBRATE;
2431 39 : move16();
2432 39 : min_q = MAXIMUM_ENERGY_LOWBRATE;
2433 39 : move16();
2434 907 : FOR( i = 0; i < BANDS; ++i )
2435 : {
2436 868 : max_q = s_max( qbidx[i], max_q );
2437 868 : min_q = s_min( qbidx[i], min_q );
2438 : }
2439 :
2440 : /* Counting bits for transmitting all components using same method */
2441 126 : FOR( i = 0;; ++i )
2442 : {
2443 : /*if (max_q <= ((2<<(i+1))-1) && min_q >= -(2<<(i+1))) */
2444 126 : test();
2445 126 : IF( LE_16( max_q, sub( shl( 2, add( i, 1 ) ), 1 ) ) && GE_16( min_q, -shl( 2, add( i, 1 ) ) ) )
2446 : {
2447 39 : BREAK;
2448 : }
2449 : }
2450 39 : basic_shift = i;
2451 39 : move16();
2452 :
2453 39 : min_bits = 1000; /* Q0 */
2454 39 : move16();
2455 39 : min_bits_pos = basic_shift; /* Q0 */
2456 39 : move16();
2457 39 : tmp = add( basic_shift, 3 );
2458 156 : FOR( offset0 = basic_shift; offset0 < tmp; offset0++ )
2459 : {
2460 117 : max_q = MINIMUM_ENERGY_LOWBRATE;
2461 117 : move16();
2462 117 : min_q = MAXIMUM_ENERGY_LOWBRATE;
2463 117 : move16();
2464 :
2465 117 : bitsmode1 = add( BITS_DE_8SMODE, BITS_MAX_DEPTH ); /* Q0 */
2466 2721 : FOR( i = 0; i < BANDS; ++i )
2467 : {
2468 2604 : bitsmode1 = add( bitsmode1, add( hessize[( ( qbidx[i] >> offset0 ) + 4 )], offset0 ) );
2469 : }
2470 :
2471 117 : IF( GT_16( min_bits, bitsmode1 ) )
2472 : {
2473 49 : min_bits_pos = offset0; /* Q0 */
2474 49 : move16();
2475 49 : min_bits = bitsmode1; /* Q0 */
2476 49 : move16();
2477 : }
2478 : }
2479 :
2480 39 : bitsmode1 = min_bits;
2481 39 : move16();
2482 39 : lsbdepth1 = min_bits_pos;
2483 39 : move16();
2484 :
2485 907 : FOR( i = 0; i < BANDS; ++i )
2486 : {
2487 868 : LSB1[i] = s_and( qbidx[i], sub( shl( 1, lsbdepth1 ), 1 ) );
2488 868 : tdifidx1[i] = shr( qbidx[i], lsbdepth1 );
2489 868 : move16();
2490 868 : move16();
2491 : }
2492 : }
2493 :
2494 : /* Preparing lossless coding input */
2495 39 : IF( flag_pack == 0 )
2496 : {
2497 : /* estimating # of bits */
2498 : /* Encoding MSB bits */
2499 39 : IF( LT_16( bitsmode0, bitsmode1 ) )
2500 : {
2501 5 : bits = bitsmode0; /* Q0 */
2502 5 : move16();
2503 5 : *hLCmode0 = 0;
2504 5 : move16();
2505 : }
2506 : ELSE
2507 : {
2508 34 : bits = bitsmode1; /* Q0 */
2509 34 : move16();
2510 34 : *hLCmode0 = 1;
2511 34 : move16();
2512 : }
2513 : }
2514 : ELSE
2515 : {
2516 : /* Encoding MSB bits */
2517 0 : IF( *hLCmode0 == 0 )
2518 : {
2519 0 : push_indice( hBstr, IND_HQ2_DENG_8SMODE, 0, BITS_DE_8SMODE );
2520 0 : bits = BITS_DE_8SMODE;
2521 0 : move16();
2522 0 : IF( cnt_outlyer0 == 0 )
2523 : {
2524 0 : push_indice( hBstr, IND_HQ2_DENG_8SMODE_N0, 0, BITS_DE_8SMODE_N0 );
2525 0 : bits = add( bits, BITS_DE_8SMODE_N0 );
2526 0 : IF( EQ_16( cnt_outlyer, 1 ) )
2527 : {
2528 : /* 01 */
2529 0 : push_indice( hBstr, IND_HQ2_DENG_8SMODE_N1, 1, BITS_DE_8SMODE_N1 );
2530 0 : bits = add( bits, BITS_DE_8SMODE_N1 ); /* Q0 */
2531 0 : push_indice( hBstr, IND_HQ2_DENG_8SPOS, pos_outlyer, BITS_DE_8SPOS );
2532 0 : bits = add( bits, BITS_DE_8SPOS );
2533 0 : push_indice( hBstr, IND_HQ2_DIFF_ENERGY, qbidx[pos_outlyer] + ABS_ENG_OFFSET, BITS_ABS_ENG );
2534 0 : bits = add( bits, BITS_ABS_ENG );
2535 : }
2536 : ELSE
2537 : {
2538 : /* 00 */
2539 0 : push_indice( hBstr, IND_HQ2_DENG_8SMODE_N1, 0, BITS_DE_8SMODE_N1 );
2540 0 : bits = add( bits, BITS_DE_8SMODE_N1 ); /* Q0 */
2541 : }
2542 :
2543 0 : FOR( i = 0; i < pos_outlyer; ++i )
2544 : {
2545 0 : push_indice( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx0[i] + 4], hessize[tdifidx0[i] + 4] );
2546 0 : bitsmode0 = add( bitsmode0, hessize[tdifidx0[i] + 4] ); /* Q0 */
2547 : }
2548 :
2549 0 : FOR( i = ( pos_outlyer + 1 ); i < BANDS; ++i )
2550 : {
2551 0 : push_indice( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx0[i] + 4], hessize[tdifidx0[i] + 4] );
2552 0 : bitsmode0 = add( bitsmode0, hessize[tdifidx0[i] + 4] ); /* Q0 */
2553 : }
2554 : }
2555 0 : ELSE IF( EQ_16( cnt_outlyer0, 1 ) )
2556 : {
2557 0 : push_indice( hBstr, IND_HQ2_DENG_8SMODE_N0, 1, BITS_DE_8SMODE_N0 );
2558 0 : bits = add( bits, BITS_DE_8SMODE_N0 );
2559 0 : IF( EQ_16( cnt_outlyer, 1 ) )
2560 : {
2561 0 : push_indice( hBstr, IND_HQ2_DENG_8SMODE_N1, 1, BITS_DE_8SMODE_N1 );
2562 0 : bits = add( bits, BITS_DE_8SMODE_N1 ); /* Q0 */
2563 0 : push_indice( hBstr, IND_HQ2_DENG_8SPOS, pos_outlyer, BITS_DE_8SPOS );
2564 0 : bits = add( bits, BITS_DE_8SPOS );
2565 0 : push_indice( hBstr, IND_HQ2_DIFF_ENERGY, qbidx[0] + ABS_ENG_OFFSET, BITS_ABS_ENG );
2566 0 : bits = add( bits, BITS_ABS_ENG );
2567 0 : push_indice( hBstr, IND_HQ2_DIFF_ENERGY, qbidx[pos_outlyer] + ABS_ENG_OFFSET, BITS_ABS_ENG );
2568 0 : bits = add( bits, BITS_ABS_ENG );
2569 : }
2570 : ELSE
2571 : {
2572 0 : push_indice( hBstr, IND_HQ2_DENG_8SMODE_N1, 0, BITS_DE_8SMODE_N1 );
2573 0 : bits = add( bits, BITS_DE_8SMODE_N1 ); /* Q0 */
2574 0 : push_indice( hBstr, IND_HQ2_DIFF_ENERGY, qbidx[0] + ABS_ENG_OFFSET, BITS_ABS_ENG );
2575 0 : bits = add( bits, BITS_ABS_ENG ); /* Q0 */
2576 : }
2577 :
2578 0 : FOR( i = 1; i < pos_outlyer; ++i )
2579 : {
2580 0 : push_indice( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx0[i] + 4], hessize[tdifidx0[i] + 4] );
2581 0 : bits = add( bits, hessize[tdifidx0[i] + 4] ); /* Q0 */
2582 : }
2583 :
2584 0 : FOR( i = pos_outlyer + 1; i < BANDS; ++i )
2585 : {
2586 0 : push_indice( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx0[i] + 4], hessize[tdifidx0[i] + 4] );
2587 0 : bits = add( bits, hessize[tdifidx0[i] + 4] ); /* Q0 */
2588 : }
2589 : }
2590 : }
2591 : ELSE
2592 : {
2593 0 : bits = add( BITS_DE_8SMODE, BITS_MAX_DEPTH ); /* Q0 */
2594 0 : push_indice( hBstr, IND_HQ2_DENG_8SMODE, 1, BITS_DE_8SMODE );
2595 0 : push_indice( hBstr, IND_HQ2_DENG_8SDEPTH, lsbdepth1, BITS_MAX_DEPTH );
2596 :
2597 0 : FOR( i = 0; i < BANDS; ++i )
2598 : {
2599 0 : push_indice( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx1[i] + 4], hessize[tdifidx1[i] + 4] );
2600 0 : bits = add( bits, hessize[tdifidx1[i] + 4] ); /* Q0 */
2601 : }
2602 :
2603 0 : IF( lsbdepth1 > 0 )
2604 : {
2605 0 : FOR( i = 0; i < BANDS; ++i )
2606 : {
2607 0 : push_indice( hBstr, IND_HQ2_DIFF_ENERGY, LSB1[i], lsbdepth1 );
2608 : }
2609 : /*bits += BANDS * lsbdepth1; */
2610 0 : bits = add( bits, extract_h( L_shl( L_mult( BANDS, lsbdepth1 ), 15 ) ) ); /* Q0 */
2611 : }
2612 : }
2613 : }
2614 :
2615 39 : return bits; /* xx bits for diff. energies + 1 bit for LC coding mode Q0*/
2616 : }
2617 :
2618 :
2619 0 : static Word16 large_symbol_enc_ivas_fx(
2620 : BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */
2621 : Word16 *qbidx, /* i : input of dequantized differential energy Q0*/
2622 : const Word16 BANDS, /* i : number of bands Q0*/
2623 : Word16 *hLCmode0, /* i/o: LC mode info Q0*/
2624 : const Word16 flag_pack /* i : indicator of packing or estimating bits Q0*/
2625 : )
2626 : {
2627 : Word16 i, bits, tmp;
2628 : Word16 LSB1[BANDS_MAX];
2629 : Word16 min_q, max_q, offset0;
2630 : Word16 min_bits, min_bits_pos;
2631 : Word16 tdifidx0[BANDS_MAX], tdifidx1[BANDS_MAX];
2632 : Word16 basic_shift;
2633 : Word16 bitsmode0, bitsmode1;
2634 : Word16 lsbdepth1;
2635 : Word16 cnt_outlyer, pos_outlyer, cnt_outlyer0;
2636 :
2637 0 : min_q = 513; /* Q0 */
2638 0 : move16();
2639 0 : max_q = -1;
2640 0 : move16();
2641 :
2642 0 : cnt_outlyer0 = 0;
2643 0 : move16();
2644 0 : cnt_outlyer = 0;
2645 0 : move16();
2646 0 : bitsmode0 = 0;
2647 0 : move16();
2648 0 : bitsmode1 = 0;
2649 0 : move16();
2650 0 : pos_outlyer = 0;
2651 0 : move16();
2652 0 : lsbdepth1 = 0;
2653 0 : move16();
2654 :
2655 0 : test();
2656 0 : test();
2657 0 : IF( flag_pack == 0 || ( EQ_16( flag_pack, 1 ) && *hLCmode0 == 0 ) )
2658 : {
2659 0 : test();
2660 0 : test();
2661 0 : IF( GT_16( qbidx[0], sub( ABS_ENG_OFFSET, 1 ) ) || LT_16( qbidx[0], -ABS_ENG_OFFSET ) )
2662 : {
2663 0 : cnt_outlyer0 = 2;
2664 0 : move16();
2665 : }
2666 0 : ELSE IF( GT_16( qbidx[0], 3 ) || LT_16( qbidx[0], -4 ) )
2667 : {
2668 0 : cnt_outlyer0 = 1;
2669 0 : move16();
2670 : }
2671 : ELSE
2672 : {
2673 0 : cnt_outlyer0 = 0;
2674 0 : move16();
2675 : }
2676 :
2677 0 : cnt_outlyer = 0;
2678 0 : move16();
2679 0 : pos_outlyer = -1;
2680 0 : move16();
2681 0 : FOR( i = 1; i < BANDS; ++i )
2682 : {
2683 0 : test();
2684 0 : IF( GT_16( qbidx[i], 3 ) || LT_16( qbidx[i], -4 ) )
2685 : {
2686 0 : cnt_outlyer = add( cnt_outlyer, 1 ); /* Q0 */
2687 0 : pos_outlyer = i;
2688 0 : move16();
2689 : }
2690 :
2691 0 : test();
2692 0 : IF( GT_16( qbidx[i], ( ABS_ENG_OFFSET - 1 ) ) || LT_16( qbidx[i], -ABS_ENG_OFFSET ) )
2693 : {
2694 0 : cnt_outlyer = add( cnt_outlyer, 1 ); /* Q0 */
2695 : }
2696 : }
2697 :
2698 0 : test();
2699 0 : test();
2700 0 : IF( cnt_outlyer0 == 0 && LE_16( cnt_outlyer, 1 ) )
2701 : {
2702 0 : bitsmode0 = ( BITS_DE_8SMODE + BITS_DE_8SMODE_N0 ) + BITS_DE_8SMODE_N1; /* Q0 */
2703 0 : move16();
2704 0 : IF( EQ_16( cnt_outlyer, 1 ) )
2705 : {
2706 : /* 01 */
2707 0 : bitsmode0 = add( bitsmode0, add( BITS_DE_8SPOS, BITS_ABS_ENG ) ); /* Q0 */
2708 : }
2709 :
2710 0 : FOR( i = 0; i < pos_outlyer; ++i )
2711 : {
2712 0 : tdifidx0[i] = qbidx[i]; /* Q0 */
2713 0 : move16();
2714 0 : bitsmode0 = add( bitsmode0, hessize[tdifidx0[i] + 4] ); /* Q0 */
2715 : }
2716 :
2717 0 : FOR( i = ( pos_outlyer + 1 ); i < BANDS; ++i )
2718 : {
2719 0 : tdifidx0[i] = qbidx[i]; /* Q0 */
2720 0 : move16();
2721 0 : bitsmode0 = add( bitsmode0, hessize[tdifidx0[i] + 4] ); /* Q0 */
2722 : }
2723 : }
2724 0 : ELSE IF( EQ_16( cnt_outlyer0, 1 ) && LE_16( cnt_outlyer, 1 ) )
2725 : {
2726 0 : bitsmode0 = ( BITS_DE_8SMODE + BITS_DE_8SMODE_N0 ) + BITS_DE_8SMODE_N1; /* Q0 */
2727 0 : move16();
2728 0 : tdifidx0[0] = qbidx[0]; /* Q0 */
2729 0 : move16();
2730 0 : bitsmode0 = add( bitsmode0, BITS_ABS_ENG ); /* Q0 */
2731 0 : IF( EQ_16( cnt_outlyer, 1 ) )
2732 : {
2733 : /* 11 */
2734 0 : bitsmode0 = add( bitsmode0, ( BITS_DE_8SPOS + BITS_ABS_ENG ) ); /* Q0 */
2735 : }
2736 : ELSE
2737 : {
2738 0 : pos_outlyer = 0;
2739 0 : move16();
2740 : }
2741 :
2742 0 : FOR( i = 1; i < pos_outlyer; ++i )
2743 : {
2744 0 : tdifidx0[i] = qbidx[i]; /* Q0 */
2745 0 : move16();
2746 0 : bitsmode0 = add( bitsmode0, hessize[tdifidx0[i] + 4] ); /* Q0 */
2747 : }
2748 :
2749 0 : FOR( i = ( pos_outlyer + 1 ); i < BANDS; ++i )
2750 : {
2751 0 : tdifidx0[i] = qbidx[i]; /* Q0 */
2752 0 : move16();
2753 0 : bitsmode0 = add( bitsmode0, hessize[tdifidx0[i] + 4] ); /* Q0 */
2754 : }
2755 : }
2756 : ELSE
2757 : {
2758 0 : bitsmode0 = 20000; /* Q0 */
2759 0 : move16();
2760 : }
2761 : }
2762 :
2763 0 : test();
2764 0 : IF( flag_pack == 0 || EQ_16( *hLCmode0, 1 ) )
2765 : {
2766 : /* components 0 range : -256~255 */
2767 0 : max_q = MINIMUM_ENERGY_LOWBRATE;
2768 0 : move16();
2769 0 : min_q = MAXIMUM_ENERGY_LOWBRATE;
2770 0 : move16();
2771 0 : FOR( i = 0; i < BANDS; ++i )
2772 : {
2773 0 : max_q = s_max( qbidx[i], max_q );
2774 0 : min_q = s_min( qbidx[i], min_q );
2775 : }
2776 :
2777 : /* Counting bits for transmitting all components using same method */
2778 0 : FOR( i = 0;; ++i )
2779 : {
2780 : /*if (max_q <= ((2<<(i+1))-1) && min_q >= -(2<<(i+1))) */
2781 0 : test();
2782 0 : IF( LE_16( max_q, sub( shl( 2, add( i, 1 ) ), 1 ) ) && GE_16( min_q, -shl( 2, add( i, 1 ) ) ) )
2783 : {
2784 0 : BREAK;
2785 : }
2786 : }
2787 0 : basic_shift = i;
2788 0 : move16();
2789 :
2790 0 : min_bits = 1000; /* Q0 */
2791 0 : move16();
2792 0 : min_bits_pos = basic_shift; /* Q0 */
2793 0 : move16();
2794 0 : tmp = add( basic_shift, 3 );
2795 0 : FOR( offset0 = basic_shift; offset0 < tmp; offset0++ )
2796 : {
2797 0 : max_q = MINIMUM_ENERGY_LOWBRATE;
2798 0 : move16();
2799 0 : min_q = MAXIMUM_ENERGY_LOWBRATE;
2800 0 : move16();
2801 :
2802 0 : bitsmode1 = ( BITS_DE_8SMODE + BITS_MAX_DEPTH ); /* Q0 */
2803 0 : move16();
2804 0 : FOR( i = 0; i < BANDS; ++i )
2805 : {
2806 0 : bitsmode1 = add( bitsmode1, add( hessize[( ( qbidx[i] >> offset0 ) + 4 )], offset0 ) ); /* Q0 */
2807 : }
2808 :
2809 0 : IF( GT_16( min_bits, bitsmode1 ) )
2810 : {
2811 0 : min_bits_pos = offset0; /* Q0 */
2812 0 : move16();
2813 0 : min_bits = bitsmode1; /* Q0 */
2814 0 : move16();
2815 : }
2816 : }
2817 :
2818 0 : bitsmode1 = min_bits; /* Q0 */
2819 0 : move16();
2820 0 : lsbdepth1 = min_bits_pos; /* Q0 */
2821 0 : move16();
2822 :
2823 0 : FOR( i = 0; i < BANDS; ++i )
2824 : {
2825 0 : LSB1[i] = s_and( qbidx[i], sub( shl( 1, lsbdepth1 ), 1 ) );
2826 0 : tdifidx1[i] = shr( qbidx[i], lsbdepth1 );
2827 0 : move16();
2828 0 : move16();
2829 : }
2830 : }
2831 :
2832 : /* Preparing lossless coding input */
2833 0 : IF( flag_pack == 0 )
2834 : {
2835 : /* estimating # of bits */
2836 : /* Encoding MSB bits */
2837 0 : IF( LT_16( bitsmode0, bitsmode1 ) )
2838 : {
2839 0 : bits = bitsmode0; /* Q0 */
2840 0 : move16();
2841 0 : *hLCmode0 = 0;
2842 0 : move16();
2843 : }
2844 : ELSE
2845 : {
2846 0 : bits = bitsmode1; /* Q0 */
2847 0 : move16();
2848 0 : *hLCmode0 = 1;
2849 0 : move16();
2850 : }
2851 : }
2852 : ELSE
2853 : {
2854 : /* Encoding MSB bits */
2855 0 : IF( *hLCmode0 == 0 )
2856 : {
2857 0 : push_indice( hBstr, IND_HQ2_DENG_8SMODE, 0, BITS_DE_8SMODE );
2858 0 : bits = BITS_DE_8SMODE;
2859 0 : move16();
2860 0 : IF( cnt_outlyer0 == 0 )
2861 : {
2862 0 : push_indice( hBstr, IND_HQ2_DENG_8SMODE_N0, 0, BITS_DE_8SMODE_N0 );
2863 0 : bits = add( bits, BITS_DE_8SMODE_N0 );
2864 0 : IF( EQ_16( cnt_outlyer, 1 ) )
2865 : {
2866 : /* 01 */
2867 0 : push_indice( hBstr, IND_HQ2_DENG_8SMODE_N1, 1, BITS_DE_8SMODE_N1 );
2868 0 : bits = add( bits, BITS_DE_8SMODE_N1 ); /* Q0 */
2869 0 : push_indice( hBstr, IND_HQ2_DENG_8SPOS, pos_outlyer, BITS_DE_8SPOS );
2870 0 : bits = add( bits, BITS_DE_8SPOS );
2871 0 : push_indice( hBstr, IND_HQ2_DIFF_ENERGY, qbidx[pos_outlyer] + ABS_ENG_OFFSET, BITS_ABS_ENG );
2872 0 : bits = add( bits, BITS_ABS_ENG );
2873 : }
2874 : ELSE
2875 : {
2876 : /* 00 */
2877 0 : push_indice( hBstr, IND_HQ2_DENG_8SMODE_N1, 0, BITS_DE_8SMODE_N1 );
2878 0 : bits = add( bits, BITS_DE_8SMODE_N1 ); /* Q0 */
2879 : }
2880 :
2881 0 : FOR( i = 0; i < pos_outlyer; ++i )
2882 : {
2883 0 : push_indice( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx0[i] + 4], hessize[tdifidx0[i] + 4] );
2884 0 : bitsmode0 = add( bitsmode0, hessize[tdifidx0[i] + 4] ); /* Q0 */
2885 : }
2886 :
2887 0 : FOR( i = ( pos_outlyer + 1 ); i < BANDS; ++i )
2888 : {
2889 0 : push_indice( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx0[i] + 4], hessize[tdifidx0[i] + 4] );
2890 0 : bitsmode0 = add( bitsmode0, hessize[tdifidx0[i] + 4] ); /* Q0 */
2891 : }
2892 : }
2893 0 : ELSE IF( EQ_16( cnt_outlyer0, 1 ) )
2894 : {
2895 0 : push_indice( hBstr, IND_HQ2_DENG_8SMODE_N0, 1, BITS_DE_8SMODE_N0 );
2896 0 : bits = add( bits, BITS_DE_8SMODE_N0 ); /* Q0 */
2897 0 : IF( EQ_16( cnt_outlyer, 1 ) )
2898 : {
2899 0 : push_indice( hBstr, IND_HQ2_DENG_8SMODE_N1, 1, BITS_DE_8SMODE_N1 );
2900 0 : bits = add( bits, BITS_DE_8SMODE_N1 ); /* Q0 */
2901 0 : push_indice( hBstr, IND_HQ2_DENG_8SPOS, pos_outlyer, BITS_DE_8SPOS );
2902 0 : bits = add( bits, BITS_DE_8SPOS );
2903 0 : push_indice( hBstr, IND_HQ2_DIFF_ENERGY, qbidx[0] + ABS_ENG_OFFSET, BITS_ABS_ENG );
2904 0 : bits = add( bits, BITS_ABS_ENG );
2905 0 : push_indice( hBstr, IND_HQ2_DIFF_ENERGY, qbidx[pos_outlyer] + ABS_ENG_OFFSET, BITS_ABS_ENG );
2906 0 : bits = add( bits, BITS_ABS_ENG );
2907 : }
2908 : ELSE
2909 : {
2910 0 : push_indice( hBstr, IND_HQ2_DENG_8SMODE_N1, 0, BITS_DE_8SMODE_N1 );
2911 0 : bits = add( bits, BITS_DE_8SMODE_N1 ); /* Q0 */
2912 0 : push_indice( hBstr, IND_HQ2_DIFF_ENERGY, qbidx[0] + ABS_ENG_OFFSET, BITS_ABS_ENG );
2913 0 : bits = add( bits, BITS_ABS_ENG ); /* Q0 */
2914 : }
2915 :
2916 0 : FOR( i = 1; i < pos_outlyer; ++i )
2917 : {
2918 0 : push_indice( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx0[i] + 4], hessize[tdifidx0[i] + 4] );
2919 0 : bits = add( bits, hessize[tdifidx0[i] + 4] ); /* Q0 */
2920 : }
2921 :
2922 0 : FOR( i = pos_outlyer + 1; i < BANDS; ++i )
2923 : {
2924 0 : push_indice( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx0[i] + 4], hessize[tdifidx0[i] + 4] );
2925 0 : bits = add( bits, hessize[tdifidx0[i] + 4] ); /* Q0 */
2926 : }
2927 : }
2928 : }
2929 : ELSE
2930 : {
2931 0 : bits = add( BITS_DE_8SMODE, BITS_MAX_DEPTH );
2932 0 : push_indice( hBstr, IND_HQ2_DENG_8SMODE, 1, BITS_DE_8SMODE );
2933 0 : push_indice( hBstr, IND_HQ2_DENG_8SDEPTH, lsbdepth1, BITS_MAX_DEPTH );
2934 :
2935 0 : FOR( i = 0; i < BANDS; ++i )
2936 : {
2937 0 : push_indice( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx1[i] + 4], hessize[tdifidx1[i] + 4] );
2938 0 : bits = add( bits, hessize[tdifidx1[i] + 4] ); /* Q0 */
2939 : }
2940 :
2941 0 : IF( lsbdepth1 > 0 )
2942 : {
2943 0 : FOR( i = 0; i < BANDS; ++i )
2944 : {
2945 0 : push_indice( hBstr, IND_HQ2_DIFF_ENERGY, LSB1[i], lsbdepth1 );
2946 : }
2947 : /*bits += BANDS * lsbdepth1; */
2948 0 : bits = add( bits, extract_h( L_shl( L_mult( BANDS, lsbdepth1 ), 15 ) ) ); /* Q0 */
2949 : }
2950 : }
2951 : }
2952 :
2953 0 : return bits; /* xx bits for diff. energies + 1 bit for LC coding mode Q0*/
2954 : }
2955 :
2956 : /*-------------------------------------------------------------------*
2957 : * band_energy_quant()
2958 : *
2959 : *
2960 : *-------------------------------------------------------------------*/
2961 :
2962 39 : static Word16 band_energy_quant_fx(
2963 : BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */
2964 : const Word32 *L_t_audio, /* i : Q12 : input MDCT signal (Qs) */
2965 : const Word16 band_start[], /* i : Q0 : band start table */
2966 : const Word16 band_end[], /* i : Q0 : band end table */
2967 : Word32 L_band_energy[], /* i : Q14 : band energy (Qbe) */
2968 : const Word16 bands_fx, /* i : Q0 : number of bands */
2969 : const Word32 L_qint, /* i : Q29 */
2970 : const Word16 eref_fx, /* i : Q10 */
2971 : const Word16 is_transient_fx /* i : Q0 : indicator for HQ_TRANSIENT */
2972 : )
2973 : {
2974 : Word16 i, k;
2975 : Word16 ebits;
2976 : Word16 hLCmode0, hLCmode1, deng_bits;
2977 39 : Word16 deng_cmode = 0;
2978 : Word16 hbits;
2979 39 : move16();
2980 :
2981 : Word32 L_E;
2982 : Word16 QE;
2983 :
2984 : Word16 rev_qint_fx; /* 1/qint */
2985 : Word16 Qrev_qint; /* Q value for 1/qint */
2986 :
2987 : Word16 bq0_fx;
2988 : Word16 bq1_fx[BANDS_MAX];
2989 : Word16 bq2_fx[BANDS_MAX];
2990 :
2991 : Word16 bq1_temp_fx[BANDS_MAX];
2992 : Word16 bq2_temp_fx[BANDS_MAX];
2993 :
2994 : Word32 L_tmp;
2995 : Word16 temp_fx;
2996 : Word16 frac, exp;
2997 : Word16 exp_safe;
2998 : Word16 exp_norm;
2999 : Word16 exp_norm2;
3000 : Word16 exp_normd;
3001 :
3002 : /* Calculate the band energies */
3003 39 : exp_safe = 4;
3004 39 : move16(); /* 4: never overflow happen at L_E */
3005 907 : FOR( k = 0; k < bands_fx; k++ )
3006 : {
3007 868 : L_tmp = L_deposit_l( 1295 ); /* 1295 = sqrt(0.1) (Qs) */
3008 23020 : FOR( i = band_start[k]; i <= band_end[k]; i++ )
3009 : {
3010 22152 : L_tmp = L_or( L_tmp, L_abs( L_t_audio[i] ) ); /* Qs */
3011 : }
3012 868 : exp_norm = norm_l( L_tmp );
3013 868 : exp_norm = sub( exp_norm, exp_safe ); /* safe_shift */
3014 :
3015 868 : QE = add( shl( sub( add( SWB_BWE_LR_Qs, exp_norm ), 16 ), 1 ), 1 );
3016 868 : L_E = L_shl( 590L, sub( QE, 15 ) ); /* 590 0.018f(Q15 -> QE) */
3017 23020 : FOR( i = band_start[k]; i <= band_end[k]; i++ )
3018 : {
3019 : /*E += yos[i] * yos[i]; */
3020 22152 : temp_fx = round_fx( L_shl( L_t_audio[i], exp_norm ) ); /* Qs+exp_norm-16 */
3021 22152 : L_E = L_mac( L_E, temp_fx, temp_fx ); /* (Qs+exp_norm-16)*2+1 */
3022 : }
3023 :
3024 : /*band_energy[k] = (float) log2_f (E + 1.0e-1f); */
3025 868 : exp_norm2 = norm_l( L_E );
3026 868 : exp = add( add( shl( sub( add( SWB_BWE_LR_Qs, exp_norm ), 16 ), 1 ), 1 ), exp_norm2 );
3027 868 : L_E = L_shl( L_E, exp_norm2 ); /* (Qs+exp_norm-16)*2 + 1 + exp_norm2 */
3028 868 : frac = Log2_norm_lc( L_E );
3029 868 : exp = sub( 30, exp );
3030 868 : L_tmp = L_Comp( exp, frac );
3031 868 : L_band_energy[k] = L_shr( L_tmp, 2 ); /* Q16->Qbe(Q14) */
3032 868 : move32();
3033 : }
3034 :
3035 39 : IF( is_transient_fx )
3036 : {
3037 1 : reverse_transient_frame_energies_fx( L_band_energy, bands_fx );
3038 : }
3039 :
3040 :
3041 : /* Quantize the reference and band energies */
3042 39 : exp_normd = norm_l( L_qint );
3043 39 : rev_qint_fx = div_s( 0x4000, round_fx( L_shl( L_qint, exp_normd ) ) ); /* Q14-(29+exp_normd-16)+15 */
3044 39 : Qrev_qint = sub( 14 - ( 29 - 16 ) + 15, exp_normd );
3045 :
3046 39 : bq0_fx = round_fx( L_shl( L_mult( eref_fx, rev_qint_fx ), sub( 5, Qrev_qint ) ) ); /* 16-(10+Qrev_qint+1) */
3047 907 : FOR( k = 0; k < bands_fx; k++ )
3048 : {
3049 : /*bq1[k] = round_f (band_energy[k] / qint); */
3050 868 : L_tmp = Mpy_32_16_1( L_band_energy[k], rev_qint_fx ); /* Q14+Qrev_qint-15 */
3051 868 : bq1_fx[k] = round_fx( L_shl( L_tmp, sub( 17, Qrev_qint ) ) ); /* Q0 */
3052 868 : move16();
3053 : }
3054 :
3055 39 : IF( is_transient_fx )
3056 : {
3057 :
3058 1 : Copy( bq1_fx, bq1_temp_fx, bands_fx ); /* Q0 */
3059 :
3060 : /* Calculate the differential energies */
3061 1 : diffcod_lrmdct_fx( bands_fx, bq0_fx, bq1_temp_fx, bq2_temp_fx, is_transient_fx );
3062 : }
3063 :
3064 : /* Calculate the differential energies */
3065 39 : bq2_fx[0] = sub( bq1_fx[0], bq0_fx ); /* Q0 */
3066 39 : move16();
3067 868 : FOR( k = 1; k < bands_fx; k++ )
3068 : {
3069 829 : bq2_fx[k] = sub( bq1_fx[k], bq1_fx[k - 1] ); /* Q0 */
3070 829 : move16();
3071 : }
3072 :
3073 : /* Modifying qbidx to be located in the range -256~255 */
3074 907 : FOR( i = 0; i < bands_fx; ++i )
3075 : {
3076 868 : IF( GT_16( bq2_fx[i], MAXIMUM_ENERGY_LOWBRATE ) )
3077 : {
3078 0 : bq2_fx[i] = MAXIMUM_ENERGY_LOWBRATE; /* Q0 */
3079 0 : move16();
3080 : }
3081 868 : IF( LT_16( bq2_fx[i], MINIMUM_ENERGY_LOWBRATE ) )
3082 : {
3083 0 : bq2_fx[i] = MINIMUM_ENERGY_LOWBRATE; /* Q0 */
3084 0 : move16();
3085 : }
3086 : }
3087 :
3088 : /* Get number of bits by Huffman0 coding */
3089 39 : ebits = large_symbol_enc_fx( hBstr, bq2_fx, bands_fx, &hLCmode0, 0 ); /* Q0 */
3090 :
3091 39 : IF( is_transient_fx )
3092 : {
3093 : /* Get number of bits by Huffman coding */
3094 1 : hbits = small_symbol_enc_tran_fx( hBstr, bq2_temp_fx, bands_fx, &hLCmode1, 0, is_transient_fx ); /* Q0 */
3095 : }
3096 : ELSE
3097 : {
3098 : /* Get number of bits by Huffman coding */
3099 38 : hbits = small_symbol_enc_fx( hBstr, bq2_fx, bands_fx, &hLCmode1, 0, is_transient_fx ); /* Q0 */
3100 : }
3101 :
3102 : /* comparing used bits */
3103 39 : test();
3104 39 : IF( LT_16( ebits, hbits ) || EQ_16( hbits, -1 ) )
3105 : {
3106 0 : deng_cmode = 0;
3107 0 : move16();
3108 0 : push_indice( hBstr, IND_HQ2_DENG_MODE, deng_cmode, BITS_DE_CMODE );
3109 0 : large_symbol_enc_fx( hBstr, bq2_fx, bands_fx, &hLCmode0, 1 );
3110 0 : deng_bits = add( ebits, BITS_DE_CMODE ); /* Q0 */
3111 : }
3112 : ELSE
3113 : {
3114 : /* setting energy difference coding mode and storing it */
3115 39 : deng_cmode = 1;
3116 39 : move16();
3117 39 : push_indice( hBstr, IND_HQ2_DENG_MODE, deng_cmode, BITS_DE_CMODE );
3118 :
3119 39 : deng_bits = add( hbits, BITS_DE_CMODE ); /* Q0 */
3120 :
3121 : /* packing indice */
3122 39 : IF( is_transient_fx )
3123 : {
3124 1 : Copy( bq2_temp_fx, bq2_fx, bands_fx ); /* Q0 */
3125 1 : small_symbol_enc_tran_fx( hBstr, bq2_fx, bands_fx, &hLCmode1, 1, is_transient_fx );
3126 : }
3127 : ELSE
3128 : {
3129 38 : small_symbol_enc_fx( hBstr, bq2_fx, bands_fx, &hLCmode1, 1, is_transient_fx );
3130 : }
3131 : }
3132 :
3133 : /* Reconstruct quantized spectrum */
3134 39 : bq1_fx[0] = add( bq2_fx[0], bq0_fx ); /* Q0 */
3135 39 : move16();
3136 868 : FOR( k = 1; k < bands_fx; k++ )
3137 : {
3138 829 : bq1_fx[k] = add( bq2_fx[k], bq1_fx[k - 1] ); /* Q0 */
3139 829 : move16();
3140 : }
3141 :
3142 907 : FOR( k = 0; k < bands_fx; k++ )
3143 : {
3144 868 : L_band_energy[k] = Mpy_32_16_1( L_qint, bq1_fx[k] ); /* 29+0-15 -> Qbe(Q14) */
3145 868 : move32();
3146 : }
3147 :
3148 39 : IF( is_transient_fx )
3149 : {
3150 1 : reverse_transient_frame_energies_fx( L_band_energy, bands_fx );
3151 : }
3152 :
3153 39 : return ( deng_bits ); /* Q0 */
3154 : }
3155 :
3156 :
3157 0 : static Word16 band_energy_quant_ivas_fx(
3158 : BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */
3159 : const Word32 *L_t_audio, /* i : Q12 : input MDCT signal (Qs) */
3160 : const Word16 band_start[], /* i : Q0 : band start table */
3161 : const Word16 band_end[], /* i : Q0 : band end table */
3162 : Word32 L_band_energy[], /* i : Q14 : band energy (Qbe) */
3163 : const Word16 bands, /* i : Q0 : number of bands */
3164 : const Word32 L_qint, /* i : Q29 */
3165 : const Word16 eref_fx, /* i : Q10 */
3166 : const Word16 is_transient /* i : Q0 : indicator for HQ_TRANSIENT */
3167 : )
3168 : {
3169 : Word16 i, k;
3170 : Word16 ebits;
3171 : Word16 hLCmode0, hLCmode1, deng_bits;
3172 0 : Word16 deng_cmode = 0;
3173 0 : move16();
3174 : Word16 hbits;
3175 : Word32 L_E;
3176 : Word16 QE;
3177 :
3178 : Word16 rev_qint_fx; /* 1/qint */
3179 : Word16 Qrev_qint; /* Q value for 1/qint */
3180 :
3181 : Word16 bq0_fx;
3182 : Word16 bq1_fx[BANDS_MAX];
3183 : Word16 bq2_fx[BANDS_MAX];
3184 :
3185 : Word16 bq1_temp_fx[BANDS_MAX];
3186 : Word16 bq2_temp_fx[BANDS_MAX];
3187 :
3188 : Word32 L_tmp;
3189 : Word16 temp_fx;
3190 : Word16 frac, exp;
3191 : Word16 exp_safe;
3192 : Word16 exp_norm;
3193 : Word16 exp_norm2;
3194 :
3195 : Word16 exp_normd;
3196 : /* Calculate the band energies */
3197 : /* Calculate the band energies */
3198 0 : exp_safe = 4;
3199 0 : move16(); /* 4: never overflow happen at L_E */
3200 0 : FOR( k = 0; k < bands; k++ )
3201 : {
3202 0 : L_tmp = L_deposit_l( 1295 ); /* 1295 = sqrt(0.1) (Qs) */
3203 0 : FOR( i = band_start[k]; i <= band_end[k]; i++ )
3204 : {
3205 0 : L_tmp = L_or( L_tmp, L_abs( L_t_audio[i] ) ); /* Qs */
3206 : }
3207 0 : exp_norm = norm_l( L_tmp );
3208 0 : exp_norm = sub( exp_norm, exp_safe ); /* safe_shift */
3209 :
3210 0 : QE = add( shl( sub( add( SWB_BWE_LR_Qs, exp_norm ), 16 ), 1 ), 1 );
3211 0 : L_E = L_shl( 590L, sub( QE, 15 ) ); /* 590 0.018f(Q15 -> QE) */
3212 0 : FOR( i = band_start[k]; i <= band_end[k]; i++ )
3213 : {
3214 : /*E += yos[i] * yos[i]; */
3215 0 : temp_fx = round_fx( L_shl( L_t_audio[i], exp_norm ) ); /* Qs+exp_norm-16 */
3216 0 : L_E = L_mac( L_E, temp_fx, temp_fx ); /* (Qs+exp_norm-16)*2+1 */
3217 : }
3218 :
3219 : /*band_energy[k] = (float) log2_f (E + 1.0e-1f); */
3220 0 : exp_norm2 = norm_l( L_E );
3221 0 : exp = add( add( shl( sub( add( SWB_BWE_LR_Qs, exp_norm ), 16 ), 1 ), 1 ), exp_norm2 );
3222 0 : L_E = L_shl( L_E, exp_norm2 ); /* (Qs+exp_norm-16)*2 + 1 + exp_norm2 */
3223 0 : frac = Log2_norm_lc( L_E );
3224 0 : exp = sub( 30, exp );
3225 0 : L_tmp = L_Comp( exp, frac );
3226 0 : L_band_energy[k] = L_shr( L_tmp, 2 ); /* Q16->Qbe(Q14) */
3227 0 : move32();
3228 : }
3229 :
3230 0 : IF( is_transient )
3231 : {
3232 0 : reverse_transient_frame_energies_fx( L_band_energy, bands );
3233 : }
3234 :
3235 : #define WMC_TOOL_SKIP
3236 0 : exp_normd = norm_l( L_qint );
3237 0 : rev_qint_fx = div_s( 0x4000, round_fx( L_shl( L_qint, exp_normd ) ) ); /* Q14-(29+exp_normd-16)+15 */
3238 0 : Qrev_qint = sub( 14 - ( 29 - 16 ) + 15, exp_normd );
3239 :
3240 0 : bq0_fx = round_fx( L_shl( L_mult( eref_fx, rev_qint_fx ), sub( 5, Qrev_qint ) ) ); /* 16-(10+Qrev_qint+1) */
3241 0 : FOR( k = 0; k < bands; k++ )
3242 : {
3243 : /*bq1[k] = round_f (band_energy[k] / qint); */
3244 0 : L_tmp = L_mls( L_band_energy[k], rev_qint_fx ); /* Q14+Qrev_qint-15 */
3245 0 : bq1_fx[k] = round_fx( L_shl( L_tmp, sub( 17, Qrev_qint ) ) ); /* Q0 */
3246 0 : move16();
3247 : }
3248 : #undef WMC_TOOL_SKIP
3249 :
3250 0 : IF( is_transient )
3251 : {
3252 :
3253 0 : Copy( bq1_fx, bq1_temp_fx, bands ); /* Q0 */
3254 :
3255 : /* Calculate the differential energies */
3256 0 : diffcod_lrmdct_fx( bands, bq0_fx, bq1_temp_fx, bq2_temp_fx, is_transient ); /* Q0 */
3257 : }
3258 :
3259 : /* Calculate the differential energies */
3260 0 : bq2_fx[0] = sub( bq1_fx[0], bq0_fx ); /* Q0 */
3261 0 : move16();
3262 0 : FOR( k = 1; k < bands; k++ )
3263 : {
3264 0 : bq2_fx[k] = sub( bq1_fx[k], bq1_fx[k - 1] ); /* Q0 */
3265 0 : move16();
3266 : }
3267 :
3268 :
3269 : /* Modifying qbidx to be located in the range -256~255 */
3270 0 : FOR( i = 0; i < bands; ++i )
3271 : {
3272 0 : IF( GT_16( bq2_fx[i], MAXIMUM_ENERGY_LOWBRATE ) )
3273 : {
3274 0 : bq2_fx[i] = MAXIMUM_ENERGY_LOWBRATE; /* Q0 */
3275 0 : move16();
3276 : }
3277 0 : IF( LT_16( bq2_fx[i], MINIMUM_ENERGY_LOWBRATE ) )
3278 : {
3279 0 : bq2_fx[i] = MINIMUM_ENERGY_LOWBRATE; /* Q0 */
3280 0 : move16();
3281 : }
3282 : }
3283 :
3284 : /* Get number of bits by Huffman0 coding */
3285 0 : ebits = large_symbol_enc_ivas_fx( hBstr, bq2_fx, bands, &hLCmode0, 0 ); /* Q0 */
3286 :
3287 0 : IF( is_transient )
3288 : {
3289 : /* Get number of bits by Huffman coding */
3290 0 : hbits = small_symbol_enc_tran_ivas_fx( hBstr, bq2_temp_fx, bands, &hLCmode1, 0, is_transient ); /* Q0 */
3291 : }
3292 : ELSE
3293 : {
3294 : /* Get number of bits by Huffman coding */
3295 0 : hbits = small_symbol_enc_ivas_fx( hBstr, bq2_fx, bands, &hLCmode1, 0, is_transient ); /* Q0 */
3296 : }
3297 :
3298 0 : test();
3299 0 : IF( LT_16( ebits, hbits ) || EQ_16( hbits, -1 ) )
3300 : {
3301 0 : deng_cmode = 0;
3302 0 : move16();
3303 0 : push_indice( hBstr, IND_HQ2_DENG_MODE, deng_cmode, BITS_DE_CMODE );
3304 0 : large_symbol_enc_ivas_fx( hBstr, bq2_fx, bands, &hLCmode0, 1 );
3305 0 : deng_bits = add( ebits, BITS_DE_CMODE ); /* Q0 */
3306 : }
3307 : ELSE
3308 : {
3309 : /* setting energy difference coding mode and storing it */
3310 0 : deng_cmode = 1;
3311 0 : move16();
3312 0 : push_indice( hBstr, IND_HQ2_DENG_MODE, deng_cmode, BITS_DE_CMODE );
3313 :
3314 0 : deng_bits = add( hbits, BITS_DE_CMODE ); /* Q0 */
3315 :
3316 : /* packing indice */
3317 0 : IF( is_transient )
3318 : {
3319 0 : Copy( bq2_temp_fx, bq2_fx, bands ); /* Q0 */
3320 0 : small_symbol_enc_tran_ivas_fx( hBstr, bq2_fx, bands, &hLCmode1, 1, is_transient );
3321 : }
3322 : ELSE
3323 : {
3324 0 : small_symbol_enc_ivas_fx( hBstr, bq2_fx, bands, &hLCmode1, 1, is_transient );
3325 : }
3326 : }
3327 :
3328 : /* Reconstruct quantized spectrum */
3329 0 : bq1_fx[0] = add( bq2_fx[0], bq0_fx ); /* Q0 */
3330 0 : move16();
3331 0 : FOR( k = 1; k < bands; k++ )
3332 : {
3333 0 : bq1_fx[k] = add( bq2_fx[k], bq1_fx[k - 1] ); /* Q0 */
3334 0 : move16();
3335 : }
3336 :
3337 0 : FOR( k = 0; k < bands; k++ )
3338 : {
3339 : #define WMC_TOOL_SKIP
3340 0 : L_band_energy[k] = L_mls( L_qint, (Word16) bq1_fx[k] ); /* 29+0-15 -> Qbe(Q14) */
3341 0 : move32();
3342 : #undef WMC_TOOL_SKIP
3343 : }
3344 :
3345 0 : IF( is_transient )
3346 : {
3347 0 : reverse_transient_frame_energies_fx( L_band_energy, bands );
3348 : }
3349 :
3350 0 : return ( deng_bits ); /* Q0 */
3351 : }
3352 :
3353 :
3354 : /*-------------------------------------------------------------------*
3355 : * p2a_threshold_quant()
3356 : *
3357 : *
3358 : *-------------------------------------------------------------------*/
3359 :
3360 39 : static Word16 p2a_threshold_quant_fx(
3361 : BSTR_ENC_HANDLE hBstr, /* i/o: : bit stream */
3362 : const Word32 *L_t_audio, /* i : Q12 : input spectrum */
3363 : const Word16 band_start[], /* i : Q0 : table of start freq for every subband */
3364 : const Word16 band_end[], /* i : Q0 : table of end freq for every subband */
3365 : const Word16 band_width[], /* i : Q0 : table of bandwidth for every subband */
3366 : const Word16 bands, /* i : Q0 : number of subbands */
3367 : const Word16 p2a_bands, /* i : Q0 : tonality indicator */
3368 : const Word16 p2a_th_fx, /* i : Q11 : threshold tonal or not */
3369 : Word16 *p2a_flags_fx /* i/o: Q0 : tonality flag */
3370 : )
3371 : {
3372 : Word16 i, j, k;
3373 : Word32 L_a, L_p, L_e;
3374 : Word16 Qa;
3375 : Word32 L_tmp;
3376 : Word16 temp_fx;
3377 : Word16 exp_norm;
3378 : Word16 exp_safe;
3379 : Word16 exp_normn, exp_normd;
3380 :
3381 : Word16 norm_a_fx, Qnorm_a;
3382 : Word16 pa_fx, Qpa;
3383 :
3384 : Word16 exp, frac;
3385 :
3386 : Word32 L_p2a;
3387 : Word16 p2a_fx;
3388 :
3389 39 : exp_safe = 4; /* never happen overflow. */
3390 39 : move16();
3391 :
3392 39 : set16_fx( p2a_flags_fx, 1, bands );
3393 39 : move16();
3394 :
3395 39 : j = 0;
3396 39 : move16();
3397 229 : FOR( k = ( bands - p2a_bands ); k < bands; k++ )
3398 : {
3399 190 : L_a = L_deposit_l( 0 );
3400 190 : L_p = L_deposit_l( 0 );
3401 :
3402 190 : L_tmp = L_deposit_l( 0 );
3403 13642 : FOR( i = band_start[k]; i <= band_end[k]; i++ )
3404 : {
3405 13452 : L_tmp = L_or( L_tmp, L_abs( L_t_audio[i] ) ); /* Q12 */
3406 : }
3407 190 : exp_norm = norm_l( L_tmp );
3408 190 : exp_norm = sub( exp_norm, exp_safe );
3409 :
3410 13642 : FOR( i = band_start[k]; i <= band_end[k]; i++ )
3411 : {
3412 13452 : temp_fx = round_fx( L_shl( L_t_audio[i], exp_norm ) ); /* Q12+exp_norm-16 -> exp_norm-4 */
3413 13452 : L_e = L_mult( temp_fx, temp_fx ); /* 2*(exp_norm-4)+1 */
3414 :
3415 13452 : IF( GT_32( L_e, L_p ) )
3416 : {
3417 974 : L_p = L_add( L_e, 0 );
3418 : }
3419 13452 : L_a = L_add( L_a, L_e );
3420 : }
3421 190 : Qa = sub( shl( exp_norm, 1 ), 7 ); /* (exp_norm-4)*2+1 */
3422 :
3423 190 : IF( L_a > 0x0L )
3424 : {
3425 : /* a /= band_width[k]; */
3426 190 : exp_normn = norm_l( L_a );
3427 190 : exp_normn = sub( exp_normn, 1 );
3428 190 : exp_normd = norm_s( band_width[k] );
3429 190 : norm_a_fx = div_l( L_shl( L_a, exp_normn ), shl( band_width[k], exp_normd ) ); /* (Qa+exp_normn)-exp_normd-1); */
3430 190 : Qnorm_a = sub( sub( add( Qa, exp_normn ), exp_normd ), 1 );
3431 :
3432 : /*p2a = 10.0f * (float) log10 (p / a); */
3433 190 : p2a_fx = 0;
3434 190 : move16();
3435 190 : IF( norm_a_fx > 0 )
3436 : {
3437 190 : exp_normn = norm_l( L_p );
3438 190 : exp_normn = sub( exp_normn, 1 );
3439 190 : exp_normd = norm_s( norm_a_fx );
3440 190 : pa_fx = div_l( L_shl( L_p, exp_normn ), shl( norm_a_fx, exp_normd ) ); /* Qpa + exp_normn + Qnorm_a + exp_normd - 1 */
3441 190 : Qpa = sub( sub( add( Qa, exp_normn ), add( Qnorm_a, exp_normd ) ), 1 );
3442 :
3443 190 : L_tmp = L_deposit_h( pa_fx );
3444 190 : Qpa = add( Qpa, 16 );
3445 190 : exp = norm_l( L_tmp );
3446 190 : frac = Log2_norm_lc( L_shl( L_tmp, exp ) );
3447 190 : exp = sub( 30, exp );
3448 190 : exp = sub( exp, Qpa );
3449 190 : L_tmp = L_Comp( exp, frac );
3450 :
3451 : /* 10/( log(10)/log(2) ) = 3.01029995663981195211 24660(Q13) */
3452 190 : L_p2a = Mpy_32_16_1( L_tmp, 24660 ); /* 16+13-15 -> Q14 */
3453 :
3454 190 : p2a_fx = round_fx_sat( L_shl_sat( L_p2a, 13 ) ); /* 27 -16 -> 11 */
3455 : }
3456 :
3457 190 : IF( LE_16( p2a_fx, p2a_th_fx ) )
3458 : {
3459 177 : p2a_flags_fx[k] = 0;
3460 177 : move16();
3461 : }
3462 : }
3463 : ELSE
3464 : {
3465 0 : p2a_flags_fx[k] = 0;
3466 0 : move16();
3467 : }
3468 :
3469 190 : push_indice( hBstr, IND_HQ2_P2A_FLAGS, p2a_flags_fx[k], 1 );
3470 190 : j = add( j, 1 );
3471 : }
3472 :
3473 39 : return ( j ); /* Q0 */
3474 : }
3475 :
3476 0 : static Word16 p2a_threshold_quant_ivas_fx(
3477 : BSTR_ENC_HANDLE hBstr, /* i/o: : bit stream */
3478 : const Word32 *L_t_audio, /* i : Q12 : input spectrum */
3479 : const Word16 band_start[], /* i : Q0 : table of start freq for every subband */
3480 : const Word16 band_end[], /* i : Q0 : table of end freq for every subband */
3481 : const Word16 band_width[], /* i : Q0 : table of bandwidth for every subband */
3482 : const Word16 bands, /* i : Q0 : number of subbands */
3483 : const Word16 p2a_bands, /* i : Q0 : tonality indicator */
3484 : const Word16 p2a_th_fx, /* i : Q11 : threshold tonal or not */
3485 : Word16 *p2a_flags_fx /* i/o: Q0 : tonality flag */
3486 : )
3487 : {
3488 : Word16 i, j, k;
3489 : Word32 L_a, L_p, L_e;
3490 : Word16 Qa;
3491 : Word32 L_tmp;
3492 : Word16 temp_fx;
3493 : Word16 exp_norm;
3494 : Word16 exp_safe;
3495 : Word16 exp_normn, exp_normd;
3496 :
3497 : Word16 norm_a_fx, Qnorm_a;
3498 : Word16 pa_fx, Qpa;
3499 :
3500 : Word16 exp, frac;
3501 :
3502 : Word32 L_p2a;
3503 : Word16 p2a_fx;
3504 :
3505 0 : exp_safe = 4; /* never happen overflow. */
3506 0 : move16();
3507 :
3508 0 : set16_fx( p2a_flags_fx, 1, bands );
3509 :
3510 0 : j = 0;
3511 0 : move16();
3512 0 : FOR( k = ( bands - p2a_bands ); k < bands; k++ )
3513 : {
3514 0 : L_a = L_deposit_l( 0 );
3515 0 : L_p = L_deposit_l( 0 );
3516 :
3517 0 : L_tmp = L_deposit_l( 0 );
3518 0 : FOR( i = band_start[k]; i <= band_end[k]; i++ )
3519 : {
3520 0 : L_tmp = L_or( L_tmp, L_abs( L_t_audio[i] ) ); /* Q12 */
3521 : }
3522 0 : exp_norm = norm_l( L_tmp );
3523 0 : exp_norm = sub( exp_norm, exp_safe );
3524 :
3525 0 : FOR( i = band_start[k]; i <= band_end[k]; i++ )
3526 : {
3527 0 : temp_fx = round_fx( L_shl( L_t_audio[i], exp_norm ) ); /* Q12+exp_norm-16 -> exp_norm-4 */
3528 0 : L_e = L_mult( temp_fx, temp_fx ); /* (exp_norm-4)*2 + 1 */
3529 :
3530 0 : IF( GT_32( L_e, L_p ) )
3531 : {
3532 0 : L_p = L_add( L_e, 0 );
3533 : }
3534 0 : L_a = L_add( L_a, L_e );
3535 : }
3536 0 : Qa = sub( shl( exp_norm, 1 ), 7 ); /* (exp_norm-4)*2+1 */
3537 :
3538 0 : IF( L_a > 0x0L )
3539 : {
3540 : /* a /= band_width[k]; */
3541 0 : exp_normn = norm_l( L_a );
3542 0 : exp_normn = sub( exp_normn, 1 );
3543 0 : exp_normd = norm_s( band_width[k] );
3544 0 : norm_a_fx = div_l( L_shl( L_a, exp_normn ), shl( band_width[k], exp_normd ) ); /* (Qa+exp_normn)-exp_normd-1); */
3545 0 : Qnorm_a = sub( sub( add( Qa, exp_normn ), exp_normd ), 1 );
3546 :
3547 : /*p2a = 10.0f * (float) log10 (p / a); */
3548 0 : p2a_fx = 0;
3549 0 : move16();
3550 0 : IF( norm_a_fx > 0 )
3551 : {
3552 0 : exp_normn = norm_l( L_p );
3553 0 : exp_normn = sub( exp_normn, 1 );
3554 0 : exp_normd = norm_s( norm_a_fx );
3555 0 : pa_fx = div_l( L_shl( L_p, exp_normn ), shl( norm_a_fx, exp_normd ) ); /* Qpa + exp_normn + Qnorm_a + exp_normd - 1 */
3556 0 : Qpa = sub( sub( add( Qa, exp_normn ), add( Qnorm_a, exp_normd ) ), 1 );
3557 :
3558 0 : L_tmp = L_deposit_h( pa_fx );
3559 0 : Qpa = add( Qpa, 16 );
3560 0 : exp = norm_l( L_tmp );
3561 0 : frac = Log2_norm_lc( L_shl( L_tmp, exp ) );
3562 0 : exp = sub( 30, exp );
3563 0 : exp = sub( exp, Qpa );
3564 0 : L_tmp = L_Comp( exp, frac );
3565 :
3566 : /* 10/( log(10)/log(2) ) = 3.01029995663981195211 24660(Q13) */
3567 0 : L_p2a = Mpy_32_16_1( L_tmp, 24660 ); /* 16+13-15 -> Q14 */
3568 :
3569 0 : p2a_fx = round_fx_sat( L_shl_sat( L_p2a, 13 ) ); /* 27 -16 -> 11 */
3570 : }
3571 :
3572 0 : IF( LE_16( p2a_fx, p2a_th_fx ) )
3573 : {
3574 0 : p2a_flags_fx[k] = 0;
3575 0 : move16();
3576 : }
3577 : }
3578 : ELSE
3579 : {
3580 0 : p2a_flags_fx[k] = 0;
3581 0 : move16();
3582 : }
3583 :
3584 0 : push_indice( hBstr, IND_HQ2_P2A_FLAGS, p2a_flags_fx[k], 1 );
3585 0 : j = add( j, 1 );
3586 : }
3587 :
3588 0 : return ( j ); /* Q0 */
3589 : }
3590 :
3591 :
3592 : /*-------------------------------------------------------------------*
3593 : * mdct_spectrum_fine_gain_enc()
3594 : *
3595 : *
3596 : *-------------------------------------------------------------------*/
3597 :
3598 39 : static void mdct_spectrum_fine_gain_enc_fx(
3599 : Encoder_State *st_fx, /* i/o: encoder state structure */
3600 : const Word32 L_ybuf[], /* i : Q12 : input spectrum */
3601 : Word32 L_y2[], /* i/o: Q12 : decoded spectrum */
3602 : const Word16 band_start[], /* i : Q0 : table of start freq for every subband */
3603 : const Word16 band_end[], /* i : Q0 : table of end freq for every subband */
3604 : const Word16 k_sort[], /* i : Q0 : sort table by band_energy */
3605 : const Word16 bands, /* i : Q0 : nubmber of subbands */
3606 : const Word32 L_qint, /* i : Q29 : */
3607 : const Word16 Ngq, /* i : Q0 : */
3608 : const Word16 gqlevs, /* i : Q0 : quantized level */
3609 : const Word16 gqbits /* i : Q0 : quantized bits */
3610 : )
3611 : {
3612 : Word16 i, k;
3613 :
3614 : Word16 delta_fx, Qdelta;
3615 : Word32 L_delta;
3616 : Word32 L_q;
3617 :
3618 : Word16 gain_table_fx[MAX_GQLEVS];
3619 : Word16 Qgt;
3620 : Word16 gamma_fx;
3621 : Word16 Qgamma;
3622 :
3623 : Word16 exp_safe;
3624 : Word16 exp_normn, exp_normd;
3625 : Word16 exp_norm;
3626 :
3627 : Word32 L_temp;
3628 : Word16 temp_lo_fx, temp_hi_fx, temp_fx, temp2_fx;
3629 :
3630 : Word32 L_Eyy, L_Exy;
3631 : /*Word16 QE; */
3632 :
3633 : Word16 d_fx;
3634 : Word16 dmin_fx;
3635 : Word16 imin_fx;
3636 :
3637 : /* Fine gain quantization on only the most significant energy bands */
3638 :
3639 : /*delta = qint / gqlevs; */
3640 39 : exp_normn = norm_l( L_qint );
3641 39 : exp_normn = sub( exp_normn, 1 );
3642 39 : exp_normd = norm_s( gqlevs );
3643 39 : delta_fx = div_l( L_shl( L_qint, exp_normn ), shl( gqlevs, exp_normd ) ); /* 29+exp_normn-(exp_normd)-1; */
3644 39 : Qdelta = add( sub( exp_normn, exp_normd ), 28 );
3645 39 : L_delta = L_shl( L_deposit_h( delta_fx ), sub( 13, Qdelta ) ); /* Q29 */
3646 : /*q = (-qint + delta) / 2.0f; */
3647 39 : L_q = L_shr( L_sub( L_delta, L_qint ), 1 ); /* Q29 */
3648 :
3649 117 : FOR( i = 0; i < gqlevs; i++ )
3650 : {
3651 : /*gain_table[i] = (float) pow (2.0f, q * 0.5f); */
3652 78 : L_temp = L_shr( L_shr( L_q, 1 ), sub( 29, 16 ) ); /* Q16 */
3653 78 : temp_lo_fx = L_Extract_lc( L_temp, &temp_hi_fx );
3654 78 : Qgt = sub( 14, temp_hi_fx );
3655 78 : gain_table_fx[i] = extract_l( Pow2( 14, temp_lo_fx ) ); /* Qgt */
3656 78 : move16();
3657 :
3658 : /*q += delta; */
3659 78 : L_q = L_add( L_q, L_delta );
3660 78 : gain_table_fx[i] = shl( gain_table_fx[i], sub( 14, Qgt ) ); /* Qgt -> Q14 */
3661 78 : move16();
3662 : }
3663 :
3664 195 : FOR( k = sub( bands, Ngq ); k < bands; k++ )
3665 : {
3666 : /*Eyy = 0.0f; */
3667 : /*Exy = 0.0f; */
3668 : /*for (i = band_start[k_sort[k]]; i <= band_end[k_sort[k]]; i++) */
3669 : /*{ */
3670 : /* Eyy += y2[i] * y2[i]; */
3671 : /* Exy += ybuf[i] * y2[i]; */
3672 : /*} */
3673 156 : exp_safe = 4;
3674 156 : move16(); /* 4 is too large. but never happen overflow */
3675 156 : L_temp = L_deposit_l( 0 );
3676 2986 : FOR( i = band_start[k_sort[k]]; i <= band_end[k_sort[k]]; i++ )
3677 : {
3678 2830 : L_temp = L_or( L_temp, L_abs( L_y2[i] ) ); /* Q12 */
3679 2830 : L_temp = L_or( L_temp, L_abs( L_ybuf[i] ) ); /* Q12 */
3680 : }
3681 156 : exp_norm = norm_l( L_temp );
3682 156 : exp_norm = sub( exp_norm, exp_safe ); /* safe_shift */
3683 :
3684 156 : L_Eyy = L_deposit_l( 0 );
3685 156 : L_Exy = L_deposit_l( 0 );
3686 : /*QE = add(shl(add(Qs-16, exp_norm), 1), 1); //(Qs+exp_norm-16)*2+1; */
3687 2986 : FOR( i = band_start[k_sort[k]]; i <= band_end[k_sort[k]]; i++ )
3688 : {
3689 : /*Eyy += y2[i] * y2[i]; */
3690 2830 : temp_fx = round_fx( L_shl( L_y2[i], exp_norm ) ); /* Q12 + exp_norm - 16 */
3691 2830 : L_Eyy = L_mac( L_Eyy, temp_fx, temp_fx ); /* (Q12 + exp_norm - 16)*2 + 1 */
3692 :
3693 : /*Exy += ybuf[i] * y2[i]; */
3694 2830 : temp2_fx = round_fx( L_shl( L_ybuf[i], exp_norm ) ); /* Q12 + exp_norm - 16 */
3695 2830 : L_Exy = L_mac( L_Exy, temp2_fx, temp_fx ); /* (Q12 + exp_norm - 16)*2 + 1 */
3696 : }
3697 :
3698 156 : test();
3699 156 : IF( L_Eyy > 0x0L && L_Exy > 0x0L )
3700 : {
3701 : /*gamma = Exy / Eyy; */
3702 156 : exp_normn = norm_l( L_Exy );
3703 156 : exp_normn = sub( exp_normn, 1 );
3704 156 : exp_normd = norm_l( L_Eyy );
3705 156 : gamma_fx = div_l( L_shl( L_Exy, exp_normn ), round_fx_sat( L_shl( L_Eyy, exp_normd ) ) ); /* Qgamma */
3706 156 : Qgamma = add( sub( exp_normn, exp_normd ), 15 ); /* exp_normn - (exp_normd-16) - 1; */
3707 156 : gamma_fx = shl( gamma_fx, sub( 14, Qgamma ) ); /* Qgamma -> Q14 */
3708 :
3709 156 : dmin_fx = 32767;
3710 156 : move16();
3711 156 : imin_fx = -1;
3712 156 : move16();
3713 468 : FOR( i = 0; i < gqlevs; i++ )
3714 : {
3715 312 : d_fx = abs_s( sub( gamma_fx, gain_table_fx[i] ) ); /* Q14 */
3716 312 : IF( LT_16( d_fx, dmin_fx ) )
3717 : {
3718 194 : dmin_fx = d_fx; /* Q14 */
3719 194 : move16();
3720 194 : imin_fx = i;
3721 194 : move16();
3722 : }
3723 : }
3724 :
3725 156 : gamma_fx = gain_table_fx[imin_fx]; /* Q14 */
3726 156 : move16();
3727 :
3728 2986 : FOR( i = band_start[k_sort[k]]; i <= band_end[k_sort[k]]; i++ )
3729 : {
3730 : /*y2[i] *= gamma; */
3731 : /* This IF statement for keeping same mantissa evenif y2 is plus or minus */
3732 2830 : IF( L_y2[i] >= 0x0 )
3733 : {
3734 2609 : L_y2[i] = L_shl( Mpy_32_16_1( L_y2[i], gamma_fx ), 1 ); /* Q12 */
3735 2609 : move32();
3736 : }
3737 : ELSE
3738 : {
3739 221 : L_y2[i] = L_negate( L_shl( Mpy_32_16_1( L_abs( L_y2[i] ), gamma_fx ), 1 ) ); /* Q12 */
3740 221 : move32();
3741 : }
3742 : }
3743 : }
3744 : ELSE
3745 : {
3746 0 : imin_fx = 0;
3747 0 : move16();
3748 : }
3749 :
3750 156 : push_indice( st_fx->hBstr, IND_HQ2_SUBBAND_GAIN, imin_fx, gqbits );
3751 : }
3752 :
3753 39 : return;
3754 : }
3755 :
3756 0 : static void mdct_spectrum_fine_gain_enc_ivas_fx(
3757 : Encoder_State *st_fx, /* i/o: encoder state structure */
3758 : const Word32 L_ybuf[], /* i : Q12 : input spectrum */
3759 : Word32 L_y2[], /* i/o: Q12 : decoded spectrum */
3760 : const Word16 band_start[], /* i : Q0 : table of start freq for every subband */
3761 : const Word16 band_end[], /* i : Q0 : table of end freq for every subband */
3762 : const Word16 k_sort[], /* i : Q0 : sort table by band_energy */
3763 : const Word16 bands, /* i : Q0 : nubmber of subbands */
3764 : const Word32 L_qint, /* i : Q29 : */
3765 : const Word16 Ngq, /* i : Q0 : */
3766 : const Word16 gqlevs, /* i : Q0 : quantized level */
3767 : const Word16 gqbits /* i : Q0 : quantized bits */
3768 : )
3769 : {
3770 : Word16 i, k;
3771 :
3772 : Word16 delta_fx, Qdelta;
3773 : Word32 L_delta;
3774 : Word32 L_q;
3775 :
3776 : Word16 gain_table_fx[MAX_GQLEVS];
3777 : Word16 Qgt;
3778 : Word16 gamma_fx;
3779 : Word16 Qgamma;
3780 :
3781 : Word16 exp_safe;
3782 : Word16 exp_normn, exp_normd;
3783 : Word16 exp_norm;
3784 :
3785 : Word32 L_temp;
3786 : Word16 temp_lo_fx, temp_hi_fx, temp_fx, temp2_fx;
3787 :
3788 : Word32 L_Eyy, L_Exy;
3789 : /*Word16 QE; */
3790 :
3791 : Word16 d_fx;
3792 : Word16 dmin_fx;
3793 : Word16 imin_fx;
3794 :
3795 : /* Fine gain quantization on only the most significant energy bands */
3796 :
3797 : /*delta = qint / gqlevs; */
3798 0 : exp_normn = norm_l( L_qint );
3799 0 : exp_normn = sub( exp_normn, 1 );
3800 0 : exp_normd = norm_s( gqlevs );
3801 0 : delta_fx = div_l( L_shl( L_qint, exp_normn ), shl( gqlevs, exp_normd ) );
3802 0 : Qdelta = add( sub( exp_normn, exp_normd ), 28 ); /* 29+exp_normn-(exp_normd)-1; */
3803 0 : L_delta = L_shl( L_deposit_h( delta_fx ), sub( 13, Qdelta ) ); /* Q29 */
3804 : /*q = (-qint + delta) / 2.0f; */
3805 0 : L_q = L_shr( L_sub( L_delta, L_qint ), 1 ); /* Q29 */
3806 :
3807 0 : FOR( i = 0; i < gqlevs; i++ )
3808 : {
3809 : /*gain_table[i] = (float) pow (2.0f, q * 0.5f); */
3810 0 : L_temp = L_shr( L_shr( L_q, 1 ), sub( 29, 16 ) ); /* Q16 */
3811 0 : temp_lo_fx = L_Extract_lc( L_temp, &temp_hi_fx );
3812 0 : Qgt = sub( 14, temp_hi_fx );
3813 0 : gain_table_fx[i] = extract_l( Pow2( 14, temp_lo_fx ) ); /* Qgt */
3814 0 : move16();
3815 :
3816 : /*q += delta; */
3817 0 : L_q = L_add( L_q, L_delta );
3818 0 : gain_table_fx[i] = shl( gain_table_fx[i], sub( 14, Qgt ) ); /* Qgt -> Q14 */
3819 0 : move16();
3820 : }
3821 :
3822 0 : FOR( k = sub( bands, Ngq ); k < bands; k++ )
3823 : {
3824 : /*Eyy = 0.0f; */
3825 : /*Exy = 0.0f; */
3826 : /*for (i = band_start[k_sort[k]]; i <= band_end[k_sort[k]]; i++) */
3827 : /*{ */
3828 : /* Eyy += y2[i] * y2[i]; */
3829 : /* Exy += ybuf[i] * y2[i]; */
3830 : /*} */
3831 0 : exp_safe = 4;
3832 0 : move16(); /* 4 is too large. but never happen overflow */
3833 0 : L_temp = L_deposit_l( 0 );
3834 0 : FOR( i = band_start[k_sort[k]]; i <= band_end[k_sort[k]]; i++ )
3835 : {
3836 0 : L_temp = L_or( L_temp, L_abs( L_y2[i] ) ); /* Q12 */
3837 0 : L_temp = L_or( L_temp, L_abs( L_ybuf[i] ) ); /* Q12 */
3838 : }
3839 0 : exp_norm = norm_l( L_temp );
3840 0 : exp_norm = sub( exp_norm, exp_safe ); /* safe_shift */
3841 :
3842 0 : L_Eyy = L_deposit_l( 0 );
3843 0 : L_Exy = L_deposit_l( 0 );
3844 : /*QE = add(shl(add(Qs-16, exp_norm), 1), 1); //(Qs+exp_norm-16)*2+1; */
3845 0 : FOR( i = band_start[k_sort[k]]; i <= band_end[k_sort[k]]; i++ )
3846 : {
3847 : /*Eyy += y2[i] * y2[i]; */
3848 0 : temp_fx = round_fx( L_shl( L_y2[i], exp_norm ) ); /* Q12 + exp_norm - 16 */
3849 0 : L_Eyy = L_mac( L_Eyy, temp_fx, temp_fx ); /* (Q12 + exp_norm - 16)*2 + 1 */
3850 :
3851 : /*Exy += ybuf[i] * y2[i]; */
3852 0 : temp2_fx = round_fx( L_shl( L_ybuf[i], exp_norm ) ); /* Q12 + exp_norm - 16 */
3853 0 : L_Exy = L_mac( L_Exy, temp2_fx, temp_fx ); /* (Q12 + exp_norm - 16)*2 + 1 */
3854 : }
3855 :
3856 0 : test();
3857 0 : IF( L_Eyy > 0x0L && L_Exy > 0x0L )
3858 : {
3859 : /*gamma = Exy / Eyy; */
3860 0 : exp_normn = norm_l( L_Exy );
3861 0 : exp_normn = sub( exp_normn, 1 );
3862 0 : exp_normd = norm_l( L_Eyy );
3863 0 : gamma_fx = div_l( L_shl( L_Exy, exp_normn ), round_fx_sat( L_shl( L_Eyy, exp_normd ) ) ); /* Qgamma */
3864 0 : Qgamma = add( sub( exp_normn, exp_normd ), 15 ); /* exp_normn - (exp_normd-16) - 1; */
3865 0 : gamma_fx = shl( gamma_fx, sub( 14, Qgamma ) ); /* Qgamma -> Q14 */
3866 :
3867 0 : dmin_fx = 32767;
3868 0 : move16();
3869 0 : imin_fx = -1;
3870 0 : move16();
3871 0 : FOR( i = 0; i < gqlevs; i++ )
3872 : {
3873 0 : d_fx = abs_s( sub( gamma_fx, gain_table_fx[i] ) ); /* Q14 */
3874 0 : IF( LT_16( d_fx, dmin_fx ) )
3875 : {
3876 0 : dmin_fx = d_fx; /* Q14 */
3877 0 : move16();
3878 0 : imin_fx = i; /* Q0 */
3879 0 : move16();
3880 : }
3881 : }
3882 :
3883 0 : gamma_fx = gain_table_fx[imin_fx]; /* Q14 */
3884 0 : move16();
3885 :
3886 0 : FOR( i = band_start[k_sort[k]]; i <= band_end[k_sort[k]]; i++ )
3887 : {
3888 : /*y2[i] *= gamma; */
3889 : /* This IF statement for keeping same mantissa evenif y2 is plus or minus */
3890 0 : IF( L_y2[i] >= 0x0 )
3891 : {
3892 0 : L_y2[i] = L_shl( Mpy_32_16_1( L_y2[i], gamma_fx ), 1 ); /* Q12 */
3893 0 : move32();
3894 : }
3895 : ELSE
3896 : {
3897 0 : L_y2[i] = L_negate( L_shl( Mpy_32_16_1( L_abs( L_y2[i] ), gamma_fx ), 1 ) ); /* Q12 */
3898 0 : move32();
3899 : }
3900 : }
3901 : }
3902 : ELSE
3903 : {
3904 0 : imin_fx = 0;
3905 0 : move16();
3906 : }
3907 :
3908 0 : push_indice( st_fx->hBstr, IND_HQ2_SUBBAND_GAIN, imin_fx, gqbits );
3909 : }
3910 :
3911 0 : return;
3912 : }
|