| /* ----------------------------------------------------------------------------- |
| Software License for The Fraunhofer FDK AAC Codec Library for Android |
| |
| © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten |
| Forschung e.V. All rights reserved. |
| |
| 1. INTRODUCTION |
| The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software |
| that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding |
| scheme for digital audio. This FDK AAC Codec software is intended to be used on |
| a wide variety of Android devices. |
| |
| AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient |
| general perceptual audio codecs. AAC-ELD is considered the best-performing |
| full-bandwidth communications codec by independent studies and is widely |
| deployed. AAC has been standardized by ISO and IEC as part of the MPEG |
| specifications. |
| |
| Patent licenses for necessary patent claims for the FDK AAC Codec (including |
| those of Fraunhofer) may be obtained through Via Licensing |
| (www.vialicensing.com) or through the respective patent owners individually for |
| the purpose of encoding or decoding bit streams in products that are compliant |
| with the ISO/IEC MPEG audio standards. Please note that most manufacturers of |
| Android devices already license these patent claims through Via Licensing or |
| directly from the patent owners, and therefore FDK AAC Codec software may |
| already be covered under those patent licenses when it is used for those |
| licensed purposes only. |
| |
| Commercially-licensed AAC software libraries, including floating-point versions |
| with enhanced sound quality, are also available from Fraunhofer. Users are |
| encouraged to check the Fraunhofer website for additional applications |
| information and documentation. |
| |
| 2. COPYRIGHT LICENSE |
| |
| Redistribution and use in source and binary forms, with or without modification, |
| are permitted without payment of copyright license fees provided that you |
| satisfy the following conditions: |
| |
| You must retain the complete text of this software license in redistributions of |
| the FDK AAC Codec or your modifications thereto in source code form. |
| |
| You must retain the complete text of this software license in the documentation |
| and/or other materials provided with redistributions of the FDK AAC Codec or |
| your modifications thereto in binary form. You must make available free of |
| charge copies of the complete source code of the FDK AAC Codec and your |
| modifications thereto to recipients of copies in binary form. |
| |
| The name of Fraunhofer may not be used to endorse or promote products derived |
| from this library without prior written permission. |
| |
| You may not charge copyright license fees for anyone to use, copy or distribute |
| the FDK AAC Codec software or your modifications thereto. |
| |
| Your modified versions of the FDK AAC Codec must carry prominent notices stating |
| that you changed the software and the date of any change. For modified versions |
| of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" |
| must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK |
| AAC Codec Library for Android." |
| |
| 3. NO PATENT LICENSE |
| |
| NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without |
| limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. |
| Fraunhofer provides no warranty of patent non-infringement with respect to this |
| software. |
| |
| You may use this FDK AAC Codec software or modifications thereto only for |
| purposes that are authorized by appropriate patent licenses. |
| |
| 4. DISCLAIMER |
| |
| This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright |
| holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, |
| including but not limited to the implied warranties of merchantability and |
| fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR |
| CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, |
| or consequential damages, including but not limited to procurement of substitute |
| goods or services; loss of use, data, or profits, or business interruption, |
| however caused and on any theory of liability, whether in contract, strict |
| liability, or tort (including negligence), arising in any way out of the use of |
| this software, even if advised of the possibility of such damage. |
| |
| 5. CONTACT INFORMATION |
| |
| Fraunhofer Institute for Integrated Circuits IIS |
| Attention: Audio and Multimedia Departments - FDK AAC LL |
| Am Wolfsmantel 33 |
| 91058 Erlangen, Germany |
| |
| www.iis.fraunhofer.de/amm |
| amm-info@iis.fraunhofer.de |
| ----------------------------------------------------------------------------- */ |
| |
| /**************************** SBR decoder library ****************************** |
| |
| Author(s): Matthias Hildenbrand |
| |
| Description: Decode Predictive Vector Coding Data |
| |
| *******************************************************************************/ |
| |
| #include "pvc_dec.h" |
| |
| /* PVC interal definitions */ |
| #define PVC_DIVMODE_BITS 3 |
| #define PVC_NSMODE_BITS 1 |
| #define PVC_REUSEPVCID_BITS 1 |
| #define PVC_PVCID_BITS 7 |
| #define PVC_GRIDINFO_BITS 1 |
| #define PVC_NQMFBAND 64 |
| #define PVC_NBLOW 3 /* max. number of grouped QMF subbands below SBR range */ |
| |
| #define PVC_NTAB1 3 |
| #define PVC_NTAB2 128 |
| #define PVC_ID_NBIT 7 |
| |
| /* Exponent of pPvcStaticData->Esg and predictedEsg in dB domain. |
| max(Esg) = 10*log10(2^15*2^15) = 90.30; |
| min(Esg) = 10*log10(0.1) = -10 |
| max of predicted Esg seems to be higher than 90dB but 7 Bit should be enough. |
| */ |
| #define PVC_ESG_EXP 7 |
| |
| #define LOG10FAC 0.752574989159953f /* == 10/log2(10) * 2^-2 */ |
| #define LOG10FAC_INV 0.664385618977472f /* == log2(10)/10 * 2^1 */ |
| |
| RAM_ALIGN |
| LNK_SECTION_CONSTDATA |
| static const FIXP_SGL pvc_SC_16[] = { |
| FX_DBL2FXCONST_SGL(0x14413695), FX_DBL2FXCONST_SGL(0x1434b6cb), |
| FX_DBL2FXCONST_SGL(0x140f27c7), FX_DBL2FXCONST_SGL(0x13d0591d), |
| FX_DBL2FXCONST_SGL(0x1377f502), FX_DBL2FXCONST_SGL(0x130577d6), |
| FX_DBL2FXCONST_SGL(0x12782266), FX_DBL2FXCONST_SGL(0x11cee459), |
| FX_DBL2FXCONST_SGL(0x11083a2a), FX_DBL2FXCONST_SGL(0x1021f5e9), |
| FX_DBL2FXCONST_SGL(0x0f18e17c), FX_DBL2FXCONST_SGL(0x0de814ca), |
| FX_DBL2FXCONST_SGL(0x0c87a568), FX_DBL2FXCONST_SGL(0x0ae9b167), |
| FX_DBL2FXCONST_SGL(0x08f24226), FX_DBL2FXCONST_SGL(0x06575ed5), |
| }; |
| |
| RAM_ALIGN |
| LNK_SECTION_CONSTDATA |
| static const FIXP_SGL pvc_SC_12[] = { |
| FX_DBL2FXCONST_SGL(0x1aba6b3e), FX_DBL2FXCONST_SGL(0x1a9d164e), |
| FX_DBL2FXCONST_SGL(0x1a44d56d), FX_DBL2FXCONST_SGL(0x19b0d742), |
| FX_DBL2FXCONST_SGL(0x18df969a), FX_DBL2FXCONST_SGL(0x17ce91a0), |
| FX_DBL2FXCONST_SGL(0x1679c3fa), FX_DBL2FXCONST_SGL(0x14daabfc), |
| FX_DBL2FXCONST_SGL(0x12e65221), FX_DBL2FXCONST_SGL(0x1088d125), |
| FX_DBL2FXCONST_SGL(0x0d9907b3), FX_DBL2FXCONST_SGL(0x09a80e9d), |
| }; |
| |
| RAM_ALIGN |
| LNK_SECTION_CONSTDATA |
| static const FIXP_SGL pvc_SC_4[] = { |
| FX_DBL2FXCONST_SGL(0x4ad6ab0f), |
| FX_DBL2FXCONST_SGL(0x47ef0dbe), |
| FX_DBL2FXCONST_SGL(0x3eee7496), |
| FX_DBL2FXCONST_SGL(0x2e4bd29d), |
| }; |
| |
| RAM_ALIGN |
| LNK_SECTION_CONSTDATA |
| static const FIXP_SGL pvc_SC_3[] = { |
| FX_DBL2FXCONST_SGL(0x610dc761), |
| FX_DBL2FXCONST_SGL(0x5a519a3d), |
| FX_DBL2FXCONST_SGL(0x44a09e62), |
| }; |
| |
| static const UCHAR g_3a_pvcTab1_mode1[PVC_NTAB1][PVC_NBLOW][PVC_NBHIGH_MODE1] = |
| {{{0x4F, 0x5B, 0x57, 0x52, 0x4D, 0x65, 0x45, 0x57}, |
| {0xF3, 0x0F, 0x18, 0x20, 0x19, 0x4F, 0x3D, 0x23}, |
| {0x78, 0x57, 0x55, 0x50, 0x50, 0x20, 0x36, 0x37}}, |
| {{0x4C, 0x5F, 0x53, 0x37, 0x1E, 0xFD, 0x15, 0x0A}, |
| {0x05, 0x0E, 0x28, 0x41, 0x48, 0x6E, 0x54, 0x5B}, |
| {0x59, 0x47, 0x40, 0x40, 0x3D, 0x33, 0x3F, 0x39}}, |
| {{0x47, 0x5F, 0x57, 0x34, 0x3C, 0x2E, 0x2E, 0x31}, |
| {0xFA, 0x13, 0x23, 0x4E, 0x44, 0x7C, 0x34, 0x38}, |
| {0x63, 0x43, 0x41, 0x3D, 0x35, 0x19, 0x3D, 0x33}}}; |
| |
| static const UCHAR g_2a_pvcTab2_mode1[PVC_NTAB2][PVC_NBHIGH_MODE1] = { |
| {0xCB, 0xD1, 0xCC, 0xD2, 0xE2, 0xEB, 0xE7, 0xE8}, |
| {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, |
| {0x84, 0x8C, 0x88, 0x83, 0x90, 0x93, 0x86, 0x80}, |
| {0xD7, 0xD8, 0xC0, 0xC7, 0xCF, 0xE5, 0xF1, 0xF6}, |
| {0xA5, 0xA6, 0xAA, 0xA8, 0xB0, 0xB1, 0xB8, 0xB8}, |
| {0xD7, 0xCB, 0xC1, 0xC3, 0xC5, 0xC9, 0xC9, 0xCE}, |
| {0xCA, 0xB5, 0xB8, 0xB3, 0xAC, 0xB6, 0xBB, 0xB8}, |
| {0xC1, 0xC4, 0xC3, 0xC5, 0xC6, 0xCA, 0xCA, 0xCB}, |
| {0xE0, 0xE1, 0xD8, 0xCD, 0xCB, 0xCB, 0xCE, 0xCC}, |
| {0xDB, 0xE1, 0xDF, 0xDB, 0xDC, 0xD9, 0xD9, 0xD6}, |
| {0xE0, 0xDE, 0xDD, 0xDD, 0xE0, 0xE3, 0xE5, 0xE6}, |
| {0xCA, 0xD2, 0xCD, 0xCE, 0xD5, 0xDB, 0xD9, 0xDB}, |
| {0xD2, 0xE0, 0xDB, 0xD5, 0xDB, 0xDE, 0xE3, 0xE1}, |
| {0xE5, 0xDB, 0xD0, 0xD2, 0xD8, 0xDD, 0xDB, 0xDD}, |
| {0xC0, 0xB5, 0xBF, 0xDD, 0xE3, 0xDC, 0xDC, 0xE4}, |
| {0xDB, 0xCE, 0xC6, 0xCF, 0xCF, 0xD1, 0xD3, 0xD4}, |
| {0xC9, 0xD7, 0xDA, 0xE2, 0xE9, 0xE7, 0xDF, 0xDC}, |
| {0x0A, 0x07, 0x0A, 0x08, 0x19, 0x24, 0x1F, 0x22}, |
| {0x1E, 0x1F, 0x11, 0x0E, 0x22, 0x2D, 0x33, 0x32}, |
| {0xF0, 0xDA, 0xDC, 0x18, 0x1F, 0x19, 0x0A, 0x1E}, |
| {0x09, 0xF8, 0xE6, 0x05, 0x19, 0x11, 0x0E, 0x0B}, |
| {0x09, 0x10, 0x0E, 0xE6, 0xF4, 0x20, 0x22, 0xFA}, |
| {0xF2, 0xE5, 0xF8, 0x0E, 0x18, 0x15, 0x0D, 0x10}, |
| {0x15, 0x13, 0x16, 0x0A, 0x0D, 0x1F, 0x1D, 0x1B}, |
| {0xFA, 0xFF, 0xFE, 0xFF, 0x09, 0x11, 0x03, 0x0B}, |
| {0xFE, 0xFA, 0xF2, 0xF8, 0x0C, 0x1E, 0x11, 0x12}, |
| {0xFA, 0xF8, 0x0B, 0x17, 0x1D, 0x17, 0x0E, 0x16}, |
| {0x00, 0xF3, 0xFD, 0x0A, 0x1C, 0x17, 0xFD, 0x08}, |
| {0xEA, 0xEA, 0x03, 0x12, 0x1E, 0x14, 0x09, 0x04}, |
| {0x02, 0xFE, 0x04, 0xFB, 0x0C, 0x0E, 0x07, 0x02}, |
| {0xF6, 0x02, 0x07, 0x0B, 0x17, 0x17, 0x01, 0xFF}, |
| {0xF5, 0xFB, 0xFE, 0x04, 0x12, 0x14, 0x0C, 0x0D}, |
| {0x10, 0x10, 0x0E, 0x04, 0x07, 0x11, 0x0F, 0x13}, |
| {0x0C, 0x0F, 0xFB, 0xF2, 0x0A, 0x12, 0x09, 0x0D}, |
| {0x0D, 0x1D, 0xF1, 0xF4, 0x2A, 0x06, 0x3B, 0x32}, |
| {0xFC, 0x08, 0x06, 0x02, 0x0E, 0x17, 0x08, 0x0E}, |
| {0x07, 0x02, 0xEE, 0xEE, 0x2B, 0xF6, 0x23, 0x13}, |
| {0x04, 0x02, 0x05, 0x08, 0x0B, 0x0E, 0xFB, 0xFB}, |
| {0x00, 0x04, 0x10, 0x18, 0x22, 0x25, 0x1D, 0x1F}, |
| {0xFB, 0x0D, 0x07, 0x00, 0x0C, 0x0F, 0xFC, 0x02}, |
| {0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0x03, 0x05}, |
| {0x04, 0x05, 0x08, 0x13, 0xFF, 0xEB, 0x0C, 0x06}, |
| {0x05, 0x13, 0x0E, 0x0B, 0x12, 0x15, 0x09, 0x0A}, |
| {0x09, 0x03, 0x09, 0x05, 0x12, 0x16, 0x11, 0x12}, |
| {0x14, 0x1A, 0x06, 0x01, 0x10, 0x11, 0xFE, 0x02}, |
| {0x01, 0x0B, 0x0B, 0x0C, 0x18, 0x21, 0x10, 0x13}, |
| {0x12, 0x0D, 0x0A, 0x10, 0x1C, 0x1D, 0x0D, 0x10}, |
| {0x03, 0x09, 0x14, 0x15, 0x1B, 0x1A, 0x01, 0xFF}, |
| {0x08, 0x12, 0x13, 0x0E, 0x16, 0x1D, 0x14, 0x1B}, |
| {0x07, 0x15, 0x1C, 0x1B, 0x20, 0x21, 0x11, 0x0E}, |
| {0x12, 0x18, 0x19, 0x17, 0x20, 0x25, 0x1A, 0x1E}, |
| {0x0C, 0x1A, 0x1D, 0x22, 0x2F, 0x33, 0x27, 0x28}, |
| {0x0E, 0x1A, 0x17, 0x10, 0x0A, 0x0E, 0xFF, 0x06}, |
| {0x1A, 0x1C, 0x18, 0x14, 0x1A, 0x16, 0x0A, 0x0E}, |
| {0x1E, 0x27, 0x25, 0x26, 0x27, 0x2A, 0x21, 0x21}, |
| {0xF1, 0x0A, 0x16, 0x1C, 0x28, 0x25, 0x15, 0x19}, |
| {0x08, 0x12, 0x09, 0x08, 0x16, 0x17, 0xEF, 0xF6}, |
| {0x0C, 0x0B, 0x00, 0xFC, 0x04, 0x09, 0xFC, 0x03}, |
| {0xFB, 0xF1, 0xF8, 0x26, 0x24, 0x18, 0x1D, 0x20}, |
| {0xF9, 0x01, 0x0C, 0x0F, 0x07, 0x08, 0x06, 0x07}, |
| {0x07, 0x06, 0x08, 0x04, 0x07, 0x0D, 0x07, 0x09}, |
| {0xFE, 0x01, 0x06, 0x05, 0x13, 0x1B, 0x14, 0x19}, |
| {0x09, 0x0C, 0x0E, 0x01, 0x08, 0x05, 0xFB, 0xFD}, |
| {0x07, 0x06, 0x03, 0x0A, 0x16, 0x12, 0x04, 0x07}, |
| {0x04, 0x01, 0x00, 0x04, 0x1F, 0x20, 0x0E, 0x0A}, |
| {0x03, 0xFF, 0xF6, 0xFB, 0x15, 0x1A, 0x00, 0x03}, |
| {0xFC, 0x18, 0x0B, 0x2D, 0x35, 0x23, 0x12, 0x09}, |
| {0x02, 0xFE, 0x01, 0xFF, 0x0C, 0x11, 0x0D, 0x0F}, |
| {0xFA, 0xE9, 0xD9, 0xFF, 0x0D, 0x05, 0x0D, 0x10}, |
| {0xF1, 0xE0, 0xF0, 0x01, 0x06, 0x06, 0x06, 0x10}, |
| {0xE9, 0xD4, 0xD7, 0x0F, 0x14, 0x0B, 0x0D, 0x16}, |
| {0x00, 0xFF, 0xEE, 0xE5, 0xFF, 0x08, 0x02, 0xF9}, |
| {0xE0, 0xDA, 0xE5, 0xFE, 0x09, 0x02, 0xF9, 0x04}, |
| {0xE0, 0xE2, 0xF4, 0x09, 0x13, 0x0C, 0x0D, 0x09}, |
| {0xFC, 0x02, 0x04, 0xFF, 0x00, 0xFF, 0xF8, 0xF7}, |
| {0xFE, 0xFB, 0xED, 0xF2, 0xFE, 0xFE, 0x08, 0x0C}, |
| {0xF3, 0xEF, 0xD0, 0xE3, 0x05, 0x11, 0xFD, 0xFF}, |
| {0xFA, 0xEF, 0xEA, 0xFE, 0x0D, 0x0E, 0xFE, 0x02}, |
| {0xF7, 0xFB, 0xDB, 0xDF, 0x14, 0xDD, 0x07, 0xFE}, |
| {0xFE, 0x08, 0x00, 0xDB, 0xE5, 0x1A, 0x13, 0xED}, |
| {0xF9, 0xFE, 0xFF, 0xF4, 0xF3, 0x00, 0x05, 0x02}, |
| {0xEF, 0xDE, 0xD8, 0xEB, 0xEA, 0xF5, 0x0E, 0x19}, |
| {0xFB, 0xFC, 0xFA, 0xEC, 0xEB, 0xED, 0xEE, 0xE8}, |
| {0xEE, 0xFC, 0xFD, 0x00, 0x04, 0xFC, 0xF0, 0xF5}, |
| {0x00, 0xFA, 0xF4, 0xF1, 0xF5, 0xFA, 0xFB, 0xF9}, |
| {0xEB, 0xF0, 0xDF, 0xE3, 0xEF, 0x07, 0x02, 0x05}, |
| {0xF7, 0xF0, 0xE6, 0xE7, 0x06, 0x15, 0x06, 0x0C}, |
| {0xF1, 0xE4, 0xD8, 0xEA, 0x06, 0xF2, 0x07, 0x09}, |
| {0xFF, 0xFE, 0xFE, 0xF9, 0xFF, 0xFF, 0x02, 0xF9}, |
| {0xDD, 0xF4, 0xF0, 0xF1, 0xFF, 0xFF, 0xEA, 0xF1}, |
| {0xF0, 0xF1, 0xFD, 0x03, 0x03, 0xFE, 0x00, 0x05}, |
| {0xF1, 0xF6, 0xE0, 0xDF, 0xF5, 0x01, 0xF4, 0xF8}, |
| {0x02, 0x03, 0xE5, 0xDC, 0xE7, 0xFD, 0x02, 0x08}, |
| {0xEC, 0xF1, 0xF5, 0xEC, 0xF2, 0xF8, 0xF6, 0xEE}, |
| {0xF3, 0xF4, 0xF6, 0xF4, 0xF5, 0xF1, 0xE7, 0xEA}, |
| {0xF7, 0xF3, 0xEC, 0xEA, 0xEF, 0xF0, 0xEE, 0xF1}, |
| {0xEB, 0xF6, 0xFB, 0xFA, 0xEF, 0xF3, 0xF3, 0xF7}, |
| {0x01, 0x03, 0xF1, 0xF6, 0x05, 0xF8, 0xE1, 0xEB}, |
| {0xF5, 0xF6, 0xF6, 0xF4, 0xFB, 0xFB, 0xFF, 0x00}, |
| {0xF8, 0x01, 0xFB, 0xFA, 0xFF, 0x03, 0xFE, 0x04}, |
| {0x04, 0xFB, 0x03, 0xFD, 0xF5, 0xF7, 0xF6, 0xFB}, |
| {0x06, 0x09, 0xFB, 0xF4, 0xF9, 0xFA, 0xFC, 0xFF}, |
| {0xF5, 0xF6, 0xF1, 0xEE, 0xF5, 0xF8, 0xF5, 0xF9}, |
| {0xF5, 0xF9, 0xFA, 0xFC, 0x07, 0x09, 0x01, 0xFB}, |
| {0xD7, 0xE9, 0xE8, 0xEC, 0x00, 0x0C, 0xFE, 0xF1}, |
| {0xEC, 0x04, 0xE9, 0xDF, 0x03, 0xE8, 0x00, 0xFA}, |
| {0xE6, 0xE2, 0xFF, 0x0A, 0x13, 0x01, 0x00, 0xF7}, |
| {0xF1, 0xFA, 0xF7, 0xF5, 0x01, 0x06, 0x05, 0x0A}, |
| {0xF6, 0xF6, 0xFC, 0xF6, 0xE8, 0x11, 0xF2, 0xFE}, |
| {0xFE, 0x08, 0x05, 0x12, 0xFD, 0xD0, 0x0E, 0x07}, |
| {0xF1, 0xFE, 0xF7, 0xF2, 0xFB, 0x02, 0xFA, 0xF8}, |
| {0xF4, 0xEA, 0xEC, 0xF3, 0xFE, 0x01, 0xF7, 0xF6}, |
| {0xFF, 0xFA, 0xFB, 0xF9, 0xFF, 0x01, 0x04, 0x03}, |
| {0x00, 0xF9, 0xF4, 0xFC, 0x05, 0xFC, 0xF7, 0xFB}, |
| {0xF8, 0xFF, 0xEF, 0xEC, 0xFB, 0x04, 0xF8, 0x03}, |
| {0xEB, 0xF1, 0xED, 0xF4, 0x02, 0x0E, 0x0B, 0x04}, |
| {0xF7, 0x01, 0xF8, 0xF4, 0xF8, 0xEF, 0xF8, 0x04}, |
| {0xEB, 0xF0, 0xF7, 0xFC, 0x10, 0x0D, 0xF8, 0xF8}, |
| {0xE8, 0xFE, 0xEE, 0xE8, 0xED, 0xF7, 0xF5, 0xF8}, |
| {0xED, 0xEB, 0xE9, 0xEA, 0xF2, 0xF5, 0xF4, 0xF9}, |
| {0xEA, 0xF2, 0xEF, 0xEE, 0xF9, 0xFE, 0xFD, 0x02}, |
| {0xFA, 0xFD, 0x02, 0x0D, 0xFA, 0xE4, 0x0F, 0x01}, |
| {0xFF, 0x08, 0x05, 0xF6, 0xF7, 0xFB, 0xF1, 0xF1}, |
| {0xF4, 0xEC, 0xEE, 0xF6, 0xEE, 0xEE, 0xF8, 0x06}, |
| {0xE8, 0xFA, 0xF8, 0xE8, 0xF8, 0xE9, 0xEE, 0xF9}, |
| {0xE5, 0xE9, 0xF0, 0x00, 0x00, 0xEF, 0xF3, 0xF8}, |
| {0xF7, 0xFB, 0xFB, 0xF7, 0xF9, 0xF9, 0xF5, 0xF0}, |
| {0xFD, 0xFF, 0xF2, 0xEE, 0xF2, 0xF5, 0xF1, 0xF3}}; |
| |
| static const UCHAR g_3a_pvcTab1_mode2[PVC_NTAB1][PVC_NBLOW][PVC_NBHIGH_MODE2] = |
| {{{0x11, 0x27, 0x0F, 0xFD, 0x04, 0xFC}, |
| {0x00, 0xBE, 0xE3, 0xF4, 0xDB, 0xF0}, |
| {0x09, 0x1E, 0x18, 0x1A, 0x21, 0x1B}}, |
| {{0x16, 0x28, 0x2B, 0x29, 0x25, 0x32}, |
| {0xF2, 0xE9, 0xE4, 0xE5, 0xE2, 0xD4}, |
| {0x0E, 0x0B, 0x0C, 0x0D, 0x0D, 0x0E}}, |
| {{0x2E, 0x3C, 0x20, 0x16, 0x1B, 0x1A}, |
| {0xE4, 0xC6, 0xE5, 0xF4, 0xDC, 0xDC}, |
| {0x0F, 0x1B, 0x18, 0x14, 0x1E, 0x1A}}}; |
| |
| static const UCHAR g_2a_pvcTab2_mode2[PVC_NTAB2][PVC_NBHIGH_MODE2] = { |
| {0x26, 0x25, 0x11, 0x0C, 0xFA, 0x15}, {0x1B, 0x18, 0x11, 0x0E, 0x0E, 0x0E}, |
| {0x12, 0x10, 0x10, 0x10, 0x11, 0x10}, {0x1E, 0x24, 0x19, 0x15, 0x14, 0x12}, |
| {0x24, 0x16, 0x12, 0x13, 0x15, 0x1C}, {0xEA, 0xED, 0xEB, 0xEA, 0xEC, 0xEB}, |
| {0xFC, 0xFD, 0xFD, 0xFC, 0xFE, 0xFE}, {0x0F, 0x0C, 0x0B, 0x0A, 0x0B, 0x0B}, |
| {0x22, 0x0B, 0x16, 0x18, 0x13, 0x19}, {0x1C, 0x14, 0x1D, 0x20, 0x19, 0x1A}, |
| {0x10, 0x08, 0x00, 0xFF, 0x02, 0x05}, {0x06, 0x07, 0x05, 0x03, 0x05, 0x04}, |
| {0x2A, 0x1F, 0x12, 0x12, 0x11, 0x18}, {0x19, 0x19, 0x02, 0x04, 0x00, 0x04}, |
| {0x18, 0x17, 0x17, 0x15, 0x16, 0x15}, {0x21, 0x1E, 0x1B, 0x19, 0x1C, 0x1B}, |
| {0x3C, 0x35, 0x20, 0x1D, 0x30, 0x34}, {0x3A, 0x1F, 0x37, 0x38, 0x33, 0x31}, |
| {0x37, 0x34, 0x25, 0x27, 0x35, 0x34}, {0x34, 0x2E, 0x32, 0x31, 0x34, 0x31}, |
| {0x36, 0x33, 0x2F, 0x2F, 0x32, 0x2F}, {0x35, 0x20, 0x2F, 0x32, 0x2F, 0x2C}, |
| {0x2E, 0x2B, 0x2F, 0x34, 0x36, 0x30}, {0x3F, 0x39, 0x30, 0x28, 0x29, 0x29}, |
| {0x3C, 0x30, 0x32, 0x37, 0x39, 0x36}, {0x37, 0x36, 0x30, 0x2B, 0x26, 0x24}, |
| {0x44, 0x38, 0x2F, 0x2D, 0x2D, 0x2D}, {0x38, 0x2B, 0x2C, 0x2C, 0x30, 0x2D}, |
| {0x37, 0x36, 0x2F, 0x23, 0x2D, 0x32}, {0x3C, 0x39, 0x29, 0x2E, 0x38, 0x37}, |
| {0x3B, 0x3A, 0x35, 0x32, 0x31, 0x2D}, {0x32, 0x31, 0x2F, 0x2C, 0x2D, 0x28}, |
| {0x2C, 0x31, 0x32, 0x30, 0x32, 0x2D}, {0x35, 0x34, 0x34, 0x34, 0x35, 0x33}, |
| {0x34, 0x38, 0x3B, 0x3C, 0x3E, 0x3A}, {0x3E, 0x3C, 0x3B, 0x3A, 0x3C, 0x39}, |
| {0x3D, 0x41, 0x46, 0x41, 0x3D, 0x38}, {0x44, 0x41, 0x40, 0x3E, 0x3F, 0x3A}, |
| {0x47, 0x47, 0x47, 0x42, 0x44, 0x40}, {0x4C, 0x4A, 0x4A, 0x46, 0x49, 0x45}, |
| {0x53, 0x52, 0x52, 0x4C, 0x4E, 0x49}, {0x41, 0x3D, 0x39, 0x2C, 0x2E, 0x2E}, |
| {0x2D, 0x37, 0x36, 0x30, 0x28, 0x36}, {0x3B, 0x32, 0x2E, 0x2D, 0x2D, 0x29}, |
| {0x40, 0x39, 0x36, 0x35, 0x36, 0x32}, {0x30, 0x2D, 0x2D, 0x2E, 0x31, 0x30}, |
| {0x38, 0x3D, 0x3B, 0x37, 0x35, 0x34}, {0x44, 0x3D, 0x3C, 0x38, 0x37, 0x33}, |
| {0x3A, 0x36, 0x37, 0x37, 0x39, 0x36}, {0x32, 0x36, 0x37, 0x30, 0x2E, 0x2A}, |
| {0x3C, 0x33, 0x33, 0x31, 0x33, 0x30}, {0x30, 0x31, 0x36, 0x37, 0x38, 0x34}, |
| {0x26, 0x27, 0x2E, 0x29, 0x1C, 0x16}, {0x14, 0x15, 0x1F, 0x17, 0x15, 0x1C}, |
| {0x38, 0x2D, 0x18, 0x13, 0x1E, 0x2B}, {0x30, 0x22, 0x17, 0x1A, 0x26, 0x2B}, |
| {0x24, 0x20, 0x1F, 0x10, 0x0C, 0x11}, {0x27, 0x1F, 0x13, 0x17, 0x24, 0x2A}, |
| {0x2F, 0x13, 0x18, 0x13, 0x2A, 0x32}, {0x31, 0x1E, 0x1E, 0x1E, 0x21, 0x28}, |
| {0x2A, 0x12, 0x19, 0x17, 0x16, 0x24}, {0x27, 0x0F, 0x16, 0x1D, 0x17, 0x1C}, |
| {0x2F, 0x26, 0x25, 0x22, 0x20, 0x22}, {0x1E, 0x1B, 0x1E, 0x18, 0x1E, 0x24}, |
| {0x31, 0x26, 0x0E, 0x15, 0x15, 0x25}, {0x2D, 0x22, 0x1E, 0x14, 0x10, 0x22}, |
| {0x25, 0x1B, 0x18, 0x11, 0x13, 0x1F}, {0x2F, 0x1B, 0x13, 0x1B, 0x18, 0x22}, |
| {0x21, 0x24, 0x1D, 0x1C, 0x1D, 0x1B}, {0x23, 0x1E, 0x28, 0x29, 0x27, 0x25}, |
| {0x2E, 0x2A, 0x1D, 0x17, 0x26, 0x2D}, {0x31, 0x2C, 0x1A, 0x0E, 0x1A, 0x24}, |
| {0x26, 0x16, 0x20, 0x1D, 0x14, 0x1E}, {0x29, 0x20, 0x1B, 0x1B, 0x17, 0x17}, |
| {0x1D, 0x06, 0x1A, 0x1E, 0x1B, 0x1D}, {0x2B, 0x23, 0x1F, 0x1F, 0x1D, 0x1C}, |
| {0x27, 0x1A, 0x0C, 0x0E, 0x0F, 0x1A}, {0x29, 0x1D, 0x1E, 0x22, 0x22, 0x24}, |
| {0x20, 0x21, 0x1B, 0x18, 0x13, 0x21}, {0x27, 0x0E, 0x10, 0x14, 0x10, 0x1A}, |
| {0x26, 0x24, 0x25, 0x25, 0x26, 0x28}, {0x1A, 0x24, 0x25, 0x29, 0x26, 0x24}, |
| {0x1D, 0x1D, 0x15, 0x12, 0x0F, 0x18}, {0x1E, 0x14, 0x13, 0x12, 0x14, 0x18}, |
| {0x16, 0x13, 0x13, 0x1A, 0x1B, 0x1D}, {0x20, 0x27, 0x22, 0x24, 0x1A, 0x19}, |
| {0x1F, 0x17, 0x19, 0x18, 0x17, 0x18}, {0x20, 0x1B, 0x1C, 0x1C, 0x1B, 0x1A}, |
| {0x23, 0x19, 0x1D, 0x1F, 0x1E, 0x21}, {0x26, 0x1F, 0x1D, 0x1B, 0x19, 0x1A}, |
| {0x23, 0x1E, 0x1F, 0x20, 0x1F, 0x1E}, {0x29, 0x20, 0x22, 0x20, 0x20, 0x1F}, |
| {0x26, 0x23, 0x21, 0x22, 0x23, 0x23}, {0x29, 0x1F, 0x24, 0x25, 0x26, 0x29}, |
| {0x2B, 0x22, 0x25, 0x27, 0x23, 0x21}, {0x29, 0x21, 0x19, 0x0E, 0x22, 0x2D}, |
| {0x32, 0x29, 0x1F, 0x1C, 0x1B, 0x21}, {0x1E, 0x1A, 0x1E, 0x24, 0x25, 0x25}, |
| {0x24, 0x1D, 0x21, 0x22, 0x22, 0x25}, {0x2C, 0x25, 0x21, 0x22, 0x23, 0x25}, |
| {0x24, 0x1E, 0x21, 0x26, 0x2B, 0x2C}, {0x28, 0x24, 0x1B, 0x1F, 0x28, 0x2D}, |
| {0x23, 0x13, 0x16, 0x22, 0x22, 0x29}, {0x1B, 0x23, 0x1C, 0x20, 0x14, 0x0D}, |
| {0x1E, 0x16, 0x1A, 0x1E, 0x1C, 0x1D}, {0x2B, 0x1C, 0x1D, 0x20, 0x1B, 0x1C}, |
| {0x1C, 0x1B, 0x23, 0x1F, 0x19, 0x1E}, {0x21, 0x23, 0x26, 0x20, 0x20, 0x22}, |
| {0x1D, 0x0B, 0x19, 0x1E, 0x11, 0x19}, {0x18, 0x17, 0x16, 0x17, 0x14, 0x16}, |
| {0x16, 0x19, 0x1C, 0x20, 0x21, 0x22}, {0x30, 0x1E, 0x22, 0x24, 0x25, 0x26}, |
| {0x1B, 0x1F, 0x17, 0x1D, 0x1E, 0x21}, {0x32, 0x2B, 0x27, 0x1F, 0x1B, 0x1A}, |
| {0x28, 0x20, 0x1A, 0x1B, 0x1F, 0x23}, {0x32, 0x21, 0x20, 0x21, 0x1D, 0x1F}, |
| {0x22, 0x18, 0x12, 0x15, 0x1B, 0x20}, {0x27, 0x27, 0x2A, 0x24, 0x21, 0x21}, |
| {0x1E, 0x0F, 0x0D, 0x1A, 0x1D, 0x23}, {0x28, 0x25, 0x27, 0x21, 0x17, 0x25}, |
| {0x2B, 0x27, 0x23, 0x19, 0x13, 0x14}, {0x25, 0x2B, 0x22, 0x22, 0x20, 0x21}, |
| {0x27, 0x1B, 0x16, 0x17, 0x0F, 0x15}, {0x29, 0x26, 0x23, 0x15, 0x1E, 0x28}, |
| {0x24, 0x1C, 0x19, 0x1A, 0x18, 0x19}, {0x2D, 0x15, 0x27, 0x2B, 0x24, 0x23}, |
| {0x2C, 0x12, 0x1F, 0x23, 0x1F, 0x20}, {0x25, 0x0F, 0x22, 0x27, 0x1F, 0x21}}; |
| |
| static const UCHAR g_a_pvcTab1_dp_mode1[PVC_NTAB1 - 1] = {17, 68}; |
| static const UCHAR g_a_pvcTab1_dp_mode2[PVC_NTAB1 - 1] = {16, 52}; |
| /* fractional exponent which corresponds to Q representation value */ |
| static const SCHAR g_a_scalingCoef_mode1[PVC_NBLOW + 1] = { |
| -1, -1, 0, 6}; /* { 8, 8, 7, 1 }; Q scaling */ |
| static const SCHAR g_a_scalingCoef_mode2[PVC_NBLOW + 1] = { |
| 0, 0, 1, 7}; /* { 7, 7, 6, 0 }; Q scaling */ |
| |
| int pvcInitFrame(PVC_STATIC_DATA *pPvcStaticData, |
| PVC_DYNAMIC_DATA *pPvcDynamicData, const UCHAR pvcMode, |
| const UCHAR ns, const int RATE, const int kx, |
| const int pvcBorder0, const UCHAR *pPvcID) { |
| int lbw, hbw, i, temp; |
| pPvcDynamicData->pvc_mode = pvcMode; |
| pPvcDynamicData->kx = kx; |
| pPvcDynamicData->RATE = RATE; |
| |
| switch (pvcMode) { |
| case 0: |
| /* legacy SBR, nothing to do */ |
| return 0; |
| case 1: |
| pPvcDynamicData->nbHigh = 8; |
| pPvcDynamicData->pPVCTab1 = (const UCHAR *)g_3a_pvcTab1_mode1; |
| pPvcDynamicData->pPVCTab2 = (const UCHAR *)g_2a_pvcTab2_mode1; |
| pPvcDynamicData->pPVCTab1_dp = g_a_pvcTab1_dp_mode1; |
| pPvcDynamicData->pScalingCoef = g_a_scalingCoef_mode1; |
| hbw = 8 / RATE; |
| break; |
| case 2: |
| pPvcDynamicData->nbHigh = 6; |
| pPvcDynamicData->pPVCTab1 = (const UCHAR *)g_3a_pvcTab1_mode2; |
| pPvcDynamicData->pPVCTab2 = (const UCHAR *)g_2a_pvcTab2_mode2; |
| pPvcDynamicData->pPVCTab1_dp = g_a_pvcTab1_dp_mode2; |
| pPvcDynamicData->pScalingCoef = g_a_scalingCoef_mode2; |
| hbw = 12 / RATE; |
| break; |
| default: |
| /* invalid pvcMode */ |
| return 1; |
| } |
| |
| pPvcDynamicData->pvcBorder0 = pvcBorder0; |
| UCHAR pvcBorder0_last = pPvcStaticData->pvcBorder0; |
| pPvcStaticData->pvcBorder0 = pvcBorder0; |
| pPvcDynamicData->pPvcID = pPvcID; |
| |
| pPvcDynamicData->ns = ns; |
| switch (ns) { |
| case 16: |
| pPvcDynamicData->pSCcoeffs = pvc_SC_16; |
| break; |
| case 12: |
| pPvcDynamicData->pSCcoeffs = pvc_SC_12; |
| break; |
| case 4: |
| pPvcDynamicData->pSCcoeffs = pvc_SC_4; |
| break; |
| case 3: |
| pPvcDynamicData->pSCcoeffs = pvc_SC_3; |
| break; |
| default: |
| return 1; |
| } |
| |
| /* in the lower part of Esg-array there are previous values of Esg (from last |
| call to this function In case of an previous legay-SBR frame, or if there |
| was a change in cross-over FQ the value of first PVC SBR timeslot is |
| propagated to prev-values in order to have reasonable values for |
| smooth-filtering |
| */ |
| if ((pPvcStaticData->pvc_mode_last == 0) || (pPvcStaticData->kx_last != kx)) { |
| pPvcDynamicData->pastEsgSlotsAvail = 0; |
| } else { |
| pPvcDynamicData->pastEsgSlotsAvail = PVC_NS_MAX - pvcBorder0_last; |
| } |
| |
| lbw = 8 / RATE; |
| |
| temp = kx; |
| for (i = PVC_NBLOW; i >= 0; i--) { |
| pPvcDynamicData->sg_offset_low[i] = temp; |
| temp -= lbw; |
| } |
| |
| temp = 0; |
| for (i = 0; i <= pPvcDynamicData->nbHigh; i++) { |
| pPvcDynamicData->sg_offset_high_kx[i] = temp; |
| temp += hbw; |
| } |
| |
| return 0; |
| } |
| |
| /* call if pvcMode = 1,2 */ |
| void pvcDecodeFrame(PVC_STATIC_DATA *pPvcStaticData, |
| PVC_DYNAMIC_DATA *pPvcDynamicData, FIXP_DBL **qmfBufferReal, |
| FIXP_DBL **qmfBufferImag, const int overlap, |
| const int qmfExponentOverlap, |
| const int qmfExponentCurrent) { |
| int t; |
| FIXP_DBL *predictedEsgSlot; |
| int RATE = pPvcDynamicData->RATE; |
| int pvcBorder0 = pPvcDynamicData->pvcBorder0; |
| |
| for (t = pvcBorder0; t < PVC_NTIMESLOT; t++) { |
| int *pPredEsg_exp = &pPvcDynamicData->predEsg_exp[t]; |
| predictedEsgSlot = pPvcDynamicData->predEsg[t]; |
| |
| pvcDecodeTimeSlot( |
| pPvcStaticData, pPvcDynamicData, &qmfBufferReal[t * RATE], |
| &qmfBufferImag[t * RATE], |
| (t * RATE < overlap) ? qmfExponentOverlap : qmfExponentCurrent, |
| pvcBorder0, t, predictedEsgSlot, pPredEsg_exp); |
| } |
| |
| return; |
| } |
| |
| void pvcDecodeTimeSlot(PVC_STATIC_DATA *pPvcStaticData, |
| PVC_DYNAMIC_DATA *pPvcDynamicData, |
| FIXP_DBL **qmfSlotReal, FIXP_DBL **qmfSlotImag, |
| const int qmfExponent, const int pvcBorder0, |
| const int timeSlotNumber, FIXP_DBL predictedEsgSlot[], |
| int *predictedEsg_exp) { |
| int i, band, ksg, ksg_start = 0; |
| int RATE = pPvcDynamicData->RATE; |
| int Esg_index = pPvcStaticData->Esg_slot_index; |
| const SCHAR *sg_borders = pPvcDynamicData->sg_offset_low; |
| FIXP_DBL *pEsg = pPvcStaticData->Esg[Esg_index]; |
| FIXP_DBL E[PVC_NBLOW] = {0}; |
| |
| /* Subband grouping in QMF subbands below SBR range */ |
| /* Within one timeslot ( i = [0...(RATE-1)] QMF subsamples) calculate energy |
| E(ib,t) and group them to Esg(ksg,t). Then transfer values to logarithmical |
| domain and store them for time domain smoothing. (7.5.6.3 Subband grouping |
| in QMF subbands below SBR range) |
| */ |
| for (ksg = 0; sg_borders[ksg] < 0; ksg++) { |
| pEsg[ksg] = FL2FXCONST_DBL(-10.0 / (1 << PVC_ESG_EXP)); /* 10*log10(0.1) */ |
| ksg_start++; |
| } |
| |
| for (i = 0; i < RATE; i++) { |
| FIXP_DBL *qmfR, *qmfI; |
| qmfR = qmfSlotReal[i]; |
| qmfI = qmfSlotImag[i]; |
| for (ksg = ksg_start; ksg < PVC_NBLOW; ksg++) { |
| for (band = sg_borders[ksg]; band < sg_borders[ksg + 1]; band++) { |
| /* The division by 8 == (RATE*lbw) is required algorithmically */ |
| E[ksg] += (fPow2Div2(qmfR[band]) + fPow2Div2(qmfI[band])) >> 2; |
| } |
| } |
| } |
| for (ksg = ksg_start; ksg < PVC_NBLOW; ksg++) { |
| if (E[ksg] > (FIXP_DBL)0) { |
| /* 10/log2(10) = 0.752574989159953 * 2^2 */ |
| int exp_log; |
| FIXP_DBL nrg = CalcLog2(E[ksg], 2 * qmfExponent, &exp_log); |
| nrg = fMult(nrg, FL2FXCONST_SGL(LOG10FAC)); |
| nrg = scaleValue(nrg, exp_log - PVC_ESG_EXP + 2); |
| pEsg[ksg] = fMax(nrg, FL2FXCONST_DBL(-10.0 / (1 << PVC_ESG_EXP))); |
| } else { |
| pEsg[ksg] = |
| FL2FXCONST_DBL(-10.0 / (1 << PVC_ESG_EXP)); /* 10*log10(0.1) */ |
| } |
| } |
| |
| /* Time domain smoothing of subband-grouped energy */ |
| { |
| int idx = pPvcStaticData->Esg_slot_index; |
| FIXP_DBL *pEsg_filt; |
| FIXP_SGL SCcoeff; |
| |
| E[0] = E[1] = E[2] = (FIXP_DBL)0; |
| for (i = 0; i < pPvcDynamicData->ns; i++) { |
| SCcoeff = pPvcDynamicData->pSCcoeffs[i]; |
| pEsg_filt = pPvcStaticData->Esg[idx]; |
| /* Div2 is compensated by scaling of coeff table */ |
| E[0] = fMultAddDiv2(E[0], pEsg_filt[0], SCcoeff); |
| E[1] = fMultAddDiv2(E[1], pEsg_filt[1], SCcoeff); |
| E[2] = fMultAddDiv2(E[2], pEsg_filt[2], SCcoeff); |
| if (i >= pPvcDynamicData->pastEsgSlotsAvail) { |
| /* if past Esg values are not available use the ones from the last valid |
| * slot */ |
| continue; |
| } |
| if (idx > 0) { |
| idx--; |
| } else { |
| idx += PVC_NS_MAX - 1; |
| } |
| } |
| } |
| |
| /* SBR envelope scalefactor prediction */ |
| { |
| int E_high_exp[PVC_NBHIGH_MAX]; |
| int E_high_exp_max = 0; |
| int pvcTab1ID; |
| int pvcTab2ID = (int)pPvcDynamicData->pPvcID[timeSlotNumber]; |
| const UCHAR *pTab1, *pTab2; |
| if (pvcTab2ID < pPvcDynamicData->pPVCTab1_dp[0]) { |
| pvcTab1ID = 0; |
| } else if (pvcTab2ID < pPvcDynamicData->pPVCTab1_dp[1]) { |
| pvcTab1ID = 1; |
| } else { |
| pvcTab1ID = 2; |
| } |
| pTab1 = &(pPvcDynamicData |
| ->pPVCTab1[pvcTab1ID * PVC_NBLOW * pPvcDynamicData->nbHigh]); |
| pTab2 = &(pPvcDynamicData->pPVCTab2[pvcTab2ID * pPvcDynamicData->nbHigh]); |
| for (ksg = 0; ksg < pPvcDynamicData->nbHigh; ksg++) { |
| FIXP_SGL predCoeff; |
| FIXP_DBL accu; |
| int predCoeff_exp, kb; |
| E_high_exp[ksg] = 0; |
| |
| /* residual part */ |
| accu = ((LONG)(SCHAR)*pTab2++) << (DFRACT_BITS - 8 - PVC_ESG_EXP + |
| pPvcDynamicData->pScalingCoef[3]); |
| |
| /* linear combination of lower grouped energies part */ |
| for (kb = 0; kb < PVC_NBLOW; kb++) { |
| predCoeff = (FIXP_SGL)( |
| (SHORT)(SCHAR)pTab1[kb * pPvcDynamicData->nbHigh + ksg] << 8); |
| predCoeff_exp = pPvcDynamicData->pScalingCoef[kb] + |
| 1; /* +1 to compensate for Div2 */ |
| accu += fMultDiv2(E[kb], predCoeff) << predCoeff_exp; |
| } |
| /* convert back to linear domain */ |
| accu = fMult(accu, FL2FXCONST_SGL(LOG10FAC_INV)); |
| accu = f2Pow( |
| accu, PVC_ESG_EXP - 1, |
| &predCoeff_exp); /* -1 compensates for exponent of LOG10FAC_INV */ |
| predictedEsgSlot[ksg] = accu; |
| E_high_exp[ksg] = predCoeff_exp; |
| if (predCoeff_exp > E_high_exp_max) { |
| E_high_exp_max = predCoeff_exp; |
| } |
| } |
| |
| /* rescale output vector according to largest exponent */ |
| for (ksg = 0; ksg < pPvcDynamicData->nbHigh; ksg++) { |
| int scale = E_high_exp[ksg] - E_high_exp_max; |
| predictedEsgSlot[ksg] = scaleValue(predictedEsgSlot[ksg], scale); |
| } |
| *predictedEsg_exp = E_high_exp_max; |
| } |
| |
| pPvcStaticData->Esg_slot_index = |
| (pPvcStaticData->Esg_slot_index + 1) & (PVC_NS_MAX - 1); |
| pPvcDynamicData->pastEsgSlotsAvail = |
| fMin(pPvcDynamicData->pastEsgSlotsAvail + 1, PVC_NS_MAX - 1); |
| return; |
| } |
| |
| /* call if pvcMode = 0,1,2 */ |
| void pvcEndFrame(PVC_STATIC_DATA *pPvcStaticData, |
| PVC_DYNAMIC_DATA *pPvcDynamicData) { |
| pPvcStaticData->pvc_mode_last = pPvcDynamicData->pvc_mode; |
| pPvcStaticData->kx_last = pPvcDynamicData->kx; |
| |
| if (pPvcDynamicData->pvc_mode == 0) return; |
| |
| { |
| int t, max = -100; |
| for (t = pPvcDynamicData->pvcBorder0; t < PVC_NTIMESLOT; t++) { |
| if (pPvcDynamicData->predEsg_exp[t] > max) { |
| max = pPvcDynamicData->predEsg_exp[t]; |
| } |
| } |
| pPvcDynamicData->predEsg_expMax = max; |
| } |
| return; |
| } |
| |
| void expandPredEsg(const PVC_DYNAMIC_DATA *pPvcDynamicData, const int timeSlot, |
| const int lengthOutputVector, FIXP_DBL *pOutput, |
| SCHAR *pOutput_exp) { |
| int k = 0, ksg; |
| const FIXP_DBL *predEsg = pPvcDynamicData->predEsg[timeSlot]; |
| |
| for (ksg = 0; ksg < pPvcDynamicData->nbHigh; ksg++) { |
| for (; k < pPvcDynamicData->sg_offset_high_kx[ksg + 1]; k++) { |
| pOutput[k] = predEsg[ksg]; |
| pOutput_exp[k] = (SCHAR)pPvcDynamicData->predEsg_exp[timeSlot]; |
| } |
| } |
| ksg--; |
| for (; k < lengthOutputVector; k++) { |
| pOutput[k] = predEsg[ksg]; |
| pOutput_exp[k] = (SCHAR)pPvcDynamicData->predEsg_exp[timeSlot]; |
| } |
| |
| return; |
| } |