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  parametric stereo decoder
872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/
882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "psdec.h"
902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "FDK_bitbuffer.h"
942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "psdec_hybrid.h"
952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "sbr_rom.h"
972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "sbr_ram.h"
982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "FDK_tools_rom.h"
1002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "genericStds.h"
1022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "FDK_trigFcts.h"
1042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/********************************************************************/
1072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*                       MLQUAL DEFINES                             */
1082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/********************************************************************/
1092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  #define FRACT_ZERO FRACT_BITS-1
1112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/********************************************************************/
1122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1132228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectSBR_ERROR ResetPsDec( HANDLE_PS_DEC h_ps_d );
1142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid ResetPsDeCor( HANDLE_PS_DEC h_ps_d );
1162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/***** HELPERS *****/
1192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void assignTimeSlotsPS (FIXP_DBL *bufAdr, FIXP_DBL **bufPtr, const int numSlots, const int numChan);
1212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*******************/
1252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define DIV3 FL2FXCONST_DBL(1.f/3.f)     /* division 3.0 */
1272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define DIV1_5 FL2FXCONST_DBL(2.f/3.f)   /* division 1.5 */
1282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/***************************************************************************/
1302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
1312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief  Creates one instance of the PS_DEC struct
1322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \return Error info
1342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project****************************************************************************/
1362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectint
1372228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectCreatePsDec( HANDLE_PS_DEC *h_PS_DEC,   /*!< pointer to the module state */
1382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             int aacSamplesPerFrame
1392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           )
1402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
1412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  SBR_ERROR errorInfo = SBRDEC_OK;
1422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  HANDLE_PS_DEC  h_ps_d;
1432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int i;
1442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (*h_PS_DEC == NULL) {
1462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Get ps dec ram */
1472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    h_ps_d = GetRam_ps_dec();
1482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (h_ps_d == NULL) {
1492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      errorInfo = SBRDEC_MEM_ALLOC_FAILED;
1502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      goto bail;
1512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
1522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  } else {
1532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Reset an open instance */
1542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    h_ps_d = *h_PS_DEC;
1552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
1562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* initialisation */
1582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  switch (aacSamplesPerFrame) {
1592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case 960:
1602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    h_ps_d->noSubSamples = 30;              /* col */
1612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
1622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case 1024:
1632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    h_ps_d->noSubSamples = 32;              /* col */
1642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
1652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  default:
1662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    h_ps_d->noSubSamples = -1;
1672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
1682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
1692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (h_ps_d->noSubSamples >  MAX_NUM_COL
1712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   || h_ps_d->noSubSamples <= 0)
1722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
1732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    goto bail;
1742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
1752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  h_ps_d->noChannels   = NO_QMF_CHANNELS;   /* row */
1762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  h_ps_d->psDecodedPrv   =  0;
1782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  h_ps_d->procFrameBased = -1;
1792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (i = 0; i < (1)+1; i++) {
1802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    h_ps_d->bPsDataAvail[i]  =  ppt_none;
1812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
1822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (i = 0; i < (1)+1; i++) {
1852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKmemclear(&h_ps_d->bsData[i].mpeg, sizeof(MPEG_PS_BS_DATA));
1862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
1872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  errorInfo = ResetPsDec( h_ps_d );
1892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( errorInfo != SBRDEC_OK )
1912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    goto bail;
1922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  ResetPsDeCor( h_ps_d );
1942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  *h_PS_DEC = h_ps_d;
1962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return 0;
2002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail:
2022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  DeletePsDec(&h_ps_d);
2032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return -1;
2052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} /*END CreatePsDec */
2062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/***************************************************************************/
2082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
2092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief  Delete one instance of the PS_DEC struct
2102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \return Error info
2122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project****************************************************************************/
2142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectint
2152228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectDeletePsDec( HANDLE_PS_DEC *h_PS_DEC)  /*!< pointer to the module state */
2162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
2172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (*h_PS_DEC == NULL) {
2182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return -1;
2192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
2202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FreeRam_ps_dec(h_PS_DEC);
2232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return 0;
2262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} /*END DeletePsDec */
2272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/***************************************************************************/
2292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
2302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief resets some values of the PS handle to default states
2312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \return
2332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project****************************************************************************/
2352228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectSBR_ERROR ResetPsDec( HANDLE_PS_DEC h_ps_d )  /*!< pointer to the module state */
2362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
2372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  SBR_ERROR errorInfo = SBRDEC_OK;
2382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT i;
2392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  const UCHAR noQmfBandsInHybrid20 = 3;
2412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* const UCHAR noQmfBandsInHybrid34 = 5; */
2422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  const UCHAR aHybridResolution20[] = { HYBRID_8_CPLX,
2442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                        HYBRID_2_REAL,
2452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                        HYBRID_2_REAL };
2462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  h_ps_d->specificTo.mpeg.delayBufIndex   = 0;
2482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* explicitly init state variables to safe values (until first ps header arrives) */
2502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  h_ps_d->specificTo.mpeg.lastUsb        =  0;
2522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  h_ps_d->specificTo.mpeg.scaleFactorPsDelayBuffer = -(DFRACT_BITS-1);
2542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKmemclear(h_ps_d->specificTo.mpeg.aDelayBufIndexDelayQmf, (NO_QMF_CHANNELS-FIRST_DELAY_SB)*sizeof(UCHAR));
2562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  h_ps_d->specificTo.mpeg.noSampleDelay = delayIndexQmf[0];
2572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (i=0 ; i < NO_SERIAL_ALLPASS_LINKS; i++) {
2592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    h_ps_d->specificTo.mpeg.aDelayRBufIndexSer[i] = 0;
2602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
2612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  h_ps_d->specificTo.mpeg.pAaRealDelayBufferQmf[0] = h_ps_d->specificTo.mpeg.aaQmfDelayBufReal;
2632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  assignTimeSlotsPS ( h_ps_d->specificTo.mpeg.pAaRealDelayBufferQmf[0] + (NO_QMF_CHANNELS-FIRST_DELAY_SB),
2652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     &h_ps_d->specificTo.mpeg.pAaRealDelayBufferQmf[1],
2662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      h_ps_d->specificTo.mpeg.noSampleDelay-1,
2672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      (NO_DELAY_BUFFER_BANDS-FIRST_DELAY_SB));
2682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  h_ps_d->specificTo.mpeg.pAaImagDelayBufferQmf[0] = h_ps_d->specificTo.mpeg.aaQmfDelayBufImag;
2702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  assignTimeSlotsPS ( h_ps_d->specificTo.mpeg.pAaImagDelayBufferQmf[0] + (NO_QMF_CHANNELS-FIRST_DELAY_SB),
2722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     &h_ps_d->specificTo.mpeg.pAaImagDelayBufferQmf[1],
2732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      h_ps_d->specificTo.mpeg.noSampleDelay-1,
2742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      (NO_DELAY_BUFFER_BANDS-FIRST_DELAY_SB));
2752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Hybrid Filter Bank 1 creation. */
2772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  errorInfo = InitHybridFilterBank ( &h_ps_d->specificTo.mpeg.hybrid,
2782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      h_ps_d->noSubSamples,
2792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      noQmfBandsInHybrid20,
2802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      aHybridResolution20 );
2812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for ( i = 0; i < NO_IID_GROUPS; i++ )
2832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
2842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    h_ps_d->specificTo.mpeg.h11rPrev[i] = FL2FXCONST_DBL(0.5f);
2852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    h_ps_d->specificTo.mpeg.h12rPrev[i] = FL2FXCONST_DBL(0.5f);
2862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
2872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKmemclear( h_ps_d->specificTo.mpeg.h21rPrev, sizeof( h_ps_d->specificTo.mpeg.h21rPrev ) );
2892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKmemclear( h_ps_d->specificTo.mpeg.h22rPrev, sizeof( h_ps_d->specificTo.mpeg.h22rPrev ) );
2902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return errorInfo;
2922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
2932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/***************************************************************************/
2952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
2962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief  clear some buffers used in decorrelation process
2972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \return
2992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project****************************************************************************/
3012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid ResetPsDeCor( HANDLE_PS_DEC h_ps_d )  /*!< pointer to the module state */
3022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
3032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT i;
3042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKmemclear(h_ps_d->specificTo.mpeg.aPeakDecayFastBin, NO_MID_RES_BINS*sizeof(FIXP_DBL));
3062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKmemclear(h_ps_d->specificTo.mpeg.aPrevNrgBin, NO_MID_RES_BINS*sizeof(FIXP_DBL));
3072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKmemclear(h_ps_d->specificTo.mpeg.aPrevPeakDiffBin, NO_MID_RES_BINS*sizeof(FIXP_DBL));
3082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKmemclear(h_ps_d->specificTo.mpeg.aPowerPrevScal, NO_MID_RES_BINS*sizeof(SCHAR));
3092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (i=0 ; i < FIRST_DELAY_SB ; i++) {
3112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKmemclear(h_ps_d->specificTo.mpeg.aaaRealDelayRBufferSerQmf[i], NO_DELAY_LENGTH_VECTORS*sizeof(FIXP_DBL));
3122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKmemclear(h_ps_d->specificTo.mpeg.aaaImagDelayRBufferSerQmf[i], NO_DELAY_LENGTH_VECTORS*sizeof(FIXP_DBL));
3132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (i=0 ; i < NO_SUB_QMF_CHANNELS ; i++) {
3152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKmemclear(h_ps_d->specificTo.mpeg.aaaRealDelayRBufferSerSubQmf[i], NO_DELAY_LENGTH_VECTORS*sizeof(FIXP_DBL));
3162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKmemclear(h_ps_d->specificTo.mpeg.aaaImagDelayRBufferSerSubQmf[i], NO_DELAY_LENGTH_VECTORS*sizeof(FIXP_DBL));
3172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
3202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*******************************************************************************/
3222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* slot based funcion prototypes */
3242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void deCorrelateSlotBased( HANDLE_PS_DEC h_ps_d,
3262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  FIXP_DBL    *mHybridRealLeft,
3282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  FIXP_DBL    *mHybridImagLeft,
3292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  SCHAR        sf_mHybridLeft,
3302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  FIXP_DBL    *rIntBufferLeft,
3322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  FIXP_DBL    *iIntBufferLeft,
3332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  SCHAR        sf_IntBuffer,
3342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  FIXP_DBL    *mHybridRealRight,
3362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  FIXP_DBL    *mHybridImagRight,
3372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  FIXP_DBL    *rIntBufferRight,
3392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  FIXP_DBL    *iIntBufferRight );
3402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void applySlotBasedRotation( HANDLE_PS_DEC h_ps_d,
3422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    FIXP_DBL  *mHybridRealLeft,
3442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    FIXP_DBL  *mHybridImagLeft,
3452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    FIXP_DBL  *QmfLeftReal,
3472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    FIXP_DBL  *QmfLeftImag,
3482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    FIXP_DBL  *mHybridRealRight,
3502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    FIXP_DBL  *mHybridImagRight,
3512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    FIXP_DBL  *QmfRightReal,
3532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    FIXP_DBL  *QmfRightImag
3542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  );
3552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/***************************************************************************/
3582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
3592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief  Get scale factor for all ps delay buffer.
3602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \return
3622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project****************************************************************************/
3642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic
3652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectint getScaleFactorPsStatesBuffer(HANDLE_PS_DEC   h_ps_d)
3662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
3672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT i;
3682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int scale = DFRACT_BITS-1;
3692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (i=0; i<NO_QMF_BANDS_HYBRID20; i++) {
3712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    scale = fMin(scale, getScalefactor(h_ps_d->specificTo.mpeg.hybrid.mQmfBufferRealSlot[i], NO_SUB_QMF_CHANNELS));
3722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    scale = fMin(scale, getScalefactor(h_ps_d->specificTo.mpeg.hybrid.mQmfBufferImagSlot[i], NO_SUB_QMF_CHANNELS));
3732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (i=0; i<NO_SAMPLE_DELAY_ALLPASS; i++) {
3762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    scale = fMin(scale, getScalefactor(h_ps_d->specificTo.mpeg.aaRealDelayBufferQmf[i], FIRST_DELAY_SB));
3772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    scale = fMin(scale, getScalefactor(h_ps_d->specificTo.mpeg.aaImagDelayBufferQmf[i], FIRST_DELAY_SB));
3782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (i=0; i<NO_SAMPLE_DELAY_ALLPASS; i++) {
3812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    scale = fMin(scale, getScalefactor(h_ps_d->specificTo.mpeg.aaRealDelayBufferSubQmf[i], NO_SUB_QMF_CHANNELS));
3822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    scale = fMin(scale, getScalefactor(h_ps_d->specificTo.mpeg.aaImagDelayBufferSubQmf[i], NO_SUB_QMF_CHANNELS));
3832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (i=0; i<FIRST_DELAY_SB; i++) {
3862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    scale = fMin(scale, getScalefactor(h_ps_d->specificTo.mpeg.aaaRealDelayRBufferSerQmf[i], NO_DELAY_LENGTH_VECTORS));
3872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    scale = fMin(scale, getScalefactor(h_ps_d->specificTo.mpeg.aaaImagDelayRBufferSerQmf[i], NO_DELAY_LENGTH_VECTORS));
3882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (i=0; i<NO_SUB_QMF_CHANNELS; i++) {
3912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    scale = fMin(scale, getScalefactor(h_ps_d->specificTo.mpeg.aaaRealDelayRBufferSerSubQmf[i], NO_DELAY_LENGTH_VECTORS));
3922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    scale = fMin(scale, getScalefactor(h_ps_d->specificTo.mpeg.aaaImagDelayRBufferSerSubQmf[i], NO_DELAY_LENGTH_VECTORS));
3932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (i=0; i<MAX_DELAY_BUFFER_SIZE; i++)
3962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
3972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT len;
3982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (i==0)
3992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      len = NO_QMF_CHANNELS-FIRST_DELAY_SB;
4002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else
4012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      len = NO_DELAY_BUFFER_BANDS-FIRST_DELAY_SB;
4022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    scale = fMin(scale, getScalefactor(h_ps_d->specificTo.mpeg.pAaRealDelayBufferQmf[i], len));
4042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    scale = fMin(scale, getScalefactor(h_ps_d->specificTo.mpeg.pAaImagDelayBufferQmf[i], len));
4052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return (scale);
4082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
4092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/***************************************************************************/
4112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
4122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief  Rescale all ps delay buffer.
4132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \return
4152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project****************************************************************************/
4172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic
4182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid scalePsStatesBuffer(HANDLE_PS_DEC h_ps_d,
4192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         int           scale)
4202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
4212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT i;
4222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (scale < 0)
4242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    scale = fixMax((INT)scale,(INT)-(DFRACT_BITS-1));
4252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  else
4262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    scale = fixMin((INT)scale,(INT)DFRACT_BITS-1);
4272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (i=0; i<NO_QMF_BANDS_HYBRID20; i++) {
4292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    scaleValues( h_ps_d->specificTo.mpeg.hybrid.mQmfBufferRealSlot[i], NO_SUB_QMF_CHANNELS, scale );
4302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    scaleValues( h_ps_d->specificTo.mpeg.hybrid.mQmfBufferImagSlot[i], NO_SUB_QMF_CHANNELS, scale );
4312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (i=0; i<NO_SAMPLE_DELAY_ALLPASS; i++) {
4342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    scaleValues( h_ps_d->specificTo.mpeg.aaRealDelayBufferQmf[i], FIRST_DELAY_SB, scale );
4352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    scaleValues( h_ps_d->specificTo.mpeg.aaImagDelayBufferQmf[i], FIRST_DELAY_SB, scale );
4362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (i=0; i<NO_SAMPLE_DELAY_ALLPASS; i++) {
4392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    scaleValues( h_ps_d->specificTo.mpeg.aaRealDelayBufferSubQmf[i], NO_SUB_QMF_CHANNELS, scale );
4402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    scaleValues( h_ps_d->specificTo.mpeg.aaImagDelayBufferSubQmf[i], NO_SUB_QMF_CHANNELS, scale );
4412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (i=0; i<FIRST_DELAY_SB; i++) {
4442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    scaleValues( h_ps_d->specificTo.mpeg.aaaRealDelayRBufferSerQmf[i], NO_DELAY_LENGTH_VECTORS, scale );
4452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    scaleValues( h_ps_d->specificTo.mpeg.aaaImagDelayRBufferSerQmf[i], NO_DELAY_LENGTH_VECTORS, scale );
4462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (i=0; i<NO_SUB_QMF_CHANNELS; i++) {
4492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    scaleValues( h_ps_d->specificTo.mpeg.aaaRealDelayRBufferSerSubQmf[i], NO_DELAY_LENGTH_VECTORS, scale );
4502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    scaleValues( h_ps_d->specificTo.mpeg.aaaImagDelayRBufferSerSubQmf[i], NO_DELAY_LENGTH_VECTORS, scale );
4512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (i=0; i<MAX_DELAY_BUFFER_SIZE; i++) {
4542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT len;
4552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (i==0)
4562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      len = NO_QMF_CHANNELS-FIRST_DELAY_SB;
4572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else
4582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      len = NO_DELAY_BUFFER_BANDS-FIRST_DELAY_SB;
4592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    scaleValues( h_ps_d->specificTo.mpeg.pAaRealDelayBufferQmf[i], len, scale );
4612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    scaleValues( h_ps_d->specificTo.mpeg.pAaImagDelayBufferQmf[i], len, scale );
4622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  scale <<= 1;
4652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  scaleValues( h_ps_d->specificTo.mpeg.aPeakDecayFastBin, NO_MID_RES_BINS, scale );
4672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  scaleValues( h_ps_d->specificTo.mpeg.aPrevPeakDiffBin, NO_MID_RES_BINS, scale );
4682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  scaleValues( h_ps_d->specificTo.mpeg.aPrevNrgBin, NO_MID_RES_BINS, scale );
4692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
4702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/***************************************************************************/
4722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
4732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief  Scale input channel to the same scalefactor and rescale hybrid
4742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          filterbank values
4752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \return
4772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project****************************************************************************/
4792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid scalFilterBankValues( HANDLE_PS_DEC   h_ps_d,
4812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           FIXP_DBL      **fixpQmfReal,
4822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           FIXP_DBL      **fixpQmfImag,
4832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           int             lsb,
4842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           int             scaleFactorLowBandSplitLow,
4852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           int             scaleFactorLowBandSplitHigh,
4862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           SCHAR          *scaleFactorLowBand_lb,
4872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           SCHAR          *scaleFactorLowBand_hb,
4882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           int             scaleFactorHighBands,
4892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           INT            *scaleFactorHighBand,
4902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           INT             noCols
4912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         )
4922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
4932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT maxScal;
4942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT i;
4962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  scaleFactorHighBands        =  -scaleFactorHighBands;
4982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  scaleFactorLowBandSplitLow  =  -scaleFactorLowBandSplitLow;
4992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  scaleFactorLowBandSplitHigh =  -scaleFactorLowBandSplitHigh;
5002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* get max scale factor */
5022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  maxScal = fixMax(scaleFactorHighBands,fixMax(scaleFactorLowBandSplitLow, scaleFactorLowBandSplitHigh ));
5032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
5052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int headroom  = getScaleFactorPsStatesBuffer(h_ps_d);
5062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    maxScal   = fixMax(maxScal,(INT)(h_ps_d->specificTo.mpeg.scaleFactorPsDelayBuffer-headroom));
5072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    maxScal  += 1;
5082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
5092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* scale whole left channel to the same scale factor */
5112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* low band ( overlap buffer ) */
5132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( maxScal != scaleFactorLowBandSplitLow ) {
5142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT scale = scaleFactorLowBandSplitLow - maxScal;
5152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for ( i=0; i<(6); i++ ) {
5162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      scaleValues( fixpQmfReal[i], lsb, scale );
5172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      scaleValues( fixpQmfImag[i], lsb, scale );
5182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
5192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
5202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* low band ( current frame ) */
5212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( maxScal != scaleFactorLowBandSplitHigh ) {
5222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT scale = scaleFactorLowBandSplitHigh - maxScal;
5232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* for ( i=(6); i<(6)+MAX_NUM_COL; i++ ) { */
5242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for ( i=(6); i<(6)+noCols; i++ ) {
5252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      scaleValues( fixpQmfReal[i], lsb, scale );
5262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      scaleValues( fixpQmfImag[i], lsb, scale );
5272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
5282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
5292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* high band */
5302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( maxScal != scaleFactorHighBands ) {
5312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT scale = scaleFactorHighBands - maxScal;
5322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* for ( i=0; i<MAX_NUM_COL; i++ ) { */
5332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for ( i=0; i<noCols; i++ ) {
5342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      scaleValues( &fixpQmfReal[i][lsb], (64)-lsb, scale );
5352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      scaleValues( &fixpQmfImag[i][lsb], (64)-lsb, scale );
5362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
5372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
5382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( maxScal != h_ps_d->specificTo.mpeg.scaleFactorPsDelayBuffer )
5402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    scalePsStatesBuffer(h_ps_d,(h_ps_d->specificTo.mpeg.scaleFactorPsDelayBuffer-maxScal));
5412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  h_ps_d->specificTo.mpeg.hybrid.sf_mQmfBuffer = maxScal;
5432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  h_ps_d->specificTo.mpeg.scaleFactorPsDelayBuffer = maxScal;
5442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  *scaleFactorHighBand += maxScal - scaleFactorHighBands;
5462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  h_ps_d->rescal = maxScal - scaleFactorLowBandSplitHigh;
5482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  h_ps_d->sf_IntBuffer = maxScal;
5492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  *scaleFactorLowBand_lb += maxScal - scaleFactorLowBandSplitLow;
5512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  *scaleFactorLowBand_hb += maxScal - scaleFactorLowBandSplitHigh;
5522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
5532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid rescalFilterBankValues( HANDLE_PS_DEC   h_ps_d,                      /* parametric stereo decoder handle     */
5552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             FIXP_DBL      **QmfBufferReal,               /* qmf filterbank values                */
5562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             FIXP_DBL      **QmfBufferImag,               /* qmf filterbank values                */
5572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             int             lsb,                         /* sbr start subband                    */
5582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             INT             noCols)
5592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
5602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int i;
5612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* scale back 6 timeslots look ahead for hybrid filterbank to original value */
5622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for ( i=noCols; i<noCols + (6); i++ ) {
5632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    scaleValues( QmfBufferReal[i], lsb, h_ps_d->rescal );
5642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    scaleValues( QmfBufferImag[i], lsb, h_ps_d->rescal );
5652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
5662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
5672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/***************************************************************************/
5692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
5702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief  Generate decorrelated side channel using allpass/delay
5712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \return
5732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project****************************************************************************/
5752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void
5762228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectdeCorrelateSlotBased( HANDLE_PS_DEC h_ps_d,            /*!< pointer to the module state */
5772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      FIXP_DBL    *mHybridRealLeft,    /*!< left (mono) hybrid values real */
5792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      FIXP_DBL    *mHybridImagLeft,    /*!< left (mono) hybrid values imag */
5802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      SCHAR        sf_mHybridLeft,     /*!< scalefactor for left (mono) hybrid bands */
5812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      FIXP_DBL    *rIntBufferLeft,     /*!< real qmf bands left (mono) (38x64) */
5832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      FIXP_DBL    *iIntBufferLeft,     /*!< real qmf bands left (mono) (38x64) */
5842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      SCHAR        sf_IntBuffer,       /*!< scalefactor for all left and right qmf bands   */
5852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      FIXP_DBL    *mHybridRealRight,   /*!< right (decorrelated) hybrid values real */
5872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      FIXP_DBL    *mHybridImagRight,   /*!< right (decorrelated) hybrid values imag */
5882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      FIXP_DBL    *rIntBufferRight,    /*!< real qmf bands right (decorrelated) (38x64) */
5902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      FIXP_DBL    *iIntBufferRight )   /*!< real qmf bands right (decorrelated) (38x64) */
5912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
5922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT  i, m, sb, gr, bin;
5942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL peakDiff, nrg, transRatio;
5962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL *RESTRICT aaLeftReal;
5982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL *RESTRICT aaLeftImag;
5992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL *RESTRICT aaRightReal;
6012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL *RESTRICT aaRightImag;
6022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL *RESTRICT pRealDelayBuffer;
6042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL *RESTRICT pImagDelayBuffer;
6052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  C_ALLOC_SCRATCH_START(aaPowerSlot, FIXP_DBL, NO_MID_RES_BINS);
6072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  C_ALLOC_SCRATCH_START(aaTransRatioSlot, FIXP_DBL, NO_MID_RES_BINS);
6082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
6102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project<pre>
6112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   parameter index       qmf bands             hybrid bands
6122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  ----------------------------------------------------------------------------
6132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         0                   0                      0,7
6142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         1                   0                      1,6
6152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         2                   0                      2
6162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         3                   0                      3           HYBRID BANDS
6172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         4                   1                      9
6182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         5                   1                      8
6192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         6                   2                     10
6202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         7                   2                     11
6212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  ----------------------------------------------------------------------------
6222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         8                   3
6232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         9                   4
6242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        10                   5
6252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        11                   6
6262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        12                   7
6272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        13                   8
6282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        14                   9,10      (2 )                      QMF BANDS
6292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        15                   11 - 13   (3 )
6302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        16                   14 - 17   (4 )
6312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        17                   18 - 22   (5 )
6322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        18                   23 - 34   (12)
6332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        19                   35 - 63   (29)
6342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  ----------------------------------------------------------------------------
6352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project</pre>
6362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/
6372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  #define FLTR_SCALE 3
6392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* hybrid bands (parameter index 0 - 7) */
6412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  aaLeftReal  = mHybridRealLeft;
6422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  aaLeftImag  = mHybridImagLeft;
6432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  aaPowerSlot[0] = ( fMultAddDiv2( fMultDiv2(aaLeftReal[0],  aaLeftReal[0]),  aaLeftImag[0],  aaLeftImag[0] ) >> FLTR_SCALE ) +
6452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   ( fMultAddDiv2( fMultDiv2(aaLeftReal[7],  aaLeftReal[7]),  aaLeftImag[7],  aaLeftImag[7] ) >> FLTR_SCALE );
6462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  aaPowerSlot[1] = ( fMultAddDiv2( fMultDiv2(aaLeftReal[1],  aaLeftReal[1]),  aaLeftImag[1],  aaLeftImag[1] ) >> FLTR_SCALE ) +
6482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   ( fMultAddDiv2( fMultDiv2(aaLeftReal[6],  aaLeftReal[6]),  aaLeftImag[6],  aaLeftImag[6] ) >> FLTR_SCALE );
6492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  aaPowerSlot[2] =   fMultAddDiv2( fMultDiv2(aaLeftReal[2],  aaLeftReal[2]),  aaLeftImag[2],  aaLeftImag[2] ) >> FLTR_SCALE;
6512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  aaPowerSlot[3] =   fMultAddDiv2( fMultDiv2(aaLeftReal[3],  aaLeftReal[3]),  aaLeftImag[3],  aaLeftImag[3] ) >> FLTR_SCALE;
6522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  aaPowerSlot[4] =   fMultAddDiv2( fMultDiv2(aaLeftReal[9],  aaLeftReal[9]),  aaLeftImag[9],  aaLeftImag[9] ) >> FLTR_SCALE;
6542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  aaPowerSlot[5] =   fMultAddDiv2( fMultDiv2(aaLeftReal[8],  aaLeftReal[8]),  aaLeftImag[8],  aaLeftImag[8] ) >> FLTR_SCALE;
6552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  aaPowerSlot[6] =   fMultAddDiv2( fMultDiv2(aaLeftReal[10], aaLeftReal[10]), aaLeftImag[10], aaLeftImag[10] ) >> FLTR_SCALE;
6572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  aaPowerSlot[7] =   fMultAddDiv2( fMultDiv2(aaLeftReal[11], aaLeftReal[11]), aaLeftImag[11], aaLeftImag[11] ) >> FLTR_SCALE;
6582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* qmf bands (parameter index 8 - 19) */
6602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for ( bin = 8; bin < NO_MID_RES_BINS; bin++ ) {
6612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL slotNrg = FL2FXCONST_DBL(0.f);
6622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for ( i = groupBorders20[bin+2]; i < groupBorders20[bin+3]; i++ ) {  /* max loops: 29 */
6642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      slotNrg += fMultAddDiv2 ( fMultDiv2(rIntBufferLeft[i], rIntBufferLeft[i]), iIntBufferLeft[i], iIntBufferLeft[i]) >> FLTR_SCALE;
6652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
6662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    aaPowerSlot[bin] = slotNrg;
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  /* calculation of transient ratio */
6722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (bin=0; bin < NO_MID_RES_BINS; bin++) {   /* noBins = 20 ( BASELINE_PS ) */
6732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    h_ps_d->specificTo.mpeg.aPeakDecayFastBin[bin] = fMult( h_ps_d->specificTo.mpeg.aPeakDecayFastBin[bin], PEAK_DECAY_FACTOR );
6752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (h_ps_d->specificTo.mpeg.aPeakDecayFastBin[bin] < aaPowerSlot[bin]) {
6772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      h_ps_d->specificTo.mpeg.aPeakDecayFastBin[bin] = aaPowerSlot[bin];
6782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
6792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* calculate PSmoothPeakDecayDiffNrg */
6812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    peakDiff = fMultAdd ( (h_ps_d->specificTo.mpeg.aPrevPeakDiffBin[bin]>>1),
6822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 INT_FILTER_COEFF, h_ps_d->specificTo.mpeg.aPeakDecayFastBin[bin] - aaPowerSlot[bin] - h_ps_d->specificTo.mpeg.aPrevPeakDiffBin[bin]);
6832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* save peakDiff for the next frame */
6852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    h_ps_d->specificTo.mpeg.aPrevPeakDiffBin[bin] = peakDiff;
6862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    nrg = h_ps_d->specificTo.mpeg.aPrevNrgBin[bin] + fMult( INT_FILTER_COEFF, aaPowerSlot[bin] - h_ps_d->specificTo.mpeg.aPrevNrgBin[bin] );
6882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Negative energies don't exist. But sometimes they appear due to rounding. */
6902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    nrg = fixMax(nrg,FL2FXCONST_DBL(0.f));
6922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* save nrg for the next frame */
6942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    h_ps_d->specificTo.mpeg.aPrevNrgBin[bin] = nrg;
6952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    nrg = fMult( nrg, TRANSIENT_IMPACT_FACTOR );
6972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* save transient impact factor */
6992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( peakDiff <= nrg || peakDiff == FL2FXCONST_DBL(0.0) ) {
7002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      aaTransRatioSlot[bin] = (FIXP_DBL)MAXVAL_DBL /* FL2FXCONST_DBL(1.0f)*/;
7012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else if ( nrg <= FL2FXCONST_DBL(0.0f) ) {
7032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        aaTransRatioSlot[bin] = FL2FXCONST_DBL(0.f);
7042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
7052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else {
7062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* scale to denominator */
7072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      INT scale_left = fixMax(0, CntLeadingZeros(peakDiff) - 1);
7082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      aaTransRatioSlot[bin] = schur_div( nrg<<scale_left, peakDiff<<scale_left, 16);
7092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  } /* bin */
7112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  #define DELAY_GROUP_OFFSET    20
7162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  #define NR_OF_DELAY_GROUPS     2
7172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL rTmp, iTmp, rTmp0, iTmp0, rR0, iR0;
7192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT TempDelay     = h_ps_d->specificTo.mpeg.delayBufIndex;  /* set delay indices */
7212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pRealDelayBuffer = h_ps_d->specificTo.mpeg.aaRealDelayBufferSubQmf[TempDelay];
7232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pImagDelayBuffer = h_ps_d->specificTo.mpeg.aaImagDelayBufferSubQmf[TempDelay];
7242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  aaLeftReal  = mHybridRealLeft;
7262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  aaLeftImag  = mHybridImagLeft;
7272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  aaRightReal = mHybridRealRight;
7282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  aaRightImag = mHybridImagRight;
7292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /************************/
7312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* ICC groups :  0 -  9 */
7322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /************************/
7332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* gr = ICC groups */
7352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (gr=0; gr < SUBQMF_GROUPS; gr++) {
7362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    transRatio = aaTransRatioSlot[bins2groupMap20[gr]];
7382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* sb = subQMF/QMF subband */
7402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    sb = groupBorders20[gr];
7412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Update delay buffers, sample delay allpass = 2 */
7432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    rTmp0 = pRealDelayBuffer[sb];
7442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    iTmp0 = pImagDelayBuffer[sb];
7452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pRealDelayBuffer[sb] = aaLeftReal[sb];
7472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pImagDelayBuffer[sb] = aaLeftImag[sb];
7482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* delay by fraction */
7502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    cplxMultDiv2(&rR0, &iR0, rTmp0, iTmp0, aaFractDelayPhaseFactorReSubQmf20[sb], aaFractDelayPhaseFactorImSubQmf20[sb]);
7512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    rR0<<=1;
7522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    iR0<<=1;
7532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL *pAaaRealDelayRBufferSerSubQmf = h_ps_d->specificTo.mpeg.aaaRealDelayRBufferSerSubQmf[sb];
7552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL *pAaaImagDelayRBufferSerSubQmf = h_ps_d->specificTo.mpeg.aaaImagDelayRBufferSerSubQmf[sb];
7562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (m=0; m<NO_SERIAL_ALLPASS_LINKS ; m++) {
7582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      INT tmpDelayRSer = h_ps_d->specificTo.mpeg.aDelayRBufIndexSer[m];
7602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* get delayed values from according buffer : m(0)=3; m(1)=4; m(2)=5; */
7622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      rTmp0 = pAaaRealDelayRBufferSerSubQmf[tmpDelayRSer];
7632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      iTmp0 = pAaaImagDelayRBufferSerSubQmf[tmpDelayRSer];
7642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* delay by fraction */
7662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      cplxMultDiv2(&rTmp, &iTmp, rTmp0, iTmp0, aaFractDelayPhaseFactorSerReSubQmf20[sb][m], aaFractDelayPhaseFactorSerImSubQmf20[sb][m]);
7672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      rTmp = (rTmp - fMultDiv2(aAllpassLinkDecaySer[m], rR0)) << 1;
7692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      iTmp = (iTmp - fMultDiv2(aAllpassLinkDecaySer[m], iR0)) << 1;
7702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pAaaRealDelayRBufferSerSubQmf[tmpDelayRSer] = rR0 + fMult(aAllpassLinkDecaySer[m], rTmp);
7722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pAaaImagDelayRBufferSerSubQmf[tmpDelayRSer] = iR0 + fMult(aAllpassLinkDecaySer[m], iTmp);
7732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      rR0 = rTmp;
7752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      iR0 = iTmp;
7762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pAaaRealDelayRBufferSerSubQmf += aAllpassLinkDelaySer[m];
7782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pAaaImagDelayRBufferSerSubQmf += aAllpassLinkDelaySer[m];
7792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } /* m */
7812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* duck if a past transient is found */
7832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    aaRightReal[sb] = fMult(transRatio, rR0);
7842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    aaRightImag[sb] = fMult(transRatio, iR0);
7852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  } /* gr */
7872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  scaleValues( mHybridRealLeft,  NO_SUB_QMF_CHANNELS, -SCAL_HEADROOM );
7902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  scaleValues( mHybridImagLeft,  NO_SUB_QMF_CHANNELS, -SCAL_HEADROOM );
7912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  scaleValues( mHybridRealRight, NO_SUB_QMF_CHANNELS, -SCAL_HEADROOM );
7922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  scaleValues( mHybridImagRight, NO_SUB_QMF_CHANNELS, -SCAL_HEADROOM );
7932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /************************/
7962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  aaLeftReal  = rIntBufferLeft;
7982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  aaLeftImag  = iIntBufferLeft;
7992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  aaRightReal = rIntBufferRight;
8002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  aaRightImag = iIntBufferRight;
8012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pRealDelayBuffer = h_ps_d->specificTo.mpeg.aaRealDelayBufferQmf[TempDelay];
8032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pImagDelayBuffer = h_ps_d->specificTo.mpeg.aaImagDelayBufferQmf[TempDelay];
8042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /************************/
8062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* ICC groups : 10 - 19 */
8072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /************************/
8082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* gr = ICC groups */
8112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (gr=SUBQMF_GROUPS; gr < NO_IID_GROUPS - NR_OF_DELAY_GROUPS; gr++) {
8122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    transRatio = aaTransRatioSlot[bins2groupMap20[gr]];
8142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* sb = subQMF/QMF subband */
8162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (sb = groupBorders20[gr]; sb < groupBorders20[gr+1]; sb++) {
8172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FIXP_DBL resR, resI;
8182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* decayScaleFactor = 1.0f + decay_cutoff * DECAY_SLOPE - DECAY_SLOPE * sb; DECAY_SLOPE = 0.05 */
8202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FIXP_DBL decayScaleFactor = decayScaleFactTable[sb];
8212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Update delay buffers, sample delay allpass = 2 */
8232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      rTmp0 = pRealDelayBuffer[sb];
8242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      iTmp0 = pImagDelayBuffer[sb];
8252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pRealDelayBuffer[sb] = aaLeftReal[sb];
8272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pImagDelayBuffer[sb] = aaLeftImag[sb];
8282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* delay by fraction */
8302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      cplxMultDiv2(&rR0, &iR0, rTmp0, iTmp0, aaFractDelayPhaseFactorReQmf[sb], aaFractDelayPhaseFactorImQmf[sb]);
8312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      rR0<<=1;
8322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      iR0<<=1;
8332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      resR = fMult(decayScaleFactor, rR0);
8352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      resI = fMult(decayScaleFactor, iR0);
8362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FIXP_DBL *pAaaRealDelayRBufferSerQmf = h_ps_d->specificTo.mpeg.aaaRealDelayRBufferSerQmf[sb];
8382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FIXP_DBL *pAaaImagDelayRBufferSerQmf = h_ps_d->specificTo.mpeg.aaaImagDelayRBufferSerQmf[sb];
8392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (m=0; m<NO_SERIAL_ALLPASS_LINKS ; m++) {
8412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT tmpDelayRSer = h_ps_d->specificTo.mpeg.aDelayRBufIndexSer[m];
8432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* get delayed values from according buffer : m(0)=3; m(1)=4; m(2)=5; */
8452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        rTmp0 = pAaaRealDelayRBufferSerQmf[tmpDelayRSer];
8462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        iTmp0 = pAaaImagDelayRBufferSerQmf[tmpDelayRSer];
8472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* delay by fraction */
8492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        cplxMultDiv2(&rTmp, &iTmp, rTmp0, iTmp0, aaFractDelayPhaseFactorSerReQmf[sb][m], aaFractDelayPhaseFactorSerImQmf[sb][m]);
8502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        rTmp = (rTmp - fMultDiv2(aAllpassLinkDecaySer[m], resR))<<1;
8522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        iTmp = (iTmp - fMultDiv2(aAllpassLinkDecaySer[m], resI))<<1;
8532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        resR = fMult(decayScaleFactor, rTmp);
8552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        resI = fMult(decayScaleFactor, iTmp);
8562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pAaaRealDelayRBufferSerQmf[tmpDelayRSer] = rR0 + fMult(aAllpassLinkDecaySer[m], resR);
8582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pAaaImagDelayRBufferSerQmf[tmpDelayRSer] = iR0 + fMult(aAllpassLinkDecaySer[m], resI);
8592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        rR0 = rTmp;
8612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        iR0 = iTmp;
8622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pAaaRealDelayRBufferSerQmf += aAllpassLinkDelaySer[m];
8642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pAaaImagDelayRBufferSerQmf += aAllpassLinkDelaySer[m];
8652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      } /* m */
8672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* duck if a past transient is found */
8692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      aaRightReal[sb] = fMult(transRatio, rR0);
8702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      aaRightImag[sb] = fMult(transRatio, iR0);
8712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } /* sb */
8732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  } /* gr */
8742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /************************/
8762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* ICC groups : 20,  21 */
8772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /************************/
8782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* gr = ICC groups */
8812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (gr=DELAY_GROUP_OFFSET; gr < NO_IID_GROUPS; gr++) {
8822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT sbStart = groupBorders20[gr];
8842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT sbStop  = groupBorders20[gr+1];
8852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR *pDelayBufIdx = &h_ps_d->specificTo.mpeg.aDelayBufIndexDelayQmf[sbStart-FIRST_DELAY_SB];
8872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    transRatio = aaTransRatioSlot[bins2groupMap20[gr]];
8892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* sb = subQMF/QMF subband */
8912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (sb = sbStart; sb < sbStop; sb++) {
8922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Update delay buffers */
8942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      rR0 = h_ps_d->specificTo.mpeg.pAaRealDelayBufferQmf[*pDelayBufIdx][sb-FIRST_DELAY_SB];
8952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      iR0 = h_ps_d->specificTo.mpeg.pAaImagDelayBufferQmf[*pDelayBufIdx][sb-FIRST_DELAY_SB];
8962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      h_ps_d->specificTo.mpeg.pAaRealDelayBufferQmf[*pDelayBufIdx][sb-FIRST_DELAY_SB] = aaLeftReal[sb];
8982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      h_ps_d->specificTo.mpeg.pAaImagDelayBufferQmf[*pDelayBufIdx][sb-FIRST_DELAY_SB] = aaLeftImag[sb];
8992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* duck if a past transient is found */
9012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      aaRightReal[sb] = fMult(transRatio, rR0);
9022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      aaRightImag[sb] = fMult(transRatio, iR0);
9032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (++(*pDelayBufIdx) >= delayIndexQmf[sb]) {
9052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        *pDelayBufIdx = 0;
9062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
9072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pDelayBufIdx++;
9082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } /* sb */
9102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  } /* gr */
9112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Update delay buffer index */
9142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (++h_ps_d->specificTo.mpeg.delayBufIndex >= NO_SAMPLE_DELAY_ALLPASS)
9152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    h_ps_d->specificTo.mpeg.delayBufIndex = 0;
9162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (m=0; m<NO_SERIAL_ALLPASS_LINKS ; m++) {
9182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (++h_ps_d->specificTo.mpeg.aDelayRBufIndexSer[m] >= aAllpassLinkDelaySer[m])
9192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      h_ps_d->specificTo.mpeg.aDelayRBufIndexSer[m] = 0;
9202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
9212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  scaleValues( &rIntBufferLeft[NO_QMF_BANDS_HYBRID20],  NO_QMF_CHANNELS-NO_QMF_BANDS_HYBRID20, -SCAL_HEADROOM );
9242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  scaleValues( &iIntBufferLeft[NO_QMF_BANDS_HYBRID20],  NO_QMF_CHANNELS-NO_QMF_BANDS_HYBRID20, -SCAL_HEADROOM );
9252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  scaleValues( &rIntBufferRight[NO_QMF_BANDS_HYBRID20], NO_QMF_CHANNELS-NO_QMF_BANDS_HYBRID20, -SCAL_HEADROOM );
9262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  scaleValues( &iIntBufferRight[NO_QMF_BANDS_HYBRID20], NO_QMF_CHANNELS-NO_QMF_BANDS_HYBRID20, -SCAL_HEADROOM );
9272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* free memory on scratch */
9292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  C_ALLOC_SCRATCH_END(aaTransRatioSlot, FIXP_DBL, NO_MID_RES_BINS);
9302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  C_ALLOC_SCRATCH_END(aaPowerSlot, FIXP_DBL, NO_MID_RES_BINS);
9312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
9322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid initSlotBasedRotation( HANDLE_PS_DEC h_ps_d, /*!< pointer to the module state */
9352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            int env,
9362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            int usb
9372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            ) {
9382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT     group = 0;
9402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT     bin =  0;
9412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT     noIidSteps;
9422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*  const UCHAR *pQuantizedIIDs;*/
9442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_SGL  invL;
9462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL  ScaleL, ScaleR;
9472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL  Alpha, Beta;
9482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL  h11r, h12r, h21r, h22r;
9492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  const FIXP_DBL  *PScaleFactors;
9512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Overwrite old values in delay buffers when upper subband is higher than in last frame */
9532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (env == 0) {
9542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ((usb > h_ps_d->specificTo.mpeg.lastUsb) && h_ps_d->specificTo.mpeg.lastUsb) {
9562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      INT i,k,length;
9582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (i=h_ps_d->specificTo.mpeg.lastUsb ; i < FIRST_DELAY_SB; i++) {
9602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKmemclear(h_ps_d->specificTo.mpeg.aaaRealDelayRBufferSerQmf[i], NO_DELAY_LENGTH_VECTORS*sizeof(FIXP_DBL));
9612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKmemclear(h_ps_d->specificTo.mpeg.aaaImagDelayRBufferSerQmf[i], NO_DELAY_LENGTH_VECTORS*sizeof(FIXP_DBL));
9622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
9632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (k=0 ; k<NO_SAMPLE_DELAY_ALLPASS; k++) {
9652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKmemclear(h_ps_d->specificTo.mpeg.pAaRealDelayBufferQmf[k], FIRST_DELAY_SB*sizeof(FIXP_DBL));
9662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
9672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      length = (usb-FIRST_DELAY_SB)*sizeof(FIXP_DBL);
9682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if(length>0) {
9692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKmemclear(h_ps_d->specificTo.mpeg.pAaRealDelayBufferQmf[0], length);
9702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKmemclear(h_ps_d->specificTo.mpeg.pAaImagDelayBufferQmf[0], length);
9712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
9722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      length = (fixMin(NO_DELAY_BUFFER_BANDS,(INT)usb)-FIRST_DELAY_SB)*sizeof(FIXP_DBL);
9732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if(length>0) {
9742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        for (k=1 ; k < h_ps_d->specificTo.mpeg.noSampleDelay; k++) {
9752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          FDKmemclear(h_ps_d->specificTo.mpeg.pAaRealDelayBufferQmf[k], length);
9762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          FDKmemclear(h_ps_d->specificTo.mpeg.pAaImagDelayBufferQmf[k], length);
9772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
9782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
9792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
9802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    h_ps_d->specificTo.mpeg.lastUsb = usb;
9812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  } /* env == 0 */
9822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (h_ps_d->bsData[h_ps_d->processSlot].mpeg.bFineIidQ)
9842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
9852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    PScaleFactors = ScaleFactorsFine; /* values are shiftet right by one */
9862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    noIidSteps = NO_IID_STEPS_FINE;
9872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /*pQuantizedIIDs = quantizedIIDsFine;*/
9882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
9892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  else
9912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
9922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    PScaleFactors = ScaleFactors; /* values are shiftet right by one */
9932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    noIidSteps = NO_IID_STEPS;
9942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /*pQuantizedIIDs = quantizedIIDs;*/
9952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
9962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* dequantize and decode */
9992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for ( group = 0; group < NO_IID_GROUPS; group++ ) {
10002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bin = bins2groupMap20[group];
10022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /*!
10042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    <h3> type 'A' rotation </h3>
10052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    mixing procedure R_a, used in baseline version<br>
10062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     Scale-factor vectors c1 and c2 are precalculated in initPsTables () and stored in
10082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     scaleFactors[] and scaleFactorsFine[] = pScaleFactors [].
10092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     From the linearized IID parameters (intensity differences), two scale factors are
10102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     calculated. They are used to obtain the coefficients h11... h22.
10112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    */
10122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* ScaleR and ScaleL are scaled by 1 shift right */
10142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ScaleR = PScaleFactors[noIidSteps + h_ps_d->specificTo.mpeg.coef.aaIidIndexMapped[env][bin]];
10162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ScaleL = PScaleFactors[noIidSteps - h_ps_d->specificTo.mpeg.coef.aaIidIndexMapped[env][bin]];
10172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    Beta   = fMult (fMult( Alphas[h_ps_d->specificTo.mpeg.coef.aaIccIndexMapped[env][bin]], ( ScaleR - ScaleL )), FIXP_SQRT05);
10192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    Alpha  = Alphas[h_ps_d->specificTo.mpeg.coef.aaIccIndexMapped[env][bin]]>>1;
10202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Alpha and Beta are now both scaled by 2 shifts right */
10222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* calculate the coefficients h11... h22 from scale-factors and ICC parameters */
10242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* h values are scaled by 1 shift right */
10262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
10272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FIXP_DBL trigData[4];
10282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      inline_fixp_cos_sin(Beta + Alpha, Beta - Alpha, 2, trigData);
10302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      h11r = fMult( ScaleL, trigData[0]);
10312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      h12r = fMult( ScaleR, trigData[2]);
10322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      h21r = fMult( ScaleL, trigData[1]);
10332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      h22r = fMult( ScaleR, trigData[3]);
10342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
10352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /*****************************************************************************************/
10362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Interpolation of the matrices H11... H22:                                             */
10372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /*                                                                                       */
10382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* H11(k,n) = H11(k,n[e]) + (n-n[e]) * (H11(k,n[e+1] - H11(k,n[e])) / (n[e+1] - n[e])    */
10392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* ...                                                                                   */
10402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /*****************************************************************************************/
10412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* invL = 1/(length of envelope) */
10432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    invL = FX_DBL2FX_SGL(GetInvInt(h_ps_d->bsData[h_ps_d->processSlot].mpeg.aEnvStartStop[env + 1] - h_ps_d->bsData[h_ps_d->processSlot].mpeg.aEnvStartStop[env]));
10442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    h_ps_d->specificTo.mpeg.coef.H11r[group]  = h_ps_d->specificTo.mpeg.h11rPrev[group];
10462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    h_ps_d->specificTo.mpeg.coef.H12r[group]  = h_ps_d->specificTo.mpeg.h12rPrev[group];
10472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    h_ps_d->specificTo.mpeg.coef.H21r[group]  = h_ps_d->specificTo.mpeg.h21rPrev[group];
10482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    h_ps_d->specificTo.mpeg.coef.H22r[group]  = h_ps_d->specificTo.mpeg.h22rPrev[group];
10492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    h_ps_d->specificTo.mpeg.coef.DeltaH11r[group]  = fMult ( h11r - h_ps_d->specificTo.mpeg.coef.H11r[group], invL );
10512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    h_ps_d->specificTo.mpeg.coef.DeltaH12r[group]  = fMult ( h12r - h_ps_d->specificTo.mpeg.coef.H12r[group], invL );
10522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    h_ps_d->specificTo.mpeg.coef.DeltaH21r[group]  = fMult ( h21r - h_ps_d->specificTo.mpeg.coef.H21r[group], invL );
10532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    h_ps_d->specificTo.mpeg.coef.DeltaH22r[group]  = fMult ( h22r - h_ps_d->specificTo.mpeg.coef.H22r[group], invL );
10542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* update prev coefficients for interpolation in next envelope */
10562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    h_ps_d->specificTo.mpeg.h11rPrev[group] = h11r;
10582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    h_ps_d->specificTo.mpeg.h12rPrev[group] = h12r;
10592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    h_ps_d->specificTo.mpeg.h21rPrev[group] = h21r;
10602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    h_ps_d->specificTo.mpeg.h22rPrev[group] = h22r;
10612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  } /* group loop */
10632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
10642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void applySlotBasedRotation( HANDLE_PS_DEC h_ps_d,        /*!< pointer to the module state */
10672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    FIXP_DBL  *mHybridRealLeft,  /*!< hybrid values real left  */
10692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    FIXP_DBL  *mHybridImagLeft,  /*!< hybrid values imag left  */
10702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    FIXP_DBL  *QmfLeftReal,      /*!< real bands left qmf channel */
10722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    FIXP_DBL  *QmfLeftImag,      /*!< imag bands left qmf channel */
10732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    FIXP_DBL  *mHybridRealRight, /*!< hybrid values real right  */
10752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    FIXP_DBL  *mHybridImagRight, /*!< hybrid values imag right  */
10762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    FIXP_DBL  *QmfRightReal,     /*!< real bands right qmf channel */
10782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    FIXP_DBL  *QmfRightImag      /*!< imag bands right qmf channel */
10792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   )
10802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
10812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT     group;
10822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT     subband;
10832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL *RESTRICT HybrLeftReal;
10852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL *RESTRICT HybrLeftImag;
10862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL *RESTRICT HybrRightReal;
10872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL *RESTRICT HybrRightImag;
10882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL tmpLeft, tmpRight;
10902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /**********************************************************************************************/
10932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /*!
10942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  <h2> Mapping </h2>
10952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  The number of stereo bands that is actually used depends on the number of availble
10972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  parameters for IID and ICC:
10982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  <pre>
10992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   nr. of IID para.| nr. of ICC para. | nr. of Stereo bands
11002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   ----------------|------------------|-------------------
11012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     10,20         |     10,20        |        20
11022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     10,20         |     34           |        34
11032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     34            |     10,20        |        34
11042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     34            |     34           |        34
11052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  </pre>
11062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  In the case the number of parameters for IIS and ICC differs from the number of stereo
11072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  bands, a mapping from the lower number to the higher number of parameters is applied.
11082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  Index mapping of IID and ICC parameters is already done in psbitdec.cpp. Further mapping is
11092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  not needed here in baseline version.
11102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  **********************************************************************************************/
11112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /************************************************************************************************/
11132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /*!
11142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  <h2> Mixing </h2>
11152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  To generate the QMF subband signals for the subband samples n = n[e]+1 ,,, n_[e+1] the
11172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  parameters at position n[e] and n[e+1] are required as well as the subband domain signals
11182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  s_k(n) and d_k(n) for n = n[e]+1... n_[e+1]. n[e] represents the start position for
11192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  envelope e. The border positions n[e] are handled in DecodePS().
11202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  The stereo sub subband signals are constructed as:
11222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  <pre>
11232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  l_k(n) = H11(k,n) s_k(n) + H21(k,n) d_k(n)
11242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  r_k(n) = H21(k,n) s_k(n) + H22(k,n) d_k(n)
11252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  </pre>
11262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  In order to obtain the matrices H11(k,n)... H22 (k,n), the vectors h11(b)... h22(b) need to
11272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  be calculated first (b: parameter index). Depending on ICC mode either mixing procedure R_a
11282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  or R_b is used for that. For both procedures, the parameters for parameter position n[e+1]
11292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  is used.
11302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  ************************************************************************************************/
11312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /************************************************************************************************/
11342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /*!
11352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  <h2>Phase parameters </h2>
11362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  With disabled phase parameters (which is the case in baseline version), the H-matrices are
11372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  just calculated by:
11382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  <pre>
11402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  H11(k,n[e+1] = h11(b(k))
11412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  (...)
11422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  b(k): parameter index according to mapping table
11432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  </pre>
11442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  <h2>Processing of the samples in the sub subbands </h2>
11462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  this loop includes the interpolation of the coefficients Hxx
11472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  ************************************************************************************************/
11482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* loop thru all groups ... */
11512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  HybrLeftReal  = mHybridRealLeft;
11522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  HybrLeftImag  = mHybridImagLeft;
11532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  HybrRightReal = mHybridRealRight;
11542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  HybrRightImag = mHybridImagRight;
11552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /******************************************************/
11572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* construct stereo sub subband signals according to: */
11582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /*                                                    */
11592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* l_k(n) = H11(k,n) s_k(n) + H21(k,n) d_k(n)         */
11602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* r_k(n) = H12(k,n) s_k(n) + H22(k,n) d_k(n)         */
11612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /******************************************************/
11622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for ( group = 0; group < SUBQMF_GROUPS; group++ ) {
11632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    h_ps_d->specificTo.mpeg.coef.H11r[group] += h_ps_d->specificTo.mpeg.coef.DeltaH11r[group];
11652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    h_ps_d->specificTo.mpeg.coef.H12r[group] += h_ps_d->specificTo.mpeg.coef.DeltaH12r[group];
11662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    h_ps_d->specificTo.mpeg.coef.H21r[group] += h_ps_d->specificTo.mpeg.coef.DeltaH21r[group];
11672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    h_ps_d->specificTo.mpeg.coef.H22r[group] += h_ps_d->specificTo.mpeg.coef.DeltaH22r[group];
11682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    subband = groupBorders20[group];
11702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    tmpLeft  = fMultAddDiv2( fMultDiv2(h_ps_d->specificTo.mpeg.coef.H11r[group], HybrLeftReal[subband]), h_ps_d->specificTo.mpeg.coef.H21r[group], HybrRightReal[subband]);
11722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    tmpRight = fMultAddDiv2( fMultDiv2(h_ps_d->specificTo.mpeg.coef.H12r[group], HybrLeftReal[subband]), h_ps_d->specificTo.mpeg.coef.H22r[group], HybrRightReal[subband]);
11732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    HybrLeftReal [subband] = tmpLeft<<1;
11742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    HybrRightReal[subband] = tmpRight<<1;
11752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    tmpLeft  = fMultAdd( fMultDiv2(h_ps_d->specificTo.mpeg.coef.H11r[group], HybrLeftImag[subband]), h_ps_d->specificTo.mpeg.coef.H21r[group], HybrRightImag[subband]);
11772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    tmpRight = fMultAdd( fMultDiv2(h_ps_d->specificTo.mpeg.coef.H12r[group], HybrLeftImag[subband]), h_ps_d->specificTo.mpeg.coef.H22r[group], HybrRightImag[subband]);
11782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    HybrLeftImag [subband] = tmpLeft;
11792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    HybrRightImag[subband] = tmpRight;
11802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
11812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* continue in the qmf buffers */
11832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  HybrLeftReal  = QmfLeftReal;
11842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  HybrLeftImag  = QmfLeftImag;
11852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  HybrRightReal = QmfRightReal;
11862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  HybrRightImag = QmfRightImag;
11872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (; group < NO_IID_GROUPS; group++ ) {
11892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    h_ps_d->specificTo.mpeg.coef.H11r[group] += h_ps_d->specificTo.mpeg.coef.DeltaH11r[group];
11912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    h_ps_d->specificTo.mpeg.coef.H12r[group] += h_ps_d->specificTo.mpeg.coef.DeltaH12r[group];
11922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    h_ps_d->specificTo.mpeg.coef.H21r[group] += h_ps_d->specificTo.mpeg.coef.DeltaH21r[group];
11932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    h_ps_d->specificTo.mpeg.coef.H22r[group] += h_ps_d->specificTo.mpeg.coef.DeltaH22r[group];
11942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for ( subband = groupBorders20[group]; subband < groupBorders20[group + 1]; subband++ )
11962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
11972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      tmpLeft  = fMultAdd( fMultDiv2(h_ps_d->specificTo.mpeg.coef.H11r[group], HybrLeftReal[subband]), h_ps_d->specificTo.mpeg.coef.H21r[group], HybrRightReal[subband]);
11982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      tmpRight = fMultAdd( fMultDiv2(h_ps_d->specificTo.mpeg.coef.H12r[group], HybrLeftReal[subband]), h_ps_d->specificTo.mpeg.coef.H22r[group], HybrRightReal[subband]);
11992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      HybrLeftReal [subband] = tmpLeft;
12002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      HybrRightReal[subband] = tmpRight;
12012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      tmpLeft  = fMultAdd( fMultDiv2(h_ps_d->specificTo.mpeg.coef.H11r[group], HybrLeftImag[subband]), h_ps_d->specificTo.mpeg.coef.H21r[group], HybrRightImag[subband]);
12032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      tmpRight = fMultAdd( fMultDiv2(h_ps_d->specificTo.mpeg.coef.H12r[group], HybrLeftImag[subband]), h_ps_d->specificTo.mpeg.coef.H22r[group], HybrRightImag[subband]);
12042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      HybrLeftImag [subband] = tmpLeft;
12052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      HybrRightImag[subband] = tmpRight;
12062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } /* subband */
12082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
12092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
12102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/***************************************************************************/
12132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
12142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief  Applies IID, ICC, IPD and OPD parameters to the current frame.
12152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \return none
12172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project****************************************************************************/
12192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid
12202228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectApplyPsSlot( HANDLE_PS_DEC h_ps_d,         /*!< handle PS_DEC*/
12212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             FIXP_DBL  **rIntBufferLeft,   /*!< real bands left qmf channel (38x64)  */
12222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             FIXP_DBL  **iIntBufferLeft,   /*!< imag bands left qmf channel (38x64)  */
12232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             FIXP_DBL  *rIntBufferRight,   /*!< real bands right qmf channel (38x64) */
12242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             FIXP_DBL  *iIntBufferRight    /*!< imag bands right qmf channel (38x64) */
12252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           )
12262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
12272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /*!
12292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  The 64-band QMF representation of the monaural signal generated by the SBR tool
12302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  is used as input of the PS tool. After the PS processing, the outputs of the left
12312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  and right hybrid synthesis filterbanks are used to generate the stereo output
12322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  signal.
12332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  <pre>
12352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             -------------            ----------            -------------
12372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            | Hybrid      | M_n[k,m] |          | L_n[k,m] | Hybrid      | l[n]
12382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   m[n] --->| analysis    |--------->|          |--------->| synthesis   |----->
12392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            | filter bank |          |          |          | filter bank |
12402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             -------------           | Stereo   |           -------------
12412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   |                 | recon-   |
12422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   |                 | stuction |
12432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  \|/                |          |
12442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             -------------           |          |
12452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            | De-         | D_n[k,m] |          |
12462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            | correlation |--------->|          |
12472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             -------------           |          |           -------------
12482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     |          | R_n[k,m] | Hybrid      | r[n]
12492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     |          |--------->| synthesis   |----->
12502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   IID, ICC ------------------------>|          |          | filter bank |
12512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  (IPD, OPD)                          ----------            -------------
12522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  m[n]:      QMF represantation of the mono input
12542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  M_n[k,m]:  (sub-)sub-band domain signals of the mono input
12552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  D_n[k,m]:  decorrelated (sub-)sub-band domain signals
12562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  L_n[k,m]:  (sub-)sub-band domain signals of the left output
12572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  R_n[k,m]:  (sub-)sub-band domain signals of the right output
12582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  l[n],r[n]: left/right output signals
12592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  </pre>
12612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  */
12622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* get temporary hybrid qmf values of one timeslot */
12642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  C_ALLOC_SCRATCH_START(hybridRealLeft, FIXP_DBL, NO_SUB_QMF_CHANNELS);
12652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  C_ALLOC_SCRATCH_START(hybridImagLeft, FIXP_DBL, NO_SUB_QMF_CHANNELS);
12662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  C_ALLOC_SCRATCH_START(hybridRealRight, FIXP_DBL, NO_SUB_QMF_CHANNELS);
12672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  C_ALLOC_SCRATCH_START(hybridImagRight, FIXP_DBL, NO_SUB_QMF_CHANNELS);
12682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  SCHAR sf_IntBuffer     = h_ps_d->sf_IntBuffer;
12702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* clear workbuffer */
12722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKmemclear(hybridRealLeft,  NO_SUB_QMF_CHANNELS*sizeof(FIXP_DBL));
12732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKmemclear(hybridImagLeft,  NO_SUB_QMF_CHANNELS*sizeof(FIXP_DBL));
12742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKmemclear(hybridRealRight, NO_SUB_QMF_CHANNELS*sizeof(FIXP_DBL));
12752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKmemclear(hybridImagRight, NO_SUB_QMF_CHANNELS*sizeof(FIXP_DBL));
12762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /*!
12792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  Hybrid analysis filterbank:
12802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  The lower 3 (5) of the 64 QMF subbands are further split to provide better frequency resolution.
12812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for PS processing.
12822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  For the 10 and 20 stereo bands configuration, the QMF band H_0(w) is split
12832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  up into 8 (sub-) sub-bands and the QMF bands H_1(w) and H_2(w) are spit into 2 (sub-)
12842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  4th. (See figures 8.20 and 8.22 of ISO/IEC 14496-3:2001/FDAM 2:2004(E) )
12852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  */
12862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (h_ps_d->procFrameBased == 1)    /* If we have switched from frame to slot based processing  */
12892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {                                   /* fill hybrid delay buffer.                                */
12902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    h_ps_d->procFrameBased = 0;
12912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    fillHybridDelayLine( rIntBufferLeft,
12932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         iIntBufferLeft,
12942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         hybridRealLeft,
12952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         hybridImagLeft,
12962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         hybridRealRight,
12972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         hybridImagRight,
12982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        &h_ps_d->specificTo.mpeg.hybrid );
12992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
13002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  slotBasedHybridAnalysis ( rIntBufferLeft[HYBRID_FILTER_DELAY], /* qmf filterbank values                         */
13022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            iIntBufferLeft[HYBRID_FILTER_DELAY], /* qmf filterbank values                         */
13032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            hybridRealLeft,                      /* hybrid filterbank values                      */
13042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            hybridImagLeft,                      /* hybrid filterbank values                      */
13052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           &h_ps_d->specificTo.mpeg.hybrid);          /* hybrid filterbank handle                      */
13062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  SCHAR hybridScal = h_ps_d->specificTo.mpeg.hybrid.sf_mQmfBuffer;
13092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /*!
13122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  Decorrelation:
13132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  By means of all-pass filtering and delaying, the (sub-)sub-band samples s_k(n) are
13142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  converted into de-correlated (sub-)sub-band samples d_k(n).
13152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  - k: frequency in hybrid spectrum
13162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  - n: time index
13172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  */
13182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  deCorrelateSlotBased( h_ps_d,              /* parametric stereo decoder handle       */
13202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        hybridRealLeft,      /* left hybrid time slot                  */
13212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        hybridImagLeft,
13222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        hybridScal,      /* scale factor of left hybrid time slot  */
13232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        rIntBufferLeft[0],   /* left qmf time slot                     */
13242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        iIntBufferLeft[0],
13252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        sf_IntBuffer,        /* scale factor of left and right qmf time slot */
13262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        hybridRealRight,     /* right hybrid time slot                 */
13272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        hybridImagRight,
13282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        rIntBufferRight,     /* right qmf time slot                    */
13292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        iIntBufferRight );
13302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /*!
13342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  Stereo Processing:
13352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  The sets of (sub-)sub-band samples s_k(n) and d_k(n) are processed according to
13362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  the stereo cues which are defined per stereo band.
13372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  */
13382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  applySlotBasedRotation( h_ps_d,            /* parametric stereo decoder handle       */
13412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          hybridRealLeft,    /* left hybrid time slot                  */
13422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          hybridImagLeft,
13432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          rIntBufferLeft[0], /* left qmf time slot                     */
13442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          iIntBufferLeft[0],
13452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          hybridRealRight,   /* right hybrid time slot                 */
13462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          hybridImagRight,
13472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          rIntBufferRight,   /* right qmf time slot                    */
13482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          iIntBufferRight );
13492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /*!
13542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  Hybrid synthesis filterbank:
13552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  The stereo processed hybrid subband signals l_k(n) and r_k(n) are fed into the hybrid synthesis
13562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  filterbanks which are identical to the 64 complex synthesis filterbank of the SBR tool. The
13572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  input to the filterbank are slots of 64 QMF samples. For each slot the filterbank outputs one
13582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  block of 64 samples of one reconstructed stereo channel. The hybrid synthesis filterbank is
13592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  computed seperatly for the left and right channel.
13602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  */
13612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* left channel */
13642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  slotBasedHybridSynthesis ( hybridRealLeft,         /* one timeslot of hybrid filterbank values */
13652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             hybridImagLeft,
13662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             rIntBufferLeft[0],      /* one timeslot of qmf filterbank values    */
13672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             iIntBufferLeft[0],
13682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            &h_ps_d->specificTo.mpeg.hybrid );      /* hybrid filterbank handle                 */
13692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* right channel */
13712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  slotBasedHybridSynthesis ( hybridRealRight,        /* one timeslot of hybrid filterbank values */
13722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             hybridImagRight,
13732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             rIntBufferRight,        /* one timeslot of qmf filterbank values    */
13742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             iIntBufferRight,
13752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            &h_ps_d->specificTo.mpeg.hybrid );      /* hybrid filterbank handle                 */
13762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* free temporary hybrid qmf values of one timeslot */
13842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  C_ALLOC_SCRATCH_END(hybridImagRight, FIXP_DBL, NO_SUB_QMF_CHANNELS);
13852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  C_ALLOC_SCRATCH_END(hybridRealRight, FIXP_DBL, NO_SUB_QMF_CHANNELS);
13862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  C_ALLOC_SCRATCH_END(hybridImagLeft, FIXP_DBL, NO_SUB_QMF_CHANNELS);
13872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  C_ALLOC_SCRATCH_END(hybridRealLeft, FIXP_DBL, NO_SUB_QMF_CHANNELS);
13882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}/* END ApplyPsSlot */
13902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/***************************************************************************/
13932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
13942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief  assigns timeslots to an array
13962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \return
13982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project****************************************************************************/
14002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void assignTimeSlotsPS (FIXP_DBL *bufAdr,
14022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               FIXP_DBL **bufPtr,
14032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               const int numSlots,
14042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               const int numChan)
14052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
14062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL  *ptr;
14072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int slot;
14082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  ptr = bufAdr;
14092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for(slot=0; slot < numSlots; slot++) {
14102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   bufPtr [slot] = ptr;
14112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ptr += numChan;
14122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
14132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
14142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1415