Coverage Report

Created: 2025-11-24 06:13

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
23.6M
#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
882k
            int len) {
128
882k
  INT i, j;
129
882k
  FIXP_DBL tmp;
130
131
882k
  FDK_ASSERT((aacOutDataHeadroom - 1) >= -(MDCT_OUTPUT_SCALE));
132
133
57.3M
  for (i = 0; i < stop; i++) {
134
56.5M
    tmp = fMultDiv2(noise[i], filt[0]);  // Filt in Q-1.16
135
734M
    for (j = 1; j <= len; j++) {
136
678M
      tmp += fMult((noise[i - j] >> 1) + (noise[i + j] >> 1), filt[j]);
137
678M
    }
138
56.5M
    syn_out[i] = (PCM_DEC)(
139
56.5M
        IMDCT_SCALE((syn[i] >> 1) - (tmp >> 1), aacOutDataHeadroom - 1));
140
56.5M
  }
141
882k
}
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
69.9k
{
155
69.9k
  INT i, sf, i_subfr, T, T2, lg;
156
157
69.9k
  FIXP_DBL tmp, ener, corr, gain;
158
69.9k
  FIXP_DBL *noise, *noise_in;
159
69.9k
  FIXP_DBL
160
69.9k
  noise_buf[L_FILT + (2 * L_SUBFR)];  // L_FILT = 12, L_SUBFR = 64 => 140
161
69.9k
  const FIXP_DBL *x, *y;
162
163
69.9k
  {
164
69.9k
    noise = noise_buf + L_FILT;  // L_FILT = 12 delay of upsampling filter
165
69.9k
    noise_in = noise_buf + L_FILT + L_SUBFR;
166
    /* Input scaling of the BPF memory */
167
69.9k
    scaleValues(mem_bpf, (L_FILT + L_SUBFR), 1);
168
69.9k
  }
169
170
69.9k
  int gain_exp = 17;
171
172
69.9k
  sf = 0;
173
952k
  for (i_subfr = 0; i_subfr < l_frame; i_subfr += L_SUBFR, sf++) {
174
882k
    T = T_sf[sf];
175
882k
    gain = pit_gain[sf];
176
177
    /* Gain is in Q17.14 */
178
    /* If gain > 1 set to 1 */
179
882k
    if (gain > (FIXP_DBL)(1 << 14)) gain = (FIXP_DBL)(1 << 14);
180
181
    /* If gain < 0 set to 0 */
182
882k
    if (gain < (FIXP_DBL)0) gain = (FIXP_DBL)0;
183
184
882k
    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
185k
      T2 = T >> 1;
188
185k
      x = &syn[i_subfr - L_EXTRA];
189
185k
      y = &syn[i_subfr - T2 - L_EXTRA];
190
191
185k
      ener = (FIXP_DBL)0;
192
185k
      corr = (FIXP_DBL)0;
193
185k
      tmp = (FIXP_DBL)0;
194
195
185k
      int headroom_x = getScalefactor(x, L_SUBFR + L_EXTRA);
196
185k
      int headroom_y = getScalefactor(y, L_SUBFR + L_EXTRA);
197
198
185k
      int width_shift = 7;
199
200
29.8M
      for (i = 0; i < (L_SUBFR + L_EXTRA); i++) {
201
29.6M
        ener += fPow2Div2((x[i] << headroom_x)) >> width_shift;
202
29.6M
        corr += fMultDiv2((x[i] << headroom_x), (y[i] << headroom_y)) >>
203
29.6M
                width_shift;
204
29.6M
        tmp += fPow2Div2((y[i] << headroom_y)) >> width_shift;
205
29.6M
      }
206
207
185k
      int exp_ener = ((17 - headroom_x) << 1) + width_shift + 1;
208
185k
      int exp_corr = (17 - headroom_x) + (17 - headroom_y) + width_shift + 1;
209
185k
      int exp_tmp = ((17 - headroom_y) << 1) + width_shift + 1;
210
211
      /* Add 0.01 to "ener". Adjust exponents */
212
185k
      FIXP_DBL point_zero_one = (FIXP_DBL)0x51eb851f; /* In Q-6.37 */
213
185k
      int diff;
214
185k
      ener = fAddNorm(ener, exp_ener, point_zero_one, -6, &exp_ener);
215
185k
      corr = fAddNorm(corr, exp_corr, point_zero_one, -6, &exp_corr);
216
185k
      tmp = fAddNorm(tmp, exp_tmp, point_zero_one, -6, &exp_tmp);
217
218
      /* use T2 if normalized correlation > 0.95 */
219
185k
      INT s1, s2;
220
185k
      s1 = CntLeadingZeros(ener) - 1;
221
185k
      s2 = CntLeadingZeros(tmp) - 1;
222
223
185k
      FIXP_DBL ener_by_tmp = fMultDiv2(ener << s1, tmp << s2);
224
185k
      int ener_by_tmp_exp = (exp_ener - s1) + (exp_tmp - s2) + 1;
225
226
185k
      if (ener_by_tmp_exp & 1) {
227
95.2k
        ener_by_tmp <<= 1;
228
95.2k
        ener_by_tmp_exp -= 1;
229
95.2k
      }
230
231
185k
      int temp_exp = 0;
232
233
185k
      FIXP_DBL temp1 = invSqrtNorm2(ener_by_tmp, &temp_exp);
234
235
185k
      int temp1_exp = temp_exp - (ener_by_tmp_exp >> 1);
236
237
185k
      FIXP_DBL tmp_result = fMult(corr, temp1);
238
239
185k
      int tmp_result_exp = exp_corr + temp1_exp;
240
241
185k
      diff = tmp_result_exp - 0;
242
185k
      FIXP_DBL point95 = FL2FXCONST_DBL(0.95f);
243
185k
      if (diff >= 0) {
244
93.3k
        diff = fMin(diff, 31);
245
93.3k
        point95 = FL2FXCONST_DBL(0.95f) >> diff;
246
93.3k
      } else {
247
92.1k
        diff = fMax(diff, -31);
248
92.1k
        tmp_result >>= (-diff);
249
92.1k
      }
250
251
185k
      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
185k
      lg = l_frame + l_next - T - i_subfr;
258
259
185k
      if (lg > L_SUBFR)
260
184k
        lg = L_SUBFR;
261
575
      else if (lg < 0)
262
253
        lg = 0;
263
264
      /* limit gain to avoid problem on burst */
265
185k
      if (lg > 0) {
266
185k
        FIXP_DBL tmp1;
267
268
        /* max(lg) = 64 => scale with 6 bits minus 1 (fPow2Div2) */
269
270
185k
        s1 = getScalefactor(&syn[i_subfr], lg);
271
185k
        s2 = getScalefactor(&syn[i_subfr + T], lg);
272
185k
        INT s = fixMin(s1, s2);
273
274
185k
        tmp = (FIXP_DBL)0;
275
185k
        ener = (FIXP_DBL)0;
276
12.0M
        for (i = 0; i < lg; i++) {
277
11.8M
          tmp += fPow2Div2(syn[i + i_subfr] << s1) >> (SF_PITCH_TRACK);
278
11.8M
          ener += fPow2Div2(syn[i + i_subfr + T] << s2) >> (SF_PITCH_TRACK);
279
11.8M
        }
280
185k
        tmp = tmp >> fMin(DFRACT_BITS - 1, (2 * (s1 - s)));
281
185k
        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
185k
        if (ener <= (FIXP_DBL)0) {
288
13.0k
          ener = (FIXP_DBL)1;
289
13.0k
        }
290
185k
        if (tmp <= (FIXP_DBL)0) {
291
1.53k
          tmp = (FIXP_DBL)1;
292
1.53k
        }
293
185k
        FDK_ASSERT(ener > (FIXP_DBL)0);
294
295
        /* tmp = sqrt(tmp/ener) */
296
185k
        int result_e = 0;
297
185k
        tmp1 = fDivNorm(tmp, ener, &result_e);
298
185k
        if (result_e & 1) {
299
100k
          tmp1 >>= 1;
300
100k
          result_e += 1;
301
100k
        }
302
185k
        tmp = sqrtFixp(tmp1);
303
185k
        result_e >>= 1;
304
305
185k
        gain_exp = 17;
306
307
185k
        diff = result_e - gain_exp;
308
309
185k
        FIXP_DBL gain1 = gain;
310
311
185k
        if (diff >= 0) {
312
0
          diff = fMin(diff, 31);
313
0
          gain1 >>= diff;
314
185k
        } else {
315
185k
          result_e += (-diff);
316
185k
          diff = fMax(diff, -31);
317
185k
          tmp >>= (-diff);
318
185k
        }
319
320
185k
        if (tmp < gain1) {
321
31.6k
          gain = tmp;
322
31.6k
          gain_exp = result_e;
323
31.6k
        }
324
185k
      }
325
326
      /* calculate noise based on voiced pitch */
327
      /* fMultDiv2() replaces weighting of gain with 0.5 */
328
185k
      diff = gain_exp - 17;
329
185k
      if (diff >= 0) {
330
185k
        gain <<= diff;
331
185k
      } else {
332
0
        gain >>= (-diff);
333
0
      }
334
335
185k
      s1 = CntLeadingZeros(gain) - 1;
336
185k
      s1 -= 16; /* Leading bits for SGL */
337
338
185k
      FIXP_SGL gainSGL = FX_DBL2FX_SGL(gain << 16);
339
340
185k
      gainSGL = gainSGL << s1;
341
342
185k
      {
343
12.0M
        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
11.8M
          noise_in[i] =
347
11.8M
              scaleValue(fMultDiv2(gainSGL, (syn[i + i_subfr] >> 1) -
348
11.8M
                                                (syn[i + i_subfr - T] >> 2) -
349
11.8M
                                                (syn[i + i_subfr + T] >> 2)),
350
11.8M
                         2 - s1);
351
11.8M
        }
352
353
213k
        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
27.6k
          noise_in[i] =
357
27.6k
              scaleValue(fMultDiv2(gainSGL, (syn[i + i_subfr] >> 1) -
358
27.6k
                                                (syn[i + i_subfr - T] >> 1)),
359
27.6k
                         2 - s1);
360
27.6k
        }
361
185k
      }
362
697k
    } else {
363
697k
      FDKmemset(noise_in, (FIXP_DBL)0, L_SUBFR * sizeof(FIXP_DBL));
364
697k
    }
365
366
882k
    {
367
882k
      FDKmemcpy(noise_buf, mem_bpf, (L_FILT + L_SUBFR) * sizeof(FIXP_DBL));
368
369
882k
      FDKmemcpy(mem_bpf, noise_buf + L_SUBFR,
370
882k
                (L_FILT + L_SUBFR) * sizeof(FIXP_DBL));
371
882k
    }
372
373
    /* substract from voiced speech low-pass filtered noise */
374
    /* filter coefficients are scaled with factor SF_FILT_LP (1) */
375
376
882k
    {
377
882k
      filtLP(&syn[i_subfr - L_SUBFR], &synth_out[i_subfr], noise,
378
882k
             fdk_dec_filt_lp, aacOutDataHeadroom, L_SUBFR, L_FILT);
379
882k
    }
380
882k
  }
381
382
69.9k
  {
383
384
69.9k
  }
385
386
  // To be determined (info from Ben)
387
69.9k
  {
388
    /* Output scaling of the BPF memory */
389
69.9k
    scaleValues(mem_bpf, (L_FILT + L_SUBFR), -1);
390
    /* Copy the rest of the signal (after the fac) */
391
69.9k
    scaleValuesSaturate(
392
69.9k
        (PCM_DEC *)&synth_out[l_frame], (FIXP_DBL *)&syn[l_frame - L_SUBFR],
393
69.9k
        (frame_length - l_frame), MDCT_OUT_HEADROOM - aacOutDataHeadroom);
394
69.9k
  }
395
396
69.9k
  return;
397
69.9k
}
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
4.36M
#define ALFDPOW2_SCALE 3
420
/*static*/
421
void CLpd_AdaptLowFreqDeemph(FIXP_DBL x[], int lg, FIXP_DBL alfd_gains[],
422
55.6k
                             INT s) {
423
55.6k
  {
424
55.6k
    int i, j, k, i_max;
425
55.6k
    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
55.6k
    FIXP_DBL tmp_pow2[32];
430
431
55.6k
    s = s * 2 + ALFDPOW2_SCALE;
432
55.6k
    s = fMin(31, s);
433
434
55.6k
    k = 8;
435
55.6k
    i_max = lg / 4; /* ALFD range = 1600Hz (lg = 6400Hz) */
436
437
    /* find spectral peak */
438
55.6k
    max = FL2FX_DBL(0.01f) >> s;
439
594k
    for (i = 0; i < i_max; i += k) {
440
538k
      FIXP_DBL tmp;
441
442
538k
      tmp = FIXP_DBL(0);
443
538k
      FIXP_DBL *pX = &x[i];
444
445
538k
      j = 8;
446
2.15M
      do {
447
2.15M
        FIXP_DBL x0 = *pX++;
448
2.15M
        FIXP_DBL x1 = *pX++;
449
2.15M
        x0 = fPow2Div2(x0);
450
2.15M
        x1 = fPow2Div2(x1);
451
2.15M
        tmp = tmp + (x0 >> (ALFDPOW2_SCALE - 1));
452
2.15M
        tmp = tmp + (x1 >> (ALFDPOW2_SCALE - 1));
453
2.15M
      } while ((j = j - 2) != 0);
454
538k
      tmp = fMax(tmp, (FL2FX_DBL(0.01f) >> s));
455
538k
      tmp_pow2[i >> 3] = tmp;
456
538k
      if (tmp > max) {
457
80.8k
        max = tmp;
458
80.8k
      }
459
538k
    }
460
461
    /* deemphasis of all blocks below the peak */
462
55.6k
    fac = FL2FX_DBL(0.1f) >> 1;
463
594k
    for (i = 0; i < i_max; i += k) {
464
538k
      FIXP_DBL tmp;
465
538k
      INT shifti;
466
467
538k
      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
538k
      {
476
538k
        INT sd;
477
478
538k
        if (tmp != (FIXP_DBL)0) {
479
533k
          tmp = fDivNorm(max, tmp, &sd);
480
533k
          if (sd & 1) {
481
373k
            sd++;
482
373k
            tmp >>= 1;
483
373k
          }
484
533k
        } else {
485
5.33k
          tmp = (FIXP_DBL)MAXVAL_DBL;
486
5.33k
          sd = 0;
487
5.33k
        }
488
538k
        tmp = invSqrtNorm2(tmp, &shifti);
489
538k
        tmp = scaleValue(tmp, shifti - 1 - (sd / 2));
490
538k
      }
491
538k
      if (tmp > fac) {
492
97.8k
        fac = tmp;
493
97.8k
      }
494
538k
      FIXP_DBL *pX = &x[i];
495
496
538k
      j = 8;
497
2.15M
      do {
498
2.15M
        FIXP_DBL x0 = pX[0];
499
2.15M
        FIXP_DBL x1 = pX[1];
500
2.15M
        x0 = fMultDiv2(x0, fac);
501
2.15M
        x1 = fMultDiv2(x1, fac);
502
2.15M
        x0 = x0 << 2;
503
2.15M
        x1 = x1 << 2;
504
2.15M
        *pX++ = x0;
505
2.15M
        *pX++ = x1;
506
507
2.15M
      } while ((j = j - 2) != 0);
508
      /* Store gains for FAC */
509
538k
      *alfd_gains++ = fac;
510
538k
    }
511
55.6k
  }
512
55.6k
}
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
20.3M
#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
55.6k
                             const INT A2_exp) {
546
55.6k
  FIXP_DBL *tmp2 = NULL;
547
55.6k
  FIXP_DBL rr_minus_one;
548
55.6k
  int i, k, s, step;
549
550
55.6k
  C_AALLOC_SCRATCH_START(tmp1, FIXP_DBL, FDNS_NPTS * 8)
551
552
55.6k
  {
553
55.6k
    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
55.6k
    FIXP_DBL f = FL2FXCONST_DBL(0.92f);
560
561
55.6k
    const FIXP_STP *SinTab;
562
55.6k
    int k_step;
563
    /* needed values: sin(phi), cos(phi); phi = i*PI/(2*fdns_npts), i = 0 ...
564
     * M_LP_FILTER_ORDER */
565
55.6k
    switch (fdns_npts) {
566
26.5k
      case 64:
567
26.5k
        SinTab = SineTable512;
568
26.5k
        k_step = (512 / 64);
569
26.5k
        FDK_ASSERT(512 >= 64);
570
26.5k
        break;
571
29.0k
      case 48:
572
29.0k
        SinTab = SineTable384;
573
29.0k
        k_step = 384 / 48;
574
29.0k
        FDK_ASSERT(384 >= 48);
575
29.0k
        break;
576
29.0k
      default:
577
0
        FDK_ASSERT(0);
578
0
        return;
579
55.6k
    }
580
581
946k
    for (i = 0, k = k_step; i < M_LP_FILTER_ORDER; i++, k += k_step) {
582
891k
      FIXP_STP cs = SinTab[k];
583
891k
      FIXP_DBL wA1, wA2;
584
585
891k
      wA1 = fMult(A1[i], f);
586
891k
      wA2 = fMult(A2[i], f);
587
588
      /* r[i] = A[i]*cos() */
589
891k
      tmp1[2 + i * 2] = fMult(wA1, cs.v.re);
590
891k
      tmp2[2 + i * 2] = fMult(wA2, cs.v.re);
591
      /* i[i] = A[i]*sin() */
592
891k
      tmp1[3 + i * 2] = -fMult(wA1, cs.v.im);
593
891k
      tmp2[3 + i * 2] = -fMult(wA2, cs.v.im);
594
595
891k
      f = fMult(f, FL2FXCONST_DBL(0.92f));
596
891k
    }
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
55.6k
    int A1_exp_fix = fMax(3, A1_exp + 2);
602
55.6k
    int A2_exp_fix = fMax(3, A2_exp + 2);
603
604
    /* Set 1.0 in the proper format */
605
55.6k
    tmp1[0] = (FIXP_DBL)(INT)((ULONG)0x80000000 >> A1_exp_fix);
606
55.6k
    tmp2[0] = (FIXP_DBL)(INT)((ULONG)0x80000000 >> A2_exp_fix);
607
608
55.6k
    tmp1[1] = tmp2[1] = (FIXP_DBL)0;
609
610
    /* Clear the resto of the array */
611
55.6k
    FDKmemclear(
612
55.6k
        tmp1 + 2 * (M_LP_FILTER_ORDER + 1),
613
55.6k
        2 * (fdns_npts * 2 - (M_LP_FILTER_ORDER + 1)) * sizeof(FIXP_DBL));
614
55.6k
    FDKmemclear(
615
55.6k
        tmp2 + 2 * (M_LP_FILTER_ORDER + 1),
616
55.6k
        2 * (fdns_npts * 2 - (M_LP_FILTER_ORDER + 1)) * sizeof(FIXP_DBL));
617
618
    /* Guarantee 2 bits of headroom for FFT */
619
55.6k
    scaleValues(&tmp1[2], (2 * M_LP_FILTER_ORDER), (A1_exp - A1_exp_fix));
620
55.6k
    scaleValues(&tmp2[2], (2 * M_LP_FILTER_ORDER), (A2_exp - A2_exp_fix));
621
622
55.6k
    INT s2;
623
55.6k
    s = A1_exp_fix;
624
55.6k
    s2 = A2_exp_fix;
625
626
55.6k
    fft(2 * fdns_npts, tmp1, &s);
627
55.6k
    fft(2 * fdns_npts, tmp2, &s2);
628
629
    /* Adjust the exponents of both fft outputs if necessary*/
630
55.6k
    if (s > s2) {
631
2.60k
      scaleValues(tmp2, 2 * fdns_npts, s2 - s);
632
2.60k
      s2 = s;
633
53.0k
    } else if (s < s2) {
634
6.31k
      scaleValues(tmp1, 2 * fdns_npts, s - s2);
635
6.31k
      s = s2;
636
6.31k
    }
637
638
55.6k
    FDK_ASSERT(s == s2);
639
55.6k
  }
640
641
  /* Get amplitude and apply gains */
642
55.6k
  step = lg / fdns_npts;
643
55.6k
  rr_minus_one = (FIXP_DBL)0;
644
645
3.15M
  for (k = 0; k < fdns_npts; k++) {
646
3.09M
    FIXP_DBL g1, g2, inv_g1_g2, a, b;
647
3.09M
    INT inv_g1_g2_e;
648
3.09M
    int g_e, shift;
649
650
3.09M
    {
651
3.09M
      FIXP_DBL real, imag;
652
3.09M
      int si1, si2, sInput;
653
654
3.09M
      real = tmp1[k * 2];
655
3.09M
      imag = tmp1[k * 2 + 1];
656
3.09M
      sInput = fMax(fMin(fNorm(real), fNorm(imag)) - 1, 0);
657
3.09M
      real <<= sInput;
658
3.09M
      imag <<= sInput;
659
      /* g1_e = si1 - 2*s/2 */
660
3.09M
      g1 = invSqrtNorm2(fPow2(real) + fPow2(imag), &si1);
661
3.09M
      si1 += sInput;
662
663
3.09M
      real = tmp2[k * 2];
664
3.09M
      imag = tmp2[k * 2 + 1];
665
3.09M
      sInput = fMax(fMin(fNorm(real), fNorm(imag)) - 1, 0);
666
3.09M
      real <<= sInput;
667
3.09M
      imag <<= sInput;
668
      /* g2_e = si2 - 2*s/2 */
669
3.09M
      g2 = invSqrtNorm2(fPow2(real) + fPow2(imag), &si2);
670
3.09M
      si2 += sInput;
671
672
      /* Pick a common scale factor for g1 and g2 */
673
3.09M
      if (si1 > si2) {
674
727k
        g2 >>= si1 - si2;
675
727k
        g_e = si1 - s;
676
2.37M
      } else {
677
2.37M
        g1 >>= si2 - si1;
678
2.37M
        g_e = si2 - s;
679
2.37M
      }
680
3.09M
    }
681
682
    /* end of lpc2mdct() */
683
684
3.09M
    FDK_ASSERT(g1 >= (FIXP_DBL)0);
685
3.09M
    FDK_ASSERT(g2 >= (FIXP_DBL)0);
686
687
    /* mdct_IntNoiseShaping() */
688
3.09M
    {
689
      /* inv_g1_g2 * 2^inv_g1_g2_e = 1/(g1+g2) */
690
3.09M
      inv_g1_g2 = (g1 >> 1) + (g2 >> 1);
691
3.09M
      if (inv_g1_g2 != (FIXP_DBL)0) {
692
3.09M
        inv_g1_g2 = fDivNorm(FL2FXCONST_DBL(0.5f), inv_g1_g2, &inv_g1_g2_e);
693
3.09M
        inv_g1_g2_e = inv_g1_g2_e - g_e;
694
3.09M
      } else {
695
0
        inv_g1_g2 = (FIXP_DBL)MAXVAL_DBL;
696
0
        inv_g1_g2_e = 0;
697
0
      }
698
699
3.09M
      if (g_e < 0) {
700
        /* a_e = g_e + inv_g1_g2_e + 1 */
701
358k
        a = scaleValue(fMult(fMult(g1, g2), inv_g1_g2), g_e);
702
        /* b_e = g_e + inv_g1_g2_e */
703
358k
        b = fMult(g2 - g1, inv_g1_g2);
704
358k
        shift = g_e + inv_g1_g2_e + 1 - NSHAPE_SCALE;
705
2.74M
      } else {
706
        /* a_e = (g_e+g_e) + inv_g1_g2_e + 1 */
707
2.74M
        a = fMult(fMult(g1, g2), inv_g1_g2);
708
        /* b_e = (g_e+g_e) + inv_g1_g2_e */
709
2.74M
        b = scaleValue(fMult(g2 - g1, inv_g1_g2), -g_e);
710
2.74M
        shift = (g_e + g_e) + inv_g1_g2_e + 1 - NSHAPE_SCALE;
711
2.74M
      }
712
713
20.3M
      for (i = k * step; i < (k + 1) * step; i++) {
714
17.2M
        FIXP_DBL tmp;
715
716
        /* rr[i] = 2*a*r[i] + b*rr[i-1] */
717
17.2M
        tmp = fMult(a, r[i]);
718
17.2M
        tmp += scaleValue(fMultDiv2(b, rr_minus_one), NSHAPE_SCALE);
719
17.2M
        tmp = scaleValueSaturate(tmp, shift);
720
17.2M
        rr_minus_one = tmp;
721
17.2M
        r[i] = tmp;
722
17.2M
      }
723
3.09M
    }
724
3.09M
  }
725
726
  /* end of mdct_IntNoiseShaping() */
727
55.6k
  { *pScale += NSHAPE_SCALE; }
728
729
55.6k
  C_AALLOC_SCRATCH_END(tmp1, FIXP_DBL, FDNS_NPTS * 8)
730
55.6k
}
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
55.6k
                           INT *rms_e) {
742
55.6k
  int headroom = getScalefactor(r, lg);
743
744
55.6k
  FIXP_DBL rms_m = 0;
745
746
  /* Calculate number of growth bits due to addition */
747
55.6k
  INT shift = (INT)(fNormz((FIXP_DBL)lg));
748
55.6k
  shift = 31 - shift;
749
750
  /* Generate 1e-2 in Q-6.37 */
751
55.6k
  const FIXP_DBL value0_01 = 0x51eb851e;
752
55.6k
  const INT value0_01_exp = -6;
753
754
  /* Find the exponent of the resulting energy value */
755
55.6k
  *rms_e = ((rs - headroom) << 1) + shift + 1;
756
757
55.6k
  INT delta = *rms_e - value0_01_exp;
758
55.6k
  if (delta > 0) {
759
    /* Limit shift_to 31*/
760
55.6k
    delta = fMin(31, delta);
761
55.6k
    rms_m = value0_01 >> delta;
762
55.6k
  } 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
17.2M
  for (int i = 0; i < lg; i++) {
771
17.2M
    rms_m += fPow2Div2(r[i] << headroom) >> shift;
772
17.2M
  }
773
774
55.6k
  return rms_m;
775
55.6k
}
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
55.6k
                        const INT lg) {
794
55.6k
  if ((rms_m != (FIXP_DBL)0)) {
795
55.6k
    FIXP_DBL tcx_gain_m;
796
55.6k
    INT tcx_gain_e;
797
798
55.6k
    CLpd_DecodeGain(&tcx_gain_m, &tcx_gain_e,
799
55.6k
                    pAacDecoderChannelInfo->pDynData->specificTo.usac
800
55.6k
                        .tcx_global_gain[frame]);
801
802
    /* rms * 2^rms_e = lg/sqrt(sum(spec^2)) */
803
55.6k
    if (rms_e & 1) {
804
27.3k
      rms_m >>= 1;
805
27.3k
      rms_e++;
806
27.3k
    }
807
808
55.6k
    {
809
55.6k
      FIXP_DBL fx_lg;
810
55.6k
      INT fx_lg_e, s;
811
55.6k
      INT inv_e;
812
813
      /* lg = fx_lg * 2^fx_lg_e */
814
55.6k
      s = fNorm((FIXP_DBL)lg);
815
55.6k
      fx_lg = (FIXP_DBL)lg << s;
816
55.6k
      fx_lg_e = DFRACT_BITS - 1 - s;
817
      /* 1/sqrt(rms) */
818
55.6k
      rms_m = invSqrtNorm2(rms_m, &inv_e);
819
55.6k
      rms_m = fMult(rms_m, fx_lg);
820
55.6k
      rms_e = inv_e - (rms_e >> 1) + fx_lg_e;
821
55.6k
    }
822
823
55.6k
    {
824
55.6k
      int s = fNorm(tcx_gain_m);
825
55.6k
      tcx_gain_m = tcx_gain_m << s;
826
55.6k
      tcx_gain_e -= s;
827
55.6k
    }
828
829
55.6k
    tcx_gain_m = fMultDiv2(tcx_gain_m, rms_m);
830
55.6k
    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
55.6k
    {
835
55.6k
      { tcx_gain_e += 1; }
836
55.6k
    }
837
838
55.6k
    pAacDecoderChannelInfo->data.usac.tcx_gain[frame] = tcx_gain_m;
839
55.6k
    pAacDecoderChannelInfo->data.usac.tcx_gain_e[frame] = tcx_gain_e;
840
841
55.6k
    pAacDecoderChannelInfo->specScale[frame] += tcx_gain_e;
842
55.6k
  }
843
55.6k
}
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
55.6k
                     FIXP_DBL pAlfdGains[LFAC / 4], const INT fdns_npts) {
874
  /* Weight LPC coefficients using Rm values */
875
55.6k
  CLpd_AdaptLowFreqDeemph(r, lg, pAlfdGains, *pScale);
876
877
55.6k
  FIXP_DBL rms_m = (FIXP_DBL)0;
878
55.6k
  INT rms_e = 0;
879
55.6k
  {
880
    /* Calculate Energy */
881
55.6k
    rms_m = calcEnergy(r, *pScale, lg, &rms_e);
882
55.6k
  }
883
884
55.6k
  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
55.6k
  lpc2mdctAndNoiseShaping(r, pScale, lg, fdns_npts, A1, A1_exp, A2, A2_exp);
890
55.6k
}
891
892
/**
893
 * find pitch for TCX20 (time domain) concealment.
894
 */
895
55.6k
static int find_mpitch(FIXP_DBL xri[], int lg) {
896
55.6k
  FIXP_DBL max, pitch;
897
55.6k
  INT pitch_e;
898
55.6k
  int i, n;
899
900
55.6k
  max = (FIXP_DBL)0;
901
55.6k
  n = 2;
902
903
  /* find maximum below 400Hz */
904
538k
  for (i = 2; i < (lg >> 4); i += 2) {
905
483k
    FIXP_DBL tmp = fPow2Div2(xri[i]) + fPow2Div2(xri[i + 1]);
906
483k
    if (tmp > max) {
907
38.2k
      max = tmp;
908
38.2k
      n = i;
909
38.2k
    }
910
483k
  }
911
912
  // pitch = ((float)lg<<1)/(float)n;
913
55.6k
  pitch = fDivNorm((FIXP_DBL)lg << 1, (FIXP_DBL)n, &pitch_e);
914
55.6k
  pitch >>= fixMax(0, DFRACT_BITS - 1 - pitch_e - 16);
915
916
  /* find pitch multiple under 20ms */
917
55.6k
  if (pitch >= (FIXP_DBL)((256 << 16) - 1)) { /*231.0f*/
918
30.2k
    n = 256;
919
30.2k
  } else {
920
25.4k
    FIXP_DBL mpitch = pitch;
921
68.9k
    while (mpitch < (FIXP_DBL)(255 << 16)) {
922
43.4k
      mpitch += pitch;
923
43.4k
    }
924
25.4k
    n = (int)(mpitch - pitch) >> 16;
925
25.4k
  }
926
927
55.6k
  return (n);
928
55.6k
}
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
55.6k
    int mod, int last_mod, int frame, int frameOk) {
949
55.6k
  FIXP_DBL *pAlfd_gains = pAacDecoderStaticChannelInfo->last_alfd_gains;
950
55.6k
  ULONG *pSeed = &pAacDecoderStaticChannelInfo->nfRandomSeed;
951
55.6k
  int lg = (pAacDecoderChannelInfo->granuleLength == 128)
952
55.6k
               ? lg_table_ccfl[0][mod + 0]
953
55.6k
               : lg_table_ccfl[1][mod + 0];
954
55.6k
  int next_frame = frame + (1 << (mod - 1));
955
55.6k
  int isFullBandLpd = 0;
956
957
  /* Obtain r[] vector by combining the quant[] and noise[] vectors */
958
55.6k
  {
959
55.6k
    FIXP_DBL noise_level;
960
55.6k
    FIXP_DBL *coeffs =
961
55.6k
        SPEC_TCX(pAacDecoderChannelInfo->pSpectralCoefficient, frame,
962
55.6k
                 pAacDecoderChannelInfo->granuleLength, isFullBandLpd);
963
55.6k
    int scale = pAacDecoderChannelInfo->specScale[frame];
964
55.6k
    int i, nfBgn, nfEnd;
965
55.6k
    UCHAR tcx_noise_factor = pAacDecoderChannelInfo->pDynData->specificTo.usac
966
55.6k
                                 .tcx_noise_factor[frame];
967
968
    /* find pitch for bfi case */
969
55.6k
    pAacDecoderStaticChannelInfo->last_tcx_pitch = find_mpitch(coeffs, lg);
970
971
55.6k
    if (frameOk) {
972
      /* store for concealment */
973
55.6k
      pAacDecoderStaticChannelInfo->last_tcx_noise_factor = tcx_noise_factor;
974
55.6k
    } else {
975
      /* restore last frames value */
976
0
      tcx_noise_factor = pAacDecoderStaticChannelInfo->last_tcx_noise_factor;
977
0
    }
978
979
55.6k
    noise_level =
980
55.6k
        (FIXP_DBL)((LONG)FL2FXCONST_DBL(0.0625f) * (8 - tcx_noise_factor));
981
55.6k
    noise_level = scaleValue(noise_level, -scale);
982
983
55.6k
    const FIXP_DBL neg_noise_level = -noise_level;
984
985
55.6k
    {
986
55.6k
      nfBgn = lg / 6;
987
55.6k
      nfEnd = lg;
988
55.6k
    }
989
990
1.83M
    for (i = nfBgn; i < nfEnd - 7; i += 8) {
991
1.78M
      LONG tmp;
992
993
      /* Fill all 8 consecutive zero coeffs with noise */
994
1.78M
      tmp = coeffs[i + 0] | coeffs[i + 1] | coeffs[i + 2] | coeffs[i + 3] |
995
1.78M
            coeffs[i + 4] | coeffs[i + 5] | coeffs[i + 6] | coeffs[i + 7];
996
997
1.78M
      if (tmp == 0) {
998
13.1M
        for (int k = i; k < i + 8; k++) {
999
11.7M
          UsacRandomSign(pSeed) ? (coeffs[k] = neg_noise_level)
1000
11.7M
                                : (coeffs[k] = noise_level);
1001
11.7M
        }
1002
1.46M
      }
1003
1.78M
    }
1004
55.6k
    if ((nfEnd - i) >
1005
55.6k
        0) { /* noise filling for last "band" with less than 8 bins */
1006
26.5k
      LONG tmp = (LONG)coeffs[i];
1007
26.5k
      int k;
1008
1009
26.5k
      FDK_ASSERT((nfEnd - i) < 8);
1010
130k
      for (k = 1; k < (nfEnd - i); k++) {
1011
103k
        tmp |= (LONG)coeffs[i + k];
1012
103k
      }
1013
26.5k
      if (tmp == 0) {
1014
124k
        for (k = i; k < nfEnd; k++) {
1015
102k
          UsacRandomSign(pSeed) ? (coeffs[k] = neg_noise_level)
1016
102k
                                : (coeffs[k] = noise_level);
1017
102k
        }
1018
21.9k
      }
1019
26.5k
    }
1020
55.6k
  }
1021
1022
55.6k
  {
1023
    /* Convert LPC to LP domain */
1024
55.6k
    if (last_mod == 0) {
1025
      /* Note: The case where last_mod == 255 is handled by other means
1026
       * in CLpdChannelStream_Read() */
1027
14.7k
      E_LPC_f_lsp_a_conversion(
1028
14.7k
          pAacDecoderChannelInfo->data.usac.lsp_coeff[frame],
1029
14.7k
          pAacDecoderChannelInfo->data.usac.lp_coeff[frame],
1030
14.7k
          &pAacDecoderChannelInfo->data.usac.lp_coeff_exp[frame]);
1031
14.7k
    }
1032
1033
55.6k
    E_LPC_f_lsp_a_conversion(
1034
55.6k
        pAacDecoderChannelInfo->data.usac.lsp_coeff[next_frame],
1035
55.6k
        pAacDecoderChannelInfo->data.usac.lp_coeff[next_frame],
1036
55.6k
        &pAacDecoderChannelInfo->data.usac.lp_coeff_exp[next_frame]);
1037
1038
    /* FDNS decoding */
1039
55.6k
    CLpd_FdnsDecode(
1040
55.6k
        pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo,
1041
55.6k
        SPEC_TCX(pAacDecoderChannelInfo->pSpectralCoefficient, frame,
1042
55.6k
                 pAacDecoderChannelInfo->granuleLength, isFullBandLpd),
1043
55.6k
        lg, frame, pAacDecoderChannelInfo->specScale + frame,
1044
55.6k
        pAacDecoderChannelInfo->data.usac.lp_coeff[frame],
1045
55.6k
        pAacDecoderChannelInfo->data.usac.lp_coeff_exp[frame],
1046
55.6k
        pAacDecoderChannelInfo->data.usac.lp_coeff[next_frame],
1047
55.6k
        pAacDecoderChannelInfo->data.usac.lp_coeff_exp[next_frame], pAlfd_gains,
1048
55.6k
        pAacDecoderChannelInfo->granuleLength / 2 /* == FDNS_NPTS(ccfl) */
1049
55.6k
    );
1050
55.6k
  }
1051
55.6k
}
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
56.7k
    int first_tcx_flag, int frame, UINT flags) {
1065
56.7k
  AAC_DECODER_ERROR errorAAC = AAC_DEC_OK;
1066
56.7k
  ARITH_CODING_ERROR error = ARITH_CODER_OK;
1067
56.7k
  FIXP_DBL *pSpec;
1068
56.7k
  int arith_reset_flag = 0;
1069
56.7k
  int isFullBandLpd = 0;
1070
1071
56.7k
  pSpec = SPEC_TCX(pAacDecoderChannelInfo->pSpectralCoefficient, frame,
1072
56.7k
                   pAacDecoderChannelInfo->granuleLength, isFullBandLpd);
1073
1074
  /* TCX noise level */
1075
56.7k
  {
1076
56.7k
    pAacDecoderChannelInfo->pDynData->specificTo.usac.tcx_noise_factor[frame] =
1077
56.7k
        FDKreadBits(hBs, 3);
1078
56.7k
  }
1079
  /* TCX global gain */
1080
56.7k
  pAacDecoderChannelInfo->pDynData->specificTo.usac.tcx_global_gain[frame] =
1081
56.7k
      FDKreadBits(hBs, 7);
1082
1083
  /* Arithmetic coded residual/spectrum */
1084
56.7k
  if (first_tcx_flag) {
1085
32.2k
    if (flags & AC_INDEP) {
1086
19.8k
      arith_reset_flag = 1;
1087
19.8k
    } else {
1088
12.3k
      arith_reset_flag = FDKreadBits(hBs, 1);
1089
12.3k
    }
1090
32.2k
  }
1091
1092
  /* CArco_DecodeArithData() output scale of "pSpec" is DFRACT_BITS-1 */
1093
56.7k
  error = CArco_DecodeArithData(pAacDecoderStaticChannelInfo->hArCo, hBs, pSpec,
1094
56.7k
                                lg, lg, arith_reset_flag);
1095
1096
  /* Rescale residual/spectrum */
1097
56.7k
  {
1098
56.7k
    int scale = getScalefactor(pSpec, lg) - 2; /* Leave 2 bits headroom */
1099
1100
    /* Exponent of CArco_DecodeArithData() output is DFRACT_BITS; integer
1101
     * values. */
1102
56.7k
    scaleValues(pSpec, lg, scale);
1103
56.7k
    scale = DFRACT_BITS - 1 - scale;
1104
1105
56.7k
    pAacDecoderChannelInfo->specScale[frame] = scale;
1106
56.7k
  }
1107
1108
56.7k
  if (error == ARITH_CODER_ERROR) errorAAC = AAC_DEC_UNKNOWN;
1109
1110
56.7k
  return errorAAC;
1111
56.7k
}
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
45.5k
    UCHAR mod[4], HANDLE_FDK_BITSTREAM hBs, UINT elFlags) {
1122
45.5k
  int lpd_mode;
1123
1124
45.5k
  {
1125
45.5k
    lpd_mode = FDKreadBits(hBs, 5);
1126
1127
45.5k
    if (lpd_mode > 25 || lpd_mode < 0) {
1128
68
      return AAC_DEC_PARSE_ERROR;
1129
68
    }
1130
1131
45.4k
    switch (lpd_mode) {
1132
600
      case 25:
1133
        /* 1 80MS frame */
1134
600
        mod[0] = mod[1] = mod[2] = mod[3] = 3;
1135
600
        break;
1136
303
      case 24:
1137
        /* 2 40MS frames */
1138
303
        mod[0] = mod[1] = mod[2] = mod[3] = 2;
1139
303
        break;
1140
44.5k
      default:
1141
44.5k
        switch (lpd_mode >> 2) {
1142
16.9k
          case 4:
1143
            /* lpd_mode 19 - 16  => 1 40MS and 2 20MS frames */
1144
16.9k
            mod[0] = mod[1] = 2;
1145
16.9k
            mod[2] = (lpd_mode & 1) ? 1 : 0;
1146
16.9k
            mod[3] = (lpd_mode & 2) ? 1 : 0;
1147
16.9k
            break;
1148
3.01k
          case 5:
1149
            /* lpd_mode 23 - 20 => 2 20MS and 1 40MS frames */
1150
3.01k
            mod[2] = mod[3] = 2;
1151
3.01k
            mod[0] = (lpd_mode & 1) ? 1 : 0;
1152
3.01k
            mod[1] = (lpd_mode & 2) ? 1 : 0;
1153
3.01k
            break;
1154
24.5k
          default:
1155
            /* lpd_mode < 16 => 4 20MS frames */
1156
24.5k
            mod[0] = (lpd_mode & 1) ? 1 : 0;
1157
24.5k
            mod[1] = (lpd_mode & 2) ? 1 : 0;
1158
24.5k
            mod[2] = (lpd_mode & 4) ? 1 : 0;
1159
24.5k
            mod[3] = (lpd_mode & 8) ? 1 : 0;
1160
24.5k
            break;
1161
44.5k
        }
1162
44.5k
        break;
1163
45.4k
    }
1164
45.4k
  }
1165
45.4k
  return AAC_DEC_OK;
1166
45.4k
}
1167
1168
static void CLpd_Reset(
1169
    CAacDecoderChannelInfo *pAacDecoderChannelInfo,
1170
    CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo,
1171
30.2k
    int keep_past_signal) {
1172
30.2k
  int i;
1173
1174
  /* Reset TCX / ACELP common memory */
1175
30.2k
  if (!keep_past_signal) {
1176
30.2k
    FDKmemclear(pAacDecoderStaticChannelInfo->old_synth,
1177
30.2k
                sizeof(pAacDecoderStaticChannelInfo->old_synth));
1178
30.2k
  }
1179
1180
  /* Initialize the LSFs */
1181
514k
  for (i = 0; i < M_LP_FILTER_ORDER; i++) {
1182
484k
    pAacDecoderStaticChannelInfo->lpc4_lsf[i] = fdk_dec_lsf_init[i];
1183
484k
  }
1184
1185
  /* Reset memory needed by bass post-filter */
1186
30.2k
  FDKmemclear(pAacDecoderStaticChannelInfo->mem_bpf,
1187
30.2k
              sizeof(pAacDecoderStaticChannelInfo->mem_bpf));
1188
1189
30.2k
  pAacDecoderStaticChannelInfo->old_bpf_control_info = 0;
1190
242k
  for (i = 0; i < SYN_SFD; i++) {
1191
211k
    pAacDecoderStaticChannelInfo->old_T_pf[i] = 64;
1192
211k
    pAacDecoderStaticChannelInfo->old_gain_pf[i] = (FIXP_DBL)0;
1193
211k
  }
1194
1195
  /* Reset ACELP memory */
1196
30.2k
  CLpd_AcelpReset(&pAacDecoderStaticChannelInfo->acelp);
1197
1198
30.2k
  pAacDecoderStaticChannelInfo->last_lpc_lost = 0;      /* prev_lpc_lost */
1199
30.2k
  pAacDecoderStaticChannelInfo->last_tcx_pitch = L_DIV; /* pitch_tcx     */
1200
30.2k
  pAacDecoderStaticChannelInfo->numLostLpdFrames = 0;   /* nbLostCmpt    */
1201
30.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
45.6k
    const SamplingRateInfo *pSamplingRateInfo, UINT flags) {
1211
45.6k
  AAC_DECODER_ERROR error = AAC_DEC_OK;
1212
45.6k
  int first_tcx_flag;
1213
45.6k
  int k, nbDiv, fFacDataPresent, first_lpd_flag, acelp_core_mode,
1214
45.6k
      facGetMemState = 0;
1215
45.6k
  UCHAR *mod = pAacDecoderChannelInfo->data.usac.mod;
1216
45.6k
  int lpd_mode_last, prev_frame_was_lpd;
1217
45.6k
  USAC_COREMODE core_mode_last;
1218
45.6k
  const int lg_table_offset = 0;
1219
45.6k
  const int *lg_table = (pAacDecoderChannelInfo->granuleLength == 128)
1220
45.6k
                            ? &lg_table_ccfl[0][lg_table_offset]
1221
45.6k
                            : &lg_table_ccfl[1][lg_table_offset];
1222
45.6k
  int last_lpc_lost = pAacDecoderStaticChannelInfo->last_lpc_lost;
1223
1224
45.6k
  int last_frame_ok = CConcealment_GetLastFrameOk(
1225
45.6k
      &pAacDecoderStaticChannelInfo->concealmentInfo, 1);
1226
1227
45.6k
  INT i_offset;
1228
45.6k
  UINT samplingRate;
1229
1230
45.6k
  samplingRate = pSamplingRateInfo->samplingRate;
1231
1232
45.6k
  i_offset =
1233
45.6k
      (INT)(samplingRate * PIT_MIN_12k8 + (FSCALE_DENOM / 2)) / FSCALE_DENOM -
1234
45.6k
      (INT)PIT_MIN_12k8;
1235
1236
45.6k
  if ((samplingRate < FAC_FSCALE_MIN) || (samplingRate > FAC_FSCALE_MAX)) {
1237
100
    error = AAC_DEC_PARSE_ERROR;
1238
100
    goto bail;
1239
100
  }
1240
1241
45.5k
  acelp_core_mode = FDKreadBits(hBs, 3);
1242
1243
  /* lpd_mode */
1244
45.5k
  error = CLpd_ReadAndMapLpdModeToModArray(mod, hBs, 0);
1245
45.5k
  if (error != AAC_DEC_OK) {
1246
68
    goto bail;
1247
68
  }
1248
1249
  /* bpf_control_info */
1250
45.4k
  pAacDecoderChannelInfo->data.usac.bpf_control_info = FDKreadBit(hBs);
1251
1252
  /* last_core_mode */
1253
45.4k
  prev_frame_was_lpd = FDKreadBit(hBs);
1254
  /* fac_data_present */
1255
45.4k
  fFacDataPresent = FDKreadBit(hBs);
1256
1257
  /* Set valid values from
1258
   * pAacDecoderStaticChannelInfo->{last_core_mode,last_lpd_mode} */
1259
45.4k
  pAacDecoderChannelInfo->data.usac.core_mode_last =
1260
45.4k
      pAacDecoderStaticChannelInfo->last_core_mode;
1261
45.4k
  lpd_mode_last = pAacDecoderChannelInfo->data.usac.lpd_mode_last =
1262
45.4k
      pAacDecoderStaticChannelInfo->last_lpd_mode;
1263
1264
45.4k
  if (prev_frame_was_lpd == 0) {
1265
    /* Last frame was FD */
1266
19.0k
    pAacDecoderChannelInfo->data.usac.core_mode_last = FD_LONG;
1267
19.0k
    pAacDecoderChannelInfo->data.usac.lpd_mode_last = 255;
1268
26.4k
  } else {
1269
    /* Last frame was LPD */
1270
26.4k
    pAacDecoderChannelInfo->data.usac.core_mode_last = LPD;
1271
26.4k
    if (((mod[0] == 0) && fFacDataPresent) ||
1272
21.2k
        ((mod[0] != 0) && !fFacDataPresent)) {
1273
      /* Currend mod is ACELP, fac data present -> TCX, current mod TCX, no fac
1274
       * data -> TCX */
1275
21.2k
      if (lpd_mode_last == 0) {
1276
        /* Bit stream interruption detected. Assume last TCX mode as TCX20. */
1277
8.46k
        pAacDecoderChannelInfo->data.usac.lpd_mode_last = 1;
1278
8.46k
      }
1279
      /* Else assume that remembered TCX mode is correct. */
1280
21.2k
    } else {
1281
5.27k
      pAacDecoderChannelInfo->data.usac.lpd_mode_last = 0;
1282
5.27k
    }
1283
26.4k
  }
1284
1285
45.4k
  first_lpd_flag = (pAacDecoderChannelInfo->data.usac.core_mode_last !=
1286
45.4k
                    LPD); /* Depends on bitstream configuration */
1287
45.4k
  first_tcx_flag = 1;
1288
1289
45.4k
  if (pAacDecoderStaticChannelInfo->last_core_mode !=
1290
45.4k
      LPD) { /* ATTENTION: Reset depends on what we rendered before! */
1291
30.2k
    CLpd_Reset(pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo, 0);
1292
1293
30.2k
    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
30.2k
  }
1299
1300
45.4k
  core_mode_last = pAacDecoderChannelInfo->data.usac.core_mode_last;
1301
45.4k
  lpd_mode_last = pAacDecoderChannelInfo->data.usac.lpd_mode_last;
1302
1303
45.4k
  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
45.4k
  k = 0;
1309
203k
  while (k < nbDiv) {
1310
    /* Reset FAC data pointers in order to avoid applying old random FAC data.
1311
     */
1312
158k
    pAacDecoderChannelInfo->data.usac.fac_data[k] = NULL;
1313
1314
158k
    if ((k == 0 && core_mode_last == LPD && fFacDataPresent) ||
1315
152k
        (lpd_mode_last == 0 && mod[k] > 0) ||
1316
138k
        ((lpd_mode_last != 255) && lpd_mode_last > 0 && mod[k] == 0)) {
1317
46.2k
      int err;
1318
1319
      /* Assign FAC memory */
1320
46.2k
      pAacDecoderChannelInfo->data.usac.fac_data[k] =
1321
46.2k
          CLpd_FAC_GetMemory(pAacDecoderChannelInfo, mod, &facGetMemState);
1322
1323
      /* FAC for (ACELP -> TCX) or (TCX -> ACELP) */
1324
46.2k
      err = CLpd_FAC_Read(
1325
46.2k
          hBs, pAacDecoderChannelInfo->data.usac.fac_data[k],
1326
46.2k
          pAacDecoderChannelInfo->data.usac.fac_data_e,
1327
46.2k
          pAacDecoderChannelInfo->granuleLength, /* == fac_length */
1328
46.2k
          0, k);
1329
46.2k
      if (err != 0) {
1330
9
        error = AAC_DEC_PARSE_ERROR;
1331
9
        goto bail;
1332
9
      }
1333
46.2k
    }
1334
1335
158k
    if (mod[k] == 0) /* acelp-mode */
1336
102k
    {
1337
102k
      int err;
1338
102k
      err = CLpd_AcelpRead(
1339
102k
          hBs, &pAacDecoderChannelInfo->data.usac.acelp[k], acelp_core_mode,
1340
102k
          pAacDecoderChannelInfo->granuleLength * 8 /* coreCoderFrameLength */,
1341
102k
          i_offset);
1342
102k
      if (err != 0) {
1343
0
        error = AAC_DEC_PARSE_ERROR;
1344
0
        goto bail;
1345
0
      }
1346
1347
102k
      lpd_mode_last = 0;
1348
102k
      k++;
1349
102k
    } else /* mode != 0  =>  TCX */
1350
56.7k
    {
1351
56.7k
      error = CLpd_TCX_Read(hBs, pAacDecoderChannelInfo,
1352
56.7k
                            pAacDecoderStaticChannelInfo, lg_table[mod[k]],
1353
56.7k
                            first_tcx_flag, k, flags);
1354
1355
56.7k
      lpd_mode_last = mod[k];
1356
56.7k
      first_tcx_flag = 0;
1357
56.7k
      k += 1 << (mod[k] - 1);
1358
56.7k
    }
1359
158k
    if (error != AAC_DEC_OK) {
1360
535
      error = AAC_DEC_PARSE_ERROR;
1361
535
      goto bail;
1362
535
    }
1363
158k
  }
1364
1365
44.9k
  {
1366
44.9k
    int err;
1367
1368
    /* Read LPC coefficients */
1369
44.9k
    err = CLpc_Read(
1370
44.9k
        hBs, pAacDecoderChannelInfo->data.usac.lsp_coeff,
1371
44.9k
        pAacDecoderStaticChannelInfo->lpc4_lsf,
1372
44.9k
        pAacDecoderChannelInfo->data.usac.lsf_adaptive_mean_cand,
1373
44.9k
        pAacDecoderChannelInfo->data.usac.aStability, mod, first_lpd_flag,
1374
        /* if last lpc4 is available from concealment do not extrapolate lpc0
1375
           from lpc2 */
1376
44.9k
        (mod[0] & 0x3) ? 0
1377
44.9k
                       : (last_lpc_lost &&
1378
13
                          pAacDecoderStaticChannelInfo->last_core_mode != LPD),
1379
44.9k
        last_frame_ok);
1380
44.9k
    if (err != 0) {
1381
14
      error = AAC_DEC_PARSE_ERROR;
1382
14
      goto bail;
1383
14
    }
1384
44.9k
  }
1385
1386
  /* adjust old lsp[] following to a bad frame (to avoid overshoot) (ref:
1387
   * dec_LPD.c) */
1388
44.9k
  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
44.9k
  if (!CConcealment_GetLastFrameOk(
1407
44.9k
          &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
44.9k
  } else if (pAacDecoderStaticChannelInfo->last_lpd_mode != 0) {
1413
34.6k
    if (pAacDecoderStaticChannelInfo->last_lpd_mode == 255) {
1414
      /* We need it for TCX decoding or ACELP excitation update */
1415
29.7k
      E_LPC_f_lsp_a_conversion(
1416
29.7k
          pAacDecoderChannelInfo->data.usac.lsp_coeff[0],
1417
29.7k
          pAacDecoderChannelInfo->data.usac.lp_coeff[0],
1418
29.7k
          &pAacDecoderChannelInfo->data.usac.lp_coeff_exp[0]);
1419
29.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
4.89k
      FDKmemcpy(pAacDecoderChannelInfo->data.usac.lp_coeff[0],
1423
4.89k
                pAacDecoderStaticChannelInfo->lp_coeff_old[0],
1424
4.89k
                M_LP_FILTER_ORDER * sizeof(FIXP_LPC));
1425
4.89k
      pAacDecoderChannelInfo->data.usac.lp_coeff_exp[0] =
1426
4.89k
          pAacDecoderStaticChannelInfo->lp_coeff_old_exp[0];
1427
4.89k
    }
1428
34.6k
  } /* case last_lpd_mode was ACELP is handled by CLpd_TcxDecode() */
1429
1430
44.9k
  if (fFacDataPresent && (core_mode_last != LPD)) {
1431
3.44k
    int prev_frame_was_short;
1432
1433
3.44k
    prev_frame_was_short = FDKreadBit(hBs);
1434
1435
3.44k
    if (prev_frame_was_short) {
1436
198
      core_mode_last = pAacDecoderChannelInfo->data.usac.core_mode_last =
1437
198
          FD_SHORT;
1438
198
      pAacDecoderChannelInfo->data.usac.lpd_mode_last = 255;
1439
1440
198
      if ((pAacDecoderStaticChannelInfo->last_core_mode != FD_SHORT) &&
1441
6
          CConcealment_GetLastFrameOk(
1442
6
              &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
6
        error = AAC_DEC_PARSE_ERROR;
1449
6
        goto bail;
1450
6
      }
1451
198
    }
1452
1453
    /* Assign memory */
1454
3.43k
    pAacDecoderChannelInfo->data.usac.fac_data[0] =
1455
3.43k
        CLpd_FAC_GetMemory(pAacDecoderChannelInfo, mod, &facGetMemState);
1456
1457
3.43k
    {
1458
3.43k
      int err;
1459
1460
      /* FAC for FD -> ACELP */
1461
3.43k
      err = CLpd_FAC_Read(
1462
3.43k
          hBs, pAacDecoderChannelInfo->data.usac.fac_data[0],
1463
3.43k
          pAacDecoderChannelInfo->data.usac.fac_data_e,
1464
3.43k
          CLpd_FAC_getLength(core_mode_last != FD_SHORT,
1465
3.43k
                             pAacDecoderChannelInfo->granuleLength),
1466
3.43k
          1, 0);
1467
3.43k
      if (err != 0) {
1468
1
        error = AAC_DEC_PARSE_ERROR;
1469
1
        goto bail;
1470
1
      }
1471
3.43k
    }
1472
3.43k
  }
1473
1474
45.6k
bail:
1475
45.6k
  if (error == AAC_DEC_OK) {
1476
    /* check consitency of last core/lpd mode values */
1477
44.9k
    if ((pAacDecoderChannelInfo->data.usac.core_mode_last !=
1478
44.9k
         pAacDecoderStaticChannelInfo->last_core_mode) &&
1479
29.5k
        (pAacDecoderStaticChannelInfo->last_lpc_lost == 0)) {
1480
      /* Something got wrong! */
1481
      /* error = AAC_DEC_PARSE_ERROR; */ /* Throwing errors does not help */
1482
29.5k
    } else if ((pAacDecoderChannelInfo->data.usac.core_mode_last == LPD) &&
1483
9.71k
               (pAacDecoderChannelInfo->data.usac.lpd_mode_last !=
1484
9.71k
                pAacDecoderStaticChannelInfo->last_lpd_mode) &&
1485
8.83k
               (pAacDecoderStaticChannelInfo->last_lpc_lost == 0)) {
1486
      /* Something got wrong! */
1487
      /* error = AAC_DEC_PARSE_ERROR; */ /* Throwing errors does not help */
1488
8.83k
    }
1489
44.9k
  }
1490
1491
45.6k
  return error;
1492
44.9k
}
1493
1494
void CLpdChannelStream_Decode(
1495
    CAacDecoderChannelInfo *pAacDecoderChannelInfo,
1496
44.3k
    CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, UINT flags) {
1497
44.3k
  UCHAR *mod = pAacDecoderChannelInfo->data.usac.mod;
1498
44.3k
  int k;
1499
44.3k
  UCHAR last_lpd_mode;
1500
44.3k
  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
44.3k
  k = 0;
1505
44.3k
  last_lpd_mode =
1506
44.3k
      pAacDecoderChannelInfo->data.usac
1507
44.3k
          .lpd_mode_last; /* could be different to what has been rendered */
1508
199k
  while (k < nbDiv) {
1509
155k
    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
99.8k
      if (last_lpd_mode > 0 && last_lpd_mode != 255 &&
1515
26.3k
          pAacDecoderChannelInfo->data.usac.fac_data[k]) {
1516
26.3k
        CFac_ApplyGains(pAacDecoderChannelInfo->data.usac.fac_data[k],
1517
26.3k
                        pAacDecoderChannelInfo->granuleLength,
1518
26.3k
                        pAacDecoderStaticChannelInfo->last_tcx_gain,
1519
26.3k
                        pAacDecoderStaticChannelInfo->last_alfd_gains,
1520
26.3k
                        (last_lpd_mode < 4) ? last_lpd_mode : 3);
1521
1522
26.3k
        pAacDecoderChannelInfo->data.usac.fac_data_e[k] +=
1523
26.3k
            pAacDecoderStaticChannelInfo->last_tcx_gain_e;
1524
26.3k
      }
1525
99.8k
    } else {
1526
      /* TCX */
1527
55.6k
      CLpd_TcxDecode(pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo,
1528
55.6k
                     flags, mod[k], last_lpd_mode, k, 1 /* frameOk == 1 */
1529
55.6k
      );
1530
1531
      /* Store TCX gain scale for next possible FAC transition. */
1532
55.6k
      pAacDecoderStaticChannelInfo->last_tcx_gain =
1533
55.6k
          pAacDecoderChannelInfo->data.usac.tcx_gain[k];
1534
55.6k
      pAacDecoderStaticChannelInfo->last_tcx_gain_e =
1535
55.6k
          pAacDecoderChannelInfo->data.usac.tcx_gain_e[k];
1536
1537
      /* If FAC (fac_data[k] != NULL), apply gains */
1538
55.6k
      if (last_lpd_mode == 0 && pAacDecoderChannelInfo->data.usac.fac_data[k]) {
1539
14.7k
        CFac_ApplyGains(
1540
14.7k
            pAacDecoderChannelInfo->data.usac.fac_data[k],
1541
14.7k
            pAacDecoderChannelInfo->granuleLength /* == fac_length */,
1542
14.7k
            pAacDecoderChannelInfo->data.usac.tcx_gain[k],
1543
14.7k
            pAacDecoderStaticChannelInfo->last_alfd_gains, mod[k]);
1544
1545
14.7k
        pAacDecoderChannelInfo->data.usac.fac_data_e[k] +=
1546
14.7k
            pAacDecoderChannelInfo->data.usac.tcx_gain_e[k];
1547
14.7k
      }
1548
55.6k
    }
1549
1550
    /* remember previous mode */
1551
155k
    last_lpd_mode = mod[k];
1552
1553
    /* Increase k to next frame */
1554
155k
    k += (mod[k] == 0) ? 1 : (1 << (mod[k] - 1));
1555
155k
  }
1556
44.3k
}
1557
1558
AAC_DECODER_ERROR CLpd_RenderTimeSignal(
1559
    CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo,
1560
    CAacDecoderChannelInfo *pAacDecoderChannelInfo, PCM_DEC *pTimeData,
1561
    INT lFrame, SamplingRateInfo *pSamplingRateInfo, UINT frameOk,
1562
45.4k
    const INT aacOutDataHeadroom, UINT flags, UINT strmFlags) {
1563
45.4k
  UCHAR *mod = pAacDecoderChannelInfo->data.usac.mod;
1564
45.4k
  AAC_DECODER_ERROR error = AAC_DEC_OK;
1565
45.4k
  int k, i_offset;
1566
45.4k
  int last_k;
1567
45.4k
  int nrSamples = 0;
1568
45.4k
  int facFB = 1;
1569
45.4k
  int nbDiv = NB_DIV;
1570
45.4k
  int lDiv = lFrame / nbDiv; /* length of division (acelp or tcx20 frame)*/
1571
45.4k
  int lFac = lDiv / 2;
1572
45.4k
  int nbSubfr =
1573
45.4k
      lFrame / (nbDiv * L_SUBFR); /* number of subframes per division */
1574
45.4k
  int nbSubfrSuperfr = nbDiv * nbSubfr;
1575
45.4k
  int synSfd = (nbSubfrSuperfr / 2) - BPF_SFD;
1576
45.4k
  int SynDelay = synSfd * L_SUBFR;
1577
45.4k
  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
45.4k
  FIXP_DBL *synth_buf =
1586
45.4k
      pAacDecoderChannelInfo->pComStaticData->pWorkBufferCore1->synth_buf;
1587
45.4k
  FIXP_DBL *synth = synth_buf + PIT_MAX_MAX - BPF_DELAY;
1588
45.4k
  UCHAR last_lpd_mode, last_last_lpd_mode, last_lpc_lost, last_frame_lost;
1589
1590
45.4k
  INT pitch[NB_SUBFR_SUPERFR + SYN_SFD];
1591
45.4k
  FIXP_DBL pit_gain[NB_SUBFR_SUPERFR + SYN_SFD];
1592
1593
45.4k
  const int *lg_table;
1594
45.4k
  int lg_table_offset = 0;
1595
1596
45.4k
  UINT samplingRate = pSamplingRateInfo->samplingRate;
1597
1598
45.4k
  FDKmemclear(pitch, (NB_SUBFR_SUPERFR + SYN_SFD) * sizeof(INT));
1599
1600
45.4k
  if (flags & AACDEC_FLUSH) {
1601
28
    CLpd_Reset(pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo,
1602
28
               flags & AACDEC_FLUSH);
1603
28
    frameOk = 0;
1604
28
  }
1605
1606
45.4k
  switch (lFrame) {
1607
22.2k
    case 1024:
1608
22.2k
      lg_table = &lg_table_ccfl[0][lg_table_offset];
1609
22.2k
      break;
1610
23.2k
    case 768:
1611
23.2k
      lg_table = &lg_table_ccfl[1][lg_table_offset];
1612
23.2k
      break;
1613
0
    default:
1614
0
      FDK_ASSERT(0);
1615
0
      return AAC_DEC_UNKNOWN;
1616
45.4k
  }
1617
1618
45.4k
  last_frame_lost = !CConcealment_GetLastFrameOk(
1619
45.4k
      &pAacDecoderStaticChannelInfo->concealmentInfo, 0);
1620
1621
  /* Maintain LPD mode from previous frame */
1622
45.4k
  if ((pAacDecoderStaticChannelInfo->last_core_mode == FD_LONG) ||
1623
29.3k
      (pAacDecoderStaticChannelInfo->last_core_mode == FD_SHORT)) {
1624
29.3k
    pAacDecoderStaticChannelInfo->last_lpd_mode = 255;
1625
29.3k
  }
1626
1627
45.4k
  if (!frameOk) {
1628
1.15k
    FIXP_DBL old_tcx_gain;
1629
1.15k
    FIXP_SGL old_stab;
1630
1.15k
    SCHAR old_tcx_gain_e;
1631
1.15k
    int nLostSf;
1632
1633
1.15k
    last_lpd_mode = pAacDecoderStaticChannelInfo->last_lpd_mode;
1634
1.15k
    old_tcx_gain = pAacDecoderStaticChannelInfo->last_tcx_gain;
1635
1.15k
    old_tcx_gain_e = pAacDecoderStaticChannelInfo->last_tcx_gain_e;
1636
1.15k
    old_stab = pAacDecoderStaticChannelInfo->oldStability;
1637
1.15k
    nLostSf = pAacDecoderStaticChannelInfo->numLostLpdFrames;
1638
1639
    /* patch the last LPD mode */
1640
1.15k
    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.15k
    switch (last_lpd_mode) {
1651
619
      case 0:
1652
619
        mod[0] = mod[1] = mod[2] = mod[3] = 0; /* -> ACELP concealment */
1653
619
        break;
1654
57
      case 3:
1655
57
        mod[0] = mod[1] = mod[2] = mod[3] = 3; /* -> TCX FD concealment */
1656
57
        break;
1657
46
      case 2:
1658
46
        mod[0] = mod[1] = mod[2] = mod[3] = 2; /* -> TCX FD concealment */
1659
46
        break;
1660
338
      case 1:
1661
433
      default:
1662
433
        mod[0] = mod[1] = mod[2] = mod[3] = 4; /* -> TCX TD concealment */
1663
433
        break;
1664
1.15k
    }
1665
1666
    /* LPC extrapolation */
1667
1.15k
    CLpc_Conceal(pAacDecoderChannelInfo->data.usac.lsp_coeff,
1668
1.15k
                 pAacDecoderStaticChannelInfo->lpc4_lsf,
1669
1.15k
                 pAacDecoderStaticChannelInfo->lsf_adaptive_mean,
1670
                 /*(pAacDecoderStaticChannelInfo->numLostLpdFrames == 0) ||*/
1671
1.15k
                 (last_lpd_mode == 255));
1672
1673
1.15k
    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
536
      FDKmemcpy(pAacDecoderChannelInfo->data.usac.lp_coeff[0],
1677
536
                pAacDecoderStaticChannelInfo->lp_coeff_old[0],
1678
536
                M_LP_FILTER_ORDER * sizeof(FIXP_LPC));
1679
536
      pAacDecoderChannelInfo->data.usac.lp_coeff_exp[0] =
1680
536
          pAacDecoderStaticChannelInfo->lp_coeff_old_exp[0];
1681
536
    } /* 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.15k
    k = 0;
1688
5.51k
    while (k < nbDiv) {
1689
4.35k
      pAacDecoderChannelInfo->data.usac.tcx_gain[k] = old_tcx_gain;
1690
4.35k
      pAacDecoderChannelInfo->data.usac.tcx_gain_e[k] = old_tcx_gain_e;
1691
1692
      /* restore stability value from last frame */
1693
4.35k
      pAacDecoderChannelInfo->data.usac.aStability[k] = old_stab;
1694
1695
      /* Increase k to next frame */
1696
4.35k
      k += ((mod[k] & 0x3) == 0) ? 1 : (1 << ((mod[k] & 0x3) - 1));
1697
1698
4.35k
      nLostSf++;
1699
4.35k
    }
1700
44.3k
  } else {
1701
44.3k
    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
4
      FDKmemcpy(pAacDecoderChannelInfo->data.usac.lp_coeff[0],
1705
4
                pAacDecoderStaticChannelInfo->lp_coeff_old[0],
1706
4
                M_LP_FILTER_ORDER * sizeof(FIXP_LPC));
1707
4
      pAacDecoderChannelInfo->data.usac.lp_coeff_exp[0] =
1708
4
          pAacDecoderStaticChannelInfo->lp_coeff_old_exp[0];
1709
4
    }
1710
44.3k
  }
1711
1712
45.4k
  Acelp_PreProcessing(synth_buf, pAacDecoderStaticChannelInfo->old_synth, pitch,
1713
45.4k
                      pAacDecoderStaticChannelInfo->old_T_pf, pit_gain,
1714
45.4k
                      pAacDecoderStaticChannelInfo->old_gain_pf, samplingRate,
1715
45.4k
                      &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
45.4k
  k = 0;
1720
45.4k
  last_k = -1; /* mark invalid */
1721
45.4k
  last_lpd_mode = pAacDecoderStaticChannelInfo->last_lpd_mode;
1722
45.4k
  last_last_lpd_mode = pAacDecoderStaticChannelInfo->last_last_lpd_mode;
1723
45.4k
  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
205k
  while (k < nbDiv) {
1730
159k
    if (frameOk == 0) {
1731
4.35k
      pAacDecoderStaticChannelInfo->numLostLpdFrames++;
1732
155k
    } else {
1733
155k
      last_frame_lost |=
1734
155k
          (pAacDecoderStaticChannelInfo->numLostLpdFrames > 0) ? 1 : 0;
1735
155k
      pAacDecoderStaticChannelInfo->numLostLpdFrames = 0;
1736
155k
    }
1737
159k
    if (mod[k] == 0 || mod[k] == 4) {
1738
      /* ACELP or TCX time domain concealment */
1739
104k
      FIXP_DBL *acelp_out;
1740
1741
      /* FAC management */
1742
104k
      if ((last_lpd_mode != 0) && (last_lpd_mode != 4)) /* TCX TD concealment */
1743
45.2k
      {
1744
45.2k
        FIXP_DBL *pFacData = NULL;
1745
1746
45.2k
        if (frameOk && !last_frame_lost) {
1747
44.9k
          pFacData = pAacDecoderChannelInfo->data.usac.fac_data[k];
1748
44.9k
        }
1749
1750
45.2k
        nrSamples += CLpd_FAC_Mdct2Acelp(
1751
45.2k
            &pAacDecoderStaticChannelInfo->IMdct, synth + nrSamples, pFacData,
1752
45.2k
            pAacDecoderChannelInfo->data.usac.fac_data_e[k],
1753
45.2k
            pAacDecoderChannelInfo->data.usac.lp_coeff[k],
1754
45.2k
            pAacDecoderChannelInfo->data.usac.lp_coeff_exp[k],
1755
45.2k
            lFrame - nrSamples,
1756
45.2k
            CLpd_FAC_getLength(
1757
45.2k
                (pAacDecoderStaticChannelInfo->last_core_mode != FD_SHORT) ||
1758
12.7k
                    (k > 0),
1759
45.2k
                lFac),
1760
45.2k
            (pAacDecoderStaticChannelInfo->last_core_mode != LPD) && (k == 0),
1761
45.2k
            0);
1762
1763
45.2k
        FDKmemcpy(
1764
45.2k
            synth + nrSamples, pAacDecoderStaticChannelInfo->IMdct.overlap.time,
1765
45.2k
            pAacDecoderStaticChannelInfo->IMdct.ov_offset * sizeof(FIXP_DBL));
1766
45.2k
        {
1767
45.2k
          FIXP_LPC *lp_prev =
1768
45.2k
              pAacDecoderChannelInfo->data.usac
1769
45.2k
                  .lp_coeff[0]; /* init value does not real matter */
1770
45.2k
          INT lp_prev_exp = pAacDecoderChannelInfo->data.usac.lp_coeff_exp[0];
1771
1772
45.2k
          if (last_lpd_mode != 255) { /* last mode was tcx */
1773
27.3k
            last_k = k - (1 << (last_lpd_mode - 1));
1774
27.3k
            if (last_k < 0) {
1775
1.61k
              lp_prev = pAacDecoderStaticChannelInfo->lp_coeff_old[1];
1776
1.61k
              lp_prev_exp = pAacDecoderStaticChannelInfo->lp_coeff_old_exp[1];
1777
25.7k
            } else {
1778
25.7k
              lp_prev = pAacDecoderChannelInfo->data.usac.lp_coeff[last_k];
1779
25.7k
              lp_prev_exp =
1780
25.7k
                  pAacDecoderChannelInfo->data.usac.lp_coeff_exp[last_k];
1781
25.7k
            }
1782
27.3k
          }
1783
1784
45.2k
          CLpd_AcelpPrepareInternalMem(
1785
45.2k
              synth + aacDelay + k * lDiv, last_lpd_mode,
1786
45.2k
              (last_last_lpd_mode == 4) ? 0 : last_last_lpd_mode,
1787
45.2k
              pAacDecoderChannelInfo->data.usac.lp_coeff[k],
1788
45.2k
              pAacDecoderChannelInfo->data.usac.lp_coeff_exp[k], lp_prev,
1789
45.2k
              lp_prev_exp, &pAacDecoderStaticChannelInfo->acelp, lFrame,
1790
45.2k
              (last_frame_lost && k < 2), mod[k]);
1791
45.2k
        }
1792
58.7k
      } else {
1793
58.7k
        if (k == 0 && pAacDecoderStaticChannelInfo->IMdct.ov_offset !=
1794
2.73k
                          lFrame / facFB / 2) {
1795
0
          pAacDecoderStaticChannelInfo->IMdct.ov_offset = lFrame / facFB / 2;
1796
0
        }
1797
58.7k
        nrSamples += imdct_drain(&pAacDecoderStaticChannelInfo->IMdct,
1798
58.7k
                                 synth + nrSamples, lFrame / facFB - nrSamples);
1799
58.7k
      }
1800
1801
104k
      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
60.0k
        acelp_out = pAacDecoderStaticChannelInfo->IMdct.overlap.time +
1807
60.0k
                    pAacDecoderStaticChannelInfo->IMdct.ov_offset;
1808
1809
        /* Account ACELP time domain output samples to overlap buffer */
1810
60.0k
        pAacDecoderStaticChannelInfo->IMdct.ov_offset += lDiv;
1811
60.0k
      } else {
1812
        /* Write ACELP time domain samples into output buffer at pTimeData +
1813
         * nrSamples */
1814
44.0k
        acelp_out = synth + nrSamples;
1815
1816
        /* Account ACELP time domain output samples to output buffer */
1817
44.0k
        nrSamples += lDiv;
1818
44.0k
      }
1819
1820
104k
      if (mod[k] == 4) {
1821
1.73k
        pAacDecoderStaticChannelInfo->acelp.wsyn_rms = scaleValue(
1822
1.73k
            pAacDecoderChannelInfo->data.usac.tcx_gain[k],
1823
1.73k
            fixMin(0,
1824
1.73k
                   pAacDecoderChannelInfo->data.usac.tcx_gain_e[k] - SF_EXC));
1825
1.73k
        CLpd_TcxTDConceal(&pAacDecoderStaticChannelInfo->acelp,
1826
1.73k
                          &pAacDecoderStaticChannelInfo->last_tcx_pitch,
1827
1.73k
                          pAacDecoderChannelInfo->data.usac.lsp_coeff[k],
1828
1.73k
                          pAacDecoderChannelInfo->data.usac.lsp_coeff[k + 1],
1829
1.73k
                          pAacDecoderChannelInfo->data.usac.aStability[k],
1830
1.73k
                          pAacDecoderStaticChannelInfo->numLostLpdFrames,
1831
1.73k
                          acelp_out, lFrame,
1832
1.73k
                          pAacDecoderStaticChannelInfo->last_tcx_noise_factor);
1833
1834
102k
      } else {
1835
102k
        FDK_ASSERT(pAacDecoderChannelInfo->data.usac.aStability[k] >=
1836
102k
                   (FIXP_SGL)0);
1837
102k
        CLpd_AcelpDecode(&pAacDecoderStaticChannelInfo->acelp, i_offset,
1838
102k
                         pAacDecoderChannelInfo->data.usac.lsp_coeff[k],
1839
102k
                         pAacDecoderChannelInfo->data.usac.lsp_coeff[k + 1],
1840
102k
                         pAacDecoderChannelInfo->data.usac.aStability[k],
1841
102k
                         &pAacDecoderChannelInfo->data.usac.acelp[k],
1842
102k
                         pAacDecoderStaticChannelInfo->numLostLpdFrames,
1843
102k
                         last_lpc_lost, k, acelp_out,
1844
102k
                         &pitch[(k * nbSubfr) + synSfd],
1845
102k
                         &pit_gain[(k * nbSubfr) + synSfd], lFrame);
1846
102k
      }
1847
1848
104k
      if (mod[k] != 4) {
1849
102k
        if (last_lpd_mode != 0 &&
1850
44.9k
            pAacDecoderChannelInfo->data.usac
1851
44.9k
                .bpf_control_info) { /* FD/TCX -> ACELP transition */
1852
          /* bass post-filter past FAC area (past two (one for FD short)
1853
           * subframes) */
1854
22.5k
          int currentSf = synSfd + k * nbSubfr;
1855
1856
22.5k
          if ((k > 0) || (pAacDecoderStaticChannelInfo->last_core_mode !=
1857
18.4k
                          FD_SHORT)) { /* TCX or FD long -> ACELP */
1858
18.4k
            pitch[currentSf - 2] = pitch[currentSf - 1] = pitch[currentSf];
1859
18.4k
            pit_gain[currentSf - 2] = pit_gain[currentSf - 1] =
1860
18.4k
                pit_gain[currentSf];
1861
18.4k
          } else { /* FD short -> ACELP */
1862
4.02k
            pitch[currentSf - 1] = pitch[currentSf];
1863
4.02k
            pit_gain[currentSf - 1] = pit_gain[currentSf];
1864
4.02k
          }
1865
22.5k
        }
1866
102k
      }
1867
104k
    } else { /* TCX */
1868
55.8k
      int lg = lg_table[mod[k]];
1869
55.8k
      int isFullBandLpd = 0;
1870
1871
      /* FAC management */
1872
55.8k
      if ((last_lpd_mode == 0) || (last_lpd_mode == 4)) /* TCX TD concealment */
1873
21.8k
      {
1874
21.8k
        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
21.8k
        if (last_frame_lost == 1 ||
1879
21.8k
            pAacDecoderChannelInfo->data.usac.fac_data[k] == NULL) {
1880
7.90k
          FDKmemclear(fac_buf, 1024 / 8 * sizeof(FIXP_DBL));
1881
7.90k
          pAacDecoderChannelInfo->data.usac.fac_data[k] = fac_buf;
1882
7.90k
          pAacDecoderChannelInfo->data.usac.fac_data_e[k] = 0;
1883
7.90k
        }
1884
1885
21.8k
        nrSamples += CLpd_FAC_Acelp2Mdct(
1886
21.8k
            &pAacDecoderStaticChannelInfo->IMdct, synth + nrSamples,
1887
21.8k
            SPEC_TCX(pAacDecoderChannelInfo->pSpectralCoefficient, k,
1888
21.8k
                     pAacDecoderChannelInfo->granuleLength, isFullBandLpd),
1889
21.8k
            pAacDecoderChannelInfo->specScale + k, 1,
1890
21.8k
            pAacDecoderChannelInfo->data.usac.fac_data[k],
1891
21.8k
            pAacDecoderChannelInfo->data.usac.fac_data_e[k],
1892
21.8k
            pAacDecoderChannelInfo->granuleLength /* == fac_length */,
1893
21.8k
            lFrame - nrSamples, lg,
1894
21.8k
            FDKgetWindowSlope(lDiv,
1895
21.8k
                              GetWindowShape(&pAacDecoderChannelInfo->icsInfo)),
1896
21.8k
            lDiv, pAacDecoderChannelInfo->data.usac.lp_coeff[k],
1897
21.8k
            pAacDecoderChannelInfo->data.usac.lp_coeff_exp[k],
1898
21.8k
            &pAacDecoderStaticChannelInfo->acelp,
1899
21.8k
            pAacDecoderChannelInfo->data.usac.tcx_gain[k],
1900
21.8k
            (last_frame_lost || !frameOk), 0 /* is not FD FAC */
1901
21.8k
            ,
1902
21.8k
            last_lpd_mode, k,
1903
21.8k
            pAacDecoderChannelInfo
1904
21.8k
                ->currAliasingSymmetry /* Note: The current aliasing
1905
                                          symmetry for a TCX (i.e. LPD)
1906
                                          frame must always be 0 */
1907
21.8k
        );
1908
1909
21.8k
        pitch[(k * nbSubfr) + synSfd + 1] = pitch[(k * nbSubfr) + synSfd] =
1910
21.8k
            pitch[(k * nbSubfr) + synSfd - 1];
1911
21.8k
        pit_gain[(k * nbSubfr) + synSfd + 1] =
1912
21.8k
            pit_gain[(k * nbSubfr) + synSfd] =
1913
21.8k
                pit_gain[(k * nbSubfr) + synSfd - 1];
1914
1915
21.8k
        C_AALLOC_SCRATCH_END(fac_buf, FIXP_DBL, 1024 / 8);
1916
33.9k
      } else {
1917
33.9k
        int tl = lg;
1918
33.9k
        int fl = lDiv;
1919
33.9k
        int fr = lDiv;
1920
1921
33.9k
        nrSamples += imlt_block(
1922
33.9k
            &pAacDecoderStaticChannelInfo->IMdct, synth + nrSamples,
1923
33.9k
            SPEC_TCX(pAacDecoderChannelInfo->pSpectralCoefficient, k,
1924
33.9k
                     pAacDecoderChannelInfo->granuleLength, isFullBandLpd),
1925
33.9k
            pAacDecoderChannelInfo->specScale + k, 1, lFrame - nrSamples, tl,
1926
33.9k
            FDKgetWindowSlope(fl,
1927
33.9k
                              GetWindowShape(&pAacDecoderChannelInfo->icsInfo)),
1928
33.9k
            fl,
1929
33.9k
            FDKgetWindowSlope(fr,
1930
33.9k
                              GetWindowShape(&pAacDecoderChannelInfo->icsInfo)),
1931
33.9k
            fr, pAacDecoderChannelInfo->data.usac.tcx_gain[k],
1932
33.9k
            pAacDecoderChannelInfo->currAliasingSymmetry
1933
33.9k
                ? MLT_FLAG_CURR_ALIAS_SYMMETRY
1934
33.9k
                : 0);
1935
33.9k
      }
1936
55.8k
    }
1937
    /* remember previous mode */
1938
159k
    last_last_lpd_mode = last_lpd_mode;
1939
159k
    last_lpd_mode = mod[k];
1940
159k
    last_lpc_lost = (frameOk == 0) ? 1 : 0;
1941
1942
    /* Increase k to next frame */
1943
159k
    last_k = k;
1944
159k
    k += ((mod[k] & 0x3) == 0) ? 1 : (1 << (mod[k] - 1));
1945
159k
  }
1946
1947
45.4k
  if (frameOk) {
1948
    /* assume data was ok => store for concealment */
1949
44.3k
    FDK_ASSERT(pAacDecoderChannelInfo->data.usac.aStability[last_k] >=
1950
44.3k
               (FIXP_SGL)0);
1951
44.3k
    pAacDecoderStaticChannelInfo->oldStability =
1952
44.3k
        pAacDecoderChannelInfo->data.usac.aStability[last_k];
1953
44.3k
    FDKmemcpy(pAacDecoderStaticChannelInfo->lsf_adaptive_mean,
1954
44.3k
              pAacDecoderChannelInfo->data.usac.lsf_adaptive_mean_cand,
1955
44.3k
              M_LP_FILTER_ORDER * sizeof(FIXP_LPC));
1956
44.3k
  }
1957
1958
  /* store past lp coeffs for next superframe (they are only valid and needed if
1959
   * last_lpd_mode was tcx) */
1960
45.4k
  if (last_lpd_mode > 0) {
1961
11.5k
    FDKmemcpy(pAacDecoderStaticChannelInfo->lp_coeff_old[0],
1962
11.5k
              pAacDecoderChannelInfo->data.usac.lp_coeff[nbDiv],
1963
11.5k
              M_LP_FILTER_ORDER * sizeof(FIXP_LPC));
1964
11.5k
    pAacDecoderStaticChannelInfo->lp_coeff_old_exp[0] =
1965
11.5k
        pAacDecoderChannelInfo->data.usac.lp_coeff_exp[nbDiv];
1966
11.5k
    FDKmemcpy(pAacDecoderStaticChannelInfo->lp_coeff_old[1],
1967
11.5k
              pAacDecoderChannelInfo->data.usac.lp_coeff[last_k],
1968
11.5k
              M_LP_FILTER_ORDER * sizeof(FIXP_LPC));
1969
11.5k
    pAacDecoderStaticChannelInfo->lp_coeff_old_exp[1] =
1970
11.5k
        pAacDecoderChannelInfo->data.usac.lp_coeff_exp[last_k];
1971
11.5k
  }
1972
1973
45.4k
  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
45.4k
  if (!(pAacDecoderChannelInfo->data.usac.bpf_control_info)) {
1978
20.6k
    if (mod[0] != 0 && (pAacDecoderStaticChannelInfo->old_bpf_control_info)) {
1979
9.71k
      for (int i = 2; i < nbSubfrSuperfr; i++)
1980
9.02k
        pit_gain[synSfd + i] = (FIXP_DBL)0;
1981
19.9k
    } else {
1982
293k
      for (int i = 0; i < nbSubfrSuperfr; i++)
1983
273k
        pit_gain[synSfd + i] = (FIXP_DBL)0;
1984
19.9k
    }
1985
20.6k
  }
1986
1987
  /* for bass postfilter */
1988
317k
  for (int n = 0; n < synSfd; n++) {
1989
271k
    pAacDecoderStaticChannelInfo->old_T_pf[n] = pitch[nbSubfrSuperfr + n];
1990
271k
    pAacDecoderStaticChannelInfo->old_gain_pf[n] = pit_gain[nbSubfrSuperfr + n];
1991
271k
  }
1992
1993
45.4k
  pAacDecoderStaticChannelInfo->old_bpf_control_info =
1994
45.4k
      pAacDecoderChannelInfo->data.usac.bpf_control_info;
1995
1996
45.4k
  {
1997
45.4k
    INT lookahead = -BPF_DELAY;
1998
45.4k
    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
45.4k
    lookahead += imdct_copy_ov_and_nr(&pAacDecoderStaticChannelInfo->IMdct,
2004
45.4k
                                      synth + nrSamples, copySamp);
2005
2006
45.4k
    FDK_ASSERT(lookahead == copySamp - BPF_DELAY);
2007
2008
45.4k
    FIXP_DBL *p2_synth = synth + BPF_DELAY;
2009
2010
    /* recalculate pitch gain to allow postfilering on FAC area */
2011
680k
    for (int i = 0; i < nbSubfrSuperfr; i++) {
2012
634k
      int T = pitch[i];
2013
634k
      FIXP_DBL gain = pit_gain[i];
2014
2015
634k
      if (gain > (FIXP_DBL)0) {
2016
177k
        gain = get_gain(&p2_synth[i * L_SUBFR], &p2_synth[(i * L_SUBFR) - T],
2017
177k
                        L_SUBFR);
2018
177k
        pit_gain[i] = gain;
2019
177k
      }
2020
634k
    }
2021
2022
45.4k
    {
2023
45.4k
      bass_pf_1sf_delay(p2_synth, pitch, pit_gain, lFrame, lFrame / facFB,
2024
45.4k
                        mod[nbDiv - 1] ? (SynDelay - (lDiv / 2)) : SynDelay,
2025
45.4k
                        pTimeData, aacOutDataHeadroom,
2026
45.4k
                        pAacDecoderStaticChannelInfo->mem_bpf);
2027
45.4k
    }
2028
45.4k
  }
2029
2030
0
  Acelp_PostProcessing(synth_buf, pAacDecoderStaticChannelInfo->old_synth,
2031
45.4k
                       pitch, pAacDecoderStaticChannelInfo->old_T_pf, lFrame,
2032
45.4k
                       synSfd, nbSubfrSuperfr);
2033
2034
  /* Store last mode for next super frame */
2035
45.4k
  { pAacDecoderStaticChannelInfo->last_core_mode = LPD; }
2036
45.4k
  pAacDecoderStaticChannelInfo->last_lpd_mode = last_lpd_mode;
2037
45.4k
  pAacDecoderStaticChannelInfo->last_last_lpd_mode = last_last_lpd_mode;
2038
45.4k
  pAacDecoderStaticChannelInfo->last_lpc_lost = last_lpc_lost;
2039
2040
45.4k
  return error;
2041
45.4k
}