xref: /aosp_15_r20/external/aac/libSBRdec/src/pvc_dec.cpp (revision e54365361535b070c2db7374cec45c159c7d0e7a)
1*e5436536SAndroid Build Coastguard Worker /* -----------------------------------------------------------------------------
2*e5436536SAndroid Build Coastguard Worker Software License for The Fraunhofer FDK AAC Codec Library for Android
3*e5436536SAndroid Build Coastguard Worker 
4*e5436536SAndroid Build Coastguard Worker © Copyright  1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
5*e5436536SAndroid Build Coastguard Worker Forschung e.V. All rights reserved.
6*e5436536SAndroid Build Coastguard Worker 
7*e5436536SAndroid Build Coastguard Worker  1.    INTRODUCTION
8*e5436536SAndroid Build Coastguard Worker The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
9*e5436536SAndroid Build Coastguard Worker that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
10*e5436536SAndroid Build Coastguard Worker scheme for digital audio. This FDK AAC Codec software is intended to be used on
11*e5436536SAndroid Build Coastguard Worker a wide variety of Android devices.
12*e5436536SAndroid Build Coastguard Worker 
13*e5436536SAndroid Build Coastguard Worker AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
14*e5436536SAndroid Build Coastguard Worker general perceptual audio codecs. AAC-ELD is considered the best-performing
15*e5436536SAndroid Build Coastguard Worker full-bandwidth communications codec by independent studies and is widely
16*e5436536SAndroid Build Coastguard Worker deployed. AAC has been standardized by ISO and IEC as part of the MPEG
17*e5436536SAndroid Build Coastguard Worker specifications.
18*e5436536SAndroid Build Coastguard Worker 
19*e5436536SAndroid Build Coastguard Worker Patent licenses for necessary patent claims for the FDK AAC Codec (including
20*e5436536SAndroid Build Coastguard Worker those of Fraunhofer) may be obtained through Via Licensing
21*e5436536SAndroid Build Coastguard Worker (www.vialicensing.com) or through the respective patent owners individually for
22*e5436536SAndroid Build Coastguard Worker the purpose of encoding or decoding bit streams in products that are compliant
23*e5436536SAndroid Build Coastguard Worker with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
24*e5436536SAndroid Build Coastguard Worker Android devices already license these patent claims through Via Licensing or
25*e5436536SAndroid Build Coastguard Worker directly from the patent owners, and therefore FDK AAC Codec software may
26*e5436536SAndroid Build Coastguard Worker already be covered under those patent licenses when it is used for those
27*e5436536SAndroid Build Coastguard Worker licensed purposes only.
28*e5436536SAndroid Build Coastguard Worker 
29*e5436536SAndroid Build Coastguard Worker Commercially-licensed AAC software libraries, including floating-point versions
30*e5436536SAndroid Build Coastguard Worker with enhanced sound quality, are also available from Fraunhofer. Users are
31*e5436536SAndroid Build Coastguard Worker encouraged to check the Fraunhofer website for additional applications
32*e5436536SAndroid Build Coastguard Worker information and documentation.
33*e5436536SAndroid Build Coastguard Worker 
34*e5436536SAndroid Build Coastguard Worker 2.    COPYRIGHT LICENSE
35*e5436536SAndroid Build Coastguard Worker 
36*e5436536SAndroid Build Coastguard Worker Redistribution and use in source and binary forms, with or without modification,
37*e5436536SAndroid Build Coastguard Worker are permitted without payment of copyright license fees provided that you
38*e5436536SAndroid Build Coastguard Worker satisfy the following conditions:
39*e5436536SAndroid Build Coastguard Worker 
40*e5436536SAndroid Build Coastguard Worker You must retain the complete text of this software license in redistributions of
41*e5436536SAndroid Build Coastguard Worker the FDK AAC Codec or your modifications thereto in source code form.
42*e5436536SAndroid Build Coastguard Worker 
43*e5436536SAndroid Build Coastguard Worker You must retain the complete text of this software license in the documentation
44*e5436536SAndroid Build Coastguard Worker and/or other materials provided with redistributions of the FDK AAC Codec or
45*e5436536SAndroid Build Coastguard Worker your modifications thereto in binary form. You must make available free of
46*e5436536SAndroid Build Coastguard Worker charge copies of the complete source code of the FDK AAC Codec and your
47*e5436536SAndroid Build Coastguard Worker modifications thereto to recipients of copies in binary form.
48*e5436536SAndroid Build Coastguard Worker 
49*e5436536SAndroid Build Coastguard Worker The name of Fraunhofer may not be used to endorse or promote products derived
50*e5436536SAndroid Build Coastguard Worker from this library without prior written permission.
51*e5436536SAndroid Build Coastguard Worker 
52*e5436536SAndroid Build Coastguard Worker You may not charge copyright license fees for anyone to use, copy or distribute
53*e5436536SAndroid Build Coastguard Worker the FDK AAC Codec software or your modifications thereto.
54*e5436536SAndroid Build Coastguard Worker 
55*e5436536SAndroid Build Coastguard Worker Your modified versions of the FDK AAC Codec must carry prominent notices stating
56*e5436536SAndroid Build Coastguard Worker that you changed the software and the date of any change. For modified versions
57*e5436536SAndroid Build Coastguard Worker of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
58*e5436536SAndroid Build Coastguard Worker must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
59*e5436536SAndroid Build Coastguard Worker AAC Codec Library for Android."
60*e5436536SAndroid Build Coastguard Worker 
61*e5436536SAndroid Build Coastguard Worker 3.    NO PATENT LICENSE
62*e5436536SAndroid Build Coastguard Worker 
63*e5436536SAndroid Build Coastguard Worker NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
64*e5436536SAndroid Build Coastguard Worker limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
65*e5436536SAndroid Build Coastguard Worker Fraunhofer provides no warranty of patent non-infringement with respect to this
66*e5436536SAndroid Build Coastguard Worker software.
67*e5436536SAndroid Build Coastguard Worker 
68*e5436536SAndroid Build Coastguard Worker You may use this FDK AAC Codec software or modifications thereto only for
69*e5436536SAndroid Build Coastguard Worker purposes that are authorized by appropriate patent licenses.
70*e5436536SAndroid Build Coastguard Worker 
71*e5436536SAndroid Build Coastguard Worker 4.    DISCLAIMER
72*e5436536SAndroid Build Coastguard Worker 
73*e5436536SAndroid Build Coastguard Worker This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
74*e5436536SAndroid Build Coastguard Worker holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
75*e5436536SAndroid Build Coastguard Worker including but not limited to the implied warranties of merchantability and
76*e5436536SAndroid Build Coastguard Worker fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
77*e5436536SAndroid Build Coastguard Worker CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
78*e5436536SAndroid Build Coastguard Worker or consequential damages, including but not limited to procurement of substitute
79*e5436536SAndroid Build Coastguard Worker goods or services; loss of use, data, or profits, or business interruption,
80*e5436536SAndroid Build Coastguard Worker however caused and on any theory of liability, whether in contract, strict
81*e5436536SAndroid Build Coastguard Worker liability, or tort (including negligence), arising in any way out of the use of
82*e5436536SAndroid Build Coastguard Worker this software, even if advised of the possibility of such damage.
83*e5436536SAndroid Build Coastguard Worker 
84*e5436536SAndroid Build Coastguard Worker 5.    CONTACT INFORMATION
85*e5436536SAndroid Build Coastguard Worker 
86*e5436536SAndroid Build Coastguard Worker Fraunhofer Institute for Integrated Circuits IIS
87*e5436536SAndroid Build Coastguard Worker Attention: Audio and Multimedia Departments - FDK AAC LL
88*e5436536SAndroid Build Coastguard Worker Am Wolfsmantel 33
89*e5436536SAndroid Build Coastguard Worker 91058 Erlangen, Germany
90*e5436536SAndroid Build Coastguard Worker 
91*e5436536SAndroid Build Coastguard Worker www.iis.fraunhofer.de/amm
92*e5436536SAndroid Build Coastguard Worker [email protected]
93*e5436536SAndroid Build Coastguard Worker ----------------------------------------------------------------------------- */
94*e5436536SAndroid Build Coastguard Worker 
95*e5436536SAndroid Build Coastguard Worker /**************************** SBR decoder library ******************************
96*e5436536SAndroid Build Coastguard Worker 
97*e5436536SAndroid Build Coastguard Worker    Author(s):   Matthias Hildenbrand
98*e5436536SAndroid Build Coastguard Worker 
99*e5436536SAndroid Build Coastguard Worker    Description: Decode Predictive Vector Coding Data
100*e5436536SAndroid Build Coastguard Worker 
101*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
102*e5436536SAndroid Build Coastguard Worker 
103*e5436536SAndroid Build Coastguard Worker #include "pvc_dec.h"
104*e5436536SAndroid Build Coastguard Worker 
105*e5436536SAndroid Build Coastguard Worker /* PVC interal definitions */
106*e5436536SAndroid Build Coastguard Worker #define PVC_DIVMODE_BITS 3
107*e5436536SAndroid Build Coastguard Worker #define PVC_NSMODE_BITS 1
108*e5436536SAndroid Build Coastguard Worker #define PVC_REUSEPVCID_BITS 1
109*e5436536SAndroid Build Coastguard Worker #define PVC_PVCID_BITS 7
110*e5436536SAndroid Build Coastguard Worker #define PVC_GRIDINFO_BITS 1
111*e5436536SAndroid Build Coastguard Worker #define PVC_NQMFBAND 64
112*e5436536SAndroid Build Coastguard Worker #define PVC_NBLOW 3 /* max. number of grouped QMF subbands below SBR range */
113*e5436536SAndroid Build Coastguard Worker 
114*e5436536SAndroid Build Coastguard Worker #define PVC_NTAB1 3
115*e5436536SAndroid Build Coastguard Worker #define PVC_NTAB2 128
116*e5436536SAndroid Build Coastguard Worker #define PVC_ID_NBIT 7
117*e5436536SAndroid Build Coastguard Worker 
118*e5436536SAndroid Build Coastguard Worker /* Exponent of pPvcStaticData->Esg and predictedEsg in dB domain.
119*e5436536SAndroid Build Coastguard Worker    max(Esg) = 10*log10(2^15*2^15) = 90.30;
120*e5436536SAndroid Build Coastguard Worker    min(Esg) = 10*log10(0.1) = -10
121*e5436536SAndroid Build Coastguard Worker    max of predicted Esg seems to be higher than 90dB but 7 Bit should be enough.
122*e5436536SAndroid Build Coastguard Worker */
123*e5436536SAndroid Build Coastguard Worker #define PVC_ESG_EXP 7
124*e5436536SAndroid Build Coastguard Worker 
125*e5436536SAndroid Build Coastguard Worker #define LOG10FAC 0.752574989159953f     /* == 10/log2(10) * 2^-2 */
126*e5436536SAndroid Build Coastguard Worker #define LOG10FAC_INV 0.664385618977472f /* == log2(10)/10 * 2^1 */
127*e5436536SAndroid Build Coastguard Worker 
128*e5436536SAndroid Build Coastguard Worker RAM_ALIGN
129*e5436536SAndroid Build Coastguard Worker LNK_SECTION_CONSTDATA
130*e5436536SAndroid Build Coastguard Worker static const FIXP_SGL pvc_SC_16[] = {
131*e5436536SAndroid Build Coastguard Worker     FX_DBL2FXCONST_SGL(0x14413695), FX_DBL2FXCONST_SGL(0x1434b6cb),
132*e5436536SAndroid Build Coastguard Worker     FX_DBL2FXCONST_SGL(0x140f27c7), FX_DBL2FXCONST_SGL(0x13d0591d),
133*e5436536SAndroid Build Coastguard Worker     FX_DBL2FXCONST_SGL(0x1377f502), FX_DBL2FXCONST_SGL(0x130577d6),
134*e5436536SAndroid Build Coastguard Worker     FX_DBL2FXCONST_SGL(0x12782266), FX_DBL2FXCONST_SGL(0x11cee459),
135*e5436536SAndroid Build Coastguard Worker     FX_DBL2FXCONST_SGL(0x11083a2a), FX_DBL2FXCONST_SGL(0x1021f5e9),
136*e5436536SAndroid Build Coastguard Worker     FX_DBL2FXCONST_SGL(0x0f18e17c), FX_DBL2FXCONST_SGL(0x0de814ca),
137*e5436536SAndroid Build Coastguard Worker     FX_DBL2FXCONST_SGL(0x0c87a568), FX_DBL2FXCONST_SGL(0x0ae9b167),
138*e5436536SAndroid Build Coastguard Worker     FX_DBL2FXCONST_SGL(0x08f24226), FX_DBL2FXCONST_SGL(0x06575ed5),
139*e5436536SAndroid Build Coastguard Worker };
140*e5436536SAndroid Build Coastguard Worker 
141*e5436536SAndroid Build Coastguard Worker RAM_ALIGN
142*e5436536SAndroid Build Coastguard Worker LNK_SECTION_CONSTDATA
143*e5436536SAndroid Build Coastguard Worker static const FIXP_SGL pvc_SC_12[] = {
144*e5436536SAndroid Build Coastguard Worker     FX_DBL2FXCONST_SGL(0x1aba6b3e), FX_DBL2FXCONST_SGL(0x1a9d164e),
145*e5436536SAndroid Build Coastguard Worker     FX_DBL2FXCONST_SGL(0x1a44d56d), FX_DBL2FXCONST_SGL(0x19b0d742),
146*e5436536SAndroid Build Coastguard Worker     FX_DBL2FXCONST_SGL(0x18df969a), FX_DBL2FXCONST_SGL(0x17ce91a0),
147*e5436536SAndroid Build Coastguard Worker     FX_DBL2FXCONST_SGL(0x1679c3fa), FX_DBL2FXCONST_SGL(0x14daabfc),
148*e5436536SAndroid Build Coastguard Worker     FX_DBL2FXCONST_SGL(0x12e65221), FX_DBL2FXCONST_SGL(0x1088d125),
149*e5436536SAndroid Build Coastguard Worker     FX_DBL2FXCONST_SGL(0x0d9907b3), FX_DBL2FXCONST_SGL(0x09a80e9d),
150*e5436536SAndroid Build Coastguard Worker };
151*e5436536SAndroid Build Coastguard Worker 
152*e5436536SAndroid Build Coastguard Worker RAM_ALIGN
153*e5436536SAndroid Build Coastguard Worker LNK_SECTION_CONSTDATA
154*e5436536SAndroid Build Coastguard Worker static const FIXP_SGL pvc_SC_4[] = {
155*e5436536SAndroid Build Coastguard Worker     FX_DBL2FXCONST_SGL(0x4ad6ab0f),
156*e5436536SAndroid Build Coastguard Worker     FX_DBL2FXCONST_SGL(0x47ef0dbe),
157*e5436536SAndroid Build Coastguard Worker     FX_DBL2FXCONST_SGL(0x3eee7496),
158*e5436536SAndroid Build Coastguard Worker     FX_DBL2FXCONST_SGL(0x2e4bd29d),
159*e5436536SAndroid Build Coastguard Worker };
160*e5436536SAndroid Build Coastguard Worker 
161*e5436536SAndroid Build Coastguard Worker RAM_ALIGN
162*e5436536SAndroid Build Coastguard Worker LNK_SECTION_CONSTDATA
163*e5436536SAndroid Build Coastguard Worker static const FIXP_SGL pvc_SC_3[] = {
164*e5436536SAndroid Build Coastguard Worker     FX_DBL2FXCONST_SGL(0x610dc761),
165*e5436536SAndroid Build Coastguard Worker     FX_DBL2FXCONST_SGL(0x5a519a3d),
166*e5436536SAndroid Build Coastguard Worker     FX_DBL2FXCONST_SGL(0x44a09e62),
167*e5436536SAndroid Build Coastguard Worker };
168*e5436536SAndroid Build Coastguard Worker 
169*e5436536SAndroid Build Coastguard Worker static const UCHAR g_3a_pvcTab1_mode1[PVC_NTAB1][PVC_NBLOW][PVC_NBHIGH_MODE1] =
170*e5436536SAndroid Build Coastguard Worker     {{{0x4F, 0x5B, 0x57, 0x52, 0x4D, 0x65, 0x45, 0x57},
171*e5436536SAndroid Build Coastguard Worker       {0xF3, 0x0F, 0x18, 0x20, 0x19, 0x4F, 0x3D, 0x23},
172*e5436536SAndroid Build Coastguard Worker       {0x78, 0x57, 0x55, 0x50, 0x50, 0x20, 0x36, 0x37}},
173*e5436536SAndroid Build Coastguard Worker      {{0x4C, 0x5F, 0x53, 0x37, 0x1E, 0xFD, 0x15, 0x0A},
174*e5436536SAndroid Build Coastguard Worker       {0x05, 0x0E, 0x28, 0x41, 0x48, 0x6E, 0x54, 0x5B},
175*e5436536SAndroid Build Coastguard Worker       {0x59, 0x47, 0x40, 0x40, 0x3D, 0x33, 0x3F, 0x39}},
176*e5436536SAndroid Build Coastguard Worker      {{0x47, 0x5F, 0x57, 0x34, 0x3C, 0x2E, 0x2E, 0x31},
177*e5436536SAndroid Build Coastguard Worker       {0xFA, 0x13, 0x23, 0x4E, 0x44, 0x7C, 0x34, 0x38},
178*e5436536SAndroid Build Coastguard Worker       {0x63, 0x43, 0x41, 0x3D, 0x35, 0x19, 0x3D, 0x33}}};
179*e5436536SAndroid Build Coastguard Worker 
180*e5436536SAndroid Build Coastguard Worker static const UCHAR g_2a_pvcTab2_mode1[PVC_NTAB2][PVC_NBHIGH_MODE1] = {
181*e5436536SAndroid Build Coastguard Worker     {0xCB, 0xD1, 0xCC, 0xD2, 0xE2, 0xEB, 0xE7, 0xE8},
182*e5436536SAndroid Build Coastguard Worker     {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80},
183*e5436536SAndroid Build Coastguard Worker     {0x84, 0x8C, 0x88, 0x83, 0x90, 0x93, 0x86, 0x80},
184*e5436536SAndroid Build Coastguard Worker     {0xD7, 0xD8, 0xC0, 0xC7, 0xCF, 0xE5, 0xF1, 0xF6},
185*e5436536SAndroid Build Coastguard Worker     {0xA5, 0xA6, 0xAA, 0xA8, 0xB0, 0xB1, 0xB8, 0xB8},
186*e5436536SAndroid Build Coastguard Worker     {0xD7, 0xCB, 0xC1, 0xC3, 0xC5, 0xC9, 0xC9, 0xCE},
187*e5436536SAndroid Build Coastguard Worker     {0xCA, 0xB5, 0xB8, 0xB3, 0xAC, 0xB6, 0xBB, 0xB8},
188*e5436536SAndroid Build Coastguard Worker     {0xC1, 0xC4, 0xC3, 0xC5, 0xC6, 0xCA, 0xCA, 0xCB},
189*e5436536SAndroid Build Coastguard Worker     {0xE0, 0xE1, 0xD8, 0xCD, 0xCB, 0xCB, 0xCE, 0xCC},
190*e5436536SAndroid Build Coastguard Worker     {0xDB, 0xE1, 0xDF, 0xDB, 0xDC, 0xD9, 0xD9, 0xD6},
191*e5436536SAndroid Build Coastguard Worker     {0xE0, 0xDE, 0xDD, 0xDD, 0xE0, 0xE3, 0xE5, 0xE6},
192*e5436536SAndroid Build Coastguard Worker     {0xCA, 0xD2, 0xCD, 0xCE, 0xD5, 0xDB, 0xD9, 0xDB},
193*e5436536SAndroid Build Coastguard Worker     {0xD2, 0xE0, 0xDB, 0xD5, 0xDB, 0xDE, 0xE3, 0xE1},
194*e5436536SAndroid Build Coastguard Worker     {0xE5, 0xDB, 0xD0, 0xD2, 0xD8, 0xDD, 0xDB, 0xDD},
195*e5436536SAndroid Build Coastguard Worker     {0xC0, 0xB5, 0xBF, 0xDD, 0xE3, 0xDC, 0xDC, 0xE4},
196*e5436536SAndroid Build Coastguard Worker     {0xDB, 0xCE, 0xC6, 0xCF, 0xCF, 0xD1, 0xD3, 0xD4},
197*e5436536SAndroid Build Coastguard Worker     {0xC9, 0xD7, 0xDA, 0xE2, 0xE9, 0xE7, 0xDF, 0xDC},
198*e5436536SAndroid Build Coastguard Worker     {0x0A, 0x07, 0x0A, 0x08, 0x19, 0x24, 0x1F, 0x22},
199*e5436536SAndroid Build Coastguard Worker     {0x1E, 0x1F, 0x11, 0x0E, 0x22, 0x2D, 0x33, 0x32},
200*e5436536SAndroid Build Coastguard Worker     {0xF0, 0xDA, 0xDC, 0x18, 0x1F, 0x19, 0x0A, 0x1E},
201*e5436536SAndroid Build Coastguard Worker     {0x09, 0xF8, 0xE6, 0x05, 0x19, 0x11, 0x0E, 0x0B},
202*e5436536SAndroid Build Coastguard Worker     {0x09, 0x10, 0x0E, 0xE6, 0xF4, 0x20, 0x22, 0xFA},
203*e5436536SAndroid Build Coastguard Worker     {0xF2, 0xE5, 0xF8, 0x0E, 0x18, 0x15, 0x0D, 0x10},
204*e5436536SAndroid Build Coastguard Worker     {0x15, 0x13, 0x16, 0x0A, 0x0D, 0x1F, 0x1D, 0x1B},
205*e5436536SAndroid Build Coastguard Worker     {0xFA, 0xFF, 0xFE, 0xFF, 0x09, 0x11, 0x03, 0x0B},
206*e5436536SAndroid Build Coastguard Worker     {0xFE, 0xFA, 0xF2, 0xF8, 0x0C, 0x1E, 0x11, 0x12},
207*e5436536SAndroid Build Coastguard Worker     {0xFA, 0xF8, 0x0B, 0x17, 0x1D, 0x17, 0x0E, 0x16},
208*e5436536SAndroid Build Coastguard Worker     {0x00, 0xF3, 0xFD, 0x0A, 0x1C, 0x17, 0xFD, 0x08},
209*e5436536SAndroid Build Coastguard Worker     {0xEA, 0xEA, 0x03, 0x12, 0x1E, 0x14, 0x09, 0x04},
210*e5436536SAndroid Build Coastguard Worker     {0x02, 0xFE, 0x04, 0xFB, 0x0C, 0x0E, 0x07, 0x02},
211*e5436536SAndroid Build Coastguard Worker     {0xF6, 0x02, 0x07, 0x0B, 0x17, 0x17, 0x01, 0xFF},
212*e5436536SAndroid Build Coastguard Worker     {0xF5, 0xFB, 0xFE, 0x04, 0x12, 0x14, 0x0C, 0x0D},
213*e5436536SAndroid Build Coastguard Worker     {0x10, 0x10, 0x0E, 0x04, 0x07, 0x11, 0x0F, 0x13},
214*e5436536SAndroid Build Coastguard Worker     {0x0C, 0x0F, 0xFB, 0xF2, 0x0A, 0x12, 0x09, 0x0D},
215*e5436536SAndroid Build Coastguard Worker     {0x0D, 0x1D, 0xF1, 0xF4, 0x2A, 0x06, 0x3B, 0x32},
216*e5436536SAndroid Build Coastguard Worker     {0xFC, 0x08, 0x06, 0x02, 0x0E, 0x17, 0x08, 0x0E},
217*e5436536SAndroid Build Coastguard Worker     {0x07, 0x02, 0xEE, 0xEE, 0x2B, 0xF6, 0x23, 0x13},
218*e5436536SAndroid Build Coastguard Worker     {0x04, 0x02, 0x05, 0x08, 0x0B, 0x0E, 0xFB, 0xFB},
219*e5436536SAndroid Build Coastguard Worker     {0x00, 0x04, 0x10, 0x18, 0x22, 0x25, 0x1D, 0x1F},
220*e5436536SAndroid Build Coastguard Worker     {0xFB, 0x0D, 0x07, 0x00, 0x0C, 0x0F, 0xFC, 0x02},
221*e5436536SAndroid Build Coastguard Worker     {0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0x03, 0x05},
222*e5436536SAndroid Build Coastguard Worker     {0x04, 0x05, 0x08, 0x13, 0xFF, 0xEB, 0x0C, 0x06},
223*e5436536SAndroid Build Coastguard Worker     {0x05, 0x13, 0x0E, 0x0B, 0x12, 0x15, 0x09, 0x0A},
224*e5436536SAndroid Build Coastguard Worker     {0x09, 0x03, 0x09, 0x05, 0x12, 0x16, 0x11, 0x12},
225*e5436536SAndroid Build Coastguard Worker     {0x14, 0x1A, 0x06, 0x01, 0x10, 0x11, 0xFE, 0x02},
226*e5436536SAndroid Build Coastguard Worker     {0x01, 0x0B, 0x0B, 0x0C, 0x18, 0x21, 0x10, 0x13},
227*e5436536SAndroid Build Coastguard Worker     {0x12, 0x0D, 0x0A, 0x10, 0x1C, 0x1D, 0x0D, 0x10},
228*e5436536SAndroid Build Coastguard Worker     {0x03, 0x09, 0x14, 0x15, 0x1B, 0x1A, 0x01, 0xFF},
229*e5436536SAndroid Build Coastguard Worker     {0x08, 0x12, 0x13, 0x0E, 0x16, 0x1D, 0x14, 0x1B},
230*e5436536SAndroid Build Coastguard Worker     {0x07, 0x15, 0x1C, 0x1B, 0x20, 0x21, 0x11, 0x0E},
231*e5436536SAndroid Build Coastguard Worker     {0x12, 0x18, 0x19, 0x17, 0x20, 0x25, 0x1A, 0x1E},
232*e5436536SAndroid Build Coastguard Worker     {0x0C, 0x1A, 0x1D, 0x22, 0x2F, 0x33, 0x27, 0x28},
233*e5436536SAndroid Build Coastguard Worker     {0x0E, 0x1A, 0x17, 0x10, 0x0A, 0x0E, 0xFF, 0x06},
234*e5436536SAndroid Build Coastguard Worker     {0x1A, 0x1C, 0x18, 0x14, 0x1A, 0x16, 0x0A, 0x0E},
235*e5436536SAndroid Build Coastguard Worker     {0x1E, 0x27, 0x25, 0x26, 0x27, 0x2A, 0x21, 0x21},
236*e5436536SAndroid Build Coastguard Worker     {0xF1, 0x0A, 0x16, 0x1C, 0x28, 0x25, 0x15, 0x19},
237*e5436536SAndroid Build Coastguard Worker     {0x08, 0x12, 0x09, 0x08, 0x16, 0x17, 0xEF, 0xF6},
238*e5436536SAndroid Build Coastguard Worker     {0x0C, 0x0B, 0x00, 0xFC, 0x04, 0x09, 0xFC, 0x03},
239*e5436536SAndroid Build Coastguard Worker     {0xFB, 0xF1, 0xF8, 0x26, 0x24, 0x18, 0x1D, 0x20},
240*e5436536SAndroid Build Coastguard Worker     {0xF9, 0x01, 0x0C, 0x0F, 0x07, 0x08, 0x06, 0x07},
241*e5436536SAndroid Build Coastguard Worker     {0x07, 0x06, 0x08, 0x04, 0x07, 0x0D, 0x07, 0x09},
242*e5436536SAndroid Build Coastguard Worker     {0xFE, 0x01, 0x06, 0x05, 0x13, 0x1B, 0x14, 0x19},
243*e5436536SAndroid Build Coastguard Worker     {0x09, 0x0C, 0x0E, 0x01, 0x08, 0x05, 0xFB, 0xFD},
244*e5436536SAndroid Build Coastguard Worker     {0x07, 0x06, 0x03, 0x0A, 0x16, 0x12, 0x04, 0x07},
245*e5436536SAndroid Build Coastguard Worker     {0x04, 0x01, 0x00, 0x04, 0x1F, 0x20, 0x0E, 0x0A},
246*e5436536SAndroid Build Coastguard Worker     {0x03, 0xFF, 0xF6, 0xFB, 0x15, 0x1A, 0x00, 0x03},
247*e5436536SAndroid Build Coastguard Worker     {0xFC, 0x18, 0x0B, 0x2D, 0x35, 0x23, 0x12, 0x09},
248*e5436536SAndroid Build Coastguard Worker     {0x02, 0xFE, 0x01, 0xFF, 0x0C, 0x11, 0x0D, 0x0F},
249*e5436536SAndroid Build Coastguard Worker     {0xFA, 0xE9, 0xD9, 0xFF, 0x0D, 0x05, 0x0D, 0x10},
250*e5436536SAndroid Build Coastguard Worker     {0xF1, 0xE0, 0xF0, 0x01, 0x06, 0x06, 0x06, 0x10},
251*e5436536SAndroid Build Coastguard Worker     {0xE9, 0xD4, 0xD7, 0x0F, 0x14, 0x0B, 0x0D, 0x16},
252*e5436536SAndroid Build Coastguard Worker     {0x00, 0xFF, 0xEE, 0xE5, 0xFF, 0x08, 0x02, 0xF9},
253*e5436536SAndroid Build Coastguard Worker     {0xE0, 0xDA, 0xE5, 0xFE, 0x09, 0x02, 0xF9, 0x04},
254*e5436536SAndroid Build Coastguard Worker     {0xE0, 0xE2, 0xF4, 0x09, 0x13, 0x0C, 0x0D, 0x09},
255*e5436536SAndroid Build Coastguard Worker     {0xFC, 0x02, 0x04, 0xFF, 0x00, 0xFF, 0xF8, 0xF7},
256*e5436536SAndroid Build Coastguard Worker     {0xFE, 0xFB, 0xED, 0xF2, 0xFE, 0xFE, 0x08, 0x0C},
257*e5436536SAndroid Build Coastguard Worker     {0xF3, 0xEF, 0xD0, 0xE3, 0x05, 0x11, 0xFD, 0xFF},
258*e5436536SAndroid Build Coastguard Worker     {0xFA, 0xEF, 0xEA, 0xFE, 0x0D, 0x0E, 0xFE, 0x02},
259*e5436536SAndroid Build Coastguard Worker     {0xF7, 0xFB, 0xDB, 0xDF, 0x14, 0xDD, 0x07, 0xFE},
260*e5436536SAndroid Build Coastguard Worker     {0xFE, 0x08, 0x00, 0xDB, 0xE5, 0x1A, 0x13, 0xED},
261*e5436536SAndroid Build Coastguard Worker     {0xF9, 0xFE, 0xFF, 0xF4, 0xF3, 0x00, 0x05, 0x02},
262*e5436536SAndroid Build Coastguard Worker     {0xEF, 0xDE, 0xD8, 0xEB, 0xEA, 0xF5, 0x0E, 0x19},
263*e5436536SAndroid Build Coastguard Worker     {0xFB, 0xFC, 0xFA, 0xEC, 0xEB, 0xED, 0xEE, 0xE8},
264*e5436536SAndroid Build Coastguard Worker     {0xEE, 0xFC, 0xFD, 0x00, 0x04, 0xFC, 0xF0, 0xF5},
265*e5436536SAndroid Build Coastguard Worker     {0x00, 0xFA, 0xF4, 0xF1, 0xF5, 0xFA, 0xFB, 0xF9},
266*e5436536SAndroid Build Coastguard Worker     {0xEB, 0xF0, 0xDF, 0xE3, 0xEF, 0x07, 0x02, 0x05},
267*e5436536SAndroid Build Coastguard Worker     {0xF7, 0xF0, 0xE6, 0xE7, 0x06, 0x15, 0x06, 0x0C},
268*e5436536SAndroid Build Coastguard Worker     {0xF1, 0xE4, 0xD8, 0xEA, 0x06, 0xF2, 0x07, 0x09},
269*e5436536SAndroid Build Coastguard Worker     {0xFF, 0xFE, 0xFE, 0xF9, 0xFF, 0xFF, 0x02, 0xF9},
270*e5436536SAndroid Build Coastguard Worker     {0xDD, 0xF4, 0xF0, 0xF1, 0xFF, 0xFF, 0xEA, 0xF1},
271*e5436536SAndroid Build Coastguard Worker     {0xF0, 0xF1, 0xFD, 0x03, 0x03, 0xFE, 0x00, 0x05},
272*e5436536SAndroid Build Coastguard Worker     {0xF1, 0xF6, 0xE0, 0xDF, 0xF5, 0x01, 0xF4, 0xF8},
273*e5436536SAndroid Build Coastguard Worker     {0x02, 0x03, 0xE5, 0xDC, 0xE7, 0xFD, 0x02, 0x08},
274*e5436536SAndroid Build Coastguard Worker     {0xEC, 0xF1, 0xF5, 0xEC, 0xF2, 0xF8, 0xF6, 0xEE},
275*e5436536SAndroid Build Coastguard Worker     {0xF3, 0xF4, 0xF6, 0xF4, 0xF5, 0xF1, 0xE7, 0xEA},
276*e5436536SAndroid Build Coastguard Worker     {0xF7, 0xF3, 0xEC, 0xEA, 0xEF, 0xF0, 0xEE, 0xF1},
277*e5436536SAndroid Build Coastguard Worker     {0xEB, 0xF6, 0xFB, 0xFA, 0xEF, 0xF3, 0xF3, 0xF7},
278*e5436536SAndroid Build Coastguard Worker     {0x01, 0x03, 0xF1, 0xF6, 0x05, 0xF8, 0xE1, 0xEB},
279*e5436536SAndroid Build Coastguard Worker     {0xF5, 0xF6, 0xF6, 0xF4, 0xFB, 0xFB, 0xFF, 0x00},
280*e5436536SAndroid Build Coastguard Worker     {0xF8, 0x01, 0xFB, 0xFA, 0xFF, 0x03, 0xFE, 0x04},
281*e5436536SAndroid Build Coastguard Worker     {0x04, 0xFB, 0x03, 0xFD, 0xF5, 0xF7, 0xF6, 0xFB},
282*e5436536SAndroid Build Coastguard Worker     {0x06, 0x09, 0xFB, 0xF4, 0xF9, 0xFA, 0xFC, 0xFF},
283*e5436536SAndroid Build Coastguard Worker     {0xF5, 0xF6, 0xF1, 0xEE, 0xF5, 0xF8, 0xF5, 0xF9},
284*e5436536SAndroid Build Coastguard Worker     {0xF5, 0xF9, 0xFA, 0xFC, 0x07, 0x09, 0x01, 0xFB},
285*e5436536SAndroid Build Coastguard Worker     {0xD7, 0xE9, 0xE8, 0xEC, 0x00, 0x0C, 0xFE, 0xF1},
286*e5436536SAndroid Build Coastguard Worker     {0xEC, 0x04, 0xE9, 0xDF, 0x03, 0xE8, 0x00, 0xFA},
287*e5436536SAndroid Build Coastguard Worker     {0xE6, 0xE2, 0xFF, 0x0A, 0x13, 0x01, 0x00, 0xF7},
288*e5436536SAndroid Build Coastguard Worker     {0xF1, 0xFA, 0xF7, 0xF5, 0x01, 0x06, 0x05, 0x0A},
289*e5436536SAndroid Build Coastguard Worker     {0xF6, 0xF6, 0xFC, 0xF6, 0xE8, 0x11, 0xF2, 0xFE},
290*e5436536SAndroid Build Coastguard Worker     {0xFE, 0x08, 0x05, 0x12, 0xFD, 0xD0, 0x0E, 0x07},
291*e5436536SAndroid Build Coastguard Worker     {0xF1, 0xFE, 0xF7, 0xF2, 0xFB, 0x02, 0xFA, 0xF8},
292*e5436536SAndroid Build Coastguard Worker     {0xF4, 0xEA, 0xEC, 0xF3, 0xFE, 0x01, 0xF7, 0xF6},
293*e5436536SAndroid Build Coastguard Worker     {0xFF, 0xFA, 0xFB, 0xF9, 0xFF, 0x01, 0x04, 0x03},
294*e5436536SAndroid Build Coastguard Worker     {0x00, 0xF9, 0xF4, 0xFC, 0x05, 0xFC, 0xF7, 0xFB},
295*e5436536SAndroid Build Coastguard Worker     {0xF8, 0xFF, 0xEF, 0xEC, 0xFB, 0x04, 0xF8, 0x03},
296*e5436536SAndroid Build Coastguard Worker     {0xEB, 0xF1, 0xED, 0xF4, 0x02, 0x0E, 0x0B, 0x04},
297*e5436536SAndroid Build Coastguard Worker     {0xF7, 0x01, 0xF8, 0xF4, 0xF8, 0xEF, 0xF8, 0x04},
298*e5436536SAndroid Build Coastguard Worker     {0xEB, 0xF0, 0xF7, 0xFC, 0x10, 0x0D, 0xF8, 0xF8},
299*e5436536SAndroid Build Coastguard Worker     {0xE8, 0xFE, 0xEE, 0xE8, 0xED, 0xF7, 0xF5, 0xF8},
300*e5436536SAndroid Build Coastguard Worker     {0xED, 0xEB, 0xE9, 0xEA, 0xF2, 0xF5, 0xF4, 0xF9},
301*e5436536SAndroid Build Coastguard Worker     {0xEA, 0xF2, 0xEF, 0xEE, 0xF9, 0xFE, 0xFD, 0x02},
302*e5436536SAndroid Build Coastguard Worker     {0xFA, 0xFD, 0x02, 0x0D, 0xFA, 0xE4, 0x0F, 0x01},
303*e5436536SAndroid Build Coastguard Worker     {0xFF, 0x08, 0x05, 0xF6, 0xF7, 0xFB, 0xF1, 0xF1},
304*e5436536SAndroid Build Coastguard Worker     {0xF4, 0xEC, 0xEE, 0xF6, 0xEE, 0xEE, 0xF8, 0x06},
305*e5436536SAndroid Build Coastguard Worker     {0xE8, 0xFA, 0xF8, 0xE8, 0xF8, 0xE9, 0xEE, 0xF9},
306*e5436536SAndroid Build Coastguard Worker     {0xE5, 0xE9, 0xF0, 0x00, 0x00, 0xEF, 0xF3, 0xF8},
307*e5436536SAndroid Build Coastguard Worker     {0xF7, 0xFB, 0xFB, 0xF7, 0xF9, 0xF9, 0xF5, 0xF0},
308*e5436536SAndroid Build Coastguard Worker     {0xFD, 0xFF, 0xF2, 0xEE, 0xF2, 0xF5, 0xF1, 0xF3}};
309*e5436536SAndroid Build Coastguard Worker 
310*e5436536SAndroid Build Coastguard Worker static const UCHAR g_3a_pvcTab1_mode2[PVC_NTAB1][PVC_NBLOW][PVC_NBHIGH_MODE2] =
311*e5436536SAndroid Build Coastguard Worker     {{{0x11, 0x27, 0x0F, 0xFD, 0x04, 0xFC},
312*e5436536SAndroid Build Coastguard Worker       {0x00, 0xBE, 0xE3, 0xF4, 0xDB, 0xF0},
313*e5436536SAndroid Build Coastguard Worker       {0x09, 0x1E, 0x18, 0x1A, 0x21, 0x1B}},
314*e5436536SAndroid Build Coastguard Worker      {{0x16, 0x28, 0x2B, 0x29, 0x25, 0x32},
315*e5436536SAndroid Build Coastguard Worker       {0xF2, 0xE9, 0xE4, 0xE5, 0xE2, 0xD4},
316*e5436536SAndroid Build Coastguard Worker       {0x0E, 0x0B, 0x0C, 0x0D, 0x0D, 0x0E}},
317*e5436536SAndroid Build Coastguard Worker      {{0x2E, 0x3C, 0x20, 0x16, 0x1B, 0x1A},
318*e5436536SAndroid Build Coastguard Worker       {0xE4, 0xC6, 0xE5, 0xF4, 0xDC, 0xDC},
319*e5436536SAndroid Build Coastguard Worker       {0x0F, 0x1B, 0x18, 0x14, 0x1E, 0x1A}}};
320*e5436536SAndroid Build Coastguard Worker 
321*e5436536SAndroid Build Coastguard Worker static const UCHAR g_2a_pvcTab2_mode2[PVC_NTAB2][PVC_NBHIGH_MODE2] = {
322*e5436536SAndroid Build Coastguard Worker     {0x26, 0x25, 0x11, 0x0C, 0xFA, 0x15}, {0x1B, 0x18, 0x11, 0x0E, 0x0E, 0x0E},
323*e5436536SAndroid Build Coastguard Worker     {0x12, 0x10, 0x10, 0x10, 0x11, 0x10}, {0x1E, 0x24, 0x19, 0x15, 0x14, 0x12},
324*e5436536SAndroid Build Coastguard Worker     {0x24, 0x16, 0x12, 0x13, 0x15, 0x1C}, {0xEA, 0xED, 0xEB, 0xEA, 0xEC, 0xEB},
325*e5436536SAndroid Build Coastguard Worker     {0xFC, 0xFD, 0xFD, 0xFC, 0xFE, 0xFE}, {0x0F, 0x0C, 0x0B, 0x0A, 0x0B, 0x0B},
326*e5436536SAndroid Build Coastguard Worker     {0x22, 0x0B, 0x16, 0x18, 0x13, 0x19}, {0x1C, 0x14, 0x1D, 0x20, 0x19, 0x1A},
327*e5436536SAndroid Build Coastguard Worker     {0x10, 0x08, 0x00, 0xFF, 0x02, 0x05}, {0x06, 0x07, 0x05, 0x03, 0x05, 0x04},
328*e5436536SAndroid Build Coastguard Worker     {0x2A, 0x1F, 0x12, 0x12, 0x11, 0x18}, {0x19, 0x19, 0x02, 0x04, 0x00, 0x04},
329*e5436536SAndroid Build Coastguard Worker     {0x18, 0x17, 0x17, 0x15, 0x16, 0x15}, {0x21, 0x1E, 0x1B, 0x19, 0x1C, 0x1B},
330*e5436536SAndroid Build Coastguard Worker     {0x3C, 0x35, 0x20, 0x1D, 0x30, 0x34}, {0x3A, 0x1F, 0x37, 0x38, 0x33, 0x31},
331*e5436536SAndroid Build Coastguard Worker     {0x37, 0x34, 0x25, 0x27, 0x35, 0x34}, {0x34, 0x2E, 0x32, 0x31, 0x34, 0x31},
332*e5436536SAndroid Build Coastguard Worker     {0x36, 0x33, 0x2F, 0x2F, 0x32, 0x2F}, {0x35, 0x20, 0x2F, 0x32, 0x2F, 0x2C},
333*e5436536SAndroid Build Coastguard Worker     {0x2E, 0x2B, 0x2F, 0x34, 0x36, 0x30}, {0x3F, 0x39, 0x30, 0x28, 0x29, 0x29},
334*e5436536SAndroid Build Coastguard Worker     {0x3C, 0x30, 0x32, 0x37, 0x39, 0x36}, {0x37, 0x36, 0x30, 0x2B, 0x26, 0x24},
335*e5436536SAndroid Build Coastguard Worker     {0x44, 0x38, 0x2F, 0x2D, 0x2D, 0x2D}, {0x38, 0x2B, 0x2C, 0x2C, 0x30, 0x2D},
336*e5436536SAndroid Build Coastguard Worker     {0x37, 0x36, 0x2F, 0x23, 0x2D, 0x32}, {0x3C, 0x39, 0x29, 0x2E, 0x38, 0x37},
337*e5436536SAndroid Build Coastguard Worker     {0x3B, 0x3A, 0x35, 0x32, 0x31, 0x2D}, {0x32, 0x31, 0x2F, 0x2C, 0x2D, 0x28},
338*e5436536SAndroid Build Coastguard Worker     {0x2C, 0x31, 0x32, 0x30, 0x32, 0x2D}, {0x35, 0x34, 0x34, 0x34, 0x35, 0x33},
339*e5436536SAndroid Build Coastguard Worker     {0x34, 0x38, 0x3B, 0x3C, 0x3E, 0x3A}, {0x3E, 0x3C, 0x3B, 0x3A, 0x3C, 0x39},
340*e5436536SAndroid Build Coastguard Worker     {0x3D, 0x41, 0x46, 0x41, 0x3D, 0x38}, {0x44, 0x41, 0x40, 0x3E, 0x3F, 0x3A},
341*e5436536SAndroid Build Coastguard Worker     {0x47, 0x47, 0x47, 0x42, 0x44, 0x40}, {0x4C, 0x4A, 0x4A, 0x46, 0x49, 0x45},
342*e5436536SAndroid Build Coastguard Worker     {0x53, 0x52, 0x52, 0x4C, 0x4E, 0x49}, {0x41, 0x3D, 0x39, 0x2C, 0x2E, 0x2E},
343*e5436536SAndroid Build Coastguard Worker     {0x2D, 0x37, 0x36, 0x30, 0x28, 0x36}, {0x3B, 0x32, 0x2E, 0x2D, 0x2D, 0x29},
344*e5436536SAndroid Build Coastguard Worker     {0x40, 0x39, 0x36, 0x35, 0x36, 0x32}, {0x30, 0x2D, 0x2D, 0x2E, 0x31, 0x30},
345*e5436536SAndroid Build Coastguard Worker     {0x38, 0x3D, 0x3B, 0x37, 0x35, 0x34}, {0x44, 0x3D, 0x3C, 0x38, 0x37, 0x33},
346*e5436536SAndroid Build Coastguard Worker     {0x3A, 0x36, 0x37, 0x37, 0x39, 0x36}, {0x32, 0x36, 0x37, 0x30, 0x2E, 0x2A},
347*e5436536SAndroid Build Coastguard Worker     {0x3C, 0x33, 0x33, 0x31, 0x33, 0x30}, {0x30, 0x31, 0x36, 0x37, 0x38, 0x34},
348*e5436536SAndroid Build Coastguard Worker     {0x26, 0x27, 0x2E, 0x29, 0x1C, 0x16}, {0x14, 0x15, 0x1F, 0x17, 0x15, 0x1C},
349*e5436536SAndroid Build Coastguard Worker     {0x38, 0x2D, 0x18, 0x13, 0x1E, 0x2B}, {0x30, 0x22, 0x17, 0x1A, 0x26, 0x2B},
350*e5436536SAndroid Build Coastguard Worker     {0x24, 0x20, 0x1F, 0x10, 0x0C, 0x11}, {0x27, 0x1F, 0x13, 0x17, 0x24, 0x2A},
351*e5436536SAndroid Build Coastguard Worker     {0x2F, 0x13, 0x18, 0x13, 0x2A, 0x32}, {0x31, 0x1E, 0x1E, 0x1E, 0x21, 0x28},
352*e5436536SAndroid Build Coastguard Worker     {0x2A, 0x12, 0x19, 0x17, 0x16, 0x24}, {0x27, 0x0F, 0x16, 0x1D, 0x17, 0x1C},
353*e5436536SAndroid Build Coastguard Worker     {0x2F, 0x26, 0x25, 0x22, 0x20, 0x22}, {0x1E, 0x1B, 0x1E, 0x18, 0x1E, 0x24},
354*e5436536SAndroid Build Coastguard Worker     {0x31, 0x26, 0x0E, 0x15, 0x15, 0x25}, {0x2D, 0x22, 0x1E, 0x14, 0x10, 0x22},
355*e5436536SAndroid Build Coastguard Worker     {0x25, 0x1B, 0x18, 0x11, 0x13, 0x1F}, {0x2F, 0x1B, 0x13, 0x1B, 0x18, 0x22},
356*e5436536SAndroid Build Coastguard Worker     {0x21, 0x24, 0x1D, 0x1C, 0x1D, 0x1B}, {0x23, 0x1E, 0x28, 0x29, 0x27, 0x25},
357*e5436536SAndroid Build Coastguard Worker     {0x2E, 0x2A, 0x1D, 0x17, 0x26, 0x2D}, {0x31, 0x2C, 0x1A, 0x0E, 0x1A, 0x24},
358*e5436536SAndroid Build Coastguard Worker     {0x26, 0x16, 0x20, 0x1D, 0x14, 0x1E}, {0x29, 0x20, 0x1B, 0x1B, 0x17, 0x17},
359*e5436536SAndroid Build Coastguard Worker     {0x1D, 0x06, 0x1A, 0x1E, 0x1B, 0x1D}, {0x2B, 0x23, 0x1F, 0x1F, 0x1D, 0x1C},
360*e5436536SAndroid Build Coastguard Worker     {0x27, 0x1A, 0x0C, 0x0E, 0x0F, 0x1A}, {0x29, 0x1D, 0x1E, 0x22, 0x22, 0x24},
361*e5436536SAndroid Build Coastguard Worker     {0x20, 0x21, 0x1B, 0x18, 0x13, 0x21}, {0x27, 0x0E, 0x10, 0x14, 0x10, 0x1A},
362*e5436536SAndroid Build Coastguard Worker     {0x26, 0x24, 0x25, 0x25, 0x26, 0x28}, {0x1A, 0x24, 0x25, 0x29, 0x26, 0x24},
363*e5436536SAndroid Build Coastguard Worker     {0x1D, 0x1D, 0x15, 0x12, 0x0F, 0x18}, {0x1E, 0x14, 0x13, 0x12, 0x14, 0x18},
364*e5436536SAndroid Build Coastguard Worker     {0x16, 0x13, 0x13, 0x1A, 0x1B, 0x1D}, {0x20, 0x27, 0x22, 0x24, 0x1A, 0x19},
365*e5436536SAndroid Build Coastguard Worker     {0x1F, 0x17, 0x19, 0x18, 0x17, 0x18}, {0x20, 0x1B, 0x1C, 0x1C, 0x1B, 0x1A},
366*e5436536SAndroid Build Coastguard Worker     {0x23, 0x19, 0x1D, 0x1F, 0x1E, 0x21}, {0x26, 0x1F, 0x1D, 0x1B, 0x19, 0x1A},
367*e5436536SAndroid Build Coastguard Worker     {0x23, 0x1E, 0x1F, 0x20, 0x1F, 0x1E}, {0x29, 0x20, 0x22, 0x20, 0x20, 0x1F},
368*e5436536SAndroid Build Coastguard Worker     {0x26, 0x23, 0x21, 0x22, 0x23, 0x23}, {0x29, 0x1F, 0x24, 0x25, 0x26, 0x29},
369*e5436536SAndroid Build Coastguard Worker     {0x2B, 0x22, 0x25, 0x27, 0x23, 0x21}, {0x29, 0x21, 0x19, 0x0E, 0x22, 0x2D},
370*e5436536SAndroid Build Coastguard Worker     {0x32, 0x29, 0x1F, 0x1C, 0x1B, 0x21}, {0x1E, 0x1A, 0x1E, 0x24, 0x25, 0x25},
371*e5436536SAndroid Build Coastguard Worker     {0x24, 0x1D, 0x21, 0x22, 0x22, 0x25}, {0x2C, 0x25, 0x21, 0x22, 0x23, 0x25},
372*e5436536SAndroid Build Coastguard Worker     {0x24, 0x1E, 0x21, 0x26, 0x2B, 0x2C}, {0x28, 0x24, 0x1B, 0x1F, 0x28, 0x2D},
373*e5436536SAndroid Build Coastguard Worker     {0x23, 0x13, 0x16, 0x22, 0x22, 0x29}, {0x1B, 0x23, 0x1C, 0x20, 0x14, 0x0D},
374*e5436536SAndroid Build Coastguard Worker     {0x1E, 0x16, 0x1A, 0x1E, 0x1C, 0x1D}, {0x2B, 0x1C, 0x1D, 0x20, 0x1B, 0x1C},
375*e5436536SAndroid Build Coastguard Worker     {0x1C, 0x1B, 0x23, 0x1F, 0x19, 0x1E}, {0x21, 0x23, 0x26, 0x20, 0x20, 0x22},
376*e5436536SAndroid Build Coastguard Worker     {0x1D, 0x0B, 0x19, 0x1E, 0x11, 0x19}, {0x18, 0x17, 0x16, 0x17, 0x14, 0x16},
377*e5436536SAndroid Build Coastguard Worker     {0x16, 0x19, 0x1C, 0x20, 0x21, 0x22}, {0x30, 0x1E, 0x22, 0x24, 0x25, 0x26},
378*e5436536SAndroid Build Coastguard Worker     {0x1B, 0x1F, 0x17, 0x1D, 0x1E, 0x21}, {0x32, 0x2B, 0x27, 0x1F, 0x1B, 0x1A},
379*e5436536SAndroid Build Coastguard Worker     {0x28, 0x20, 0x1A, 0x1B, 0x1F, 0x23}, {0x32, 0x21, 0x20, 0x21, 0x1D, 0x1F},
380*e5436536SAndroid Build Coastguard Worker     {0x22, 0x18, 0x12, 0x15, 0x1B, 0x20}, {0x27, 0x27, 0x2A, 0x24, 0x21, 0x21},
381*e5436536SAndroid Build Coastguard Worker     {0x1E, 0x0F, 0x0D, 0x1A, 0x1D, 0x23}, {0x28, 0x25, 0x27, 0x21, 0x17, 0x25},
382*e5436536SAndroid Build Coastguard Worker     {0x2B, 0x27, 0x23, 0x19, 0x13, 0x14}, {0x25, 0x2B, 0x22, 0x22, 0x20, 0x21},
383*e5436536SAndroid Build Coastguard Worker     {0x27, 0x1B, 0x16, 0x17, 0x0F, 0x15}, {0x29, 0x26, 0x23, 0x15, 0x1E, 0x28},
384*e5436536SAndroid Build Coastguard Worker     {0x24, 0x1C, 0x19, 0x1A, 0x18, 0x19}, {0x2D, 0x15, 0x27, 0x2B, 0x24, 0x23},
385*e5436536SAndroid Build Coastguard Worker     {0x2C, 0x12, 0x1F, 0x23, 0x1F, 0x20}, {0x25, 0x0F, 0x22, 0x27, 0x1F, 0x21}};
386*e5436536SAndroid Build Coastguard Worker 
387*e5436536SAndroid Build Coastguard Worker static const UCHAR g_a_pvcTab1_dp_mode1[PVC_NTAB1 - 1] = {17, 68};
388*e5436536SAndroid Build Coastguard Worker static const UCHAR g_a_pvcTab1_dp_mode2[PVC_NTAB1 - 1] = {16, 52};
389*e5436536SAndroid Build Coastguard Worker /* fractional exponent which corresponds to Q representation value */
390*e5436536SAndroid Build Coastguard Worker static const SCHAR g_a_scalingCoef_mode1[PVC_NBLOW + 1] = {
391*e5436536SAndroid Build Coastguard Worker     -1, -1, 0, 6}; /* { 8, 8, 7, 1 }; Q scaling */
392*e5436536SAndroid Build Coastguard Worker static const SCHAR g_a_scalingCoef_mode2[PVC_NBLOW + 1] = {
393*e5436536SAndroid Build Coastguard Worker     0, 0, 1, 7}; /* { 7, 7, 6, 0 }; Q scaling */
394*e5436536SAndroid Build Coastguard Worker 
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)395*e5436536SAndroid Build Coastguard Worker int pvcInitFrame(PVC_STATIC_DATA *pPvcStaticData,
396*e5436536SAndroid Build Coastguard Worker                  PVC_DYNAMIC_DATA *pPvcDynamicData, const UCHAR pvcMode,
397*e5436536SAndroid Build Coastguard Worker                  const UCHAR ns, const int RATE, const int kx,
398*e5436536SAndroid Build Coastguard Worker                  const int pvcBorder0, const UCHAR *pPvcID) {
399*e5436536SAndroid Build Coastguard Worker   int lbw, hbw, i, temp;
400*e5436536SAndroid Build Coastguard Worker   pPvcDynamicData->pvc_mode = pvcMode;
401*e5436536SAndroid Build Coastguard Worker   pPvcDynamicData->kx = kx;
402*e5436536SAndroid Build Coastguard Worker   pPvcDynamicData->RATE = RATE;
403*e5436536SAndroid Build Coastguard Worker 
404*e5436536SAndroid Build Coastguard Worker   switch (pvcMode) {
405*e5436536SAndroid Build Coastguard Worker     case 0:
406*e5436536SAndroid Build Coastguard Worker       /* legacy SBR, nothing to do */
407*e5436536SAndroid Build Coastguard Worker       return 0;
408*e5436536SAndroid Build Coastguard Worker     case 1:
409*e5436536SAndroid Build Coastguard Worker       pPvcDynamicData->nbHigh = 8;
410*e5436536SAndroid Build Coastguard Worker       pPvcDynamicData->pPVCTab1 = (const UCHAR *)g_3a_pvcTab1_mode1;
411*e5436536SAndroid Build Coastguard Worker       pPvcDynamicData->pPVCTab2 = (const UCHAR *)g_2a_pvcTab2_mode1;
412*e5436536SAndroid Build Coastguard Worker       pPvcDynamicData->pPVCTab1_dp = g_a_pvcTab1_dp_mode1;
413*e5436536SAndroid Build Coastguard Worker       pPvcDynamicData->pScalingCoef = g_a_scalingCoef_mode1;
414*e5436536SAndroid Build Coastguard Worker       hbw = 8 / RATE;
415*e5436536SAndroid Build Coastguard Worker       break;
416*e5436536SAndroid Build Coastguard Worker     case 2:
417*e5436536SAndroid Build Coastguard Worker       pPvcDynamicData->nbHigh = 6;
418*e5436536SAndroid Build Coastguard Worker       pPvcDynamicData->pPVCTab1 = (const UCHAR *)g_3a_pvcTab1_mode2;
419*e5436536SAndroid Build Coastguard Worker       pPvcDynamicData->pPVCTab2 = (const UCHAR *)g_2a_pvcTab2_mode2;
420*e5436536SAndroid Build Coastguard Worker       pPvcDynamicData->pPVCTab1_dp = g_a_pvcTab1_dp_mode2;
421*e5436536SAndroid Build Coastguard Worker       pPvcDynamicData->pScalingCoef = g_a_scalingCoef_mode2;
422*e5436536SAndroid Build Coastguard Worker       hbw = 12 / RATE;
423*e5436536SAndroid Build Coastguard Worker       break;
424*e5436536SAndroid Build Coastguard Worker     default:
425*e5436536SAndroid Build Coastguard Worker       /* invalid pvcMode */
426*e5436536SAndroid Build Coastguard Worker       return 1;
427*e5436536SAndroid Build Coastguard Worker   }
428*e5436536SAndroid Build Coastguard Worker 
429*e5436536SAndroid Build Coastguard Worker   pPvcDynamicData->pvcBorder0 = pvcBorder0;
430*e5436536SAndroid Build Coastguard Worker   UCHAR pvcBorder0_last = pPvcStaticData->pvcBorder0;
431*e5436536SAndroid Build Coastguard Worker   pPvcStaticData->pvcBorder0 = pvcBorder0;
432*e5436536SAndroid Build Coastguard Worker   pPvcDynamicData->pPvcID = pPvcID;
433*e5436536SAndroid Build Coastguard Worker 
434*e5436536SAndroid Build Coastguard Worker   pPvcDynamicData->ns = ns;
435*e5436536SAndroid Build Coastguard Worker   switch (ns) {
436*e5436536SAndroid Build Coastguard Worker     case 16:
437*e5436536SAndroid Build Coastguard Worker       pPvcDynamicData->pSCcoeffs = pvc_SC_16;
438*e5436536SAndroid Build Coastguard Worker       break;
439*e5436536SAndroid Build Coastguard Worker     case 12:
440*e5436536SAndroid Build Coastguard Worker       pPvcDynamicData->pSCcoeffs = pvc_SC_12;
441*e5436536SAndroid Build Coastguard Worker       break;
442*e5436536SAndroid Build Coastguard Worker     case 4:
443*e5436536SAndroid Build Coastguard Worker       pPvcDynamicData->pSCcoeffs = pvc_SC_4;
444*e5436536SAndroid Build Coastguard Worker       break;
445*e5436536SAndroid Build Coastguard Worker     case 3:
446*e5436536SAndroid Build Coastguard Worker       pPvcDynamicData->pSCcoeffs = pvc_SC_3;
447*e5436536SAndroid Build Coastguard Worker       break;
448*e5436536SAndroid Build Coastguard Worker     default:
449*e5436536SAndroid Build Coastguard Worker       return 1;
450*e5436536SAndroid Build Coastguard Worker   }
451*e5436536SAndroid Build Coastguard Worker 
452*e5436536SAndroid Build Coastguard Worker   /* in the lower part of Esg-array there are previous values of Esg (from last
453*e5436536SAndroid Build Coastguard Worker      call to this function In case of an previous legay-SBR frame, or if there
454*e5436536SAndroid Build Coastguard Worker      was a change in cross-over FQ the value of first PVC SBR timeslot is
455*e5436536SAndroid Build Coastguard Worker      propagated to prev-values in order to have reasonable values for
456*e5436536SAndroid Build Coastguard Worker      smooth-filtering
457*e5436536SAndroid Build Coastguard Worker   */
458*e5436536SAndroid Build Coastguard Worker   if ((pPvcStaticData->pvc_mode_last == 0) || (pPvcStaticData->kx_last != kx)) {
459*e5436536SAndroid Build Coastguard Worker     pPvcDynamicData->pastEsgSlotsAvail = 0;
460*e5436536SAndroid Build Coastguard Worker   } else {
461*e5436536SAndroid Build Coastguard Worker     pPvcDynamicData->pastEsgSlotsAvail = PVC_NS_MAX - pvcBorder0_last;
462*e5436536SAndroid Build Coastguard Worker   }
463*e5436536SAndroid Build Coastguard Worker 
464*e5436536SAndroid Build Coastguard Worker   lbw = 8 / RATE;
465*e5436536SAndroid Build Coastguard Worker 
466*e5436536SAndroid Build Coastguard Worker   temp = kx;
467*e5436536SAndroid Build Coastguard Worker   for (i = PVC_NBLOW; i >= 0; i--) {
468*e5436536SAndroid Build Coastguard Worker     pPvcDynamicData->sg_offset_low[i] = temp;
469*e5436536SAndroid Build Coastguard Worker     temp -= lbw;
470*e5436536SAndroid Build Coastguard Worker   }
471*e5436536SAndroid Build Coastguard Worker 
472*e5436536SAndroid Build Coastguard Worker   temp = 0;
473*e5436536SAndroid Build Coastguard Worker   for (i = 0; i <= pPvcDynamicData->nbHigh; i++) {
474*e5436536SAndroid Build Coastguard Worker     pPvcDynamicData->sg_offset_high_kx[i] = temp;
475*e5436536SAndroid Build Coastguard Worker     temp += hbw;
476*e5436536SAndroid Build Coastguard Worker   }
477*e5436536SAndroid Build Coastguard Worker 
478*e5436536SAndroid Build Coastguard Worker   return 0;
479*e5436536SAndroid Build Coastguard Worker }
480*e5436536SAndroid Build Coastguard Worker 
481*e5436536SAndroid Build Coastguard Worker /* call if pvcMode = 1,2 */
pvcDecodeFrame(PVC_STATIC_DATA * pPvcStaticData,PVC_DYNAMIC_DATA * pPvcDynamicData,FIXP_DBL ** qmfBufferReal,FIXP_DBL ** qmfBufferImag,const int overlap,const int qmfExponentOverlap,const int qmfExponentCurrent)482*e5436536SAndroid Build Coastguard Worker void pvcDecodeFrame(PVC_STATIC_DATA *pPvcStaticData,
483*e5436536SAndroid Build Coastguard Worker                     PVC_DYNAMIC_DATA *pPvcDynamicData, FIXP_DBL **qmfBufferReal,
484*e5436536SAndroid Build Coastguard Worker                     FIXP_DBL **qmfBufferImag, const int overlap,
485*e5436536SAndroid Build Coastguard Worker                     const int qmfExponentOverlap,
486*e5436536SAndroid Build Coastguard Worker                     const int qmfExponentCurrent) {
487*e5436536SAndroid Build Coastguard Worker   int t;
488*e5436536SAndroid Build Coastguard Worker   FIXP_DBL *predictedEsgSlot;
489*e5436536SAndroid Build Coastguard Worker   int RATE = pPvcDynamicData->RATE;
490*e5436536SAndroid Build Coastguard Worker   int pvcBorder0 = pPvcDynamicData->pvcBorder0;
491*e5436536SAndroid Build Coastguard Worker 
492*e5436536SAndroid Build Coastguard Worker   for (t = pvcBorder0; t < PVC_NTIMESLOT; t++) {
493*e5436536SAndroid Build Coastguard Worker     int *pPredEsg_exp = &pPvcDynamicData->predEsg_exp[t];
494*e5436536SAndroid Build Coastguard Worker     predictedEsgSlot = pPvcDynamicData->predEsg[t];
495*e5436536SAndroid Build Coastguard Worker 
496*e5436536SAndroid Build Coastguard Worker     pvcDecodeTimeSlot(
497*e5436536SAndroid Build Coastguard Worker         pPvcStaticData, pPvcDynamicData, &qmfBufferReal[t * RATE],
498*e5436536SAndroid Build Coastguard Worker         &qmfBufferImag[t * RATE],
499*e5436536SAndroid Build Coastguard Worker         (t * RATE < overlap) ? qmfExponentOverlap : qmfExponentCurrent,
500*e5436536SAndroid Build Coastguard Worker         pvcBorder0, t, predictedEsgSlot, pPredEsg_exp);
501*e5436536SAndroid Build Coastguard Worker   }
502*e5436536SAndroid Build Coastguard Worker 
503*e5436536SAndroid Build Coastguard Worker   return;
504*e5436536SAndroid Build Coastguard Worker }
505*e5436536SAndroid Build Coastguard Worker 
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)506*e5436536SAndroid Build Coastguard Worker void pvcDecodeTimeSlot(PVC_STATIC_DATA *pPvcStaticData,
507*e5436536SAndroid Build Coastguard Worker                        PVC_DYNAMIC_DATA *pPvcDynamicData,
508*e5436536SAndroid Build Coastguard Worker                        FIXP_DBL **qmfSlotReal, FIXP_DBL **qmfSlotImag,
509*e5436536SAndroid Build Coastguard Worker                        const int qmfExponent, const int pvcBorder0,
510*e5436536SAndroid Build Coastguard Worker                        const int timeSlotNumber, FIXP_DBL predictedEsgSlot[],
511*e5436536SAndroid Build Coastguard Worker                        int *predictedEsg_exp) {
512*e5436536SAndroid Build Coastguard Worker   int i, band, ksg, ksg_start = 0;
513*e5436536SAndroid Build Coastguard Worker   int RATE = pPvcDynamicData->RATE;
514*e5436536SAndroid Build Coastguard Worker   int Esg_index = pPvcStaticData->Esg_slot_index;
515*e5436536SAndroid Build Coastguard Worker   const SCHAR *sg_borders = pPvcDynamicData->sg_offset_low;
516*e5436536SAndroid Build Coastguard Worker   FIXP_DBL *pEsg = pPvcStaticData->Esg[Esg_index];
517*e5436536SAndroid Build Coastguard Worker   FIXP_DBL E[PVC_NBLOW] = {0};
518*e5436536SAndroid Build Coastguard Worker 
519*e5436536SAndroid Build Coastguard Worker   /* Subband grouping in QMF subbands below SBR range */
520*e5436536SAndroid Build Coastguard Worker   /* Within one timeslot ( i = [0...(RATE-1)] QMF subsamples) calculate energy
521*e5436536SAndroid Build Coastguard Worker      E(ib,t) and group them to Esg(ksg,t). Then transfer values to logarithmical
522*e5436536SAndroid Build Coastguard Worker      domain and store them for time domain smoothing. (7.5.6.3 Subband grouping
523*e5436536SAndroid Build Coastguard Worker      in QMF subbands below SBR range)
524*e5436536SAndroid Build Coastguard Worker   */
525*e5436536SAndroid Build Coastguard Worker   for (ksg = 0; sg_borders[ksg] < 0; ksg++) {
526*e5436536SAndroid Build Coastguard Worker     pEsg[ksg] = FL2FXCONST_DBL(-10.0 / (1 << PVC_ESG_EXP)); /* 10*log10(0.1) */
527*e5436536SAndroid Build Coastguard Worker     ksg_start++;
528*e5436536SAndroid Build Coastguard Worker   }
529*e5436536SAndroid Build Coastguard Worker 
530*e5436536SAndroid Build Coastguard Worker   for (i = 0; i < RATE; i++) {
531*e5436536SAndroid Build Coastguard Worker     FIXP_DBL *qmfR, *qmfI;
532*e5436536SAndroid Build Coastguard Worker     qmfR = qmfSlotReal[i];
533*e5436536SAndroid Build Coastguard Worker     qmfI = qmfSlotImag[i];
534*e5436536SAndroid Build Coastguard Worker     for (ksg = ksg_start; ksg < PVC_NBLOW; ksg++) {
535*e5436536SAndroid Build Coastguard Worker       for (band = sg_borders[ksg]; band < sg_borders[ksg + 1]; band++) {
536*e5436536SAndroid Build Coastguard Worker         /* The division by 8 == (RATE*lbw) is required algorithmically */
537*e5436536SAndroid Build Coastguard Worker         E[ksg] +=
538*e5436536SAndroid Build Coastguard Worker             ((fPow2Div2(qmfR[band]) >> 1) + (fPow2Div2(qmfI[band]) >> 1)) >> 3;
539*e5436536SAndroid Build Coastguard Worker       }
540*e5436536SAndroid Build Coastguard Worker     }
541*e5436536SAndroid Build Coastguard Worker   }
542*e5436536SAndroid Build Coastguard Worker   for (ksg = ksg_start; ksg < PVC_NBLOW; ksg++) {
543*e5436536SAndroid Build Coastguard Worker     if (E[ksg] > (FIXP_DBL)0) {
544*e5436536SAndroid Build Coastguard Worker       /* 10/log2(10) = 0.752574989159953 * 2^2 */
545*e5436536SAndroid Build Coastguard Worker       int exp_log;
546*e5436536SAndroid Build Coastguard Worker       FIXP_DBL nrg = CalcLog2(E[ksg], 2 * qmfExponent + 2, &exp_log);
547*e5436536SAndroid Build Coastguard Worker       nrg = fMult(nrg, FL2FXCONST_SGL(LOG10FAC));
548*e5436536SAndroid Build Coastguard Worker       nrg = scaleValue(nrg, exp_log - PVC_ESG_EXP + 2);
549*e5436536SAndroid Build Coastguard Worker       pEsg[ksg] = fMax(nrg, FL2FXCONST_DBL(-10.0 / (1 << PVC_ESG_EXP)));
550*e5436536SAndroid Build Coastguard Worker     } else {
551*e5436536SAndroid Build Coastguard Worker       pEsg[ksg] =
552*e5436536SAndroid Build Coastguard Worker           FL2FXCONST_DBL(-10.0 / (1 << PVC_ESG_EXP)); /* 10*log10(0.1) */
553*e5436536SAndroid Build Coastguard Worker     }
554*e5436536SAndroid Build Coastguard Worker   }
555*e5436536SAndroid Build Coastguard Worker 
556*e5436536SAndroid Build Coastguard Worker   /* Time domain smoothing of subband-grouped energy */
557*e5436536SAndroid Build Coastguard Worker   {
558*e5436536SAndroid Build Coastguard Worker     int idx = pPvcStaticData->Esg_slot_index;
559*e5436536SAndroid Build Coastguard Worker     FIXP_DBL *pEsg_filt;
560*e5436536SAndroid Build Coastguard Worker     FIXP_SGL SCcoeff;
561*e5436536SAndroid Build Coastguard Worker 
562*e5436536SAndroid Build Coastguard Worker     E[0] = E[1] = E[2] = (FIXP_DBL)0;
563*e5436536SAndroid Build Coastguard Worker     for (i = 0; i < pPvcDynamicData->ns; i++) {
564*e5436536SAndroid Build Coastguard Worker       SCcoeff = pPvcDynamicData->pSCcoeffs[i];
565*e5436536SAndroid Build Coastguard Worker       pEsg_filt = pPvcStaticData->Esg[idx];
566*e5436536SAndroid Build Coastguard Worker       /* Div2 is compensated by scaling of coeff table */
567*e5436536SAndroid Build Coastguard Worker       E[0] = fMultAddDiv2(E[0], pEsg_filt[0], SCcoeff);
568*e5436536SAndroid Build Coastguard Worker       E[1] = fMultAddDiv2(E[1], pEsg_filt[1], SCcoeff);
569*e5436536SAndroid Build Coastguard Worker       E[2] = fMultAddDiv2(E[2], pEsg_filt[2], SCcoeff);
570*e5436536SAndroid Build Coastguard Worker       if (i >= pPvcDynamicData->pastEsgSlotsAvail) {
571*e5436536SAndroid Build Coastguard Worker         /* if past Esg values are not available use the ones from the last valid
572*e5436536SAndroid Build Coastguard Worker          * slot */
573*e5436536SAndroid Build Coastguard Worker         continue;
574*e5436536SAndroid Build Coastguard Worker       }
575*e5436536SAndroid Build Coastguard Worker       if (idx > 0) {
576*e5436536SAndroid Build Coastguard Worker         idx--;
577*e5436536SAndroid Build Coastguard Worker       } else {
578*e5436536SAndroid Build Coastguard Worker         idx += PVC_NS_MAX - 1;
579*e5436536SAndroid Build Coastguard Worker       }
580*e5436536SAndroid Build Coastguard Worker     }
581*e5436536SAndroid Build Coastguard Worker   }
582*e5436536SAndroid Build Coastguard Worker 
583*e5436536SAndroid Build Coastguard Worker   /* SBR envelope scalefactor prediction */
584*e5436536SAndroid Build Coastguard Worker   {
585*e5436536SAndroid Build Coastguard Worker     int E_high_exp[PVC_NBHIGH_MAX];
586*e5436536SAndroid Build Coastguard Worker     int E_high_exp_max = 0;
587*e5436536SAndroid Build Coastguard Worker     int pvcTab1ID;
588*e5436536SAndroid Build Coastguard Worker     int pvcTab2ID = (int)pPvcDynamicData->pPvcID[timeSlotNumber];
589*e5436536SAndroid Build Coastguard Worker     const UCHAR *pTab1, *pTab2;
590*e5436536SAndroid Build Coastguard Worker     if (pvcTab2ID < pPvcDynamicData->pPVCTab1_dp[0]) {
591*e5436536SAndroid Build Coastguard Worker       pvcTab1ID = 0;
592*e5436536SAndroid Build Coastguard Worker     } else if (pvcTab2ID < pPvcDynamicData->pPVCTab1_dp[1]) {
593*e5436536SAndroid Build Coastguard Worker       pvcTab1ID = 1;
594*e5436536SAndroid Build Coastguard Worker     } else {
595*e5436536SAndroid Build Coastguard Worker       pvcTab1ID = 2;
596*e5436536SAndroid Build Coastguard Worker     }
597*e5436536SAndroid Build Coastguard Worker     pTab1 = &(pPvcDynamicData
598*e5436536SAndroid Build Coastguard Worker                   ->pPVCTab1[pvcTab1ID * PVC_NBLOW * pPvcDynamicData->nbHigh]);
599*e5436536SAndroid Build Coastguard Worker     pTab2 = &(pPvcDynamicData->pPVCTab2[pvcTab2ID * pPvcDynamicData->nbHigh]);
600*e5436536SAndroid Build Coastguard Worker     for (ksg = 0; ksg < pPvcDynamicData->nbHigh; ksg++) {
601*e5436536SAndroid Build Coastguard Worker       FIXP_SGL predCoeff;
602*e5436536SAndroid Build Coastguard Worker       FIXP_DBL accu;
603*e5436536SAndroid Build Coastguard Worker       int predCoeff_exp, kb;
604*e5436536SAndroid Build Coastguard Worker       E_high_exp[ksg] = 0;
605*e5436536SAndroid Build Coastguard Worker 
606*e5436536SAndroid Build Coastguard Worker       /* residual part */
607*e5436536SAndroid Build Coastguard Worker       accu = ((LONG)(SCHAR)*pTab2++) << (DFRACT_BITS - 8 - PVC_ESG_EXP - 2 +
608*e5436536SAndroid Build Coastguard Worker                                          pPvcDynamicData->pScalingCoef[3]);
609*e5436536SAndroid Build Coastguard Worker 
610*e5436536SAndroid Build Coastguard Worker       /* linear combination of lower grouped energies part */
611*e5436536SAndroid Build Coastguard Worker       for (kb = 0; kb < PVC_NBLOW; kb++) {
612*e5436536SAndroid Build Coastguard Worker         predCoeff = (FIXP_SGL)(
613*e5436536SAndroid Build Coastguard Worker             (SHORT)(SCHAR)pTab1[kb * pPvcDynamicData->nbHigh + ksg] << 8);
614*e5436536SAndroid Build Coastguard Worker         predCoeff_exp = -(pPvcDynamicData->pScalingCoef[kb] + 1 -
615*e5436536SAndroid Build Coastguard Worker                           2); /* +1 to compensate for Div2; -2 for accu */
616*e5436536SAndroid Build Coastguard Worker         accu += fMultDiv2(E[kb], predCoeff) >> predCoeff_exp;
617*e5436536SAndroid Build Coastguard Worker       }
618*e5436536SAndroid Build Coastguard Worker       /* convert back to linear domain */
619*e5436536SAndroid Build Coastguard Worker       accu = fMult(accu, FL2FXCONST_SGL(LOG10FAC_INV));
620*e5436536SAndroid Build Coastguard Worker       accu = f2Pow(accu, PVC_ESG_EXP - 1 + 2,
621*e5436536SAndroid Build Coastguard Worker                    &predCoeff_exp); /* -1 compensates for exponent of
622*e5436536SAndroid Build Coastguard Worker                                        LOG10FAC_INV; +2 for accu */
623*e5436536SAndroid Build Coastguard Worker       predictedEsgSlot[ksg] = accu;
624*e5436536SAndroid Build Coastguard Worker       E_high_exp[ksg] = predCoeff_exp;
625*e5436536SAndroid Build Coastguard Worker       if (predCoeff_exp > E_high_exp_max) {
626*e5436536SAndroid Build Coastguard Worker         E_high_exp_max = predCoeff_exp;
627*e5436536SAndroid Build Coastguard Worker       }
628*e5436536SAndroid Build Coastguard Worker     }
629*e5436536SAndroid Build Coastguard Worker 
630*e5436536SAndroid Build Coastguard Worker     /* rescale output vector according to largest exponent */
631*e5436536SAndroid Build Coastguard Worker     for (ksg = 0; ksg < pPvcDynamicData->nbHigh; ksg++) {
632*e5436536SAndroid Build Coastguard Worker       int scale = fMin(E_high_exp_max - E_high_exp[ksg], DFRACT_BITS - 1);
633*e5436536SAndroid Build Coastguard Worker       predictedEsgSlot[ksg] = predictedEsgSlot[ksg] >> scale;
634*e5436536SAndroid Build Coastguard Worker     }
635*e5436536SAndroid Build Coastguard Worker     *predictedEsg_exp = E_high_exp_max;
636*e5436536SAndroid Build Coastguard Worker   }
637*e5436536SAndroid Build Coastguard Worker 
638*e5436536SAndroid Build Coastguard Worker   pPvcStaticData->Esg_slot_index =
639*e5436536SAndroid Build Coastguard Worker       (pPvcStaticData->Esg_slot_index + 1) & (PVC_NS_MAX - 1);
640*e5436536SAndroid Build Coastguard Worker   pPvcDynamicData->pastEsgSlotsAvail =
641*e5436536SAndroid Build Coastguard Worker       fMin(pPvcDynamicData->pastEsgSlotsAvail + 1, PVC_NS_MAX - 1);
642*e5436536SAndroid Build Coastguard Worker   return;
643*e5436536SAndroid Build Coastguard Worker }
644*e5436536SAndroid Build Coastguard Worker 
645*e5436536SAndroid Build Coastguard Worker /* call if pvcMode = 0,1,2 */
pvcEndFrame(PVC_STATIC_DATA * pPvcStaticData,PVC_DYNAMIC_DATA * pPvcDynamicData)646*e5436536SAndroid Build Coastguard Worker void pvcEndFrame(PVC_STATIC_DATA *pPvcStaticData,
647*e5436536SAndroid Build Coastguard Worker                  PVC_DYNAMIC_DATA *pPvcDynamicData) {
648*e5436536SAndroid Build Coastguard Worker   pPvcStaticData->pvc_mode_last = pPvcDynamicData->pvc_mode;
649*e5436536SAndroid Build Coastguard Worker   pPvcStaticData->kx_last = pPvcDynamicData->kx;
650*e5436536SAndroid Build Coastguard Worker 
651*e5436536SAndroid Build Coastguard Worker   if (pPvcDynamicData->pvc_mode == 0) return;
652*e5436536SAndroid Build Coastguard Worker 
653*e5436536SAndroid Build Coastguard Worker   {
654*e5436536SAndroid Build Coastguard Worker     int t, max = -100;
655*e5436536SAndroid Build Coastguard Worker     for (t = pPvcDynamicData->pvcBorder0; t < PVC_NTIMESLOT; t++) {
656*e5436536SAndroid Build Coastguard Worker       if (pPvcDynamicData->predEsg_exp[t] > max) {
657*e5436536SAndroid Build Coastguard Worker         max = pPvcDynamicData->predEsg_exp[t];
658*e5436536SAndroid Build Coastguard Worker       }
659*e5436536SAndroid Build Coastguard Worker     }
660*e5436536SAndroid Build Coastguard Worker     pPvcDynamicData->predEsg_expMax = max;
661*e5436536SAndroid Build Coastguard Worker   }
662*e5436536SAndroid Build Coastguard Worker   return;
663*e5436536SAndroid Build Coastguard Worker }
664*e5436536SAndroid Build Coastguard Worker 
expandPredEsg(const PVC_DYNAMIC_DATA * pPvcDynamicData,const int timeSlot,const int lengthOutputVector,FIXP_DBL * pOutput,SCHAR * pOutput_exp)665*e5436536SAndroid Build Coastguard Worker void expandPredEsg(const PVC_DYNAMIC_DATA *pPvcDynamicData, const int timeSlot,
666*e5436536SAndroid Build Coastguard Worker                    const int lengthOutputVector, FIXP_DBL *pOutput,
667*e5436536SAndroid Build Coastguard Worker                    SCHAR *pOutput_exp) {
668*e5436536SAndroid Build Coastguard Worker   int k = 0, ksg;
669*e5436536SAndroid Build Coastguard Worker   const FIXP_DBL *predEsg = pPvcDynamicData->predEsg[timeSlot];
670*e5436536SAndroid Build Coastguard Worker 
671*e5436536SAndroid Build Coastguard Worker   for (ksg = 0; ksg < pPvcDynamicData->nbHigh; ksg++) {
672*e5436536SAndroid Build Coastguard Worker     for (; k < pPvcDynamicData->sg_offset_high_kx[ksg + 1]; k++) {
673*e5436536SAndroid Build Coastguard Worker       pOutput[k] = predEsg[ksg];
674*e5436536SAndroid Build Coastguard Worker       pOutput_exp[k] = (SCHAR)pPvcDynamicData->predEsg_exp[timeSlot];
675*e5436536SAndroid Build Coastguard Worker     }
676*e5436536SAndroid Build Coastguard Worker   }
677*e5436536SAndroid Build Coastguard Worker   ksg--;
678*e5436536SAndroid Build Coastguard Worker   for (; k < lengthOutputVector; k++) {
679*e5436536SAndroid Build Coastguard Worker     pOutput[k] = predEsg[ksg];
680*e5436536SAndroid Build Coastguard Worker     pOutput_exp[k] = (SCHAR)pPvcDynamicData->predEsg_exp[timeSlot];
681*e5436536SAndroid Build Coastguard Worker   }
682*e5436536SAndroid Build Coastguard Worker 
683*e5436536SAndroid Build Coastguard Worker   return;
684*e5436536SAndroid Build Coastguard Worker }
685