16cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK/* -----------------------------------------------------------------------------
22228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectSoftware License for The Fraunhofer FDK AAC Codec Library for Android
32228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
46cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK© Copyright  1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
56cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKForschung e.V. All rights reserved.
62228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
72228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 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.
332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project2.    COPYRIGHT LICENSE
352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
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:
392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
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.
422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
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
472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectmodifications thereto to recipients of copies in binary form.
482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
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.
512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
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.
542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
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."
602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project3.    NO PATENT LICENSE
622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
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.
672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
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.
702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project4.    DISCLAIMER
722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
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.
832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project5.    CONTACT INFORMATION
852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
862228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFraunhofer Institute for Integrated Circuits IIS
872228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAttention: Audio and Multimedia Departments - FDK AAC LL
882228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAm Wolfsmantel 33
892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project91058 Erlangen, Germany
902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectwww.iis.fraunhofer.de/amm
922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectamm-info@iis.fraunhofer.de
936cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK----------------------------------------------------------------------------- */
942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
956cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK/**************************** AAC decoder library ******************************
962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   Author(s):   Josef Hoepfl
986cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK
992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   Description: temporal noise shaping tool
1002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1016cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK*******************************************************************************/
1022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "aacdec_tns.h"
1042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "aac_rom.h"
1052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "FDK_bitstream.h"
1062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "channelinfo.h"
1072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1086cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK#include "FDK_lpc.h"
1092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1106cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK#define TNS_MAXIMUM_ORDER_AAC 12
1112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
1132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief Reset tns data
1142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  The function resets the tns data
1162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \return  none
1182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/
1196cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKvoid CTns_Reset(CTnsData *pTnsData) {
1202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Note: the following FDKmemclear should not be required. */
1216cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  FDKmemclear(pTnsData->Filter,
1226cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK              TNS_MAX_WINDOWS * TNS_MAXIMUM_FILTERS * sizeof(CFilter));
1236cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  FDKmemclear(pTnsData->NumberOfFilters, TNS_MAX_WINDOWS * sizeof(UCHAR));
1242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pTnsData->DataPresent = 0;
1252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pTnsData->Active = 0;
1262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
1272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1286cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKvoid CTns_ReadDataPresentFlag(
1296cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    HANDLE_FDK_BITSTREAM bs, /*!< pointer to bitstream */
1306cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    CTnsData *pTnsData)      /*!< pointer to aac decoder channel info */
1312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
1326cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  pTnsData->DataPresent = (UCHAR)FDKreadBits(bs, 1);
1332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
1342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
1362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief Read tns data from bitstream
1372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  The function reads the elements for tns from
1392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  the bitstream.
1402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \return  none
1422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/
1436cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKAAC_DECODER_ERROR CTns_Read(HANDLE_FDK_BITSTREAM bs, CTnsData *pTnsData,
1446cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                            const CIcsInfo *pIcsInfo, const UINT flags) {
1456cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  UCHAR n_filt, order;
1466cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  UCHAR length, coef_res, coef_compress;
1472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UCHAR window;
1486cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  UCHAR wins_per_frame;
1496cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  UCHAR isLongFlag;
1506cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  UCHAR start_window;
1512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  AAC_DECODER_ERROR ErrorStatus = AAC_DEC_OK;
1522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (!pTnsData->DataPresent) {
1542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return ErrorStatus;
1552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
1562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
1586cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    start_window = 0;
1596cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    wins_per_frame = GetWindowsPerFrame(pIcsInfo);
1606cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    isLongFlag = IsLongBlock(pIcsInfo);
1616cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  }
1622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1636cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  pTnsData->GainLd = 0;
1642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1656cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  for (window = start_window; window < wins_per_frame; window++) {
1666cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    pTnsData->NumberOfFilters[window] = n_filt =
1676cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        (UCHAR)FDKreadBits(bs, isLongFlag ? 2 : 1);
1686cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK
1696cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    if (n_filt) {
1702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      int index;
1712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      UCHAR nextstopband;
1722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1736cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      coef_res = (UCHAR)FDKreadBits(bs, 1);
1742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      nextstopband = GetScaleFactorBandsTotal(pIcsInfo);
1762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1776cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      for (index = 0; index < n_filt; index++) {
1782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        CFilter *filter = &pTnsData->Filter[window][index];
1792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        length = (UCHAR)FDKreadBits(bs, isLongFlag ? 6 : 4);
1812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1826cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        if (length > nextstopband) {
1832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          length = nextstopband;
1842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
1852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        filter->StartBand = nextstopband - length;
1876cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        filter->StopBand = nextstopband;
1882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        nextstopband = filter->StartBand;
1892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1906cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        if (flags & (AC_USAC | AC_RSVD50 | AC_RSV603DA)) {
1916cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          /* max(Order) = 15 (long), 7 (short) */
1926cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          filter->Order = order = (UCHAR)FDKreadBits(bs, isLongFlag ? 4 : 3);
1936cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        } else {
1946cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          filter->Order = order = (UCHAR)FDKreadBits(bs, isLongFlag ? 5 : 3);
1952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1966cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          if (filter->Order > TNS_MAXIMUM_ORDER) {
1976cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK            ErrorStatus = AAC_DEC_TNS_READ_ERROR;
1986cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK            return ErrorStatus;
1996cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          }
2002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
2012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2026cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        FDK_ASSERT(order <=
2036cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                   TNS_MAXIMUM_ORDER); /* avoid illegal memory access */
2046cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        if (order) {
2056cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          UCHAR coef, s_mask;
2062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          UCHAR i;
2072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          SCHAR n_mask;
2082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2096cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          static const UCHAR sgn_mask[] = {0x2, 0x4, 0x8};
2106cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          static const SCHAR neg_mask[] = {~0x3, ~0x7, ~0xF};
2112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2126cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          filter->Direction = FDKreadBits(bs, 1) ? -1 : 1;
2136cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK
2146cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          coef_compress = (UCHAR)FDKreadBits(bs, 1);
2152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          filter->Resolution = coef_res + 3;
2172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          s_mask = sgn_mask[coef_res + 1 - coef_compress];
2192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          n_mask = neg_mask[coef_res + 1 - coef_compress];
2202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2216cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          for (i = 0; i < order; i++) {
2226cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK            coef = (UCHAR)FDKreadBits(bs, filter->Resolution - coef_compress);
2232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            filter->Coeff[i] = (coef & s_mask) ? (coef | n_mask) : coef;
2242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
2256cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          pTnsData->GainLd = 4;
2262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
2272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
2282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
2302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pTnsData->Active = 1;
2322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return ErrorStatus;
2342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
2352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2366cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKvoid CTns_ReadDataPresentUsac(HANDLE_FDK_BITSTREAM hBs, CTnsData *pTnsData0,
2376cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                              CTnsData *pTnsData1, UCHAR *ptns_on_lr,
2386cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                              const CIcsInfo *pIcsInfo, const UINT flags,
2396cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                              const UINT elFlags, const int fCommonWindow) {
2406cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  int common_tns = 0;
2412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2426cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  if (fCommonWindow) {
2436cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    common_tns = FDKreadBit(hBs);
2442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
2456cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  { *ptns_on_lr = FDKreadBit(hBs); }
2466cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  if (common_tns) {
2476cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    pTnsData0->DataPresent = 1;
2486cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    CTns_Read(hBs, pTnsData0, pIcsInfo, flags);
2496cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK
2506cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    pTnsData0->DataPresent = 0;
2516cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    pTnsData0->Active = 1;
2526cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    *pTnsData1 = *pTnsData0;
2536cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  } else {
2546cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    int tns_present_both;
2556cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK
2566cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    tns_present_both = FDKreadBit(hBs);
2576cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    if (tns_present_both) {
2586cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      pTnsData0->DataPresent = 1;
2596cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      pTnsData1->DataPresent = 1;
2606cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    } else {
2616cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      pTnsData1->DataPresent = FDKreadBit(hBs);
2626cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      pTnsData0->DataPresent = !pTnsData1->DataPresent;
2636cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    }
2646cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  }
2656cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK}
2662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2676cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK/*!
2686cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  \brief Apply tns to spectral lines
2692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2706cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  The function applies the tns to the spectrum,
2712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2726cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  \return  none
2736cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK*/
2746cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKvoid CTns_Apply(CTnsData *RESTRICT pTnsData, /*!< pointer to aac decoder info */
2756cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                const CIcsInfo *pIcsInfo, SPECTRAL_PTR pSpectralCoefficient,
2766cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                const SamplingRateInfo *pSamplingRateInfo,
2776cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                const INT granuleLength, const UCHAR nbands,
2786cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                const UCHAR igf_active, const UINT flags) {
2796cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  int window, index, start, stop, size, start_window, wins_per_frame;
2802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2816cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  if (pTnsData->Active) {
2826cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    C_AALLOC_SCRATCH_START(coeff, FIXP_TCC, TNS_MAXIMUM_ORDER)
2832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2846cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    {
2856cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      start_window = 0;
2866cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      wins_per_frame = GetWindowsPerFrame(pIcsInfo);
2876cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    }
2882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2896cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    for (window = start_window; window < wins_per_frame; window++) {
2906cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      FIXP_DBL *pSpectrum;
2912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2926cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      { pSpectrum = SPEC(pSpectralCoefficient, window, granuleLength); }
2932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2946cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      for (index = 0; index < pTnsData->NumberOfFilters[window]; index++) {
2956cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        CFilter *filter = &pTnsData->Filter[window][index];
2962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2976cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        if (filter->Order > 0) {
2986cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          FIXP_TCC *pCoeff;
2996cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          UCHAR tns_max_bands;
3006cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK
3016cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          pCoeff = coeff;
3026cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          if (filter->Resolution == 3) {
3036cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK            int i;
3046cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK            for (i = 0; i < filter->Order; i++)
3056cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK              *pCoeff++ = FDKaacDec_tnsCoeff3[filter->Coeff[i] + 4];
3066cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          } else {
3076cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK            int i;
3086cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK            for (i = 0; i < filter->Order; i++)
3096cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK              *pCoeff++ = FDKaacDec_tnsCoeff4[filter->Coeff[i] + 8];
3106cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          }
3112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3126cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          switch (granuleLength) {
3136cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK            case 480:
3146cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK              tns_max_bands =
3156cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                  tns_max_bands_tbl_480[pSamplingRateInfo->samplingRateIndex];
3166cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK              break;
3176cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK            case 512:
3186cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK              tns_max_bands =
3196cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                  tns_max_bands_tbl_512[pSamplingRateInfo->samplingRateIndex];
3206cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK              break;
3216cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK            default:
3226cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK              tns_max_bands = GetMaximumTnsBands(
3236cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                  pIcsInfo, pSamplingRateInfo->samplingRateIndex);
3246cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK              /* See redefinition of TNS_MAX_BANDS table */
3256cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK              if ((flags & (AC_USAC | AC_RSVD50 | AC_RSV603DA)) &&
3266cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                  (pSamplingRateInfo->samplingRateIndex > 5)) {
3276cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                tns_max_bands += 1;
3286cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK              }
3296cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK              break;
3306cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          }
3312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3326cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          start = fixMin(fixMin(filter->StartBand, tns_max_bands), nbands);
3332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3346cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          start = GetScaleFactorBandOffsets(pIcsInfo, pSamplingRateInfo)[start];
3352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3366cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          if (igf_active) {
3376cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK            stop = fixMin(filter->StopBand, nbands);
3386cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          } else {
3396cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK            stop = fixMin(fixMin(filter->StopBand, tns_max_bands), nbands);
3406cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          }
3412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3426cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          stop = GetScaleFactorBandOffsets(pIcsInfo, pSamplingRateInfo)[stop];
3432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3446cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          size = stop - start;
3452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3466cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          if (size) {
3476cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK            C_ALLOC_SCRATCH_START(state, FIXP_DBL, TNS_MAXIMUM_ORDER)
3482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3496cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK            FDKmemclear(state, TNS_MAXIMUM_ORDER * sizeof(FIXP_DBL));
3506cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK            CLpc_SynthesisLattice(pSpectrum + start, size, 0, 0,
3516cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                                  filter->Direction, coeff, filter->Order,
3526cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                                  state);
3532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3546cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK            C_ALLOC_SCRATCH_END(state, FIXP_DBL, TNS_MAXIMUM_ORDER)
3552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
3562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
3572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
3586cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    }
3596cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    C_AALLOC_SCRATCH_END(coeff, FIXP_TCC, TNS_MAXIMUM_ORDER)
3602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
362