Coverage Report

Created: 2026-10-17 06:51

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/aac/libAACdec/src/usacdec_lpd.cpp
Line
Count
Source
1
/* -----------------------------------------------------------------------------
2
Software License for The Fraunhofer FDK AAC Codec Library for Android
3
4
© Copyright  1995 - 2019 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
/**************************** AAC decoder library ******************************
96
97
   Author(s):   Manuel Jander
98
99
   Description: USAC Linear Prediction Domain coding
100
101
*******************************************************************************/
102
103
#include "usacdec_lpd.h"
104
105
#include "usacdec_rom.h"
106
#include "usacdec_fac.h"
107
#include "usacdec_lpc.h"
108
#include "FDK_tools_rom.h"
109
#include "fft.h"
110
#include "mdct.h"
111
#include "usacdec_acelp.h"
112
#include "overlapadd.h"
113
114
#include "conceal.h"
115
116
#include "block.h"
117
118
28.2M
#define SF_PITCH_TRACK 6
119
#define SF_GAIN 3
120
#define MIN_VAL FL2FXCONST_DBL(0.0f)
121
#define MAX_VAL (FIXP_DBL) MAXVAL_DBL
122
123
#include "ac_arith_coder.h"
124
125
void filtLP(const FIXP_DBL *syn, PCM_DEC *syn_out, FIXP_DBL *noise,
126
            const FIXP_SGL *filt, const INT aacOutDataHeadroom, INT stop,
127
1.09M
            int len) {
128
1.09M
  INT i, j;
129
1.09M
  FIXP_DBL tmp;
130
131
1.09M
  FDK_ASSERT((aacOutDataHeadroom - 1) >= -(MDCT_OUTPUT_SCALE));
132
133
71.4M
  for (i = 0; i < stop; i++) {
134
70.3M
    tmp = fMultDiv2(noise[i], filt[0]);  // Filt in Q-1.16
135
914M
    for (j = 1; j <= len; j++) {
136
844M
      tmp += fMult((noise[i - j] >> 1) + (noise[i + j] >> 1), filt[j]);
137
844M
    }
138
70.3M
    syn_out[i] = (PCM_DEC)(
139
70.3M
        IMDCT_SCALE((syn[i] >> 1) - (tmp >> 1), aacOutDataHeadroom - 1));
140
70.3M
  }
141
1.09M
}
142
143
void bass_pf_1sf_delay(
144
    FIXP_DBL *syn,   /* (i) : 12.8kHz synthesis to postfilter              */
145
    const INT *T_sf, /* (i) : Pitch period for all subframes (T_sf[16])    */
146
    FIXP_DBL *pit_gain,
147
    const int frame_length, /* (i) : frame length (should be 768|1024) */
148
    const INT l_frame,
149
    const INT l_next,   /* (i) : look ahead for symmetric filtering           */
150
    PCM_DEC *synth_out, /* (o) : filtered synthesis (with delay of 1 subfr)   */
151
    const INT aacOutDataHeadroom, /* (i) : headroom of the output time signal to
152
                                     prevent clipping */
153
    FIXP_DBL mem_bpf[]) /* i/o : memory state [L_FILT+L_SUBFR]                */
154
87.0k
{
155
87.0k
  INT i, sf, i_subfr, T, T2, lg;
156
157
87.0k
  FIXP_DBL tmp, ener, corr, gain;
158
87.0k
  FIXP_DBL *noise, *noise_in;
159
87.0k
  FIXP_DBL
160
87.0k
  noise_buf[L_FILT + (2 * L_SUBFR)];  // L_FILT = 12, L_SUBFR = 64 => 140
161
87.0k
  const FIXP_DBL *x, *y;
162
163
87.0k
  {
164
87.0k
    noise = noise_buf + L_FILT;  // L_FILT = 12 delay of upsampling filter
165
87.0k
    noise_in = noise_buf + L_FILT + L_SUBFR;
166
    /* Input scaling of the BPF memory */
167
87.0k
    scaleValues(mem_bpf, (L_FILT + L_SUBFR), 1);
168
87.0k
  }
169
170
87.0k
  int gain_exp = 17;
171
172
87.0k
  sf = 0;
173
1.18M
  for (i_subfr = 0; i_subfr < l_frame; i_subfr += L_SUBFR, sf++) {
174
1.09M
    T = T_sf[sf];
175
1.09M
    gain = pit_gain[sf];
176
177
    /* Gain is in Q17.14 */
178
    /* If gain > 1 set to 1 */
179
1.09M
    if (gain > (FIXP_DBL)(1 << 14)) gain = (FIXP_DBL)(1 << 14);
180
181
    /* If gain < 0 set to 0 */
182
1.09M
    if (gain < (FIXP_DBL)0) gain = (FIXP_DBL)0;
183
184
1.09M
    if (gain > (FIXP_DBL)0) {
185
      /* pitch tracker: test pitch/2 to avoid continuous pitch doubling */
186
      /* Note: pitch is limited to PIT_MIN (34 = 376Hz) at the encoder  */
187
221k
      T2 = T >> 1;
188
221k
      x = &syn[i_subfr - L_EXTRA];
189
221k
      y = &syn[i_subfr - T2 - L_EXTRA];
190
191
221k
      ener = (FIXP_DBL)0;
192
221k
      corr = (FIXP_DBL)0;
193
221k
      tmp = (FIXP_DBL)0;
194
195
221k
      int headroom_x = getScalefactor(x, L_SUBFR + L_EXTRA);
196
221k
      int headroom_y = getScalefactor(y, L_SUBFR + L_EXTRA);
197
198
221k
      int width_shift = 7;
199
200
35.6M
      for (i = 0; i < (L_SUBFR + L_EXTRA); i++) {
201
35.4M
        ener += fPow2Div2((x[i] << headroom_x)) >> width_shift;
202
35.4M
        corr += fMultDiv2((x[i] << headroom_x), (y[i] << headroom_y)) >>
203
35.4M
                width_shift;
204
35.4M
        tmp += fPow2Div2((y[i] << headroom_y)) >> width_shift;
205
35.4M
      }
206
207
221k
      int exp_ener = ((17 - headroom_x) << 1) + width_shift + 1;
208
221k
      int exp_corr = (17 - headroom_x) + (17 - headroom_y) + width_shift + 1;
209
221k
      int exp_tmp = ((17 - headroom_y) << 1) + width_shift + 1;
210
211
      /* Add 0.01 to "ener". Adjust exponents */
212
221k
      FIXP_DBL point_zero_one = (FIXP_DBL)0x51eb851f; /* In Q-6.37 */
213
221k
      int diff;
214
221k
      ener = fAddNorm(ener, exp_ener, point_zero_one, -6, &exp_ener);
215
221k
      corr = fAddNorm(corr, exp_corr, point_zero_one, -6, &exp_corr);
216
221k
      tmp = fAddNorm(tmp, exp_tmp, point_zero_one, -6, &exp_tmp);
217
218
      /* use T2 if normalized correlation > 0.95 */
219
221k
      INT s1, s2;
220
221k
      s1 = CntLeadingZeros(ener) - 1;
221
221k
      s2 = CntLeadingZeros(tmp) - 1;
222
223
221k
      FIXP_DBL ener_by_tmp = fMultDiv2(ener << s1, tmp << s2);
224
221k
      int ener_by_tmp_exp = (exp_ener - s1) + (exp_tmp - s2) + 1;
225
226
221k
      if (ener_by_tmp_exp & 1) {
227
129k
        ener_by_tmp <<= 1;
228
129k
        ener_by_tmp_exp -= 1;
229
129k
      }
230
231
221k
      int temp_exp = 0;
232
233
221k
      FIXP_DBL temp1 = invSqrtNorm2(ener_by_tmp, &temp_exp);
234
235
221k
      int temp1_exp = temp_exp - (ener_by_tmp_exp >> 1);
236
237
221k
      FIXP_DBL tmp_result = fMult(corr, temp1);
238
239
221k
      int tmp_result_exp = exp_corr + temp1_exp;
240
241
221k
      diff = tmp_result_exp - 0;
242
221k
      FIXP_DBL point95 = FL2FXCONST_DBL(0.95f);
243
221k
      if (diff >= 0) {
244
106k
        diff = fMin(diff, 31);
245
106k
        point95 = FL2FXCONST_DBL(0.95f) >> diff;
246
114k
      } else {
247
114k
        diff = fMax(diff, -31);
248
114k
        tmp_result >>= (-diff);
249
114k
      }
250
251
221k
      if (tmp_result > point95) T = T2;
252
253
      /* prevent that noise calculation below reaches into not defined signal
254
         parts at the end of the synth_buf or in other words restrict the below
255
         used index (i+i_subfr+T) < l_frame + l_next
256
      */
257
221k
      lg = l_frame + l_next - T - i_subfr;
258
259
221k
      if (lg > L_SUBFR)
260
220k
        lg = L_SUBFR;
261
705
      else if (lg < 0)
262
232
        lg = 0;
263
264
      /* limit gain to avoid problem on burst */
265
221k
      if (lg > 0) {
266
221k
        FIXP_DBL tmp1;
267
268
        /* max(lg) = 64 => scale with 6 bits minus 1 (fPow2Div2) */
269
270
221k
        s1 = getScalefactor(&syn[i_subfr], lg);
271
221k
        s2 = getScalefactor(&syn[i_subfr + T], lg);
272
221k
        INT s = fixMin(s1, s2);
273
274
221k
        tmp = (FIXP_DBL)0;
275
221k
        ener = (FIXP_DBL)0;
276
14.3M
        for (i = 0; i < lg; i++) {
277
14.1M
          tmp += fPow2Div2(syn[i + i_subfr] << s1) >> (SF_PITCH_TRACK);
278
14.1M
          ener += fPow2Div2(syn[i + i_subfr + T] << s2) >> (SF_PITCH_TRACK);
279
14.1M
        }
280
221k
        tmp = tmp >> fMin(DFRACT_BITS - 1, (2 * (s1 - s)));
281
221k
        ener = ener >> fMin(DFRACT_BITS - 1, (2 * (s2 - s)));
282
283
        /* error robustness: for the specific case syn[...] == -1.0f for all 64
284
           samples ener or tmp might overflow and become negative. For all sane
285
           cases we have enough headroom.
286
        */
287
221k
        if (ener <= (FIXP_DBL)0) {
288
14.9k
          ener = (FIXP_DBL)1;
289
14.9k
        }
290
221k
        if (tmp <= (FIXP_DBL)0) {
291
893
          tmp = (FIXP_DBL)1;
292
893
        }
293
221k
        FDK_ASSERT(ener > (FIXP_DBL)0);
294
295
        /* tmp = sqrt(tmp/ener) */
296
221k
        int result_e = 0;
297
221k
        tmp1 = fDivNorm(tmp, ener, &result_e);
298
221k
        if (result_e & 1) {
299
123k
          tmp1 >>= 1;
300
123k
          result_e += 1;
301
123k
        }
302
221k
        tmp = sqrtFixp(tmp1);
303
221k
        result_e >>= 1;
304
305
221k
        gain_exp = 17;
306
307
221k
        diff = result_e - gain_exp;
308
309
221k
        FIXP_DBL gain1 = gain;
310
311
221k
        if (diff >= 0) {
312
0
          diff = fMin(diff, 31);
313
0
          gain1 >>= diff;
314
221k
        } else {
315
221k
          result_e += (-diff);
316
221k
          diff = fMax(diff, -31);
317
221k
          tmp >>= (-diff);
318
221k
        }
319
320
221k
        if (tmp < gain1) {
321
34.6k
          gain = tmp;
322
34.6k
          gain_exp = result_e;
323
34.6k
        }
324
221k
      }
325
326
      /* calculate noise based on voiced pitch */
327
      /* fMultDiv2() replaces weighting of gain with 0.5 */
328
221k
      diff = gain_exp - 17;
329
221k
      if (diff >= 0) {
330
221k
        gain <<= diff;
331
221k
      } else {
332
0
        gain >>= (-diff);
333
0
      }
334
335
221k
      s1 = CntLeadingZeros(gain) - 1;
336
221k
      s1 -= 16; /* Leading bits for SGL */
337
338
221k
      FIXP_SGL gainSGL = FX_DBL2FX_SGL(gain << 16);
339
340
221k
      gainSGL = gainSGL << s1;
341
342
221k
      {
343
14.3M
        for (i = 0; i < lg; i++) {
344
          /* scaled with SF_SYNTH + gain_sf + 1; composition of scalefactor 2:
345
           * one additional shift of syn values + fMult => fMultDiv2 */
346
14.1M
          noise_in[i] =
347
14.1M
              scaleValue(fMultDiv2(gainSGL, (syn[i + i_subfr] >> 1) -
348
14.1M
                                                (syn[i + i_subfr - T] >> 2) -
349
14.1M
                                                (syn[i + i_subfr + T] >> 2)),
350
14.1M
                         2 - s1);
351
14.1M
        }
352
353
253k
        for (i = lg; i < L_SUBFR; i++) {
354
          /* scaled with SF_SYNTH + gain_sf + 1; composition of scalefactor 2:
355
           * one additional shift of syn values + fMult => fMultDiv2 */
356
32.1k
          noise_in[i] =
357
32.1k
              scaleValue(fMultDiv2(gainSGL, (syn[i + i_subfr] >> 1) -
358
32.1k
                                                (syn[i + i_subfr - T] >> 1)),
359
32.1k
                         2 - s1);
360
32.1k
        }
361
221k
      }
362
877k
    } else {
363
877k
      FDKmemset(noise_in, (FIXP_DBL)0, L_SUBFR * sizeof(FIXP_DBL));
364
877k
    }
365
366
1.09M
    {
367
1.09M
      FDKmemcpy(noise_buf, mem_bpf, (L_FILT + L_SUBFR) * sizeof(FIXP_DBL));
368
369
1.09M
      FDKmemcpy(mem_bpf, noise_buf + L_SUBFR,
370
1.09M
                (L_FILT + L_SUBFR) * sizeof(FIXP_DBL));
371
1.09M
    }
372
373
    /* substract from voiced speech low-pass filtered noise */
374
    /* filter coefficients are scaled with factor SF_FILT_LP (1) */
375
376
1.09M
    {
377
1.09M
      filtLP(&syn[i_subfr - L_SUBFR], &synth_out[i_subfr], noise,
378
1.09M
             fdk_dec_filt_lp, aacOutDataHeadroom, L_SUBFR, L_FILT);
379
1.09M
    }
380
1.09M
  }
381
382
87.0k
  {
383
384
87.0k
  }
385
386
  // To be determined (info from Ben)
387
87.0k
  {
388
    /* Output scaling of the BPF memory */
389
87.0k
    scaleValues(mem_bpf, (L_FILT + L_SUBFR), -1);
390
    /* Copy the rest of the signal (after the fac) */
391
87.0k
    scaleValuesSaturate(
392
87.0k
        (PCM_DEC *)&synth_out[l_frame], (FIXP_DBL *)&syn[l_frame - L_SUBFR],
393
87.0k
        (frame_length - l_frame), MDCT_OUT_HEADROOM - aacOutDataHeadroom);
394
87.0k
  }
395
396
87.0k
  return;
397
87.0k
}
398
399
/*
400
 * Frequency Domain Noise Shaping
401
 */
402
403
/**
404
 * \brief Adaptive Low Frequencies Deemphasis of spectral coefficients.
405
 *
406
 * Ensure quantization of low frequencies in case where the
407
 * signal dynamic is higher than the LPC noise shaping.
408
 * This is the inverse operation of adap_low_freq_emph().
409
 * Output gain of all blocks.
410
 *
411
 * \param x pointer to the spectral coefficients, requires 1 bit headroom.
412
 * \param lg length of x.
413
 * \param bUseNewAlfe if set, apply ALFD for fullband lpd.
414
 * \param gainLpc1 pointer to gain based on old input LPC coefficients.
415
 * \param gainLpc2 pointer to gain based on new input LPC coefficients.
416
 * \param alfd_gains pointer to output gains.
417
 * \param s current scale shift factor of x.
418
 */
419
5.15M
#define ALFDPOW2_SCALE 3
420
/*static*/
421
void CLpd_AdaptLowFreqDeemph(FIXP_DBL x[], int lg, FIXP_DBL alfd_gains[],
422
66.5k
                             INT s) {
423
66.5k
  {
424
66.5k
    int i, j, k, i_max;
425
66.5k
    FIXP_DBL max, fac;
426
    /* Note: This stack array saves temporary accumulation results to be used in
427
     * a second run */
428
    /*       The size should be limited to (1024/4)/8=32 */
429
66.5k
    FIXP_DBL tmp_pow2[32];
430
431
66.5k
    s = s * 2 + ALFDPOW2_SCALE;
432
66.5k
    s = fMin(31, s);
433
434
66.5k
    k = 8;
435
66.5k
    i_max = lg / 4; /* ALFD range = 1600Hz (lg = 6400Hz) */
436
437
    /* find spectral peak */
438
66.5k
    max = FL2FX_DBL(0.01f) >> s;
439
702k
    for (i = 0; i < i_max; i += k) {
440
636k
      FIXP_DBL tmp;
441
442
636k
      tmp = FIXP_DBL(0);
443
636k
      FIXP_DBL *pX = &x[i];
444
445
636k
      j = 8;
446
2.54M
      do {
447
2.54M
        FIXP_DBL x0 = *pX++;
448
2.54M
        FIXP_DBL x1 = *pX++;
449
2.54M
        x0 = fPow2Div2(x0);
450
2.54M
        x1 = fPow2Div2(x1);
451
2.54M
        tmp = tmp + (x0 >> (ALFDPOW2_SCALE - 1));
452
2.54M
        tmp = tmp + (x1 >> (ALFDPOW2_SCALE - 1));
453
2.54M
      } while ((j = j - 2) != 0);
454
636k
      tmp = fMax(tmp, (FL2FX_DBL(0.01f) >> s));
455
636k
      tmp_pow2[i >> 3] = tmp;
456
636k
      if (tmp > max) {
457
100k
        max = tmp;
458
100k
      }
459
636k
    }
460
461
    /* deemphasis of all blocks below the peak */
462
66.5k
    fac = FL2FX_DBL(0.1f) >> 1;
463
702k
    for (i = 0; i < i_max; i += k) {
464
636k
      FIXP_DBL tmp;
465
636k
      INT shifti;
466
467
636k
      tmp = tmp_pow2[i >> 3];
468
469
      /* tmp = (float)sqrt(tmp/max); */
470
471
      /* value of tmp is between 8/2*max^2 and max^2 / 2. */
472
      /* required shift factor of division can grow up to 27
473
         (grows exponentially for values toward zero)
474
         thus using normalized division to assure valid result. */
475
636k
      {
476
636k
        INT sd;
477
478
636k
        if (tmp != (FIXP_DBL)0) {
479
629k
          tmp = fDivNorm(max, tmp, &sd);
480
629k
          if (sd & 1) {
481
425k
            sd++;
482
425k
            tmp >>= 1;
483
425k
          }
484
629k
        } else {
485
6.94k
          tmp = (FIXP_DBL)MAXVAL_DBL;
486
6.94k
          sd = 0;
487
6.94k
        }
488
636k
        tmp = invSqrtNorm2(tmp, &shifti);
489
636k
        tmp = scaleValue(tmp, shifti - 1 - (sd / 2));
490
636k
      }
491
636k
      if (tmp > fac) {
492
116k
        fac = tmp;
493
116k
      }
494
636k
      FIXP_DBL *pX = &x[i];
495
496
636k
      j = 8;
497
2.54M
      do {
498
2.54M
        FIXP_DBL x0 = pX[0];
499
2.54M
        FIXP_DBL x1 = pX[1];
500
2.54M
        x0 = fMultDiv2(x0, fac);
501
2.54M
        x1 = fMultDiv2(x1, fac);
502
2.54M
        x0 = x0 << 2;
503
2.54M
        x1 = x1 << 2;
504
2.54M
        *pX++ = x0;
505
2.54M
        *pX++ = x1;
506
507
2.54M
      } while ((j = j - 2) != 0);
508
      /* Store gains for FAC */
509
636k
      *alfd_gains++ = fac;
510
636k
    }
511
66.5k
  }
512
66.5k
}
513
514
/**
515
 * \brief Interpolated Noise Shaping for mdct coefficients.
516
 * This algorithm shapes temporally the spectral noise between
517
 * the two spectral noise represention (FDNS_NPTS of resolution).
518
 * The noise is shaped monotonically between the two points
519
 * using a curved shape to favor the lower gain in mid-frame.
520
 * ODFT and amplitud calculation are applied to the 2 LPC coefficients first.
521
 *
522
 * \param r pointer to spectrum data.
523
 * \param rms RMS of output spectrum.
524
 * \param lg length of r.
525
 * \param A1 pointer to old input LPC coefficients of length M_LP_FILTER_ORDER
526
 * scaled by SF_A_COEFFS.
527
 * \param A2 pointer to new input LPC coefficients of length M_LP_FILTER_ORDER
528
 * scaled by SF_A_COEFFS.
529
 * \param bLpc2Mdct flags control lpc2mdct conversion and noise shaping.
530
 * \param gainLpc1 pointer to gain based on old input LPC coefficients.
531
 * \param gainLpc2 pointer to gain based on new input LPC coefficients.
532
 * \param gLpc_e pointer to exponent of gainLpc1 and gainLpc2.
533
 */
534
/* static */
535
24.1M
#define NSHAPE_SCALE (4)
536
537
#define LPC2MDCT_CALC (1)
538
#define LPC2MDCT_GAIN_LOAD (2)
539
#define LPC2MDCT_GAIN_SAVE (4)
540
#define LPC2MDCT_APPLY_NSHAPE (8)
541
542
void lpc2mdctAndNoiseShaping(FIXP_DBL *r, SHORT *pScale, const INT lg,
543
                             const INT fdns_npts, const FIXP_LPC *A1,
544
                             const INT A1_exp, const FIXP_LPC *A2,
545
66.5k
                             const INT A2_exp) {
546
66.5k
  FIXP_DBL *tmp2 = NULL;
547
66.5k
  FIXP_DBL rr_minus_one;
548
66.5k
  int i, k, s, step;
549
550
66.5k
  C_AALLOC_SCRATCH_START(tmp1, FIXP_DBL, FDNS_NPTS * 8)
551
552
66.5k
  {
553
66.5k
    tmp2 = tmp1 + fdns_npts * 4;
554
555
    /* lpc2mdct() */
556
557
    /* ODFT. E_LPC_a_weight() for A1 and A2 vectors is included into the loop
558
     * below. */
559
66.5k
    FIXP_DBL f = FL2FXCONST_DBL(0.92f);
560
561
66.5k
    const FIXP_STP *SinTab;
562
66.5k
    int k_step;
563
    /* needed values: sin(phi), cos(phi); phi = i*PI/(2*fdns_npts), i = 0 ...
564
     * M_LP_FILTER_ORDER */
565
66.5k
    switch (fdns_npts) {
566
29.9k
      case 64:
567
29.9k
        SinTab = SineTable512;
568
29.9k
        k_step = (512 / 64);
569
29.9k
        FDK_ASSERT(512 >= 64);
570
29.9k
        break;
571
36.6k
      case 48:
572
36.6k
        SinTab = SineTable384;
573
36.6k
        k_step = 384 / 48;
574
36.6k
        FDK_ASSERT(384 >= 48);
575
36.6k
        break;
576
36.6k
      default:
577
0
        FDK_ASSERT(0);
578
0
        return;
579
66.5k
    }
580
581
1.13M
    for (i = 0, k = k_step; i < M_LP_FILTER_ORDER; i++, k += k_step) {
582
1.06M
      FIXP_STP cs = SinTab[k];
583
1.06M
      FIXP_DBL wA1, wA2;
584
585
1.06M
      wA1 = fMult(A1[i], f);
586
1.06M
      wA2 = fMult(A2[i], f);
587
588
      /* r[i] = A[i]*cos() */
589
1.06M
      tmp1[2 + i * 2] = fMult(wA1, cs.v.re);
590
1.06M
      tmp2[2 + i * 2] = fMult(wA2, cs.v.re);
591
      /* i[i] = A[i]*sin() */
592
1.06M
      tmp1[3 + i * 2] = -fMult(wA1, cs.v.im);
593
1.06M
      tmp2[3 + i * 2] = -fMult(wA2, cs.v.im);
594
595
1.06M
      f = fMult(f, FL2FXCONST_DBL(0.92f));
596
1.06M
    }
597
598
    /* Guarantee at least 2 bits of headroom for the FFT */
599
    /* "3" stands for 1.0 with 2 bits of headroom; (A1_exp + 2) guarantess 2
600
     * bits of headroom if A1_exp > 1 */
601
66.5k
    int A1_exp_fix = fMax(3, A1_exp + 2);
602
66.5k
    int A2_exp_fix = fMax(3, A2_exp + 2);
603
604
    /* Set 1.0 in the proper format */
605
66.5k
    tmp1[0] = (FIXP_DBL)(INT)((ULONG)0x80000000 >> A1_exp_fix);
606
66.5k
    tmp2[0] = (FIXP_DBL)(INT)((ULONG)0x80000000 >> A2_exp_fix);
607
608
66.5k
    tmp1[1] = tmp2[1] = (FIXP_DBL)0;
609
610
    /* Clear the resto of the array */
611
66.5k
    FDKmemclear(
612
66.5k
        tmp1 + 2 * (M_LP_FILTER_ORDER + 1),
613
66.5k
        2 * (fdns_npts * 2 - (M_LP_FILTER_ORDER + 1)) * sizeof(FIXP_DBL));
614
66.5k
    FDKmemclear(
615
66.5k
        tmp2 + 2 * (M_LP_FILTER_ORDER + 1),
616
66.5k
        2 * (fdns_npts * 2 - (M_LP_FILTER_ORDER + 1)) * sizeof(FIXP_DBL));
617
618
    /* Guarantee 2 bits of headroom for FFT */
619
66.5k
    scaleValues(&tmp1[2], (2 * M_LP_FILTER_ORDER), (A1_exp - A1_exp_fix));
620
66.5k
    scaleValues(&tmp2[2], (2 * M_LP_FILTER_ORDER), (A2_exp - A2_exp_fix));
621
622
66.5k
    INT s2;
623
66.5k
    s = A1_exp_fix;
624
66.5k
    s2 = A2_exp_fix;
625
626
66.5k
    fft(2 * fdns_npts, tmp1, &s);
627
66.5k
    fft(2 * fdns_npts, tmp2, &s2);
628
629
    /* Adjust the exponents of both fft outputs if necessary*/
630
66.5k
    if (s > s2) {
631
3.77k
      scaleValues(tmp2, 2 * fdns_npts, s2 - s);
632
3.77k
      s2 = s;
633
62.8k
    } else if (s < s2) {
634
11.1k
      scaleValues(tmp1, 2 * fdns_npts, s - s2);
635
11.1k
      s = s2;
636
11.1k
    }
637
638
66.5k
    FDK_ASSERT(s == s2);
639
66.5k
  }
640
641
  /* Get amplitude and apply gains */
642
66.5k
  step = lg / fdns_npts;
643
66.5k
  rr_minus_one = (FIXP_DBL)0;
644
645
3.74M
  for (k = 0; k < fdns_npts; k++) {
646
3.67M
    FIXP_DBL g1, g2, inv_g1_g2, a, b;
647
3.67M
    INT inv_g1_g2_e;
648
3.67M
    int g_e, shift;
649
650
3.67M
    {
651
3.67M
      FIXP_DBL real, imag;
652
3.67M
      int si1, si2, sInput;
653
654
3.67M
      real = tmp1[k * 2];
655
3.67M
      imag = tmp1[k * 2 + 1];
656
3.67M
      sInput = fMax(fMin(fNorm(real), fNorm(imag)) - 1, 0);
657
3.67M
      real <<= sInput;
658
3.67M
      imag <<= sInput;
659
      /* g1_e = si1 - 2*s/2 */
660
3.67M
      g1 = invSqrtNorm2(fPow2(real) + fPow2(imag), &si1);
661
3.67M
      si1 += sInput;
662
663
3.67M
      real = tmp2[k * 2];
664
3.67M
      imag = tmp2[k * 2 + 1];
665
3.67M
      sInput = fMax(fMin(fNorm(real), fNorm(imag)) - 1, 0);
666
3.67M
      real <<= sInput;
667
3.67M
      imag <<= sInput;
668
      /* g2_e = si2 - 2*s/2 */
669
3.67M
      g2 = invSqrtNorm2(fPow2(real) + fPow2(imag), &si2);
670
3.67M
      si2 += sInput;
671
672
      /* Pick a common scale factor for g1 and g2 */
673
3.67M
      if (si1 > si2) {
674
856k
        g2 >>= si1 - si2;
675
856k
        g_e = si1 - s;
676
2.81M
      } else {
677
2.81M
        g1 >>= si2 - si1;
678
2.81M
        g_e = si2 - s;
679
2.81M
      }
680
3.67M
    }
681
682
    /* end of lpc2mdct() */
683
684
3.67M
    FDK_ASSERT(g1 >= (FIXP_DBL)0);
685
3.67M
    FDK_ASSERT(g2 >= (FIXP_DBL)0);
686
687
    /* mdct_IntNoiseShaping() */
688
3.67M
    {
689
      /* inv_g1_g2 * 2^inv_g1_g2_e = 1/(g1+g2) */
690
3.67M
      inv_g1_g2 = (g1 >> 1) + (g2 >> 1);
691
3.67M
      if (inv_g1_g2 != (FIXP_DBL)0) {
692
3.67M
        inv_g1_g2 = fDivNorm(FL2FXCONST_DBL(0.5f), inv_g1_g2, &inv_g1_g2_e);
693
3.67M
        inv_g1_g2_e = inv_g1_g2_e - g_e;
694
3.67M
      } else {
695
0
        inv_g1_g2 = (FIXP_DBL)MAXVAL_DBL;
696
0
        inv_g1_g2_e = 0;
697
0
      }
698
699
3.67M
      if (g_e < 0) {
700
        /* a_e = g_e + inv_g1_g2_e + 1 */
701
491k
        a = scaleValue(fMult(fMult(g1, g2), inv_g1_g2), g_e);
702
        /* b_e = g_e + inv_g1_g2_e */
703
491k
        b = fMult(g2 - g1, inv_g1_g2);
704
491k
        shift = g_e + inv_g1_g2_e + 1 - NSHAPE_SCALE;
705
3.18M
      } else {
706
        /* a_e = (g_e+g_e) + inv_g1_g2_e + 1 */
707
3.18M
        a = fMult(fMult(g1, g2), inv_g1_g2);
708
        /* b_e = (g_e+g_e) + inv_g1_g2_e */
709
3.18M
        b = scaleValue(fMult(g2 - g1, inv_g1_g2), -g_e);
710
3.18M
        shift = (g_e + g_e) + inv_g1_g2_e + 1 - NSHAPE_SCALE;
711
3.18M
      }
712
713
24.0M
      for (i = k * step; i < (k + 1) * step; i++) {
714
20.3M
        FIXP_DBL tmp;
715
716
        /* rr[i] = 2*a*r[i] + b*rr[i-1] */
717
20.3M
        tmp = fMult(a, r[i]);
718
20.3M
        tmp += scaleValue(fMultDiv2(b, rr_minus_one), NSHAPE_SCALE);
719
20.3M
        tmp = scaleValueSaturate(tmp, shift);
720
20.3M
        rr_minus_one = tmp;
721
20.3M
        r[i] = tmp;
722
20.3M
      }
723
3.67M
    }
724
3.67M
  }
725
726
  /* end of mdct_IntNoiseShaping() */
727
66.5k
  { *pScale += NSHAPE_SCALE; }
728
729
66.5k
  C_AALLOC_SCRATCH_END(tmp1, FIXP_DBL, FDNS_NPTS * 8)
730
66.5k
}
731
732
/**
733
 * \brief Calculates the energy.
734
 * \param r pointer to spectrum.
735
 * \param rs scale factor of spectrum r.
736
 * \param lg frame length in audio samples.
737
 * \param rms_e pointer to exponent of energy value.
738
 * \return mantissa of energy value.
739
 */
740
static FIXP_DBL calcEnergy(const FIXP_DBL *r, const SHORT rs, const INT lg,
741
66.5k
                           INT *rms_e) {
742
66.5k
  int headroom = getScalefactor(r, lg);
743
744
66.5k
  FIXP_DBL rms_m = 0;
745
746
  /* Calculate number of growth bits due to addition */
747
66.5k
  INT shift = (INT)(fNormz((FIXP_DBL)lg));
748
66.5k
  shift = 31 - shift;
749
750
  /* Generate 1e-2 in Q-6.37 */
751
66.5k
  const FIXP_DBL value0_01 = 0x51eb851e;
752
66.5k
  const INT value0_01_exp = -6;
753
754
  /* Find the exponent of the resulting energy value */
755
66.5k
  *rms_e = ((rs - headroom) << 1) + shift + 1;
756
757
66.5k
  INT delta = *rms_e - value0_01_exp;
758
66.5k
  if (delta > 0) {
759
    /* Limit shift_to 31*/
760
66.5k
    delta = fMin(31, delta);
761
66.5k
    rms_m = value0_01 >> delta;
762
66.5k
  } else {
763
0
    rms_m = value0_01;
764
0
    *rms_e = value0_01_exp;
765
0
    shift = shift - delta;
766
    /* Limit shift_to 31*/
767
0
    shift = fMin(31, shift);
768
0
  }
769
770
20.4M
  for (int i = 0; i < lg; i++) {
771
20.3M
    rms_m += fPow2Div2(r[i] << headroom) >> shift;
772
20.3M
  }
773
774
66.5k
  return rms_m;
775
66.5k
}
776
777
/**
778
 * \brief TCX gain calculation.
779
 * \param pAacDecoderChannelInfo channel context data.
780
 * \param r output spectrum.
781
 * \param rms_e pointer to mantissa of energy value.
782
 * \param rms_e pointer to exponent of energy value.
783
 * \param frame the frame index of the LPD super frame.
784
 * \param lg the frame length in audio samples.
785
 * \param gain_m pointer to mantissa of TCX gain.
786
 * \param gain_e pointer to exponent of TCX gain.
787
 * \param elFlags element specific parser guidance flags.
788
 * \param lg_fb the fullband frame length in audio samples.
789
 * \param IGF_bgn the IGF start index.
790
 */
791
static void calcTCXGain(CAacDecoderChannelInfo *pAacDecoderChannelInfo,
792
                        FIXP_DBL *r, FIXP_DBL rms_m, INT rms_e, const INT frame,
793
66.5k
                        const INT lg) {
794
66.5k
  if ((rms_m != (FIXP_DBL)0)) {
795
66.5k
    FIXP_DBL tcx_gain_m;
796
66.5k
    INT tcx_gain_e;
797
798
66.5k
    CLpd_DecodeGain(&tcx_gain_m, &tcx_gain_e,
799
66.5k
                    pAacDecoderChannelInfo->pDynData->specificTo.usac
800
66.5k
                        .tcx_global_gain[frame]);
801
802
    /* rms * 2^rms_e = lg/sqrt(sum(spec^2)) */
803
66.5k
    if (rms_e & 1) {
804
28.2k
      rms_m >>= 1;
805
28.2k
      rms_e++;
806
28.2k
    }
807
808
66.5k
    {
809
66.5k
      FIXP_DBL fx_lg;
810
66.5k
      INT fx_lg_e, s;
811
66.5k
      INT inv_e;
812
813
      /* lg = fx_lg * 2^fx_lg_e */
814
66.5k
      s = fNorm((FIXP_DBL)lg);
815
66.5k
      fx_lg = (FIXP_DBL)lg << s;
816
66.5k
      fx_lg_e = DFRACT_BITS - 1 - s;
817
      /* 1/sqrt(rms) */
818
66.5k
      rms_m = invSqrtNorm2(rms_m, &inv_e);
819
66.5k
      rms_m = fMult(rms_m, fx_lg);
820
66.5k
      rms_e = inv_e - (rms_e >> 1) + fx_lg_e;
821
66.5k
    }
822
823
66.5k
    {
824
66.5k
      int s = fNorm(tcx_gain_m);
825
66.5k
      tcx_gain_m = tcx_gain_m << s;
826
66.5k
      tcx_gain_e -= s;
827
66.5k
    }
828
829
66.5k
    tcx_gain_m = fMultDiv2(tcx_gain_m, rms_m);
830
66.5k
    tcx_gain_e = tcx_gain_e + rms_e;
831
832
    /* global_gain * 2^(global_gain_e+rms_e) = (10^(global_gain/28)) * rms *
833
     * 2^rms_e */
834
66.5k
    {
835
66.5k
      { tcx_gain_e += 1; }
836
66.5k
    }
837
838
66.5k
    pAacDecoderChannelInfo->data.usac.tcx_gain[frame] = tcx_gain_m;
839
66.5k
    pAacDecoderChannelInfo->data.usac.tcx_gain_e[frame] = tcx_gain_e;
840
841
66.5k
    pAacDecoderChannelInfo->specScale[frame] += tcx_gain_e;
842
66.5k
  }
843
66.5k
}
844
845
/**
846
 * \brief FDNS decoding.
847
 * \param pAacDecoderChannelInfo channel context data.
848
 * \param pAacDecoderStaticChannelInfo channel context static data.
849
 * \param r output spectrum.
850
 * \param lg the frame length in audio samples.
851
 * \param frame the frame index of the LPD super frame.
852
 * \param pScale pointer to current scale shift factor of r[].
853
 * \param A1 old input LPC coefficients of length M_LP_FILTER_ORDER.
854
 * \param A2 new input LPC coefficients of length M_LP_FILTER_ORDER.
855
 * \param pAlfdGains pointer for ALFD gains output scaled by 1.
856
 * \param fdns_npts number of lines (FDNS_NPTS).
857
 * \param inf_mask pointer to noise mask.
858
 * \param IGF_win_mode IGF window mode (LONG, SHORT, TCX10, TCX20).
859
 * \param frameType (IGF_FRAME_DIVISION_AAC_OR_TCX_LONG or
860
 * IGF_FRAME_DIVISION_TCX_SHORT_1).
861
 * \param elFlags element specific parser guidance flags.
862
 * \param lg_fb the fullband frame length in audio samples.
863
 * \param IGF_bgn the IGF start index.
864
 * \param rms_m mantisse of energy.
865
 * \param rms_e exponent of energy.
866
 */
867
/* static */
868
void CLpd_FdnsDecode(CAacDecoderChannelInfo *pAacDecoderChannelInfo,
869
                     CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo,
870
                     FIXP_DBL r[], const INT lg, const INT frame, SHORT *pScale,
871
                     const FIXP_LPC A1[M_LP_FILTER_ORDER], const INT A1_exp,
872
                     const FIXP_LPC A2[M_LP_FILTER_ORDER], const INT A2_exp,
873
66.5k
                     FIXP_DBL pAlfdGains[LFAC / 4], const INT fdns_npts) {
874
  /* Weight LPC coefficients using Rm values */
875
66.5k
  CLpd_AdaptLowFreqDeemph(r, lg, pAlfdGains, *pScale);
876
877
66.5k
  FIXP_DBL rms_m = (FIXP_DBL)0;
878
66.5k
  INT rms_e = 0;
879
66.5k
  {
880
    /* Calculate Energy */
881
66.5k
    rms_m = calcEnergy(r, *pScale, lg, &rms_e);
882
66.5k
  }
883
884
66.5k
  calcTCXGain(pAacDecoderChannelInfo, r, rms_m, rms_e, frame, lg);
885
886
  /* Apply ODFT and Noise Shaping. LP coefficient (A1, A2) weighting is done
887
   * inside on the fly. */
888
889
66.5k
  lpc2mdctAndNoiseShaping(r, pScale, lg, fdns_npts, A1, A1_exp, A2, A2_exp);
890
66.5k
}
891
892
/**
893
 * find pitch for TCX20 (time domain) concealment.
894
 */
895
66.5k
static int find_mpitch(FIXP_DBL xri[], int lg) {
896
66.5k
  FIXP_DBL max, pitch;
897
66.5k
  INT pitch_e;
898
66.5k
  int i, n;
899
900
66.5k
  max = (FIXP_DBL)0;
901
66.5k
  n = 2;
902
903
  /* find maximum below 400Hz */
904
636k
  for (i = 2; i < (lg >> 4); i += 2) {
905
569k
    FIXP_DBL tmp = fPow2Div2(xri[i]) + fPow2Div2(xri[i + 1]);
906
569k
    if (tmp > max) {
907
54.3k
      max = tmp;
908
54.3k
      n = i;
909
54.3k
    }
910
569k
  }
911
912
  // pitch = ((float)lg<<1)/(float)n;
913
66.5k
  pitch = fDivNorm((FIXP_DBL)lg << 1, (FIXP_DBL)n, &pitch_e);
914
66.5k
  pitch >>= fixMax(0, DFRACT_BITS - 1 - pitch_e - 16);
915
916
  /* find pitch multiple under 20ms */
917
66.5k
  if (pitch >= (FIXP_DBL)((256 << 16) - 1)) { /*231.0f*/
918
31.4k
    n = 256;
919
35.1k
  } else {
920
35.1k
    FIXP_DBL mpitch = pitch;
921
103k
    while (mpitch < (FIXP_DBL)(255 << 16)) {
922
68.4k
      mpitch += pitch;
923
68.4k
    }
924
35.1k
    n = (int)(mpitch - pitch) >> 16;
925
35.1k
  }
926
927
66.5k
  return (n);
928
66.5k
}
929
930
/**
931
 * number of spectral coefficients / time domain samples using frame mode as
932
 * index.
933
 */
934
static const int lg_table_ccfl[2][4] = {
935
    {256, 256, 512, 1024}, /* coreCoderFrameLength = 1024 */
936
    {192, 192, 384, 768}   /* coreCoderFrameLength = 768  */
937
};
938
939
/**
940
 * \brief Decode and render one MDCT-TCX frame.
941
 * \param pAacDecoderChannelInfo channel context data.
942
 * \param lg the frame length in audio samples.
943
 * \param frame the frame index of the LPD super frame.
944
 */
945
static void CLpd_TcxDecode(
946
    CAacDecoderChannelInfo *pAacDecoderChannelInfo,
947
    CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, UINT flags,
948
66.5k
    int mod, int last_mod, int frame, int frameOk) {
949
66.5k
  FIXP_DBL *pAlfd_gains = pAacDecoderStaticChannelInfo->last_alfd_gains;
950
66.5k
  ULONG *pSeed = &pAacDecoderStaticChannelInfo->nfRandomSeed;
951
66.5k
  int lg = (pAacDecoderChannelInfo->granuleLength == 128)
952
66.5k
               ? lg_table_ccfl[0][mod + 0]
953
66.5k
               : lg_table_ccfl[1][mod + 0];
954
66.5k
  int next_frame = frame + (1 << (mod - 1));
955
66.5k
  int isFullBandLpd = 0;
956
957
  /* Obtain r[] vector by combining the quant[] and noise[] vectors */
958
66.5k
  {
959
66.5k
    FIXP_DBL noise_level;
960
66.5k
    FIXP_DBL *coeffs =
961
66.5k
        SPEC_TCX(pAacDecoderChannelInfo->pSpectralCoefficient, frame,
962
66.5k
                 pAacDecoderChannelInfo->granuleLength, isFullBandLpd);
963
66.5k
    int scale = pAacDecoderChannelInfo->specScale[frame];
964
66.5k
    int i, nfBgn, nfEnd;
965
66.5k
    UCHAR tcx_noise_factor = pAacDecoderChannelInfo->pDynData->specificTo.usac
966
66.5k
                                 .tcx_noise_factor[frame];
967
968
    /* find pitch for bfi case */
969
66.5k
    pAacDecoderStaticChannelInfo->last_tcx_pitch = find_mpitch(coeffs, lg);
970
971
66.5k
    if (frameOk) {
972
      /* store for concealment */
973
66.5k
      pAacDecoderStaticChannelInfo->last_tcx_noise_factor = tcx_noise_factor;
974
66.5k
    } else {
975
      /* restore last frames value */
976
0
      tcx_noise_factor = pAacDecoderStaticChannelInfo->last_tcx_noise_factor;
977
0
    }
978
979
66.5k
    noise_level =
980
66.5k
        (FIXP_DBL)((LONG)FL2FXCONST_DBL(0.0625f) * (8 - tcx_noise_factor));
981
66.5k
    noise_level = scaleValue(noise_level, -scale);
982
983
66.5k
    const FIXP_DBL neg_noise_level = -noise_level;
984
985
66.5k
    {
986
66.5k
      nfBgn = lg / 6;
987
66.5k
      nfEnd = lg;
988
66.5k
    }
989
990
2.17M
    for (i = nfBgn; i < nfEnd - 7; i += 8) {
991
2.10M
      LONG tmp;
992
993
      /* Fill all 8 consecutive zero coeffs with noise */
994
2.10M
      tmp = coeffs[i + 0] | coeffs[i + 1] | coeffs[i + 2] | coeffs[i + 3] |
995
2.10M
            coeffs[i + 4] | coeffs[i + 5] | coeffs[i + 6] | coeffs[i + 7];
996
997
2.10M
      if (tmp == 0) {
998
14.3M
        for (int k = i; k < i + 8; k++) {
999
12.7M
          UsacRandomSign(pSeed) ? (coeffs[k] = neg_noise_level)
1000
12.7M
                                : (coeffs[k] = noise_level);
1001
12.7M
        }
1002
1.59M
      }
1003
2.10M
    }
1004
66.5k
    if ((nfEnd - i) >
1005
66.5k
        0) { /* noise filling for last "band" with less than 8 bins */
1006
29.9k
      LONG tmp = (LONG)coeffs[i];
1007
29.9k
      int k;
1008
1009
29.9k
      FDK_ASSERT((nfEnd - i) < 8);
1010
142k
      for (k = 1; k < (nfEnd - i); k++) {
1011
112k
        tmp |= (LONG)coeffs[i + k];
1012
112k
      }
1013
29.9k
      if (tmp == 0) {
1014
126k
        for (k = i; k < nfEnd; k++) {
1015
103k
          UsacRandomSign(pSeed) ? (coeffs[k] = neg_noise_level)
1016
103k
                                : (coeffs[k] = noise_level);
1017
103k
        }
1018
23.0k
      }
1019
29.9k
    }
1020
66.5k
  }
1021
1022
66.5k
  {
1023
    /* Convert LPC to LP domain */
1024
66.5k
    if (last_mod == 0) {
1025
      /* Note: The case where last_mod == 255 is handled by other means
1026
       * in CLpdChannelStream_Read() */
1027
23.8k
      E_LPC_f_lsp_a_conversion(
1028
23.8k
          pAacDecoderChannelInfo->data.usac.lsp_coeff[frame],
1029
23.8k
          pAacDecoderChannelInfo->data.usac.lp_coeff[frame],
1030
23.8k
          &pAacDecoderChannelInfo->data.usac.lp_coeff_exp[frame]);
1031
23.8k
    }
1032
1033
66.5k
    E_LPC_f_lsp_a_conversion(
1034
66.5k
        pAacDecoderChannelInfo->data.usac.lsp_coeff[next_frame],
1035
66.5k
        pAacDecoderChannelInfo->data.usac.lp_coeff[next_frame],
1036
66.5k
        &pAacDecoderChannelInfo->data.usac.lp_coeff_exp[next_frame]);
1037
1038
    /* FDNS decoding */
1039
66.5k
    CLpd_FdnsDecode(
1040
66.5k
        pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo,
1041
66.5k
        SPEC_TCX(pAacDecoderChannelInfo->pSpectralCoefficient, frame,
1042
66.5k
                 pAacDecoderChannelInfo->granuleLength, isFullBandLpd),
1043
66.5k
        lg, frame, pAacDecoderChannelInfo->specScale + frame,
1044
66.5k
        pAacDecoderChannelInfo->data.usac.lp_coeff[frame],
1045
66.5k
        pAacDecoderChannelInfo->data.usac.lp_coeff_exp[frame],
1046
66.5k
        pAacDecoderChannelInfo->data.usac.lp_coeff[next_frame],
1047
66.5k
        pAacDecoderChannelInfo->data.usac.lp_coeff_exp[next_frame], pAlfd_gains,
1048
66.5k
        pAacDecoderChannelInfo->granuleLength / 2 /* == FDNS_NPTS(ccfl) */
1049
66.5k
    );
1050
66.5k
  }
1051
66.5k
}
1052
1053
/**
1054
 * \brief Read the tcx_coding bitstream part
1055
 * \param hBs bitstream handle to read from.
1056
 * \param pAacDecoderChannelInfo channel context info to store data into.
1057
 * \param lg the frame length in audio samples.
1058
 * \param first_tcx_flag flag indicating that this is the first TCX frame.
1059
 * \param frame the frame index of the LPD super frame.
1060
 */
1061
static AAC_DECODER_ERROR CLpd_TCX_Read(
1062
    HANDLE_FDK_BITSTREAM hBs, CAacDecoderChannelInfo *pAacDecoderChannelInfo,
1063
    CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, int lg,
1064
67.6k
    int first_tcx_flag, int frame, UINT flags) {
1065
67.6k
  AAC_DECODER_ERROR errorAAC = AAC_DEC_OK;
1066
67.6k
  ARITH_CODING_ERROR error = ARITH_CODER_OK;
1067
67.6k
  FIXP_DBL *pSpec;
1068
67.6k
  int arith_reset_flag = 0;
1069
67.6k
  int isFullBandLpd = 0;
1070
1071
67.6k
  pSpec = SPEC_TCX(pAacDecoderChannelInfo->pSpectralCoefficient, frame,
1072
67.6k
                   pAacDecoderChannelInfo->granuleLength, isFullBandLpd);
1073
1074
  /* TCX noise level */
1075
67.6k
  {
1076
67.6k
    pAacDecoderChannelInfo->pDynData->specificTo.usac.tcx_noise_factor[frame] =
1077
67.6k
        FDKreadBits(hBs, 3);
1078
67.6k
  }
1079
  /* TCX global gain */
1080
67.6k
  pAacDecoderChannelInfo->pDynData->specificTo.usac.tcx_global_gain[frame] =
1081
67.6k
      FDKreadBits(hBs, 7);
1082
1083
  /* Arithmetic coded residual/spectrum */
1084
67.6k
  if (first_tcx_flag) {
1085
42.9k
    if (flags & AC_INDEP) {
1086
27.4k
      arith_reset_flag = 1;
1087
27.4k
    } else {
1088
15.4k
      arith_reset_flag = FDKreadBits(hBs, 1);
1089
15.4k
    }
1090
42.9k
  }
1091
1092
  /* CArco_DecodeArithData() output scale of "pSpec" is DFRACT_BITS-1 */
1093
67.6k
  error = CArco_DecodeArithData(pAacDecoderStaticChannelInfo->hArCo, hBs, pSpec,
1094
67.6k
                                lg, lg, arith_reset_flag);
1095
1096
  /* Rescale residual/spectrum */
1097
67.6k
  {
1098
67.6k
    int scale = getScalefactor(pSpec, lg) - 2; /* Leave 2 bits headroom */
1099
1100
    /* Exponent of CArco_DecodeArithData() output is DFRACT_BITS; integer
1101
     * values. */
1102
67.6k
    scaleValues(pSpec, lg, scale);
1103
67.6k
    scale = DFRACT_BITS - 1 - scale;
1104
1105
67.6k
    pAacDecoderChannelInfo->specScale[frame] = scale;
1106
67.6k
  }
1107
1108
67.6k
  if (error == ARITH_CODER_ERROR) errorAAC = AAC_DEC_UNKNOWN;
1109
1110
67.6k
  return errorAAC;
1111
67.6k
}
1112
1113
/**
1114
 * \brief translate lpd_mode into the mod[] array which describes the mode of
1115
 * each each LPD frame
1116
 * \param mod[] the array that will be filled with the mode indexes of the
1117
 * inidividual frames.
1118
 * \param lpd_mode the lpd_mode field read from the lpd_channel_stream
1119
 */
1120
static AAC_DECODER_ERROR CLpd_ReadAndMapLpdModeToModArray(
1121
56.7k
    UCHAR mod[4], HANDLE_FDK_BITSTREAM hBs, UINT elFlags) {
1122
56.7k
  int lpd_mode;
1123
1124
56.7k
  {
1125
56.7k
    lpd_mode = FDKreadBits(hBs, 5);
1126
1127
56.7k
    if (lpd_mode > 25 || lpd_mode < 0) {
1128
63
      return AAC_DEC_PARSE_ERROR;
1129
63
    }
1130
1131
56.6k
    switch (lpd_mode) {
1132
715
      case 25:
1133
        /* 1 80MS frame */
1134
715
        mod[0] = mod[1] = mod[2] = mod[3] = 3;
1135
715
        break;
1136
302
      case 24:
1137
        /* 2 40MS frames */
1138
302
        mod[0] = mod[1] = mod[2] = mod[3] = 2;
1139
302
        break;
1140
55.6k
      default:
1141
55.6k
        switch (lpd_mode >> 2) {
1142
20.4k
          case 4:
1143
            /* lpd_mode 19 - 16  => 1 40MS and 2 20MS frames */
1144
20.4k
            mod[0] = mod[1] = 2;
1145
20.4k
            mod[2] = (lpd_mode & 1) ? 1 : 0;
1146
20.4k
            mod[3] = (lpd_mode & 2) ? 1 : 0;
1147
20.4k
            break;
1148
2.75k
          case 5:
1149
            /* lpd_mode 23 - 20 => 2 20MS and 1 40MS frames */
1150
2.75k
            mod[2] = mod[3] = 2;
1151
2.75k
            mod[0] = (lpd_mode & 1) ? 1 : 0;
1152
2.75k
            mod[1] = (lpd_mode & 2) ? 1 : 0;
1153
2.75k
            break;
1154
32.4k
          default:
1155
            /* lpd_mode < 16 => 4 20MS frames */
1156
32.4k
            mod[0] = (lpd_mode & 1) ? 1 : 0;
1157
32.4k
            mod[1] = (lpd_mode & 2) ? 1 : 0;
1158
32.4k
            mod[2] = (lpd_mode & 4) ? 1 : 0;
1159
32.4k
            mod[3] = (lpd_mode & 8) ? 1 : 0;
1160
32.4k
            break;
1161
55.6k
        }
1162
55.6k
        break;
1163
56.6k
    }
1164
56.6k
  }
1165
56.6k
  return AAC_DEC_OK;
1166
56.6k
}
1167
1168
static void CLpd_Reset(
1169
    CAacDecoderChannelInfo *pAacDecoderChannelInfo,
1170
    CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo,
1171
41.2k
    int keep_past_signal) {
1172
41.2k
  int i;
1173
1174
  /* Reset TCX / ACELP common memory */
1175
41.2k
  if (!keep_past_signal) {
1176
41.1k
    FDKmemclear(pAacDecoderStaticChannelInfo->old_synth,
1177
41.1k
                sizeof(pAacDecoderStaticChannelInfo->old_synth));
1178
41.1k
  }
1179
1180
  /* Initialize the LSFs */
1181
700k
  for (i = 0; i < M_LP_FILTER_ORDER; i++) {
1182
659k
    pAacDecoderStaticChannelInfo->lpc4_lsf[i] = fdk_dec_lsf_init[i];
1183
659k
  }
1184
1185
  /* Reset memory needed by bass post-filter */
1186
41.2k
  FDKmemclear(pAacDecoderStaticChannelInfo->mem_bpf,
1187
41.2k
              sizeof(pAacDecoderStaticChannelInfo->mem_bpf));
1188
1189
41.2k
  pAacDecoderStaticChannelInfo->old_bpf_control_info = 0;
1190
329k
  for (i = 0; i < SYN_SFD; i++) {
1191
288k
    pAacDecoderStaticChannelInfo->old_T_pf[i] = 64;
1192
288k
    pAacDecoderStaticChannelInfo->old_gain_pf[i] = (FIXP_DBL)0;
1193
288k
  }
1194
1195
  /* Reset ACELP memory */
1196
41.2k
  CLpd_AcelpReset(&pAacDecoderStaticChannelInfo->acelp);
1197
1198
41.2k
  pAacDecoderStaticChannelInfo->last_lpc_lost = 0;      /* prev_lpc_lost */
1199
41.2k
  pAacDecoderStaticChannelInfo->last_tcx_pitch = L_DIV; /* pitch_tcx     */
1200
41.2k
  pAacDecoderStaticChannelInfo->numLostLpdFrames = 0;   /* nbLostCmpt    */
1201
41.2k
}
1202
1203
/*
1204
 * Externally visible functions
1205
 */
1206
1207
AAC_DECODER_ERROR CLpdChannelStream_Read(
1208
    HANDLE_FDK_BITSTREAM hBs, CAacDecoderChannelInfo *pAacDecoderChannelInfo,
1209
    CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo,
1210
56.8k
    const SamplingRateInfo *pSamplingRateInfo, UINT flags) {
1211
56.8k
  AAC_DECODER_ERROR error = AAC_DEC_OK;
1212
56.8k
  int first_tcx_flag;
1213
56.8k
  int k, nbDiv, fFacDataPresent, first_lpd_flag, acelp_core_mode,
1214
56.8k
      facGetMemState = 0;
1215
56.8k
  UCHAR *mod = pAacDecoderChannelInfo->data.usac.mod;
1216
56.8k
  int lpd_mode_last, prev_frame_was_lpd;
1217
56.8k
  USAC_COREMODE core_mode_last;
1218
56.8k
  const int lg_table_offset = 0;
1219
56.8k
  const int *lg_table = (pAacDecoderChannelInfo->granuleLength == 128)
1220
56.8k
                            ? &lg_table_ccfl[0][lg_table_offset]
1221
56.8k
                            : &lg_table_ccfl[1][lg_table_offset];
1222
56.8k
  int last_lpc_lost = pAacDecoderStaticChannelInfo->last_lpc_lost;
1223
1224
56.8k
  int last_frame_ok = CConcealment_GetLastFrameOk(
1225
56.8k
      &pAacDecoderStaticChannelInfo->concealmentInfo, 1);
1226
1227
56.8k
  INT i_offset;
1228
56.8k
  UINT samplingRate;
1229
1230
56.8k
  samplingRate = pSamplingRateInfo->samplingRate;
1231
1232
56.8k
  i_offset =
1233
56.8k
      (INT)(samplingRate * PIT_MIN_12k8 + (FSCALE_DENOM / 2)) / FSCALE_DENOM -
1234
56.8k
      (INT)PIT_MIN_12k8;
1235
1236
56.8k
  if ((samplingRate < FAC_FSCALE_MIN) || (samplingRate > FAC_FSCALE_MAX)) {
1237
113
    error = AAC_DEC_PARSE_ERROR;
1238
113
    goto bail;
1239
113
  }
1240
1241
56.7k
  acelp_core_mode = FDKreadBits(hBs, 3);
1242
1243
  /* lpd_mode */
1244
56.7k
  error = CLpd_ReadAndMapLpdModeToModArray(mod, hBs, 0);
1245
56.7k
  if (error != AAC_DEC_OK) {
1246
63
    goto bail;
1247
63
  }
1248
1249
  /* bpf_control_info */
1250
56.6k
  pAacDecoderChannelInfo->data.usac.bpf_control_info = FDKreadBit(hBs);
1251
1252
  /* last_core_mode */
1253
56.6k
  prev_frame_was_lpd = FDKreadBit(hBs);
1254
  /* fac_data_present */
1255
56.6k
  fFacDataPresent = FDKreadBit(hBs);
1256
1257
  /* Set valid values from
1258
   * pAacDecoderStaticChannelInfo->{last_core_mode,last_lpd_mode} */
1259
56.6k
  pAacDecoderChannelInfo->data.usac.core_mode_last =
1260
56.6k
      pAacDecoderStaticChannelInfo->last_core_mode;
1261
56.6k
  lpd_mode_last = pAacDecoderChannelInfo->data.usac.lpd_mode_last =
1262
56.6k
      pAacDecoderStaticChannelInfo->last_lpd_mode;
1263
1264
56.6k
  if (prev_frame_was_lpd == 0) {
1265
    /* Last frame was FD */
1266
19.9k
    pAacDecoderChannelInfo->data.usac.core_mode_last = FD_LONG;
1267
19.9k
    pAacDecoderChannelInfo->data.usac.lpd_mode_last = 255;
1268
36.7k
  } else {
1269
    /* Last frame was LPD */
1270
36.7k
    pAacDecoderChannelInfo->data.usac.core_mode_last = LPD;
1271
36.7k
    if (((mod[0] == 0) && fFacDataPresent) ||
1272
28.7k
        ((mod[0] != 0) && !fFacDataPresent)) {
1273
      /* Currend mod is ACELP, fac data present -> TCX, current mod TCX, no fac
1274
       * data -> TCX */
1275
25.9k
      if (lpd_mode_last == 0) {
1276
        /* Bit stream interruption detected. Assume last TCX mode as TCX20. */
1277
10.0k
        pAacDecoderChannelInfo->data.usac.lpd_mode_last = 1;
1278
10.0k
      }
1279
      /* Else assume that remembered TCX mode is correct. */
1280
25.9k
    } else {
1281
10.8k
      pAacDecoderChannelInfo->data.usac.lpd_mode_last = 0;
1282
10.8k
    }
1283
36.7k
  }
1284
1285
56.6k
  first_lpd_flag = (pAacDecoderChannelInfo->data.usac.core_mode_last !=
1286
56.6k
                    LPD); /* Depends on bitstream configuration */
1287
56.6k
  first_tcx_flag = 1;
1288
1289
56.6k
  if (pAacDecoderStaticChannelInfo->last_core_mode !=
1290
56.6k
      LPD) { /* ATTENTION: Reset depends on what we rendered before! */
1291
41.1k
    CLpd_Reset(pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo, 0);
1292
1293
41.1k
    if (!last_frame_ok) {
1294
      /* If last rendered frame was not LPD and first lpd flag is not set, this
1295
       * must be an error - set last_lpc_lost flag */
1296
0
      last_lpc_lost |= (first_lpd_flag) ? 0 : 1;
1297
0
    }
1298
41.1k
  }
1299
1300
56.6k
  core_mode_last = pAacDecoderChannelInfo->data.usac.core_mode_last;
1301
56.6k
  lpd_mode_last = pAacDecoderChannelInfo->data.usac.lpd_mode_last;
1302
1303
56.6k
  nbDiv = NB_DIV;
1304
1305
  /* k is the frame index. If a frame is of size 40MS or 80MS,
1306
     this frame index is incremented 2 or 4 instead of 1 respectively. */
1307
1308
56.6k
  k = 0;
1309
256k
  while (k < nbDiv) {
1310
    /* Reset FAC data pointers in order to avoid applying old random FAC data.
1311
     */
1312
200k
    pAacDecoderChannelInfo->data.usac.fac_data[k] = NULL;
1313
1314
200k
    if ((k == 0 && core_mode_last == LPD && fFacDataPresent) ||
1315
190k
        (lpd_mode_last == 0 && mod[k] > 0) ||
1316
167k
        ((lpd_mode_last != 255) && lpd_mode_last > 0 && mod[k] == 0)) {
1317
68.1k
      int err;
1318
1319
      /* Assign FAC memory */
1320
68.1k
      pAacDecoderChannelInfo->data.usac.fac_data[k] =
1321
68.1k
          CLpd_FAC_GetMemory(pAacDecoderChannelInfo, mod, &facGetMemState);
1322
1323
      /* FAC for (ACELP -> TCX) or (TCX -> ACELP) */
1324
68.1k
      err = CLpd_FAC_Read(
1325
68.1k
          hBs, pAacDecoderChannelInfo->data.usac.fac_data[k],
1326
68.1k
          pAacDecoderChannelInfo->data.usac.fac_data_e,
1327
68.1k
          pAacDecoderChannelInfo->granuleLength, /* == fac_length */
1328
68.1k
          0, k);
1329
68.1k
      if (err != 0) {
1330
15
        error = AAC_DEC_PARSE_ERROR;
1331
15
        goto bail;
1332
15
      }
1333
68.1k
    }
1334
1335
200k
    if (mod[k] == 0) /* acelp-mode */
1336
132k
    {
1337
132k
      int err;
1338
132k
      err = CLpd_AcelpRead(
1339
132k
          hBs, &pAacDecoderChannelInfo->data.usac.acelp[k], acelp_core_mode,
1340
132k
          pAacDecoderChannelInfo->granuleLength * 8 /* coreCoderFrameLength */,
1341
132k
          i_offset);
1342
132k
      if (err != 0) {
1343
0
        error = AAC_DEC_PARSE_ERROR;
1344
0
        goto bail;
1345
0
      }
1346
1347
132k
      lpd_mode_last = 0;
1348
132k
      k++;
1349
132k
    } else /* mode != 0  =>  TCX */
1350
67.6k
    {
1351
67.6k
      error = CLpd_TCX_Read(hBs, pAacDecoderChannelInfo,
1352
67.6k
                            pAacDecoderStaticChannelInfo, lg_table[mod[k]],
1353
67.6k
                            first_tcx_flag, k, flags);
1354
1355
67.6k
      lpd_mode_last = mod[k];
1356
67.6k
      first_tcx_flag = 0;
1357
67.6k
      k += 1 << (mod[k] - 1);
1358
67.6k
    }
1359
200k
    if (error != AAC_DEC_OK) {
1360
503
      error = AAC_DEC_PARSE_ERROR;
1361
503
      goto bail;
1362
503
    }
1363
200k
  }
1364
1365
56.1k
  {
1366
56.1k
    int err;
1367
1368
    /* Read LPC coefficients */
1369
56.1k
    err = CLpc_Read(
1370
56.1k
        hBs, pAacDecoderChannelInfo->data.usac.lsp_coeff,
1371
56.1k
        pAacDecoderStaticChannelInfo->lpc4_lsf,
1372
56.1k
        pAacDecoderChannelInfo->data.usac.lsf_adaptive_mean_cand,
1373
56.1k
        pAacDecoderChannelInfo->data.usac.aStability, mod, first_lpd_flag,
1374
        /* if last lpc4 is available from concealment do not extrapolate lpc0
1375
           from lpc2 */
1376
56.1k
        (mod[0] & 0x3) ? 0
1377
56.1k
                       : (last_lpc_lost &&
1378
10
                          pAacDecoderStaticChannelInfo->last_core_mode != LPD),
1379
56.1k
        last_frame_ok);
1380
56.1k
    if (err != 0) {
1381
11
      error = AAC_DEC_PARSE_ERROR;
1382
11
      goto bail;
1383
11
    }
1384
56.1k
  }
1385
1386
  /* adjust old lsp[] following to a bad frame (to avoid overshoot) (ref:
1387
   * dec_LPD.c) */
1388
56.1k
  if (last_lpc_lost && !last_frame_ok) {
1389
0
    int k_next;
1390
0
    k = 0;
1391
0
    while (k < nbDiv) {
1392
0
      int i;
1393
0
      k_next = k + (((mod[k] & 0x3) == 0) ? 1 : (1 << (mod[k] - 1)));
1394
0
      FIXP_LPC *lsp_old = pAacDecoderChannelInfo->data.usac.lsp_coeff[k];
1395
0
      FIXP_LPC *lsp_new = pAacDecoderChannelInfo->data.usac.lsp_coeff[k_next];
1396
1397
0
      for (i = 0; i < M_LP_FILTER_ORDER; i++) {
1398
0
        if (lsp_new[i] < lsp_old[i]) {
1399
0
          lsp_old[i] = lsp_new[i];
1400
0
        }
1401
0
      }
1402
0
      k = k_next;
1403
0
    }
1404
0
  }
1405
1406
56.1k
  if (!CConcealment_GetLastFrameOk(
1407
56.1k
          &pAacDecoderStaticChannelInfo->concealmentInfo, 1)) {
1408
0
    E_LPC_f_lsp_a_conversion(
1409
0
        pAacDecoderChannelInfo->data.usac.lsp_coeff[0],
1410
0
        pAacDecoderChannelInfo->data.usac.lp_coeff[0],
1411
0
        &pAacDecoderChannelInfo->data.usac.lp_coeff_exp[0]);
1412
56.1k
  } else if (pAacDecoderStaticChannelInfo->last_lpd_mode != 0) {
1413
44.5k
    if (pAacDecoderStaticChannelInfo->last_lpd_mode == 255) {
1414
      /* We need it for TCX decoding or ACELP excitation update */
1415
40.7k
      E_LPC_f_lsp_a_conversion(
1416
40.7k
          pAacDecoderChannelInfo->data.usac.lsp_coeff[0],
1417
40.7k
          pAacDecoderChannelInfo->data.usac.lp_coeff[0],
1418
40.7k
          &pAacDecoderChannelInfo->data.usac.lp_coeff_exp[0]);
1419
40.7k
    } else { /* last_lpd_mode was TCX */
1420
      /* Copy old LPC4 LP domain coefficients to LPC0 LP domain buffer (to avoid
1421
       * converting LSP coefficients again). */
1422
3.83k
      FDKmemcpy(pAacDecoderChannelInfo->data.usac.lp_coeff[0],
1423
3.83k
                pAacDecoderStaticChannelInfo->lp_coeff_old[0],
1424
3.83k
                M_LP_FILTER_ORDER * sizeof(FIXP_LPC));
1425
3.83k
      pAacDecoderChannelInfo->data.usac.lp_coeff_exp[0] =
1426
3.83k
          pAacDecoderStaticChannelInfo->lp_coeff_old_exp[0];
1427
3.83k
    }
1428
44.5k
  } /* case last_lpd_mode was ACELP is handled by CLpd_TcxDecode() */
1429
1430
56.1k
  if (fFacDataPresent && (core_mode_last != LPD)) {
1431
2.63k
    int prev_frame_was_short;
1432
1433
2.63k
    prev_frame_was_short = FDKreadBit(hBs);
1434
1435
2.63k
    if (prev_frame_was_short) {
1436
339
      core_mode_last = pAacDecoderChannelInfo->data.usac.core_mode_last =
1437
339
          FD_SHORT;
1438
339
      pAacDecoderChannelInfo->data.usac.lpd_mode_last = 255;
1439
1440
339
      if ((pAacDecoderStaticChannelInfo->last_core_mode != FD_SHORT) &&
1441
5
          CConcealment_GetLastFrameOk(
1442
5
              &pAacDecoderStaticChannelInfo->concealmentInfo, 1)) {
1443
        /* USAC Conformance document:
1444
           short_fac_flag   shall be encoded with a value of 1 if the
1445
           window_sequence of the previous frame was 2 (EIGHT_SHORT_SEQUENCE).
1446
                            Otherwise short_fac_flag shall be encoded with a
1447
           value of 0. */
1448
5
        error = AAC_DEC_PARSE_ERROR;
1449
5
        goto bail;
1450
5
      }
1451
339
    }
1452
1453
    /* Assign memory */
1454
2.63k
    pAacDecoderChannelInfo->data.usac.fac_data[0] =
1455
2.63k
        CLpd_FAC_GetMemory(pAacDecoderChannelInfo, mod, &facGetMemState);
1456
1457
2.63k
    {
1458
2.63k
      int err;
1459
1460
      /* FAC for FD -> ACELP */
1461
2.63k
      err = CLpd_FAC_Read(
1462
2.63k
          hBs, pAacDecoderChannelInfo->data.usac.fac_data[0],
1463
2.63k
          pAacDecoderChannelInfo->data.usac.fac_data_e,
1464
2.63k
          CLpd_FAC_getLength(core_mode_last != FD_SHORT,
1465
2.63k
                             pAacDecoderChannelInfo->granuleLength),
1466
2.63k
          1, 0);
1467
2.63k
      if (err != 0) {
1468
1
        error = AAC_DEC_PARSE_ERROR;
1469
1
        goto bail;
1470
1
      }
1471
2.63k
    }
1472
2.63k
  }
1473
1474
56.8k
bail:
1475
56.8k
  if (error == AAC_DEC_OK) {
1476
    /* check consitency of last core/lpd mode values */
1477
56.1k
    if ((pAacDecoderChannelInfo->data.usac.core_mode_last !=
1478
56.1k
         pAacDecoderStaticChannelInfo->last_core_mode) &&
1479
37.0k
        (pAacDecoderStaticChannelInfo->last_lpc_lost == 0)) {
1480
      /* Something got wrong! */
1481
      /* error = AAC_DEC_PARSE_ERROR; */ /* Throwing errors does not help */
1482
37.0k
    } else if ((pAacDecoderChannelInfo->data.usac.core_mode_last == LPD) &&
1483
11.8k
               (pAacDecoderChannelInfo->data.usac.lpd_mode_last !=
1484
11.8k
                pAacDecoderStaticChannelInfo->last_lpd_mode) &&
1485
10.3k
               (pAacDecoderStaticChannelInfo->last_lpc_lost == 0)) {
1486
      /* Something got wrong! */
1487
      /* error = AAC_DEC_PARSE_ERROR; */ /* Throwing errors does not help */
1488
10.3k
    }
1489
56.1k
  }
1490
1491
56.8k
  return error;
1492
56.1k
}
1493
1494
void CLpdChannelStream_Decode(
1495
    CAacDecoderChannelInfo *pAacDecoderChannelInfo,
1496
55.5k
    CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, UINT flags) {
1497
55.5k
  UCHAR *mod = pAacDecoderChannelInfo->data.usac.mod;
1498
55.5k
  int k;
1499
55.5k
  UCHAR last_lpd_mode;
1500
55.5k
  int nbDiv = NB_DIV;
1501
1502
  /* k is the frame index. If a frame is of size 40MS or 80MS,
1503
     this frame index is incremented 2 or 4 instead of 1 respectively. */
1504
55.5k
  k = 0;
1505
55.5k
  last_lpd_mode =
1506
55.5k
      pAacDecoderChannelInfo->data.usac
1507
55.5k
          .lpd_mode_last; /* could be different to what has been rendered */
1508
252k
  while (k < nbDiv) {
1509
196k
    if (mod[k] == 0) {
1510
      /* ACELP */
1511
1512
      /* If FAC (fac_data[k] != NULL), and previous frame was TCX, apply (TCX)
1513
       * gains to FAC data */
1514
130k
      if (last_lpd_mode > 0 && last_lpd_mode != 255 &&
1515
37.5k
          pAacDecoderChannelInfo->data.usac.fac_data[k]) {
1516
37.5k
        CFac_ApplyGains(pAacDecoderChannelInfo->data.usac.fac_data[k],
1517
37.5k
                        pAacDecoderChannelInfo->granuleLength,
1518
37.5k
                        pAacDecoderStaticChannelInfo->last_tcx_gain,
1519
37.5k
                        pAacDecoderStaticChannelInfo->last_alfd_gains,
1520
37.5k
                        (last_lpd_mode < 4) ? last_lpd_mode : 3);
1521
1522
37.5k
        pAacDecoderChannelInfo->data.usac.fac_data_e[k] +=
1523
37.5k
            pAacDecoderStaticChannelInfo->last_tcx_gain_e;
1524
37.5k
      }
1525
130k
    } else {
1526
      /* TCX */
1527
66.5k
      CLpd_TcxDecode(pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo,
1528
66.5k
                     flags, mod[k], last_lpd_mode, k, 1 /* frameOk == 1 */
1529
66.5k
      );
1530
1531
      /* Store TCX gain scale for next possible FAC transition. */
1532
66.5k
      pAacDecoderStaticChannelInfo->last_tcx_gain =
1533
66.5k
          pAacDecoderChannelInfo->data.usac.tcx_gain[k];
1534
66.5k
      pAacDecoderStaticChannelInfo->last_tcx_gain_e =
1535
66.5k
          pAacDecoderChannelInfo->data.usac.tcx_gain_e[k];
1536
1537
      /* If FAC (fac_data[k] != NULL), apply gains */
1538
66.5k
      if (last_lpd_mode == 0 && pAacDecoderChannelInfo->data.usac.fac_data[k]) {
1539
23.8k
        CFac_ApplyGains(
1540
23.8k
            pAacDecoderChannelInfo->data.usac.fac_data[k],
1541
23.8k
            pAacDecoderChannelInfo->granuleLength /* == fac_length */,
1542
23.8k
            pAacDecoderChannelInfo->data.usac.tcx_gain[k],
1543
23.8k
            pAacDecoderStaticChannelInfo->last_alfd_gains, mod[k]);
1544
1545
23.8k
        pAacDecoderChannelInfo->data.usac.fac_data_e[k] +=
1546
23.8k
            pAacDecoderChannelInfo->data.usac.tcx_gain_e[k];
1547
23.8k
      }
1548
66.5k
    }
1549
1550
    /* remember previous mode */
1551
196k
    last_lpd_mode = mod[k];
1552
1553
    /* Increase k to next frame */
1554
196k
    k += (mod[k] == 0) ? 1 : (1 << (mod[k] - 1));
1555
196k
  }
1556
55.5k
}
1557
1558
AAC_DECODER_ERROR CLpd_RenderTimeSignal(
1559
    CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo,
1560
    CAacDecoderChannelInfo *pAacDecoderChannelInfo, PCM_DEC *pTimeData,
1561
    INT lFrame, SamplingRateInfo *pSamplingRateInfo, UINT frameOk,
1562
56.6k
    const INT aacOutDataHeadroom, UINT flags, UINT strmFlags) {
1563
56.6k
  UCHAR *mod = pAacDecoderChannelInfo->data.usac.mod;
1564
56.6k
  AAC_DECODER_ERROR error = AAC_DEC_OK;
1565
56.6k
  int k, i_offset;
1566
56.6k
  int last_k;
1567
56.6k
  int nrSamples = 0;
1568
56.6k
  int facFB = 1;
1569
56.6k
  int nbDiv = NB_DIV;
1570
56.6k
  int lDiv = lFrame / nbDiv; /* length of division (acelp or tcx20 frame)*/
1571
56.6k
  int lFac = lDiv / 2;
1572
56.6k
  int nbSubfr =
1573
56.6k
      lFrame / (nbDiv * L_SUBFR); /* number of subframes per division */
1574
56.6k
  int nbSubfrSuperfr = nbDiv * nbSubfr;
1575
56.6k
  int synSfd = (nbSubfrSuperfr / 2) - BPF_SFD;
1576
56.6k
  int SynDelay = synSfd * L_SUBFR;
1577
56.6k
  int aacDelay = lFrame / 2;
1578
1579
  /*
1580
   In respect to the reference software, the synth pointer here is lagging by
1581
   aacDelay ( == SYN_DELAY + BPF_DELAY ) samples. The corresponding old
1582
   synthesis samples are handled by the IMDCT overlap.
1583
   */
1584
1585
56.6k
  FIXP_DBL *synth_buf =
1586
56.6k
      pAacDecoderChannelInfo->pComStaticData->pWorkBufferCore1->synth_buf;
1587
56.6k
  FIXP_DBL *synth = synth_buf + PIT_MAX_MAX - BPF_DELAY;
1588
56.6k
  UCHAR last_lpd_mode, last_last_lpd_mode, last_lpc_lost, last_frame_lost;
1589
1590
56.6k
  INT pitch[NB_SUBFR_SUPERFR + SYN_SFD];
1591
56.6k
  FIXP_DBL pit_gain[NB_SUBFR_SUPERFR + SYN_SFD];
1592
1593
56.6k
  const int *lg_table;
1594
56.6k
  int lg_table_offset = 0;
1595
1596
56.6k
  UINT samplingRate = pSamplingRateInfo->samplingRate;
1597
1598
56.6k
  FDKmemclear(pitch, (NB_SUBFR_SUPERFR + SYN_SFD) * sizeof(INT));
1599
1600
56.6k
  if (flags & AACDEC_FLUSH) {
1601
27
    CLpd_Reset(pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo,
1602
27
               flags & AACDEC_FLUSH);
1603
27
    frameOk = 0;
1604
27
  }
1605
1606
56.6k
  switch (lFrame) {
1607
27.2k
    case 1024:
1608
27.2k
      lg_table = &lg_table_ccfl[0][lg_table_offset];
1609
27.2k
      break;
1610
29.4k
    case 768:
1611
29.4k
      lg_table = &lg_table_ccfl[1][lg_table_offset];
1612
29.4k
      break;
1613
0
    default:
1614
0
      FDK_ASSERT(0);
1615
0
      return AAC_DEC_UNKNOWN;
1616
56.6k
  }
1617
1618
56.6k
  last_frame_lost = !CConcealment_GetLastFrameOk(
1619
56.6k
      &pAacDecoderStaticChannelInfo->concealmentInfo, 0);
1620
1621
  /* Maintain LPD mode from previous frame */
1622
56.6k
  if ((pAacDecoderStaticChannelInfo->last_core_mode == FD_LONG) ||
1623
40.2k
      (pAacDecoderStaticChannelInfo->last_core_mode == FD_SHORT)) {
1624
40.2k
    pAacDecoderStaticChannelInfo->last_lpd_mode = 255;
1625
40.2k
  }
1626
1627
56.6k
  if (!frameOk) {
1628
1.13k
    FIXP_DBL old_tcx_gain;
1629
1.13k
    FIXP_SGL old_stab;
1630
1.13k
    SCHAR old_tcx_gain_e;
1631
1.13k
    int nLostSf;
1632
1633
1.13k
    last_lpd_mode = pAacDecoderStaticChannelInfo->last_lpd_mode;
1634
1.13k
    old_tcx_gain = pAacDecoderStaticChannelInfo->last_tcx_gain;
1635
1.13k
    old_tcx_gain_e = pAacDecoderStaticChannelInfo->last_tcx_gain_e;
1636
1.13k
    old_stab = pAacDecoderStaticChannelInfo->oldStability;
1637
1.13k
    nLostSf = pAacDecoderStaticChannelInfo->numLostLpdFrames;
1638
1639
    /* patch the last LPD mode */
1640
1.13k
    pAacDecoderChannelInfo->data.usac.lpd_mode_last = last_lpd_mode;
1641
1642
    /* Do mode extrapolation and repeat the previous mode:
1643
       if previous mode = ACELP        -> ACELP
1644
       if previous mode = TCX-20/40    -> TCX-20
1645
       if previous mode = TCX-80       -> TCX-80
1646
       notes:
1647
       - ACELP is not allowed after TCX (no pitch information to reuse)
1648
       - TCX-40 is not allowed in the mode repetition to keep the logic simple
1649
     */
1650
1.13k
    switch (last_lpd_mode) {
1651
595
      case 0:
1652
595
        mod[0] = mod[1] = mod[2] = mod[3] = 0; /* -> ACELP concealment */
1653
595
        break;
1654
64
      case 3:
1655
64
        mod[0] = mod[1] = mod[2] = mod[3] = 3; /* -> TCX FD concealment */
1656
64
        break;
1657
48
      case 2:
1658
48
        mod[0] = mod[1] = mod[2] = mod[3] = 2; /* -> TCX FD concealment */
1659
48
        break;
1660
337
      case 1:
1661
426
      default:
1662
426
        mod[0] = mod[1] = mod[2] = mod[3] = 4; /* -> TCX TD concealment */
1663
426
        break;
1664
1.13k
    }
1665
1666
    /* LPC extrapolation */
1667
1.13k
    CLpc_Conceal(pAacDecoderChannelInfo->data.usac.lsp_coeff,
1668
1.13k
                 pAacDecoderStaticChannelInfo->lpc4_lsf,
1669
1.13k
                 pAacDecoderStaticChannelInfo->lsf_adaptive_mean,
1670
                 /*(pAacDecoderStaticChannelInfo->numLostLpdFrames == 0) ||*/
1671
1.13k
                 (last_lpd_mode == 255));
1672
1673
1.13k
    if ((last_lpd_mode > 0) && (last_lpd_mode < 255)) {
1674
      /* Copy old LPC4 LP domain coefficients to LPC0 LP domain buffer (to avoid
1675
       * converting LSP coefficients again). */
1676
538
      FDKmemcpy(pAacDecoderChannelInfo->data.usac.lp_coeff[0],
1677
538
                pAacDecoderStaticChannelInfo->lp_coeff_old[0],
1678
538
                M_LP_FILTER_ORDER * sizeof(FIXP_LPC));
1679
538
      pAacDecoderChannelInfo->data.usac.lp_coeff_exp[0] =
1680
538
          pAacDecoderStaticChannelInfo->lp_coeff_old_exp[0];
1681
538
    } /* case last_lpd_mode was ACELP is handled by CLpd_TcxDecode() */
1682
    /* case last_lpd_mode was Time domain TCX concealment is handled after this
1683
     * "if (!frameOk)"-block */
1684
1685
    /* k is the frame index. If a frame is of size 40MS or 80MS,
1686
       this frame index is incremented 2 or 4 instead of 1 respectively. */
1687
1.13k
    k = 0;
1688
5.37k
    while (k < nbDiv) {
1689
4.24k
      pAacDecoderChannelInfo->data.usac.tcx_gain[k] = old_tcx_gain;
1690
4.24k
      pAacDecoderChannelInfo->data.usac.tcx_gain_e[k] = old_tcx_gain_e;
1691
1692
      /* restore stability value from last frame */
1693
4.24k
      pAacDecoderChannelInfo->data.usac.aStability[k] = old_stab;
1694
1695
      /* Increase k to next frame */
1696
4.24k
      k += ((mod[k] & 0x3) == 0) ? 1 : (1 << ((mod[k] & 0x3) - 1));
1697
1698
4.24k
      nLostSf++;
1699
4.24k
    }
1700
55.5k
  } else {
1701
55.5k
    if ((pAacDecoderStaticChannelInfo->last_lpd_mode == 4) && (mod[0] > 0)) {
1702
      /* Copy old LPC4 LP domain coefficients to LPC0 LP domain buffer (to avoid
1703
       * converting LSP coefficients again). */
1704
3
      FDKmemcpy(pAacDecoderChannelInfo->data.usac.lp_coeff[0],
1705
3
                pAacDecoderStaticChannelInfo->lp_coeff_old[0],
1706
3
                M_LP_FILTER_ORDER * sizeof(FIXP_LPC));
1707
3
      pAacDecoderChannelInfo->data.usac.lp_coeff_exp[0] =
1708
3
          pAacDecoderStaticChannelInfo->lp_coeff_old_exp[0];
1709
3
    }
1710
55.5k
  }
1711
1712
56.6k
  Acelp_PreProcessing(synth_buf, pAacDecoderStaticChannelInfo->old_synth, pitch,
1713
56.6k
                      pAacDecoderStaticChannelInfo->old_T_pf, pit_gain,
1714
56.6k
                      pAacDecoderStaticChannelInfo->old_gain_pf, samplingRate,
1715
56.6k
                      &i_offset, lFrame, synSfd, nbSubfrSuperfr);
1716
1717
  /* k is the frame index. If a frame is of size 40MS or 80MS,
1718
     this frame index is incremented 2 or 4 instead of 1 respectively. */
1719
56.6k
  k = 0;
1720
56.6k
  last_k = -1; /* mark invalid */
1721
56.6k
  last_lpd_mode = pAacDecoderStaticChannelInfo->last_lpd_mode;
1722
56.6k
  last_last_lpd_mode = pAacDecoderStaticChannelInfo->last_last_lpd_mode;
1723
56.6k
  last_lpc_lost = pAacDecoderStaticChannelInfo->last_lpc_lost | last_frame_lost;
1724
1725
  /* This buffer must be avalable for the case of FD->ACELP transition. The
1726
  beginning of the buffer is used after the BPF to overwrite the output signal.
1727
  Only the FAC area must be affected by the BPF */
1728
1729
257k
  while (k < nbDiv) {
1730
201k
    if (frameOk == 0) {
1731
4.24k
      pAacDecoderStaticChannelInfo->numLostLpdFrames++;
1732
196k
    } else {
1733
196k
      last_frame_lost |=
1734
196k
          (pAacDecoderStaticChannelInfo->numLostLpdFrames > 0) ? 1 : 0;
1735
196k
      pAacDecoderStaticChannelInfo->numLostLpdFrames = 0;
1736
196k
    }
1737
201k
    if (mod[k] == 0 || mod[k] == 4) {
1738
      /* ACELP or TCX time domain concealment */
1739
134k
      FIXP_DBL *acelp_out;
1740
1741
      /* FAC management */
1742
134k
      if ((last_lpd_mode != 0) && (last_lpd_mode != 4)) /* TCX TD concealment */
1743
62.9k
      {
1744
62.9k
        FIXP_DBL *pFacData = NULL;
1745
1746
62.9k
        if (frameOk && !last_frame_lost) {
1747
62.5k
          pFacData = pAacDecoderChannelInfo->data.usac.fac_data[k];
1748
62.5k
        }
1749
1750
62.9k
        nrSamples += CLpd_FAC_Mdct2Acelp(
1751
62.9k
            &pAacDecoderStaticChannelInfo->IMdct, synth + nrSamples, pFacData,
1752
62.9k
            pAacDecoderChannelInfo->data.usac.fac_data_e[k],
1753
62.9k
            pAacDecoderChannelInfo->data.usac.lp_coeff[k],
1754
62.9k
            pAacDecoderChannelInfo->data.usac.lp_coeff_exp[k],
1755
62.9k
            lFrame - nrSamples,
1756
62.9k
            CLpd_FAC_getLength(
1757
62.9k
                (pAacDecoderStaticChannelInfo->last_core_mode != FD_SHORT) ||
1758
18.2k
                    (k > 0),
1759
62.9k
                lFac),
1760
62.9k
            (pAacDecoderStaticChannelInfo->last_core_mode != LPD) && (k == 0),
1761
62.9k
            0);
1762
1763
62.9k
        FDKmemcpy(
1764
62.9k
            synth + nrSamples, pAacDecoderStaticChannelInfo->IMdct.overlap.time,
1765
62.9k
            pAacDecoderStaticChannelInfo->IMdct.ov_offset * sizeof(FIXP_DBL));
1766
62.9k
        {
1767
62.9k
          FIXP_LPC *lp_prev =
1768
62.9k
              pAacDecoderChannelInfo->data.usac
1769
62.9k
                  .lp_coeff[0]; /* init value does not real matter */
1770
62.9k
          INT lp_prev_exp = pAacDecoderChannelInfo->data.usac.lp_coeff_exp[0];
1771
1772
62.9k
          if (last_lpd_mode != 255) { /* last mode was tcx */
1773
37.4k
            last_k = k - (1 << (last_lpd_mode - 1));
1774
37.4k
            if (last_k < 0) {
1775
1.79k
              lp_prev = pAacDecoderStaticChannelInfo->lp_coeff_old[1];
1776
1.79k
              lp_prev_exp = pAacDecoderStaticChannelInfo->lp_coeff_old_exp[1];
1777
35.7k
            } else {
1778
35.7k
              lp_prev = pAacDecoderChannelInfo->data.usac.lp_coeff[last_k];
1779
35.7k
              lp_prev_exp =
1780
35.7k
                  pAacDecoderChannelInfo->data.usac.lp_coeff_exp[last_k];
1781
35.7k
            }
1782
37.4k
          }
1783
1784
62.9k
          CLpd_AcelpPrepareInternalMem(
1785
62.9k
              synth + aacDelay + k * lDiv, last_lpd_mode,
1786
62.9k
              (last_last_lpd_mode == 4) ? 0 : last_last_lpd_mode,
1787
62.9k
              pAacDecoderChannelInfo->data.usac.lp_coeff[k],
1788
62.9k
              pAacDecoderChannelInfo->data.usac.lp_coeff_exp[k], lp_prev,
1789
62.9k
              lp_prev_exp, &pAacDecoderStaticChannelInfo->acelp, lFrame,
1790
62.9k
              (last_frame_lost && k < 2), mod[k]);
1791
62.9k
        }
1792
71.4k
      } else {
1793
71.4k
        if (k == 0 && pAacDecoderStaticChannelInfo->IMdct.ov_offset !=
1794
3.75k
                          lFrame / facFB / 2) {
1795
0
          pAacDecoderStaticChannelInfo->IMdct.ov_offset = lFrame / facFB / 2;
1796
0
        }
1797
71.4k
        nrSamples += imdct_drain(&pAacDecoderStaticChannelInfo->IMdct,
1798
71.4k
                                 synth + nrSamples, lFrame / facFB - nrSamples);
1799
71.4k
      }
1800
1801
134k
      if (nrSamples >= lFrame / facFB) {
1802
        /* Write ACELP time domain samples into IMDCT overlap buffer at
1803
         * pAacDecoderStaticChannelInfo->IMdct.overlap.time +
1804
         * pAacDecoderStaticChannelInfo->IMdct.ov_offset
1805
         */
1806
75.0k
        acelp_out = pAacDecoderStaticChannelInfo->IMdct.overlap.time +
1807
75.0k
                    pAacDecoderStaticChannelInfo->IMdct.ov_offset;
1808
1809
        /* Account ACELP time domain output samples to overlap buffer */
1810
75.0k
        pAacDecoderStaticChannelInfo->IMdct.ov_offset += lDiv;
1811
75.0k
      } else {
1812
        /* Write ACELP time domain samples into output buffer at pTimeData +
1813
         * nrSamples */
1814
59.3k
        acelp_out = synth + nrSamples;
1815
1816
        /* Account ACELP time domain output samples to output buffer */
1817
59.3k
        nrSamples += lDiv;
1818
59.3k
      }
1819
1820
134k
      if (mod[k] == 4) {
1821
1.70k
        pAacDecoderStaticChannelInfo->acelp.wsyn_rms = scaleValue(
1822
1.70k
            pAacDecoderChannelInfo->data.usac.tcx_gain[k],
1823
1.70k
            fixMin(0,
1824
1.70k
                   pAacDecoderChannelInfo->data.usac.tcx_gain_e[k] - SF_EXC));
1825
1.70k
        CLpd_TcxTDConceal(&pAacDecoderStaticChannelInfo->acelp,
1826
1.70k
                          &pAacDecoderStaticChannelInfo->last_tcx_pitch,
1827
1.70k
                          pAacDecoderChannelInfo->data.usac.lsp_coeff[k],
1828
1.70k
                          pAacDecoderChannelInfo->data.usac.lsp_coeff[k + 1],
1829
1.70k
                          pAacDecoderChannelInfo->data.usac.aStability[k],
1830
1.70k
                          pAacDecoderStaticChannelInfo->numLostLpdFrames,
1831
1.70k
                          acelp_out, lFrame,
1832
1.70k
                          pAacDecoderStaticChannelInfo->last_tcx_noise_factor);
1833
1834
132k
      } else {
1835
132k
        FDK_ASSERT(pAacDecoderChannelInfo->data.usac.aStability[k] >=
1836
132k
                   (FIXP_SGL)0);
1837
132k
        CLpd_AcelpDecode(&pAacDecoderStaticChannelInfo->acelp, i_offset,
1838
132k
                         pAacDecoderChannelInfo->data.usac.lsp_coeff[k],
1839
132k
                         pAacDecoderChannelInfo->data.usac.lsp_coeff[k + 1],
1840
132k
                         pAacDecoderChannelInfo->data.usac.aStability[k],
1841
132k
                         &pAacDecoderChannelInfo->data.usac.acelp[k],
1842
132k
                         pAacDecoderStaticChannelInfo->numLostLpdFrames,
1843
132k
                         last_lpc_lost, k, acelp_out,
1844
132k
                         &pitch[(k * nbSubfr) + synSfd],
1845
132k
                         &pit_gain[(k * nbSubfr) + synSfd], lFrame);
1846
132k
      }
1847
1848
134k
      if (mod[k] != 4) {
1849
132k
        if (last_lpd_mode != 0 &&
1850
62.6k
            pAacDecoderChannelInfo->data.usac
1851
62.6k
                .bpf_control_info) { /* FD/TCX -> ACELP transition */
1852
          /* bass post-filter past FAC area (past two (one for FD short)
1853
           * subframes) */
1854
28.2k
          int currentSf = synSfd + k * nbSubfr;
1855
1856
28.2k
          if ((k > 0) || (pAacDecoderStaticChannelInfo->last_core_mode !=
1857
20.7k
                          FD_SHORT)) { /* TCX or FD long -> ACELP */
1858
20.7k
            pitch[currentSf - 2] = pitch[currentSf - 1] = pitch[currentSf];
1859
20.7k
            pit_gain[currentSf - 2] = pit_gain[currentSf - 1] =
1860
20.7k
                pit_gain[currentSf];
1861
20.7k
          } else { /* FD short -> ACELP */
1862
7.56k
            pitch[currentSf - 1] = pitch[currentSf];
1863
7.56k
            pit_gain[currentSf - 1] = pit_gain[currentSf];
1864
7.56k
          }
1865
28.2k
        }
1866
132k
      }
1867
134k
    } else { /* TCX */
1868
66.7k
      int lg = lg_table[mod[k]];
1869
66.7k
      int isFullBandLpd = 0;
1870
1871
      /* FAC management */
1872
66.7k
      if ((last_lpd_mode == 0) || (last_lpd_mode == 4)) /* TCX TD concealment */
1873
30.7k
      {
1874
30.7k
        C_AALLOC_SCRATCH_START(fac_buf, FIXP_DBL, 1024 / 8);
1875
1876
        /* pAacDecoderChannelInfo->data.usac.fac_data[k] == NULL means no FAC
1877
         * data available. */
1878
30.7k
        if (last_frame_lost == 1 ||
1879
30.7k
            pAacDecoderChannelInfo->data.usac.fac_data[k] == NULL) {
1880
8.24k
          FDKmemclear(fac_buf, 1024 / 8 * sizeof(FIXP_DBL));
1881
8.24k
          pAacDecoderChannelInfo->data.usac.fac_data[k] = fac_buf;
1882
8.24k
          pAacDecoderChannelInfo->data.usac.fac_data_e[k] = 0;
1883
8.24k
        }
1884
1885
30.7k
        nrSamples += CLpd_FAC_Acelp2Mdct(
1886
30.7k
            &pAacDecoderStaticChannelInfo->IMdct, synth + nrSamples,
1887
30.7k
            SPEC_TCX(pAacDecoderChannelInfo->pSpectralCoefficient, k,
1888
30.7k
                     pAacDecoderChannelInfo->granuleLength, isFullBandLpd),
1889
30.7k
            pAacDecoderChannelInfo->specScale + k, 1,
1890
30.7k
            pAacDecoderChannelInfo->data.usac.fac_data[k],
1891
30.7k
            pAacDecoderChannelInfo->data.usac.fac_data_e[k],
1892
30.7k
            pAacDecoderChannelInfo->granuleLength /* == fac_length */,
1893
30.7k
            lFrame - nrSamples, lg,
1894
30.7k
            FDKgetWindowSlope(lDiv,
1895
30.7k
                              GetWindowShape(&pAacDecoderChannelInfo->icsInfo)),
1896
30.7k
            lDiv, pAacDecoderChannelInfo->data.usac.lp_coeff[k],
1897
30.7k
            pAacDecoderChannelInfo->data.usac.lp_coeff_exp[k],
1898
30.7k
            &pAacDecoderStaticChannelInfo->acelp,
1899
30.7k
            pAacDecoderChannelInfo->data.usac.tcx_gain[k],
1900
30.7k
            (last_frame_lost || !frameOk), 0 /* is not FD FAC */
1901
30.7k
            ,
1902
30.7k
            last_lpd_mode, k,
1903
30.7k
            pAacDecoderChannelInfo
1904
30.7k
                ->currAliasingSymmetry /* Note: The current aliasing
1905
                                          symmetry for a TCX (i.e. LPD)
1906
                                          frame must always be 0 */
1907
30.7k
        );
1908
1909
30.7k
        pitch[(k * nbSubfr) + synSfd + 1] = pitch[(k * nbSubfr) + synSfd] =
1910
30.7k
            pitch[(k * nbSubfr) + synSfd - 1];
1911
30.7k
        pit_gain[(k * nbSubfr) + synSfd + 1] =
1912
30.7k
            pit_gain[(k * nbSubfr) + synSfd] =
1913
30.7k
                pit_gain[(k * nbSubfr) + synSfd - 1];
1914
1915
30.7k
        C_AALLOC_SCRATCH_END(fac_buf, FIXP_DBL, 1024 / 8);
1916
36.0k
      } else {
1917
36.0k
        int tl = lg;
1918
36.0k
        int fl = lDiv;
1919
36.0k
        int fr = lDiv;
1920
1921
36.0k
        nrSamples += imlt_block(
1922
36.0k
            &pAacDecoderStaticChannelInfo->IMdct, synth + nrSamples,
1923
36.0k
            SPEC_TCX(pAacDecoderChannelInfo->pSpectralCoefficient, k,
1924
36.0k
                     pAacDecoderChannelInfo->granuleLength, isFullBandLpd),
1925
36.0k
            pAacDecoderChannelInfo->specScale + k, 1, lFrame - nrSamples, tl,
1926
36.0k
            FDKgetWindowSlope(fl,
1927
36.0k
                              GetWindowShape(&pAacDecoderChannelInfo->icsInfo)),
1928
36.0k
            fl,
1929
36.0k
            FDKgetWindowSlope(fr,
1930
36.0k
                              GetWindowShape(&pAacDecoderChannelInfo->icsInfo)),
1931
36.0k
            fr, pAacDecoderChannelInfo->data.usac.tcx_gain[k],
1932
36.0k
            pAacDecoderChannelInfo->currAliasingSymmetry
1933
36.0k
                ? MLT_FLAG_CURR_ALIAS_SYMMETRY
1934
36.0k
                : 0);
1935
36.0k
      }
1936
66.7k
    }
1937
    /* remember previous mode */
1938
201k
    last_last_lpd_mode = last_lpd_mode;
1939
201k
    last_lpd_mode = mod[k];
1940
201k
    last_lpc_lost = (frameOk == 0) ? 1 : 0;
1941
1942
    /* Increase k to next frame */
1943
201k
    last_k = k;
1944
201k
    k += ((mod[k] & 0x3) == 0) ? 1 : (1 << (mod[k] - 1));
1945
201k
  }
1946
1947
56.6k
  if (frameOk) {
1948
    /* assume data was ok => store for concealment */
1949
55.5k
    FDK_ASSERT(pAacDecoderChannelInfo->data.usac.aStability[last_k] >=
1950
55.5k
               (FIXP_SGL)0);
1951
55.5k
    pAacDecoderStaticChannelInfo->oldStability =
1952
55.5k
        pAacDecoderChannelInfo->data.usac.aStability[last_k];
1953
55.5k
    FDKmemcpy(pAacDecoderStaticChannelInfo->lsf_adaptive_mean,
1954
55.5k
              pAacDecoderChannelInfo->data.usac.lsf_adaptive_mean_cand,
1955
55.5k
              M_LP_FILTER_ORDER * sizeof(FIXP_LPC));
1956
55.5k
  }
1957
1958
  /* store past lp coeffs for next superframe (they are only valid and needed if
1959
   * last_lpd_mode was tcx) */
1960
56.6k
  if (last_lpd_mode > 0) {
1961
12.6k
    FDKmemcpy(pAacDecoderStaticChannelInfo->lp_coeff_old[0],
1962
12.6k
              pAacDecoderChannelInfo->data.usac.lp_coeff[nbDiv],
1963
12.6k
              M_LP_FILTER_ORDER * sizeof(FIXP_LPC));
1964
12.6k
    pAacDecoderStaticChannelInfo->lp_coeff_old_exp[0] =
1965
12.6k
        pAacDecoderChannelInfo->data.usac.lp_coeff_exp[nbDiv];
1966
12.6k
    FDKmemcpy(pAacDecoderStaticChannelInfo->lp_coeff_old[1],
1967
12.6k
              pAacDecoderChannelInfo->data.usac.lp_coeff[last_k],
1968
12.6k
              M_LP_FILTER_ORDER * sizeof(FIXP_LPC));
1969
12.6k
    pAacDecoderStaticChannelInfo->lp_coeff_old_exp[1] =
1970
12.6k
        pAacDecoderChannelInfo->data.usac.lp_coeff_exp[last_k];
1971
12.6k
  }
1972
1973
56.6k
  FDK_ASSERT(nrSamples == lFrame);
1974
1975
  /* check whether usage of bass postfilter was de-activated in the bitstream;
1976
   if yes, set pitch gain to 0 */
1977
56.6k
  if (!(pAacDecoderChannelInfo->data.usac.bpf_control_info)) {
1978
27.4k
    if (mod[0] != 0 && (pAacDecoderStaticChannelInfo->old_bpf_control_info)) {
1979
3.89k
      for (int i = 2; i < nbSubfrSuperfr; i++)
1980
3.57k
        pit_gain[synSfd + i] = (FIXP_DBL)0;
1981
27.0k
    } else {
1982
404k
      for (int i = 0; i < nbSubfrSuperfr; i++)
1983
377k
        pit_gain[synSfd + i] = (FIXP_DBL)0;
1984
27.0k
    }
1985
27.4k
  }
1986
1987
  /* for bass postfilter */
1988
394k
  for (int n = 0; n < synSfd; n++) {
1989
337k
    pAacDecoderStaticChannelInfo->old_T_pf[n] = pitch[nbSubfrSuperfr + n];
1990
337k
    pAacDecoderStaticChannelInfo->old_gain_pf[n] = pit_gain[nbSubfrSuperfr + n];
1991
337k
  }
1992
1993
56.6k
  pAacDecoderStaticChannelInfo->old_bpf_control_info =
1994
56.6k
      pAacDecoderChannelInfo->data.usac.bpf_control_info;
1995
1996
56.6k
  {
1997
56.6k
    INT lookahead = -BPF_DELAY;
1998
56.6k
    int copySamp = (mod[nbDiv - 1] == 0) ? (aacDelay) : (aacDelay - lFac);
1999
2000
    /* Copy enough time domain samples from MDCT to synthesis buffer as needed
2001
     * by the bass postfilter */
2002
2003
56.6k
    lookahead += imdct_copy_ov_and_nr(&pAacDecoderStaticChannelInfo->IMdct,
2004
56.6k
                                      synth + nrSamples, copySamp);
2005
2006
56.6k
    FDK_ASSERT(lookahead == copySamp - BPF_DELAY);
2007
2008
56.6k
    FIXP_DBL *p2_synth = synth + BPF_DELAY;
2009
2010
    /* recalculate pitch gain to allow postfilering on FAC area */
2011
845k
    for (int i = 0; i < nbSubfrSuperfr; i++) {
2012
788k
      int T = pitch[i];
2013
788k
      FIXP_DBL gain = pit_gain[i];
2014
2015
788k
      if (gain > (FIXP_DBL)0) {
2016
198k
        gain = get_gain(&p2_synth[i * L_SUBFR], &p2_synth[(i * L_SUBFR) - T],
2017
198k
                        L_SUBFR);
2018
198k
        pit_gain[i] = gain;
2019
198k
      }
2020
788k
    }
2021
2022
56.6k
    {
2023
56.6k
      bass_pf_1sf_delay(p2_synth, pitch, pit_gain, lFrame, lFrame / facFB,
2024
56.6k
                        mod[nbDiv - 1] ? (SynDelay - (lDiv / 2)) : SynDelay,
2025
56.6k
                        pTimeData, aacOutDataHeadroom,
2026
56.6k
                        pAacDecoderStaticChannelInfo->mem_bpf);
2027
56.6k
    }
2028
56.6k
  }
2029
2030
0
  Acelp_PostProcessing(synth_buf, pAacDecoderStaticChannelInfo->old_synth,
2031
56.6k
                       pitch, pAacDecoderStaticChannelInfo->old_T_pf, lFrame,
2032
56.6k
                       synSfd, nbSubfrSuperfr);
2033
2034
  /* Store last mode for next super frame */
2035
56.6k
  { pAacDecoderStaticChannelInfo->last_core_mode = LPD; }
2036
56.6k
  pAacDecoderStaticChannelInfo->last_lpd_mode = last_lpd_mode;
2037
56.6k
  pAacDecoderStaticChannelInfo->last_last_lpd_mode = last_last_lpd_mode;
2038
56.6k
  pAacDecoderStaticChannelInfo->last_lpc_lost = last_lpc_lost;
2039
2040
56.6k
  return error;
2041
56.6k
}