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