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