Coverage Report

Created: 2026-08-31 07:11

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
424k
#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
106k
#define PLC_PITCH_LAG_MIN (100)
66
67
841k
#define FRAME_NONE         0
68
614k
#define FRAME_NORMAL       1
69
407k
#define FRAME_PLC_NOISE    2
70
1.71M
#define FRAME_PLC_PERIODIC 3
71
1.06M
#define FRAME_PLC_NEURAL   4
72
1.06M
#define FRAME_DRED         5
73
74
/**********************************************************************/
75
/*                                                                    */
76
/*                             DECODER                                */
77
/*                                                                    */
78
/**********************************************************************/
79
212k
#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
539k
{
146
#if !defined(CUSTOM_MODES) && !defined(ENABLE_OPUS_CUSTOM_API) && !defined(ENABLE_QEXT)
147
264k
   celt_assert(st->mode == opus_custom_mode_create(48000, 960, NULL));
148
264k
   celt_assert(st->overlap == 120);
149
264k
   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
275k
   celt_assert(st->end <= 25);
156
275k
#endif
157
539k
   celt_assert(st->channels == 1 || st->channels == 2);
158
539k
   celt_assert(st->stream_channels == 1 || st->stream_channels == 2);
159
539k
   celt_assert(st->downsample > 0);
160
539k
   celt_assert(st->start == 0 || st->start == 17);
161
539k
   celt_assert(st->start < st->end);
162
539k
#ifdef OPUS_ARCHMASK
163
539k
   celt_assert(st->arch >= 0);
164
539k
   celt_assert(st->arch <= OPUS_ARCHMASK);
165
539k
#endif
166
#ifndef ENABLE_QEXT
167
264k
   celt_assert(st->last_pitch_index <= PLC_PITCH_LAG_MAX);
168
264k
   celt_assert(st->last_pitch_index >= PLC_PITCH_LAG_MIN || st->last_pitch_index == 0);
169
264k
#endif
170
539k
   celt_assert(st->postfilter_period < MAX_PERIOD);
171
539k
   celt_assert(st->postfilter_period >= COMBFILTER_MINPERIOD || st->postfilter_period == 0);
172
539k
   celt_assert(st->postfilter_period_old < MAX_PERIOD);
173
539k
   celt_assert(st->postfilter_period_old >= COMBFILTER_MINPERIOD || st->postfilter_period_old == 0);
174
539k
   celt_assert(st->postfilter_tapset <= 2);
175
539k
   celt_assert(st->postfilter_tapset >= 0);
176
539k
   celt_assert(st->postfilter_tapset_old <= 2);
177
539k
   celt_assert(st->postfilter_tapset_old >= 0);
178
539k
}
validate_celt_decoder
Line
Count
Source
145
264k
{
146
264k
#if !defined(CUSTOM_MODES) && !defined(ENABLE_OPUS_CUSTOM_API) && !defined(ENABLE_QEXT)
147
264k
   celt_assert(st->mode == opus_custom_mode_create(48000, 960, NULL));
148
264k
   celt_assert(st->overlap == 120);
149
264k
   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
264k
   celt_assert(st->channels == 1 || st->channels == 2);
158
264k
   celt_assert(st->stream_channels == 1 || st->stream_channels == 2);
159
264k
   celt_assert(st->downsample > 0);
160
264k
   celt_assert(st->start == 0 || st->start == 17);
161
264k
   celt_assert(st->start < st->end);
162
264k
#ifdef OPUS_ARCHMASK
163
264k
   celt_assert(st->arch >= 0);
164
264k
   celt_assert(st->arch <= OPUS_ARCHMASK);
165
264k
#endif
166
264k
#ifndef ENABLE_QEXT
167
264k
   celt_assert(st->last_pitch_index <= PLC_PITCH_LAG_MAX);
168
264k
   celt_assert(st->last_pitch_index >= PLC_PITCH_LAG_MIN || st->last_pitch_index == 0);
169
264k
#endif
170
264k
   celt_assert(st->postfilter_period < MAX_PERIOD);
171
264k
   celt_assert(st->postfilter_period >= COMBFILTER_MINPERIOD || st->postfilter_period == 0);
172
264k
   celt_assert(st->postfilter_period_old < MAX_PERIOD);
173
264k
   celt_assert(st->postfilter_period_old >= COMBFILTER_MINPERIOD || st->postfilter_period_old == 0);
174
264k
   celt_assert(st->postfilter_tapset <= 2);
175
264k
   celt_assert(st->postfilter_tapset >= 0);
176
264k
   celt_assert(st->postfilter_tapset_old <= 2);
177
264k
   celt_assert(st->postfilter_tapset_old >= 0);
178
264k
}
validate_celt_decoder
Line
Count
Source
145
275k
{
146
#if !defined(CUSTOM_MODES) && !defined(ENABLE_OPUS_CUSTOM_API) && !defined(ENABLE_QEXT)
147
   celt_assert(st->mode == opus_custom_mode_create(48000, 960, NULL));
148
   celt_assert(st->overlap == 120);
149
   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
275k
   celt_assert(st->end <= 25);
156
275k
#endif
157
275k
   celt_assert(st->channels == 1 || st->channels == 2);
158
275k
   celt_assert(st->stream_channels == 1 || st->stream_channels == 2);
159
275k
   celt_assert(st->downsample > 0);
160
275k
   celt_assert(st->start == 0 || st->start == 17);
161
275k
   celt_assert(st->start < st->end);
162
275k
#ifdef OPUS_ARCHMASK
163
275k
   celt_assert(st->arch >= 0);
164
275k
   celt_assert(st->arch <= OPUS_ARCHMASK);
165
275k
#endif
166
#ifndef ENABLE_QEXT
167
   celt_assert(st->last_pitch_index <= PLC_PITCH_LAG_MAX);
168
   celt_assert(st->last_pitch_index >= PLC_PITCH_LAG_MIN || st->last_pitch_index == 0);
169
#endif
170
275k
   celt_assert(st->postfilter_period < MAX_PERIOD);
171
275k
   celt_assert(st->postfilter_period >= COMBFILTER_MINPERIOD || st->postfilter_period == 0);
172
275k
   celt_assert(st->postfilter_period_old < MAX_PERIOD);
173
275k
   celt_assert(st->postfilter_period_old >= COMBFILTER_MINPERIOD || st->postfilter_period_old == 0);
174
275k
   celt_assert(st->postfilter_tapset <= 2);
175
275k
   celt_assert(st->postfilter_tapset >= 0);
176
275k
   celt_assert(st->postfilter_tapset_old <= 2);
177
275k
   celt_assert(st->postfilter_tapset_old >= 0);
178
275k
}
179
#endif
180
181
int celt_decoder_get_size(int channels)
182
846k
{
183
#ifdef ENABLE_QEXT
184
   const CELTMode *mode = opus_custom_mode_create(96000, 960, NULL);
185
#else
186
846k
   const CELTMode *mode = opus_custom_mode_create(48000, 960, NULL);
187
846k
#endif
188
846k
   return opus_custom_decoder_get_size(mode, channels);
189
846k
}
190
191
OPUS_CUSTOM_NOSTATIC int opus_custom_decoder_get_size(const CELTMode *mode, int channels)
192
771k
{
193
771k
   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
771k
   size = sizeof(struct CELTDecoder)
201
771k
            + (channels*(QEXT_SCALE(DECODE_BUFFER_SIZE)+mode->overlap)-1)*sizeof(celt_sig)
202
771k
            + 4*2*mode->nbEBands*sizeof(celt_glog)
203
771k
            + channels*CELT_LPC_ORDER*sizeof(opus_val16);
204
771k
   return size;
205
771k
}
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
189k
{
226
189k
   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
189k
   ret = opus_custom_decoder_init(st, opus_custom_mode_create(48000, 960, NULL), channels);
233
189k
   if (ret != OPUS_OK)
234
0
      return ret;
235
189k
   st->downsample = resampling_factor(sampling_rate);
236
189k
   if (st->downsample==0)
237
0
      return OPUS_BAD_ARG;
238
189k
   else
239
189k
      return OPUS_OK;
240
189k
}
241
242
OPUS_CUSTOM_NOSTATIC int opus_custom_decoder_init(CELTDecoder *st, const CELTMode *mode, int channels)
243
189k
{
244
189k
   if (channels < 0 || channels > 2)
245
0
      return OPUS_BAD_ARG;
246
247
189k
   if (st==NULL)
248
0
      return OPUS_ALLOC_FAIL;
249
250
189k
   OPUS_CLEAR((char*)st, opus_custom_decoder_get_size(mode, channels));
251
252
189k
   st->mode = mode;
253
189k
   st->overlap = mode->overlap;
254
189k
   st->stream_channels = st->channels = channels;
255
256
189k
   st->downsample = 1;
257
189k
   st->start = 0;
258
189k
   st->end = st->mode->effEBands;
259
189k
   st->signalling = 1;
260
189k
#ifndef DISABLE_UPDATE_DRAFT
261
189k
   st->disable_inv = channels == 1;
262
#else
263
   st->disable_inv = 0;
264
#endif
265
189k
   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
189k
   opus_custom_decoder_ctl(st, OPUS_RESET_STATE);
273
274
189k
   return OPUS_OK;
275
189k
}
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
#if !defined(CUSTOM_MODES) && !defined(ENABLE_OPUS_CUSTOM_API) && !defined(ENABLE_QEXT)
285
/* Special case for stereo with no downsampling and no accumulation. This is
286
   quite common and we can make it faster by processing both channels in the
287
   same loop, reducing overhead due to the dependency loop in the IIR filter. */
288
static void deemphasis_stereo_simple(celt_sig *in[], opus_res *pcm, int N, const opus_val16 coef0,
289
      celt_sig *mem)
290
30.5k
{
291
30.5k
   celt_sig * OPUS_RESTRICT x0;
292
30.5k
   celt_sig * OPUS_RESTRICT x1;
293
30.5k
   celt_sig m0, m1;
294
30.5k
   int j;
295
30.5k
   x0=in[0];
296
30.5k
   x1=in[1];
297
30.5k
   m0 = mem[0];
298
30.5k
   m1 = mem[1];
299
8.14M
   for (j=0;j<N;j++)
300
8.11M
   {
301
8.11M
      celt_sig tmp0, tmp1;
302
      /* Add VERY_SMALL to x[] first to reduce dependency chain. */
303
8.11M
      tmp0 = SATURATE(x0[j] + VERY_SMALL + m0, SIG_SAT);
304
8.11M
      tmp1 = SATURATE(x1[j] + VERY_SMALL + m1, SIG_SAT);
305
8.11M
      m0 = MULT16_32_Q15(coef0, tmp0);
306
8.11M
      m1 = MULT16_32_Q15(coef0, tmp1);
307
8.11M
      pcm[2*j  ] = SIG2RES(tmp0);
308
8.11M
      pcm[2*j+1] = SIG2RES(tmp1);
309
8.11M
   }
310
30.5k
   mem[0] = m0;
311
30.5k
   mem[1] = m1;
312
30.5k
}
celt_decoder.c:deemphasis_stereo_simple
Line
Count
Source
290
16.6k
{
291
16.6k
   celt_sig * OPUS_RESTRICT x0;
292
16.6k
   celt_sig * OPUS_RESTRICT x1;
293
16.6k
   celt_sig m0, m1;
294
16.6k
   int j;
295
16.6k
   x0=in[0];
296
16.6k
   x1=in[1];
297
16.6k
   m0 = mem[0];
298
16.6k
   m1 = mem[1];
299
3.96M
   for (j=0;j<N;j++)
300
3.95M
   {
301
3.95M
      celt_sig tmp0, tmp1;
302
      /* Add VERY_SMALL to x[] first to reduce dependency chain. */
303
3.95M
      tmp0 = SATURATE(x0[j] + VERY_SMALL + m0, SIG_SAT);
304
3.95M
      tmp1 = SATURATE(x1[j] + VERY_SMALL + m1, SIG_SAT);
305
3.95M
      m0 = MULT16_32_Q15(coef0, tmp0);
306
3.95M
      m1 = MULT16_32_Q15(coef0, tmp1);
307
3.95M
      pcm[2*j  ] = SIG2RES(tmp0);
308
3.95M
      pcm[2*j+1] = SIG2RES(tmp1);
309
3.95M
   }
310
16.6k
   mem[0] = m0;
311
16.6k
   mem[1] = m1;
312
16.6k
}
celt_decoder.c:deemphasis_stereo_simple
Line
Count
Source
290
13.9k
{
291
13.9k
   celt_sig * OPUS_RESTRICT x0;
292
13.9k
   celt_sig * OPUS_RESTRICT x1;
293
13.9k
   celt_sig m0, m1;
294
13.9k
   int j;
295
13.9k
   x0=in[0];
296
13.9k
   x1=in[1];
297
13.9k
   m0 = mem[0];
298
13.9k
   m1 = mem[1];
299
4.17M
   for (j=0;j<N;j++)
300
4.16M
   {
301
4.16M
      celt_sig tmp0, tmp1;
302
      /* Add VERY_SMALL to x[] first to reduce dependency chain. */
303
4.16M
      tmp0 = SATURATE(x0[j] + VERY_SMALL + m0, SIG_SAT);
304
4.16M
      tmp1 = SATURATE(x1[j] + VERY_SMALL + m1, SIG_SAT);
305
4.16M
      m0 = MULT16_32_Q15(coef0, tmp0);
306
4.16M
      m1 = MULT16_32_Q15(coef0, tmp1);
307
4.16M
      pcm[2*j  ] = SIG2RES(tmp0);
308
4.16M
      pcm[2*j+1] = SIG2RES(tmp1);
309
4.16M
   }
310
13.9k
   mem[0] = m0;
311
13.9k
   mem[1] = m1;
312
13.9k
}
313
#endif
314
315
#ifndef RESYNTH
316
static
317
#endif
318
void deemphasis(celt_sig *in[], opus_res *pcm, int N, int C, int downsample, const opus_val16 *coef,
319
      celt_sig *mem, int accum)
320
539k
{
321
539k
   int c;
322
539k
   int Nd;
323
539k
   int apply_downsampling=0;
324
539k
   opus_val16 coef0;
325
539k
   VARDECL(celt_sig, scratch);
326
539k
   SAVE_STACK;
327
#if !defined(CUSTOM_MODES) && !defined(ENABLE_OPUS_CUSTOM_API) && !defined(ENABLE_QEXT)
328
   /* Short version for common case. */
329
264k
   if (downsample == 1 && C == 2 && !accum)
330
30.5k
   {
331
30.5k
      deemphasis_stereo_simple(in, pcm, N, coef[0], mem);
332
30.5k
      return;
333
30.5k
   }
334
233k
#endif
335
508k
   ALLOC(scratch, N, celt_sig);
336
233k
   coef0 = coef[0];
337
233k
   Nd = N/downsample;
338
764k
   c=0; do {
339
764k
      int j;
340
764k
      celt_sig * OPUS_RESTRICT x;
341
764k
      opus_res  * OPUS_RESTRICT y;
342
764k
      celt_sig m = mem[c];
343
764k
      x =in[c];
344
764k
      y = pcm+c;
345
#if defined(CUSTOM_MODES) || defined(ENABLE_OPUS_CUSTOM_API) || defined(ENABLE_QEXT)
346
410k
      if (coef[1] != 0)
347
99.3k
      {
348
99.3k
         opus_val16 coef1 = coef[1];
349
99.3k
         opus_val16 coef3 = coef[3];
350
52.7M
         for (j=0;j<N;j++)
351
52.6M
         {
352
52.6M
            celt_sig tmp = SATURATE(x[j] + m + VERY_SMALL, SIG_SAT);
353
52.6M
            m = MULT16_32_Q15(coef0, tmp)
354
52.6M
                          - MULT16_32_Q15(coef1, x[j]);
355
52.6M
            tmp = SHL32(MULT16_32_Q15(coef3, tmp), 2);
356
52.6M
            scratch[j] = tmp;
357
52.6M
         }
358
99.3k
         apply_downsampling=1;
359
99.3k
      } else
360
311k
#endif
361
664k
      if (downsample>1)
362
553k
      {
363
         /* Shortcut for the standard (non-custom modes) case */
364
152M
         for (j=0;j<N;j++)
365
152M
         {
366
152M
            celt_sig tmp = SATURATE(x[j] + VERY_SMALL + m, SIG_SAT);
367
152M
            m = MULT16_32_Q15(coef0, tmp);
368
152M
            scratch[j] = tmp;
369
152M
         }
370
553k
         apply_downsampling=1;
371
553k
      } else {
372
         /* Shortcut for the standard (non-custom modes) case */
373
111k
         if (accum)
374
30.8k
         {
375
16.4M
            for (j=0;j<N;j++)
376
16.4M
            {
377
16.4M
               celt_sig tmp = SATURATE(x[j] + m + VERY_SMALL, SIG_SAT);
378
16.4M
               m = MULT16_32_Q15(coef0, tmp);
379
16.4M
               y[j*C] = ADD_RES(y[j*C], SIG2RES(tmp));
380
16.4M
            }
381
30.8k
         } else
382
80.6k
         {
383
21.0M
            for (j=0;j<N;j++)
384
20.9M
            {
385
20.9M
               celt_sig tmp = SATURATE(x[j] + VERY_SMALL + m, SIG_SAT);
386
20.9M
               m = MULT16_32_Q15(coef0, tmp);
387
20.9M
               y[j*C] = SIG2RES(tmp);
388
20.9M
            }
389
80.6k
         }
390
111k
      }
391
764k
      mem[c] = m;
392
393
764k
      if (apply_downsampling)
394
652k
      {
395
         /* Perform down-sampling */
396
652k
         if (accum)
397
83.3k
         {
398
21.3M
            for (j=0;j<Nd;j++)
399
21.2M
               y[j*C] = ADD_RES(y[j*C], SIG2RES(scratch[j*downsample]));
400
83.3k
         } else
401
569k
         {
402
77.3M
            for (j=0;j<Nd;j++)
403
76.8M
               y[j*C] = SIG2RES(scratch[j*downsample]);
404
569k
         }
405
652k
      }
406
764k
   } while (++c<C);
407
233k
   RESTORE_STACK;
408
233k
}
celt_decoder.c:deemphasis
Line
Count
Source
320
144k
{
321
144k
   int c;
322
144k
   int Nd;
323
144k
   int apply_downsampling=0;
324
144k
   opus_val16 coef0;
325
144k
   VARDECL(celt_sig, scratch);
326
144k
   SAVE_STACK;
327
144k
#if !defined(CUSTOM_MODES) && !defined(ENABLE_OPUS_CUSTOM_API) && !defined(ENABLE_QEXT)
328
   /* Short version for common case. */
329
144k
   if (downsample == 1 && C == 2 && !accum)
330
16.6k
   {
331
16.6k
      deemphasis_stereo_simple(in, pcm, N, coef[0], mem);
332
16.6k
      return;
333
16.6k
   }
334
127k
#endif
335
127k
   ALLOC(scratch, N, celt_sig);
336
127k
   coef0 = coef[0];
337
127k
   Nd = N/downsample;
338
196k
   c=0; do {
339
196k
      int j;
340
196k
      celt_sig * OPUS_RESTRICT x;
341
196k
      opus_res  * OPUS_RESTRICT y;
342
196k
      celt_sig m = mem[c];
343
196k
      x =in[c];
344
196k
      y = pcm+c;
345
#if defined(CUSTOM_MODES) || defined(ENABLE_OPUS_CUSTOM_API) || defined(ENABLE_QEXT)
346
      if (coef[1] != 0)
347
      {
348
         opus_val16 coef1 = coef[1];
349
         opus_val16 coef3 = coef[3];
350
         for (j=0;j<N;j++)
351
         {
352
            celt_sig tmp = SATURATE(x[j] + m + VERY_SMALL, SIG_SAT);
353
            m = MULT16_32_Q15(coef0, tmp)
354
                          - MULT16_32_Q15(coef1, x[j]);
355
            tmp = SHL32(MULT16_32_Q15(coef3, tmp), 2);
356
            scratch[j] = tmp;
357
         }
358
         apply_downsampling=1;
359
      } else
360
#endif
361
196k
      if (downsample>1)
362
174k
      {
363
         /* Shortcut for the standard (non-custom modes) case */
364
43.9M
         for (j=0;j<N;j++)
365
43.7M
         {
366
43.7M
            celt_sig tmp = SATURATE(x[j] + VERY_SMALL + m, SIG_SAT);
367
43.7M
            m = MULT16_32_Q15(coef0, tmp);
368
43.7M
            scratch[j] = tmp;
369
43.7M
         }
370
174k
         apply_downsampling=1;
371
174k
      } else {
372
         /* Shortcut for the standard (non-custom modes) case */
373
22.5k
         if (accum)
374
8.58k
         {
375
4.51M
            for (j=0;j<N;j++)
376
4.50M
            {
377
4.50M
               celt_sig tmp = SATURATE(x[j] + m + VERY_SMALL, SIG_SAT);
378
4.50M
               m = MULT16_32_Q15(coef0, tmp);
379
4.50M
               y[j*C] = ADD_RES(y[j*C], SIG2RES(tmp));
380
4.50M
            }
381
8.58k
         } else
382
13.9k
         {
383
4.15M
            for (j=0;j<N;j++)
384
4.14M
            {
385
4.14M
               celt_sig tmp = SATURATE(x[j] + VERY_SMALL + m, SIG_SAT);
386
4.14M
               m = MULT16_32_Q15(coef0, tmp);
387
4.14M
               y[j*C] = SIG2RES(tmp);
388
4.14M
            }
389
13.9k
         }
390
22.5k
      }
391
196k
      mem[c] = m;
392
393
196k
      if (apply_downsampling)
394
174k
      {
395
         /* Perform down-sampling */
396
174k
         if (accum)
397
19.6k
         {
398
3.08M
            for (j=0;j<Nd;j++)
399
3.06M
               y[j*C] = ADD_RES(y[j*C], SIG2RES(scratch[j*downsample]));
400
19.6k
         } else
401
154k
         {
402
10.8M
            for (j=0;j<Nd;j++)
403
10.7M
               y[j*C] = SIG2RES(scratch[j*downsample]);
404
154k
         }
405
174k
      }
406
196k
   } while (++c<C);
407
127k
   RESTORE_STACK;
408
127k
}
celt_decoder.c:deemphasis
Line
Count
Source
320
149k
{
321
149k
   int c;
322
149k
   int Nd;
323
149k
   int apply_downsampling=0;
324
149k
   opus_val16 coef0;
325
149k
   VARDECL(celt_sig, scratch);
326
149k
   SAVE_STACK;
327
#if !defined(CUSTOM_MODES) && !defined(ENABLE_OPUS_CUSTOM_API) && !defined(ENABLE_QEXT)
328
   /* Short version for common case. */
329
   if (downsample == 1 && C == 2 && !accum)
330
   {
331
      deemphasis_stereo_simple(in, pcm, N, coef[0], mem);
332
      return;
333
   }
334
#endif
335
149k
   ALLOC(scratch, N, celt_sig);
336
149k
   coef0 = coef[0];
337
149k
   Nd = N/downsample;
338
219k
   c=0; do {
339
219k
      int j;
340
219k
      celt_sig * OPUS_RESTRICT x;
341
219k
      opus_res  * OPUS_RESTRICT y;
342
219k
      celt_sig m = mem[c];
343
219k
      x =in[c];
344
219k
      y = pcm+c;
345
219k
#if defined(CUSTOM_MODES) || defined(ENABLE_OPUS_CUSTOM_API) || defined(ENABLE_QEXT)
346
219k
      if (coef[1] != 0)
347
56.6k
      {
348
56.6k
         opus_val16 coef1 = coef[1];
349
56.6k
         opus_val16 coef3 = coef[3];
350
27.4M
         for (j=0;j<N;j++)
351
27.3M
         {
352
27.3M
            celt_sig tmp = SATURATE(x[j] + m + VERY_SMALL, SIG_SAT);
353
27.3M
            m = MULT16_32_Q15(coef0, tmp)
354
27.3M
                          - MULT16_32_Q15(coef1, x[j]);
355
27.3M
            tmp = SHL32(MULT16_32_Q15(coef3, tmp), 2);
356
27.3M
            scratch[j] = tmp;
357
27.3M
         }
358
56.6k
         apply_downsampling=1;
359
56.6k
      } else
360
163k
#endif
361
163k
      if (downsample>1)
362
126k
      {
363
         /* Shortcut for the standard (non-custom modes) case */
364
30.6M
         for (j=0;j<N;j++)
365
30.5M
         {
366
30.5M
            celt_sig tmp = SATURATE(x[j] + VERY_SMALL + m, SIG_SAT);
367
30.5M
            m = MULT16_32_Q15(coef0, tmp);
368
30.5M
            scratch[j] = tmp;
369
30.5M
         }
370
126k
         apply_downsampling=1;
371
126k
      } else {
372
         /* Shortcut for the standard (non-custom modes) case */
373
37.1k
         if (accum)
374
6.68k
         {
375
3.63M
            for (j=0;j<N;j++)
376
3.62M
            {
377
3.62M
               celt_sig tmp = SATURATE(x[j] + m + VERY_SMALL, SIG_SAT);
378
3.62M
               m = MULT16_32_Q15(coef0, tmp);
379
3.62M
               y[j*C] = ADD_RES(y[j*C], SIG2RES(tmp));
380
3.62M
            }
381
6.68k
         } else
382
30.4k
         {
383
6.59M
            for (j=0;j<N;j++)
384
6.55M
            {
385
6.55M
               celt_sig tmp = SATURATE(x[j] + VERY_SMALL + m, SIG_SAT);
386
6.55M
               m = MULT16_32_Q15(coef0, tmp);
387
6.55M
               y[j*C] = SIG2RES(tmp);
388
6.55M
            }
389
30.4k
         }
390
37.1k
      }
391
219k
      mem[c] = m;
392
393
219k
      if (apply_downsampling)
394
182k
      {
395
         /* Perform down-sampling */
396
182k
         if (accum)
397
16.8k
         {
398
7.11M
            for (j=0;j<Nd;j++)
399
7.09M
               y[j*C] = ADD_RES(y[j*C], SIG2RES(scratch[j*downsample]));
400
16.8k
         } else
401
165k
         {
402
28.6M
            for (j=0;j<Nd;j++)
403
28.5M
               y[j*C] = SIG2RES(scratch[j*downsample]);
404
165k
         }
405
182k
      }
406
219k
   } while (++c<C);
407
149k
   RESTORE_STACK;
408
149k
}
celt_decoder.c:deemphasis
Line
Count
Source
320
125k
{
321
125k
   int c;
322
125k
   int Nd;
323
125k
   int apply_downsampling=0;
324
125k
   opus_val16 coef0;
325
125k
   VARDECL(celt_sig, scratch);
326
125k
   SAVE_STACK;
327
#if !defined(CUSTOM_MODES) && !defined(ENABLE_OPUS_CUSTOM_API) && !defined(ENABLE_QEXT)
328
   /* Short version for common case. */
329
   if (downsample == 1 && C == 2 && !accum)
330
   {
331
      deemphasis_stereo_simple(in, pcm, N, coef[0], mem);
332
      return;
333
   }
334
#endif
335
125k
   ALLOC(scratch, N, celt_sig);
336
125k
   coef0 = coef[0];
337
125k
   Nd = N/downsample;
338
190k
   c=0; do {
339
190k
      int j;
340
190k
      celt_sig * OPUS_RESTRICT x;
341
190k
      opus_res  * OPUS_RESTRICT y;
342
190k
      celt_sig m = mem[c];
343
190k
      x =in[c];
344
190k
      y = pcm+c;
345
190k
#if defined(CUSTOM_MODES) || defined(ENABLE_OPUS_CUSTOM_API) || defined(ENABLE_QEXT)
346
190k
      if (coef[1] != 0)
347
42.6k
      {
348
42.6k
         opus_val16 coef1 = coef[1];
349
42.6k
         opus_val16 coef3 = coef[3];
350
25.2M
         for (j=0;j<N;j++)
351
25.2M
         {
352
25.2M
            celt_sig tmp = SATURATE(x[j] + m + VERY_SMALL, SIG_SAT);
353
25.2M
            m = MULT16_32_Q15(coef0, tmp)
354
25.2M
                          - MULT16_32_Q15(coef1, x[j]);
355
25.2M
            tmp = SHL32(MULT16_32_Q15(coef3, tmp), 2);
356
25.2M
            scratch[j] = tmp;
357
25.2M
         }
358
42.6k
         apply_downsampling=1;
359
42.6k
      } else
360
148k
#endif
361
148k
      if (downsample>1)
362
118k
      {
363
         /* Shortcut for the standard (non-custom modes) case */
364
35.3M
         for (j=0;j<N;j++)
365
35.2M
         {
366
35.2M
            celt_sig tmp = SATURATE(x[j] + VERY_SMALL + m, SIG_SAT);
367
35.2M
            m = MULT16_32_Q15(coef0, tmp);
368
35.2M
            scratch[j] = tmp;
369
35.2M
         }
370
118k
         apply_downsampling=1;
371
118k
      } else {
372
         /* Shortcut for the standard (non-custom modes) case */
373
29.7k
         if (accum)
374
6.54k
         {
375
3.47M
            for (j=0;j<N;j++)
376
3.46M
            {
377
3.46M
               celt_sig tmp = SATURATE(x[j] + m + VERY_SMALL, SIG_SAT);
378
3.46M
               m = MULT16_32_Q15(coef0, tmp);
379
3.46M
               y[j*C] = ADD_RES(y[j*C], SIG2RES(tmp));
380
3.46M
            }
381
6.54k
         } else
382
23.2k
         {
383
6.54M
            for (j=0;j<N;j++)
384
6.52M
            {
385
6.52M
               celt_sig tmp = SATURATE(x[j] + VERY_SMALL + m, SIG_SAT);
386
6.52M
               m = MULT16_32_Q15(coef0, tmp);
387
6.52M
               y[j*C] = SIG2RES(tmp);
388
6.52M
            }
389
23.2k
         }
390
29.7k
      }
391
190k
      mem[c] = m;
392
393
190k
      if (apply_downsampling)
394
161k
      {
395
         /* Perform down-sampling */
396
161k
         if (accum)
397
23.5k
         {
398
7.61M
            for (j=0;j<Nd;j++)
399
7.59M
               y[j*C] = ADD_RES(y[j*C], SIG2RES(scratch[j*downsample]));
400
23.5k
         } else
401
137k
         {
402
27.9M
            for (j=0;j<Nd;j++)
403
27.8M
               y[j*C] = SIG2RES(scratch[j*downsample]);
404
137k
         }
405
161k
      }
406
190k
   } while (++c<C);
407
125k
   RESTORE_STACK;
408
125k
}
celt_decoder.c:deemphasis
Line
Count
Source
320
119k
{
321
119k
   int c;
322
119k
   int Nd;
323
119k
   int apply_downsampling=0;
324
119k
   opus_val16 coef0;
325
119k
   VARDECL(celt_sig, scratch);
326
119k
   SAVE_STACK;
327
119k
#if !defined(CUSTOM_MODES) && !defined(ENABLE_OPUS_CUSTOM_API) && !defined(ENABLE_QEXT)
328
   /* Short version for common case. */
329
119k
   if (downsample == 1 && C == 2 && !accum)
330
13.9k
   {
331
13.9k
      deemphasis_stereo_simple(in, pcm, N, coef[0], mem);
332
13.9k
      return;
333
13.9k
   }
334
105k
#endif
335
105k
   ALLOC(scratch, N, celt_sig);
336
105k
   coef0 = coef[0];
337
105k
   Nd = N/downsample;
338
156k
   c=0; do {
339
156k
      int j;
340
156k
      celt_sig * OPUS_RESTRICT x;
341
156k
      opus_res  * OPUS_RESTRICT y;
342
156k
      celt_sig m = mem[c];
343
156k
      x =in[c];
344
156k
      y = pcm+c;
345
#if defined(CUSTOM_MODES) || defined(ENABLE_OPUS_CUSTOM_API) || defined(ENABLE_QEXT)
346
      if (coef[1] != 0)
347
      {
348
         opus_val16 coef1 = coef[1];
349
         opus_val16 coef3 = coef[3];
350
         for (j=0;j<N;j++)
351
         {
352
            celt_sig tmp = SATURATE(x[j] + m + VERY_SMALL, SIG_SAT);
353
            m = MULT16_32_Q15(coef0, tmp)
354
                          - MULT16_32_Q15(coef1, x[j]);
355
            tmp = SHL32(MULT16_32_Q15(coef3, tmp), 2);
356
            scratch[j] = tmp;
357
         }
358
         apply_downsampling=1;
359
      } else
360
#endif
361
156k
      if (downsample>1)
362
134k
      {
363
         /* Shortcut for the standard (non-custom modes) case */
364
42.6M
         for (j=0;j<N;j++)
365
42.5M
         {
366
42.5M
            celt_sig tmp = SATURATE(x[j] + VERY_SMALL + m, SIG_SAT);
367
42.5M
            m = MULT16_32_Q15(coef0, tmp);
368
42.5M
            scratch[j] = tmp;
369
42.5M
         }
370
134k
         apply_downsampling=1;
371
134k
      } else {
372
         /* Shortcut for the standard (non-custom modes) case */
373
22.0k
         if (accum)
374
9.02k
         {
375
4.84M
            for (j=0;j<N;j++)
376
4.84M
            {
377
4.84M
               celt_sig tmp = SATURATE(x[j] + m + VERY_SMALL, SIG_SAT);
378
4.84M
               m = MULT16_32_Q15(coef0, tmp);
379
4.84M
               y[j*C] = ADD_RES(y[j*C], SIG2RES(tmp));
380
4.84M
            }
381
9.02k
         } else
382
12.9k
         {
383
3.74M
            for (j=0;j<N;j++)
384
3.73M
            {
385
3.73M
               celt_sig tmp = SATURATE(x[j] + VERY_SMALL + m, SIG_SAT);
386
3.73M
               m = MULT16_32_Q15(coef0, tmp);
387
3.73M
               y[j*C] = SIG2RES(tmp);
388
3.73M
            }
389
12.9k
         }
390
22.0k
      }
391
156k
      mem[c] = m;
392
393
156k
      if (apply_downsampling)
394
134k
      {
395
         /* Perform down-sampling */
396
134k
         if (accum)
397
23.2k
         {
398
3.54M
            for (j=0;j<Nd;j++)
399
3.51M
               y[j*C] = ADD_RES(y[j*C], SIG2RES(scratch[j*downsample]));
400
23.2k
         } else
401
111k
         {
402
9.85M
            for (j=0;j<Nd;j++)
403
9.74M
               y[j*C] = SIG2RES(scratch[j*downsample]);
404
111k
         }
405
134k
      }
406
156k
   } while (++c<C);
407
105k
   RESTORE_STACK;
408
105k
}
409
410
#ifndef RESYNTH
411
static
412
#endif
413
void celt_synthesis(const CELTMode *mode, celt_norm *X, celt_sig * out_syn[],
414
                    celt_glog *oldBandE, int start, int effEnd, int C, int CC,
415
                    int isTransient, int LM, int downsample,
416
                    int silence, int arch ARG_QEXT(const CELTMode *qext_mode) ARG_QEXT(const celt_glog *qext_bandLogE) ARG_QEXT(int qext_end))
417
351k
{
418
351k
   int c, i;
419
351k
   int M;
420
351k
   int b;
421
351k
   int B;
422
351k
   int N, NB;
423
351k
   int shift;
424
351k
   int nbEBands;
425
351k
   int overlap;
426
351k
   VARDECL(celt_sig, freq);
427
351k
   SAVE_STACK;
428
429
351k
   overlap = mode->overlap;
430
351k
   nbEBands = mode->nbEBands;
431
351k
   N = mode->shortMdctSize<<LM;
432
351k
   ALLOC(freq, N, celt_sig); /**< Interleaved signal MDCTs */
433
351k
   M = 1<<LM;
434
#ifdef ENABLE_QEXT
435
179k
   if (mode->Fs != 96000) qext_end=2;
436
#endif
437
438
351k
   if (isTransient)
439
28.8k
   {
440
28.8k
      B = M;
441
28.8k
      NB = mode->shortMdctSize;
442
28.8k
      shift = mode->maxLM;
443
322k
   } else {
444
322k
      B = 1;
445
322k
      NB = mode->shortMdctSize<<LM;
446
322k
      shift = mode->maxLM-LM;
447
322k
   }
448
449
351k
   if (CC==2&&C==1)
450
107k
   {
451
      /* Copying a mono streams to two channels */
452
107k
      celt_sig *freq2;
453
107k
      denormalise_bands(mode, X, freq, oldBandE, start, effEnd, M,
454
107k
            downsample, silence);
455
#ifdef ENABLE_QEXT
456
50.6k
      if (qext_mode)
457
881
         denormalise_bands(qext_mode, X, freq, qext_bandLogE, 0, qext_end, M,
458
881
                        downsample, silence);
459
#endif
460
      /* Store a temporary copy in the output buffer because the IMDCT destroys its input. */
461
107k
      freq2 = out_syn[1]+overlap/2;
462
107k
      OPUS_COPY(freq2, freq, N);
463
238k
      for (b=0;b<B;b++)
464
131k
         clt_mdct_backward(&mode->mdct, &freq2[b], out_syn[0]+NB*b, mode->window, overlap, shift, B, arch);
465
238k
      for (b=0;b<B;b++)
466
131k
         clt_mdct_backward(&mode->mdct, &freq[b], out_syn[1]+NB*b, mode->window, overlap, shift, B, arch);
467
244k
   } else if (CC==1&&C==2)
468
64.2k
   {
469
      /* Downmixing a stereo stream to mono */
470
64.2k
      celt_sig *freq2;
471
64.2k
      freq2 = out_syn[0]+overlap/2;
472
64.2k
      denormalise_bands(mode, X, freq, oldBandE, start, effEnd, M,
473
64.2k
            downsample, silence);
474
      /* Use the output buffer as temp array before downmixing. */
475
64.2k
      denormalise_bands(mode, X+N, freq2, oldBandE+nbEBands, start, effEnd, M,
476
64.2k
            downsample, silence);
477
#ifdef ENABLE_QEXT
478
33.2k
      if (qext_mode)
479
3.85k
      {
480
3.85k
         denormalise_bands(qext_mode, X, freq, qext_bandLogE, 0, qext_end, M,
481
3.85k
                        downsample, silence);
482
3.85k
         denormalise_bands(qext_mode, X+N, freq2, qext_bandLogE+NB_QEXT_BANDS, 0, qext_end, M,
483
3.85k
                        downsample, silence);
484
3.85k
      }
485
#endif
486
27.0M
      for (i=0;i<N;i++)
487
27.0M
         freq[i] = ADD32(HALF32(freq[i]), HALF32(freq2[i]));
488
157k
      for (b=0;b<B;b++)
489
93.1k
         clt_mdct_backward(&mode->mdct, &freq[b], out_syn[0]+NB*b, mode->window, overlap, shift, B, arch);
490
180k
   } else {
491
      /* Normal case (mono or stereo) */
492
249k
      c=0; do {
493
249k
         denormalise_bands(mode, X+c*N, freq, oldBandE+c*nbEBands, start, effEnd, M,
494
249k
               downsample, silence);
495
#ifdef ENABLE_QEXT
496
130k
         if (qext_mode)
497
6.24k
            denormalise_bands(qext_mode, X+c*N, freq, qext_bandLogE+c*NB_QEXT_BANDS, 0, qext_end, M,
498
6.24k
                           downsample, silence);
499
#endif
500
556k
         for (b=0;b<B;b++)
501
306k
            clt_mdct_backward(&mode->mdct, &freq[b], out_syn[c]+NB*b, mode->window, overlap, shift, B, arch);
502
249k
      } while (++c<CC);
503
180k
   }
504
   /* Saturate IMDCT output so that we can't overflow in the pitch postfilter
505
      or in the */
506
528k
   c=0; do {
507
190M
      for (i=0;i<N;i++)
508
189M
         out_syn[c][i] = SATURATE(out_syn[c][i], SIG_SAT);
509
528k
   } while (++c<CC);
510
351k
   RESTORE_STACK;
511
351k
}
celt_decoder.c:celt_synthesis
Line
Count
Source
417
91.3k
{
418
91.3k
   int c, i;
419
91.3k
   int M;
420
91.3k
   int b;
421
91.3k
   int B;
422
91.3k
   int N, NB;
423
91.3k
   int shift;
424
91.3k
   int nbEBands;
425
91.3k
   int overlap;
426
91.3k
   VARDECL(celt_sig, freq);
427
91.3k
   SAVE_STACK;
428
429
91.3k
   overlap = mode->overlap;
430
91.3k
   nbEBands = mode->nbEBands;
431
91.3k
   N = mode->shortMdctSize<<LM;
432
91.3k
   ALLOC(freq, N, celt_sig); /**< Interleaved signal MDCTs */
433
91.3k
   M = 1<<LM;
434
#ifdef ENABLE_QEXT
435
   if (mode->Fs != 96000) qext_end=2;
436
#endif
437
438
91.3k
   if (isTransient)
439
8.24k
   {
440
8.24k
      B = M;
441
8.24k
      NB = mode->shortMdctSize;
442
8.24k
      shift = mode->maxLM;
443
83.0k
   } else {
444
83.0k
      B = 1;
445
83.0k
      NB = mode->shortMdctSize<<LM;
446
83.0k
      shift = mode->maxLM-LM;
447
83.0k
   }
448
449
91.3k
   if (CC==2&&C==1)
450
32.6k
   {
451
      /* Copying a mono streams to two channels */
452
32.6k
      celt_sig *freq2;
453
32.6k
      denormalise_bands(mode, X, freq, oldBandE, start, effEnd, M,
454
32.6k
            downsample, silence);
455
#ifdef ENABLE_QEXT
456
      if (qext_mode)
457
         denormalise_bands(qext_mode, X, freq, qext_bandLogE, 0, qext_end, M,
458
                        downsample, silence);
459
#endif
460
      /* Store a temporary copy in the output buffer because the IMDCT destroys its input. */
461
32.6k
      freq2 = out_syn[1]+overlap/2;
462
32.6k
      OPUS_COPY(freq2, freq, N);
463
72.3k
      for (b=0;b<B;b++)
464
39.7k
         clt_mdct_backward(&mode->mdct, &freq2[b], out_syn[0]+NB*b, mode->window, overlap, shift, B, arch);
465
72.3k
      for (b=0;b<B;b++)
466
39.7k
         clt_mdct_backward(&mode->mdct, &freq[b], out_syn[1]+NB*b, mode->window, overlap, shift, B, arch);
467
58.7k
   } else if (CC==1&&C==2)
468
16.5k
   {
469
      /* Downmixing a stereo stream to mono */
470
16.5k
      celt_sig *freq2;
471
16.5k
      freq2 = out_syn[0]+overlap/2;
472
16.5k
      denormalise_bands(mode, X, freq, oldBandE, start, effEnd, M,
473
16.5k
            downsample, silence);
474
      /* Use the output buffer as temp array before downmixing. */
475
16.5k
      denormalise_bands(mode, X+N, freq2, oldBandE+nbEBands, start, effEnd, M,
476
16.5k
            downsample, silence);
477
#ifdef ENABLE_QEXT
478
      if (qext_mode)
479
      {
480
         denormalise_bands(qext_mode, X, freq, qext_bandLogE, 0, qext_end, M,
481
                        downsample, silence);
482
         denormalise_bands(qext_mode, X+N, freq2, qext_bandLogE+NB_QEXT_BANDS, 0, qext_end, M,
483
                        downsample, silence);
484
      }
485
#endif
486
6.16M
      for (i=0;i<N;i++)
487
6.14M
         freq[i] = ADD32(HALF32(freq[i]), HALF32(freq2[i]));
488
41.9k
      for (b=0;b<B;b++)
489
25.3k
         clt_mdct_backward(&mode->mdct, &freq[b], out_syn[0]+NB*b, mode->window, overlap, shift, B, arch);
490
42.1k
   } else {
491
      /* Normal case (mono or stereo) */
492
59.3k
      c=0; do {
493
59.3k
         denormalise_bands(mode, X+c*N, freq, oldBandE+c*nbEBands, start, effEnd, M,
494
59.3k
               downsample, silence);
495
#ifdef ENABLE_QEXT
496
         if (qext_mode)
497
            denormalise_bands(qext_mode, X+c*N, freq, qext_bandLogE+c*NB_QEXT_BANDS, 0, qext_end, M,
498
                           downsample, silence);
499
#endif
500
134k
         for (b=0;b<B;b++)
501
75.5k
            clt_mdct_backward(&mode->mdct, &freq[b], out_syn[c]+NB*b, mode->window, overlap, shift, B, arch);
502
59.3k
      } while (++c<CC);
503
42.1k
   }
504
   /* Saturate IMDCT output so that we can't overflow in the pitch postfilter
505
      or in the */
506
141k
   c=0; do {
507
43.3M
      for (i=0;i<N;i++)
508
43.2M
         out_syn[c][i] = SATURATE(out_syn[c][i], SIG_SAT);
509
141k
   } while (++c<CC);
510
91.3k
   RESTORE_STACK;
511
91.3k
}
celt_decoder.c:celt_synthesis
Line
Count
Source
417
94.7k
{
418
94.7k
   int c, i;
419
94.7k
   int M;
420
94.7k
   int b;
421
94.7k
   int B;
422
94.7k
   int N, NB;
423
94.7k
   int shift;
424
94.7k
   int nbEBands;
425
94.7k
   int overlap;
426
94.7k
   VARDECL(celt_sig, freq);
427
94.7k
   SAVE_STACK;
428
429
94.7k
   overlap = mode->overlap;
430
94.7k
   nbEBands = mode->nbEBands;
431
94.7k
   N = mode->shortMdctSize<<LM;
432
94.7k
   ALLOC(freq, N, celt_sig); /**< Interleaved signal MDCTs */
433
94.7k
   M = 1<<LM;
434
94.7k
#ifdef ENABLE_QEXT
435
94.7k
   if (mode->Fs != 96000) qext_end=2;
436
94.7k
#endif
437
438
94.7k
   if (isTransient)
439
6.43k
   {
440
6.43k
      B = M;
441
6.43k
      NB = mode->shortMdctSize;
442
6.43k
      shift = mode->maxLM;
443
88.3k
   } else {
444
88.3k
      B = 1;
445
88.3k
      NB = mode->shortMdctSize<<LM;
446
88.3k
      shift = mode->maxLM-LM;
447
88.3k
   }
448
449
94.7k
   if (CC==2&&C==1)
450
26.4k
   {
451
      /* Copying a mono streams to two channels */
452
26.4k
      celt_sig *freq2;
453
26.4k
      denormalise_bands(mode, X, freq, oldBandE, start, effEnd, M,
454
26.4k
            downsample, silence);
455
26.4k
#ifdef ENABLE_QEXT
456
26.4k
      if (qext_mode)
457
437
         denormalise_bands(qext_mode, X, freq, qext_bandLogE, 0, qext_end, M,
458
437
                        downsample, silence);
459
26.4k
#endif
460
      /* Store a temporary copy in the output buffer because the IMDCT destroys its input. */
461
26.4k
      freq2 = out_syn[1]+overlap/2;
462
26.4k
      OPUS_COPY(freq2, freq, N);
463
58.4k
      for (b=0;b<B;b++)
464
32.0k
         clt_mdct_backward(&mode->mdct, &freq2[b], out_syn[0]+NB*b, mode->window, overlap, shift, B, arch);
465
58.4k
      for (b=0;b<B;b++)
466
32.0k
         clt_mdct_backward(&mode->mdct, &freq[b], out_syn[1]+NB*b, mode->window, overlap, shift, B, arch);
467
68.3k
   } else if (CC==1&&C==2)
468
17.7k
   {
469
      /* Downmixing a stereo stream to mono */
470
17.7k
      celt_sig *freq2;
471
17.7k
      freq2 = out_syn[0]+overlap/2;
472
17.7k
      denormalise_bands(mode, X, freq, oldBandE, start, effEnd, M,
473
17.7k
            downsample, silence);
474
      /* Use the output buffer as temp array before downmixing. */
475
17.7k
      denormalise_bands(mode, X+N, freq2, oldBandE+nbEBands, start, effEnd, M,
476
17.7k
            downsample, silence);
477
17.7k
#ifdef ENABLE_QEXT
478
17.7k
      if (qext_mode)
479
2.53k
      {
480
2.53k
         denormalise_bands(qext_mode, X, freq, qext_bandLogE, 0, qext_end, M,
481
2.53k
                        downsample, silence);
482
2.53k
         denormalise_bands(qext_mode, X+N, freq2, qext_bandLogE+NB_QEXT_BANDS, 0, qext_end, M,
483
2.53k
                        downsample, silence);
484
2.53k
      }
485
17.7k
#endif
486
7.94M
      for (i=0;i<N;i++)
487
7.92M
         freq[i] = ADD32(HALF32(freq[i]), HALF32(freq2[i]));
488
41.0k
      for (b=0;b<B;b++)
489
23.2k
         clt_mdct_backward(&mode->mdct, &freq[b], out_syn[0]+NB*b, mode->window, overlap, shift, B, arch);
490
50.5k
   } else {
491
      /* Normal case (mono or stereo) */
492
68.1k
      c=0; do {
493
68.1k
         denormalise_bands(mode, X+c*N, freq, oldBandE+c*nbEBands, start, effEnd, M,
494
68.1k
               downsample, silence);
495
68.1k
#ifdef ENABLE_QEXT
496
68.1k
         if (qext_mode)
497
1.75k
            denormalise_bands(qext_mode, X+c*N, freq, qext_bandLogE+c*NB_QEXT_BANDS, 0, qext_end, M,
498
1.75k
                           downsample, silence);
499
68.1k
#endif
500
149k
         for (b=0;b<B;b++)
501
81.4k
            clt_mdct_backward(&mode->mdct, &freq[b], out_syn[c]+NB*b, mode->window, overlap, shift, B, arch);
502
68.1k
      } while (++c<CC);
503
50.5k
   }
504
   /* Saturate IMDCT output so that we can't overflow in the pitch postfilter
505
      or in the */
506
138k
   c=0; do {
507
50.6M
      for (i=0;i<N;i++)
508
50.4M
         out_syn[c][i] = SATURATE(out_syn[c][i], SIG_SAT);
509
138k
   } while (++c<CC);
510
94.7k
   RESTORE_STACK;
511
94.7k
}
celt_decoder.c:celt_synthesis
Line
Count
Source
417
84.8k
{
418
84.8k
   int c, i;
419
84.8k
   int M;
420
84.8k
   int b;
421
84.8k
   int B;
422
84.8k
   int N, NB;
423
84.8k
   int shift;
424
84.8k
   int nbEBands;
425
84.8k
   int overlap;
426
84.8k
   VARDECL(celt_sig, freq);
427
84.8k
   SAVE_STACK;
428
429
84.8k
   overlap = mode->overlap;
430
84.8k
   nbEBands = mode->nbEBands;
431
84.8k
   N = mode->shortMdctSize<<LM;
432
84.8k
   ALLOC(freq, N, celt_sig); /**< Interleaved signal MDCTs */
433
84.8k
   M = 1<<LM;
434
84.8k
#ifdef ENABLE_QEXT
435
84.8k
   if (mode->Fs != 96000) qext_end=2;
436
84.8k
#endif
437
438
84.8k
   if (isTransient)
439
7.28k
   {
440
7.28k
      B = M;
441
7.28k
      NB = mode->shortMdctSize;
442
7.28k
      shift = mode->maxLM;
443
77.5k
   } else {
444
77.5k
      B = 1;
445
77.5k
      NB = mode->shortMdctSize<<LM;
446
77.5k
      shift = mode->maxLM-LM;
447
77.5k
   }
448
449
84.8k
   if (CC==2&&C==1)
450
24.2k
   {
451
      /* Copying a mono streams to two channels */
452
24.2k
      celt_sig *freq2;
453
24.2k
      denormalise_bands(mode, X, freq, oldBandE, start, effEnd, M,
454
24.2k
            downsample, silence);
455
24.2k
#ifdef ENABLE_QEXT
456
24.2k
      if (qext_mode)
457
444
         denormalise_bands(qext_mode, X, freq, qext_bandLogE, 0, qext_end, M,
458
444
                        downsample, silence);
459
24.2k
#endif
460
      /* Store a temporary copy in the output buffer because the IMDCT destroys its input. */
461
24.2k
      freq2 = out_syn[1]+overlap/2;
462
24.2k
      OPUS_COPY(freq2, freq, N);
463
53.5k
      for (b=0;b<B;b++)
464
29.2k
         clt_mdct_backward(&mode->mdct, &freq2[b], out_syn[0]+NB*b, mode->window, overlap, shift, B, arch);
465
53.5k
      for (b=0;b<B;b++)
466
29.2k
         clt_mdct_backward(&mode->mdct, &freq[b], out_syn[1]+NB*b, mode->window, overlap, shift, B, arch);
467
60.5k
   } else if (CC==1&&C==2)
468
15.5k
   {
469
      /* Downmixing a stereo stream to mono */
470
15.5k
      celt_sig *freq2;
471
15.5k
      freq2 = out_syn[0]+overlap/2;
472
15.5k
      denormalise_bands(mode, X, freq, oldBandE, start, effEnd, M,
473
15.5k
            downsample, silence);
474
      /* Use the output buffer as temp array before downmixing. */
475
15.5k
      denormalise_bands(mode, X+N, freq2, oldBandE+nbEBands, start, effEnd, M,
476
15.5k
            downsample, silence);
477
15.5k
#ifdef ENABLE_QEXT
478
15.5k
      if (qext_mode)
479
1.32k
      {
480
1.32k
         denormalise_bands(qext_mode, X, freq, qext_bandLogE, 0, qext_end, M,
481
1.32k
                        downsample, silence);
482
1.32k
         denormalise_bands(qext_mode, X+N, freq2, qext_bandLogE+NB_QEXT_BANDS, 0, qext_end, M,
483
1.32k
                        downsample, silence);
484
1.32k
      }
485
15.5k
#endif
486
7.14M
      for (i=0;i<N;i++)
487
7.12M
         freq[i] = ADD32(HALF32(freq[i]), HALF32(freq2[i]));
488
38.3k
      for (b=0;b<B;b++)
489
22.8k
         clt_mdct_backward(&mode->mdct, &freq[b], out_syn[0]+NB*b, mode->window, overlap, shift, B, arch);
490
45.0k
   } else {
491
      /* Normal case (mono or stereo) */
492
62.1k
      c=0; do {
493
62.1k
         denormalise_bands(mode, X+c*N, freq, oldBandE+c*nbEBands, start, effEnd, M,
494
62.1k
               downsample, silence);
495
62.1k
#ifdef ENABLE_QEXT
496
62.1k
         if (qext_mode)
497
4.49k
            denormalise_bands(qext_mode, X+c*N, freq, qext_bandLogE+c*NB_QEXT_BANDS, 0, qext_end, M,
498
4.49k
                           downsample, silence);
499
62.1k
#endif
500
137k
         for (b=0;b<B;b++)
501
75.7k
            clt_mdct_backward(&mode->mdct, &freq[b], out_syn[c]+NB*b, mode->window, overlap, shift, B, arch);
502
62.1k
      } while (++c<CC);
503
45.0k
   }
504
   /* Saturate IMDCT output so that we can't overflow in the pitch postfilter
505
      or in the */
506
126k
   c=0; do {
507
52.0M
      for (i=0;i<N;i++)
508
51.9M
         out_syn[c][i] = SATURATE(out_syn[c][i], SIG_SAT);
509
126k
   } while (++c<CC);
510
84.8k
   RESTORE_STACK;
511
84.8k
}
celt_decoder.c:celt_synthesis
Line
Count
Source
417
80.8k
{
418
80.8k
   int c, i;
419
80.8k
   int M;
420
80.8k
   int b;
421
80.8k
   int B;
422
80.8k
   int N, NB;
423
80.8k
   int shift;
424
80.8k
   int nbEBands;
425
80.8k
   int overlap;
426
80.8k
   VARDECL(celt_sig, freq);
427
80.8k
   SAVE_STACK;
428
429
80.8k
   overlap = mode->overlap;
430
80.8k
   nbEBands = mode->nbEBands;
431
80.8k
   N = mode->shortMdctSize<<LM;
432
80.8k
   ALLOC(freq, N, celt_sig); /**< Interleaved signal MDCTs */
433
80.8k
   M = 1<<LM;
434
#ifdef ENABLE_QEXT
435
   if (mode->Fs != 96000) qext_end=2;
436
#endif
437
438
80.8k
   if (isTransient)
439
6.85k
   {
440
6.85k
      B = M;
441
6.85k
      NB = mode->shortMdctSize;
442
6.85k
      shift = mode->maxLM;
443
74.0k
   } else {
444
74.0k
      B = 1;
445
74.0k
      NB = mode->shortMdctSize<<LM;
446
74.0k
      shift = mode->maxLM-LM;
447
74.0k
   }
448
449
80.8k
   if (CC==2&&C==1)
450
23.9k
   {
451
      /* Copying a mono streams to two channels */
452
23.9k
      celt_sig *freq2;
453
23.9k
      denormalise_bands(mode, X, freq, oldBandE, start, effEnd, M,
454
23.9k
            downsample, silence);
455
#ifdef ENABLE_QEXT
456
      if (qext_mode)
457
         denormalise_bands(qext_mode, X, freq, qext_bandLogE, 0, qext_end, M,
458
                        downsample, silence);
459
#endif
460
      /* Store a temporary copy in the output buffer because the IMDCT destroys its input. */
461
23.9k
      freq2 = out_syn[1]+overlap/2;
462
23.9k
      OPUS_COPY(freq2, freq, N);
463
54.0k
      for (b=0;b<B;b++)
464
30.1k
         clt_mdct_backward(&mode->mdct, &freq2[b], out_syn[0]+NB*b, mode->window, overlap, shift, B, arch);
465
54.0k
      for (b=0;b<B;b++)
466
30.1k
         clt_mdct_backward(&mode->mdct, &freq[b], out_syn[1]+NB*b, mode->window, overlap, shift, B, arch);
467
56.9k
   } else if (CC==1&&C==2)
468
14.4k
   {
469
      /* Downmixing a stereo stream to mono */
470
14.4k
      celt_sig *freq2;
471
14.4k
      freq2 = out_syn[0]+overlap/2;
472
14.4k
      denormalise_bands(mode, X, freq, oldBandE, start, effEnd, M,
473
14.4k
            downsample, silence);
474
      /* Use the output buffer as temp array before downmixing. */
475
14.4k
      denormalise_bands(mode, X+N, freq2, oldBandE+nbEBands, start, effEnd, M,
476
14.4k
            downsample, silence);
477
#ifdef ENABLE_QEXT
478
      if (qext_mode)
479
      {
480
         denormalise_bands(qext_mode, X, freq, qext_bandLogE, 0, qext_end, M,
481
                        downsample, silence);
482
         denormalise_bands(qext_mode, X+N, freq2, qext_bandLogE+NB_QEXT_BANDS, 0, qext_end, M,
483
                        downsample, silence);
484
      }
485
#endif
486
5.82M
      for (i=0;i<N;i++)
487
5.81M
         freq[i] = ADD32(HALF32(freq[i]), HALF32(freq2[i]));
488
36.0k
      for (b=0;b<B;b++)
489
21.6k
         clt_mdct_backward(&mode->mdct, &freq[b], out_syn[0]+NB*b, mode->window, overlap, shift, B, arch);
490
42.5k
   } else {
491
      /* Normal case (mono or stereo) */
492
60.2k
      c=0; do {
493
60.2k
         denormalise_bands(mode, X+c*N, freq, oldBandE+c*nbEBands, start, effEnd, M,
494
60.2k
               downsample, silence);
495
#ifdef ENABLE_QEXT
496
         if (qext_mode)
497
            denormalise_bands(qext_mode, X+c*N, freq, qext_bandLogE+c*NB_QEXT_BANDS, 0, qext_end, M,
498
                           downsample, silence);
499
#endif
500
134k
         for (b=0;b<B;b++)
501
73.9k
            clt_mdct_backward(&mode->mdct, &freq[b], out_syn[c]+NB*b, mode->window, overlap, shift, B, arch);
502
60.2k
      } while (++c<CC);
503
42.5k
   }
504
   /* Saturate IMDCT output so that we can't overflow in the pitch postfilter
505
      or in the */
506
122k
   c=0; do {
507
44.1M
      for (i=0;i<N;i++)
508
44.0M
         out_syn[c][i] = SATURATE(out_syn[c][i], SIG_SAT);
509
122k
   } while (++c<CC);
510
80.8k
   RESTORE_STACK;
511
80.8k
}
512
513
static void tf_decode(int start, int end, int isTransient, int *tf_res, int LM, ec_dec *dec)
514
307k
{
515
307k
   int i, curr, tf_select;
516
307k
   int tf_select_rsv;
517
307k
   int tf_changed;
518
307k
   int logp;
519
307k
   opus_uint32 budget;
520
307k
   opus_uint32 tell;
521
522
307k
   budget = dec->storage*8;
523
307k
   tell = ec_tell(dec);
524
307k
   logp = isTransient ? 2 : 4;
525
307k
   tf_select_rsv = LM>0 && tell+logp+1<=budget;
526
307k
   budget -= tf_select_rsv;
527
307k
   tf_changed = curr = 0;
528
5.23M
   for (i=start;i<end;i++)
529
4.92M
   {
530
4.92M
      if (tell+logp<=budget)
531
1.80M
      {
532
1.80M
         curr ^= ec_dec_bit_logp(dec, logp);
533
1.80M
         tell = ec_tell(dec);
534
1.80M
         tf_changed |= curr;
535
1.80M
      }
536
4.92M
      tf_res[i] = curr;
537
4.92M
      logp = isTransient ? 4 : 5;
538
4.92M
   }
539
307k
   tf_select = 0;
540
307k
   if (tf_select_rsv &&
541
88.3k
     tf_select_table[LM][4*isTransient+0+tf_changed] !=
542
88.3k
     tf_select_table[LM][4*isTransient+2+tf_changed])
543
31.1k
   {
544
31.1k
      tf_select = ec_dec_bit_logp(dec, 1);
545
31.1k
   }
546
5.23M
   for (i=start;i<end;i++)
547
4.92M
   {
548
4.92M
      tf_res[i] = tf_select_table[LM][4*isTransient+2*tf_select+tf_res[i]];
549
4.92M
   }
550
307k
}
551
552
static int celt_plc_pitch_search(CELTDecoder *st, celt_sig *decode_mem[2], int C, int arch)
553
106k
{
554
106k
   int pitch_index;
555
#ifdef ENABLE_QEXT
556
   int qext_scale;
557
#endif
558
106k
   VARDECL( opus_val16, lp_pitch_buf );
559
106k
   SAVE_STACK;
560
#ifdef ENABLE_QEXT
561
   qext_scale = st->qext_scale;
562
#else
563
106k
   (void)st;
564
106k
#endif
565
106k
   ALLOC( lp_pitch_buf, DECODE_BUFFER_SIZE>>1, opus_val16 );
566
106k
   pitch_downsample(decode_mem, lp_pitch_buf,
567
106k
         DECODE_BUFFER_SIZE>>1, C, QEXT_SCALE(2), arch);
568
106k
   pitch_search(lp_pitch_buf+(PLC_PITCH_LAG_MAX>>1), lp_pitch_buf,
569
106k
         DECODE_BUFFER_SIZE-PLC_PITCH_LAG_MAX,
570
106k
         PLC_PITCH_LAG_MAX-PLC_PITCH_LAG_MIN, &pitch_index, arch);
571
106k
   pitch_index = PLC_PITCH_LAG_MAX-pitch_index;
572
106k
   RESTORE_STACK;
573
106k
   return QEXT_SCALE(pitch_index);
574
106k
}
575
576
static void prefilter_and_fold(CELTDecoder * OPUS_RESTRICT st, int N)
577
130k
{
578
130k
   int c;
579
130k
   int CC;
580
130k
   int i;
581
130k
   int overlap;
582
130k
   celt_sig *decode_mem[2];
583
130k
   const OpusCustomMode *mode;
584
130k
   int decode_buffer_size;
585
#ifdef ENABLE_QEXT
586
   int qext_scale;
587
#endif
588
130k
   VARDECL(opus_val32, etmp);
589
130k
   SAVE_STACK
590
#ifdef ENABLE_QEXT
591
   qext_scale = st->qext_scale;
592
#endif
593
130k
   decode_buffer_size = QEXT_SCALE(DECODE_BUFFER_SIZE);
594
130k
   mode = st->mode;
595
130k
   overlap = st->overlap;
596
130k
   CC = st->channels;
597
130k
   ALLOC(etmp, overlap, opus_val32);
598
218k
   c=0; do {
599
218k
      decode_mem[c] = st->_decode_mem + c*(decode_buffer_size+overlap);
600
218k
   } while (++c<CC);
601
602
218k
   c=0; do {
603
      /* Apply the pre-filter to the MDCT overlap for the next frame because
604
         the post-filter will be re-applied in the decoder after the MDCT
605
         overlap. */
606
218k
      comb_filter(etmp, decode_mem[c]+decode_buffer_size-N,
607
218k
         st->postfilter_period_old, st->postfilter_period, overlap,
608
218k
         -st->postfilter_gain_old, -st->postfilter_gain,
609
218k
         st->postfilter_tapset_old, st->postfilter_tapset, NULL, 0, st->arch);
610
611
      /* Simulate TDAC on the concealed audio so that it blends with the
612
         MDCT of the next frame. */
613
14.9M
      for (i=0;i<overlap/2;i++)
614
14.7M
      {
615
14.7M
         decode_mem[c][decode_buffer_size-N+i] =
616
14.7M
            MULT16_32_Q15(COEF2VAL16(mode->window[i]), etmp[overlap-1-i])
617
14.7M
            + MULT16_32_Q15 (COEF2VAL16(mode->window[overlap-i-1]), etmp[i]);
618
14.7M
      }
619
218k
   } while (++c<CC);
620
130k
   RESTORE_STACK;
621
130k
}
celt_decoder.c:prefilter_and_fold
Line
Count
Source
577
65.3k
{
578
65.3k
   int c;
579
65.3k
   int CC;
580
65.3k
   int i;
581
65.3k
   int overlap;
582
65.3k
   celt_sig *decode_mem[2];
583
65.3k
   const OpusCustomMode *mode;
584
65.3k
   int decode_buffer_size;
585
#ifdef ENABLE_QEXT
586
   int qext_scale;
587
#endif
588
65.3k
   VARDECL(opus_val32, etmp);
589
65.3k
   SAVE_STACK
590
#ifdef ENABLE_QEXT
591
   qext_scale = st->qext_scale;
592
#endif
593
65.3k
   decode_buffer_size = QEXT_SCALE(DECODE_BUFFER_SIZE);
594
65.3k
   mode = st->mode;
595
65.3k
   overlap = st->overlap;
596
65.3k
   CC = st->channels;
597
65.3k
   ALLOC(etmp, overlap, opus_val32);
598
109k
   c=0; do {
599
109k
      decode_mem[c] = st->_decode_mem + c*(decode_buffer_size+overlap);
600
109k
   } while (++c<CC);
601
602
109k
   c=0; do {
603
      /* Apply the pre-filter to the MDCT overlap for the next frame because
604
         the post-filter will be re-applied in the decoder after the MDCT
605
         overlap. */
606
109k
      comb_filter(etmp, decode_mem[c]+decode_buffer_size-N,
607
109k
         st->postfilter_period_old, st->postfilter_period, overlap,
608
109k
         -st->postfilter_gain_old, -st->postfilter_gain,
609
109k
         st->postfilter_tapset_old, st->postfilter_tapset, NULL, 0, st->arch);
610
611
      /* Simulate TDAC on the concealed audio so that it blends with the
612
         MDCT of the next frame. */
613
7.46M
      for (i=0;i<overlap/2;i++)
614
7.36M
      {
615
7.36M
         decode_mem[c][decode_buffer_size-N+i] =
616
7.36M
            MULT16_32_Q15(COEF2VAL16(mode->window[i]), etmp[overlap-1-i])
617
7.36M
            + MULT16_32_Q15 (COEF2VAL16(mode->window[overlap-i-1]), etmp[i]);
618
7.36M
      }
619
109k
   } while (++c<CC);
620
65.3k
   RESTORE_STACK;
621
65.3k
}
celt_decoder.c:prefilter_and_fold
Line
Count
Source
577
65.3k
{
578
65.3k
   int c;
579
65.3k
   int CC;
580
65.3k
   int i;
581
65.3k
   int overlap;
582
65.3k
   celt_sig *decode_mem[2];
583
65.3k
   const OpusCustomMode *mode;
584
65.3k
   int decode_buffer_size;
585
65.3k
#ifdef ENABLE_QEXT
586
65.3k
   int qext_scale;
587
65.3k
#endif
588
65.3k
   VARDECL(opus_val32, etmp);
589
65.3k
   SAVE_STACK
590
65.3k
#ifdef ENABLE_QEXT
591
65.3k
   qext_scale = st->qext_scale;
592
65.3k
#endif
593
65.3k
   decode_buffer_size = QEXT_SCALE(DECODE_BUFFER_SIZE);
594
65.3k
   mode = st->mode;
595
65.3k
   overlap = st->overlap;
596
65.3k
   CC = st->channels;
597
65.3k
   ALLOC(etmp, overlap, opus_val32);
598
109k
   c=0; do {
599
109k
      decode_mem[c] = st->_decode_mem + c*(decode_buffer_size+overlap);
600
109k
   } while (++c<CC);
601
602
109k
   c=0; do {
603
      /* Apply the pre-filter to the MDCT overlap for the next frame because
604
         the post-filter will be re-applied in the decoder after the MDCT
605
         overlap. */
606
109k
      comb_filter(etmp, decode_mem[c]+decode_buffer_size-N,
607
109k
         st->postfilter_period_old, st->postfilter_period, overlap,
608
109k
         -st->postfilter_gain_old, -st->postfilter_gain,
609
109k
         st->postfilter_tapset_old, st->postfilter_tapset, NULL, 0, st->arch);
610
611
      /* Simulate TDAC on the concealed audio so that it blends with the
612
         MDCT of the next frame. */
613
7.46M
      for (i=0;i<overlap/2;i++)
614
7.36M
      {
615
7.36M
         decode_mem[c][decode_buffer_size-N+i] =
616
7.36M
            MULT16_32_Q15(COEF2VAL16(mode->window[i]), etmp[overlap-1-i])
617
7.36M
            + MULT16_32_Q15 (COEF2VAL16(mode->window[overlap-i-1]), etmp[i]);
618
7.36M
      }
619
109k
   } while (++c<CC);
620
65.3k
   RESTORE_STACK;
621
65.3k
}
622
623
#ifdef ENABLE_DEEP_PLC
624
625
#define SINC_ORDER 48
626
/* h=cos(pi/2*abs(sin([-24:24]/48*pi*23./24)).^2);
627
   b=sinc([-24:24]/3*1.02).*h;
628
   b=b/sum(b); */
629
static const float sinc_filter[SINC_ORDER+1] = {
630
    4.2931e-05f, -0.000190293f, -0.000816132f, -0.000637162f, 0.00141662f, 0.00354764f, 0.00184368f, -0.00428274f,
631
    -0.00856105f, -0.0034003f, 0.00930201f, 0.0159616f, 0.00489785f, -0.0169649f, -0.0259484f, -0.00596856f,
632
    0.0286551f, 0.0405872f, 0.00649994f, -0.0509284f, -0.0716655f, -0.00665212f,  0.134336f,  0.278927f,
633
    0.339995f,  0.278927f,  0.134336f, -0.00665212f, -0.0716655f, -0.0509284f, 0.00649994f, 0.0405872f,
634
    0.0286551f, -0.00596856f, -0.0259484f, -0.0169649f, 0.00489785f, 0.0159616f, 0.00930201f, -0.0034003f,
635
    -0.00856105f, -0.00428274f, 0.00184368f, 0.00354764f, 0.00141662f, -0.000637162f, -0.000816132f, -0.000190293f,
636
    4.2931e-05f
637
};
638
639
void update_plc_state(LPCNetPLCState *lpcnet, celt_sig *decode_mem[2], float *plc_preemphasis_mem, int CC)
640
{
641
   int i;
642
   int tmp_read_post, tmp_fec_skip;
643
   int offset;
644
   celt_sig buf48k[DECODE_BUFFER_SIZE];
645
   opus_int16 buf16k[PLC_UPDATE_SAMPLES];
646
   if (CC == 1) OPUS_COPY(buf48k, decode_mem[0], DECODE_BUFFER_SIZE);
647
   else {
648
      for (i=0;i<DECODE_BUFFER_SIZE;i++) {
649
         buf48k[i] = .5*(decode_mem[0][i] + decode_mem[1][i]);
650
      }
651
   }
652
   /* Down-sample the last 40 ms. */
653
   for (i=1;i<DECODE_BUFFER_SIZE;i++) buf48k[i] += PREEMPHASIS*buf48k[i-1];
654
   *plc_preemphasis_mem = buf48k[DECODE_BUFFER_SIZE-1];
655
   offset = DECODE_BUFFER_SIZE-SINC_ORDER-1 - 3*(PLC_UPDATE_SAMPLES-1);
656
   celt_assert(3*(PLC_UPDATE_SAMPLES-1) + SINC_ORDER + offset == DECODE_BUFFER_SIZE-1);
657
   for (i=0;i<PLC_UPDATE_SAMPLES;i++) {
658
      int j;
659
      float sum = 0;
660
      for (j=0;j<SINC_ORDER+1;j++) {
661
         sum += buf48k[3*i + j + offset]*sinc_filter[j];
662
      }
663
      buf16k[i] = float2int(MIN32(32767.f, MAX32(-32767.f, sum)));
664
   }
665
   tmp_read_post = lpcnet->fec_read_pos;
666
   tmp_fec_skip = lpcnet->fec_skip;
667
   for (i=0;i<PLC_UPDATE_FRAMES;i++) {
668
      lpcnet_plc_update(lpcnet, &buf16k[FRAME_SIZE*i]);
669
   }
670
   lpcnet->fec_read_pos = tmp_read_post;
671
   lpcnet->fec_skip = tmp_fec_skip;
672
}
673
#endif
674
675
static void celt_decode_lost(CELTDecoder * OPUS_RESTRICT st, int N, int LM
676
#ifdef ENABLE_DEEP_PLC
677
      ,LPCNetPLCState *lpcnet
678
#endif
679
      )
680
337k
{
681
337k
   int c;
682
337k
   int i;
683
337k
   const int C = st->channels;
684
337k
   celt_sig *decode_mem[2];
685
337k
   celt_sig *out_syn[2];
686
337k
   opus_val16 *lpc;
687
337k
   celt_glog *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE;
688
337k
   const OpusCustomMode *mode;
689
337k
   int nbEBands;
690
337k
   int overlap;
691
337k
   int start;
692
337k
   int loss_duration;
693
337k
   int curr_frame_type;
694
337k
   const opus_int16 *eBands;
695
337k
   int decode_buffer_size;
696
337k
   int max_period;
697
#ifdef ENABLE_QEXT
698
   int qext_scale;
699
#endif
700
337k
   SAVE_STACK;
701
#ifdef ENABLE_QEXT
702
   qext_scale = st->qext_scale;
703
#endif
704
337k
   decode_buffer_size = QEXT_SCALE(DECODE_BUFFER_SIZE);
705
337k
   max_period = QEXT_SCALE(MAX_PERIOD);
706
337k
   mode = st->mode;
707
337k
   nbEBands = mode->nbEBands;
708
337k
   overlap = mode->overlap;
709
337k
   eBands = mode->eBands;
710
711
528k
   c=0; do {
712
528k
      decode_mem[c] = st->_decode_mem + c*(decode_buffer_size+overlap);
713
528k
      out_syn[c] = decode_mem[c]+decode_buffer_size-N;
714
528k
   } while (++c<C);
715
337k
   oldBandE = (celt_glog*)(st->_decode_mem+(decode_buffer_size+overlap)*C);
716
337k
   oldLogE = oldBandE + 2*nbEBands;
717
337k
   oldLogE2 = oldLogE + 2*nbEBands;
718
337k
   backgroundLogE = oldLogE2 + 2*nbEBands;
719
337k
   lpc = (opus_val16*)(backgroundLogE + 2*nbEBands);
720
721
337k
   loss_duration = st->loss_duration;
722
337k
   start = st->start;
723
337k
   curr_frame_type = FRAME_PLC_PERIODIC;
724
337k
   if (st->plc_duration >= 40 || start != 0 || st->skip_plc)
725
70.3k
      curr_frame_type = FRAME_PLC_NOISE;
726
#ifdef ENABLE_DEEP_PLC
727
   if (start == 0 && lpcnet != NULL && st->mode->Fs != 96000 && lpcnet->loaded)
728
   {
729
      if (st->complexity >= 5 && st->plc_duration < 80 && !st->skip_plc)
730
         curr_frame_type = FRAME_PLC_NEURAL;
731
#ifdef ENABLE_DRED
732
      if (lpcnet->fec_fill_pos > lpcnet->fec_read_pos)
733
         curr_frame_type = FRAME_DRED;
734
#endif
735
   }
736
#endif
737
738
337k
   if (curr_frame_type == FRAME_PLC_NOISE)
739
70.3k
   {
740
      /* Noise-based PLC/CNG */
741
70.3k
      VARDECL(celt_norm, X);
742
70.3k
      opus_uint32 seed;
743
70.3k
      int end;
744
70.3k
      int effEnd;
745
70.3k
      celt_glog decay;
746
70.3k
      end = st->end;
747
70.3k
      effEnd = IMAX(start, IMIN(end, mode->effEBands));
748
749
70.3k
      ALLOC(X, C*N, celt_norm);   /**< Interleaved normalised MDCTs */
750
104k
      c=0; do {
751
104k
         OPUS_MOVE(decode_mem[c], decode_mem[c]+N,
752
104k
               decode_buffer_size-N+overlap);
753
104k
      } while (++c<C);
754
755
70.3k
      if (st->prefilter_and_fold) {
756
1.57k
         prefilter_and_fold(st, N);
757
1.57k
      }
758
759
      /* Energy decay */
760
70.3k
      decay = loss_duration==0 ? GCONST(1.5f) : GCONST(.5f);
761
70.3k
      c=0; do
762
104k
      {
763
541k
         for (i=start;i<end;i++)
764
436k
            oldBandE[c*nbEBands+i] = MAXG(backgroundLogE[c*nbEBands+i], oldBandE[c*nbEBands+i] - decay);
765
104k
      } while (++c<C);
766
70.3k
      seed = st->rng;
767
175k
      for (c=0;c<C;c++)
768
104k
      {
769
541k
         for (i=start;i<effEnd;i++)
770
436k
         {
771
436k
            int j;
772
436k
            int boffs;
773
436k
            int blen;
774
436k
            boffs = N*c+(eBands[i]<<LM);
775
436k
            blen = (eBands[i+1]-eBands[i])<<LM;
776
19.0M
            for (j=0;j<blen;j++)
777
18.6M
            {
778
18.6M
               seed = celt_lcg_rand(seed);
779
18.6M
               X[boffs+j] = SHL32((celt_norm)((opus_int32)seed>>20), NORM_SHIFT-14);
780
18.6M
            }
781
436k
            renormalise_vector(X+boffs, blen, Q31ONE, st->arch);
782
436k
         }
783
104k
      }
784
70.3k
      st->rng = seed;
785
786
70.3k
      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));
787
788
      /* Run the postfilter with the last parameters. */
789
104k
      c=0; do {
790
104k
         st->postfilter_period=IMAX(st->postfilter_period, COMBFILTER_MINPERIOD);
791
104k
         st->postfilter_period_old=IMAX(st->postfilter_period_old, COMBFILTER_MINPERIOD);
792
104k
         comb_filter(out_syn[c], out_syn[c], st->postfilter_period_old, st->postfilter_period, mode->shortMdctSize,
793
104k
               st->postfilter_gain_old, st->postfilter_gain, st->postfilter_tapset_old, st->postfilter_tapset,
794
104k
               mode->window, overlap, st->arch);
795
104k
         if (LM!=0)
796
98.1k
            comb_filter(out_syn[c]+mode->shortMdctSize, out_syn[c]+mode->shortMdctSize, st->postfilter_period, st->postfilter_period, N-mode->shortMdctSize,
797
98.1k
                  st->postfilter_gain, st->postfilter_gain, st->postfilter_tapset, st->postfilter_tapset,
798
98.1k
                  mode->window, overlap, st->arch);
799
800
104k
      } while (++c<C);
801
70.3k
      st->postfilter_period_old = st->postfilter_period;
802
70.3k
      st->postfilter_gain_old = st->postfilter_gain;
803
70.3k
      st->postfilter_tapset_old = st->postfilter_tapset;
804
805
70.3k
      st->prefilter_and_fold = 0;
806
      /* Skip regular PLC until we get two consecutive packets. */
807
70.3k
      st->skip_plc = 1;
808
267k
   } else {
809
267k
      int exc_length;
810
      /* Pitch-based PLC */
811
267k
      const celt_coef *window;
812
267k
      opus_val16 *exc;
813
267k
      opus_val16 fade = Q15ONE;
814
267k
      int pitch_index;
815
267k
      int curr_neural;
816
267k
      int last_neural;
817
267k
      VARDECL(opus_val16, _exc);
818
267k
      VARDECL(opus_val16, fir_tmp);
819
820
267k
      curr_neural = curr_frame_type == FRAME_PLC_NEURAL || curr_frame_type == FRAME_DRED;
821
267k
      last_neural = st->last_frame_type == FRAME_PLC_NEURAL || st->last_frame_type == FRAME_DRED;
822
267k
      if (st->last_frame_type != FRAME_PLC_PERIODIC && !(last_neural && curr_neural))
823
149k
      {
824
149k
         st->last_pitch_index = pitch_index = celt_plc_pitch_search(st, decode_mem, C, st->arch);
825
149k
      } else {
826
118k
         pitch_index = st->last_pitch_index;
827
118k
         fade = QCONST16(.8f,15);
828
118k
      }
829
#ifdef ENABLE_DEEP_PLC
830
      if (curr_neural && !last_neural) update_plc_state(lpcnet, decode_mem, &st->plc_preemphasis_mem, C);
831
#endif
832
833
      /* We want the excitation for 2 pitch periods in order to look for a
834
         decaying signal, but we can't get more than MAX_PERIOD. */
835
267k
      exc_length = IMIN(2*pitch_index, max_period);
836
837
267k
      ALLOC(_exc, max_period+CELT_LPC_ORDER, opus_val16);
838
267k
      ALLOC(fir_tmp, exc_length, opus_val16);
839
267k
      exc = _exc+CELT_LPC_ORDER;
840
267k
      window = mode->window;
841
423k
      c=0; do {
842
423k
         opus_val16 decay;
843
423k
         opus_val16 attenuation;
844
423k
         opus_val32 S1=0;
845
423k
         celt_sig *buf;
846
423k
         int extrapolation_offset;
847
423k
         int extrapolation_len;
848
423k
         int j;
849
850
423k
         buf = decode_mem[c];
851
495M
         for (i=0;i<max_period+CELT_LPC_ORDER;i++)
852
495M
            exc[i-CELT_LPC_ORDER] = SROUND16(buf[decode_buffer_size-max_period-CELT_LPC_ORDER+i], SIG_SHIFT);
853
854
423k
         if (st->last_frame_type != FRAME_PLC_PERIODIC && !(last_neural && curr_neural))
855
235k
         {
856
235k
            opus_val32 ac[CELT_LPC_ORDER+1];
857
            /* Compute LPC coefficients for the last MAX_PERIOD samples before
858
               the first loss so we can work in the excitation-filter domain. */
859
235k
            _celt_autocorr(exc, ac, window, overlap,
860
235k
                   CELT_LPC_ORDER, max_period, st->arch);
861
            /* Add a noise floor of -40 dB. */
862
#ifdef FIXED_POINT
863
98.6k
            ac[0] += SHR32(ac[0],13);
864
#else
865
            ac[0] *= 1.0001f;
866
#endif
867
            /* Use lag windowing to stabilize the Levinson-Durbin recursion. */
868
5.88M
            for (i=1;i<=CELT_LPC_ORDER;i++)
869
5.65M
            {
870
               /*ac[i] *= exp(-.5*(2*M_PI*.002*i)*(2*M_PI*.002*i));*/
871
#ifdef FIXED_POINT
872
2.36M
               ac[i] -= MULT16_32_Q15(2*i*i, ac[i]);
873
#else
874
               ac[i] -= ac[i]*(0.008f*0.008f)*i*i;
875
#endif
876
5.65M
            }
877
235k
            _celt_lpc(lpc+c*CELT_LPC_ORDER, ac, CELT_LPC_ORDER);
878
#ifdef FIXED_POINT
879
         /* For fixed-point, apply bandwidth expansion until we can guarantee that
880
            no overflow can happen in the IIR filter. This means:
881
            32768*sum(abs(filter)) < 2^31 */
882
133k
         while (1) {
883
133k
            opus_val16 tmp=Q15ONE;
884
133k
            opus_val32 sum=QCONST16(1., SIG_SHIFT);
885
3.33M
            for (i=0;i<CELT_LPC_ORDER;i++)
886
3.19M
               sum += ABS16(lpc[c*CELT_LPC_ORDER+i]);
887
133k
            if (sum < 65535) break;
888
864k
            for (i=0;i<CELT_LPC_ORDER;i++)
889
829k
            {
890
829k
               tmp = MULT16_16_Q15(QCONST16(.99f,15), tmp);
891
829k
               lpc[c*CELT_LPC_ORDER+i] = MULT16_16_Q15(lpc[c*CELT_LPC_ORDER+i], tmp);
892
829k
            }
893
34.5k
         }
894
#endif
895
235k
         }
896
         /* Initialize the LPC history with the samples just before the start
897
            of the region for which we're computing the excitation. */
898
423k
         {
899
            /* Compute the excitation for exc_length samples before the loss. We need the copy
900
               because celt_fir() cannot filter in-place. */
901
423k
            celt_fir(exc+max_period-exc_length, lpc+c*CELT_LPC_ORDER,
902
423k
                  fir_tmp, exc_length, CELT_LPC_ORDER, st->arch);
903
423k
            OPUS_COPY(exc+max_period-exc_length, fir_tmp, exc_length);
904
423k
         }
905
906
         /* Check if the waveform is decaying, and if so how fast.
907
            We do this to avoid adding energy when concealing in a segment
908
            with decaying energy. */
909
423k
         {
910
423k
            opus_val32 E1=1, E2=1;
911
423k
            int decay_length;
912
#ifdef FIXED_POINT
913
170k
            int shift = IMAX(0,2*celt_zlog2(celt_maxabs16(&exc[max_period-exc_length], exc_length))-20);
914
#ifdef ENABLE_QEXT
915
81.1k
            if (st->qext_scale==2) shift++;
916
#endif
917
#endif
918
423k
            decay_length = exc_length>>1;
919
119M
            for (i=0;i<decay_length;i++)
920
119M
            {
921
119M
               opus_val16 e;
922
119M
               e = exc[max_period-decay_length+i];
923
119M
               E1 += SHR32(MULT16_16(e, e), shift);
924
119M
               e = exc[max_period-2*decay_length+i];
925
119M
               E2 += SHR32(MULT16_16(e, e), shift);
926
119M
            }
927
423k
            E1 = MIN32(E1, E2);
928
423k
            decay = celt_sqrt(frac_div32(SHR32(E1, 1), E2));
929
423k
         }
930
931
         /* Move the decoder memory one frame to the left to give us room to
932
            add the data for the new frame. We ignore the overlap that extends
933
            past the end of the buffer, because we aren't going to use it. */
934
423k
         OPUS_MOVE(buf, buf+N, decode_buffer_size-N);
935
936
         /* Extrapolate from the end of the excitation with a period of
937
            "pitch_index", scaling down each period by an additional factor of
938
            "decay". */
939
423k
         extrapolation_offset = max_period-pitch_index;
940
         /* We need to extrapolate enough samples to cover a complete MDCT
941
            window (including overlap/2 samples on both sides). */
942
423k
         extrapolation_len = N+overlap;
943
         /* We also apply fading if this is not the first loss. */
944
423k
         attenuation = MULT16_16_Q15(fade, decay);
945
159M
         for (i=j=0;i<extrapolation_len;i++,j++)
946
159M
         {
947
159M
            opus_val16 tmp;
948
159M
            if (j >= pitch_index) {
949
512k
               j -= pitch_index;
950
512k
               attenuation = MULT16_16_Q15(attenuation, decay);
951
512k
            }
952
159M
            buf[decode_buffer_size-N+i] =
953
159M
                  SHL32(EXTEND32(MULT16_16_Q15(attenuation,
954
159M
                        exc[extrapolation_offset+j])), SIG_SHIFT);
955
            /* Compute the energy of the previously decoded signal whose
956
               excitation we're copying. */
957
159M
            tmp = SROUND16(
958
159M
                  buf[decode_buffer_size-max_period-N+extrapolation_offset+j],
959
159M
                  SIG_SHIFT);
960
159M
            S1 += SHR32(MULT16_16(tmp, tmp), 11);
961
159M
         }
962
423k
         {
963
423k
            opus_val16 lpc_mem[CELT_LPC_ORDER];
964
            /* Copy the last decoded samples (prior to the overlap region) to
965
               synthesis filter memory so we can have a continuous signal. */
966
10.5M
            for (i=0;i<CELT_LPC_ORDER;i++)
967
10.1M
               lpc_mem[i] = SROUND16(buf[decode_buffer_size-N-1-i], SIG_SHIFT);
968
            /* Apply the synthesis filter to convert the excitation back into
969
               the signal domain. */
970
423k
            celt_iir(buf+decode_buffer_size-N, lpc+c*CELT_LPC_ORDER,
971
423k
                  buf+decode_buffer_size-N, extrapolation_len, CELT_LPC_ORDER,
972
423k
                  lpc_mem, st->arch);
973
#ifdef FIXED_POINT
974
57.6M
            for (i=0; i < extrapolation_len; i++)
975
57.4M
               buf[decode_buffer_size-N+i] = SATURATE(buf[decode_buffer_size-N+i], SIG_SAT);
976
#endif
977
423k
         }
978
979
         /* Check if the synthesis energy is higher than expected, which can
980
            happen with the signal changes during our window. If so,
981
            attenuate. */
982
423k
         {
983
423k
            opus_val32 S2=0;
984
159M
            for (i=0;i<extrapolation_len;i++)
985
159M
            {
986
159M
               opus_val16 tmp = SROUND16(buf[decode_buffer_size-N+i], SIG_SHIFT);
987
159M
               S2 += SHR32(MULT16_16(tmp, tmp), 11);
988
159M
            }
989
            /* This checks for an "explosion" in the synthesis. */
990
#ifdef FIXED_POINT
991
170k
            if (!(S1 > SHR32(S2,2)))
992
#else
993
            /* The float test is written this way to catch NaNs in the output
994
               of the IIR filter at the same time. */
995
253k
            if (!(S1 > 0.2f*S2))
996
35.2k
#endif
997
128k
            {
998
46.5M
               for (i=0;i<extrapolation_len;i++)
999
46.4M
                  buf[decode_buffer_size-N+i] = 0;
1000
295k
            } else if (S1 < S2)
1001
76.8k
            {
1002
76.8k
               opus_val16 ratio = celt_sqrt(frac_div32(SHR32(S1,1)+1,S2+1));
1003
10.3M
               for (i=0;i<overlap;i++)
1004
10.2M
               {
1005
10.2M
                  opus_val16 tmp_g = Q15ONE
1006
10.2M
                        - MULT16_16_Q15(COEF2VAL16(window[i]), Q15ONE-ratio);
1007
10.2M
                  buf[decode_buffer_size-N+i] =
1008
10.2M
                        MULT16_32_Q15(tmp_g, buf[decode_buffer_size-N+i]);
1009
10.2M
               }
1010
15.2M
               for (i=overlap;i<extrapolation_len;i++)
1011
15.1M
               {
1012
15.1M
                  buf[decode_buffer_size-N+i] =
1013
15.1M
                        MULT16_32_Q15(ratio, buf[decode_buffer_size-N+i]);
1014
15.1M
               }
1015
76.8k
            }
1016
423k
         }
1017
1018
423k
      } while (++c<C);
1019
1020
#ifdef ENABLE_DEEP_PLC
1021
      if (curr_neural) {
1022
         float overlap_mem;
1023
         int samples_needed16k;
1024
         celt_sig *buf;
1025
         VARDECL(float, buf_copy);
1026
         buf = decode_mem[0];
1027
         ALLOC(buf_copy, C*overlap, float);
1028
         c=0; do {
1029
            OPUS_COPY(buf_copy+c*overlap, &decode_mem[c][decode_buffer_size-N], overlap);
1030
         } while (++c<C);
1031
1032
         /* Need enough samples from the PLC to cover the frame size, resampling delay,
1033
            and the overlap at the end. */
1034
         samples_needed16k = (N+SINC_ORDER+overlap)/3;
1035
         if (!last_neural) {
1036
            st->plc_fill = 0;
1037
         }
1038
         while (st->plc_fill < samples_needed16k) {
1039
            lpcnet_plc_conceal(lpcnet, &st->plc_pcm[st->plc_fill]);
1040
            st->plc_fill += FRAME_SIZE;
1041
         }
1042
         /* Resample to 48 kHz. */
1043
         for (i=0;i<(N+overlap)/3;i++) {
1044
            int j;
1045
            float sum;
1046
            for (sum=0, j=0;j<17;j++) sum += 3*st->plc_pcm[i+j]*sinc_filter[3*j];
1047
            buf[decode_buffer_size-N+3*i] = sum;
1048
            for (sum=0, j=0;j<16;j++) sum += 3*st->plc_pcm[i+j+1]*sinc_filter[3*j+2];
1049
            buf[decode_buffer_size-N+3*i+1] = sum;
1050
            for (sum=0, j=0;j<16;j++) sum += 3*st->plc_pcm[i+j+1]*sinc_filter[3*j+1];
1051
            buf[decode_buffer_size-N+3*i+2] = sum;
1052
         }
1053
         OPUS_MOVE(st->plc_pcm, &st->plc_pcm[N/3], st->plc_fill-N/3);
1054
         st->plc_fill -= N/3;
1055
         for (i=0;i<N;i++) {
1056
            float tmp = buf[decode_buffer_size-N+i];
1057
            buf[decode_buffer_size-N+i] -= PREEMPHASIS*st->plc_preemphasis_mem;
1058
            st->plc_preemphasis_mem = tmp;
1059
         }
1060
         overlap_mem = st->plc_preemphasis_mem;
1061
         for (i=0;i<overlap;i++) {
1062
            float tmp = buf[decode_buffer_size+i];
1063
            buf[decode_buffer_size+i] -= PREEMPHASIS*overlap_mem;
1064
            overlap_mem = tmp;
1065
         }
1066
         /* For now, we just do mono PLC. */
1067
         if (C==2) OPUS_COPY(decode_mem[1], decode_mem[0], decode_buffer_size+overlap);
1068
         c=0; do {
1069
            /* Cross-fade with 48-kHz non-neural PLC for the first 2.5 ms to avoid a discontinuity. */
1070
            if (!last_neural) {
1071
               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];
1072
            }
1073
         } while (++c<C);
1074
      }
1075
#endif
1076
267k
      st->prefilter_and_fold = 1;
1077
267k
   }
1078
1079
   /* Saturate to something large to avoid wrap-around. */
1080
337k
   st->loss_duration = IMIN(10000, loss_duration+(1<<LM));
1081
337k
   st->plc_duration = IMIN(10000, st->plc_duration+(1<<LM));
1082
#ifdef ENABLE_DRED
1083
   if (curr_frame_type == FRAME_DRED) {
1084
      st->plc_duration = 0;
1085
      st->skip_plc = 0;
1086
   }
1087
#endif
1088
337k
   st->last_frame_type = curr_frame_type;
1089
337k
   RESTORE_STACK;
1090
337k
}
celt_decoder.c:celt_decode_lost
Line
Count
Source
680
65.2k
{
681
65.2k
   int c;
682
65.2k
   int i;
683
65.2k
   const int C = st->channels;
684
65.2k
   celt_sig *decode_mem[2];
685
65.2k
   celt_sig *out_syn[2];
686
65.2k
   opus_val16 *lpc;
687
65.2k
   celt_glog *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE;
688
65.2k
   const OpusCustomMode *mode;
689
65.2k
   int nbEBands;
690
65.2k
   int overlap;
691
65.2k
   int start;
692
65.2k
   int loss_duration;
693
65.2k
   int curr_frame_type;
694
65.2k
   const opus_int16 *eBands;
695
65.2k
   int decode_buffer_size;
696
65.2k
   int max_period;
697
#ifdef ENABLE_QEXT
698
   int qext_scale;
699
#endif
700
65.2k
   SAVE_STACK;
701
#ifdef ENABLE_QEXT
702
   qext_scale = st->qext_scale;
703
#endif
704
65.2k
   decode_buffer_size = QEXT_SCALE(DECODE_BUFFER_SIZE);
705
65.2k
   max_period = QEXT_SCALE(MAX_PERIOD);
706
65.2k
   mode = st->mode;
707
65.2k
   nbEBands = mode->nbEBands;
708
65.2k
   overlap = mode->overlap;
709
65.2k
   eBands = mode->eBands;
710
711
106k
   c=0; do {
712
106k
      decode_mem[c] = st->_decode_mem + c*(decode_buffer_size+overlap);
713
106k
      out_syn[c] = decode_mem[c]+decode_buffer_size-N;
714
106k
   } while (++c<C);
715
65.2k
   oldBandE = (celt_glog*)(st->_decode_mem+(decode_buffer_size+overlap)*C);
716
65.2k
   oldLogE = oldBandE + 2*nbEBands;
717
65.2k
   oldLogE2 = oldLogE + 2*nbEBands;
718
65.2k
   backgroundLogE = oldLogE2 + 2*nbEBands;
719
65.2k
   lpc = (opus_val16*)(backgroundLogE + 2*nbEBands);
720
721
65.2k
   loss_duration = st->loss_duration;
722
65.2k
   start = st->start;
723
65.2k
   curr_frame_type = FRAME_PLC_PERIODIC;
724
65.2k
   if (st->plc_duration >= 40 || start != 0 || st->skip_plc)
725
12.0k
      curr_frame_type = FRAME_PLC_NOISE;
726
#ifdef ENABLE_DEEP_PLC
727
   if (start == 0 && lpcnet != NULL && st->mode->Fs != 96000 && lpcnet->loaded)
728
   {
729
      if (st->complexity >= 5 && st->plc_duration < 80 && !st->skip_plc)
730
         curr_frame_type = FRAME_PLC_NEURAL;
731
#ifdef ENABLE_DRED
732
      if (lpcnet->fec_fill_pos > lpcnet->fec_read_pos)
733
         curr_frame_type = FRAME_DRED;
734
#endif
735
   }
736
#endif
737
738
65.2k
   if (curr_frame_type == FRAME_PLC_NOISE)
739
12.0k
   {
740
      /* Noise-based PLC/CNG */
741
12.0k
      VARDECL(celt_norm, X);
742
12.0k
      opus_uint32 seed;
743
12.0k
      int end;
744
12.0k
      int effEnd;
745
12.0k
      celt_glog decay;
746
12.0k
      end = st->end;
747
12.0k
      effEnd = IMAX(start, IMIN(end, mode->effEBands));
748
749
12.0k
      ALLOC(X, C*N, celt_norm);   /**< Interleaved normalised MDCTs */
750
17.4k
      c=0; do {
751
17.4k
         OPUS_MOVE(decode_mem[c], decode_mem[c]+N,
752
17.4k
               decode_buffer_size-N+overlap);
753
17.4k
      } while (++c<C);
754
755
12.0k
      if (st->prefilter_and_fold) {
756
348
         prefilter_and_fold(st, N);
757
348
      }
758
759
      /* Energy decay */
760
12.0k
      decay = loss_duration==0 ? GCONST(1.5f) : GCONST(.5f);
761
12.0k
      c=0; do
762
17.4k
      {
763
92.1k
         for (i=start;i<end;i++)
764
74.6k
            oldBandE[c*nbEBands+i] = MAXG(backgroundLogE[c*nbEBands+i], oldBandE[c*nbEBands+i] - decay);
765
17.4k
      } while (++c<C);
766
12.0k
      seed = st->rng;
767
29.5k
      for (c=0;c<C;c++)
768
17.4k
      {
769
92.1k
         for (i=start;i<effEnd;i++)
770
74.6k
         {
771
74.6k
            int j;
772
74.6k
            int boffs;
773
74.6k
            int blen;
774
74.6k
            boffs = N*c+(eBands[i]<<LM);
775
74.6k
            blen = (eBands[i+1]-eBands[i])<<LM;
776
3.01M
            for (j=0;j<blen;j++)
777
2.94M
            {
778
2.94M
               seed = celt_lcg_rand(seed);
779
2.94M
               X[boffs+j] = SHL32((celt_norm)((opus_int32)seed>>20), NORM_SHIFT-14);
780
2.94M
            }
781
74.6k
            renormalise_vector(X+boffs, blen, Q31ONE, st->arch);
782
74.6k
         }
783
17.4k
      }
784
12.0k
      st->rng = seed;
785
786
12.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));
787
788
      /* Run the postfilter with the last parameters. */
789
17.4k
      c=0; do {
790
17.4k
         st->postfilter_period=IMAX(st->postfilter_period, COMBFILTER_MINPERIOD);
791
17.4k
         st->postfilter_period_old=IMAX(st->postfilter_period_old, COMBFILTER_MINPERIOD);
792
17.4k
         comb_filter(out_syn[c], out_syn[c], st->postfilter_period_old, st->postfilter_period, mode->shortMdctSize,
793
17.4k
               st->postfilter_gain_old, st->postfilter_gain, st->postfilter_tapset_old, st->postfilter_tapset,
794
17.4k
               mode->window, overlap, st->arch);
795
17.4k
         if (LM!=0)
796
16.0k
            comb_filter(out_syn[c]+mode->shortMdctSize, out_syn[c]+mode->shortMdctSize, st->postfilter_period, st->postfilter_period, N-mode->shortMdctSize,
797
16.0k
                  st->postfilter_gain, st->postfilter_gain, st->postfilter_tapset, st->postfilter_tapset,
798
16.0k
                  mode->window, overlap, st->arch);
799
800
17.4k
      } while (++c<C);
801
12.0k
      st->postfilter_period_old = st->postfilter_period;
802
12.0k
      st->postfilter_gain_old = st->postfilter_gain;
803
12.0k
      st->postfilter_tapset_old = st->postfilter_tapset;
804
805
12.0k
      st->prefilter_and_fold = 0;
806
      /* Skip regular PLC until we get two consecutive packets. */
807
12.0k
      st->skip_plc = 1;
808
53.1k
   } else {
809
53.1k
      int exc_length;
810
      /* Pitch-based PLC */
811
53.1k
      const celt_coef *window;
812
53.1k
      opus_val16 *exc;
813
53.1k
      opus_val16 fade = Q15ONE;
814
53.1k
      int pitch_index;
815
53.1k
      int curr_neural;
816
53.1k
      int last_neural;
817
53.1k
      VARDECL(opus_val16, _exc);
818
53.1k
      VARDECL(opus_val16, fir_tmp);
819
820
53.1k
      curr_neural = curr_frame_type == FRAME_PLC_NEURAL || curr_frame_type == FRAME_DRED;
821
53.1k
      last_neural = st->last_frame_type == FRAME_PLC_NEURAL || st->last_frame_type == FRAME_DRED;
822
53.1k
      if (st->last_frame_type != FRAME_PLC_PERIODIC && !(last_neural && curr_neural))
823
30.0k
      {
824
30.0k
         st->last_pitch_index = pitch_index = celt_plc_pitch_search(st, decode_mem, C, st->arch);
825
30.0k
      } else {
826
23.0k
         pitch_index = st->last_pitch_index;
827
23.0k
         fade = QCONST16(.8f,15);
828
23.0k
      }
829
#ifdef ENABLE_DEEP_PLC
830
      if (curr_neural && !last_neural) update_plc_state(lpcnet, decode_mem, &st->plc_preemphasis_mem, C);
831
#endif
832
833
      /* We want the excitation for 2 pitch periods in order to look for a
834
         decaying signal, but we can't get more than MAX_PERIOD. */
835
53.1k
      exc_length = IMIN(2*pitch_index, max_period);
836
837
53.1k
      ALLOC(_exc, max_period+CELT_LPC_ORDER, opus_val16);
838
53.1k
      ALLOC(fir_tmp, exc_length, opus_val16);
839
53.1k
      exc = _exc+CELT_LPC_ORDER;
840
53.1k
      window = mode->window;
841
88.8k
      c=0; do {
842
88.8k
         opus_val16 decay;
843
88.8k
         opus_val16 attenuation;
844
88.8k
         opus_val32 S1=0;
845
88.8k
         celt_sig *buf;
846
88.8k
         int extrapolation_offset;
847
88.8k
         int extrapolation_len;
848
88.8k
         int j;
849
850
88.8k
         buf = decode_mem[c];
851
93.2M
         for (i=0;i<max_period+CELT_LPC_ORDER;i++)
852
93.1M
            exc[i-CELT_LPC_ORDER] = SROUND16(buf[decode_buffer_size-max_period-CELT_LPC_ORDER+i], SIG_SHIFT);
853
854
88.8k
         if (st->last_frame_type != FRAME_PLC_PERIODIC && !(last_neural && curr_neural))
855
50.2k
         {
856
50.2k
            opus_val32 ac[CELT_LPC_ORDER+1];
857
            /* Compute LPC coefficients for the last MAX_PERIOD samples before
858
               the first loss so we can work in the excitation-filter domain. */
859
50.2k
            _celt_autocorr(exc, ac, window, overlap,
860
50.2k
                   CELT_LPC_ORDER, max_period, st->arch);
861
            /* Add a noise floor of -40 dB. */
862
50.2k
#ifdef FIXED_POINT
863
50.2k
            ac[0] += SHR32(ac[0],13);
864
#else
865
            ac[0] *= 1.0001f;
866
#endif
867
            /* Use lag windowing to stabilize the Levinson-Durbin recursion. */
868
1.25M
            for (i=1;i<=CELT_LPC_ORDER;i++)
869
1.20M
            {
870
               /*ac[i] *= exp(-.5*(2*M_PI*.002*i)*(2*M_PI*.002*i));*/
871
1.20M
#ifdef FIXED_POINT
872
1.20M
               ac[i] -= MULT16_32_Q15(2*i*i, ac[i]);
873
#else
874
               ac[i] -= ac[i]*(0.008f*0.008f)*i*i;
875
#endif
876
1.20M
            }
877
50.2k
            _celt_lpc(lpc+c*CELT_LPC_ORDER, ac, CELT_LPC_ORDER);
878
50.2k
#ifdef FIXED_POINT
879
         /* For fixed-point, apply bandwidth expansion until we can guarantee that
880
            no overflow can happen in the IIR filter. This means:
881
            32768*sum(abs(filter)) < 2^31 */
882
55.7k
         while (1) {
883
55.7k
            opus_val16 tmp=Q15ONE;
884
55.7k
            opus_val32 sum=QCONST16(1., SIG_SHIFT);
885
1.39M
            for (i=0;i<CELT_LPC_ORDER;i++)
886
1.33M
               sum += ABS16(lpc[c*CELT_LPC_ORDER+i]);
887
55.7k
            if (sum < 65535) break;
888
135k
            for (i=0;i<CELT_LPC_ORDER;i++)
889
130k
            {
890
130k
               tmp = MULT16_16_Q15(QCONST16(.99f,15), tmp);
891
130k
               lpc[c*CELT_LPC_ORDER+i] = MULT16_16_Q15(lpc[c*CELT_LPC_ORDER+i], tmp);
892
130k
            }
893
5.43k
         }
894
50.2k
#endif
895
50.2k
         }
896
         /* Initialize the LPC history with the samples just before the start
897
            of the region for which we're computing the excitation. */
898
88.8k
         {
899
            /* Compute the excitation for exc_length samples before the loss. We need the copy
900
               because celt_fir() cannot filter in-place. */
901
88.8k
            celt_fir(exc+max_period-exc_length, lpc+c*CELT_LPC_ORDER,
902
88.8k
                  fir_tmp, exc_length, CELT_LPC_ORDER, st->arch);
903
88.8k
            OPUS_COPY(exc+max_period-exc_length, fir_tmp, exc_length);
904
88.8k
         }
905
906
         /* Check if the waveform is decaying, and if so how fast.
907
            We do this to avoid adding energy when concealing in a segment
908
            with decaying energy. */
909
88.8k
         {
910
88.8k
            opus_val32 E1=1, E2=1;
911
88.8k
            int decay_length;
912
88.8k
#ifdef FIXED_POINT
913
88.8k
            int shift = IMAX(0,2*celt_zlog2(celt_maxabs16(&exc[max_period-exc_length], exc_length))-20);
914
#ifdef ENABLE_QEXT
915
            if (st->qext_scale==2) shift++;
916
#endif
917
88.8k
#endif
918
88.8k
            decay_length = exc_length>>1;
919
22.3M
            for (i=0;i<decay_length;i++)
920
22.2M
            {
921
22.2M
               opus_val16 e;
922
22.2M
               e = exc[max_period-decay_length+i];
923
22.2M
               E1 += SHR32(MULT16_16(e, e), shift);
924
22.2M
               e = exc[max_period-2*decay_length+i];
925
22.2M
               E2 += SHR32(MULT16_16(e, e), shift);
926
22.2M
            }
927
88.8k
            E1 = MIN32(E1, E2);
928
88.8k
            decay = celt_sqrt(frac_div32(SHR32(E1, 1), E2));
929
88.8k
         }
930
931
         /* Move the decoder memory one frame to the left to give us room to
932
            add the data for the new frame. We ignore the overlap that extends
933
            past the end of the buffer, because we aren't going to use it. */
934
88.8k
         OPUS_MOVE(buf, buf+N, decode_buffer_size-N);
935
936
         /* Extrapolate from the end of the excitation with a period of
937
            "pitch_index", scaling down each period by an additional factor of
938
            "decay". */
939
88.8k
         extrapolation_offset = max_period-pitch_index;
940
         /* We need to extrapolate enough samples to cover a complete MDCT
941
            window (including overlap/2 samples on both sides). */
942
88.8k
         extrapolation_len = N+overlap;
943
         /* We also apply fading if this is not the first loss. */
944
88.8k
         attenuation = MULT16_16_Q15(fade, decay);
945
27.8M
         for (i=j=0;i<extrapolation_len;i++,j++)
946
27.7M
         {
947
27.7M
            opus_val16 tmp;
948
27.7M
            if (j >= pitch_index) {
949
102k
               j -= pitch_index;
950
102k
               attenuation = MULT16_16_Q15(attenuation, decay);
951
102k
            }
952
27.7M
            buf[decode_buffer_size-N+i] =
953
27.7M
                  SHL32(EXTEND32(MULT16_16_Q15(attenuation,
954
27.7M
                        exc[extrapolation_offset+j])), SIG_SHIFT);
955
            /* Compute the energy of the previously decoded signal whose
956
               excitation we're copying. */
957
27.7M
            tmp = SROUND16(
958
27.7M
                  buf[decode_buffer_size-max_period-N+extrapolation_offset+j],
959
27.7M
                  SIG_SHIFT);
960
27.7M
            S1 += SHR32(MULT16_16(tmp, tmp), 11);
961
27.7M
         }
962
88.8k
         {
963
88.8k
            opus_val16 lpc_mem[CELT_LPC_ORDER];
964
            /* Copy the last decoded samples (prior to the overlap region) to
965
               synthesis filter memory so we can have a continuous signal. */
966
2.22M
            for (i=0;i<CELT_LPC_ORDER;i++)
967
2.13M
               lpc_mem[i] = SROUND16(buf[decode_buffer_size-N-1-i], SIG_SHIFT);
968
            /* Apply the synthesis filter to convert the excitation back into
969
               the signal domain. */
970
88.8k
            celt_iir(buf+decode_buffer_size-N, lpc+c*CELT_LPC_ORDER,
971
88.8k
                  buf+decode_buffer_size-N, extrapolation_len, CELT_LPC_ORDER,
972
88.8k
                  lpc_mem, st->arch);
973
88.8k
#ifdef FIXED_POINT
974
27.8M
            for (i=0; i < extrapolation_len; i++)
975
27.7M
               buf[decode_buffer_size-N+i] = SATURATE(buf[decode_buffer_size-N+i], SIG_SAT);
976
88.8k
#endif
977
88.8k
         }
978
979
         /* Check if the synthesis energy is higher than expected, which can
980
            happen with the signal changes during our window. If so,
981
            attenuate. */
982
88.8k
         {
983
88.8k
            opus_val32 S2=0;
984
27.8M
            for (i=0;i<extrapolation_len;i++)
985
27.7M
            {
986
27.7M
               opus_val16 tmp = SROUND16(buf[decode_buffer_size-N+i], SIG_SHIFT);
987
27.7M
               S2 += SHR32(MULT16_16(tmp, tmp), 11);
988
27.7M
            }
989
            /* This checks for an "explosion" in the synthesis. */
990
88.8k
#ifdef FIXED_POINT
991
88.8k
            if (!(S1 > SHR32(S2,2)))
992
#else
993
            /* The float test is written this way to catch NaNs in the output
994
               of the IIR filter at the same time. */
995
            if (!(S1 > 0.2f*S2))
996
#endif
997
49.8k
            {
998
14.6M
               for (i=0;i<extrapolation_len;i++)
999
14.5M
                  buf[decode_buffer_size-N+i] = 0;
1000
49.8k
            } else if (S1 < S2)
1001
20.9k
            {
1002
20.9k
               opus_val16 ratio = celt_sqrt(frac_div32(SHR32(S1,1)+1,S2+1));
1003
2.53M
               for (i=0;i<overlap;i++)
1004
2.51M
               {
1005
2.51M
                  opus_val16 tmp_g = Q15ONE
1006
2.51M
                        - MULT16_16_Q15(COEF2VAL16(window[i]), Q15ONE-ratio);
1007
2.51M
                  buf[decode_buffer_size-N+i] =
1008
2.51M
                        MULT16_32_Q15(tmp_g, buf[decode_buffer_size-N+i]);
1009
2.51M
               }
1010
4.20M
               for (i=overlap;i<extrapolation_len;i++)
1011
4.18M
               {
1012
4.18M
                  buf[decode_buffer_size-N+i] =
1013
4.18M
                        MULT16_32_Q15(ratio, buf[decode_buffer_size-N+i]);
1014
4.18M
               }
1015
20.9k
            }
1016
88.8k
         }
1017
1018
88.8k
      } while (++c<C);
1019
1020
#ifdef ENABLE_DEEP_PLC
1021
      if (curr_neural) {
1022
         float overlap_mem;
1023
         int samples_needed16k;
1024
         celt_sig *buf;
1025
         VARDECL(float, buf_copy);
1026
         buf = decode_mem[0];
1027
         ALLOC(buf_copy, C*overlap, float);
1028
         c=0; do {
1029
            OPUS_COPY(buf_copy+c*overlap, &decode_mem[c][decode_buffer_size-N], overlap);
1030
         } while (++c<C);
1031
1032
         /* Need enough samples from the PLC to cover the frame size, resampling delay,
1033
            and the overlap at the end. */
1034
         samples_needed16k = (N+SINC_ORDER+overlap)/3;
1035
         if (!last_neural) {
1036
            st->plc_fill = 0;
1037
         }
1038
         while (st->plc_fill < samples_needed16k) {
1039
            lpcnet_plc_conceal(lpcnet, &st->plc_pcm[st->plc_fill]);
1040
            st->plc_fill += FRAME_SIZE;
1041
         }
1042
         /* Resample to 48 kHz. */
1043
         for (i=0;i<(N+overlap)/3;i++) {
1044
            int j;
1045
            float sum;
1046
            for (sum=0, j=0;j<17;j++) sum += 3*st->plc_pcm[i+j]*sinc_filter[3*j];
1047
            buf[decode_buffer_size-N+3*i] = sum;
1048
            for (sum=0, j=0;j<16;j++) sum += 3*st->plc_pcm[i+j+1]*sinc_filter[3*j+2];
1049
            buf[decode_buffer_size-N+3*i+1] = sum;
1050
            for (sum=0, j=0;j<16;j++) sum += 3*st->plc_pcm[i+j+1]*sinc_filter[3*j+1];
1051
            buf[decode_buffer_size-N+3*i+2] = sum;
1052
         }
1053
         OPUS_MOVE(st->plc_pcm, &st->plc_pcm[N/3], st->plc_fill-N/3);
1054
         st->plc_fill -= N/3;
1055
         for (i=0;i<N;i++) {
1056
            float tmp = buf[decode_buffer_size-N+i];
1057
            buf[decode_buffer_size-N+i] -= PREEMPHASIS*st->plc_preemphasis_mem;
1058
            st->plc_preemphasis_mem = tmp;
1059
         }
1060
         overlap_mem = st->plc_preemphasis_mem;
1061
         for (i=0;i<overlap;i++) {
1062
            float tmp = buf[decode_buffer_size+i];
1063
            buf[decode_buffer_size+i] -= PREEMPHASIS*overlap_mem;
1064
            overlap_mem = tmp;
1065
         }
1066
         /* For now, we just do mono PLC. */
1067
         if (C==2) OPUS_COPY(decode_mem[1], decode_mem[0], decode_buffer_size+overlap);
1068
         c=0; do {
1069
            /* Cross-fade with 48-kHz non-neural PLC for the first 2.5 ms to avoid a discontinuity. */
1070
            if (!last_neural) {
1071
               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];
1072
            }
1073
         } while (++c<C);
1074
      }
1075
#endif
1076
53.1k
      st->prefilter_and_fold = 1;
1077
53.1k
   }
1078
1079
   /* Saturate to something large to avoid wrap-around. */
1080
65.2k
   st->loss_duration = IMIN(10000, loss_duration+(1<<LM));
1081
65.2k
   st->plc_duration = IMIN(10000, st->plc_duration+(1<<LM));
1082
#ifdef ENABLE_DRED
1083
   if (curr_frame_type == FRAME_DRED) {
1084
      st->plc_duration = 0;
1085
      st->skip_plc = 0;
1086
   }
1087
#endif
1088
65.2k
   st->last_frame_type = curr_frame_type;
1089
65.2k
   RESTORE_STACK;
1090
65.2k
}
celt_decoder.c:celt_decode_lost
Line
Count
Source
680
61.9k
{
681
61.9k
   int c;
682
61.9k
   int i;
683
61.9k
   const int C = st->channels;
684
61.9k
   celt_sig *decode_mem[2];
685
61.9k
   celt_sig *out_syn[2];
686
61.9k
   opus_val16 *lpc;
687
61.9k
   celt_glog *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE;
688
61.9k
   const OpusCustomMode *mode;
689
61.9k
   int nbEBands;
690
61.9k
   int overlap;
691
61.9k
   int start;
692
61.9k
   int loss_duration;
693
61.9k
   int curr_frame_type;
694
61.9k
   const opus_int16 *eBands;
695
61.9k
   int decode_buffer_size;
696
61.9k
   int max_period;
697
61.9k
#ifdef ENABLE_QEXT
698
61.9k
   int qext_scale;
699
61.9k
#endif
700
61.9k
   SAVE_STACK;
701
61.9k
#ifdef ENABLE_QEXT
702
61.9k
   qext_scale = st->qext_scale;
703
61.9k
#endif
704
61.9k
   decode_buffer_size = QEXT_SCALE(DECODE_BUFFER_SIZE);
705
61.9k
   max_period = QEXT_SCALE(MAX_PERIOD);
706
61.9k
   mode = st->mode;
707
61.9k
   nbEBands = mode->nbEBands;
708
61.9k
   overlap = mode->overlap;
709
61.9k
   eBands = mode->eBands;
710
711
91.1k
   c=0; do {
712
91.1k
      decode_mem[c] = st->_decode_mem + c*(decode_buffer_size+overlap);
713
91.1k
      out_syn[c] = decode_mem[c]+decode_buffer_size-N;
714
91.1k
   } while (++c<C);
715
61.9k
   oldBandE = (celt_glog*)(st->_decode_mem+(decode_buffer_size+overlap)*C);
716
61.9k
   oldLogE = oldBandE + 2*nbEBands;
717
61.9k
   oldLogE2 = oldLogE + 2*nbEBands;
718
61.9k
   backgroundLogE = oldLogE2 + 2*nbEBands;
719
61.9k
   lpc = (opus_val16*)(backgroundLogE + 2*nbEBands);
720
721
61.9k
   loss_duration = st->loss_duration;
722
61.9k
   start = st->start;
723
61.9k
   curr_frame_type = FRAME_PLC_PERIODIC;
724
61.9k
   if (st->plc_duration >= 40 || start != 0 || st->skip_plc)
725
6.73k
      curr_frame_type = FRAME_PLC_NOISE;
726
#ifdef ENABLE_DEEP_PLC
727
   if (start == 0 && lpcnet != NULL && st->mode->Fs != 96000 && lpcnet->loaded)
728
   {
729
      if (st->complexity >= 5 && st->plc_duration < 80 && !st->skip_plc)
730
         curr_frame_type = FRAME_PLC_NEURAL;
731
#ifdef ENABLE_DRED
732
      if (lpcnet->fec_fill_pos > lpcnet->fec_read_pos)
733
         curr_frame_type = FRAME_DRED;
734
#endif
735
   }
736
#endif
737
738
61.9k
   if (curr_frame_type == FRAME_PLC_NOISE)
739
6.73k
   {
740
      /* Noise-based PLC/CNG */
741
6.73k
      VARDECL(celt_norm, X);
742
6.73k
      opus_uint32 seed;
743
6.73k
      int end;
744
6.73k
      int effEnd;
745
6.73k
      celt_glog decay;
746
6.73k
      end = st->end;
747
6.73k
      effEnd = IMAX(start, IMIN(end, mode->effEBands));
748
749
6.73k
      ALLOC(X, C*N, celt_norm);   /**< Interleaved normalised MDCTs */
750
9.95k
      c=0; do {
751
9.95k
         OPUS_MOVE(decode_mem[c], decode_mem[c]+N,
752
9.95k
               decode_buffer_size-N+overlap);
753
9.95k
      } while (++c<C);
754
755
6.73k
      if (st->prefilter_and_fold) {
756
169
         prefilter_and_fold(st, N);
757
169
      }
758
759
      /* Energy decay */
760
6.73k
      decay = loss_duration==0 ? GCONST(1.5f) : GCONST(.5f);
761
6.73k
      c=0; do
762
9.95k
      {
763
47.4k
         for (i=start;i<end;i++)
764
37.4k
            oldBandE[c*nbEBands+i] = MAXG(backgroundLogE[c*nbEBands+i], oldBandE[c*nbEBands+i] - decay);
765
9.95k
      } while (++c<C);
766
6.73k
      seed = st->rng;
767
16.6k
      for (c=0;c<C;c++)
768
9.95k
      {
769
47.4k
         for (i=start;i<effEnd;i++)
770
37.4k
         {
771
37.4k
            int j;
772
37.4k
            int boffs;
773
37.4k
            int blen;
774
37.4k
            boffs = N*c+(eBands[i]<<LM);
775
37.4k
            blen = (eBands[i+1]-eBands[i])<<LM;
776
1.49M
            for (j=0;j<blen;j++)
777
1.45M
            {
778
1.45M
               seed = celt_lcg_rand(seed);
779
1.45M
               X[boffs+j] = SHL32((celt_norm)((opus_int32)seed>>20), NORM_SHIFT-14);
780
1.45M
            }
781
37.4k
            renormalise_vector(X+boffs, blen, Q31ONE, st->arch);
782
37.4k
         }
783
9.95k
      }
784
6.73k
      st->rng = seed;
785
786
6.73k
      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));
787
788
      /* Run the postfilter with the last parameters. */
789
9.95k
      c=0; do {
790
9.95k
         st->postfilter_period=IMAX(st->postfilter_period, COMBFILTER_MINPERIOD);
791
9.95k
         st->postfilter_period_old=IMAX(st->postfilter_period_old, COMBFILTER_MINPERIOD);
792
9.95k
         comb_filter(out_syn[c], out_syn[c], st->postfilter_period_old, st->postfilter_period, mode->shortMdctSize,
793
9.95k
               st->postfilter_gain_old, st->postfilter_gain, st->postfilter_tapset_old, st->postfilter_tapset,
794
9.95k
               mode->window, overlap, st->arch);
795
9.95k
         if (LM!=0)
796
9.34k
            comb_filter(out_syn[c]+mode->shortMdctSize, out_syn[c]+mode->shortMdctSize, st->postfilter_period, st->postfilter_period, N-mode->shortMdctSize,
797
9.34k
                  st->postfilter_gain, st->postfilter_gain, st->postfilter_tapset, st->postfilter_tapset,
798
9.34k
                  mode->window, overlap, st->arch);
799
800
9.95k
      } while (++c<C);
801
6.73k
      st->postfilter_period_old = st->postfilter_period;
802
6.73k
      st->postfilter_gain_old = st->postfilter_gain;
803
6.73k
      st->postfilter_tapset_old = st->postfilter_tapset;
804
805
6.73k
      st->prefilter_and_fold = 0;
806
      /* Skip regular PLC until we get two consecutive packets. */
807
6.73k
      st->skip_plc = 1;
808
55.1k
   } else {
809
55.1k
      int exc_length;
810
      /* Pitch-based PLC */
811
55.1k
      const celt_coef *window;
812
55.1k
      opus_val16 *exc;
813
55.1k
      opus_val16 fade = Q15ONE;
814
55.1k
      int pitch_index;
815
55.1k
      int curr_neural;
816
55.1k
      int last_neural;
817
55.1k
      VARDECL(opus_val16, _exc);
818
55.1k
      VARDECL(opus_val16, fir_tmp);
819
820
55.1k
      curr_neural = curr_frame_type == FRAME_PLC_NEURAL || curr_frame_type == FRAME_DRED;
821
55.1k
      last_neural = st->last_frame_type == FRAME_PLC_NEURAL || st->last_frame_type == FRAME_DRED;
822
55.1k
      if (st->last_frame_type != FRAME_PLC_PERIODIC && !(last_neural && curr_neural))
823
33.2k
      {
824
33.2k
         st->last_pitch_index = pitch_index = celt_plc_pitch_search(st, decode_mem, C, st->arch);
825
33.2k
      } else {
826
21.9k
         pitch_index = st->last_pitch_index;
827
21.9k
         fade = QCONST16(.8f,15);
828
21.9k
      }
829
#ifdef ENABLE_DEEP_PLC
830
      if (curr_neural && !last_neural) update_plc_state(lpcnet, decode_mem, &st->plc_preemphasis_mem, C);
831
#endif
832
833
      /* We want the excitation for 2 pitch periods in order to look for a
834
         decaying signal, but we can't get more than MAX_PERIOD. */
835
55.1k
      exc_length = IMIN(2*pitch_index, max_period);
836
837
55.1k
      ALLOC(_exc, max_period+CELT_LPC_ORDER, opus_val16);
838
55.1k
      ALLOC(fir_tmp, exc_length, opus_val16);
839
55.1k
      exc = _exc+CELT_LPC_ORDER;
840
55.1k
      window = mode->window;
841
81.1k
      c=0; do {
842
81.1k
         opus_val16 decay;
843
81.1k
         opus_val16 attenuation;
844
81.1k
         opus_val32 S1=0;
845
81.1k
         celt_sig *buf;
846
81.1k
         int extrapolation_offset;
847
81.1k
         int extrapolation_len;
848
81.1k
         int j;
849
850
81.1k
         buf = decode_mem[c];
851
105M
         for (i=0;i<max_period+CELT_LPC_ORDER;i++)
852
105M
            exc[i-CELT_LPC_ORDER] = SROUND16(buf[decode_buffer_size-max_period-CELT_LPC_ORDER+i], SIG_SHIFT);
853
854
81.1k
         if (st->last_frame_type != FRAME_PLC_PERIODIC && !(last_neural && curr_neural))
855
48.4k
         {
856
48.4k
            opus_val32 ac[CELT_LPC_ORDER+1];
857
            /* Compute LPC coefficients for the last MAX_PERIOD samples before
858
               the first loss so we can work in the excitation-filter domain. */
859
48.4k
            _celt_autocorr(exc, ac, window, overlap,
860
48.4k
                   CELT_LPC_ORDER, max_period, st->arch);
861
            /* Add a noise floor of -40 dB. */
862
48.4k
#ifdef FIXED_POINT
863
48.4k
            ac[0] += SHR32(ac[0],13);
864
#else
865
            ac[0] *= 1.0001f;
866
#endif
867
            /* Use lag windowing to stabilize the Levinson-Durbin recursion. */
868
1.21M
            for (i=1;i<=CELT_LPC_ORDER;i++)
869
1.16M
            {
870
               /*ac[i] *= exp(-.5*(2*M_PI*.002*i)*(2*M_PI*.002*i));*/
871
1.16M
#ifdef FIXED_POINT
872
1.16M
               ac[i] -= MULT16_32_Q15(2*i*i, ac[i]);
873
#else
874
               ac[i] -= ac[i]*(0.008f*0.008f)*i*i;
875
#endif
876
1.16M
            }
877
48.4k
            _celt_lpc(lpc+c*CELT_LPC_ORDER, ac, CELT_LPC_ORDER);
878
48.4k
#ifdef FIXED_POINT
879
         /* For fixed-point, apply bandwidth expansion until we can guarantee that
880
            no overflow can happen in the IIR filter. This means:
881
            32768*sum(abs(filter)) < 2^31 */
882
77.5k
         while (1) {
883
77.5k
            opus_val16 tmp=Q15ONE;
884
77.5k
            opus_val32 sum=QCONST16(1., SIG_SHIFT);
885
1.93M
            for (i=0;i<CELT_LPC_ORDER;i++)
886
1.86M
               sum += ABS16(lpc[c*CELT_LPC_ORDER+i]);
887
77.5k
            if (sum < 65535) break;
888
728k
            for (i=0;i<CELT_LPC_ORDER;i++)
889
698k
            {
890
698k
               tmp = MULT16_16_Q15(QCONST16(.99f,15), tmp);
891
698k
               lpc[c*CELT_LPC_ORDER+i] = MULT16_16_Q15(lpc[c*CELT_LPC_ORDER+i], tmp);
892
698k
            }
893
29.1k
         }
894
48.4k
#endif
895
48.4k
         }
896
         /* Initialize the LPC history with the samples just before the start
897
            of the region for which we're computing the excitation. */
898
81.1k
         {
899
            /* Compute the excitation for exc_length samples before the loss. We need the copy
900
               because celt_fir() cannot filter in-place. */
901
81.1k
            celt_fir(exc+max_period-exc_length, lpc+c*CELT_LPC_ORDER,
902
81.1k
                  fir_tmp, exc_length, CELT_LPC_ORDER, st->arch);
903
81.1k
            OPUS_COPY(exc+max_period-exc_length, fir_tmp, exc_length);
904
81.1k
         }
905
906
         /* Check if the waveform is decaying, and if so how fast.
907
            We do this to avoid adding energy when concealing in a segment
908
            with decaying energy. */
909
81.1k
         {
910
81.1k
            opus_val32 E1=1, E2=1;
911
81.1k
            int decay_length;
912
81.1k
#ifdef FIXED_POINT
913
81.1k
            int shift = IMAX(0,2*celt_zlog2(celt_maxabs16(&exc[max_period-exc_length], exc_length))-20);
914
81.1k
#ifdef ENABLE_QEXT
915
81.1k
            if (st->qext_scale==2) shift++;
916
81.1k
#endif
917
81.1k
#endif
918
81.1k
            decay_length = exc_length>>1;
919
25.7M
            for (i=0;i<decay_length;i++)
920
25.6M
            {
921
25.6M
               opus_val16 e;
922
25.6M
               e = exc[max_period-decay_length+i];
923
25.6M
               E1 += SHR32(MULT16_16(e, e), shift);
924
25.6M
               e = exc[max_period-2*decay_length+i];
925
25.6M
               E2 += SHR32(MULT16_16(e, e), shift);
926
25.6M
            }
927
81.1k
            E1 = MIN32(E1, E2);
928
81.1k
            decay = celt_sqrt(frac_div32(SHR32(E1, 1), E2));
929
81.1k
         }
930
931
         /* Move the decoder memory one frame to the left to give us room to
932
            add the data for the new frame. We ignore the overlap that extends
933
            past the end of the buffer, because we aren't going to use it. */
934
81.1k
         OPUS_MOVE(buf, buf+N, decode_buffer_size-N);
935
936
         /* Extrapolate from the end of the excitation with a period of
937
            "pitch_index", scaling down each period by an additional factor of
938
            "decay". */
939
81.1k
         extrapolation_offset = max_period-pitch_index;
940
         /* We need to extrapolate enough samples to cover a complete MDCT
941
            window (including overlap/2 samples on both sides). */
942
81.1k
         extrapolation_len = N+overlap;
943
         /* We also apply fading if this is not the first loss. */
944
81.1k
         attenuation = MULT16_16_Q15(fade, decay);
945
29.8M
         for (i=j=0;i<extrapolation_len;i++,j++)
946
29.7M
         {
947
29.7M
            opus_val16 tmp;
948
29.7M
            if (j >= pitch_index) {
949
89.8k
               j -= pitch_index;
950
89.8k
               attenuation = MULT16_16_Q15(attenuation, decay);
951
89.8k
            }
952
29.7M
            buf[decode_buffer_size-N+i] =
953
29.7M
                  SHL32(EXTEND32(MULT16_16_Q15(attenuation,
954
29.7M
                        exc[extrapolation_offset+j])), SIG_SHIFT);
955
            /* Compute the energy of the previously decoded signal whose
956
               excitation we're copying. */
957
29.7M
            tmp = SROUND16(
958
29.7M
                  buf[decode_buffer_size-max_period-N+extrapolation_offset+j],
959
29.7M
                  SIG_SHIFT);
960
29.7M
            S1 += SHR32(MULT16_16(tmp, tmp), 11);
961
29.7M
         }
962
81.1k
         {
963
81.1k
            opus_val16 lpc_mem[CELT_LPC_ORDER];
964
            /* Copy the last decoded samples (prior to the overlap region) to
965
               synthesis filter memory so we can have a continuous signal. */
966
2.02M
            for (i=0;i<CELT_LPC_ORDER;i++)
967
1.94M
               lpc_mem[i] = SROUND16(buf[decode_buffer_size-N-1-i], SIG_SHIFT);
968
            /* Apply the synthesis filter to convert the excitation back into
969
               the signal domain. */
970
81.1k
            celt_iir(buf+decode_buffer_size-N, lpc+c*CELT_LPC_ORDER,
971
81.1k
                  buf+decode_buffer_size-N, extrapolation_len, CELT_LPC_ORDER,
972
81.1k
                  lpc_mem, st->arch);
973
81.1k
#ifdef FIXED_POINT
974
29.8M
            for (i=0; i < extrapolation_len; i++)
975
29.7M
               buf[decode_buffer_size-N+i] = SATURATE(buf[decode_buffer_size-N+i], SIG_SAT);
976
81.1k
#endif
977
81.1k
         }
978
979
         /* Check if the synthesis energy is higher than expected, which can
980
            happen with the signal changes during our window. If so,
981
            attenuate. */
982
81.1k
         {
983
81.1k
            opus_val32 S2=0;
984
29.8M
            for (i=0;i<extrapolation_len;i++)
985
29.7M
            {
986
29.7M
               opus_val16 tmp = SROUND16(buf[decode_buffer_size-N+i], SIG_SHIFT);
987
29.7M
               S2 += SHR32(MULT16_16(tmp, tmp), 11);
988
29.7M
            }
989
            /* This checks for an "explosion" in the synthesis. */
990
81.1k
#ifdef FIXED_POINT
991
81.1k
            if (!(S1 > SHR32(S2,2)))
992
#else
993
            /* The float test is written this way to catch NaNs in the output
994
               of the IIR filter at the same time. */
995
            if (!(S1 > 0.2f*S2))
996
#endif
997
43.4k
            {
998
14.9M
               for (i=0;i<extrapolation_len;i++)
999
14.9M
                  buf[decode_buffer_size-N+i] = 0;
1000
43.4k
            } else if (S1 < S2)
1001
12.6k
            {
1002
12.6k
               opus_val16 ratio = celt_sqrt(frac_div32(SHR32(S1,1)+1,S2+1));
1003
1.87M
               for (i=0;i<overlap;i++)
1004
1.86M
               {
1005
1.86M
                  opus_val16 tmp_g = Q15ONE
1006
1.86M
                        - MULT16_16_Q15(COEF2VAL16(window[i]), Q15ONE-ratio);
1007
1.86M
                  buf[decode_buffer_size-N+i] =
1008
1.86M
                        MULT16_32_Q15(tmp_g, buf[decode_buffer_size-N+i]);
1009
1.86M
               }
1010
2.87M
               for (i=overlap;i<extrapolation_len;i++)
1011
2.86M
               {
1012
2.86M
                  buf[decode_buffer_size-N+i] =
1013
2.86M
                        MULT16_32_Q15(ratio, buf[decode_buffer_size-N+i]);
1014
2.86M
               }
1015
12.6k
            }
1016
81.1k
         }
1017
1018
81.1k
      } while (++c<C);
1019
1020
#ifdef ENABLE_DEEP_PLC
1021
      if (curr_neural) {
1022
         float overlap_mem;
1023
         int samples_needed16k;
1024
         celt_sig *buf;
1025
         VARDECL(float, buf_copy);
1026
         buf = decode_mem[0];
1027
         ALLOC(buf_copy, C*overlap, float);
1028
         c=0; do {
1029
            OPUS_COPY(buf_copy+c*overlap, &decode_mem[c][decode_buffer_size-N], overlap);
1030
         } while (++c<C);
1031
1032
         /* Need enough samples from the PLC to cover the frame size, resampling delay,
1033
            and the overlap at the end. */
1034
         samples_needed16k = (N+SINC_ORDER+overlap)/3;
1035
         if (!last_neural) {
1036
            st->plc_fill = 0;
1037
         }
1038
         while (st->plc_fill < samples_needed16k) {
1039
            lpcnet_plc_conceal(lpcnet, &st->plc_pcm[st->plc_fill]);
1040
            st->plc_fill += FRAME_SIZE;
1041
         }
1042
         /* Resample to 48 kHz. */
1043
         for (i=0;i<(N+overlap)/3;i++) {
1044
            int j;
1045
            float sum;
1046
            for (sum=0, j=0;j<17;j++) sum += 3*st->plc_pcm[i+j]*sinc_filter[3*j];
1047
            buf[decode_buffer_size-N+3*i] = sum;
1048
            for (sum=0, j=0;j<16;j++) sum += 3*st->plc_pcm[i+j+1]*sinc_filter[3*j+2];
1049
            buf[decode_buffer_size-N+3*i+1] = sum;
1050
            for (sum=0, j=0;j<16;j++) sum += 3*st->plc_pcm[i+j+1]*sinc_filter[3*j+1];
1051
            buf[decode_buffer_size-N+3*i+2] = sum;
1052
         }
1053
         OPUS_MOVE(st->plc_pcm, &st->plc_pcm[N/3], st->plc_fill-N/3);
1054
         st->plc_fill -= N/3;
1055
         for (i=0;i<N;i++) {
1056
            float tmp = buf[decode_buffer_size-N+i];
1057
            buf[decode_buffer_size-N+i] -= PREEMPHASIS*st->plc_preemphasis_mem;
1058
            st->plc_preemphasis_mem = tmp;
1059
         }
1060
         overlap_mem = st->plc_preemphasis_mem;
1061
         for (i=0;i<overlap;i++) {
1062
            float tmp = buf[decode_buffer_size+i];
1063
            buf[decode_buffer_size+i] -= PREEMPHASIS*overlap_mem;
1064
            overlap_mem = tmp;
1065
         }
1066
         /* For now, we just do mono PLC. */
1067
         if (C==2) OPUS_COPY(decode_mem[1], decode_mem[0], decode_buffer_size+overlap);
1068
         c=0; do {
1069
            /* Cross-fade with 48-kHz non-neural PLC for the first 2.5 ms to avoid a discontinuity. */
1070
            if (!last_neural) {
1071
               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];
1072
            }
1073
         } while (++c<C);
1074
      }
1075
#endif
1076
55.1k
      st->prefilter_and_fold = 1;
1077
55.1k
   }
1078
1079
   /* Saturate to something large to avoid wrap-around. */
1080
61.9k
   st->loss_duration = IMIN(10000, loss_duration+(1<<LM));
1081
61.9k
   st->plc_duration = IMIN(10000, st->plc_duration+(1<<LM));
1082
#ifdef ENABLE_DRED
1083
   if (curr_frame_type == FRAME_DRED) {
1084
      st->plc_duration = 0;
1085
      st->skip_plc = 0;
1086
   }
1087
#endif
1088
61.9k
   st->last_frame_type = curr_frame_type;
1089
61.9k
   RESTORE_STACK;
1090
61.9k
}
celt_decoder.c:celt_decode_lost
Line
Count
Source
680
105k
{
681
105k
   int c;
682
105k
   int i;
683
105k
   const int C = st->channels;
684
105k
   celt_sig *decode_mem[2];
685
105k
   celt_sig *out_syn[2];
686
105k
   opus_val16 *lpc;
687
105k
   celt_glog *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE;
688
105k
   const OpusCustomMode *mode;
689
105k
   int nbEBands;
690
105k
   int overlap;
691
105k
   int start;
692
105k
   int loss_duration;
693
105k
   int curr_frame_type;
694
105k
   const opus_int16 *eBands;
695
105k
   int decode_buffer_size;
696
105k
   int max_period;
697
105k
#ifdef ENABLE_QEXT
698
105k
   int qext_scale;
699
105k
#endif
700
105k
   SAVE_STACK;
701
105k
#ifdef ENABLE_QEXT
702
105k
   qext_scale = st->qext_scale;
703
105k
#endif
704
105k
   decode_buffer_size = QEXT_SCALE(DECODE_BUFFER_SIZE);
705
105k
   max_period = QEXT_SCALE(MAX_PERIOD);
706
105k
   mode = st->mode;
707
105k
   nbEBands = mode->nbEBands;
708
105k
   overlap = mode->overlap;
709
105k
   eBands = mode->eBands;
710
711
165k
   c=0; do {
712
165k
      decode_mem[c] = st->_decode_mem + c*(decode_buffer_size+overlap);
713
165k
      out_syn[c] = decode_mem[c]+decode_buffer_size-N;
714
165k
   } while (++c<C);
715
105k
   oldBandE = (celt_glog*)(st->_decode_mem+(decode_buffer_size+overlap)*C);
716
105k
   oldLogE = oldBandE + 2*nbEBands;
717
105k
   oldLogE2 = oldLogE + 2*nbEBands;
718
105k
   backgroundLogE = oldLogE2 + 2*nbEBands;
719
105k
   lpc = (opus_val16*)(backgroundLogE + 2*nbEBands);
720
721
105k
   loss_duration = st->loss_duration;
722
105k
   start = st->start;
723
105k
   curr_frame_type = FRAME_PLC_PERIODIC;
724
105k
   if (st->plc_duration >= 40 || start != 0 || st->skip_plc)
725
25.7k
      curr_frame_type = FRAME_PLC_NOISE;
726
#ifdef ENABLE_DEEP_PLC
727
   if (start == 0 && lpcnet != NULL && st->mode->Fs != 96000 && lpcnet->loaded)
728
   {
729
      if (st->complexity >= 5 && st->plc_duration < 80 && !st->skip_plc)
730
         curr_frame_type = FRAME_PLC_NEURAL;
731
#ifdef ENABLE_DRED
732
      if (lpcnet->fec_fill_pos > lpcnet->fec_read_pos)
733
         curr_frame_type = FRAME_DRED;
734
#endif
735
   }
736
#endif
737
738
105k
   if (curr_frame_type == FRAME_PLC_NOISE)
739
25.7k
   {
740
      /* Noise-based PLC/CNG */
741
25.7k
      VARDECL(celt_norm, X);
742
25.7k
      opus_uint32 seed;
743
25.7k
      int end;
744
25.7k
      int effEnd;
745
25.7k
      celt_glog decay;
746
25.7k
      end = st->end;
747
25.7k
      effEnd = IMAX(start, IMIN(end, mode->effEBands));
748
749
25.7k
      ALLOC(X, C*N, celt_norm);   /**< Interleaved normalised MDCTs */
750
38.7k
      c=0; do {
751
38.7k
         OPUS_MOVE(decode_mem[c], decode_mem[c]+N,
752
38.7k
               decode_buffer_size-N+overlap);
753
38.7k
      } while (++c<C);
754
755
25.7k
      if (st->prefilter_and_fold) {
756
527
         prefilter_and_fold(st, N);
757
527
      }
758
759
      /* Energy decay */
760
25.7k
      decay = loss_duration==0 ? GCONST(1.5f) : GCONST(.5f);
761
25.7k
      c=0; do
762
38.7k
      {
763
200k
         for (i=start;i<end;i++)
764
162k
            oldBandE[c*nbEBands+i] = MAXG(backgroundLogE[c*nbEBands+i], oldBandE[c*nbEBands+i] - decay);
765
38.7k
      } while (++c<C);
766
25.7k
      seed = st->rng;
767
64.4k
      for (c=0;c<C;c++)
768
38.7k
      {
769
200k
         for (i=start;i<effEnd;i++)
770
162k
         {
771
162k
            int j;
772
162k
            int boffs;
773
162k
            int blen;
774
162k
            boffs = N*c+(eBands[i]<<LM);
775
162k
            blen = (eBands[i+1]-eBands[i])<<LM;
776
7.27M
            for (j=0;j<blen;j++)
777
7.11M
            {
778
7.11M
               seed = celt_lcg_rand(seed);
779
7.11M
               X[boffs+j] = SHL32((celt_norm)((opus_int32)seed>>20), NORM_SHIFT-14);
780
7.11M
            }
781
162k
            renormalise_vector(X+boffs, blen, Q31ONE, st->arch);
782
162k
         }
783
38.7k
      }
784
25.7k
      st->rng = seed;
785
786
25.7k
      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));
787
788
      /* Run the postfilter with the last parameters. */
789
38.7k
      c=0; do {
790
38.7k
         st->postfilter_period=IMAX(st->postfilter_period, COMBFILTER_MINPERIOD);
791
38.7k
         st->postfilter_period_old=IMAX(st->postfilter_period_old, COMBFILTER_MINPERIOD);
792
38.7k
         comb_filter(out_syn[c], out_syn[c], st->postfilter_period_old, st->postfilter_period, mode->shortMdctSize,
793
38.7k
               st->postfilter_gain_old, st->postfilter_gain, st->postfilter_tapset_old, st->postfilter_tapset,
794
38.7k
               mode->window, overlap, st->arch);
795
38.7k
         if (LM!=0)
796
36.3k
            comb_filter(out_syn[c]+mode->shortMdctSize, out_syn[c]+mode->shortMdctSize, st->postfilter_period, st->postfilter_period, N-mode->shortMdctSize,
797
36.3k
                  st->postfilter_gain, st->postfilter_gain, st->postfilter_tapset, st->postfilter_tapset,
798
36.3k
                  mode->window, overlap, st->arch);
799
800
38.7k
      } while (++c<C);
801
25.7k
      st->postfilter_period_old = st->postfilter_period;
802
25.7k
      st->postfilter_gain_old = st->postfilter_gain;
803
25.7k
      st->postfilter_tapset_old = st->postfilter_tapset;
804
805
25.7k
      st->prefilter_and_fold = 0;
806
      /* Skip regular PLC until we get two consecutive packets. */
807
25.7k
      st->skip_plc = 1;
808
79.3k
   } else {
809
79.3k
      int exc_length;
810
      /* Pitch-based PLC */
811
79.3k
      const celt_coef *window;
812
79.3k
      opus_val16 *exc;
813
79.3k
      opus_val16 fade = Q15ONE;
814
79.3k
      int pitch_index;
815
79.3k
      int curr_neural;
816
79.3k
      int last_neural;
817
79.3k
      VARDECL(opus_val16, _exc);
818
79.3k
      VARDECL(opus_val16, fir_tmp);
819
820
79.3k
      curr_neural = curr_frame_type == FRAME_PLC_NEURAL || curr_frame_type == FRAME_DRED;
821
79.3k
      last_neural = st->last_frame_type == FRAME_PLC_NEURAL || st->last_frame_type == FRAME_DRED;
822
79.3k
      if (st->last_frame_type != FRAME_PLC_PERIODIC && !(last_neural && curr_neural))
823
42.9k
      {
824
42.9k
         st->last_pitch_index = pitch_index = celt_plc_pitch_search(st, decode_mem, C, st->arch);
825
42.9k
      } else {
826
36.4k
         pitch_index = st->last_pitch_index;
827
36.4k
         fade = QCONST16(.8f,15);
828
36.4k
      }
829
#ifdef ENABLE_DEEP_PLC
830
      if (curr_neural && !last_neural) update_plc_state(lpcnet, decode_mem, &st->plc_preemphasis_mem, C);
831
#endif
832
833
      /* We want the excitation for 2 pitch periods in order to look for a
834
         decaying signal, but we can't get more than MAX_PERIOD. */
835
79.3k
      exc_length = IMIN(2*pitch_index, max_period);
836
837
79.3k
      ALLOC(_exc, max_period+CELT_LPC_ORDER, opus_val16);
838
79.3k
      ALLOC(fir_tmp, exc_length, opus_val16);
839
79.3k
      exc = _exc+CELT_LPC_ORDER;
840
79.3k
      window = mode->window;
841
126k
      c=0; do {
842
126k
         opus_val16 decay;
843
126k
         opus_val16 attenuation;
844
126k
         opus_val32 S1=0;
845
126k
         celt_sig *buf;
846
126k
         int extrapolation_offset;
847
126k
         int extrapolation_len;
848
126k
         int j;
849
850
126k
         buf = decode_mem[c];
851
148M
         for (i=0;i<max_period+CELT_LPC_ORDER;i++)
852
148M
            exc[i-CELT_LPC_ORDER] = SROUND16(buf[decode_buffer_size-max_period-CELT_LPC_ORDER+i], SIG_SHIFT);
853
854
126k
         if (st->last_frame_type != FRAME_PLC_PERIODIC && !(last_neural && curr_neural))
855
68.4k
         {
856
68.4k
            opus_val32 ac[CELT_LPC_ORDER+1];
857
            /* Compute LPC coefficients for the last MAX_PERIOD samples before
858
               the first loss so we can work in the excitation-filter domain. */
859
68.4k
            _celt_autocorr(exc, ac, window, overlap,
860
68.4k
                   CELT_LPC_ORDER, max_period, st->arch);
861
            /* Add a noise floor of -40 dB. */
862
#ifdef FIXED_POINT
863
            ac[0] += SHR32(ac[0],13);
864
#else
865
68.4k
            ac[0] *= 1.0001f;
866
68.4k
#endif
867
            /* Use lag windowing to stabilize the Levinson-Durbin recursion. */
868
1.71M
            for (i=1;i<=CELT_LPC_ORDER;i++)
869
1.64M
            {
870
               /*ac[i] *= exp(-.5*(2*M_PI*.002*i)*(2*M_PI*.002*i));*/
871
#ifdef FIXED_POINT
872
               ac[i] -= MULT16_32_Q15(2*i*i, ac[i]);
873
#else
874
1.64M
               ac[i] -= ac[i]*(0.008f*0.008f)*i*i;
875
1.64M
#endif
876
1.64M
            }
877
68.4k
            _celt_lpc(lpc+c*CELT_LPC_ORDER, ac, CELT_LPC_ORDER);
878
#ifdef FIXED_POINT
879
         /* For fixed-point, apply bandwidth expansion until we can guarantee that
880
            no overflow can happen in the IIR filter. This means:
881
            32768*sum(abs(filter)) < 2^31 */
882
         while (1) {
883
            opus_val16 tmp=Q15ONE;
884
            opus_val32 sum=QCONST16(1., SIG_SHIFT);
885
            for (i=0;i<CELT_LPC_ORDER;i++)
886
               sum += ABS16(lpc[c*CELT_LPC_ORDER+i]);
887
            if (sum < 65535) break;
888
            for (i=0;i<CELT_LPC_ORDER;i++)
889
            {
890
               tmp = MULT16_16_Q15(QCONST16(.99f,15), tmp);
891
               lpc[c*CELT_LPC_ORDER+i] = MULT16_16_Q15(lpc[c*CELT_LPC_ORDER+i], tmp);
892
            }
893
         }
894
#endif
895
68.4k
         }
896
         /* Initialize the LPC history with the samples just before the start
897
            of the region for which we're computing the excitation. */
898
126k
         {
899
            /* Compute the excitation for exc_length samples before the loss. We need the copy
900
               because celt_fir() cannot filter in-place. */
901
126k
            celt_fir(exc+max_period-exc_length, lpc+c*CELT_LPC_ORDER,
902
126k
                  fir_tmp, exc_length, CELT_LPC_ORDER, st->arch);
903
126k
            OPUS_COPY(exc+max_period-exc_length, fir_tmp, exc_length);
904
126k
         }
905
906
         /* Check if the waveform is decaying, and if so how fast.
907
            We do this to avoid adding energy when concealing in a segment
908
            with decaying energy. */
909
126k
         {
910
126k
            opus_val32 E1=1, E2=1;
911
126k
            int decay_length;
912
#ifdef FIXED_POINT
913
            int shift = IMAX(0,2*celt_zlog2(celt_maxabs16(&exc[max_period-exc_length], exc_length))-20);
914
#ifdef ENABLE_QEXT
915
            if (st->qext_scale==2) shift++;
916
#endif
917
#endif
918
126k
            decay_length = exc_length>>1;
919
35.8M
            for (i=0;i<decay_length;i++)
920
35.7M
            {
921
35.7M
               opus_val16 e;
922
35.7M
               e = exc[max_period-decay_length+i];
923
35.7M
               E1 += SHR32(MULT16_16(e, e), shift);
924
35.7M
               e = exc[max_period-2*decay_length+i];
925
35.7M
               E2 += SHR32(MULT16_16(e, e), shift);
926
35.7M
            }
927
126k
            E1 = MIN32(E1, E2);
928
126k
            decay = celt_sqrt(frac_div32(SHR32(E1, 1), E2));
929
126k
         }
930
931
         /* Move the decoder memory one frame to the left to give us room to
932
            add the data for the new frame. We ignore the overlap that extends
933
            past the end of the buffer, because we aren't going to use it. */
934
126k
         OPUS_MOVE(buf, buf+N, decode_buffer_size-N);
935
936
         /* Extrapolate from the end of the excitation with a period of
937
            "pitch_index", scaling down each period by an additional factor of
938
            "decay". */
939
126k
         extrapolation_offset = max_period-pitch_index;
940
         /* We need to extrapolate enough samples to cover a complete MDCT
941
            window (including overlap/2 samples on both sides). */
942
126k
         extrapolation_len = N+overlap;
943
         /* We also apply fading if this is not the first loss. */
944
126k
         attenuation = MULT16_16_Q15(fade, decay);
945
51.0M
         for (i=j=0;i<extrapolation_len;i++,j++)
946
50.8M
         {
947
50.8M
            opus_val16 tmp;
948
50.8M
            if (j >= pitch_index) {
949
160k
               j -= pitch_index;
950
160k
               attenuation = MULT16_16_Q15(attenuation, decay);
951
160k
            }
952
50.8M
            buf[decode_buffer_size-N+i] =
953
50.8M
                  SHL32(EXTEND32(MULT16_16_Q15(attenuation,
954
50.8M
                        exc[extrapolation_offset+j])), SIG_SHIFT);
955
            /* Compute the energy of the previously decoded signal whose
956
               excitation we're copying. */
957
50.8M
            tmp = SROUND16(
958
50.8M
                  buf[decode_buffer_size-max_period-N+extrapolation_offset+j],
959
50.8M
                  SIG_SHIFT);
960
50.8M
            S1 += SHR32(MULT16_16(tmp, tmp), 11);
961
50.8M
         }
962
126k
         {
963
126k
            opus_val16 lpc_mem[CELT_LPC_ORDER];
964
            /* Copy the last decoded samples (prior to the overlap region) to
965
               synthesis filter memory so we can have a continuous signal. */
966
3.17M
            for (i=0;i<CELT_LPC_ORDER;i++)
967
3.04M
               lpc_mem[i] = SROUND16(buf[decode_buffer_size-N-1-i], SIG_SHIFT);
968
            /* Apply the synthesis filter to convert the excitation back into
969
               the signal domain. */
970
126k
            celt_iir(buf+decode_buffer_size-N, lpc+c*CELT_LPC_ORDER,
971
126k
                  buf+decode_buffer_size-N, extrapolation_len, CELT_LPC_ORDER,
972
126k
                  lpc_mem, st->arch);
973
#ifdef FIXED_POINT
974
            for (i=0; i < extrapolation_len; i++)
975
               buf[decode_buffer_size-N+i] = SATURATE(buf[decode_buffer_size-N+i], SIG_SAT);
976
#endif
977
126k
         }
978
979
         /* Check if the synthesis energy is higher than expected, which can
980
            happen with the signal changes during our window. If so,
981
            attenuate. */
982
126k
         {
983
126k
            opus_val32 S2=0;
984
51.0M
            for (i=0;i<extrapolation_len;i++)
985
50.8M
            {
986
50.8M
               opus_val16 tmp = SROUND16(buf[decode_buffer_size-N+i], SIG_SHIFT);
987
50.8M
               S2 += SHR32(MULT16_16(tmp, tmp), 11);
988
50.8M
            }
989
            /* This checks for an "explosion" in the synthesis. */
990
#ifdef FIXED_POINT
991
            if (!(S1 > SHR32(S2,2)))
992
#else
993
            /* The float test is written this way to catch NaNs in the output
994
               of the IIR filter at the same time. */
995
126k
            if (!(S1 > 0.2f*S2))
996
17.6k
#endif
997
17.6k
            {
998
8.48M
               for (i=0;i<extrapolation_len;i++)
999
8.46M
                  buf[decode_buffer_size-N+i] = 0;
1000
109k
            } else if (S1 < S2)
1001
21.6k
            {
1002
21.6k
               opus_val16 ratio = celt_sqrt(frac_div32(SHR32(S1,1)+1,S2+1));
1003
2.95M
               for (i=0;i<overlap;i++)
1004
2.93M
               {
1005
2.93M
                  opus_val16 tmp_g = Q15ONE
1006
2.93M
                        - MULT16_16_Q15(COEF2VAL16(window[i]), Q15ONE-ratio);
1007
2.93M
                  buf[decode_buffer_size-N+i] =
1008
2.93M
                        MULT16_32_Q15(tmp_g, buf[decode_buffer_size-N+i]);
1009
2.93M
               }
1010
4.06M
               for (i=overlap;i<extrapolation_len;i++)
1011
4.04M
               {
1012
4.04M
                  buf[decode_buffer_size-N+i] =
1013
4.04M
                        MULT16_32_Q15(ratio, buf[decode_buffer_size-N+i]);
1014
4.04M
               }
1015
21.6k
            }
1016
126k
         }
1017
1018
126k
      } while (++c<C);
1019
1020
#ifdef ENABLE_DEEP_PLC
1021
      if (curr_neural) {
1022
         float overlap_mem;
1023
         int samples_needed16k;
1024
         celt_sig *buf;
1025
         VARDECL(float, buf_copy);
1026
         buf = decode_mem[0];
1027
         ALLOC(buf_copy, C*overlap, float);
1028
         c=0; do {
1029
            OPUS_COPY(buf_copy+c*overlap, &decode_mem[c][decode_buffer_size-N], overlap);
1030
         } while (++c<C);
1031
1032
         /* Need enough samples from the PLC to cover the frame size, resampling delay,
1033
            and the overlap at the end. */
1034
         samples_needed16k = (N+SINC_ORDER+overlap)/3;
1035
         if (!last_neural) {
1036
            st->plc_fill = 0;
1037
         }
1038
         while (st->plc_fill < samples_needed16k) {
1039
            lpcnet_plc_conceal(lpcnet, &st->plc_pcm[st->plc_fill]);
1040
            st->plc_fill += FRAME_SIZE;
1041
         }
1042
         /* Resample to 48 kHz. */
1043
         for (i=0;i<(N+overlap)/3;i++) {
1044
            int j;
1045
            float sum;
1046
            for (sum=0, j=0;j<17;j++) sum += 3*st->plc_pcm[i+j]*sinc_filter[3*j];
1047
            buf[decode_buffer_size-N+3*i] = sum;
1048
            for (sum=0, j=0;j<16;j++) sum += 3*st->plc_pcm[i+j+1]*sinc_filter[3*j+2];
1049
            buf[decode_buffer_size-N+3*i+1] = sum;
1050
            for (sum=0, j=0;j<16;j++) sum += 3*st->plc_pcm[i+j+1]*sinc_filter[3*j+1];
1051
            buf[decode_buffer_size-N+3*i+2] = sum;
1052
         }
1053
         OPUS_MOVE(st->plc_pcm, &st->plc_pcm[N/3], st->plc_fill-N/3);
1054
         st->plc_fill -= N/3;
1055
         for (i=0;i<N;i++) {
1056
            float tmp = buf[decode_buffer_size-N+i];
1057
            buf[decode_buffer_size-N+i] -= PREEMPHASIS*st->plc_preemphasis_mem;
1058
            st->plc_preemphasis_mem = tmp;
1059
         }
1060
         overlap_mem = st->plc_preemphasis_mem;
1061
         for (i=0;i<overlap;i++) {
1062
            float tmp = buf[decode_buffer_size+i];
1063
            buf[decode_buffer_size+i] -= PREEMPHASIS*overlap_mem;
1064
            overlap_mem = tmp;
1065
         }
1066
         /* For now, we just do mono PLC. */
1067
         if (C==2) OPUS_COPY(decode_mem[1], decode_mem[0], decode_buffer_size+overlap);
1068
         c=0; do {
1069
            /* Cross-fade with 48-kHz non-neural PLC for the first 2.5 ms to avoid a discontinuity. */
1070
            if (!last_neural) {
1071
               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];
1072
            }
1073
         } while (++c<C);
1074
      }
1075
#endif
1076
79.3k
      st->prefilter_and_fold = 1;
1077
79.3k
   }
1078
1079
   /* Saturate to something large to avoid wrap-around. */
1080
105k
   st->loss_duration = IMIN(10000, loss_duration+(1<<LM));
1081
105k
   st->plc_duration = IMIN(10000, st->plc_duration+(1<<LM));
1082
#ifdef ENABLE_DRED
1083
   if (curr_frame_type == FRAME_DRED) {
1084
      st->plc_duration = 0;
1085
      st->skip_plc = 0;
1086
   }
1087
#endif
1088
105k
   st->last_frame_type = curr_frame_type;
1089
105k
   RESTORE_STACK;
1090
105k
}
celt_decoder.c:celt_decode_lost
Line
Count
Source
680
105k
{
681
105k
   int c;
682
105k
   int i;
683
105k
   const int C = st->channels;
684
105k
   celt_sig *decode_mem[2];
685
105k
   celt_sig *out_syn[2];
686
105k
   opus_val16 *lpc;
687
105k
   celt_glog *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE;
688
105k
   const OpusCustomMode *mode;
689
105k
   int nbEBands;
690
105k
   int overlap;
691
105k
   int start;
692
105k
   int loss_duration;
693
105k
   int curr_frame_type;
694
105k
   const opus_int16 *eBands;
695
105k
   int decode_buffer_size;
696
105k
   int max_period;
697
#ifdef ENABLE_QEXT
698
   int qext_scale;
699
#endif
700
105k
   SAVE_STACK;
701
#ifdef ENABLE_QEXT
702
   qext_scale = st->qext_scale;
703
#endif
704
105k
   decode_buffer_size = QEXT_SCALE(DECODE_BUFFER_SIZE);
705
105k
   max_period = QEXT_SCALE(MAX_PERIOD);
706
105k
   mode = st->mode;
707
105k
   nbEBands = mode->nbEBands;
708
105k
   overlap = mode->overlap;
709
105k
   eBands = mode->eBands;
710
711
165k
   c=0; do {
712
165k
      decode_mem[c] = st->_decode_mem + c*(decode_buffer_size+overlap);
713
165k
      out_syn[c] = decode_mem[c]+decode_buffer_size-N;
714
165k
   } while (++c<C);
715
105k
   oldBandE = (celt_glog*)(st->_decode_mem+(decode_buffer_size+overlap)*C);
716
105k
   oldLogE = oldBandE + 2*nbEBands;
717
105k
   oldLogE2 = oldLogE + 2*nbEBands;
718
105k
   backgroundLogE = oldLogE2 + 2*nbEBands;
719
105k
   lpc = (opus_val16*)(backgroundLogE + 2*nbEBands);
720
721
105k
   loss_duration = st->loss_duration;
722
105k
   start = st->start;
723
105k
   curr_frame_type = FRAME_PLC_PERIODIC;
724
105k
   if (st->plc_duration >= 40 || start != 0 || st->skip_plc)
725
25.7k
      curr_frame_type = FRAME_PLC_NOISE;
726
#ifdef ENABLE_DEEP_PLC
727
   if (start == 0 && lpcnet != NULL && st->mode->Fs != 96000 && lpcnet->loaded)
728
   {
729
      if (st->complexity >= 5 && st->plc_duration < 80 && !st->skip_plc)
730
         curr_frame_type = FRAME_PLC_NEURAL;
731
#ifdef ENABLE_DRED
732
      if (lpcnet->fec_fill_pos > lpcnet->fec_read_pos)
733
         curr_frame_type = FRAME_DRED;
734
#endif
735
   }
736
#endif
737
738
105k
   if (curr_frame_type == FRAME_PLC_NOISE)
739
25.7k
   {
740
      /* Noise-based PLC/CNG */
741
25.7k
      VARDECL(celt_norm, X);
742
25.7k
      opus_uint32 seed;
743
25.7k
      int end;
744
25.7k
      int effEnd;
745
25.7k
      celt_glog decay;
746
25.7k
      end = st->end;
747
25.7k
      effEnd = IMAX(start, IMIN(end, mode->effEBands));
748
749
25.7k
      ALLOC(X, C*N, celt_norm);   /**< Interleaved normalised MDCTs */
750
38.7k
      c=0; do {
751
38.7k
         OPUS_MOVE(decode_mem[c], decode_mem[c]+N,
752
38.7k
               decode_buffer_size-N+overlap);
753
38.7k
      } while (++c<C);
754
755
25.7k
      if (st->prefilter_and_fold) {
756
527
         prefilter_and_fold(st, N);
757
527
      }
758
759
      /* Energy decay */
760
25.7k
      decay = loss_duration==0 ? GCONST(1.5f) : GCONST(.5f);
761
25.7k
      c=0; do
762
38.7k
      {
763
200k
         for (i=start;i<end;i++)
764
162k
            oldBandE[c*nbEBands+i] = MAXG(backgroundLogE[c*nbEBands+i], oldBandE[c*nbEBands+i] - decay);
765
38.7k
      } while (++c<C);
766
25.7k
      seed = st->rng;
767
64.4k
      for (c=0;c<C;c++)
768
38.7k
      {
769
200k
         for (i=start;i<effEnd;i++)
770
162k
         {
771
162k
            int j;
772
162k
            int boffs;
773
162k
            int blen;
774
162k
            boffs = N*c+(eBands[i]<<LM);
775
162k
            blen = (eBands[i+1]-eBands[i])<<LM;
776
7.27M
            for (j=0;j<blen;j++)
777
7.11M
            {
778
7.11M
               seed = celt_lcg_rand(seed);
779
7.11M
               X[boffs+j] = SHL32((celt_norm)((opus_int32)seed>>20), NORM_SHIFT-14);
780
7.11M
            }
781
162k
            renormalise_vector(X+boffs, blen, Q31ONE, st->arch);
782
162k
         }
783
38.7k
      }
784
25.7k
      st->rng = seed;
785
786
25.7k
      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));
787
788
      /* Run the postfilter with the last parameters. */
789
38.7k
      c=0; do {
790
38.7k
         st->postfilter_period=IMAX(st->postfilter_period, COMBFILTER_MINPERIOD);
791
38.7k
         st->postfilter_period_old=IMAX(st->postfilter_period_old, COMBFILTER_MINPERIOD);
792
38.7k
         comb_filter(out_syn[c], out_syn[c], st->postfilter_period_old, st->postfilter_period, mode->shortMdctSize,
793
38.7k
               st->postfilter_gain_old, st->postfilter_gain, st->postfilter_tapset_old, st->postfilter_tapset,
794
38.7k
               mode->window, overlap, st->arch);
795
38.7k
         if (LM!=0)
796
36.3k
            comb_filter(out_syn[c]+mode->shortMdctSize, out_syn[c]+mode->shortMdctSize, st->postfilter_period, st->postfilter_period, N-mode->shortMdctSize,
797
36.3k
                  st->postfilter_gain, st->postfilter_gain, st->postfilter_tapset, st->postfilter_tapset,
798
36.3k
                  mode->window, overlap, st->arch);
799
800
38.7k
      } while (++c<C);
801
25.7k
      st->postfilter_period_old = st->postfilter_period;
802
25.7k
      st->postfilter_gain_old = st->postfilter_gain;
803
25.7k
      st->postfilter_tapset_old = st->postfilter_tapset;
804
805
25.7k
      st->prefilter_and_fold = 0;
806
      /* Skip regular PLC until we get two consecutive packets. */
807
25.7k
      st->skip_plc = 1;
808
79.3k
   } else {
809
79.3k
      int exc_length;
810
      /* Pitch-based PLC */
811
79.3k
      const celt_coef *window;
812
79.3k
      opus_val16 *exc;
813
79.3k
      opus_val16 fade = Q15ONE;
814
79.3k
      int pitch_index;
815
79.3k
      int curr_neural;
816
79.3k
      int last_neural;
817
79.3k
      VARDECL(opus_val16, _exc);
818
79.3k
      VARDECL(opus_val16, fir_tmp);
819
820
79.3k
      curr_neural = curr_frame_type == FRAME_PLC_NEURAL || curr_frame_type == FRAME_DRED;
821
79.3k
      last_neural = st->last_frame_type == FRAME_PLC_NEURAL || st->last_frame_type == FRAME_DRED;
822
79.3k
      if (st->last_frame_type != FRAME_PLC_PERIODIC && !(last_neural && curr_neural))
823
42.9k
      {
824
42.9k
         st->last_pitch_index = pitch_index = celt_plc_pitch_search(st, decode_mem, C, st->arch);
825
42.9k
      } else {
826
36.4k
         pitch_index = st->last_pitch_index;
827
36.4k
         fade = QCONST16(.8f,15);
828
36.4k
      }
829
#ifdef ENABLE_DEEP_PLC
830
      if (curr_neural && !last_neural) update_plc_state(lpcnet, decode_mem, &st->plc_preemphasis_mem, C);
831
#endif
832
833
      /* We want the excitation for 2 pitch periods in order to look for a
834
         decaying signal, but we can't get more than MAX_PERIOD. */
835
79.3k
      exc_length = IMIN(2*pitch_index, max_period);
836
837
79.3k
      ALLOC(_exc, max_period+CELT_LPC_ORDER, opus_val16);
838
79.3k
      ALLOC(fir_tmp, exc_length, opus_val16);
839
79.3k
      exc = _exc+CELT_LPC_ORDER;
840
79.3k
      window = mode->window;
841
126k
      c=0; do {
842
126k
         opus_val16 decay;
843
126k
         opus_val16 attenuation;
844
126k
         opus_val32 S1=0;
845
126k
         celt_sig *buf;
846
126k
         int extrapolation_offset;
847
126k
         int extrapolation_len;
848
126k
         int j;
849
850
126k
         buf = decode_mem[c];
851
148M
         for (i=0;i<max_period+CELT_LPC_ORDER;i++)
852
148M
            exc[i-CELT_LPC_ORDER] = SROUND16(buf[decode_buffer_size-max_period-CELT_LPC_ORDER+i], SIG_SHIFT);
853
854
126k
         if (st->last_frame_type != FRAME_PLC_PERIODIC && !(last_neural && curr_neural))
855
68.4k
         {
856
68.4k
            opus_val32 ac[CELT_LPC_ORDER+1];
857
            /* Compute LPC coefficients for the last MAX_PERIOD samples before
858
               the first loss so we can work in the excitation-filter domain. */
859
68.4k
            _celt_autocorr(exc, ac, window, overlap,
860
68.4k
                   CELT_LPC_ORDER, max_period, st->arch);
861
            /* Add a noise floor of -40 dB. */
862
#ifdef FIXED_POINT
863
            ac[0] += SHR32(ac[0],13);
864
#else
865
68.4k
            ac[0] *= 1.0001f;
866
68.4k
#endif
867
            /* Use lag windowing to stabilize the Levinson-Durbin recursion. */
868
1.71M
            for (i=1;i<=CELT_LPC_ORDER;i++)
869
1.64M
            {
870
               /*ac[i] *= exp(-.5*(2*M_PI*.002*i)*(2*M_PI*.002*i));*/
871
#ifdef FIXED_POINT
872
               ac[i] -= MULT16_32_Q15(2*i*i, ac[i]);
873
#else
874
1.64M
               ac[i] -= ac[i]*(0.008f*0.008f)*i*i;
875
1.64M
#endif
876
1.64M
            }
877
68.4k
            _celt_lpc(lpc+c*CELT_LPC_ORDER, ac, CELT_LPC_ORDER);
878
#ifdef FIXED_POINT
879
         /* For fixed-point, apply bandwidth expansion until we can guarantee that
880
            no overflow can happen in the IIR filter. This means:
881
            32768*sum(abs(filter)) < 2^31 */
882
         while (1) {
883
            opus_val16 tmp=Q15ONE;
884
            opus_val32 sum=QCONST16(1., SIG_SHIFT);
885
            for (i=0;i<CELT_LPC_ORDER;i++)
886
               sum += ABS16(lpc[c*CELT_LPC_ORDER+i]);
887
            if (sum < 65535) break;
888
            for (i=0;i<CELT_LPC_ORDER;i++)
889
            {
890
               tmp = MULT16_16_Q15(QCONST16(.99f,15), tmp);
891
               lpc[c*CELT_LPC_ORDER+i] = MULT16_16_Q15(lpc[c*CELT_LPC_ORDER+i], tmp);
892
            }
893
         }
894
#endif
895
68.4k
         }
896
         /* Initialize the LPC history with the samples just before the start
897
            of the region for which we're computing the excitation. */
898
126k
         {
899
            /* Compute the excitation for exc_length samples before the loss. We need the copy
900
               because celt_fir() cannot filter in-place. */
901
126k
            celt_fir(exc+max_period-exc_length, lpc+c*CELT_LPC_ORDER,
902
126k
                  fir_tmp, exc_length, CELT_LPC_ORDER, st->arch);
903
126k
            OPUS_COPY(exc+max_period-exc_length, fir_tmp, exc_length);
904
126k
         }
905
906
         /* Check if the waveform is decaying, and if so how fast.
907
            We do this to avoid adding energy when concealing in a segment
908
            with decaying energy. */
909
126k
         {
910
126k
            opus_val32 E1=1, E2=1;
911
126k
            int decay_length;
912
#ifdef FIXED_POINT
913
            int shift = IMAX(0,2*celt_zlog2(celt_maxabs16(&exc[max_period-exc_length], exc_length))-20);
914
#ifdef ENABLE_QEXT
915
            if (st->qext_scale==2) shift++;
916
#endif
917
#endif
918
126k
            decay_length = exc_length>>1;
919
35.8M
            for (i=0;i<decay_length;i++)
920
35.7M
            {
921
35.7M
               opus_val16 e;
922
35.7M
               e = exc[max_period-decay_length+i];
923
35.7M
               E1 += SHR32(MULT16_16(e, e), shift);
924
35.7M
               e = exc[max_period-2*decay_length+i];
925
35.7M
               E2 += SHR32(MULT16_16(e, e), shift);
926
35.7M
            }
927
126k
            E1 = MIN32(E1, E2);
928
126k
            decay = celt_sqrt(frac_div32(SHR32(E1, 1), E2));
929
126k
         }
930
931
         /* Move the decoder memory one frame to the left to give us room to
932
            add the data for the new frame. We ignore the overlap that extends
933
            past the end of the buffer, because we aren't going to use it. */
934
126k
         OPUS_MOVE(buf, buf+N, decode_buffer_size-N);
935
936
         /* Extrapolate from the end of the excitation with a period of
937
            "pitch_index", scaling down each period by an additional factor of
938
            "decay". */
939
126k
         extrapolation_offset = max_period-pitch_index;
940
         /* We need to extrapolate enough samples to cover a complete MDCT
941
            window (including overlap/2 samples on both sides). */
942
126k
         extrapolation_len = N+overlap;
943
         /* We also apply fading if this is not the first loss. */
944
126k
         attenuation = MULT16_16_Q15(fade, decay);
945
51.0M
         for (i=j=0;i<extrapolation_len;i++,j++)
946
50.8M
         {
947
50.8M
            opus_val16 tmp;
948
50.8M
            if (j >= pitch_index) {
949
160k
               j -= pitch_index;
950
160k
               attenuation = MULT16_16_Q15(attenuation, decay);
951
160k
            }
952
50.8M
            buf[decode_buffer_size-N+i] =
953
50.8M
                  SHL32(EXTEND32(MULT16_16_Q15(attenuation,
954
50.8M
                        exc[extrapolation_offset+j])), SIG_SHIFT);
955
            /* Compute the energy of the previously decoded signal whose
956
               excitation we're copying. */
957
50.8M
            tmp = SROUND16(
958
50.8M
                  buf[decode_buffer_size-max_period-N+extrapolation_offset+j],
959
50.8M
                  SIG_SHIFT);
960
50.8M
            S1 += SHR32(MULT16_16(tmp, tmp), 11);
961
50.8M
         }
962
126k
         {
963
126k
            opus_val16 lpc_mem[CELT_LPC_ORDER];
964
            /* Copy the last decoded samples (prior to the overlap region) to
965
               synthesis filter memory so we can have a continuous signal. */
966
3.17M
            for (i=0;i<CELT_LPC_ORDER;i++)
967
3.04M
               lpc_mem[i] = SROUND16(buf[decode_buffer_size-N-1-i], SIG_SHIFT);
968
            /* Apply the synthesis filter to convert the excitation back into
969
               the signal domain. */
970
126k
            celt_iir(buf+decode_buffer_size-N, lpc+c*CELT_LPC_ORDER,
971
126k
                  buf+decode_buffer_size-N, extrapolation_len, CELT_LPC_ORDER,
972
126k
                  lpc_mem, st->arch);
973
#ifdef FIXED_POINT
974
            for (i=0; i < extrapolation_len; i++)
975
               buf[decode_buffer_size-N+i] = SATURATE(buf[decode_buffer_size-N+i], SIG_SAT);
976
#endif
977
126k
         }
978
979
         /* Check if the synthesis energy is higher than expected, which can
980
            happen with the signal changes during our window. If so,
981
            attenuate. */
982
126k
         {
983
126k
            opus_val32 S2=0;
984
51.0M
            for (i=0;i<extrapolation_len;i++)
985
50.8M
            {
986
50.8M
               opus_val16 tmp = SROUND16(buf[decode_buffer_size-N+i], SIG_SHIFT);
987
50.8M
               S2 += SHR32(MULT16_16(tmp, tmp), 11);
988
50.8M
            }
989
            /* This checks for an "explosion" in the synthesis. */
990
#ifdef FIXED_POINT
991
            if (!(S1 > SHR32(S2,2)))
992
#else
993
            /* The float test is written this way to catch NaNs in the output
994
               of the IIR filter at the same time. */
995
126k
            if (!(S1 > 0.2f*S2))
996
17.6k
#endif
997
17.6k
            {
998
8.48M
               for (i=0;i<extrapolation_len;i++)
999
8.46M
                  buf[decode_buffer_size-N+i] = 0;
1000
109k
            } else if (S1 < S2)
1001
21.6k
            {
1002
21.6k
               opus_val16 ratio = celt_sqrt(frac_div32(SHR32(S1,1)+1,S2+1));
1003
2.95M
               for (i=0;i<overlap;i++)
1004
2.93M
               {
1005
2.93M
                  opus_val16 tmp_g = Q15ONE
1006
2.93M
                        - MULT16_16_Q15(COEF2VAL16(window[i]), Q15ONE-ratio);
1007
2.93M
                  buf[decode_buffer_size-N+i] =
1008
2.93M
                        MULT16_32_Q15(tmp_g, buf[decode_buffer_size-N+i]);
1009
2.93M
               }
1010
4.06M
               for (i=overlap;i<extrapolation_len;i++)
1011
4.04M
               {
1012
4.04M
                  buf[decode_buffer_size-N+i] =
1013
4.04M
                        MULT16_32_Q15(ratio, buf[decode_buffer_size-N+i]);
1014
4.04M
               }
1015
21.6k
            }
1016
126k
         }
1017
1018
126k
      } while (++c<C);
1019
1020
#ifdef ENABLE_DEEP_PLC
1021
      if (curr_neural) {
1022
         float overlap_mem;
1023
         int samples_needed16k;
1024
         celt_sig *buf;
1025
         VARDECL(float, buf_copy);
1026
         buf = decode_mem[0];
1027
         ALLOC(buf_copy, C*overlap, float);
1028
         c=0; do {
1029
            OPUS_COPY(buf_copy+c*overlap, &decode_mem[c][decode_buffer_size-N], overlap);
1030
         } while (++c<C);
1031
1032
         /* Need enough samples from the PLC to cover the frame size, resampling delay,
1033
            and the overlap at the end. */
1034
         samples_needed16k = (N+SINC_ORDER+overlap)/3;
1035
         if (!last_neural) {
1036
            st->plc_fill = 0;
1037
         }
1038
         while (st->plc_fill < samples_needed16k) {
1039
            lpcnet_plc_conceal(lpcnet, &st->plc_pcm[st->plc_fill]);
1040
            st->plc_fill += FRAME_SIZE;
1041
         }
1042
         /* Resample to 48 kHz. */
1043
         for (i=0;i<(N+overlap)/3;i++) {
1044
            int j;
1045
            float sum;
1046
            for (sum=0, j=0;j<17;j++) sum += 3*st->plc_pcm[i+j]*sinc_filter[3*j];
1047
            buf[decode_buffer_size-N+3*i] = sum;
1048
            for (sum=0, j=0;j<16;j++) sum += 3*st->plc_pcm[i+j+1]*sinc_filter[3*j+2];
1049
            buf[decode_buffer_size-N+3*i+1] = sum;
1050
            for (sum=0, j=0;j<16;j++) sum += 3*st->plc_pcm[i+j+1]*sinc_filter[3*j+1];
1051
            buf[decode_buffer_size-N+3*i+2] = sum;
1052
         }
1053
         OPUS_MOVE(st->plc_pcm, &st->plc_pcm[N/3], st->plc_fill-N/3);
1054
         st->plc_fill -= N/3;
1055
         for (i=0;i<N;i++) {
1056
            float tmp = buf[decode_buffer_size-N+i];
1057
            buf[decode_buffer_size-N+i] -= PREEMPHASIS*st->plc_preemphasis_mem;
1058
            st->plc_preemphasis_mem = tmp;
1059
         }
1060
         overlap_mem = st->plc_preemphasis_mem;
1061
         for (i=0;i<overlap;i++) {
1062
            float tmp = buf[decode_buffer_size+i];
1063
            buf[decode_buffer_size+i] -= PREEMPHASIS*overlap_mem;
1064
            overlap_mem = tmp;
1065
         }
1066
         /* For now, we just do mono PLC. */
1067
         if (C==2) OPUS_COPY(decode_mem[1], decode_mem[0], decode_buffer_size+overlap);
1068
         c=0; do {
1069
            /* Cross-fade with 48-kHz non-neural PLC for the first 2.5 ms to avoid a discontinuity. */
1070
            if (!last_neural) {
1071
               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];
1072
            }
1073
         } while (++c<C);
1074
      }
1075
#endif
1076
79.3k
      st->prefilter_and_fold = 1;
1077
79.3k
   }
1078
1079
   /* Saturate to something large to avoid wrap-around. */
1080
105k
   st->loss_duration = IMIN(10000, loss_duration+(1<<LM));
1081
105k
   st->plc_duration = IMIN(10000, st->plc_duration+(1<<LM));
1082
#ifdef ENABLE_DRED
1083
   if (curr_frame_type == FRAME_DRED) {
1084
      st->plc_duration = 0;
1085
      st->skip_plc = 0;
1086
   }
1087
#endif
1088
105k
   st->last_frame_type = curr_frame_type;
1089
105k
   RESTORE_STACK;
1090
105k
}
1091
1092
#ifdef ENABLE_QEXT
1093
6.38k
static void decode_qext_stereo_params(ec_dec *ec, int qext_end, int *qext_intensity, int *qext_dual_stereo) {
1094
6.38k
   *qext_intensity = ec_dec_uint(ec, qext_end+1);
1095
6.38k
   if (*qext_intensity != 0) *qext_dual_stereo = ec_dec_bit_logp(ec, 1);
1096
2.99k
   else *qext_dual_stereo = 0;
1097
6.38k
}
1098
#endif
1099
1100
int celt_decode_with_ec_dred(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data,
1101
      int len, opus_res * OPUS_RESTRICT pcm, int frame_size, ec_dec *dec, int accum
1102
#ifdef ENABLE_DEEP_PLC
1103
      ,LPCNetPLCState *lpcnet
1104
#endif
1105
      ARG_QEXT(const unsigned char *qext_payload) ARG_QEXT(int qext_payload_len)
1106
      )
1107
1.07M
{
1108
1.07M
   int c, i, N;
1109
1.07M
   int spread_decision;
1110
1.07M
   opus_int32 bits;
1111
1.07M
   ec_dec _dec;
1112
1.07M
   VARDECL(celt_norm, X);
1113
1.07M
   VARDECL(int, fine_quant);
1114
1.07M
   VARDECL(int, pulses);
1115
1.07M
   VARDECL(int, cap);
1116
1.07M
   VARDECL(int, offsets);
1117
1.07M
   VARDECL(int, fine_priority);
1118
1.07M
   VARDECL(int, tf_res);
1119
1.07M
   VARDECL(unsigned char, collapse_masks);
1120
1.07M
   celt_sig *decode_mem[2];
1121
1.07M
   celt_sig *out_syn[2];
1122
1.07M
   celt_glog *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE;
1123
1124
1.07M
   int shortBlocks;
1125
1.07M
   int isTransient;
1126
1.07M
   int intra_ener;
1127
1.07M
   const int CC = st->channels;
1128
1.07M
   int LM, M;
1129
1.07M
   int start;
1130
1.07M
   int end;
1131
1.07M
   int effEnd;
1132
1.07M
   int codedBands;
1133
1.07M
   int alloc_trim;
1134
1.07M
   int postfilter_pitch;
1135
1.07M
   opus_val16 postfilter_gain;
1136
1.07M
   int intensity=0;
1137
1.07M
   int dual_stereo=0;
1138
1.07M
   opus_int32 total_bits;
1139
1.07M
   opus_int32 balance;
1140
1.07M
   opus_int32 tell;
1141
1.07M
   int dynalloc_logp;
1142
1.07M
   int postfilter_tapset;
1143
1.07M
   int anti_collapse_rsv;
1144
1.07M
   int anti_collapse_on=0;
1145
1.07M
   int silence;
1146
1.07M
   int C = st->stream_channels;
1147
1.07M
   const OpusCustomMode *mode;
1148
1.07M
   int nbEBands;
1149
1.07M
   int overlap;
1150
1.07M
   const opus_int16 *eBands;
1151
1.07M
   celt_glog max_background_increase;
1152
1.07M
   int decode_buffer_size;
1153
#ifdef ENABLE_QEXT
1154
   opus_int32 qext_bits;
1155
   ec_dec ext_dec;
1156
   int qext_bytes=0;
1157
   int qext_end=0;
1158
   int qext_intensity=0;
1159
   int qext_dual_stereo=0;
1160
   VARDECL(int, extra_quant);
1161
   VARDECL(int, extra_pulses);
1162
   const CELTMode *qext_mode = NULL;
1163
550k
   CELTMode qext_mode_struct;
1164
   int qext_scale;
1165
#else
1166
294k
# define qext_bytes 0
1167
#endif
1168
1.07M
   ALLOC_STACK;
1169
#ifdef ENABLE_QEXT
1170
   qext_scale = st->qext_scale;
1171
#endif
1172
1.07M
   decode_buffer_size = QEXT_SCALE(DECODE_BUFFER_SIZE);
1173
1174
1.07M
   VALIDATE_CELT_DECODER(st);
1175
1.07M
   mode = st->mode;
1176
1.07M
   nbEBands = mode->nbEBands;
1177
1.07M
   overlap = mode->overlap;
1178
1.07M
   eBands = mode->eBands;
1179
1.07M
   start = st->start;
1180
1.07M
   end = st->end;
1181
1.07M
   frame_size *= st->downsample;
1182
1183
1.07M
   oldBandE = (celt_glog*)(st->_decode_mem+(decode_buffer_size+overlap)*CC);
1184
1.07M
   oldLogE = oldBandE + 2*nbEBands;
1185
1.07M
   oldLogE2 = oldLogE + 2*nbEBands;
1186
1.07M
   backgroundLogE = oldLogE2 + 2*nbEBands;
1187
1188
#ifdef ENABLE_QEXT
1189
550k
   if (qext_payload) {
1190
26.0k
      ec_dec_init(&ext_dec, (unsigned char*)qext_payload, qext_payload_len);
1191
26.0k
      qext_bytes = qext_payload_len;
1192
524k
   } else {
1193
524k
      ec_dec_init(&ext_dec, NULL, 0);
1194
524k
   }
1195
#endif
1196
#if defined(CUSTOM_MODES) || defined(ENABLE_OPUS_CUSTOM_API)
1197
   if (st->signalling && data!=NULL)
1198
   {
1199
      int data0=data[0];
1200
      /* Convert "standard mode" to Opus header */
1201
# ifndef ENABLE_QEXT
1202
      if (mode->Fs==48000 && mode->shortMdctSize==120)
1203
# endif
1204
      {
1205
         data0 = fromOpus(data0);
1206
         if (data0<0)
1207
            return OPUS_INVALID_PACKET;
1208
      }
1209
      st->end = end = IMAX(1, mode->effEBands-2*(data0>>5));
1210
      LM = (data0>>3)&0x3;
1211
      C = 1 + ((data0>>2)&0x1);
1212
      if ((data[0] & 0x03) == 0x03) {
1213
         data++;
1214
         len--;
1215
         if (len<=0)
1216
            return OPUS_INVALID_PACKET;
1217
         if (data[0] & 0x40) {
1218
            int p;
1219
            int padding=0;
1220
            data++;
1221
            len--;
1222
            do {
1223
               int tmp;
1224
               if (len<=0)
1225
                  return OPUS_INVALID_PACKET;
1226
               p = *data++;
1227
               len--;
1228
               tmp = p==255 ? 254: p;
1229
               len -= tmp;
1230
               padding += tmp;
1231
            } while (p==255);
1232
            padding--;
1233
            if (len <= 0 || padding<0) return OPUS_INVALID_PACKET;
1234
#ifdef ENABLE_QEXT
1235
            qext_bytes = padding;
1236
            if (data[len] != QEXT_EXTENSION_ID<<1)
1237
               qext_bytes=0;
1238
            ec_dec_init(&ext_dec, (unsigned char*)data+len+1, qext_bytes);
1239
#endif
1240
         }
1241
      } else
1242
      {
1243
         data++;
1244
         len--;
1245
      }
1246
      if (LM>mode->maxLM)
1247
         return OPUS_INVALID_PACKET;
1248
      if (frame_size < mode->shortMdctSize<<LM)
1249
         return OPUS_BUFFER_TOO_SMALL;
1250
      else
1251
         frame_size = mode->shortMdctSize<<LM;
1252
   } else {
1253
#else
1254
1.07M
   {
1255
1.07M
#endif
1256
2.01M
      for (LM=0;LM<=mode->maxLM;LM++)
1257
2.01M
         if (mode->shortMdctSize<<LM==frame_size)
1258
1.07M
            break;
1259
1.07M
      if (LM>mode->maxLM)
1260
0
         return OPUS_BAD_ARG;
1261
1.07M
   }
1262
1.07M
   M=1<<LM;
1263
1264
1.07M
   if (len<0 || len>1275 || pcm==NULL)
1265
0
      return OPUS_BAD_ARG;
1266
1267
1.07M
   N = M*mode->shortMdctSize;
1268
1.65M
   c=0; do {
1269
1.65M
      decode_mem[c] = st->_decode_mem + c*(decode_buffer_size+overlap);
1270
1.65M
      out_syn[c] = decode_mem[c]+decode_buffer_size-N;
1271
1.65M
   } while (++c<CC);
1272
1273
1.07M
   effEnd = end;
1274
1.07M
   if (effEnd > mode->effEBands)
1275
0
      effEnd = mode->effEBands;
1276
1277
1.07M
   if (data == NULL || len<=1)
1278
464k
   {
1279
464k
      celt_decode_lost(st, N, LM
1280
#ifdef ENABLE_DEEP_PLC
1281
      , lpcnet
1282
#endif
1283
464k
                      );
1284
464k
      deemphasis(out_syn, pcm, N, CC, st->downsample, mode->preemph, st->preemph_memD, accum);
1285
464k
      RESTORE_STACK;
1286
464k
      return frame_size/st->downsample;
1287
464k
   }
1288
#ifdef ENABLE_DEEP_PLC
1289
   else {
1290
      /* FIXME: This is a bit of a hack just to make sure opus_decode_native() knows we're no longer in PLC. */
1291
      if (lpcnet) lpcnet->blend = 0;
1292
   }
1293
#endif
1294
1295
   /* Check if there are at least two packets received consecutively before
1296
    * turning on the pitch-based PLC */
1297
614k
   if (st->loss_duration == 0) st->skip_plc = 0;
1298
1299
614k
   if (dec == NULL)
1300
60.8k
   {
1301
60.8k
      ec_dec_init(&_dec,(unsigned char*)data,len);
1302
60.8k
      dec = &_dec;
1303
60.8k
   }
1304
1305
614k
   if (C==1)
1306
389k
   {
1307
8.57M
      for (i=0;i<nbEBands;i++)
1308
8.18M
         oldBandE[i]=MAXG(oldBandE[i],oldBandE[nbEBands+i]);
1309
389k
   }
1310
1311
614k
   total_bits = len*8;
1312
614k
   tell = ec_tell(dec);
1313
1314
614k
   if (tell >= total_bits)
1315
50.7k
      silence = 1;
1316
563k
   else if (tell==1)
1317
540k
      silence = ec_dec_bit_logp(dec, 15);
1318
23.3k
   else
1319
23.3k
      silence = 0;
1320
614k
   if (silence)
1321
80.0k
   {
1322
      /* Pretend we've read all the remaining bits */
1323
80.0k
      tell = len*8;
1324
80.0k
      dec->nbits_total+=tell-ec_tell(dec);
1325
80.0k
   }
1326
1327
614k
   postfilter_gain = 0;
1328
614k
   postfilter_pitch = 0;
1329
614k
   postfilter_tapset = 0;
1330
614k
   if (start==0 && tell+16 <= total_bits)
1331
346k
   {
1332
346k
      if(ec_dec_bit_logp(dec, 1))
1333
100k
      {
1334
100k
         int qg, octave;
1335
100k
         octave = ec_dec_uint(dec, 6);
1336
100k
         postfilter_pitch = (16<<octave)+ec_dec_bits(dec, 4+octave)-1;
1337
100k
         qg = ec_dec_bits(dec, 3);
1338
100k
         if (ec_tell(dec)+2<=total_bits)
1339
100k
            postfilter_tapset = ec_dec_icdf(dec, tapset_icdf, 2);
1340
100k
         postfilter_gain = QCONST16(.09375f,15)*(qg+1);
1341
100k
      }
1342
346k
      tell = ec_tell(dec);
1343
346k
   }
1344
1345
614k
   if (LM > 0 && tell+3 <= total_bits)
1346
278k
   {
1347
278k
      isTransient = ec_dec_bit_logp(dec, 3);
1348
278k
      tell = ec_tell(dec);
1349
278k
   }
1350
335k
   else
1351
335k
      isTransient = 0;
1352
1353
614k
   if (isTransient)
1354
57.6k
      shortBlocks = M;
1355
556k
   else
1356
556k
      shortBlocks = 0;
1357
1358
   /* Decode the global flags (first symbols in the stream) */
1359
614k
   intra_ener = tell+3<=total_bits ? ec_dec_bit_logp(dec, 3) : 0;
1360
   /* If recovering from packet loss, make sure we make the energy prediction safe to reduce the
1361
      risk of getting loud artifacts. */
1362
614k
   if (!intra_ener && st->loss_duration != 0) {
1363
123k
      c=0; do
1364
247k
      {
1365
247k
         celt_glog safety = 0;
1366
247k
         int missing = IMIN(10, st->loss_duration>>LM);
1367
247k
         if (LM==0) safety = GCONST(1.5f);
1368
27.0k
         else if (LM==1) safety = GCONST(.5f);
1369
4.46M
         for (i=start;i<end;i++)
1370
4.21M
         {
1371
4.21M
            if (oldBandE[c*nbEBands+i] < MAXG(oldLogE[c*nbEBands+i], oldLogE2[c*nbEBands+i])) {
1372
               /* If energy is going down already, continue the trend. */
1373
1.76M
               opus_val32 slope;
1374
1.76M
               opus_val32 E0, E1, E2;
1375
1.76M
               E0 = oldBandE[c*nbEBands+i];
1376
1.76M
               E1 = oldLogE[c*nbEBands+i];
1377
1.76M
               E2 = oldLogE2[c*nbEBands+i];
1378
1.76M
               slope = MAX32(E1 - E0, HALF32(E2 - E0));
1379
1.76M
               slope = MING(slope, GCONST(2.f));
1380
1.76M
               E0 -= MAX32(0, (1+missing)*slope);
1381
1.76M
               oldBandE[c*nbEBands+i] = MAX32(-GCONST(20.f), E0);
1382
2.44M
            } else {
1383
               /* Otherwise take the min of the last frames. */
1384
2.44M
               oldBandE[c*nbEBands+i] = MING(MING(oldBandE[c*nbEBands+i], oldLogE[c*nbEBands+i]), oldLogE2[c*nbEBands+i]);
1385
2.44M
            }
1386
            /* Shorter frames have more natural fluctuations -- play it safe. */
1387
4.21M
            oldBandE[c*nbEBands+i] -= safety;
1388
4.21M
         }
1389
247k
      } while (++c<2);
1390
123k
   }
1391
   /* Get band energies */
1392
614k
   unquant_coarse_energy(mode, start, end, oldBandE,
1393
614k
         intra_ener, dec, C, LM);
1394
1395
614k
   ALLOC(tf_res, nbEBands, int);
1396
614k
   tf_decode(start, end, isTransient, tf_res, LM, dec);
1397
1398
614k
   tell = ec_tell(dec);
1399
614k
   spread_decision = SPREAD_NORMAL;
1400
614k
   if (tell+4 <= total_bits)
1401
233k
      spread_decision = ec_dec_icdf(dec, spread_icdf, 5);
1402
1403
614k
   ALLOC(cap, nbEBands, int);
1404
1405
614k
   init_caps(mode,cap,LM,C);
1406
1407
614k
   ALLOC(offsets, nbEBands, int);
1408
1409
614k
   dynalloc_logp = 6;
1410
614k
   total_bits<<=BITRES;
1411
614k
   tell = ec_tell_frac(dec);
1412
10.4M
   for (i=start;i<end;i++)
1413
9.84M
   {
1414
9.84M
      int width, quanta;
1415
9.84M
      int dynalloc_loop_logp;
1416
9.84M
      int boost;
1417
9.84M
      width = C*(eBands[i+1]-eBands[i])<<LM;
1418
      /* quanta is 6 bits, but no more than 1 bit/sample
1419
         and no less than 1/8 bit/sample */
1420
9.84M
      quanta = IMIN(width<<BITRES, IMAX(6<<BITRES, width));
1421
9.84M
      dynalloc_loop_logp = dynalloc_logp;
1422
9.84M
      boost = 0;
1423
10.0M
      while (tell+(dynalloc_loop_logp<<BITRES) < total_bits && boost < cap[i])
1424
3.60M
      {
1425
3.60M
         int flag;
1426
3.60M
         flag = ec_dec_bit_logp(dec, dynalloc_loop_logp);
1427
3.60M
         tell = ec_tell_frac(dec);
1428
3.60M
         if (!flag)
1429
3.38M
            break;
1430
216k
         boost += quanta;
1431
216k
         total_bits -= quanta;
1432
216k
         dynalloc_loop_logp = 1;
1433
216k
      }
1434
9.84M
      offsets[i] = boost;
1435
      /* Making dynalloc more likely */
1436
9.84M
      if (boost>0)
1437
62.2k
         dynalloc_logp = IMAX(2, dynalloc_logp-1);
1438
9.84M
   }
1439
1440
614k
   ALLOC(fine_quant, nbEBands, int);
1441
614k
   alloc_trim = tell+(6<<BITRES) <= total_bits ?
1442
406k
         ec_dec_icdf(dec, trim_icdf, 7) : 5;
1443
1444
614k
   bits = (((opus_int32)len*8)<<BITRES) - (opus_int32)ec_tell_frac(dec) - 1;
1445
614k
   anti_collapse_rsv = isTransient&&LM>=2&&bits>=((LM+2)<<BITRES) ? (1<<BITRES) : 0;
1446
614k
   bits -= anti_collapse_rsv;
1447
1448
614k
   ALLOC(pulses, nbEBands, int);
1449
614k
   ALLOC(fine_priority, nbEBands, int);
1450
1451
614k
   codedBands = clt_compute_allocation(mode, start, end, offsets, cap,
1452
614k
         alloc_trim, &intensity, &dual_stereo, bits, &balance, pulses,
1453
614k
         fine_quant, fine_priority, C, LM, dec, 0, 0, 0);
1454
1455
614k
   unquant_fine_energy(mode, start, end, oldBandE, NULL, fine_quant, dec, C);
1456
1457
614k
   ALLOC(X, C*N, celt_norm);   /**< Interleaved normalised MDCTs */
1458
1459
#ifdef ENABLE_QEXT
1460
319k
   if (qext_bytes && end == nbEBands &&
1461
16.8k
         ((mode->Fs == 48000 && (mode->shortMdctSize==120 || mode->shortMdctSize==90))
1462
16.8k
       || (mode->Fs == 96000 && (mode->shortMdctSize==240 || mode->shortMdctSize==180)))) {
1463
16.8k
      int qext_intra_ener;
1464
16.8k
      compute_qext_mode(&qext_mode_struct, mode);
1465
16.8k
      qext_mode = &qext_mode_struct;
1466
16.8k
      qext_end = ec_dec_bit_logp(&ext_dec, 1) ? NB_QEXT_BANDS : 2;
1467
16.8k
      if (C==2) decode_qext_stereo_params(&ext_dec, qext_end, &qext_intensity, &qext_dual_stereo);
1468
16.8k
      qext_intra_ener = ec_tell(&ext_dec)+3<=qext_bytes*8 ? ec_dec_bit_logp(&ext_dec, 3) : 0;
1469
16.8k
      unquant_coarse_energy(qext_mode, 0, qext_end, st->qext_oldBandE,
1470
16.8k
            qext_intra_ener, &ext_dec, C, LM);
1471
16.8k
   }
1472
319k
   ALLOC(extra_quant, nbEBands+NB_QEXT_BANDS, int);
1473
319k
   ALLOC(extra_pulses, nbEBands+NB_QEXT_BANDS, int);
1474
319k
   qext_bits = ((opus_int32)qext_bytes*8<<BITRES) - (opus_int32)ec_tell_frac(dec) - 1;
1475
   clt_compute_extra_allocation(mode, qext_mode, start, end, qext_end, NULL, NULL,
1476
         qext_bits, extra_pulses, extra_quant, C, LM, &ext_dec, 0, 0, 0);
1477
319k
   if (qext_bytes > 0) {
1478
22.5k
      unquant_fine_energy(mode, start, end, oldBandE, fine_quant, extra_quant, &ext_dec, C);
1479
22.5k
   }
1480
#endif
1481
1482
924k
   c=0; do {
1483
924k
      OPUS_MOVE(decode_mem[c], decode_mem[c]+N, decode_buffer_size-N+overlap);
1484
924k
   } while (++c<CC);
1485
1486
   /* Decode fixed codebook */
1487
614k
   ALLOC(collapse_masks, C*nbEBands, unsigned char);
1488
1489
614k
   quant_all_bands(0, mode, start, end, X, C==2 ? X+N : NULL, collapse_masks,
1490
614k
         NULL, pulses, shortBlocks, spread_decision, dual_stereo, intensity, tf_res,
1491
614k
         len*(8<<BITRES)-anti_collapse_rsv, balance, dec, LM, codedBands, &st->rng, 0,
1492
614k
         st->arch, st->disable_inv
1493
614k
         ARG_QEXT(&ext_dec) ARG_QEXT(extra_pulses)
1494
614k
         ARG_QEXT(qext_bytes*(8<<BITRES)) ARG_QEXT(cap));
1495
1496
#ifdef ENABLE_QEXT
1497
319k
   if (qext_mode) {
1498
16.8k
      VARDECL(int, zeros);
1499
16.8k
      VARDECL(unsigned char, qext_collapse_masks);
1500
16.8k
      ec_dec dummy_dec;
1501
16.8k
      int ext_balance;
1502
16.8k
      ALLOC(zeros, nbEBands, int);
1503
16.8k
      ALLOC(qext_collapse_masks, C*NB_QEXT_BANDS, unsigned char);
1504
16.8k
      ec_dec_init(&dummy_dec, NULL, 0);
1505
16.8k
      OPUS_CLEAR(zeros, end);
1506
16.8k
      ext_balance = qext_bytes*(8<<BITRES) - ec_tell_frac(&ext_dec);
1507
112k
      for (i=0;i<qext_end;i++) ext_balance -= extra_pulses[nbEBands+i] + C*(extra_quant[nbEBands+1]<<BITRES);
1508
16.8k
      unquant_fine_energy(qext_mode, 0, qext_end, st->qext_oldBandE, NULL, &extra_quant[nbEBands], &ext_dec, C);
1509
16.8k
      quant_all_bands(0, qext_mode, 0, qext_end, X, C==2 ? X+N : NULL, qext_collapse_masks,
1510
16.8k
            NULL, &extra_pulses[nbEBands], shortBlocks, spread_decision, qext_dual_stereo, qext_intensity, zeros,
1511
16.8k
            qext_bytes*(8<<BITRES), ext_balance, &ext_dec, LM, qext_end, &st->rng, 0,
1512
16.8k
            st->arch, st->disable_inv, &dummy_dec, zeros, 0, NULL);
1513
16.8k
   }
1514
#endif
1515
1516
614k
   if (anti_collapse_rsv > 0)
1517
18.5k
   {
1518
18.5k
      anti_collapse_on = ec_dec_bits(dec, 1);
1519
18.5k
   }
1520
614k
   unquant_energy_finalise(mode, start, end, (qext_bytes > 0) ? NULL : oldBandE,
1521
614k
         fine_quant, fine_priority, len*8-ec_tell(dec), dec, C);
1522
614k
   if (anti_collapse_on)
1523
13.4k
      anti_collapse(mode, X, collapse_masks, LM, C, N,
1524
13.4k
            start, end, oldBandE, oldLogE, oldLogE2, pulses, st->rng, 0, st->arch);
1525
1526
614k
   if (silence)
1527
80.0k
   {
1528
2.77M
      for (i=0;i<C*nbEBands;i++)
1529
2.69M
         oldBandE[i] = -GCONST(28.f);
1530
80.0k
   }
1531
614k
   if (st->prefilter_and_fold) {
1532
128k
      prefilter_and_fold(st, N);
1533
128k
   }
1534
614k
   celt_synthesis(mode, X, out_syn, oldBandE, start, effEnd,
1535
614k
                  C, CC, isTransient, LM, st->downsample, silence, st->arch ARG_QEXT(qext_mode) ARG_QEXT(st->qext_oldBandE) ARG_QEXT(qext_end));
1536
1537
924k
   c=0; do {
1538
924k
      st->postfilter_period=IMAX(st->postfilter_period, COMBFILTER_MINPERIOD);
1539
924k
      st->postfilter_period_old=IMAX(st->postfilter_period_old, COMBFILTER_MINPERIOD);
1540
924k
      comb_filter(out_syn[c], out_syn[c], st->postfilter_period_old, st->postfilter_period, mode->shortMdctSize,
1541
924k
            st->postfilter_gain_old, st->postfilter_gain, st->postfilter_tapset_old, st->postfilter_tapset,
1542
924k
            mode->window, overlap, st->arch);
1543
924k
      if (LM!=0)
1544
485k
         comb_filter(out_syn[c]+mode->shortMdctSize, out_syn[c]+mode->shortMdctSize, st->postfilter_period, postfilter_pitch, N-mode->shortMdctSize,
1545
485k
               st->postfilter_gain, postfilter_gain, st->postfilter_tapset, postfilter_tapset,
1546
485k
               mode->window, overlap, st->arch);
1547
1548
924k
   } while (++c<CC);
1549
614k
   st->postfilter_period_old = st->postfilter_period;
1550
614k
   st->postfilter_gain_old = st->postfilter_gain;
1551
614k
   st->postfilter_tapset_old = st->postfilter_tapset;
1552
614k
   st->postfilter_period = postfilter_pitch;
1553
614k
   st->postfilter_gain = postfilter_gain;
1554
614k
   st->postfilter_tapset = postfilter_tapset;
1555
614k
   if (LM!=0)
1556
339k
   {
1557
339k
      st->postfilter_period_old = st->postfilter_period;
1558
339k
      st->postfilter_gain_old = st->postfilter_gain;
1559
339k
      st->postfilter_tapset_old = st->postfilter_tapset;
1560
339k
   }
1561
1562
614k
   if (C==1)
1563
389k
      OPUS_COPY(&oldBandE[nbEBands], oldBandE, nbEBands);
1564
1565
614k
   if (!isTransient)
1566
556k
   {
1567
556k
      OPUS_COPY(oldLogE2, oldLogE, 2*nbEBands);
1568
556k
      OPUS_COPY(oldLogE, oldBandE, 2*nbEBands);
1569
556k
   } else {
1570
2.47M
      for (i=0;i<2*nbEBands;i++)
1571
2.42M
         oldLogE[i] = MING(oldLogE[i], oldBandE[i]);
1572
57.6k
   }
1573
   /* In normal circumstances, we only allow the noise floor to increase by
1574
      up to 2.4 dB/second, but when we're in DTX we give the weight of
1575
      all missing packets to the update packet. */
1576
614k
   max_background_increase = IMIN(160, st->loss_duration+M)*GCONST(0.001f);
1577
26.4M
   for (i=0;i<2*nbEBands;i++)
1578
25.8M
      backgroundLogE[i] = MING(backgroundLogE[i] + max_background_increase, oldBandE[i]);
1579
   /* In case start or end were to change */
1580
614k
   c=0; do
1581
1.22M
   {
1582
3.74M
      for (i=0;i<start;i++)
1583
2.52M
      {
1584
2.52M
         oldBandE[c*nbEBands+i]=0;
1585
2.52M
         oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-GCONST(28.f);
1586
2.52M
      }
1587
4.81M
      for (i=end;i<nbEBands;i++)
1588
3.58M
      {
1589
3.58M
         oldBandE[c*nbEBands+i]=0;
1590
3.58M
         oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-GCONST(28.f);
1591
3.58M
      }
1592
1.22M
   } while (++c<2);
1593
614k
   st->rng = dec->rng;
1594
#ifdef ENABLE_QEXT
1595
319k
   if (qext_bytes) st->rng = st->rng ^ ext_dec.rng;
1596
#endif
1597
1598
614k
   deemphasis(out_syn, pcm, N, CC, st->downsample, mode->preemph, st->preemph_memD, accum);
1599
614k
   st->loss_duration = 0;
1600
614k
   st->plc_duration = 0;
1601
614k
   st->last_frame_type = FRAME_NORMAL;
1602
614k
   st->prefilter_and_fold = 0;
1603
614k
   RESTORE_STACK;
1604
614k
   if (ec_tell(dec) > 8*len)
1605
12
      return OPUS_INTERNAL_ERROR;
1606
#ifdef ENABLE_QEXT
1607
319k
   if (qext_bytes != 0 && ec_tell(&ext_dec) > 8*qext_bytes)
1608
0
      return OPUS_INTERNAL_ERROR;
1609
319k
#endif
1610
614k
   if(ec_get_error(dec))
1611
7.73k
      st->error = 1;
1612
614k
   return frame_size/st->downsample;
1613
319k
}
celt_decode_with_ec_dred
Line
Count
Source
1107
264k
{
1108
264k
   int c, i, N;
1109
264k
   int spread_decision;
1110
264k
   opus_int32 bits;
1111
264k
   ec_dec _dec;
1112
264k
   VARDECL(celt_norm, X);
1113
264k
   VARDECL(int, fine_quant);
1114
264k
   VARDECL(int, pulses);
1115
264k
   VARDECL(int, cap);
1116
264k
   VARDECL(int, offsets);
1117
264k
   VARDECL(int, fine_priority);
1118
264k
   VARDECL(int, tf_res);
1119
264k
   VARDECL(unsigned char, collapse_masks);
1120
264k
   celt_sig *decode_mem[2];
1121
264k
   celt_sig *out_syn[2];
1122
264k
   celt_glog *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE;
1123
1124
264k
   int shortBlocks;
1125
264k
   int isTransient;
1126
264k
   int intra_ener;
1127
264k
   const int CC = st->channels;
1128
264k
   int LM, M;
1129
264k
   int start;
1130
264k
   int end;
1131
264k
   int effEnd;
1132
264k
   int codedBands;
1133
264k
   int alloc_trim;
1134
264k
   int postfilter_pitch;
1135
264k
   opus_val16 postfilter_gain;
1136
264k
   int intensity=0;
1137
264k
   int dual_stereo=0;
1138
264k
   opus_int32 total_bits;
1139
264k
   opus_int32 balance;
1140
264k
   opus_int32 tell;
1141
264k
   int dynalloc_logp;
1142
264k
   int postfilter_tapset;
1143
264k
   int anti_collapse_rsv;
1144
264k
   int anti_collapse_on=0;
1145
264k
   int silence;
1146
264k
   int C = st->stream_channels;
1147
264k
   const OpusCustomMode *mode;
1148
264k
   int nbEBands;
1149
264k
   int overlap;
1150
264k
   const opus_int16 *eBands;
1151
264k
   celt_glog max_background_increase;
1152
264k
   int decode_buffer_size;
1153
#ifdef ENABLE_QEXT
1154
   opus_int32 qext_bits;
1155
   ec_dec ext_dec;
1156
   int qext_bytes=0;
1157
   int qext_end=0;
1158
   int qext_intensity=0;
1159
   int qext_dual_stereo=0;
1160
   VARDECL(int, extra_quant);
1161
   VARDECL(int, extra_pulses);
1162
   const CELTMode *qext_mode = NULL;
1163
   CELTMode qext_mode_struct;
1164
   int qext_scale;
1165
#else
1166
264k
# define qext_bytes 0
1167
264k
#endif
1168
264k
   ALLOC_STACK;
1169
#ifdef ENABLE_QEXT
1170
   qext_scale = st->qext_scale;
1171
#endif
1172
264k
   decode_buffer_size = QEXT_SCALE(DECODE_BUFFER_SIZE);
1173
1174
264k
   VALIDATE_CELT_DECODER(st);
1175
264k
   mode = st->mode;
1176
264k
   nbEBands = mode->nbEBands;
1177
264k
   overlap = mode->overlap;
1178
264k
   eBands = mode->eBands;
1179
264k
   start = st->start;
1180
264k
   end = st->end;
1181
264k
   frame_size *= st->downsample;
1182
1183
264k
   oldBandE = (celt_glog*)(st->_decode_mem+(decode_buffer_size+overlap)*CC);
1184
264k
   oldLogE = oldBandE + 2*nbEBands;
1185
264k
   oldLogE2 = oldLogE + 2*nbEBands;
1186
264k
   backgroundLogE = oldLogE2 + 2*nbEBands;
1187
1188
#ifdef ENABLE_QEXT
1189
   if (qext_payload) {
1190
      ec_dec_init(&ext_dec, (unsigned char*)qext_payload, qext_payload_len);
1191
      qext_bytes = qext_payload_len;
1192
   } else {
1193
      ec_dec_init(&ext_dec, NULL, 0);
1194
   }
1195
#endif
1196
#if defined(CUSTOM_MODES) || defined(ENABLE_OPUS_CUSTOM_API)
1197
   if (st->signalling && data!=NULL)
1198
   {
1199
      int data0=data[0];
1200
      /* Convert "standard mode" to Opus header */
1201
# ifndef ENABLE_QEXT
1202
      if (mode->Fs==48000 && mode->shortMdctSize==120)
1203
# endif
1204
      {
1205
         data0 = fromOpus(data0);
1206
         if (data0<0)
1207
            return OPUS_INVALID_PACKET;
1208
      }
1209
      st->end = end = IMAX(1, mode->effEBands-2*(data0>>5));
1210
      LM = (data0>>3)&0x3;
1211
      C = 1 + ((data0>>2)&0x1);
1212
      if ((data[0] & 0x03) == 0x03) {
1213
         data++;
1214
         len--;
1215
         if (len<=0)
1216
            return OPUS_INVALID_PACKET;
1217
         if (data[0] & 0x40) {
1218
            int p;
1219
            int padding=0;
1220
            data++;
1221
            len--;
1222
            do {
1223
               int tmp;
1224
               if (len<=0)
1225
                  return OPUS_INVALID_PACKET;
1226
               p = *data++;
1227
               len--;
1228
               tmp = p==255 ? 254: p;
1229
               len -= tmp;
1230
               padding += tmp;
1231
            } while (p==255);
1232
            padding--;
1233
            if (len <= 0 || padding<0) return OPUS_INVALID_PACKET;
1234
#ifdef ENABLE_QEXT
1235
            qext_bytes = padding;
1236
            if (data[len] != QEXT_EXTENSION_ID<<1)
1237
               qext_bytes=0;
1238
            ec_dec_init(&ext_dec, (unsigned char*)data+len+1, qext_bytes);
1239
#endif
1240
         }
1241
      } else
1242
      {
1243
         data++;
1244
         len--;
1245
      }
1246
      if (LM>mode->maxLM)
1247
         return OPUS_INVALID_PACKET;
1248
      if (frame_size < mode->shortMdctSize<<LM)
1249
         return OPUS_BUFFER_TOO_SMALL;
1250
      else
1251
         frame_size = mode->shortMdctSize<<LM;
1252
   } else {
1253
#else
1254
264k
   {
1255
264k
#endif
1256
506k
      for (LM=0;LM<=mode->maxLM;LM++)
1257
506k
         if (mode->shortMdctSize<<LM==frame_size)
1258
264k
            break;
1259
264k
      if (LM>mode->maxLM)
1260
0
         return OPUS_BAD_ARG;
1261
264k
   }
1262
264k
   M=1<<LM;
1263
1264
264k
   if (len<0 || len>1275 || pcm==NULL)
1265
0
      return OPUS_BAD_ARG;
1266
1267
264k
   N = M*mode->shortMdctSize;
1268
414k
   c=0; do {
1269
414k
      decode_mem[c] = st->_decode_mem + c*(decode_buffer_size+overlap);
1270
414k
      out_syn[c] = decode_mem[c]+decode_buffer_size-N;
1271
414k
   } while (++c<CC);
1272
1273
264k
   effEnd = end;
1274
264k
   if (effEnd > mode->effEBands)
1275
0
      effEnd = mode->effEBands;
1276
1277
264k
   if (data == NULL || len<=1)
1278
117k
   {
1279
117k
      celt_decode_lost(st, N, LM
1280
#ifdef ENABLE_DEEP_PLC
1281
      , lpcnet
1282
#endif
1283
117k
                      );
1284
117k
      deemphasis(out_syn, pcm, N, CC, st->downsample, mode->preemph, st->preemph_memD, accum);
1285
117k
      RESTORE_STACK;
1286
117k
      return frame_size/st->downsample;
1287
117k
   }
1288
#ifdef ENABLE_DEEP_PLC
1289
   else {
1290
      /* FIXME: This is a bit of a hack just to make sure opus_decode_native() knows we're no longer in PLC. */
1291
      if (lpcnet) lpcnet->blend = 0;
1292
   }
1293
#endif
1294
1295
   /* Check if there are at least two packets received consecutively before
1296
    * turning on the pitch-based PLC */
1297
147k
   if (st->loss_duration == 0) st->skip_plc = 0;
1298
1299
147k
   if (dec == NULL)
1300
14.0k
   {
1301
14.0k
      ec_dec_init(&_dec,(unsigned char*)data,len);
1302
14.0k
      dec = &_dec;
1303
14.0k
   }
1304
1305
147k
   if (C==1)
1306
92.8k
   {
1307
2.04M
      for (i=0;i<nbEBands;i++)
1308
1.95M
         oldBandE[i]=MAXG(oldBandE[i],oldBandE[nbEBands+i]);
1309
92.8k
   }
1310
1311
147k
   total_bits = len*8;
1312
147k
   tell = ec_tell(dec);
1313
1314
147k
   if (tell >= total_bits)
1315
14.0k
      silence = 1;
1316
133k
   else if (tell==1)
1317
128k
      silence = ec_dec_bit_logp(dec, 15);
1318
4.86k
   else
1319
4.86k
      silence = 0;
1320
147k
   if (silence)
1321
20.2k
   {
1322
      /* Pretend we've read all the remaining bits */
1323
20.2k
      tell = len*8;
1324
20.2k
      dec->nbits_total+=tell-ec_tell(dec);
1325
20.2k
   }
1326
1327
147k
   postfilter_gain = 0;
1328
147k
   postfilter_pitch = 0;
1329
147k
   postfilter_tapset = 0;
1330
147k
   if (start==0 && tell+16 <= total_bits)
1331
72.3k
   {
1332
72.3k
      if(ec_dec_bit_logp(dec, 1))
1333
21.6k
      {
1334
21.6k
         int qg, octave;
1335
21.6k
         octave = ec_dec_uint(dec, 6);
1336
21.6k
         postfilter_pitch = (16<<octave)+ec_dec_bits(dec, 4+octave)-1;
1337
21.6k
         qg = ec_dec_bits(dec, 3);
1338
21.6k
         if (ec_tell(dec)+2<=total_bits)
1339
21.6k
            postfilter_tapset = ec_dec_icdf(dec, tapset_icdf, 2);
1340
21.6k
         postfilter_gain = QCONST16(.09375f,15)*(qg+1);
1341
21.6k
      }
1342
72.3k
      tell = ec_tell(dec);
1343
72.3k
   }
1344
1345
147k
   if (LM > 0 && tell+3 <= total_bits)
1346
66.1k
   {
1347
66.1k
      isTransient = ec_dec_bit_logp(dec, 3);
1348
66.1k
      tell = ec_tell(dec);
1349
66.1k
   }
1350
81.0k
   else
1351
81.0k
      isTransient = 0;
1352
1353
147k
   if (isTransient)
1354
15.0k
      shortBlocks = M;
1355
132k
   else
1356
132k
      shortBlocks = 0;
1357
1358
   /* Decode the global flags (first symbols in the stream) */
1359
147k
   intra_ener = tell+3<=total_bits ? ec_dec_bit_logp(dec, 3) : 0;
1360
   /* If recovering from packet loss, make sure we make the energy prediction safe to reduce the
1361
      risk of getting loud artifacts. */
1362
147k
   if (!intra_ener && st->loss_duration != 0) {
1363
28.1k
      c=0; do
1364
56.2k
      {
1365
56.2k
         celt_glog safety = 0;
1366
56.2k
         int missing = IMIN(10, st->loss_duration>>LM);
1367
56.2k
         if (LM==0) safety = GCONST(1.5f);
1368
6.51k
         else if (LM==1) safety = GCONST(.5f);
1369
1.01M
         for (i=start;i<end;i++)
1370
960k
         {
1371
960k
            if (oldBandE[c*nbEBands+i] < MAXG(oldLogE[c*nbEBands+i], oldLogE2[c*nbEBands+i])) {
1372
               /* If energy is going down already, continue the trend. */
1373
397k
               opus_val32 slope;
1374
397k
               opus_val32 E0, E1, E2;
1375
397k
               E0 = oldBandE[c*nbEBands+i];
1376
397k
               E1 = oldLogE[c*nbEBands+i];
1377
397k
               E2 = oldLogE2[c*nbEBands+i];
1378
397k
               slope = MAX32(E1 - E0, HALF32(E2 - E0));
1379
397k
               slope = MING(slope, GCONST(2.f));
1380
397k
               E0 -= MAX32(0, (1+missing)*slope);
1381
397k
               oldBandE[c*nbEBands+i] = MAX32(-GCONST(20.f), E0);
1382
562k
            } else {
1383
               /* Otherwise take the min of the last frames. */
1384
562k
               oldBandE[c*nbEBands+i] = MING(MING(oldBandE[c*nbEBands+i], oldLogE[c*nbEBands+i]), oldLogE2[c*nbEBands+i]);
1385
562k
            }
1386
            /* Shorter frames have more natural fluctuations -- play it safe. */
1387
960k
            oldBandE[c*nbEBands+i] -= safety;
1388
960k
         }
1389
56.2k
      } while (++c<2);
1390
28.1k
   }
1391
   /* Get band energies */
1392
147k
   unquant_coarse_energy(mode, start, end, oldBandE,
1393
147k
         intra_ener, dec, C, LM);
1394
1395
147k
   ALLOC(tf_res, nbEBands, int);
1396
147k
   tf_decode(start, end, isTransient, tf_res, LM, dec);
1397
1398
147k
   tell = ec_tell(dec);
1399
147k
   spread_decision = SPREAD_NORMAL;
1400
147k
   if (tell+4 <= total_bits)
1401
48.9k
      spread_decision = ec_dec_icdf(dec, spread_icdf, 5);
1402
1403
147k
   ALLOC(cap, nbEBands, int);
1404
1405
147k
   init_caps(mode,cap,LM,C);
1406
1407
147k
   ALLOC(offsets, nbEBands, int);
1408
1409
147k
   dynalloc_logp = 6;
1410
147k
   total_bits<<=BITRES;
1411
147k
   tell = ec_tell_frac(dec);
1412
2.48M
   for (i=start;i<end;i++)
1413
2.33M
   {
1414
2.33M
      int width, quanta;
1415
2.33M
      int dynalloc_loop_logp;
1416
2.33M
      int boost;
1417
2.33M
      width = C*(eBands[i+1]-eBands[i])<<LM;
1418
      /* quanta is 6 bits, but no more than 1 bit/sample
1419
         and no less than 1/8 bit/sample */
1420
2.33M
      quanta = IMIN(width<<BITRES, IMAX(6<<BITRES, width));
1421
2.33M
      dynalloc_loop_logp = dynalloc_logp;
1422
2.33M
      boost = 0;
1423
2.38M
      while (tell+(dynalloc_loop_logp<<BITRES) < total_bits && boost < cap[i])
1424
735k
      {
1425
735k
         int flag;
1426
735k
         flag = ec_dec_bit_logp(dec, dynalloc_loop_logp);
1427
735k
         tell = ec_tell_frac(dec);
1428
735k
         if (!flag)
1429
685k
            break;
1430
49.7k
         boost += quanta;
1431
49.7k
         total_bits -= quanta;
1432
49.7k
         dynalloc_loop_logp = 1;
1433
49.7k
      }
1434
2.33M
      offsets[i] = boost;
1435
      /* Making dynalloc more likely */
1436
2.33M
      if (boost>0)
1437
12.1k
         dynalloc_logp = IMAX(2, dynalloc_logp-1);
1438
2.33M
   }
1439
1440
147k
   ALLOC(fine_quant, nbEBands, int);
1441
147k
   alloc_trim = tell+(6<<BITRES) <= total_bits ?
1442
104k
         ec_dec_icdf(dec, trim_icdf, 7) : 5;
1443
1444
147k
   bits = (((opus_int32)len*8)<<BITRES) - (opus_int32)ec_tell_frac(dec) - 1;
1445
147k
   anti_collapse_rsv = isTransient&&LM>=2&&bits>=((LM+2)<<BITRES) ? (1<<BITRES) : 0;
1446
147k
   bits -= anti_collapse_rsv;
1447
1448
147k
   ALLOC(pulses, nbEBands, int);
1449
147k
   ALLOC(fine_priority, nbEBands, int);
1450
1451
147k
   codedBands = clt_compute_allocation(mode, start, end, offsets, cap,
1452
147k
         alloc_trim, &intensity, &dual_stereo, bits, &balance, pulses,
1453
147k
         fine_quant, fine_priority, C, LM, dec, 0, 0, 0);
1454
1455
147k
   unquant_fine_energy(mode, start, end, oldBandE, NULL, fine_quant, dec, C);
1456
1457
147k
   ALLOC(X, C*N, celt_norm);   /**< Interleaved normalised MDCTs */
1458
1459
#ifdef ENABLE_QEXT
1460
   if (qext_bytes && end == nbEBands &&
1461
         ((mode->Fs == 48000 && (mode->shortMdctSize==120 || mode->shortMdctSize==90))
1462
       || (mode->Fs == 96000 && (mode->shortMdctSize==240 || mode->shortMdctSize==180)))) {
1463
      int qext_intra_ener;
1464
      compute_qext_mode(&qext_mode_struct, mode);
1465
      qext_mode = &qext_mode_struct;
1466
      qext_end = ec_dec_bit_logp(&ext_dec, 1) ? NB_QEXT_BANDS : 2;
1467
      if (C==2) decode_qext_stereo_params(&ext_dec, qext_end, &qext_intensity, &qext_dual_stereo);
1468
      qext_intra_ener = ec_tell(&ext_dec)+3<=qext_bytes*8 ? ec_dec_bit_logp(&ext_dec, 3) : 0;
1469
      unquant_coarse_energy(qext_mode, 0, qext_end, st->qext_oldBandE,
1470
            qext_intra_ener, &ext_dec, C, LM);
1471
   }
1472
   ALLOC(extra_quant, nbEBands+NB_QEXT_BANDS, int);
1473
   ALLOC(extra_pulses, nbEBands+NB_QEXT_BANDS, int);
1474
   qext_bits = ((opus_int32)qext_bytes*8<<BITRES) - (opus_int32)ec_tell_frac(dec) - 1;
1475
   clt_compute_extra_allocation(mode, qext_mode, start, end, qext_end, NULL, NULL,
1476
         qext_bits, extra_pulses, extra_quant, C, LM, &ext_dec, 0, 0, 0);
1477
   if (qext_bytes > 0) {
1478
      unquant_fine_energy(mode, start, end, oldBandE, fine_quant, extra_quant, &ext_dec, C);
1479
   }
1480
#endif
1481
1482
227k
   c=0; do {
1483
227k
      OPUS_MOVE(decode_mem[c], decode_mem[c]+N, decode_buffer_size-N+overlap);
1484
227k
   } while (++c<CC);
1485
1486
   /* Decode fixed codebook */
1487
147k
   ALLOC(collapse_masks, C*nbEBands, unsigned char);
1488
1489
147k
   quant_all_bands(0, mode, start, end, X, C==2 ? X+N : NULL, collapse_masks,
1490
147k
         NULL, pulses, shortBlocks, spread_decision, dual_stereo, intensity, tf_res,
1491
147k
         len*(8<<BITRES)-anti_collapse_rsv, balance, dec, LM, codedBands, &st->rng, 0,
1492
147k
         st->arch, st->disable_inv
1493
147k
         ARG_QEXT(&ext_dec) ARG_QEXT(extra_pulses)
1494
147k
         ARG_QEXT(qext_bytes*(8<<BITRES)) ARG_QEXT(cap));
1495
1496
#ifdef ENABLE_QEXT
1497
   if (qext_mode) {
1498
      VARDECL(int, zeros);
1499
      VARDECL(unsigned char, qext_collapse_masks);
1500
      ec_dec dummy_dec;
1501
      int ext_balance;
1502
      ALLOC(zeros, nbEBands, int);
1503
      ALLOC(qext_collapse_masks, C*NB_QEXT_BANDS, unsigned char);
1504
      ec_dec_init(&dummy_dec, NULL, 0);
1505
      OPUS_CLEAR(zeros, end);
1506
      ext_balance = qext_bytes*(8<<BITRES) - ec_tell_frac(&ext_dec);
1507
      for (i=0;i<qext_end;i++) ext_balance -= extra_pulses[nbEBands+i] + C*(extra_quant[nbEBands+1]<<BITRES);
1508
      unquant_fine_energy(qext_mode, 0, qext_end, st->qext_oldBandE, NULL, &extra_quant[nbEBands], &ext_dec, C);
1509
      quant_all_bands(0, qext_mode, 0, qext_end, X, C==2 ? X+N : NULL, qext_collapse_masks,
1510
            NULL, &extra_pulses[nbEBands], shortBlocks, spread_decision, qext_dual_stereo, qext_intensity, zeros,
1511
            qext_bytes*(8<<BITRES), ext_balance, &ext_dec, LM, qext_end, &st->rng, 0,
1512
            st->arch, st->disable_inv, &dummy_dec, zeros, 0, NULL);
1513
   }
1514
#endif
1515
1516
147k
   if (anti_collapse_rsv > 0)
1517
4.26k
   {
1518
4.26k
      anti_collapse_on = ec_dec_bits(dec, 1);
1519
4.26k
   }
1520
147k
   unquant_energy_finalise(mode, start, end, (qext_bytes > 0) ? NULL : oldBandE,
1521
147k
         fine_quant, fine_priority, len*8-ec_tell(dec), dec, C);
1522
147k
   if (anti_collapse_on)
1523
3.13k
      anti_collapse(mode, X, collapse_masks, LM, C, N,
1524
3.13k
            start, end, oldBandE, oldLogE, oldLogE2, pulses, st->rng, 0, st->arch);
1525
1526
147k
   if (silence)
1527
20.2k
   {
1528
691k
      for (i=0;i<C*nbEBands;i++)
1529
671k
         oldBandE[i] = -GCONST(28.f);
1530
20.2k
   }
1531
147k
   if (st->prefilter_and_fold) {
1532
29.5k
      prefilter_and_fold(st, N);
1533
29.5k
   }
1534
147k
   celt_synthesis(mode, X, out_syn, oldBandE, start, effEnd,
1535
147k
                  C, CC, isTransient, LM, st->downsample, silence, st->arch ARG_QEXT(qext_mode) ARG_QEXT(st->qext_oldBandE) ARG_QEXT(qext_end));
1536
1537
227k
   c=0; do {
1538
227k
      st->postfilter_period=IMAX(st->postfilter_period, COMBFILTER_MINPERIOD);
1539
227k
      st->postfilter_period_old=IMAX(st->postfilter_period_old, COMBFILTER_MINPERIOD);
1540
227k
      comb_filter(out_syn[c], out_syn[c], st->postfilter_period_old, st->postfilter_period, mode->shortMdctSize,
1541
227k
            st->postfilter_gain_old, st->postfilter_gain, st->postfilter_tapset_old, st->postfilter_tapset,
1542
227k
            mode->window, overlap, st->arch);
1543
227k
      if (LM!=0)
1544
119k
         comb_filter(out_syn[c]+mode->shortMdctSize, out_syn[c]+mode->shortMdctSize, st->postfilter_period, postfilter_pitch, N-mode->shortMdctSize,
1545
119k
               st->postfilter_gain, postfilter_gain, st->postfilter_tapset, postfilter_tapset,
1546
119k
               mode->window, overlap, st->arch);
1547
1548
227k
   } while (++c<CC);
1549
147k
   st->postfilter_period_old = st->postfilter_period;
1550
147k
   st->postfilter_gain_old = st->postfilter_gain;
1551
147k
   st->postfilter_tapset_old = st->postfilter_tapset;
1552
147k
   st->postfilter_period = postfilter_pitch;
1553
147k
   st->postfilter_gain = postfilter_gain;
1554
147k
   st->postfilter_tapset = postfilter_tapset;
1555
147k
   if (LM!=0)
1556
82.6k
   {
1557
82.6k
      st->postfilter_period_old = st->postfilter_period;
1558
82.6k
      st->postfilter_gain_old = st->postfilter_gain;
1559
82.6k
      st->postfilter_tapset_old = st->postfilter_tapset;
1560
82.6k
   }
1561
1562
147k
   if (C==1)
1563
92.8k
      OPUS_COPY(&oldBandE[nbEBands], oldBandE, nbEBands);
1564
1565
147k
   if (!isTransient)
1566
132k
   {
1567
132k
      OPUS_COPY(oldLogE2, oldLogE, 2*nbEBands);
1568
132k
      OPUS_COPY(oldLogE, oldBandE, 2*nbEBands);
1569
132k
   } else {
1570
649k
      for (i=0;i<2*nbEBands;i++)
1571
634k
         oldLogE[i] = MING(oldLogE[i], oldBandE[i]);
1572
15.0k
   }
1573
   /* In normal circumstances, we only allow the noise floor to increase by
1574
      up to 2.4 dB/second, but when we're in DTX we give the weight of
1575
      all missing packets to the update packet. */
1576
147k
   max_background_increase = IMIN(160, st->loss_duration+M)*GCONST(0.001f);
1577
6.33M
   for (i=0;i<2*nbEBands;i++)
1578
6.18M
      backgroundLogE[i] = MING(backgroundLogE[i] + max_background_increase, oldBandE[i]);
1579
   /* In case start or end were to change */
1580
147k
   c=0; do
1581
294k
   {
1582
937k
      for (i=0;i<start;i++)
1583
643k
      {
1584
643k
         oldBandE[c*nbEBands+i]=0;
1585
643k
         oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-GCONST(28.f);
1586
643k
      }
1587
1.16M
      for (i=end;i<nbEBands;i++)
1588
873k
      {
1589
873k
         oldBandE[c*nbEBands+i]=0;
1590
873k
         oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-GCONST(28.f);
1591
873k
      }
1592
294k
   } while (++c<2);
1593
147k
   st->rng = dec->rng;
1594
#ifdef ENABLE_QEXT
1595
   if (qext_bytes) st->rng = st->rng ^ ext_dec.rng;
1596
#endif
1597
1598
147k
   deemphasis(out_syn, pcm, N, CC, st->downsample, mode->preemph, st->preemph_memD, accum);
1599
147k
   st->loss_duration = 0;
1600
147k
   st->plc_duration = 0;
1601
147k
   st->last_frame_type = FRAME_NORMAL;
1602
147k
   st->prefilter_and_fold = 0;
1603
147k
   RESTORE_STACK;
1604
147k
   if (ec_tell(dec) > 8*len)
1605
4
      return OPUS_INTERNAL_ERROR;
1606
#ifdef ENABLE_QEXT
1607
   if (qext_bytes != 0 && ec_tell(&ext_dec) > 8*qext_bytes)
1608
      return OPUS_INTERNAL_ERROR;
1609
#endif
1610
147k
   if(ec_get_error(dec))
1611
1.90k
      st->error = 1;
1612
147k
   return frame_size/st->downsample;
1613
147k
}
celt_decode_with_ec_dred
Line
Count
Source
1107
275k
{
1108
275k
   int c, i, N;
1109
275k
   int spread_decision;
1110
275k
   opus_int32 bits;
1111
275k
   ec_dec _dec;
1112
275k
   VARDECL(celt_norm, X);
1113
275k
   VARDECL(int, fine_quant);
1114
275k
   VARDECL(int, pulses);
1115
275k
   VARDECL(int, cap);
1116
275k
   VARDECL(int, offsets);
1117
275k
   VARDECL(int, fine_priority);
1118
275k
   VARDECL(int, tf_res);
1119
275k
   VARDECL(unsigned char, collapse_masks);
1120
275k
   celt_sig *decode_mem[2];
1121
275k
   celt_sig *out_syn[2];
1122
275k
   celt_glog *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE;
1123
1124
275k
   int shortBlocks;
1125
275k
   int isTransient;
1126
275k
   int intra_ener;
1127
275k
   const int CC = st->channels;
1128
275k
   int LM, M;
1129
275k
   int start;
1130
275k
   int end;
1131
275k
   int effEnd;
1132
275k
   int codedBands;
1133
275k
   int alloc_trim;
1134
275k
   int postfilter_pitch;
1135
275k
   opus_val16 postfilter_gain;
1136
275k
   int intensity=0;
1137
275k
   int dual_stereo=0;
1138
275k
   opus_int32 total_bits;
1139
275k
   opus_int32 balance;
1140
275k
   opus_int32 tell;
1141
275k
   int dynalloc_logp;
1142
275k
   int postfilter_tapset;
1143
275k
   int anti_collapse_rsv;
1144
275k
   int anti_collapse_on=0;
1145
275k
   int silence;
1146
275k
   int C = st->stream_channels;
1147
275k
   const OpusCustomMode *mode;
1148
275k
   int nbEBands;
1149
275k
   int overlap;
1150
275k
   const opus_int16 *eBands;
1151
275k
   celt_glog max_background_increase;
1152
275k
   int decode_buffer_size;
1153
275k
#ifdef ENABLE_QEXT
1154
275k
   opus_int32 qext_bits;
1155
275k
   ec_dec ext_dec;
1156
275k
   int qext_bytes=0;
1157
275k
   int qext_end=0;
1158
275k
   int qext_intensity=0;
1159
275k
   int qext_dual_stereo=0;
1160
275k
   VARDECL(int, extra_quant);
1161
275k
   VARDECL(int, extra_pulses);
1162
275k
   const CELTMode *qext_mode = NULL;
1163
275k
   CELTMode qext_mode_struct;
1164
275k
   int qext_scale;
1165
#else
1166
# define qext_bytes 0
1167
#endif
1168
275k
   ALLOC_STACK;
1169
275k
#ifdef ENABLE_QEXT
1170
275k
   qext_scale = st->qext_scale;
1171
275k
#endif
1172
275k
   decode_buffer_size = QEXT_SCALE(DECODE_BUFFER_SIZE);
1173
1174
275k
   VALIDATE_CELT_DECODER(st);
1175
275k
   mode = st->mode;
1176
275k
   nbEBands = mode->nbEBands;
1177
275k
   overlap = mode->overlap;
1178
275k
   eBands = mode->eBands;
1179
275k
   start = st->start;
1180
275k
   end = st->end;
1181
275k
   frame_size *= st->downsample;
1182
1183
275k
   oldBandE = (celt_glog*)(st->_decode_mem+(decode_buffer_size+overlap)*CC);
1184
275k
   oldLogE = oldBandE + 2*nbEBands;
1185
275k
   oldLogE2 = oldLogE + 2*nbEBands;
1186
275k
   backgroundLogE = oldLogE2 + 2*nbEBands;
1187
1188
275k
#ifdef ENABLE_QEXT
1189
275k
   if (qext_payload) {
1190
13.0k
      ec_dec_init(&ext_dec, (unsigned char*)qext_payload, qext_payload_len);
1191
13.0k
      qext_bytes = qext_payload_len;
1192
262k
   } else {
1193
262k
      ec_dec_init(&ext_dec, NULL, 0);
1194
262k
   }
1195
275k
#endif
1196
#if defined(CUSTOM_MODES) || defined(ENABLE_OPUS_CUSTOM_API)
1197
   if (st->signalling && data!=NULL)
1198
   {
1199
      int data0=data[0];
1200
      /* Convert "standard mode" to Opus header */
1201
# ifndef ENABLE_QEXT
1202
      if (mode->Fs==48000 && mode->shortMdctSize==120)
1203
# endif
1204
      {
1205
         data0 = fromOpus(data0);
1206
         if (data0<0)
1207
            return OPUS_INVALID_PACKET;
1208
      }
1209
      st->end = end = IMAX(1, mode->effEBands-2*(data0>>5));
1210
      LM = (data0>>3)&0x3;
1211
      C = 1 + ((data0>>2)&0x1);
1212
      if ((data[0] & 0x03) == 0x03) {
1213
         data++;
1214
         len--;
1215
         if (len<=0)
1216
            return OPUS_INVALID_PACKET;
1217
         if (data[0] & 0x40) {
1218
            int p;
1219
            int padding=0;
1220
            data++;
1221
            len--;
1222
            do {
1223
               int tmp;
1224
               if (len<=0)
1225
                  return OPUS_INVALID_PACKET;
1226
               p = *data++;
1227
               len--;
1228
               tmp = p==255 ? 254: p;
1229
               len -= tmp;
1230
               padding += tmp;
1231
            } while (p==255);
1232
            padding--;
1233
            if (len <= 0 || padding<0) return OPUS_INVALID_PACKET;
1234
#ifdef ENABLE_QEXT
1235
            qext_bytes = padding;
1236
            if (data[len] != QEXT_EXTENSION_ID<<1)
1237
               qext_bytes=0;
1238
            ec_dec_init(&ext_dec, (unsigned char*)data+len+1, qext_bytes);
1239
#endif
1240
         }
1241
      } else
1242
      {
1243
         data++;
1244
         len--;
1245
      }
1246
      if (LM>mode->maxLM)
1247
         return OPUS_INVALID_PACKET;
1248
      if (frame_size < mode->shortMdctSize<<LM)
1249
         return OPUS_BUFFER_TOO_SMALL;
1250
      else
1251
         frame_size = mode->shortMdctSize<<LM;
1252
   } else {
1253
#else
1254
275k
   {
1255
275k
#endif
1256
499k
      for (LM=0;LM<=mode->maxLM;LM++)
1257
499k
         if (mode->shortMdctSize<<LM==frame_size)
1258
275k
            break;
1259
275k
      if (LM>mode->maxLM)
1260
0
         return OPUS_BAD_ARG;
1261
275k
   }
1262
275k
   M=1<<LM;
1263
1264
275k
   if (len<0 || len>1275 || pcm==NULL)
1265
0
      return OPUS_BAD_ARG;
1266
1267
275k
   N = M*mode->shortMdctSize;
1268
410k
   c=0; do {
1269
410k
      decode_mem[c] = st->_decode_mem + c*(decode_buffer_size+overlap);
1270
410k
      out_syn[c] = decode_mem[c]+decode_buffer_size-N;
1271
410k
   } while (++c<CC);
1272
1273
275k
   effEnd = end;
1274
275k
   if (effEnd > mode->effEBands)
1275
0
      effEnd = mode->effEBands;
1276
1277
275k
   if (data == NULL || len<=1)
1278
115k
   {
1279
115k
      celt_decode_lost(st, N, LM
1280
#ifdef ENABLE_DEEP_PLC
1281
      , lpcnet
1282
#endif
1283
115k
                      );
1284
115k
      deemphasis(out_syn, pcm, N, CC, st->downsample, mode->preemph, st->preemph_memD, accum);
1285
115k
      RESTORE_STACK;
1286
115k
      return frame_size/st->downsample;
1287
115k
   }
1288
#ifdef ENABLE_DEEP_PLC
1289
   else {
1290
      /* FIXME: This is a bit of a hack just to make sure opus_decode_native() knows we're no longer in PLC. */
1291
      if (lpcnet) lpcnet->blend = 0;
1292
   }
1293
#endif
1294
1295
   /* Check if there are at least two packets received consecutively before
1296
    * turning on the pitch-based PLC */
1297
159k
   if (st->loss_duration == 0) st->skip_plc = 0;
1298
1299
159k
   if (dec == NULL)
1300
16.3k
   {
1301
16.3k
      ec_dec_init(&_dec,(unsigned char*)data,len);
1302
16.3k
      dec = &_dec;
1303
16.3k
   }
1304
1305
159k
   if (C==1)
1306
102k
   {
1307
2.24M
      for (i=0;i<nbEBands;i++)
1308
2.14M
         oldBandE[i]=MAXG(oldBandE[i],oldBandE[nbEBands+i]);
1309
102k
   }
1310
1311
159k
   total_bits = len*8;
1312
159k
   tell = ec_tell(dec);
1313
1314
159k
   if (tell >= total_bits)
1315
11.3k
      silence = 1;
1316
148k
   else if (tell==1)
1317
141k
      silence = ec_dec_bit_logp(dec, 15);
1318
6.80k
   else
1319
6.80k
      silence = 0;
1320
159k
   if (silence)
1321
19.7k
   {
1322
      /* Pretend we've read all the remaining bits */
1323
19.7k
      tell = len*8;
1324
19.7k
      dec->nbits_total+=tell-ec_tell(dec);
1325
19.7k
   }
1326
1327
159k
   postfilter_gain = 0;
1328
159k
   postfilter_pitch = 0;
1329
159k
   postfilter_tapset = 0;
1330
159k
   if (start==0 && tell+16 <= total_bits)
1331
101k
   {
1332
101k
      if(ec_dec_bit_logp(dec, 1))
1333
28.3k
      {
1334
28.3k
         int qg, octave;
1335
28.3k
         octave = ec_dec_uint(dec, 6);
1336
28.3k
         postfilter_pitch = (16<<octave)+ec_dec_bits(dec, 4+octave)-1;
1337
28.3k
         qg = ec_dec_bits(dec, 3);
1338
28.3k
         if (ec_tell(dec)+2<=total_bits)
1339
28.3k
            postfilter_tapset = ec_dec_icdf(dec, tapset_icdf, 2);
1340
28.3k
         postfilter_gain = QCONST16(.09375f,15)*(qg+1);
1341
28.3k
      }
1342
101k
      tell = ec_tell(dec);
1343
101k
   }
1344
1345
159k
   if (LM > 0 && tell+3 <= total_bits)
1346
73.2k
   {
1347
73.2k
      isTransient = ec_dec_bit_logp(dec, 3);
1348
73.2k
      tell = ec_tell(dec);
1349
73.2k
   }
1350
86.6k
   else
1351
86.6k
      isTransient = 0;
1352
1353
159k
   if (isTransient)
1354
13.7k
      shortBlocks = M;
1355
146k
   else
1356
146k
      shortBlocks = 0;
1357
1358
   /* Decode the global flags (first symbols in the stream) */
1359
159k
   intra_ener = tell+3<=total_bits ? ec_dec_bit_logp(dec, 3) : 0;
1360
   /* If recovering from packet loss, make sure we make the energy prediction safe to reduce the
1361
      risk of getting loud artifacts. */
1362
159k
   if (!intra_ener && st->loss_duration != 0) {
1363
33.8k
      c=0; do
1364
67.6k
      {
1365
67.6k
         celt_glog safety = 0;
1366
67.6k
         int missing = IMIN(10, st->loss_duration>>LM);
1367
67.6k
         if (LM==0) safety = GCONST(1.5f);
1368
6.98k
         else if (LM==1) safety = GCONST(.5f);
1369
1.21M
         for (i=start;i<end;i++)
1370
1.14M
         {
1371
1.14M
            if (oldBandE[c*nbEBands+i] < MAXG(oldLogE[c*nbEBands+i], oldLogE2[c*nbEBands+i])) {
1372
               /* If energy is going down already, continue the trend. */
1373
486k
               opus_val32 slope;
1374
486k
               opus_val32 E0, E1, E2;
1375
486k
               E0 = oldBandE[c*nbEBands+i];
1376
486k
               E1 = oldLogE[c*nbEBands+i];
1377
486k
               E2 = oldLogE2[c*nbEBands+i];
1378
486k
               slope = MAX32(E1 - E0, HALF32(E2 - E0));
1379
486k
               slope = MING(slope, GCONST(2.f));
1380
486k
               E0 -= MAX32(0, (1+missing)*slope);
1381
486k
               oldBandE[c*nbEBands+i] = MAX32(-GCONST(20.f), E0);
1382
661k
            } else {
1383
               /* Otherwise take the min of the last frames. */
1384
661k
               oldBandE[c*nbEBands+i] = MING(MING(oldBandE[c*nbEBands+i], oldLogE[c*nbEBands+i]), oldLogE2[c*nbEBands+i]);
1385
661k
            }
1386
            /* Shorter frames have more natural fluctuations -- play it safe. */
1387
1.14M
            oldBandE[c*nbEBands+i] -= safety;
1388
1.14M
         }
1389
67.6k
      } while (++c<2);
1390
33.8k
   }
1391
   /* Get band energies */
1392
159k
   unquant_coarse_energy(mode, start, end, oldBandE,
1393
159k
         intra_ener, dec, C, LM);
1394
1395
159k
   ALLOC(tf_res, nbEBands, int);
1396
159k
   tf_decode(start, end, isTransient, tf_res, LM, dec);
1397
1398
159k
   tell = ec_tell(dec);
1399
159k
   spread_decision = SPREAD_NORMAL;
1400
159k
   if (tell+4 <= total_bits)
1401
67.6k
      spread_decision = ec_dec_icdf(dec, spread_icdf, 5);
1402
1403
159k
   ALLOC(cap, nbEBands, int);
1404
1405
159k
   init_caps(mode,cap,LM,C);
1406
1407
159k
   ALLOC(offsets, nbEBands, int);
1408
1409
159k
   dynalloc_logp = 6;
1410
159k
   total_bits<<=BITRES;
1411
159k
   tell = ec_tell_frac(dec);
1412
2.75M
   for (i=start;i<end;i++)
1413
2.59M
   {
1414
2.59M
      int width, quanta;
1415
2.59M
      int dynalloc_loop_logp;
1416
2.59M
      int boost;
1417
2.59M
      width = C*(eBands[i+1]-eBands[i])<<LM;
1418
      /* quanta is 6 bits, but no more than 1 bit/sample
1419
         and no less than 1/8 bit/sample */
1420
2.59M
      quanta = IMIN(width<<BITRES, IMAX(6<<BITRES, width));
1421
2.59M
      dynalloc_loop_logp = dynalloc_logp;
1422
2.59M
      boost = 0;
1423
2.65M
      while (tell+(dynalloc_loop_logp<<BITRES) < total_bits && boost < cap[i])
1424
1.06M
      {
1425
1.06M
         int flag;
1426
1.06M
         flag = ec_dec_bit_logp(dec, dynalloc_loop_logp);
1427
1.06M
         tell = ec_tell_frac(dec);
1428
1.06M
         if (!flag)
1429
1.00M
            break;
1430
58.6k
         boost += quanta;
1431
58.6k
         total_bits -= quanta;
1432
58.6k
         dynalloc_loop_logp = 1;
1433
58.6k
      }
1434
2.59M
      offsets[i] = boost;
1435
      /* Making dynalloc more likely */
1436
2.59M
      if (boost>0)
1437
18.9k
         dynalloc_logp = IMAX(2, dynalloc_logp-1);
1438
2.59M
   }
1439
1440
159k
   ALLOC(fine_quant, nbEBands, int);
1441
159k
   alloc_trim = tell+(6<<BITRES) <= total_bits ?
1442
98.9k
         ec_dec_icdf(dec, trim_icdf, 7) : 5;
1443
1444
159k
   bits = (((opus_int32)len*8)<<BITRES) - (opus_int32)ec_tell_frac(dec) - 1;
1445
159k
   anti_collapse_rsv = isTransient&&LM>=2&&bits>=((LM+2)<<BITRES) ? (1<<BITRES) : 0;
1446
159k
   bits -= anti_collapse_rsv;
1447
1448
159k
   ALLOC(pulses, nbEBands, int);
1449
159k
   ALLOC(fine_priority, nbEBands, int);
1450
1451
159k
   codedBands = clt_compute_allocation(mode, start, end, offsets, cap,
1452
159k
         alloc_trim, &intensity, &dual_stereo, bits, &balance, pulses,
1453
159k
         fine_quant, fine_priority, C, LM, dec, 0, 0, 0);
1454
1455
159k
   unquant_fine_energy(mode, start, end, oldBandE, NULL, fine_quant, dec, C);
1456
1457
159k
   ALLOC(X, C*N, celt_norm);   /**< Interleaved normalised MDCTs */
1458
1459
159k
#ifdef ENABLE_QEXT
1460
159k
   if (qext_bytes && end == nbEBands &&
1461
8.44k
         ((mode->Fs == 48000 && (mode->shortMdctSize==120 || mode->shortMdctSize==90))
1462
8.44k
       || (mode->Fs == 96000 && (mode->shortMdctSize==240 || mode->shortMdctSize==180)))) {
1463
8.44k
      int qext_intra_ener;
1464
8.44k
      compute_qext_mode(&qext_mode_struct, mode);
1465
8.44k
      qext_mode = &qext_mode_struct;
1466
8.44k
      qext_end = ec_dec_bit_logp(&ext_dec, 1) ? NB_QEXT_BANDS : 2;
1467
8.44k
      if (C==2) decode_qext_stereo_params(&ext_dec, qext_end, &qext_intensity, &qext_dual_stereo);
1468
8.44k
      qext_intra_ener = ec_tell(&ext_dec)+3<=qext_bytes*8 ? ec_dec_bit_logp(&ext_dec, 3) : 0;
1469
8.44k
      unquant_coarse_energy(qext_mode, 0, qext_end, st->qext_oldBandE,
1470
8.44k
            qext_intra_ener, &ext_dec, C, LM);
1471
8.44k
   }
1472
159k
   ALLOC(extra_quant, nbEBands+NB_QEXT_BANDS, int);
1473
159k
   ALLOC(extra_pulses, nbEBands+NB_QEXT_BANDS, int);
1474
159k
   qext_bits = ((opus_int32)qext_bytes*8<<BITRES) - (opus_int32)ec_tell_frac(dec) - 1;
1475
159k
   clt_compute_extra_allocation(mode, qext_mode, start, end, qext_end, NULL, NULL,
1476
159k
         qext_bits, extra_pulses, extra_quant, C, LM, &ext_dec, 0, 0, 0);
1477
159k
   if (qext_bytes > 0) {
1478
11.2k
      unquant_fine_energy(mode, start, end, oldBandE, fine_quant, extra_quant, &ext_dec, C);
1479
11.2k
   }
1480
159k
#endif
1481
1482
235k
   c=0; do {
1483
235k
      OPUS_MOVE(decode_mem[c], decode_mem[c]+N, decode_buffer_size-N+overlap);
1484
235k
   } while (++c<CC);
1485
1486
   /* Decode fixed codebook */
1487
159k
   ALLOC(collapse_masks, C*nbEBands, unsigned char);
1488
1489
159k
   quant_all_bands(0, mode, start, end, X, C==2 ? X+N : NULL, collapse_masks,
1490
159k
         NULL, pulses, shortBlocks, spread_decision, dual_stereo, intensity, tf_res,
1491
159k
         len*(8<<BITRES)-anti_collapse_rsv, balance, dec, LM, codedBands, &st->rng, 0,
1492
159k
         st->arch, st->disable_inv
1493
159k
         ARG_QEXT(&ext_dec) ARG_QEXT(extra_pulses)
1494
159k
         ARG_QEXT(qext_bytes*(8<<BITRES)) ARG_QEXT(cap));
1495
1496
159k
#ifdef ENABLE_QEXT
1497
159k
   if (qext_mode) {
1498
8.44k
      VARDECL(int, zeros);
1499
8.44k
      VARDECL(unsigned char, qext_collapse_masks);
1500
8.44k
      ec_dec dummy_dec;
1501
8.44k
      int ext_balance;
1502
8.44k
      ALLOC(zeros, nbEBands, int);
1503
8.44k
      ALLOC(qext_collapse_masks, C*NB_QEXT_BANDS, unsigned char);
1504
8.44k
      ec_dec_init(&dummy_dec, NULL, 0);
1505
8.44k
      OPUS_CLEAR(zeros, end);
1506
8.44k
      ext_balance = qext_bytes*(8<<BITRES) - ec_tell_frac(&ext_dec);
1507
56.3k
      for (i=0;i<qext_end;i++) ext_balance -= extra_pulses[nbEBands+i] + C*(extra_quant[nbEBands+1]<<BITRES);
1508
8.44k
      unquant_fine_energy(qext_mode, 0, qext_end, st->qext_oldBandE, NULL, &extra_quant[nbEBands], &ext_dec, C);
1509
8.44k
      quant_all_bands(0, qext_mode, 0, qext_end, X, C==2 ? X+N : NULL, qext_collapse_masks,
1510
8.44k
            NULL, &extra_pulses[nbEBands], shortBlocks, spread_decision, qext_dual_stereo, qext_intensity, zeros,
1511
8.44k
            qext_bytes*(8<<BITRES), ext_balance, &ext_dec, LM, qext_end, &st->rng, 0,
1512
8.44k
            st->arch, st->disable_inv, &dummy_dec, zeros, 0, NULL);
1513
8.44k
   }
1514
159k
#endif
1515
1516
159k
   if (anti_collapse_rsv > 0)
1517
5.00k
   {
1518
5.00k
      anti_collapse_on = ec_dec_bits(dec, 1);
1519
5.00k
   }
1520
159k
   unquant_energy_finalise(mode, start, end, (qext_bytes > 0) ? NULL : oldBandE,
1521
159k
         fine_quant, fine_priority, len*8-ec_tell(dec), dec, C);
1522
159k
   if (anti_collapse_on)
1523
3.60k
      anti_collapse(mode, X, collapse_masks, LM, C, N,
1524
3.60k
            start, end, oldBandE, oldLogE, oldLogE2, pulses, st->rng, 0, st->arch);
1525
1526
159k
   if (silence)
1527
19.7k
   {
1528
697k
      for (i=0;i<C*nbEBands;i++)
1529
678k
         oldBandE[i] = -GCONST(28.f);
1530
19.7k
   }
1531
159k
   if (st->prefilter_and_fold) {
1532
34.7k
      prefilter_and_fold(st, N);
1533
34.7k
   }
1534
159k
   celt_synthesis(mode, X, out_syn, oldBandE, start, effEnd,
1535
159k
                  C, CC, isTransient, LM, st->downsample, silence, st->arch ARG_QEXT(qext_mode) ARG_QEXT(st->qext_oldBandE) ARG_QEXT(qext_end));
1536
1537
235k
   c=0; do {
1538
235k
      st->postfilter_period=IMAX(st->postfilter_period, COMBFILTER_MINPERIOD);
1539
235k
      st->postfilter_period_old=IMAX(st->postfilter_period_old, COMBFILTER_MINPERIOD);
1540
235k
      comb_filter(out_syn[c], out_syn[c], st->postfilter_period_old, st->postfilter_period, mode->shortMdctSize,
1541
235k
            st->postfilter_gain_old, st->postfilter_gain, st->postfilter_tapset_old, st->postfilter_tapset,
1542
235k
            mode->window, overlap, st->arch);
1543
235k
      if (LM!=0)
1544
123k
         comb_filter(out_syn[c]+mode->shortMdctSize, out_syn[c]+mode->shortMdctSize, st->postfilter_period, postfilter_pitch, N-mode->shortMdctSize,
1545
123k
               st->postfilter_gain, postfilter_gain, st->postfilter_tapset, postfilter_tapset,
1546
123k
               mode->window, overlap, st->arch);
1547
1548
235k
   } while (++c<CC);
1549
159k
   st->postfilter_period_old = st->postfilter_period;
1550
159k
   st->postfilter_gain_old = st->postfilter_gain;
1551
159k
   st->postfilter_tapset_old = st->postfilter_tapset;
1552
159k
   st->postfilter_period = postfilter_pitch;
1553
159k
   st->postfilter_gain = postfilter_gain;
1554
159k
   st->postfilter_tapset = postfilter_tapset;
1555
159k
   if (LM!=0)
1556
87.0k
   {
1557
87.0k
      st->postfilter_period_old = st->postfilter_period;
1558
87.0k
      st->postfilter_gain_old = st->postfilter_gain;
1559
87.0k
      st->postfilter_tapset_old = st->postfilter_tapset;
1560
87.0k
   }
1561
1562
159k
   if (C==1)
1563
102k
      OPUS_COPY(&oldBandE[nbEBands], oldBandE, nbEBands);
1564
1565
159k
   if (!isTransient)
1566
146k
   {
1567
146k
      OPUS_COPY(oldLogE2, oldLogE, 2*nbEBands);
1568
146k
      OPUS_COPY(oldLogE, oldBandE, 2*nbEBands);
1569
146k
   } else {
1570
590k
      for (i=0;i<2*nbEBands;i++)
1571
576k
         oldLogE[i] = MING(oldLogE[i], oldBandE[i]);
1572
13.7k
   }
1573
   /* In normal circumstances, we only allow the noise floor to increase by
1574
      up to 2.4 dB/second, but when we're in DTX we give the weight of
1575
      all missing packets to the update packet. */
1576
159k
   max_background_increase = IMIN(160, st->loss_duration+M)*GCONST(0.001f);
1577
6.87M
   for (i=0;i<2*nbEBands;i++)
1578
6.71M
      backgroundLogE[i] = MING(backgroundLogE[i] + max_background_increase, oldBandE[i]);
1579
   /* In case start or end were to change */
1580
159k
   c=0; do
1581
319k
   {
1582
937k
      for (i=0;i<start;i++)
1583
617k
      {
1584
617k
         oldBandE[c*nbEBands+i]=0;
1585
617k
         oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-GCONST(28.f);
1586
617k
      }
1587
1.23M
      for (i=end;i<nbEBands;i++)
1588
919k
      {
1589
919k
         oldBandE[c*nbEBands+i]=0;
1590
919k
         oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-GCONST(28.f);
1591
919k
      }
1592
319k
   } while (++c<2);
1593
159k
   st->rng = dec->rng;
1594
159k
#ifdef ENABLE_QEXT
1595
159k
   if (qext_bytes) st->rng = st->rng ^ ext_dec.rng;
1596
159k
#endif
1597
1598
159k
   deemphasis(out_syn, pcm, N, CC, st->downsample, mode->preemph, st->preemph_memD, accum);
1599
159k
   st->loss_duration = 0;
1600
159k
   st->plc_duration = 0;
1601
159k
   st->last_frame_type = FRAME_NORMAL;
1602
159k
   st->prefilter_and_fold = 0;
1603
159k
   RESTORE_STACK;
1604
159k
   if (ec_tell(dec) > 8*len)
1605
2
      return OPUS_INTERNAL_ERROR;
1606
159k
#ifdef ENABLE_QEXT
1607
159k
   if (qext_bytes != 0 && ec_tell(&ext_dec) > 8*qext_bytes)
1608
0
      return OPUS_INTERNAL_ERROR;
1609
159k
#endif
1610
159k
   if(ec_get_error(dec))
1611
1.96k
      st->error = 1;
1612
159k
   return frame_size/st->downsample;
1613
159k
}
celt_decode_with_ec_dred
Line
Count
Source
1107
275k
{
1108
275k
   int c, i, N;
1109
275k
   int spread_decision;
1110
275k
   opus_int32 bits;
1111
275k
   ec_dec _dec;
1112
275k
   VARDECL(celt_norm, X);
1113
275k
   VARDECL(int, fine_quant);
1114
275k
   VARDECL(int, pulses);
1115
275k
   VARDECL(int, cap);
1116
275k
   VARDECL(int, offsets);
1117
275k
   VARDECL(int, fine_priority);
1118
275k
   VARDECL(int, tf_res);
1119
275k
   VARDECL(unsigned char, collapse_masks);
1120
275k
   celt_sig *decode_mem[2];
1121
275k
   celt_sig *out_syn[2];
1122
275k
   celt_glog *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE;
1123
1124
275k
   int shortBlocks;
1125
275k
   int isTransient;
1126
275k
   int intra_ener;
1127
275k
   const int CC = st->channels;
1128
275k
   int LM, M;
1129
275k
   int start;
1130
275k
   int end;
1131
275k
   int effEnd;
1132
275k
   int codedBands;
1133
275k
   int alloc_trim;
1134
275k
   int postfilter_pitch;
1135
275k
   opus_val16 postfilter_gain;
1136
275k
   int intensity=0;
1137
275k
   int dual_stereo=0;
1138
275k
   opus_int32 total_bits;
1139
275k
   opus_int32 balance;
1140
275k
   opus_int32 tell;
1141
275k
   int dynalloc_logp;
1142
275k
   int postfilter_tapset;
1143
275k
   int anti_collapse_rsv;
1144
275k
   int anti_collapse_on=0;
1145
275k
   int silence;
1146
275k
   int C = st->stream_channels;
1147
275k
   const OpusCustomMode *mode;
1148
275k
   int nbEBands;
1149
275k
   int overlap;
1150
275k
   const opus_int16 *eBands;
1151
275k
   celt_glog max_background_increase;
1152
275k
   int decode_buffer_size;
1153
275k
#ifdef ENABLE_QEXT
1154
275k
   opus_int32 qext_bits;
1155
275k
   ec_dec ext_dec;
1156
275k
   int qext_bytes=0;
1157
275k
   int qext_end=0;
1158
275k
   int qext_intensity=0;
1159
275k
   int qext_dual_stereo=0;
1160
275k
   VARDECL(int, extra_quant);
1161
275k
   VARDECL(int, extra_pulses);
1162
275k
   const CELTMode *qext_mode = NULL;
1163
275k
   CELTMode qext_mode_struct;
1164
275k
   int qext_scale;
1165
#else
1166
# define qext_bytes 0
1167
#endif
1168
275k
   ALLOC_STACK;
1169
275k
#ifdef ENABLE_QEXT
1170
275k
   qext_scale = st->qext_scale;
1171
275k
#endif
1172
275k
   decode_buffer_size = QEXT_SCALE(DECODE_BUFFER_SIZE);
1173
1174
275k
   VALIDATE_CELT_DECODER(st);
1175
275k
   mode = st->mode;
1176
275k
   nbEBands = mode->nbEBands;
1177
275k
   overlap = mode->overlap;
1178
275k
   eBands = mode->eBands;
1179
275k
   start = st->start;
1180
275k
   end = st->end;
1181
275k
   frame_size *= st->downsample;
1182
1183
275k
   oldBandE = (celt_glog*)(st->_decode_mem+(decode_buffer_size+overlap)*CC);
1184
275k
   oldLogE = oldBandE + 2*nbEBands;
1185
275k
   oldLogE2 = oldLogE + 2*nbEBands;
1186
275k
   backgroundLogE = oldLogE2 + 2*nbEBands;
1187
1188
275k
#ifdef ENABLE_QEXT
1189
275k
   if (qext_payload) {
1190
13.0k
      ec_dec_init(&ext_dec, (unsigned char*)qext_payload, qext_payload_len);
1191
13.0k
      qext_bytes = qext_payload_len;
1192
262k
   } else {
1193
262k
      ec_dec_init(&ext_dec, NULL, 0);
1194
262k
   }
1195
275k
#endif
1196
#if defined(CUSTOM_MODES) || defined(ENABLE_OPUS_CUSTOM_API)
1197
   if (st->signalling && data!=NULL)
1198
   {
1199
      int data0=data[0];
1200
      /* Convert "standard mode" to Opus header */
1201
# ifndef ENABLE_QEXT
1202
      if (mode->Fs==48000 && mode->shortMdctSize==120)
1203
# endif
1204
      {
1205
         data0 = fromOpus(data0);
1206
         if (data0<0)
1207
            return OPUS_INVALID_PACKET;
1208
      }
1209
      st->end = end = IMAX(1, mode->effEBands-2*(data0>>5));
1210
      LM = (data0>>3)&0x3;
1211
      C = 1 + ((data0>>2)&0x1);
1212
      if ((data[0] & 0x03) == 0x03) {
1213
         data++;
1214
         len--;
1215
         if (len<=0)
1216
            return OPUS_INVALID_PACKET;
1217
         if (data[0] & 0x40) {
1218
            int p;
1219
            int padding=0;
1220
            data++;
1221
            len--;
1222
            do {
1223
               int tmp;
1224
               if (len<=0)
1225
                  return OPUS_INVALID_PACKET;
1226
               p = *data++;
1227
               len--;
1228
               tmp = p==255 ? 254: p;
1229
               len -= tmp;
1230
               padding += tmp;
1231
            } while (p==255);
1232
            padding--;
1233
            if (len <= 0 || padding<0) return OPUS_INVALID_PACKET;
1234
#ifdef ENABLE_QEXT
1235
            qext_bytes = padding;
1236
            if (data[len] != QEXT_EXTENSION_ID<<1)
1237
               qext_bytes=0;
1238
            ec_dec_init(&ext_dec, (unsigned char*)data+len+1, qext_bytes);
1239
#endif
1240
         }
1241
      } else
1242
      {
1243
         data++;
1244
         len--;
1245
      }
1246
      if (LM>mode->maxLM)
1247
         return OPUS_INVALID_PACKET;
1248
      if (frame_size < mode->shortMdctSize<<LM)
1249
         return OPUS_BUFFER_TOO_SMALL;
1250
      else
1251
         frame_size = mode->shortMdctSize<<LM;
1252
   } else {
1253
#else
1254
275k
   {
1255
275k
#endif
1256
499k
      for (LM=0;LM<=mode->maxLM;LM++)
1257
499k
         if (mode->shortMdctSize<<LM==frame_size)
1258
275k
            break;
1259
275k
      if (LM>mode->maxLM)
1260
0
         return OPUS_BAD_ARG;
1261
275k
   }
1262
275k
   M=1<<LM;
1263
1264
275k
   if (len<0 || len>1275 || pcm==NULL)
1265
0
      return OPUS_BAD_ARG;
1266
1267
275k
   N = M*mode->shortMdctSize;
1268
410k
   c=0; do {
1269
410k
      decode_mem[c] = st->_decode_mem + c*(decode_buffer_size+overlap);
1270
410k
      out_syn[c] = decode_mem[c]+decode_buffer_size-N;
1271
410k
   } while (++c<CC);
1272
1273
275k
   effEnd = end;
1274
275k
   if (effEnd > mode->effEBands)
1275
0
      effEnd = mode->effEBands;
1276
1277
275k
   if (data == NULL || len<=1)
1278
115k
   {
1279
115k
      celt_decode_lost(st, N, LM
1280
#ifdef ENABLE_DEEP_PLC
1281
      , lpcnet
1282
#endif
1283
115k
                      );
1284
115k
      deemphasis(out_syn, pcm, N, CC, st->downsample, mode->preemph, st->preemph_memD, accum);
1285
115k
      RESTORE_STACK;
1286
115k
      return frame_size/st->downsample;
1287
115k
   }
1288
#ifdef ENABLE_DEEP_PLC
1289
   else {
1290
      /* FIXME: This is a bit of a hack just to make sure opus_decode_native() knows we're no longer in PLC. */
1291
      if (lpcnet) lpcnet->blend = 0;
1292
   }
1293
#endif
1294
1295
   /* Check if there are at least two packets received consecutively before
1296
    * turning on the pitch-based PLC */
1297
159k
   if (st->loss_duration == 0) st->skip_plc = 0;
1298
1299
159k
   if (dec == NULL)
1300
16.3k
   {
1301
16.3k
      ec_dec_init(&_dec,(unsigned char*)data,len);
1302
16.3k
      dec = &_dec;
1303
16.3k
   }
1304
1305
159k
   if (C==1)
1306
102k
   {
1307
2.24M
      for (i=0;i<nbEBands;i++)
1308
2.14M
         oldBandE[i]=MAXG(oldBandE[i],oldBandE[nbEBands+i]);
1309
102k
   }
1310
1311
159k
   total_bits = len*8;
1312
159k
   tell = ec_tell(dec);
1313
1314
159k
   if (tell >= total_bits)
1315
11.3k
      silence = 1;
1316
148k
   else if (tell==1)
1317
141k
      silence = ec_dec_bit_logp(dec, 15);
1318
6.80k
   else
1319
6.80k
      silence = 0;
1320
159k
   if (silence)
1321
19.7k
   {
1322
      /* Pretend we've read all the remaining bits */
1323
19.7k
      tell = len*8;
1324
19.7k
      dec->nbits_total+=tell-ec_tell(dec);
1325
19.7k
   }
1326
1327
159k
   postfilter_gain = 0;
1328
159k
   postfilter_pitch = 0;
1329
159k
   postfilter_tapset = 0;
1330
159k
   if (start==0 && tell+16 <= total_bits)
1331
101k
   {
1332
101k
      if(ec_dec_bit_logp(dec, 1))
1333
28.3k
      {
1334
28.3k
         int qg, octave;
1335
28.3k
         octave = ec_dec_uint(dec, 6);
1336
28.3k
         postfilter_pitch = (16<<octave)+ec_dec_bits(dec, 4+octave)-1;
1337
28.3k
         qg = ec_dec_bits(dec, 3);
1338
28.3k
         if (ec_tell(dec)+2<=total_bits)
1339
28.3k
            postfilter_tapset = ec_dec_icdf(dec, tapset_icdf, 2);
1340
28.3k
         postfilter_gain = QCONST16(.09375f,15)*(qg+1);
1341
28.3k
      }
1342
101k
      tell = ec_tell(dec);
1343
101k
   }
1344
1345
159k
   if (LM > 0 && tell+3 <= total_bits)
1346
73.2k
   {
1347
73.2k
      isTransient = ec_dec_bit_logp(dec, 3);
1348
73.2k
      tell = ec_tell(dec);
1349
73.2k
   }
1350
86.6k
   else
1351
86.6k
      isTransient = 0;
1352
1353
159k
   if (isTransient)
1354
13.7k
      shortBlocks = M;
1355
146k
   else
1356
146k
      shortBlocks = 0;
1357
1358
   /* Decode the global flags (first symbols in the stream) */
1359
159k
   intra_ener = tell+3<=total_bits ? ec_dec_bit_logp(dec, 3) : 0;
1360
   /* If recovering from packet loss, make sure we make the energy prediction safe to reduce the
1361
      risk of getting loud artifacts. */
1362
159k
   if (!intra_ener && st->loss_duration != 0) {
1363
33.8k
      c=0; do
1364
67.6k
      {
1365
67.6k
         celt_glog safety = 0;
1366
67.6k
         int missing = IMIN(10, st->loss_duration>>LM);
1367
67.6k
         if (LM==0) safety = GCONST(1.5f);
1368
6.98k
         else if (LM==1) safety = GCONST(.5f);
1369
1.21M
         for (i=start;i<end;i++)
1370
1.14M
         {
1371
1.14M
            if (oldBandE[c*nbEBands+i] < MAXG(oldLogE[c*nbEBands+i], oldLogE2[c*nbEBands+i])) {
1372
               /* If energy is going down already, continue the trend. */
1373
486k
               opus_val32 slope;
1374
486k
               opus_val32 E0, E1, E2;
1375
486k
               E0 = oldBandE[c*nbEBands+i];
1376
486k
               E1 = oldLogE[c*nbEBands+i];
1377
486k
               E2 = oldLogE2[c*nbEBands+i];
1378
486k
               slope = MAX32(E1 - E0, HALF32(E2 - E0));
1379
486k
               slope = MING(slope, GCONST(2.f));
1380
486k
               E0 -= MAX32(0, (1+missing)*slope);
1381
486k
               oldBandE[c*nbEBands+i] = MAX32(-GCONST(20.f), E0);
1382
661k
            } else {
1383
               /* Otherwise take the min of the last frames. */
1384
661k
               oldBandE[c*nbEBands+i] = MING(MING(oldBandE[c*nbEBands+i], oldLogE[c*nbEBands+i]), oldLogE2[c*nbEBands+i]);
1385
661k
            }
1386
            /* Shorter frames have more natural fluctuations -- play it safe. */
1387
1.14M
            oldBandE[c*nbEBands+i] -= safety;
1388
1.14M
         }
1389
67.6k
      } while (++c<2);
1390
33.8k
   }
1391
   /* Get band energies */
1392
159k
   unquant_coarse_energy(mode, start, end, oldBandE,
1393
159k
         intra_ener, dec, C, LM);
1394
1395
159k
   ALLOC(tf_res, nbEBands, int);
1396
159k
   tf_decode(start, end, isTransient, tf_res, LM, dec);
1397
1398
159k
   tell = ec_tell(dec);
1399
159k
   spread_decision = SPREAD_NORMAL;
1400
159k
   if (tell+4 <= total_bits)
1401
67.6k
      spread_decision = ec_dec_icdf(dec, spread_icdf, 5);
1402
1403
159k
   ALLOC(cap, nbEBands, int);
1404
1405
159k
   init_caps(mode,cap,LM,C);
1406
1407
159k
   ALLOC(offsets, nbEBands, int);
1408
1409
159k
   dynalloc_logp = 6;
1410
159k
   total_bits<<=BITRES;
1411
159k
   tell = ec_tell_frac(dec);
1412
2.75M
   for (i=start;i<end;i++)
1413
2.59M
   {
1414
2.59M
      int width, quanta;
1415
2.59M
      int dynalloc_loop_logp;
1416
2.59M
      int boost;
1417
2.59M
      width = C*(eBands[i+1]-eBands[i])<<LM;
1418
      /* quanta is 6 bits, but no more than 1 bit/sample
1419
         and no less than 1/8 bit/sample */
1420
2.59M
      quanta = IMIN(width<<BITRES, IMAX(6<<BITRES, width));
1421
2.59M
      dynalloc_loop_logp = dynalloc_logp;
1422
2.59M
      boost = 0;
1423
2.65M
      while (tell+(dynalloc_loop_logp<<BITRES) < total_bits && boost < cap[i])
1424
1.06M
      {
1425
1.06M
         int flag;
1426
1.06M
         flag = ec_dec_bit_logp(dec, dynalloc_loop_logp);
1427
1.06M
         tell = ec_tell_frac(dec);
1428
1.06M
         if (!flag)
1429
1.00M
            break;
1430
58.6k
         boost += quanta;
1431
58.6k
         total_bits -= quanta;
1432
58.6k
         dynalloc_loop_logp = 1;
1433
58.6k
      }
1434
2.59M
      offsets[i] = boost;
1435
      /* Making dynalloc more likely */
1436
2.59M
      if (boost>0)
1437
18.9k
         dynalloc_logp = IMAX(2, dynalloc_logp-1);
1438
2.59M
   }
1439
1440
159k
   ALLOC(fine_quant, nbEBands, int);
1441
159k
   alloc_trim = tell+(6<<BITRES) <= total_bits ?
1442
98.9k
         ec_dec_icdf(dec, trim_icdf, 7) : 5;
1443
1444
159k
   bits = (((opus_int32)len*8)<<BITRES) - (opus_int32)ec_tell_frac(dec) - 1;
1445
159k
   anti_collapse_rsv = isTransient&&LM>=2&&bits>=((LM+2)<<BITRES) ? (1<<BITRES) : 0;
1446
159k
   bits -= anti_collapse_rsv;
1447
1448
159k
   ALLOC(pulses, nbEBands, int);
1449
159k
   ALLOC(fine_priority, nbEBands, int);
1450
1451
159k
   codedBands = clt_compute_allocation(mode, start, end, offsets, cap,
1452
159k
         alloc_trim, &intensity, &dual_stereo, bits, &balance, pulses,
1453
159k
         fine_quant, fine_priority, C, LM, dec, 0, 0, 0);
1454
1455
159k
   unquant_fine_energy(mode, start, end, oldBandE, NULL, fine_quant, dec, C);
1456
1457
159k
   ALLOC(X, C*N, celt_norm);   /**< Interleaved normalised MDCTs */
1458
1459
159k
#ifdef ENABLE_QEXT
1460
159k
   if (qext_bytes && end == nbEBands &&
1461
8.44k
         ((mode->Fs == 48000 && (mode->shortMdctSize==120 || mode->shortMdctSize==90))
1462
8.44k
       || (mode->Fs == 96000 && (mode->shortMdctSize==240 || mode->shortMdctSize==180)))) {
1463
8.44k
      int qext_intra_ener;
1464
8.44k
      compute_qext_mode(&qext_mode_struct, mode);
1465
8.44k
      qext_mode = &qext_mode_struct;
1466
8.44k
      qext_end = ec_dec_bit_logp(&ext_dec, 1) ? NB_QEXT_BANDS : 2;
1467
8.44k
      if (C==2) decode_qext_stereo_params(&ext_dec, qext_end, &qext_intensity, &qext_dual_stereo);
1468
8.44k
      qext_intra_ener = ec_tell(&ext_dec)+3<=qext_bytes*8 ? ec_dec_bit_logp(&ext_dec, 3) : 0;
1469
8.44k
      unquant_coarse_energy(qext_mode, 0, qext_end, st->qext_oldBandE,
1470
8.44k
            qext_intra_ener, &ext_dec, C, LM);
1471
8.44k
   }
1472
159k
   ALLOC(extra_quant, nbEBands+NB_QEXT_BANDS, int);
1473
159k
   ALLOC(extra_pulses, nbEBands+NB_QEXT_BANDS, int);
1474
159k
   qext_bits = ((opus_int32)qext_bytes*8<<BITRES) - (opus_int32)ec_tell_frac(dec) - 1;
1475
159k
   clt_compute_extra_allocation(mode, qext_mode, start, end, qext_end, NULL, NULL,
1476
159k
         qext_bits, extra_pulses, extra_quant, C, LM, &ext_dec, 0, 0, 0);
1477
159k
   if (qext_bytes > 0) {
1478
11.2k
      unquant_fine_energy(mode, start, end, oldBandE, fine_quant, extra_quant, &ext_dec, C);
1479
11.2k
   }
1480
159k
#endif
1481
1482
235k
   c=0; do {
1483
235k
      OPUS_MOVE(decode_mem[c], decode_mem[c]+N, decode_buffer_size-N+overlap);
1484
235k
   } while (++c<CC);
1485
1486
   /* Decode fixed codebook */
1487
159k
   ALLOC(collapse_masks, C*nbEBands, unsigned char);
1488
1489
159k
   quant_all_bands(0, mode, start, end, X, C==2 ? X+N : NULL, collapse_masks,
1490
159k
         NULL, pulses, shortBlocks, spread_decision, dual_stereo, intensity, tf_res,
1491
159k
         len*(8<<BITRES)-anti_collapse_rsv, balance, dec, LM, codedBands, &st->rng, 0,
1492
159k
         st->arch, st->disable_inv
1493
159k
         ARG_QEXT(&ext_dec) ARG_QEXT(extra_pulses)
1494
159k
         ARG_QEXT(qext_bytes*(8<<BITRES)) ARG_QEXT(cap));
1495
1496
159k
#ifdef ENABLE_QEXT
1497
159k
   if (qext_mode) {
1498
8.44k
      VARDECL(int, zeros);
1499
8.44k
      VARDECL(unsigned char, qext_collapse_masks);
1500
8.44k
      ec_dec dummy_dec;
1501
8.44k
      int ext_balance;
1502
8.44k
      ALLOC(zeros, nbEBands, int);
1503
8.44k
      ALLOC(qext_collapse_masks, C*NB_QEXT_BANDS, unsigned char);
1504
8.44k
      ec_dec_init(&dummy_dec, NULL, 0);
1505
8.44k
      OPUS_CLEAR(zeros, end);
1506
8.44k
      ext_balance = qext_bytes*(8<<BITRES) - ec_tell_frac(&ext_dec);
1507
56.3k
      for (i=0;i<qext_end;i++) ext_balance -= extra_pulses[nbEBands+i] + C*(extra_quant[nbEBands+1]<<BITRES);
1508
8.44k
      unquant_fine_energy(qext_mode, 0, qext_end, st->qext_oldBandE, NULL, &extra_quant[nbEBands], &ext_dec, C);
1509
8.44k
      quant_all_bands(0, qext_mode, 0, qext_end, X, C==2 ? X+N : NULL, qext_collapse_masks,
1510
8.44k
            NULL, &extra_pulses[nbEBands], shortBlocks, spread_decision, qext_dual_stereo, qext_intensity, zeros,
1511
8.44k
            qext_bytes*(8<<BITRES), ext_balance, &ext_dec, LM, qext_end, &st->rng, 0,
1512
8.44k
            st->arch, st->disable_inv, &dummy_dec, zeros, 0, NULL);
1513
8.44k
   }
1514
159k
#endif
1515
1516
159k
   if (anti_collapse_rsv > 0)
1517
5.00k
   {
1518
5.00k
      anti_collapse_on = ec_dec_bits(dec, 1);
1519
5.00k
   }
1520
159k
   unquant_energy_finalise(mode, start, end, (qext_bytes > 0) ? NULL : oldBandE,
1521
159k
         fine_quant, fine_priority, len*8-ec_tell(dec), dec, C);
1522
159k
   if (anti_collapse_on)
1523
3.60k
      anti_collapse(mode, X, collapse_masks, LM, C, N,
1524
3.60k
            start, end, oldBandE, oldLogE, oldLogE2, pulses, st->rng, 0, st->arch);
1525
1526
159k
   if (silence)
1527
19.7k
   {
1528
697k
      for (i=0;i<C*nbEBands;i++)
1529
678k
         oldBandE[i] = -GCONST(28.f);
1530
19.7k
   }
1531
159k
   if (st->prefilter_and_fold) {
1532
34.7k
      prefilter_and_fold(st, N);
1533
34.7k
   }
1534
159k
   celt_synthesis(mode, X, out_syn, oldBandE, start, effEnd,
1535
159k
                  C, CC, isTransient, LM, st->downsample, silence, st->arch ARG_QEXT(qext_mode) ARG_QEXT(st->qext_oldBandE) ARG_QEXT(qext_end));
1536
1537
235k
   c=0; do {
1538
235k
      st->postfilter_period=IMAX(st->postfilter_period, COMBFILTER_MINPERIOD);
1539
235k
      st->postfilter_period_old=IMAX(st->postfilter_period_old, COMBFILTER_MINPERIOD);
1540
235k
      comb_filter(out_syn[c], out_syn[c], st->postfilter_period_old, st->postfilter_period, mode->shortMdctSize,
1541
235k
            st->postfilter_gain_old, st->postfilter_gain, st->postfilter_tapset_old, st->postfilter_tapset,
1542
235k
            mode->window, overlap, st->arch);
1543
235k
      if (LM!=0)
1544
123k
         comb_filter(out_syn[c]+mode->shortMdctSize, out_syn[c]+mode->shortMdctSize, st->postfilter_period, postfilter_pitch, N-mode->shortMdctSize,
1545
123k
               st->postfilter_gain, postfilter_gain, st->postfilter_tapset, postfilter_tapset,
1546
123k
               mode->window, overlap, st->arch);
1547
1548
235k
   } while (++c<CC);
1549
159k
   st->postfilter_period_old = st->postfilter_period;
1550
159k
   st->postfilter_gain_old = st->postfilter_gain;
1551
159k
   st->postfilter_tapset_old = st->postfilter_tapset;
1552
159k
   st->postfilter_period = postfilter_pitch;
1553
159k
   st->postfilter_gain = postfilter_gain;
1554
159k
   st->postfilter_tapset = postfilter_tapset;
1555
159k
   if (LM!=0)
1556
87.0k
   {
1557
87.0k
      st->postfilter_period_old = st->postfilter_period;
1558
87.0k
      st->postfilter_gain_old = st->postfilter_gain;
1559
87.0k
      st->postfilter_tapset_old = st->postfilter_tapset;
1560
87.0k
   }
1561
1562
159k
   if (C==1)
1563
102k
      OPUS_COPY(&oldBandE[nbEBands], oldBandE, nbEBands);
1564
1565
159k
   if (!isTransient)
1566
146k
   {
1567
146k
      OPUS_COPY(oldLogE2, oldLogE, 2*nbEBands);
1568
146k
      OPUS_COPY(oldLogE, oldBandE, 2*nbEBands);
1569
146k
   } else {
1570
590k
      for (i=0;i<2*nbEBands;i++)
1571
576k
         oldLogE[i] = MING(oldLogE[i], oldBandE[i]);
1572
13.7k
   }
1573
   /* In normal circumstances, we only allow the noise floor to increase by
1574
      up to 2.4 dB/second, but when we're in DTX we give the weight of
1575
      all missing packets to the update packet. */
1576
159k
   max_background_increase = IMIN(160, st->loss_duration+M)*GCONST(0.001f);
1577
6.87M
   for (i=0;i<2*nbEBands;i++)
1578
6.71M
      backgroundLogE[i] = MING(backgroundLogE[i] + max_background_increase, oldBandE[i]);
1579
   /* In case start or end were to change */
1580
159k
   c=0; do
1581
319k
   {
1582
937k
      for (i=0;i<start;i++)
1583
617k
      {
1584
617k
         oldBandE[c*nbEBands+i]=0;
1585
617k
         oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-GCONST(28.f);
1586
617k
      }
1587
1.23M
      for (i=end;i<nbEBands;i++)
1588
919k
      {
1589
919k
         oldBandE[c*nbEBands+i]=0;
1590
919k
         oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-GCONST(28.f);
1591
919k
      }
1592
319k
   } while (++c<2);
1593
159k
   st->rng = dec->rng;
1594
159k
#ifdef ENABLE_QEXT
1595
159k
   if (qext_bytes) st->rng = st->rng ^ ext_dec.rng;
1596
159k
#endif
1597
1598
159k
   deemphasis(out_syn, pcm, N, CC, st->downsample, mode->preemph, st->preemph_memD, accum);
1599
159k
   st->loss_duration = 0;
1600
159k
   st->plc_duration = 0;
1601
159k
   st->last_frame_type = FRAME_NORMAL;
1602
159k
   st->prefilter_and_fold = 0;
1603
159k
   RESTORE_STACK;
1604
159k
   if (ec_tell(dec) > 8*len)
1605
2
      return OPUS_INTERNAL_ERROR;
1606
159k
#ifdef ENABLE_QEXT
1607
159k
   if (qext_bytes != 0 && ec_tell(&ext_dec) > 8*qext_bytes)
1608
0
      return OPUS_INTERNAL_ERROR;
1609
159k
#endif
1610
159k
   if(ec_get_error(dec))
1611
1.96k
      st->error = 1;
1612
159k
   return frame_size/st->downsample;
1613
159k
}
celt_decode_with_ec_dred
Line
Count
Source
1107
264k
{
1108
264k
   int c, i, N;
1109
264k
   int spread_decision;
1110
264k
   opus_int32 bits;
1111
264k
   ec_dec _dec;
1112
264k
   VARDECL(celt_norm, X);
1113
264k
   VARDECL(int, fine_quant);
1114
264k
   VARDECL(int, pulses);
1115
264k
   VARDECL(int, cap);
1116
264k
   VARDECL(int, offsets);
1117
264k
   VARDECL(int, fine_priority);
1118
264k
   VARDECL(int, tf_res);
1119
264k
   VARDECL(unsigned char, collapse_masks);
1120
264k
   celt_sig *decode_mem[2];
1121
264k
   celt_sig *out_syn[2];
1122
264k
   celt_glog *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE;
1123
1124
264k
   int shortBlocks;
1125
264k
   int isTransient;
1126
264k
   int intra_ener;
1127
264k
   const int CC = st->channels;
1128
264k
   int LM, M;
1129
264k
   int start;
1130
264k
   int end;
1131
264k
   int effEnd;
1132
264k
   int codedBands;
1133
264k
   int alloc_trim;
1134
264k
   int postfilter_pitch;
1135
264k
   opus_val16 postfilter_gain;
1136
264k
   int intensity=0;
1137
264k
   int dual_stereo=0;
1138
264k
   opus_int32 total_bits;
1139
264k
   opus_int32 balance;
1140
264k
   opus_int32 tell;
1141
264k
   int dynalloc_logp;
1142
264k
   int postfilter_tapset;
1143
264k
   int anti_collapse_rsv;
1144
264k
   int anti_collapse_on=0;
1145
264k
   int silence;
1146
264k
   int C = st->stream_channels;
1147
264k
   const OpusCustomMode *mode;
1148
264k
   int nbEBands;
1149
264k
   int overlap;
1150
264k
   const opus_int16 *eBands;
1151
264k
   celt_glog max_background_increase;
1152
264k
   int decode_buffer_size;
1153
#ifdef ENABLE_QEXT
1154
   opus_int32 qext_bits;
1155
   ec_dec ext_dec;
1156
   int qext_bytes=0;
1157
   int qext_end=0;
1158
   int qext_intensity=0;
1159
   int qext_dual_stereo=0;
1160
   VARDECL(int, extra_quant);
1161
   VARDECL(int, extra_pulses);
1162
   const CELTMode *qext_mode = NULL;
1163
   CELTMode qext_mode_struct;
1164
   int qext_scale;
1165
#else
1166
264k
# define qext_bytes 0
1167
264k
#endif
1168
264k
   ALLOC_STACK;
1169
#ifdef ENABLE_QEXT
1170
   qext_scale = st->qext_scale;
1171
#endif
1172
264k
   decode_buffer_size = QEXT_SCALE(DECODE_BUFFER_SIZE);
1173
1174
264k
   VALIDATE_CELT_DECODER(st);
1175
264k
   mode = st->mode;
1176
264k
   nbEBands = mode->nbEBands;
1177
264k
   overlap = mode->overlap;
1178
264k
   eBands = mode->eBands;
1179
264k
   start = st->start;
1180
264k
   end = st->end;
1181
264k
   frame_size *= st->downsample;
1182
1183
264k
   oldBandE = (celt_glog*)(st->_decode_mem+(decode_buffer_size+overlap)*CC);
1184
264k
   oldLogE = oldBandE + 2*nbEBands;
1185
264k
   oldLogE2 = oldLogE + 2*nbEBands;
1186
264k
   backgroundLogE = oldLogE2 + 2*nbEBands;
1187
1188
#ifdef ENABLE_QEXT
1189
   if (qext_payload) {
1190
      ec_dec_init(&ext_dec, (unsigned char*)qext_payload, qext_payload_len);
1191
      qext_bytes = qext_payload_len;
1192
   } else {
1193
      ec_dec_init(&ext_dec, NULL, 0);
1194
   }
1195
#endif
1196
#if defined(CUSTOM_MODES) || defined(ENABLE_OPUS_CUSTOM_API)
1197
   if (st->signalling && data!=NULL)
1198
   {
1199
      int data0=data[0];
1200
      /* Convert "standard mode" to Opus header */
1201
# ifndef ENABLE_QEXT
1202
      if (mode->Fs==48000 && mode->shortMdctSize==120)
1203
# endif
1204
      {
1205
         data0 = fromOpus(data0);
1206
         if (data0<0)
1207
            return OPUS_INVALID_PACKET;
1208
      }
1209
      st->end = end = IMAX(1, mode->effEBands-2*(data0>>5));
1210
      LM = (data0>>3)&0x3;
1211
      C = 1 + ((data0>>2)&0x1);
1212
      if ((data[0] & 0x03) == 0x03) {
1213
         data++;
1214
         len--;
1215
         if (len<=0)
1216
            return OPUS_INVALID_PACKET;
1217
         if (data[0] & 0x40) {
1218
            int p;
1219
            int padding=0;
1220
            data++;
1221
            len--;
1222
            do {
1223
               int tmp;
1224
               if (len<=0)
1225
                  return OPUS_INVALID_PACKET;
1226
               p = *data++;
1227
               len--;
1228
               tmp = p==255 ? 254: p;
1229
               len -= tmp;
1230
               padding += tmp;
1231
            } while (p==255);
1232
            padding--;
1233
            if (len <= 0 || padding<0) return OPUS_INVALID_PACKET;
1234
#ifdef ENABLE_QEXT
1235
            qext_bytes = padding;
1236
            if (data[len] != QEXT_EXTENSION_ID<<1)
1237
               qext_bytes=0;
1238
            ec_dec_init(&ext_dec, (unsigned char*)data+len+1, qext_bytes);
1239
#endif
1240
         }
1241
      } else
1242
      {
1243
         data++;
1244
         len--;
1245
      }
1246
      if (LM>mode->maxLM)
1247
         return OPUS_INVALID_PACKET;
1248
      if (frame_size < mode->shortMdctSize<<LM)
1249
         return OPUS_BUFFER_TOO_SMALL;
1250
      else
1251
         frame_size = mode->shortMdctSize<<LM;
1252
   } else {
1253
#else
1254
264k
   {
1255
264k
#endif
1256
506k
      for (LM=0;LM<=mode->maxLM;LM++)
1257
506k
         if (mode->shortMdctSize<<LM==frame_size)
1258
264k
            break;
1259
264k
      if (LM>mode->maxLM)
1260
0
         return OPUS_BAD_ARG;
1261
264k
   }
1262
264k
   M=1<<LM;
1263
1264
264k
   if (len<0 || len>1275 || pcm==NULL)
1265
0
      return OPUS_BAD_ARG;
1266
1267
264k
   N = M*mode->shortMdctSize;
1268
414k
   c=0; do {
1269
414k
      decode_mem[c] = st->_decode_mem + c*(decode_buffer_size+overlap);
1270
414k
      out_syn[c] = decode_mem[c]+decode_buffer_size-N;
1271
414k
   } while (++c<CC);
1272
1273
264k
   effEnd = end;
1274
264k
   if (effEnd > mode->effEBands)
1275
0
      effEnd = mode->effEBands;
1276
1277
264k
   if (data == NULL || len<=1)
1278
117k
   {
1279
117k
      celt_decode_lost(st, N, LM
1280
#ifdef ENABLE_DEEP_PLC
1281
      , lpcnet
1282
#endif
1283
117k
                      );
1284
117k
      deemphasis(out_syn, pcm, N, CC, st->downsample, mode->preemph, st->preemph_memD, accum);
1285
117k
      RESTORE_STACK;
1286
117k
      return frame_size/st->downsample;
1287
117k
   }
1288
#ifdef ENABLE_DEEP_PLC
1289
   else {
1290
      /* FIXME: This is a bit of a hack just to make sure opus_decode_native() knows we're no longer in PLC. */
1291
      if (lpcnet) lpcnet->blend = 0;
1292
   }
1293
#endif
1294
1295
   /* Check if there are at least two packets received consecutively before
1296
    * turning on the pitch-based PLC */
1297
147k
   if (st->loss_duration == 0) st->skip_plc = 0;
1298
1299
147k
   if (dec == NULL)
1300
14.0k
   {
1301
14.0k
      ec_dec_init(&_dec,(unsigned char*)data,len);
1302
14.0k
      dec = &_dec;
1303
14.0k
   }
1304
1305
147k
   if (C==1)
1306
92.8k
   {
1307
2.04M
      for (i=0;i<nbEBands;i++)
1308
1.95M
         oldBandE[i]=MAXG(oldBandE[i],oldBandE[nbEBands+i]);
1309
92.8k
   }
1310
1311
147k
   total_bits = len*8;
1312
147k
   tell = ec_tell(dec);
1313
1314
147k
   if (tell >= total_bits)
1315
14.0k
      silence = 1;
1316
133k
   else if (tell==1)
1317
128k
      silence = ec_dec_bit_logp(dec, 15);
1318
4.86k
   else
1319
4.86k
      silence = 0;
1320
147k
   if (silence)
1321
20.2k
   {
1322
      /* Pretend we've read all the remaining bits */
1323
20.2k
      tell = len*8;
1324
20.2k
      dec->nbits_total+=tell-ec_tell(dec);
1325
20.2k
   }
1326
1327
147k
   postfilter_gain = 0;
1328
147k
   postfilter_pitch = 0;
1329
147k
   postfilter_tapset = 0;
1330
147k
   if (start==0 && tell+16 <= total_bits)
1331
72.3k
   {
1332
72.3k
      if(ec_dec_bit_logp(dec, 1))
1333
21.6k
      {
1334
21.6k
         int qg, octave;
1335
21.6k
         octave = ec_dec_uint(dec, 6);
1336
21.6k
         postfilter_pitch = (16<<octave)+ec_dec_bits(dec, 4+octave)-1;
1337
21.6k
         qg = ec_dec_bits(dec, 3);
1338
21.6k
         if (ec_tell(dec)+2<=total_bits)
1339
21.6k
            postfilter_tapset = ec_dec_icdf(dec, tapset_icdf, 2);
1340
21.6k
         postfilter_gain = QCONST16(.09375f,15)*(qg+1);
1341
21.6k
      }
1342
72.3k
      tell = ec_tell(dec);
1343
72.3k
   }
1344
1345
147k
   if (LM > 0 && tell+3 <= total_bits)
1346
66.1k
   {
1347
66.1k
      isTransient = ec_dec_bit_logp(dec, 3);
1348
66.1k
      tell = ec_tell(dec);
1349
66.1k
   }
1350
81.0k
   else
1351
81.0k
      isTransient = 0;
1352
1353
147k
   if (isTransient)
1354
15.0k
      shortBlocks = M;
1355
132k
   else
1356
132k
      shortBlocks = 0;
1357
1358
   /* Decode the global flags (first symbols in the stream) */
1359
147k
   intra_ener = tell+3<=total_bits ? ec_dec_bit_logp(dec, 3) : 0;
1360
   /* If recovering from packet loss, make sure we make the energy prediction safe to reduce the
1361
      risk of getting loud artifacts. */
1362
147k
   if (!intra_ener && st->loss_duration != 0) {
1363
28.1k
      c=0; do
1364
56.2k
      {
1365
56.2k
         celt_glog safety = 0;
1366
56.2k
         int missing = IMIN(10, st->loss_duration>>LM);
1367
56.2k
         if (LM==0) safety = GCONST(1.5f);
1368
6.51k
         else if (LM==1) safety = GCONST(.5f);
1369
1.01M
         for (i=start;i<end;i++)
1370
960k
         {
1371
960k
            if (oldBandE[c*nbEBands+i] < MAXG(oldLogE[c*nbEBands+i], oldLogE2[c*nbEBands+i])) {
1372
               /* If energy is going down already, continue the trend. */
1373
397k
               opus_val32 slope;
1374
397k
               opus_val32 E0, E1, E2;
1375
397k
               E0 = oldBandE[c*nbEBands+i];
1376
397k
               E1 = oldLogE[c*nbEBands+i];
1377
397k
               E2 = oldLogE2[c*nbEBands+i];
1378
397k
               slope = MAX32(E1 - E0, HALF32(E2 - E0));
1379
397k
               slope = MING(slope, GCONST(2.f));
1380
397k
               E0 -= MAX32(0, (1+missing)*slope);
1381
397k
               oldBandE[c*nbEBands+i] = MAX32(-GCONST(20.f), E0);
1382
562k
            } else {
1383
               /* Otherwise take the min of the last frames. */
1384
562k
               oldBandE[c*nbEBands+i] = MING(MING(oldBandE[c*nbEBands+i], oldLogE[c*nbEBands+i]), oldLogE2[c*nbEBands+i]);
1385
562k
            }
1386
            /* Shorter frames have more natural fluctuations -- play it safe. */
1387
960k
            oldBandE[c*nbEBands+i] -= safety;
1388
960k
         }
1389
56.2k
      } while (++c<2);
1390
28.1k
   }
1391
   /* Get band energies */
1392
147k
   unquant_coarse_energy(mode, start, end, oldBandE,
1393
147k
         intra_ener, dec, C, LM);
1394
1395
147k
   ALLOC(tf_res, nbEBands, int);
1396
147k
   tf_decode(start, end, isTransient, tf_res, LM, dec);
1397
1398
147k
   tell = ec_tell(dec);
1399
147k
   spread_decision = SPREAD_NORMAL;
1400
147k
   if (tell+4 <= total_bits)
1401
48.9k
      spread_decision = ec_dec_icdf(dec, spread_icdf, 5);
1402
1403
147k
   ALLOC(cap, nbEBands, int);
1404
1405
147k
   init_caps(mode,cap,LM,C);
1406
1407
147k
   ALLOC(offsets, nbEBands, int);
1408
1409
147k
   dynalloc_logp = 6;
1410
147k
   total_bits<<=BITRES;
1411
147k
   tell = ec_tell_frac(dec);
1412
2.48M
   for (i=start;i<end;i++)
1413
2.33M
   {
1414
2.33M
      int width, quanta;
1415
2.33M
      int dynalloc_loop_logp;
1416
2.33M
      int boost;
1417
2.33M
      width = C*(eBands[i+1]-eBands[i])<<LM;
1418
      /* quanta is 6 bits, but no more than 1 bit/sample
1419
         and no less than 1/8 bit/sample */
1420
2.33M
      quanta = IMIN(width<<BITRES, IMAX(6<<BITRES, width));
1421
2.33M
      dynalloc_loop_logp = dynalloc_logp;
1422
2.33M
      boost = 0;
1423
2.38M
      while (tell+(dynalloc_loop_logp<<BITRES) < total_bits && boost < cap[i])
1424
735k
      {
1425
735k
         int flag;
1426
735k
         flag = ec_dec_bit_logp(dec, dynalloc_loop_logp);
1427
735k
         tell = ec_tell_frac(dec);
1428
735k
         if (!flag)
1429
685k
            break;
1430
49.7k
         boost += quanta;
1431
49.7k
         total_bits -= quanta;
1432
49.7k
         dynalloc_loop_logp = 1;
1433
49.7k
      }
1434
2.33M
      offsets[i] = boost;
1435
      /* Making dynalloc more likely */
1436
2.33M
      if (boost>0)
1437
12.1k
         dynalloc_logp = IMAX(2, dynalloc_logp-1);
1438
2.33M
   }
1439
1440
147k
   ALLOC(fine_quant, nbEBands, int);
1441
147k
   alloc_trim = tell+(6<<BITRES) <= total_bits ?
1442
104k
         ec_dec_icdf(dec, trim_icdf, 7) : 5;
1443
1444
147k
   bits = (((opus_int32)len*8)<<BITRES) - (opus_int32)ec_tell_frac(dec) - 1;
1445
147k
   anti_collapse_rsv = isTransient&&LM>=2&&bits>=((LM+2)<<BITRES) ? (1<<BITRES) : 0;
1446
147k
   bits -= anti_collapse_rsv;
1447
1448
147k
   ALLOC(pulses, nbEBands, int);
1449
147k
   ALLOC(fine_priority, nbEBands, int);
1450
1451
147k
   codedBands = clt_compute_allocation(mode, start, end, offsets, cap,
1452
147k
         alloc_trim, &intensity, &dual_stereo, bits, &balance, pulses,
1453
147k
         fine_quant, fine_priority, C, LM, dec, 0, 0, 0);
1454
1455
147k
   unquant_fine_energy(mode, start, end, oldBandE, NULL, fine_quant, dec, C);
1456
1457
147k
   ALLOC(X, C*N, celt_norm);   /**< Interleaved normalised MDCTs */
1458
1459
#ifdef ENABLE_QEXT
1460
   if (qext_bytes && end == nbEBands &&
1461
         ((mode->Fs == 48000 && (mode->shortMdctSize==120 || mode->shortMdctSize==90))
1462
       || (mode->Fs == 96000 && (mode->shortMdctSize==240 || mode->shortMdctSize==180)))) {
1463
      int qext_intra_ener;
1464
      compute_qext_mode(&qext_mode_struct, mode);
1465
      qext_mode = &qext_mode_struct;
1466
      qext_end = ec_dec_bit_logp(&ext_dec, 1) ? NB_QEXT_BANDS : 2;
1467
      if (C==2) decode_qext_stereo_params(&ext_dec, qext_end, &qext_intensity, &qext_dual_stereo);
1468
      qext_intra_ener = ec_tell(&ext_dec)+3<=qext_bytes*8 ? ec_dec_bit_logp(&ext_dec, 3) : 0;
1469
      unquant_coarse_energy(qext_mode, 0, qext_end, st->qext_oldBandE,
1470
            qext_intra_ener, &ext_dec, C, LM);
1471
   }
1472
   ALLOC(extra_quant, nbEBands+NB_QEXT_BANDS, int);
1473
   ALLOC(extra_pulses, nbEBands+NB_QEXT_BANDS, int);
1474
   qext_bits = ((opus_int32)qext_bytes*8<<BITRES) - (opus_int32)ec_tell_frac(dec) - 1;
1475
   clt_compute_extra_allocation(mode, qext_mode, start, end, qext_end, NULL, NULL,
1476
         qext_bits, extra_pulses, extra_quant, C, LM, &ext_dec, 0, 0, 0);
1477
   if (qext_bytes > 0) {
1478
      unquant_fine_energy(mode, start, end, oldBandE, fine_quant, extra_quant, &ext_dec, C);
1479
   }
1480
#endif
1481
1482
227k
   c=0; do {
1483
227k
      OPUS_MOVE(decode_mem[c], decode_mem[c]+N, decode_buffer_size-N+overlap);
1484
227k
   } while (++c<CC);
1485
1486
   /* Decode fixed codebook */
1487
147k
   ALLOC(collapse_masks, C*nbEBands, unsigned char);
1488
1489
147k
   quant_all_bands(0, mode, start, end, X, C==2 ? X+N : NULL, collapse_masks,
1490
147k
         NULL, pulses, shortBlocks, spread_decision, dual_stereo, intensity, tf_res,
1491
147k
         len*(8<<BITRES)-anti_collapse_rsv, balance, dec, LM, codedBands, &st->rng, 0,
1492
147k
         st->arch, st->disable_inv
1493
147k
         ARG_QEXT(&ext_dec) ARG_QEXT(extra_pulses)
1494
147k
         ARG_QEXT(qext_bytes*(8<<BITRES)) ARG_QEXT(cap));
1495
1496
#ifdef ENABLE_QEXT
1497
   if (qext_mode) {
1498
      VARDECL(int, zeros);
1499
      VARDECL(unsigned char, qext_collapse_masks);
1500
      ec_dec dummy_dec;
1501
      int ext_balance;
1502
      ALLOC(zeros, nbEBands, int);
1503
      ALLOC(qext_collapse_masks, C*NB_QEXT_BANDS, unsigned char);
1504
      ec_dec_init(&dummy_dec, NULL, 0);
1505
      OPUS_CLEAR(zeros, end);
1506
      ext_balance = qext_bytes*(8<<BITRES) - ec_tell_frac(&ext_dec);
1507
      for (i=0;i<qext_end;i++) ext_balance -= extra_pulses[nbEBands+i] + C*(extra_quant[nbEBands+1]<<BITRES);
1508
      unquant_fine_energy(qext_mode, 0, qext_end, st->qext_oldBandE, NULL, &extra_quant[nbEBands], &ext_dec, C);
1509
      quant_all_bands(0, qext_mode, 0, qext_end, X, C==2 ? X+N : NULL, qext_collapse_masks,
1510
            NULL, &extra_pulses[nbEBands], shortBlocks, spread_decision, qext_dual_stereo, qext_intensity, zeros,
1511
            qext_bytes*(8<<BITRES), ext_balance, &ext_dec, LM, qext_end, &st->rng, 0,
1512
            st->arch, st->disable_inv, &dummy_dec, zeros, 0, NULL);
1513
   }
1514
#endif
1515
1516
147k
   if (anti_collapse_rsv > 0)
1517
4.26k
   {
1518
4.26k
      anti_collapse_on = ec_dec_bits(dec, 1);
1519
4.26k
   }
1520
147k
   unquant_energy_finalise(mode, start, end, (qext_bytes > 0) ? NULL : oldBandE,
1521
147k
         fine_quant, fine_priority, len*8-ec_tell(dec), dec, C);
1522
147k
   if (anti_collapse_on)
1523
3.13k
      anti_collapse(mode, X, collapse_masks, LM, C, N,
1524
3.13k
            start, end, oldBandE, oldLogE, oldLogE2, pulses, st->rng, 0, st->arch);
1525
1526
147k
   if (silence)
1527
20.2k
   {
1528
691k
      for (i=0;i<C*nbEBands;i++)
1529
671k
         oldBandE[i] = -GCONST(28.f);
1530
20.2k
   }
1531
147k
   if (st->prefilter_and_fold) {
1532
29.5k
      prefilter_and_fold(st, N);
1533
29.5k
   }
1534
147k
   celt_synthesis(mode, X, out_syn, oldBandE, start, effEnd,
1535
147k
                  C, CC, isTransient, LM, st->downsample, silence, st->arch ARG_QEXT(qext_mode) ARG_QEXT(st->qext_oldBandE) ARG_QEXT(qext_end));
1536
1537
227k
   c=0; do {
1538
227k
      st->postfilter_period=IMAX(st->postfilter_period, COMBFILTER_MINPERIOD);
1539
227k
      st->postfilter_period_old=IMAX(st->postfilter_period_old, COMBFILTER_MINPERIOD);
1540
227k
      comb_filter(out_syn[c], out_syn[c], st->postfilter_period_old, st->postfilter_period, mode->shortMdctSize,
1541
227k
            st->postfilter_gain_old, st->postfilter_gain, st->postfilter_tapset_old, st->postfilter_tapset,
1542
227k
            mode->window, overlap, st->arch);
1543
227k
      if (LM!=0)
1544
119k
         comb_filter(out_syn[c]+mode->shortMdctSize, out_syn[c]+mode->shortMdctSize, st->postfilter_period, postfilter_pitch, N-mode->shortMdctSize,
1545
119k
               st->postfilter_gain, postfilter_gain, st->postfilter_tapset, postfilter_tapset,
1546
119k
               mode->window, overlap, st->arch);
1547
1548
227k
   } while (++c<CC);
1549
147k
   st->postfilter_period_old = st->postfilter_period;
1550
147k
   st->postfilter_gain_old = st->postfilter_gain;
1551
147k
   st->postfilter_tapset_old = st->postfilter_tapset;
1552
147k
   st->postfilter_period = postfilter_pitch;
1553
147k
   st->postfilter_gain = postfilter_gain;
1554
147k
   st->postfilter_tapset = postfilter_tapset;
1555
147k
   if (LM!=0)
1556
82.6k
   {
1557
82.6k
      st->postfilter_period_old = st->postfilter_period;
1558
82.6k
      st->postfilter_gain_old = st->postfilter_gain;
1559
82.6k
      st->postfilter_tapset_old = st->postfilter_tapset;
1560
82.6k
   }
1561
1562
147k
   if (C==1)
1563
92.8k
      OPUS_COPY(&oldBandE[nbEBands], oldBandE, nbEBands);
1564
1565
147k
   if (!isTransient)
1566
132k
   {
1567
132k
      OPUS_COPY(oldLogE2, oldLogE, 2*nbEBands);
1568
132k
      OPUS_COPY(oldLogE, oldBandE, 2*nbEBands);
1569
132k
   } else {
1570
649k
      for (i=0;i<2*nbEBands;i++)
1571
634k
         oldLogE[i] = MING(oldLogE[i], oldBandE[i]);
1572
15.0k
   }
1573
   /* In normal circumstances, we only allow the noise floor to increase by
1574
      up to 2.4 dB/second, but when we're in DTX we give the weight of
1575
      all missing packets to the update packet. */
1576
147k
   max_background_increase = IMIN(160, st->loss_duration+M)*GCONST(0.001f);
1577
6.33M
   for (i=0;i<2*nbEBands;i++)
1578
6.18M
      backgroundLogE[i] = MING(backgroundLogE[i] + max_background_increase, oldBandE[i]);
1579
   /* In case start or end were to change */
1580
147k
   c=0; do
1581
294k
   {
1582
937k
      for (i=0;i<start;i++)
1583
643k
      {
1584
643k
         oldBandE[c*nbEBands+i]=0;
1585
643k
         oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-GCONST(28.f);
1586
643k
      }
1587
1.16M
      for (i=end;i<nbEBands;i++)
1588
873k
      {
1589
873k
         oldBandE[c*nbEBands+i]=0;
1590
873k
         oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-GCONST(28.f);
1591
873k
      }
1592
294k
   } while (++c<2);
1593
147k
   st->rng = dec->rng;
1594
#ifdef ENABLE_QEXT
1595
   if (qext_bytes) st->rng = st->rng ^ ext_dec.rng;
1596
#endif
1597
1598
147k
   deemphasis(out_syn, pcm, N, CC, st->downsample, mode->preemph, st->preemph_memD, accum);
1599
147k
   st->loss_duration = 0;
1600
147k
   st->plc_duration = 0;
1601
147k
   st->last_frame_type = FRAME_NORMAL;
1602
147k
   st->prefilter_and_fold = 0;
1603
147k
   RESTORE_STACK;
1604
147k
   if (ec_tell(dec) > 8*len)
1605
4
      return OPUS_INTERNAL_ERROR;
1606
#ifdef ENABLE_QEXT
1607
   if (qext_bytes != 0 && ec_tell(&ext_dec) > 8*qext_bytes)
1608
      return OPUS_INTERNAL_ERROR;
1609
#endif
1610
147k
   if(ec_get_error(dec))
1611
1.90k
      st->error = 1;
1612
147k
   return frame_size/st->downsample;
1613
147k
}
1614
1615
int celt_decode_with_ec(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data,
1616
      int len, opus_res * OPUS_RESTRICT pcm, int frame_size, ec_dec *dec, int accum)
1617
60.8k
{
1618
60.8k
   return celt_decode_with_ec_dred(st, data, len, pcm, frame_size, dec, accum
1619
#ifdef ENABLE_DEEP_PLC
1620
       , NULL
1621
#endif
1622
60.8k
       ARG_QEXT(NULL) ARG_QEXT(0)
1623
60.8k
       );
1624
60.8k
}
celt_decode_with_ec
Line
Count
Source
1617
30.4k
{
1618
30.4k
   return celt_decode_with_ec_dred(st, data, len, pcm, frame_size, dec, accum
1619
#ifdef ENABLE_DEEP_PLC
1620
       , NULL
1621
#endif
1622
30.4k
       ARG_QEXT(NULL) ARG_QEXT(0)
1623
30.4k
       );
1624
30.4k
}
celt_decode_with_ec
Line
Count
Source
1617
30.4k
{
1618
30.4k
   return celt_decode_with_ec_dred(st, data, len, pcm, frame_size, dec, accum
1619
#ifdef ENABLE_DEEP_PLC
1620
       , NULL
1621
#endif
1622
30.4k
       ARG_QEXT(NULL) ARG_QEXT(0)
1623
30.4k
       );
1624
30.4k
}
1625
1626
#if defined(CUSTOM_MODES) || defined(ENABLE_OPUS_CUSTOM_API)
1627
1628
#if defined(FIXED_POINT) && !defined(ENABLE_RES24)
1629
int opus_custom_decode(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, opus_int16 * OPUS_RESTRICT pcm, int frame_size)
1630
{
1631
   return celt_decode_with_ec(st, data, len, pcm, frame_size, NULL, 0);
1632
}
1633
#else
1634
int opus_custom_decode(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, opus_int16 * OPUS_RESTRICT pcm, int frame_size)
1635
{
1636
   int j, ret, C, N;
1637
   VARDECL(opus_res, out);
1638
   ALLOC_STACK;
1639
1640
   if (pcm==NULL)
1641
      return OPUS_BAD_ARG;
1642
1643
   C = st->channels;
1644
   N = frame_size;
1645
1646
   ALLOC(out, C*N, opus_res);
1647
   ret = celt_decode_with_ec(st, data, len, out, frame_size, NULL, 0);
1648
   if (ret>0)
1649
      for (j=0;j<C*ret;j++)
1650
         pcm[j]=RES2INT16(out[j]);
1651
1652
   RESTORE_STACK;
1653
   return ret;
1654
}
1655
#endif
1656
1657
#if defined(FIXED_POINT) && defined(ENABLE_RES24)
1658
int opus_custom_decode24(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, opus_int32 * OPUS_RESTRICT pcm, int frame_size)
1659
{
1660
   return celt_decode_with_ec(st, data, len, pcm, frame_size, NULL, 0);
1661
}
1662
#else
1663
int opus_custom_decode24(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, opus_int32 * OPUS_RESTRICT pcm, int frame_size)
1664
{
1665
   int j, ret, C, N;
1666
   VARDECL(opus_res, out);
1667
   ALLOC_STACK;
1668
1669
   if (pcm==NULL)
1670
      return OPUS_BAD_ARG;
1671
1672
   C = st->channels;
1673
   N = frame_size;
1674
1675
   ALLOC(out, C*N, opus_res);
1676
   ret = celt_decode_with_ec(st, data, len, out, frame_size, NULL, 0);
1677
   if (ret>0)
1678
      for (j=0;j<C*ret;j++)
1679
         pcm[j]=RES2INT24(out[j]);
1680
1681
   RESTORE_STACK;
1682
   return ret;
1683
}
1684
#endif
1685
1686
1687
#ifndef DISABLE_FLOAT_API
1688
1689
# if !defined(FIXED_POINT)
1690
int opus_custom_decode_float(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, float * OPUS_RESTRICT pcm, int frame_size)
1691
{
1692
   return celt_decode_with_ec(st, data, len, pcm, frame_size, NULL, 0);
1693
}
1694
# else
1695
int opus_custom_decode_float(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, float * OPUS_RESTRICT pcm, int frame_size)
1696
{
1697
   int j, ret, C, N;
1698
   VARDECL(opus_res, out);
1699
   ALLOC_STACK;
1700
1701
   if (pcm==NULL)
1702
      return OPUS_BAD_ARG;
1703
1704
   C = st->channels;
1705
   N = frame_size;
1706
1707
   ALLOC(out, C*N, opus_res);
1708
   ret=celt_decode_with_ec(st, data, len, out, frame_size, NULL, 0);
1709
   if (ret>0)
1710
      for (j=0;j<C*ret;j++)
1711
         pcm[j]=RES2FLOAT(out[j]);
1712
1713
   RESTORE_STACK;
1714
   return ret;
1715
}
1716
# endif
1717
1718
#endif
1719
1720
#endif /* CUSTOM_MODES */
1721
1722
int opus_custom_decoder_ctl(CELTDecoder * OPUS_RESTRICT st, int request, ...)
1723
7.93M
{
1724
7.93M
   va_list ap;
1725
1726
7.93M
   va_start(ap, request);
1727
7.93M
   switch (request)
1728
7.93M
   {
1729
0
      case OPUS_SET_COMPLEXITY_REQUEST:
1730
0
      {
1731
0
          opus_int32 value = va_arg(ap, opus_int32);
1732
0
          if(value<0 || value>10)
1733
0
          {
1734
0
             goto bad_arg;
1735
0
          }
1736
0
          st->complexity = value;
1737
0
      }
1738
0
      break;
1739
0
      case OPUS_GET_COMPLEXITY_REQUEST:
1740
0
      {
1741
0
          opus_int32 *value = va_arg(ap, opus_int32*);
1742
0
          if (!value)
1743
0
          {
1744
0
             goto bad_arg;
1745
0
          }
1746
0
          *value = st->complexity;
1747
0
      }
1748
0
      break;
1749
1.48M
      case CELT_SET_START_BAND_REQUEST:
1750
1.48M
      {
1751
1.48M
         opus_int32 value = va_arg(ap, opus_int32);
1752
1.48M
         if (value<0 || value>=st->mode->nbEBands)
1753
0
            goto bad_arg;
1754
1.48M
         st->start = value;
1755
1.48M
      }
1756
0
      break;
1757
869k
      case CELT_SET_END_BAND_REQUEST:
1758
869k
      {
1759
869k
         opus_int32 value = va_arg(ap, opus_int32);
1760
869k
         if (value<1 || value>st->mode->nbEBands)
1761
0
            goto bad_arg;
1762
869k
         st->end = value;
1763
869k
      }
1764
0
      break;
1765
1.42M
      case CELT_SET_CHANNELS_REQUEST:
1766
1.42M
      {
1767
1.42M
         opus_int32 value = va_arg(ap, opus_int32);
1768
1.42M
         if (value<1 || value>2)
1769
0
            goto bad_arg;
1770
1.42M
         st->stream_channels = value;
1771
1.42M
      }
1772
0
      break;
1773
0
      case CELT_GET_AND_CLEAR_ERROR_REQUEST:
1774
0
      {
1775
0
         opus_int32 *value = va_arg(ap, opus_int32*);
1776
0
         if (value==NULL)
1777
0
            goto bad_arg;
1778
0
         *value=st->error;
1779
0
         st->error = 0;
1780
0
      }
1781
0
      break;
1782
0
      case OPUS_GET_LOOKAHEAD_REQUEST:
1783
0
      {
1784
0
         opus_int32 *value = va_arg(ap, opus_int32*);
1785
0
         if (value==NULL)
1786
0
            goto bad_arg;
1787
0
         *value = st->overlap/st->downsample;
1788
0
      }
1789
0
      break;
1790
841k
      case OPUS_RESET_STATE:
1791
841k
      {
1792
841k
         int i;
1793
841k
         celt_glog *oldBandE, *oldLogE, *oldLogE2;
1794
841k
         int decode_buffer_size;
1795
#ifdef ENABLE_QEXT
1796
         int qext_scale = st->qext_scale;
1797
#endif
1798
841k
         decode_buffer_size = QEXT_SCALE(DECODE_BUFFER_SIZE);
1799
841k
         oldBandE = (celt_glog*)(st->_decode_mem+(decode_buffer_size+st->overlap)*st->channels);
1800
841k
         oldLogE = oldBandE + 2*st->mode->nbEBands;
1801
841k
         oldLogE2 = oldLogE + 2*st->mode->nbEBands;
1802
841k
         OPUS_CLEAR((char*)&st->DECODER_RESET_START,
1803
841k
               opus_custom_decoder_get_size(st->mode, st->channels)-
1804
841k
               ((char*)&st->DECODER_RESET_START - (char*)st));
1805
36.1M
         for (i=0;i<2*st->mode->nbEBands;i++)
1806
35.3M
            oldLogE[i]=oldLogE2[i]=-GCONST(28.f);
1807
841k
         st->skip_plc = 1;
1808
841k
         st->last_frame_type = FRAME_NONE;
1809
841k
      }
1810
841k
      break;
1811
0
      case OPUS_GET_PITCH_REQUEST:
1812
0
      {
1813
0
         opus_int32 *value = va_arg(ap, opus_int32*);
1814
0
         if (value==NULL)
1815
0
            goto bad_arg;
1816
0
         *value = st->postfilter_period;
1817
0
      }
1818
0
      break;
1819
1.42M
      case CELT_GET_MODE_REQUEST:
1820
1.42M
      {
1821
1.42M
         const CELTMode ** value = va_arg(ap, const CELTMode**);
1822
1.42M
         if (value==0)
1823
0
            goto bad_arg;
1824
1.42M
         *value=st->mode;
1825
1.42M
      }
1826
0
      break;
1827
816k
      case CELT_SET_SIGNALLING_REQUEST:
1828
816k
      {
1829
816k
         opus_int32 value = va_arg(ap, opus_int32);
1830
816k
         st->signalling = value;
1831
816k
      }
1832
816k
      break;
1833
1.07M
      case OPUS_GET_FINAL_RANGE_REQUEST:
1834
1.07M
      {
1835
1.07M
         opus_uint32 * value = va_arg(ap, opus_uint32 *);
1836
1.07M
         if (value==0)
1837
0
            goto bad_arg;
1838
1.07M
         *value=st->rng;
1839
1.07M
      }
1840
0
      break;
1841
0
      case OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST:
1842
0
      {
1843
0
          opus_int32 value = va_arg(ap, opus_int32);
1844
0
          if(value<0 || value>1)
1845
0
          {
1846
0
             goto bad_arg;
1847
0
          }
1848
0
          st->disable_inv = value;
1849
0
      }
1850
0
      break;
1851
0
      case OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST:
1852
0
      {
1853
0
          opus_int32 *value = va_arg(ap, opus_int32*);
1854
0
          if (!value)
1855
0
          {
1856
0
             goto bad_arg;
1857
0
          }
1858
0
          *value = st->disable_inv;
1859
0
      }
1860
0
      break;
1861
0
      default:
1862
0
         goto bad_request;
1863
7.93M
   }
1864
7.93M
   va_end(ap);
1865
7.93M
   return OPUS_OK;
1866
0
bad_arg:
1867
0
   va_end(ap);
1868
0
   return OPUS_BAD_ARG;
1869
0
bad_request:
1870
0
      va_end(ap);
1871
0
  return OPUS_UNIMPLEMENTED;
1872
7.93M
}
opus_custom_decoder_ctl
Line
Count
Source
1723
3.96M
{
1724
3.96M
   va_list ap;
1725
1726
3.96M
   va_start(ap, request);
1727
3.96M
   switch (request)
1728
3.96M
   {
1729
0
      case OPUS_SET_COMPLEXITY_REQUEST:
1730
0
      {
1731
0
          opus_int32 value = va_arg(ap, opus_int32);
1732
0
          if(value<0 || value>10)
1733
0
          {
1734
0
             goto bad_arg;
1735
0
          }
1736
0
          st->complexity = value;
1737
0
      }
1738
0
      break;
1739
0
      case OPUS_GET_COMPLEXITY_REQUEST:
1740
0
      {
1741
0
          opus_int32 *value = va_arg(ap, opus_int32*);
1742
0
          if (!value)
1743
0
          {
1744
0
             goto bad_arg;
1745
0
          }
1746
0
          *value = st->complexity;
1747
0
      }
1748
0
      break;
1749
741k
      case CELT_SET_START_BAND_REQUEST:
1750
741k
      {
1751
741k
         opus_int32 value = va_arg(ap, opus_int32);
1752
741k
         if (value<0 || value>=st->mode->nbEBands)
1753
0
            goto bad_arg;
1754
741k
         st->start = value;
1755
741k
      }
1756
0
      break;
1757
434k
      case CELT_SET_END_BAND_REQUEST:
1758
434k
      {
1759
434k
         opus_int32 value = va_arg(ap, opus_int32);
1760
434k
         if (value<1 || value>st->mode->nbEBands)
1761
0
            goto bad_arg;
1762
434k
         st->end = value;
1763
434k
      }
1764
0
      break;
1765
711k
      case CELT_SET_CHANNELS_REQUEST:
1766
711k
      {
1767
711k
         opus_int32 value = va_arg(ap, opus_int32);
1768
711k
         if (value<1 || value>2)
1769
0
            goto bad_arg;
1770
711k
         st->stream_channels = value;
1771
711k
      }
1772
0
      break;
1773
0
      case CELT_GET_AND_CLEAR_ERROR_REQUEST:
1774
0
      {
1775
0
         opus_int32 *value = va_arg(ap, opus_int32*);
1776
0
         if (value==NULL)
1777
0
            goto bad_arg;
1778
0
         *value=st->error;
1779
0
         st->error = 0;
1780
0
      }
1781
0
      break;
1782
0
      case OPUS_GET_LOOKAHEAD_REQUEST:
1783
0
      {
1784
0
         opus_int32 *value = va_arg(ap, opus_int32*);
1785
0
         if (value==NULL)
1786
0
            goto bad_arg;
1787
0
         *value = st->overlap/st->downsample;
1788
0
      }
1789
0
      break;
1790
420k
      case OPUS_RESET_STATE:
1791
420k
      {
1792
420k
         int i;
1793
420k
         celt_glog *oldBandE, *oldLogE, *oldLogE2;
1794
420k
         int decode_buffer_size;
1795
#ifdef ENABLE_QEXT
1796
         int qext_scale = st->qext_scale;
1797
#endif
1798
420k
         decode_buffer_size = QEXT_SCALE(DECODE_BUFFER_SIZE);
1799
420k
         oldBandE = (celt_glog*)(st->_decode_mem+(decode_buffer_size+st->overlap)*st->channels);
1800
420k
         oldLogE = oldBandE + 2*st->mode->nbEBands;
1801
420k
         oldLogE2 = oldLogE + 2*st->mode->nbEBands;
1802
420k
         OPUS_CLEAR((char*)&st->DECODER_RESET_START,
1803
420k
               opus_custom_decoder_get_size(st->mode, st->channels)-
1804
420k
               ((char*)&st->DECODER_RESET_START - (char*)st));
1805
18.0M
         for (i=0;i<2*st->mode->nbEBands;i++)
1806
17.6M
            oldLogE[i]=oldLogE2[i]=-GCONST(28.f);
1807
420k
         st->skip_plc = 1;
1808
420k
         st->last_frame_type = FRAME_NONE;
1809
420k
      }
1810
420k
      break;
1811
0
      case OPUS_GET_PITCH_REQUEST:
1812
0
      {
1813
0
         opus_int32 *value = va_arg(ap, opus_int32*);
1814
0
         if (value==NULL)
1815
0
            goto bad_arg;
1816
0
         *value = st->postfilter_period;
1817
0
      }
1818
0
      break;
1819
711k
      case CELT_GET_MODE_REQUEST:
1820
711k
      {
1821
711k
         const CELTMode ** value = va_arg(ap, const CELTMode**);
1822
711k
         if (value==0)
1823
0
            goto bad_arg;
1824
711k
         *value=st->mode;
1825
711k
      }
1826
0
      break;
1827
408k
      case CELT_SET_SIGNALLING_REQUEST:
1828
408k
      {
1829
408k
         opus_int32 value = va_arg(ap, opus_int32);
1830
408k
         st->signalling = value;
1831
408k
      }
1832
408k
      break;
1833
539k
      case OPUS_GET_FINAL_RANGE_REQUEST:
1834
539k
      {
1835
539k
         opus_uint32 * value = va_arg(ap, opus_uint32 *);
1836
539k
         if (value==0)
1837
0
            goto bad_arg;
1838
539k
         *value=st->rng;
1839
539k
      }
1840
0
      break;
1841
0
      case OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST:
1842
0
      {
1843
0
          opus_int32 value = va_arg(ap, opus_int32);
1844
0
          if(value<0 || value>1)
1845
0
          {
1846
0
             goto bad_arg;
1847
0
          }
1848
0
          st->disable_inv = value;
1849
0
      }
1850
0
      break;
1851
0
      case OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST:
1852
0
      {
1853
0
          opus_int32 *value = va_arg(ap, opus_int32*);
1854
0
          if (!value)
1855
0
          {
1856
0
             goto bad_arg;
1857
0
          }
1858
0
          *value = st->disable_inv;
1859
0
      }
1860
0
      break;
1861
0
      default:
1862
0
         goto bad_request;
1863
3.96M
   }
1864
3.96M
   va_end(ap);
1865
3.96M
   return OPUS_OK;
1866
0
bad_arg:
1867
0
   va_end(ap);
1868
0
   return OPUS_BAD_ARG;
1869
0
bad_request:
1870
0
      va_end(ap);
1871
0
  return OPUS_UNIMPLEMENTED;
1872
3.96M
}
opus_custom_decoder_ctl
Line
Count
Source
1723
3.96M
{
1724
3.96M
   va_list ap;
1725
1726
3.96M
   va_start(ap, request);
1727
3.96M
   switch (request)
1728
3.96M
   {
1729
0
      case OPUS_SET_COMPLEXITY_REQUEST:
1730
0
      {
1731
0
          opus_int32 value = va_arg(ap, opus_int32);
1732
0
          if(value<0 || value>10)
1733
0
          {
1734
0
             goto bad_arg;
1735
0
          }
1736
0
          st->complexity = value;
1737
0
      }
1738
0
      break;
1739
0
      case OPUS_GET_COMPLEXITY_REQUEST:
1740
0
      {
1741
0
          opus_int32 *value = va_arg(ap, opus_int32*);
1742
0
          if (!value)
1743
0
          {
1744
0
             goto bad_arg;
1745
0
          }
1746
0
          *value = st->complexity;
1747
0
      }
1748
0
      break;
1749
741k
      case CELT_SET_START_BAND_REQUEST:
1750
741k
      {
1751
741k
         opus_int32 value = va_arg(ap, opus_int32);
1752
741k
         if (value<0 || value>=st->mode->nbEBands)
1753
0
            goto bad_arg;
1754
741k
         st->start = value;
1755
741k
      }
1756
0
      break;
1757
434k
      case CELT_SET_END_BAND_REQUEST:
1758
434k
      {
1759
434k
         opus_int32 value = va_arg(ap, opus_int32);
1760
434k
         if (value<1 || value>st->mode->nbEBands)
1761
0
            goto bad_arg;
1762
434k
         st->end = value;
1763
434k
      }
1764
0
      break;
1765
711k
      case CELT_SET_CHANNELS_REQUEST:
1766
711k
      {
1767
711k
         opus_int32 value = va_arg(ap, opus_int32);
1768
711k
         if (value<1 || value>2)
1769
0
            goto bad_arg;
1770
711k
         st->stream_channels = value;
1771
711k
      }
1772
0
      break;
1773
0
      case CELT_GET_AND_CLEAR_ERROR_REQUEST:
1774
0
      {
1775
0
         opus_int32 *value = va_arg(ap, opus_int32*);
1776
0
         if (value==NULL)
1777
0
            goto bad_arg;
1778
0
         *value=st->error;
1779
0
         st->error = 0;
1780
0
      }
1781
0
      break;
1782
0
      case OPUS_GET_LOOKAHEAD_REQUEST:
1783
0
      {
1784
0
         opus_int32 *value = va_arg(ap, opus_int32*);
1785
0
         if (value==NULL)
1786
0
            goto bad_arg;
1787
0
         *value = st->overlap/st->downsample;
1788
0
      }
1789
0
      break;
1790
420k
      case OPUS_RESET_STATE:
1791
420k
      {
1792
420k
         int i;
1793
420k
         celt_glog *oldBandE, *oldLogE, *oldLogE2;
1794
420k
         int decode_buffer_size;
1795
420k
#ifdef ENABLE_QEXT
1796
420k
         int qext_scale = st->qext_scale;
1797
420k
#endif
1798
420k
         decode_buffer_size = QEXT_SCALE(DECODE_BUFFER_SIZE);
1799
420k
         oldBandE = (celt_glog*)(st->_decode_mem+(decode_buffer_size+st->overlap)*st->channels);
1800
420k
         oldLogE = oldBandE + 2*st->mode->nbEBands;
1801
420k
         oldLogE2 = oldLogE + 2*st->mode->nbEBands;
1802
420k
         OPUS_CLEAR((char*)&st->DECODER_RESET_START,
1803
420k
               opus_custom_decoder_get_size(st->mode, st->channels)-
1804
420k
               ((char*)&st->DECODER_RESET_START - (char*)st));
1805
18.0M
         for (i=0;i<2*st->mode->nbEBands;i++)
1806
17.6M
            oldLogE[i]=oldLogE2[i]=-GCONST(28.f);
1807
420k
         st->skip_plc = 1;
1808
420k
         st->last_frame_type = FRAME_NONE;
1809
420k
      }
1810
420k
      break;
1811
0
      case OPUS_GET_PITCH_REQUEST:
1812
0
      {
1813
0
         opus_int32 *value = va_arg(ap, opus_int32*);
1814
0
         if (value==NULL)
1815
0
            goto bad_arg;
1816
0
         *value = st->postfilter_period;
1817
0
      }
1818
0
      break;
1819
711k
      case CELT_GET_MODE_REQUEST:
1820
711k
      {
1821
711k
         const CELTMode ** value = va_arg(ap, const CELTMode**);
1822
711k
         if (value==0)
1823
0
            goto bad_arg;
1824
711k
         *value=st->mode;
1825
711k
      }
1826
0
      break;
1827
408k
      case CELT_SET_SIGNALLING_REQUEST:
1828
408k
      {
1829
408k
         opus_int32 value = va_arg(ap, opus_int32);
1830
408k
         st->signalling = value;
1831
408k
      }
1832
408k
      break;
1833
539k
      case OPUS_GET_FINAL_RANGE_REQUEST:
1834
539k
      {
1835
539k
         opus_uint32 * value = va_arg(ap, opus_uint32 *);
1836
539k
         if (value==0)
1837
0
            goto bad_arg;
1838
539k
         *value=st->rng;
1839
539k
      }
1840
0
      break;
1841
0
      case OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST:
1842
0
      {
1843
0
          opus_int32 value = va_arg(ap, opus_int32);
1844
0
          if(value<0 || value>1)
1845
0
          {
1846
0
             goto bad_arg;
1847
0
          }
1848
0
          st->disable_inv = value;
1849
0
      }
1850
0
      break;
1851
0
      case OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST:
1852
0
      {
1853
0
          opus_int32 *value = va_arg(ap, opus_int32*);
1854
0
          if (!value)
1855
0
          {
1856
0
             goto bad_arg;
1857
0
          }
1858
0
          *value = st->disable_inv;
1859
0
      }
1860
0
      break;
1861
0
      default:
1862
0
         goto bad_request;
1863
3.96M
   }
1864
3.96M
   va_end(ap);
1865
3.96M
   return OPUS_OK;
1866
0
bad_arg:
1867
0
   va_end(ap);
1868
0
   return OPUS_BAD_ARG;
1869
0
bad_request:
1870
0
      va_end(ap);
1871
0
  return OPUS_UNIMPLEMENTED;
1872
3.96M
}