LCOV - code coverage report
Current view: top level - lib_com - ivas_arith.c (source / functions) Hit Total Coverage
Test: Coverage on main -- short test vectors @ 6c9ddc4024a9c0e1ecb8f643f114a84a0e26ec6b Lines: 79 85 92.9 %
Date: 2025-05-23 08:37:30 Functions: 6 6 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             : #include <stdint.h>
      34             : #include "options.h"
      35             : #ifdef DEBUGGING
      36             : #include "debug.h"
      37             : #endif
      38             : #include "wmc_auto.h"
      39             : #include "prot.h"
      40             : #include "ivas_prot.h"
      41             : #include "stat_dec.h"
      42             : 
      43             : /*-----------------------------------------------------------------------------------------*
      44             :  * Function ivas_ari_start_decoding_14bits_ext_1_lfe()
      45             :  *
      46             :  * Start arithemetic coding
      47             :  *
      48             :  * Similar to ari_start_decoding_14bits(), but do not read past frame boundary.
      49             :  *-----------------------------------------------------------------------------------------*/
      50             : 
      51     1759005 : void ivas_ari_start_decoding_14bits_ext_1_lfe(
      52             :     Decoder_State *st,
      53             :     Tastat *s,
      54             :     int16_t *extra_bits_read )
      55             : {
      56             :     int32_t val;
      57             : 
      58     1759005 :     if ( st->bits_frame >= ( st->next_bit_pos + cbitsnew ) )
      59             :     {
      60     1759005 :         val = get_next_indice( st, cbitsnew );
      61             :     }
      62             :     else
      63             :     {
      64             :         int16_t rem_bits;
      65           0 :         rem_bits = st->bits_frame - st->next_bit_pos;
      66           0 :         val = get_next_indice( st, rem_bits );
      67           0 :         val = ( val << ( cbitsnew - rem_bits ) );
      68           0 :         *extra_bits_read = *extra_bits_read + ( cbitsnew - rem_bits );
      69             :     }
      70             : 
      71     1759005 :     s->low = 0;
      72     1759005 :     s->high = ari_q4new;
      73     1759005 :     s->value = val;
      74             : 
      75     1759005 :     return;
      76             : }
      77             : 
      78             : 
      79             : /* Helper function to determine the symbol. */
      80    36799404 : static uint16_t ivas_ari_get_symbol(
      81             :     const uint16_t *p,
      82             :     uint32_t range,
      83             :     uint32_t cum )
      84             : {
      85             :     uint16_t symbol;
      86             : 
      87    36799404 :     symbol = 0;
      88             : 
      89   286541283 :     while ( ( p[symbol + 1] * range ) > cum )
      90             :     {
      91   249741879 :         symbol = symbol + 1;
      92             :     }
      93             : 
      94    36799404 :     return symbol;
      95             : }
      96             : 
      97             : 
      98             : /*---------------------------------------------------------------
      99             :  * Function ivas_ari_decode_14bits_bit_ext_1_lfe()
     100             :  *
     101             :  *
     102             :  *-------------------------------------------------------------*/
     103             : 
     104    36799404 : uint16_t ivas_ari_decode_14bits_bit_ext_1_lfe(
     105             :     Decoder_State *st,
     106             :     Tastat *s,
     107             :     const uint16_t *cum_freq,
     108             :     int16_t *extra_bits_read )
     109             : {
     110             :     uint16_t symbol;
     111             :     uint32_t low, high, range, value;
     112             :     uint32_t cum;
     113             : 
     114             :     /* read s->low,high,value sequentially */
     115    36799404 :     low = s->low;
     116    36799404 :     high = s->high;
     117    36799404 :     value = s->value;
     118             : 
     119    36799404 :     range = high - low + 1;
     120    36799404 :     cum = ( ( ( (uint32_t) ( value - low + 1 ) ) << stat_bitsnew ) - ( (uint32_t) 1 ) );
     121             : 
     122    36799404 :     symbol = ivas_ari_get_symbol( cum_freq, range, cum );
     123             : 
     124    36799404 :     high = low + mul_sbc_14bits( range, cum_freq[symbol] ) - 1;
     125    36799404 :     low += mul_sbc_14bits( range, cum_freq[symbol + 1] );
     126             : 
     127             :     for ( ;; )
     128             :     {
     129   110871534 :         if ( high >= ari_q2new )
     130             :         {
     131    84563436 :             if ( low >= ari_q2new )
     132             :             {
     133    26461011 :                 value -= ari_q2new;
     134    26461011 :                 low -= ari_q2new;
     135    26461011 :                 high -= ari_q2new;
     136             :             }
     137             :             else
     138             :             {
     139    58102425 :                 if ( low >= ari_q1new && high < ari_q3new )
     140             :                 {
     141    21303021 :                     value -= ari_q1new;
     142    21303021 :                     low -= ari_q1new;
     143    21303021 :                     high -= ari_q1new;
     144             :                 }
     145             :                 else
     146             :                 {
     147             :                     break;
     148             :                 }
     149             :             }
     150             :         }
     151    74072130 :         low += low;
     152    74072130 :         high += high + 1;
     153             : 
     154    74072130 :         if ( st->next_bit_pos >= st->bits_frame )
     155             :         {
     156           0 :             value = ( value << 1 );
     157           0 :             *extra_bits_read = *extra_bits_read + 1;
     158             :         }
     159             :         else
     160             :         {
     161    74072130 :             value = ( value << 1 ) | get_next_indice_1( st );
     162             :         }
     163             :     }
     164             : 
     165    36799404 :     s->low = low;
     166    36799404 :     s->high = high;
     167    36799404 :     s->value = value;
     168             : 
     169    36799404 :     return symbol;
     170             : }
     171             : 
     172             : 
     173             : /*---------------------------------------------------------------
     174             :  * Function ivas_ari_done_decoding_14bits_ext_1_lfe()
     175             :  *
     176             :  *
     177             :  *-------------------------------------------------------------*/
     178             : 
     179     1759005 : void ivas_ari_done_decoding_14bits_ext_1_lfe(
     180             :     Decoder_State *st,
     181             :     const int16_t extra_bits_read )
     182             : {
     183     1759005 :     get_next_indice_tmp( st, -( cbitsnew - 2 - extra_bits_read ) );
     184             : 
     185     1759005 :     return;
     186             : }
     187             : 
     188             : 
     189             : /*---------------------------------------------------------------
     190             :  * Function ivas_ari_done_encoding_14bits()
     191             :  *
     192             :  * Arith encoding of last table entry
     193             :  *-------------------------------------------------------------*/
     194             : 
     195      859808 : void ivas_ari_done_encoding_14bits(
     196             :     BSTR_ENC_HANDLE hBstr,
     197             :     Tastat *s )
     198             : {
     199             :     int32_t low;
     200             :     int32_t bits_to_follow;
     201             : 
     202             :     /*  not needed, s points to s->low */
     203      859808 :     low = s->low;
     204      859808 :     bits_to_follow = s->bits_to_follow + 1;
     205             : 
     206      859808 :     if ( low < ari_q1new )
     207             :     {
     208      533670 :         push_next_indice( hBstr, 0, 1 ); /*send a zero*/
     209             : 
     210     1677301 :         for ( ; bits_to_follow > 0; bits_to_follow-- )
     211             :         {
     212     1143631 :             push_next_indice( hBstr, 1, 1 ); /*send a one*/
     213             :         }
     214             :     }
     215             :     else
     216             :     {
     217      326138 :         push_next_indice( hBstr, 1, 1 ); /*send a one*/
     218      993640 :         for ( ; bits_to_follow > 0; bits_to_follow-- )
     219             :         {
     220      667502 :             push_next_indice( hBstr, 0, 1 ); /*send a zero*/
     221             :         }
     222             :     }
     223             : 
     224             :     /*It is done so no need to save values-> no counting*/
     225             :     /*s->low = low;
     226             :     s->bits_to_follow = bits_to_follow;*/
     227             : 
     228      859808 :     return;
     229             : }
     230             : 
     231             : 
     232             : /*---------------------------------------------------------------
     233             :  * Function ivas_ari_encode_14bits_ext()
     234             :  *
     235             :  * Arith encode function for extended proba tables
     236             :  *-------------------------------------------------------------*/
     237             : 
     238    17290479 : void ivas_ari_encode_14bits_ext(
     239             :     BSTR_ENC_HANDLE hBstr,
     240             :     Tastat *s,
     241             :     int32_t symbol,
     242             :     const uint16_t *cum_freq )
     243             : {
     244             :     int32_t low, high, range;
     245             :     int32_t bits_to_follow;
     246             : 
     247             :     /*for all operation using bit_ptr=&ptr[bp]   */
     248             :     /* for reading s->high,low,bits_to_follow sequentially */
     249    17290479 :     high = s->high;
     250    17290479 :     low = s->low;
     251    17290479 :     range = high - low + 1;
     252             : 
     253    17290479 :     high = low + mul_sbc_14bits( range, cum_freq[symbol] ) - 1;
     254    17290479 :     low += mul_sbc_14bits( range, cum_freq[symbol + 1] );
     255             : 
     256    17290479 :     bits_to_follow = s->bits_to_follow;
     257             : 
     258             :     for ( ;; )
     259             :     {
     260    54981366 :         if ( high < ari_q2new )
     261             :         {
     262    13343933 :             push_next_indice( hBstr, 0, 1 ); /*send a zero*/
     263    18375742 :             for ( ; bits_to_follow > 0; bits_to_follow-- )
     264             :             {
     265     5031809 :                 push_next_indice( hBstr, 1, 1 ); /*send a one*/
     266             :             }
     267             :         }
     268             :         else
     269             :         {
     270    41637433 :             if ( low >= ari_q2new )
     271             :             {
     272    13592067 :                 push_next_indice( hBstr, 1, 1 ); /*send a one*/
     273    18357687 :                 for ( ; bits_to_follow > 0; bits_to_follow-- )
     274             :                 {
     275     4765620 :                     push_next_indice( hBstr, 0, 1 ); /*send a zero*/
     276             :                 }
     277    13592067 :                 low -= ari_q2new;
     278    13592067 :                 high -= ari_q2new; /* Subtract offset to top.  */
     279             :             }
     280             :             else
     281             :             {
     282             :                 /* Output an opposite bit   */
     283    28045366 :                 if ( low >= ari_q1new && high < ari_q3new ) /* Output an opposite bit   */
     284             :                 {
     285             :                     /* later if in middle half. */
     286    10754887 :                     bits_to_follow += 1;
     287    10754887 :                     low -= ari_q1new; /* Subtract offset to middle*/
     288    10754887 :                     high -= ari_q1new;
     289             :                 }
     290             :                 else
     291             :                 {
     292             :                     break; /* Otherwise exit loop. */
     293             :                 }
     294             :             }
     295             :         }
     296    37690887 :         low += low;
     297    37690887 :         high += high + 1; /* Scale up code range.     */
     298             :     }
     299             : 
     300    17290479 :     s->low = low;
     301    17290479 :     s->high = high;
     302    17290479 :     s->bits_to_follow = bits_to_follow;
     303             : 
     304    17290479 :     return;
     305             : }

Generated by: LCOV version 1.14