LCOV - code coverage report
Current view: top level - lib_com - ivas_dirac_com_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main enc/dec/rend @ 574a190e3c6896c6c4ed10d7f23649709a0c4347 Lines: 810 904 89.6 %
Date: 2025-06-27 02:59:36 Functions: 11 12 91.7 %

          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             : }

Generated by: LCOV version 1.14