12228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 22228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* ----------------------------------------------------------------------------------------------------------- 32228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectSoftware License for The Fraunhofer FDK AAC Codec Library for Android 42228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 54f0d97057c5c640b25518358886f8c47da9fc052Jean-Michel Trivi� Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur F�rderung der angewandten Forschung e.V. 62228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project All rights reserved. 72228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 82228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1. INTRODUCTION 92228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThe Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements 102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthe MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. 112228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThis FDK AAC Codec software is intended to be used on a wide variety of Android devices. 122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 132228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual 142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectaudio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by 152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectindependent studies and is widely deployed. AAC has been standardized by ISO and IEC as part 162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectof the MPEG specifications. 172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 182228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectPatent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) 192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectmay be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners 202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectindividually for the purpose of encoding or decoding bit streams in products that are compliant with 212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthe ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license 222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthese patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec 232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectsoftware may already be covered under those patent licenses when it is used for those licensed purposes only. 242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 252228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectCommercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, 262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectare also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional 272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectapplications information and documentation. 282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project2. COPYRIGHT LICENSE 302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 312228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectRedistribution and use in source and binary forms, with or without modification, are permitted without 322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectpayment of copyright license fees provided that you satisfy the following conditions: 332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 342228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou must retain the complete text of this software license in redistributions of the FDK AAC Codec or 352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectyour modifications thereto in source code form. 362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 372228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou must retain the complete text of this software license in the documentation and/or other materials 382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectprovided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. 392228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou must make available free of charge copies of the complete source code of the FDK AAC Codec and your 402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectmodifications thereto to recipients of copies in binary form. 412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 422228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThe name of Fraunhofer may not be used to endorse or promote products derived from this library without 432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectprior written permission. 442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 452228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec 462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectsoftware or your modifications thereto. 472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 482228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYour modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software 492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectand the date of any change. For modified versions of the FDK AAC Codec, the term 502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project"Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term 512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project"Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project3. NO PATENT LICENSE 542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 552228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectNO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, 562228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with 572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectrespect to this software. 582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 592228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized 602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectby appropriate patent licenses. 612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project4. DISCLAIMER 632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 642228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThis FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors 652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project"AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties 662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectof merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 672228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectCONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, 682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectincluding but not limited to procurement of substitute goods or services; loss of use, data, or profits, 692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projector business interruption, however caused and on any theory of liability, whether in contract, strict 702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectliability, or tort (including negligence), arising in any way out of the use of this software, even if 712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectadvised of the possibility of such damage. 722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project5. CONTACT INFORMATION 742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 752228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFraunhofer Institute for Integrated Circuits IIS 762228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAttention: Audio and Multimedia Departments - FDK AAC LL 772228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAm Wolfsmantel 33 782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project91058 Erlangen, Germany 792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectwww.iis.fraunhofer.de/amm 812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectamm-info@iis.fraunhofer.de 822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------------------- */ 832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \file 862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Envelope extraction 872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project The functions provided by this module are mostly called by applySBR(). After it is 882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project determined that there is valid SBR data, sbrGetHeaderData() might be called if the current 892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SBR data contains an \ref SBR_HEADER_ELEMENT as opposed to a \ref SBR_STANDARD_ELEMENT. This function 902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project may return various error codes as defined in #SBR_HEADER_STATUS . Most importantly it returns HEADER_RESET when decoder 912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project settings need to be recalculated according to the SBR specifications. In that case applySBR() 922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project will initiatite the required re-configuration. 932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project The header data is stored in a #SBR_HEADER_DATA structure. 952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project The actual SBR data for the current frame is decoded into SBR_FRAME_DATA stuctures by sbrGetChannelPairElement() 972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project [for stereo streams] and sbrGetSingleChannelElement() [for mono streams]. There is no fractional arithmetic involved. 982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Once the information is extracted, the data needs to be further prepared before the actual decoding process. 1002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project This is done in decodeSbrData(). 1012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \sa Description of buffer management in applySBR(). \ref documentationOverview 1032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project <h1>About the SBR data format:</h1> 1052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Each frame includes SBR data (side chain information), and can be either the \ref SBR_HEADER_ELEMENT or the \ref SBR_STANDARD_ELEMENT. 1072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Parts of the data can be protected by a CRC checksum. 1082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \anchor SBR_HEADER_ELEMENT <h2>The SBR_HEADER_ELEMENT</h2> 1102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project The SBR_HEADER_ELEMENT can be transmitted with every frame, however, it typically is send every second or so. It contains fundamental 1122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project information such as SBR sampling frequency and frequency range as well as control signals that do not require frequent changes. It also 1132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project includes the \ref SBR_STANDARD_ELEMENT. 1142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Depending on the changes between the information in a current SBR_HEADER_ELEMENT and the previous SBR_HEADER_ELEMENT, the SBR decoder might need 1162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project to be reset and reconfigured (e.g. new tables need to be calculated). 1172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \anchor SBR_STANDARD_ELEMENT <h2>The SBR_STANDARD_ELEMENT</h2> 1192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project This data can be subdivided into "side info" and "raw data", where side info is defined as signals needed to decode the raw data 1212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project and some decoder tuning signals. Raw data is referred to as PCM and Huffman coded envelope and noise floor estimates. The side info also 1222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project includes information about the time-frequency grid for the current frame. 1232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \sa \ref documentationOverview 1252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 1262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "env_extr.h" 1282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "sbr_ram.h" 1302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "sbr_rom.h" 1312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "huff_dec.h" 1322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "psbitdec.h" 1352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define DRM_PARAMETRIC_STEREO 0 1372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define EXTENSION_ID_PS_CODING 2 1382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic int extractFrameInfo (HANDLE_FDK_BITSTREAM hBs, 1412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_SBR_HEADER_DATA hHeaderData, 1422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_SBR_FRAME_DATA h_frame_data, 1432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const UINT nrOfChannels, 1442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const UINT flags 1452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ); 1462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic int sbrGetEnvelope (HANDLE_SBR_HEADER_DATA hHeaderData, 1492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_SBR_FRAME_DATA h_frame_data, 1502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_FDK_BITSTREAM hBs, 1512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const UINT flags); 1522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void sbrGetDirectionControlData (HANDLE_SBR_FRAME_DATA hFrameData, 1542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_FDK_BITSTREAM hBs); 1552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void sbrGetNoiseFloorData (HANDLE_SBR_HEADER_DATA hHeaderData, 1572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_SBR_FRAME_DATA h_frame_data, 1582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_FDK_BITSTREAM hBs); 1592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic int checkFrameInfo (FRAME_INFO *pFrameInfo, int numberOfTimeSlots, int overlap, int timeStep); 1612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1622228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectSBR_ERROR 1632228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectinitHeaderData ( 1642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_SBR_HEADER_DATA hHeaderData, 1652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const int sampleRateIn, 1662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const int sampleRateOut, 1672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const int samplesPerFrame, 1682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const UINT flags 1692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) 1702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 1712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_FREQ_BAND_DATA hFreq = &hHeaderData->freqBandData; 1722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SBR_ERROR sbrError = SBRDEC_OK; 1732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int numAnalysisBands; 1742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( sampleRateIn == sampleRateOut ) { 1762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hHeaderData->sbrProcSmplRate = sampleRateOut<<1; 1772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project numAnalysisBands = 32; 1782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else { 1792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hHeaderData->sbrProcSmplRate = sampleRateOut; 1802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (sampleRateOut>>1) == sampleRateIn) { 1812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 1:2 */ 1822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project numAnalysisBands = 32; 1832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else if ( (sampleRateOut>>2) == sampleRateIn ) { 1842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 1:4 */ 1852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project numAnalysisBands = 32; 1862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else if ( (sampleRateOut*3)>>3 == (sampleRateIn*8)>>3 ) { 1872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 3:8, 3/4 core frame length */ 1882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project numAnalysisBands = 24; 1892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else { 1902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrError = SBRDEC_UNSUPPORTED_CONFIG; 1912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project goto bail; 1922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 1932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 1942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Fill in default values first */ 1962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hHeaderData->syncState = SBR_NOT_INITIALIZED; 1972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hHeaderData->status = 0; 1982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hHeaderData->frameErrorFlag = 0; 1992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hHeaderData->bs_info.ampResolution = 1; 2012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hHeaderData->bs_info.xover_band = 0; 2022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hHeaderData->bs_info.sbr_preprocessing = 0; 2032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hHeaderData->bs_data.startFreq = 5; 2052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hHeaderData->bs_data.stopFreq = 0; 2062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hHeaderData->bs_data.freqScale = 2; 2072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hHeaderData->bs_data.alterScale = 1; 2082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hHeaderData->bs_data.noise_bands = 2; 2092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hHeaderData->bs_data.limiterBands = 2; 2102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hHeaderData->bs_data.limiterGains = 2; 2112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hHeaderData->bs_data.interpolFreq = 1; 2122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hHeaderData->bs_data.smoothingLength = 1; 2132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hHeaderData->timeStep = (flags & SBRDEC_ELD_GRID) ? 1 : 2; 2152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Setup pointers to frequency band tables */ 2172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hFreq->freqBandTable[0] = hFreq->freqBandTableLo; 2182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hFreq->freqBandTable[1] = hFreq->freqBandTableHi; 2192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Patch some entries */ 2212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (sampleRateOut > 24000) { /* Trigger an error if SBR is going to be processed without */ 2222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hHeaderData->bs_data.startFreq = 7; /* having read these frequency values from bit stream before. */ 2232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hHeaderData->bs_data.stopFreq = 3; 2242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* One SBR timeslot corresponds to the amount of samples equal to the amount of analysis bands, divided by the timestep. */ 2272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hHeaderData->numberTimeSlots = (samplesPerFrame/numAnalysisBands) >> (hHeaderData->timeStep - 1); 2282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hHeaderData->numberTimeSlots > (16)) { 2292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrError = SBRDEC_UNSUPPORTED_CONFIG; 2302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hHeaderData->numberOfAnalysisBands = numAnalysisBands; 2332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail: 2352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return sbrError; 2362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 2372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 2402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Initialize the SBR_PREV_FRAME_DATA struct 2412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 2422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid 2432228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectinitSbrPrevFrameData (HANDLE_SBR_PREV_FRAME_DATA h_prev_data, /*!< handle to struct SBR_PREV_FRAME_DATA */ 2442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int timeSlots) /*!< Framelength in SBR-timeslots */ 2452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 2462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int i; 2472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Set previous energy and noise levels to 0 for the case 2492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project that decoding starts in the middle of a bitstream */ 2502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i=0; i < MAX_FREQ_COEFFS; i++) 2512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_prev_data->sfb_nrg_prev[i] = (FIXP_DBL)0; 2522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i=0; i < MAX_NOISE_COEFFS; i++) 2532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_prev_data->prevNoiseLevel[i] = (FIXP_DBL)0; 2542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i=0; i < MAX_INVF_BANDS; i++) 2552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_prev_data->sbr_invf_mode[i] = INVF_OFF; 2562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_prev_data->stopPos = timeSlots; 2582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_prev_data->coupling = COUPLING_OFF; 2592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_prev_data->ampRes = 0; 2602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 2612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 2642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Read header data from bitstream 2652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return error status - 0 if ok 2672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 2682228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectSBR_HEADER_STATUS 2692228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectsbrGetHeaderData (HANDLE_SBR_HEADER_DATA hHeaderData, 2702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_FDK_BITSTREAM hBs, 2712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const UINT flags, 2722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const int fIsSbrData) 2732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 2742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SBR_HEADER_DATA_BS *pBsData; 2752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SBR_HEADER_DATA_BS lastHeader; 2762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SBR_HEADER_DATA_BS_INFO lastInfo; 2772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int headerExtra1=0, headerExtra2=0; 2782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Copy SBR bit stream header to temporary header */ 2802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project lastHeader = hHeaderData->bs_data; 2812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project lastInfo = hHeaderData->bs_info; 2822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Read new header from bitstream */ 2842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 2852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pBsData = &hHeaderData->bs_data; 2862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 2892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hHeaderData->bs_info.ampResolution = FDKreadBits (hBs, 1); 2902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pBsData->startFreq = FDKreadBits (hBs, 4); 2932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pBsData->stopFreq = FDKreadBits (hBs, 4); 2942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 2962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hHeaderData->bs_info.xover_band = FDKreadBits (hBs, 3); 2972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKreadBits (hBs, 2); 2982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project headerExtra1 = FDKreadBits (hBs, 1); 3012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project headerExtra2 = FDKreadBits (hBs, 1); 3022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Handle extra header information */ 3042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if( headerExtra1) 3052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 3062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pBsData->freqScale = FDKreadBits (hBs, 2); 3072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pBsData->alterScale = FDKreadBits (hBs, 1); 3082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pBsData->noise_bands = FDKreadBits (hBs, 2); 3092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 3112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pBsData->freqScale = 2; 3122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pBsData->alterScale = 1; 3132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pBsData->noise_bands = 2; 3142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (headerExtra2) { 3172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pBsData->limiterBands = FDKreadBits (hBs, 2); 3182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pBsData->limiterGains = FDKreadBits (hBs, 2); 3192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pBsData->interpolFreq = FDKreadBits (hBs, 1); 3202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pBsData->smoothingLength = FDKreadBits (hBs, 1); 3212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 3232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pBsData->limiterBands = 2; 3242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pBsData->limiterGains = 2; 3252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pBsData->interpolFreq = 1; 3262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pBsData->smoothingLength = 1; 3272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Look for new settings. IEC 14496-3, 4.6.18.3.1 */ 3302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(hHeaderData->syncState != SBR_ACTIVE || 3312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project lastHeader.startFreq != pBsData->startFreq || 3322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project lastHeader.stopFreq != pBsData->stopFreq || 3332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project lastHeader.freqScale != pBsData->freqScale || 3342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project lastHeader.alterScale != pBsData->alterScale || 3352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project lastHeader.noise_bands != pBsData->noise_bands || 3362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project lastInfo.xover_band != hHeaderData->bs_info.xover_band) { 3372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return HEADER_RESET; /* New settings */ 3382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return HEADER_OK; 3412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 3422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 3442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Get missing harmonics parameters (only used for AAC+SBR) 3452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return error status - 0 if ok 3472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 3482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectint 3492228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectsbrGetSyntheticCodedData(HANDLE_SBR_HEADER_DATA hHeaderData, 3502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_SBR_FRAME_DATA hFrameData, 3512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_FDK_BITSTREAM hBs) 3522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 3532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int i, bitsRead = 0; 3542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int flag = FDKreadBits(hBs,1); 3562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitsRead++; 3572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(flag){ 3592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(i=0;i<hHeaderData->freqBandData.nSfb[1];i++){ 3602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hFrameData->addHarmonics[i] = FDKreadBits (hBs, 1 ); 3612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitsRead++; 3622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 3652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(i=0; i<MAX_FREQ_COEFFS; i++) 3662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hFrameData->addHarmonics[i] = 0; 3672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return(bitsRead); 3692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 3702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 3722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Reads extension data from the bitstream 3732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project The bitstream format allows up to 4 kinds of extended data element. 3752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Extended data may contain several elements, each identified by a 2-bit-ID. 3762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project So far, no extended data elements are defined hence the first 2 parameters 3772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project are unused. The data should be skipped in order to update the number 3782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project of read bits for the consistency check in applySBR(). 3792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 3802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic int extractExtendedData( 3812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_SBR_HEADER_DATA hHeaderData, /*!< handle to SBR header */ 3822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_FDK_BITSTREAM hBs /*!< Handle to the bit buffer */ 3832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ,HANDLE_PS_DEC hParametricStereoDec /*!< Parametric Stereo Decoder */ 3842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) { 3852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT nBitsLeft; 3862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int extended_data; 3872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int i, frameOk = 1; 3882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project extended_data = FDKreadBits(hBs, 1); 3912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (extended_data) { 3932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int cnt; 3942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int bPsRead = 0; 3952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cnt = FDKreadBits(hBs, 4); 3972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (cnt == (1<<4)-1) 3982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cnt += FDKreadBits(hBs, 8); 3992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nBitsLeft = 8 * cnt; 4022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* sanity check for cnt */ 4042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (nBitsLeft > (INT)FDKgetValidBits(hBs)) { 4052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* limit nBitsLeft */ 4062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nBitsLeft = (INT)FDKgetValidBits(hBs); 4072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* set frame error */ 4082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project frameOk = 0; 4092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project while (nBitsLeft > 7) { 4122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int extension_id = FDKreadBits(hBs, 2); 4132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nBitsLeft -= 2; 4142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch(extension_id) { 4162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case EXTENSION_ID_PS_CODING: 4202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Read PS data from bitstream */ 4222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hParametricStereoDec != NULL) { 4242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(bPsRead && !hParametricStereoDec->bsData[hParametricStereoDec->bsReadSlot].mpeg.bPsHeaderValid) { 4252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cnt = nBitsLeft >> 3; /* number of remaining bytes */ 4262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i=0; i<cnt; i++) 4272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKreadBits(hBs, 8); 4282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nBitsLeft -= cnt * 8; 4292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else { 4302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nBitsLeft -= ReadPsData(hParametricStereoDec, hBs, nBitsLeft); 4312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bPsRead = 1; 4322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* parametric stereo detected, could set channelMode accordingly here */ 4362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* */ 4372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* "The usage of this parametric stereo extension to HE-AAC is */ 4382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* signalled implicitly in the bitstream. Hence, if an sbr_extension() */ 4392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* with bs_extension_id==EXTENSION_ID_PS is found in the SBR part of */ 4402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* the bitstream, a decoder supporting the combination of SBR and PS */ 4412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* shall operate the PS tool to generate a stereo output signal." */ 4422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* source: ISO/IEC 14496-3:2001/FDAM 2:2004(E) */ 4432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 4452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 4482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cnt = nBitsLeft >> 3; /* number of remaining bytes */ 4492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i=0; i<cnt; i++) 4502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKreadBits(hBs, 8); 4512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nBitsLeft -= cnt * 8; 4522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 4532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (nBitsLeft < 0) { 4572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project frameOk = 0; 4582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project goto bail; 4592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 4612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Read fill bits for byte alignment */ 4622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKreadBits(hBs, nBitsLeft); 4632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail: 4672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return (frameOk); 4682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 4692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 4722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Read bitstream elements of one channel 4732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return SbrFrameOK: 1=ok, 0=error 4752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 4762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectint 4772228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectsbrGetSingleChannelElement (HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ 4782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_SBR_FRAME_DATA hFrameData, /*!< Control data of current frame */ 4792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_FDK_BITSTREAM hBs, /*!< Handle to struct BIT_BUF */ 4802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_PS_DEC hParametricStereoDec, /*!< Handle to PS decoder */ 4812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const UINT flags, 4822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const int overlap 4832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) 4842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 4852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int i; 4862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hFrameData->coupling = COUPLING_OFF; 4892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 4912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Reserved bits */ 4922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (FDKreadBits(hBs, 1)) { /* bs_data_extra */ 4932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKreadBits(hBs, 4); 4942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (flags & SBRDEC_SYNTAX_SCAL) { 4952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKreadBits(hBs, 4); 4962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (flags & SBRDEC_SYNTAX_SCAL) { 5012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKreadBits (hBs, 1); /* bs_coupling */ 5022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 5052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Grid control 5062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 5072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( !extractFrameInfo ( hBs, hHeaderData, hFrameData, 1, flags) ) 5082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 5092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( !checkFrameInfo (&hFrameData->frameInfo, hHeaderData->numberTimeSlots, overlap, hHeaderData->timeStep) ) 5112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 5122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 5152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Fetch domain vectors (time or frequency direction for delta-coding) 5162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 5172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrGetDirectionControlData (hFrameData, hBs); 5182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i=0; i<hHeaderData->freqBandData.nInvfBands; i++) { 5202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hFrameData->sbr_invf_mode[i] = 5212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project (INVF_MODE) FDKreadBits (hBs, 2); 5222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* raw data */ 5272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( !sbrGetEnvelope (hHeaderData, hFrameData, hBs, flags) ) 5282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 5292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrGetNoiseFloorData (hHeaderData, hFrameData, hBs); 5322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrGetSyntheticCodedData(hHeaderData, hFrameData, hBs); 5342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 5362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* sbr extended data */ 5372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (! extractExtendedData( 5382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hHeaderData, 5392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hBs 5402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ,hParametricStereoDec 5412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project )) { 5422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 5432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 1; 5472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 5482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 5522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Read bitstream elements of a channel pair 5532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return SbrFrameOK 5542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 5552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectint 5562228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectsbrGetChannelPairElement (HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ 5572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_SBR_FRAME_DATA hFrameDataLeft, /*!< Dynamic control data for first channel */ 5582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_SBR_FRAME_DATA hFrameDataRight,/*!< Dynamic control data for second channel */ 5592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_FDK_BITSTREAM hBs, /*!< handle to struct BIT_BUF */ 5602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const UINT flags, 5612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const int overlap ) 5622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 5632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int i, bit; 5642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Reserved bits */ 5672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (FDKreadBits(hBs, 1)) { /* bs_data_extra */ 5682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKreadBits(hBs, 4); 5692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKreadBits(hBs, 4); 5702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Read coupling flag */ 5732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bit = FDKreadBits (hBs, 1); 5742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (bit) { 5762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hFrameDataLeft->coupling = COUPLING_LEVEL; 5772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hFrameDataRight->coupling = COUPLING_BAL; 5782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 5802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hFrameDataLeft->coupling = COUPLING_OFF; 5812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hFrameDataRight->coupling = COUPLING_OFF; 5822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 5862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Grid control 5872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 5882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( !extractFrameInfo (hBs, hHeaderData, hFrameDataLeft, 2, flags) ) 5892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 5902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( !checkFrameInfo (&hFrameDataLeft->frameInfo, hHeaderData->numberTimeSlots, overlap, hHeaderData->timeStep) ) 5922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 5932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hFrameDataLeft->coupling) { 5952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy (&hFrameDataRight->frameInfo, &hFrameDataLeft->frameInfo, sizeof(FRAME_INFO)); 5962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hFrameDataRight->ampResolutionCurrentFrame = hFrameDataLeft->ampResolutionCurrentFrame; 5972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 5992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( !extractFrameInfo (hBs, hHeaderData, hFrameDataRight, 2, flags) ) 6002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 6012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( !checkFrameInfo (&hFrameDataRight->frameInfo, hHeaderData->numberTimeSlots, overlap, hHeaderData->timeStep) ) 6032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 6042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 6072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Fetch domain vectors (time or frequency direction for delta-coding) 6082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 6092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrGetDirectionControlData (hFrameDataLeft, hBs); 6102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrGetDirectionControlData (hFrameDataRight, hBs); 6112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i=0; i<hHeaderData->freqBandData.nInvfBands; i++) { 6132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hFrameDataLeft->sbr_invf_mode[i] = (INVF_MODE) FDKreadBits (hBs, 2); 6142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hFrameDataLeft->coupling) { 6172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i=0; i<hHeaderData->freqBandData.nInvfBands; i++) { 6182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hFrameDataRight->sbr_invf_mode[i] = hFrameDataLeft->sbr_invf_mode[i]; 6192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( !sbrGetEnvelope (hHeaderData, hFrameDataLeft, hBs, flags) ) { 6232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 6242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrGetNoiseFloorData (hHeaderData, hFrameDataLeft, hBs); 6272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( !sbrGetEnvelope (hHeaderData, hFrameDataRight, hBs, flags) ) { 6292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 6302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 6332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i=0; i<hHeaderData->freqBandData.nInvfBands; i++) { 6352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hFrameDataRight->sbr_invf_mode[i] = (INVF_MODE) FDKreadBits (hBs, 2); 6362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( !sbrGetEnvelope (hHeaderData, hFrameDataLeft, hBs, flags) ) 6412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 6422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( !sbrGetEnvelope (hHeaderData, hFrameDataRight, hBs, flags) ) 6442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 6452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrGetNoiseFloorData (hHeaderData, hFrameDataLeft, hBs); 6472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrGetNoiseFloorData (hHeaderData, hFrameDataRight, hBs); 6502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrGetSyntheticCodedData(hHeaderData, hFrameDataLeft, hBs); 6522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrGetSyntheticCodedData(hHeaderData, hFrameDataRight, hBs); 6532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 6552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (! extractExtendedData( 6562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hHeaderData, 6572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hBs 6582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ,NULL 6592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) ) { 6602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 6612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 1; 6652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 6662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 6712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Read direction control data from bitstream 6722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 6732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid 6742228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectsbrGetDirectionControlData (HANDLE_SBR_FRAME_DATA h_frame_data, /*!< handle to struct SBR_FRAME_DATA */ 6752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_FDK_BITSTREAM hBs) /*!< handle to struct BIT_BUF */ 6762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 6772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int i; 6782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i = 0; i < h_frame_data->frameInfo.nEnvelopes; i++) { 6802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_frame_data->domain_vec[i] = FDKreadBits (hBs, 1); 6812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i = 0; i < h_frame_data->frameInfo.nNoiseEnvelopes; i++) { 6842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_frame_data->domain_vec_noise[i] = FDKreadBits (hBs, 1); 6852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 6872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 6912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Read noise-floor-level data from bitstream 6922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 6932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid 6942228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectsbrGetNoiseFloorData (HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ 6952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_SBR_FRAME_DATA h_frame_data, /*!< handle to struct SBR_FRAME_DATA */ 6962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_FDK_BITSTREAM hBs) /*!< handle to struct BIT_BUF */ 6972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 6982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int i,j; 6992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int delta; 7002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project COUPLING_MODE coupling; 7012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int noNoiseBands = hHeaderData->freqBandData.nNfb; 7022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Huffman hcb_noiseF; 7042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Huffman hcb_noise; 7052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int envDataTableCompFactor; 7062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project coupling = h_frame_data->coupling; 7082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 7112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Select huffman codebook depending on coupling mode 7122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 7132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (coupling == COUPLING_BAL) { 7142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hcb_noise = (Huffman)&FDK_sbrDecoder_sbr_huffBook_NoiseBalance11T; 7152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hcb_noiseF = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance11F; /* "sbr_huffBook_NoiseBalance11F" */ 7162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project envDataTableCompFactor = 1; 7172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 7192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hcb_noise = (Huffman)&FDK_sbrDecoder_sbr_huffBook_NoiseLevel11T; 7202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hcb_noiseF = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel11F; /* "sbr_huffBook_NoiseLevel11F" */ 7212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project envDataTableCompFactor = 0; 7222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 7252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Read raw noise-envelope data 7262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 7272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i=0; i<h_frame_data->frameInfo.nNoiseEnvelopes; i++) { 7282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (h_frame_data->domain_vec_noise[i] == 0) { 7312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (coupling == COUPLING_BAL) { 7322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_frame_data->sbrNoiseFloorLevel[i*noNoiseBands] = 7332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project (FIXP_SGL) (((int)FDKreadBits (hBs, 5)) << envDataTableCompFactor); 7342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 7362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_frame_data->sbrNoiseFloorLevel[i*noNoiseBands] = 7372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project (FIXP_SGL) (int)FDKreadBits (hBs, 5); 7382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (j = 1; j < noNoiseBands; j++) { 7412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project delta = DecodeHuffmanCW(hcb_noiseF, hBs); 7422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_frame_data->sbrNoiseFloorLevel[i*noNoiseBands+j] = (FIXP_SGL) (delta << envDataTableCompFactor); 7432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 7462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (j = 0; j < noNoiseBands; j++) { 7472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project delta = DecodeHuffmanCW(hcb_noise, hBs); 7482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_frame_data->sbrNoiseFloorLevel[i*noNoiseBands+j] = (FIXP_SGL) (delta << envDataTableCompFactor); 7492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 7532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 7562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Read envelope data from bitstream 7572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 7582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic int 7592228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectsbrGetEnvelope (HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ 7602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_SBR_FRAME_DATA h_frame_data, /*!< handle to struct SBR_FRAME_DATA */ 7612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_FDK_BITSTREAM hBs, /*!< handle to struct BIT_BUF */ 7622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const UINT flags) 7632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 7642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int i, j; 7652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR no_band[MAX_ENVELOPES]; 7662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int delta = 0; 7672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int offset = 0; 7682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project COUPLING_MODE coupling = h_frame_data->coupling; 7692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int ampRes = hHeaderData->bs_info.ampResolution; 7702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int nEnvelopes = h_frame_data->frameInfo.nEnvelopes; 7712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int envDataTableCompFactor; 7722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int start_bits, start_bits_balance; 7732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Huffman hcb_t, hcb_f; 7742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_frame_data->nScaleFactors = 0; 7762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (h_frame_data->frameInfo.frameClass == 0) && (nEnvelopes == 1) ) { 7782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (flags & SBRDEC_ELD_GRID) 7792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ampRes = h_frame_data->ampResolutionCurrentFrame; 7802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else 7812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ampRes = 0; 7822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_frame_data->ampResolutionCurrentFrame = ampRes; 7842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 7862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Set number of bits for first value depending on amplitude resolution 7872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 7882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(ampRes == 1) 7892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 7902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project start_bits = 6; 7912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project start_bits_balance = 5; 7922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else 7942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 7952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project start_bits = 7; 7962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project start_bits_balance = 6; 7972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 8002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Calculate number of values for each envelope and alltogether 8012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 8022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i = 0; i < nEnvelopes; i++) { 8032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project no_band[i] = hHeaderData->freqBandData.nSfb[h_frame_data->frameInfo.freqRes[i]]; 8042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_frame_data->nScaleFactors += no_band[i]; 8052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (h_frame_data->nScaleFactors > MAX_NUM_ENVELOPE_VALUES) 8072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 8082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 8102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Select Huffman codebook depending on coupling mode and amplitude resolution 8112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 8122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (coupling == COUPLING_BAL) { 8132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project envDataTableCompFactor = 1; 8142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (ampRes == 0) { 8152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance10T; 8162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance10F; 8172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 8192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance11T; 8202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance11F; 8212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 8242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project envDataTableCompFactor = 0; 8252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (ampRes == 0) { 8262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel10T; 8272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel10F; 8282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 8302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel11T; 8312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel11F; 8322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 8362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Now read raw envelope data 8372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 8382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (j = 0, offset = 0; j < nEnvelopes; j++) { 8392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (h_frame_data->domain_vec[j] == 0) { 8422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (coupling == COUPLING_BAL) { 8432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_frame_data->iEnvelope[offset] = 8442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project (FIXP_SGL) (( (int)FDKreadBits(hBs, start_bits_balance)) << envDataTableCompFactor); 8452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 8472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_frame_data->iEnvelope[offset] = 8482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project (FIXP_SGL) (int)FDKreadBits (hBs, start_bits); 8492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i = (1 - h_frame_data->domain_vec[j]); i < no_band[j]; i++) { 8532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (h_frame_data->domain_vec[j] == 0) { 8552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project delta = DecodeHuffmanCW(hcb_f, hBs); 8562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 8582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project delta = DecodeHuffmanCW(hcb_t, hBs); 8592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_frame_data->iEnvelope[offset + i] = (FIXP_SGL) (delta << envDataTableCompFactor); 8622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project offset += no_band[j]; 8642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#if ENV_EXP_FRACT 8672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Convert from int to scaled fract (ENV_EXP_FRACT bits for the fractional part) */ 8682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i = 0; i < h_frame_data->nScaleFactors; i++) { 8692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_frame_data->iEnvelope[i] <<= ENV_EXP_FRACT; 8702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif 8722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 1; 8742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 8752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project//static const FRAME_INFO v_frame_info1_8 = { 0, 1, {0, 8}, {1}, -1, 1, {0, 8} }; 8782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic const FRAME_INFO v_frame_info2_8 = { 0, 2, {0, 4, 8}, {1, 1}, -1, 2, {0, 4, 8} }; 8792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic const FRAME_INFO v_frame_info4_8 = { 0, 4, {0, 2, 4, 6, 8}, {1, 1, 1, 1}, -1, 2, {0, 4, 8} }; 8802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/***************************************************************************/ 8822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 8832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Generates frame info for FIXFIXonly frame class used for low delay version 8842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return nothing 8862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ****************************************************************************/ 8872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project static void generateFixFixOnly ( FRAME_INFO *hSbrFrameInfo, 8882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int tranPosInternal, 8892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int numberTimeSlots 8902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) 8912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 8922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int nEnv, i, tranIdx; 8932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const int *pTable; 8942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch (numberTimeSlots) { 8962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 8: 8972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pTable = FDK_sbrDecoder_envelopeTable_8[tranPosInternal]; 8982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 8992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 15: 9002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pTable = FDK_sbrDecoder_envelopeTable_15[tranPosInternal]; 9012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 9022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 16: 9032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pTable = FDK_sbrDecoder_envelopeTable_16[tranPosInternal]; 9042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 9052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 9062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_ASSERT(0); 9072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* look number of envelopes in table */ 9102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nEnv = pTable[0]; 9112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* look up envelope distribution in table */ 9122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i=1; i<nEnv; i++) 9132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrFrameInfo->borders[i] = pTable[i+2]; 9142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* open and close frame border */ 9152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrFrameInfo->borders[0] = 0; 9162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrFrameInfo->borders[nEnv] = numberTimeSlots; 9172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrFrameInfo->nEnvelopes = nEnv; 9182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* transient idx */ 9202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tranIdx = hSbrFrameInfo->tranEnv = pTable[1]; 9212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* add noise floors */ 9232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrFrameInfo->bordersNoise[0] = 0; 9242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrFrameInfo->bordersNoise[1] = hSbrFrameInfo->borders[tranIdx?tranIdx:1]; 9252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrFrameInfo->bordersNoise[2] = numberTimeSlots; 9262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* nEnv is always > 1, so nNoiseEnvelopes is always 2 (IEC 14496-3 4.6.19.3.2) */ 9272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrFrameInfo->nNoiseEnvelopes = 2; 9282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 9292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 9312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Extracts LowDelaySBR control data from the bitstream. 9322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return zero for bitstream error, one for correct. 9342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 9352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic int 9362228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectextractLowDelayGrid (HANDLE_FDK_BITSTREAM hBitBuf, /*!< bitbuffer handle */ 9372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_SBR_HEADER_DATA hHeaderData, 9382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_SBR_FRAME_DATA h_frame_data, /*!< contains the FRAME_INFO struct to be filled */ 9392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int timeSlots 9402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) 9412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 9422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FRAME_INFO * pFrameInfo = &h_frame_data->frameInfo; 9432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT numberTimeSlots = hHeaderData->numberTimeSlots; 9442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT temp = 0, k; 9452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* FIXFIXonly framing case */ 9472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_frame_data->frameInfo.frameClass = 0; 9482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* get the transient position from the bitstream */ 9502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch (timeSlots){ 9512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 8: 9522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 3bit transient position (temp={0;..;7}) */ 9532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project temp = FDKreadBits( hBitBuf, 3); 9542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 9552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 16: 9572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 15: 9582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 4bit transient position (temp={0;..;15}) */ 9592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project temp = FDKreadBits( hBitBuf, 4); 9602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 9612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 9632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 9642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* calculate borders according to the transient position */ 9672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project generateFixFixOnly ( pFrameInfo, 9682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project temp, 9692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project numberTimeSlots 9702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ); 9712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* decode freq res: */ 9732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (k = 0; k < pFrameInfo->nEnvelopes; k++) { 9742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFrameInfo->freqRes[k] = (UCHAR) FDKreadBits (hBitBuf, 1); /* f = F [1 bits] */ 9752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 1; 9792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 9802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 9822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Extract the frame information (structure FRAME_INFO) from the bitstream 9832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return Zero for bitstream error, one for correct. 9842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 9852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectint 9862228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectextractFrameInfo ( HANDLE_FDK_BITSTREAM hBs, /*!< bitbuffer handle */ 9872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ 9882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_SBR_FRAME_DATA h_frame_data, /*!< pointer to memory where the frame-info will be stored */ 9892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const UINT nrOfChannels, 9902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const UINT flags 9912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) 9922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 9932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FRAME_INFO * pFrameInfo = &h_frame_data->frameInfo; 9942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int numberTimeSlots = hHeaderData->numberTimeSlots; 9952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int pointer_bits = 0, nEnv = 0, b = 0, border, i, n = 0, 9962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project k, p, aL, aR, nL, nR, 9972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project temp = 0, staticFreqRes; 9982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR frameClass; 9992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (flags & SBRDEC_ELD_GRID) { 10012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* CODEC_AACLD (LD+SBR) only uses the normal 0 Grid for non-transient Frames and the LowDelayGrid for transient Frames */ 10022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project frameClass = FDKreadBits (hBs, 1); /* frameClass = [1 bit] */ 10032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( frameClass == 1 ) { 10042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* if frameClass == 1, extract LowDelaySbrGrid, otherwise extract normal SBR-Grid for FIXIFX */ 10052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* extract the AACLD-Sbr-Grid */ 10062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFrameInfo->frameClass = frameClass; 10072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project extractLowDelayGrid (hBs, hHeaderData, h_frame_data, numberTimeSlots); 10082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 1; 10092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else 10112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 10122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project frameClass = FDKreadBits (hBs, 2); /* frameClass = C [2 bits] */ 10132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch (frameClass) { 10172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 0: 10182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project temp = FDKreadBits (hBs, 2); /* E [2 bits ] */ 10192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nEnv = (int) (1 << temp); /* E -> e */ 10202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ((flags & SBRDEC_ELD_GRID) && (nEnv == 1)) 10222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_frame_data->ampResolutionCurrentFrame = FDKreadBits( hBs, 1); /* new ELD Syntax 07-11-09 */ 10232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project staticFreqRes = FDKreadBits (hBs, 1); 10252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 10272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (nEnv > MAX_ENVELOPES_HEAAC) 10282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 10292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project b = nEnv + 1; 10322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch (nEnv) { 10332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 1: 10342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch (numberTimeSlots) { 10352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 15: 10362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy (pFrameInfo, &FDK_sbrDecoder_sbr_frame_info1_15, sizeof(FRAME_INFO)); 10372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 10382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 16: 10392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy (pFrameInfo, &FDK_sbrDecoder_sbr_frame_info1_16, sizeof(FRAME_INFO)); 10402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 10412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 10422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_ASSERT(0); 10432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 10452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 2: 10462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch (numberTimeSlots) { 10472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 15: 10482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy (pFrameInfo, &FDK_sbrDecoder_sbr_frame_info2_15, sizeof(FRAME_INFO)); 10492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 10502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 16: 10512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy (pFrameInfo, &FDK_sbrDecoder_sbr_frame_info2_16, sizeof(FRAME_INFO)); 10522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 10532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 10542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_ASSERT(0); 10552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 10572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 4: 10582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch (numberTimeSlots) { 10592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 15: 10602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy (pFrameInfo, &FDK_sbrDecoder_sbr_frame_info4_15, sizeof(FRAME_INFO)); 10612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 10622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 16: 10632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy (pFrameInfo, &FDK_sbrDecoder_sbr_frame_info4_16, sizeof(FRAME_INFO)); 10642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 10652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 10662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_ASSERT(0); 10672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 10692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 8: 10702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#if (MAX_ENVELOPES >= 8) 10712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch (numberTimeSlots) { 10722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 15: 10732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy (pFrameInfo, &FDK_sbrDecoder_sbr_frame_info8_15, sizeof(FRAME_INFO)); 10742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 10752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 16: 10762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy (pFrameInfo, &FDK_sbrDecoder_sbr_frame_info8_16, sizeof(FRAME_INFO)); 10772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 10782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 10792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_ASSERT(0); 10802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 10822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#else 10832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 10842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif 10852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Apply correct freqRes (High is default) */ 10872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (!staticFreqRes) { 10882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i = 0; i < nEnv ; i++) 10892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFrameInfo->freqRes[i] = 0; 10902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 10932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 1: 10942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 2: 10952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project temp = FDKreadBits (hBs, 2); /* A [2 bits] */ 10962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project n = FDKreadBits (hBs, 2); /* n = N [2 bits] */ 10982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nEnv = n + 1; /* # envelopes */ 11002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project b = nEnv + 1; /* # borders */ 11012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 11032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch (frameClass) { 11062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 1: 11072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Decode borders: */ 11082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFrameInfo->borders[0] = 0; /* first border */ 11092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project border = temp + numberTimeSlots; /* A -> aR */ 11102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project i = b-1; /* frame info index for last border */ 11112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFrameInfo->borders[i] = border; /* last border */ 11122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (k = 0; k < n; k++) { 11142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project temp = FDKreadBits (hBs, 2);/* R [2 bits] */ 11152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project border -= (2 * temp + 2); /* R -> r */ 11162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFrameInfo->borders[--i] = border; 11172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Decode pointer: */ 11212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pointer_bits = DFRACT_BITS - 1 - CountLeadingBits((FIXP_DBL)(n+1)); 11222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project p = FDKreadBits (hBs, pointer_bits); /* p = P [pointer_bits bits] */ 11232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (p > n+1) 11252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 11262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFrameInfo->tranEnv = p ? n + 2 - p : -1; 11282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Decode freq res: */ 11312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (k = n; k >= 0; k--) { 11322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFrameInfo->freqRes[k] = FDKreadBits (hBs, 1); /* f = F [1 bits] */ 11332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Calculate noise floor middle border: */ 11372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (p == 0 || p == 1) 11382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFrameInfo->bordersNoise[1] = pFrameInfo->borders[n]; 11392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else 11402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFrameInfo->bordersNoise[1] = pFrameInfo->borders[pFrameInfo->tranEnv]; 11412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 11432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 2: 11452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Decode borders: */ 11462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project border = temp; /* A -> aL */ 11472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFrameInfo->borders[0] = border; /* first border */ 11482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (k = 1; k <= n; k++) { 11502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project temp = FDKreadBits (hBs, 2);/* R [2 bits] */ 11512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project border += (2 * temp + 2); /* R -> r */ 11522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFrameInfo->borders[k] = border; 11532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFrameInfo->borders[k] = numberTimeSlots; /* last border */ 11552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Decode pointer: */ 11582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pointer_bits = DFRACT_BITS - 1 - CountLeadingBits((FIXP_DBL)(n+1)); 11592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project p = FDKreadBits (hBs, pointer_bits); /* p = P [pointer_bits bits] */ 11602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (p > n+1) 11612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 11622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (p == 0 || p == 1) 11642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFrameInfo->tranEnv = -1; 11652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else 11662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFrameInfo->tranEnv = p - 1; 11672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Decode freq res: */ 11712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (k = 0; k <= n; k++) { 11722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFrameInfo->freqRes[k] = FDKreadBits(hBs, 1); /* f = F [1 bits] */ 11732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Calculate noise floor middle border: */ 11782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch (p) { 11792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 0: 11802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFrameInfo->bordersNoise[1] = pFrameInfo->borders[1]; 11812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 11822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 1: 11832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFrameInfo->bordersNoise[1] = pFrameInfo->borders[n]; 11842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 11852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 11862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFrameInfo->bordersNoise[1] = pFrameInfo->borders[pFrameInfo->tranEnv]; 11872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 11882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 11912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 3: 11932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* v_ctrlSignal = [frameClass,aL,aR,nL,nR,v_rL,v_rR,p,v_fLR]; */ 11942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project aL = FDKreadBits (hBs, 2); /* AL [2 bits], AL -> aL */ 11962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project aR = FDKreadBits (hBs, 2) + numberTimeSlots; /* AR [2 bits], AR -> aR */ 11982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nL = FDKreadBits (hBs, 2); /* nL = NL [2 bits] */ 12002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nR = FDKreadBits (hBs, 2); /* nR = NR [2 bits] */ 12022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /*------------------------------------------------------------------------- 12062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Calculate help variables 12072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project --------------------------------------------------------------------------*/ 12082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* general: */ 12102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nEnv = nL + nR + 1; /* # envelopes */ 12112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (nEnv > MAX_ENVELOPES) 12122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 12132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project b = nEnv + 1; /* # borders */ 12142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /*------------------------------------------------------------------------- 12182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Decode envelopes 12192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project --------------------------------------------------------------------------*/ 12202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* L-borders: */ 12232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project border = aL; /* first border */ 12242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFrameInfo->borders[0] = border; 12252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (k = 1; k <= nL; k++) { 12272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project temp = FDKreadBits (hBs, 2);/* R [2 bits] */ 12282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project border += (2 * temp + 2); /* R -> r */ 12292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFrameInfo->borders[k] = border; 12302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* R-borders: */ 12342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project border = aR; /* last border */ 12352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project i = nEnv; 12362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFrameInfo->borders[i] = border; 12382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (k = 0; k < nR; k++) { 12402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project temp = FDKreadBits (hBs, 2);/* R [2 bits] */ 12412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project border -= (2 * temp + 2); /* R -> r */ 12422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFrameInfo->borders[--i] = border; 12432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* decode pointer: */ 12472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pointer_bits = DFRACT_BITS - 1 - CountLeadingBits((FIXP_DBL)(nL+nR+1)); 12482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project p = FDKreadBits (hBs, pointer_bits); /* p = P [pointer_bits bits] */ 12492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (p > nL+nR+1) 12512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 12522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFrameInfo->tranEnv = p ? b - p : -1; 12542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* decode freq res: */ 12582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (k = 0; k < nEnv; k++) { 12592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFrameInfo->freqRes[k] = FDKreadBits(hBs, 1); /* f = F [1 bits] */ 12602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /*------------------------------------------------------------------------- 12652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Decode noise floors 12662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project --------------------------------------------------------------------------*/ 12672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFrameInfo->bordersNoise[0] = aL; 12682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (nEnv == 1) { 12702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 1 noise floor envelope: */ 12712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFrameInfo->bordersNoise[1] = aR; 12722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 12742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 2 noise floor envelopes */ 12752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (p == 0 || p == 1) 12762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFrameInfo->bordersNoise[1] = pFrameInfo->borders[nEnv - 1]; 12772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else 12782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFrameInfo->bordersNoise[1] = pFrameInfo->borders[pFrameInfo->tranEnv]; 12792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFrameInfo->bordersNoise[2] = aR; 12802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 12822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 12862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Store number of envelopes, noise floor envelopes and frame class 12872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 12882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFrameInfo->nEnvelopes = nEnv; 12892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (nEnv == 1) 12912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFrameInfo->nNoiseEnvelopes = 1; 12922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else 12932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFrameInfo->nNoiseEnvelopes = 2; 12942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFrameInfo->frameClass = frameClass; 12962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (pFrameInfo->frameClass == 2 || pFrameInfo->frameClass == 1) { 12982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* calculate noise floor first and last borders: */ 12992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFrameInfo->bordersNoise[0] = pFrameInfo->borders[0]; 13002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFrameInfo->bordersNoise[pFrameInfo->nNoiseEnvelopes] = pFrameInfo->borders[nEnv]; 13012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 1; 13052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 13062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 13092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Check if the frameInfo vector has reasonable values. 13102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return Zero for error, one for correct 13112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 13122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic int 13132228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectcheckFrameInfo (FRAME_INFO * pFrameInfo, /*!< pointer to frameInfo */ 13142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int numberOfTimeSlots, /*!< QMF time slots per frame */ 13152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int overlap, /*!< Amount of overlap QMF time slots */ 13162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int timeStep) /*!< QMF slots to SBR slots step factor */ 13172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 13182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int maxPos,i,j; 13192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int startPos; 13202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int stopPos; 13212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int tranEnv; 13222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int startPosNoise; 13232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int stopPosNoise; 13242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int nEnvelopes = pFrameInfo->nEnvelopes; 13252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int nNoiseEnvelopes = pFrameInfo->nNoiseEnvelopes; 13262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(nEnvelopes < 1 || nEnvelopes > MAX_ENVELOPES) 13282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 13292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(nNoiseEnvelopes > MAX_NOISE_ENVELOPES) 13312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 13322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project startPos = pFrameInfo->borders[0]; 13342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project stopPos = pFrameInfo->borders[nEnvelopes]; 13352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tranEnv = pFrameInfo->tranEnv; 13362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project startPosNoise = pFrameInfo->bordersNoise[0]; 13372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project stopPosNoise = pFrameInfo->bordersNoise[nNoiseEnvelopes]; 13382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (overlap < 0 || overlap > (6)) { 13402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 13412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (timeStep < 1 || timeStep > 2) { 13432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 13442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project maxPos = numberOfTimeSlots + (overlap/timeStep); 13462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Check that the start and stop positions of the frame are reasonable values. */ 13482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if( (startPos < 0) || (startPos >= stopPos) ) 13492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 13502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if( startPos > maxPos-numberOfTimeSlots ) /* First env. must start in or directly after the overlap buffer */ 13512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 13522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if( stopPos < numberOfTimeSlots ) /* One complete frame must be ready for output after processing */ 13532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 13542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(stopPos > maxPos) 13552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 13562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Check that the start border for every envelope is strictly later in time */ 13582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(i=0;i<nEnvelopes;i++) { 13592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(pFrameInfo->borders[i] >= pFrameInfo->borders[i+1]) 13602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 13612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Check that the envelope to be shortened is actually among the envelopes */ 13642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(tranEnv>nEnvelopes) 13652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 13662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Check the noise borders */ 13692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(nEnvelopes==1 && nNoiseEnvelopes>1) 13702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 13712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(startPos != startPosNoise || stopPos != stopPosNoise) 13732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 13742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Check that the start border for every noise-envelope is strictly later in time*/ 13772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(i=0; i<nNoiseEnvelopes; i++) { 13782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(pFrameInfo->bordersNoise[i] >= pFrameInfo->bordersNoise[i+1]) 13792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 13802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Check that every noise border is the same as an envelope border*/ 13832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(i=0; i<nNoiseEnvelopes; i++) { 13842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project startPosNoise = pFrameInfo->bordersNoise[i]; 13852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(j=0; j<nEnvelopes; j++) { 13872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(pFrameInfo->borders[j] == startPosNoise) 13882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 13892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(j==nEnvelopes) 13912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 13922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 1; 13952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 1396