LCOV - code coverage report
Current view: top level - lib_enc - hq_env_enc.c (source / functions) Hit Total Coverage
Test: Coverage on main -- short test vectors @ 6c9ddc4024a9c0e1ecb8f643f114a84a0e26ec6b Lines: 175 196 89.3 %
Date: 2025-05-23 08:37:30 Functions: 2 2 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             : #ifdef DEBUGGING
      40             : #include "debug.h"
      41             : #endif
      42             : #include "prot.h"
      43             : #include "rom_com.h"
      44             : #include "rom_enc.h"
      45             : #include "wmc_auto.h"
      46             : 
      47             : /*--------------------------------------------------------------------------------------*
      48             :  * encode_envelope_indices()
      49             :  *
      50             :  * Encode envelope indices
      51             :  *--------------------------------------------------------------------------------------*/
      52             : 
      53             : /*! r: Number of bits if flag_pack=0,0 if flag_pack=1 */
      54       16912 : int16_t encode_envelope_indices(
      55             :     BSTR_ENC_HANDLE hBstr,     /* i/o: encoder bitstream handle                        */
      56             :     const int16_t num_sfm,     /* i  : Number of subbands                              */
      57             :     const int16_t numnrmibits, /* i  : Bitrate of fall-back coding mode                */
      58             :     int16_t *difidx,           /* i/o: Diff indices/encoded diff indices               */
      59             :     int16_t *LCmode,           /* o  : Coding mode if flag_pack=0, i : if flag_pack=1  */
      60             :     const int16_t flag_pack,   /* i  : indicator of packing or estimating bits         */
      61             :     const int16_t flag_HQ2,    /* i  : indicator of HQ2 core                           */
      62             :     const int16_t is_transient /* i  : transient flag                                  */
      63             : )
      64             : {
      65             :     int16_t bits;
      66             :     int16_t prevj;
      67             :     int16_t hcode_l;
      68             :     int16_t i, j;
      69             :     int16_t difidx_flag;
      70             :     int16_t index_max, index_min, index_rad;
      71             :     int16_t difidx_org[NB_SFM]; /* length of this buffer is max(BANDS_MAX,NB_SFM) */
      72             :     int16_t m, r;
      73             :     int16_t v, k;
      74             : 
      75       16912 :     set_s( difidx_org, 0, NB_SFM );
      76       16912 :     difidx_flag = 0;
      77             : 
      78             :     /*------------------------------------------------------------------*
      79             :      * Check Huffman encoding for QNorm indices
      80             :      *------------------------------------------------------------------*/
      81             : 
      82             :     /* LC mode index is changed to synchronize LR-MDCT signaling    */
      83             :     /* LC mode 0 = Context based coding                             */
      84             :     /* LC mode 1 = resized huffman coding                           */
      85             :     /* LC mode 2 = normal Huffman Coding                            */
      86             :     /* LC mode 3 = bit packing                                      */
      87       16912 :     if ( flag_pack == 0 )
      88             :     {
      89        8457 :         if ( is_transient && flag_HQ2 == LOW_RATE_HQ_CORE_TRAN )
      90             :         {
      91           3 :             bits = 0;
      92           3 :             index_max = 0;
      93           3 :             index_min = 31;
      94          99 :             for ( i = 0; i < num_sfm; i++ )
      95             :             {
      96          96 :                 if ( difidx[i] > index_max )
      97             :                 {
      98          11 :                     index_max = difidx[i];
      99             :                 }
     100          96 :                 if ( difidx[i] < index_min )
     101             :                 {
     102           4 :                     index_min = difidx[i];
     103             :                 }
     104             :             }
     105           3 :             if ( index_min > 10 && index_max < 22 )
     106             :             {
     107          96 :                 for ( i = 1; i < num_sfm; i++ )
     108             :                 {
     109          93 :                     j = difidx[i];
     110          93 :                     bits += huffsizn_tran[j];
     111             :                 }
     112             :             }
     113           3 :             hcode_l = 0;
     114           3 :             *LCmode = 0;
     115           3 :             prevj = difidx[0] + OFFSET_NORM;
     116             :             /* LC mode 0 = Context based coding        */
     117          96 :             for ( i = 1; i < num_sfm; i++ )
     118             :             {
     119          93 :                 j = difidx[i];
     120          93 :                 if ( prevj > HTH_NORM )
     121             :                 {
     122             :                     /* above */
     123           1 :                     hcode_l += huffsizn_n[31 - j];
     124             :                 }
     125             :                 else
     126             :                 {
     127          92 :                     if ( prevj < LTH_NORM )
     128             :                     {
     129             :                         /* less */
     130           1 :                         hcode_l += huffsizn_n[j];
     131             :                     }
     132             :                     else
     133             :                     {
     134             :                         /* equal */
     135          91 :                         hcode_l += huffsizn_e[j];
     136             :                     }
     137             :                 }
     138          93 :                 prevj = j;
     139             :             }
     140           3 :             if ( hcode_l >= bits && bits != 0 )
     141             :             {
     142             :                 /* LC mode 1 Transient Huffman Coding   */
     143           3 :                 *LCmode = 1;
     144           3 :                 hcode_l = bits;
     145             :             }
     146             :         }
     147             :         else
     148             :         {
     149             :             /* Check bits if LC mode == 3 -> Check bits if LC mode == 0 */
     150        8454 :             hcode_l = 0;
     151        8454 :             prevj = difidx[0] + OFFSET_NORM;
     152      250215 :             for ( i = 1; i < num_sfm; i++ )
     153             :             {
     154      241761 :                 j = difidx[i];
     155      241761 :                 if ( prevj > HTH_NORM )
     156             :                 {
     157             :                     /* above */
     158       52305 :                     hcode_l += huffsizn_n[31 - j];
     159             :                 }
     160             :                 else
     161             :                 {
     162      189456 :                     if ( prevj < LTH_NORM )
     163             :                     {
     164             :                         /* less */
     165       32381 :                         hcode_l += huffsizn_n[j];
     166             :                     }
     167             :                     else
     168             :                     {
     169             :                         /* equal */
     170      157075 :                         hcode_l += huffsizn_e[j];
     171             :                     }
     172             :                 }
     173      241761 :                 prevj = j;
     174             :             }
     175             : 
     176        8454 :             *LCmode = 0;
     177             : 
     178             :             /* LR-MDCT core doesn't have coding mode 2 and 3 */
     179        8454 :             if ( flag_HQ2 == NORMAL_HQ_CORE )
     180             :             {
     181             :                 /* Check bits if LC mode == 1 -> Check bits if LC mode == 2 */
     182        8423 :                 bits = 0;
     183      249533 :                 for ( i = 1; i < num_sfm; i++ )
     184             :                 {
     185      241110 :                     j = difidx[i];
     186      241110 :                     bits += huffsizn[j];
     187             :                 }
     188             : 
     189             :                 /*------------------------------------------------------------------------------*
     190             :                  * comparing bit expenses of coding mode 2 with that of the optimal coding mode
     191             :                  *------------------------------------------------------------------------------*/
     192             : 
     193        8423 :                 if ( hcode_l > bits )
     194             :                 {
     195        1139 :                     *LCmode = 2;
     196        1139 :                     hcode_l = bits;
     197             :                 }
     198             :             }
     199             : 
     200             :             /* Check bits if LC mode == 2 -> Check bits if LC mode == 1  */
     201        8454 :             bits = 0;
     202        8454 :             index_max = 0;
     203        8454 :             index_min = 31;
     204      250215 :             for ( i = 1; i < num_sfm; i++ )
     205             :             {
     206      241761 :                 difidx_org[i] = difidx[i];
     207             :             }
     208             : 
     209        8454 :             difidx_flag = 0;
     210      241761 :             for ( i = 2; i < num_sfm; i++ )
     211             :             {
     212      233307 :                 if ( difidx_org[i - 1] > 17 )
     213             :                 {
     214       46067 :                     difidx[i] = difidx_org[i] + min( ( difidx_org[i - 1] - 17 ), 3 );
     215       46067 :                     if ( difidx[i] > 31 )
     216             :                     {
     217           0 :                         difidx_flag = 1;
     218           0 :                         break;
     219             :                     }
     220             :                 }
     221             : 
     222      233307 :                 if ( difidx_org[i - 1] < 13 )
     223             :                 {
     224       32291 :                     difidx[i] = difidx_org[i] + max( ( difidx_org[i - 1] - 13 ), -3 );
     225       32291 :                     if ( difidx[i] < 0 )
     226             :                     {
     227           0 :                         difidx_flag = 1;
     228           0 :                         break;
     229             :                     }
     230             :                 }
     231             :             }
     232             : 
     233        8454 :             index_rad = 0;
     234        8454 :             if ( difidx_flag != 1 )
     235             :             {
     236      250215 :                 for ( i = 1; i < num_sfm; i++ )
     237             :                 {
     238      241761 :                     if ( difidx[i] > index_max )
     239             :                     {
     240       25180 :                         index_max = difidx[i];
     241             :                     }
     242             : 
     243      241761 :                     if ( difidx[i] < index_min )
     244             :                     {
     245       26352 :                         index_min = difidx[i];
     246             :                     }
     247             :                 }
     248             : 
     249        8454 :                 index_rad = max( ( 15 - index_min ), ( index_max - 15 ) );
     250             : 
     251        8454 :                 if ( index_rad <= HUFF_THR )
     252             :                 {
     253      238179 :                     for ( i = 1; i < num_sfm; i++ )
     254             :                     {
     255      230106 :                         j = difidx[i];
     256      230106 :                         bits += resize_huffsizn[j];
     257             :                     }
     258             : 
     259             :                     /*------------------------------------------------------------------*
     260             :                      * comparing bit expenses of coding mode 1 with that of coding mode 0
     261             :                      *------------------------------------------------------------------*/
     262             : 
     263        8073 :                     if ( hcode_l > bits )
     264             :                     {
     265        2396 :                         hcode_l = bits;
     266        2396 :                         *LCmode = 1;
     267             :                     }
     268             :                 }
     269             :             }
     270             : 
     271             :             /* LR-MDCT core doesn't have coding mode 2 and 3 */
     272        8454 :             if ( flag_HQ2 == NORMAL_HQ_CORE )
     273             :             {
     274             :                 /*------------------------------------------------------------------------------*
     275             :                  * comparing bit expenses of coding mode 3 with that of the optimal coding mode
     276             :                  *------------------------------------------------------------------------------*/
     277             : 
     278        8423 :                 if ( hcode_l >= numnrmibits )
     279             :                 {
     280         127 :                     hcode_l = numnrmibits;
     281         127 :                     *LCmode = 3;
     282             :                 }
     283             :             }
     284             : 
     285        8454 :             if ( ( *LCmode != 1 && flag_HQ2 == NORMAL_HQ_CORE ) || flag_HQ2 == LOW_RATE_HQ_CORE )
     286             :             {
     287      172444 :                 for ( i = 2; i < num_sfm; i++ )
     288             :                 {
     289      166373 :                     difidx[i] = difidx_org[i];
     290             :                 }
     291             :             }
     292             :         }
     293             :     }
     294             :     else
     295             :     {
     296        8455 :         if ( flag_HQ2 == LOW_RATE_HQ_CORE_TRAN || flag_HQ2 == LOW_RATE_HQ_CORE )
     297             :         {
     298          32 :             push_indice( hBstr, IND_HQ2_DENG_HMODE, *LCmode, BITS_DE_HMODE );
     299          32 :             push_indice( hBstr, IND_HQ2_DIFF_ENERGY, difidx[0], BITS_DE_FCOMP );
     300             :         }
     301             :         else
     302             :         {
     303        8423 :             push_indice( hBstr, IND_LC_MODE, *LCmode, 2 );
     304        8423 :             push_indice( hBstr, IND_YNRM, difidx[0], NORM0_BITS );
     305             :         }
     306             : 
     307        8455 :         if ( is_transient && flag_HQ2 == LOW_RATE_HQ_CORE_TRAN )
     308             :         {
     309           2 :             hcode_l = 0;
     310           2 :             if ( *LCmode == 1 )
     311             :             {
     312             :                 /* LC mode 0 Transient Huffman Coding   */
     313          64 :                 for ( i = 1; i < num_sfm; i++ )
     314             :                 {
     315          62 :                     j = difidx[i];
     316          62 :                     m = huffnorm_tran[j];
     317          62 :                     r = huffsizn_tran[j];
     318          62 :                     v = 0;
     319             : 
     320             :                     /* Bit reverse */
     321         190 :                     for ( k = 0; k < r; k++ )
     322             :                     {
     323         128 :                         v <<= 1;
     324         128 :                         v |= m & 1;
     325         128 :                         m >>= 1;
     326             :                     }
     327             : 
     328          62 :                     push_indice( hBstr, IND_HQ2_DIFF_ENERGY, v, r );
     329             :                 }
     330             :             }
     331             :             else
     332             :             {
     333             :                 /* LC mode 1 context based Coding   */
     334           0 :                 prevj = difidx[0] + OFFSET_NORM;
     335           0 :                 for ( i = 1; i < num_sfm; i++ )
     336             :                 {
     337           0 :                     j = difidx[i];
     338             : 
     339           0 :                     if ( prevj > HTH_NORM )
     340             :                     {
     341             :                         /* above */
     342           0 :                         r = huffsizn_n[31 - j];
     343           0 :                         m = huffnorm_n[31 - j];
     344             :                     }
     345             :                     else
     346             :                     {
     347           0 :                         if ( prevj < LTH_NORM )
     348             :                         {
     349             :                             /* less */
     350           0 :                             r = huffsizn_n[j];
     351           0 :                             m = huffnorm_n[j];
     352             :                         }
     353             :                         else
     354             :                         {
     355             :                             /* equal */
     356           0 :                             r = huffsizn_e[j];
     357           0 :                             m = huffnorm_e[j];
     358             :                         }
     359             :                     }
     360           0 :                     push_indice( hBstr, IND_HQ2_DIFF_ENERGY, m, r );
     361           0 :                     prevj = j;
     362             :                 }
     363             :             }
     364             :         }
     365             :         else
     366             :         {
     367        8453 :             hcode_l = 0;
     368        8453 :             if ( *LCmode == 0 )
     369             :             {
     370             :                 /* LC mode 3 -> LC mode 0 */
     371        4915 :                 prevj = difidx[0] + OFFSET_NORM;
     372      146621 :                 for ( i = 1; i < num_sfm; i++ )
     373             :                 {
     374      141706 :                     j = difidx[i];
     375             : 
     376      141706 :                     if ( prevj > HTH_NORM )
     377             :                     {
     378             :                         /* above */
     379       29984 :                         r = huffsizn_n[31 - j];
     380       29984 :                         m = huffnorm_n[31 - j];
     381             :                     }
     382             :                     else
     383             :                     {
     384      111722 :                         if ( prevj < LTH_NORM )
     385             :                         {
     386             :                             /* less */
     387       18336 :                             r = huffsizn_n[j];
     388       18336 :                             m = huffnorm_n[j];
     389             :                         }
     390             :                         else
     391             :                         {
     392             :                             /* equal */
     393       93386 :                             r = huffsizn_e[j];
     394       93386 :                             m = huffnorm_e[j];
     395             :                         }
     396             :                     }
     397             : 
     398      141706 :                     if ( flag_HQ2 == LOW_RATE_HQ_CORE )
     399             :                     {
     400         357 :                         push_indice( hBstr, IND_HQ2_DIFF_ENERGY, m, r );
     401             :                     }
     402             :                     else
     403             :                     {
     404      141349 :                         push_indice( hBstr, IND_YNRM, m, r );
     405             :                     }
     406             : 
     407      141706 :                     prevj = j;
     408             :                 }
     409             :             }
     410        3538 :             else if ( *LCmode == 1 )
     411             :             {
     412        2396 :                 if ( flag_HQ2 == 1 )
     413             :                 {
     414          13 :                     index_max = 0;
     415          13 :                     index_min = 31;
     416         286 :                     for ( i = 1; i < num_sfm; i++ )
     417             :                     {
     418         273 :                         difidx_org[i] = difidx[i];
     419             :                     }
     420             : 
     421         273 :                     for ( i = 2; i < num_sfm; i++ )
     422             :                     {
     423         260 :                         if ( difidx_org[i - 1] > 17 )
     424             :                         {
     425          55 :                             difidx[i] = difidx_org[i] + min( ( difidx_org[i - 1] - 17 ), 3 );
     426          55 :                             if ( difidx[i] > 31 )
     427             :                             {
     428           0 :                                 difidx_flag = 1;
     429           0 :                                 break;
     430             :                             }
     431             :                         }
     432             : 
     433         260 :                         if ( difidx_org[i - 1] < 13 )
     434             :                         {
     435          14 :                             difidx[i] = difidx_org[i] + max( ( difidx_org[i - 1] - 13 ), -3 );
     436          14 :                             if ( difidx[i] < 0 )
     437             :                             {
     438           0 :                                 difidx_flag = 1;
     439           0 :                                 break;
     440             :                             }
     441             :                         }
     442             :                     }
     443             : 
     444          13 :                     if ( difidx_flag != 1 )
     445             :                     {
     446         286 :                         for ( i = 1; i < num_sfm; i++ )
     447             :                         {
     448         273 :                             if ( difidx[i] > index_max )
     449             :                             {
     450          23 :                                 index_max = difidx[i];
     451             :                             }
     452             : 
     453         273 :                             if ( difidx[i] < index_min )
     454             :                             {
     455          42 :                                 index_min = difidx[i];
     456             :                             }
     457             :                         }
     458             : 
     459          13 :                         index_rad = max( ( 15 - index_min ), ( index_max - 15 ) );
     460             : 
     461          13 :                         if ( index_rad <= HUFF_THR )
     462             :                         {
     463         286 :                             for ( i = 1; i < num_sfm; i++ )
     464             :                             {
     465         273 :                                 j = difidx[i];
     466             :                             }
     467             :                         }
     468             :                     }
     469             :                 }
     470             : 
     471             :                 /* LC mode 2 -> LC mode 1 */
     472       71986 :                 for ( i = 1; i < num_sfm; i++ )
     473             :                 {
     474       69590 :                     j = difidx[i];
     475             : 
     476       69590 :                     m = resize_huffnorm[j];
     477       69590 :                     r = resize_huffsizn[j];
     478       69590 :                     v = 0;
     479             : 
     480             :                     /* Bit reverse */
     481      293496 :                     for ( k = 0; k < r; k++ )
     482             :                     {
     483      223906 :                         v <<= 1;
     484      223906 :                         v |= m & 1;
     485      223906 :                         m >>= 1;
     486             :                     }
     487             : 
     488       69590 :                     if ( flag_HQ2 )
     489             :                     {
     490         273 :                         push_indice( hBstr, IND_HQ2_DIFF_ENERGY, v, r );
     491             :                     }
     492             :                     else
     493             :                     {
     494       69317 :                         push_indice( hBstr, IND_YNRM, v, r );
     495             :                     }
     496             :                 }
     497             :             }
     498        1142 :             else if ( *LCmode == 2 )
     499             :             {
     500             :                 /* LC mode 1 -> LC mode 2 */
     501       28665 :                 for ( i = 1; i < num_sfm; i++ )
     502             :                 {
     503       27650 :                     j = difidx[i];
     504             : 
     505       27650 :                     m = huffnorm[j];
     506       27650 :                     r = huffsizn[j];
     507             : 
     508       27650 :                     push_indice( hBstr, IND_YNRM, m, r );
     509             :                 }
     510             :             }
     511             :             else
     512             :             {
     513        2921 :                 for ( i = 1; i < num_sfm; i++ )
     514             :                 {
     515        2794 :                     push_indice( hBstr, IND_YNRM, difidx[i], NORMI_BITS );
     516             :                 }
     517             :             }
     518             :         }
     519             :     }
     520             : 
     521       16912 :     return hcode_l;
     522             : }
     523             : 
     524             : /*--------------------------------------------------------------------------*
     525             :  * diff_envelope_coding()
     526             :  *
     527             :  * Create differential code of norm indices
     528             :  *--------------------------------------------------------------------------*/
     529             : 
     530        8423 : void diff_envelope_coding(
     531             :     const int16_t is_transient,  /* i  : transient indicator                 */
     532             :     const int16_t num_env_bands, /* i  : number of envelope bands to code    */
     533             :     const int16_t start_norm,    /* i  : start of envelope coding            */
     534             :     int16_t *ynrm,               /* i/o: quantization indices for norms      */
     535             :     int16_t *normqlg2,           /* i/o: quantized norms                     */
     536             :     int16_t *difidx              /* o  : differential code                   */
     537             : )
     538             : {
     539             :     int16_t i;
     540             :     int16_t idxbuf[NB_SFM];
     541             :     int16_t normbuf[NB_SFM];
     542             : 
     543             :     /* Differential coding for indices of quantized norms */
     544        8423 :     if ( is_transient )
     545             :     {
     546             :         /* Reorder quantization indices and quantized norms */
     547         562 :         reordernorm( ynrm, normqlg2, idxbuf, normbuf, num_env_bands );
     548         562 :         diffcod( num_env_bands, idxbuf, &difidx[1] );
     549         562 :         difidx[0] = idxbuf[0];
     550         562 :         recovernorm( idxbuf, ynrm, normqlg2, num_env_bands );
     551             :     }
     552             :     else
     553             :     {
     554        7861 :         diffcod( num_env_bands, &ynrm[start_norm], &difidx[1] );
     555        7861 :         difidx[0] = ynrm[start_norm];
     556             : 
     557      233683 :         for ( i = start_norm; i < start_norm + num_env_bands; i++ )
     558             :         {
     559      225822 :             normqlg2[i] = dicnlg2[ynrm[i]];
     560             :         }
     561             :     }
     562             : 
     563        8423 :     return;
     564             : }

Generated by: LCOV version 1.14