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