1 /* ----------------------------------------------------------------------------- 2 Software License for The Fraunhofer FDK AAC Codec Library for Android 3 4 Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Frderung der angewandten 5 Forschung e.V. All rights reserved. 6 7 1. INTRODUCTION 8 The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software 9 that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding 10 scheme for digital audio. This FDK AAC Codec software is intended to be used on 11 a wide variety of Android devices. 12 13 AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient 14 general perceptual audio codecs. AAC-ELD is considered the best-performing 15 full-bandwidth communications codec by independent studies and is widely 16 deployed. AAC has been standardized by ISO and IEC as part of the MPEG 17 specifications. 18 19 Patent licenses for necessary patent claims for the FDK AAC Codec (including 20 those of Fraunhofer) may be obtained through Via Licensing 21 (www.vialicensing.com) or through the respective patent owners individually for 22 the purpose of encoding or decoding bit streams in products that are compliant 23 with the ISO/IEC MPEG audio standards. Please note that most manufacturers of 24 Android devices already license these patent claims through Via Licensing or 25 directly from the patent owners, and therefore FDK AAC Codec software may 26 already be covered under those patent licenses when it is used for those 27 licensed purposes only. 28 29 Commercially-licensed AAC software libraries, including floating-point versions 30 with enhanced sound quality, are also available from Fraunhofer. Users are 31 encouraged to check the Fraunhofer website for additional applications 32 information and documentation. 33 34 2. COPYRIGHT LICENSE 35 36 Redistribution and use in source and binary forms, with or without modification, 37 are permitted without payment of copyright license fees provided that you 38 satisfy the following conditions: 39 40 You must retain the complete text of this software license in redistributions of 41 the FDK AAC Codec or your modifications thereto in source code form. 42 43 You must retain the complete text of this software license in the documentation 44 and/or other materials provided with redistributions of the FDK AAC Codec or 45 your modifications thereto in binary form. You must make available free of 46 charge copies of the complete source code of the FDK AAC Codec and your 47 modifications thereto to recipients of copies in binary form. 48 49 The name of Fraunhofer may not be used to endorse or promote products derived 50 from this library without prior written permission. 51 52 You may not charge copyright license fees for anyone to use, copy or distribute 53 the FDK AAC Codec software or your modifications thereto. 54 55 Your modified versions of the FDK AAC Codec must carry prominent notices stating 56 that you changed the software and the date of any change. For modified versions 57 of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" 58 must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK 59 AAC Codec Library for Android." 60 61 3. NO PATENT LICENSE 62 63 NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without 64 limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. 65 Fraunhofer provides no warranty of patent non-infringement with respect to this 66 software. 67 68 You may use this FDK AAC Codec software or modifications thereto only for 69 purposes that are authorized by appropriate patent licenses. 70 71 4. DISCLAIMER 72 73 This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright 74 holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, 75 including but not limited to the implied warranties of merchantability and 76 fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 77 CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, 78 or consequential damages, including but not limited to procurement of substitute 79 goods or services; loss of use, data, or profits, or business interruption, 80 however caused and on any theory of liability, whether in contract, strict 81 liability, or tort (including negligence), arising in any way out of the use of 82 this software, even if advised of the possibility of such damage. 83 84 5. CONTACT INFORMATION 85 86 Fraunhofer Institute for Integrated Circuits IIS 87 Attention: Audio and Multimedia Departments - FDK AAC LL 88 Am Wolfsmantel 33 89 91058 Erlangen, Germany 90 91 www.iis.fraunhofer.de/amm 92 amm-info (at) iis.fraunhofer.de 93 ----------------------------------------------------------------------------- */ 94 95 /************************** Arithmetic coder library *************************** 96 97 Author(s): Youliy Ninov, Oliver Weiss 98 99 Description: Definition of Spectral Noiseless Coding Scheme based on an 100 Arithmetic Coder in Conjunction with an Adaptive Context 101 102 *******************************************************************************/ 103 104 #include "ac_arith_coder.h" 105 106 #define cbitsnew 16 107 #define stat_bitsnew 14 108 #define ari_q4new (((long)1 << cbitsnew) - 1) /* 0xFFFF */ 109 #define ari_q1new (ari_q4new / 4 + 1) /* 0x4000 */ 110 #define ari_q2new (2 * ari_q1new) /* 0x8000 */ 111 #define ari_q3new (3 * ari_q1new) /* 0xC000 */ 112 113 #define VAL_ESC 16 114 115 /* Arithmetic coder library info */ 116 #define AC_LIB_VL0 2 117 #define AC_LIB_VL1 0 118 #define AC_LIB_VL2 0 119 #define AC_LIB_TITLE "Arithmetic Coder Lib" 120 #ifdef __ANDROID__ 121 #define AC_LIB_BUILD_DATE "" 122 #define AC_LIB_BUILD_TIME "" 123 #else 124 #define AC_LIB_BUILD_DATE __DATE__ 125 #define AC_LIB_BUILD_TIME __TIME__ 126 #endif 127 128 const SHORT ari_lsb2[3][4] = { 129 {12571, 10569, 3696, 0}, {12661, 5700, 3751, 0}, {10827, 6884, 2929, 0}}; 130 131 H_ALLOC_MEM(ArcoData, CArcoData) 132 /*! The structure ArcoData contains 2-tuple context of previous frame. <br> 133 Dimension: 1 */ 134 C_ALLOC_MEM(ArcoData, CArcoData, 1) 135 136 /* 137 This define triggers the use of the pre-known return values of function 138 get_pk_v2() for the cases, where parameter s is in range 139 0x00000000..0x0000000F. Note: These 16 bytes have been moved into the first 4 140 entries of ari_merged_hash_ps that are no more referenced. 141 */ 142 143 static const ULONG ari_merged_hash_ps[742] = { 144 0x00001044UL, 0x00003D0AUL, 0x00005350UL, 0x000074D6UL, 0x0000A49FUL, 145 0x0000F96EUL, 0x00111000UL, 0x01111E83UL, 0x01113146UL, 0x01114036UL, 146 0x01116863UL, 0x011194E9UL, 0x0111F7EEUL, 0x0112269BUL, 0x01124775UL, 147 0x01126DA1UL, 0x0112D912UL, 0x01131AF0UL, 0x011336DDUL, 0x01135CF5UL, 148 0x01139DF8UL, 0x01141A5BUL, 0x01144773UL, 0x01146CF5UL, 0x0114FDE9UL, 149 0x01166CF5UL, 0x0116FDE4UL, 0x01174CF3UL, 0x011FFDCFUL, 0x01211CC2UL, 150 0x01213B2DUL, 0x01214036UL, 0x01216863UL, 0x012194D2UL, 0x0122197FUL, 151 0x01223AADUL, 0x01224036UL, 0x01226878UL, 0x0122A929UL, 0x0122F4ABUL, 152 0x01232B2DUL, 0x012347B6UL, 0x01237DF8UL, 0x0123B929UL, 0x012417DDUL, 153 0x01245D76UL, 0x01249DF8UL, 0x0124F912UL, 0x01255D75UL, 0x0125FDE9UL, 154 0x01265D75UL, 0x012B8DF7UL, 0x01311E2AUL, 0x01313B5EUL, 0x0131687BUL, 155 0x01321A6DUL, 0x013237BCUL, 0x01326863UL, 0x0132F4EEUL, 0x01332B5EUL, 156 0x01335DA1UL, 0x01338E24UL, 0x01341A5EUL, 0x01343DB6UL, 0x01348DF8UL, 157 0x01351935UL, 0x01355DB7UL, 0x0135FE12UL, 0x01376DF7UL, 0x013FFE29UL, 158 0x01400024UL, 0x01423821UL, 0x014318F6UL, 0x01433821UL, 0x0143F8E5UL, 159 0x01443DA1UL, 0x01486E38UL, 0x014FF929UL, 0x01543EE3UL, 0x015FF912UL, 160 0x016F298CUL, 0x018A5A69UL, 0x021007F1UL, 0x02112C2CUL, 0x02114B48UL, 161 0x02117353UL, 0x0211F4AEUL, 0x02122FEAUL, 0x02124B48UL, 0x02127850UL, 162 0x0212F72EUL, 0x02133A9EUL, 0x02134036UL, 0x02138864UL, 0x021414ADUL, 163 0x0214379EUL, 0x02145DB6UL, 0x0214FE1FUL, 0x02166DB7UL, 0x02200DC4UL, 164 0x02212FEAUL, 0x022147A0UL, 0x02218369UL, 0x0221F7EEUL, 0x02222AADUL, 165 0x02224788UL, 0x02226863UL, 0x02229929UL, 0x0222F4ABUL, 0x02232A9EUL, 166 0x02234F08UL, 0x02237864UL, 0x0223A929UL, 0x022417DEUL, 0x02244F36UL, 167 0x02248863UL, 0x02251A74UL, 0x02256DA1UL, 0x0225FE12UL, 0x02263DB6UL, 168 0x02276DF7UL, 0x022FFE29UL, 0x0231186DUL, 0x023137BCUL, 0x02314020UL, 169 0x02319ED6UL, 0x0232196DUL, 0x023237BCUL, 0x02325809UL, 0x02329429UL, 170 0x023317EDUL, 0x02333F08UL, 0x02335809UL, 0x023378E4UL, 0x02341A7CUL, 171 0x02344221UL, 0x0234A8D3UL, 0x023514BCUL, 0x02354221UL, 0x0235F8DFUL, 172 0x02364861UL, 0x023FFE29UL, 0x02400024UL, 0x0241583BUL, 0x024214C8UL, 173 0x02424809UL, 0x02427EE6UL, 0x02431708UL, 0x02434809UL, 0x02436ED0UL, 174 0x02441A76UL, 0x02443821UL, 0x024458E3UL, 0x0244F91FUL, 0x02454863UL, 175 0x0246190AUL, 0x02464863UL, 0x024FF929UL, 0x02525ED0UL, 0x025314E1UL, 176 0x025348FBUL, 0x025419A1UL, 0x025458D0UL, 0x0254F4E5UL, 0x02552861UL, 177 0x025FF912UL, 0x02665993UL, 0x027F5A69UL, 0x029F1481UL, 0x02CF28A4UL, 178 0x03100AF0UL, 0x031120AAUL, 0x031147A0UL, 0x03118356UL, 0x031217ECUL, 179 0x03123B5EUL, 0x03124008UL, 0x03127350UL, 0x031314AAUL, 0x0313201EUL, 180 0x03134F08UL, 0x03136863UL, 0x03141A5EUL, 0x03143F3CUL, 0x03200847UL, 181 0x03212AADUL, 0x03214F20UL, 0x03218ED6UL, 0x032218ADUL, 0x032237BCUL, 182 0x03225809UL, 0x03229416UL, 0x032317EDUL, 0x03234F20UL, 0x03237350UL, 183 0x0323FA6BUL, 0x03243F08UL, 0x03246863UL, 0x0324F925UL, 0x03254221UL, 184 0x0325F8DFUL, 0x03264821UL, 0x032FFE29UL, 0x03311E47UL, 0x03313F08UL, 185 0x0331580DUL, 0x033214DEUL, 0x03323F08UL, 0x03324020UL, 0x03326350UL, 186 0x033294E9UL, 0x033317DEUL, 0x03333F08UL, 0x0333627BUL, 0x0333A9A9UL, 187 0x033417FCUL, 0x03343220UL, 0x0334627BUL, 0x0334A9A9UL, 0x0335148AUL, 188 0x03353220UL, 0x033588E4UL, 0x03361A4AUL, 0x03363821UL, 0x0336F8D2UL, 189 0x03376863UL, 0x03411939UL, 0x0341583BUL, 0x034214C8UL, 0x03424809UL, 190 0x03426ED0UL, 0x03431588UL, 0x03434809UL, 0x03436ED0UL, 0x03441A48UL, 191 0x0344480DUL, 0x03446ED0UL, 0x03451A4AUL, 0x03453809UL, 0x03455EFBUL, 192 0x034614CAUL, 0x03463849UL, 0x034F8924UL, 0x03500A69UL, 0x035252D0UL, 193 0x035314E0UL, 0x0353324DUL, 0x03535ED0UL, 0x035414E0UL, 0x0354324DUL, 194 0x03545ED0UL, 0x0354F4E8UL, 0x0355384DUL, 0x03555ED0UL, 0x0355F4DFUL, 195 0x03564350UL, 0x035969A6UL, 0x035FFA52UL, 0x036649A6UL, 0x036FFA52UL, 196 0x037F4F66UL, 0x039D7492UL, 0x03BF6892UL, 0x03DF8A1FUL, 0x04100B84UL, 197 0x04112107UL, 0x0411520DUL, 0x041214EAUL, 0x04124F20UL, 0x04131EDEUL, 198 0x04133F08UL, 0x04135809UL, 0x0413F42BUL, 0x04142F08UL, 0x04200847UL, 199 0x042121FCUL, 0x04214209UL, 0x04221407UL, 0x0422203CUL, 0x04224209UL, 200 0x04226350UL, 0x04231A7CUL, 0x04234209UL, 0x0423637BUL, 0x04241A7CUL, 201 0x04243220UL, 0x0424627BUL, 0x042514C8UL, 0x04254809UL, 0x042FF8E9UL, 202 0x04311E47UL, 0x04313220UL, 0x0431527BUL, 0x043214FCUL, 0x04323220UL, 203 0x04326250UL, 0x043315BCUL, 0x04333220UL, 0x0433527BUL, 0x04338413UL, 204 0x04341488UL, 0x04344809UL, 0x04346ED0UL, 0x04351F48UL, 0x0435527BUL, 205 0x0435F9A5UL, 0x04363809UL, 0x04375EFBUL, 0x043FF929UL, 0x04412E79UL, 206 0x0441427BUL, 0x044219B9UL, 0x04423809UL, 0x0442537BUL, 0x044314C8UL, 207 0x04432020UL, 0x0443527BUL, 0x044414CAUL, 0x04443809UL, 0x0444537BUL, 208 0x04448993UL, 0x0445148AUL, 0x04453809UL, 0x04455ED0UL, 0x0445F4E5UL, 209 0x0446384DUL, 0x045009A6UL, 0x045272D3UL, 0x045314A0UL, 0x0453324DUL, 210 0x04535ED0UL, 0x045415A0UL, 0x0454324DUL, 0x04545ED0UL, 0x04551F60UL, 211 0x0455324DUL, 0x04562989UL, 0x04564350UL, 0x045FF4D2UL, 0x04665993UL, 212 0x047FFF62UL, 0x048FF725UL, 0x049F44BDUL, 0x04BFB7E5UL, 0x04EF8A25UL, 213 0x04FFFB98UL, 0x051131F9UL, 0x051212C7UL, 0x05134209UL, 0x05200247UL, 214 0x05211007UL, 0x05213E60UL, 0x052212C7UL, 0x05224209UL, 0x052319BCUL, 215 0x05233220UL, 0x0523527BUL, 0x052414C8UL, 0x05243820UL, 0x053112F9UL, 216 0x05313E49UL, 0x05321439UL, 0x05323E49UL, 0x0532537BUL, 0x053314C8UL, 217 0x0533480DUL, 0x05337413UL, 0x05341488UL, 0x0534527BUL, 0x0534F4EBUL, 218 0x05353809UL, 0x05356ED0UL, 0x0535F4E5UL, 0x0536427BUL, 0x054119B9UL, 219 0x054212F9UL, 0x05423249UL, 0x05426ED3UL, 0x05431739UL, 0x05433249UL, 220 0x05435ED0UL, 0x0543F4EBUL, 0x05443809UL, 0x05445ED0UL, 0x0544F4E8UL, 221 0x0545324DUL, 0x054FF992UL, 0x055362D3UL, 0x0553F5ABUL, 0x05544350UL, 222 0x055514CAUL, 0x0555427BUL, 0x0555F4E5UL, 0x0556327BUL, 0x055FF4D2UL, 223 0x05665993UL, 0x05774F53UL, 0x059FF728UL, 0x05CC37FDUL, 0x05EFBA28UL, 224 0x05FFFB98UL, 0x061131F9UL, 0x06121407UL, 0x06133E60UL, 0x061A72E4UL, 225 0x06211E47UL, 0x06214E4BUL, 0x062214C7UL, 0x06223E60UL, 0x062312F9UL, 226 0x06233E60UL, 0x063112F9UL, 0x06313E4CUL, 0x063219B9UL, 0x06323E49UL, 227 0x06331439UL, 0x06333809UL, 0x06336EE6UL, 0x0633F5ABUL, 0x06343809UL, 228 0x0634F42BUL, 0x0635427BUL, 0x063FF992UL, 0x064342FBUL, 0x0643F4EBUL, 229 0x0644427BUL, 0x064524C9UL, 0x06655993UL, 0x0666170AUL, 0x066652E6UL, 230 0x067A6F56UL, 0x0698473DUL, 0x06CF67D2UL, 0x06EF3A26UL, 0x06FFFAD8UL, 231 0x071131CCUL, 0x07211307UL, 0x07222E79UL, 0x072292DCUL, 0x07234E4BUL, 232 0x073112F9UL, 0x07322339UL, 0x073632CBUL, 0x073FF992UL, 0x074432CBUL, 233 0x075549A6UL, 0x0776FF68UL, 0x07774350UL, 0x0788473DUL, 0x07CF4516UL, 234 0x07EF3A26UL, 0x07FFFAD8UL, 0x08222E79UL, 0x083112F9UL, 0x0834330BUL, 235 0x0845338BUL, 0x08756F5CUL, 0x0887F725UL, 0x08884366UL, 0x08AF649CUL, 236 0x08F00898UL, 0x08FFFAD8UL, 0x091111C7UL, 0x0932330BUL, 0x0945338BUL, 237 0x09774F7DUL, 0x0998C725UL, 0x09996416UL, 0x09EF87E5UL, 0x09FFFAD8UL, 238 0x0A34330BUL, 0x0A45338BUL, 0x0A77467DUL, 0x0AA9F52BUL, 0x0AAA6416UL, 239 0x0ABD67DFUL, 0x0AFFFA18UL, 0x0B33330BUL, 0x0B4443A6UL, 0x0B76467DUL, 240 0x0BB9751FUL, 0x0BBB59BDUL, 0x0BEF5892UL, 0x0BFFFAD8UL, 0x0C221339UL, 241 0x0C53338EUL, 0x0C76367DUL, 0x0CCAF52EUL, 0x0CCC6996UL, 0x0CFFFA18UL, 242 0x0D44438EUL, 0x0D64264EUL, 0x0DDCF52EUL, 0x0DDD5996UL, 0x0DFFFA18UL, 243 0x0E43338EUL, 0x0E68465CUL, 0x0EEE651CUL, 0x0EFFFA18UL, 0x0F33238EUL, 244 0x0F553659UL, 0x0F8F451CUL, 0x0FAFF8AEUL, 0x0FF00A2EUL, 0x0FFF1ACCUL, 245 0x0FFF33BDUL, 0x0FFF7522UL, 0x0FFFFAD8UL, 0x10002C72UL, 0x1111103EUL, 246 0x11121E83UL, 0x11131E9AUL, 0x1121115AUL, 0x11221170UL, 0x112316F0UL, 247 0x1124175DUL, 0x11311CC2UL, 0x11321182UL, 0x11331D42UL, 0x11411D48UL, 248 0x11421836UL, 0x11431876UL, 0x11441DF5UL, 0x1152287BUL, 0x12111903UL, 249 0x1212115AUL, 0x121316F0UL, 0x12211B30UL, 0x12221B30UL, 0x12231B02UL, 250 0x12311184UL, 0x12321D04UL, 0x12331784UL, 0x12411D39UL, 0x12412020UL, 251 0x12422220UL, 0x12511D89UL, 0x1252227BUL, 0x1258184AUL, 0x12832992UL, 252 0x1311171AUL, 0x13121B30UL, 0x1312202CUL, 0x131320AAUL, 0x132120AAUL, 253 0x132220ADUL, 0x13232FEDUL, 0x13312107UL, 0x13322134UL, 0x13332134UL, 254 0x13411D39UL, 0x13431E74UL, 0x13441834UL, 0x134812B4UL, 0x1352230BUL, 255 0x13611E4BUL, 0x136522E4UL, 0x141113C2UL, 0x141211C4UL, 0x143121F9UL, 256 0x143221F9UL, 0x143321CAUL, 0x14351D34UL, 0x14431E47UL, 0x14441E74UL, 257 0x144612B4UL, 0x1452230EUL, 0x14551E74UL, 0x1471130EUL, 0x151113C2UL, 258 0x152121F9UL, 0x153121F9UL, 0x153221F9UL, 0x15331007UL, 0x15522E4EUL, 259 0x15551E74UL, 0x1571130EUL, 0x161113C7UL, 0x162121F9UL, 0x163121F9UL, 260 0x16611E79UL, 0x16661334UL, 0x171113C7UL, 0x172121F9UL, 0x17451E47UL, 261 0x1771130CUL, 0x181113C7UL, 0x18211E47UL, 0x18511E4CUL, 0x1882130CUL, 262 0x191113C7UL, 0x19331E79UL, 0x1A111307UL, 0x1A311E79UL, 0x1F52230EUL, 263 0x200003C1UL, 0x20001027UL, 0x20004467UL, 0x200079E7UL, 0x2000E5EFUL, 264 0x21100BC0UL, 0x211129C0UL, 0x21114011UL, 0x211189E7UL, 0x2111F5EFUL, 265 0x21124011UL, 0x21127455UL, 0x211325C0UL, 0x21134011UL, 0x21137455UL, 266 0x211425C0UL, 0x21212440UL, 0x21213001UL, 0x2121F9EFUL, 0x21222540UL, 267 0x21226455UL, 0x2122F5EFUL, 0x21233051UL, 0x2123F56FUL, 0x21244451UL, 268 0x21312551UL, 0x21323451UL, 0x21332551UL, 0x21844555UL, 0x221125C0UL, 269 0x22113011UL, 0x2211F9EFUL, 0x22123051UL, 0x2212F9EFUL, 0x221329D1UL, 270 0x22212541UL, 0x22213011UL, 0x2221F9EFUL, 0x22223451UL, 0x2222F9EFUL, 271 0x22232551UL, 0x2223F56FUL, 0x22312551UL, 0x223229D1UL, 0x2232F56FUL, 272 0x22332551UL, 0x2233F56FUL, 0x22875555UL, 0x22DAB5D7UL, 0x23112BD1UL, 273 0x23115467UL, 0x231225D1UL, 0x232129D1UL, 0x232229D1UL, 0x2322F9EFUL, 274 0x23233451UL, 0x2323F9EFUL, 0x23312551UL, 0x233229D1UL, 0x2332F9EFUL, 275 0x2333F56FUL, 0x237FF557UL, 0x238569D5UL, 0x23D955D7UL, 0x24100BE7UL, 276 0x248789E7UL, 0x24E315D7UL, 0x24FFFBEFUL, 0x259869E7UL, 0x25DFF5EFUL, 277 0x25FFFBEFUL, 0x268789E7UL, 0x26DFA5D7UL, 0x26FFFBEFUL, 0x279649E7UL, 278 0x27E425D7UL, 0x27FFFBEFUL, 0x288879E7UL, 0x28EFF5EFUL, 0x28FFFBEFUL, 279 0x298439E7UL, 0x29F115EFUL, 0x29FFFBEFUL, 0x2A7659E7UL, 0x2AEF75D7UL, 280 0x2AFFFBEFUL, 0x2B7C89E7UL, 0x2BEF95D7UL, 0x2BFFFBEFUL, 0x2C6659E7UL, 281 0x2CD555D7UL, 0x2CFFFBEFUL, 0x2D6329E7UL, 0x2DDD55E7UL, 0x2DFFFBEBUL, 282 0x2E8479D7UL, 0x2EEE35E7UL, 0x2EFFFBEFUL, 0x2F5459E7UL, 0x2FCF85D7UL, 283 0x2FFEFBEBUL, 0x2FFFA5EFUL, 0x2FFFEBEFUL, 0x30001AE7UL, 0x30002001UL, 284 0x311129C0UL, 0x31221015UL, 0x31232000UL, 0x31332451UL, 0x32112540UL, 285 0x32131027UL, 0x32212440UL, 0x33452455UL, 0x4000F9D7UL, 0x4122F9D7UL, 286 0x43F65555UL, 0x43FFF5D7UL, 0x44F55567UL, 0x44FFF5D7UL, 0x45F00557UL, 287 0x45FFF5D7UL, 0x46F659D7UL, 0x471005E7UL, 0x47F449E7UL, 0x481005E7UL, 288 0x48EFA9D5UL, 0x48FFF5EFUL, 0x49F449E7UL, 0x49FFF5EFUL, 0x4AEA79E7UL, 289 0x4AFFF5EFUL, 0x4BE9C9D5UL, 0x4BFFF5EFUL, 0x4CE549E7UL, 0x4CFFF5EFUL, 290 0x4DE359E7UL, 0x4DFFF5D7UL, 0x4EE469E7UL, 0x4EFFF5D7UL, 0x4FEF39E7UL, 291 0x4FFFF5EFUL, 0x6000F9E7UL, 0x69FFF557UL, 0x6FFFF9D7UL, 0x811009D7UL, 292 0x8EFFF555UL, 0xFFFFF9E7UL}; 293 294 static const SHORT ari_pk[64][17] = { 295 {708, 706, 579, 569, 568, 567, 479, 469, 297, 138, 97, 91, 72, 52, 38, 34, 296 0}, 297 {7619, 6917, 6519, 6412, 5514, 5003, 4683, 4563, 3907, 3297, 3125, 3060, 298 2904, 2718, 2631, 2590, 0}, 299 {7263, 4888, 4810, 4803, 1889, 415, 335, 327, 195, 72, 52, 49, 36, 20, 15, 300 14, 0}, 301 {3626, 2197, 2188, 2187, 582, 57, 47, 46, 30, 12, 9, 8, 6, 4, 3, 2, 0}, 302 {7806, 5541, 5451, 5441, 2720, 834, 691, 674, 487, 243, 179, 167, 139, 98, 303 77, 70, 0}, 304 {6684, 4101, 4058, 4055, 1748, 426, 368, 364, 322, 257, 235, 232, 228, 222, 305 217, 215, 0}, 306 {9162, 5964, 5831, 5819, 3269, 866, 658, 638, 535, 348, 258, 244, 234, 214, 307 195, 186, 0}, 308 {10638, 8491, 8365, 8351, 4418, 2067, 1859, 1834, 1190, 601, 495, 478, 356, 309 217, 174, 164, 0}, 310 {13389, 10514, 10032, 9961, 7166, 3488, 2655, 2524, 2015, 1140, 760, 672, 311 585, 426, 325, 283, 0}, 312 {14861, 12788, 12115, 11952, 9987, 6657, 5323, 4984, 4324, 3001, 2205, 1943, 313 1764, 1394, 1115, 978, 0}, 314 {12876, 10004, 9661, 9610, 7107, 3435, 2711, 2595, 2257, 1508, 1059, 952, 315 893, 753, 609, 538, 0}, 316 {15125, 13591, 13049, 12874, 11192, 8543, 7406, 7023, 6291, 4922, 4104, 317 3769, 3465, 2890, 2486, 2275, 0}, 318 {14574, 13106, 12731, 12638, 10453, 7947, 7233, 7037, 6031, 4618, 4081, 319 3906, 3465, 2802, 2476, 2349, 0}, 320 {15070, 13179, 12517, 12351, 10742, 7657, 6200, 5825, 5264, 3998, 3014, 321 2662, 2510, 2153, 1799, 1564, 0}, 322 {15542, 14466, 14007, 13844, 12489, 10409, 9481, 9132, 8305, 6940, 6193, 323 5867, 5458, 4743, 4291, 4047, 0}, 324 {15165, 14384, 14084, 13934, 12911, 11485, 10844, 10513, 10002, 8993, 8380, 325 8051, 7711, 7036, 6514, 6233, 0}, 326 {15642, 14279, 13625, 13393, 12348, 9971, 8405, 7858, 7335, 6119, 4918, 327 4376, 4185, 3719, 3231, 2860, 0}, 328 {13408, 13407, 11471, 11218, 11217, 11216, 9473, 9216, 6480, 3689, 2857, 329 2690, 2256, 1732, 1405, 1302, 0}, 330 {16098, 15584, 15191, 14931, 14514, 13578, 12703, 12103, 11830, 11172, 331 10475, 9867, 9695, 9281, 8825, 8389, 0}, 332 {15844, 14873, 14277, 13996, 13230, 11535, 10205, 9543, 9107, 8086, 7085, 333 6419, 6214, 5713, 5195, 4731, 0}, 334 {16131, 15720, 15443, 15276, 14848, 13971, 13314, 12910, 12591, 11874, 335 11225, 10788, 10573, 10077, 9585, 9209, 0}, 336 {16331, 16330, 12283, 11435, 11434, 11433, 8725, 8049, 6065, 4138, 3187, 337 2842, 2529, 2171, 1907, 1745, 0}, 338 {16011, 15292, 14782, 14528, 14008, 12767, 11556, 10921, 10591, 9759, 8813, 339 8043, 7855, 7383, 6863, 6282, 0}, 340 {16380, 16379, 15159, 14610, 14609, 14608, 12859, 12111, 11046, 9536, 8348, 341 7713, 7216, 6533, 5964, 5546, 0}, 342 {16367, 16333, 16294, 16253, 16222, 16143, 16048, 15947, 15915, 15832, 343 15731, 15619, 15589, 15512, 15416, 15310, 0}, 344 {15967, 15319, 14937, 14753, 14010, 12638, 11787, 11360, 10805, 9706, 8934, 345 8515, 8166, 7456, 6911, 6575, 0}, 346 {4906, 3005, 2985, 2984, 875, 102, 83, 81, 47, 17, 12, 11, 8, 5, 4, 3, 0}, 347 {7217, 4346, 4269, 4264, 1924, 428, 340, 332, 280, 203, 179, 175, 171, 164, 348 159, 157, 0}, 349 {16010, 15415, 15032, 14805, 14228, 13043, 12168, 11634, 11265, 10419, 9645, 350 9110, 8892, 8378, 7850, 7437, 0}, 351 {8573, 5218, 5046, 5032, 2787, 771, 555, 533, 443, 286, 218, 205, 197, 181, 352 168, 162, 0}, 353 {11474, 8095, 7822, 7796, 4632, 1443, 1046, 1004, 748, 351, 218, 194, 167, 354 121, 93, 83, 0}, 355 {16152, 15764, 15463, 15264, 14925, 14189, 13536, 13070, 12846, 12314, 356 11763, 11277, 11131, 10777, 10383, 10011, 0}, 357 {14187, 11654, 11043, 10919, 8498, 4885, 3778, 3552, 2947, 1835, 1283, 1134, 358 998, 749, 585, 514, 0}, 359 {14162, 11527, 10759, 10557, 8601, 5417, 4105, 3753, 3286, 2353, 1708, 1473, 360 1370, 1148, 959, 840, 0}, 361 {16205, 15902, 15669, 15498, 15213, 14601, 14068, 13674, 13463, 12970, 362 12471, 12061, 11916, 11564, 11183, 10841, 0}, 363 {15043, 12972, 12092, 11792, 10265, 7446, 5934, 5379, 4883, 3825, 3036, 364 2647, 2507, 2185, 1901, 1699, 0}, 365 {15320, 13694, 12782, 12352, 11191, 8936, 7433, 6671, 6255, 5366, 4622, 366 4158, 4020, 3712, 3420, 3198, 0}, 367 {16255, 16020, 15768, 15600, 15416, 14963, 14440, 14006, 13875, 13534, 368 13137, 12697, 12602, 12364, 12084, 11781, 0}, 369 {15627, 14503, 13906, 13622, 12557, 10527, 9269, 8661, 8117, 6933, 5994, 370 5474, 5222, 4664, 4166, 3841, 0}, 371 {16366, 16365, 14547, 14160, 14159, 14158, 11969, 11473, 8735, 6147, 4911, 372 4530, 3865, 3180, 2710, 2473, 0}, 373 {16257, 16038, 15871, 15754, 15536, 15071, 14673, 14390, 14230, 13842, 374 13452, 13136, 13021, 12745, 12434, 12154, 0}, 375 {15855, 14971, 14338, 13939, 13239, 11782, 10585, 9805, 9444, 8623, 7846, 376 7254, 7079, 6673, 6262, 5923, 0}, 377 {9492, 6318, 6197, 6189, 3004, 652, 489, 477, 333, 143, 96, 90, 78, 60, 50, 378 47, 0}, 379 {16313, 16191, 16063, 15968, 15851, 15590, 15303, 15082, 14968, 14704, 380 14427, 14177, 14095, 13899, 13674, 13457, 0}, 381 {8485, 5473, 5389, 5383, 2411, 494, 386, 377, 278, 150, 117, 112, 103, 89, 382 81, 78, 0}, 383 {10497, 7154, 6959, 6943, 3788, 1004, 734, 709, 517, 238, 152, 138, 120, 90, 384 72, 66, 0}, 385 {16317, 16226, 16127, 16040, 15955, 15762, 15547, 15345, 15277, 15111, 386 14922, 14723, 14671, 14546, 14396, 14239, 0}, 387 {16382, 16381, 15858, 15540, 15539, 15538, 14704, 14168, 13768, 13092, 388 12452, 11925, 11683, 11268, 10841, 10460, 0}, 389 {5974, 3798, 3758, 3755, 1275, 205, 166, 162, 95, 35, 26, 24, 18, 11, 8, 7, 390 0}, 391 {3532, 2258, 2246, 2244, 731, 135, 118, 115, 87, 45, 36, 34, 29, 21, 17, 16, 392 0}, 393 {7466, 4882, 4821, 4811, 2476, 886, 788, 771, 688, 531, 469, 457, 437, 400, 394 369, 361, 0}, 395 {9580, 5772, 5291, 5216, 3444, 1496, 1025, 928, 806, 578, 433, 384, 366, 396 331, 296, 273, 0}, 397 {10692, 7730, 7543, 7521, 4679, 1746, 1391, 1346, 1128, 692, 495, 458, 424, 398 353, 291, 268, 0}, 399 {11040, 7132, 6549, 6452, 4377, 1875, 1253, 1130, 958, 631, 431, 370, 346, 400 296, 253, 227, 0}, 401 {12687, 9332, 8701, 8585, 6266, 3093, 2182, 2004, 1683, 1072, 712, 608, 559, 402 458, 373, 323, 0}, 403 {13429, 9853, 8860, 8584, 6806, 4039, 2862, 2478, 2239, 1764, 1409, 1224, 404 1178, 1077, 979, 903, 0}, 405 {14685, 12163, 11061, 10668, 9101, 6345, 4871, 4263, 3908, 3200, 2668, 2368, 406 2285, 2106, 1942, 1819, 0}, 407 {13295, 11302, 10999, 10945, 7947, 5036, 4490, 4385, 3391, 2185, 1836, 1757, 408 1424, 998, 833, 785, 0}, 409 {4992, 2993, 2972, 2970, 1269, 575, 552, 549, 530, 505, 497, 495, 493, 489, 410 486, 485, 0}, 411 {15419, 13862, 13104, 12819, 11429, 8753, 7220, 6651, 6020, 4667, 3663, 412 3220, 2995, 2511, 2107, 1871, 0}, 413 {12468, 9263, 8912, 8873, 5758, 2193, 1625, 1556, 1187, 589, 371, 330, 283, 414 200, 149, 131, 0}, 415 {15870, 15076, 14615, 14369, 13586, 12034, 10990, 10423, 9953, 8908, 8031, 416 7488, 7233, 6648, 6101, 5712, 0}, 417 {1693, 978, 976, 975, 194, 18, 16, 15, 11, 7, 6, 5, 4, 3, 2, 1, 0}, 418 {7992, 5218, 5147, 5143, 2152, 366, 282, 276, 173, 59, 38, 35, 27, 16, 11, 419 10, 0}}; 420 421 typedef struct { 422 int low; 423 int high; 424 int vobf; 425 } Tastat; 426 427 static inline INT mul_sbc_14bits(INT r, INT c) { 428 return (((INT)r) * ((INT)c)) >> stat_bitsnew; 429 } 430 431 static inline INT ari_decode_14bits(HANDLE_FDK_BITSTREAM hBs, Tastat *s, 432 const SHORT *RESTRICT c_freq, int cfl) { 433 INT symbol; 434 INT low, high, range, value; 435 INT c; 436 const SHORT *p; 437 438 low = s->low; 439 high = s->high; 440 value = s->vobf; 441 442 range = high - low + 1; 443 c = (((int)(value - low + 1)) << stat_bitsnew) - ((int)1); 444 p = (const SHORT *)(c_freq - 1); 445 446 if (cfl == (VAL_ESC + 1)) { 447 /* In 50% of all cases, the first entry is the right one, so we check it 448 * prior to all others */ 449 if ((p[1] * range) > c) { 450 p += 1; 451 if ((p[8] * range) > c) { 452 p += 8; 453 } 454 if ((p[4] * range) > c) { 455 p += 4; 456 } 457 if ((p[2] * range) > c) { 458 p += 2; 459 } 460 if ((p[1] * range) > c) { 461 p += 1; 462 } 463 } 464 } else if (cfl == 4) { 465 if ((p[2] * range) > c) { 466 p += 2; 467 } 468 if ((p[1] * range) > c) { 469 p += 1; 470 } 471 } else if (cfl == 2) { 472 if ((p[1] * range) > c) { 473 p += 1; 474 } 475 } else if (cfl == 27) { 476 const SHORT *p_24 = p + 24; 477 478 if ((p[16] * range) > c) { 479 p += 16; 480 } 481 if ((p[8] * range) > c) { 482 p += 8; 483 } 484 if (p != p_24) { 485 if ((p[4] * range) > c) { 486 p += 4; 487 } 488 } 489 if ((p[2] * range) > c) { 490 p += 2; 491 } 492 493 if (p != &p_24[2]) { 494 if ((p[1] * range) > c) { 495 p += 1; 496 } 497 } 498 } 499 500 symbol = (INT)(p - (const SHORT *)(c_freq - 1)); 501 502 if (symbol) { 503 high = low + mul_sbc_14bits(range, c_freq[symbol - 1]) - 1; 504 } 505 506 low += mul_sbc_14bits(range, c_freq[symbol]); 507 508 USHORT us_high = (USHORT)high; 509 USHORT us_low = (USHORT)low; 510 while (1) { 511 if (us_high & 0x8000) { 512 if (!(us_low & 0x8000)) { 513 if (us_low & 0x4000 && !(us_high & 0x4000)) { 514 us_low -= 0x4000; 515 us_high -= 0x4000; 516 value -= 0x4000; 517 } else 518 break; 519 } 520 } 521 us_low = us_low << 1; 522 us_high = (us_high << 1) | 1; 523 value = (value << 1) | FDKreadBit(hBs); 524 } 525 s->low = (int)us_low; 526 s->high = (int)us_high; 527 s->vobf = value & 0xFFFF; 528 529 return symbol; 530 } 531 532 static inline void copyTableAmrwbArith2(UCHAR tab[], int sizeIn, int sizeOut) { 533 int i; 534 int j; 535 int k = 2; 536 537 tab += 2; 538 539 if (sizeIn < sizeOut) { 540 tab[sizeOut + 0] = tab[sizeIn + 0]; 541 tab[sizeOut + 1] = tab[sizeIn + 1]; 542 if (sizeIn < (sizeOut >> 2)) { 543 k = 8; 544 } else if (sizeIn == (sizeOut >> 2)) { 545 k = 4; 546 } 547 548 i = sizeOut - 1; 549 j = sizeIn - 1; 550 551 for (; i >= 0; j--) { 552 UCHAR tq_data0 = tab[j]; 553 554 for (int l = (k >> 1); l > 0; l--) { 555 tab[i--] = tq_data0; 556 tab[i--] = tq_data0; 557 } 558 } 559 } else { 560 if (sizeOut < (sizeIn >> 2)) { 561 k = 8; 562 } else if (sizeOut == (sizeIn >> 2)) { 563 k = 4; 564 } 565 566 for (i = 0, j = 0; i < sizeOut; j += k) { 567 UCHAR tq_data0 = tab[j]; 568 569 tab[i++] = tq_data0; 570 } 571 tab[sizeOut + 0] = tab[sizeIn + 0]; 572 tab[sizeOut + 1] = tab[sizeIn + 1]; 573 } 574 } 575 576 static inline ULONG get_pk_v2(ULONG s) { 577 const ULONG *p = ari_merged_hash_ps; 578 ULONG s12 = (fMax((UINT)s, (UINT)1) << 12) - 1; 579 if (s12 > p[485]) { 580 p += 486; /* 742 - 256 = 486 */ 581 } else { 582 if (s12 > p[255]) p += 256; 583 } 584 585 if (s12 > p[127]) { 586 p += 128; 587 } 588 if (s12 > p[63]) { 589 p += 64; 590 } 591 if (s12 > p[31]) { 592 p += 32; 593 } 594 if (s12 > p[15]) { 595 p += 16; 596 } 597 if (s12 > p[7]) { 598 p += 8; 599 } 600 if (s12 > p[3]) { 601 p += 4; 602 } 603 if (s12 > p[1]) { 604 p += 2; 605 } 606 ULONG j = p[0]; 607 if (s12 > j) j = p[1]; 608 if (s != (j >> 12)) j >>= 6; 609 return (j & 0x3F); 610 } 611 612 static ARITH_CODING_ERROR decode2(HANDLE_FDK_BITSTREAM bbuf, 613 UCHAR *RESTRICT c_prev, 614 FIXP_DBL *RESTRICT pSpectralCoefficient, 615 INT n, INT nt) { 616 Tastat as; 617 int i, l, r; 618 INT lev, esc_nb, pki; 619 USHORT state_inc; 620 UINT s; 621 ARITH_CODING_ERROR ErrorStatus = ARITH_CODER_OK; 622 623 int c_3 = 0; /* context of current frame 3 time steps ago */ 624 int c_2 = 0; /* context of current frame 2 time steps ago */ 625 int c_1 = 0; /* context of current frame 1 time steps ago */ 626 int c_0 = 1; /* context of current frame to be calculated */ 627 628 /* ari_start_decoding_14bits */ 629 as.low = 0; 630 as.high = ari_q4new; 631 as.vobf = FDKreadBits(bbuf, cbitsnew); 632 633 /* arith_map_context */ 634 state_inc = c_prev[0] << 12; 635 636 for (i = 0; i < n; i++) { 637 /* arith_get_context */ 638 s = state_inc >> 8; 639 s = s + (c_prev[i + 1] << 8); 640 s = (s << 4) + c_1; 641 642 state_inc = s; 643 644 if (i > 3) { 645 /* Cumulative amplitude below 2 */ 646 if ((c_1 + c_2 + c_3) < 5) { 647 s += 0x10000; 648 } 649 } 650 651 /* MSBs decoding */ 652 for (lev = esc_nb = 0;;) { 653 pki = get_pk_v2(s + (esc_nb << (VAL_ESC + 1))); 654 r = ari_decode_14bits(bbuf, &as, ari_pk[pki], VAL_ESC + 1); 655 if (r < VAL_ESC) { 656 break; 657 } 658 659 lev++; 660 661 if (lev > 23) return ARITH_CODER_ERROR; 662 663 if (esc_nb < 7) { 664 esc_nb++; 665 } 666 } 667 668 /* Stop symbol */ 669 if (r == 0) { 670 if (esc_nb > 0) { 671 break; /* Stop symbol */ 672 } 673 c_0 = 1; 674 } else /* if (r==0) */ 675 { 676 INT b = r >> 2; 677 INT a = r & 0x3; 678 679 /* LSBs decoding */ 680 for (l = 0; l < lev; l++) { 681 { 682 int pidx = (a == 0) ? 1 : ((b == 0) ? 0 : 2); 683 r = ari_decode_14bits(bbuf, &as, ari_lsb2[pidx], 4); 684 } 685 a = (a << 1) | (r & 1); 686 b = (b << 1) | (r >> 1); 687 } 688 689 pSpectralCoefficient[2 * i] = (FIXP_DBL)a; 690 pSpectralCoefficient[2 * i + 1] = (FIXP_DBL)b; 691 692 c_0 = a + b + 1; 693 if (c_0 > 0xF) { 694 c_0 = 0xF; 695 } 696 697 } /* endif (r==0) */ 698 699 /* arith_update_context */ 700 c_3 = c_2; 701 c_2 = c_1; 702 c_1 = c_0; 703 c_prev[i] = (UCHAR)c_0; 704 705 } /* for (i=0; i<n; i++) */ 706 707 FDKpushBack(bbuf, cbitsnew - 2); 708 709 /* We need to run only from 0 to i-1 since all other q[i][1].a,b will be 710 * cleared later */ 711 int j = i; 712 for (i = 0; i < j; i++) { 713 int bits = 0; 714 if (pSpectralCoefficient[2 * i] != (FIXP_DBL)0) bits++; 715 if (pSpectralCoefficient[2 * i + 1] != (FIXP_DBL)0) bits++; 716 717 if (bits) { 718 r = FDKreadBits(bbuf, bits); 719 if (pSpectralCoefficient[2 * i] != (FIXP_DBL)0 && !(r >> (bits - 1))) { 720 pSpectralCoefficient[2 * i] = -pSpectralCoefficient[2 * i]; 721 } 722 if (pSpectralCoefficient[2 * i + 1] != (FIXP_DBL)0 && !(r & 1)) { 723 pSpectralCoefficient[2 * i + 1] = -pSpectralCoefficient[2 * i + 1]; 724 } 725 } 726 } 727 728 FDKmemset(&c_prev[i], 1, sizeof(c_prev[0]) * (nt - i)); 729 730 return ErrorStatus; 731 } 732 733 CArcoData *CArco_Create(void) { return GetArcoData(); } 734 735 void CArco_Destroy(CArcoData *pArcoData) { FreeArcoData(&pArcoData); } 736 737 ARITH_CODING_ERROR CArco_DecodeArithData(CArcoData *pArcoData, 738 HANDLE_FDK_BITSTREAM hBs, 739 FIXP_DBL *RESTRICT mdctSpectrum, 740 int lg, int lg_max, 741 int arith_reset_flag) { 742 ARITH_CODING_ERROR ErrorStatus = ARITH_CODER_OK; 743 744 /* Check lg and lg_max consistency. */ 745 if (lg_max < lg) { 746 return ARITH_CODER_ERROR; 747 } 748 749 FDKmemclear(mdctSpectrum, lg_max * sizeof(FIXP_DBL)); 750 751 /* arith_map_context */ 752 if (arith_reset_flag) { 753 FDKmemclear(pArcoData->c_prev, 754 sizeof(pArcoData->c_prev[0]) * ((lg_max / 2) + 4)); 755 } else { 756 if (lg_max != pArcoData->m_numberLinesPrev) { 757 if (pArcoData->m_numberLinesPrev == 0) { 758 /* Cannot decode without a valid AC context */ 759 return ARITH_CODER_ERROR; 760 } 761 762 /* short-to-long or long-to-short block transition */ 763 /* Current length differs compared to previous - perform up/downmix of 764 * m_qbuf */ 765 copyTableAmrwbArith2(pArcoData->c_prev, pArcoData->m_numberLinesPrev >> 1, 766 lg_max >> 1); 767 } 768 } 769 770 pArcoData->m_numberLinesPrev = lg_max; 771 772 if (lg > 0) { 773 ErrorStatus = 774 decode2(hBs, pArcoData->c_prev + 2, mdctSpectrum, lg >> 1, lg_max >> 1); 775 } else { 776 FDKmemset(&pArcoData->c_prev[2], 1, 777 sizeof(pArcoData->c_prev[2]) * (lg_max >> 1)); 778 } 779 780 if ((INT)FDKgetValidBits(hBs) < 0) { 781 return ARITH_CODER_ERROR; 782 } 783 784 return ErrorStatus; 785 } 786