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