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