LCOV - code coverage report
Current view: top level - lib_com - hq_conf_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main enc/dec/rend @ 574a190e3c6896c6c4ed10d7f23649709a0c4347 Lines: 357 490 72.9 %
Date: 2025-06-27 02:59:36 Functions: 3 3 100.0 %

          Line data    Source code
       1             : /*====================================================================================
       2             :     EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0
       3             :   ====================================================================================*/
       4             : 
       5             : #include <stdint.h>
       6             : #include "options.h"
       7             : #include "cnst.h"    /* Audio core constants */
       8             : #include "rom_com.h" /* Static table prototypes                */
       9             : #include "prot_fx.h" /* Function prototypes                    */
      10             : #include "ivas_prot_fx.h"
      11             : #include "wmc_auto.h"
      12             : 
      13             : /*--------------------------------------------------------------------------*
      14             :  * hq_configure()
      15             :  *
      16             :  * Configuration routine for HQ mode
      17             :  *--------------------------------------------------------------------------*/
      18             : 
      19        7331 : void ivas_hq_configure_fx(
      20             :     const Word16 length,       /* i  : Frame length                      Q0 */
      21             :     const Word16 hqswb_clas,   /* i  : HQ SWB class                      Q0 */
      22             :     const Word32 core_brate,   /* i  : Codec bitrate                     Q0 */
      23             :     Word16 *num_sfm,           /* o  : Total number of subbands          Q0 */
      24             :     Word16 *nb_sfm,            /* o  : Total number of coded bands       Q0 */
      25             :     Word16 *start_norm,        /* o  : First norm to be SDE encoded      Q0 */
      26             :     Word16 *num_env_bands,     /* o  : Number coded envelope bands       Q0 */
      27             :     Word16 *numnrmibits,       /* o  : Number of bits in fall-back norm encoding  Q0 */
      28             :     Word16 *hq_generic_offset, /* o  : Freq offset for HQ GENERIC        Q0 */
      29             :     Word16 *sfmsize,           /* o  : Subband bandwidths                Q0 */
      30             :     Word16 *sfm_start,         /* o  : Subband start coefficients        Q0 */
      31             :     Word16 *sfm_end            /* o  : Subband end coefficients          Q0 */
      32             : )
      33             : {
      34             :     const Word16 *p_sfmsize;
      35             :     const Word16 *p_sfm_start;
      36             :     const Word16 *p_sfm_end;
      37             :     Word16 i, bw_ext;
      38             : 
      39        7331 :     bw_ext = 0;
      40        7331 :     move16();
      41             : 
      42        7331 :     *start_norm = 0;
      43        7331 :     move16();
      44             : 
      45        7331 :     IF( EQ_16( length, L_SPEC48k ) )
      46             :     {
      47        5528 :         IF( EQ_16( hqswb_clas, HQ_GEN_FB ) )
      48             :         {
      49        2070 :             *num_sfm = NB_SFM;
      50        2070 :             move16();
      51        2070 :             p_sfmsize = band_len_HQ;     /* Q0 */
      52        2070 :             p_sfm_start = band_start_HQ; /* Q0 */
      53        2070 :             p_sfm_end = band_end_HQ;     /* Q0 */
      54             : 
      55        2070 :             IF( GE_32( core_brate, HQ_32k ) )
      56             :             {
      57           0 :                 *hq_generic_offset = HQ_GENERIC_FOFFSET_32K;
      58           0 :                 move16();
      59           0 :                 *num_env_bands = SFM_N_STA_10k;
      60           0 :                 move16();
      61             :             }
      62             :             ELSE /*IF(EQ_32(core_brate, HQ_16k40) || EQ_32(core_brate, HQ_24k40))*/
      63             :             {
      64        2070 :                 *hq_generic_offset = HQ_GENERIC_FOFFSET_24K4;
      65        2070 :                 move16();
      66        2070 :                 *num_env_bands = SFM_N_STA_8k;
      67        2070 :                 move16();
      68             :             }
      69        2070 :             *nb_sfm = *num_sfm;
      70        2070 :             move16();
      71             :         }
      72             :         ELSE
      73             :         {
      74        3458 :             IF( EQ_16( hqswb_clas, HQ_HARMONIC ) )
      75             :             {
      76         635 :                 *num_sfm = SFM_N_HARM_FB;
      77         635 :                 move16();
      78         635 :                 *nb_sfm = SFM_N_HARM_FB;
      79         635 :                 move16();
      80         635 :                 *num_env_bands = SFM_N_HARM_FB;
      81         635 :                 move16();
      82             : 
      83         635 :                 p_sfmsize = band_len_harm;     /* Q0 */
      84         635 :                 p_sfm_start = band_start_harm; /* Q0 */
      85         635 :                 p_sfm_end = band_end_harm;     /* Q0 */
      86             :             }
      87        2823 :             ELSE IF( EQ_16( hqswb_clas, HQ_HVQ ) )
      88             :             {
      89        1051 :                 IF( LT_32( core_brate, HQ_BWE_CROSSOVER_BRATE ) )
      90             :                 {
      91         536 :                     *num_sfm = SFM_N_HARM_FB;
      92         536 :                     move16();
      93         536 :                     *nb_sfm = HVQ_THRES_SFM_24k;
      94         536 :                     move16();
      95         536 :                     *num_env_bands = sub( *num_sfm, *nb_sfm ); /* Q0 */
      96         536 :                     move16();
      97         536 :                     *start_norm = HVQ_THRES_SFM_24k;
      98         536 :                     move16();
      99             :                 }
     100             :                 ELSE
     101             :                 {
     102         515 :                     *num_sfm = SFM_N_HARM_FB;
     103         515 :                     move16();
     104         515 :                     *nb_sfm = HVQ_THRES_SFM_32k;
     105         515 :                     move16();
     106         515 :                     *num_env_bands = sub( *num_sfm, *nb_sfm ); /* Q0 */
     107         515 :                     move16();
     108         515 :                     *start_norm = HVQ_THRES_SFM_32k;
     109         515 :                     move16();
     110             :                 }
     111        1051 :                 p_sfmsize = band_len_harm;     /* Q0 */
     112        1051 :                 p_sfm_start = band_start_harm; /* Q0 */
     113        1051 :                 p_sfm_end = band_end_harm;     /* Q0 */
     114             :             }
     115             :             ELSE
     116             :             {
     117        1772 :                 *num_sfm = NB_SFM;
     118        1772 :                 move16();
     119        1772 :                 *nb_sfm = *num_sfm; /* Q0 */
     120        1772 :                 move16();
     121        1772 :                 *num_env_bands = NB_SFM;
     122        1772 :                 move16();
     123             : 
     124        1772 :                 p_sfmsize = band_len_HQ;     /* Q0 */
     125        1772 :                 p_sfm_start = band_start_HQ; /* Q0 */
     126        1772 :                 p_sfm_end = band_end_HQ;     /* Q0 */
     127             :             }
     128             :         }
     129             :     }
     130        1803 :     ELSE IF( EQ_16( length, L_SPEC32k ) )
     131             :     {
     132        1085 :         IF( EQ_16( hqswb_clas, HQ_HARMONIC ) )
     133             :         {
     134          73 :             *num_sfm = SFM_N_HARM;
     135          73 :             move16();
     136          73 :             *nb_sfm = SFM_N_HARM;
     137          73 :             move16();
     138          73 :             *num_env_bands = SFM_N_HARM;
     139          73 :             move16();
     140             : 
     141          73 :             p_sfmsize = band_len_harm;     /* Q0 */
     142          73 :             p_sfm_start = band_start_harm; /* Q0 */
     143          73 :             p_sfm_end = band_end_harm;     /* Q0 */
     144             :         }
     145        1012 :         ELSE IF( EQ_16( hqswb_clas, HQ_HVQ ) )
     146             :         {
     147         178 :             IF( LT_32( core_brate, HQ_BWE_CROSSOVER_BRATE ) )
     148             :             {
     149         172 :                 *num_sfm = SFM_N_HARM;
     150         172 :                 move16();
     151         172 :                 *nb_sfm = HVQ_THRES_SFM_24k;
     152         172 :                 move16();
     153         172 :                 *num_env_bands = sub( *num_sfm, *nb_sfm ); /* Q0 */
     154         172 :                 move16();
     155             : 
     156         172 :                 *start_norm = HVQ_THRES_SFM_24k;
     157         172 :                 move16();
     158             :             }
     159             :             ELSE
     160             :             {
     161           6 :                 *num_sfm = SFM_N_HARM;
     162           6 :                 move16();
     163           6 :                 *nb_sfm = HVQ_THRES_SFM_32k;
     164           6 :                 move16();
     165           6 :                 *num_env_bands = sub( *num_sfm, *nb_sfm ); /* Q0 */
     166           6 :                 move16();
     167             : 
     168           6 :                 *start_norm = HVQ_THRES_SFM_32k;
     169           6 :                 move16();
     170             :             }
     171         178 :             p_sfmsize = band_len_harm;
     172         178 :             p_sfm_start = band_start_harm;
     173         178 :             p_sfm_end = band_end_harm;
     174             :         }
     175         834 :         ELSE IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) )
     176             :         {
     177         673 :             *num_sfm = SFM_N_SWB;
     178         673 :             move16();
     179         673 :             p_sfmsize = band_len_HQ;     /* Q0 */
     180         673 :             p_sfm_start = band_start_HQ; /* Q0 */
     181         673 :             p_sfm_end = band_end_HQ;     /* Q0 */
     182             : 
     183         673 :             IF( GE_32( core_brate, HQ_32k ) )
     184             :             {
     185           0 :                 *hq_generic_offset = HQ_GENERIC_FOFFSET_32K;
     186           0 :                 move16();
     187           0 :                 *num_env_bands = SFM_N_STA_10k;
     188           0 :                 move16();
     189             :             }
     190             :             ELSE /*if( EQ_32(core_brate, HQ_24k40))*/
     191             :             {
     192         673 :                 *hq_generic_offset = HQ_GENERIC_FOFFSET_24K4;
     193         673 :                 move16();
     194         673 :                 *num_env_bands = SFM_N_STA_8k;
     195         673 :                 move16();
     196             :             }
     197             : 
     198         673 :             *nb_sfm = *num_sfm;
     199         673 :             move16();
     200             :         }
     201             :         ELSE
     202             :         {
     203             :             /* HQ_NORMAL and HQ_TRANSIENT */
     204         161 :             *num_sfm = SFM_N_SWB;
     205         161 :             move16();
     206         161 :             *nb_sfm = *num_sfm; /* Q0 */
     207         161 :             move16();
     208         161 :             *num_env_bands = SFM_N_SWB;
     209         161 :             move16();
     210             : 
     211         161 :             p_sfmsize = band_len_HQ;     /* Q0 */
     212         161 :             p_sfm_start = band_start_HQ; /* Q0 */
     213         161 :             p_sfm_end = band_end_HQ;     /* Q0 */
     214             :         }
     215             :     }
     216         718 :     ELSE IF( EQ_16( length, L_SPEC48k_EXT ) )
     217             :     {
     218          89 :         bw_ext = 1;
     219          89 :         move16();
     220          89 :         p_sfmsize = band_len_HQ;     /* Q0 */
     221          89 :         p_sfm_start = band_start_HQ; /* Q0 */
     222          89 :         p_sfm_end = band_end_HQ;     /* Q0 */
     223          89 :         *num_sfm = NB_SFM;
     224          89 :         move16();
     225             :     }
     226         629 :     ELSE IF( EQ_16( length, L_SPEC16k_EXT ) )
     227             :     {
     228          33 :         bw_ext = 1;
     229          33 :         move16();
     230          33 :         p_sfmsize = band_len_wb;     /* Q0 */
     231          33 :         p_sfm_start = band_start_wb; /* Q0 */
     232          33 :         p_sfm_end = band_end_wb;     /* Q0 */
     233          33 :         *num_sfm = SFM_N_WB;
     234          33 :         move16();
     235             :     }
     236             :     ELSE
     237             :     {
     238         596 :         *num_sfm = SFM_N_WB;
     239         596 :         move16();
     240         596 :         *nb_sfm = *num_sfm; /* Q0 */
     241         596 :         move16();
     242         596 :         *num_env_bands = SFM_N_WB;
     243         596 :         move16();
     244             : 
     245         596 :         p_sfmsize = band_len_wb;     /* Q0 */
     246         596 :         p_sfm_start = band_start_wb; /* Q0 */
     247         596 :         p_sfm_end = band_end_wb;     /* Q0 */
     248             :     }
     249        7331 :     IF( bw_ext )
     250             :     {
     251        4896 :         FOR( i = 0; i < *num_sfm; i++ )
     252             :         {
     253             :             /*sfmsize[i] = (int16_t)(1.25f * p_sfmsize[i]);*/
     254        4774 :             sfmsize[i] = mult_r( shl( p_sfmsize[i], 1 ), 20480 /* 1.25 in Q14 */ ); /* Q0 */
     255        4774 :             move16();
     256             :             /*sfm_start[i] = (int16_t)(1.25f * p_sfm_start[i]);*/
     257        4774 :             sfm_start[i] = mult_r( shl( p_sfm_start[i], 1 ), 20480 /* 1.25 in Q14 */ ); /* Q0 */
     258        4774 :             move16();
     259             :             /*sfm_end[i] = (int16_t)(1.25f * p_sfm_end[i]);*/
     260        4774 :             sfm_end[i] = mult_r( shl( p_sfm_end[i], 1 ), 20480 /* 1.25 in Q14 */ ); /* Q0 */
     261        4774 :             move16();
     262             :         }
     263         122 :         *nb_sfm = *num_sfm;        /* Q0 */
     264         122 :         *num_env_bands = *num_sfm; /* Q0 */
     265         122 :         move16();
     266         122 :         move16();
     267             :     }
     268             :     ELSE
     269             :     {
     270        7209 :         Copy( p_sfmsize, sfmsize, *num_sfm );
     271        7209 :         Copy( p_sfm_start, sfm_start, *num_sfm );
     272        7209 :         Copy( p_sfm_end, sfm_end, *num_sfm );
     273             :     }
     274             : 
     275        7331 :     *numnrmibits = extract_l( L_mult0( sub( *num_env_bands, 1 ), NORMI_BITS ) );
     276        7331 :     move16();
     277             : 
     278        7331 :     return;
     279             : }
     280             : 
     281         785 : void hq_configure_evs_fx(
     282             :     const Word16 length,       /* i  : Frame length                      Q0 */
     283             :     const Word16 hqswb_clas,   /* i  : HQ SWB class                      Q0 */
     284             :     const Word32 core_brate,   /* i  : Codec bitrate                     Q0 */
     285             :     Word16 *num_sfm,           /* o  : Total number of subbands          Q0 */
     286             :     Word16 *nb_sfm,            /* o  : Total number of coded bands       Q0 */
     287             :     Word16 *start_norm,        /* o  : First norm to be SDE encoded      Q0 */
     288             :     Word16 *num_env_bands,     /* o  : Number coded envelope bands       Q0 */
     289             :     Word16 *numnrmibits,       /* o  : Number of bits in fall-back norm encoding  Q0 */
     290             :     Word16 *hq_generic_offset, /* o  : Freq offset for HQ GENERIC        Q0 */
     291             :     Word16 *sfmsize,           /* o  : Subband bandwidths                Q0 */
     292             :     Word16 *sfm_start,         /* o  : Subband start coefficients        Q0 */
     293             :     Word16 *sfm_end            /* o  : Subband end coefficients          Q0 */
     294             : )
     295             : {
     296             :     const Word16 *p_sfmsize;
     297             :     const Word16 *p_sfm_start;
     298             :     const Word16 *p_sfm_end;
     299             :     Word16 i, bw_ext;
     300             : 
     301         785 :     bw_ext = 0;
     302         785 :     move16();
     303             : 
     304         785 :     *start_norm = 0;
     305         785 :     move16();
     306             : 
     307         785 :     IF( EQ_16( length, L_FRAME48k ) ) /*tbv SOLVED_COMP_ENC_DEC*/
     308             :     {
     309           0 :         IF( EQ_16( hqswb_clas, HQ_GEN_FB ) )
     310             :         {
     311           0 :             *num_sfm = NB_SFM;
     312           0 :             move16();
     313           0 :             p_sfmsize = band_len_HQ;     /* Q0 */
     314           0 :             p_sfm_start = band_start_HQ; /* Q0 */
     315           0 :             p_sfm_end = band_end_HQ;     /* Q0 */
     316             : 
     317           0 :             IF( GE_32( core_brate, HQ_32k ) )
     318             :             {
     319           0 :                 *hq_generic_offset = HQ_GENERIC_FOFFSET_32K;
     320           0 :                 move16();
     321           0 :                 *num_env_bands = SFM_N_STA_10k;
     322           0 :                 move16();
     323             :             }
     324             :             ELSE /*IF(EQ_32(core_brate, HQ_16k40) || EQ_32(core_brate, HQ_24k40))*/
     325             :             {
     326           0 :                 *hq_generic_offset = HQ_GENERIC_FOFFSET_24K4;
     327           0 :                 *num_env_bands = SFM_N_STA_8k;
     328           0 :                 move16();
     329           0 :                 move16();
     330             :             }
     331           0 :             *nb_sfm = *num_sfm; /* Q0 */
     332           0 :             move16();
     333             :         }
     334             :         ELSE
     335             :         {
     336           0 :             IF( EQ_16( hqswb_clas, HQ_HARMONIC ) )
     337             :             {
     338           0 :                 *num_sfm = SFM_N_HARM_FB;
     339           0 :                 move16();
     340           0 :                 *nb_sfm = SFM_N_HARM_FB;
     341           0 :                 move16();
     342           0 :                 *num_env_bands = SFM_N_HARM_FB;
     343           0 :                 move16();
     344             : 
     345           0 :                 p_sfmsize = band_len_harm;     /* Q0 */
     346           0 :                 p_sfm_start = band_start_harm; /* Q0 */
     347           0 :                 p_sfm_end = band_end_harm;     /* Q0 */
     348             :             }
     349           0 :             ELSE IF( EQ_16( hqswb_clas, HQ_HVQ ) )
     350             :             {
     351           0 :                 IF( LT_32( core_brate, HQ_BWE_CROSSOVER_BRATE ) )
     352             :                 {
     353           0 :                     *num_sfm = SFM_N_HARM_FB;
     354           0 :                     move16();
     355           0 :                     *nb_sfm = HVQ_THRES_SFM_24k;
     356           0 :                     move16();
     357           0 :                     *num_env_bands = sub( *num_sfm, *nb_sfm ); /* Q0 */
     358           0 :                     move16();
     359           0 :                     *start_norm = HVQ_THRES_SFM_24k;
     360           0 :                     move16();
     361             :                 }
     362             :                 ELSE
     363             :                 {
     364           0 :                     *num_sfm = SFM_N_HARM_FB;
     365           0 :                     move16();
     366           0 :                     *nb_sfm = HVQ_THRES_SFM_32k;
     367           0 :                     move16();
     368           0 :                     *num_env_bands = sub( *num_sfm, *nb_sfm ); /* Q0 */
     369           0 :                     move16();
     370           0 :                     *start_norm = HVQ_THRES_SFM_32k;
     371           0 :                     move16();
     372             :                 }
     373           0 :                 p_sfmsize = band_len_harm;     /* Q0 */
     374           0 :                 p_sfm_start = band_start_harm; /* Q0 */
     375           0 :                 p_sfm_end = band_end_harm;     /* Q0 */
     376             :             }
     377             :             ELSE
     378             :             {
     379           0 :                 *num_sfm = NB_SFM;
     380           0 :                 move16();
     381           0 :                 *nb_sfm = *num_sfm; /* Q0 */
     382           0 :                 move16();
     383           0 :                 *num_env_bands = NB_SFM;
     384           0 :                 move16();
     385             : 
     386           0 :                 p_sfmsize = band_len_HQ;     /* Q0 */
     387           0 :                 p_sfm_start = band_start_HQ; /* Q0 */
     388           0 :                 p_sfm_end = band_end_HQ;     /* Q0 */
     389             :             }
     390             :         }
     391             :     }
     392         785 :     ELSE IF( EQ_16( length, L_SPEC32k ) )
     393             :     {
     394         785 :         IF( EQ_16( hqswb_clas, HQ_HARMONIC ) )
     395             :         {
     396          39 :             *num_sfm = SFM_N_HARM;
     397          39 :             move16();
     398          39 :             *nb_sfm = SFM_N_HARM;
     399          39 :             move16();
     400          39 :             *num_env_bands = SFM_N_HARM;
     401          39 :             move16();
     402             : 
     403          39 :             p_sfmsize = band_len_harm;     /* Q0 */
     404          39 :             p_sfm_start = band_start_harm; /* Q0 */
     405          39 :             p_sfm_end = band_end_harm;     /* Q0 */
     406             :         }
     407         746 :         ELSE IF( EQ_16( hqswb_clas, HQ_HVQ ) )
     408             :         {
     409           0 :             IF( LT_32( core_brate, HQ_BWE_CROSSOVER_BRATE ) )
     410             :             {
     411           0 :                 *num_sfm = SFM_N_HARM;
     412           0 :                 move16();
     413           0 :                 *nb_sfm = HVQ_THRES_SFM_24k;
     414           0 :                 move16();
     415           0 :                 *num_env_bands = sub( *num_sfm, *nb_sfm );
     416           0 :                 move16();
     417             : 
     418           0 :                 *start_norm = HVQ_THRES_SFM_24k;
     419           0 :                 move16();
     420             :             }
     421             :             ELSE
     422             :             {
     423           0 :                 *num_sfm = SFM_N_HARM;
     424           0 :                 move16();
     425           0 :                 *nb_sfm = HVQ_THRES_SFM_32k;
     426           0 :                 move16();
     427           0 :                 *num_env_bands = sub( *num_sfm, *nb_sfm );
     428           0 :                 move16();
     429             : 
     430           0 :                 *start_norm = HVQ_THRES_SFM_32k;
     431           0 :                 move16();
     432             :             }
     433           0 :             p_sfmsize = band_len_harm;     /* Q0 */
     434           0 :             p_sfm_start = band_start_harm; /* Q0 */
     435           0 :             p_sfm_end = band_end_harm;     /* Q0 */
     436             :         }
     437         746 :         ELSE IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) )
     438             :         {
     439          89 :             *num_sfm = SFM_N_SWB;
     440          89 :             move16();
     441          89 :             p_sfmsize = band_len_HQ;     /* Q0 */
     442          89 :             p_sfm_start = band_start_HQ; /* Q0 */
     443          89 :             p_sfm_end = band_end_HQ;     /* Q0 */
     444             : 
     445          89 :             IF( GE_32( core_brate, HQ_32k ) )
     446             :             {
     447           0 :                 *hq_generic_offset = HQ_GENERIC_FOFFSET_32K;
     448           0 :                 move16();
     449           0 :                 *num_env_bands = SFM_N_STA_10k;
     450           0 :                 move16();
     451             :             }
     452             :             ELSE /*if( EQ_32(core_brate, HQ_24k40))*/
     453             :             {
     454          89 :                 *hq_generic_offset = HQ_GENERIC_FOFFSET_24K4;
     455          89 :                 move16();
     456          89 :                 *num_env_bands = SFM_N_STA_8k;
     457          89 :                 move16();
     458             :             }
     459             : 
     460          89 :             *nb_sfm = *num_sfm;
     461          89 :             move16();
     462             :         }
     463             :         ELSE
     464             :         {
     465             :             /* HQ_NORMAL and HQ_TRANSIENT */
     466         657 :             *num_sfm = SFM_N_SWB;
     467         657 :             move16();
     468         657 :             *nb_sfm = *num_sfm;
     469         657 :             move16();
     470         657 :             *num_env_bands = SFM_N_SWB;
     471         657 :             move16();
     472             : 
     473         657 :             p_sfmsize = band_len_HQ;     /* Q0 */
     474         657 :             p_sfm_start = band_start_HQ; /* Q0 */
     475         657 :             p_sfm_end = band_end_HQ;     /* Q0 */
     476             :         }
     477             :     }
     478           0 :     ELSE IF( EQ_16( length, L_SPEC48k_EXT ) )
     479             :     {
     480           0 :         bw_ext = 1;
     481           0 :         move16();
     482           0 :         p_sfmsize = band_len_HQ;     /* Q0 */
     483           0 :         p_sfm_start = band_start_HQ; /* Q0 */
     484           0 :         p_sfm_end = band_end_HQ;     /* Q0 */
     485           0 :         *num_sfm = NB_SFM;
     486           0 :         move16();
     487             :     }
     488           0 :     ELSE IF( EQ_16( length, L_SPEC16k_EXT ) )
     489             :     {
     490           0 :         bw_ext = 1;
     491           0 :         move16();
     492           0 :         p_sfmsize = band_len_wb;     /* Q0 */
     493           0 :         p_sfm_start = band_start_wb; /* Q0 */
     494           0 :         p_sfm_end = band_end_wb;     /* Q0 */
     495           0 :         *num_sfm = SFM_N_WB;
     496           0 :         move16();
     497             :     }
     498             :     ELSE
     499             :     {
     500           0 :         *num_sfm = SFM_N_WB;
     501           0 :         move16();
     502           0 :         *nb_sfm = *num_sfm;
     503           0 :         move16();
     504           0 :         *num_env_bands = SFM_N_WB;
     505           0 :         move16();
     506             : 
     507           0 :         p_sfmsize = band_len_wb;     /* Q0 */
     508           0 :         p_sfm_start = band_start_wb; /* Q0 */
     509           0 :         p_sfm_end = band_end_wb;     /* Q0 */
     510             :     }
     511         785 :     IF( bw_ext )
     512             :     {
     513           0 :         FOR( i = 0; i < *num_sfm; i++ )
     514             :         {
     515             :             /*sfmsize[i] = (int16_t)(1.25f * p_sfmsize[i]);*/
     516           0 :             sfmsize[i] = mult_r( shl( p_sfmsize[i], 1 ), 20480 /* 1.25 in Q14 */ );
     517           0 :             move16();
     518             :             /*sfm_start[i] = (int16_t)(1.25f * p_sfm_start[i]);*/
     519           0 :             sfm_start[i] = mult_r( shl( p_sfm_start[i], 1 ), 20480 /* 1.25 in Q14 */ );
     520           0 :             move16();
     521             :             /*sfm_end[i] = (int16_t)(1.25f * p_sfm_end[i]);*/
     522           0 :             sfm_end[i] = mult_r( shl( p_sfm_end[i], 1 ), 20480 /* 1.25 in Q14 */ );
     523           0 :             move16();
     524             :         }
     525           0 :         *nb_sfm = *num_sfm;
     526           0 :         *num_env_bands = *num_sfm;
     527           0 :         move16();
     528           0 :         move16();
     529             :     }
     530             :     ELSE
     531             :     {
     532         785 :         Copy( p_sfmsize, sfmsize, *num_sfm );
     533         785 :         Copy( p_sfm_start, sfm_start, *num_sfm );
     534         785 :         Copy( p_sfm_end, sfm_end, *num_sfm );
     535             :     }
     536             : 
     537         785 :     *numnrmibits = extract_l( L_mult0( sub( *num_env_bands, 1 ), NORMI_BITS ) );
     538         785 :     move16();
     539             : 
     540         785 :     return;
     541             : }
     542             : 
     543        7772 : void hq_configure_fx(
     544             :     const Word16 length,       /* i  : Frame length                      Q0 */
     545             :     const Word16 hqswb_clas,   /* i  : HQ SWB class                      Q0 */
     546             :     const Word32 core_brate,   /* i  : Codec bitrate                     Q0 */
     547             :     Word16 *num_sfm,           /* o  : Total number of subbands          Q0 */
     548             :     Word16 *nb_sfm,            /* o  : Total number of coded bands       Q0 */
     549             :     Word16 *start_norm,        /* o  : First norm to be SDE encoded      Q0 */
     550             :     Word16 *num_env_bands,     /* o  : Number coded envelope bands       Q0 */
     551             :     Word16 *numnrmibits,       /* o  : Number of bits in fall-back norm encoding  Q0 */
     552             :     Word16 *hq_generic_offset, /* o  : Freq offset for HQ GENERIC        Q0 */
     553             :     Word16 *sfmsize,           /* o  : Subband bandwidths                Q0 */
     554             :     Word16 *sfm_start,         /* o  : Subband start coefficients        Q0 */
     555             :     Word16 *sfm_end            /* o  : Subband end coefficients          Q0 */
     556             : )
     557             : {
     558             :     const Word16 *p_sfmsize;
     559             :     const Word16 *p_sfm_start;
     560             :     const Word16 *p_sfm_end;
     561             :     Word16 i, bw_ext;
     562             : 
     563        7772 :     bw_ext = 0;
     564        7772 :     move16();
     565             : 
     566        7772 :     *start_norm = 0;
     567        7772 :     move16();
     568             : 
     569        7772 :     IF( EQ_16( length, L_SPEC48k ) )
     570             :     {
     571        6091 :         IF( EQ_16( hqswb_clas, HQ_GEN_FB ) )
     572             :         {
     573        2210 :             *num_sfm = NB_SFM;
     574        2210 :             move16();
     575        2210 :             p_sfmsize = band_len_HQ;     /* Q0 */
     576        2210 :             p_sfm_start = band_start_HQ; /* Q0 */
     577        2210 :             p_sfm_end = band_end_HQ;     /* Q0 */
     578             : 
     579        2210 :             IF( GE_32( core_brate, HQ_32k ) )
     580             :             {
     581           0 :                 *hq_generic_offset = HQ_GENERIC_FOFFSET_32K;
     582           0 :                 move16();
     583           0 :                 *num_env_bands = SFM_N_STA_10k;
     584           0 :                 move16();
     585             :             }
     586             :             ELSE /*IF(EQ_32(core_brate, HQ_16k40) || EQ_32(core_brate, HQ_24k40))*/
     587             :             {
     588        2210 :                 *hq_generic_offset = HQ_GENERIC_FOFFSET_24K4;
     589        2210 :                 *num_env_bands = SFM_N_STA_8k;
     590        2210 :                 move16();
     591        2210 :                 move16();
     592             :             }
     593        2210 :             *nb_sfm = *num_sfm;
     594        2210 :             move16();
     595             :         }
     596             :         ELSE
     597             :         {
     598        3881 :             IF( EQ_16( hqswb_clas, HQ_HARMONIC ) )
     599             :             {
     600         692 :                 *num_sfm = SFM_N_HARM_FB;
     601         692 :                 move16();
     602         692 :                 *nb_sfm = SFM_N_HARM_FB;
     603         692 :                 move16();
     604         692 :                 *num_env_bands = SFM_N_HARM_FB;
     605         692 :                 move16();
     606             : 
     607         692 :                 p_sfmsize = band_len_harm;     /* Q0 */
     608         692 :                 p_sfm_start = band_start_harm; /* Q0 */
     609         692 :                 p_sfm_end = band_end_harm;     /* Q0 */
     610             :             }
     611        3189 :             ELSE IF( EQ_16( hqswb_clas, HQ_HVQ ) )
     612             :             {
     613        1231 :                 IF( LT_32( core_brate, HQ_BWE_CROSSOVER_BRATE ) )
     614             :                 {
     615         626 :                     *num_sfm = SFM_N_HARM_FB;
     616         626 :                     move16();
     617         626 :                     *nb_sfm = HVQ_THRES_SFM_24k;
     618         626 :                     move16();
     619         626 :                     *num_env_bands = sub( *num_sfm, *nb_sfm );
     620         626 :                     move16();
     621         626 :                     *start_norm = HVQ_THRES_SFM_24k;
     622         626 :                     move16();
     623             :                 }
     624             :                 ELSE
     625             :                 {
     626         605 :                     *num_sfm = SFM_N_HARM_FB;
     627         605 :                     move16();
     628         605 :                     *nb_sfm = HVQ_THRES_SFM_32k;
     629         605 :                     move16();
     630         605 :                     *num_env_bands = sub( *num_sfm, *nb_sfm );
     631         605 :                     move16();
     632         605 :                     *start_norm = HVQ_THRES_SFM_32k;
     633         605 :                     move16();
     634             :                 }
     635        1231 :                 p_sfmsize = band_len_harm;     /* Q0 */
     636        1231 :                 p_sfm_start = band_start_harm; /* Q0 */
     637        1231 :                 p_sfm_end = band_end_harm;     /* Q0 */
     638             :             }
     639             :             ELSE
     640             :             {
     641        1958 :                 *num_sfm = NB_SFM;
     642        1958 :                 move16();
     643        1958 :                 *nb_sfm = *num_sfm; /* Q0 */
     644        1958 :                 move16();
     645        1958 :                 *num_env_bands = NB_SFM;
     646        1958 :                 move16();
     647             : 
     648        1958 :                 p_sfmsize = band_len_HQ;     /* Q0 */
     649        1958 :                 p_sfm_start = band_start_HQ; /* Q0 */
     650        1958 :                 p_sfm_end = band_end_HQ;     /* Q0 */
     651             :             }
     652             :         }
     653             :     }
     654        1681 :     ELSE IF( EQ_16( length, L_SPEC32k ) )
     655             :     {
     656        1041 :         IF( EQ_16( hqswb_clas, HQ_HARMONIC ) )
     657             :         {
     658          87 :             *num_sfm = SFM_N_HARM;
     659          87 :             move16();
     660          87 :             *nb_sfm = SFM_N_HARM;
     661          87 :             move16();
     662          87 :             *num_env_bands = SFM_N_HARM;
     663          87 :             move16();
     664             : 
     665          87 :             p_sfmsize = band_len_harm;     /* Q0 */
     666          87 :             p_sfm_start = band_start_harm; /* Q0 */
     667          87 :             p_sfm_end = band_end_harm;     /* Q0 */
     668             :         }
     669         954 :         ELSE IF( EQ_16( hqswb_clas, HQ_HVQ ) )
     670             :         {
     671         235 :             IF( LT_32( core_brate, HQ_BWE_CROSSOVER_BRATE ) )
     672             :             {
     673         227 :                 *num_sfm = SFM_N_HARM;
     674         227 :                 move16();
     675         227 :                 *nb_sfm = HVQ_THRES_SFM_24k;
     676         227 :                 move16();
     677         227 :                 *num_env_bands = sub( *num_sfm, *nb_sfm ); /* Q0 */
     678         227 :                 move16();
     679             : 
     680         227 :                 *start_norm = HVQ_THRES_SFM_24k;
     681         227 :                 move16();
     682             :             }
     683             :             ELSE
     684             :             {
     685           8 :                 *num_sfm = SFM_N_HARM;
     686           8 :                 move16();
     687           8 :                 *nb_sfm = HVQ_THRES_SFM_32k;
     688           8 :                 move16();
     689           8 :                 *num_env_bands = sub( *num_sfm, *nb_sfm ); /* Q0 */
     690           8 :                 move16();
     691             : 
     692           8 :                 *start_norm = HVQ_THRES_SFM_32k;
     693           8 :                 move16();
     694             :             }
     695         235 :             p_sfmsize = band_len_harm;
     696         235 :             p_sfm_start = band_start_harm;
     697         235 :             p_sfm_end = band_end_harm;
     698             :         }
     699         719 :         ELSE IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) )
     700             :         {
     701         597 :             *num_sfm = SFM_N_SWB;
     702         597 :             move16();
     703         597 :             p_sfmsize = band_len_HQ;     /* Q0 */
     704         597 :             p_sfm_start = band_start_HQ; /* Q0 */
     705         597 :             p_sfm_end = band_end_HQ;     /* Q0 */
     706             : 
     707         597 :             IF( GE_32( core_brate, HQ_32k ) )
     708             :             {
     709           0 :                 *hq_generic_offset = HQ_GENERIC_FOFFSET_32K;
     710           0 :                 move16();
     711           0 :                 *num_env_bands = SFM_N_STA_10k;
     712           0 :                 move16();
     713             :             }
     714             :             ELSE /*if( EQ_32(core_brate, HQ_24k40))*/
     715             :             {
     716         597 :                 *hq_generic_offset = HQ_GENERIC_FOFFSET_24K4;
     717         597 :                 move16();
     718         597 :                 *num_env_bands = SFM_N_STA_8k;
     719         597 :                 move16();
     720             :             }
     721             : 
     722         597 :             *nb_sfm = *num_sfm;
     723         597 :             move16();
     724             :         }
     725             :         ELSE
     726             :         {
     727             :             /* HQ_NORMAL and HQ_TRANSIENT */
     728         122 :             *num_sfm = SFM_N_SWB;
     729         122 :             move16();
     730         122 :             *nb_sfm = *num_sfm;
     731         122 :             move16();
     732         122 :             *num_env_bands = SFM_N_SWB;
     733         122 :             move16();
     734             : 
     735         122 :             p_sfmsize = band_len_HQ;     /* Q0 */
     736         122 :             p_sfm_start = band_start_HQ; /* Q0 */
     737         122 :             p_sfm_end = band_end_HQ;     /* Q0 */
     738             :         }
     739             :     }
     740         640 :     ELSE IF( EQ_16( length, L_SPEC48k_EXT ) )
     741             :     {
     742         120 :         bw_ext = 1;
     743         120 :         p_sfmsize = band_len_HQ;     /* Q0 */
     744         120 :         p_sfm_start = band_start_HQ; /* Q0 */
     745         120 :         p_sfm_end = band_end_HQ;     /* Q0 */
     746         120 :         *num_sfm = NB_SFM;
     747             :     }
     748         520 :     ELSE IF( EQ_16( length, L_SPEC16k_EXT ) )
     749             :     {
     750          25 :         bw_ext = 1;
     751          25 :         move16();
     752          25 :         p_sfmsize = band_len_wb;     /* Q0 */
     753          25 :         p_sfm_start = band_start_wb; /* Q0 */
     754          25 :         p_sfm_end = band_end_wb;     /* Q0 */
     755          25 :         *num_sfm = SFM_N_WB;
     756          25 :         move16();
     757             :     }
     758             :     ELSE
     759             :     {
     760         495 :         *num_sfm = SFM_N_WB;
     761         495 :         move16();
     762         495 :         *nb_sfm = *num_sfm; /* Q0 */
     763         495 :         move16();
     764         495 :         *num_env_bands = SFM_N_WB;
     765         495 :         move16();
     766             : 
     767         495 :         p_sfmsize = band_len_wb;     /* Q0 */
     768         495 :         p_sfm_start = band_start_wb; /* Q0 */
     769         495 :         p_sfm_end = band_end_wb;     /* Q0 */
     770             :     }
     771        7772 :     IF( bw_ext )
     772             :     {
     773        6075 :         FOR( i = 0; i < *num_sfm; i++ )
     774             :         {
     775             :             /*sfmsize[i] = (int16_t)(1.25f * p_sfmsize[i]);*/
     776        5930 :             sfmsize[i] = mult_r( shl( p_sfmsize[i], 1 ), 20480 /* 1.25 in Q14 */ ); /* Q0 */
     777        5930 :             move16();
     778             :             /*sfm_start[i] = (int16_t)(1.25f * p_sfm_start[i]);*/
     779        5930 :             sfm_start[i] = mult_r( shl( p_sfm_start[i], 1 ), 20480 /* 1.25 in Q14 */ ); /* Q0 */
     780        5930 :             move16();
     781             :             /*sfm_end[i] = (int16_t)(1.25f * p_sfm_end[i]);*/
     782        5930 :             sfm_end[i] = mult_r( shl( p_sfm_end[i], 1 ), 20480 /* 1.25 in Q14 */ ); /* Q0 */
     783        5930 :             move16();
     784             :         }
     785         145 :         *nb_sfm = *num_sfm;        /* Q0 */
     786         145 :         *num_env_bands = *num_sfm; /* Q0 */
     787         145 :         move16();
     788         145 :         move16();
     789             :     }
     790             :     ELSE
     791             :     {
     792        7627 :         Copy( p_sfmsize, sfmsize, *num_sfm );
     793        7627 :         Copy( p_sfm_start, sfm_start, *num_sfm );
     794        7627 :         Copy( p_sfm_end, sfm_end, *num_sfm );
     795             :     }
     796             : 
     797        7772 :     *numnrmibits = extract_l( L_mult0( sub( *num_env_bands, 1 ), NORMI_BITS ) );
     798        7772 :     move16();
     799             : 
     800        7772 :     return;
     801             : }

Generated by: LCOV version 1.14