Coverage Report

Created: 2026-09-01 07:17

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/aac/libSBRdec/src/lpp_tran.cpp
Line
Count
Source
1
/* -----------------------------------------------------------------------------
2
Software License for The Fraunhofer FDK AAC Codec Library for Android
3
4
© Copyright  1995 - 2021 Fraunhofer-Gesellschaft zur Förderung der angewandten
5
Forschung e.V. All rights reserved.
6
7
 1.    INTRODUCTION
8
The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
9
that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
10
scheme for digital audio. This FDK AAC Codec software is intended to be used on
11
a wide variety of Android devices.
12
13
AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
14
general perceptual audio codecs. AAC-ELD is considered the best-performing
15
full-bandwidth communications codec by independent studies and is widely
16
deployed. AAC has been standardized by ISO and IEC as part of the MPEG
17
specifications.
18
19
Patent licenses for necessary patent claims for the FDK AAC Codec (including
20
those of Fraunhofer) may be obtained through Via Licensing
21
(www.vialicensing.com) or through the respective patent owners individually for
22
the purpose of encoding or decoding bit streams in products that are compliant
23
with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
24
Android devices already license these patent claims through Via Licensing or
25
directly from the patent owners, and therefore FDK AAC Codec software may
26
already be covered under those patent licenses when it is used for those
27
licensed purposes only.
28
29
Commercially-licensed AAC software libraries, including floating-point versions
30
with enhanced sound quality, are also available from Fraunhofer. Users are
31
encouraged to check the Fraunhofer website for additional applications
32
information and documentation.
33
34
2.    COPYRIGHT LICENSE
35
36
Redistribution and use in source and binary forms, with or without modification,
37
are permitted without payment of copyright license fees provided that you
38
satisfy the following conditions:
39
40
You must retain the complete text of this software license in redistributions of
41
the FDK AAC Codec or your modifications thereto in source code form.
42
43
You must retain the complete text of this software license in the documentation
44
and/or other materials provided with redistributions of the FDK AAC Codec or
45
your modifications thereto in binary form. You must make available free of
46
charge copies of the complete source code of the FDK AAC Codec and your
47
modifications thereto to recipients of copies in binary form.
48
49
The name of Fraunhofer may not be used to endorse or promote products derived
50
from this library without prior written permission.
51
52
You may not charge copyright license fees for anyone to use, copy or distribute
53
the FDK AAC Codec software or your modifications thereto.
54
55
Your modified versions of the FDK AAC Codec must carry prominent notices stating
56
that you changed the software and the date of any change. For modified versions
57
of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
58
must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
59
AAC Codec Library for Android."
60
61
3.    NO PATENT LICENSE
62
63
NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
64
limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
65
Fraunhofer provides no warranty of patent non-infringement with respect to this
66
software.
67
68
You may use this FDK AAC Codec software or modifications thereto only for
69
purposes that are authorized by appropriate patent licenses.
70
71
4.    DISCLAIMER
72
73
This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
74
holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
75
including but not limited to the implied warranties of merchantability and
76
fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
77
CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
78
or consequential damages, including but not limited to procurement of substitute
79
goods or services; loss of use, data, or profits, or business interruption,
80
however caused and on any theory of liability, whether in contract, strict
81
liability, or tort (including negligence), arising in any way out of the use of
82
this software, even if advised of the possibility of such damage.
83
84
5.    CONTACT INFORMATION
85
86
Fraunhofer Institute for Integrated Circuits IIS
87
Attention: Audio and Multimedia Departments - FDK AAC LL
88
Am Wolfsmantel 33
89
91058 Erlangen, Germany
90
91
www.iis.fraunhofer.de/amm
92
amm-info@iis.fraunhofer.de
93
----------------------------------------------------------------------------- */
94
95
/**************************** SBR decoder library ******************************
96
97
   Author(s):
98
99
   Description:
100
101
*******************************************************************************/
102
103
/*!
104
  \file
105
  \brief  Low Power Profile Transposer
106
  This module provides the transposer. The main entry point is lppTransposer().
107
  The function generates high frequency content by copying data from the low
108
  band (provided by core codec) into the high band. This process is also
109
  referred to as "patching". The function also implements spectral whitening by
110
  means of inverse filtering based on LPC coefficients.
111
112
  Together with the QMF filterbank the transposer can be tested using a supplied
113
  test program. See main_audio.cpp for details. This module does use fractional
114
  arithmetic and the accuracy of the computations has an impact on the overall
115
  sound quality. The module also needs to take into account the different
116
  scaling of spectral data.
117
118
  \sa lppTransposer(), main_audio.cpp, sbr_scale.h, \ref documentationOverview
119
*/
120
121
#if __has_include(<android/ndk-version.h>)
122
#include <android/ndk-version.h>
123
#endif
124
125
#if defined __ANDROID__ && !defined __ANDROID_NDK__
126
#include "log/log.h"
127
#endif
128
129
#include "lpp_tran.h"
130
131
#include "sbr_ram.h"
132
#include "sbr_rom.h"
133
134
#include "genericStds.h"
135
#include "autocorr2nd.h"
136
137
#include "HFgen_preFlat.h"
138
139
13.9M
#define LPC_SCALE_FACTOR 2
140
141
/*!
142
 *
143
 * \brief Get bandwidth expansion factor from filtering level
144
 *
145
 * Returns a filter parameter (bandwidth expansion factor) depending on
146
 * the desired filtering level signalled in the bitstream.
147
 * When switching the filtering level from LOW to OFF, an additional
148
 * level is being inserted to achieve a smooth transition.
149
 */
150
151
static FIXP_DBL mapInvfMode(INVF_MODE mode, INVF_MODE prevMode,
152
427k
                            WHITENING_FACTORS whFactors) {
153
427k
  switch (mode) {
154
117k
    case INVF_LOW_LEVEL:
155
117k
      if (prevMode == INVF_OFF)
156
14.6k
        return whFactors.transitionLevel;
157
103k
      else
158
103k
        return whFactors.lowLevel;
159
160
25.3k
    case INVF_MID_LEVEL:
161
25.3k
      return whFactors.midLevel;
162
163
57.6k
    case INVF_HIGH_LEVEL:
164
57.6k
      return whFactors.highLevel;
165
166
226k
    default:
167
226k
      if (prevMode == INVF_LOW_LEVEL)
168
10.0k
        return whFactors.transitionLevel;
169
216k
      else
170
216k
        return whFactors.off;
171
427k
  }
172
427k
}
173
174
/*!
175
 *
176
 * \brief Perform inverse filtering level emphasis
177
 *
178
 * Retrieve bandwidth expansion factor and apply smoothing for each filter band
179
 *
180
 */
181
182
static void inverseFilteringLevelEmphasis(
183
    HANDLE_SBR_LPP_TRANS hLppTrans, /*!< Handle of lpp transposer  */
184
    UCHAR nInvfBands,              /*!< Number of bands for inverse filtering */
185
    INVF_MODE *sbr_invf_mode,      /*!< Current inverse filtering modes */
186
    INVF_MODE *sbr_invf_mode_prev, /*!< Previous inverse filtering modes */
187
    FIXP_DBL *bwVector             /*!< Resulting filtering levels */
188
181k
) {
189
608k
  for (int i = 0; i < nInvfBands; i++) {
190
427k
    FIXP_DBL accu;
191
427k
    FIXP_DBL bwTmp = mapInvfMode(sbr_invf_mode[i], sbr_invf_mode_prev[i],
192
427k
                                 hLppTrans->pSettings->whFactors);
193
194
427k
    if (bwTmp < hLppTrans->bwVectorOld[i]) {
195
58.9k
      accu = fMultDiv2(FL2FXCONST_DBL(0.75f), bwTmp) +
196
58.9k
             fMultDiv2(FL2FXCONST_DBL(0.25f), hLppTrans->bwVectorOld[i]);
197
368k
    } else {
198
368k
      accu = fMultDiv2(FL2FXCONST_DBL(0.90625f), bwTmp) +
199
368k
             fMultDiv2(FL2FXCONST_DBL(0.09375f), hLppTrans->bwVectorOld[i]);
200
368k
    }
201
202
427k
    if (accu<FL2FXCONST_DBL(0.015625f)>> 1) {
203
188k
      bwVector[i] = FL2FXCONST_DBL(0.0f);
204
238k
    } else {
205
238k
      bwVector[i] = fixMin(accu << 1, FL2FXCONST_DBL(0.99609375f));
206
238k
    }
207
427k
  }
208
181k
}
209
210
/* Resulting autocorrelation determinant exponent */
211
#define ACDET_EXP \
212
  (2 * (DFRACT_BITS + sbrScaleFactor->lb_scale + 10 - ac.det_scale))
213
#define AC_EXP (-sbrScaleFactor->lb_scale + LPC_SCALE_FACTOR)
214
#define ALPHA_EXP (-sbrScaleFactor->lb_scale + LPC_SCALE_FACTOR + 1)
215
/* Resulting transposed QMF values exponent 16 bit normalized samplebits
216
 * assumed. */
217
#define QMFOUT_EXP ((SAMPLE_BITS - 15) - sbrScaleFactor->lb_scale)
218
219
static inline void calc_qmfBufferReal(FIXP_DBL **qmfBufferReal,
220
                                      const FIXP_DBL *const lowBandReal,
221
                                      const int startSample,
222
                                      const int stopSample, const UCHAR hiBand,
223
                                      const int dynamicScale,
224
99.8k
                                      const FIXP_SGL a0r, const FIXP_SGL a1r) {
225
99.8k
  const int dynscale = fixMax(0, dynamicScale - 1) + 1;
226
99.8k
  const int rescale = -fixMin(0, dynamicScale - 1) + 1;
227
99.8k
  const int descale =
228
99.8k
      fixMin(DFRACT_BITS - 1, LPC_SCALE_FACTOR + dynamicScale + rescale);
229
230
2.81M
  for (int i = 0; i < stopSample - startSample; i++) {
231
2.71M
    FIXP_DBL accu;
232
233
2.71M
    accu = fMultDiv2(a1r, lowBandReal[i]) + fMultDiv2(a0r, lowBandReal[i + 1]);
234
2.71M
    accu = (lowBandReal[i + 2] >> descale) + (accu >> dynscale);
235
236
2.71M
    qmfBufferReal[i + startSample][hiBand] =
237
2.71M
        SATURATE_LEFT_SHIFT(accu, rescale, DFRACT_BITS);
238
2.71M
  }
239
99.8k
}
240
241
/*!
242
 *
243
 * \brief Perform transposition by patching of subband samples.
244
 * This function serves as the main entry point into the module. The function
245
 * determines the areas for the patching process (these are the source range as
246
 * well as the target range) and implements spectral whitening by means of
247
 * inverse filtering. The function autoCorrelation2nd() is an auxiliary function
248
 * for calculating the LPC coefficients for the filtering.  The actual
249
 * calculation of the LPC coefficients and the implementation of the filtering
250
 * are done as part of lppTransposer().
251
 *
252
 * Note that the filtering is done on all available QMF subsamples, whereas the
253
 * patching is only done on those QMF subsamples that will be used in the next
254
 * QMF synthesis. The filtering is also implemented before the patching includes
255
 * further dependencies on parameters from the SBR data.
256
 *
257
 */
258
259
void lppTransposer(
260
    HANDLE_SBR_LPP_TRANS hLppTrans,   /*!< Handle of lpp transposer  */
261
    QMF_SCALE_FACTOR *sbrScaleFactor, /*!< Scaling factors */
262
    FIXP_DBL **qmfBufferReal, /*!< Pointer to pointer to real part of subband
263
                                 samples (source) */
264
265
    FIXP_DBL *degreeAlias,    /*!< Vector for results of aliasing estimation */
266
    FIXP_DBL **qmfBufferImag, /*!< Pointer to pointer to imaginary part of
267
                                 subband samples (source) */
268
    const int useLP, const int fPreWhitening, const int v_k_master0,
269
    const int timeStep,       /*!< Time step of envelope */
270
    const int firstSlotOffs,  /*!< Start position in time */
271
    const int lastSlotOffs,   /*!< Number of overlap-slots into next frame */
272
    const int nInvfBands,     /*!< Number of bands for inverse filtering */
273
    INVF_MODE *sbr_invf_mode, /*!< Current inverse filtering modes */
274
    INVF_MODE *sbr_invf_mode_prev /*!< Previous inverse filtering modes */
275
155k
) {
276
155k
  INT bwIndex[MAX_NUM_PATCHES];
277
155k
  FIXP_DBL bwVector[MAX_NUM_PATCHES]; /*!< pole moving factors */
278
155k
  FIXP_DBL preWhiteningGains[(64) / 2];
279
155k
  int preWhiteningGains_exp[(64) / 2];
280
281
155k
  int i;
282
155k
  int loBand, start, stop;
283
155k
  TRANSPOSER_SETTINGS *pSettings = hLppTrans->pSettings;
284
155k
  PATCH_PARAM *patchParam = pSettings->patchParam;
285
155k
  int patch;
286
287
155k
  FIXP_SGL alphar[LPC_ORDER], a0r, a1r;
288
155k
  FIXP_SGL alphai[LPC_ORDER], a0i = 0, a1i = 0;
289
155k
  FIXP_SGL bw = FL2FXCONST_SGL(0.0f);
290
291
155k
  int autoCorrLength;
292
293
155k
  FIXP_DBL k1, k1_below = 0, k1_below2 = 0;
294
295
155k
  ACORR_COEFS ac;
296
155k
  int startSample;
297
155k
  int stopSample;
298
155k
  int stopSampleClear;
299
300
155k
  int comLowBandScale;
301
155k
  int ovLowBandShift;
302
155k
  int lowBandShift;
303
  /*  int ovHighBandShift;*/
304
305
155k
  alphai[0] = FL2FXCONST_SGL(0.0f);
306
155k
  alphai[1] = FL2FXCONST_SGL(0.0f);
307
308
155k
  startSample = firstSlotOffs * timeStep;
309
155k
  stopSample = pSettings->nCols + lastSlotOffs * timeStep;
310
155k
  FDK_ASSERT((lastSlotOffs * timeStep) <= pSettings->overlap);
311
312
155k
  inverseFilteringLevelEmphasis(hLppTrans, nInvfBands, sbr_invf_mode,
313
155k
                                sbr_invf_mode_prev, bwVector);
314
315
155k
  stopSampleClear = stopSample;
316
317
155k
  autoCorrLength = pSettings->nCols + pSettings->overlap;
318
319
155k
  if (pSettings->noOfPatches > 0) {
320
    /* Set upper subbands to zero:
321
       This is required in case that the patches do not cover the complete
322
       highband (because the last patch would be too short). Possible
323
       optimization: Clearing bands up to usb would be sufficient here. */
324
155k
    int targetStopBand =
325
155k
        patchParam[pSettings->noOfPatches - 1].targetStartBand +
326
155k
        patchParam[pSettings->noOfPatches - 1].numBandsInPatch;
327
328
155k
    int memSize = ((64) - targetStopBand) * sizeof(FIXP_DBL);
329
330
155k
    if (!useLP) {
331
4.52M
      for (i = startSample; i < stopSampleClear; i++) {
332
4.39M
        FDKmemclear(&qmfBufferReal[i][targetStopBand], memSize);
333
4.39M
        FDKmemclear(&qmfBufferImag[i][targetStopBand], memSize);
334
4.39M
      }
335
130k
    } else {
336
597k
      for (i = startSample; i < stopSampleClear; i++) {
337
572k
        FDKmemclear(&qmfBufferReal[i][targetStopBand], memSize);
338
572k
      }
339
25.2k
    }
340
155k
  }
341
#if defined __ANDROID__ && !defined __ANDROID_NDK__
342
  else {
343
    // Safetynet logging
344
    android_errorWriteLog(0x534e4554, "112160868");
345
  }
346
#endif
347
348
  /* init bwIndex for each patch */
349
155k
  FDKmemclear(bwIndex, sizeof(bwIndex));
350
351
  /*
352
    Calc common low band scale factor
353
  */
354
155k
  comLowBandScale =
355
155k
      fixMin(sbrScaleFactor->ov_lb_scale, sbrScaleFactor->lb_scale);
356
357
155k
  ovLowBandShift = sbrScaleFactor->ov_lb_scale - comLowBandScale;
358
155k
  lowBandShift = sbrScaleFactor->lb_scale - comLowBandScale;
359
  /*  ovHighBandShift = firstSlotOffs == 0 ? ovLowBandShift:0;*/
360
361
155k
  if (fPreWhitening) {
362
26.9k
    sbrDecoder_calculateGainVec(
363
26.9k
        qmfBufferReal, qmfBufferImag,
364
26.9k
        DFRACT_BITS - 1 - 16 -
365
26.9k
            sbrScaleFactor->ov_lb_scale, /* convert scale to exponent */
366
26.9k
        DFRACT_BITS - 1 - 16 -
367
26.9k
            sbrScaleFactor->lb_scale, /* convert scale to exponent */
368
26.9k
        pSettings->overlap, preWhiteningGains, preWhiteningGains_exp,
369
26.9k
        v_k_master0, startSample, stopSample);
370
26.9k
  }
371
372
  /* outer loop over bands to do analysis only once for each band */
373
374
155k
  if (!useLP) {
375
130k
    start = pSettings->lbStartPatching;
376
130k
    stop = pSettings->lbStopPatching;
377
130k
  } else {
378
25.2k
    start = fixMax(1, pSettings->lbStartPatching - 2);
379
25.2k
    stop = patchParam[0].targetStartBand;
380
25.2k
  }
381
382
2.23M
  for (loBand = start; loBand < stop; loBand++) {
383
2.08M
    FIXP_DBL lowBandReal[(((1024) / (32) * (4) / 2) + (3 * (4))) + LPC_ORDER];
384
2.08M
    FIXP_DBL *plowBandReal = lowBandReal;
385
2.08M
    FIXP_DBL **pqmfBufferReal =
386
2.08M
        qmfBufferReal + firstSlotOffs * timeStep /* + pSettings->overlap */;
387
2.08M
    FIXP_DBL lowBandImag[(((1024) / (32) * (4) / 2) + (3 * (4))) + LPC_ORDER];
388
2.08M
    FIXP_DBL *plowBandImag = lowBandImag;
389
2.08M
    FIXP_DBL **pqmfBufferImag =
390
2.08M
        qmfBufferImag + firstSlotOffs * timeStep /* + pSettings->overlap */;
391
2.08M
    int resetLPCCoeffs = 0;
392
2.08M
    int dynamicScale = DFRACT_BITS - 1 - LPC_SCALE_FACTOR;
393
2.08M
    int acDetScale = 0; /* scaling of autocorrelation determinant */
394
395
2.08M
    for (i = 0;
396
10.4M
         i < LPC_ORDER + firstSlotOffs * timeStep /*+pSettings->overlap*/;
397
8.36M
         i++) {
398
8.36M
      *plowBandReal++ = hLppTrans->lpcFilterStatesRealLegSBR[i][loBand];
399
8.36M
      if (!useLP)
400
7.39M
        *plowBandImag++ = hLppTrans->lpcFilterStatesImagLegSBR[i][loBand];
401
8.36M
    }
402
403
    /*
404
      Take old slope length qmf slot source values out of (overlap)qmf buffer
405
    */
406
2.08M
    if (!useLP) {
407
1.68M
      for (i = 0;
408
62.5M
           i < pSettings->nCols + pSettings->overlap - firstSlotOffs * timeStep;
409
60.8M
           i++) {
410
60.8M
        *plowBandReal++ = (*pqmfBufferReal++)[loBand];
411
60.8M
        *plowBandImag++ = (*pqmfBufferImag++)[loBand];
412
60.8M
      }
413
1.68M
    } else {
414
      /* pSettings->overlap is always even */
415
397k
      FDK_ASSERT((pSettings->overlap & 1) == 0);
416
6.35M
      for (i = 0; i < ((pSettings->nCols + pSettings->overlap -
417
6.35M
                        firstSlotOffs * timeStep) >>
418
6.35M
                       1);
419
5.95M
           i++) {
420
5.95M
        *plowBandReal++ = (*pqmfBufferReal++)[loBand];
421
5.95M
        *plowBandReal++ = (*pqmfBufferReal++)[loBand];
422
5.95M
      }
423
397k
      if (pSettings->nCols & 1) {
424
100k
        *plowBandReal++ = (*pqmfBufferReal++)[loBand];
425
100k
      }
426
397k
    }
427
428
    /*
429
      Determine dynamic scaling value.
430
     */
431
2.08M
    dynamicScale =
432
2.08M
        fixMin(dynamicScale,
433
2.08M
               getScalefactor(lowBandReal, LPC_ORDER + pSettings->overlap) +
434
2.08M
                   ovLowBandShift);
435
2.08M
    dynamicScale =
436
2.08M
        fixMin(dynamicScale,
437
2.08M
               getScalefactor(&lowBandReal[LPC_ORDER + pSettings->overlap],
438
2.08M
                              pSettings->nCols) +
439
2.08M
                   lowBandShift);
440
2.08M
    if (!useLP) {
441
1.68M
      dynamicScale =
442
1.68M
          fixMin(dynamicScale,
443
1.68M
                 getScalefactor(lowBandImag, LPC_ORDER + pSettings->overlap) +
444
1.68M
                     ovLowBandShift);
445
1.68M
      dynamicScale =
446
1.68M
          fixMin(dynamicScale,
447
1.68M
                 getScalefactor(&lowBandImag[LPC_ORDER + pSettings->overlap],
448
1.68M
                                pSettings->nCols) +
449
1.68M
                     lowBandShift);
450
1.68M
    }
451
452
2.08M
    if (dynamicScale == 0) {
453
      /* In this special case the available headroom bits as well as
454
         ovLowBandShift and lowBandShift are zero. The spectrum is limited to
455
         prevent -1.0, so negative values for dynamicScale can be avoided. */
456
2.24M
      for (i = 0; i < (LPC_ORDER + pSettings->overlap + pSettings->nCols);
457
2.18M
           i++) {
458
2.18M
        lowBandReal[i] = fixMax(lowBandReal[i], (FIXP_DBL)0x80000001);
459
2.18M
      }
460
55.4k
      if (!useLP) {
461
2.18M
        for (i = 0; i < (LPC_ORDER + pSettings->overlap + pSettings->nCols);
462
2.13M
             i++) {
463
2.13M
          lowBandImag[i] = fixMax(lowBandImag[i], (FIXP_DBL)0x80000001);
464
2.13M
        }
465
53.2k
      }
466
2.02M
    } else {
467
2.02M
      dynamicScale =
468
2.02M
          fixMax(0, dynamicScale -
469
2.02M
                        1); /* one additional bit headroom to prevent -1.0 */
470
2.02M
    }
471
472
    /*
473
      Scale temporal QMF buffer.
474
     */
475
2.08M
    scaleValues(&lowBandReal[0], LPC_ORDER + pSettings->overlap,
476
2.08M
                dynamicScale - ovLowBandShift);
477
2.08M
    scaleValues(&lowBandReal[LPC_ORDER + pSettings->overlap], pSettings->nCols,
478
2.08M
                dynamicScale - lowBandShift);
479
480
2.08M
    if (!useLP) {
481
1.68M
      scaleValues(&lowBandImag[0], LPC_ORDER + pSettings->overlap,
482
1.68M
                  dynamicScale - ovLowBandShift);
483
1.68M
      scaleValues(&lowBandImag[LPC_ORDER + pSettings->overlap],
484
1.68M
                  pSettings->nCols, dynamicScale - lowBandShift);
485
1.68M
    }
486
487
2.08M
    if (!useLP) {
488
1.68M
      acDetScale += autoCorr2nd_cplx(&ac, lowBandReal + LPC_ORDER,
489
1.68M
                                     lowBandImag + LPC_ORDER, autoCorrLength);
490
1.68M
    } else {
491
397k
      acDetScale +=
492
397k
          autoCorr2nd_real(&ac, lowBandReal + LPC_ORDER, autoCorrLength);
493
397k
    }
494
495
    /* Examine dynamic of determinant in autocorrelation. */
496
2.08M
    acDetScale += 2 * (comLowBandScale + dynamicScale);
497
2.08M
    acDetScale *= 2;            /* two times reflection coefficent scaling */
498
2.08M
    acDetScale += ac.det_scale; /* ac scaling of determinant */
499
500
    /* In case of determinant < 10^-38, resetLPCCoeffs=1 has to be enforced. */
501
2.08M
    if (acDetScale > 126) {
502
747k
      resetLPCCoeffs = 1;
503
747k
    }
504
505
2.08M
    alphar[1] = FL2FXCONST_SGL(0.0f);
506
2.08M
    if (!useLP) alphai[1] = FL2FXCONST_SGL(0.0f);
507
508
2.08M
    if (ac.det != FL2FXCONST_DBL(0.0f)) {
509
1.33M
      FIXP_DBL tmp, absTmp, absDet;
510
511
1.33M
      absDet = fixp_abs(ac.det);
512
513
1.33M
      if (!useLP) {
514
1.23M
        tmp = (fMultDiv2(ac.r01r, ac.r12r) >> (LPC_SCALE_FACTOR - 1)) -
515
1.23M
              ((fMultDiv2(ac.r01i, ac.r12i) + fMultDiv2(ac.r02r, ac.r11r)) >>
516
1.23M
               (LPC_SCALE_FACTOR - 1));
517
1.23M
      } else {
518
97.9k
        tmp = (fMultDiv2(ac.r01r, ac.r12r) >> (LPC_SCALE_FACTOR - 1)) -
519
97.9k
              (fMultDiv2(ac.r02r, ac.r11r) >> (LPC_SCALE_FACTOR - 1));
520
97.9k
      }
521
1.33M
      absTmp = fixp_abs(tmp);
522
523
      /*
524
        Quick check: is first filter coeff >= 1(4)
525
       */
526
1.33M
      {
527
1.33M
        INT scale;
528
1.33M
        FIXP_DBL result = fDivNorm(absTmp, absDet, &scale);
529
1.33M
        scale = scale + ac.det_scale;
530
531
1.33M
        if ((scale > 0) && (result >= (FIXP_DBL)MAXVAL_DBL >> scale)) {
532
4.07k
          resetLPCCoeffs = 1;
533
1.32M
        } else {
534
1.32M
          alphar[1] = FX_DBL2FX_SGL(scaleValueSaturate(result, scale));
535
1.32M
          if ((tmp < FL2FX_DBL(0.0f)) ^ (ac.det < FL2FX_DBL(0.0f))) {
536
1.14M
            alphar[1] = -alphar[1];
537
1.14M
          }
538
1.32M
        }
539
1.33M
      }
540
541
1.33M
      if (!useLP) {
542
1.23M
        tmp = (fMultDiv2(ac.r01i, ac.r12r) >> (LPC_SCALE_FACTOR - 1)) +
543
1.23M
              ((fMultDiv2(ac.r01r, ac.r12i) -
544
1.23M
                (FIXP_DBL)fMultDiv2(ac.r02i, ac.r11r)) >>
545
1.23M
               (LPC_SCALE_FACTOR - 1));
546
547
1.23M
        absTmp = fixp_abs(tmp);
548
549
        /*
550
        Quick check: is second filter coeff >= 1(4)
551
        */
552
1.23M
        {
553
1.23M
          INT scale;
554
1.23M
          FIXP_DBL result = fDivNorm(absTmp, absDet, &scale);
555
1.23M
          scale = scale + ac.det_scale;
556
557
1.23M
          if ((scale > 0) &&
558
86.6k
              (result >= /*FL2FXCONST_DBL(1.f)*/ (FIXP_DBL)MAXVAL_DBL >>
559
86.6k
               scale)) {
560
1.84k
            resetLPCCoeffs = 1;
561
1.23M
          } else {
562
1.23M
            alphai[1] = FX_DBL2FX_SGL(scaleValueSaturate(result, scale));
563
1.23M
            if ((tmp < FL2FX_DBL(0.0f)) ^ (ac.det < FL2FX_DBL(0.0f))) {
564
447k
              alphai[1] = -alphai[1];
565
447k
            }
566
1.23M
          }
567
1.23M
        }
568
1.23M
      }
569
1.33M
    }
570
571
2.08M
    alphar[0] = FL2FXCONST_SGL(0.0f);
572
2.08M
    if (!useLP) alphai[0] = FL2FXCONST_SGL(0.0f);
573
574
2.08M
    if (ac.r11r != FL2FXCONST_DBL(0.0f)) {
575
      /* ac.r11r is always >=0 */
576
1.33M
      FIXP_DBL tmp, absTmp;
577
578
1.33M
      if (!useLP) {
579
1.23M
        tmp = (ac.r01r >> (LPC_SCALE_FACTOR + 1)) +
580
1.23M
              (fMultDiv2(alphar[1], ac.r12r) + fMultDiv2(alphai[1], ac.r12i));
581
1.23M
      } else {
582
98.2k
        if (ac.r01r >= FL2FXCONST_DBL(0.0f))
583
74.9k
          tmp = (ac.r01r >> (LPC_SCALE_FACTOR + 1)) +
584
74.9k
                fMultDiv2(alphar[1], ac.r12r);
585
23.2k
        else
586
23.2k
          tmp = -((-ac.r01r) >> (LPC_SCALE_FACTOR + 1)) +
587
23.2k
                fMultDiv2(alphar[1], ac.r12r);
588
98.2k
      }
589
590
1.33M
      absTmp = fixp_abs(tmp);
591
592
      /*
593
        Quick check: is first filter coeff >= 1(4)
594
      */
595
596
1.33M
      if (absTmp >= (ac.r11r >> 1)) {
597
1.07k
        resetLPCCoeffs = 1;
598
1.33M
      } else {
599
1.33M
        INT scale;
600
1.33M
        FIXP_DBL result = fDivNorm(absTmp, fixp_abs(ac.r11r), &scale);
601
1.33M
        alphar[0] = FX_DBL2FX_SGL(scaleValueSaturate(result, scale + 1));
602
603
1.33M
        if ((tmp > FL2FX_DBL(0.0f)) ^ (ac.r11r < FL2FX_DBL(0.0f)))
604
753k
          alphar[0] = -alphar[0];
605
1.33M
      }
606
607
1.33M
      if (!useLP) {
608
1.23M
        tmp = (ac.r01i >> (LPC_SCALE_FACTOR + 1)) +
609
1.23M
              (fMultDiv2(alphai[1], ac.r12r) - fMultDiv2(alphar[1], ac.r12i));
610
611
1.23M
        absTmp = fixp_abs(tmp);
612
613
        /*
614
        Quick check: is second filter coeff >= 1(4)
615
        */
616
1.23M
        if (absTmp >= (ac.r11r >> 1)) {
617
350
          resetLPCCoeffs = 1;
618
1.23M
        } else {
619
1.23M
          INT scale;
620
1.23M
          FIXP_DBL result = fDivNorm(absTmp, fixp_abs(ac.r11r), &scale);
621
1.23M
          alphai[0] = FX_DBL2FX_SGL(scaleValueSaturate(result, scale + 1));
622
1.23M
          if ((tmp > FL2FX_DBL(0.0f)) ^ (ac.r11r < FL2FX_DBL(0.0f)))
623
557k
            alphai[0] = -alphai[0];
624
1.23M
        }
625
1.23M
      }
626
1.33M
    }
627
628
2.08M
    if (!useLP) {
629
      /* Now check the quadratic criteria */
630
1.68M
      if ((fMultDiv2(alphar[0], alphar[0]) + fMultDiv2(alphai[0], alphai[0])) >=
631
1.68M
          FL2FXCONST_DBL(0.5f))
632
496
        resetLPCCoeffs = 1;
633
1.68M
      if ((fMultDiv2(alphar[1], alphar[1]) + fMultDiv2(alphai[1], alphai[1])) >=
634
1.68M
          FL2FXCONST_DBL(0.5f))
635
391
        resetLPCCoeffs = 1;
636
1.68M
    }
637
638
2.08M
    if (resetLPCCoeffs) {
639
753k
      alphar[0] = FL2FXCONST_SGL(0.0f);
640
753k
      alphar[1] = FL2FXCONST_SGL(0.0f);
641
753k
      if (!useLP) {
642
452k
        alphai[0] = FL2FXCONST_SGL(0.0f);
643
452k
        alphai[1] = FL2FXCONST_SGL(0.0f);
644
452k
      }
645
753k
    }
646
647
2.08M
    if (useLP) {
648
      /* Aliasing detection */
649
397k
      if (ac.r11r == FL2FXCONST_DBL(0.0f)) {
650
299k
        k1 = FL2FXCONST_DBL(0.0f);
651
299k
      } else {
652
98.2k
        if (fixp_abs(ac.r01r) >= fixp_abs(ac.r11r)) {
653
4.03k
          if (fMultDiv2(ac.r01r, ac.r11r) < FL2FX_DBL(0.0f)) {
654
553
            k1 = (FIXP_DBL)MAXVAL_DBL /*FL2FXCONST_SGL(1.0f)*/;
655
3.47k
          } else {
656
            /* Since this value is squared later, it must not ever become -1.0f.
657
             */
658
3.47k
            k1 = (FIXP_DBL)(MINVAL_DBL + 1) /*FL2FXCONST_SGL(-1.0f)*/;
659
3.47k
          }
660
94.1k
        } else {
661
94.1k
          INT scale;
662
94.1k
          FIXP_DBL result =
663
94.1k
              fDivNorm(fixp_abs(ac.r01r), fixp_abs(ac.r11r), &scale);
664
94.1k
          k1 = scaleValueSaturate(result, scale);
665
666
94.1k
          if (!((ac.r01r < FL2FX_DBL(0.0f)) ^ (ac.r11r < FL2FX_DBL(0.0f)))) {
667
71.4k
            k1 = -k1;
668
71.4k
          }
669
94.1k
        }
670
98.2k
      }
671
397k
      if ((loBand > 1) && (loBand < v_k_master0)) {
672
        /* Check if the gain should be locked */
673
335k
        FIXP_DBL deg =
674
335k
            /*FL2FXCONST_DBL(1.0f)*/ (FIXP_DBL)MAXVAL_DBL - fPow2(k1_below);
675
335k
        degreeAlias[loBand] = FL2FXCONST_DBL(0.0f);
676
335k
        if (((loBand & 1) == 0) && (k1 < FL2FXCONST_DBL(0.0f))) {
677
34.3k
          if (k1_below < FL2FXCONST_DBL(0.0f)) { /* 2-Ch Aliasing Detection */
678
19.0k
            degreeAlias[loBand] = (FIXP_DBL)MAXVAL_DBL /*FL2FXCONST_DBL(1.0f)*/;
679
19.0k
            if (k1_below2 >
680
19.0k
                FL2FXCONST_DBL(0.0f)) { /* 3-Ch Aliasing Detection */
681
2.79k
              degreeAlias[loBand - 1] = deg;
682
2.79k
            }
683
19.0k
          } else if (k1_below2 >
684
15.3k
                     FL2FXCONST_DBL(0.0f)) { /* 3-Ch Aliasing Detection */
685
1.77k
            degreeAlias[loBand] = deg;
686
1.77k
          }
687
34.3k
        }
688
335k
        if (((loBand & 1) == 1) && (k1 > FL2FXCONST_DBL(0.0f))) {
689
11.8k
          if (k1_below > FL2FXCONST_DBL(0.0f)) { /* 2-CH Aliasing Detection */
690
3.67k
            degreeAlias[loBand] = (FIXP_DBL)MAXVAL_DBL /*FL2FXCONST_DBL(1.0f)*/;
691
3.67k
            if (k1_below2 <
692
3.67k
                FL2FXCONST_DBL(0.0f)) { /* 3-CH Aliasing Detection */
693
1.19k
              degreeAlias[loBand - 1] = deg;
694
1.19k
            }
695
8.16k
          } else if (k1_below2 <
696
8.16k
                     FL2FXCONST_DBL(0.0f)) { /* 3-CH Aliasing Detection */
697
3.80k
            degreeAlias[loBand] = deg;
698
3.80k
          }
699
11.8k
        }
700
335k
      }
701
      /* remember k1 values of the 2 QMF channels below the current channel */
702
397k
      k1_below2 = k1_below;
703
397k
      k1_below = k1;
704
397k
    }
705
706
2.08M
    patch = 0;
707
708
7.19M
    while (patch < pSettings->noOfPatches) { /* inner loop over every patch */
709
710
5.10M
      int hiBand = loBand + patchParam[patch].targetBandOffs;
711
712
5.10M
      if (loBand < patchParam[patch].sourceStartBand ||
713
3.67M
          loBand >= patchParam[patch].sourceStopBand
714
          //|| hiBand >= hLppTrans->pSettings->noChannels
715
5.10M
      ) {
716
        /* Lowband not in current patch - proceed */
717
1.62M
        patch++;
718
1.62M
        continue;
719
1.62M
      }
720
721
3.47M
      FDK_ASSERT(hiBand < (64));
722
723
      /* bwIndex[patch] is already initialized with value from previous band
724
       * inside this patch */
725
3.95M
      while (hiBand >= pSettings->bwBorders[bwIndex[patch]] &&
726
479k
             bwIndex[patch] < MAX_NUM_PATCHES - 1) {
727
479k
        bwIndex[patch]++;
728
479k
      }
729
730
      /*
731
        Filter Step 2: add the left slope with the current filter to the buffer
732
                       pure source values are already in there
733
      */
734
3.47M
      bw = FX_DBL2FX_SGL(bwVector[bwIndex[patch]]);
735
736
3.47M
      a0r = FX_DBL2FX_SGL(
737
3.47M
          fMult(bw, alphar[0])); /* Apply current bandwidth expansion factor */
738
739
3.47M
      if (!useLP) a0i = FX_DBL2FX_SGL(fMult(bw, alphai[0]));
740
3.47M
      bw = FX_DBL2FX_SGL(fPow2(bw));
741
3.47M
      a1r = FX_DBL2FX_SGL(fMult(bw, alphar[1]));
742
3.47M
      if (!useLP) a1i = FX_DBL2FX_SGL(fMult(bw, alphai[1]));
743
744
      /*
745
        Filter Step 3: insert the middle part which won't be windowed
746
      */
747
3.47M
      if (bw <= FL2FXCONST_SGL(0.0f)) {
748
1.47M
        if (!useLP) {
749
1.25M
          int descale =
750
1.25M
              fixMin(DFRACT_BITS - 1, (LPC_SCALE_FACTOR + dynamicScale));
751
42.5M
          for (i = startSample; i < stopSample; i++) {
752
41.3M
            FIXP_DBL accu1, accu2;
753
41.3M
            accu1 = lowBandReal[LPC_ORDER + i] >> descale;
754
41.3M
            accu2 = lowBandImag[LPC_ORDER + i] >> descale;
755
41.3M
            if (fPreWhitening) {
756
18.7M
              accu1 = scaleValueSaturate(
757
18.7M
                  fMultDiv2(accu1, preWhiteningGains[loBand]),
758
18.7M
                  preWhiteningGains_exp[loBand] + 1);
759
18.7M
              accu2 = scaleValueSaturate(
760
18.7M
                  fMultDiv2(accu2, preWhiteningGains[loBand]),
761
18.7M
                  preWhiteningGains_exp[loBand] + 1);
762
18.7M
            }
763
41.3M
            qmfBufferReal[i][hiBand] = accu1;
764
41.3M
            qmfBufferImag[i][hiBand] = accu2;
765
41.3M
          }
766
1.25M
        } else {
767
226k
          int descale =
768
226k
              fixMin(DFRACT_BITS - 1, (LPC_SCALE_FACTOR + dynamicScale));
769
6.70M
          for (i = startSample; i < stopSample; i++) {
770
6.47M
            qmfBufferReal[i][hiBand] = lowBandReal[LPC_ORDER + i] >> descale;
771
6.47M
          }
772
226k
        }
773
2.00M
      } else { /* bw <= 0 */
774
775
2.00M
        if (!useLP) {
776
1.90M
          const int dynscale = fixMax(0, dynamicScale - 2) + 1;
777
1.90M
          const int rescale = -fixMin(0, dynamicScale - 2) + 1;
778
1.90M
          const int descale = fixMin(DFRACT_BITS - 1,
779
1.90M
                                     LPC_SCALE_FACTOR + dynamicScale + rescale);
780
781
64.9M
          for (i = startSample; i < stopSample; i++) {
782
63.0M
            FIXP_DBL accu1, accu2;
783
784
63.0M
            accu1 = ((fMultDiv2(a0r, lowBandReal[LPC_ORDER + i - 1]) -
785
63.0M
                      fMultDiv2(a0i, lowBandImag[LPC_ORDER + i - 1])) >>
786
63.0M
                     1) +
787
63.0M
                    ((fMultDiv2(a1r, lowBandReal[LPC_ORDER + i - 2]) -
788
63.0M
                      fMultDiv2(a1i, lowBandImag[LPC_ORDER + i - 2])) >>
789
63.0M
                     1);
790
63.0M
            accu2 = ((fMultDiv2(a0i, lowBandReal[LPC_ORDER + i - 1]) +
791
63.0M
                      fMultDiv2(a0r, lowBandImag[LPC_ORDER + i - 1])) >>
792
63.0M
                     1) +
793
63.0M
                    ((fMultDiv2(a1i, lowBandReal[LPC_ORDER + i - 2]) +
794
63.0M
                      fMultDiv2(a1r, lowBandImag[LPC_ORDER + i - 2])) >>
795
63.0M
                     1);
796
797
63.0M
            accu1 =
798
63.0M
                (lowBandReal[LPC_ORDER + i] >> descale) + (accu1 >> dynscale);
799
63.0M
            accu2 =
800
63.0M
                (lowBandImag[LPC_ORDER + i] >> descale) + (accu2 >> dynscale);
801
63.0M
            if (fPreWhitening) {
802
10.0M
              qmfBufferReal[i][hiBand] = scaleValueSaturate(
803
10.0M
                  fMultDiv2(accu1, preWhiteningGains[loBand]),
804
10.0M
                  preWhiteningGains_exp[loBand] + 1 + rescale);
805
10.0M
              qmfBufferImag[i][hiBand] = scaleValueSaturate(
806
10.0M
                  fMultDiv2(accu2, preWhiteningGains[loBand]),
807
10.0M
                  preWhiteningGains_exp[loBand] + 1 + rescale);
808
53.0M
            } else {
809
53.0M
              qmfBufferReal[i][hiBand] =
810
53.0M
                  SATURATE_LEFT_SHIFT(accu1, rescale, DFRACT_BITS);
811
53.0M
              qmfBufferImag[i][hiBand] =
812
53.0M
                  SATURATE_LEFT_SHIFT(accu2, rescale, DFRACT_BITS);
813
53.0M
            }
814
63.0M
          }
815
1.90M
        } else {
816
99.8k
          FDK_ASSERT(dynamicScale >= 0);
817
99.8k
          calc_qmfBufferReal(
818
99.8k
              qmfBufferReal, &(lowBandReal[LPC_ORDER + startSample - 2]),
819
99.8k
              startSample, stopSample, hiBand, dynamicScale, a0r, a1r);
820
99.8k
        }
821
2.00M
      } /* bw <= 0 */
822
823
3.47M
      patch++;
824
825
3.47M
    } /* inner loop over patches */
826
827
    /*
828
     * store the unmodified filter coefficients if there is
829
     * an overlapping envelope
830
     *****************************************************************/
831
832
2.08M
  } /* outer loop over bands (loBand) */
833
834
155k
  if (useLP) {
835
25.2k
    for (loBand = pSettings->lbStartPatching;
836
298k
         loBand < pSettings->lbStopPatching; loBand++) {
837
273k
      patch = 0;
838
622k
      while (patch < pSettings->noOfPatches) {
839
349k
        UCHAR hiBand = loBand + patchParam[patch].targetBandOffs;
840
841
349k
        if (loBand < patchParam[patch].sourceStartBand ||
842
327k
            loBand >= patchParam[patch].sourceStopBand ||
843
326k
            hiBand >= (64) /* Highband out of range (biterror) */
844
349k
        ) {
845
          /* Lowband not in current patch or highband out of range (might be
846
           * caused by biterrors)- proceed */
847
23.6k
          patch++;
848
23.6k
          continue;
849
23.6k
        }
850
851
326k
        if (hiBand != patchParam[patch].targetStartBand)
852
295k
          degreeAlias[hiBand] = degreeAlias[loBand];
853
854
326k
        patch++;
855
326k
      }
856
273k
    } /* end  for loop */
857
25.2k
  }
858
859
503k
  for (i = 0; i < nInvfBands; i++) {
860
348k
    hLppTrans->bwVectorOld[i] = bwVector[i];
861
348k
  }
862
863
  /*
864
    set high band scale factor
865
  */
866
155k
  sbrScaleFactor->hb_scale = comLowBandScale - (LPC_SCALE_FACTOR);
867
155k
}
868
869
void lppTransposerHBE(
870
    HANDLE_SBR_LPP_TRANS hLppTrans, /*!< Handle of lpp transposer  */
871
    HANDLE_HBE_TRANSPOSER hQmfTransposer,
872
    QMF_SCALE_FACTOR *sbrScaleFactor, /*!< Scaling factors */
873
    FIXP_DBL **qmfBufferReal, /*!< Pointer to pointer to real part of subband
874
                                 samples (source) */
875
    FIXP_DBL **qmfBufferImag, /*!< Pointer to pointer to imaginary part of
876
                                 subband samples (source) */
877
    const int timeStep,       /*!< Time step of envelope */
878
    const int firstSlotOffs,  /*!< Start position in time */
879
    const int lastSlotOffs,   /*!< Number of overlap-slots into next frame */
880
    const int nInvfBands,     /*!< Number of bands for inverse filtering */
881
    INVF_MODE *sbr_invf_mode, /*!< Current inverse filtering modes */
882
    INVF_MODE *sbr_invf_mode_prev /*!< Previous inverse filtering modes */
883
25.5k
) {
884
25.5k
  INT bwIndex;
885
25.5k
  FIXP_DBL bwVector[MAX_NUM_PATCHES_HBE]; /*!< pole moving factors */
886
887
25.5k
  int i;
888
25.5k
  int loBand, start, stop;
889
25.5k
  TRANSPOSER_SETTINGS *pSettings = hLppTrans->pSettings;
890
25.5k
  PATCH_PARAM *patchParam = pSettings->patchParam;
891
892
25.5k
  FIXP_SGL alphar[LPC_ORDER], a0r, a1r;
893
25.5k
  FIXP_SGL alphai[LPC_ORDER], a0i = 0, a1i = 0;
894
25.5k
  FIXP_SGL bw = FL2FXCONST_SGL(0.0f);
895
896
25.5k
  int autoCorrLength;
897
898
25.5k
  ACORR_COEFS ac;
899
25.5k
  int startSample;
900
25.5k
  int stopSample;
901
25.5k
  int stopSampleClear;
902
903
25.5k
  int comBandScale;
904
25.5k
  int ovLowBandShift;
905
25.5k
  int lowBandShift;
906
  /*  int ovHighBandShift;*/
907
908
25.5k
  alphai[0] = FL2FXCONST_SGL(0.0f);
909
25.5k
  alphai[1] = FL2FXCONST_SGL(0.0f);
910
911
25.5k
  startSample = firstSlotOffs * timeStep;
912
25.5k
  stopSample = pSettings->nCols + lastSlotOffs * timeStep;
913
914
25.5k
  inverseFilteringLevelEmphasis(hLppTrans, nInvfBands, sbr_invf_mode,
915
25.5k
                                sbr_invf_mode_prev, bwVector);
916
917
25.5k
  stopSampleClear = stopSample;
918
919
25.5k
  autoCorrLength = pSettings->nCols + pSettings->overlap;
920
921
25.5k
  if (pSettings->noOfPatches > 0) {
922
    /* Set upper subbands to zero:
923
       This is required in case that the patches do not cover the complete
924
       highband (because the last patch would be too short). Possible
925
       optimization: Clearing bands up to usb would be sufficient here. */
926
25.5k
    int targetStopBand =
927
25.5k
        patchParam[pSettings->noOfPatches - 1].targetStartBand +
928
25.5k
        patchParam[pSettings->noOfPatches - 1].numBandsInPatch;
929
930
25.5k
    int memSize = ((64) - targetStopBand) * sizeof(FIXP_DBL);
931
932
1.21M
    for (i = startSample; i < stopSampleClear; i++) {
933
1.18M
      FDKmemclear(&qmfBufferReal[i][targetStopBand], memSize);
934
1.18M
      FDKmemclear(&qmfBufferImag[i][targetStopBand], memSize);
935
1.18M
    }
936
25.5k
  }
937
#if defined __ANDROID__ && !defined __ANDROID_NDK__
938
  else {
939
    // Safetynet logging
940
    android_errorWriteLog(0x534e4554, "112160868");
941
  }
942
#endif
943
944
  /*
945
  Calc common low band scale factor
946
  */
947
25.5k
  comBandScale = sbrScaleFactor->hb_scale;
948
949
25.5k
  ovLowBandShift = sbrScaleFactor->hb_scale - comBandScale;
950
25.5k
  lowBandShift = sbrScaleFactor->hb_scale - comBandScale;
951
  /*  ovHighBandShift = firstSlotOffs == 0 ? ovLowBandShift:0;*/
952
953
  /* outer loop over bands to do analysis only once for each band */
954
955
25.5k
  start = hQmfTransposer->startBand;
956
25.5k
  stop = hQmfTransposer->stopBand;
957
958
907k
  for (loBand = start; loBand < stop; loBand++) {
959
882k
    bwIndex = 0;
960
961
882k
    FIXP_DBL lowBandReal[(((1024) / (32) * (4) / 2) + (3 * (4))) + LPC_ORDER];
962
882k
    FIXP_DBL lowBandImag[(((1024) / (32) * (4) / 2) + (3 * (4))) + LPC_ORDER];
963
964
882k
    int resetLPCCoeffs = 0;
965
882k
    int dynamicScale = DFRACT_BITS - 1 - LPC_SCALE_FACTOR;
966
882k
    int acDetScale = 0; /* scaling of autocorrelation determinant */
967
968
2.64M
    for (i = 0; i < LPC_ORDER; i++) {
969
1.76M
      lowBandReal[i] = hLppTrans->lpcFilterStatesRealHBE[i][loBand];
970
1.76M
      lowBandImag[i] = hLppTrans->lpcFilterStatesImagHBE[i][loBand];
971
1.76M
    }
972
973
2.00M
    for (; i < LPC_ORDER + firstSlotOffs * timeStep; i++) {
974
1.11M
      lowBandReal[i] = hLppTrans->lpcFilterStatesRealHBE[i][loBand];
975
1.11M
      lowBandImag[i] = hLppTrans->lpcFilterStatesImagHBE[i][loBand];
976
1.11M
    }
977
978
    /*
979
    Take old slope length qmf slot source values out of (overlap)qmf buffer
980
    */
981
882k
    for (i = firstSlotOffs * timeStep;
982
44.4M
         i < pSettings->nCols + pSettings->overlap; i++) {
983
43.6M
      lowBandReal[i + LPC_ORDER] = qmfBufferReal[i][loBand];
984
43.6M
      lowBandImag[i + LPC_ORDER] = qmfBufferImag[i][loBand];
985
43.6M
    }
986
987
    /* store unmodified values to buffer */
988
9.71M
    for (i = 0; i < LPC_ORDER + pSettings->overlap; i++) {
989
8.82M
      hLppTrans->lpcFilterStatesRealHBE[i][loBand] =
990
8.82M
          qmfBufferReal[pSettings->nCols - LPC_ORDER + i][loBand];
991
8.82M
      hLppTrans->lpcFilterStatesImagHBE[i][loBand] =
992
8.82M
          qmfBufferImag[pSettings->nCols - LPC_ORDER + i][loBand];
993
8.82M
    }
994
995
    /*
996
    Determine dynamic scaling value.
997
    */
998
882k
    dynamicScale =
999
882k
        fixMin(dynamicScale,
1000
882k
               getScalefactor(lowBandReal, LPC_ORDER + pSettings->overlap) +
1001
882k
                   ovLowBandShift);
1002
882k
    dynamicScale =
1003
882k
        fixMin(dynamicScale,
1004
882k
               getScalefactor(&lowBandReal[LPC_ORDER + pSettings->overlap],
1005
882k
                              pSettings->nCols) +
1006
882k
                   lowBandShift);
1007
882k
    dynamicScale =
1008
882k
        fixMin(dynamicScale,
1009
882k
               getScalefactor(lowBandImag, LPC_ORDER + pSettings->overlap) +
1010
882k
                   ovLowBandShift);
1011
882k
    dynamicScale =
1012
882k
        fixMin(dynamicScale,
1013
882k
               getScalefactor(&lowBandImag[LPC_ORDER + pSettings->overlap],
1014
882k
                              pSettings->nCols) +
1015
882k
                   lowBandShift);
1016
1017
882k
    dynamicScale =
1018
882k
        dynamicScale - 1; /* one additional bit headroom to prevent -1.0 */
1019
1020
    /*
1021
    Scale temporal QMF buffer.
1022
    */
1023
882k
    scaleValues(&lowBandReal[0], LPC_ORDER + pSettings->overlap,
1024
882k
                dynamicScale - ovLowBandShift);
1025
882k
    scaleValues(&lowBandReal[LPC_ORDER + pSettings->overlap], pSettings->nCols,
1026
882k
                dynamicScale - lowBandShift);
1027
882k
    scaleValues(&lowBandImag[0], LPC_ORDER + pSettings->overlap,
1028
882k
                dynamicScale - ovLowBandShift);
1029
882k
    scaleValues(&lowBandImag[LPC_ORDER + pSettings->overlap], pSettings->nCols,
1030
882k
                dynamicScale - lowBandShift);
1031
1032
882k
    acDetScale += autoCorr2nd_cplx(&ac, lowBandReal + LPC_ORDER,
1033
882k
                                   lowBandImag + LPC_ORDER, autoCorrLength);
1034
1035
    /* Examine dynamic of determinant in autocorrelation. */
1036
882k
    acDetScale += 2 * (comBandScale + dynamicScale);
1037
882k
    acDetScale *= 2;            /* two times reflection coefficent scaling */
1038
882k
    acDetScale += ac.det_scale; /* ac scaling of determinant */
1039
1040
    /* In case of determinant < 10^-38, resetLPCCoeffs=1 has to be enforced. */
1041
882k
    if (acDetScale > 126) {
1042
362k
      resetLPCCoeffs = 1;
1043
362k
    }
1044
1045
882k
    alphar[1] = FL2FXCONST_SGL(0.0f);
1046
882k
    alphai[1] = FL2FXCONST_SGL(0.0f);
1047
1048
882k
    if (ac.det != FL2FXCONST_DBL(0.0f)) {
1049
517k
      FIXP_DBL tmp, absTmp, absDet;
1050
1051
517k
      absDet = fixp_abs(ac.det);
1052
1053
517k
      tmp = (fMultDiv2(ac.r01r, ac.r12r) >> (LPC_SCALE_FACTOR - 1)) -
1054
517k
            ((fMultDiv2(ac.r01i, ac.r12i) + fMultDiv2(ac.r02r, ac.r11r)) >>
1055
517k
             (LPC_SCALE_FACTOR - 1));
1056
517k
      absTmp = fixp_abs(tmp);
1057
1058
      /*
1059
      Quick check: is first filter coeff >= 1(4)
1060
      */
1061
517k
      {
1062
517k
        INT scale;
1063
517k
        FIXP_DBL result = fDivNorm(absTmp, absDet, &scale);
1064
517k
        scale = scale + ac.det_scale;
1065
1066
517k
        if ((scale > 0) && (result >= (FIXP_DBL)MAXVAL_DBL >> scale)) {
1067
22.9k
          resetLPCCoeffs = 1;
1068
494k
        } else {
1069
494k
          alphar[1] = FX_DBL2FX_SGL(scaleValueSaturate(result, scale));
1070
494k
          if ((tmp < FL2FX_DBL(0.0f)) ^ (ac.det < FL2FX_DBL(0.0f))) {
1071
325k
            alphar[1] = -alphar[1];
1072
325k
          }
1073
494k
        }
1074
517k
      }
1075
1076
517k
      tmp = (fMultDiv2(ac.r01i, ac.r12r) >> (LPC_SCALE_FACTOR - 1)) +
1077
517k
            ((fMultDiv2(ac.r01r, ac.r12i) -
1078
517k
              (FIXP_DBL)fMultDiv2(ac.r02i, ac.r11r)) >>
1079
517k
             (LPC_SCALE_FACTOR - 1));
1080
1081
517k
      absTmp = fixp_abs(tmp);
1082
1083
      /*
1084
      Quick check: is second filter coeff >= 1(4)
1085
      */
1086
517k
      {
1087
517k
        INT scale;
1088
517k
        FIXP_DBL result = fDivNorm(absTmp, absDet, &scale);
1089
517k
        scale = scale + ac.det_scale;
1090
1091
517k
        if ((scale > 0) &&
1092
37.7k
            (result >= /*FL2FXCONST_DBL(1.f)*/ (FIXP_DBL)MAXVAL_DBL >> scale)) {
1093
22.9k
          resetLPCCoeffs = 1;
1094
494k
        } else {
1095
494k
          alphai[1] = FX_DBL2FX_SGL(scaleValueSaturate(result, scale));
1096
494k
          if ((tmp < FL2FX_DBL(0.0f)) ^ (ac.det < FL2FX_DBL(0.0f))) {
1097
230k
            alphai[1] = -alphai[1];
1098
230k
          }
1099
494k
        }
1100
517k
      }
1101
517k
    }
1102
1103
882k
    alphar[0] = FL2FXCONST_SGL(0.0f);
1104
882k
    alphai[0] = FL2FXCONST_SGL(0.0f);
1105
1106
882k
    if (ac.r11r != FL2FXCONST_DBL(0.0f)) {
1107
      /* ac.r11r is always >=0 */
1108
518k
      FIXP_DBL tmp, absTmp;
1109
1110
518k
      tmp = (ac.r01r >> (LPC_SCALE_FACTOR + 1)) +
1111
518k
            (fMultDiv2(alphar[1], ac.r12r) + fMultDiv2(alphai[1], ac.r12i));
1112
1113
518k
      absTmp = fixp_abs(tmp);
1114
1115
      /*
1116
      Quick check: is first filter coeff >= 1(4)
1117
      */
1118
1119
518k
      if (absTmp >= (ac.r11r >> 1)) {
1120
1.17k
        resetLPCCoeffs = 1;
1121
517k
      } else {
1122
517k
        INT scale;
1123
517k
        FIXP_DBL result = fDivNorm(absTmp, fixp_abs(ac.r11r), &scale);
1124
517k
        alphar[0] = FX_DBL2FX_SGL(scaleValueSaturate(result, scale + 1));
1125
1126
517k
        if ((tmp > FL2FX_DBL(0.0f)) ^ (ac.r11r < FL2FX_DBL(0.0f)))
1127
338k
          alphar[0] = -alphar[0];
1128
517k
      }
1129
1130
518k
      tmp = (ac.r01i >> (LPC_SCALE_FACTOR + 1)) +
1131
518k
            (fMultDiv2(alphai[1], ac.r12r) - fMultDiv2(alphar[1], ac.r12i));
1132
1133
518k
      absTmp = fixp_abs(tmp);
1134
1135
      /*
1136
      Quick check: is second filter coeff >= 1(4)
1137
      */
1138
518k
      if (absTmp >= (ac.r11r >> 1)) {
1139
2.28k
        resetLPCCoeffs = 1;
1140
516k
      } else {
1141
516k
        INT scale;
1142
516k
        FIXP_DBL result = fDivNorm(absTmp, fixp_abs(ac.r11r), &scale);
1143
516k
        alphai[0] = FX_DBL2FX_SGL(scaleValueSaturate(result, scale + 1));
1144
516k
        if ((tmp > FL2FX_DBL(0.0f)) ^ (ac.r11r < FL2FX_DBL(0.0f))) {
1145
258k
          alphai[0] = -alphai[0];
1146
258k
        }
1147
516k
      }
1148
518k
    }
1149
1150
    /* Now check the quadratic criteria */
1151
882k
    if ((fMultDiv2(alphar[0], alphar[0]) + fMultDiv2(alphai[0], alphai[0])) >=
1152
882k
        FL2FXCONST_DBL(0.5f)) {
1153
1.10k
      resetLPCCoeffs = 1;
1154
1.10k
    }
1155
882k
    if ((fMultDiv2(alphar[1], alphar[1]) + fMultDiv2(alphai[1], alphai[1])) >=
1156
882k
        FL2FXCONST_DBL(0.5f)) {
1157
4.45k
      resetLPCCoeffs = 1;
1158
4.45k
    }
1159
1160
882k
    if (resetLPCCoeffs) {
1161
404k
      alphar[0] = FL2FXCONST_SGL(0.0f);
1162
404k
      alphar[1] = FL2FXCONST_SGL(0.0f);
1163
404k
      alphai[0] = FL2FXCONST_SGL(0.0f);
1164
404k
      alphai[1] = FL2FXCONST_SGL(0.0f);
1165
404k
    }
1166
1167
2.63M
    while (bwIndex < MAX_NUM_PATCHES - 1 &&
1168
2.63M
           loBand >= pSettings->bwBorders[bwIndex]) {
1169
1.75M
      bwIndex++;
1170
1.75M
    }
1171
1172
    /*
1173
    Filter Step 2: add the left slope with the current filter to the buffer
1174
    pure source values are already in there
1175
    */
1176
882k
    bw = FX_DBL2FX_SGL(bwVector[bwIndex]);
1177
1178
882k
    a0r = FX_DBL2FX_SGL(
1179
882k
        fMult(bw, alphar[0])); /* Apply current bandwidth expansion factor */
1180
882k
    a0i = FX_DBL2FX_SGL(fMult(bw, alphai[0]));
1181
882k
    bw = FX_DBL2FX_SGL(fPow2(bw));
1182
882k
    a1r = FX_DBL2FX_SGL(fMult(bw, alphar[1]));
1183
882k
    a1i = FX_DBL2FX_SGL(fMult(bw, alphai[1]));
1184
1185
    /*
1186
    Filter Step 3: insert the middle part which won't be windowed
1187
    */
1188
882k
    if (bw <= FL2FXCONST_SGL(0.0f)) {
1189
638k
      int descale = fixMin(DFRACT_BITS - 1, (LPC_SCALE_FACTOR + dynamicScale));
1190
24.7M
      for (i = startSample; i < stopSample; i++) {
1191
24.1M
        qmfBufferReal[i][loBand] = lowBandReal[LPC_ORDER + i] >> descale;
1192
24.1M
        qmfBufferImag[i][loBand] = lowBandImag[LPC_ORDER + i] >> descale;
1193
24.1M
      }
1194
638k
    } else { /* bw <= 0 */
1195
1196
243k
      int descale = fixMin(DFRACT_BITS - 1, (LPC_SCALE_FACTOR + dynamicScale));
1197
243k
      dynamicScale +=
1198
243k
          1; /* prevent negativ scale factor due to 'one additional bit
1199
                headroom' */
1200
1201
13.0M
      for (i = startSample; i < stopSample; i++) {
1202
12.8M
        FIXP_DBL accu1, accu2;
1203
1204
12.8M
        accu1 = (fMultDiv2(a0r, lowBandReal[LPC_ORDER + i - 1]) -
1205
12.8M
                 fMultDiv2(a0i, lowBandImag[LPC_ORDER + i - 1]) +
1206
12.8M
                 fMultDiv2(a1r, lowBandReal[LPC_ORDER + i - 2]) -
1207
12.8M
                 fMultDiv2(a1i, lowBandImag[LPC_ORDER + i - 2])) >>
1208
12.8M
                dynamicScale;
1209
12.8M
        accu2 = (fMultDiv2(a0i, lowBandReal[LPC_ORDER + i - 1]) +
1210
12.8M
                 fMultDiv2(a0r, lowBandImag[LPC_ORDER + i - 1]) +
1211
12.8M
                 fMultDiv2(a1i, lowBandReal[LPC_ORDER + i - 2]) +
1212
12.8M
                 fMultDiv2(a1r, lowBandImag[LPC_ORDER + i - 2])) >>
1213
12.8M
                dynamicScale;
1214
1215
12.8M
        qmfBufferReal[i][loBand] =
1216
12.8M
            (lowBandReal[LPC_ORDER + i] >> descale) + (accu1 << (1 + 1));
1217
12.8M
        qmfBufferImag[i][loBand] =
1218
12.8M
            (lowBandImag[LPC_ORDER + i] >> descale) + (accu2 << (1 + 1));
1219
12.8M
      }
1220
243k
    } /* bw <= 0 */
1221
1222
    /*
1223
     * store the unmodified filter coefficients if there is
1224
     * an overlapping envelope
1225
     *****************************************************************/
1226
1227
882k
  } /* outer loop over bands (loBand) */
1228
1229
104k
  for (i = 0; i < nInvfBands; i++) {
1230
79.1k
    hLppTrans->bwVectorOld[i] = bwVector[i];
1231
79.1k
  }
1232
1233
  /*
1234
  set high band scale factor
1235
  */
1236
25.5k
  sbrScaleFactor->hb_scale = comBandScale - (LPC_SCALE_FACTOR);
1237
25.5k
}
1238
1239
/*!
1240
 *
1241
 * \brief Initialize one low power transposer instance
1242
 *
1243
 *
1244
 */
1245
SBR_ERROR
1246
createLppTransposer(
1247
    HANDLE_SBR_LPP_TRANS hs,        /*!< Handle of low power transposer  */
1248
    TRANSPOSER_SETTINGS *pSettings, /*!< Pointer to settings */
1249
    const int highBandStartSb,      /*!< ? */
1250
    UCHAR *v_k_master,              /*!< Master table */
1251
    const int numMaster,            /*!< Valid entries in master table */
1252
    const int usb,                  /*!< Highband area stop subband */
1253
    const int timeSlots,            /*!< Number of time slots */
1254
    const int nCols,                /*!< Number of colums (codec qmf bank) */
1255
    UCHAR *noiseBandTable,  /*!< Mapping of SBR noise bands to QMF bands */
1256
    const int noNoiseBands, /*!< Number of noise bands */
1257
    UINT fs,                /*!< Sample Frequency */
1258
    const int chan,         /*!< Channel number */
1259
186k
    const int overlap) {
1260
  /* FB inverse filtering settings */
1261
186k
  hs->pSettings = pSettings;
1262
1263
186k
  pSettings->nCols = nCols;
1264
186k
  pSettings->overlap = overlap;
1265
1266
186k
  switch (timeSlots) {
1267
95.1k
    case 15:
1268
186k
    case 16:
1269
186k
      break;
1270
1271
0
    default:
1272
0
      return SBRDEC_UNSUPPORTED_CONFIG; /* Unimplemented */
1273
186k
  }
1274
1275
186k
  if (chan == 0) {
1276
    /* Init common data only once */
1277
119k
    hs->pSettings->nCols = nCols;
1278
1279
119k
    return resetLppTransposer(hs, highBandStartSb, v_k_master, numMaster,
1280
119k
                              noiseBandTable, noNoiseBands, usb, fs);
1281
119k
  }
1282
66.8k
  return SBRDEC_OK;
1283
186k
}
1284
1285
static int findClosestEntry(UCHAR goalSb, UCHAR *v_k_master, UCHAR numMaster,
1286
586k
                            UCHAR direction) {
1287
586k
  int index;
1288
1289
586k
  if (goalSb <= v_k_master[0]) return v_k_master[0];
1290
1291
564k
  if (goalSb >= v_k_master[numMaster]) return v_k_master[numMaster];
1292
1293
287k
  if (direction) {
1294
13.0k
    index = 0;
1295
152k
    while (v_k_master[index] < goalSb) {
1296
139k
      index++;
1297
139k
    }
1298
274k
  } else {
1299
274k
    index = numMaster;
1300
1.52M
    while (v_k_master[index] > goalSb) {
1301
1.24M
      index--;
1302
1.24M
    }
1303
274k
  }
1304
1305
287k
  return v_k_master[index];
1306
564k
}
1307
1308
/*!
1309
 *
1310
 * \brief Reset memory for one lpp transposer instance
1311
 *
1312
 * \return SBRDEC_OK on success, SBRDEC_UNSUPPORTED_CONFIG on error
1313
 */
1314
SBR_ERROR
1315
resetLppTransposer(
1316
    HANDLE_SBR_LPP_TRANS hLppTrans, /*!< Handle of lpp transposer  */
1317
    UCHAR highBandStartSb,          /*!< High band area: start subband */
1318
    UCHAR *v_k_master,              /*!< Master table */
1319
    UCHAR numMaster,                /*!< Valid entries in master table */
1320
    UCHAR *noiseBandTable, /*!< Mapping of SBR noise bands to QMF bands */
1321
    UCHAR noNoiseBands,    /*!< Number of noise bands */
1322
    UCHAR usb,             /*!< High band area: stop subband */
1323
    UINT fs                /*!< SBR output sampling frequency */
1324
307k
) {
1325
307k
  TRANSPOSER_SETTINGS *pSettings = hLppTrans->pSettings;
1326
307k
  PATCH_PARAM *patchParam = pSettings->patchParam;
1327
1328
307k
  int i, patch;
1329
307k
  int targetStopBand;
1330
307k
  int sourceStartBand;
1331
307k
  int patchDistance;
1332
307k
  int numBandsInPatch;
1333
1334
307k
  int lsb = v_k_master[0]; /* Start subband expressed in "non-critical" sampling
1335
                              terms*/
1336
307k
  int xoverOffset = highBandStartSb -
1337
307k
                    lsb; /* Calculate distance in QMF bands between k0 and kx */
1338
307k
  int startFreqHz;
1339
1340
307k
  int desiredBorder;
1341
1342
307k
  usb = fixMin(usb, v_k_master[numMaster]); /* Avoid endless loops (compare with
1343
                                               float code). */
1344
1345
  /*
1346
   * Plausibility check
1347
   */
1348
1349
307k
  if (pSettings->nCols == 64) {
1350
22.6k
    if (lsb < 4) {
1351
      /* 4:1 SBR Requirement k0 >= 4 missed! */
1352
41
      return SBRDEC_UNSUPPORTED_CONFIG;
1353
41
    }
1354
284k
  } else if (lsb - SHIFT_START_SB < 4) {
1355
164
    return SBRDEC_UNSUPPORTED_CONFIG;
1356
164
  }
1357
1358
  /*
1359
   * Initialize the patching parameter
1360
   */
1361
  /* ISO/IEC 14496-3 (Figure 4.48): goalSb = round( 2.048e6 / fs ) */
1362
307k
  desiredBorder = (((2048000 * 2) / fs) + 1) >> 1;
1363
1364
307k
  desiredBorder = findClosestEntry(desiredBorder, v_k_master, numMaster,
1365
307k
                                   1); /* Adapt region to master-table */
1366
1367
  /* First patch */
1368
307k
  sourceStartBand = SHIFT_START_SB + xoverOffset;
1369
307k
  targetStopBand = lsb + xoverOffset; /* upperBand */
1370
1371
  /* Even (odd) numbered channel must be patched to even (odd) numbered channel
1372
   */
1373
307k
  patch = 0;
1374
836k
  while (targetStopBand < usb) {
1375
    /* Too many patches?
1376
       Allow MAX_NUM_PATCHES+1 patches here.
1377
       we need to check later again, since patch might be the highest patch
1378
       AND contain less than 3 bands => actual number of patches will be reduced
1379
       by 1.
1380
    */
1381
530k
    if (patch > MAX_NUM_PATCHES) {
1382
125
      return SBRDEC_UNSUPPORTED_CONFIG;
1383
125
    }
1384
1385
529k
    patchParam[patch].guardStartBand = targetStopBand;
1386
529k
    patchParam[patch].targetStartBand = targetStopBand;
1387
1388
529k
    numBandsInPatch =
1389
529k
        desiredBorder - targetStopBand; /* Get the desired range of the patch */
1390
1391
529k
    if (numBandsInPatch >= lsb - sourceStartBand) {
1392
      /* Desired number bands are not available -> patch whole source range */
1393
279k
      patchDistance =
1394
279k
          targetStopBand - sourceStartBand; /* Get the targetOffset */
1395
279k
      patchDistance =
1396
279k
          patchDistance & ~1; /* Rounding off odd numbers and make all even */
1397
279k
      numBandsInPatch =
1398
279k
          lsb - (targetStopBand -
1399
279k
                 patchDistance); /* Update number of bands to be patched */
1400
279k
      numBandsInPatch = findClosestEntry(targetStopBand + numBandsInPatch,
1401
279k
                                         v_k_master, numMaster, 0) -
1402
279k
                        targetStopBand; /* Adapt region to master-table */
1403
279k
    }
1404
1405
529k
    if (pSettings->nCols == 64) {
1406
57.3k
      if (numBandsInPatch == 0 && sourceStartBand == SHIFT_START_SB) {
1407
132
        return SBRDEC_UNSUPPORTED_CONFIG;
1408
132
      }
1409
57.3k
    }
1410
1411
    /* Desired number bands are available -> get the minimal even patching
1412
     * distance */
1413
529k
    patchDistance =
1414
529k
        numBandsInPatch + targetStopBand - lsb; /* Get minimal distance */
1415
529k
    patchDistance = (patchDistance + 1) &
1416
529k
                    ~1; /* Rounding up odd numbers and make all even */
1417
1418
529k
    if (numBandsInPatch > 0) {
1419
505k
      patchParam[patch].sourceStartBand = targetStopBand - patchDistance;
1420
505k
      patchParam[patch].targetBandOffs = patchDistance;
1421
505k
      patchParam[patch].numBandsInPatch = numBandsInPatch;
1422
505k
      patchParam[patch].sourceStopBand =
1423
505k
          patchParam[patch].sourceStartBand + numBandsInPatch;
1424
1425
505k
      targetStopBand += patchParam[patch].numBandsInPatch;
1426
505k
      patch++;
1427
505k
    }
1428
1429
    /* All patches but first */
1430
529k
    sourceStartBand = SHIFT_START_SB;
1431
1432
    /* Check if we are close to desiredBorder */
1433
529k
    if (desiredBorder - targetStopBand < 3) /* MPEG doc */
1434
277k
    {
1435
277k
      desiredBorder = usb;
1436
277k
    }
1437
529k
  }
1438
1439
306k
  patch--;
1440
1441
  /* If highest patch contains less than three subband: skip it */
1442
306k
  if ((patch > 0) && (patchParam[patch].numBandsInPatch < 3)) {
1443
21.1k
    patch--;
1444
21.1k
    targetStopBand =
1445
21.1k
        patchParam[patch].targetStartBand + patchParam[patch].numBandsInPatch;
1446
21.1k
  }
1447
1448
  /* now check if we don't have one too many */
1449
306k
  if (patch >= MAX_NUM_PATCHES) {
1450
1.52k
    return SBRDEC_UNSUPPORTED_CONFIG;
1451
1.52k
  }
1452
1453
305k
  pSettings->noOfPatches = patch + 1;
1454
1455
  /* Check lowest and highest source subband */
1456
305k
  pSettings->lbStartPatching = targetStopBand;
1457
305k
  pSettings->lbStopPatching = 0;
1458
777k
  for (patch = 0; patch < pSettings->noOfPatches; patch++) {
1459
472k
    pSettings->lbStartPatching =
1460
472k
        fixMin(pSettings->lbStartPatching, patchParam[patch].sourceStartBand);
1461
472k
    pSettings->lbStopPatching =
1462
472k
        fixMax(pSettings->lbStopPatching, patchParam[patch].sourceStopBand);
1463
472k
  }
1464
1465
999k
  for (i = 0; i < noNoiseBands; i++) {
1466
694k
    pSettings->bwBorders[i] = noiseBandTable[i + 1];
1467
694k
  }
1468
2.66M
  for (; i < MAX_NUM_NOISE_VALUES; i++) {
1469
2.36M
    pSettings->bwBorders[i] = 255;
1470
2.36M
  }
1471
1472
  /*
1473
   * Choose whitening factors
1474
   */
1475
1476
305k
  startFreqHz =
1477
305k
      ((lsb + xoverOffset) * fs) >> 7; /* Shift does a division by 2*(64) */
1478
1479
928k
  for (i = 1; i < NUM_WHFACTOR_TABLE_ENTRIES; i++) {
1480
878k
    if (startFreqHz < FDK_sbrDecoder_sbr_whFactorsIndex[i]) break;
1481
878k
  }
1482
305k
  i--;
1483
1484
305k
  pSettings->whFactors.off = FDK_sbrDecoder_sbr_whFactorsTable[i][0];
1485
305k
  pSettings->whFactors.transitionLevel =
1486
305k
      FDK_sbrDecoder_sbr_whFactorsTable[i][1];
1487
305k
  pSettings->whFactors.lowLevel = FDK_sbrDecoder_sbr_whFactorsTable[i][2];
1488
305k
  pSettings->whFactors.midLevel = FDK_sbrDecoder_sbr_whFactorsTable[i][3];
1489
305k
  pSettings->whFactors.highLevel = FDK_sbrDecoder_sbr_whFactorsTable[i][4];
1490
1491
305k
  return SBRDEC_OK;
1492
306k
}