16cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK/* ----------------------------------------------------------------------------- 26cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKSoftware License for The Fraunhofer FDK AAC Codec Library for Android 36cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 46cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten 56cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKForschung e.V. All rights reserved. 66cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 76cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 1. INTRODUCTION 86cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKThe Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software 96cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKthat implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding 106cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKscheme for digital audio. This FDK AAC Codec software is intended to be used on 116cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKa wide variety of Android devices. 126cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 136cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKAAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient 146cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKgeneral perceptual audio codecs. AAC-ELD is considered the best-performing 156cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKfull-bandwidth communications codec by independent studies and is widely 166cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKdeployed. AAC has been standardized by ISO and IEC as part of the MPEG 176cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKspecifications. 186cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 196cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKPatent licenses for necessary patent claims for the FDK AAC Codec (including 206cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKthose of Fraunhofer) may be obtained through Via Licensing 216cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK(www.vialicensing.com) or through the respective patent owners individually for 226cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKthe purpose of encoding or decoding bit streams in products that are compliant 236cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKwith the ISO/IEC MPEG audio standards. Please note that most manufacturers of 246cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKAndroid devices already license these patent claims through Via Licensing or 256cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKdirectly from the patent owners, and therefore FDK AAC Codec software may 266cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKalready be covered under those patent licenses when it is used for those 276cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKlicensed purposes only. 286cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 296cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKCommercially-licensed AAC software libraries, including floating-point versions 306cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKwith enhanced sound quality, are also available from Fraunhofer. Users are 316cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKencouraged to check the Fraunhofer website for additional applications 326cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKinformation and documentation. 336cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 346cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK2. COPYRIGHT LICENSE 356cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 366cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKRedistribution and use in source and binary forms, with or without modification, 376cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKare permitted without payment of copyright license fees provided that you 386cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKsatisfy the following conditions: 396cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 406cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKYou must retain the complete text of this software license in redistributions of 416cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKthe FDK AAC Codec or your modifications thereto in source code form. 426cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 436cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKYou must retain the complete text of this software license in the documentation 446cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKand/or other materials provided with redistributions of the FDK AAC Codec or 456cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKyour modifications thereto in binary form. You must make available free of 466cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKcharge copies of the complete source code of the FDK AAC Codec and your 476cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKmodifications thereto to recipients of copies in binary form. 486cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 496cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKThe name of Fraunhofer may not be used to endorse or promote products derived 506cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKfrom this library without prior written permission. 516cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 526cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKYou may not charge copyright license fees for anyone to use, copy or distribute 536cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKthe FDK AAC Codec software or your modifications thereto. 546cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 556cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKYour modified versions of the FDK AAC Codec must carry prominent notices stating 566cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKthat you changed the software and the date of any change. For modified versions 576cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKof the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" 586cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKmust be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK 596cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKAAC Codec Library for Android." 606cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 616cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK3. NO PATENT LICENSE 626cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 636cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKNO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without 646cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKlimitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. 656cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKFraunhofer provides no warranty of patent non-infringement with respect to this 666cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKsoftware. 676cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 686cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKYou may use this FDK AAC Codec software or modifications thereto only for 696cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKpurposes that are authorized by appropriate patent licenses. 706cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 716cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK4. DISCLAIMER 726cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 736cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKThis FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright 746cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKholders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, 756cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKincluding but not limited to the implied warranties of merchantability and 766cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKfitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 776cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKCONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, 786cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKor consequential damages, including but not limited to procurement of substitute 796cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKgoods or services; loss of use, data, or profits, or business interruption, 806cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKhowever caused and on any theory of liability, whether in contract, strict 816cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKliability, or tort (including negligence), arising in any way out of the use of 826cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKthis software, even if advised of the possibility of such damage. 836cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 846cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK5. CONTACT INFORMATION 856cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 866cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKFraunhofer Institute for Integrated Circuits IIS 876cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKAttention: Audio and Multimedia Departments - FDK AAC LL 886cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKAm Wolfsmantel 33 896cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK91058 Erlangen, Germany 906cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 916cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKwww.iis.fraunhofer.de/amm 926cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKamm-info@iis.fraunhofer.de 936cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK----------------------------------------------------------------------------- */ 946cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 956cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK/**************************** AAC decoder library ****************************** 966cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 976cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK Author(s): 986cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 996cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK Description: ACELP 1006cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 1016cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK*******************************************************************************/ 1026cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 1036cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK#include "usacdec_ace_d4t64.h" 1046cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 1056cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK#define L_SUBFR 64 /* Subframe size */ 1066cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 1076cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK/* 1086cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * D_ACELP_add_pulse 1096cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * 1106cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * Parameters: 1116cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * pos I: position of pulse 1126cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * nb_pulse I: number of pulses 1136cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * track I: track 1146cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * code O: fixed codebook 1156cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * 1166cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * Function: 1176cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * Add pulses to fixed codebook 1186cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * 1196cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * Returns: 1206cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * void 1216cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK */ 1226cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKstatic void D_ACELP_add_pulse(SHORT pos[], SHORT nb_pulse, SHORT track, 1236cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK FIXP_COD code[]) { 1246cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK SHORT i, k; 1256cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK for (k = 0; k < nb_pulse; k++) { 1266cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK /* i = ((pos[k] & (16-1))*NB_TRACK) + track; */ 1276cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK i = ((pos[k] & (16 - 1)) << 2) + track; 1286cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK if ((pos[k] & 16) == 0) { 1296cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK code[i] = code[i] + (FIXP_COD)(512 << (COD_BITS - FRACT_BITS)); 1306cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } else { 1316cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK code[i] = code[i] - (FIXP_COD)(512 << (COD_BITS - FRACT_BITS)); 1326cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } 1336cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } 1346cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK return; 1356cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK} 1366cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK/* 1376cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * D_ACELP_decode_1p_N1 1386cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * 1396cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * Parameters: 1406cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * index I: pulse index 1416cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * N I: number of bits for position 1426cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * offset I: offset 1436cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * pos O: position of the pulse 1446cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * 1456cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * Function: 1466cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * Decode 1 pulse with N+1 bits 1476cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * 1486cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * Returns: 1496cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * void 1506cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK */ 1516cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKstatic void D_ACELP_decode_1p_N1(LONG index, SHORT N, SHORT offset, 1526cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK SHORT pos[]) { 1536cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK SHORT pos1; 1546cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK LONG i, mask; 1556cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 1566cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK mask = ((1 << N) - 1); 1576cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK /* 1586cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * Decode 1 pulse with N+1 bits 1596cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK */ 1606cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK pos1 = (SHORT)((index & mask) + offset); 1616cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK i = ((index >> N) & 1); 1626cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK if (i == 1) { 1636cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK pos1 += 16; 1646cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } 1656cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK pos[0] = pos1; 1666cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK return; 1676cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK} 1686cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK/* 1696cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * D_ACELP_decode_2p_2N1 1706cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * 1716cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * Parameters: 1726cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * index I: pulse index 1736cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * N I: number of bits for position 1746cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * offset I: offset 1756cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * pos O: position of the pulse 1766cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * 1776cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * Function: 1786cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * Decode 2 pulses with 2*N+1 bits 1796cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * 1806cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * Returns: 1816cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * void 1826cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK */ 1836cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKstatic void D_ACELP_decode_2p_2N1(LONG index, SHORT N, SHORT offset, 1846cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK SHORT pos[]) { 1856cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK SHORT pos1, pos2; 1866cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK LONG mask, i; 1876cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK mask = ((1 << N) - 1); 1886cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK /* 1896cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * Decode 2 pulses with 2*N+1 bits 1906cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK */ 1916cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK pos1 = (SHORT)(((index >> N) & mask) + offset); 1926cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK i = (index >> (2 * N)) & 1; 1936cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK pos2 = (SHORT)((index & mask) + offset); 1946cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK if ((pos2 - pos1) < 0) { 1956cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK if (i == 1) { 1966cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK pos1 += 16; 1976cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } else { 1986cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK pos2 += 16; 1996cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } 2006cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } else { 2016cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK if (i == 1) { 2026cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK pos1 += 16; 2036cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK pos2 += 16; 2046cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } 2056cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } 2066cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK pos[0] = pos1; 2076cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK pos[1] = pos2; 2086cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK return; 2096cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK} 2106cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK/* 2116cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * D_ACELP_decode_3p_3N1 2126cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * 2136cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * Parameters: 2146cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * index I: pulse index 2156cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * N I: number of bits for position 2166cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * offset I: offset 2176cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * pos O: position of the pulse 2186cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * 2196cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * Function: 2206cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * Decode 3 pulses with 3*N+1 bits 2216cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * 2226cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * Returns: 2236cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * void 2246cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK */ 2256cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKstatic void D_ACELP_decode_3p_3N1(LONG index, SHORT N, SHORT offset, 2266cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK SHORT pos[]) { 2276cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK SHORT j; 2286cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK LONG mask, idx; 2296cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 2306cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK /* 2316cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * Decode 3 pulses with 3*N+1 bits 2326cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK */ 2336cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK mask = ((1 << ((2 * N) - 1)) - 1); 2346cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK idx = index & mask; 2356cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK j = offset; 2366cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK if (((index >> ((2 * N) - 1)) & 1) == 1) { 2376cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK j += (1 << (N - 1)); 2386cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } 2396cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK D_ACELP_decode_2p_2N1(idx, N - 1, j, pos); 2406cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK mask = ((1 << (N + 1)) - 1); 2416cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK idx = (index >> (2 * N)) & mask; 2426cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK D_ACELP_decode_1p_N1(idx, N, offset, pos + 2); 2436cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK return; 2446cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK} 2456cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK/* 2466cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * D_ACELP_decode_4p_4N1 2476cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * 2486cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * Parameters: 2496cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * index I: pulse index 2506cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * N I: number of bits for position 2516cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * offset I: offset 2526cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * pos O: position of the pulse 2536cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * 2546cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * Function: 2556cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * Decode 4 pulses with 4*N+1 bits 2566cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * 2576cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * Returns: 2586cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * void 2596cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK */ 2606cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKstatic void D_ACELP_decode_4p_4N1(LONG index, SHORT N, SHORT offset, 2616cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK SHORT pos[]) { 2626cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK SHORT j; 2636cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK LONG mask, idx; 2646cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK /* 2656cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * Decode 4 pulses with 4*N+1 bits 2666cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK */ 2676cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK mask = ((1 << ((2 * N) - 1)) - 1); 2686cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK idx = index & mask; 2696cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK j = offset; 2706cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK if (((index >> ((2 * N) - 1)) & 1) == 1) { 2716cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK j += (1 << (N - 1)); 2726cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } 2736cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK D_ACELP_decode_2p_2N1(idx, N - 1, j, pos); 2746cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK mask = ((1 << ((2 * N) + 1)) - 1); 2756cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK idx = (index >> (2 * N)) & mask; 2766cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK D_ACELP_decode_2p_2N1(idx, N, offset, pos + 2); 2776cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK return; 2786cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK} 2796cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK/* 2806cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * D_ACELP_decode_4p_4N 2816cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * 2826cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * Parameters: 2836cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * index I: pulse index 2846cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * N I: number of bits for position 2856cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * offset I: offset 2866cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * pos O: position of the pulse 2876cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * 2886cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * Function: 2896cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * Decode 4 pulses with 4*N bits 2906cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * 2916cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * Returns: 2926cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * void 2936cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK */ 2946cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKstatic void D_ACELP_decode_4p_4N(LONG index, SHORT N, SHORT offset, 2956cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK SHORT pos[]) { 2966cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK SHORT j, n_1; 2976cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK /* 2986cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * Decode 4 pulses with 4*N bits 2996cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK */ 3006cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK n_1 = N - 1; 3016cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK j = offset + (1 << n_1); 3026cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK switch ((index >> ((4 * N) - 2)) & 3) { 3036cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK case 0: 3046cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK if (((index >> ((4 * n_1) + 1)) & 1) == 0) { 3056cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK D_ACELP_decode_4p_4N1(index, n_1, offset, pos); 3066cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } else { 3076cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK D_ACELP_decode_4p_4N1(index, n_1, j, pos); 3086cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } 3096cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK break; 3106cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK case 1: 3116cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK D_ACELP_decode_1p_N1((index >> ((3 * n_1) + 1)), n_1, offset, pos); 3126cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK D_ACELP_decode_3p_3N1(index, n_1, j, pos + 1); 3136cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK break; 3146cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK case 2: 3156cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK D_ACELP_decode_2p_2N1((index >> ((2 * n_1) + 1)), n_1, offset, pos); 3166cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK D_ACELP_decode_2p_2N1(index, n_1, j, pos + 2); 3176cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK break; 3186cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK case 3: 3196cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK D_ACELP_decode_3p_3N1((index >> (n_1 + 1)), n_1, offset, pos); 3206cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK D_ACELP_decode_1p_N1(index, n_1, j, pos + 3); 3216cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK break; 3226cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } 3236cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK return; 3246cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK} 3256cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 3266cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK/* 3276cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * D_ACELP_decode_4t 3286cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * 3296cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * Parameters: 3306cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * index I: index 3316cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * mode I: speech mode 3326cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * code I: (Q9) algebraic (fixed) codebook excitation 3336cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * 3346cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * Function: 3356cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * 20, 36, 44, 52, 64, 72, 88 bits algebraic codebook. 3366cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * 4 tracks x 16 positions per track = 64 samples. 3376cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * 3386cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * 20 bits 5+5+5+5 --> 4 pulses in a frame of 64 samples. 3396cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * 36 bits 9+9+9+9 --> 8 pulses in a frame of 64 samples. 3406cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * 44 bits 13+9+13+9 --> 10 pulses in a frame of 64 samples. 3416cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * 52 bits 13+13+13+13 --> 12 pulses in a frame of 64 samples. 3426cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * 64 bits 2+2+2+2+14+14+14+14 --> 16 pulses in a frame of 64 samples. 3436cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * 72 bits 10+2+10+2+10+14+10+14 --> 18 pulses in a frame of 64 samples. 3446cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * 88 bits 11+11+11+11+11+11+11+11 --> 24 pulses in a frame of 64 samples. 3456cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * 3466cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * All pulses can have two (2) possible amplitudes: +1 or -1. 3476cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * Each pulse can sixteen (16) possible positions. 3486cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * 3496cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * codevector length 64 3506cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * number of track 4 3516cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * number of position 16 3526cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * 3536cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * Returns: 3546cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * void 3556cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK */ 3566cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKvoid D_ACELP_decode_4t64(SHORT index[], int nbits, FIXP_COD code[]) { 3576cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK LONG L_index; 3586cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK SHORT k, pos[6]; 3596cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 3606cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK FDKmemclear(code, L_SUBFR * sizeof(FIXP_COD)); 3616cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 3626cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK /* decode the positions and signs of pulses and build the codeword */ 3636cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK switch (nbits) { 3646cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK case 12: 3656cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK for (k = 0; k < 4; k += 2) { 3666cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK L_index = index[2 * (k / 2) + 1]; 3676cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK D_ACELP_decode_1p_N1(L_index, 4, 0, pos); 3686cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK D_ACELP_add_pulse(pos, 1, 2 * (index[2 * (k / 2)]) + k / 2, code); 3696cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } 3706cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK break; 3716cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK case 16: { 3726cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK int i = 0; 3736cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK int offset = index[i++]; 3746cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK offset = (offset == 0) ? 1 : 3; 3756cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK for (k = 0; k < 4; k++) { 3766cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK if (k != offset) { 3776cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK L_index = index[i++]; 3786cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK D_ACELP_decode_1p_N1(L_index, 4, 0, pos); 3796cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK D_ACELP_add_pulse(pos, 1, k, code); 3806cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } 3816cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } 3826cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } break; 3836cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK case 20: 3846cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK for (k = 0; k < 4; k++) { 3856cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK L_index = (LONG)index[k]; 3866cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK D_ACELP_decode_1p_N1(L_index, 4, 0, pos); 3876cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK D_ACELP_add_pulse(pos, 1, k, code); 3886cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } 3896cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK break; 3906cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK case 28: 3916cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK for (k = 0; k < 4 - 2; k++) { 3926cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK L_index = (LONG)index[k]; 3936cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK D_ACELP_decode_2p_2N1(L_index, 4, 0, pos); 3946cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK D_ACELP_add_pulse(pos, 2, k, code); 3956cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } 3966cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK for (k = 2; k < 4; k++) { 3976cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK L_index = (LONG)index[k]; 3986cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK D_ACELP_decode_1p_N1(L_index, 4, 0, pos); 3996cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK D_ACELP_add_pulse(pos, 1, k, code); 4006cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } 4016cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK break; 4026cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK case 36: 4036cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK for (k = 0; k < 4; k++) { 4046cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK L_index = (LONG)index[k]; 4056cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK D_ACELP_decode_2p_2N1(L_index, 4, 0, pos); 4066cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK D_ACELP_add_pulse(pos, 2, k, code); 4076cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } 4086cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK break; 4096cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK case 44: 4106cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK for (k = 0; k < 4 - 2; k++) { 4116cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK L_index = (LONG)index[k]; 4126cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK D_ACELP_decode_3p_3N1(L_index, 4, 0, pos); 4136cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK D_ACELP_add_pulse(pos, 3, k, code); 4146cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } 4156cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK for (k = 2; k < 4; k++) { 4166cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK L_index = (LONG)index[k]; 4176cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK D_ACELP_decode_2p_2N1(L_index, 4, 0, pos); 4186cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK D_ACELP_add_pulse(pos, 2, k, code); 4196cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } 4206cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK break; 4216cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK case 52: 4226cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK for (k = 0; k < 4; k++) { 4236cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK L_index = (LONG)index[k]; 4246cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK D_ACELP_decode_3p_3N1(L_index, 4, 0, pos); 4256cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK D_ACELP_add_pulse(pos, 3, k, code); 4266cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } 4276cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK break; 4286cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK case 64: 4296cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK for (k = 0; k < 4; k++) { 4306cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK L_index = (((LONG)index[k] << 14) + (LONG)index[k + 4]); 4316cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK D_ACELP_decode_4p_4N(L_index, 4, 0, pos); 4326cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK D_ACELP_add_pulse(pos, 4, k, code); 4336cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } 4346cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK break; 4356cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK default: 4366cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK FDK_ASSERT(0); 4376cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } 4386cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK return; 4396cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK} 440