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/***************************** MPEG Audio Encoder *************************** 852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Initial Authors: M. Neuendorf, N. Rettelbach, M. Multrus 872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Contents/Description: PS parameter extraction, encoding 882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project******************************************************************************/ 902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \file 922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief PS parameter extraction, encoding functions 932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "ps_main.h" 962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "sbr_ram.h" 992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "ps_encode.h" 1002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "qmf.h" 1022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "ps_const.h" 1042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "sbr_misc.h" 1052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "genericStds.h" 1072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectinline void FDKsbrEnc_addFIXP_DBL(const FIXP_DBL *X, const FIXP_DBL *Y, FIXP_DBL *Z, INT n) 1092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 1102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (INT i=0; i<n; i++) 1112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Z[i] = (X[i]>>1) + (Y[i]>>1); 1122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 1132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define LOG10_2_10 3.01029995664f /* 10.0f*log10(2.f) */ 1152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic const INT iidGroupBordersLoRes[QMF_GROUPS_LO_RES + SUBQMF_GROUPS_LO_RES + 1] = 1172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 1182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 0, 1, 2, 3, 4, 5, /* 6 subqmf subbands - 0th qmf subband */ 1192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6, 7, /* 2 subqmf subbands - 1st qmf subband */ 1202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8, 9, /* 2 subqmf subbands - 2nd qmf subband */ 1212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10, 11, 12, 13, 14, 15, 16, 18, 21, 25, 30, 42, 71 1222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}; 1232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic const UCHAR iidGroupWidthLdLoRes[QMF_GROUPS_LO_RES + SUBQMF_GROUPS_LO_RES] = 1252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 1262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 0, 0, 0, 0, 0, 0, 1272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 0, 0, 1282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 0, 0, 1292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 4, 5 1302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}; 1312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic const INT subband2parameter20[QMF_GROUPS_LO_RES + SUBQMF_GROUPS_LO_RES] = 1342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 1352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1, 0, 0, 1, 2, 3, /* 6 subqmf subbands - 0th qmf subband */ 1362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4, 5, /* 2 subqmf subbands - 1st qmf subband */ 1372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6, 7, /* 2 subqmf subbands - 2nd qmf subband */ 1382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 1392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}; 1402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projecttypedef enum { 1432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project MAX_TIME_DIFF_FRAMES = 20, 1442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project MAX_PS_NOHEADER_CNT = 10, 1452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project MAX_NOENV_CNT = 10, 1462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project DO_NOT_USE_THIS_MODE = 0x7FFFFF 1472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} __PS_CONSTANTS; 1482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic const FIXP_DBL iidQuant_fx[15] = { 1522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 0xce000000, 0xdc000000, 0xe4000000, 0xec000000, 0xf2000000, 0xf8000000, 0xfc000000, 0x00000000, 1532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 0x04000000, 0x08000000, 0x0e000000, 0x14000000, 0x1c000000, 0x24000000, 0x32000000 1542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}; 1552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic const FIXP_DBL iidQuantFine_fx[31] = { 1572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 0x9c000001, 0xa6000001, 0xb0000001, 0xba000001, 0xc4000000, 0xce000000, 0xd4000000, 0xda000000, 1582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 0xe0000000, 0xe6000000, 0xec000000, 0xf0000000, 0xf4000000, 0xf8000000, 0xfc000000, 0x00000000, 1592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 0x04000000, 0x08000000, 0x0c000000, 0x10000000, 0x14000000, 0x1a000000, 0x20000000, 0x26000000, 1602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 0x2c000000, 0x32000000, 0x3c000000, 0x45ffffff, 0x4fffffff, 0x59ffffff, 0x63ffffff 1612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}; 1622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic const FIXP_DBL iccQuant[8] = { 1662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 0x7fffffff, 0x77ef9d7f, 0x6babc97f, 0x4ceaf27f, 0x2f0ed3c0, 0x00000000, 0xb49ba601, 0x80000000 1672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}; 1682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic FDK_PSENC_ERROR InitPSData( 1702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_PS_DATA hPsData 1712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) 1722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 1732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_PSENC_ERROR error = PSENC_OK; 1742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(hPsData == NULL) { 1762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project error = PSENC_INVALID_HANDLE; 1772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 1782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 1792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int i, env; 1802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear(hPsData,sizeof(PS_DATA)); 1812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i=0; i<PS_MAX_BANDS; i++) { 1832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsData->iidIdxLast[i] = 0; 1842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsData->iccIdxLast[i] = 0; 1852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 1862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsData->iidEnable = hPsData->iidEnableLast = 0; 1882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsData->iccEnable = hPsData->iccEnableLast = 0; 1892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsData->iidQuantMode = hPsData->iidQuantModeLast = PS_IID_RES_COARSE; 1902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsData->iccQuantMode = hPsData->iccQuantModeLast = PS_ICC_ROT_A; 1912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(env=0; env<PS_MAX_ENVELOPES; env++) { 1932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsData->iccDiffMode[env] = PS_DELTA_FREQ; 1942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsData->iccDiffMode[env] = PS_DELTA_FREQ; 1952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i=0; i<PS_MAX_BANDS; i++) { 1972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsData->iidIdx[env][i] = 0; 1982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsData->iccIdx[env][i] = 0; 1992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsData->nEnvelopesLast = 0; 2032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsData->headerCnt = MAX_PS_NOHEADER_CNT; 2052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsData->iidTimeCnt = MAX_TIME_DIFF_FRAMES; 2062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsData->iccTimeCnt = MAX_TIME_DIFF_FRAMES; 2072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsData->noEnvCnt = MAX_NOENV_CNT; 2082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return error; 2112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 2122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic FIXP_DBL quantizeCoef( const FIXP_DBL *RESTRICT input, 2142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const INT nBands, 2152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const FIXP_DBL *RESTRICT quantTable, 2162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const INT idxOffset, 2172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const INT nQuantSteps, 2182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT *RESTRICT quantOut) 2192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 2202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT idx, band; 2212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL quantErr = FL2FXCONST_DBL(0.f); 2222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (band=0; band<nBands;band++) { 2242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(idx=0; idx<nQuantSteps-1; idx++){ 2252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if( fixp_abs((input[band]>>1)-(quantTable[idx+1]>>1)) > 2262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project fixp_abs((input[band]>>1)-(quantTable[idx]>>1)) ) 2272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 2282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 2292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project quantErr += (fixp_abs(input[band]-quantTable[idx])>>PS_QUANT_SCALE); /* don't scale before subtraction; diff smaller (64-25)/64 */ 2322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project quantOut[band] = idx - idxOffset; 2332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return quantErr; 2362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 2372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT getICCMode(const INT nBands, 2392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const INT rotType) 2402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 2412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT mode = 0; 2422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch(nBands) { 2442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case PS_BANDS_COARSE: 2452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project mode = PS_RES_COARSE; 2462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 2472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case PS_BANDS_MID: 2482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project mode = PS_RES_MID; 2492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 2502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 2512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project mode = 0; 2522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(rotType==PS_ICC_ROT_B){ 2542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project mode += 3; 2552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return mode; 2582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 2592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT getIIDMode(const INT nBands, 2622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const INT iidRes) 2632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 2642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT mode = 0; 2652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch(nBands) { 2672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case PS_BANDS_COARSE: 2682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project mode = PS_RES_COARSE; 2692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 2702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case PS_BANDS_MID: 2712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project mode = PS_RES_MID; 2722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 2732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 2742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project mode = 0; 2752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 2762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(iidRes == PS_IID_RES_FINE){ 2792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project mode += 3; 2802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return mode; 2832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 2842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT envelopeReducible(FIXP_DBL iid[PS_MAX_ENVELOPES][PS_MAX_BANDS], 2872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL icc[PS_MAX_ENVELOPES][PS_MAX_BANDS], 2882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT psBands, 2892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT nEnvelopes) 2902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 2912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project #define THRESH_SCALE 7 2922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT reducible = 1; /* true */ 2942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT e = 0, b = 0; 2952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL dIid = FL2FXCONST_DBL(0.f); 2962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL dIcc = FL2FXCONST_DBL(0.f); 2972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL iidErrThreshold, iccErrThreshold; 2992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL iidMeanError, iccMeanError; 3002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* square values to prevent sqrt, 3022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project multiply bands to prevent division; bands shifted DFRACT_BITS instead (DFRACT_BITS-1) because fMultDiv2 used*/ 3032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iidErrThreshold = fMultDiv2 ( FL2FXCONST_DBL(6.5f*6.5f/(IID_SCALE_FT*IID_SCALE_FT)), (FIXP_DBL)(psBands<<((DFRACT_BITS)-THRESH_SCALE)) ); 3042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iccErrThreshold = fMultDiv2 ( FL2FXCONST_DBL(0.75f*0.75f), (FIXP_DBL)(psBands<<((DFRACT_BITS)-THRESH_SCALE)) ); 3052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (nEnvelopes <= 1) { 3072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project reducible = 0; 3082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else { 3092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* mean error criterion */ 3112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (e=0; (e < nEnvelopes/2) && (reducible!=0 ) ; e++) { 3122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iidMeanError = iccMeanError = FL2FXCONST_DBL(0.f); 3132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(b=0; b<psBands; b++) { 3142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project dIid = (iid[2*e][b]>>1) - (iid[2*e+1][b]>>1); /* scale 1 bit; squared -> 2 bit */ 3152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project dIcc = (icc[2*e][b]>>1) - (icc[2*e+1][b]>>1); 3162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iidMeanError += fPow2Div2(dIid)>>(5-1); /* + (bands=20) scale = 5 */ 3172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iccMeanError += fPow2Div2(dIcc)>>(5-1); 3182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } /* --> scaling = 7 bit = THRESH_SCALE !! */ 3192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* instead sqrt values are squared! 3212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project instead of division, multiply threshold with psBands 3222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project scaling necessary!! */ 3232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* quit as soon as threshold is reached */ 3252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (iidMeanError > (iidErrThreshold)) || 3262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project (iccMeanError > (iccErrThreshold)) ) { 3272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project reducible = 0; 3282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } /* nEnvelopes != 1 */ 3312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return reducible; 3332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 3342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void processIidData(PS_DATA *psData, 3372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL iid[PS_MAX_ENVELOPES][PS_MAX_BANDS], 3382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const INT psBands, 3392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const INT nEnvelopes, 3402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const FIXP_DBL quantErrorThreshold) 3412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 3422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT iidIdxFine [PS_MAX_ENVELOPES][PS_MAX_BANDS]; 3432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT iidIdxCoarse[PS_MAX_ENVELOPES][PS_MAX_BANDS]; 3442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL errIID = FL2FXCONST_DBL(0.f); 3462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL errIIDFine = FL2FXCONST_DBL(0.f); 3472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT bitsIidFreq = 0; 3482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT bitsIidTime = 0; 3492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT bitsFineTot = 0; 3502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT bitsCoarseTot = 0; 3512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT error = 0; 3522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT env, band; 3532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT diffMode[PS_MAX_ENVELOPES], diffModeFine[PS_MAX_ENVELOPES]; 3542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT loudnDiff = 0; 3552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT iidTransmit = 0; 3562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitsIidFreq = bitsIidTime = 0; 3582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Quantize IID coefficients */ 3602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(env=0;env<nEnvelopes; env++) { 3612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project errIID += quantizeCoef(iid[env], psBands, iidQuant_fx, 7, 15, iidIdxCoarse[env]); 3622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project errIIDFine += quantizeCoef(iid[env], psBands, iidQuantFine_fx, 15, 31, iidIdxFine[env]); 3632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* normalize error to number of envelopes, ps bands 3662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project errIID /= psBands*nEnvelopes; 3672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project errIIDFine /= psBands*nEnvelopes; */ 3682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Check if IID coefficients should be used in this frame */ 3712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project psData->iidEnable = 0; 3722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(env=0;env<nEnvelopes; env++) { 3732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(band=0;band<psBands;band++) { 3742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project loudnDiff += fixp_abs(iidIdxCoarse[env][band]); 3752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iidTransmit ++; 3762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(loudnDiff > fMultI(FL2FXCONST_DBL(0.7f),iidTransmit)){ /* 0.7f empiric value */ 3802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project psData->iidEnable = 1; 3812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* if iid not active -> RESET data */ 3842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(psData->iidEnable==0) { 3852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project psData->iidTimeCnt = MAX_TIME_DIFF_FRAMES; 3862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(env=0;env<nEnvelopes; env++) { 3872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project psData->iidDiffMode[env] = PS_DELTA_FREQ; 3882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear(psData->iidIdx[env], sizeof(INT)*psBands); 3892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return; 3912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* count COARSE quantization bits for first envelope*/ 3942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitsIidFreq = FDKsbrEnc_EncodeIid(NULL, iidIdxCoarse[0], NULL, psBands, PS_IID_RES_COARSE, PS_DELTA_FREQ, &error); 3952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if( (psData->iidTimeCnt>=MAX_TIME_DIFF_FRAMES) || (psData->iidQuantModeLast==PS_IID_RES_FINE) ) { 3972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitsIidTime = DO_NOT_USE_THIS_MODE; 3982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 4002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitsIidTime = FDKsbrEnc_EncodeIid(NULL, iidIdxCoarse[0], psData->iidIdxLast, psBands, PS_IID_RES_COARSE, PS_DELTA_TIME, &error); 4012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* decision DELTA_FREQ vs DELTA_TIME */ 4042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(bitsIidTime>bitsIidFreq) { 4052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project diffMode[0] = PS_DELTA_FREQ; 4062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitsCoarseTot = bitsIidFreq; 4072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 4092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project diffMode[0] = PS_DELTA_TIME; 4102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitsCoarseTot = bitsIidTime; 4112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* count COARSE quantization bits for following envelopes*/ 4142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(env=1;env<nEnvelopes; env++) { 4152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitsIidFreq = FDKsbrEnc_EncodeIid(NULL, iidIdxCoarse[env], NULL, psBands, PS_IID_RES_COARSE, PS_DELTA_FREQ, &error); 4162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitsIidTime = FDKsbrEnc_EncodeIid(NULL, iidIdxCoarse[env], iidIdxCoarse[env-1], psBands, PS_IID_RES_COARSE, PS_DELTA_TIME, &error); 4172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* decision DELTA_FREQ vs DELTA_TIME */ 4192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(bitsIidTime>bitsIidFreq) { 4202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project diffMode[env] = PS_DELTA_FREQ; 4212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitsCoarseTot += bitsIidFreq; 4222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 4242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project diffMode[env] = PS_DELTA_TIME; 4252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitsCoarseTot += bitsIidTime; 4262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* count FINE quantization bits for first envelope*/ 4312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitsIidFreq = FDKsbrEnc_EncodeIid(NULL, iidIdxFine[0], NULL, psBands, PS_IID_RES_FINE, PS_DELTA_FREQ, &error); 4322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if( (psData->iidTimeCnt>=MAX_TIME_DIFF_FRAMES) || (psData->iidQuantModeLast==PS_IID_RES_COARSE) ) { 4342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitsIidTime = DO_NOT_USE_THIS_MODE; 4352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 4372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitsIidTime = FDKsbrEnc_EncodeIid(NULL, iidIdxFine[0], psData->iidIdxLast, psBands, PS_IID_RES_FINE, PS_DELTA_TIME, &error); 4382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* decision DELTA_FREQ vs DELTA_TIME */ 4412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(bitsIidTime>bitsIidFreq) { 4422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project diffModeFine[0] = PS_DELTA_FREQ; 4432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitsFineTot = bitsIidFreq; 4442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 4462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project diffModeFine[0] = PS_DELTA_TIME; 4472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitsFineTot = bitsIidTime; 4482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* count FINE quantization bits for following envelopes*/ 4512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(env=1;env<nEnvelopes; env++) { 4522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitsIidFreq = FDKsbrEnc_EncodeIid(NULL, iidIdxFine[env], NULL, psBands, PS_IID_RES_FINE, PS_DELTA_FREQ, &error); 4532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitsIidTime = FDKsbrEnc_EncodeIid(NULL, iidIdxFine[env], iidIdxFine[env-1], psBands, PS_IID_RES_FINE, PS_DELTA_TIME, &error); 4542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* decision DELTA_FREQ vs DELTA_TIME */ 4562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(bitsIidTime>bitsIidFreq) { 4572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project diffModeFine[env] = PS_DELTA_FREQ; 4582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitsFineTot += bitsIidFreq; 4592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 4612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project diffModeFine[env] = PS_DELTA_TIME; 4622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitsFineTot += bitsIidTime; 4632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(bitsFineTot == bitsCoarseTot){ 4672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* if same number of bits is needed, use the quantization with lower error */ 4682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(errIIDFine < errIID){ 4692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitsCoarseTot = DO_NOT_USE_THIS_MODE; 4702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else { 4712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitsFineTot = DO_NOT_USE_THIS_MODE; 4722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else { 4742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* const FIXP_DBL minThreshold = FL2FXCONST_DBL(0.2f/(IID_SCALE_FT*PS_QUANT_SCALE_FT)*(psBands*nEnvelopes)); */ 4752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const FIXP_DBL minThreshold = (FIXP_DBL)((LONG)0x00019999 * (psBands*nEnvelopes)); 4762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* decision RES_FINE vs RES_COARSE */ 4782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* test if errIIDFine*quantErrorThreshold < errIID */ 4792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* shiftVal 2 comes from scaling of quantErrorThreshold */ 4802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(fixMax(((errIIDFine>>1)+(minThreshold>>1))>>1, fMult(quantErrorThreshold,errIIDFine)) < (errIID>>2) ) { 4812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitsCoarseTot = DO_NOT_USE_THIS_MODE; 4822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else if(fixMax(((errIID>>1)+(minThreshold>>1))>>1, fMult(quantErrorThreshold,errIID)) < (errIIDFine>>2) ) { 4842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitsFineTot = DO_NOT_USE_THIS_MODE; 4852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* decision RES_FINE vs RES_COARSE */ 4892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(bitsFineTot<bitsCoarseTot) { 4902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project psData->iidQuantMode = PS_IID_RES_FINE; 4912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(env=0;env<nEnvelopes; env++) { 4922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project psData->iidDiffMode[env] = diffModeFine[env]; 4932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy(psData->iidIdx[env], iidIdxFine[env], psBands*sizeof(INT)); 4942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 4972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project psData->iidQuantMode = PS_IID_RES_COARSE; 4982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(env=0;env<nEnvelopes; env++) { 4992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project psData->iidDiffMode[env] = diffMode[env]; 5002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy(psData->iidIdx[env], iidIdxCoarse[env], psBands*sizeof(INT)); 5012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Count DELTA_TIME encoding streaks */ 5052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(env=0;env<nEnvelopes; env++) { 5062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(psData->iidDiffMode[env]==PS_DELTA_TIME) 5072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project psData->iidTimeCnt++; 5082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else 5092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project psData->iidTimeCnt=0; 5102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 5122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT similarIid(PS_DATA *psData, 5152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const INT psBands, 5162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const INT nEnvelopes) 5172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 5182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const INT diffThr = (psData->iidQuantMode == PS_IID_RES_COARSE) ? 2 : 3; 5192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const INT sumDiffThr = diffThr * psBands/4; 5202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT similar = 0; 5212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT diff = 0; 5222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT sumDiff = 0; 5232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT env = 0; 5242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT b = 0; 5252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ((nEnvelopes == psData->nEnvelopesLast) && (nEnvelopes==1)) { 5262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project similar = 1; 5272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (env=0; env<nEnvelopes; env++) { 5282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sumDiff = 0; 5292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project b = 0; 5302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project do { 5312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project diff = fixp_abs(psData->iidIdx[env][b] - psData->iidIdxLast[b]); 5322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sumDiff += diff; 5332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (diff > diffThr) /* more than x quantization steps in any band */ 5342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project || (sumDiff > sumDiffThr) ) { /* more than x quantisations steps overall difference */ 5352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project similar = 0; 5362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project b++; 5382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } while ((b<psBands) && (similar>0)); 5392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } /* nEnvelopes==1 */ 5412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return similar; 5432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 5442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT similarIcc(PS_DATA *psData, 5472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const INT psBands, 5482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const INT nEnvelopes) 5492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 5502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const INT diffThr = 2; 5512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const INT sumDiffThr = diffThr * psBands/4; 5522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT similar = 0; 5532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT diff = 0; 5542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT sumDiff = 0; 5552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT env = 0; 5562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT b = 0; 5572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ((nEnvelopes == psData->nEnvelopesLast) && (nEnvelopes==1)) { 5582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project similar = 1; 5592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (env=0; env<nEnvelopes; env++) { 5602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sumDiff = 0; 5612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project b = 0; 5622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project do { 5632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project diff = fixp_abs(psData->iccIdx[env][b] - psData->iccIdxLast[b]); 5642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sumDiff += diff; 5652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (diff > diffThr) /* more than x quantisation step in any band */ 5662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project || (sumDiff > sumDiffThr) ) { /* more than x quantisations steps overall difference */ 5672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project similar = 0; 5682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project b++; 5702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } while ((b<psBands) && (similar>0)); 5712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } /* nEnvelopes==1 */ 5732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return similar; 5752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 5762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void processIccData(PS_DATA *psData, 5782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL icc[PS_MAX_ENVELOPES][PS_MAX_BANDS], /* const input values: unable to declare as const, since it does not poINT to const memory */ 5792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const INT psBands, 5802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const INT nEnvelopes) 5812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 5822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL errICC = FL2FXCONST_DBL(0.f); 5832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT env, band; 5842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT bitsIccFreq, bitsIccTime; 5852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT error = 0; 5862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT inCoherence=0, iccTransmit=0; 5872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT *iccIdxLast; 5882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iccIdxLast = psData->iccIdxLast; 5902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Quantize ICC coefficients */ 5922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(env=0;env<nEnvelopes; env++) { 5932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project errICC += quantizeCoef(icc[env], psBands, iccQuant, 0, 8, psData->iccIdx[env]); 5942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Check if ICC coefficients should be used */ 5972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project psData->iccEnable = 0; 5982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(env=0;env<nEnvelopes; env++) { 5992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(band=0;band<psBands;band++) { 6002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project inCoherence += psData->iccIdx[env][band]; 6012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iccTransmit ++; 6022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(inCoherence > fMultI(FL2FXCONST_DBL(0.5f),iccTransmit)){ /* 0.5f empiric value */ 6052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project psData->iccEnable = 1; 6062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(psData->iccEnable==0) { 6092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project psData->iccTimeCnt = MAX_TIME_DIFF_FRAMES; 6102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(env=0;env<nEnvelopes; env++) { 6112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project psData->iccDiffMode[env] = PS_DELTA_FREQ; 6122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear(psData->iccIdx[env], sizeof(INT)*psBands); 6132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return; 6152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(env=0;env<nEnvelopes; env++) { 6182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitsIccFreq = FDKsbrEnc_EncodeIcc(NULL, psData->iccIdx[env], NULL, psBands, PS_DELTA_FREQ, &error); 6192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(psData->iccTimeCnt<MAX_TIME_DIFF_FRAMES) { 6212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitsIccTime = FDKsbrEnc_EncodeIcc(NULL, psData->iccIdx[env], iccIdxLast, psBands, PS_DELTA_TIME, &error); 6222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 6242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitsIccTime = DO_NOT_USE_THIS_MODE; 6252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(bitsIccFreq>bitsIccTime) { 6282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project psData->iccDiffMode[env] = PS_DELTA_TIME; 6292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project psData->iccTimeCnt++; 6302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 6322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project psData->iccDiffMode[env] = PS_DELTA_FREQ; 6332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project psData->iccTimeCnt=0; 6342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iccIdxLast = psData->iccIdx[env]; 6362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 6382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void calculateIID(FIXP_DBL ldPwrL[PS_MAX_ENVELOPES][PS_MAX_BANDS], 6402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL ldPwrR[PS_MAX_ENVELOPES][PS_MAX_BANDS], 6412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL iid[PS_MAX_ENVELOPES][PS_MAX_BANDS], 6422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT nEnvelopes, 6432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT psBands) 6442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 6452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT i=0; 6462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT env=0; 6472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(env=0; env<nEnvelopes;env++) { 6482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i=0; i<psBands; i++) { 6492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* iid[env][i] = 10.0f*(float)log10(pwrL[env][i]/pwrR[env][i]); 6512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 6522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL IID = fMultDiv2( FL2FXCONST_DBL(LOG10_2_10/IID_SCALE_FT), (ldPwrL[env][i]-ldPwrR[env][i]) ); 6532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project IID = fixMin( IID, (FIXP_DBL)(MAXVAL_DBL>>(LD_DATA_SHIFT+1)) ); 6552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project IID = fixMax( IID, (FIXP_DBL)(MINVAL_DBL>>(LD_DATA_SHIFT+1)) ); 6562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iid[env][i] = IID << (LD_DATA_SHIFT+1); 6572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 6602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void calculateICC(FIXP_DBL ldPwrL[PS_MAX_ENVELOPES][PS_MAX_BANDS], 6622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL ldPwrR[PS_MAX_ENVELOPES][PS_MAX_BANDS], 6632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL pwrCr[PS_MAX_ENVELOPES][PS_MAX_BANDS], 6642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL pwrCi[PS_MAX_ENVELOPES][PS_MAX_BANDS], 6652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL icc[PS_MAX_ENVELOPES][PS_MAX_BANDS], 6662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT nEnvelopes, 6672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT psBands) 6682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 6692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT i = 0; 6702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT env = 0; 6712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT border = psBands; 6722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch (psBands) { 6742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case PS_BANDS_COARSE: 6752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project border = 5; 6762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 6772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case PS_BANDS_MID: 6782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project border = 11; 6792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 6802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 6812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 6822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(env=0; env<nEnvelopes;env++) { 6852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i=0; i<border; i++) { 6862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* icc[env][i] = min( pwrCr[env][i] / (float) sqrt(pwrL[env][i] * pwrR[env][i]) , 1.f); 6882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 6892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL ICC, invNrg = CalcInvLdData ( -((ldPwrL[env][i]>>1) + (ldPwrR[env][i]>>1) + (FIXP_DBL)1) ); 6902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT scale, invScale = CountLeadingBits(invNrg); 6912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project scale = (DFRACT_BITS-1) - invScale; 6932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ICC = fMult(pwrCr[env][i], invNrg<<invScale) ; 6942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project icc[env][i] = SATURATE_LEFT_SHIFT(ICC, scale, DFRACT_BITS); 6952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (; i<psBands; i++) { 6982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT sc1, sc2; 6992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL cNrgR, cNrgI, ICC; 7002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sc1 = CountLeadingBits( fixMax(fixp_abs(pwrCr[env][i]),fixp_abs(pwrCi[env][i])) ) ; 7022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cNrgR = fPow2Div2((pwrCr[env][i]<<sc1)); /* squared nrg's expect explicit scaling */ 7032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cNrgI = fPow2Div2((pwrCi[env][i]<<sc1)); 7042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ICC = CalcInvLdData( (CalcLdData((cNrgR + cNrgI)>>1)>>1) - (FIXP_DBL)((sc1-1)<<(DFRACT_BITS-1-LD_DATA_SHIFT)) ); 7062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL invNrg = CalcInvLdData ( -((ldPwrL[env][i]>>1) + (ldPwrR[env][i]>>1) + (FIXP_DBL)1) ); 7082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sc1 = CountLeadingBits(invNrg); 7092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project invNrg <<= sc1; 7102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sc2 = CountLeadingBits(ICC); 7122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ICC = fMult(ICC<<sc2,invNrg); 7132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sc1 = ( (DFRACT_BITS-1) - sc1 - sc2 ); 7152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (sc1 < 0) { 7162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ICC >>= -sc1; 7172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 7192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (ICC >= ((FIXP_DBL)MAXVAL_DBL>>sc1) ) 7202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ICC = (FIXP_DBL)MAXVAL_DBL; 7212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else 7222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ICC <<= sc1; 7232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project icc[env][i] = ICC; 7262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 7292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid FDKsbrEnc_initPsBandNrgScale(HANDLE_PS_ENCODE hPsEncode) 7312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 7322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT group, bin; 7332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT nIidGroups = hPsEncode->nQmfIidGroups + hPsEncode->nSubQmfIidGroups; 7342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear(hPsEncode->psBandNrgScale, PS_MAX_BANDS*sizeof(SCHAR)); 7362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (group=0; group < nIidGroups; group++) { 7382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Translate group to bin */ 7392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bin = hPsEncode->subband2parameterIndex[group]; 7402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Translate from 20 bins to 10 bins */ 7422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hPsEncode->psEncMode == PS_BANDS_COARSE) { 7432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bin = bin>>1; 7442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsEncode->psBandNrgScale[bin] = (hPsEncode->psBandNrgScale[bin]==0) 7472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ? (hPsEncode->iidGroupWidthLd[group] + 5) 7482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project : (fixMax(hPsEncode->iidGroupWidthLd[group],hPsEncode->psBandNrgScale[bin]) + 1) ; 7492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 7522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7532228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFDK_PSENC_ERROR FDKsbrEnc_CreatePSEncode( 7542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_PS_ENCODE *phPsEncode 7552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) 7562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 7572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_PSENC_ERROR error = PSENC_OK; 7582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (phPsEncode==NULL) { 7602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project error = PSENC_INVALID_HANDLE; 7612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 7632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_PS_ENCODE hPsEncode = NULL; 7642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (NULL==(hPsEncode = GetRam_PsEncode())) { 7652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project error = PSENC_MEMORY_ERROR; 7662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project goto bail; 7672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear(hPsEncode,sizeof(PS_ENCODE)); 7692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *phPsEncode = hPsEncode; /* return allocated handle */ 7702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail: 7722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return error; 7732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 7742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7752228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFDK_PSENC_ERROR FDKsbrEnc_InitPSEncode( 7762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_PS_ENCODE hPsEncode, 7772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const PS_BANDS psEncMode, 7782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const FIXP_DBL iidQuantErrorThreshold 7792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) 7802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 7812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_PSENC_ERROR error = PSENC_OK; 7822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (NULL==hPsEncode) { 7842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project error = PSENC_INVALID_HANDLE; 7852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 7872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (PSENC_OK != (InitPSData(&hPsEncode->psData))) { 7882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project goto bail; 7892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch(psEncMode){ 7922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case PS_BANDS_COARSE: 7932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case PS_BANDS_MID: 7942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsEncode->nQmfIidGroups = QMF_GROUPS_LO_RES; 7952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsEncode->nSubQmfIidGroups = SUBQMF_GROUPS_LO_RES; 7962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy(hPsEncode->iidGroupBorders, iidGroupBordersLoRes, (hPsEncode->nQmfIidGroups + hPsEncode->nSubQmfIidGroups + 1)*sizeof(INT)); 7972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy(hPsEncode->subband2parameterIndex, subband2parameter20, (hPsEncode->nQmfIidGroups + hPsEncode->nSubQmfIidGroups) *sizeof(INT)); 7982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy(hPsEncode->iidGroupWidthLd, iidGroupWidthLdLoRes, (hPsEncode->nQmfIidGroups + hPsEncode->nSubQmfIidGroups) *sizeof(UCHAR)); 7992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 8002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 8012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project error = PSENC_INIT_ERROR; 8022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project goto bail; 8032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsEncode->psEncMode = psEncMode; 8062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsEncode->iidQuantErrorThreshold = iidQuantErrorThreshold; 8072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKsbrEnc_initPsBandNrgScale(hPsEncode); 8082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail: 8102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return error; 8112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 8122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8142228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFDK_PSENC_ERROR FDKsbrEnc_DestroyPSEncode( 8152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_PS_ENCODE *phPsEncode 8162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) 8172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 8182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_PSENC_ERROR error = PSENC_OK; 8192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (NULL !=phPsEncode) { 8212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FreeRam_PsEncode(phPsEncode); 8222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return error; 8252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 8262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projecttypedef struct { 8282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL pwrL[PS_MAX_ENVELOPES][PS_MAX_BANDS]; 8292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL pwrR[PS_MAX_ENVELOPES][PS_MAX_BANDS]; 8302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL ldPwrL[PS_MAX_ENVELOPES][PS_MAX_BANDS]; 8312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL ldPwrR[PS_MAX_ENVELOPES][PS_MAX_BANDS]; 8322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL pwrCr[PS_MAX_ENVELOPES][PS_MAX_BANDS]; 8332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL pwrCi[PS_MAX_ENVELOPES][PS_MAX_BANDS]; 8342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} PS_PWR_DATA; 8362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8382228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFDK_PSENC_ERROR FDKsbrEnc_PSEncode( 8392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_PS_ENCODE hPsEncode, 8402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_PS_OUT hPsOut, 8412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR *dynBandScale, 8422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT maxEnvelopes, 8432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *hybridData[HYBRID_FRAMESIZE][MAX_PS_CHANNELS][2], 8442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const INT frameSize, 8452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const INT sendHeader 8462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) 8472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 8482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_PSENC_ERROR error = PSENC_OK; 8492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_PS_DATA hPsData = &hPsEncode->psData; 8512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL iid [PS_MAX_ENVELOPES][PS_MAX_BANDS]; 8522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL icc [PS_MAX_ENVELOPES][PS_MAX_BANDS]; 8532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int envBorder[PS_MAX_ENVELOPES+1]; 8542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int group, bin, col, subband, band; 8562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int i = 0; 8572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int env = 0; 8592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int psBands = (int) hPsEncode->psEncMode; 8602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int nIidGroups = hPsEncode->nQmfIidGroups + hPsEncode->nSubQmfIidGroups; 8612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int nEnvelopes = fixMin(maxEnvelopes, (UINT)PS_MAX_ENVELOPES); 8622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project C_ALLOC_SCRATCH_START(pwrData, PS_PWR_DATA, 1); 8642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(env=0; env<nEnvelopes+1;env++) { 8662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project envBorder[env] = fMultI(GetInvInt(nEnvelopes),frameSize*env); 8672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(env=0; env<nEnvelopes;env++) { 8702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* clear energy array */ 8722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (band=0; band<psBands; band++) { 8732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pwrData->pwrL[env][band] = pwrData->pwrR[env][band] = pwrData->pwrCr[env][band] = pwrData->pwrCi[env][band] = FIXP_DBL(1); 8742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /**** calculate energies and correlation ****/ 8772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* start with hybrid data */ 8792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (group=0; group < nIidGroups; group++) { 8802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Translate group to bin */ 8812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bin = hPsEncode->subband2parameterIndex[group]; 8822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Translate from 20 bins to 10 bins */ 8842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hPsEncode->psEncMode == PS_BANDS_COARSE) { 8852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bin >>= 1; 8862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* determine group border */ 8892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int bScale = hPsEncode->psBandNrgScale[bin]; 8902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL pwrL_env_bin = pwrData->pwrL[env][bin]; 8922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL pwrR_env_bin = pwrData->pwrR[env][bin]; 8932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL pwrCr_env_bin = pwrData->pwrCr[env][bin]; 8942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL pwrCi_env_bin = pwrData->pwrCi[env][bin]; 8952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int scale = (int)dynBandScale[bin]; 8972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (col=envBorder[env]; col<envBorder[env+1]; col++) { 8982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (subband = hPsEncode->iidGroupBorders[group]; subband < hPsEncode->iidGroupBorders[group+1]; subband++) { 8992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_QMF l_real = (hybridData[col][0][0][subband]) << scale; 9002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_QMF l_imag = (hybridData[col][0][1][subband]) << scale; 9012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_QMF r_real = (hybridData[col][1][0][subband]) << scale; 9022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_QMF r_imag = (hybridData[col][1][1][subband]) << scale; 9032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pwrL_env_bin += (fPow2Div2(l_real) + fPow2Div2(l_imag)) >> bScale; 9052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pwrR_env_bin += (fPow2Div2(r_real) + fPow2Div2(r_imag)) >> bScale; 9062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pwrCr_env_bin += (fMultDiv2(l_real, r_real) + fMultDiv2(l_imag, r_imag)) >> bScale; 9072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pwrCi_env_bin += (fMultDiv2(r_real, l_imag) - fMultDiv2(l_real, r_imag)) >> bScale; 9082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* assure, nrg's of left and right channel are not negative; necessary on 16 bit multiply units */ 9112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pwrData->pwrL[env][bin] = fixMax((FIXP_DBL)0,pwrL_env_bin); 9122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pwrData->pwrR[env][bin] = fixMax((FIXP_DBL)0,pwrR_env_bin); 9132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pwrData->pwrCr[env][bin] = pwrCr_env_bin; 9152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pwrData->pwrCi[env][bin] = pwrCi_env_bin; 9162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } /* nIidGroups */ 9182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* calc logarithmic energy */ 9202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project LdDataVector(pwrData->pwrL[env], pwrData->ldPwrL[env], psBands); 9212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project LdDataVector(pwrData->pwrR[env], pwrData->ldPwrR[env], psBands); 9222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } /* nEnvelopes */ 9242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* calculate iid and icc */ 9262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project calculateIID(pwrData->ldPwrL, pwrData->ldPwrR, iid, nEnvelopes, psBands); 9272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project calculateICC(pwrData->ldPwrL, pwrData->ldPwrR, pwrData->pwrCr, pwrData->pwrCi, icc, nEnvelopes, psBands); 9282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /*** Envelope Reduction ***/ 9302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project while (envelopeReducible(iid,icc,psBands,nEnvelopes)) { 9312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int e=0; 9322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* sum energies of two neighboring envelopes */ 9332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nEnvelopes >>= 1; 9342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (e=0; e<nEnvelopes; e++) { 9352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKsbrEnc_addFIXP_DBL(pwrData->pwrL[2*e], pwrData->pwrL[2*e+1], pwrData->pwrL[e], psBands); 9362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKsbrEnc_addFIXP_DBL(pwrData->pwrR[2*e], pwrData->pwrR[2*e+1], pwrData->pwrR[e], psBands); 9372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKsbrEnc_addFIXP_DBL(pwrData->pwrCr[2*e],pwrData->pwrCr[2*e+1],pwrData->pwrCr[e],psBands); 9382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKsbrEnc_addFIXP_DBL(pwrData->pwrCi[2*e],pwrData->pwrCi[2*e+1],pwrData->pwrCi[e],psBands); 9392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* calc logarithmic energy */ 9412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project LdDataVector(pwrData->pwrL[e], pwrData->ldPwrL[e], psBands); 9422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project LdDataVector(pwrData->pwrR[e], pwrData->ldPwrR[e], psBands); 9432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* reduce number of envelopes and adjust borders */ 9452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project envBorder[e] = envBorder[2*e]; 9462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project envBorder[nEnvelopes] = envBorder[2*nEnvelopes]; 9482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* re-calculate iid and icc */ 9502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project calculateIID(pwrData->ldPwrL, pwrData->ldPwrR, iid, nEnvelopes, psBands); 9512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project calculateICC(pwrData->ldPwrL, pwrData->ldPwrR, pwrData->pwrCr, pwrData->pwrCi, icc, nEnvelopes, psBands); 9522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* */ 9562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(sendHeader) { 9572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsData->headerCnt = MAX_PS_NOHEADER_CNT; 9582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsData->iidTimeCnt = MAX_TIME_DIFF_FRAMES; 9592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsData->iccTimeCnt = MAX_TIME_DIFF_FRAMES; 9602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsData->noEnvCnt = MAX_NOENV_CNT; 9612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /*** Parameter processing, quantisation etc ***/ 9642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project processIidData(hPsData, iid, psBands, nEnvelopes, hPsEncode->iidQuantErrorThreshold); 9652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project processIccData(hPsData, icc, psBands, nEnvelopes); 9662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /*** Initialize output struct ***/ 9692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* PS Header on/off ? */ 9712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if( (hPsData->headerCnt<MAX_PS_NOHEADER_CNT) 9722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project && ( (hPsData->iidQuantMode == hPsData->iidQuantModeLast) && (hPsData->iccQuantMode == hPsData->iccQuantModeLast) ) 9732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project && ( (hPsData->iidEnable == hPsData->iidEnableLast) && (hPsData->iccEnable == hPsData->iccEnableLast) ) ) { 9742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsOut->enablePSHeader = 0; 9752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 9772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsOut->enablePSHeader = 1; 9782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsData->headerCnt = 0; 9792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* nEnvelopes = 0 ? */ 9822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (hPsData->noEnvCnt < MAX_NOENV_CNT) 9832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project && (similarIid(hPsData, psBands, nEnvelopes)) 9842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project && (similarIcc(hPsData, psBands, nEnvelopes)) ) { 9852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsOut->nEnvelopes = nEnvelopes = 0; 9862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsData->noEnvCnt++; 9872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else { 9882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsData->noEnvCnt = 0; 9892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (nEnvelopes>0) { 9932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsOut->enableIID = hPsData->iidEnable; 9952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsOut->iidMode = getIIDMode(psBands, hPsData->iidQuantMode); 9962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsOut->enableICC = hPsData->iccEnable; 9982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsOut->iccMode = getICCMode(psBands, hPsData->iccQuantMode); 9992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsOut->enableIpdOpd = 0; 10012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsOut->frameClass = 0; 10022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsOut->nEnvelopes = nEnvelopes; 10032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(env=0; env<nEnvelopes; env++) { 10052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsOut->frameBorder[env] = envBorder[env+1]; 10062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(env=0; env<hPsOut->nEnvelopes; env++) { 10092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsOut->deltaIID[env] = (PS_DELTA)hPsData->iidDiffMode[env]; 10102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(band=0; band<psBands; band++) { 10122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsOut->iid[env][band] = hPsData->iidIdx[env][band]; 10132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(env=0; env<hPsOut->nEnvelopes; env++) { 10172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsOut->deltaICC[env] = (PS_DELTA)hPsData->iccDiffMode[env]; 10182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(band=0; band<psBands; band++) { 10192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsOut->icc[env][band] = hPsData->iccIdx[env][band]; 10202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* IPD OPD not supported right now */ 10242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear(hPsOut->ipd, PS_MAX_ENVELOPES*PS_MAX_BANDS*sizeof(PS_DELTA)); 10252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(env=0; env<PS_MAX_ENVELOPES; env++) { 10262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsOut->deltaIPD[env] = PS_DELTA_FREQ; 10272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsOut->deltaOPD[env] = PS_DELTA_FREQ; 10282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear(hPsOut->ipdLast, PS_MAX_BANDS*sizeof(INT)); 10312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear(hPsOut->opdLast, PS_MAX_BANDS*sizeof(INT)); 10322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(band=0; band<PS_MAX_BANDS; band++) { 10342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsOut->iidLast[band] = hPsData->iidIdxLast[band]; 10352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsOut->iccLast[band] = hPsData->iccIdxLast[band]; 10362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* save iids and iccs for differential time coding in the next frame */ 10392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsData->nEnvelopesLast = nEnvelopes; 10402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsData->iidEnableLast = hPsData->iidEnable; 10412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsData->iccEnableLast = hPsData->iccEnable; 10422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsData->iidQuantModeLast = hPsData->iidQuantMode; 10432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsData->iccQuantModeLast = hPsData->iccQuantMode; 10442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i=0; i<psBands; i++) { 10452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsData->iidIdxLast[i] = hPsData->iidIdx[nEnvelopes-1][i]; 10462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hPsData->iccIdxLast[i] = hPsData->iccIdx[nEnvelopes-1][i]; 10472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } /* Envelope > 0 */ 10492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project C_ALLOC_SCRATCH_END(pwrData, PS_PWR_DATA, 1) 10512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return error; 10532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 10542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1055