Coverage Report

Created: 2026-09-14 08:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/opus/celt/celt_decoder.c
Line
Count
Source
1
/* Copyright (c) 2007-2008 CSIRO
2
   Copyright (c) 2007-2010 Xiph.Org Foundation
3
   Copyright (c) 2008 Gregory Maxwell
4
   Written by Jean-Marc Valin and Gregory Maxwell */
5
/*
6
   Redistribution and use in source and binary forms, with or without
7
   modification, are permitted provided that the following conditions
8
   are met:
9
10
   - Redistributions of source code must retain the above copyright
11
   notice, this list of conditions and the following disclaimer.
12
13
   - Redistributions in binary form must reproduce the above copyright
14
   notice, this list of conditions and the following disclaimer in the
15
   documentation and/or other materials provided with the distribution.
16
17
   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18
   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19
   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20
   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
21
   OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22
   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23
   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24
   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25
   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26
   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27
   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
*/
29
30
#ifdef HAVE_CONFIG_H
31
#include "config.h"
32
#endif
33
34
#define CELT_DECODER_C
35
36
#include "cpu_support.h"
37
#include "os_support.h"
38
#include "mdct.h"
39
#include <math.h>
40
#include "celt.h"
41
#include "pitch.h"
42
#include "bands.h"
43
#include "modes.h"
44
#include "entcode.h"
45
#include "quant_bands.h"
46
#include "rate.h"
47
#include "stack_alloc.h"
48
#include "mathops.h"
49
#include "float_cast.h"
50
#include <stdarg.h>
51
#include "celt_lpc.h"
52
#include "vq.h"
53
54
#ifdef ENABLE_DEEP_PLC
55
#include "lpcnet.h"
56
#include "lpcnet_private.h"
57
#endif
58
59
/* The maximum pitch lag to allow in the pitch-based PLC. It's possible to save
60
   CPU time in the PLC pitch search by making this smaller than MAX_PERIOD. The
61
   current value corresponds to a pitch of 66.67 Hz. */
62
75.8k
#define PLC_PITCH_LAG_MAX (720)
63
/* The minimum pitch lag to allow in the pitch-based PLC. This corresponds to a
64
   pitch of 480 Hz. */
65
18.9k
#define PLC_PITCH_LAG_MIN (100)
66
67
1.30M
#define FRAME_NONE         0
68
81.0k
#define FRAME_NORMAL       1
69
183k
#define FRAME_PLC_NOISE    2
70
322k
#define FRAME_PLC_PERIODIC 3
71
149k
#define FRAME_PLC_NEURAL   4
72
149k
#define FRAME_DRED         5
73
74
/**********************************************************************/
75
/*                                                                    */
76
/*                             DECODER                                */
77
/*                                                                    */
78
/**********************************************************************/
79
37.9k
#define DECODE_BUFFER_SIZE DEC_PITCH_BUF_SIZE
80
81
#define PLC_UPDATE_FRAMES 4
82
#define PLC_UPDATE_SAMPLES (PLC_UPDATE_FRAMES*FRAME_SIZE)
83
84
/** Decoder state
85
 @brief Decoder state
86
 */
87
struct OpusCustomDecoder {
88
   const OpusCustomMode *mode;
89
   int overlap;
90
   int channels;
91
   int stream_channels;
92
93
   int downsample;
94
   int start, end;
95
   int signalling;
96
   int disable_inv;
97
   int complexity;
98
   int arch;
99
#ifdef ENABLE_QEXT
100
   int qext_scale;
101
#endif
102
103
   /* Everything beyond this point gets cleared on a reset */
104
#define DECODER_RESET_START rng
105
106
   opus_uint32 rng;
107
   int error;
108
   int last_pitch_index;
109
   int loss_duration;
110
   int plc_duration;
111
   int last_frame_type;
112
   int skip_plc;
113
   int postfilter_period;
114
   int postfilter_period_old;
115
   opus_val16 postfilter_gain;
116
   opus_val16 postfilter_gain_old;
117
   int postfilter_tapset;
118
   int postfilter_tapset_old;
119
   int prefilter_and_fold;
120
121
   celt_sig preemph_memD[2];
122
123
#ifdef ENABLE_DEEP_PLC
124
   opus_int16 plc_pcm[PLC_UPDATE_SAMPLES];
125
   int plc_fill;
126
   float plc_preemphasis_mem;
127
#endif
128
129
#ifdef ENABLE_QEXT
130
   celt_glog qext_oldBandE[2*NB_QEXT_BANDS];
131
#endif
132
133
   celt_sig _decode_mem[1]; /* Size = channels*(DECODE_BUFFER_SIZE+mode->overlap) */
134
   /* celt_glog oldEBands[], Size = 2*mode->nbEBands */
135
   /* celt_glog oldLogE[], Size = 2*mode->nbEBands */
136
   /* celt_glog oldLogE2[], Size = 2*mode->nbEBands */
137
   /* celt_glog backgroundLogE[], Size = 2*mode->nbEBands */
138
   /* opus_val16 lpc[],  Size = channels*CELT_LPC_ORDER */
139
};
140
141
#if defined(ENABLE_HARDENING) || defined(ENABLE_ASSERTIONS)
142
/* Make basic checks on the CELT state to ensure we don't end
143
   up writing all over memory. */
144
void validate_celt_decoder(CELTDecoder *st)
145
191k
{
146
191k
#if !defined(CUSTOM_MODES) && !defined(ENABLE_OPUS_CUSTOM_API) && !defined(ENABLE_QEXT)
147
191k
   celt_assert(st->mode == opus_custom_mode_create(48000, 960, NULL));
148
191k
   celt_assert(st->overlap == 120);
149
191k
   celt_assert(st->end <= 21);
150
#else
151
/* From Section 4.3 in the spec: "The normal CELT layer uses 21 of those bands,
152
   though Opus Custom (see Section 6.2) may use a different number of bands"
153
154
   Check if it's within the maximum number of Bark frequency bands instead */
155
   celt_assert(st->end <= 25);
156
#endif
157
191k
   celt_assert(st->channels == 1 || st->channels == 2);
158
191k
   celt_assert(st->stream_channels == 1 || st->stream_channels == 2);
159
191k
   celt_assert(st->downsample > 0);
160
191k
   celt_assert(st->start == 0 || st->start == 17);
161
191k
   celt_assert(st->start < st->end);
162
191k
#ifdef OPUS_ARCHMASK
163
191k
   celt_assert(st->arch >= 0);
164
191k
   celt_assert(st->arch <= OPUS_ARCHMASK);
165
191k
#endif
166
191k
#ifndef ENABLE_QEXT
167
191k
   celt_assert(st->last_pitch_index <= PLC_PITCH_LAG_MAX);
168
191k
   celt_assert(st->last_pitch_index >= PLC_PITCH_LAG_MIN || st->last_pitch_index == 0);
169
191k
#endif
170
191k
   celt_assert(st->postfilter_period < MAX_PERIOD);
171
191k
   celt_assert(st->postfilter_period >= COMBFILTER_MINPERIOD || st->postfilter_period == 0);
172
191k
   celt_assert(st->postfilter_period_old < MAX_PERIOD);
173
191k
   celt_assert(st->postfilter_period_old >= COMBFILTER_MINPERIOD || st->postfilter_period_old == 0);
174
191k
   celt_assert(st->postfilter_tapset <= 2);
175
191k
   celt_assert(st->postfilter_tapset >= 0);
176
191k
   celt_assert(st->postfilter_tapset_old <= 2);
177
191k
   celt_assert(st->postfilter_tapset_old >= 0);
178
191k
}
179
#endif
180
181
int celt_decoder_get_size(int channels)
182
1.12M
{
183
#ifdef ENABLE_QEXT
184
   const CELTMode *mode = opus_custom_mode_create(96000, 960, NULL);
185
#else
186
1.12M
   const CELTMode *mode = opus_custom_mode_create(48000, 960, NULL);
187
1.12M
#endif
188
1.12M
   return opus_custom_decoder_get_size(mode, channels);
189
1.12M
}
190
191
OPUS_CUSTOM_NOSTATIC int opus_custom_decoder_get_size(const CELTMode *mode, int channels)
192
2.47M
{
193
2.47M
   int size;
194
#ifdef ENABLE_QEXT
195
   int qext_scale;
196
   if (mode->Fs == 96000 && (mode->shortMdctSize==240 || mode->shortMdctSize==180)) {
197
      qext_scale = 2;
198
   } else qext_scale = 1;
199
#endif
200
2.47M
   size = sizeof(struct CELTDecoder)
201
2.47M
            + (channels*(QEXT_SCALE(DECODE_BUFFER_SIZE)+mode->overlap)-1)*sizeof(celt_sig)
202
2.47M
            + 4*2*mode->nbEBands*sizeof(celt_glog)
203
2.47M
            + channels*CELT_LPC_ORDER*sizeof(opus_val16);
204
2.47M
   return size;
205
2.47M
}
206
207
#if defined(CUSTOM_MODES) || defined(ENABLE_OPUS_CUSTOM_API)
208
CELTDecoder *opus_custom_decoder_create(const CELTMode *mode, int channels, int *error)
209
{
210
   int ret;
211
   CELTDecoder *st = (CELTDecoder *)opus_alloc(opus_custom_decoder_get_size(mode, channels));
212
   ret = opus_custom_decoder_init(st, mode, channels);
213
   if (ret != OPUS_OK)
214
   {
215
      opus_custom_decoder_destroy(st);
216
      st = NULL;
217
   }
218
   if (error)
219
      *error = ret;
220
   return st;
221
}
222
#endif /* CUSTOM_MODES */
223
224
int celt_decoder_init(CELTDecoder *st, opus_int32 sampling_rate, int channels)
225
47.4k
{
226
47.4k
   int ret;
227
#ifdef ENABLE_QEXT
228
   if (sampling_rate == 96000) {
229
      return opus_custom_decoder_init(st, opus_custom_mode_create(96000, 960, NULL), channels);
230
   }
231
#endif
232
47.4k
   ret = opus_custom_decoder_init(st, opus_custom_mode_create(48000, 960, NULL), channels);
233
47.4k
   if (ret != OPUS_OK)
234
0
      return ret;
235
47.4k
   st->downsample = resampling_factor(sampling_rate);
236
47.4k
   if (st->downsample==0)
237
0
      return OPUS_BAD_ARG;
238
47.4k
   else
239
47.4k
      return OPUS_OK;
240
47.4k
}
241
242
OPUS_CUSTOM_NOSTATIC int opus_custom_decoder_init(CELTDecoder *st, const CELTMode *mode, int channels)
243
47.4k
{
244
47.4k
   if (channels < 0 || channels > 2)
245
0
      return OPUS_BAD_ARG;
246
247
47.4k
   if (st==NULL)
248
0
      return OPUS_ALLOC_FAIL;
249
250
47.4k
   OPUS_CLEAR((char*)st, opus_custom_decoder_get_size(mode, channels));
251
252
47.4k
   st->mode = mode;
253
47.4k
   st->overlap = mode->overlap;
254
47.4k
   st->stream_channels = st->channels = channels;
255
256
47.4k
   st->downsample = 1;
257
47.4k
   st->start = 0;
258
47.4k
   st->end = st->mode->effEBands;
259
47.4k
   st->signalling = 1;
260
47.4k
#ifndef DISABLE_UPDATE_DRAFT
261
47.4k
   st->disable_inv = channels == 1;
262
#else
263
   st->disable_inv = 0;
264
#endif
265
47.4k
   st->arch = opus_select_arch();
266
267
#ifdef ENABLE_QEXT
268
   if (st->mode->Fs == 96000 && (mode->shortMdctSize==240 || mode->shortMdctSize==180)) st->qext_scale = 2;
269
   else st->qext_scale = 1;
270
#endif
271
272
47.4k
   opus_custom_decoder_ctl(st, OPUS_RESET_STATE);
273
274
47.4k
   return OPUS_OK;
275
47.4k
}
276
277
#if defined(CUSTOM_MODES) || defined(ENABLE_OPUS_CUSTOM_API)
278
void opus_custom_decoder_destroy(CELTDecoder *st)
279
{
280
   opus_free(st);
281
}
282
#endif /* CUSTOM_MODES */
283
284
/* Single-channel de-emphasis scalar reference (mono, downsample==1, !accum).
285
   Matches the inner loop used inside deemphasis() below; non-static so the
286
   runtime dispatch table can take its address. */
287
opus_val32 celt_deemphasis_c(opus_res *y, const opus_val32 *x, opus_val16 coef0,
288
      opus_val32 m, int N)
289
17.9k
{
290
17.9k
   int j;
291
7.73M
   for (j=0;j<N;j++)
292
7.72M
   {
293
7.72M
      celt_sig tmp = SATURATE(x[j] + VERY_SMALL + m, SIG_SAT);
294
7.72M
      m = MULT16_32_Q15(coef0, tmp);
295
7.72M
      y[j] = SIG2RES(tmp);
296
7.72M
   }
297
17.9k
   return m;
298
17.9k
}
299
300
/* Special case for stereo with no downsampling and no accumulation. This is
301
   quite common and we can make it faster by processing both channels in the
302
   same loop, reducing overhead due to the dependency loop in the IIR filter.
303
   Non-static so the runtime dispatch table can take its address. */
304
void deemphasis_stereo_simple_c(celt_sig *in[], opus_res *pcm, int N, opus_val16 coef0,
305
      celt_sig *mem)
306
124k
{
307
124k
   celt_sig * OPUS_RESTRICT x0;
308
124k
   celt_sig * OPUS_RESTRICT x1;
309
124k
   celt_sig m0, m1;
310
124k
   int j;
311
124k
   x0=in[0];
312
124k
   x1=in[1];
313
124k
   m0 = mem[0];
314
124k
   m1 = mem[1];
315
50.5M
   for (j=0;j<N;j++)
316
50.3M
   {
317
50.3M
      celt_sig tmp0, tmp1;
318
      /* Add VERY_SMALL to x[] first to reduce dependency chain. */
319
50.3M
      tmp0 = SATURATE(x0[j] + VERY_SMALL + m0, SIG_SAT);
320
50.3M
      tmp1 = SATURATE(x1[j] + VERY_SMALL + m1, SIG_SAT);
321
50.3M
      m0 = MULT16_32_Q15(coef0, tmp0);
322
50.3M
      m1 = MULT16_32_Q15(coef0, tmp1);
323
50.3M
      pcm[2*j  ] = SIG2RES(tmp0);
324
50.3M
      pcm[2*j+1] = SIG2RES(tmp1);
325
50.3M
   }
326
124k
   mem[0] = m0;
327
124k
   mem[1] = m1;
328
124k
}
329
330
#ifndef RESYNTH
331
static
332
#endif
333
void deemphasis(celt_sig *in[], opus_res *pcm, int N, int C, int downsample, const opus_val16 *coef,
334
      celt_sig *mem, int accum, int arch)
335
191k
{
336
191k
   int c;
337
191k
   int Nd;
338
191k
   int apply_downsampling=0;
339
191k
   opus_val16 coef0;
340
191k
   VARDECL(celt_sig, scratch);
341
191k
   SAVE_STACK;
342
191k
#if !defined(CUSTOM_MODES) && !defined(ENABLE_OPUS_CUSTOM_API) && !defined(ENABLE_QEXT)
343
   /* Short version for common case. */
344
191k
   if (downsample == 1 && C == 2 && !accum)
345
124k
   {
346
124k
      deemphasis_stereo_simple(in, pcm, N, coef[0], mem, arch);
347
124k
      return;
348
124k
   }
349
67.2k
#endif
350
67.2k
   (void)arch;
351
67.2k
   ALLOC(scratch, N, celt_sig);
352
67.2k
   coef0 = coef[0];
353
67.2k
   Nd = N/downsample;
354
113k
   c=0; do {
355
113k
      int j;
356
113k
      celt_sig * OPUS_RESTRICT x;
357
113k
      opus_res  * OPUS_RESTRICT y;
358
113k
      celt_sig m = mem[c];
359
113k
      x =in[c];
360
113k
      y = pcm+c;
361
#if defined(CUSTOM_MODES) || defined(ENABLE_OPUS_CUSTOM_API) || defined(ENABLE_QEXT)
362
      if (coef[1] != 0)
363
      {
364
         opus_val16 coef1 = coef[1];
365
         opus_val16 coef3 = coef[3];
366
         for (j=0;j<N;j++)
367
         {
368
            celt_sig tmp = SATURATE(x[j] + m + VERY_SMALL, SIG_SAT);
369
            m = MULT16_32_Q15(coef0, tmp)
370
                          - MULT16_32_Q15(coef1, x[j]);
371
            tmp = SHL32(MULT16_32_Q15(coef3, tmp), 2);
372
            scratch[j] = tmp;
373
         }
374
         apply_downsampling=1;
375
      } else
376
#endif
377
113k
      if (downsample>1)
378
0
      {
379
         /* Shortcut for the standard (non-custom modes) case */
380
0
         for (j=0;j<N;j++)
381
0
         {
382
0
            celt_sig tmp = SATURATE(x[j] + VERY_SMALL + m, SIG_SAT);
383
0
            m = MULT16_32_Q15(coef0, tmp);
384
0
            scratch[j] = tmp;
385
0
         }
386
0
         apply_downsampling=1;
387
113k
      } else {
388
         /* Shortcut for the standard (non-custom modes) case */
389
113k
         if (accum)
390
95.0k
         {
391
62.0M
            for (j=0;j<N;j++)
392
61.9M
            {
393
61.9M
               celt_sig tmp = SATURATE(x[j] + m + VERY_SMALL, SIG_SAT);
394
61.9M
               m = MULT16_32_Q15(coef0, tmp);
395
61.9M
               y[j*C] = ADD_RES(y[j*C], SIG2RES(tmp));
396
61.9M
            }
397
95.0k
         } else if (C == 1)
398
17.9k
         {
399
            /* Mono: contiguous output, dispatch through celt_deemphasis()
400
               so the ARM NEON kernel can be used on aarch64. */
401
17.9k
            m = celt_deemphasis(y, x, coef0, m, N, arch);
402
17.9k
         } else
403
0
         {
404
0
            for (j=0;j<N;j++)
405
0
            {
406
0
               celt_sig tmp = SATURATE(x[j] + VERY_SMALL + m, SIG_SAT);
407
0
               m = MULT16_32_Q15(coef0, tmp);
408
0
               y[j*C] = SIG2RES(tmp);
409
0
            }
410
0
         }
411
113k
      }
412
113k
      mem[c] = m;
413
414
113k
      if (apply_downsampling)
415
0
      {
416
         /* Perform down-sampling */
417
0
         if (accum)
418
0
         {
419
0
            for (j=0;j<Nd;j++)
420
0
               y[j*C] = ADD_RES(y[j*C], SIG2RES(scratch[j*downsample]));
421
0
         } else
422
0
         {
423
0
            for (j=0;j<Nd;j++)
424
0
               y[j*C] = SIG2RES(scratch[j*downsample]);
425
0
         }
426
0
      }
427
113k
   } while (++c<C);
428
67.2k
   RESTORE_STACK;
429
67.2k
}
430
431
#ifndef RESYNTH
432
static
433
#endif
434
void celt_synthesis(const CELTMode *mode, celt_norm *X, celt_sig * out_syn[],
435
                    celt_glog *oldBandE, int start, int effEnd, int C, int CC,
436
                    int isTransient, int LM, int downsample,
437
                    int silence, int arch ARG_QEXT(const CELTMode *qext_mode) ARG_QEXT(const celt_glog *qext_bandLogE) ARG_QEXT(int qext_end))
438
154k
{
439
154k
   int c, i;
440
154k
   int M;
441
154k
   int b;
442
154k
   int B;
443
154k
   int N, NB;
444
154k
   int shift;
445
154k
   int nbEBands;
446
154k
   int overlap;
447
154k
   VARDECL(celt_sig, freq);
448
154k
   SAVE_STACK;
449
450
154k
   overlap = mode->overlap;
451
154k
   nbEBands = mode->nbEBands;
452
154k
   N = mode->shortMdctSize<<LM;
453
154k
   ALLOC(freq, N, celt_sig); /**< Interleaved signal MDCTs */
454
154k
   M = 1<<LM;
455
#ifdef ENABLE_QEXT
456
   if (mode->Fs != 96000) qext_end=2;
457
#endif
458
459
154k
   if (isTransient)
460
5.98k
   {
461
5.98k
      B = M;
462
5.98k
      NB = mode->shortMdctSize;
463
5.98k
      shift = mode->maxLM;
464
148k
   } else {
465
148k
      B = 1;
466
148k
      NB = mode->shortMdctSize<<LM;
467
148k
      shift = mode->maxLM-LM;
468
148k
   }
469
470
154k
   if (CC==2&&C==1)
471
45.0k
   {
472
      /* Copying a mono streams to two channels */
473
45.0k
      celt_sig *freq2;
474
45.0k
      denormalise_bands(mode, X, freq, oldBandE, start, effEnd, M,
475
45.0k
            downsample, silence);
476
#ifdef ENABLE_QEXT
477
      if (qext_mode)
478
         denormalise_bands(qext_mode, X, freq, qext_bandLogE, 0, qext_end, M,
479
                        downsample, silence);
480
#endif
481
      /* Store a temporary copy in the output buffer because the IMDCT destroys its input. */
482
45.0k
      freq2 = out_syn[1]+overlap/2;
483
45.0k
      OPUS_COPY(freq2, freq, N);
484
102k
      for (b=0;b<B;b++)
485
57.7k
         clt_mdct_backward(&mode->mdct, &freq2[b], out_syn[0]+NB*b, mode->window, overlap, shift, B, arch);
486
102k
      for (b=0;b<B;b++)
487
57.7k
         clt_mdct_backward(&mode->mdct, &freq[b], out_syn[1]+NB*b, mode->window, overlap, shift, B, arch);
488
108k
   } else if (CC==1&&C==2)
489
1.66k
   {
490
      /* Downmixing a stereo stream to mono */
491
1.66k
      celt_sig *freq2;
492
1.66k
      freq2 = out_syn[0]+overlap/2;
493
1.66k
      denormalise_bands(mode, X, freq, oldBandE, start, effEnd, M,
494
1.66k
            downsample, silence);
495
      /* Use the output buffer as temp array before downmixing. */
496
1.66k
      denormalise_bands(mode, X+N, freq2, oldBandE+nbEBands, start, effEnd, M,
497
1.66k
            downsample, silence);
498
#ifdef ENABLE_QEXT
499
      if (qext_mode)
500
      {
501
         denormalise_bands(qext_mode, X, freq, qext_bandLogE, 0, qext_end, M,
502
                        downsample, silence);
503
         denormalise_bands(qext_mode, X+N, freq2, qext_bandLogE+NB_QEXT_BANDS, 0, qext_end, M,
504
                        downsample, silence);
505
      }
506
#endif
507
674k
      for (i=0;i<N;i++)
508
672k
         freq[i] = ADD32(HALF32(freq[i]), HALF32(freq2[i]));
509
3.74k
      for (b=0;b<B;b++)
510
2.07k
         clt_mdct_backward(&mode->mdct, &freq[b], out_syn[0]+NB*b, mode->window, overlap, shift, B, arch);
511
107k
   } else {
512
      /* Normal case (mono or stereo) */
513
200k
      c=0; do {
514
200k
         denormalise_bands(mode, X+c*N, freq, oldBandE+c*nbEBands, start, effEnd, M,
515
200k
               downsample, silence);
516
#ifdef ENABLE_QEXT
517
         if (qext_mode)
518
            denormalise_bands(qext_mode, X+c*N, freq, qext_bandLogE+c*NB_QEXT_BANDS, 0, qext_end, M,
519
                           downsample, silence);
520
#endif
521
408k
         for (b=0;b<B;b++)
522
207k
            clt_mdct_backward(&mode->mdct, &freq[b], out_syn[c]+NB*b, mode->window, overlap, shift, B, arch);
523
200k
      } while (++c<CC);
524
107k
   }
525
   /* Saturate IMDCT output so that we can't overflow in the pitch postfilter
526
      or in the */
527
292k
   c=0; do {
528
144M
      for (i=0;i<N;i++)
529
143M
         out_syn[c][i] = SATURATE(out_syn[c][i], SIG_SAT);
530
292k
   } while (++c<CC);
531
154k
   RESTORE_STACK;
532
154k
}
533
534
static void tf_decode(int start, int end, int isTransient, int *tf_res, int LM, ec_dec *dec)
535
81.0k
{
536
81.0k
   int i, curr, tf_select;
537
81.0k
   int tf_select_rsv;
538
81.0k
   int tf_changed;
539
81.0k
   int logp;
540
81.0k
   opus_uint32 budget;
541
81.0k
   opus_uint32 tell;
542
543
81.0k
   budget = dec->storage*8;
544
81.0k
   tell = ec_tell(dec);
545
81.0k
   logp = isTransient ? 2 : 4;
546
81.0k
   tf_select_rsv = LM>0 && tell+logp+1<=budget;
547
81.0k
   budget -= tf_select_rsv;
548
81.0k
   tf_changed = curr = 0;
549
1.05M
   for (i=start;i<end;i++)
550
975k
   {
551
975k
      if (tell+logp<=budget)
552
607k
      {
553
607k
         curr ^= ec_dec_bit_logp(dec, logp);
554
607k
         tell = ec_tell(dec);
555
607k
         tf_changed |= curr;
556
607k
      }
557
975k
      tf_res[i] = curr;
558
975k
      logp = isTransient ? 4 : 5;
559
975k
   }
560
81.0k
   tf_select = 0;
561
81.0k
   if (tf_select_rsv &&
562
37.5k
     tf_select_table[LM][4*isTransient+0+tf_changed] !=
563
37.5k
     tf_select_table[LM][4*isTransient+2+tf_changed])
564
13.5k
   {
565
13.5k
      tf_select = ec_dec_bit_logp(dec, 1);
566
13.5k
   }
567
1.05M
   for (i=start;i<end;i++)
568
975k
   {
569
975k
      tf_res[i] = tf_select_table[LM][4*isTransient+2*tf_select+tf_res[i]];
570
975k
   }
571
81.0k
}
572
573
static int celt_plc_pitch_search(CELTDecoder *st, celt_sig *decode_mem[2], int C, int arch)
574
18.9k
{
575
18.9k
   int pitch_index;
576
#ifdef ENABLE_QEXT
577
   int qext_scale;
578
#endif
579
18.9k
   VARDECL( opus_val16, lp_pitch_buf );
580
18.9k
   SAVE_STACK;
581
#ifdef ENABLE_QEXT
582
   qext_scale = st->qext_scale;
583
#else
584
18.9k
   (void)st;
585
18.9k
#endif
586
18.9k
   ALLOC( lp_pitch_buf, DECODE_BUFFER_SIZE>>1, opus_val16 );
587
18.9k
   pitch_downsample(decode_mem, lp_pitch_buf,
588
18.9k
         DECODE_BUFFER_SIZE>>1, C, QEXT_SCALE(2), arch);
589
18.9k
   pitch_search(lp_pitch_buf+(PLC_PITCH_LAG_MAX>>1), lp_pitch_buf,
590
18.9k
         DECODE_BUFFER_SIZE-PLC_PITCH_LAG_MAX,
591
18.9k
         PLC_PITCH_LAG_MAX-PLC_PITCH_LAG_MIN, &pitch_index, arch);
592
18.9k
   pitch_index = PLC_PITCH_LAG_MAX-pitch_index;
593
18.9k
   RESTORE_STACK;
594
18.9k
   return QEXT_SCALE(pitch_index);
595
18.9k
}
596
597
static void prefilter_and_fold(CELTDecoder * OPUS_RESTRICT st, int N)
598
15.8k
{
599
15.8k
   int c;
600
15.8k
   int CC;
601
15.8k
   int i;
602
15.8k
   int overlap;
603
15.8k
   celt_sig *decode_mem[2];
604
15.8k
   const OpusCustomMode *mode;
605
15.8k
   int decode_buffer_size;
606
#ifdef ENABLE_QEXT
607
   int qext_scale;
608
#endif
609
15.8k
   VARDECL(opus_val32, etmp);
610
15.8k
   SAVE_STACK
611
#ifdef ENABLE_QEXT
612
   qext_scale = st->qext_scale;
613
#endif
614
15.8k
   decode_buffer_size = QEXT_SCALE(DECODE_BUFFER_SIZE);
615
15.8k
   mode = st->mode;
616
15.8k
   overlap = st->overlap;
617
15.8k
   CC = st->channels;
618
15.8k
   ALLOC(etmp, overlap, opus_val32);
619
28.8k
   c=0; do {
620
28.8k
      decode_mem[c] = st->_decode_mem + c*(decode_buffer_size+overlap);
621
28.8k
   } while (++c<CC);
622
623
28.8k
   c=0; do {
624
      /* Apply the pre-filter to the MDCT overlap for the next frame because
625
         the post-filter will be re-applied in the decoder after the MDCT
626
         overlap. */
627
28.8k
      comb_filter(etmp, decode_mem[c]+decode_buffer_size-N,
628
28.8k
         st->postfilter_period_old, st->postfilter_period, overlap,
629
28.8k
         -st->postfilter_gain_old, -st->postfilter_gain,
630
28.8k
         st->postfilter_tapset_old, st->postfilter_tapset, NULL, 0, st->arch);
631
632
      /* Simulate TDAC on the concealed audio so that it blends with the
633
         MDCT of the next frame. */
634
1.76M
      for (i=0;i<overlap/2;i++)
635
1.73M
      {
636
1.73M
         decode_mem[c][decode_buffer_size-N+i] =
637
1.73M
            MULT16_32_Q15(COEF2VAL16(mode->window[i]), etmp[overlap-1-i])
638
1.73M
            + MULT16_32_Q15 (COEF2VAL16(mode->window[overlap-i-1]), etmp[i]);
639
1.73M
      }
640
28.8k
   } while (++c<CC);
641
15.8k
   RESTORE_STACK;
642
15.8k
}
643
644
#ifdef ENABLE_DEEP_PLC
645
646
#define SINC_ORDER 48
647
/* h=cos(pi/2*abs(sin([-24:24]/48*pi*23./24)).^2);
648
   b=sinc([-24:24]/3*1.02).*h;
649
   b=b/sum(b); */
650
static const float sinc_filter[SINC_ORDER+1] = {
651
    4.2931e-05f, -0.000190293f, -0.000816132f, -0.000637162f, 0.00141662f, 0.00354764f, 0.00184368f, -0.00428274f,
652
    -0.00856105f, -0.0034003f, 0.00930201f, 0.0159616f, 0.00489785f, -0.0169649f, -0.0259484f, -0.00596856f,
653
    0.0286551f, 0.0405872f, 0.00649994f, -0.0509284f, -0.0716655f, -0.00665212f,  0.134336f,  0.278927f,
654
    0.339995f,  0.278927f,  0.134336f, -0.00665212f, -0.0716655f, -0.0509284f, 0.00649994f, 0.0405872f,
655
    0.0286551f, -0.00596856f, -0.0259484f, -0.0169649f, 0.00489785f, 0.0159616f, 0.00930201f, -0.0034003f,
656
    -0.00856105f, -0.00428274f, 0.00184368f, 0.00354764f, 0.00141662f, -0.000637162f, -0.000816132f, -0.000190293f,
657
    4.2931e-05f
658
};
659
660
void update_plc_state(LPCNetPLCState *lpcnet, celt_sig *decode_mem[2], float *plc_preemphasis_mem, int CC)
661
{
662
   int i;
663
   int tmp_read_post, tmp_fec_skip;
664
   int offset;
665
   VARDECL(celt_sig, buf48k);
666
   VARDECL(opus_int16, buf16k);
667
   SAVE_STACK;
668
   ALLOC(buf48k, DECODE_BUFFER_SIZE, celt_sig);
669
   ALLOC(buf16k, PLC_UPDATE_SAMPLES, opus_int16);
670
   if (CC == 1) OPUS_COPY(buf48k, decode_mem[0], DECODE_BUFFER_SIZE);
671
   else {
672
      for (i=0;i<DECODE_BUFFER_SIZE;i++) {
673
         buf48k[i] = .5*(decode_mem[0][i] + decode_mem[1][i]);
674
      }
675
   }
676
   /* Down-sample the last 40 ms. */
677
   for (i=1;i<DECODE_BUFFER_SIZE;i++) buf48k[i] += PREEMPHASIS*buf48k[i-1];
678
   *plc_preemphasis_mem = buf48k[DECODE_BUFFER_SIZE-1];
679
   offset = DECODE_BUFFER_SIZE-SINC_ORDER-1 - 3*(PLC_UPDATE_SAMPLES-1);
680
   celt_assert(3*(PLC_UPDATE_SAMPLES-1) + SINC_ORDER + offset == DECODE_BUFFER_SIZE-1);
681
   for (i=0;i<PLC_UPDATE_SAMPLES;i++) {
682
      int j;
683
      float sum = 0;
684
      for (j=0;j<SINC_ORDER+1;j++) {
685
         sum += buf48k[3*i + j + offset]*sinc_filter[j];
686
      }
687
      buf16k[i] = float2int(MIN32(32767.f, MAX32(-32767.f, sum)));
688
   }
689
   tmp_read_post = lpcnet->fec_read_pos;
690
   tmp_fec_skip = lpcnet->fec_skip;
691
   for (i=0;i<PLC_UPDATE_FRAMES;i++) {
692
      lpcnet_plc_update(lpcnet, &buf16k[FRAME_SIZE*i]);
693
   }
694
   lpcnet->fec_read_pos = tmp_read_post;
695
   lpcnet->fec_skip = tmp_fec_skip;
696
   RESTORE_STACK;
697
}
698
#endif
699
700
static void celt_decode_lost(CELTDecoder * OPUS_RESTRICT st, int N, int LM
701
#ifdef ENABLE_DEEP_PLC
702
      ,LPCNetPLCState *lpcnet
703
#endif
704
      )
705
110k
{
706
110k
   int c;
707
110k
   int i;
708
110k
   const int C = st->channels;
709
110k
   celt_sig *decode_mem[2];
710
110k
   celt_sig *out_syn[2];
711
110k
   opus_val16 *lpc;
712
110k
   celt_glog *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE;
713
110k
   const OpusCustomMode *mode;
714
110k
   int nbEBands;
715
110k
   int overlap;
716
110k
   int start;
717
110k
   int loss_duration;
718
110k
   int curr_frame_type;
719
110k
   const opus_int16 *eBands;
720
110k
   int decode_buffer_size;
721
110k
   int max_period;
722
#ifdef ENABLE_QEXT
723
   int qext_scale;
724
#endif
725
110k
   SAVE_STACK;
726
#ifdef ENABLE_QEXT
727
   qext_scale = st->qext_scale;
728
#endif
729
110k
   decode_buffer_size = QEXT_SCALE(DECODE_BUFFER_SIZE);
730
110k
   max_period = QEXT_SCALE(MAX_PERIOD);
731
110k
   mode = st->mode;
732
110k
   nbEBands = mode->nbEBands;
733
110k
   overlap = mode->overlap;
734
110k
   eBands = mode->eBands;
735
736
207k
   c=0; do {
737
207k
      decode_mem[c] = st->_decode_mem + c*(decode_buffer_size+overlap);
738
207k
      out_syn[c] = decode_mem[c]+decode_buffer_size-N;
739
207k
   } while (++c<C);
740
110k
   oldBandE = (celt_glog*)(st->_decode_mem+(decode_buffer_size+overlap)*C);
741
110k
   oldLogE = oldBandE + 2*nbEBands;
742
110k
   oldLogE2 = oldLogE + 2*nbEBands;
743
110k
   backgroundLogE = oldLogE2 + 2*nbEBands;
744
110k
   lpc = (opus_val16*)(backgroundLogE + 2*nbEBands);
745
746
110k
   loss_duration = st->loss_duration;
747
110k
   start = st->start;
748
110k
   curr_frame_type = FRAME_PLC_PERIODIC;
749
110k
   if (st->plc_duration >= 40 || start != 0 || st->skip_plc)
750
73.0k
      curr_frame_type = FRAME_PLC_NOISE;
751
#ifdef ENABLE_DEEP_PLC
752
   if (start == 0 && lpcnet != NULL && st->mode->Fs != 96000 && lpcnet->loaded)
753
   {
754
      if (st->complexity >= 5 && st->plc_duration < 80 && !st->skip_plc)
755
         curr_frame_type = FRAME_PLC_NEURAL;
756
#ifdef ENABLE_DRED
757
      if (lpcnet->fec_fill_pos > lpcnet->fec_read_pos)
758
         curr_frame_type = FRAME_DRED;
759
#endif
760
   }
761
#endif
762
763
110k
   if (curr_frame_type == FRAME_PLC_NOISE)
764
73.0k
   {
765
      /* Noise-based PLC/CNG */
766
73.0k
      VARDECL(celt_norm, X);
767
73.0k
      opus_uint32 seed;
768
73.0k
      int end;
769
73.0k
      int effEnd;
770
73.0k
      celt_glog decay;
771
73.0k
      end = st->end;
772
73.0k
      effEnd = IMAX(start, IMIN(end, mode->effEBands));
773
774
73.0k
      ALLOC(X, C*N, celt_norm);   /**< Interleaved normalised MDCTs */
775
139k
      c=0; do {
776
139k
         OPUS_MOVE(decode_mem[c], decode_mem[c]+N,
777
139k
               decode_buffer_size-N+overlap);
778
139k
      } while (++c<C);
779
780
73.0k
      if (st->prefilter_and_fold) {
781
699
         prefilter_and_fold(st, N);
782
699
      }
783
784
      /* Energy decay */
785
73.0k
      decay = loss_duration==0 ? GCONST(1.5f) : GCONST(.5f);
786
73.0k
      c=0; do
787
139k
      {
788
2.06M
         for (i=start;i<end;i++)
789
1.92M
            oldBandE[c*nbEBands+i] = MAXG(backgroundLogE[c*nbEBands+i], oldBandE[c*nbEBands+i] - decay);
790
139k
      } while (++c<C);
791
73.0k
      seed = st->rng;
792
212k
      for (c=0;c<C;c++)
793
139k
      {
794
2.06M
         for (i=start;i<effEnd;i++)
795
1.92M
         {
796
1.92M
            int j;
797
1.92M
            int boffs;
798
1.92M
            int blen;
799
1.92M
            boffs = N*c+(eBands[i]<<LM);
800
1.92M
            blen = (eBands[i+1]-eBands[i])<<LM;
801
42.6M
            for (j=0;j<blen;j++)
802
40.7M
            {
803
40.7M
               seed = celt_lcg_rand(seed);
804
40.7M
               X[boffs+j] = SHL32((celt_norm)((opus_int32)seed>>20), NORM_SHIFT-14);
805
40.7M
            }
806
1.92M
            renormalise_vector(X+boffs, blen, Q31ONE, st->arch);
807
1.92M
         }
808
139k
      }
809
73.0k
      st->rng = seed;
810
811
73.0k
      celt_synthesis(mode, X, out_syn, oldBandE, start, effEnd, C, C, 0, LM, st->downsample, 0, st->arch ARG_QEXT(NULL) ARG_QEXT(NULL) ARG_QEXT(0));
812
813
      /* Run the postfilter with the last parameters. */
814
139k
      c=0; do {
815
139k
         st->postfilter_period=IMAX(st->postfilter_period, COMBFILTER_MINPERIOD);
816
139k
         st->postfilter_period_old=IMAX(st->postfilter_period_old, COMBFILTER_MINPERIOD);
817
139k
         comb_filter(out_syn[c], out_syn[c], st->postfilter_period_old, st->postfilter_period, mode->shortMdctSize,
818
139k
               st->postfilter_gain_old, st->postfilter_gain, st->postfilter_tapset_old, st->postfilter_tapset,
819
139k
               mode->window, overlap, st->arch);
820
139k
         if (LM!=0)
821
132k
            comb_filter(out_syn[c]+mode->shortMdctSize, out_syn[c]+mode->shortMdctSize, st->postfilter_period, st->postfilter_period, N-mode->shortMdctSize,
822
132k
                  st->postfilter_gain, st->postfilter_gain, st->postfilter_tapset, st->postfilter_tapset,
823
132k
                  mode->window, overlap, st->arch);
824
825
139k
      } while (++c<C);
826
73.0k
      st->postfilter_period_old = st->postfilter_period;
827
73.0k
      st->postfilter_gain_old = st->postfilter_gain;
828
73.0k
      st->postfilter_tapset_old = st->postfilter_tapset;
829
830
73.0k
      st->prefilter_and_fold = 0;
831
      /* Skip regular PLC until we get two consecutive packets. */
832
73.0k
      st->skip_plc = 1;
833
73.0k
   } else {
834
37.3k
      int exc_length;
835
      /* Pitch-based PLC */
836
37.3k
      const celt_coef *window;
837
37.3k
      opus_val16 *exc;
838
37.3k
      opus_val16 fade = Q15ONE;
839
37.3k
      int pitch_index;
840
37.3k
      int curr_neural;
841
37.3k
      int last_neural;
842
37.3k
      VARDECL(opus_val16, _exc);
843
37.3k
      VARDECL(opus_val16, fir_tmp);
844
845
37.3k
      curr_neural = curr_frame_type == FRAME_PLC_NEURAL || curr_frame_type == FRAME_DRED;
846
37.3k
      last_neural = st->last_frame_type == FRAME_PLC_NEURAL || st->last_frame_type == FRAME_DRED;
847
37.3k
      if (st->last_frame_type != FRAME_PLC_PERIODIC && !(last_neural && curr_neural))
848
18.9k
      {
849
18.9k
         st->last_pitch_index = pitch_index = celt_plc_pitch_search(st, decode_mem, C, st->arch);
850
18.9k
      } else {
851
18.3k
         pitch_index = st->last_pitch_index;
852
18.3k
         fade = QCONST16(.8f,15);
853
18.3k
      }
854
#ifdef ENABLE_DEEP_PLC
855
      if (curr_neural && !last_neural) update_plc_state(lpcnet, decode_mem, &st->plc_preemphasis_mem, C);
856
#endif
857
858
      /* We want the excitation for 2 pitch periods in order to look for a
859
         decaying signal, but we can't get more than MAX_PERIOD. */
860
37.3k
      exc_length = IMIN(2*pitch_index, max_period);
861
862
37.3k
      ALLOC(_exc, max_period+CELT_LPC_ORDER, opus_val16);
863
37.3k
      ALLOC(fir_tmp, exc_length, opus_val16);
864
37.3k
      exc = _exc+CELT_LPC_ORDER;
865
37.3k
      window = mode->window;
866
68.9k
      c=0; do {
867
68.9k
         opus_val16 decay;
868
68.9k
         opus_val16 attenuation;
869
68.9k
         opus_val32 S1=0;
870
68.9k
         celt_sig *buf;
871
68.9k
         int extrapolation_offset;
872
68.9k
         int extrapolation_len;
873
68.9k
         int j;
874
875
68.9k
         buf = decode_mem[c];
876
72.3M
         for (i=0;i<max_period+CELT_LPC_ORDER;i++)
877
72.2M
            exc[i-CELT_LPC_ORDER] = SROUND16(buf[decode_buffer_size-max_period-CELT_LPC_ORDER+i], SIG_SHIFT);
878
879
68.9k
         if (st->last_frame_type != FRAME_PLC_PERIODIC && !(last_neural && curr_neural))
880
34.5k
         {
881
34.5k
            opus_val32 ac[CELT_LPC_ORDER+1];
882
            /* Compute LPC coefficients for the last MAX_PERIOD samples before
883
               the first loss so we can work in the excitation-filter domain. */
884
34.5k
            _celt_autocorr(exc, ac, window, overlap,
885
34.5k
                   CELT_LPC_ORDER, max_period, st->arch);
886
            /* Add a noise floor of -40 dB. */
887
#ifdef FIXED_POINT
888
            ac[0] += SHR32(ac[0],13);
889
#else
890
34.5k
            ac[0] *= 1.0001f;
891
34.5k
#endif
892
            /* Use lag windowing to stabilize the Levinson-Durbin recursion. */
893
863k
            for (i=1;i<=CELT_LPC_ORDER;i++)
894
828k
            {
895
               /*ac[i] *= exp(-.5*(2*M_PI*.002*i)*(2*M_PI*.002*i));*/
896
#ifdef FIXED_POINT
897
               ac[i] -= MULT16_32_Q15(2*i*i, ac[i]);
898
#else
899
828k
               ac[i] -= ac[i]*(0.008f*0.008f)*i*i;
900
828k
#endif
901
828k
            }
902
34.5k
            _celt_lpc(lpc+c*CELT_LPC_ORDER, ac, CELT_LPC_ORDER);
903
#ifdef FIXED_POINT
904
         /* For fixed-point, apply bandwidth expansion until we can guarantee that
905
            no overflow can happen in the IIR filter. This means:
906
            32768*sum(abs(filter)) < 2^31 */
907
         while (1) {
908
            opus_val16 tmp=Q15ONE;
909
            opus_val32 sum=QCONST16(1., SIG_SHIFT);
910
            for (i=0;i<CELT_LPC_ORDER;i++)
911
               sum += ABS16(lpc[c*CELT_LPC_ORDER+i]);
912
            if (sum < 65535) break;
913
            for (i=0;i<CELT_LPC_ORDER;i++)
914
            {
915
               tmp = MULT16_16_Q15(QCONST16(.99f,15), tmp);
916
               lpc[c*CELT_LPC_ORDER+i] = MULT16_16_Q15(lpc[c*CELT_LPC_ORDER+i], tmp);
917
            }
918
         }
919
#endif
920
34.5k
         }
921
         /* Initialize the LPC history with the samples just before the start
922
            of the region for which we're computing the excitation. */
923
68.9k
         {
924
            /* Compute the excitation for exc_length samples before the loss. We need the copy
925
               because celt_fir() cannot filter in-place. */
926
68.9k
            celt_fir(exc+max_period-exc_length, lpc+c*CELT_LPC_ORDER,
927
68.9k
                  fir_tmp, exc_length, CELT_LPC_ORDER, st->arch);
928
68.9k
            OPUS_COPY(exc+max_period-exc_length, fir_tmp, exc_length);
929
68.9k
         }
930
931
         /* Check if the waveform is decaying, and if so how fast.
932
            We do this to avoid adding energy when concealing in a segment
933
            with decaying energy. */
934
68.9k
         {
935
68.9k
            opus_val32 E1=1, E2=1;
936
68.9k
            int decay_length;
937
#ifdef FIXED_POINT
938
            int shift = IMAX(0,2*celt_zlog2(celt_maxabs16(&exc[max_period-exc_length], exc_length))-20);
939
#ifdef ENABLE_QEXT
940
            if (st->qext_scale==2) shift++;
941
#endif
942
#endif
943
68.9k
            decay_length = exc_length>>1;
944
18.0M
            for (i=0;i<decay_length;i++)
945
17.9M
            {
946
17.9M
               opus_val16 e;
947
17.9M
               e = exc[max_period-decay_length+i];
948
17.9M
               E1 += SHR32(MULT16_16(e, e), shift);
949
17.9M
               e = exc[max_period-2*decay_length+i];
950
17.9M
               E2 += SHR32(MULT16_16(e, e), shift);
951
17.9M
            }
952
68.9k
            E1 = MIN32(E1, E2);
953
68.9k
            decay = celt_sqrt(frac_div32(SHR32(E1, 1), E2));
954
68.9k
         }
955
956
         /* Move the decoder memory one frame to the left to give us room to
957
            add the data for the new frame. We ignore the overlap that extends
958
            past the end of the buffer, because we aren't going to use it. */
959
68.9k
         OPUS_MOVE(buf, buf+N, decode_buffer_size-N);
960
961
         /* Extrapolate from the end of the excitation with a period of
962
            "pitch_index", scaling down each period by an additional factor of
963
            "decay". */
964
68.9k
         extrapolation_offset = max_period-pitch_index;
965
         /* We need to extrapolate enough samples to cover a complete MDCT
966
            window (including overlap/2 samples on both sides). */
967
68.9k
         extrapolation_len = N+overlap;
968
         /* We also apply fading if this is not the first loss. */
969
68.9k
         attenuation = MULT16_16_Q15(fade, decay);
970
34.9M
         for (i=j=0;i<extrapolation_len;i++,j++)
971
34.9M
         {
972
34.9M
            opus_val16 tmp;
973
34.9M
            if (j >= pitch_index) {
974
140k
               j -= pitch_index;
975
140k
               attenuation = MULT16_16_Q15(attenuation, decay);
976
140k
            }
977
34.9M
            buf[decode_buffer_size-N+i] =
978
34.9M
                  SHL32(EXTEND32(MULT16_16_Q15(attenuation,
979
34.9M
                        exc[extrapolation_offset+j])), SIG_SHIFT);
980
            /* Compute the energy of the previously decoded signal whose
981
               excitation we're copying. */
982
34.9M
            tmp = SROUND16(
983
34.9M
                  buf[decode_buffer_size-max_period-N+extrapolation_offset+j],
984
34.9M
                  SIG_SHIFT);
985
34.9M
            S1 += SHR32(MULT16_16(tmp, tmp), 11);
986
34.9M
         }
987
68.9k
         {
988
68.9k
            opus_val16 lpc_mem[CELT_LPC_ORDER];
989
            /* Copy the last decoded samples (prior to the overlap region) to
990
               synthesis filter memory so we can have a continuous signal. */
991
1.72M
            for (i=0;i<CELT_LPC_ORDER;i++)
992
1.65M
               lpc_mem[i] = SROUND16(buf[decode_buffer_size-N-1-i], SIG_SHIFT);
993
            /* Apply the synthesis filter to convert the excitation back into
994
               the signal domain. */
995
68.9k
            celt_iir(buf+decode_buffer_size-N, lpc+c*CELT_LPC_ORDER,
996
68.9k
                  buf+decode_buffer_size-N, extrapolation_len, CELT_LPC_ORDER,
997
68.9k
                  lpc_mem, st->arch);
998
#ifdef FIXED_POINT
999
            for (i=0; i < extrapolation_len; i++)
1000
               buf[decode_buffer_size-N+i] = SATURATE(buf[decode_buffer_size-N+i], SIG_SAT);
1001
#endif
1002
68.9k
         }
1003
1004
         /* Check if the synthesis energy is higher than expected, which can
1005
            happen with the signal changes during our window. If so,
1006
            attenuate. */
1007
68.9k
         {
1008
68.9k
            opus_val32 S2=0;
1009
34.9M
            for (i=0;i<extrapolation_len;i++)
1010
34.9M
            {
1011
34.9M
               opus_val16 tmp = SROUND16(buf[decode_buffer_size-N+i], SIG_SHIFT);
1012
34.9M
               S2 += SHR32(MULT16_16(tmp, tmp), 11);
1013
34.9M
            }
1014
            /* This checks for an "explosion" in the synthesis. */
1015
#ifdef FIXED_POINT
1016
            if (!(S1 > SHR32(S2,2)))
1017
#else
1018
            /* The float test is written this way to catch NaNs in the output
1019
               of the IIR filter at the same time. */
1020
68.9k
            if (!(S1 > 0.2f*S2))
1021
7.43k
#endif
1022
7.43k
            {
1023
2.44M
               for (i=0;i<extrapolation_len;i++)
1024
2.43M
                  buf[decode_buffer_size-N+i] = 0;
1025
61.4k
            } else if (S1 < S2)
1026
11.5k
            {
1027
11.5k
               opus_val16 ratio = celt_sqrt(frac_div32(SHR32(S1,1)+1,S2+1));
1028
1.40M
               for (i=0;i<overlap;i++)
1029
1.39M
               {
1030
1.39M
                  opus_val16 tmp_g = Q15ONE
1031
1.39M
                        - MULT16_16_Q15(COEF2VAL16(window[i]), Q15ONE-ratio);
1032
1.39M
                  buf[decode_buffer_size-N+i] =
1033
1.39M
                        MULT16_32_Q15(tmp_g, buf[decode_buffer_size-N+i]);
1034
1.39M
               }
1035
5.25M
               for (i=overlap;i<extrapolation_len;i++)
1036
5.23M
               {
1037
5.23M
                  buf[decode_buffer_size-N+i] =
1038
5.23M
                        MULT16_32_Q15(ratio, buf[decode_buffer_size-N+i]);
1039
5.23M
               }
1040
11.5k
            }
1041
68.9k
         }
1042
1043
68.9k
      } while (++c<C);
1044
1045
#ifdef ENABLE_DEEP_PLC
1046
      if (curr_neural) {
1047
         float overlap_mem;
1048
         int samples_needed16k;
1049
         celt_sig *buf;
1050
         VARDECL(float, buf_copy);
1051
         buf = decode_mem[0];
1052
         ALLOC(buf_copy, C*overlap, float);
1053
         c=0; do {
1054
            OPUS_COPY(buf_copy+c*overlap, &decode_mem[c][decode_buffer_size-N], overlap);
1055
         } while (++c<C);
1056
1057
         /* Need enough samples from the PLC to cover the frame size, resampling delay,
1058
            and the overlap at the end. */
1059
         samples_needed16k = (N+SINC_ORDER+overlap)/3;
1060
         if (!last_neural) {
1061
            st->plc_fill = 0;
1062
         }
1063
         while (st->plc_fill < samples_needed16k) {
1064
            lpcnet_plc_conceal(lpcnet, &st->plc_pcm[st->plc_fill]);
1065
            st->plc_fill += FRAME_SIZE;
1066
         }
1067
         /* Resample to 48 kHz. */
1068
         for (i=0;i<(N+overlap)/3;i++) {
1069
            int j;
1070
            float sum;
1071
            for (sum=0, j=0;j<17;j++) sum += 3*st->plc_pcm[i+j]*sinc_filter[3*j];
1072
            buf[decode_buffer_size-N+3*i] = sum;
1073
            for (sum=0, j=0;j<16;j++) sum += 3*st->plc_pcm[i+j+1]*sinc_filter[3*j+2];
1074
            buf[decode_buffer_size-N+3*i+1] = sum;
1075
            for (sum=0, j=0;j<16;j++) sum += 3*st->plc_pcm[i+j+1]*sinc_filter[3*j+1];
1076
            buf[decode_buffer_size-N+3*i+2] = sum;
1077
         }
1078
         OPUS_MOVE(st->plc_pcm, &st->plc_pcm[N/3], st->plc_fill-N/3);
1079
         st->plc_fill -= N/3;
1080
         for (i=0;i<N;i++) {
1081
            float tmp = buf[decode_buffer_size-N+i];
1082
            buf[decode_buffer_size-N+i] -= PREEMPHASIS*st->plc_preemphasis_mem;
1083
            st->plc_preemphasis_mem = tmp;
1084
         }
1085
         overlap_mem = st->plc_preemphasis_mem;
1086
         for (i=0;i<overlap;i++) {
1087
            float tmp = buf[decode_buffer_size+i];
1088
            buf[decode_buffer_size+i] -= PREEMPHASIS*overlap_mem;
1089
            overlap_mem = tmp;
1090
         }
1091
         /* For now, we just do mono PLC. */
1092
         if (C==2) OPUS_COPY(decode_mem[1], decode_mem[0], decode_buffer_size+overlap);
1093
         c=0; do {
1094
            /* Cross-fade with 48-kHz non-neural PLC for the first 2.5 ms to avoid a discontinuity. */
1095
            if (!last_neural) {
1096
               for (i=0;i<overlap;i++) decode_mem[c][decode_buffer_size-N+i] = (1-window[i])*buf_copy[c*overlap+i] + (window[i])*decode_mem[c][decode_buffer_size-N+i];
1097
            }
1098
         } while (++c<C);
1099
      }
1100
#endif
1101
37.3k
      st->prefilter_and_fold = 1;
1102
37.3k
   }
1103
1104
   /* Saturate to something large to avoid wrap-around. */
1105
110k
   st->loss_duration = IMIN(10000, loss_duration+(1<<LM));
1106
110k
   st->plc_duration = IMIN(10000, st->plc_duration+(1<<LM));
1107
#ifdef ENABLE_DRED
1108
   if (curr_frame_type == FRAME_DRED) {
1109
      st->plc_duration = 0;
1110
      st->skip_plc = 0;
1111
   }
1112
#endif
1113
110k
   st->last_frame_type = curr_frame_type;
1114
110k
   RESTORE_STACK;
1115
110k
}
1116
1117
#ifdef ENABLE_QEXT
1118
static void decode_qext_stereo_params(ec_dec *ec, int qext_end, int *qext_intensity, int *qext_dual_stereo) {
1119
   *qext_intensity = ec_dec_uint(ec, qext_end+1);
1120
   if (*qext_intensity != 0) *qext_dual_stereo = ec_dec_bit_logp(ec, 1);
1121
   else *qext_dual_stereo = 0;
1122
}
1123
#endif
1124
1125
int celt_decode_with_ec_dred(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data,
1126
      int len, opus_res * OPUS_RESTRICT pcm, int frame_size, ec_dec *dec, int accum
1127
#ifdef ENABLE_DEEP_PLC
1128
      ,LPCNetPLCState *lpcnet
1129
#endif
1130
      ARG_QEXT(const unsigned char *qext_payload) ARG_QEXT(int qext_payload_len)
1131
      )
1132
191k
{
1133
191k
   int c, i, N;
1134
191k
   int spread_decision;
1135
191k
   opus_int32 bits;
1136
191k
   ec_dec _dec;
1137
191k
   VARDECL(celt_norm, X);
1138
191k
   VARDECL(int, fine_quant);
1139
191k
   VARDECL(int, pulses);
1140
191k
   VARDECL(int, cap);
1141
191k
   VARDECL(int, offsets);
1142
191k
   VARDECL(int, fine_priority);
1143
191k
   VARDECL(int, tf_res);
1144
191k
   VARDECL(unsigned char, collapse_masks);
1145
191k
   celt_sig *decode_mem[2];
1146
191k
   celt_sig *out_syn[2];
1147
191k
   celt_glog *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE;
1148
1149
191k
   int shortBlocks;
1150
191k
   int isTransient;
1151
191k
   int intra_ener;
1152
191k
   const int CC = st->channels;
1153
191k
   int LM, M;
1154
191k
   int start;
1155
191k
   int end;
1156
191k
   int effEnd;
1157
191k
   int codedBands;
1158
191k
   int alloc_trim;
1159
191k
   int postfilter_pitch;
1160
191k
   opus_val16 postfilter_gain;
1161
191k
   int intensity=0;
1162
191k
   int dual_stereo=0;
1163
191k
   opus_int32 total_bits;
1164
191k
   opus_int32 balance;
1165
191k
   opus_int32 tell;
1166
191k
   int dynalloc_logp;
1167
191k
   int postfilter_tapset;
1168
191k
   int anti_collapse_rsv;
1169
191k
   int anti_collapse_on=0;
1170
191k
   int silence;
1171
191k
   int C = st->stream_channels;
1172
191k
   const OpusCustomMode *mode;
1173
191k
   int nbEBands;
1174
191k
   int overlap;
1175
191k
   const opus_int16 *eBands;
1176
191k
   celt_glog max_background_increase;
1177
191k
   int decode_buffer_size;
1178
#ifdef ENABLE_QEXT
1179
   opus_int32 qext_bits;
1180
   ec_dec ext_dec;
1181
   int qext_bytes=0;
1182
   int qext_end=0;
1183
   int qext_intensity=0;
1184
   int qext_dual_stereo=0;
1185
   VARDECL(int, extra_quant);
1186
   VARDECL(int, extra_pulses);
1187
   const CELTMode *qext_mode = NULL;
1188
   CELTMode qext_mode_struct;
1189
   int qext_scale;
1190
#else
1191
191k
# define qext_bytes 0
1192
191k
#endif
1193
191k
   ALLOC_STACK;
1194
#ifdef ENABLE_QEXT
1195
   qext_scale = st->qext_scale;
1196
#endif
1197
191k
   decode_buffer_size = QEXT_SCALE(DECODE_BUFFER_SIZE);
1198
1199
191k
   VALIDATE_CELT_DECODER(st);
1200
191k
   mode = st->mode;
1201
191k
   nbEBands = mode->nbEBands;
1202
191k
   overlap = mode->overlap;
1203
191k
   eBands = mode->eBands;
1204
191k
   start = st->start;
1205
191k
   end = st->end;
1206
191k
   frame_size *= st->downsample;
1207
1208
191k
   oldBandE = (celt_glog*)(st->_decode_mem+(decode_buffer_size+overlap)*CC);
1209
191k
   oldLogE = oldBandE + 2*nbEBands;
1210
191k
   oldLogE2 = oldLogE + 2*nbEBands;
1211
191k
   backgroundLogE = oldLogE2 + 2*nbEBands;
1212
1213
#ifdef ENABLE_QEXT
1214
   if (qext_payload) {
1215
      ec_dec_init(&ext_dec, (unsigned char*)qext_payload, qext_payload_len);
1216
      qext_bytes = qext_payload_len;
1217
   } else {
1218
      ec_dec_init(&ext_dec, NULL, 0);
1219
   }
1220
#endif
1221
#if defined(CUSTOM_MODES) || defined(ENABLE_OPUS_CUSTOM_API)
1222
   if (st->signalling && data!=NULL)
1223
   {
1224
      int data0=data[0];
1225
      /* Convert "standard mode" to Opus header */
1226
# ifndef ENABLE_QEXT
1227
      if (mode->Fs==48000 && mode->shortMdctSize==120)
1228
# endif
1229
      {
1230
         data0 = fromOpus(data0);
1231
         if (data0<0)
1232
            return OPUS_INVALID_PACKET;
1233
      }
1234
      st->end = end = IMAX(1, mode->effEBands-2*(data0>>5));
1235
      LM = (data0>>3)&0x3;
1236
      C = 1 + ((data0>>2)&0x1);
1237
      if ((data[0] & 0x03) == 0x03) {
1238
         data++;
1239
         len--;
1240
         if (len<=0)
1241
            return OPUS_INVALID_PACKET;
1242
         if (data[0] & 0x40) {
1243
            int p;
1244
            int padding=0;
1245
            data++;
1246
            len--;
1247
            do {
1248
               int tmp;
1249
               if (len<=0)
1250
                  return OPUS_INVALID_PACKET;
1251
               p = *data++;
1252
               len--;
1253
               tmp = p==255 ? 254: p;
1254
               len -= tmp;
1255
               padding += tmp;
1256
            } while (p==255);
1257
            padding--;
1258
            if (len <= 0 || padding<0) return OPUS_INVALID_PACKET;
1259
#ifdef ENABLE_QEXT
1260
            qext_bytes = padding;
1261
            if (data[len] != QEXT_EXTENSION_ID<<1)
1262
               qext_bytes=0;
1263
            ec_dec_init(&ext_dec, (unsigned char*)data+len+1, qext_bytes);
1264
#endif
1265
         }
1266
      } else
1267
      {
1268
         data++;
1269
         len--;
1270
      }
1271
      if (LM>mode->maxLM)
1272
         return OPUS_INVALID_PACKET;
1273
      if (frame_size < mode->shortMdctSize<<LM)
1274
         return OPUS_BUFFER_TOO_SMALL;
1275
      else
1276
         frame_size = mode->shortMdctSize<<LM;
1277
   } else {
1278
#else
1279
191k
   {
1280
191k
#endif
1281
523k
      for (LM=0;LM<=mode->maxLM;LM++)
1282
523k
         if (mode->shortMdctSize<<LM==frame_size)
1283
191k
            break;
1284
191k
      if (LM>mode->maxLM)
1285
0
         return OPUS_BAD_ARG;
1286
191k
   }
1287
191k
   M=1<<LM;
1288
1289
191k
   if (len<0 || len>1275 || pcm==NULL)
1290
0
      return OPUS_BAD_ARG;
1291
1292
191k
   N = M*mode->shortMdctSize;
1293
361k
   c=0; do {
1294
361k
      decode_mem[c] = st->_decode_mem + c*(decode_buffer_size+overlap);
1295
361k
      out_syn[c] = decode_mem[c]+decode_buffer_size-N;
1296
361k
   } while (++c<CC);
1297
1298
191k
   effEnd = end;
1299
191k
   if (effEnd > mode->effEBands)
1300
0
      effEnd = mode->effEBands;
1301
1302
191k
   if (data == NULL || len<=1)
1303
110k
   {
1304
110k
      celt_decode_lost(st, N, LM
1305
#ifdef ENABLE_DEEP_PLC
1306
      , lpcnet
1307
#endif
1308
110k
                      );
1309
110k
      deemphasis(out_syn, pcm, N, CC, st->downsample, mode->preemph, st->preemph_memD, accum, st->arch);
1310
110k
      RESTORE_STACK;
1311
110k
      return frame_size/st->downsample;
1312
110k
   }
1313
#ifdef ENABLE_DEEP_PLC
1314
   else {
1315
      /* FIXME: This is a bit of a hack just to make sure opus_decode_native() knows we're no longer in PLC. */
1316
      if (lpcnet) lpcnet->blend = 0;
1317
   }
1318
#endif
1319
1320
   /* Check if there are at least two packets received consecutively before
1321
    * turning on the pitch-based PLC */
1322
81.0k
   if (st->loss_duration == 0) st->skip_plc = 0;
1323
1324
81.0k
   if (dec == NULL)
1325
12.7k
   {
1326
12.7k
      ec_dec_init(&_dec,(unsigned char*)data,len);
1327
12.7k
      dec = &_dec;
1328
12.7k
   }
1329
1330
81.0k
   if (C==1)
1331
51.9k
   {
1332
1.14M
      for (i=0;i<nbEBands;i++)
1333
1.09M
         oldBandE[i]=MAXG(oldBandE[i],oldBandE[nbEBands+i]);
1334
51.9k
   }
1335
1336
81.0k
   total_bits = len*8;
1337
81.0k
   tell = ec_tell(dec);
1338
1339
81.0k
   if (tell >= total_bits)
1340
19.2k
      silence = 1;
1341
61.7k
   else if (tell==1)
1342
56.8k
      silence = ec_dec_bit_logp(dec, 15);
1343
4.89k
   else
1344
4.89k
      silence = 0;
1345
81.0k
   if (silence)
1346
22.2k
   {
1347
      /* Pretend we've read all the remaining bits */
1348
22.2k
      tell = len*8;
1349
22.2k
      dec->nbits_total+=tell-ec_tell(dec);
1350
22.2k
   }
1351
1352
81.0k
   postfilter_gain = 0;
1353
81.0k
   postfilter_pitch = 0;
1354
81.0k
   postfilter_tapset = 0;
1355
81.0k
   if (start==0 && tell+16 <= total_bits)
1356
46.7k
   {
1357
46.7k
      if(ec_dec_bit_logp(dec, 1))
1358
12.4k
      {
1359
12.4k
         int qg, octave;
1360
12.4k
         octave = ec_dec_uint(dec, 6);
1361
12.4k
         postfilter_pitch = (16<<octave)+ec_dec_bits(dec, 4+octave)-1;
1362
12.4k
         qg = ec_dec_bits(dec, 3);
1363
12.4k
         if (ec_tell(dec)+2<=total_bits)
1364
12.4k
            postfilter_tapset = ec_dec_icdf(dec, tapset_icdf, 2);
1365
12.4k
         postfilter_gain = QCONST16(.09375f,15)*(qg+1);
1366
12.4k
      }
1367
46.7k
      tell = ec_tell(dec);
1368
46.7k
   }
1369
1370
81.0k
   if (LM > 0 && tell+3 <= total_bits)
1371
45.9k
   {
1372
45.9k
      isTransient = ec_dec_bit_logp(dec, 3);
1373
45.9k
      tell = ec_tell(dec);
1374
45.9k
   }
1375
35.0k
   else
1376
35.0k
      isTransient = 0;
1377
1378
81.0k
   if (isTransient)
1379
5.98k
      shortBlocks = M;
1380
75.0k
   else
1381
75.0k
      shortBlocks = 0;
1382
1383
   /* Decode the global flags (first symbols in the stream) */
1384
81.0k
   intra_ener = tell+3<=total_bits ? ec_dec_bit_logp(dec, 3) : 0;
1385
   /* If recovering from packet loss, make sure we make the energy prediction safe to reduce the
1386
      risk of getting loud artifacts. */
1387
81.0k
   if (!intra_ener && st->loss_duration != 0) {
1388
21.6k
      c=0; do
1389
43.2k
      {
1390
43.2k
         celt_glog safety = 0;
1391
43.2k
         int missing = IMIN(10, st->loss_duration>>LM);
1392
43.2k
         if (LM==0) safety = GCONST(1.5f);
1393
38.8k
         else if (LM==1) safety = GCONST(.5f);
1394
527k
         for (i=start;i<end;i++)
1395
483k
         {
1396
483k
            if (oldBandE[c*nbEBands+i] < MAXG(oldLogE[c*nbEBands+i], oldLogE2[c*nbEBands+i])) {
1397
               /* If energy is going down already, continue the trend. */
1398
162k
               opus_val32 slope;
1399
162k
               opus_val32 E0, E1, E2;
1400
162k
               E0 = oldBandE[c*nbEBands+i];
1401
162k
               E1 = oldLogE[c*nbEBands+i];
1402
162k
               E2 = oldLogE2[c*nbEBands+i];
1403
162k
               slope = MAX32(E1 - E0, HALF32(E2 - E0));
1404
162k
               slope = MING(slope, GCONST(2.f));
1405
162k
               E0 -= MAX32(0, (1+missing)*slope);
1406
162k
               oldBandE[c*nbEBands+i] = MAX32(-GCONST(20.f), E0);
1407
321k
            } else {
1408
               /* Otherwise take the min of the last frames. */
1409
321k
               oldBandE[c*nbEBands+i] = MING(MING(oldBandE[c*nbEBands+i], oldLogE[c*nbEBands+i]), oldLogE2[c*nbEBands+i]);
1410
321k
            }
1411
            /* Shorter frames have more natural fluctuations -- play it safe. */
1412
483k
            oldBandE[c*nbEBands+i] -= safety;
1413
483k
         }
1414
43.2k
      } while (++c<2);
1415
21.6k
   }
1416
   /* Get band energies */
1417
81.0k
   unquant_coarse_energy(mode, start, end, oldBandE,
1418
81.0k
         intra_ener, dec, C, LM);
1419
1420
81.0k
   ALLOC(tf_res, nbEBands, int);
1421
81.0k
   tf_decode(start, end, isTransient, tf_res, LM, dec);
1422
1423
81.0k
   tell = ec_tell(dec);
1424
81.0k
   spread_decision = SPREAD_NORMAL;
1425
81.0k
   if (tell+4 <= total_bits)
1426
43.1k
      spread_decision = ec_dec_icdf(dec, spread_icdf, 5);
1427
1428
81.0k
   ALLOC(cap, nbEBands, int);
1429
1430
81.0k
   init_caps(mode,cap,LM,C);
1431
1432
81.0k
   ALLOC(offsets, nbEBands, int);
1433
1434
81.0k
   dynalloc_logp = 6;
1435
81.0k
   total_bits<<=BITRES;
1436
81.0k
   tell = ec_tell_frac(dec);
1437
1.05M
   for (i=start;i<end;i++)
1438
975k
   {
1439
975k
      int width, quanta;
1440
975k
      int dynalloc_loop_logp;
1441
975k
      int boost;
1442
975k
      width = C*(eBands[i+1]-eBands[i])<<LM;
1443
      /* quanta is 6 bits, but no more than 1 bit/sample
1444
         and no less than 1/8 bit/sample */
1445
975k
      quanta = IMIN(width<<BITRES, IMAX(6<<BITRES, width));
1446
975k
      dynalloc_loop_logp = dynalloc_logp;
1447
975k
      boost = 0;
1448
1.00M
      while (tell+(dynalloc_loop_logp<<BITRES) < total_bits && boost < cap[i])
1449
609k
      {
1450
609k
         int flag;
1451
609k
         flag = ec_dec_bit_logp(dec, dynalloc_loop_logp);
1452
609k
         tell = ec_tell_frac(dec);
1453
609k
         if (!flag)
1454
583k
            break;
1455
25.5k
         boost += quanta;
1456
25.5k
         total_bits -= quanta;
1457
25.5k
         dynalloc_loop_logp = 1;
1458
25.5k
      }
1459
975k
      offsets[i] = boost;
1460
      /* Making dynalloc more likely */
1461
975k
      if (boost>0)
1462
10.7k
         dynalloc_logp = IMAX(2, dynalloc_logp-1);
1463
975k
   }
1464
1465
81.0k
   ALLOC(fine_quant, nbEBands, int);
1466
81.0k
   alloc_trim = tell+(6<<BITRES) <= total_bits ?
1467
40.5k
         ec_dec_icdf(dec, trim_icdf, 7) : 5;
1468
1469
81.0k
   bits = (((opus_int32)len*8)<<BITRES) - (opus_int32)ec_tell_frac(dec) - 1;
1470
81.0k
   anti_collapse_rsv = isTransient&&LM>=2&&bits>=((LM+2)<<BITRES) ? (1<<BITRES) : 0;
1471
81.0k
   bits -= anti_collapse_rsv;
1472
1473
81.0k
   ALLOC(pulses, nbEBands, int);
1474
81.0k
   ALLOC(fine_priority, nbEBands, int);
1475
1476
81.0k
   codedBands = clt_compute_allocation(mode, start, end, offsets, cap,
1477
81.0k
         alloc_trim, &intensity, &dual_stereo, bits, &balance, pulses,
1478
81.0k
         fine_quant, fine_priority, C, LM, dec, 0, 0, 0);
1479
1480
81.0k
   unquant_fine_energy(mode, start, end, oldBandE, NULL, fine_quant, dec, C);
1481
1482
81.0k
   ALLOC(X, C*N, celt_norm);   /**< Interleaved normalised MDCTs */
1483
1484
#ifdef ENABLE_QEXT
1485
   if (qext_bytes && end == nbEBands &&
1486
         ((mode->Fs == 48000 && (mode->shortMdctSize==120 || mode->shortMdctSize==90))
1487
       || (mode->Fs == 96000 && (mode->shortMdctSize==240 || mode->shortMdctSize==180)))) {
1488
      int qext_intra_ener;
1489
      compute_qext_mode(&qext_mode_struct, mode);
1490
      qext_mode = &qext_mode_struct;
1491
      qext_end = ec_dec_bit_logp(&ext_dec, 1) ? NB_QEXT_BANDS : 2;
1492
      if (C==2) decode_qext_stereo_params(&ext_dec, qext_end, &qext_intensity, &qext_dual_stereo);
1493
      qext_intra_ener = ec_tell(&ext_dec)+3<=qext_bytes*8 ? ec_dec_bit_logp(&ext_dec, 3) : 0;
1494
      unquant_coarse_energy(qext_mode, 0, qext_end, st->qext_oldBandE,
1495
            qext_intra_ener, &ext_dec, C, LM);
1496
   }
1497
   ALLOC(extra_quant, nbEBands+NB_QEXT_BANDS, int);
1498
   ALLOC(extra_pulses, nbEBands+NB_QEXT_BANDS, int);
1499
   qext_bits = ((opus_int32)qext_bytes*8<<BITRES) - (opus_int32)ec_tell_frac(&ext_dec) - 1;
1500
   clt_compute_extra_allocation(mode, qext_mode, start, end, qext_end, NULL, NULL,
1501
         qext_bits, extra_pulses, extra_quant, C, LM, &ext_dec, 0, 0, 0);
1502
   if (qext_bytes > 0) {
1503
      unquant_fine_energy(mode, start, end, oldBandE, fine_quant, extra_quant, &ext_dec, C);
1504
   }
1505
#endif
1506
1507
153k
   c=0; do {
1508
153k
      OPUS_MOVE(decode_mem[c], decode_mem[c]+N, decode_buffer_size-N+overlap);
1509
153k
   } while (++c<CC);
1510
1511
   /* Decode fixed codebook */
1512
81.0k
   ALLOC(collapse_masks, C*nbEBands, unsigned char);
1513
1514
81.0k
   quant_all_bands(0, mode, start, end, X, C==2 ? X+N : NULL, collapse_masks,
1515
81.0k
         NULL, pulses, shortBlocks, spread_decision, dual_stereo, intensity, tf_res,
1516
81.0k
         len*(8<<BITRES)-anti_collapse_rsv, balance, dec, LM, codedBands, &st->rng, 0,
1517
81.0k
         st->arch, st->disable_inv
1518
81.0k
         ARG_QEXT(&ext_dec) ARG_QEXT(extra_pulses)
1519
81.0k
         ARG_QEXT(qext_bytes*(8<<BITRES)) ARG_QEXT(cap));
1520
1521
#ifdef ENABLE_QEXT
1522
   if (qext_mode) {
1523
      VARDECL(int, zeros);
1524
      VARDECL(unsigned char, qext_collapse_masks);
1525
      ec_dec dummy_dec;
1526
      int ext_balance;
1527
      ALLOC(zeros, nbEBands, int);
1528
      ALLOC(qext_collapse_masks, C*NB_QEXT_BANDS, unsigned char);
1529
      ec_dec_init(&dummy_dec, NULL, 0);
1530
      OPUS_CLEAR(zeros, end);
1531
      ext_balance = qext_bytes*(8<<BITRES) - ec_tell_frac(&ext_dec);
1532
      for (i=0;i<qext_end;i++) ext_balance -= extra_pulses[nbEBands+i] + C*(extra_quant[nbEBands+i]<<BITRES);
1533
      unquant_fine_energy(qext_mode, 0, qext_end, st->qext_oldBandE, NULL, &extra_quant[nbEBands], &ext_dec, C);
1534
      quant_all_bands(0, qext_mode, 0, qext_end, X, C==2 ? X+N : NULL, qext_collapse_masks,
1535
            NULL, &extra_pulses[nbEBands], shortBlocks, spread_decision, qext_dual_stereo, qext_intensity, zeros,
1536
            qext_bytes*(8<<BITRES), ext_balance, &ext_dec, LM, qext_end, &st->rng, 0,
1537
            st->arch, st->disable_inv, &dummy_dec, zeros, 0, NULL);
1538
   }
1539
#endif
1540
1541
81.0k
   if (anti_collapse_rsv > 0)
1542
3.66k
   {
1543
3.66k
      anti_collapse_on = ec_dec_bits(dec, 1);
1544
3.66k
   }
1545
81.0k
   unquant_energy_finalise(mode, start, end, (qext_bytes > 0) ? NULL : oldBandE,
1546
81.0k
         fine_quant, fine_priority, len*8-ec_tell(dec), dec, C);
1547
81.0k
   if (anti_collapse_on)
1548
1.79k
      anti_collapse(mode, X, collapse_masks, LM, C, N,
1549
1.79k
            start, end, oldBandE, oldLogE, oldLogE2, pulses, st->rng, 0, st->arch);
1550
1551
81.0k
   if (silence)
1552
22.2k
   {
1553
723k
      for (i=0;i<C*nbEBands;i++)
1554
701k
         oldBandE[i] = -GCONST(28.f);
1555
22.2k
   }
1556
81.0k
   if (st->prefilter_and_fold) {
1557
15.1k
      prefilter_and_fold(st, N);
1558
15.1k
   }
1559
81.0k
   celt_synthesis(mode, X, out_syn, oldBandE, start, effEnd,
1560
81.0k
                  C, CC, isTransient, LM, st->downsample, silence, st->arch ARG_QEXT(qext_mode) ARG_QEXT(st->qext_oldBandE) ARG_QEXT(qext_end));
1561
1562
153k
   c=0; do {
1563
153k
      st->postfilter_period=IMAX(st->postfilter_period, COMBFILTER_MINPERIOD);
1564
153k
      st->postfilter_period_old=IMAX(st->postfilter_period_old, COMBFILTER_MINPERIOD);
1565
153k
      comb_filter(out_syn[c], out_syn[c], st->postfilter_period_old, st->postfilter_period, mode->shortMdctSize,
1566
153k
            st->postfilter_gain_old, st->postfilter_gain, st->postfilter_tapset_old, st->postfilter_tapset,
1567
153k
            mode->window, overlap, st->arch);
1568
153k
      if (LM!=0)
1569
126k
         comb_filter(out_syn[c]+mode->shortMdctSize, out_syn[c]+mode->shortMdctSize, st->postfilter_period, postfilter_pitch, N-mode->shortMdctSize,
1570
126k
               st->postfilter_gain, postfilter_gain, st->postfilter_tapset, postfilter_tapset,
1571
126k
               mode->window, overlap, st->arch);
1572
1573
153k
   } while (++c<CC);
1574
81.0k
   st->postfilter_period_old = st->postfilter_period;
1575
81.0k
   st->postfilter_gain_old = st->postfilter_gain;
1576
81.0k
   st->postfilter_tapset_old = st->postfilter_tapset;
1577
81.0k
   st->postfilter_period = postfilter_pitch;
1578
81.0k
   st->postfilter_gain = postfilter_gain;
1579
81.0k
   st->postfilter_tapset = postfilter_tapset;
1580
81.0k
   if (LM!=0)
1581
66.2k
   {
1582
66.2k
      st->postfilter_period_old = st->postfilter_period;
1583
66.2k
      st->postfilter_gain_old = st->postfilter_gain;
1584
66.2k
      st->postfilter_tapset_old = st->postfilter_tapset;
1585
66.2k
   }
1586
1587
81.0k
   if (C==1)
1588
51.9k
      OPUS_COPY(&oldBandE[nbEBands], oldBandE, nbEBands);
1589
1590
81.0k
   if (!isTransient)
1591
75.0k
   {
1592
75.0k
      OPUS_COPY(oldLogE2, oldLogE, 2*nbEBands);
1593
75.0k
      OPUS_COPY(oldLogE, oldBandE, 2*nbEBands);
1594
75.0k
   } else {
1595
257k
      for (i=0;i<2*nbEBands;i++)
1596
251k
         oldLogE[i] = MING(oldLogE[i], oldBandE[i]);
1597
5.98k
   }
1598
   /* In normal circumstances, we only allow the noise floor to increase by
1599
      up to 2.4 dB/second, but when we're in DTX we give the weight of
1600
      all missing packets to the update packet. */
1601
81.0k
   max_background_increase = IMIN(160, st->loss_duration+M)*GCONST(0.001f);
1602
3.48M
   for (i=0;i<2*nbEBands;i++)
1603
3.40M
      backgroundLogE[i] = MING(backgroundLogE[i] + max_background_increase, oldBandE[i]);
1604
   /* In case start or end were to change */
1605
81.0k
   c=0; do
1606
162k
   {
1607
983k
      for (i=0;i<start;i++)
1608
821k
      {
1609
821k
         oldBandE[c*nbEBands+i]=0;
1610
821k
         oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-GCONST(28.f);
1611
821k
      }
1612
792k
      for (i=end;i<nbEBands;i++)
1613
630k
      {
1614
630k
         oldBandE[c*nbEBands+i]=0;
1615
630k
         oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-GCONST(28.f);
1616
630k
      }
1617
162k
   } while (++c<2);
1618
81.0k
   st->rng = dec->rng;
1619
#ifdef ENABLE_QEXT
1620
   if (qext_bytes) st->rng = st->rng ^ ext_dec.rng;
1621
#endif
1622
1623
81.0k
   deemphasis(out_syn, pcm, N, CC, st->downsample, mode->preemph, st->preemph_memD, accum, st->arch);
1624
81.0k
   st->loss_duration = 0;
1625
81.0k
   st->plc_duration = 0;
1626
81.0k
   st->last_frame_type = FRAME_NORMAL;
1627
81.0k
   st->prefilter_and_fold = 0;
1628
81.0k
   RESTORE_STACK;
1629
81.0k
   if (ec_tell(dec) > 8*len)
1630
0
      return OPUS_INTERNAL_ERROR;
1631
#ifdef ENABLE_QEXT
1632
   if (qext_bytes != 0 && ec_tell(&ext_dec) > 8*qext_bytes)
1633
      return OPUS_INTERNAL_ERROR;
1634
#endif
1635
81.0k
   if(ec_get_error(dec))
1636
526
      st->error = 1;
1637
81.0k
   return frame_size/st->downsample;
1638
81.0k
}
1639
1640
int celt_decode_with_ec(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data,
1641
      int len, opus_res * OPUS_RESTRICT pcm, int frame_size, ec_dec *dec, int accum)
1642
12.7k
{
1643
12.7k
   return celt_decode_with_ec_dred(st, data, len, pcm, frame_size, dec, accum
1644
#ifdef ENABLE_DEEP_PLC
1645
       , NULL
1646
#endif
1647
12.7k
       ARG_QEXT(NULL) ARG_QEXT(0)
1648
12.7k
       );
1649
12.7k
}
1650
1651
#if defined(CUSTOM_MODES) || defined(ENABLE_OPUS_CUSTOM_API)
1652
1653
#if defined(FIXED_POINT) && !defined(ENABLE_RES24)
1654
int opus_custom_decode(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, opus_int16 * OPUS_RESTRICT pcm, int frame_size)
1655
{
1656
   return celt_decode_with_ec(st, data, len, pcm, frame_size, NULL, 0);
1657
}
1658
#else
1659
int opus_custom_decode(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, opus_int16 * OPUS_RESTRICT pcm, int frame_size)
1660
{
1661
   int j, ret, C, N;
1662
   VARDECL(opus_res, out);
1663
   ALLOC_STACK;
1664
1665
   if (pcm==NULL)
1666
      return OPUS_BAD_ARG;
1667
1668
   C = st->channels;
1669
   N = frame_size;
1670
1671
   ALLOC(out, C*N, opus_res);
1672
   ret = celt_decode_with_ec(st, data, len, out, frame_size, NULL, 0);
1673
   if (ret>0)
1674
      for (j=0;j<C*ret;j++)
1675
         pcm[j]=RES2INT16(out[j]);
1676
1677
   RESTORE_STACK;
1678
   return ret;
1679
}
1680
#endif
1681
1682
#if defined(FIXED_POINT) && defined(ENABLE_RES24)
1683
int opus_custom_decode24(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, opus_int32 * OPUS_RESTRICT pcm, int frame_size)
1684
{
1685
   return celt_decode_with_ec(st, data, len, pcm, frame_size, NULL, 0);
1686
}
1687
#else
1688
int opus_custom_decode24(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, opus_int32 * OPUS_RESTRICT pcm, int frame_size)
1689
{
1690
   int j, ret, C, N;
1691
   VARDECL(opus_res, out);
1692
   ALLOC_STACK;
1693
1694
   if (pcm==NULL)
1695
      return OPUS_BAD_ARG;
1696
1697
   C = st->channels;
1698
   N = frame_size;
1699
1700
   ALLOC(out, C*N, opus_res);
1701
   ret = celt_decode_with_ec(st, data, len, out, frame_size, NULL, 0);
1702
   if (ret>0)
1703
      for (j=0;j<C*ret;j++)
1704
         pcm[j]=RES2INT24(out[j]);
1705
1706
   RESTORE_STACK;
1707
   return ret;
1708
}
1709
#endif
1710
1711
1712
#ifndef DISABLE_FLOAT_API
1713
1714
# if !defined(FIXED_POINT)
1715
int opus_custom_decode_float(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, float * OPUS_RESTRICT pcm, int frame_size)
1716
{
1717
   return celt_decode_with_ec(st, data, len, pcm, frame_size, NULL, 0);
1718
}
1719
# else
1720
int opus_custom_decode_float(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, float * OPUS_RESTRICT pcm, int frame_size)
1721
{
1722
   int j, ret, C, N;
1723
   VARDECL(opus_res, out);
1724
   ALLOC_STACK;
1725
1726
   if (pcm==NULL)
1727
      return OPUS_BAD_ARG;
1728
1729
   C = st->channels;
1730
   N = frame_size;
1731
1732
   ALLOC(out, C*N, opus_res);
1733
   ret=celt_decode_with_ec(st, data, len, out, frame_size, NULL, 0);
1734
   if (ret>0)
1735
      for (j=0;j<C*ret;j++)
1736
         pcm[j]=RES2FLOAT(out[j]);
1737
1738
   RESTORE_STACK;
1739
   return ret;
1740
}
1741
# endif
1742
1743
#endif
1744
1745
#endif /* CUSTOM_MODES */
1746
1747
int opus_custom_decoder_ctl(CELTDecoder * OPUS_RESTRICT st, int request, ...)
1748
2.58M
{
1749
2.58M
   va_list ap;
1750
1751
2.58M
   va_start(ap, request);
1752
2.58M
   switch (request)
1753
2.58M
   {
1754
0
      case OPUS_SET_COMPLEXITY_REQUEST:
1755
0
      {
1756
0
          opus_int32 value = va_arg(ap, opus_int32);
1757
0
          if(value<0 || value>10)
1758
0
          {
1759
0
             goto bad_arg;
1760
0
          }
1761
0
          st->complexity = value;
1762
0
      }
1763
0
      break;
1764
0
      case OPUS_GET_COMPLEXITY_REQUEST:
1765
0
      {
1766
0
          opus_int32 *value = va_arg(ap, opus_int32*);
1767
0
          if (!value)
1768
0
          {
1769
0
             goto bad_arg;
1770
0
          }
1771
0
          *value = st->complexity;
1772
0
      }
1773
0
      break;
1774
302k
      case CELT_SET_START_BAND_REQUEST:
1775
302k
      {
1776
302k
         opus_int32 value = va_arg(ap, opus_int32);
1777
302k
         if (value<0 || value>=st->mode->nbEBands)
1778
0
            goto bad_arg;
1779
302k
         st->start = value;
1780
302k
      }
1781
0
      break;
1782
115k
      case CELT_SET_END_BAND_REQUEST:
1783
115k
      {
1784
115k
         opus_int32 value = va_arg(ap, opus_int32);
1785
115k
         if (value<1 || value>st->mode->nbEBands)
1786
0
            goto bad_arg;
1787
115k
         st->end = value;
1788
115k
      }
1789
0
      break;
1790
289k
      case CELT_SET_CHANNELS_REQUEST:
1791
289k
      {
1792
289k
         opus_int32 value = va_arg(ap, opus_int32);
1793
289k
         if (value<1 || value>2)
1794
0
            goto bad_arg;
1795
289k
         st->stream_channels = value;
1796
289k
      }
1797
0
      break;
1798
0
      case CELT_GET_AND_CLEAR_ERROR_REQUEST:
1799
0
      {
1800
0
         opus_int32 *value = va_arg(ap, opus_int32*);
1801
0
         if (value==NULL)
1802
0
            goto bad_arg;
1803
0
         *value=st->error;
1804
0
         st->error = 0;
1805
0
      }
1806
0
      break;
1807
0
      case OPUS_GET_LOOKAHEAD_REQUEST:
1808
0
      {
1809
0
         opus_int32 *value = va_arg(ap, opus_int32*);
1810
0
         if (value==NULL)
1811
0
            goto bad_arg;
1812
0
         *value = st->overlap/st->downsample;
1813
0
      }
1814
0
      break;
1815
1.30M
      case OPUS_RESET_STATE:
1816
1.30M
      {
1817
1.30M
         int i;
1818
1.30M
         celt_glog *oldBandE, *oldLogE, *oldLogE2;
1819
1.30M
         int decode_buffer_size;
1820
#ifdef ENABLE_QEXT
1821
         int qext_scale = st->qext_scale;
1822
#endif
1823
1.30M
         decode_buffer_size = QEXT_SCALE(DECODE_BUFFER_SIZE);
1824
1.30M
         oldBandE = (celt_glog*)(st->_decode_mem+(decode_buffer_size+st->overlap)*st->channels);
1825
1.30M
         oldLogE = oldBandE + 2*st->mode->nbEBands;
1826
1.30M
         oldLogE2 = oldLogE + 2*st->mode->nbEBands;
1827
1.30M
         OPUS_CLEAR((char*)&st->DECODER_RESET_START,
1828
1.30M
               opus_custom_decoder_get_size(st->mode, st->channels)-
1829
1.30M
               ((char*)&st->DECODER_RESET_START - (char*)st));
1830
56.1M
         for (i=0;i<2*st->mode->nbEBands;i++)
1831
54.8M
            oldLogE[i]=oldLogE2[i]=-GCONST(28.f);
1832
1.30M
         st->skip_plc = 1;
1833
1.30M
         st->last_frame_type = FRAME_NONE;
1834
1.30M
      }
1835
1.30M
      break;
1836
0
      case OPUS_GET_PITCH_REQUEST:
1837
0
      {
1838
0
         opus_int32 *value = va_arg(ap, opus_int32*);
1839
0
         if (value==NULL)
1840
0
            goto bad_arg;
1841
0
         *value = st->postfilter_period;
1842
0
      }
1843
0
      break;
1844
289k
      case CELT_GET_MODE_REQUEST:
1845
289k
      {
1846
289k
         const CELTMode ** value = va_arg(ap, const CELTMode**);
1847
289k
         if (value==0)
1848
0
            goto bad_arg;
1849
289k
         *value=st->mode;
1850
289k
      }
1851
0
      break;
1852
47.4k
      case CELT_SET_SIGNALLING_REQUEST:
1853
47.4k
      {
1854
47.4k
         opus_int32 value = va_arg(ap, opus_int32);
1855
47.4k
         st->signalling = value;
1856
47.4k
      }
1857
47.4k
      break;
1858
190k
      case OPUS_GET_FINAL_RANGE_REQUEST:
1859
190k
      {
1860
190k
         opus_uint32 * value = va_arg(ap, opus_uint32 *);
1861
190k
         if (value==0)
1862
0
            goto bad_arg;
1863
190k
         *value=st->rng;
1864
190k
      }
1865
0
      break;
1866
47.4k
      case OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST:
1867
47.4k
      {
1868
47.4k
          opus_int32 value = va_arg(ap, opus_int32);
1869
47.4k
          if(value<0 || value>1)
1870
0
          {
1871
0
             goto bad_arg;
1872
0
          }
1873
47.4k
          st->disable_inv = value;
1874
47.4k
      }
1875
0
      break;
1876
0
      case OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST:
1877
0
      {
1878
0
          opus_int32 *value = va_arg(ap, opus_int32*);
1879
0
          if (!value)
1880
0
          {
1881
0
             goto bad_arg;
1882
0
          }
1883
0
          *value = st->disable_inv;
1884
0
      }
1885
0
      break;
1886
0
      default:
1887
0
         goto bad_request;
1888
2.58M
   }
1889
2.58M
   va_end(ap);
1890
2.58M
   return OPUS_OK;
1891
0
bad_arg:
1892
0
   va_end(ap);
1893
0
   return OPUS_BAD_ARG;
1894
0
bad_request:
1895
0
      va_end(ap);
1896
0
  return OPUS_UNIMPLEMENTED;
1897
2.58M
}