xref: /aosp_15_r20/external/aac/libSACdec/src/sac_calcM1andM2.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 /*********************** MPEG surround decoder library *************************
96*e5436536SAndroid Build Coastguard Worker 
97*e5436536SAndroid Build Coastguard Worker    Author(s):
98*e5436536SAndroid Build Coastguard Worker 
99*e5436536SAndroid Build Coastguard Worker    Description: SAC Dec M1 and M2 calculation
100*e5436536SAndroid Build Coastguard Worker 
101*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
102*e5436536SAndroid Build Coastguard Worker 
103*e5436536SAndroid Build Coastguard Worker #include "sac_calcM1andM2.h"
104*e5436536SAndroid Build Coastguard Worker #include "sac_bitdec.h"
105*e5436536SAndroid Build Coastguard Worker #include "sac_process.h"
106*e5436536SAndroid Build Coastguard Worker #include "sac_rom.h"
107*e5436536SAndroid Build Coastguard Worker #include "sac_smoothing.h"
108*e5436536SAndroid Build Coastguard Worker #include "FDK_trigFcts.h"
109*e5436536SAndroid Build Coastguard Worker 
110*e5436536SAndroid Build Coastguard Worker /* assorted definitions and constants */
111*e5436536SAndroid Build Coastguard Worker 
112*e5436536SAndroid Build Coastguard Worker #define ABS_THR2 1.0e-9
113*e5436536SAndroid Build Coastguard Worker #define SQRT2_FDK \
114*e5436536SAndroid Build Coastguard Worker   ((FIXP_DBL)FL2FXCONST_DBL(0.70710678118f)) /* FDKsqrt(2.0) scaled by 0.5 */
115*e5436536SAndroid Build Coastguard Worker 
116*e5436536SAndroid Build Coastguard Worker static void param2UMX_PS__FDK(spatialDec* self,
117*e5436536SAndroid Build Coastguard Worker                               FIXP_DBL H11[MAX_PARAMETER_BANDS],
118*e5436536SAndroid Build Coastguard Worker                               FIXP_DBL H12[MAX_PARAMETER_BANDS],
119*e5436536SAndroid Build Coastguard Worker                               FIXP_DBL H21[MAX_PARAMETER_BANDS],
120*e5436536SAndroid Build Coastguard Worker                               FIXP_DBL H22[MAX_PARAMETER_BANDS],
121*e5436536SAndroid Build Coastguard Worker                               FIXP_DBL c_l[MAX_PARAMETER_BANDS],
122*e5436536SAndroid Build Coastguard Worker                               FIXP_DBL c_r[MAX_PARAMETER_BANDS], int ottBoxIndx,
123*e5436536SAndroid Build Coastguard Worker                               int parameterSetIndx, int resBands);
124*e5436536SAndroid Build Coastguard Worker 
125*e5436536SAndroid Build Coastguard Worker static void param2UMX_PS_Core__FDK(
126*e5436536SAndroid Build Coastguard Worker     const SCHAR cld[MAX_PARAMETER_BANDS], const SCHAR icc[MAX_PARAMETER_BANDS],
127*e5436536SAndroid Build Coastguard Worker     const int numOttBands, const int resBands,
128*e5436536SAndroid Build Coastguard Worker     FIXP_DBL H11[MAX_PARAMETER_BANDS], FIXP_DBL H12[MAX_PARAMETER_BANDS],
129*e5436536SAndroid Build Coastguard Worker     FIXP_DBL H21[MAX_PARAMETER_BANDS], FIXP_DBL H22[MAX_PARAMETER_BANDS],
130*e5436536SAndroid Build Coastguard Worker     FIXP_DBL c_l[MAX_PARAMETER_BANDS], FIXP_DBL c_r[MAX_PARAMETER_BANDS]);
131*e5436536SAndroid Build Coastguard Worker 
132*e5436536SAndroid Build Coastguard Worker static void param2UMX_PS_IPD_OPD__FDK(
133*e5436536SAndroid Build Coastguard Worker     spatialDec* self, const SPATIAL_BS_FRAME* frame,
134*e5436536SAndroid Build Coastguard Worker     FIXP_DBL H11re[MAX_PARAMETER_BANDS], FIXP_DBL H12re[MAX_PARAMETER_BANDS],
135*e5436536SAndroid Build Coastguard Worker     FIXP_DBL H21re[MAX_PARAMETER_BANDS], FIXP_DBL H22re[MAX_PARAMETER_BANDS],
136*e5436536SAndroid Build Coastguard Worker     FIXP_DBL c_l[MAX_PARAMETER_BANDS], FIXP_DBL c_r[MAX_PARAMETER_BANDS],
137*e5436536SAndroid Build Coastguard Worker     int ottBoxIndx, int parameterSetIndx, int residualBands);
138*e5436536SAndroid Build Coastguard Worker 
139*e5436536SAndroid Build Coastguard Worker static void param2UMX_Prediction__FDK(
140*e5436536SAndroid Build Coastguard Worker     spatialDec* self, FIXP_DBL H11re[MAX_PARAMETER_BANDS],
141*e5436536SAndroid Build Coastguard Worker     FIXP_DBL H11im[MAX_PARAMETER_BANDS], FIXP_DBL H12re[MAX_PARAMETER_BANDS],
142*e5436536SAndroid Build Coastguard Worker     FIXP_DBL H12im[MAX_PARAMETER_BANDS], FIXP_DBL H21re[MAX_PARAMETER_BANDS],
143*e5436536SAndroid Build Coastguard Worker     FIXP_DBL H21im[MAX_PARAMETER_BANDS], FIXP_DBL H22re[MAX_PARAMETER_BANDS],
144*e5436536SAndroid Build Coastguard Worker     FIXP_DBL H22im[MAX_PARAMETER_BANDS], int ottBoxIndx, int parameterSetIndx,
145*e5436536SAndroid Build Coastguard Worker     int resBands);
146*e5436536SAndroid Build Coastguard Worker 
147*e5436536SAndroid Build Coastguard Worker /* static void SpatialDecCalculateM0(spatialDec* self,int ps); */
148*e5436536SAndroid Build Coastguard Worker static SACDEC_ERROR SpatialDecCalculateM1andM2_212(
149*e5436536SAndroid Build Coastguard Worker     spatialDec* self, int ps, const SPATIAL_BS_FRAME* frame);
150*e5436536SAndroid Build Coastguard Worker 
151*e5436536SAndroid Build Coastguard Worker /*******************************************************************************
152*e5436536SAndroid Build Coastguard Worker  Functionname: SpatialDecGetResidualIndex
153*e5436536SAndroid Build Coastguard Worker  *******************************************************************************
154*e5436536SAndroid Build Coastguard Worker 
155*e5436536SAndroid Build Coastguard Worker  Description:
156*e5436536SAndroid Build Coastguard Worker 
157*e5436536SAndroid Build Coastguard Worker  Arguments:
158*e5436536SAndroid Build Coastguard Worker 
159*e5436536SAndroid Build Coastguard Worker  Input:
160*e5436536SAndroid Build Coastguard Worker 
161*e5436536SAndroid Build Coastguard Worker  Output:
162*e5436536SAndroid Build Coastguard Worker 
163*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
SpatialDecGetResidualIndex(spatialDec * self,int row)164*e5436536SAndroid Build Coastguard Worker int SpatialDecGetResidualIndex(spatialDec* self, int row) {
165*e5436536SAndroid Build Coastguard Worker   return row2residual[self->treeConfig][row];
166*e5436536SAndroid Build Coastguard Worker }
167*e5436536SAndroid Build Coastguard Worker 
168*e5436536SAndroid Build Coastguard Worker /*******************************************************************************
169*e5436536SAndroid Build Coastguard Worker  Functionname: UpdateAlpha
170*e5436536SAndroid Build Coastguard Worker  *******************************************************************************
171*e5436536SAndroid Build Coastguard Worker 
172*e5436536SAndroid Build Coastguard Worker  Description:
173*e5436536SAndroid Build Coastguard Worker 
174*e5436536SAndroid Build Coastguard Worker  Arguments:
175*e5436536SAndroid Build Coastguard Worker 
176*e5436536SAndroid Build Coastguard Worker  Input:
177*e5436536SAndroid Build Coastguard Worker 
178*e5436536SAndroid Build Coastguard Worker  Output:
179*e5436536SAndroid Build Coastguard Worker 
180*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
updateAlpha(spatialDec * self)181*e5436536SAndroid Build Coastguard Worker static void updateAlpha(spatialDec* self) {
182*e5436536SAndroid Build Coastguard Worker   int nChIn = self->numInputChannels;
183*e5436536SAndroid Build Coastguard Worker   int ch;
184*e5436536SAndroid Build Coastguard Worker 
185*e5436536SAndroid Build Coastguard Worker   for (ch = 0; ch < nChIn; ch++) {
186*e5436536SAndroid Build Coastguard Worker     FIXP_DBL alpha = /* FL2FXCONST_DBL(1.0f) */ (FIXP_DBL)MAXVAL_DBL;
187*e5436536SAndroid Build Coastguard Worker 
188*e5436536SAndroid Build Coastguard Worker     self->arbdmxAlphaPrev__FDK[ch] = self->arbdmxAlpha__FDK[ch];
189*e5436536SAndroid Build Coastguard Worker 
190*e5436536SAndroid Build Coastguard Worker     self->arbdmxAlpha__FDK[ch] = alpha;
191*e5436536SAndroid Build Coastguard Worker   }
192*e5436536SAndroid Build Coastguard Worker }
193*e5436536SAndroid Build Coastguard Worker 
194*e5436536SAndroid Build Coastguard Worker /*******************************************************************************
195*e5436536SAndroid Build Coastguard Worker  Functionname: SpatialDecCalculateM1andM2
196*e5436536SAndroid Build Coastguard Worker  *******************************************************************************
197*e5436536SAndroid Build Coastguard Worker  Description:
198*e5436536SAndroid Build Coastguard Worker  Arguments:
199*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
SpatialDecCalculateM1andM2(spatialDec * self,int ps,const SPATIAL_BS_FRAME * frame)200*e5436536SAndroid Build Coastguard Worker SACDEC_ERROR SpatialDecCalculateM1andM2(spatialDec* self, int ps,
201*e5436536SAndroid Build Coastguard Worker                                         const SPATIAL_BS_FRAME* frame) {
202*e5436536SAndroid Build Coastguard Worker   SACDEC_ERROR err = MPS_OK;
203*e5436536SAndroid Build Coastguard Worker 
204*e5436536SAndroid Build Coastguard Worker   if ((self->arbitraryDownmix != 0) && (ps == 0)) {
205*e5436536SAndroid Build Coastguard Worker     updateAlpha(self);
206*e5436536SAndroid Build Coastguard Worker   }
207*e5436536SAndroid Build Coastguard Worker 
208*e5436536SAndroid Build Coastguard Worker   self->pActivM2ParamBands = NULL;
209*e5436536SAndroid Build Coastguard Worker 
210*e5436536SAndroid Build Coastguard Worker   switch (self->upmixType) {
211*e5436536SAndroid Build Coastguard Worker     case UPMIXTYPE_BYPASS:
212*e5436536SAndroid Build Coastguard Worker     case UPMIXTYPE_NORMAL:
213*e5436536SAndroid Build Coastguard Worker       switch (self->treeConfig) {
214*e5436536SAndroid Build Coastguard Worker         case TREE_212:
215*e5436536SAndroid Build Coastguard Worker           err = SpatialDecCalculateM1andM2_212(self, ps, frame);
216*e5436536SAndroid Build Coastguard Worker           break;
217*e5436536SAndroid Build Coastguard Worker         default:
218*e5436536SAndroid Build Coastguard Worker           err = MPS_WRONG_TREECONFIG;
219*e5436536SAndroid Build Coastguard Worker       };
220*e5436536SAndroid Build Coastguard Worker       break;
221*e5436536SAndroid Build Coastguard Worker 
222*e5436536SAndroid Build Coastguard Worker     default:
223*e5436536SAndroid Build Coastguard Worker       err = MPS_WRONG_TREECONFIG;
224*e5436536SAndroid Build Coastguard Worker   }
225*e5436536SAndroid Build Coastguard Worker 
226*e5436536SAndroid Build Coastguard Worker   if (err != MPS_OK) {
227*e5436536SAndroid Build Coastguard Worker     goto bail;
228*e5436536SAndroid Build Coastguard Worker   }
229*e5436536SAndroid Build Coastguard Worker 
230*e5436536SAndroid Build Coastguard Worker bail:
231*e5436536SAndroid Build Coastguard Worker   return err;
232*e5436536SAndroid Build Coastguard Worker }
233*e5436536SAndroid Build Coastguard Worker 
234*e5436536SAndroid Build Coastguard Worker /*******************************************************************************
235*e5436536SAndroid Build Coastguard Worker  Functionname: SpatialDecCalculateM1andM2_212
236*e5436536SAndroid Build Coastguard Worker  *******************************************************************************
237*e5436536SAndroid Build Coastguard Worker 
238*e5436536SAndroid Build Coastguard Worker  Description:
239*e5436536SAndroid Build Coastguard Worker 
240*e5436536SAndroid Build Coastguard Worker  Arguments:
241*e5436536SAndroid Build Coastguard Worker 
242*e5436536SAndroid Build Coastguard Worker  Return:
243*e5436536SAndroid Build Coastguard Worker 
244*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
SpatialDecCalculateM1andM2_212(spatialDec * self,int ps,const SPATIAL_BS_FRAME * frame)245*e5436536SAndroid Build Coastguard Worker static SACDEC_ERROR SpatialDecCalculateM1andM2_212(
246*e5436536SAndroid Build Coastguard Worker     spatialDec* self, int ps, const SPATIAL_BS_FRAME* frame) {
247*e5436536SAndroid Build Coastguard Worker   SACDEC_ERROR err = MPS_OK;
248*e5436536SAndroid Build Coastguard Worker   int pb;
249*e5436536SAndroid Build Coastguard Worker 
250*e5436536SAndroid Build Coastguard Worker   FIXP_DBL H11re[MAX_PARAMETER_BANDS] = {FL2FXCONST_DBL(0.0f)};
251*e5436536SAndroid Build Coastguard Worker   FIXP_DBL H12re[MAX_PARAMETER_BANDS] = {FL2FXCONST_DBL(0.0f)};
252*e5436536SAndroid Build Coastguard Worker   FIXP_DBL H21re[MAX_PARAMETER_BANDS] = {FL2FXCONST_DBL(0.0f)};
253*e5436536SAndroid Build Coastguard Worker   FIXP_DBL H22re[MAX_PARAMETER_BANDS] = {FL2FXCONST_DBL(0.0f)};
254*e5436536SAndroid Build Coastguard Worker   FIXP_DBL H11im[MAX_PARAMETER_BANDS] = {FL2FXCONST_DBL(0.0f)};
255*e5436536SAndroid Build Coastguard Worker   FIXP_DBL H21im[MAX_PARAMETER_BANDS] = {FL2FXCONST_DBL(0.0f)};
256*e5436536SAndroid Build Coastguard Worker 
257*e5436536SAndroid Build Coastguard Worker   INT phaseCoding = self->phaseCoding;
258*e5436536SAndroid Build Coastguard Worker 
259*e5436536SAndroid Build Coastguard Worker   switch (phaseCoding) {
260*e5436536SAndroid Build Coastguard Worker     case 1:
261*e5436536SAndroid Build Coastguard Worker       /* phase coding: yes; residuals: no */
262*e5436536SAndroid Build Coastguard Worker       param2UMX_PS_IPD_OPD__FDK(self, frame, H11re, H12re, H21re, H22re, NULL,
263*e5436536SAndroid Build Coastguard Worker                                 NULL, 0, ps, self->residualBands[0]);
264*e5436536SAndroid Build Coastguard Worker       break;
265*e5436536SAndroid Build Coastguard Worker     case 3:
266*e5436536SAndroid Build Coastguard Worker       /* phase coding: yes; residuals: yes */
267*e5436536SAndroid Build Coastguard Worker       param2UMX_Prediction__FDK(self, H11re, H11im, H12re, NULL, H21re, H21im,
268*e5436536SAndroid Build Coastguard Worker                                 H22re, NULL, 0, ps, self->residualBands[0]);
269*e5436536SAndroid Build Coastguard Worker       break;
270*e5436536SAndroid Build Coastguard Worker     default:
271*e5436536SAndroid Build Coastguard Worker       if (self->residualCoding) {
272*e5436536SAndroid Build Coastguard Worker         /* phase coding: no; residuals: yes */
273*e5436536SAndroid Build Coastguard Worker         param2UMX_Prediction__FDK(self, H11re, NULL, H12re, NULL, H21re, NULL,
274*e5436536SAndroid Build Coastguard Worker                                   H22re, NULL, 0, ps, self->residualBands[0]);
275*e5436536SAndroid Build Coastguard Worker       } else {
276*e5436536SAndroid Build Coastguard Worker         /* phase coding: no; residuals: no */
277*e5436536SAndroid Build Coastguard Worker         param2UMX_PS__FDK(self, H11re, H12re, H21re, H22re, NULL, NULL, 0, ps,
278*e5436536SAndroid Build Coastguard Worker                           0);
279*e5436536SAndroid Build Coastguard Worker       }
280*e5436536SAndroid Build Coastguard Worker       break;
281*e5436536SAndroid Build Coastguard Worker   }
282*e5436536SAndroid Build Coastguard Worker 
283*e5436536SAndroid Build Coastguard Worker   for (pb = 0; pb < self->numParameterBands; pb++) {
284*e5436536SAndroid Build Coastguard Worker     self->M2Real__FDK[0][0][pb] = (H11re[pb]);
285*e5436536SAndroid Build Coastguard Worker     self->M2Real__FDK[0][1][pb] = (H12re[pb]);
286*e5436536SAndroid Build Coastguard Worker 
287*e5436536SAndroid Build Coastguard Worker     self->M2Real__FDK[1][0][pb] = (H21re[pb]);
288*e5436536SAndroid Build Coastguard Worker     self->M2Real__FDK[1][1][pb] = (H22re[pb]);
289*e5436536SAndroid Build Coastguard Worker   }
290*e5436536SAndroid Build Coastguard Worker   if (phaseCoding == 3) {
291*e5436536SAndroid Build Coastguard Worker     for (pb = 0; pb < self->numParameterBands; pb++) {
292*e5436536SAndroid Build Coastguard Worker       self->M2Imag__FDK[0][0][pb] = (H11im[pb]);
293*e5436536SAndroid Build Coastguard Worker       self->M2Imag__FDK[1][0][pb] = (H21im[pb]);
294*e5436536SAndroid Build Coastguard Worker       self->M2Imag__FDK[0][1][pb] = (FIXP_DBL)0;  // H12im[pb];
295*e5436536SAndroid Build Coastguard Worker       self->M2Imag__FDK[1][1][pb] = (FIXP_DBL)0;  // H22im[pb];
296*e5436536SAndroid Build Coastguard Worker     }
297*e5436536SAndroid Build Coastguard Worker   }
298*e5436536SAndroid Build Coastguard Worker 
299*e5436536SAndroid Build Coastguard Worker   if (self->phaseCoding == 1) {
300*e5436536SAndroid Build Coastguard Worker     SpatialDecSmoothOPD(
301*e5436536SAndroid Build Coastguard Worker         self, frame,
302*e5436536SAndroid Build Coastguard Worker         ps); /* INPUT: PhaseLeft, PhaseRight, (opdLeftState, opdRightState) */
303*e5436536SAndroid Build Coastguard Worker   }
304*e5436536SAndroid Build Coastguard Worker 
305*e5436536SAndroid Build Coastguard Worker   return err;
306*e5436536SAndroid Build Coastguard Worker }
307*e5436536SAndroid Build Coastguard Worker 
308*e5436536SAndroid Build Coastguard Worker /*******************************************************************************
309*e5436536SAndroid Build Coastguard Worker  Functionname: param2UMX_PS_Core
310*e5436536SAndroid Build Coastguard Worker  *******************************************************************************
311*e5436536SAndroid Build Coastguard Worker 
312*e5436536SAndroid Build Coastguard Worker  Description:
313*e5436536SAndroid Build Coastguard Worker 
314*e5436536SAndroid Build Coastguard Worker  Arguments:
315*e5436536SAndroid Build Coastguard Worker 
316*e5436536SAndroid Build Coastguard Worker  Return:
317*e5436536SAndroid Build Coastguard Worker 
318*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
param2UMX_PS_Core__FDK(const SCHAR cld[MAX_PARAMETER_BANDS],const SCHAR icc[MAX_PARAMETER_BANDS],const int numOttBands,const int resBands,FIXP_DBL H11[MAX_PARAMETER_BANDS],FIXP_DBL H12[MAX_PARAMETER_BANDS],FIXP_DBL H21[MAX_PARAMETER_BANDS],FIXP_DBL H22[MAX_PARAMETER_BANDS],FIXP_DBL c_l[MAX_PARAMETER_BANDS],FIXP_DBL c_r[MAX_PARAMETER_BANDS])319*e5436536SAndroid Build Coastguard Worker static void param2UMX_PS_Core__FDK(
320*e5436536SAndroid Build Coastguard Worker     const SCHAR cld[MAX_PARAMETER_BANDS], const SCHAR icc[MAX_PARAMETER_BANDS],
321*e5436536SAndroid Build Coastguard Worker     const int numOttBands, const int resBands,
322*e5436536SAndroid Build Coastguard Worker     FIXP_DBL H11[MAX_PARAMETER_BANDS], FIXP_DBL H12[MAX_PARAMETER_BANDS],
323*e5436536SAndroid Build Coastguard Worker     FIXP_DBL H21[MAX_PARAMETER_BANDS], FIXP_DBL H22[MAX_PARAMETER_BANDS],
324*e5436536SAndroid Build Coastguard Worker     FIXP_DBL c_l[MAX_PARAMETER_BANDS], FIXP_DBL c_r[MAX_PARAMETER_BANDS]) {
325*e5436536SAndroid Build Coastguard Worker   int band;
326*e5436536SAndroid Build Coastguard Worker 
327*e5436536SAndroid Build Coastguard Worker   if ((c_l != NULL) && (c_r != NULL)) {
328*e5436536SAndroid Build Coastguard Worker     for (band = 0; band < numOttBands; band++) {
329*e5436536SAndroid Build Coastguard Worker       SpatialDequantGetCLDValues(cld[band], &c_l[band], &c_r[band]);
330*e5436536SAndroid Build Coastguard Worker     }
331*e5436536SAndroid Build Coastguard Worker   }
332*e5436536SAndroid Build Coastguard Worker 
333*e5436536SAndroid Build Coastguard Worker   band = 0;
334*e5436536SAndroid Build Coastguard Worker   FDK_ASSERT(resBands == 0);
335*e5436536SAndroid Build Coastguard Worker   for (; band < numOttBands; band++) {
336*e5436536SAndroid Build Coastguard Worker     /* compute mixing variables: */
337*e5436536SAndroid Build Coastguard Worker     const int idx1 = cld[band];
338*e5436536SAndroid Build Coastguard Worker     const int idx2 = icc[band];
339*e5436536SAndroid Build Coastguard Worker     H11[band] = FX_CFG2FX_DBL(H11_nc[idx1][idx2]);
340*e5436536SAndroid Build Coastguard Worker     H21[band] = FX_CFG2FX_DBL(H11_nc[30 - idx1][idx2]);
341*e5436536SAndroid Build Coastguard Worker     H12[band] = FX_CFG2FX_DBL(H12_nc[idx1][idx2]);
342*e5436536SAndroid Build Coastguard Worker     H22[band] = FX_CFG2FX_DBL(-H12_nc[30 - idx1][idx2]);
343*e5436536SAndroid Build Coastguard Worker   }
344*e5436536SAndroid Build Coastguard Worker }
345*e5436536SAndroid Build Coastguard Worker 
346*e5436536SAndroid Build Coastguard Worker /*******************************************************************************
347*e5436536SAndroid Build Coastguard Worker  Functionname: param2UMX_PS
348*e5436536SAndroid Build Coastguard Worker  *******************************************************************************
349*e5436536SAndroid Build Coastguard Worker 
350*e5436536SAndroid Build Coastguard Worker  Description:
351*e5436536SAndroid Build Coastguard Worker 
352*e5436536SAndroid Build Coastguard Worker  Arguments:
353*e5436536SAndroid Build Coastguard Worker 
354*e5436536SAndroid Build Coastguard Worker  Return:
355*e5436536SAndroid Build Coastguard Worker 
356*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
param2UMX_PS__FDK(spatialDec * self,FIXP_DBL H11[MAX_PARAMETER_BANDS],FIXP_DBL H12[MAX_PARAMETER_BANDS],FIXP_DBL H21[MAX_PARAMETER_BANDS],FIXP_DBL H22[MAX_PARAMETER_BANDS],FIXP_DBL c_l[MAX_PARAMETER_BANDS],FIXP_DBL c_r[MAX_PARAMETER_BANDS],int ottBoxIndx,int parameterSetIndx,int residualBands)357*e5436536SAndroid Build Coastguard Worker static void param2UMX_PS__FDK(spatialDec* self,
358*e5436536SAndroid Build Coastguard Worker                               FIXP_DBL H11[MAX_PARAMETER_BANDS],
359*e5436536SAndroid Build Coastguard Worker                               FIXP_DBL H12[MAX_PARAMETER_BANDS],
360*e5436536SAndroid Build Coastguard Worker                               FIXP_DBL H21[MAX_PARAMETER_BANDS],
361*e5436536SAndroid Build Coastguard Worker                               FIXP_DBL H22[MAX_PARAMETER_BANDS],
362*e5436536SAndroid Build Coastguard Worker                               FIXP_DBL c_l[MAX_PARAMETER_BANDS],
363*e5436536SAndroid Build Coastguard Worker                               FIXP_DBL c_r[MAX_PARAMETER_BANDS], int ottBoxIndx,
364*e5436536SAndroid Build Coastguard Worker                               int parameterSetIndx, int residualBands) {
365*e5436536SAndroid Build Coastguard Worker   int band;
366*e5436536SAndroid Build Coastguard Worker   param2UMX_PS_Core__FDK(self->ottCLD__FDK[ottBoxIndx][parameterSetIndx],
367*e5436536SAndroid Build Coastguard Worker                          self->ottICC__FDK[ottBoxIndx][parameterSetIndx],
368*e5436536SAndroid Build Coastguard Worker                          self->numOttBands[ottBoxIndx], residualBands, H11, H12,
369*e5436536SAndroid Build Coastguard Worker                          H21, H22, c_l, c_r);
370*e5436536SAndroid Build Coastguard Worker 
371*e5436536SAndroid Build Coastguard Worker   for (band = self->numOttBands[ottBoxIndx]; band < self->numParameterBands;
372*e5436536SAndroid Build Coastguard Worker        band++) {
373*e5436536SAndroid Build Coastguard Worker     H11[band] = H21[band] = H12[band] = H22[band] = FL2FXCONST_DBL(0.f);
374*e5436536SAndroid Build Coastguard Worker   }
375*e5436536SAndroid Build Coastguard Worker }
376*e5436536SAndroid Build Coastguard Worker 
377*e5436536SAndroid Build Coastguard Worker #define N_CLD (31)
378*e5436536SAndroid Build Coastguard Worker #define N_IPD (16)
379*e5436536SAndroid Build Coastguard Worker 
380*e5436536SAndroid Build Coastguard Worker static const FIXP_DBL sinIpd_tab[N_IPD] = {
381*e5436536SAndroid Build Coastguard Worker     FIXP_DBL(0x00000000), FIXP_DBL(0x30fbc54e), FIXP_DBL(0x5a827999),
382*e5436536SAndroid Build Coastguard Worker     FIXP_DBL(0x7641af3d), FIXP_DBL(0x7fffffff), FIXP_DBL(0x7641af3d),
383*e5436536SAndroid Build Coastguard Worker     FIXP_DBL(0x5a82799a), FIXP_DBL(0x30fbc54d), FIXP_DBL(0xffffffff),
384*e5436536SAndroid Build Coastguard Worker     FIXP_DBL(0xcf043ab3), FIXP_DBL(0xa57d8666), FIXP_DBL(0x89be50c3),
385*e5436536SAndroid Build Coastguard Worker     FIXP_DBL(0x80000000), FIXP_DBL(0x89be50c3), FIXP_DBL(0xa57d8666),
386*e5436536SAndroid Build Coastguard Worker     FIXP_DBL(0xcf043ab2),
387*e5436536SAndroid Build Coastguard Worker };
388*e5436536SAndroid Build Coastguard Worker 
389*e5436536SAndroid Build Coastguard Worker /* cosIpd[i] = sinIpd[(i+4)&15] */
390*e5436536SAndroid Build Coastguard Worker #define SIN_IPD(a) (sinIpd_tab[(a)])
391*e5436536SAndroid Build Coastguard Worker #define COS_IPD(a) (sinIpd_tab[((a) + 4) & 15])  //(cosIpd_tab[(a)])
392*e5436536SAndroid Build Coastguard Worker 
393*e5436536SAndroid Build Coastguard Worker static const FIXP_SGL sqrt_one_minus_ICC2[8] = {
394*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_SGL(0.0f),
395*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_SGL(0.349329357483736f),
396*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_SGL(0.540755219669676f),
397*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_SGL(0.799309172723546f),
398*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_SGL(0.929968187843004f),
399*e5436536SAndroid Build Coastguard Worker     FX_DBL2FXCONST_SGL(MAXVAL_DBL),
400*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_SGL(0.80813303360276f),
401*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_SGL(0.141067359796659f),
402*e5436536SAndroid Build Coastguard Worker };
403*e5436536SAndroid Build Coastguard Worker 
404*e5436536SAndroid Build Coastguard Worker /* exponent of sqrt(CLD) */
405*e5436536SAndroid Build Coastguard Worker static const SCHAR sqrt_CLD_e[N_CLD] = {
406*e5436536SAndroid Build Coastguard Worker     -24, -7, -6, -5, -4, -4, -3, -3, -2, -2, -1, -1, 0, 0, 0, 1,
407*e5436536SAndroid Build Coastguard Worker     1,   1,  1,  2,  2,  3,  3,  4,  4,  5,  5,  6,  7, 8, 25};
408*e5436536SAndroid Build Coastguard Worker 
409*e5436536SAndroid Build Coastguard Worker static const FIXP_DBL sqrt_CLD_m[N_CLD] = {
410*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.530542153566195f),
411*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.719796896243647f),
412*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.64f),
413*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.569049411212455f),
414*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.505964425626941f),
415*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.899746120304559f),
416*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.635462587779425f),
417*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.897614763441571f),
418*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.633957276984445f),
419*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.895488455427336f),
420*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.632455532033676f),
421*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.796214341106995f),
422*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.501187233627272f),
423*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.630957344480193f),
424*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.794328234724281f),
425*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.5f),
426*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.629462705897084f),
427*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.792446596230557f),
428*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.99763115748444f),
429*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.627971607877395f),
430*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.790569415042095f),
431*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.558354490188704f),
432*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.788696680600242f),
433*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.557031836333591f),
434*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.786828382371355f),
435*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.555712315637163f),
436*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.988211768802619f),
437*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.87865832060992f),
438*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.78125f),
439*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.694640394546454f),
440*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.942432183077448f),
441*e5436536SAndroid Build Coastguard Worker };
442*e5436536SAndroid Build Coastguard Worker 
443*e5436536SAndroid Build Coastguard Worker static const FIXP_DBL CLD_m[N_CLD] = {
444*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.281474976710656f),
445*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.518107571841987f),
446*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.4096f),
447*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.323817232401242f),
448*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.256f),
449*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.809543081003105f),
450*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.403812700467324f),
451*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.805712263548267f),
452*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.401901829041533f),
453*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.801899573803636f),
454*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.4f),
455*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.633957276984445f),
456*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.251188643150958f),
457*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.398107170553497f),
458*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.630957344480193f),
459*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.25f),
460*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.396223298115278f),
461*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.627971607877395f),
462*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.995267926383743f),
463*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.394348340300121f),
464*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.625f),
465*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.311759736713887f),
466*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.62204245398984f),
467*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.310284466689172f),
468*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.619098903305123f),
469*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.308816177750818f),
470*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.9765625f),
471*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.772040444377046f),
472*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.6103515625f),
473*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.482525277735654f),
474*e5436536SAndroid Build Coastguard Worker     FL2FXCONST_DBL(0.888178419700125),
475*e5436536SAndroid Build Coastguard Worker };
476*e5436536SAndroid Build Coastguard Worker 
calculateOpd(spatialDec * self,INT ottBoxIndx,INT parameterSetIndx,FIXP_DBL opd[MAX_PARAMETER_BANDS])477*e5436536SAndroid Build Coastguard Worker static void calculateOpd(spatialDec* self, INT ottBoxIndx, INT parameterSetIndx,
478*e5436536SAndroid Build Coastguard Worker                          FIXP_DBL opd[MAX_PARAMETER_BANDS]) {
479*e5436536SAndroid Build Coastguard Worker   INT band;
480*e5436536SAndroid Build Coastguard Worker 
481*e5436536SAndroid Build Coastguard Worker   for (band = 0; band < self->numOttBandsIPD; band++) {
482*e5436536SAndroid Build Coastguard Worker     INT idxCld = self->ottCLD__FDK[ottBoxIndx][parameterSetIndx][band];
483*e5436536SAndroid Build Coastguard Worker     INT idxIpd = self->ottIPD__FDK[ottBoxIndx][parameterSetIndx][band];
484*e5436536SAndroid Build Coastguard Worker     INT idxIcc = self->ottICC__FDK[ottBoxIndx][parameterSetIndx][band];
485*e5436536SAndroid Build Coastguard Worker     FIXP_DBL cld, ipd;
486*e5436536SAndroid Build Coastguard Worker 
487*e5436536SAndroid Build Coastguard Worker     ipd = FX_CFG2FX_DBL(dequantIPD__FDK[idxIpd]);
488*e5436536SAndroid Build Coastguard Worker 
489*e5436536SAndroid Build Coastguard Worker     SpatialDequantGetCLD2Values(idxCld, &cld);
490*e5436536SAndroid Build Coastguard Worker 
491*e5436536SAndroid Build Coastguard Worker     /* ipd(idxIpd==8) == PI */
492*e5436536SAndroid Build Coastguard Worker     if (((cld == FL2FXCONST_DBL(0.0f)) && (idxIpd == 8)) || (idxIpd == 0)) {
493*e5436536SAndroid Build Coastguard Worker       opd[2 * band] = FL2FXCONST_DBL(0.0f);
494*e5436536SAndroid Build Coastguard Worker     } else {
495*e5436536SAndroid Build Coastguard Worker       FDK_ASSERT(idxIpd > 0);
496*e5436536SAndroid Build Coastguard Worker       opd[2 * band] =
497*e5436536SAndroid Build Coastguard Worker           dequantIPD_CLD_ICC_splitAngle__FDK[idxIpd - 1][idxCld][idxIcc];
498*e5436536SAndroid Build Coastguard Worker     }
499*e5436536SAndroid Build Coastguard Worker     opd[2 * band + 1] = opd[2 * band] - ipd;
500*e5436536SAndroid Build Coastguard Worker   }
501*e5436536SAndroid Build Coastguard Worker }
502*e5436536SAndroid Build Coastguard Worker 
503*e5436536SAndroid Build Coastguard Worker /* wrap phase in rad to the range of 0 <= x < 2*pi */
wrapPhase(FIXP_DBL phase)504*e5436536SAndroid Build Coastguard Worker static FIXP_DBL wrapPhase(FIXP_DBL phase) {
505*e5436536SAndroid Build Coastguard Worker   while (phase < (FIXP_DBL)0) phase += PIx2__IPD;
506*e5436536SAndroid Build Coastguard Worker   while (phase >= PIx2__IPD) phase -= PIx2__IPD;
507*e5436536SAndroid Build Coastguard Worker   FDK_ASSERT((phase >= (FIXP_DBL)0) && (phase < PIx2__IPD));
508*e5436536SAndroid Build Coastguard Worker 
509*e5436536SAndroid Build Coastguard Worker   return phase;
510*e5436536SAndroid Build Coastguard Worker }
511*e5436536SAndroid Build Coastguard Worker 
512*e5436536SAndroid Build Coastguard Worker /*******************************************************************************
513*e5436536SAndroid Build Coastguard Worker  Functionname: param2UMX_PS_IPD
514*e5436536SAndroid Build Coastguard Worker  *******************************************************************************
515*e5436536SAndroid Build Coastguard Worker 
516*e5436536SAndroid Build Coastguard Worker  Description:
517*e5436536SAndroid Build Coastguard Worker 
518*e5436536SAndroid Build Coastguard Worker  Arguments:
519*e5436536SAndroid Build Coastguard Worker 
520*e5436536SAndroid Build Coastguard Worker  Return:
521*e5436536SAndroid Build Coastguard Worker 
522*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
param2UMX_PS_IPD_OPD__FDK(spatialDec * self,const SPATIAL_BS_FRAME * frame,FIXP_DBL H11[MAX_PARAMETER_BANDS],FIXP_DBL H12[MAX_PARAMETER_BANDS],FIXP_DBL H21[MAX_PARAMETER_BANDS],FIXP_DBL H22[MAX_PARAMETER_BANDS],FIXP_DBL c_l[MAX_PARAMETER_BANDS],FIXP_DBL c_r[MAX_PARAMETER_BANDS],int ottBoxIndx,int parameterSetIndx,int residualBands)523*e5436536SAndroid Build Coastguard Worker static void param2UMX_PS_IPD_OPD__FDK(
524*e5436536SAndroid Build Coastguard Worker     spatialDec* self, const SPATIAL_BS_FRAME* frame,
525*e5436536SAndroid Build Coastguard Worker     FIXP_DBL H11[MAX_PARAMETER_BANDS], FIXP_DBL H12[MAX_PARAMETER_BANDS],
526*e5436536SAndroid Build Coastguard Worker     FIXP_DBL H21[MAX_PARAMETER_BANDS], FIXP_DBL H22[MAX_PARAMETER_BANDS],
527*e5436536SAndroid Build Coastguard Worker     FIXP_DBL c_l[MAX_PARAMETER_BANDS], FIXP_DBL c_r[MAX_PARAMETER_BANDS],
528*e5436536SAndroid Build Coastguard Worker     int ottBoxIndx, int parameterSetIndx, int residualBands) {
529*e5436536SAndroid Build Coastguard Worker   INT band;
530*e5436536SAndroid Build Coastguard Worker   FIXP_DBL opd[2 * MAX_PARAMETER_BANDS];
531*e5436536SAndroid Build Coastguard Worker   INT numOttBands = self->numOttBands[ottBoxIndx];
532*e5436536SAndroid Build Coastguard Worker   INT numIpdBands;
533*e5436536SAndroid Build Coastguard Worker 
534*e5436536SAndroid Build Coastguard Worker   numIpdBands = frame->phaseMode ? self->numOttBandsIPD : 0;
535*e5436536SAndroid Build Coastguard Worker 
536*e5436536SAndroid Build Coastguard Worker   FDK_ASSERT(self->residualCoding == 0);
537*e5436536SAndroid Build Coastguard Worker 
538*e5436536SAndroid Build Coastguard Worker   param2UMX_PS_Core__FDK(self->ottCLD__FDK[ottBoxIndx][parameterSetIndx],
539*e5436536SAndroid Build Coastguard Worker                          self->ottICC__FDK[ottBoxIndx][parameterSetIndx],
540*e5436536SAndroid Build Coastguard Worker                          self->numOttBands[ottBoxIndx], residualBands, H11, H12,
541*e5436536SAndroid Build Coastguard Worker                          H21, H22, c_l, c_r);
542*e5436536SAndroid Build Coastguard Worker 
543*e5436536SAndroid Build Coastguard Worker   for (band = self->numOttBands[ottBoxIndx]; band < self->numParameterBands;
544*e5436536SAndroid Build Coastguard Worker        band++) {
545*e5436536SAndroid Build Coastguard Worker     H11[band] = H21[band] = H12[band] = H22[band] = FL2FXCONST_DBL(0.f);
546*e5436536SAndroid Build Coastguard Worker   }
547*e5436536SAndroid Build Coastguard Worker 
548*e5436536SAndroid Build Coastguard Worker   if (frame->phaseMode) {
549*e5436536SAndroid Build Coastguard Worker     calculateOpd(self, ottBoxIndx, parameterSetIndx, opd);
550*e5436536SAndroid Build Coastguard Worker 
551*e5436536SAndroid Build Coastguard Worker     for (band = 0; band < numIpdBands; band++) {
552*e5436536SAndroid Build Coastguard Worker       self->PhaseLeft__FDK[band] = wrapPhase(opd[2 * band]);
553*e5436536SAndroid Build Coastguard Worker       self->PhaseRight__FDK[band] = wrapPhase(opd[2 * band + 1]);
554*e5436536SAndroid Build Coastguard Worker     }
555*e5436536SAndroid Build Coastguard Worker   }
556*e5436536SAndroid Build Coastguard Worker 
557*e5436536SAndroid Build Coastguard Worker   for (band = numIpdBands; band < numOttBands; band++) {
558*e5436536SAndroid Build Coastguard Worker     self->PhaseLeft__FDK[band] = FL2FXCONST_DBL(0.0f);
559*e5436536SAndroid Build Coastguard Worker     self->PhaseRight__FDK[band] = FL2FXCONST_DBL(0.0f);
560*e5436536SAndroid Build Coastguard Worker   }
561*e5436536SAndroid Build Coastguard Worker }
562*e5436536SAndroid Build Coastguard Worker 
param2UMX_Prediction_Core__FDK(FIXP_DBL * H11re,FIXP_DBL * H11im,FIXP_DBL * H12re,FIXP_DBL * H12im,FIXP_DBL * H21re,FIXP_DBL * H21im,FIXP_DBL * H22re,FIXP_DBL * H22im,int cldIdx,int iccIdx,int ipdIdx,int band,int numOttBandsIPD,int resBands)563*e5436536SAndroid Build Coastguard Worker FDK_INLINE void param2UMX_Prediction_Core__FDK(
564*e5436536SAndroid Build Coastguard Worker     FIXP_DBL* H11re, FIXP_DBL* H11im, FIXP_DBL* H12re, FIXP_DBL* H12im,
565*e5436536SAndroid Build Coastguard Worker     FIXP_DBL* H21re, FIXP_DBL* H21im, FIXP_DBL* H22re, FIXP_DBL* H22im,
566*e5436536SAndroid Build Coastguard Worker     int cldIdx, int iccIdx, int ipdIdx, int band, int numOttBandsIPD,
567*e5436536SAndroid Build Coastguard Worker     int resBands) {
568*e5436536SAndroid Build Coastguard Worker #define MAX_WEIGHT (1.2f)
569*e5436536SAndroid Build Coastguard Worker   FDK_ASSERT((H12im == NULL) && (H22im == NULL)); /* always == 0 */
570*e5436536SAndroid Build Coastguard Worker 
571*e5436536SAndroid Build Coastguard Worker   if ((band < numOttBandsIPD) && (cldIdx == 15) && (iccIdx == 0) &&
572*e5436536SAndroid Build Coastguard Worker       (ipdIdx == 8)) {
573*e5436536SAndroid Build Coastguard Worker     const FIXP_DBL gain =
574*e5436536SAndroid Build Coastguard Worker         FL2FXCONST_DBL(0.5f / MAX_WEIGHT) >> SCALE_PARAM_M2_212_PRED;
575*e5436536SAndroid Build Coastguard Worker 
576*e5436536SAndroid Build Coastguard Worker     *H11re = gain;
577*e5436536SAndroid Build Coastguard Worker     if (band < resBands) {
578*e5436536SAndroid Build Coastguard Worker       *H21re = gain;
579*e5436536SAndroid Build Coastguard Worker       *H12re = gain;
580*e5436536SAndroid Build Coastguard Worker       *H22re = -gain;
581*e5436536SAndroid Build Coastguard Worker     } else {
582*e5436536SAndroid Build Coastguard Worker       *H21re = -gain;
583*e5436536SAndroid Build Coastguard Worker       *H12re = (FIXP_DBL)0;
584*e5436536SAndroid Build Coastguard Worker       *H22re = (FIXP_DBL)0;
585*e5436536SAndroid Build Coastguard Worker     }
586*e5436536SAndroid Build Coastguard Worker     if ((H11im != NULL) &&
587*e5436536SAndroid Build Coastguard Worker         (H21im != NULL) /*&& (H12im!=NULL) && (H22im!=NULL)*/) {
588*e5436536SAndroid Build Coastguard Worker       *H11im = (FIXP_DBL)0;
589*e5436536SAndroid Build Coastguard Worker       *H21im = (FIXP_DBL)0;
590*e5436536SAndroid Build Coastguard Worker       /* *H12im = (FIXP_DBL)0; */
591*e5436536SAndroid Build Coastguard Worker       /* *H22im = (FIXP_DBL)0; */
592*e5436536SAndroid Build Coastguard Worker     }
593*e5436536SAndroid Build Coastguard Worker   } else {
594*e5436536SAndroid Build Coastguard Worker     const FIXP_DBL one_m = (FIXP_DBL)MAXVAL_DBL;
595*e5436536SAndroid Build Coastguard Worker     const int one_e = 0;
596*e5436536SAndroid Build Coastguard Worker     /* iidLin = sqrt(cld); */
597*e5436536SAndroid Build Coastguard Worker     FIXP_DBL iidLin_m = sqrt_CLD_m[cldIdx];
598*e5436536SAndroid Build Coastguard Worker     int iidLin_e = sqrt_CLD_e[cldIdx];
599*e5436536SAndroid Build Coastguard Worker     /* iidLin2 = cld; */
600*e5436536SAndroid Build Coastguard Worker     FIXP_DBL iidLin2_m = CLD_m[cldIdx];
601*e5436536SAndroid Build Coastguard Worker     int iidLin2_e = sqrt_CLD_e[cldIdx] << 1;
602*e5436536SAndroid Build Coastguard Worker     /* iidLin21 = iidLin2 + 1.0f; */
603*e5436536SAndroid Build Coastguard Worker     int iidLin21_e;
604*e5436536SAndroid Build Coastguard Worker     FIXP_DBL iidLin21_m =
605*e5436536SAndroid Build Coastguard Worker         fAddNorm(iidLin2_m, iidLin2_e, one_m, one_e, &iidLin21_e);
606*e5436536SAndroid Build Coastguard Worker     /* iidIcc2 = iidLin * icc * 2.0f; */
607*e5436536SAndroid Build Coastguard Worker     FIXP_CFG icc = dequantICC__FDK[iccIdx];
608*e5436536SAndroid Build Coastguard Worker     int iidIcc2_e = iidLin_e + 1;
609*e5436536SAndroid Build Coastguard Worker     FIXP_DBL iidIcc2_m = fMult(iidLin_m, icc);
610*e5436536SAndroid Build Coastguard Worker     FIXP_DBL temp_m, sqrt_temp_m, inv_temp_m, weight_m;
611*e5436536SAndroid Build Coastguard Worker     int temp_e, sqrt_temp_e, inv_temp_e, weight_e, scale;
612*e5436536SAndroid Build Coastguard Worker     FIXP_DBL cosIpd, sinIpd;
613*e5436536SAndroid Build Coastguard Worker 
614*e5436536SAndroid Build Coastguard Worker     cosIpd = COS_IPD((band < numOttBandsIPD) ? ipdIdx : 0);
615*e5436536SAndroid Build Coastguard Worker     sinIpd = SIN_IPD((band < numOttBandsIPD) ? ipdIdx : 0);
616*e5436536SAndroid Build Coastguard Worker 
617*e5436536SAndroid Build Coastguard Worker     /* temp    = iidLin21 + iidIcc2 * cosIpd; */
618*e5436536SAndroid Build Coastguard Worker     temp_m = fAddNorm(iidLin21_m, iidLin21_e, fMult(iidIcc2_m, cosIpd),
619*e5436536SAndroid Build Coastguard Worker                       iidIcc2_e, &temp_e);
620*e5436536SAndroid Build Coastguard Worker 
621*e5436536SAndroid Build Coastguard Worker     /* calculate 1/temp needed later */
622*e5436536SAndroid Build Coastguard Worker     inv_temp_e = temp_e;
623*e5436536SAndroid Build Coastguard Worker     inv_temp_m = invFixp(temp_m, &inv_temp_e);
624*e5436536SAndroid Build Coastguard Worker 
625*e5436536SAndroid Build Coastguard Worker     /* 1/weight = sqrt(temp) * 1/sqrt(iidLin21) */
626*e5436536SAndroid Build Coastguard Worker     if (temp_e & 1) {
627*e5436536SAndroid Build Coastguard Worker       sqrt_temp_m = temp_m >> 1;
628*e5436536SAndroid Build Coastguard Worker       sqrt_temp_e = (temp_e + 1) >> 1;
629*e5436536SAndroid Build Coastguard Worker     } else {
630*e5436536SAndroid Build Coastguard Worker       sqrt_temp_m = temp_m;
631*e5436536SAndroid Build Coastguard Worker       sqrt_temp_e = temp_e >> 1;
632*e5436536SAndroid Build Coastguard Worker     }
633*e5436536SAndroid Build Coastguard Worker     sqrt_temp_m = sqrtFixp(sqrt_temp_m);
634*e5436536SAndroid Build Coastguard Worker     if (iidLin21_e & 1) {
635*e5436536SAndroid Build Coastguard Worker       iidLin21_e += 1;
636*e5436536SAndroid Build Coastguard Worker       iidLin21_m >>= 1;
637*e5436536SAndroid Build Coastguard Worker     }
638*e5436536SAndroid Build Coastguard Worker     /* weight_[m,e] is actually 1/weight in the next few lines */
639*e5436536SAndroid Build Coastguard Worker     weight_m = invSqrtNorm2(iidLin21_m, &weight_e);
640*e5436536SAndroid Build Coastguard Worker     weight_e -= iidLin21_e >> 1;
641*e5436536SAndroid Build Coastguard Worker     weight_m = fMult(sqrt_temp_m, weight_m);
642*e5436536SAndroid Build Coastguard Worker     weight_e += sqrt_temp_e;
643*e5436536SAndroid Build Coastguard Worker     scale = fNorm(weight_m);
644*e5436536SAndroid Build Coastguard Worker     weight_m = scaleValue(weight_m, scale);
645*e5436536SAndroid Build Coastguard Worker     weight_e -= scale;
646*e5436536SAndroid Build Coastguard Worker     /* weight = 0.5 * max(1/weight, 1/maxWeight) */
647*e5436536SAndroid Build Coastguard Worker     if ((weight_e < 0) ||
648*e5436536SAndroid Build Coastguard Worker         ((weight_e == 0) && (weight_m < FL2FXCONST_DBL(1.f / MAX_WEIGHT)))) {
649*e5436536SAndroid Build Coastguard Worker       weight_m = FL2FXCONST_DBL(1.f / MAX_WEIGHT);
650*e5436536SAndroid Build Coastguard Worker       weight_e = 0;
651*e5436536SAndroid Build Coastguard Worker     }
652*e5436536SAndroid Build Coastguard Worker     weight_e -= 1;
653*e5436536SAndroid Build Coastguard Worker 
654*e5436536SAndroid Build Coastguard Worker     {
655*e5436536SAndroid Build Coastguard Worker       FIXP_DBL alphaRe_m, alphaIm_m, accu_m;
656*e5436536SAndroid Build Coastguard Worker       int alphaRe_e, alphaIm_e, accu_e;
657*e5436536SAndroid Build Coastguard Worker       /* alphaRe = (1.0f - iidLin2) / temp; */
658*e5436536SAndroid Build Coastguard Worker       alphaRe_m = fAddNorm(one_m, one_e, -iidLin2_m, iidLin2_e, &alphaRe_e);
659*e5436536SAndroid Build Coastguard Worker       alphaRe_m = fMult(alphaRe_m, inv_temp_m);
660*e5436536SAndroid Build Coastguard Worker       alphaRe_e += inv_temp_e;
661*e5436536SAndroid Build Coastguard Worker 
662*e5436536SAndroid Build Coastguard Worker       /* H11re = weight - alphaRe * weight; */
663*e5436536SAndroid Build Coastguard Worker       /* H21re = weight + alphaRe * weight; */
664*e5436536SAndroid Build Coastguard Worker       accu_m = fMult(alphaRe_m, weight_m);
665*e5436536SAndroid Build Coastguard Worker       accu_e = alphaRe_e + weight_e;
666*e5436536SAndroid Build Coastguard Worker       {
667*e5436536SAndroid Build Coastguard Worker         int accu2_e;
668*e5436536SAndroid Build Coastguard Worker         FIXP_DBL accu2_m;
669*e5436536SAndroid Build Coastguard Worker         accu2_m = fAddNorm(weight_m, weight_e, -accu_m, accu_e, &accu2_e);
670*e5436536SAndroid Build Coastguard Worker         *H11re = scaleValue(accu2_m, accu2_e - SCALE_PARAM_M2_212_PRED);
671*e5436536SAndroid Build Coastguard Worker         accu2_m = fAddNorm(weight_m, weight_e, accu_m, accu_e, &accu2_e);
672*e5436536SAndroid Build Coastguard Worker         *H21re = scaleValue(accu2_m, accu2_e - SCALE_PARAM_M2_212_PRED);
673*e5436536SAndroid Build Coastguard Worker       }
674*e5436536SAndroid Build Coastguard Worker 
675*e5436536SAndroid Build Coastguard Worker       if ((H11im != NULL) &&
676*e5436536SAndroid Build Coastguard Worker           (H21im != NULL) /*&& (H12im != NULL) && (H22im != NULL)*/) {
677*e5436536SAndroid Build Coastguard Worker         /* alphaIm = -iidIcc2 * sinIpd / temp; */
678*e5436536SAndroid Build Coastguard Worker         alphaIm_m = fMult(-iidIcc2_m, sinIpd);
679*e5436536SAndroid Build Coastguard Worker         alphaIm_m = fMult(alphaIm_m, inv_temp_m);
680*e5436536SAndroid Build Coastguard Worker         alphaIm_e = iidIcc2_e + inv_temp_e;
681*e5436536SAndroid Build Coastguard Worker         /* H11im = -alphaIm * weight; */
682*e5436536SAndroid Build Coastguard Worker         /* H21im =  alphaIm * weight; */
683*e5436536SAndroid Build Coastguard Worker         accu_m = fMult(alphaIm_m, weight_m);
684*e5436536SAndroid Build Coastguard Worker         accu_e = alphaIm_e + weight_e;
685*e5436536SAndroid Build Coastguard Worker         accu_m = scaleValue(accu_m, accu_e - SCALE_PARAM_M2_212_PRED);
686*e5436536SAndroid Build Coastguard Worker         *H11im = -accu_m;
687*e5436536SAndroid Build Coastguard Worker         *H21im = accu_m;
688*e5436536SAndroid Build Coastguard Worker 
689*e5436536SAndroid Build Coastguard Worker         /* *H12im = (FIXP_DBL)0; */
690*e5436536SAndroid Build Coastguard Worker         /* *H22im = (FIXP_DBL)0; */
691*e5436536SAndroid Build Coastguard Worker       }
692*e5436536SAndroid Build Coastguard Worker     }
693*e5436536SAndroid Build Coastguard Worker     if (band < resBands) {
694*e5436536SAndroid Build Coastguard Worker       FIXP_DBL weight =
695*e5436536SAndroid Build Coastguard Worker           scaleValue(weight_m, weight_e - SCALE_PARAM_M2_212_PRED);
696*e5436536SAndroid Build Coastguard Worker       *H12re = weight;
697*e5436536SAndroid Build Coastguard Worker       *H22re = -weight;
698*e5436536SAndroid Build Coastguard Worker     } else {
699*e5436536SAndroid Build Coastguard Worker       /* beta = 2.0f * iidLin * (float) sqrt(1.0f - icc * icc) * weight / temp;
700*e5436536SAndroid Build Coastguard Worker        */
701*e5436536SAndroid Build Coastguard Worker       FIXP_DBL beta_m;
702*e5436536SAndroid Build Coastguard Worker       int beta_e;
703*e5436536SAndroid Build Coastguard Worker       beta_m = FX_SGL2FX_DBL(sqrt_one_minus_ICC2[iccIdx]);
704*e5436536SAndroid Build Coastguard Worker       beta_e = 1; /* multipication with 2.0f */
705*e5436536SAndroid Build Coastguard Worker       beta_m = fMult(beta_m, weight_m);
706*e5436536SAndroid Build Coastguard Worker       beta_e += weight_e;
707*e5436536SAndroid Build Coastguard Worker       beta_m = fMult(beta_m, iidLin_m);
708*e5436536SAndroid Build Coastguard Worker       beta_e += iidLin_e;
709*e5436536SAndroid Build Coastguard Worker       beta_m = fMult(beta_m, inv_temp_m);
710*e5436536SAndroid Build Coastguard Worker       beta_e += inv_temp_e;
711*e5436536SAndroid Build Coastguard Worker 
712*e5436536SAndroid Build Coastguard Worker       beta_m = scaleValue(beta_m, beta_e - SCALE_PARAM_M2_212_PRED);
713*e5436536SAndroid Build Coastguard Worker       *H12re = beta_m;
714*e5436536SAndroid Build Coastguard Worker       *H22re = -beta_m;
715*e5436536SAndroid Build Coastguard Worker     }
716*e5436536SAndroid Build Coastguard Worker   }
717*e5436536SAndroid Build Coastguard Worker }
718*e5436536SAndroid Build Coastguard Worker 
param2UMX_Prediction__FDK(spatialDec * self,FIXP_DBL * H11re,FIXP_DBL * H11im,FIXP_DBL * H12re,FIXP_DBL * H12im,FIXP_DBL * H21re,FIXP_DBL * H21im,FIXP_DBL * H22re,FIXP_DBL * H22im,int ottBoxIndx,int parameterSetIndx,int resBands)719*e5436536SAndroid Build Coastguard Worker static void param2UMX_Prediction__FDK(spatialDec* self, FIXP_DBL* H11re,
720*e5436536SAndroid Build Coastguard Worker                                       FIXP_DBL* H11im, FIXP_DBL* H12re,
721*e5436536SAndroid Build Coastguard Worker                                       FIXP_DBL* H12im, FIXP_DBL* H21re,
722*e5436536SAndroid Build Coastguard Worker                                       FIXP_DBL* H21im, FIXP_DBL* H22re,
723*e5436536SAndroid Build Coastguard Worker                                       FIXP_DBL* H22im, int ottBoxIndx,
724*e5436536SAndroid Build Coastguard Worker                                       int parameterSetIndx, int resBands) {
725*e5436536SAndroid Build Coastguard Worker   int band;
726*e5436536SAndroid Build Coastguard Worker   FDK_ASSERT((H12im == NULL) && (H22im == NULL)); /* always == 0 */
727*e5436536SAndroid Build Coastguard Worker 
728*e5436536SAndroid Build Coastguard Worker   for (band = 0; band < self->numParameterBands; band++) {
729*e5436536SAndroid Build Coastguard Worker     int cldIdx = self->ottCLD__FDK[ottBoxIndx][parameterSetIndx][band];
730*e5436536SAndroid Build Coastguard Worker     int iccIdx = self->ottICC__FDK[ottBoxIndx][parameterSetIndx][band];
731*e5436536SAndroid Build Coastguard Worker     int ipdIdx = self->ottIPD__FDK[ottBoxIndx][parameterSetIndx][band];
732*e5436536SAndroid Build Coastguard Worker 
733*e5436536SAndroid Build Coastguard Worker     param2UMX_Prediction_Core__FDK(
734*e5436536SAndroid Build Coastguard Worker         &H11re[band], (H11im ? &H11im[band] : NULL), &H12re[band], NULL,
735*e5436536SAndroid Build Coastguard Worker         &H21re[band], (H21im ? &H21im[band] : NULL), &H22re[band], NULL, cldIdx,
736*e5436536SAndroid Build Coastguard Worker         iccIdx, ipdIdx, band, self->numOttBandsIPD, resBands);
737*e5436536SAndroid Build Coastguard Worker   }
738*e5436536SAndroid Build Coastguard Worker }
739*e5436536SAndroid Build Coastguard Worker 
740*e5436536SAndroid Build Coastguard Worker /*******************************************************************************
741*e5436536SAndroid Build Coastguard Worker  Functionname:  initM1andM2
742*e5436536SAndroid Build Coastguard Worker  *******************************************************************************
743*e5436536SAndroid Build Coastguard Worker 
744*e5436536SAndroid Build Coastguard Worker  Description:
745*e5436536SAndroid Build Coastguard Worker 
746*e5436536SAndroid Build Coastguard Worker  Arguments:
747*e5436536SAndroid Build Coastguard Worker 
748*e5436536SAndroid Build Coastguard Worker  Return:
749*e5436536SAndroid Build Coastguard Worker 
750*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
751*e5436536SAndroid Build Coastguard Worker 
initM1andM2(spatialDec * self,int initStatesFlag,int configChanged)752*e5436536SAndroid Build Coastguard Worker SACDEC_ERROR initM1andM2(spatialDec* self, int initStatesFlag,
753*e5436536SAndroid Build Coastguard Worker                          int configChanged) {
754*e5436536SAndroid Build Coastguard Worker   SACDEC_ERROR err = MPS_OK;
755*e5436536SAndroid Build Coastguard Worker 
756*e5436536SAndroid Build Coastguard Worker   self->bOverwriteM1M2prev = (configChanged && !initStatesFlag) ? 1 : 0;
757*e5436536SAndroid Build Coastguard Worker 
758*e5436536SAndroid Build Coastguard Worker   { self->numM2rows = self->numOutputChannels; }
759*e5436536SAndroid Build Coastguard Worker 
760*e5436536SAndroid Build Coastguard Worker   if (initStatesFlag) {
761*e5436536SAndroid Build Coastguard Worker     int i, j, k;
762*e5436536SAndroid Build Coastguard Worker 
763*e5436536SAndroid Build Coastguard Worker     for (i = 0; i < self->numM2rows; i++) {
764*e5436536SAndroid Build Coastguard Worker       for (j = 0; j < self->numVChannels; j++) {
765*e5436536SAndroid Build Coastguard Worker         for (k = 0; k < MAX_PARAMETER_BANDS; k++) {
766*e5436536SAndroid Build Coastguard Worker           self->M2Real__FDK[i][j][k] = FL2FXCONST_DBL(0);
767*e5436536SAndroid Build Coastguard Worker           self->M2RealPrev__FDK[i][j][k] = FL2FXCONST_DBL(0);
768*e5436536SAndroid Build Coastguard Worker         }
769*e5436536SAndroid Build Coastguard Worker       }
770*e5436536SAndroid Build Coastguard Worker     }
771*e5436536SAndroid Build Coastguard Worker   }
772*e5436536SAndroid Build Coastguard Worker 
773*e5436536SAndroid Build Coastguard Worker   return err;
774*e5436536SAndroid Build Coastguard Worker }
775