LCOV - code coverage report
Current view: top level - lib_com - hq_conf.c (source / functions) Hit Total Coverage
Test: Coverage on main enc/dec/rend @ 3b2f07138c61dcf997bbf4165d0882f794b2995f Lines: 154 162 95.1 %
Date: 2025-05-03 01:55:50 Functions: 1 1 100.0 %

          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             : /*====================================================================================
      34             :     EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0
      35             :   ====================================================================================*/
      36             : 
      37             : #include <stdint.h>
      38             : #include "options.h"
      39             : #include "cnst.h"
      40             : #include "rom_com.h"
      41             : #include "prot_fx.h"
      42             : #include "wmc_auto.h"
      43             : 
      44             : 
      45        7815 : void hq_configure_fx(
      46             :     const Word16 length,       /* i  : Frame length                      Q0 */
      47             :     const Word16 hqswb_clas,   /* i  : HQ SWB class                      Q0 */
      48             :     const Word32 core_brate,   /* i  : Codec bitrate                     Q0 */
      49             :     Word16 *num_sfm,           /* o  : Total number of subbands          Q0 */
      50             :     Word16 *nb_sfm,            /* o  : Total number of coded bands       Q0 */
      51             :     Word16 *start_norm,        /* o  : First norm to be SDE encoded      Q0 */
      52             :     Word16 *num_env_bands,     /* o  : Number coded envelope bands       Q0 */
      53             :     Word16 *numnrmibits,       /* o  : Number of bits in fall-back norm encoding  Q0 */
      54             :     Word16 *hq_generic_offset, /* o  : Freq offset for HQ GENERIC        Q0 */
      55             :     Word16 *sfmsize,           /* o  : Subband bandwidths                Q0 */
      56             :     Word16 *sfm_start,         /* o  : Subband start coefficients        Q0 */
      57             :     Word16 *sfm_end            /* o  : Subband end coefficients          Q0 */
      58             : )
      59             : {
      60             :     const Word16 *p_sfmsize;
      61             :     const Word16 *p_sfm_start;
      62             :     const Word16 *p_sfm_end;
      63             :     Word16 i, bw_ext;
      64             : 
      65        7815 :     bw_ext = 0;
      66        7815 :     move16();
      67             : 
      68        7815 :     *start_norm = 0;
      69        7815 :     move16();
      70             : 
      71        7815 :     IF( EQ_16( length, L_SPEC48k ) )
      72             :     {
      73        6116 :         IF( EQ_16( hqswb_clas, HQ_GEN_FB ) )
      74             :         {
      75        2205 :             *num_sfm = NB_SFM;
      76        2205 :             move16();
      77        2205 :             p_sfmsize = band_len_HQ;     /* Q0 */
      78        2205 :             p_sfm_start = band_start_HQ; /* Q0 */
      79        2205 :             p_sfm_end = band_end_HQ;     /* Q0 */
      80             : 
      81        2205 :             IF( GE_32( core_brate, HQ_32k ) )
      82             :             {
      83           0 :                 *hq_generic_offset = HQ_GENERIC_FOFFSET_32K;
      84           0 :                 move16();
      85           0 :                 *num_env_bands = SFM_N_STA_10k;
      86           0 :                 move16();
      87             :             }
      88             :             ELSE /*IF(EQ_32(core_brate, HQ_16k40) || EQ_32(core_brate, HQ_24k40))*/
      89             :             {
      90        2205 :                 *hq_generic_offset = HQ_GENERIC_FOFFSET_24K4;
      91        2205 :                 *num_env_bands = SFM_N_STA_8k;
      92        2205 :                 move16();
      93        2205 :                 move16();
      94             :             }
      95        2205 :             *nb_sfm = *num_sfm;
      96        2205 :             move16();
      97             :         }
      98             :         ELSE
      99             :         {
     100        3911 :             IF( EQ_16( hqswb_clas, HQ_HARMONIC ) )
     101             :             {
     102         701 :                 *num_sfm = SFM_N_HARM_FB;
     103         701 :                 move16();
     104         701 :                 *nb_sfm = SFM_N_HARM_FB;
     105         701 :                 move16();
     106         701 :                 *num_env_bands = SFM_N_HARM_FB;
     107         701 :                 move16();
     108             : 
     109         701 :                 p_sfmsize = band_len_harm;     /* Q0 */
     110         701 :                 p_sfm_start = band_start_harm; /* Q0 */
     111         701 :                 p_sfm_end = band_end_harm;     /* Q0 */
     112             :             }
     113        3210 :             ELSE IF( EQ_16( hqswb_clas, HQ_HVQ ) )
     114             :             {
     115        1228 :                 IF( LT_32( core_brate, HQ_BWE_CROSSOVER_BRATE ) )
     116             :                 {
     117         622 :                     *num_sfm = SFM_N_HARM_FB;
     118         622 :                     move16();
     119         622 :                     *nb_sfm = HVQ_THRES_SFM_24k;
     120         622 :                     move16();
     121         622 :                     *num_env_bands = sub( *num_sfm, *nb_sfm );
     122         622 :                     move16();
     123         622 :                     *start_norm = HVQ_THRES_SFM_24k;
     124         622 :                     move16();
     125             :                 }
     126             :                 ELSE
     127             :                 {
     128         606 :                     *num_sfm = SFM_N_HARM_FB;
     129         606 :                     move16();
     130         606 :                     *nb_sfm = HVQ_THRES_SFM_32k;
     131         606 :                     move16();
     132         606 :                     *num_env_bands = sub( *num_sfm, *nb_sfm );
     133         606 :                     move16();
     134         606 :                     *start_norm = HVQ_THRES_SFM_32k;
     135         606 :                     move16();
     136             :                 }
     137        1228 :                 p_sfmsize = band_len_harm;     /* Q0 */
     138        1228 :                 p_sfm_start = band_start_harm; /* Q0 */
     139        1228 :                 p_sfm_end = band_end_harm;     /* Q0 */
     140             :             }
     141             :             ELSE
     142             :             {
     143        1982 :                 *num_sfm = NB_SFM;
     144        1982 :                 move16();
     145        1982 :                 *nb_sfm = *num_sfm; /* Q0 */
     146        1982 :                 move16();
     147        1982 :                 *num_env_bands = NB_SFM;
     148        1982 :                 move16();
     149             : 
     150        1982 :                 p_sfmsize = band_len_HQ;     /* Q0 */
     151        1982 :                 p_sfm_start = band_start_HQ; /* Q0 */
     152        1982 :                 p_sfm_end = band_end_HQ;     /* Q0 */
     153             :             }
     154             :         }
     155             :     }
     156        1699 :     ELSE IF( EQ_16( length, L_SPEC32k ) )
     157             :     {
     158        1044 :         IF( EQ_16( hqswb_clas, HQ_HARMONIC ) )
     159             :         {
     160          88 :             *num_sfm = SFM_N_HARM;
     161          88 :             move16();
     162          88 :             *nb_sfm = SFM_N_HARM;
     163          88 :             move16();
     164          88 :             *num_env_bands = SFM_N_HARM;
     165          88 :             move16();
     166             : 
     167          88 :             p_sfmsize = band_len_harm;     /* Q0 */
     168          88 :             p_sfm_start = band_start_harm; /* Q0 */
     169          88 :             p_sfm_end = band_end_harm;     /* Q0 */
     170             :         }
     171         956 :         ELSE IF( EQ_16( hqswb_clas, HQ_HVQ ) )
     172             :         {
     173         235 :             IF( LT_32( core_brate, HQ_BWE_CROSSOVER_BRATE ) )
     174             :             {
     175         227 :                 *num_sfm = SFM_N_HARM;
     176         227 :                 move16();
     177         227 :                 *nb_sfm = HVQ_THRES_SFM_24k;
     178         227 :                 move16();
     179         227 :                 *num_env_bands = sub( *num_sfm, *nb_sfm ); /* Q0 */
     180         227 :                 move16();
     181             : 
     182         227 :                 *start_norm = HVQ_THRES_SFM_24k;
     183         227 :                 move16();
     184             :             }
     185             :             ELSE
     186             :             {
     187           8 :                 *num_sfm = SFM_N_HARM;
     188           8 :                 move16();
     189           8 :                 *nb_sfm = HVQ_THRES_SFM_32k;
     190           8 :                 move16();
     191           8 :                 *num_env_bands = sub( *num_sfm, *nb_sfm ); /* Q0 */
     192           8 :                 move16();
     193             : 
     194           8 :                 *start_norm = HVQ_THRES_SFM_32k;
     195           8 :                 move16();
     196             :             }
     197         235 :             p_sfmsize = band_len_harm;
     198         235 :             p_sfm_start = band_start_harm;
     199         235 :             p_sfm_end = band_end_harm;
     200             :         }
     201         721 :         ELSE IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) )
     202             :         {
     203         600 :             *num_sfm = SFM_N_SWB;
     204         600 :             move16();
     205         600 :             p_sfmsize = band_len_HQ;     /* Q0 */
     206         600 :             p_sfm_start = band_start_HQ; /* Q0 */
     207         600 :             p_sfm_end = band_end_HQ;     /* Q0 */
     208             : 
     209         600 :             IF( GE_32( core_brate, HQ_32k ) )
     210             :             {
     211           0 :                 *hq_generic_offset = HQ_GENERIC_FOFFSET_32K;
     212           0 :                 move16();
     213           0 :                 *num_env_bands = SFM_N_STA_10k;
     214           0 :                 move16();
     215             :             }
     216             :             ELSE /*if( EQ_32(core_brate, HQ_24k40))*/
     217             :             {
     218         600 :                 *hq_generic_offset = HQ_GENERIC_FOFFSET_24K4;
     219         600 :                 move16();
     220         600 :                 *num_env_bands = SFM_N_STA_8k;
     221         600 :                 move16();
     222             :             }
     223             : 
     224         600 :             *nb_sfm = *num_sfm;
     225         600 :             move16();
     226             :         }
     227             :         ELSE
     228             :         {
     229             :             /* HQ_NORMAL and HQ_TRANSIENT */
     230         121 :             *num_sfm = SFM_N_SWB;
     231         121 :             move16();
     232         121 :             *nb_sfm = *num_sfm;
     233         121 :             move16();
     234         121 :             *num_env_bands = SFM_N_SWB;
     235         121 :             move16();
     236             : 
     237         121 :             p_sfmsize = band_len_HQ;     /* Q0 */
     238         121 :             p_sfm_start = band_start_HQ; /* Q0 */
     239         121 :             p_sfm_end = band_end_HQ;     /* Q0 */
     240             :         }
     241             :     }
     242         655 :     ELSE IF( EQ_16( length, L_SPEC48k_EXT ) )
     243             :     {
     244         120 :         bw_ext = 1;
     245         120 :         p_sfmsize = band_len_HQ;     /* Q0 */
     246         120 :         p_sfm_start = band_start_HQ; /* Q0 */
     247         120 :         p_sfm_end = band_end_HQ;     /* Q0 */
     248         120 :         *num_sfm = NB_SFM;
     249             :     }
     250         535 :     ELSE IF( EQ_16( length, L_SPEC16k_EXT ) )
     251             :     {
     252          26 :         bw_ext = 1;
     253          26 :         move16();
     254          26 :         p_sfmsize = band_len_wb;     /* Q0 */
     255          26 :         p_sfm_start = band_start_wb; /* Q0 */
     256          26 :         p_sfm_end = band_end_wb;     /* Q0 */
     257          26 :         *num_sfm = SFM_N_WB;
     258          26 :         move16();
     259             :     }
     260             :     ELSE
     261             :     {
     262         509 :         *num_sfm = SFM_N_WB;
     263         509 :         move16();
     264         509 :         *nb_sfm = *num_sfm; /* Q0 */
     265         509 :         move16();
     266         509 :         *num_env_bands = SFM_N_WB;
     267         509 :         move16();
     268             : 
     269         509 :         p_sfmsize = band_len_wb;     /* Q0 */
     270         509 :         p_sfm_start = band_start_wb; /* Q0 */
     271         509 :         p_sfm_end = band_end_wb;     /* Q0 */
     272             :     }
     273        7815 :     IF( bw_ext )
     274             :     {
     275        6102 :         FOR( i = 0; i < *num_sfm; i++ )
     276             :         {
     277             :             /*sfmsize[i] = (int16_t)(1.25f * p_sfmsize[i]);*/
     278        5956 :             sfmsize[i] = mult_r( shl( p_sfmsize[i], 1 ), 20480 /* 1.25 in Q14 */ ); /* Q0 */
     279        5956 :             move16();
     280             :             /*sfm_start[i] = (int16_t)(1.25f * p_sfm_start[i]);*/
     281        5956 :             sfm_start[i] = mult_r( shl( p_sfm_start[i], 1 ), 20480 /* 1.25 in Q14 */ ); /* Q0 */
     282        5956 :             move16();
     283             :             /*sfm_end[i] = (int16_t)(1.25f * p_sfm_end[i]);*/
     284        5956 :             sfm_end[i] = mult_r( shl( p_sfm_end[i], 1 ), 20480 /* 1.25 in Q14 */ ); /* Q0 */
     285        5956 :             move16();
     286             :         }
     287         146 :         *nb_sfm = *num_sfm;        /* Q0 */
     288         146 :         *num_env_bands = *num_sfm; /* Q0 */
     289         146 :         move16();
     290         146 :         move16();
     291             :     }
     292             :     ELSE
     293             :     {
     294        7669 :         Copy( p_sfmsize, sfmsize, *num_sfm );
     295        7669 :         Copy( p_sfm_start, sfm_start, *num_sfm );
     296        7669 :         Copy( p_sfm_end, sfm_end, *num_sfm );
     297             :     }
     298             : 
     299        7815 :     *numnrmibits = extract_l( L_mult0( sub( *num_env_bands, 1 ), NORMI_BITS ) );
     300        7815 :     move16();
     301             : 
     302        7815 :     return;
     303             : }

Generated by: LCOV version 1.14