Coverage Report

Created: 2026-02-26 07:03

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