Line data Source code
1 : /******************************************************************************************************
2 :
3 : (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
4 : Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
5 : Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
6 : Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
7 : contributors to this repository. All Rights Reserved.
8 :
9 : This software is protected by copyright law and by international treaties.
10 : The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
11 : Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
12 : Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
13 : Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
14 : contributors to this repository retain full ownership rights in their respective contributions in
15 : the software. This notice grants no license of any kind, including but not limited to patent
16 : license, nor is any license granted by implication, estoppel or otherwise.
17 :
18 : Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
19 : contributions.
20 :
21 : This software is provided "AS IS", without any express or implied warranties. The software is in the
22 : development stage. It is intended exclusively for experts who have experience with such software and
23 : solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
24 : and fitness for a particular purpose are hereby disclaimed and excluded.
25 :
26 : Any dispute, controversy or claim arising under or in relation to providing this software shall be
27 : submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
28 : accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
29 : the United Nations Convention on Contracts on the International Sales of Goods.
30 :
31 : *******************************************************************************************************/
32 :
33 : #include <assert.h>
34 : #include <stdint.h>
35 : #include "options.h"
36 : #include <math.h>
37 : #include "ivas_cnst.h"
38 : #include "ivas_rom_com.h"
39 : #include "prot_fx.h"
40 : #include "cnst.h"
41 : #include "wmc_auto.h"
42 : #include "ivas_prot_fx.h"
43 : #include "ivas_rom_com_fx.h"
44 :
45 : /*-----------------------------------------------------------------------*
46 : * Local function prototypes
47 : *-----------------------------------------------------------------------*/
48 :
49 :
50 : static UWord16 deindex_sph_idx_general_fx( const Word16 idx_sph, const Word16 no_bits, Word32 *theta_dec_fx, Word32 *phi_dec_fx, UWord16 *p_id_phi, const MC_LS_SETUP mc_format );
51 :
52 : /*-------------------------------------------------------------------------
53 : * ivas_get_hodirac_flag()
54 : *
55 : * Return flag for HO-DirAC method at high bitrates
56 : *------------------------------------------------------------------------*/
57 :
58 : /*! r: HO-DirAC flag */
59 1005208 : Word16 ivas_get_hodirac_flag_fx(
60 : const Word32 ivas_total_brate, /* i : IVAS total bitrate */
61 : const Word16 sba_order /* i : Ambisonic (SBA) order */
62 : )
63 : {
64 1005208 : test();
65 1005208 : IF( GT_16( sba_order, 1 ) && GT_32( ivas_total_brate, IVAS_256k ) )
66 : {
67 144029 : return 1;
68 : }
69 : ELSE
70 : {
71 861179 : return 0;
72 : }
73 : }
74 : /*-------------------------------------------------------------------------
75 : * ivas_dirac_sba_config()
76 : *
77 : * DirAC Configuration function; used also in MASA decoder
78 : *------------------------------------------------------------------------*/
79 6104 : ivas_error ivas_dirac_config_fx(
80 : void *st_ivas, /* i/o: IVAS encoder/decoder state structure */
81 : const Word16 enc_dec /* i : encoder or decoder flag */
82 : )
83 : {
84 : IVAS_FORMAT ivas_format;
85 : Word16 sba_order;
86 : Word16 *element_mode;
87 : Word32 ivas_total_brate;
88 : DIRAC_CONFIG_DATA_HANDLE hConfig;
89 : IVAS_QMETADATA_HANDLE hQMetaData;
90 : Word32 Fs;
91 : Word16 *band_grouping;
92 : ivas_error error;
93 : Word16 spar_dirac_split_band;
94 : IVAS_FB_MIXER_HANDLE hFbMdft;
95 : Word16 *dirac_to_spar_md_bands;
96 :
97 6104 : error = IVAS_ERR_OK;
98 6104 : move32();
99 :
100 6104 : IF( enc_dec == ENC )
101 : {
102 1861 : ivas_format = ( (Encoder_Struct *) st_ivas )->hEncoderConfig->ivas_format;
103 1861 : move32();
104 1861 : element_mode = &( (Encoder_Struct *) st_ivas )->hEncoderConfig->element_mode_init;
105 1861 : sba_order = ( (Encoder_Struct *) st_ivas )->sba_analysis_order;
106 1861 : move16();
107 1861 : ivas_total_brate = ( (Encoder_Struct *) st_ivas )->hEncoderConfig->ivas_total_brate;
108 1861 : move32();
109 1861 : Fs = ( (Encoder_Struct *) st_ivas )->hEncoderConfig->input_Fs;
110 1861 : move32();
111 1861 : band_grouping = ( (Encoder_Struct *) st_ivas )->hDirAC->band_grouping;
112 1861 : hConfig = ( (Encoder_Struct *) st_ivas )->hDirAC->hConfig;
113 1861 : hQMetaData = ( (Encoder_Struct *) st_ivas )->hQMetaData;
114 1861 : IF( ( (Encoder_Struct *) st_ivas )->hSpar != NULL )
115 : {
116 1861 : hFbMdft = ( (Encoder_Struct *) st_ivas )->hSpar->hFbMixer;
117 1861 : dirac_to_spar_md_bands = ( (Encoder_Struct *) st_ivas )->hSpar->dirac_to_spar_md_bands;
118 : }
119 : ELSE
120 : {
121 0 : hFbMdft = NULL;
122 0 : dirac_to_spar_md_bands = NULL;
123 : }
124 : }
125 : ELSE
126 : {
127 4243 : ivas_format = ( (Decoder_Struct *) st_ivas )->ivas_format;
128 4243 : element_mode = &( (Decoder_Struct *) st_ivas )->element_mode_init;
129 4243 : sba_order = ( (Decoder_Struct *) st_ivas )->sba_analysis_order;
130 4243 : move16();
131 4243 : ivas_total_brate = ( (Decoder_Struct *) st_ivas )->hDecoderConfig->ivas_total_brate;
132 4243 : move32();
133 4243 : Fs = ( (Decoder_Struct *) st_ivas )->hDecoderConfig->output_Fs;
134 4243 : move32();
135 4243 : band_grouping = ( (Decoder_Struct *) st_ivas )->hDirAC->band_grouping;
136 4243 : hConfig = ( (Decoder_Struct *) st_ivas )->hDirAC->hConfig;
137 4243 : hQMetaData = ( (Decoder_Struct *) st_ivas )->hQMetaData;
138 4243 : IF( ( (Decoder_Struct *) st_ivas )->hSpar != NULL )
139 : {
140 1140 : hFbMdft = ( (Decoder_Struct *) st_ivas )->hSpar->hFbMixer;
141 1140 : dirac_to_spar_md_bands = ( (Decoder_Struct *) st_ivas )->hSpar->dirac_to_spar_md_bands;
142 : }
143 : ELSE
144 : {
145 3103 : hFbMdft = NULL;
146 3103 : dirac_to_spar_md_bands = NULL;
147 : }
148 4243 : ( (Decoder_Struct *) st_ivas )->hDirAC->hFbMdft = hFbMdft;
149 : }
150 :
151 6104 : test();
152 6104 : IF( EQ_32( ivas_format, SBA_FORMAT ) || EQ_32( ivas_format, SBA_ISM_FORMAT ) )
153 : {
154 3001 : hConfig->nbands = IVAS_MAX_NUM_BANDS;
155 3001 : move16();
156 :
157 3001 : spar_dirac_split_band = s_min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND );
158 :
159 3001 : IF( ivas_get_hodirac_flag_fx( ivas_total_brate, sba_order ) ) // add call after merge of 100861_dirac_dec
160 : {
161 312 : spar_dirac_split_band = 0;
162 312 : move16();
163 : }
164 : }
165 : ELSE
166 : {
167 3103 : hConfig->nbands = 5;
168 3103 : spar_dirac_split_band = 0;
169 :
170 3103 : move16();
171 3103 : move16();
172 : }
173 6104 : hConfig->enc_param_start_band = 0;
174 6104 : hConfig->dec_param_estim = FALSE;
175 :
176 6104 : move16();
177 6104 : move16();
178 :
179 6104 : test();
180 6104 : IF( EQ_32( ivas_format, SBA_FORMAT ) || EQ_32( ivas_format, SBA_ISM_FORMAT ) ) /* skip for MASA decoder */
181 : {
182 3001 : IF( NE_32( ( error = ivas_dirac_sba_config_fx( hQMetaData, element_mode, ivas_total_brate, sba_order, sub( hConfig->nbands, spar_dirac_split_band ),
183 : ivas_format ) ),
184 : IVAS_ERR_OK ) )
185 : {
186 0 : return error;
187 : }
188 :
189 3001 : IF( hQMetaData != NULL )
190 : {
191 3001 : if ( enc_dec == ENC )
192 : {
193 1861 : hConfig->nbands = hQMetaData->q_direction[0].cfg.nbands;
194 1861 : move16();
195 : }
196 3001 : hConfig->enc_param_start_band = add( hQMetaData->q_direction[0].cfg.start_band, spar_dirac_split_band );
197 3001 : move16();
198 : }
199 :
200 3001 : hConfig->dec_param_estim = TRUE;
201 3001 : move16();
202 3001 : if ( EQ_16( hConfig->dec_param_estim, TRUE ) )
203 : {
204 3001 : hConfig->enc_param_start_band = spar_dirac_split_band;
205 3001 : move16();
206 : }
207 :
208 3001 : IF( ivas_get_hodirac_flag_fx( ivas_total_brate, sba_order ) )
209 : {
210 312 : hConfig->dec_param_estim = FALSE;
211 312 : hConfig->enc_param_start_band = 0;
212 :
213 312 : move16();
214 312 : move16();
215 :
216 312 : set8_fx( (Word8 *) hQMetaData->twoDirBands, (Word8) 1, hQMetaData->q_direction[0].cfg.nbands );
217 312 : hQMetaData->numTwoDirBands = (UWord8) hQMetaData->q_direction[0].cfg.nbands;
218 312 : move16();
219 : }
220 : }
221 :
222 6104 : test();
223 6104 : IF( EQ_32( ivas_format, SBA_FORMAT ) || EQ_32( ivas_format, SBA_ISM_FORMAT ) )
224 : {
225 : // 100861_dirac_dec
226 3001 : ivas_dirac_config_bands_fx( band_grouping, IVAS_MAX_NUM_BANDS, (Word16) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), dirac_to_spar_md_bands, hQMetaData->useLowerBandRes, hConfig->enc_param_start_band, hFbMdft );
227 : }
228 : ELSE
229 : {
230 3103 : ivas_dirac_config_bands_fx( band_grouping, hConfig->nbands, (Word16) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), NULL, 0, 0, hFbMdft );
231 : }
232 :
233 6104 : return error;
234 : }
235 :
236 :
237 : /*-------------------------------------------------------------------------
238 : * ivas_dirac_sba_config_bands()
239 : *
240 : * DirAC Configuration freq. band function; used also in MASA decoder
241 : *------------------------------------------------------------------------*/
242 :
243 101847 : void ivas_dirac_config_bands_fx(
244 : Word16 *band_grouping, /* o : band grouping */
245 : const Word16 nbands, /* i : number of bands */
246 : const Word16 max_band, /* i : maximal band index +1 */
247 : Word16 *dirac_to_spar_md_bands,
248 : const Word8 useLowerBandRes,
249 : const Word16 enc_param_start_band,
250 : IVAS_FB_MIXER_HANDLE hFbMdft )
251 : {
252 : Word16 i;
253 : {
254 101847 : IF( EQ_16( nbands, 5 ) )
255 : {
256 4245 : Copy( DirAC_band_grouping_5, band_grouping, 5 + 1 );
257 : }
258 97602 : ELSE IF( EQ_16( nbands, 6 ) )
259 : {
260 0 : Copy( DirAC_band_grouping_6, band_grouping, 6 + 1 );
261 : }
262 97602 : ELSE IF( EQ_16( nbands, 12 ) )
263 : {
264 : Word16 band;
265 1268826 : FOR( band = 0; band < DIRAC_MAX_NBANDS; band++ )
266 : {
267 1171224 : dirac_to_spar_md_bands[band] = band;
268 1171224 : move16();
269 : }
270 97602 : IF( hFbMdft != NULL )
271 : {
272 : Word16 sb, idx1, idx2, b;
273 :
274 96978 : idx1 = -1;
275 96978 : move16();
276 96978 : sb = 0;
277 96978 : move16();
278 4876178 : FOR( b = 0; b < max_band; b++ )
279 : {
280 4779200 : idx2 = hFbMdft->pFb->fb_bin_to_band.p_cldfb_map_to_spar_band[b];
281 4779200 : move16();
282 4779200 : IF( GT_16( idx2, idx1 ) )
283 : {
284 1111762 : band_grouping[sb++] = b;
285 1111762 : move16();
286 1111762 : idx1 = idx2;
287 1111762 : move16();
288 : }
289 : }
290 96978 : band_grouping[sb] = max_band;
291 96978 : move16();
292 :
293 : /* set the remaining bands to max_band to avoid problems for the DirAC parameter estimation with bw < FB */
294 245930 : FOR( b = sb; b <= nbands; b++ )
295 : {
296 148952 : band_grouping[b] = max_band;
297 148952 : move16();
298 : }
299 : }
300 : ELSE
301 : {
302 624 : Copy( DirAC_band_grouping_12, band_grouping, 12 + 1 );
303 : }
304 :
305 97602 : IF( useLowerBandRes )
306 : {
307 9140 : Word16 step = DIRAC_LOW_BANDRES_STEP;
308 9140 : move16();
309 : Word16 reduced_band;
310 27420 : FOR( ( band = enc_param_start_band + 2, reduced_band = enc_param_start_band + 1 ); band <= DIRAC_MAX_NBANDS; ( band += step, reduced_band++ ) )
311 : {
312 18280 : band_grouping[reduced_band] = band_grouping[band];
313 18280 : move16();
314 : }
315 27420 : FOR( ; reduced_band <= DIRAC_MAX_NBANDS; reduced_band++ )
316 : {
317 18280 : band_grouping[reduced_band] = max_band;
318 18280 : move16();
319 : }
320 27420 : FOR( ( band = enc_param_start_band + ( DIRAC_MAX_NBANDS - enc_param_start_band ) / 2 - 1, reduced_band = DIRAC_MAX_NBANDS - 1 ); band >= enc_param_start_band; ( band--, reduced_band -= step ) )
321 : {
322 18280 : dirac_to_spar_md_bands[reduced_band] = dirac_to_spar_md_bands[band];
323 18280 : move16();
324 18280 : dirac_to_spar_md_bands[reduced_band - 1] = dirac_to_spar_md_bands[band];
325 18280 : move16();
326 : }
327 : }
328 : ELSE
329 : {
330 : /* always code the last two fb bands together */
331 88462 : band_grouping[DIRAC_MAX_NBANDS - 1] = max_band;
332 88462 : move16();
333 88462 : dirac_to_spar_md_bands[DIRAC_MAX_NBANDS - 1] = sub( DIRAC_MAX_NBANDS, 2 );
334 88462 : move16();
335 : }
336 : }
337 : ELSE
338 : {
339 0 : assert( 0 && "nbands must be 5 or 6!" );
340 : }
341 : }
342 :
343 : /* Limit the band range to band max */
344 1396143 : FOR( i = 0; i < nbands + 1; i++ )
345 : {
346 1294296 : IF( GT_16( band_grouping[i], max_band ) )
347 : {
348 1003 : band_grouping[i] = max_band;
349 1003 : move16();
350 : }
351 : }
352 :
353 101847 : return;
354 : }
355 : /*-------------------------------------------------------------------*
356 : * ivas_get_dirac_sba_max_md_bits()
357 : *
358 : * Return maximum SBA DirAC metadata bit-budget and nominal bit-budget
359 : *-------------------------------------------------------------------*/
360 :
361 4765 : void ivas_get_dirac_sba_max_md_bits_fx(
362 : const Word32 sba_total_brate,
363 : Word16 *bits_frame_nominal,
364 : Word16 *metadata_max_bits,
365 : Word16 *qmetadata_max_bit_req,
366 : const Word16 nbands,
367 : IVAS_FORMAT ivas_format )
368 : {
369 4765 : IF( LE_32( sba_total_brate, IVAS_13k2 ) )
370 : {
371 435 : *bits_frame_nominal = ACELP_9k60 / FRAMES_PER_SEC;
372 435 : *metadata_max_bits = 70;
373 :
374 435 : move16();
375 435 : move16();
376 : }
377 4330 : ELSE IF( LE_32( sba_total_brate, IVAS_16k4 ) )
378 : {
379 514 : *bits_frame_nominal = ACELP_13k20 / FRAMES_PER_SEC;
380 514 : *metadata_max_bits = 80;
381 :
382 514 : move16();
383 514 : move16();
384 : }
385 3816 : ELSE IF( LE_32( sba_total_brate, IVAS_24k4 ) )
386 : {
387 371 : *bits_frame_nominal = ACELP_16k40 / FRAMES_PER_SEC;
388 371 : *metadata_max_bits = 103;
389 :
390 371 : move16();
391 371 : move16();
392 : /* OSBA needs an additional 2-bits safety margin to avoid acelp crashes */
393 371 : IF( EQ_32( ivas_format, SBA_ISM_FORMAT ) )
394 : {
395 119 : ( *metadata_max_bits ) = sub( ( *metadata_max_bits ), 3 );
396 119 : move16();
397 : }
398 : }
399 3445 : ELSE IF( LE_32( sba_total_brate, IVAS_32k ) )
400 : {
401 394 : *bits_frame_nominal = ACELP_32k / FRAMES_PER_SEC;
402 394 : *metadata_max_bits = 214;
403 :
404 394 : move16();
405 394 : move16();
406 : }
407 3051 : ELSE IF( LE_32( sba_total_brate, IVAS_48k ) )
408 : {
409 219 : *bits_frame_nominal = IVAS_48k / FRAMES_PER_SEC;
410 219 : *metadata_max_bits = 240;
411 :
412 219 : move16();
413 219 : move16();
414 : }
415 2832 : ELSE IF( LE_32( sba_total_brate, IVAS_64k ) )
416 : {
417 334 : *bits_frame_nominal = IVAS_64k / FRAMES_PER_SEC;
418 334 : *metadata_max_bits = 200;
419 :
420 334 : move16();
421 334 : move16();
422 : }
423 2498 : ELSE IF( LE_32( sba_total_brate, IVAS_80k ) )
424 : {
425 402 : *bits_frame_nominal = IVAS_80k / FRAMES_PER_SEC;
426 402 : *metadata_max_bits = 200;
427 :
428 402 : move16();
429 402 : move16();
430 : }
431 2096 : ELSE IF( LE_32( sba_total_brate, IVAS_96k ) )
432 : {
433 353 : *bits_frame_nominal = IVAS_96k / FRAMES_PER_SEC;
434 353 : *metadata_max_bits = 200;
435 :
436 353 : move16();
437 353 : move16();
438 : }
439 1743 : ELSE IF( LE_32( sba_total_brate, IVAS_128k ) )
440 : {
441 290 : *bits_frame_nominal = IVAS_128k / FRAMES_PER_SEC;
442 290 : *metadata_max_bits = 250;
443 :
444 290 : move16();
445 290 : move16();
446 : }
447 : ELSE
448 : {
449 : /* *bits_frame_nominal = (int16_t) ( sba_total_brate / FRAMES_PER_SEC ); */
450 1453 : *bits_frame_nominal = extract_l( Mpy_32_32( sba_total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) );
451 1453 : move16();
452 1453 : *metadata_max_bits = MAX16B; /* no limit */
453 1453 : move16();
454 : }
455 4765 : Word32 var1 = L_mult0( *metadata_max_bits, nbands );
456 4765 : Word16 exp = 0;
457 4765 : Word16 var2 = BASOP_Util_Divide3232_Scale( var1, 5, &exp );
458 4765 : Word32 var2_32 = L_deposit_h( var2 );
459 4765 : Word32 var4 = var2_32;
460 :
461 4765 : move16();
462 4765 : move32();
463 :
464 4765 : Word16 exp_res = 0;
465 4765 : move16();
466 4765 : IF( var1 % 5 != 0 )
467 : {
468 2099 : var4 = BASOP_Util_Add_Mant32Exp( var2_32, exp, ONE_IN_Q30, 1, &exp_res );
469 2099 : exp = exp_res;
470 2099 : move16();
471 : }
472 4765 : Word16 flag = BASOP_Util_Cmp_Mant32Exp( MAX16B, 31, var4, exp );
473 : Word32 tmp;
474 4765 : IF( EQ_16( flag, 1 ) )
475 : {
476 4281 : tmp = var4;
477 4281 : move32();
478 : }
479 : ELSE
480 : {
481 484 : tmp = MAX16B;
482 484 : exp = 31;
483 :
484 484 : move32();
485 484 : move16();
486 : }
487 4765 : *metadata_max_bits = (Word16) L_shr( tmp, 31 - exp );
488 4765 : *qmetadata_max_bit_req = QMETADATA_MAXBIT_REQ_SBA >> 1;
489 :
490 4765 : move16();
491 4765 : move16();
492 :
493 4765 : return;
494 : }
495 :
496 : /*-------------------------------------------------------------------------
497 : * ivas_dirac_sba_config()
498 : *
499 : * DirAC Configuration function for SBA
500 : *------------------------------------------------------------------------*/
501 4765 : ivas_error ivas_dirac_sba_config_fx(
502 : IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */
503 : Word16 *element_mode, /* i/o: element mode of the core coder */
504 : Word32 sba_total_brate, /* i : SBA total bitrate */
505 : const Word16 sba_order, /* i : Ambisonic (SBA) order */
506 : const Word16 nbands /* i : number of frequency bands */
507 : ,
508 : IVAS_FORMAT ivas_format )
509 : {
510 : Word16 nbands_coded;
511 : Word16 hodirac_flag;
512 : ivas_error error;
513 :
514 4765 : Word32 tmp1 = IVAS_192k;
515 4765 : Word32 tmp2 = SPAR_DIRAC_SPLIT_START_BAND;
516 4765 : Word16 exp = 0;
517 :
518 4765 : move32();
519 4765 : move32();
520 4765 : move16();
521 4765 : Word16 tmp3 = BASOP_Util_Divide3232_Scale( tmp1, tmp2, &exp );
522 4765 : Word32 res = L_shr( L_deposit_h( tmp3 ), sub( 31, exp ) );
523 :
524 4765 : error = IVAS_ERR_OK;
525 4765 : hQMetaData->is_masa_ivas_format = 0;
526 4765 : move32();
527 4765 : move16();
528 :
529 4765 : hodirac_flag = ivas_get_hodirac_flag_fx( sba_total_brate, sba_order );
530 :
531 : /* map the bitrate for SID frame */
532 4765 : IF( EQ_32( sba_total_brate, IVAS_SID_5k2 ) )
533 : {
534 0 : IF( EQ_16( *element_mode, IVAS_SCE ) )
535 : {
536 0 : sba_total_brate = ACELP_24k40;
537 0 : move32();
538 : }
539 : ELSE
540 : {
541 0 : sba_total_brate = ACELP_48k;
542 0 : move32();
543 : }
544 : }
545 :
546 4765 : ivas_set_qmetadata_maxbit_req_fx( hQMetaData, SBA_FORMAT );
547 :
548 4765 : IF( LE_32( sba_total_brate, IVAS_16k4 ) )
549 : {
550 949 : hQMetaData->useLowerRes = 1;
551 949 : move16();
552 : }
553 : ELSE
554 : {
555 3816 : hQMetaData->useLowerRes = 0;
556 3816 : move16();
557 : }
558 :
559 4765 : nbands_coded = nbands;
560 4765 : move16();
561 :
562 4765 : IF( LE_32( sba_total_brate, res ) )
563 : {
564 949 : hQMetaData->useLowerBandRes = 1;
565 949 : Word16 tmp = s_and( nbands, 1 );
566 :
567 949 : move16();
568 949 : nbands_coded = add( shr( nbands, 1 ), tmp );
569 : }
570 : ELSE
571 : {
572 3816 : hQMetaData->useLowerBandRes = 0;
573 3816 : move16();
574 3816 : IF( hodirac_flag == 0 )
575 : {
576 3332 : nbands_coded = sub( nbands, 1 ); /* always combine the last two bands */
577 : }
578 : }
579 :
580 : {
581 4765 : Word16 no_dirs = 1;
582 4765 : move16();
583 4765 : IF( hodirac_flag )
584 : {
585 484 : no_dirs = 2;
586 484 : move16();
587 : }
588 :
589 4765 : IF( NE_32( ( error = ivas_qmetadata_allocate_memory_fx( hQMetaData, nbands_coded, no_dirs, 0 ) ), IVAS_ERR_OK ) ) // WIP
590 : {
591 0 : return error;
592 : }
593 : }
594 :
595 4765 : ivas_get_dirac_sba_max_md_bits_fx( sba_total_brate, &hQMetaData->bits_frame_nominal, &hQMetaData->metadata_max_bits, &hQMetaData->qmetadata_max_bit_req, hQMetaData->q_direction[0].cfg.nbands,
596 : ivas_format );
597 :
598 4765 : return error;
599 : }
600 :
601 :
602 690440 : void computeDirectionVectors_fixed(
603 : Word32 *intensity_real_x, /* i: exp = i_e */
604 : Word32 *intensity_real_y, /* i: exp = i_e */
605 : Word32 *intensity_real_z, /* i: exp = i_e */
606 : const Word16 enc_param_start_band,
607 : const Word16 num_frequency_bands,
608 : Word32 *direction_vector_x, /* o: Q30*/
609 : Word32 *direction_vector_y, /* o: Q30*/
610 : Word32 *direction_vector_z, /* o: Q30*/
611 : Word16 i_e, /*Exponent of all the intensity buffers*/
612 : Word16 *i_e_band )
613 : {
614 : Word16 i;
615 : Word32 intensityNorm;
616 : Word16 intensityNorm_e;
617 : Word32 temp1;
618 : Word16 exp1;
619 : Word16 norm_x, norm_y, norm_z;
620 : Word32 scaled_x, scaled_y, scaled_z;
621 : Word16 e_x, e_y, e_z;
622 4454564 : FOR( i = enc_param_start_band; i < enc_param_start_band + num_frequency_bands; ++i )
623 : {
624 3764124 : norm_x = norm_l( *intensity_real_x );
625 3764124 : norm_y = norm_l( *intensity_real_y );
626 3764124 : norm_z = norm_l( *intensity_real_z );
627 3764124 : scaled_x = L_shl( *intensity_real_x, norm_x );
628 3764124 : scaled_y = L_shl( *intensity_real_y, norm_y );
629 3764124 : scaled_z = L_shl( *intensity_real_z, norm_z );
630 3764124 : IF( i_e_band != NULL )
631 : {
632 3591324 : e_x = sub( Q31, add( i_e_band[i - enc_param_start_band], norm_x ) );
633 3591324 : e_y = sub( Q31, add( i_e_band[i - enc_param_start_band], norm_y ) );
634 3591324 : e_z = sub( Q31, add( i_e_band[i - enc_param_start_band], norm_z ) );
635 : }
636 : ELSE
637 : {
638 172800 : e_x = sub( i_e, norm_x );
639 172800 : e_y = sub( i_e, norm_y );
640 172800 : e_z = sub( i_e, norm_z );
641 : }
642 3764124 : temp1 = BASOP_Util_Add_Mant32Exp( Mult_32_32( scaled_x, scaled_x ), shl( e_x, 1 ), Mult_32_32( scaled_y, scaled_y ), shl( e_y, 1 ), &exp1 );
643 3764124 : intensityNorm = BASOP_Util_Add_Mant32Exp( temp1, exp1, Mult_32_32( scaled_z, scaled_z ), shl( e_z, 1 ), &intensityNorm_e );
644 :
645 3764124 : IF( LE_32( intensityNorm, EPSILON_FX ) )
646 : {
647 52890 : intensityNorm = L_shl( 1, intensityNorm_e );
648 52890 : *( direction_vector_x++ ) = ONE_IN_Q30;
649 52890 : *( direction_vector_y++ ) = 0;
650 52890 : *( direction_vector_z++ ) = 0;
651 :
652 52890 : move32();
653 52890 : move32();
654 52890 : move32();
655 52890 : intensity_real_x++;
656 52890 : intensity_real_y++;
657 52890 : intensity_real_z++;
658 : }
659 : ELSE
660 : {
661 3711234 : intensityNorm = ISqrt32( intensityNorm, &intensityNorm_e ); /*Q31-intensityNorm_e*/
662 3711234 : *( direction_vector_x++ ) = L_shl( Mult_32_32( scaled_x, intensityNorm ), sub( add( e_x, intensityNorm_e ), 1 ) ); /*Q30*/
663 3711234 : intensity_real_x++;
664 3711234 : *( direction_vector_y++ ) = L_shl( Mult_32_32( scaled_y, intensityNorm ), sub( add( e_y, intensityNorm_e ), 1 ) ); /*Q30*/
665 3711234 : intensity_real_y++;
666 3711234 : *( direction_vector_z++ ) = L_shl( Mult_32_32( scaled_z, intensityNorm ), sub( add( e_z, intensityNorm_e ), 1 ) ); /*Q30*/
667 3711234 : intensity_real_z++;
668 :
669 3711234 : move32();
670 3711234 : move32();
671 3711234 : move32();
672 : }
673 : }
674 :
675 690440 : return;
676 : }
677 : /*-------------------------------------------------------------------------
678 : * computeDirectionVectors()
679 : *
680 : *
681 : *------------------------------------------------------------------------*/
682 :
683 0 : void computeDirectionVectors_fx(
684 : Word32 *intensity_real_x, // i: Q( i_q )
685 : Word32 *intensity_real_y, // i: Q( i_q )
686 : Word32 *intensity_real_z, // i: Q( i_q )
687 : const Word16 enc_param_start_band,
688 : const Word16 num_frequency_bands,
689 : Word32 *direction_vector_x, // o: Q( i_q )
690 : Word32 *direction_vector_y, // o: Q( i_q )
691 : Word32 *direction_vector_z, // o: Q( i_q )
692 : Word16 *i_q /*input/output Q*/
693 : )
694 : {
695 : Word16 i;
696 : Word32 intensityNorm;
697 :
698 0 : Word16 sq = sub( 31, sub( shl( *i_q, 1 ), 31 ) );
699 0 : Word16 sq1 = sub( shl( *i_q, 1 ), 31 );
700 0 : Word16 exp = sq;
701 0 : Word16 local_i_q = sq1;
702 0 : Word16 min_factor = 30;
703 :
704 0 : move16();
705 0 : move16();
706 0 : move16();
707 :
708 0 : Word32 *init_x = intensity_real_x;
709 0 : Word32 *init_y = intensity_real_y;
710 0 : Word32 *init_z = intensity_real_z;
711 : // First loop to determine the Q for the direction vector
712 0 : FOR( i = enc_param_start_band; i < enc_param_start_band + num_frequency_bands; ++i )
713 : {
714 0 : intensityNorm = L_add( L_add( Mpy_32_32_r( *( intensity_real_x ), *( intensity_real_x ) ),
715 : Mpy_32_32_r( *( intensity_real_y ), *( intensity_real_y ) ) ),
716 : Mpy_32_32_r( *( intensity_real_z ), *( intensity_real_z ) ) ); /*Q (2*i_q - 31) */
717 0 : exp = sq;
718 0 : move16();
719 0 : IF( LE_32( intensityNorm, EPSILON_FX ) )
720 : {
721 0 : intensity_real_x++;
722 0 : intensity_real_y++;
723 0 : intensity_real_z++;
724 : }
725 : ELSE
726 : {
727 0 : intensityNorm = ISqrt32( intensityNorm, &exp ); // Q31-exp
728 0 : intensity_real_x++; // i_q + Q31-exp -31 = i_q -exp
729 0 : intensity_real_y++; // i_q + Q31-exp -31 = i_q -exp
730 0 : intensity_real_z++; // i_q + Q31-exp-31 = i_q -exo
731 0 : local_i_q = sub( *i_q, exp );
732 0 : min_factor = s_min( min_factor, local_i_q );
733 : }
734 : }
735 0 : intensity_real_x = init_x;
736 0 : intensity_real_y = init_y;
737 0 : intensity_real_z = init_z;
738 : // Actual processing loop for the direction vector
739 0 : FOR( i = enc_param_start_band; i < enc_param_start_band + num_frequency_bands; ++i )
740 : {
741 0 : intensityNorm = L_add( L_add( Mpy_32_32_r( *( intensity_real_x ), *( intensity_real_x ) ),
742 : Mpy_32_32_r( *( intensity_real_y ), *( intensity_real_y ) ) ),
743 : Mpy_32_32_r( *( intensity_real_z ), *( intensity_real_z ) ) ); /*Q (2*i_q - 31) */
744 0 : exp = sq;
745 0 : move16();
746 0 : IF( LE_32( intensityNorm, EPSILON_FX ) )
747 : {
748 0 : intensityNorm = L_shl( 1, min_factor );
749 0 : *( direction_vector_x++ ) = L_shl( 1, min_factor ); // Q is min_factor
750 0 : *( direction_vector_y++ ) = 0;
751 0 : *( direction_vector_z++ ) = 0;
752 0 : intensity_real_x++;
753 0 : intensity_real_y++;
754 0 : intensity_real_z++;
755 :
756 0 : move32();
757 0 : move32();
758 0 : move32();
759 : }
760 : ELSE
761 : {
762 0 : intensityNorm = ISqrt32( intensityNorm, &exp ); // Q31-exp
763 0 : Word32 temp = L_shr( Mpy_32_32( *( intensity_real_x++ ), intensityNorm ), ( *i_q - exp - min_factor ) ); // Q is min_factor
764 0 : *( direction_vector_x++ ) = temp; // i_q + Q31-exp -31 = i_q -exp
765 0 : temp = L_shr( Mpy_32_32( *( intensity_real_y++ ), intensityNorm ), ( *i_q - exp - min_factor ) ); // Q is min_factor
766 0 : *( direction_vector_y++ ) = temp; // i_q + Q31-exp -31 = i_q -exp
767 0 : temp = L_shr( Mpy_32_32( *( intensity_real_z++ ), intensityNorm ), ( *i_q - exp - min_factor ) ); // Q is min_factor
768 0 : *( direction_vector_z++ ) = temp; // i_q + Q31-exp-31 = i_q -exp
769 :
770 0 : move32();
771 0 : move32();
772 0 : move32();
773 : }
774 : }
775 0 : *i_q = min_factor;
776 0 : move16();
777 0 : return;
778 : }
779 :
780 : /*-------------------------------------------------------------------------
781 : * computeDiffuseness()
782 : *
783 : *
784 : *------------------------------------------------------------------------*/
785 774355 : void computeDiffuseness_fixed(
786 : Word32 *buffer_intensity[DIRAC_NUM_DIMS][DIRAC_NO_COL_AVG_DIFF], // i: Q(q_factor_intensity)
787 : const Word32 *buffer_energy, // i: Q(q_factor_energy)
788 : const Word16 num_freq_bands,
789 : Word32 *diffuseness, // o: exp(out_exp)
790 : Word16 *q_factor_intensity,
791 : Word16 *q_factor_energy,
792 : Word16 *q_diffuseness /*Ouput Q*/
793 : )
794 : {
795 : Word32 intensity_slow[DIRAC_NUM_DIMS * CLDFB_NO_CHANNELS_MAX];
796 : Word32 intensity_slow_abs[CLDFB_NO_CHANNELS_MAX];
797 : Word64 intensity_slow_abs_64[CLDFB_NO_CHANNELS_MAX];
798 : Word16 intensity_slow_abs_q[CLDFB_NO_CHANNELS_MAX];
799 : Word32 energy_slow[CLDFB_NO_CHANNELS_MAX];
800 : Word16 i, j, k;
801 774355 : Word32 tmp = 0;
802 774355 : move32();
803 : Word32 *p_tmp;
804 : const Word32 *p_tmp_c;
805 : Word16 min_q_shift1, min_q_shift2, exp1, exp2, q_tmp;
806 : Word16 q_ene, q_intensity;
807 :
808 : /* Compute Intensity slow and energy slow buffer_intensity and buffer_energy */
809 :
810 774355 : set_zero_fx( intensity_slow, i_mult( DIRAC_NUM_DIMS, CLDFB_NO_CHANNELS_MAX ) );
811 774355 : set_zero_fx( intensity_slow_abs, CLDFB_NO_CHANNELS_MAX );
812 774355 : set_zero_fx( energy_slow, CLDFB_NO_CHANNELS_MAX );
813 :
814 : /* Calculate max possible shift for the buffer buffer_energy and buffer_intensity */
815 774355 : min_q_shift1 = Q31;
816 774355 : move16();
817 774355 : min_q_shift1 = s_min( min_q_shift1, getScaleFactor32( buffer_energy, i_mult( DIRAC_NO_COL_AVG_DIFF, num_freq_bands ) ) );
818 774355 : min_q_shift1 = sub( min_q_shift1, find_guarded_bits_fx( DIRAC_NO_COL_AVG_DIFF ) );
819 :
820 774355 : min_q_shift2 = Q31;
821 774355 : move16();
822 3097420 : FOR( i = 0; i < DIRAC_NUM_DIMS; i++ )
823 : {
824 76661145 : FOR( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ )
825 : {
826 74338080 : min_q_shift2 = s_min( min_q_shift2, getScaleFactor32( buffer_intensity[i][j], num_freq_bands ) );
827 : }
828 : }
829 774355 : min_q_shift2 = sub( min_q_shift2, find_guarded_bits_fx( DIRAC_NO_COL_AVG_DIFF ) );
830 :
831 774355 : q_ene = add( q_factor_energy[0], min_q_shift1 );
832 774355 : move16();
833 774355 : q_intensity = add( q_factor_intensity[0], min_q_shift2 );
834 774355 : move16();
835 :
836 25553715 : FOR( i = 0; i < DIRAC_NO_COL_AVG_DIFF; ++i )
837 : {
838 : /* Energy slow */
839 24779360 : p_tmp_c = buffer_energy + i * num_freq_bands;
840 :
841 24779360 : q_tmp = add( q_factor_energy[i], min_q_shift1 );
842 :
843 :
844 24779360 : Word16 shift_q = sub( q_tmp, q_ene );
845 24779360 : Word32 shiftEquiv = L_add( 0, 0 );
846 : Word16 shift_qtotal;
847 24779360 : if ( shift_q < 0 )
848 : {
849 874751 : shiftEquiv = L_lshl( (Word32) 0x80000000, shift_q );
850 : }
851 24779360 : if ( shift_q >= 0 )
852 : {
853 23904609 : shiftEquiv = L_add( 0x7FFFFFFF, 0 );
854 : }
855 24779360 : shift_qtotal = sub( min_q_shift1, s_max( shift_q, 0 ) );
856 :
857 329933952 : FOR( k = 0; k < num_freq_bands; k++ )
858 : {
859 305154592 : tmp = L_shl( p_tmp_c[k], shift_qtotal );
860 305154592 : energy_slow[k] = Madd_32_32_r( tmp, energy_slow[k], shiftEquiv );
861 305154592 : move32();
862 : }
863 :
864 :
865 24779360 : q_ene = s_min( q_ene, q_tmp );
866 :
867 : /* Intensity slow */
868 24779360 : q_tmp = add( q_factor_intensity[i], min_q_shift2 );
869 :
870 24779360 : shift_q = sub( q_tmp, q_intensity );
871 24779360 : if ( shift_q < 0 )
872 : {
873 875601 : shiftEquiv = L_lshl( (Word32) 0x80000000, shift_q );
874 : }
875 24779360 : if ( shift_q >= 0 )
876 : {
877 23903759 : shiftEquiv = L_lshl( 0x7FFFFFFF, 0 );
878 : }
879 24779360 : shift_qtotal = sub( min_q_shift2, s_max( shift_q, 0 ) );
880 :
881 99117440 : FOR( j = 0; j < DIRAC_NUM_DIMS; ++j )
882 : {
883 74338080 : p_tmp = buffer_intensity[j][i];
884 989801856 : FOR( k = 0; k < num_freq_bands; k++ )
885 : {
886 915463776 : tmp = L_shl( p_tmp[k], shift_qtotal );
887 915463776 : intensity_slow[j * num_freq_bands + k] = Madd_32_32_r( tmp, intensity_slow[j * num_freq_bands + k], shiftEquiv );
888 915463776 : move32();
889 : }
890 : }
891 :
892 24779360 : q_intensity = s_min( q_intensity, q_tmp );
893 : }
894 :
895 774355 : min_q_shift1 = getScaleFactor32( intensity_slow, i_mult( DIRAC_NUM_DIMS, num_freq_bands ) );
896 774355 : min_q_shift1 = sub( min_q_shift1, idiv1616( add( find_guarded_bits_fx( DIRAC_NUM_DIMS ), 1 ), 2 ) );
897 774355 : scale_sig32( intensity_slow, i_mult( DIRAC_NUM_DIMS, num_freq_bands ), min_q_shift1 );
898 774355 : q_intensity = add( q_intensity, min_q_shift1 );
899 10310436 : FOR( k = 0; k < num_freq_bands; k++ )
900 : {
901 9536081 : intensity_slow_abs_64[k] = 0;
902 9536081 : move64();
903 : }
904 :
905 : /* intensity_slow.^2 + intensity_slow_abs*/
906 3097420 : FOR( j = 0; j < DIRAC_NUM_DIMS; ++j )
907 : {
908 2323065 : p_tmp = intensity_slow + j * num_freq_bands;
909 30931308 : FOR( k = 0; k < num_freq_bands; k++ )
910 : {
911 28608243 : intensity_slow_abs_64[k] = W_add( intensity_slow_abs_64[k], W_mult_32_32( p_tmp[k], p_tmp[k] ) ); // 2*q_intensity+1
912 : }
913 : }
914 10310436 : FOR( k = 0; k < num_freq_bands; k++ )
915 : {
916 9536081 : Word16 shift = W_norm( intensity_slow_abs_64[k] );
917 9536081 : intensity_slow_abs[k] = W_extract_h( W_shl( intensity_slow_abs_64[k], shift ) );
918 9536081 : move32();
919 9536081 : intensity_slow_abs_q[k] = sub( add( add( q_intensity, q_intensity ), shift ), 31 );
920 9536081 : move16();
921 : }
922 :
923 : /* Compute Diffuseness */
924 774355 : p_tmp = intensity_slow_abs;
925 774355 : exp2 = 0;
926 774355 : move16();
927 10310436 : FOR( i = 0; i < num_freq_bands; ++i )
928 : {
929 9536081 : exp1 = sub( 31, intensity_slow_abs_q[i] );
930 9536081 : tmp = Sqrt32( p_tmp[i], &exp1 );
931 :
932 9536081 : tmp = BASOP_Util_Divide3232_Scale_newton( tmp, L_add( energy_slow[i], EPSILLON_FX ), &exp2 );
933 9536081 : q_tmp = add( sub( 31, exp2 ), sub( sub( 31, exp1 ), q_ene ) );
934 :
935 9536081 : IF( LT_16( q_tmp, Q30 ) )
936 : {
937 105497 : tmp = L_sub( L_shr( ONE_IN_Q30, sub( Q30, q_tmp ) ), tmp );
938 : }
939 : ELSE
940 : {
941 9430584 : tmp = L_sub( ONE_IN_Q30, L_shr( tmp, sub( q_tmp, Q30 ) ) );
942 9430584 : q_tmp = Q30;
943 9430584 : move16();
944 : }
945 :
946 9536081 : IF( GE_32( tmp, L_shl( 1, q_tmp ) ) )
947 : {
948 11753 : diffuseness[i] = ONE_IN_Q30;
949 11753 : move32();
950 : }
951 9524328 : ELSE IF( tmp <= 0 )
952 : {
953 524532 : diffuseness[i] = 0;
954 524532 : move32();
955 : }
956 : ELSE
957 : {
958 8999796 : diffuseness[i] = L_shl( tmp, sub( Q30, q_tmp ) );
959 8999796 : move32();
960 : }
961 : }
962 774355 : *q_diffuseness = Q30;
963 774355 : move16();
964 :
965 774355 : return;
966 : }
967 :
968 3761795 : Word32 deindex_azimuth_fx( /* o : output Q22 */
969 : Word16 id_phi, /* i : index */
970 : const Word16 no_bits, /* i : number of bits for the spherical grid */
971 : const Word16 id_th, /* i : elevation index */
972 : const Word16 remap, /* i : remapping flag */
973 : const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */
974 : )
975 : {
976 : Word16 flag_delta;
977 : Word32 dd_fx, delta_phi_fx;
978 : Word32 phi_hat_fx;
979 3761795 : test();
980 3761795 : IF( NE_32( mc_format, MC_LS_SETUP_INVALID ) && EQ_16( no_bits, 2 ) )
981 : {
982 9 : IF( s_and( id_phi, 1 ) == 0 )
983 : {
984 8 : phi_hat_fx = cb_azi_chan_fx[id_phi / 2]; // Q22
985 8 : move32();
986 : }
987 : ELSE
988 : {
989 1 : phi_hat_fx = L_negate( cb_azi_chan_fx[( id_phi + 1 ) / 2] ); // Q22
990 : }
991 9 : return phi_hat_fx;
992 : }
993 3761786 : flag_delta = extract_l( EQ_16( s_and( id_th, 1 ), 1 ) );
994 :
995 3761786 : IF( remap )
996 : {
997 265411 : id_phi = add( ivas_qmetadata_dereorder_generic_fx( id_phi ), shr( no_phi_masa[no_bits - 1][id_th], 1 ) );
998 : }
999 :
1000 3761786 : delta_phi_fx = Mpy_32_32( 1509949440, no_phi_masa_inv_fx[no_bits - 1][id_th] ); // q = 22
1001 3761786 : test();
1002 3761786 : test();
1003 3761786 : IF( EQ_16( flag_delta, 1 ) && GT_16( no_phi_masa[no_bits - 1][id_th], 2 ) && EQ_32( mc_format, MC_LS_SETUP_INVALID ) )
1004 : {
1005 894498 : dd_fx = Mpy_32_32( delta_phi_fx, 1073741824 ); // q = 22
1006 : }
1007 : ELSE
1008 : {
1009 2867288 : dd_fx = 0;
1010 2867288 : move32();
1011 : }
1012 :
1013 3761786 : id_phi = sub( id_phi, shr( no_phi_masa[no_bits - 1][id_th], 1 ) );
1014 3761786 : phi_hat_fx = L_add( imult3216( delta_phi_fx, id_phi ), dd_fx );
1015 3761786 : IF( NE_32( mc_format, MC_LS_SETUP_INVALID ) )
1016 : {
1017 78589 : Word32 a = L_shr( imult3216( delta_theta_masa_fx[no_bits - 3], id_th ), 22 ); // Q22 -> Q0
1018 78589 : move32();
1019 78589 : Word16 flag = 0;
1020 78589 : move16();
1021 78589 : if ( GT_32( a, MC_MASA_THR_ELEVATION ) )
1022 : {
1023 7212 : flag = 1;
1024 7212 : move16();
1025 : }
1026 78589 : phi_hat_fx = companding_azimuth_fx( phi_hat_fx, mc_format, flag, -1 );
1027 : }
1028 3761786 : return phi_hat_fx;
1029 : }
1030 :
1031 :
1032 : /*----------------------------------------------------------------
1033 : * deindex_spherical_component()
1034 : *
1035 : * decoding the spherical index for one tile
1036 : *-----------------------------------------------------------------*/
1037 :
1038 1905702 : void deindex_spherical_component_fx(
1039 : const UWord16 sph_idx, /* i : spherical index */
1040 : Word32 *az_fx, /* o : decoded azimuth value Q22 */
1041 : Word32 *el_fx, /* o : decoded elevation value Q22 */
1042 : UWord16 *az_idx, /* o : azimuth index */
1043 : UWord16 *el_idx, /* o : elevation index */
1044 : const UWord16 no_bits, /* i : number of bits for the spherical grid */
1045 : const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */
1046 : )
1047 : {
1048 1905702 : assert( sph_idx < ( 1 << no_bits ) );
1049 1905702 : SWITCH( no_bits )
1050 : {
1051 0 : case 0:
1052 0 : *az_fx = 0;
1053 0 : move32();
1054 0 : *el_fx = 0;
1055 0 : move32();
1056 0 : *az_idx = 0;
1057 0 : move16();
1058 0 : *el_idx = 0;
1059 0 : move16();
1060 0 : BREAK;
1061 0 : case 1:
1062 0 : *az_idx = sph_idx;
1063 0 : move16();
1064 0 : *az_fx = L_shl( ( *az_idx ) * ( -180 ), 22 );
1065 0 : *el_fx = 0;
1066 0 : move32();
1067 0 : *el_idx = 0;
1068 0 : move16();
1069 0 : BREAK;
1070 633 : case 2:
1071 633 : *el_fx = 0;
1072 633 : move32();
1073 633 : *el_idx = 0;
1074 633 : move16();
1075 633 : *az_idx = sph_idx;
1076 633 : move16();
1077 633 : *az_fx = deindex_azimuth_fx( *az_idx, no_bits, 0, 0, mc_format );
1078 633 : move16();
1079 633 : BREAK;
1080 1905069 : default:
1081 1905069 : *el_idx = deindex_sph_idx_general_fx( sph_idx, no_bits, el_fx, az_fx, az_idx, mc_format );
1082 1905069 : move16();
1083 1905069 : BREAK;
1084 : }
1085 :
1086 1905702 : return;
1087 : }
1088 :
1089 : /*----------------------------------------------------------------
1090 : * calculate_hodirac_sector_parameters()
1091 : *
1092 : *
1093 : *-----------------------------------------------------------------*/
1094 :
1095 64960 : void calculate_hodirac_sector_parameters_fx(
1096 : DIRAC_ENC_HANDLE hDirAC, /* i : DirAC handle */
1097 : Word32 RealBuffer_fx[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : signal vector (L+1)^2 x N_bins, real part */
1098 : Word32 ImagBuffer_fx[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : signal vector, imaginary part */
1099 : Word16 Qfac, /* i : Q-factor of signal vector */
1100 : const Word32 beta_fx, /* i : forgetting factor for average filtering, Q30 */
1101 : const Word16 *band_grouping, /* i : indices of band groups */
1102 : const Word16 N_bands, /* i : number of bands (groups) */
1103 : const Word16 enc_param_start_band, /* i : first band to process */
1104 : Word32 *azi_fx, /* o : array of sector azimuth angles, flat, Q23 */
1105 : Word32 *ele_fx, /* o : array of sector elevation angles, flat, Q23 */
1106 : Word32 *diff_fx, /* o : array of sector diffuseness values, flat */
1107 : Word16 *diff_exp, /* o : array of sector diffuseness exponents, flat */
1108 : Word32 *ene_fx, /* o : array of sector energy values, flat */
1109 : Word16 *ene_exp /* o : array of sector energy exponents, flat */
1110 : )
1111 : {
1112 : Word16 i_sec, i_bin, i_band;
1113 : Word32 p_real_fx, p_imag_fx, normI_fx, energy_fx, tmp_diff_fx;
1114 : Word16 energy_exp, normI_exp, tmp_diff_exp;
1115 : #ifdef OPT_SBA_ENC_V2_NBE
1116 64960 : Word16 tmp_exp_1 = sub( 33, shl( Qfac, 1 ) ); // 31 - (2 *Qfac - 2 )
1117 64960 : Word16 tmp_exp_2 = sub( 35, shl( Qfac, 1 ) ); // 31 - (2 *Qfac - 4 )
1118 : Word32 tmp32_1, tmp32_2;
1119 64960 : Word64 temp_x64 = 0, temp_y64 = 0, temp_z64 = 0;
1120 64960 : Word16 tmp_scale = 0;
1121 64960 : move64();
1122 64960 : move64();
1123 64960 : move64();
1124 64960 : move16();
1125 : #endif
1126 :
1127 : Word32 sec_I_vec_x_fx[NUM_ANA_SECTORS];
1128 : Word32 sec_I_vec_y_fx[NUM_ANA_SECTORS];
1129 : Word32 sec_I_vec_z_fx[NUM_ANA_SECTORS];
1130 : Word16 sec_I_vec_x_exp[NUM_ANA_SECTORS];
1131 : Word16 sec_I_vec_y_exp[NUM_ANA_SECTORS];
1132 : Word16 sec_I_vec_z_exp[NUM_ANA_SECTORS];
1133 :
1134 194880 : FOR( i_sec = 0; i_sec < NUM_ANA_SECTORS; i_sec++ )
1135 : {
1136 129920 : Word32 *p_sec_I_vec_x_fx = &sec_I_vec_x_fx[i_sec];
1137 129920 : Word32 *p_sec_I_vec_y_fx = &sec_I_vec_y_fx[i_sec];
1138 129920 : Word32 *p_sec_I_vec_z_fx = &sec_I_vec_z_fx[i_sec];
1139 129920 : Word16 *p_sec_I_vec_x_exp = &sec_I_vec_x_exp[i_sec];
1140 129920 : Word16 *p_sec_I_vec_y_exp = &sec_I_vec_y_exp[i_sec];
1141 129920 : Word16 *p_sec_I_vec_z_exp = &sec_I_vec_z_exp[i_sec];
1142 :
1143 129920 : const Word32 *p_c_weights_fx = c_weights_fx; // Q30
1144 :
1145 129920 : Word32 *p_ImagBuffer_0_fx = ImagBuffer_fx[0];
1146 129920 : Word32 *p_ImagBuffer_1_fx = ImagBuffer_fx[1];
1147 129920 : Word32 *p_ImagBuffer_2_fx = ImagBuffer_fx[2];
1148 129920 : Word32 *p_ImagBuffer_3_fx = ImagBuffer_fx[3];
1149 129920 : Word32 *p_ImagBuffer_4_fx = ImagBuffer_fx[4];
1150 129920 : Word32 *p_ImagBuffer_5_fx = ImagBuffer_fx[5];
1151 129920 : Word32 *p_ImagBuffer_6_fx = ImagBuffer_fx[6];
1152 129920 : Word32 *p_ImagBuffer_8_fx = ImagBuffer_fx[8];
1153 :
1154 129920 : Word32 *p_RealBuffer_0_fx = RealBuffer_fx[0];
1155 129920 : Word32 *p_RealBuffer_1_fx = RealBuffer_fx[1];
1156 129920 : Word32 *p_RealBuffer_2_fx = RealBuffer_fx[2];
1157 129920 : Word32 *p_RealBuffer_3_fx = RealBuffer_fx[3];
1158 129920 : Word32 *p_RealBuffer_4_fx = RealBuffer_fx[4];
1159 129920 : Word32 *p_RealBuffer_5_fx = RealBuffer_fx[5];
1160 129920 : Word32 *p_RealBuffer_6_fx = RealBuffer_fx[6];
1161 129920 : Word32 *p_RealBuffer_8_fx = RealBuffer_fx[8];
1162 :
1163 1688960 : FOR( i_band = enc_param_start_band; i_band < N_bands; i_band++ )
1164 : {
1165 1559040 : Word32 *p_azi_fx = &azi_fx[i_sec * N_bands + i_band];
1166 1559040 : Word32 *p_ele_fx = &ele_fx[i_sec * N_bands + i_band];
1167 1559040 : Word32 *p_ene_fx = &ene_fx[i_sec * N_bands + i_band];
1168 1559040 : Word16 *p_ene_exp = &ene_exp[i_sec * N_bands + i_band];
1169 :
1170 1559040 : Word32 *p_diff_fx = &diff_fx[i_sec * N_bands + i_band];
1171 1559040 : Word16 *p_diff_exp = &diff_exp[i_sec * N_bands + i_band];
1172 1559040 : Word32 *p_azi_prev_fx = &hDirAC->azi_prev_fx[i_sec * N_bands + i_band];
1173 1559040 : Word32 *p_ele_prev_fx = &hDirAC->ele_prev_fx[i_sec * N_bands + i_band];
1174 :
1175 1559040 : Word32 *p_energy_smth_fx = &hDirAC->energy_smth_fx[i_sec][i_band];
1176 1559040 : Word16 *p_energy_smth_exp = &hDirAC->energy_smth_exp[i_sec][i_band];
1177 1559040 : Word32 *p_sec_I_vec_smth_x_fx = &hDirAC->sec_I_vec_smth_x_fx[i_sec][i_band];
1178 1559040 : Word32 *p_sec_I_vec_smth_y_fx = &hDirAC->sec_I_vec_smth_y_fx[i_sec][i_band];
1179 1559040 : Word32 *p_sec_I_vec_smth_z_fx = &hDirAC->sec_I_vec_smth_z_fx[i_sec][i_band];
1180 1559040 : Word16 *p_sec_I_vec_smth_x_exp = &hDirAC->sec_I_vec_smth_x_exp[i_sec][i_band];
1181 1559040 : Word16 *p_sec_I_vec_smth_y_exp = &hDirAC->sec_I_vec_smth_y_exp[i_sec][i_band];
1182 1559040 : Word16 *p_sec_I_vec_smth_z_exp = &hDirAC->sec_I_vec_smth_z_exp[i_sec][i_band];
1183 1559040 : *p_sec_I_vec_x_fx = 0;
1184 1559040 : move32();
1185 1559040 : *p_sec_I_vec_x_exp = 0;
1186 1559040 : move16();
1187 1559040 : *p_sec_I_vec_y_fx = 0;
1188 1559040 : move32();
1189 1559040 : *p_sec_I_vec_y_exp = 0;
1190 1559040 : move16();
1191 1559040 : *p_sec_I_vec_z_fx = 0;
1192 1559040 : move32();
1193 1559040 : *p_sec_I_vec_z_exp = 0;
1194 1559040 : move16();
1195 1559040 : energy_fx = 0;
1196 1559040 : move32();
1197 1559040 : energy_exp = 0;
1198 1559040 : move16();
1199 : #ifdef OPT_SBA_ENC_V2_NBE
1200 1559040 : Word64 sec_I_vec_x_64_fx = 0;
1201 1559040 : Word64 sec_I_vec_y_64_fx = 0;
1202 1559040 : Word64 sec_I_vec_z_64_fx = 0;
1203 1559040 : Word64 energy_64_fx = 0;
1204 1559040 : move64();
1205 1559040 : move64();
1206 1559040 : move64();
1207 1559040 : move64();
1208 : #endif
1209 1559040 : IF( i_sec == 0 )
1210 : {
1211 13769920 : FOR( i_bin = band_grouping[i_band]; i_bin < band_grouping[i_band + 1]; i_bin++ )
1212 : {
1213 12990400 : Word32 w_fx = *( p_c_weights_fx++ ); // Q30
1214 12990400 : move32();
1215 : Word32 sec_w_imag_fx, sec_x_imag_fx, sec_y_imag_fx, sec_z_imag_fx;
1216 : Word32 sec_w_real_fx, sec_x_real_fx, sec_y_real_fx, sec_z_real_fx;
1217 : #ifdef OPT_SBA_ENC_V2_NBE
1218 12990400 : sec_w_imag_fx = Madd_32_32( Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_0_fx ) ), HODIRAC_FAC1, *( p_ImagBuffer_1_fx ) ); // Qfac - 2
1219 12990400 : sec_x_imag_fx = Madd_32_32( Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_3_fx++ ) ), HODIRAC_FAC2, *( p_ImagBuffer_4_fx++ ) ); // Qfac - 2
1220 12990400 : sec_y_imag_fx = Msub_32_32( ( Msub_32_32( ( Madd_32_32( Mpy_32_32( HODIRAC_FAC3, *( p_ImagBuffer_0_fx++ ) ), HODIRAC_FAC1, *( p_ImagBuffer_1_fx++ ) ) ), HODIRAC_FAC3, *( p_ImagBuffer_6_fx++ ) ) ), HODIRAC_FAC2, *( p_ImagBuffer_8_fx++ ) ); // Qfac - 2
1221 12990400 : sec_z_imag_fx = Madd_32_32( Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_2_fx++ ) ), HODIRAC_FAC2, *( p_ImagBuffer_5_fx++ ) ); // Qfac - 2
1222 :
1223 12990400 : sec_w_real_fx = Madd_32_32( Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_0_fx ) ), HODIRAC_FAC1, *( p_RealBuffer_1_fx ) ); // Qfac - 2
1224 12990400 : sec_x_real_fx = Madd_32_32( Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_3_fx++ ) ), HODIRAC_FAC2, *( p_RealBuffer_4_fx++ ) ); // Qfac - 2
1225 12990400 : sec_y_real_fx = Msub_32_32( ( Msub_32_32( Madd_32_32( Mpy_32_32( HODIRAC_FAC3, *( p_RealBuffer_0_fx++ ) ), HODIRAC_FAC1, *( p_RealBuffer_1_fx++ ) ), HODIRAC_FAC3, *( p_RealBuffer_6_fx++ ) ) ), HODIRAC_FAC2, *( p_RealBuffer_8_fx++ ) ); // Qfac - 2
1226 12990400 : sec_z_real_fx = Madd_32_32( Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_2_fx++ ) ), HODIRAC_FAC2, *( p_RealBuffer_5_fx++ ) ); // Qfac - 2
1227 :
1228 : #else
1229 : sec_w_imag_fx = L_add( Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_0_fx ) ), Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_1_fx ) ) ); // Qfac - 2
1230 : sec_x_imag_fx = L_add( Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_3_fx++ ) ), Mpy_32_32( HODIRAC_FAC2, *( p_ImagBuffer_4_fx++ ) ) ); // Qfac - 2
1231 : sec_y_imag_fx = L_sub( L_sub( L_add( Mpy_32_32( HODIRAC_FAC3, *( p_ImagBuffer_0_fx++ ) ), Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_1_fx++ ) ) ), Mpy_32_32( HODIRAC_FAC3, *( p_ImagBuffer_6_fx++ ) ) ), Mpy_32_32( HODIRAC_FAC2, *( p_ImagBuffer_8_fx++ ) ) ); // Qfac - 2
1232 : sec_z_imag_fx = L_add( Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_2_fx++ ) ), Mpy_32_32( HODIRAC_FAC2, *( p_ImagBuffer_5_fx++ ) ) ); // Qfac - 2
1233 :
1234 : sec_w_real_fx = L_add( Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_0_fx ) ), Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_1_fx ) ) ); // Qfac - 2
1235 : sec_x_real_fx = L_add( Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_3_fx++ ) ), Mpy_32_32( HODIRAC_FAC2, *( p_RealBuffer_4_fx++ ) ) ); // Qfac - 2
1236 : sec_y_real_fx = L_sub( L_sub( L_add( Mpy_32_32( HODIRAC_FAC3, *( p_RealBuffer_0_fx++ ) ), Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_1_fx++ ) ) ), Mpy_32_32( HODIRAC_FAC3, *( p_RealBuffer_6_fx++ ) ) ), Mpy_32_32( HODIRAC_FAC2, *( p_RealBuffer_8_fx++ ) ) ); // Qfac - 2
1237 : sec_z_real_fx = L_add( Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_2_fx++ ) ), Mpy_32_32( HODIRAC_FAC2, *( p_RealBuffer_5_fx++ ) ) ); // Qfac - 2
1238 : #endif
1239 :
1240 : #ifndef OPT_SBA_ENC_V2_NBE
1241 : Word16 p_q;
1242 : Word32 tmp_x, tmp_y, tmp_z;
1243 : Word16 n, n1, n2;
1244 : #endif
1245 12990400 : p_real_fx = Mpy_32_32( sec_w_real_fx, w_fx ); // ( Qfac - 2 ) + 30 - 31 = Qfac - 3
1246 12990400 : p_imag_fx = Mpy_32_32( sec_w_imag_fx, w_fx ); // ( Qfac - 2 ) + 30 - 31 = Qfac - 3
1247 :
1248 : #ifndef OPT_SBA_ENC_V2_NBE
1249 : n1 = norm_l( p_real_fx );
1250 : n2 = norm_l( p_imag_fx );
1251 :
1252 : n = s_min( n1, n2 );
1253 : p_real_fx = L_shl( p_real_fx, n );
1254 : p_imag_fx = L_shl( p_imag_fx, n );
1255 :
1256 : p_q = add( sub( Qfac, 3 ), n );
1257 :
1258 : Word16 tmp_exp, sec_sum_exp;
1259 : tmp_exp = sub( 66, add( p_q, Qfac ) ); // 31 - ( p_q + Qfac - 35 )
1260 :
1261 : tmp_x = L_add( L_shr( Mpy_32_32( p_real_fx, sec_x_real_fx ), 2 ), L_shr( Mpy_32_32( p_imag_fx, sec_x_imag_fx ), 2 ) ); // p_q + ( Qfac - 2 ) - 31 - 2 = p_q + Qfac - 35
1262 : tmp_y = L_add( L_shr( Mpy_32_32( p_real_fx, sec_y_real_fx ), 2 ), L_shr( Mpy_32_32( p_imag_fx, sec_y_imag_fx ), 2 ) ); // p_q + ( Qfac - 2 ) - 31 - 2 = p_q + Qfac - 35
1263 : tmp_z = L_add( L_shr( Mpy_32_32( p_real_fx, sec_z_real_fx ), 2 ), L_shr( Mpy_32_32( p_imag_fx, sec_z_imag_fx ), 2 ) ); // p_q + ( Qfac - 2 ) - 31 - 2 = p_q + Qfac - 35
1264 :
1265 : *p_sec_I_vec_x_fx = BASOP_Util_Add_Mant32Exp( *p_sec_I_vec_x_fx, *p_sec_I_vec_x_exp, tmp_x, tmp_exp, p_sec_I_vec_x_exp );
1266 : move32();
1267 : *p_sec_I_vec_y_fx = BASOP_Util_Add_Mant32Exp( *p_sec_I_vec_y_fx, *p_sec_I_vec_y_exp, tmp_y, tmp_exp, p_sec_I_vec_y_exp );
1268 : move32();
1269 : *p_sec_I_vec_z_fx = BASOP_Util_Add_Mant32Exp( *p_sec_I_vec_z_fx, *p_sec_I_vec_z_exp, tmp_z, tmp_exp, p_sec_I_vec_z_exp );
1270 : move32();
1271 : #else
1272 12990400 : temp_x64 = W_mac_32_32( W_mult_32_32( p_real_fx, sec_x_real_fx ), p_imag_fx, sec_x_imag_fx ); // ( Qfac - 3 ) + ( Qfac - 2 ) + 1 = 2 * Qfac - 4
1273 12990400 : temp_y64 = W_mac_32_32( W_mult_32_32( p_real_fx, sec_y_real_fx ), p_imag_fx, sec_y_imag_fx ); // ( Qfac - 3 ) + ( Qfac - 2 ) + 1 = 2 * Qfac - 4
1274 12990400 : temp_z64 = W_mac_32_32( W_mult_32_32( p_real_fx, sec_z_real_fx ), p_imag_fx, sec_z_imag_fx ); // ( Qfac - 3 ) + ( Qfac - 2 ) + 1 = 2 * Qfac - 4
1275 12990400 : sec_I_vec_x_64_fx = W_add( sec_I_vec_x_64_fx, temp_x64 );
1276 12990400 : sec_I_vec_y_64_fx = W_add( sec_I_vec_y_64_fx, temp_y64 );
1277 12990400 : sec_I_vec_z_64_fx = W_add( sec_I_vec_z_64_fx, temp_z64 );
1278 :
1279 : Word64 tmp1;
1280 : #endif
1281 : Word64 tmp2, tmp3, tmp4, sec_sum64;
1282 : #ifndef OPT_SBA_ENC_V2_NBE
1283 : Word32 tmp1;
1284 : Word32 tmp5, sec_sum;
1285 : tmp_exp = sub( 62, add( p_q, p_q ) );
1286 :
1287 : tmp1 = BASOP_Util_Add_Mant32Exp( Mpy_32_32( p_real_fx, p_real_fx ), tmp_exp, Mpy_32_32( p_imag_fx, p_imag_fx ), tmp_exp, &tmp_exp );
1288 : #endif
1289 : #ifdef OPT_SBA_ENC_V2_NBE
1290 12990400 : tmp1 = W_mac_32_32( W_mult_32_32( p_real_fx, p_real_fx ), p_imag_fx, p_imag_fx ); // 2 * (Qfac - 3) + 1
1291 12990400 : tmp1 = W_shl( tmp1, 2 ); // 2 * (Qfac - 2) + 1
1292 12990400 : tmp2 = W_mac_32_32( W_mult_32_32( sec_x_real_fx, sec_x_real_fx ), sec_x_imag_fx, sec_x_imag_fx ); // 2 * (Qfac - 2) + 1
1293 12990400 : tmp3 = W_mac_32_32( W_mult_32_32( sec_y_real_fx, sec_y_real_fx ), sec_y_imag_fx, sec_y_imag_fx ); // 2 * (Qfac - 2) + 1
1294 12990400 : tmp4 = W_mac_32_32( W_mult_32_32( sec_z_real_fx, sec_z_real_fx ), sec_z_imag_fx, sec_z_imag_fx ); // 2 * (Qfac - 2) + 1
1295 12990400 : sec_sum64 = W_add( tmp1, W_add( W_add( tmp2, tmp3 ), tmp4 ) ); // 2 * (Qfac - 2) + 1
1296 :
1297 : // instead dividing changed Q//
1298 12990400 : energy_64_fx = W_add( energy_64_fx, sec_sum64 ); // 2 * (Qfac - 2) + 1 + 1
1299 : #else
1300 : tmp2 = W_add( W_mult0_32_32( sec_x_real_fx, sec_x_real_fx ), W_mult0_32_32( sec_x_imag_fx, sec_x_imag_fx ) ); // 2 * (Qfac - 2)
1301 : tmp3 = W_add( W_mult0_32_32( sec_y_real_fx, sec_y_real_fx ), W_mult0_32_32( sec_y_imag_fx, sec_y_imag_fx ) ); // 2 * (Qfac - 2)
1302 : tmp4 = W_add( W_mult0_32_32( sec_z_real_fx, sec_z_real_fx ), W_mult0_32_32( sec_z_imag_fx, sec_z_imag_fx ) ); // 2 * (Qfac - 2)
1303 : sec_sum64 = W_add( W_add( tmp2, tmp3 ), tmp4 ); // 2 * (Qfac - 2)
1304 : n = W_norm( sec_sum64 );
1305 : sec_sum64 = W_shl( sec_sum64, n ); // 2 * (Qfac - 2) + n
1306 : sec_sum = W_extract_h( sec_sum64 ); // 2 * (Qfac - 2) + n - 32 = 2 * Qfac + n - 36
1307 : sec_sum_exp = sub( 67, add( shl( Qfac, 1 ), n ) );
1308 :
1309 : // divide by 2:
1310 : tmp1 = L_shr( tmp1, 1 );
1311 : sec_sum = L_shr( sec_sum, 1 );
1312 :
1313 : tmp5 = BASOP_Util_Add_Mant32Exp( tmp1, tmp_exp, sec_sum, sec_sum_exp, &tmp_exp );
1314 : energy_fx = BASOP_Util_Add_Mant32Exp( energy_fx, energy_exp, tmp5, tmp_exp, &energy_exp );
1315 : #endif
1316 : }
1317 : #ifdef OPT_SBA_ENC_V2_NBE
1318 779520 : tmp_scale = sub( W_norm( energy_64_fx ), 32 );
1319 779520 : energy_fx = W_shl_sat_l( energy_64_fx, tmp_scale );
1320 779520 : energy_exp = sub( tmp_exp_1, tmp_scale );
1321 779520 : if ( energy_fx == 0 )
1322 : {
1323 68960 : energy_exp = 0;
1324 68960 : move16();
1325 : }
1326 :
1327 779520 : tmp_scale = sub( W_norm( sec_I_vec_x_64_fx ), 32 );
1328 779520 : *p_sec_I_vec_x_fx = W_shl_sat_l( sec_I_vec_x_64_fx, tmp_scale );
1329 779520 : move32();
1330 779520 : *p_sec_I_vec_x_exp = sub( tmp_exp_2, tmp_scale );
1331 779520 : move16();
1332 779520 : if ( *p_sec_I_vec_x_fx == 0 )
1333 : {
1334 68960 : *p_sec_I_vec_x_exp = 0;
1335 68960 : move16();
1336 : }
1337 :
1338 779520 : tmp_scale = sub( W_norm( sec_I_vec_y_64_fx ), 32 );
1339 779520 : *p_sec_I_vec_y_fx = W_shl_sat_l( sec_I_vec_y_64_fx, tmp_scale );
1340 779520 : move32();
1341 779520 : *p_sec_I_vec_y_exp = sub( tmp_exp_2, tmp_scale );
1342 779520 : move16();
1343 779520 : if ( *p_sec_I_vec_y_fx == 0 )
1344 : {
1345 68960 : *p_sec_I_vec_y_exp = 0;
1346 68960 : move16();
1347 : }
1348 :
1349 779520 : tmp_scale = sub( W_norm( sec_I_vec_z_64_fx ), 32 );
1350 779520 : *p_sec_I_vec_z_fx = W_shl_sat_l( sec_I_vec_z_64_fx, tmp_scale );
1351 779520 : move32();
1352 779520 : *p_sec_I_vec_z_exp = sub( tmp_exp_2, tmp_scale );
1353 779520 : move16();
1354 779520 : if ( *p_sec_I_vec_z_fx == 0 )
1355 : {
1356 164440 : *p_sec_I_vec_z_exp = 0;
1357 164440 : move16();
1358 : }
1359 : #endif
1360 : }
1361 : ELSE
1362 : {
1363 13769920 : FOR( i_bin = band_grouping[i_band]; i_bin < band_grouping[i_band + 1]; i_bin++ )
1364 : {
1365 12990400 : Word32 w_fx = *( p_c_weights_fx++ ); // Q30
1366 12990400 : move32();
1367 : Word32 sec_w_imag_fx, sec_x_imag_fx, sec_y_imag_fx, sec_z_imag_fx;
1368 : Word32 sec_w_real_fx, sec_x_real_fx, sec_y_real_fx, sec_z_real_fx;
1369 :
1370 : #ifdef OPT_SBA_ENC_V2_NBE
1371 12990400 : sec_w_imag_fx = Msub_32_32( Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_0_fx ) ), HODIRAC_FAC1, *( p_ImagBuffer_1_fx ) ); // Qfac - 2
1372 12990400 : sec_x_imag_fx = Msub_32_32( Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_3_fx++ ) ), HODIRAC_FAC2, *( p_ImagBuffer_4_fx++ ) ); // Qfac - 2
1373 12990400 : sec_y_imag_fx = Madd_32_32( ( Madd_32_32( ( Madd_32_32( Mpy_32_32( -HODIRAC_FAC3, *( p_ImagBuffer_0_fx++ ) ), HODIRAC_FAC1, *( p_ImagBuffer_1_fx++ ) ) ), HODIRAC_FAC3, *( p_ImagBuffer_6_fx++ ) ) ), HODIRAC_FAC2, *( p_ImagBuffer_8_fx++ ) ); // Qfac - 2
1374 12990400 : sec_z_imag_fx = Msub_32_32( Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_2_fx++ ) ), HODIRAC_FAC2, *( p_ImagBuffer_5_fx++ ) ); // Qfac - 2
1375 :
1376 12990400 : sec_w_real_fx = Msub_32_32( Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_0_fx ) ), HODIRAC_FAC1, *( p_RealBuffer_1_fx ) ); // Qfac - 2
1377 12990400 : sec_x_real_fx = Msub_32_32( Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_3_fx++ ) ), HODIRAC_FAC2, *( p_RealBuffer_4_fx++ ) ); // Qfac - 2
1378 12990400 : sec_y_real_fx = Madd_32_32( ( Madd_32_32( ( Madd_32_32( Mpy_32_32( -HODIRAC_FAC3, *( p_RealBuffer_0_fx++ ) ), HODIRAC_FAC1, *( p_RealBuffer_1_fx++ ) ) ), HODIRAC_FAC3, *( p_RealBuffer_6_fx++ ) ) ), HODIRAC_FAC2, *( p_RealBuffer_8_fx++ ) ); // Qfac - 2
1379 12990400 : sec_z_real_fx = Msub_32_32( Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_2_fx++ ) ), HODIRAC_FAC2, *( p_RealBuffer_5_fx++ ) ); // Qfac - 2
1380 :
1381 : #else
1382 : sec_w_imag_fx = L_sub( Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_0_fx ) ), Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_1_fx ) ) ); // Qfac - 2
1383 : sec_x_imag_fx = L_sub( Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_3_fx++ ) ), Mpy_32_32( HODIRAC_FAC2, *( p_ImagBuffer_4_fx++ ) ) ); // Qfac - 2
1384 : sec_y_imag_fx = L_add( L_add( L_add( Mpy_32_32( -HODIRAC_FAC3, *( p_ImagBuffer_0_fx++ ) ), Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_1_fx++ ) ) ), Mpy_32_32( HODIRAC_FAC3, *( p_ImagBuffer_6_fx++ ) ) ), Mpy_32_32( HODIRAC_FAC2, *( p_ImagBuffer_8_fx++ ) ) ); // Qfac - 2
1385 : sec_z_imag_fx = L_sub( Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_2_fx++ ) ), Mpy_32_32( HODIRAC_FAC2, *( p_ImagBuffer_5_fx++ ) ) ); // Qfac - 2
1386 :
1387 : sec_w_real_fx = L_sub( Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_0_fx ) ), Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_1_fx ) ) ); // Qfac - 2
1388 : sec_x_real_fx = L_sub( Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_3_fx++ ) ), Mpy_32_32( HODIRAC_FAC2, *( p_RealBuffer_4_fx++ ) ) ); // Qfac - 2
1389 : sec_y_real_fx = L_add( L_add( L_add( Mpy_32_32( -HODIRAC_FAC3, *( p_RealBuffer_0_fx++ ) ), Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_1_fx++ ) ) ), Mpy_32_32( HODIRAC_FAC3, *( p_RealBuffer_6_fx++ ) ) ), Mpy_32_32( HODIRAC_FAC2, *( p_RealBuffer_8_fx++ ) ) ); // Qfac - 2
1390 : sec_z_real_fx = L_sub( Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_2_fx++ ) ), Mpy_32_32( HODIRAC_FAC2, *( p_RealBuffer_5_fx++ ) ) ); // Qfac - 2
1391 : #endif
1392 : #ifndef OPT_SBA_ENC_V2_NBE
1393 : Word16 p_q;
1394 : Word32 tmp_x, tmp_y, tmp_z;
1395 : Word16 n, n1, n2;
1396 : #endif
1397 :
1398 12990400 : p_real_fx = Mpy_32_32( sec_w_real_fx, w_fx ); // ( Qfac - 2 ) + 30 - 31 = Qfac - 3
1399 12990400 : p_imag_fx = Mpy_32_32( sec_w_imag_fx, w_fx ); // ( Qfac - 2 ) + 30 - 31 = Qfac - 3
1400 :
1401 : #ifndef OPT_SBA_ENC_V2_NBE
1402 : n1 = norm_l( p_real_fx );
1403 : n2 = norm_l( p_imag_fx );
1404 :
1405 : n = s_min( n1, n2 );
1406 : p_real_fx = L_shl( p_real_fx, n );
1407 : p_imag_fx = L_shl( p_imag_fx, n );
1408 :
1409 : p_q = add( sub( Qfac, 3 ), n );
1410 :
1411 : Word16 tmp_exp, sec_sum_exp;
1412 : tmp_exp = sub( 66, add( p_q, Qfac ) ); // 31 - ( p_q + Qfac - 35 )
1413 :
1414 : tmp_x = L_add( L_shr( Mpy_32_32( p_real_fx, sec_x_real_fx ), 2 ), L_shr( Mpy_32_32( p_imag_fx, sec_x_imag_fx ), 2 ) ); // p_q + ( Qfac - 2 ) - 31 - 2 = p_q + Qfac - 35
1415 : tmp_y = L_add( L_shr( Mpy_32_32( p_real_fx, sec_y_real_fx ), 2 ), L_shr( Mpy_32_32( p_imag_fx, sec_y_imag_fx ), 2 ) ); // p_q + ( Qfac - 2 ) - 31 - 2 = p_q + Qfac - 35
1416 : tmp_z = L_add( L_shr( Mpy_32_32( p_real_fx, sec_z_real_fx ), 2 ), L_shr( Mpy_32_32( p_imag_fx, sec_z_imag_fx ), 2 ) ); // p_q + ( Qfac - 2 ) - 31 - 2 = p_q + Qfac - 35
1417 : *p_sec_I_vec_x_fx = BASOP_Util_Add_Mant32Exp( *p_sec_I_vec_x_fx, *p_sec_I_vec_x_exp, tmp_x, tmp_exp, p_sec_I_vec_x_exp );
1418 : move32();
1419 : *p_sec_I_vec_y_fx = BASOP_Util_Add_Mant32Exp( *p_sec_I_vec_y_fx, *p_sec_I_vec_y_exp, tmp_y, tmp_exp, p_sec_I_vec_y_exp );
1420 : move32();
1421 : *p_sec_I_vec_z_fx = BASOP_Util_Add_Mant32Exp( *p_sec_I_vec_z_fx, *p_sec_I_vec_z_exp, tmp_z, tmp_exp, p_sec_I_vec_z_exp );
1422 : move32();
1423 : #else
1424 12990400 : temp_x64 = W_mac_32_32( W_mult_32_32( p_real_fx, sec_x_real_fx ), p_imag_fx, sec_x_imag_fx ); // ( Qfac - 3 ) + ( Qfac - 2 ) + 1 = 2 * Qfac - 4
1425 12990400 : temp_y64 = W_mac_32_32( W_mult_32_32( p_real_fx, sec_y_real_fx ), p_imag_fx, sec_y_imag_fx ); // ( Qfac - 3 ) + ( Qfac - 2 ) + 1 = 2 * Qfac - 4
1426 12990400 : temp_z64 = W_mac_32_32( W_mult_32_32( p_real_fx, sec_z_real_fx ), p_imag_fx, sec_z_imag_fx ); // ( Qfac - 3 ) + ( Qfac - 2 ) + 1 = 2 * Qfac - 4
1427 12990400 : sec_I_vec_x_64_fx = W_add( sec_I_vec_x_64_fx, temp_x64 );
1428 12990400 : sec_I_vec_y_64_fx = W_add( sec_I_vec_y_64_fx, temp_y64 );
1429 12990400 : sec_I_vec_z_64_fx = W_add( sec_I_vec_z_64_fx, temp_z64 );
1430 :
1431 : Word64 tmp1;
1432 : #endif
1433 : Word64 tmp2, tmp3, tmp4, sec_sum64;
1434 : #ifndef OPT_SBA_ENC_V2_NBE
1435 : Word32 tmp1;
1436 : Word32 tmp5, sec_sum;
1437 : tmp_exp = sub( 62, add( p_q, p_q ) );
1438 :
1439 : tmp1 = BASOP_Util_Add_Mant32Exp( Mpy_32_32( p_real_fx, p_real_fx ), tmp_exp, Mpy_32_32( p_imag_fx, p_imag_fx ), tmp_exp, &tmp_exp );
1440 : #endif
1441 : #ifdef OPT_SBA_ENC_V2_NBE
1442 12990400 : tmp1 = W_mac_32_32( W_mult_32_32( p_real_fx, p_real_fx ), p_imag_fx, p_imag_fx ); // 2 * (Qfac - 3) + 1
1443 12990400 : tmp1 = W_shl( tmp1, 2 ); // 2 * (Qfac - 2) + 1
1444 12990400 : tmp2 = W_mac_32_32( W_mult_32_32( sec_x_real_fx, sec_x_real_fx ), sec_x_imag_fx, sec_x_imag_fx ); // 2 * (Qfac - 2) + 1
1445 12990400 : tmp3 = W_mac_32_32( W_mult_32_32( sec_y_real_fx, sec_y_real_fx ), sec_y_imag_fx, sec_y_imag_fx ); // 2 * (Qfac - 2) + 1
1446 12990400 : tmp4 = W_mac_32_32( W_mult_32_32( sec_z_real_fx, sec_z_real_fx ), sec_z_imag_fx, sec_z_imag_fx ); // 2 * (Qfac - 2) + 1
1447 12990400 : sec_sum64 = W_add( tmp1, W_add( W_add( tmp2, tmp3 ), tmp4 ) ); // 2 * (Qfac - 2) + 1
1448 :
1449 : // instead dividing changed Q//
1450 12990400 : energy_64_fx = W_add( energy_64_fx, sec_sum64 ); // 2 * (Qfac - 2) + 1 + 1
1451 : #else
1452 : tmp2 = W_add( W_mult0_32_32( sec_x_real_fx, sec_x_real_fx ), W_mult0_32_32( sec_x_imag_fx, sec_x_imag_fx ) ); // 2 * (Qfac - 2)
1453 : tmp3 = W_add( W_mult0_32_32( sec_y_real_fx, sec_y_real_fx ), W_mult0_32_32( sec_y_imag_fx, sec_y_imag_fx ) ); // 2 * (Qfac - 2)
1454 : tmp4 = W_add( W_mult0_32_32( sec_z_real_fx, sec_z_real_fx ), W_mult0_32_32( sec_z_imag_fx, sec_z_imag_fx ) ); // 2 * (Qfac - 2)
1455 : sec_sum64 = W_add( W_add( tmp2, tmp3 ), tmp4 ); // 2 * (Qfac - 2)
1456 : n = W_norm( sec_sum64 );
1457 : sec_sum64 = W_shl( sec_sum64, n ); // 2 * (Qfac - 2) + n
1458 : sec_sum = W_extract_h( sec_sum64 ); // 2 * (Qfac - 2) + n - 32 = 2 * Qfac + n - 36
1459 : sec_sum_exp = sub( 67, add( shl( Qfac, 1 ), n ) );
1460 : // divide by 2:
1461 : tmp1 = L_shr( tmp1, 1 );
1462 : sec_sum = L_shr( sec_sum, 1 );
1463 : tmp5 = BASOP_Util_Add_Mant32Exp( tmp1, tmp_exp, sec_sum, sec_sum_exp, &tmp_exp );
1464 : energy_fx = BASOP_Util_Add_Mant32Exp( energy_fx, energy_exp, tmp5, tmp_exp, &energy_exp );
1465 : #endif
1466 : }
1467 : #ifdef OPT_SBA_ENC_V2_NBE
1468 779520 : tmp_scale = sub( W_norm( energy_64_fx ), 32 );
1469 779520 : energy_fx = W_shl_sat_l( energy_64_fx, tmp_scale );
1470 779520 : energy_exp = sub( tmp_exp_1, tmp_scale );
1471 779520 : if ( energy_fx == 0 )
1472 : {
1473 68960 : energy_exp = 0;
1474 68960 : move16();
1475 : }
1476 :
1477 779520 : tmp_scale = sub( W_norm( sec_I_vec_x_64_fx ), 32 );
1478 779520 : *p_sec_I_vec_x_fx = W_shl_sat_l( sec_I_vec_x_64_fx, tmp_scale );
1479 779520 : move32();
1480 779520 : *p_sec_I_vec_x_exp = sub( tmp_exp_2, tmp_scale );
1481 779520 : move16();
1482 779520 : if ( *p_sec_I_vec_x_fx == 0 )
1483 : {
1484 68960 : *p_sec_I_vec_x_exp = 0;
1485 68960 : move16();
1486 : }
1487 :
1488 779520 : tmp_scale = sub( W_norm( sec_I_vec_y_64_fx ), 32 );
1489 779520 : *p_sec_I_vec_y_fx = W_shl_sat_l( sec_I_vec_y_64_fx, tmp_scale );
1490 779520 : move32();
1491 779520 : *p_sec_I_vec_y_exp = sub( tmp_exp_2, tmp_scale );
1492 779520 : move16();
1493 779520 : if ( *p_sec_I_vec_y_fx == 0 )
1494 : {
1495 68960 : *p_sec_I_vec_y_exp = 0;
1496 68960 : move16();
1497 : }
1498 :
1499 779520 : tmp_scale = sub( W_norm( sec_I_vec_z_64_fx ), 32 );
1500 779520 : *p_sec_I_vec_z_fx = W_shl_sat_l( sec_I_vec_z_64_fx, tmp_scale );
1501 779520 : move32();
1502 779520 : *p_sec_I_vec_z_exp = sub( tmp_exp_2, tmp_scale );
1503 779520 : move16();
1504 779520 : if ( *p_sec_I_vec_z_fx == 0 )
1505 : {
1506 164440 : *p_sec_I_vec_z_exp = 0;
1507 164440 : move16();
1508 : }
1509 : #endif
1510 : }
1511 :
1512 1559040 : IF( hDirAC->firstrun_sector_params )
1513 : {
1514 672 : *p_sec_I_vec_smth_x_fx = *p_sec_I_vec_x_fx;
1515 672 : move32();
1516 672 : *p_sec_I_vec_smth_y_fx = *p_sec_I_vec_y_fx;
1517 672 : move32();
1518 672 : *p_sec_I_vec_smth_z_fx = *p_sec_I_vec_z_fx;
1519 672 : move32();
1520 672 : *p_energy_smth_fx = energy_fx;
1521 672 : move32();
1522 672 : *p_sec_I_vec_smth_x_exp = *p_sec_I_vec_x_exp;
1523 672 : move16();
1524 672 : *p_sec_I_vec_smth_y_exp = *p_sec_I_vec_y_exp;
1525 672 : move16();
1526 672 : *p_sec_I_vec_smth_z_exp = *p_sec_I_vec_z_exp;
1527 672 : move16();
1528 672 : *p_energy_smth_exp = energy_exp;
1529 672 : move16();
1530 : }
1531 : ELSE
1532 : {
1533 1558368 : Word32 w_fx = L_sub( ONE_IN_Q30, beta_fx ); // Q30
1534 : #ifdef OPT_SBA_ENC_V2_NBE
1535 : Word32 tmp_1, tmp_2, tmp_3, tmp_sec_1, tmp_sec_2, tmp_sec_3;
1536 : Word16 e_x, e_y, e_z;
1537 1558368 : move16();
1538 :
1539 1558368 : e_x = s_max( *p_sec_I_vec_x_exp, *p_sec_I_vec_smth_x_exp );
1540 1558368 : e_y = s_max( *p_sec_I_vec_y_exp, *p_sec_I_vec_smth_y_exp );
1541 1558368 : e_z = s_max( *p_sec_I_vec_z_exp, *p_sec_I_vec_smth_z_exp );
1542 :
1543 1558368 : tmp_1 = L_shr( *p_sec_I_vec_x_fx, sub( e_x, *p_sec_I_vec_x_exp ) ); // e_x
1544 1558368 : tmp_2 = L_shr( *p_sec_I_vec_y_fx, sub( e_y, *p_sec_I_vec_y_exp ) ); // e_y
1545 1558368 : tmp_3 = L_shr( *p_sec_I_vec_z_fx, sub( e_z, *p_sec_I_vec_z_exp ) ); // e_z
1546 1558368 : tmp_sec_1 = L_shr( *p_sec_I_vec_smth_x_fx, sub( e_x, *p_sec_I_vec_smth_x_exp ) ); // e_x
1547 1558368 : tmp_sec_2 = L_shr( *p_sec_I_vec_smth_y_fx, sub( e_y, *p_sec_I_vec_smth_y_exp ) ); // e_y
1548 1558368 : tmp_sec_3 = L_shr( *p_sec_I_vec_smth_z_fx, sub( e_z, *p_sec_I_vec_smth_z_exp ) ); // e_z
1549 :
1550 :
1551 1558368 : temp_x64 = W_mac_32_32( W_mult_32_32( w_fx, tmp_1 ), beta_fx, tmp_sec_1 ); // 31-e_x+30+1=62-e_x
1552 1558368 : temp_y64 = W_mac_32_32( W_mult_32_32( w_fx, tmp_2 ), beta_fx, tmp_sec_2 ); // 31-e_y+30+1=62-e_y
1553 1558368 : temp_z64 = W_mac_32_32( W_mult_32_32( w_fx, tmp_3 ), beta_fx, tmp_sec_3 ); // 31-e_z+30+1=62-e_z
1554 :
1555 1558368 : tmp_scale = sub( W_norm( temp_x64 ), 32 );
1556 1558368 : *p_sec_I_vec_smth_x_fx = W_shl_sat_l( temp_x64, tmp_scale );
1557 1558368 : move32();
1558 1558368 : *p_sec_I_vec_smth_x_exp = sub( sub( e_x, 31 ), tmp_scale ); // 31-(62-e_x+tmp_scale)=e_x-tmp_scale-31
1559 1558368 : move16();
1560 1558368 : if ( *p_sec_I_vec_smth_x_fx == 0 )
1561 : {
1562 137862 : *p_sec_I_vec_smth_x_exp = 0;
1563 137862 : move16();
1564 : }
1565 :
1566 1558368 : tmp_scale = sub( W_norm( temp_y64 ), 32 );
1567 1558368 : *p_sec_I_vec_smth_y_fx = W_shl_sat_l( temp_y64, tmp_scale );
1568 1558368 : move32();
1569 1558368 : *p_sec_I_vec_smth_y_exp = sub( sub( e_y, 31 ), tmp_scale ); // 31-(62-e_z+tmp_scale)=e_x-tmp_scale-31
1570 1558368 : move16();
1571 1558368 : if ( *p_sec_I_vec_smth_y_fx == 0 )
1572 : {
1573 137862 : *p_sec_I_vec_smth_y_exp = 0;
1574 137862 : move16();
1575 : }
1576 :
1577 1558368 : tmp_scale = sub( W_norm( temp_z64 ), 32 );
1578 1558368 : *p_sec_I_vec_smth_z_fx = W_shl_sat_l( temp_z64, tmp_scale );
1579 1558368 : move32();
1580 1558368 : *p_sec_I_vec_smth_z_exp = sub( sub( e_z, 31 ), tmp_scale ); // 31-(62-e_z+tmp_scale)=e_x-tmp_scale-31
1581 1558368 : move16();
1582 1558368 : if ( *p_sec_I_vec_smth_z_fx == 0 )
1583 : {
1584 328756 : *p_sec_I_vec_smth_z_exp = 0;
1585 328756 : move16();
1586 : }
1587 :
1588 1558368 : *p_energy_smth_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( w_fx, energy_fx ), add( energy_exp, 1 ), Mpy_32_32( beta_fx, *p_energy_smth_fx ), add( *p_energy_smth_exp, 1 ), p_energy_smth_exp );
1589 : #else
1590 : *p_sec_I_vec_smth_x_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( w_fx, *p_sec_I_vec_x_fx ), add( *p_sec_I_vec_x_exp, 1 ), Mpy_32_32( beta_fx, *p_sec_I_vec_smth_x_fx ), add( *p_sec_I_vec_smth_x_exp, 1 ), p_sec_I_vec_smth_x_exp );
1591 : move32();
1592 : *p_sec_I_vec_smth_y_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( w_fx, *p_sec_I_vec_y_fx ), add( *p_sec_I_vec_y_exp, 1 ), Mpy_32_32( beta_fx, *p_sec_I_vec_smth_y_fx ), add( *p_sec_I_vec_smth_y_exp, 1 ), p_sec_I_vec_smth_y_exp );
1593 : move32();
1594 : *p_sec_I_vec_smth_z_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( w_fx, *p_sec_I_vec_z_fx ), add( *p_sec_I_vec_z_exp, 1 ), Mpy_32_32( beta_fx, *p_sec_I_vec_smth_z_fx ), add( *p_sec_I_vec_smth_z_exp, 1 ), p_sec_I_vec_smth_z_exp );
1595 : move32();
1596 : *p_energy_smth_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( w_fx, energy_fx ), add( energy_exp, 1 ), Mpy_32_32( beta_fx, *p_energy_smth_fx ), add( *p_energy_smth_exp, 1 ), p_energy_smth_exp );
1597 : #endif
1598 1558368 : move32();
1599 : }
1600 :
1601 1559040 : IF( LT_32( energy_fx, EPSILON_FX_SMALL ) )
1602 : {
1603 137920 : *p_azi_fx = 0;
1604 137920 : move32();
1605 137920 : *p_ele_fx = 0;
1606 137920 : move32();
1607 137920 : *p_ene_fx = 0;
1608 137920 : move32();
1609 137920 : *p_ene_exp = 0;
1610 137920 : move16();
1611 137920 : *p_diff_fx = ONE_IN_Q30;
1612 137920 : move32();
1613 137920 : *p_diff_exp = 1;
1614 137920 : move16();
1615 : }
1616 : ELSE
1617 : {
1618 : Word32 tmp_x, tmp_y, tmp_z, tmp_xy_hypo, tmp32;
1619 : Word16 tmp16, tmp_e;
1620 1421120 : tmp_x = Mpy_32_32( *p_sec_I_vec_smth_x_fx, *p_sec_I_vec_smth_x_fx );
1621 1421120 : tmp_y = Mpy_32_32( *p_sec_I_vec_smth_y_fx, *p_sec_I_vec_smth_y_fx );
1622 1421120 : tmp_z = Mpy_32_32( *p_sec_I_vec_smth_z_fx, *p_sec_I_vec_smth_z_fx );
1623 1421120 : tmp32 = BASOP_Util_Add_Mant32Exp( tmp_x, shl( *p_sec_I_vec_smth_x_exp, 1 ), tmp_y, shl( *p_sec_I_vec_smth_y_exp, 1 ), &tmp_e );
1624 1421120 : normI_fx = BASOP_Util_Add_Mant32Exp( tmp32, tmp_e, tmp_z, shl( *p_sec_I_vec_smth_z_exp, 1 ), &normI_exp );
1625 1421120 : normI_fx = Sqrt32( normI_fx, &normI_exp );
1626 :
1627 1421120 : tmp32 = BASOP_Util_Add_Mant32Exp( tmp32, tmp_e, 0, 0, &tmp_e ); // normalising value of tmp32
1628 1421120 : tmp_xy_hypo = Sqrt32( tmp32, &tmp_e ); // sqrt(x^2 + y^2)
1629 :
1630 1421120 : tmp16 = BASOP_util_atan2( *p_sec_I_vec_smth_y_fx, *p_sec_I_vec_smth_x_fx, sub( *p_sec_I_vec_smth_y_exp, *p_sec_I_vec_smth_x_exp ) ); // Q13
1631 1421120 : *p_azi_fx = Mpy_32_32( L_deposit_h( tmp16 ), _180_OVER_PI_Q25 ); // (Q13 + 16) + Q25 - 31 = 54 - 31 = Q23
1632 1421120 : move32();
1633 1421120 : tmp16 = BASOP_util_atan2( *p_sec_I_vec_smth_z_fx, L_add( tmp_xy_hypo, EPSILON_FX_SMALL ), sub( *p_sec_I_vec_smth_z_exp, tmp_e ) ); // Q13
1634 1421120 : *p_ele_fx = Mpy_32_32( L_deposit_h( tmp16 ), _180_OVER_PI_Q25 ); // (Q13 + 16) + Q25 - 31 = 54 - 31 = Q23
1635 1421120 : move32();
1636 1421120 : *p_ene_fx = *p_energy_smth_fx;
1637 1421120 : move32();
1638 1421120 : *p_ene_exp = *p_energy_smth_exp;
1639 1421120 : move16();
1640 :
1641 1421120 : tmp32 = L_deposit_h( BASOP_Util_Divide3232_Scale( normI_fx, L_add_sat( *p_energy_smth_fx, EPSILON_FX_SMALL ), &tmp_e ) );
1642 1421120 : tmp_e = add( tmp_e, sub( normI_exp, *p_energy_smth_exp ) );
1643 1421120 : tmp32 = BASOP_Util_Add_Mant32Exp( ONE_IN_Q30, 1, L_negate( tmp32 ), tmp_e, &tmp_e );
1644 1421120 : *p_diff_fx = tmp32;
1645 1421120 : move32();
1646 1421120 : *p_diff_exp = tmp_e;
1647 1421120 : move16();
1648 : }
1649 :
1650 1559040 : tmp_diff_fx = *p_diff_fx;
1651 1559040 : move32();
1652 1559040 : tmp_diff_exp = *p_diff_exp;
1653 1559040 : move16();
1654 1559040 : if ( tmp_diff_fx < 0 )
1655 : {
1656 7552 : tmp_diff_fx = 0;
1657 7552 : move32();
1658 : }
1659 :
1660 1559040 : tmp_diff_fx = L_shr( tmp_diff_fx, sub( 2, tmp_diff_exp ) ); // Q29
1661 1559040 : tmp_diff_exp = 2;
1662 1559040 : move16();
1663 :
1664 1559040 : IF( GT_32( tmp_diff_fx, ONE_IN_Q28 ) )
1665 : {
1666 618144 : IF( hDirAC->firstrun_sector_params )
1667 : {
1668 203 : *p_azi_fx = 0;
1669 203 : move32();
1670 203 : *p_ele_fx = 0;
1671 203 : move32();
1672 : }
1673 : ELSE
1674 : {
1675 : #ifdef OPT_SBA_ENC_V2_NBE
1676 617941 : tmp32_1 = L_sub( ONE_IN_Q29, tmp_diff_fx );
1677 617941 : tmp32_2 = L_sub( tmp_diff_fx, ONE_IN_Q29 / 2 );
1678 :
1679 : // *p_azi = 2.f * (1.f - tmp_diff) * *p_azi + (2.f * tmp_diff - 1.f) * *p_azi_prev
1680 617941 : *p_azi_fx = L_shl( Madd_32_32( Mpy_32_32( tmp32_1, *p_azi_fx ), tmp32_2, *p_azi_prev_fx ), 3 ); // Q29 + Q23 - 31 + 2 = Q23
1681 617941 : move32();
1682 :
1683 : // *p_ele = 2.f * (1.f - tmp_diff) * *p_ele + (2.f * tmp_diff - 1.f) * *p_ele_prev
1684 617941 : *p_ele_fx = L_shl( Madd_32_32( Mpy_32_32( tmp32_1, *p_ele_fx ), tmp32_2, *p_ele_prev_fx ), 3 ); // Q29 + Q23 - 31 + 2 = Q23
1685 617941 : move32();
1686 : #else
1687 : *p_azi_fx = L_shl( L_add( Mpy_32_32( L_sub( ONE_IN_Q29, tmp_diff_fx ), *p_azi_fx ), Mpy_32_32( L_sub( tmp_diff_fx, ONE_IN_Q29 / 2 ), *p_azi_prev_fx ) ), 1 ); // Q29 + Q23 - 31 = Q21
1688 : move32();
1689 : *p_ele_fx = L_shl( L_add( Mpy_32_32( L_sub( ONE_IN_Q29, tmp_diff_fx ), *p_ele_fx ), Mpy_32_32( L_sub( tmp_diff_fx, ONE_IN_Q29 / 2 ), *p_ele_prev_fx ) ), 1 ); // Q29 + Q23 - 31 = Q21
1690 : move32();
1691 : *p_azi_fx = L_shl( *p_azi_fx, 2 ); // Q21 -> Q23;
1692 : move32();
1693 : *p_ele_fx = L_shl( *p_ele_fx, 2 ); // Q21 -> Q23;
1694 : move32();
1695 : #endif
1696 : }
1697 : }
1698 : ELSE
1699 : {
1700 940896 : *p_azi_prev_fx = *p_azi_fx;
1701 940896 : move32();
1702 940896 : *p_ele_prev_fx = *p_ele_fx;
1703 940896 : move32();
1704 : }
1705 : }
1706 : }
1707 :
1708 64960 : hDirAC->firstrun_sector_params = 0;
1709 64960 : move16();
1710 :
1711 64960 : return;
1712 : }
1713 :
1714 :
1715 : /*-----------------------------------------------------------------------*
1716 : * Local functions
1717 : *-----------------------------------------------------------------------*/
1718 :
1719 :
1720 : /*-------------------------------------------------------------------*
1721 : * deindex_sph_idx_general()
1722 : *
1723 : * deindex the spherical index for more than 2 bits for the spherical grid
1724 : *----------------------------------------------------------------------*/
1725 :
1726 1905069 : static UWord16 deindex_sph_idx_general_fx(
1727 : const Word16 idx_sph, /* i : spherical index */
1728 : const Word16 no_bits, /* i : number of bits in the spherical grid */
1729 : Word32 *theta_dec_fx, /* o : decoded elevation value Q22 */
1730 : Word32 *phi_dec_fx, /* o : decoded azimuth value Q22 */
1731 : UWord16 *p_id_phi, /* o : decoded azimuth index */
1732 : const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */
1733 : )
1734 : {
1735 : Word16 i;
1736 : UWord16 id_th;
1737 : Word16 q_id_th;
1738 : Word32 id_th_fx;
1739 : Word16 sign_theta;
1740 : Word16 id_phi;
1741 : Word16 cum_n[250];
1742 : Word16 no_th;
1743 : const Word16 *n;
1744 :
1745 1905069 : id_th = 0;
1746 1905069 : move16();
1747 1905069 : id_phi = 0;
1748 1905069 : move16();
1749 1905069 : sign_theta = 1;
1750 1905069 : move16();
1751 :
1752 1905069 : no_th = no_theta_masa[no_bits - 3];
1753 1905069 : move16();
1754 1905069 : n = no_phi_masa[no_bits - 1];
1755 1905069 : IF( NE_32( mc_format, MC_LS_SETUP_INVALID ) )
1756 : {
1757 : /* indexing */
1758 :
1759 8828 : cum_n[0] = n[0];
1760 8828 : move16();
1761 8828 : IF( GE_16( idx_sph, cum_n[0] ) )
1762 : {
1763 10904 : FOR( i = 1; i < no_th; i++ )
1764 : {
1765 10904 : cum_n[i] = add( cum_n[i - 1], n[i] );
1766 10904 : move16();
1767 10904 : IF( LT_16( idx_sph, cum_n[i] ) )
1768 : {
1769 7481 : id_th = i;
1770 7481 : move16();
1771 7481 : id_phi = sub( idx_sph, cum_n[i - 1] );
1772 7481 : BREAK;
1773 : }
1774 : }
1775 : }
1776 : }
1777 : ELSE
1778 : {
1779 : /* Starting from Equator, alternating positive and negative */
1780 1896241 : cum_n[0] = n[0];
1781 1896241 : move16();
1782 1896241 : IF( GE_16( idx_sph, cum_n[0] ) )
1783 : {
1784 1407604 : FOR( i = 1; i < no_th; i++ )
1785 : {
1786 1407604 : cum_n[2 * i - 1] = add( cum_n[2 * i - 2], n[i] );
1787 1407604 : move16();
1788 :
1789 1407604 : IF( LT_16( idx_sph, cum_n[2 * i - 1] ) )
1790 : {
1791 404180 : id_th = i;
1792 404180 : move16();
1793 404180 : sign_theta = 1;
1794 404180 : move16();
1795 404180 : id_phi = sub( idx_sph, cum_n[2 * i - 2] );
1796 404180 : BREAK;
1797 : }
1798 :
1799 1003424 : cum_n[2 * i] = add( cum_n[2 * i - 1], n[i] );
1800 1003424 : move16();
1801 :
1802 1003424 : IF( LT_16( idx_sph, cum_n[2 * i] ) )
1803 : {
1804 438489 : id_th = i;
1805 438489 : move16();
1806 438489 : sign_theta = -1;
1807 438489 : move16();
1808 438489 : id_phi = sub( idx_sph, cum_n[2 * i - 1] );
1809 438489 : BREAK;
1810 : }
1811 :
1812 564935 : IF( EQ_16( i, sub( no_th, 1 ) ) )
1813 : {
1814 0 : id_th = i;
1815 0 : move16();
1816 0 : sign_theta = -1;
1817 0 : move16();
1818 0 : id_phi = 0; /* idx_sph - cum_n[2*i-1]; */
1819 0 : move16();
1820 0 : BREAK;
1821 : }
1822 : }
1823 : }
1824 : }
1825 :
1826 1905069 : IF( id_th == 0 )
1827 : {
1828 1054919 : id_phi = idx_sph;
1829 1054919 : move16();
1830 : }
1831 : ELSE
1832 : {
1833 850150 : test();
1834 850150 : if ( EQ_32( id_th, sub( no_th, 1 ) ) && GT_16( no_bits, 4 ) )
1835 : {
1836 2468 : id_phi = 0;
1837 2468 : move16();
1838 : }
1839 : }
1840 :
1841 1905069 : q_id_th = norm_l( id_th );
1842 1905069 : id_th_fx = L_shl( id_th, q_id_th );
1843 1905069 : *theta_dec_fx = L_shl( Mpy_32_32( id_th_fx, delta_theta_masa_fx[no_bits - 3] ), sub( 31, q_id_th ) ); // Q22
1844 1905069 : move32();
1845 :
1846 1905069 : IF( GE_32( *theta_dec_fx, 90 << Q22 ) )
1847 : {
1848 2438 : *theta_dec_fx = ( 90 << 22 ) * sign_theta;
1849 2438 : move32();
1850 2438 : *phi_dec_fx = 0;
1851 2438 : move32();
1852 2438 : *p_id_phi = 0;
1853 2438 : move16();
1854 : }
1855 : ELSE
1856 : {
1857 1902631 : *theta_dec_fx *= sign_theta;
1858 :
1859 1902631 : *phi_dec_fx = deindex_azimuth_fx( id_phi, no_bits, id_th, 0, mc_format ); // Q22
1860 1902631 : move32();
1861 1902631 : *p_id_phi = id_phi;
1862 1902631 : move16();
1863 : }
1864 :
1865 1905069 : return id_th;
1866 : }
|