LCOV - code coverage report
Current view: top level - lib_com - hq_conf_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main -- dec/rend @ 6c320724ac154bae0b720af82641e0df71ffdfc7 Lines: 203 490 41.4 %
Date: 2025-07-01 04:22:09 Functions: 2 3 66.7 %

          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         397 : 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         397 :     bw_ext = 0;
     302         397 :     move16();
     303             : 
     304         397 :     *start_norm = 0;
     305         397 :     move16();
     306             : 
     307         397 :     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         397 :     ELSE IF( EQ_16( length, L_SPEC32k ) )
     393             :     {
     394         397 :         IF( EQ_16( hqswb_clas, HQ_HARMONIC ) )
     395             :         {
     396          20 :             *num_sfm = SFM_N_HARM;
     397          20 :             move16();
     398          20 :             *nb_sfm = SFM_N_HARM;
     399          20 :             move16();
     400          20 :             *num_env_bands = SFM_N_HARM;
     401          20 :             move16();
     402             : 
     403          20 :             p_sfmsize = band_len_harm;     /* Q0 */
     404          20 :             p_sfm_start = band_start_harm; /* Q0 */
     405          20 :             p_sfm_end = band_end_harm;     /* Q0 */
     406             :         }
     407         377 :         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         377 :         ELSE IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) )
     438             :         {
     439          46 :             *num_sfm = SFM_N_SWB;
     440          46 :             move16();
     441          46 :             p_sfmsize = band_len_HQ;     /* Q0 */
     442          46 :             p_sfm_start = band_start_HQ; /* Q0 */
     443          46 :             p_sfm_end = band_end_HQ;     /* Q0 */
     444             : 
     445          46 :             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          46 :                 *hq_generic_offset = HQ_GENERIC_FOFFSET_24K4;
     455          46 :                 move16();
     456          46 :                 *num_env_bands = SFM_N_STA_8k;
     457          46 :                 move16();
     458             :             }
     459             : 
     460          46 :             *nb_sfm = *num_sfm;
     461          46 :             move16();
     462             :         }
     463             :         ELSE
     464             :         {
     465             :             /* HQ_NORMAL and HQ_TRANSIENT */
     466         331 :             *num_sfm = SFM_N_SWB;
     467         331 :             move16();
     468         331 :             *nb_sfm = *num_sfm;
     469         331 :             move16();
     470         331 :             *num_env_bands = SFM_N_SWB;
     471         331 :             move16();
     472             : 
     473         331 :             p_sfmsize = band_len_HQ;     /* Q0 */
     474         331 :             p_sfm_start = band_start_HQ; /* Q0 */
     475         331 :             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         397 :     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         397 :         Copy( p_sfmsize, sfmsize, *num_sfm );
     533         397 :         Copy( p_sfm_start, sfm_start, *num_sfm );
     534         397 :         Copy( p_sfm_end, sfm_end, *num_sfm );
     535             :     }
     536             : 
     537         397 :     *numnrmibits = extract_l( L_mult0( sub( *num_env_bands, 1 ), NORMI_BITS ) );
     538         397 :     move16();
     539             : 
     540         397 :     return;
     541             : }
     542             : 
     543           0 : 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           0 :     bw_ext = 0;
     564           0 :     move16();
     565             : 
     566           0 :     *start_norm = 0;
     567           0 :     move16();
     568             : 
     569           0 :     IF( EQ_16( length, L_SPEC48k ) )
     570             :     {
     571           0 :         IF( EQ_16( hqswb_clas, HQ_GEN_FB ) )
     572             :         {
     573           0 :             *num_sfm = NB_SFM;
     574           0 :             move16();
     575           0 :             p_sfmsize = band_len_HQ;     /* Q0 */
     576           0 :             p_sfm_start = band_start_HQ; /* Q0 */
     577           0 :             p_sfm_end = band_end_HQ;     /* Q0 */
     578             : 
     579           0 :             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           0 :                 *hq_generic_offset = HQ_GENERIC_FOFFSET_24K4;
     589           0 :                 *num_env_bands = SFM_N_STA_8k;
     590           0 :                 move16();
     591           0 :                 move16();
     592             :             }
     593           0 :             *nb_sfm = *num_sfm;
     594           0 :             move16();
     595             :         }
     596             :         ELSE
     597             :         {
     598           0 :             IF( EQ_16( hqswb_clas, HQ_HARMONIC ) )
     599             :             {
     600           0 :                 *num_sfm = SFM_N_HARM_FB;
     601           0 :                 move16();
     602           0 :                 *nb_sfm = SFM_N_HARM_FB;
     603           0 :                 move16();
     604           0 :                 *num_env_bands = SFM_N_HARM_FB;
     605           0 :                 move16();
     606             : 
     607           0 :                 p_sfmsize = band_len_harm;     /* Q0 */
     608           0 :                 p_sfm_start = band_start_harm; /* Q0 */
     609           0 :                 p_sfm_end = band_end_harm;     /* Q0 */
     610             :             }
     611           0 :             ELSE IF( EQ_16( hqswb_clas, HQ_HVQ ) )
     612             :             {
     613           0 :                 IF( LT_32( core_brate, HQ_BWE_CROSSOVER_BRATE ) )
     614             :                 {
     615           0 :                     *num_sfm = SFM_N_HARM_FB;
     616           0 :                     move16();
     617           0 :                     *nb_sfm = HVQ_THRES_SFM_24k;
     618           0 :                     move16();
     619           0 :                     *num_env_bands = sub( *num_sfm, *nb_sfm );
     620           0 :                     move16();
     621           0 :                     *start_norm = HVQ_THRES_SFM_24k;
     622           0 :                     move16();
     623             :                 }
     624             :                 ELSE
     625             :                 {
     626           0 :                     *num_sfm = SFM_N_HARM_FB;
     627           0 :                     move16();
     628           0 :                     *nb_sfm = HVQ_THRES_SFM_32k;
     629           0 :                     move16();
     630           0 :                     *num_env_bands = sub( *num_sfm, *nb_sfm );
     631           0 :                     move16();
     632           0 :                     *start_norm = HVQ_THRES_SFM_32k;
     633           0 :                     move16();
     634             :                 }
     635           0 :                 p_sfmsize = band_len_harm;     /* Q0 */
     636           0 :                 p_sfm_start = band_start_harm; /* Q0 */
     637           0 :                 p_sfm_end = band_end_harm;     /* Q0 */
     638             :             }
     639             :             ELSE
     640             :             {
     641           0 :                 *num_sfm = NB_SFM;
     642           0 :                 move16();
     643           0 :                 *nb_sfm = *num_sfm; /* Q0 */
     644           0 :                 move16();
     645           0 :                 *num_env_bands = NB_SFM;
     646           0 :                 move16();
     647             : 
     648           0 :                 p_sfmsize = band_len_HQ;     /* Q0 */
     649           0 :                 p_sfm_start = band_start_HQ; /* Q0 */
     650           0 :                 p_sfm_end = band_end_HQ;     /* Q0 */
     651             :             }
     652             :         }
     653             :     }
     654           0 :     ELSE IF( EQ_16( length, L_SPEC32k ) )
     655             :     {
     656           0 :         IF( EQ_16( hqswb_clas, HQ_HARMONIC ) )
     657             :         {
     658           0 :             *num_sfm = SFM_N_HARM;
     659           0 :             move16();
     660           0 :             *nb_sfm = SFM_N_HARM;
     661           0 :             move16();
     662           0 :             *num_env_bands = SFM_N_HARM;
     663           0 :             move16();
     664             : 
     665           0 :             p_sfmsize = band_len_harm;     /* Q0 */
     666           0 :             p_sfm_start = band_start_harm; /* Q0 */
     667           0 :             p_sfm_end = band_end_harm;     /* Q0 */
     668             :         }
     669           0 :         ELSE IF( EQ_16( hqswb_clas, HQ_HVQ ) )
     670             :         {
     671           0 :             IF( LT_32( core_brate, HQ_BWE_CROSSOVER_BRATE ) )
     672             :             {
     673           0 :                 *num_sfm = SFM_N_HARM;
     674           0 :                 move16();
     675           0 :                 *nb_sfm = HVQ_THRES_SFM_24k;
     676           0 :                 move16();
     677           0 :                 *num_env_bands = sub( *num_sfm, *nb_sfm ); /* Q0 */
     678           0 :                 move16();
     679             : 
     680           0 :                 *start_norm = HVQ_THRES_SFM_24k;
     681           0 :                 move16();
     682             :             }
     683             :             ELSE
     684             :             {
     685           0 :                 *num_sfm = SFM_N_HARM;
     686           0 :                 move16();
     687           0 :                 *nb_sfm = HVQ_THRES_SFM_32k;
     688           0 :                 move16();
     689           0 :                 *num_env_bands = sub( *num_sfm, *nb_sfm ); /* Q0 */
     690           0 :                 move16();
     691             : 
     692           0 :                 *start_norm = HVQ_THRES_SFM_32k;
     693           0 :                 move16();
     694             :             }
     695           0 :             p_sfmsize = band_len_harm;
     696           0 :             p_sfm_start = band_start_harm;
     697           0 :             p_sfm_end = band_end_harm;
     698             :         }
     699           0 :         ELSE IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) )
     700             :         {
     701           0 :             *num_sfm = SFM_N_SWB;
     702           0 :             move16();
     703           0 :             p_sfmsize = band_len_HQ;     /* Q0 */
     704           0 :             p_sfm_start = band_start_HQ; /* Q0 */
     705           0 :             p_sfm_end = band_end_HQ;     /* Q0 */
     706             : 
     707           0 :             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           0 :                 *hq_generic_offset = HQ_GENERIC_FOFFSET_24K4;
     717           0 :                 move16();
     718           0 :                 *num_env_bands = SFM_N_STA_8k;
     719           0 :                 move16();
     720             :             }
     721             : 
     722           0 :             *nb_sfm = *num_sfm;
     723           0 :             move16();
     724             :         }
     725             :         ELSE
     726             :         {
     727             :             /* HQ_NORMAL and HQ_TRANSIENT */
     728           0 :             *num_sfm = SFM_N_SWB;
     729           0 :             move16();
     730           0 :             *nb_sfm = *num_sfm;
     731           0 :             move16();
     732           0 :             *num_env_bands = SFM_N_SWB;
     733           0 :             move16();
     734             : 
     735           0 :             p_sfmsize = band_len_HQ;     /* Q0 */
     736           0 :             p_sfm_start = band_start_HQ; /* Q0 */
     737           0 :             p_sfm_end = band_end_HQ;     /* Q0 */
     738             :         }
     739             :     }
     740           0 :     ELSE IF( EQ_16( length, L_SPEC48k_EXT ) )
     741             :     {
     742           0 :         bw_ext = 1;
     743           0 :         p_sfmsize = band_len_HQ;     /* Q0 */
     744           0 :         p_sfm_start = band_start_HQ; /* Q0 */
     745           0 :         p_sfm_end = band_end_HQ;     /* Q0 */
     746           0 :         *num_sfm = NB_SFM;
     747             :     }
     748           0 :     ELSE IF( EQ_16( length, L_SPEC16k_EXT ) )
     749             :     {
     750           0 :         bw_ext = 1;
     751           0 :         move16();
     752           0 :         p_sfmsize = band_len_wb;     /* Q0 */
     753           0 :         p_sfm_start = band_start_wb; /* Q0 */
     754           0 :         p_sfm_end = band_end_wb;     /* Q0 */
     755           0 :         *num_sfm = SFM_N_WB;
     756           0 :         move16();
     757             :     }
     758             :     ELSE
     759             :     {
     760           0 :         *num_sfm = SFM_N_WB;
     761           0 :         move16();
     762           0 :         *nb_sfm = *num_sfm; /* Q0 */
     763           0 :         move16();
     764           0 :         *num_env_bands = SFM_N_WB;
     765           0 :         move16();
     766             : 
     767           0 :         p_sfmsize = band_len_wb;     /* Q0 */
     768           0 :         p_sfm_start = band_start_wb; /* Q0 */
     769           0 :         p_sfm_end = band_end_wb;     /* Q0 */
     770             :     }
     771           0 :     IF( bw_ext )
     772             :     {
     773           0 :         FOR( i = 0; i < *num_sfm; i++ )
     774             :         {
     775             :             /*sfmsize[i] = (int16_t)(1.25f * p_sfmsize[i]);*/
     776           0 :             sfmsize[i] = mult_r( shl( p_sfmsize[i], 1 ), 20480 /* 1.25 in Q14 */ ); /* Q0 */
     777           0 :             move16();
     778             :             /*sfm_start[i] = (int16_t)(1.25f * p_sfm_start[i]);*/
     779           0 :             sfm_start[i] = mult_r( shl( p_sfm_start[i], 1 ), 20480 /* 1.25 in Q14 */ ); /* Q0 */
     780           0 :             move16();
     781             :             /*sfm_end[i] = (int16_t)(1.25f * p_sfm_end[i]);*/
     782           0 :             sfm_end[i] = mult_r( shl( p_sfm_end[i], 1 ), 20480 /* 1.25 in Q14 */ ); /* Q0 */
     783           0 :             move16();
     784             :         }
     785           0 :         *nb_sfm = *num_sfm;        /* Q0 */
     786           0 :         *num_env_bands = *num_sfm; /* Q0 */
     787           0 :         move16();
     788           0 :         move16();
     789             :     }
     790             :     ELSE
     791             :     {
     792           0 :         Copy( p_sfmsize, sfmsize, *num_sfm );
     793           0 :         Copy( p_sfm_start, sfm_start, *num_sfm );
     794           0 :         Copy( p_sfm_end, sfm_end, *num_sfm );
     795             :     }
     796             : 
     797           0 :     *numnrmibits = extract_l( L_mult0( sub( *num_env_bands, 1 ), NORMI_BITS ) );
     798           0 :     move16();
     799             : 
     800           0 :     return;
     801             : }

Generated by: LCOV version 1.14