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 "cnst.h" 43 : #include "rom_com.h" 44 : #include "prot.h" 45 : #include "wmc_auto.h" 46 : 47 : /*-------------------------------------------------------------------* 48 : * rc_get_bits2() 49 : * 50 : * Get number of bits needed to finalize range coder 51 : *-------------------------------------------------------------------*/ 52 : 53 : /*! r: Number of bits needed */ 54 525415 : int16_t rc_get_bits2( 55 : const int16_t N, /* i : Number of bits currently used */ 56 : const uint32_t range /* i : Range of range coder */ 57 : ) 58 : { 59 : int16_t tmp; 60 525415 : tmp = N + 2 + norm_ul( range ); /* aligned to BASOP */ 61 525415 : return tmp; 62 : } 63 : 64 : /*-------------------------------------------------------------------* 65 : * rangeCoderFinalizationFBits() 66 : * 67 : * Fractional (Q3) bits for range coder finalization 68 : *-------------------------------------------------------------------*/ 69 : 70 1433058 : void rangeCoderFinalizationFBits( 71 : const int16_t Brc, /* i : Current number of decoded bits */ 72 : const uint32_t INTrc, /* i : Range coder state */ 73 : int16_t *FBits /* i : Fractional finalization bits */ 74 : ) 75 : { 76 : uint32_t Bq15; 77 : uint32_t UL_tmp; 78 : uint16_t Bq15ui16, B, E; 79 : int16_t k; 80 : 81 1433058 : B = 30 - norm_ul( INTrc ); /* aligned to BASOP */ 82 : 83 : #define RCF_INIT_SHIFTp1 ( RCF_INIT_SHIFT + 1 ) 84 : #define RCF_FINALIZE_LIMIT ( ( 1L << 16 ) - 1 ) 85 1433058 : *FBits = ( Brc + 32 ) * 8; 86 : 87 1433058 : Bq15 = 0; 88 1433058 : k = B - RCF_INIT_SHIFT; 89 1433058 : if ( k >= 0 ) 90 : { 91 1433058 : Bq15 = INTrc >> ( k ); /* single op */ 92 : } 93 : 94 1433058 : E = 2; 95 5732232 : for ( k = 1; k < 4; k++ ) 96 : { 97 4299174 : Bq15ui16 = (uint16_t) ( Bq15 >> ( E & 1 ) ); 98 4299174 : UL_tmp = (uint32_t) Bq15ui16; 99 4299174 : Bq15 = ( UL_tmp * Bq15ui16 ) >> RCF_INIT_SHIFTp1; 100 4299174 : E = 2 * B; 101 4299174 : if ( Bq15 > RCF_FINALIZE_LIMIT ) 102 : { 103 2793473 : E++; 104 : } 105 4299174 : B = E; 106 : } 107 1433058 : *FBits -= B; 108 : #undef RCF_INIT_SHIFTp1 109 : #undef RCF_FINALIZE_LIMIT 110 : 111 1433058 : return; 112 : }