Coverage Report

Created: 2026-06-07 08:05

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
416k
#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
104k
#define PLC_PITCH_LAG_MIN (100)
66
67
877k
#define FRAME_NONE         0
68
615k
#define FRAME_NORMAL       1
69
391k
#define FRAME_PLC_NOISE    2
70
1.67M
#define FRAME_PLC_PERIODIC 3
71
1.04M
#define FRAME_PLC_NEURAL   4
72
1.04M
#define FRAME_DRED         5
73
74
/**********************************************************************/
75
/*                                                                    */
76
/*                             DECODER                                */
77
/*                                                                    */
78
/**********************************************************************/
79
208k
#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
532k
{
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
268k
   celt_assert(st->end <= 25);
156
268k
#endif
157
532k
   celt_assert(st->channels == 1 || st->channels == 2);
158
532k
   celt_assert(st->stream_channels == 1 || st->stream_channels == 2);
159
532k
   celt_assert(st->downsample > 0);
160
532k
   celt_assert(st->start == 0 || st->start == 17);
161
532k
   celt_assert(st->start < st->end);
162
532k
#ifdef OPUS_ARCHMASK
163
532k
   celt_assert(st->arch >= 0);
164
532k
   celt_assert(st->arch <= OPUS_ARCHMASK);
165
532k
#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
532k
   celt_assert(st->postfilter_period < MAX_PERIOD);
171
532k
   celt_assert(st->postfilter_period >= COMBFILTER_MINPERIOD || st->postfilter_period == 0);
172
532k
   celt_assert(st->postfilter_period_old < MAX_PERIOD);
173
532k
   celt_assert(st->postfilter_period_old >= COMBFILTER_MINPERIOD || st->postfilter_period_old == 0);
174
532k
   celt_assert(st->postfilter_tapset <= 2);
175
532k
   celt_assert(st->postfilter_tapset >= 0);
176
532k
   celt_assert(st->postfilter_tapset_old <= 2);
177
532k
   celt_assert(st->postfilter_tapset_old >= 0);
178
532k
}
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
268k
{
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
268k
   celt_assert(st->end <= 25);
156
268k
#endif
157
268k
   celt_assert(st->channels == 1 || st->channels == 2);
158
268k
   celt_assert(st->stream_channels == 1 || st->stream_channels == 2);
159
268k
   celt_assert(st->downsample > 0);
160
268k
   celt_assert(st->start == 0 || st->start == 17);
161
268k
   celt_assert(st->start < st->end);
162
268k
#ifdef OPUS_ARCHMASK
163
268k
   celt_assert(st->arch >= 0);
164
268k
   celt_assert(st->arch <= OPUS_ARCHMASK);
165
268k
#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
268k
   celt_assert(st->postfilter_period < MAX_PERIOD);
171
268k
   celt_assert(st->postfilter_period >= COMBFILTER_MINPERIOD || st->postfilter_period == 0);
172
268k
   celt_assert(st->postfilter_period_old < MAX_PERIOD);
173
268k
   celt_assert(st->postfilter_period_old >= COMBFILTER_MINPERIOD || st->postfilter_period_old == 0);
174
268k
   celt_assert(st->postfilter_tapset <= 2);
175
268k
   celt_assert(st->postfilter_tapset >= 0);
176
268k
   celt_assert(st->postfilter_tapset_old <= 2);
177
268k
   celt_assert(st->postfilter_tapset_old >= 0);
178
268k
}
179
#endif
180
181
int celt_decoder_get_size(int channels)
182
875k
{
183
#ifdef ENABLE_QEXT
184
   const CELTMode *mode = opus_custom_mode_create(96000, 960, NULL);
185
#else
186
875k
   const CELTMode *mode = opus_custom_mode_create(48000, 960, NULL);
187
875k
#endif
188
875k
   return opus_custom_decoder_get_size(mode, channels);
189
875k
}
190
191
OPUS_CUSTOM_NOSTATIC int opus_custom_decoder_get_size(const CELTMode *mode, int channels)
192
802k
{
193
802k
   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
802k
   size = sizeof(struct CELTDecoder)
201
802k
            + (channels*(QEXT_SCALE(DECODE_BUFFER_SIZE)+mode->overlap)-1)*sizeof(celt_sig)
202
802k
            + 4*2*mode->nbEBands*sizeof(celt_glog)
203
802k
            + channels*CELT_LPC_ORDER*sizeof(opus_val16);
204
802k
   return size;
205
802k
}
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
199k
{
226
199k
   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
199k
   ret = opus_custom_decoder_init(st, opus_custom_mode_create(48000, 960, NULL), channels);
233
199k
   if (ret != OPUS_OK)
234
0
      return ret;
235
199k
   st->downsample = resampling_factor(sampling_rate);
236
199k
   if (st->downsample==0)
237
0
      return OPUS_BAD_ARG;
238
199k
   else
239
199k
      return OPUS_OK;
240
199k
}
241
242
OPUS_CUSTOM_NOSTATIC int opus_custom_decoder_init(CELTDecoder *st, const CELTMode *mode, int channels)
243
199k
{
244
199k
   if (channels < 0 || channels > 2)
245
0
      return OPUS_BAD_ARG;
246
247
199k
   if (st==NULL)
248
0
      return OPUS_ALLOC_FAIL;
249
250
199k
   OPUS_CLEAR((char*)st, opus_custom_decoder_get_size(mode, channels));
251
252
199k
   st->mode = mode;
253
199k
   st->overlap = mode->overlap;
254
199k
   st->stream_channels = st->channels = channels;
255
256
199k
   st->downsample = 1;
257
199k
   st->start = 0;
258
199k
   st->end = st->mode->effEBands;
259
199k
   st->signalling = 1;
260
199k
#ifndef DISABLE_UPDATE_DRAFT
261
199k
   st->disable_inv = channels == 1;
262
#else
263
   st->disable_inv = 0;
264
#endif
265
199k
   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
199k
   opus_custom_decoder_ctl(st, OPUS_RESET_STATE);
273
274
199k
   return OPUS_OK;
275
199k
}
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
31.7k
{
291
31.7k
   celt_sig * OPUS_RESTRICT x0;
292
31.7k
   celt_sig * OPUS_RESTRICT x1;
293
31.7k
   celt_sig m0, m1;
294
31.7k
   int j;
295
31.7k
   x0=in[0];
296
31.7k
   x1=in[1];
297
31.7k
   m0 = mem[0];
298
31.7k
   m1 = mem[1];
299
8.17M
   for (j=0;j<N;j++)
300
8.14M
   {
301
8.14M
      celt_sig tmp0, tmp1;
302
      /* Add VERY_SMALL to x[] first to reduce dependency chain. */
303
8.14M
      tmp0 = SATURATE(x0[j] + VERY_SMALL + m0, SIG_SAT);
304
8.14M
      tmp1 = SATURATE(x1[j] + VERY_SMALL + m1, SIG_SAT);
305
8.14M
      m0 = MULT16_32_Q15(coef0, tmp0);
306
8.14M
      m1 = MULT16_32_Q15(coef0, tmp1);
307
8.14M
      pcm[2*j  ] = SIG2RES(tmp0);
308
8.14M
      pcm[2*j+1] = SIG2RES(tmp1);
309
8.14M
   }
310
31.7k
   mem[0] = m0;
311
31.7k
   mem[1] = m1;
312
31.7k
}
celt_decoder.c:deemphasis_stereo_simple
Line
Count
Source
290
18.4k
{
291
18.4k
   celt_sig * OPUS_RESTRICT x0;
292
18.4k
   celt_sig * OPUS_RESTRICT x1;
293
18.4k
   celt_sig m0, m1;
294
18.4k
   int j;
295
18.4k
   x0=in[0];
296
18.4k
   x1=in[1];
297
18.4k
   m0 = mem[0];
298
18.4k
   m1 = mem[1];
299
3.97M
   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
18.4k
   mem[0] = m0;
311
18.4k
   mem[1] = m1;
312
18.4k
}
celt_decoder.c:deemphasis_stereo_simple
Line
Count
Source
290
13.2k
{
291
13.2k
   celt_sig * OPUS_RESTRICT x0;
292
13.2k
   celt_sig * OPUS_RESTRICT x1;
293
13.2k
   celt_sig m0, m1;
294
13.2k
   int j;
295
13.2k
   x0=in[0];
296
13.2k
   x1=in[1];
297
13.2k
   m0 = mem[0];
298
13.2k
   m1 = mem[1];
299
4.19M
   for (j=0;j<N;j++)
300
4.18M
   {
301
4.18M
      celt_sig tmp0, tmp1;
302
      /* Add VERY_SMALL to x[] first to reduce dependency chain. */
303
4.18M
      tmp0 = SATURATE(x0[j] + VERY_SMALL + m0, SIG_SAT);
304
4.18M
      tmp1 = SATURATE(x1[j] + VERY_SMALL + m1, SIG_SAT);
305
4.18M
      m0 = MULT16_32_Q15(coef0, tmp0);
306
4.18M
      m1 = MULT16_32_Q15(coef0, tmp1);
307
4.18M
      pcm[2*j  ] = SIG2RES(tmp0);
308
4.18M
      pcm[2*j+1] = SIG2RES(tmp1);
309
4.18M
   }
310
13.2k
   mem[0] = m0;
311
13.2k
   mem[1] = m1;
312
13.2k
}
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
532k
{
321
532k
   int c;
322
532k
   int Nd;
323
532k
   int apply_downsampling=0;
324
532k
   opus_val16 coef0;
325
532k
   VARDECL(celt_sig, scratch);
326
532k
   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
31.7k
   {
331
31.7k
      deemphasis_stereo_simple(in, pcm, N, coef[0], mem);
332
31.7k
      return;
333
31.7k
   }
334
232k
#endif
335
500k
   ALLOC(scratch, N, celt_sig);
336
232k
   coef0 = coef[0];
337
232k
   Nd = N/downsample;
338
742k
   c=0; do {
339
742k
      int j;
340
742k
      celt_sig * OPUS_RESTRICT x;
341
742k
      opus_res  * OPUS_RESTRICT y;
342
742k
      celt_sig m = mem[c];
343
742k
      x =in[c];
344
742k
      y = pcm+c;
345
#if defined(CUSTOM_MODES) || defined(ENABLE_OPUS_CUSTOM_API) || defined(ENABLE_QEXT)
346
392k
      if (coef[1] != 0)
347
95.6k
      {
348
95.6k
         opus_val16 coef1 = coef[1];
349
95.6k
         opus_val16 coef3 = coef[3];
350
50.7M
         for (j=0;j<N;j++)
351
50.6M
         {
352
50.6M
            celt_sig tmp = SATURATE(x[j] + m + VERY_SMALL, SIG_SAT);
353
50.6M
            m = MULT16_32_Q15(coef0, tmp)
354
50.6M
                          - MULT16_32_Q15(coef1, x[j]);
355
50.6M
            tmp = SHL32(MULT16_32_Q15(coef3, tmp), 2);
356
50.6M
            scratch[j] = tmp;
357
50.6M
         }
358
95.6k
         apply_downsampling=1;
359
95.6k
      } else
360
296k
#endif
361
646k
      if (downsample>1)
362
540k
      {
363
         /* Shortcut for the standard (non-custom modes) case */
364
150M
         for (j=0;j<N;j++)
365
150M
         {
366
150M
            celt_sig tmp = SATURATE(x[j] + VERY_SMALL + m, SIG_SAT);
367
150M
            m = MULT16_32_Q15(coef0, tmp);
368
150M
            scratch[j] = tmp;
369
150M
         }
370
540k
         apply_downsampling=1;
371
540k
      } else {
372
         /* Shortcut for the standard (non-custom modes) case */
373
105k
         if (accum)
374
30.4k
         {
375
16.3M
            for (j=0;j<N;j++)
376
16.3M
            {
377
16.3M
               celt_sig tmp = SATURATE(x[j] + m + VERY_SMALL, SIG_SAT);
378
16.3M
               m = MULT16_32_Q15(coef0, tmp);
379
16.3M
               y[j*C] = ADD_RES(y[j*C], SIG2RES(tmp));
380
16.3M
            }
381
30.4k
         } else
382
75.4k
         {
383
19.6M
            for (j=0;j<N;j++)
384
19.6M
            {
385
19.6M
               celt_sig tmp = SATURATE(x[j] + VERY_SMALL + m, SIG_SAT);
386
19.6M
               m = MULT16_32_Q15(coef0, tmp);
387
19.6M
               y[j*C] = SIG2RES(tmp);
388
19.6M
            }
389
75.4k
         }
390
105k
      }
391
742k
      mem[c] = m;
392
393
742k
      if (apply_downsampling)
394
636k
      {
395
         /* Perform down-sampling */
396
636k
         if (accum)
397
78.4k
         {
398
20.1M
            for (j=0;j<Nd;j++)
399
20.0M
               y[j*C] = ADD_RES(y[j*C], SIG2RES(scratch[j*downsample]));
400
78.4k
         } else
401
557k
         {
402
76.7M
            for (j=0;j<Nd;j++)
403
76.1M
               y[j*C] = SIG2RES(scratch[j*downsample]);
404
557k
         }
405
636k
      }
406
742k
   } while (++c<C);
407
232k
   RESTORE_STACK;
408
232k
}
celt_decoder.c:deemphasis
Line
Count
Source
320
147k
{
321
147k
   int c;
322
147k
   int Nd;
323
147k
   int apply_downsampling=0;
324
147k
   opus_val16 coef0;
325
147k
   VARDECL(celt_sig, scratch);
326
147k
   SAVE_STACK;
327
147k
#if !defined(CUSTOM_MODES) && !defined(ENABLE_OPUS_CUSTOM_API) && !defined(ENABLE_QEXT)
328
   /* Short version for common case. */
329
147k
   if (downsample == 1 && C == 2 && !accum)
330
18.4k
   {
331
18.4k
      deemphasis_stereo_simple(in, pcm, N, coef[0], mem);
332
18.4k
      return;
333
18.4k
   }
334
129k
#endif
335
129k
   ALLOC(scratch, N, celt_sig);
336
129k
   coef0 = coef[0];
337
129k
   Nd = N/downsample;
338
198k
   c=0; do {
339
198k
      int j;
340
198k
      celt_sig * OPUS_RESTRICT x;
341
198k
      opus_res  * OPUS_RESTRICT y;
342
198k
      celt_sig m = mem[c];
343
198k
      x =in[c];
344
198k
      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
198k
      if (downsample>1)
362
174k
      {
363
         /* Shortcut for the standard (non-custom modes) case */
364
44.5M
         for (j=0;j<N;j++)
365
44.3M
         {
366
44.3M
            celt_sig tmp = SATURATE(x[j] + VERY_SMALL + m, SIG_SAT);
367
44.3M
            m = MULT16_32_Q15(coef0, tmp);
368
44.3M
            scratch[j] = tmp;
369
44.3M
         }
370
174k
         apply_downsampling=1;
371
174k
      } else {
372
         /* Shortcut for the standard (non-custom modes) case */
373
23.3k
         if (accum)
374
8.16k
         {
375
4.31M
            for (j=0;j<N;j++)
376
4.30M
            {
377
4.30M
               celt_sig tmp = SATURATE(x[j] + m + VERY_SMALL, SIG_SAT);
378
4.30M
               m = MULT16_32_Q15(coef0, tmp);
379
4.30M
               y[j*C] = ADD_RES(y[j*C], SIG2RES(tmp));
380
4.30M
            }
381
8.16k
         } else
382
15.1k
         {
383
4.50M
            for (j=0;j<N;j++)
384
4.48M
            {
385
4.48M
               celt_sig tmp = SATURATE(x[j] + VERY_SMALL + m, SIG_SAT);
386
4.48M
               m = MULT16_32_Q15(coef0, tmp);
387
4.48M
               y[j*C] = SIG2RES(tmp);
388
4.48M
            }
389
15.1k
         }
390
23.3k
      }
391
198k
      mem[c] = m;
392
393
198k
      if (apply_downsampling)
394
174k
      {
395
         /* Perform down-sampling */
396
174k
         if (accum)
397
19.7k
         {
398
3.11M
            for (j=0;j<Nd;j++)
399
3.09M
               y[j*C] = ADD_RES(y[j*C], SIG2RES(scratch[j*downsample]));
400
19.7k
         } else
401
155k
         {
402
10.9M
            for (j=0;j<Nd;j++)
403
10.8M
               y[j*C] = SIG2RES(scratch[j*downsample]);
404
155k
         }
405
174k
      }
406
198k
   } while (++c<C);
407
129k
   RESTORE_STACK;
408
129k
}
celt_decoder.c:deemphasis
Line
Count
Source
320
139k
{
321
139k
   int c;
322
139k
   int Nd;
323
139k
   int apply_downsampling=0;
324
139k
   opus_val16 coef0;
325
139k
   VARDECL(celt_sig, scratch);
326
139k
   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
139k
   ALLOC(scratch, N, celt_sig);
336
139k
   coef0 = coef[0];
337
139k
   Nd = N/downsample;
338
197k
   c=0; do {
339
197k
      int j;
340
197k
      celt_sig * OPUS_RESTRICT x;
341
197k
      opus_res  * OPUS_RESTRICT y;
342
197k
      celt_sig m = mem[c];
343
197k
      x =in[c];
344
197k
      y = pcm+c;
345
197k
#if defined(CUSTOM_MODES) || defined(ENABLE_OPUS_CUSTOM_API) || defined(ENABLE_QEXT)
346
197k
      if (coef[1] != 0)
347
51.3k
      {
348
51.3k
         opus_val16 coef1 = coef[1];
349
51.3k
         opus_val16 coef3 = coef[3];
350
26.0M
         for (j=0;j<N;j++)
351
25.9M
         {
352
25.9M
            celt_sig tmp = SATURATE(x[j] + m + VERY_SMALL, SIG_SAT);
353
25.9M
            m = MULT16_32_Q15(coef0, tmp)
354
25.9M
                          - MULT16_32_Q15(coef1, x[j]);
355
25.9M
            tmp = SHL32(MULT16_32_Q15(coef3, tmp), 2);
356
25.9M
            scratch[j] = tmp;
357
25.9M
         }
358
51.3k
         apply_downsampling=1;
359
51.3k
      } else
360
146k
#endif
361
146k
      if (downsample>1)
362
113k
      {
363
         /* Shortcut for the standard (non-custom modes) case */
364
27.9M
         for (j=0;j<N;j++)
365
27.8M
         {
366
27.8M
            celt_sig tmp = SATURATE(x[j] + VERY_SMALL + m, SIG_SAT);
367
27.8M
            m = MULT16_32_Q15(coef0, tmp);
368
27.8M
            scratch[j] = tmp;
369
27.8M
         }
370
113k
         apply_downsampling=1;
371
113k
      } else {
372
         /* Shortcut for the standard (non-custom modes) case */
373
33.4k
         if (accum)
374
7.59k
         {
375
4.11M
            for (j=0;j<N;j++)
376
4.10M
            {
377
4.10M
               celt_sig tmp = SATURATE(x[j] + m + VERY_SMALL, SIG_SAT);
378
4.10M
               m = MULT16_32_Q15(coef0, tmp);
379
4.10M
               y[j*C] = ADD_RES(y[j*C], SIG2RES(tmp));
380
4.10M
            }
381
7.59k
         } else
382
25.8k
         {
383
6.05M
            for (j=0;j<N;j++)
384
6.02M
            {
385
6.02M
               celt_sig tmp = SATURATE(x[j] + VERY_SMALL + m, SIG_SAT);
386
6.02M
               m = MULT16_32_Q15(coef0, tmp);
387
6.02M
               y[j*C] = SIG2RES(tmp);
388
6.02M
            }
389
25.8k
         }
390
33.4k
      }
391
197k
      mem[c] = m;
392
393
197k
      if (apply_downsampling)
394
164k
      {
395
         /* Perform down-sampling */
396
164k
         if (accum)
397
15.8k
         {
398
6.75M
            for (j=0;j<Nd;j++)
399
6.73M
               y[j*C] = ADD_RES(y[j*C], SIG2RES(scratch[j*downsample]));
400
15.8k
         } else
401
148k
         {
402
26.8M
            for (j=0;j<Nd;j++)
403
26.7M
               y[j*C] = SIG2RES(scratch[j*downsample]);
404
148k
         }
405
164k
      }
406
197k
   } while (++c<C);
407
139k
   RESTORE_STACK;
408
139k
}
celt_decoder.c:deemphasis
Line
Count
Source
320
128k
{
321
128k
   int c;
322
128k
   int Nd;
323
128k
   int apply_downsampling=0;
324
128k
   opus_val16 coef0;
325
128k
   VARDECL(celt_sig, scratch);
326
128k
   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
128k
   ALLOC(scratch, N, celt_sig);
336
128k
   coef0 = coef[0];
337
128k
   Nd = N/downsample;
338
194k
   c=0; do {
339
194k
      int j;
340
194k
      celt_sig * OPUS_RESTRICT x;
341
194k
      opus_res  * OPUS_RESTRICT y;
342
194k
      celt_sig m = mem[c];
343
194k
      x =in[c];
344
194k
      y = pcm+c;
345
194k
#if defined(CUSTOM_MODES) || defined(ENABLE_OPUS_CUSTOM_API) || defined(ENABLE_QEXT)
346
194k
      if (coef[1] != 0)
347
44.3k
      {
348
44.3k
         opus_val16 coef1 = coef[1];
349
44.3k
         opus_val16 coef3 = coef[3];
350
24.6M
         for (j=0;j<N;j++)
351
24.6M
         {
352
24.6M
            celt_sig tmp = SATURATE(x[j] + m + VERY_SMALL, SIG_SAT);
353
24.6M
            m = MULT16_32_Q15(coef0, tmp)
354
24.6M
                          - MULT16_32_Q15(coef1, x[j]);
355
24.6M
            tmp = SHL32(MULT16_32_Q15(coef3, tmp), 2);
356
24.6M
            scratch[j] = tmp;
357
24.6M
         }
358
44.3k
         apply_downsampling=1;
359
44.3k
      } else
360
149k
#endif
361
149k
      if (downsample>1)
362
122k
      {
363
         /* Shortcut for the standard (non-custom modes) case */
364
36.3M
         for (j=0;j<N;j++)
365
36.2M
         {
366
36.2M
            celt_sig tmp = SATURATE(x[j] + VERY_SMALL + m, SIG_SAT);
367
36.2M
            m = MULT16_32_Q15(coef0, tmp);
368
36.2M
            scratch[j] = tmp;
369
36.2M
         }
370
122k
         apply_downsampling=1;
371
122k
      } else {
372
         /* Shortcut for the standard (non-custom modes) case */
373
27.3k
         if (accum)
374
5.66k
         {
375
3.12M
            for (j=0;j<N;j++)
376
3.12M
            {
377
3.12M
               celt_sig tmp = SATURATE(x[j] + m + VERY_SMALL, SIG_SAT);
378
3.12M
               m = MULT16_32_Q15(coef0, tmp);
379
3.12M
               y[j*C] = ADD_RES(y[j*C], SIG2RES(tmp));
380
3.12M
            }
381
5.66k
         } else
382
21.6k
         {
383
5.39M
            for (j=0;j<N;j++)
384
5.37M
            {
385
5.37M
               celt_sig tmp = SATURATE(x[j] + VERY_SMALL + m, SIG_SAT);
386
5.37M
               m = MULT16_32_Q15(coef0, tmp);
387
5.37M
               y[j*C] = SIG2RES(tmp);
388
5.37M
            }
389
21.6k
         }
390
27.3k
      }
391
194k
      mem[c] = m;
392
393
194k
      if (apply_downsampling)
394
166k
      {
395
         /* Perform down-sampling */
396
166k
         if (accum)
397
19.9k
         {
398
6.47M
            for (j=0;j<Nd;j++)
399
6.45M
               y[j*C] = ADD_RES(y[j*C], SIG2RES(scratch[j*downsample]));
400
19.9k
         } else
401
147k
         {
402
29.0M
            for (j=0;j<Nd;j++)
403
28.8M
               y[j*C] = SIG2RES(scratch[j*downsample]);
404
147k
         }
405
166k
      }
406
194k
   } while (++c<C);
407
128k
   RESTORE_STACK;
408
128k
}
celt_decoder.c:deemphasis
Line
Count
Source
320
116k
{
321
116k
   int c;
322
116k
   int Nd;
323
116k
   int apply_downsampling=0;
324
116k
   opus_val16 coef0;
325
116k
   VARDECL(celt_sig, scratch);
326
116k
   SAVE_STACK;
327
116k
#if !defined(CUSTOM_MODES) && !defined(ENABLE_OPUS_CUSTOM_API) && !defined(ENABLE_QEXT)
328
   /* Short version for common case. */
329
116k
   if (downsample == 1 && C == 2 && !accum)
330
13.2k
   {
331
13.2k
      deemphasis_stereo_simple(in, pcm, N, coef[0], mem);
332
13.2k
      return;
333
13.2k
   }
334
103k
#endif
335
103k
   ALLOC(scratch, N, celt_sig);
336
103k
   coef0 = coef[0];
337
103k
   Nd = N/downsample;
338
151k
   c=0; do {
339
151k
      int j;
340
151k
      celt_sig * OPUS_RESTRICT x;
341
151k
      opus_res  * OPUS_RESTRICT y;
342
151k
      celt_sig m = mem[c];
343
151k
      x =in[c];
344
151k
      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
151k
      if (downsample>1)
362
129k
      {
363
         /* Shortcut for the standard (non-custom modes) case */
364
41.9M
         for (j=0;j<N;j++)
365
41.8M
         {
366
41.8M
            celt_sig tmp = SATURATE(x[j] + VERY_SMALL + m, SIG_SAT);
367
41.8M
            m = MULT16_32_Q15(coef0, tmp);
368
41.8M
            scratch[j] = tmp;
369
41.8M
         }
370
129k
         apply_downsampling=1;
371
129k
      } else {
372
         /* Shortcut for the standard (non-custom modes) case */
373
21.7k
         if (accum)
374
9.04k
         {
375
4.80M
            for (j=0;j<N;j++)
376
4.79M
            {
377
4.79M
               celt_sig tmp = SATURATE(x[j] + m + VERY_SMALL, SIG_SAT);
378
4.79M
               m = MULT16_32_Q15(coef0, tmp);
379
4.79M
               y[j*C] = ADD_RES(y[j*C], SIG2RES(tmp));
380
4.79M
            }
381
9.04k
         } else
382
12.7k
         {
383
3.73M
            for (j=0;j<N;j++)
384
3.71M
            {
385
3.71M
               celt_sig tmp = SATURATE(x[j] + VERY_SMALL + m, SIG_SAT);
386
3.71M
               m = MULT16_32_Q15(coef0, tmp);
387
3.71M
               y[j*C] = SIG2RES(tmp);
388
3.71M
            }
389
12.7k
         }
390
21.7k
      }
391
151k
      mem[c] = m;
392
393
151k
      if (apply_downsampling)
394
129k
      {
395
         /* Perform down-sampling */
396
129k
         if (accum)
397
22.9k
         {
398
3.79M
            for (j=0;j<Nd;j++)
399
3.76M
               y[j*C] = ADD_RES(y[j*C], SIG2RES(scratch[j*downsample]));
400
22.9k
         } else
401
106k
         {
402
9.80M
            for (j=0;j<Nd;j++)
403
9.69M
               y[j*C] = SIG2RES(scratch[j*downsample]);
404
106k
         }
405
129k
      }
406
151k
   } while (++c<C);
407
103k
   RESTORE_STACK;
408
103k
}
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
349k
{
418
349k
   int c, i;
419
349k
   int M;
420
349k
   int b;
421
349k
   int B;
422
349k
   int N, NB;
423
349k
   int shift;
424
349k
   int nbEBands;
425
349k
   int overlap;
426
349k
   VARDECL(celt_sig, freq);
427
349k
   SAVE_STACK;
428
429
349k
   overlap = mode->overlap;
430
349k
   nbEBands = mode->nbEBands;
431
349k
   N = mode->shortMdctSize<<LM;
432
349k
   ALLOC(freq, N, celt_sig); /**< Interleaved signal MDCTs */
433
349k
   M = 1<<LM;
434
#ifdef ENABLE_QEXT
435
175k
   if (mode->Fs != 96000) qext_end=2;
436
#endif
437
438
349k
   if (isTransient)
439
28.6k
   {
440
28.6k
      B = M;
441
28.6k
      NB = mode->shortMdctSize;
442
28.6k
      shift = mode->maxLM;
443
320k
   } else {
444
320k
      B = 1;
445
320k
      NB = mode->shortMdctSize<<LM;
446
320k
      shift = mode->maxLM-LM;
447
320k
   }
448
449
349k
   if (CC==2&&C==1)
450
104k
   {
451
      /* Copying a mono streams to two channels */
452
104k
      celt_sig *freq2;
453
104k
      denormalise_bands(mode, X, freq, oldBandE, start, effEnd, M,
454
104k
            downsample, silence);
455
#ifdef ENABLE_QEXT
456
46.5k
      if (qext_mode)
457
860
         denormalise_bands(qext_mode, X, freq, qext_bandLogE, 0, qext_end, M,
458
860
                        downsample, silence);
459
#endif
460
      /* Store a temporary copy in the output buffer because the IMDCT destroys its input. */
461
104k
      freq2 = out_syn[1]+overlap/2;
462
104k
      OPUS_COPY(freq2, freq, N);
463
232k
      for (b=0;b<B;b++)
464
127k
         clt_mdct_backward(&mode->mdct, &freq2[b], out_syn[0]+NB*b, mode->window, overlap, shift, B, arch);
465
232k
      for (b=0;b<B;b++)
466
127k
         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.4k
   {
469
      /* Downmixing a stereo stream to mono */
470
64.4k
      celt_sig *freq2;
471
64.4k
      freq2 = out_syn[0]+overlap/2;
472
64.4k
      denormalise_bands(mode, X, freq, oldBandE, start, effEnd, M,
473
64.4k
            downsample, silence);
474
      /* Use the output buffer as temp array before downmixing. */
475
64.4k
      denormalise_bands(mode, X+N, freq2, oldBandE+nbEBands, start, effEnd, M,
476
64.4k
            downsample, silence);
477
#ifdef ENABLE_QEXT
478
33.3k
      if (qext_mode)
479
4.09k
      {
480
4.09k
         denormalise_bands(qext_mode, X, freq, qext_bandLogE, 0, qext_end, M,
481
4.09k
                        downsample, silence);
482
4.09k
         denormalise_bands(qext_mode, X+N, freq2, qext_bandLogE+NB_QEXT_BANDS, 0, qext_end, M,
483
4.09k
                        downsample, silence);
484
4.09k
      }
485
#endif
486
27.5M
      for (i=0;i<N;i++)
487
27.5M
         freq[i] = ADD32(HALF32(freq[i]), HALF32(freq2[i]));
488
158k
      for (b=0;b<B;b++)
489
93.8k
         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
246k
      c=0; do {
493
246k
         denormalise_bands(mode, X+c*N, freq, oldBandE+c*nbEBands, start, effEnd, M,
494
246k
               downsample, silence);
495
#ifdef ENABLE_QEXT
496
127k
         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
547k
         for (b=0;b<B;b++)
501
301k
            clt_mdct_backward(&mode->mdct, &freq[b], out_syn[c]+NB*b, mode->window, overlap, shift, B, arch);
502
246k
      } while (++c<CC);
503
180k
   }
504
   /* Saturate IMDCT output so that we can't overflow in the pitch postfilter
505
      or in the */
506
520k
   c=0; do {
507
187M
      for (i=0;i<N;i++)
508
186M
         out_syn[c][i] = SATURATE(out_syn[c][i], SIG_SAT);
509
520k
   } while (++c<CC);
510
349k
   RESTORE_STACK;
511
349k
}
celt_decoder.c:celt_synthesis
Line
Count
Source
417
93.6k
{
418
93.6k
   int c, i;
419
93.6k
   int M;
420
93.6k
   int b;
421
93.6k
   int B;
422
93.6k
   int N, NB;
423
93.6k
   int shift;
424
93.6k
   int nbEBands;
425
93.6k
   int overlap;
426
93.6k
   VARDECL(celt_sig, freq);
427
93.6k
   SAVE_STACK;
428
429
93.6k
   overlap = mode->overlap;
430
93.6k
   nbEBands = mode->nbEBands;
431
93.6k
   N = mode->shortMdctSize<<LM;
432
93.6k
   ALLOC(freq, N, celt_sig); /**< Interleaved signal MDCTs */
433
93.6k
   M = 1<<LM;
434
#ifdef ENABLE_QEXT
435
   if (mode->Fs != 96000) qext_end=2;
436
#endif
437
438
93.6k
   if (isTransient)
439
8.34k
   {
440
8.34k
      B = M;
441
8.34k
      NB = mode->shortMdctSize;
442
8.34k
      shift = mode->maxLM;
443
85.3k
   } else {
444
85.3k
      B = 1;
445
85.3k
      NB = mode->shortMdctSize<<LM;
446
85.3k
      shift = mode->maxLM-LM;
447
85.3k
   }
448
449
93.6k
   if (CC==2&&C==1)
450
34.5k
   {
451
      /* Copying a mono streams to two channels */
452
34.5k
      celt_sig *freq2;
453
34.5k
      denormalise_bands(mode, X, freq, oldBandE, start, effEnd, M,
454
34.5k
            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
34.5k
      freq2 = out_syn[1]+overlap/2;
462
34.5k
      OPUS_COPY(freq2, freq, N);
463
76.6k
      for (b=0;b<B;b++)
464
42.0k
         clt_mdct_backward(&mode->mdct, &freq2[b], out_syn[0]+NB*b, mode->window, overlap, shift, B, arch);
465
76.6k
      for (b=0;b<B;b++)
466
42.0k
         clt_mdct_backward(&mode->mdct, &freq[b], out_syn[1]+NB*b, mode->window, overlap, shift, B, arch);
467
59.0k
   } 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.27M
      for (i=0;i<N;i++)
487
6.26M
         freq[i] = ADD32(HALF32(freq[i]), HALF32(freq2[i]));
488
42.8k
      for (b=0;b<B;b++)
489
26.2k
         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
59.5k
      c=0; do {
493
59.5k
         denormalise_bands(mode, X+c*N, freq, oldBandE+c*nbEBands, start, effEnd, M,
494
59.5k
               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
135k
         for (b=0;b<B;b++)
501
75.9k
            clt_mdct_backward(&mode->mdct, &freq[b], out_syn[c]+NB*b, mode->window, overlap, shift, B, arch);
502
59.5k
      } 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
145k
   c=0; do {
507
44.0M
      for (i=0;i<N;i++)
508
43.8M
         out_syn[c][i] = SATURATE(out_syn[c][i], SIG_SAT);
509
145k
   } while (++c<CC);
510
93.6k
   RESTORE_STACK;
511
93.6k
}
celt_decoder.c:celt_synthesis
Line
Count
Source
417
89.7k
{
418
89.7k
   int c, i;
419
89.7k
   int M;
420
89.7k
   int b;
421
89.7k
   int B;
422
89.7k
   int N, NB;
423
89.7k
   int shift;
424
89.7k
   int nbEBands;
425
89.7k
   int overlap;
426
89.7k
   VARDECL(celt_sig, freq);
427
89.7k
   SAVE_STACK;
428
429
89.7k
   overlap = mode->overlap;
430
89.7k
   nbEBands = mode->nbEBands;
431
89.7k
   N = mode->shortMdctSize<<LM;
432
89.7k
   ALLOC(freq, N, celt_sig); /**< Interleaved signal MDCTs */
433
89.7k
   M = 1<<LM;
434
89.7k
#ifdef ENABLE_QEXT
435
89.7k
   if (mode->Fs != 96000) qext_end=2;
436
89.7k
#endif
437
438
89.7k
   if (isTransient)
439
6.00k
   {
440
6.00k
      B = M;
441
6.00k
      NB = mode->shortMdctSize;
442
6.00k
      shift = mode->maxLM;
443
83.7k
   } else {
444
83.7k
      B = 1;
445
83.7k
      NB = mode->shortMdctSize<<LM;
446
83.7k
      shift = mode->maxLM-LM;
447
83.7k
   }
448
449
89.7k
   if (CC==2&&C==1)
450
20.7k
   {
451
      /* Copying a mono streams to two channels */
452
20.7k
      celt_sig *freq2;
453
20.7k
      denormalise_bands(mode, X, freq, oldBandE, start, effEnd, M,
454
20.7k
            downsample, silence);
455
20.7k
#ifdef ENABLE_QEXT
456
20.7k
      if (qext_mode)
457
446
         denormalise_bands(qext_mode, X, freq, qext_bandLogE, 0, qext_end, M,
458
446
                        downsample, silence);
459
20.7k
#endif
460
      /* Store a temporary copy in the output buffer because the IMDCT destroys its input. */
461
20.7k
      freq2 = out_syn[1]+overlap/2;
462
20.7k
      OPUS_COPY(freq2, freq, N);
463
45.0k
      for (b=0;b<B;b++)
464
24.2k
         clt_mdct_backward(&mode->mdct, &freq2[b], out_syn[0]+NB*b, mode->window, overlap, shift, B, arch);
465
45.0k
      for (b=0;b<B;b++)
466
24.2k
         clt_mdct_backward(&mode->mdct, &freq[b], out_syn[1]+NB*b, mode->window, overlap, shift, B, arch);
467
68.9k
   } 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.72k
      {
480
2.72k
         denormalise_bands(qext_mode, X, freq, qext_bandLogE, 0, qext_end, M,
481
2.72k
                        downsample, silence);
482
2.72k
         denormalise_bands(qext_mode, X+N, freq2, qext_bandLogE+NB_QEXT_BANDS, 0, qext_end, M,
483
2.72k
                        downsample, silence);
484
2.72k
      }
485
17.7k
#endif
486
8.17M
      for (i=0;i<N;i++)
487
8.15M
         freq[i] = ADD32(HALF32(freq[i]), HALF32(freq2[i]));
488
41.7k
      for (b=0;b<B;b++)
489
23.9k
         clt_mdct_backward(&mode->mdct, &freq[b], out_syn[0]+NB*b, mode->window, overlap, shift, B, arch);
490
51.2k
   } 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.86k
            denormalise_bands(qext_mode, X+c*N, freq, qext_bandLogE+c*NB_QEXT_BANDS, 0, qext_end, M,
498
1.86k
                           downsample, silence);
499
68.1k
#endif
500
148k
         for (b=0;b<B;b++)
501
80.3k
            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
51.2k
   }
504
   /* Saturate IMDCT output so that we can't overflow in the pitch postfilter
505
      or in the */
506
127k
   c=0; do {
507
48.2M
      for (i=0;i<N;i++)
508
48.0M
         out_syn[c][i] = SATURATE(out_syn[c][i], SIG_SAT);
509
127k
   } while (++c<CC);
510
89.7k
   RESTORE_STACK;
511
89.7k
}
celt_decoder.c:celt_synthesis
Line
Count
Source
417
85.8k
{
418
85.8k
   int c, i;
419
85.8k
   int M;
420
85.8k
   int b;
421
85.8k
   int B;
422
85.8k
   int N, NB;
423
85.8k
   int shift;
424
85.8k
   int nbEBands;
425
85.8k
   int overlap;
426
85.8k
   VARDECL(celt_sig, freq);
427
85.8k
   SAVE_STACK;
428
429
85.8k
   overlap = mode->overlap;
430
85.8k
   nbEBands = mode->nbEBands;
431
85.8k
   N = mode->shortMdctSize<<LM;
432
85.8k
   ALLOC(freq, N, celt_sig); /**< Interleaved signal MDCTs */
433
85.8k
   M = 1<<LM;
434
85.8k
#ifdef ENABLE_QEXT
435
85.8k
   if (mode->Fs != 96000) qext_end=2;
436
85.8k
#endif
437
438
85.8k
   if (isTransient)
439
7.52k
   {
440
7.52k
      B = M;
441
7.52k
      NB = mode->shortMdctSize;
442
7.52k
      shift = mode->maxLM;
443
78.2k
   } else {
444
78.2k
      B = 1;
445
78.2k
      NB = mode->shortMdctSize<<LM;
446
78.2k
      shift = mode->maxLM-LM;
447
78.2k
   }
448
449
85.8k
   if (CC==2&&C==1)
450
25.8k
   {
451
      /* Copying a mono streams to two channels */
452
25.8k
      celt_sig *freq2;
453
25.8k
      denormalise_bands(mode, X, freq, oldBandE, start, effEnd, M,
454
25.8k
            downsample, silence);
455
25.8k
#ifdef ENABLE_QEXT
456
25.8k
      if (qext_mode)
457
414
         denormalise_bands(qext_mode, X, freq, qext_bandLogE, 0, qext_end, M,
458
414
                        downsample, silence);
459
25.8k
#endif
460
      /* Store a temporary copy in the output buffer because the IMDCT destroys its input. */
461
25.8k
      freq2 = out_syn[1]+overlap/2;
462
25.8k
      OPUS_COPY(freq2, freq, N);
463
56.7k
      for (b=0;b<B;b++)
464
30.9k
         clt_mdct_backward(&mode->mdct, &freq2[b], out_syn[0]+NB*b, mode->window, overlap, shift, B, arch);
465
56.7k
      for (b=0;b<B;b++)
466
30.9k
         clt_mdct_backward(&mode->mdct, &freq[b], out_syn[1]+NB*b, mode->window, overlap, shift, B, arch);
467
59.9k
   } 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.36k
      {
480
1.36k
         denormalise_bands(qext_mode, X, freq, qext_bandLogE, 0, qext_end, M,
481
1.36k
                        downsample, silence);
482
1.36k
         denormalise_bands(qext_mode, X+N, freq2, qext_bandLogE+NB_QEXT_BANDS, 0, qext_end, M,
483
1.36k
                        downsample, silence);
484
1.36k
      }
485
15.5k
#endif
486
6.98M
      for (i=0;i<N;i++)
487
6.96M
         freq[i] = ADD32(HALF32(freq[i]), HALF32(freq2[i]));
488
37.3k
      for (b=0;b<B;b++)
489
21.8k
         clt_mdct_backward(&mode->mdct, &freq[b], out_syn[0]+NB*b, mode->window, overlap, shift, B, arch);
490
44.3k
   } else {
491
      /* Normal case (mono or stereo) */
492
59.5k
      c=0; do {
493
59.5k
         denormalise_bands(mode, X+c*N, freq, oldBandE+c*nbEBands, start, effEnd, M,
494
59.5k
               downsample, silence);
495
59.5k
#ifdef ENABLE_QEXT
496
59.5k
         if (qext_mode)
497
4.38k
            denormalise_bands(qext_mode, X+c*N, freq, qext_bandLogE+c*NB_QEXT_BANDS, 0, qext_end, M,
498
4.38k
                           downsample, silence);
499
59.5k
#endif
500
131k
         for (b=0;b<B;b++)
501
71.8k
            clt_mdct_backward(&mode->mdct, &freq[b], out_syn[c]+NB*b, mode->window, overlap, shift, B, arch);
502
59.5k
      } while (++c<CC);
503
44.3k
   }
504
   /* Saturate IMDCT output so that we can't overflow in the pitch postfilter
505
      or in the */
506
126k
   c=0; do {
507
50.7M
      for (i=0;i<N;i++)
508
50.6M
         out_syn[c][i] = SATURATE(out_syn[c][i], SIG_SAT);
509
126k
   } while (++c<CC);
510
85.8k
   RESTORE_STACK;
511
85.8k
}
celt_decoder.c:celt_synthesis
Line
Count
Source
417
80.4k
{
418
80.4k
   int c, i;
419
80.4k
   int M;
420
80.4k
   int b;
421
80.4k
   int B;
422
80.4k
   int N, NB;
423
80.4k
   int shift;
424
80.4k
   int nbEBands;
425
80.4k
   int overlap;
426
80.4k
   VARDECL(celt_sig, freq);
427
80.4k
   SAVE_STACK;
428
429
80.4k
   overlap = mode->overlap;
430
80.4k
   nbEBands = mode->nbEBands;
431
80.4k
   N = mode->shortMdctSize<<LM;
432
80.4k
   ALLOC(freq, N, celt_sig); /**< Interleaved signal MDCTs */
433
80.4k
   M = 1<<LM;
434
#ifdef ENABLE_QEXT
435
   if (mode->Fs != 96000) qext_end=2;
436
#endif
437
438
80.4k
   if (isTransient)
439
6.78k
   {
440
6.78k
      B = M;
441
6.78k
      NB = mode->shortMdctSize;
442
6.78k
      shift = mode->maxLM;
443
73.6k
   } else {
444
73.6k
      B = 1;
445
73.6k
      NB = mode->shortMdctSize<<LM;
446
73.6k
      shift = mode->maxLM-LM;
447
73.6k
   }
448
449
80.4k
   if (CC==2&&C==1)
450
23.7k
   {
451
      /* Copying a mono streams to two channels */
452
23.7k
      celt_sig *freq2;
453
23.7k
      denormalise_bands(mode, X, freq, oldBandE, start, effEnd, M,
454
23.7k
            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.7k
      freq2 = out_syn[1]+overlap/2;
462
23.7k
      OPUS_COPY(freq2, freq, N);
463
53.6k
      for (b=0;b<B;b++)
464
29.9k
         clt_mdct_backward(&mode->mdct, &freq2[b], out_syn[0]+NB*b, mode->window, overlap, shift, B, arch);
465
53.6k
      for (b=0;b<B;b++)
466
29.9k
         clt_mdct_backward(&mode->mdct, &freq[b], out_syn[1]+NB*b, mode->window, overlap, shift, B, arch);
467
56.6k
   } else if (CC==1&&C==2)
468
14.5k
   {
469
      /* Downmixing a stereo stream to mono */
470
14.5k
      celt_sig *freq2;
471
14.5k
      freq2 = out_syn[0]+overlap/2;
472
14.5k
      denormalise_bands(mode, X, freq, oldBandE, start, effEnd, M,
473
14.5k
            downsample, silence);
474
      /* Use the output buffer as temp array before downmixing. */
475
14.5k
      denormalise_bands(mode, X+N, freq2, oldBandE+nbEBands, start, effEnd, M,
476
14.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.15M
      for (i=0;i<N;i++)
487
6.14M
         freq[i] = ADD32(HALF32(freq[i]), HALF32(freq2[i]));
488
36.3k
      for (b=0;b<B;b++)
489
21.7k
         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
58.9k
      c=0; do {
493
58.9k
         denormalise_bands(mode, X+c*N, freq, oldBandE+c*nbEBands, start, effEnd, M,
494
58.9k
               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
131k
         for (b=0;b<B;b++)
501
73.0k
            clt_mdct_backward(&mode->mdct, &freq[b], out_syn[c]+NB*b, mode->window, overlap, shift, B, arch);
502
58.9k
      } 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
120k
   c=0; do {
507
44.0M
      for (i=0;i<N;i++)
508
43.8M
         out_syn[c][i] = SATURATE(out_syn[c][i], SIG_SAT);
509
120k
   } while (++c<CC);
510
80.4k
   RESTORE_STACK;
511
80.4k
}
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.24M
   for (i=start;i<end;i++)
529
4.94M
   {
530
4.94M
      if (tell+logp<=budget)
531
1.78M
      {
532
1.78M
         curr ^= ec_dec_bit_logp(dec, logp);
533
1.78M
         tell = ec_tell(dec);
534
1.78M
         tf_changed |= curr;
535
1.78M
      }
536
4.94M
      tf_res[i] = curr;
537
4.94M
      logp = isTransient ? 4 : 5;
538
4.94M
   }
539
307k
   tf_select = 0;
540
307k
   if (tf_select_rsv &&
541
88.1k
     tf_select_table[LM][4*isTransient+0+tf_changed] !=
542
88.1k
     tf_select_table[LM][4*isTransient+2+tf_changed])
543
30.8k
   {
544
30.8k
      tf_select = ec_dec_bit_logp(dec, 1);
545
30.8k
   }
546
5.24M
   for (i=start;i<end;i++)
547
4.94M
   {
548
4.94M
      tf_res[i] = tf_select_table[LM][4*isTransient+2*tf_select+tf_res[i]];
549
4.94M
   }
550
307k
}
551
552
static int celt_plc_pitch_search(CELTDecoder *st, celt_sig *decode_mem[2], int C, int arch)
553
104k
{
554
104k
   int pitch_index;
555
#ifdef ENABLE_QEXT
556
   int qext_scale;
557
#endif
558
104k
   VARDECL( opus_val16, lp_pitch_buf );
559
104k
   SAVE_STACK;
560
#ifdef ENABLE_QEXT
561
   qext_scale = st->qext_scale;
562
#else
563
104k
   (void)st;
564
104k
#endif
565
104k
   ALLOC( lp_pitch_buf, DECODE_BUFFER_SIZE>>1, opus_val16 );
566
104k
   pitch_downsample(decode_mem, lp_pitch_buf,
567
104k
         DECODE_BUFFER_SIZE>>1, C, QEXT_SCALE(2), arch);
568
104k
   pitch_search(lp_pitch_buf+(PLC_PITCH_LAG_MAX>>1), lp_pitch_buf,
569
104k
         DECODE_BUFFER_SIZE-PLC_PITCH_LAG_MAX,
570
104k
         PLC_PITCH_LAG_MAX-PLC_PITCH_LAG_MIN, &pitch_index, arch);
571
104k
   pitch_index = PLC_PITCH_LAG_MAX-pitch_index;
572
104k
   RESTORE_STACK;
573
104k
   return QEXT_SCALE(pitch_index);
574
104k
}
575
576
static void prefilter_and_fold(CELTDecoder * OPUS_RESTRICT st, int N)
577
127k
{
578
127k
   int c;
579
127k
   int CC;
580
127k
   int i;
581
127k
   int overlap;
582
127k
   celt_sig *decode_mem[2];
583
127k
   const OpusCustomMode *mode;
584
127k
   int decode_buffer_size;
585
#ifdef ENABLE_QEXT
586
   int qext_scale;
587
#endif
588
127k
   VARDECL(opus_val32, etmp);
589
127k
   SAVE_STACK
590
#ifdef ENABLE_QEXT
591
   qext_scale = st->qext_scale;
592
#endif
593
127k
   decode_buffer_size = QEXT_SCALE(DECODE_BUFFER_SIZE);
594
127k
   mode = st->mode;
595
127k
   overlap = st->overlap;
596
127k
   CC = st->channels;
597
127k
   ALLOC(etmp, overlap, opus_val32);
598
208k
   c=0; do {
599
208k
      decode_mem[c] = st->_decode_mem + c*(decode_buffer_size+overlap);
600
208k
   } while (++c<CC);
601
602
208k
   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
208k
      comb_filter(etmp, decode_mem[c]+decode_buffer_size-N,
607
208k
         st->postfilter_period_old, st->postfilter_period, overlap,
608
208k
         -st->postfilter_gain_old, -st->postfilter_gain,
609
208k
         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.0M
      for (i=0;i<overlap/2;i++)
614
13.8M
      {
615
13.8M
         decode_mem[c][decode_buffer_size-N+i] =
616
13.8M
            MULT16_32_Q15(COEF2VAL16(mode->window[i]), etmp[overlap-1-i])
617
13.8M
            + MULT16_32_Q15 (COEF2VAL16(mode->window[overlap-i-1]), etmp[i]);
618
13.8M
      }
619
208k
   } while (++c<CC);
620
127k
   RESTORE_STACK;
621
127k
}
celt_decoder.c:prefilter_and_fold
Line
Count
Source
577
63.7k
{
578
63.7k
   int c;
579
63.7k
   int CC;
580
63.7k
   int i;
581
63.7k
   int overlap;
582
63.7k
   celt_sig *decode_mem[2];
583
63.7k
   const OpusCustomMode *mode;
584
63.7k
   int decode_buffer_size;
585
#ifdef ENABLE_QEXT
586
   int qext_scale;
587
#endif
588
63.7k
   VARDECL(opus_val32, etmp);
589
63.7k
   SAVE_STACK
590
#ifdef ENABLE_QEXT
591
   qext_scale = st->qext_scale;
592
#endif
593
63.7k
   decode_buffer_size = QEXT_SCALE(DECODE_BUFFER_SIZE);
594
63.7k
   mode = st->mode;
595
63.7k
   overlap = st->overlap;
596
63.7k
   CC = st->channels;
597
63.7k
   ALLOC(etmp, overlap, opus_val32);
598
104k
   c=0; do {
599
104k
      decode_mem[c] = st->_decode_mem + c*(decode_buffer_size+overlap);
600
104k
   } while (++c<CC);
601
602
104k
   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
104k
      comb_filter(etmp, decode_mem[c]+decode_buffer_size-N,
607
104k
         st->postfilter_period_old, st->postfilter_period, overlap,
608
104k
         -st->postfilter_gain_old, -st->postfilter_gain,
609
104k
         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.04M
      for (i=0;i<overlap/2;i++)
614
6.94M
      {
615
6.94M
         decode_mem[c][decode_buffer_size-N+i] =
616
6.94M
            MULT16_32_Q15(COEF2VAL16(mode->window[i]), etmp[overlap-1-i])
617
6.94M
            + MULT16_32_Q15 (COEF2VAL16(mode->window[overlap-i-1]), etmp[i]);
618
6.94M
      }
619
104k
   } while (++c<CC);
620
63.7k
   RESTORE_STACK;
621
63.7k
}
celt_decoder.c:prefilter_and_fold
Line
Count
Source
577
63.7k
{
578
63.7k
   int c;
579
63.7k
   int CC;
580
63.7k
   int i;
581
63.7k
   int overlap;
582
63.7k
   celt_sig *decode_mem[2];
583
63.7k
   const OpusCustomMode *mode;
584
63.7k
   int decode_buffer_size;
585
63.7k
#ifdef ENABLE_QEXT
586
63.7k
   int qext_scale;
587
63.7k
#endif
588
63.7k
   VARDECL(opus_val32, etmp);
589
63.7k
   SAVE_STACK
590
63.7k
#ifdef ENABLE_QEXT
591
63.7k
   qext_scale = st->qext_scale;
592
63.7k
#endif
593
63.7k
   decode_buffer_size = QEXT_SCALE(DECODE_BUFFER_SIZE);
594
63.7k
   mode = st->mode;
595
63.7k
   overlap = st->overlap;
596
63.7k
   CC = st->channels;
597
63.7k
   ALLOC(etmp, overlap, opus_val32);
598
104k
   c=0; do {
599
104k
      decode_mem[c] = st->_decode_mem + c*(decode_buffer_size+overlap);
600
104k
   } while (++c<CC);
601
602
104k
   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
104k
      comb_filter(etmp, decode_mem[c]+decode_buffer_size-N,
607
104k
         st->postfilter_period_old, st->postfilter_period, overlap,
608
104k
         -st->postfilter_gain_old, -st->postfilter_gain,
609
104k
         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.04M
      for (i=0;i<overlap/2;i++)
614
6.94M
      {
615
6.94M
         decode_mem[c][decode_buffer_size-N+i] =
616
6.94M
            MULT16_32_Q15(COEF2VAL16(mode->window[i]), etmp[overlap-1-i])
617
6.94M
            + MULT16_32_Q15 (COEF2VAL16(mode->window[overlap-i-1]), etmp[i]);
618
6.94M
      }
619
104k
   } while (++c<CC);
620
63.7k
   RESTORE_STACK;
621
63.7k
}
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
326k
{
681
326k
   int c;
682
326k
   int i;
683
326k
   const int C = st->channels;
684
326k
   celt_sig *decode_mem[2];
685
326k
   celt_sig *out_syn[2];
686
326k
   opus_val16 *lpc;
687
326k
   celt_glog *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE;
688
326k
   const OpusCustomMode *mode;
689
326k
   int nbEBands;
690
326k
   int overlap;
691
326k
   int start;
692
326k
   int loss_duration;
693
326k
   int curr_frame_type;
694
326k
   const opus_int16 *eBands;
695
326k
   int decode_buffer_size;
696
326k
   int max_period;
697
#ifdef ENABLE_QEXT
698
   int qext_scale;
699
#endif
700
326k
   SAVE_STACK;
701
#ifdef ENABLE_QEXT
702
   qext_scale = st->qext_scale;
703
#endif
704
326k
   decode_buffer_size = QEXT_SCALE(DECODE_BUFFER_SIZE);
705
326k
   max_period = QEXT_SCALE(MAX_PERIOD);
706
326k
   mode = st->mode;
707
326k
   nbEBands = mode->nbEBands;
708
326k
   overlap = mode->overlap;
709
326k
   eBands = mode->eBands;
710
711
503k
   c=0; do {
712
503k
      decode_mem[c] = st->_decode_mem + c*(decode_buffer_size+overlap);
713
503k
      out_syn[c] = decode_mem[c]+decode_buffer_size-N;
714
503k
   } while (++c<C);
715
326k
   oldBandE = (celt_glog*)(st->_decode_mem+(decode_buffer_size+overlap)*C);
716
326k
   oldLogE = oldBandE + 2*nbEBands;
717
326k
   oldLogE2 = oldLogE + 2*nbEBands;
718
326k
   backgroundLogE = oldLogE2 + 2*nbEBands;
719
326k
   lpc = (opus_val16*)(backgroundLogE + 2*nbEBands);
720
721
326k
   loss_duration = st->loss_duration;
722
326k
   start = st->start;
723
326k
   curr_frame_type = FRAME_PLC_PERIODIC;
724
326k
   if (st->plc_duration >= 40 || start != 0 || st->skip_plc)
725
64.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
326k
   if (curr_frame_type == FRAME_PLC_NOISE)
739
64.7k
   {
740
      /* Noise-based PLC/CNG */
741
64.7k
      VARDECL(celt_norm, X);
742
64.7k
      opus_uint32 seed;
743
64.7k
      int end;
744
64.7k
      int effEnd;
745
64.7k
      celt_glog decay;
746
64.7k
      end = st->end;
747
64.7k
      effEnd = IMAX(start, IMIN(end, mode->effEBands));
748
749
64.7k
      ALLOC(X, C*N, celt_norm);   /**< Interleaved normalised MDCTs */
750
93.8k
      c=0; do {
751
93.8k
         OPUS_MOVE(decode_mem[c], decode_mem[c]+N,
752
93.8k
               decode_buffer_size-N+overlap);
753
93.8k
      } while (++c<C);
754
755
64.7k
      if (st->prefilter_and_fold) {
756
1.41k
         prefilter_and_fold(st, N);
757
1.41k
      }
758
759
      /* Energy decay */
760
64.7k
      decay = loss_duration==0 ? GCONST(1.5f) : GCONST(.5f);
761
64.7k
      c=0; do
762
93.8k
      {
763
471k
         for (i=start;i<end;i++)
764
377k
            oldBandE[c*nbEBands+i] = MAXG(backgroundLogE[c*nbEBands+i], oldBandE[c*nbEBands+i] - decay);
765
93.8k
      } while (++c<C);
766
64.7k
      seed = st->rng;
767
158k
      for (c=0;c<C;c++)
768
93.8k
      {
769
471k
         for (i=start;i<effEnd;i++)
770
377k
         {
771
377k
            int j;
772
377k
            int boffs;
773
377k
            int blen;
774
377k
            boffs = N*c+(eBands[i]<<LM);
775
377k
            blen = (eBands[i+1]-eBands[i])<<LM;
776
16.5M
            for (j=0;j<blen;j++)
777
16.2M
            {
778
16.2M
               seed = celt_lcg_rand(seed);
779
16.2M
               X[boffs+j] = SHL32((celt_norm)((opus_int32)seed>>20), NORM_SHIFT-14);
780
16.2M
            }
781
377k
            renormalise_vector(X+boffs, blen, Q31ONE, st->arch);
782
377k
         }
783
93.8k
      }
784
64.7k
      st->rng = seed;
785
786
64.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
93.8k
      c=0; do {
790
93.8k
         st->postfilter_period=IMAX(st->postfilter_period, COMBFILTER_MINPERIOD);
791
93.8k
         st->postfilter_period_old=IMAX(st->postfilter_period_old, COMBFILTER_MINPERIOD);
792
93.8k
         comb_filter(out_syn[c], out_syn[c], st->postfilter_period_old, st->postfilter_period, mode->shortMdctSize,
793
93.8k
               st->postfilter_gain_old, st->postfilter_gain, st->postfilter_tapset_old, st->postfilter_tapset,
794
93.8k
               mode->window, overlap, st->arch);
795
93.8k
         if (LM!=0)
796
88.1k
            comb_filter(out_syn[c]+mode->shortMdctSize, out_syn[c]+mode->shortMdctSize, st->postfilter_period, st->postfilter_period, N-mode->shortMdctSize,
797
88.1k
                  st->postfilter_gain, st->postfilter_gain, st->postfilter_tapset, st->postfilter_tapset,
798
88.1k
                  mode->window, overlap, st->arch);
799
800
93.8k
      } while (++c<C);
801
64.7k
      st->postfilter_period_old = st->postfilter_period;
802
64.7k
      st->postfilter_gain_old = st->postfilter_gain;
803
64.7k
      st->postfilter_tapset_old = st->postfilter_tapset;
804
805
64.7k
      st->prefilter_and_fold = 0;
806
      /* Skip regular PLC until we get two consecutive packets. */
807
64.7k
      st->skip_plc = 1;
808
261k
   } else {
809
261k
      int exc_length;
810
      /* Pitch-based PLC */
811
261k
      const celt_coef *window;
812
261k
      opus_val16 *exc;
813
261k
      opus_val16 fade = Q15ONE;
814
261k
      int pitch_index;
815
261k
      int curr_neural;
816
261k
      int last_neural;
817
261k
      VARDECL(opus_val16, _exc);
818
261k
      VARDECL(opus_val16, fir_tmp);
819
820
261k
      curr_neural = curr_frame_type == FRAME_PLC_NEURAL || curr_frame_type == FRAME_DRED;
821
261k
      last_neural = st->last_frame_type == FRAME_PLC_NEURAL || st->last_frame_type == FRAME_DRED;
822
261k
      if (st->last_frame_type != FRAME_PLC_PERIODIC && !(last_neural && curr_neural))
823
148k
      {
824
148k
         st->last_pitch_index = pitch_index = celt_plc_pitch_search(st, decode_mem, C, st->arch);
825
148k
      } else {
826
113k
         pitch_index = st->last_pitch_index;
827
113k
         fade = QCONST16(.8f,15);
828
113k
      }
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
261k
      exc_length = IMIN(2*pitch_index, max_period);
836
837
261k
      ALLOC(_exc, max_period+CELT_LPC_ORDER, opus_val16);
838
261k
      ALLOC(fir_tmp, exc_length, opus_val16);
839
261k
      exc = _exc+CELT_LPC_ORDER;
840
261k
      window = mode->window;
841
410k
      c=0; do {
842
410k
         opus_val16 decay;
843
410k
         opus_val16 attenuation;
844
410k
         opus_val32 S1=0;
845
410k
         celt_sig *buf;
846
410k
         int extrapolation_offset;
847
410k
         int extrapolation_len;
848
410k
         int j;
849
850
410k
         buf = decode_mem[c];
851
477M
         for (i=0;i<max_period+CELT_LPC_ORDER;i++)
852
477M
            exc[i-CELT_LPC_ORDER] = SROUND16(buf[decode_buffer_size-max_period-CELT_LPC_ORDER+i], SIG_SHIFT);
853
854
410k
         if (st->last_frame_type != FRAME_PLC_PERIODIC && !(last_neural && curr_neural))
855
232k
         {
856
232k
            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
232k
            _celt_autocorr(exc, ac, window, overlap,
860
232k
                   CELT_LPC_ORDER, max_period, st->arch);
861
            /* Add a noise floor of -40 dB. */
862
#ifdef FIXED_POINT
863
91.5k
            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.80M
            for (i=1;i<=CELT_LPC_ORDER;i++)
869
5.57M
            {
870
               /*ac[i] *= exp(-.5*(2*M_PI*.002*i)*(2*M_PI*.002*i));*/
871
#ifdef FIXED_POINT
872
2.19M
               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.57M
            }
877
232k
            _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
119k
         while (1) {
883
119k
            opus_val16 tmp=Q15ONE;
884
119k
            opus_val32 sum=QCONST16(1., SIG_SHIFT);
885
2.99M
            for (i=0;i<CELT_LPC_ORDER;i++)
886
2.87M
               sum += ABS16(lpc[c*CELT_LPC_ORDER+i]);
887
119k
            if (sum < 65535) break;
888
711k
            for (i=0;i<CELT_LPC_ORDER;i++)
889
683k
            {
890
683k
               tmp = MULT16_16_Q15(QCONST16(.99f,15), tmp);
891
683k
               lpc[c*CELT_LPC_ORDER+i] = MULT16_16_Q15(lpc[c*CELT_LPC_ORDER+i], tmp);
892
683k
            }
893
28.4k
         }
894
#endif
895
232k
         }
896
         /* Initialize the LPC history with the samples just before the start
897
            of the region for which we're computing the excitation. */
898
410k
         {
899
            /* Compute the excitation for exc_length samples before the loss. We need the copy
900
               because celt_fir() cannot filter in-place. */
901
410k
            celt_fir(exc+max_period-exc_length, lpc+c*CELT_LPC_ORDER,
902
410k
                  fir_tmp, exc_length, CELT_LPC_ORDER, st->arch);
903
410k
            OPUS_COPY(exc+max_period-exc_length, fir_tmp, exc_length);
904
410k
         }
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
410k
         {
910
410k
            opus_val32 E1=1, E2=1;
911
410k
            int decay_length;
912
#ifdef FIXED_POINT
913
160k
            int shift = IMAX(0,2*celt_zlog2(celt_maxabs16(&exc[max_period-exc_length], exc_length))-20);
914
#ifdef ENABLE_QEXT
915
70.5k
            if (st->qext_scale==2) shift++;
916
#endif
917
#endif
918
410k
            decay_length = exc_length>>1;
919
114M
            for (i=0;i<decay_length;i++)
920
114M
            {
921
114M
               opus_val16 e;
922
114M
               e = exc[max_period-decay_length+i];
923
114M
               E1 += SHR32(MULT16_16(e, e), shift);
924
114M
               e = exc[max_period-2*decay_length+i];
925
114M
               E2 += SHR32(MULT16_16(e, e), shift);
926
114M
            }
927
410k
            E1 = MIN32(E1, E2);
928
410k
            decay = celt_sqrt(frac_div32(SHR32(E1, 1), E2));
929
410k
         }
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
410k
         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
410k
         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
410k
         extrapolation_len = N+overlap;
943
         /* We also apply fading if this is not the first loss. */
944
410k
         attenuation = MULT16_16_Q15(fade, decay);
945
155M
         for (i=j=0;i<extrapolation_len;i++,j++)
946
155M
         {
947
155M
            opus_val16 tmp;
948
155M
            if (j >= pitch_index) {
949
501k
               j -= pitch_index;
950
501k
               attenuation = MULT16_16_Q15(attenuation, decay);
951
501k
            }
952
155M
            buf[decode_buffer_size-N+i] =
953
155M
                  SHL32(EXTEND32(MULT16_16_Q15(attenuation,
954
155M
                        exc[extrapolation_offset+j])), SIG_SHIFT);
955
            /* Compute the energy of the previously decoded signal whose
956
               excitation we're copying. */
957
155M
            tmp = SROUND16(
958
155M
                  buf[decode_buffer_size-max_period-N+extrapolation_offset+j],
959
155M
                  SIG_SHIFT);
960
155M
            S1 += SHR32(MULT16_16(tmp, tmp), 11);
961
155M
         }
962
410k
         {
963
410k
            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.2M
            for (i=0;i<CELT_LPC_ORDER;i++)
967
9.84M
               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
410k
            celt_iir(buf+decode_buffer_size-N, lpc+c*CELT_LPC_ORDER,
971
410k
                  buf+decode_buffer_size-N, extrapolation_len, CELT_LPC_ORDER,
972
410k
                  lpc_mem, st->arch);
973
#ifdef FIXED_POINT
974
54.5M
            for (i=0; i < extrapolation_len; i++)
975
54.3M
               buf[decode_buffer_size-N+i] = SATURATE(buf[decode_buffer_size-N+i], SIG_SAT);
976
#endif
977
410k
         }
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
410k
         {
983
410k
            opus_val32 S2=0;
984
155M
            for (i=0;i<extrapolation_len;i++)
985
155M
            {
986
155M
               opus_val16 tmp = SROUND16(buf[decode_buffer_size-N+i], SIG_SHIFT);
987
155M
               S2 += SHR32(MULT16_16(tmp, tmp), 11);
988
155M
            }
989
            /* This checks for an "explosion" in the synthesis. */
990
#ifdef FIXED_POINT
991
160k
            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
249k
            if (!(S1 > 0.2f*S2))
996
34.5k
#endif
997
127k
            {
998
46.5M
               for (i=0;i<extrapolation_len;i++)
999
46.4M
                  buf[decode_buffer_size-N+i] = 0;
1000
282k
            } else if (S1 < S2)
1001
74.6k
            {
1002
74.6k
               opus_val16 ratio = celt_sqrt(frac_div32(SHR32(S1,1)+1,S2+1));
1003
10.0M
               for (i=0;i<overlap;i++)
1004
9.96M
               {
1005
9.96M
                  opus_val16 tmp_g = Q15ONE
1006
9.96M
                        - MULT16_16_Q15(COEF2VAL16(window[i]), Q15ONE-ratio);
1007
9.96M
                  buf[decode_buffer_size-N+i] =
1008
9.96M
                        MULT16_32_Q15(tmp_g, buf[decode_buffer_size-N+i]);
1009
9.96M
               }
1010
14.4M
               for (i=overlap;i<extrapolation_len;i++)
1011
14.3M
               {
1012
14.3M
                  buf[decode_buffer_size-N+i] =
1013
14.3M
                        MULT16_32_Q15(ratio, buf[decode_buffer_size-N+i]);
1014
14.3M
               }
1015
74.6k
            }
1016
410k
         }
1017
1018
410k
      } 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
261k
      st->prefilter_and_fold = 1;
1077
261k
   }
1078
1079
   /* Saturate to something large to avoid wrap-around. */
1080
326k
   st->loss_duration = IMIN(10000, loss_duration+(1<<LM));
1081
326k
   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
326k
   st->last_frame_type = curr_frame_type;
1089
326k
   RESTORE_STACK;
1090
326k
}
celt_decoder.c:celt_decode_lost
Line
Count
Source
680
65.8k
{
681
65.8k
   int c;
682
65.8k
   int i;
683
65.8k
   const int C = st->channels;
684
65.8k
   celt_sig *decode_mem[2];
685
65.8k
   celt_sig *out_syn[2];
686
65.8k
   opus_val16 *lpc;
687
65.8k
   celt_glog *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE;
688
65.8k
   const OpusCustomMode *mode;
689
65.8k
   int nbEBands;
690
65.8k
   int overlap;
691
65.8k
   int start;
692
65.8k
   int loss_duration;
693
65.8k
   int curr_frame_type;
694
65.8k
   const opus_int16 *eBands;
695
65.8k
   int decode_buffer_size;
696
65.8k
   int max_period;
697
#ifdef ENABLE_QEXT
698
   int qext_scale;
699
#endif
700
65.8k
   SAVE_STACK;
701
#ifdef ENABLE_QEXT
702
   qext_scale = st->qext_scale;
703
#endif
704
65.8k
   decode_buffer_size = QEXT_SCALE(DECODE_BUFFER_SIZE);
705
65.8k
   max_period = QEXT_SCALE(MAX_PERIOD);
706
65.8k
   mode = st->mode;
707
65.8k
   nbEBands = mode->nbEBands;
708
65.8k
   overlap = mode->overlap;
709
65.8k
   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.8k
   oldBandE = (celt_glog*)(st->_decode_mem+(decode_buffer_size+overlap)*C);
716
65.8k
   oldLogE = oldBandE + 2*nbEBands;
717
65.8k
   oldLogE2 = oldLogE + 2*nbEBands;
718
65.8k
   backgroundLogE = oldLogE2 + 2*nbEBands;
719
65.8k
   lpc = (opus_val16*)(backgroundLogE + 2*nbEBands);
720
721
65.8k
   loss_duration = st->loss_duration;
722
65.8k
   start = st->start;
723
65.8k
   curr_frame_type = FRAME_PLC_PERIODIC;
724
65.8k
   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.8k
   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.0k
      c=0; do {
751
17.0k
         OPUS_MOVE(decode_mem[c], decode_mem[c]+N,
752
17.0k
               decode_buffer_size-N+overlap);
753
17.0k
      } while (++c<C);
754
755
12.0k
      if (st->prefilter_and_fold) {
756
327
         prefilter_and_fold(st, N);
757
327
      }
758
759
      /* Energy decay */
760
12.0k
      decay = loss_duration==0 ? GCONST(1.5f) : GCONST(.5f);
761
12.0k
      c=0; do
762
17.0k
      {
763
88.0k
         for (i=start;i<end;i++)
764
71.0k
            oldBandE[c*nbEBands+i] = MAXG(backgroundLogE[c*nbEBands+i], oldBandE[c*nbEBands+i] - decay);
765
17.0k
      } while (++c<C);
766
12.0k
      seed = st->rng;
767
29.0k
      for (c=0;c<C;c++)
768
17.0k
      {
769
88.0k
         for (i=start;i<effEnd;i++)
770
71.0k
         {
771
71.0k
            int j;
772
71.0k
            int boffs;
773
71.0k
            int blen;
774
71.0k
            boffs = N*c+(eBands[i]<<LM);
775
71.0k
            blen = (eBands[i+1]-eBands[i])<<LM;
776
2.97M
            for (j=0;j<blen;j++)
777
2.90M
            {
778
2.90M
               seed = celt_lcg_rand(seed);
779
2.90M
               X[boffs+j] = SHL32((celt_norm)((opus_int32)seed>>20), NORM_SHIFT-14);
780
2.90M
            }
781
71.0k
            renormalise_vector(X+boffs, blen, Q31ONE, st->arch);
782
71.0k
         }
783
17.0k
      }
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.0k
      c=0; do {
790
17.0k
         st->postfilter_period=IMAX(st->postfilter_period, COMBFILTER_MINPERIOD);
791
17.0k
         st->postfilter_period_old=IMAX(st->postfilter_period_old, COMBFILTER_MINPERIOD);
792
17.0k
         comb_filter(out_syn[c], out_syn[c], st->postfilter_period_old, st->postfilter_period, mode->shortMdctSize,
793
17.0k
               st->postfilter_gain_old, st->postfilter_gain, st->postfilter_tapset_old, st->postfilter_tapset,
794
17.0k
               mode->window, overlap, st->arch);
795
17.0k
         if (LM!=0)
796
15.8k
            comb_filter(out_syn[c]+mode->shortMdctSize, out_syn[c]+mode->shortMdctSize, st->postfilter_period, st->postfilter_period, N-mode->shortMdctSize,
797
15.8k
                  st->postfilter_gain, st->postfilter_gain, st->postfilter_tapset, st->postfilter_tapset,
798
15.8k
                  mode->window, overlap, st->arch);
799
800
17.0k
      } 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.8k
   } else {
809
53.8k
      int exc_length;
810
      /* Pitch-based PLC */
811
53.8k
      const celt_coef *window;
812
53.8k
      opus_val16 *exc;
813
53.8k
      opus_val16 fade = Q15ONE;
814
53.8k
      int pitch_index;
815
53.8k
      int curr_neural;
816
53.8k
      int last_neural;
817
53.8k
      VARDECL(opus_val16, _exc);
818
53.8k
      VARDECL(opus_val16, fir_tmp);
819
820
53.8k
      curr_neural = curr_frame_type == FRAME_PLC_NEURAL || curr_frame_type == FRAME_DRED;
821
53.8k
      last_neural = st->last_frame_type == FRAME_PLC_NEURAL || st->last_frame_type == FRAME_DRED;
822
53.8k
      if (st->last_frame_type != FRAME_PLC_PERIODIC && !(last_neural && curr_neural))
823
30.7k
      {
824
30.7k
         st->last_pitch_index = pitch_index = celt_plc_pitch_search(st, decode_mem, C, st->arch);
825
30.7k
      } 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.8k
      exc_length = IMIN(2*pitch_index, max_period);
836
837
53.8k
      ALLOC(_exc, max_period+CELT_LPC_ORDER, opus_val16);
838
53.8k
      ALLOC(fir_tmp, exc_length, opus_val16);
839
53.8k
      exc = _exc+CELT_LPC_ORDER;
840
53.8k
      window = mode->window;
841
89.9k
      c=0; do {
842
89.9k
         opus_val16 decay;
843
89.9k
         opus_val16 attenuation;
844
89.9k
         opus_val32 S1=0;
845
89.9k
         celt_sig *buf;
846
89.9k
         int extrapolation_offset;
847
89.9k
         int extrapolation_len;
848
89.9k
         int j;
849
850
89.9k
         buf = decode_mem[c];
851
94.3M
         for (i=0;i<max_period+CELT_LPC_ORDER;i++)
852
94.2M
            exc[i-CELT_LPC_ORDER] = SROUND16(buf[decode_buffer_size-max_period-CELT_LPC_ORDER+i], SIG_SHIFT);
853
854
89.9k
         if (st->last_frame_type != FRAME_PLC_PERIODIC && !(last_neural && curr_neural))
855
51.9k
         {
856
51.9k
            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
51.9k
            _celt_autocorr(exc, ac, window, overlap,
860
51.9k
                   CELT_LPC_ORDER, max_period, st->arch);
861
            /* Add a noise floor of -40 dB. */
862
51.9k
#ifdef FIXED_POINT
863
51.9k
            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.29M
            for (i=1;i<=CELT_LPC_ORDER;i++)
869
1.24M
            {
870
               /*ac[i] *= exp(-.5*(2*M_PI*.002*i)*(2*M_PI*.002*i));*/
871
1.24M
#ifdef FIXED_POINT
872
1.24M
               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.24M
            }
877
51.9k
            _celt_lpc(lpc+c*CELT_LPC_ORDER, ac, CELT_LPC_ORDER);
878
51.9k
#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
57.5k
         while (1) {
883
57.5k
            opus_val16 tmp=Q15ONE;
884
57.5k
            opus_val32 sum=QCONST16(1., SIG_SHIFT);
885
1.43M
            for (i=0;i<CELT_LPC_ORDER;i++)
886
1.38M
               sum += ABS16(lpc[c*CELT_LPC_ORDER+i]);
887
57.5k
            if (sum < 65535) break;
888
141k
            for (i=0;i<CELT_LPC_ORDER;i++)
889
135k
            {
890
135k
               tmp = MULT16_16_Q15(QCONST16(.99f,15), tmp);
891
135k
               lpc[c*CELT_LPC_ORDER+i] = MULT16_16_Q15(lpc[c*CELT_LPC_ORDER+i], tmp);
892
135k
            }
893
5.65k
         }
894
51.9k
#endif
895
51.9k
         }
896
         /* Initialize the LPC history with the samples just before the start
897
            of the region for which we're computing the excitation. */
898
89.9k
         {
899
            /* Compute the excitation for exc_length samples before the loss. We need the copy
900
               because celt_fir() cannot filter in-place. */
901
89.9k
            celt_fir(exc+max_period-exc_length, lpc+c*CELT_LPC_ORDER,
902
89.9k
                  fir_tmp, exc_length, CELT_LPC_ORDER, st->arch);
903
89.9k
            OPUS_COPY(exc+max_period-exc_length, fir_tmp, exc_length);
904
89.9k
         }
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
89.9k
         {
910
89.9k
            opus_val32 E1=1, E2=1;
911
89.9k
            int decay_length;
912
89.9k
#ifdef FIXED_POINT
913
89.9k
            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
89.9k
#endif
918
89.9k
            decay_length = exc_length>>1;
919
22.7M
            for (i=0;i<decay_length;i++)
920
22.6M
            {
921
22.6M
               opus_val16 e;
922
22.6M
               e = exc[max_period-decay_length+i];
923
22.6M
               E1 += SHR32(MULT16_16(e, e), shift);
924
22.6M
               e = exc[max_period-2*decay_length+i];
925
22.6M
               E2 += SHR32(MULT16_16(e, e), shift);
926
22.6M
            }
927
89.9k
            E1 = MIN32(E1, E2);
928
89.9k
            decay = celt_sqrt(frac_div32(SHR32(E1, 1), E2));
929
89.9k
         }
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
89.9k
         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
89.9k
         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
89.9k
         extrapolation_len = N+overlap;
943
         /* We also apply fading if this is not the first loss. */
944
89.9k
         attenuation = MULT16_16_Q15(fade, decay);
945
28.0M
         for (i=j=0;i<extrapolation_len;i++,j++)
946
27.9M
         {
947
27.9M
            opus_val16 tmp;
948
27.9M
            if (j >= pitch_index) {
949
101k
               j -= pitch_index;
950
101k
               attenuation = MULT16_16_Q15(attenuation, decay);
951
101k
            }
952
27.9M
            buf[decode_buffer_size-N+i] =
953
27.9M
                  SHL32(EXTEND32(MULT16_16_Q15(attenuation,
954
27.9M
                        exc[extrapolation_offset+j])), SIG_SHIFT);
955
            /* Compute the energy of the previously decoded signal whose
956
               excitation we're copying. */
957
27.9M
            tmp = SROUND16(
958
27.9M
                  buf[decode_buffer_size-max_period-N+extrapolation_offset+j],
959
27.9M
                  SIG_SHIFT);
960
27.9M
            S1 += SHR32(MULT16_16(tmp, tmp), 11);
961
27.9M
         }
962
89.9k
         {
963
89.9k
            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.24M
            for (i=0;i<CELT_LPC_ORDER;i++)
967
2.15M
               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
89.9k
            celt_iir(buf+decode_buffer_size-N, lpc+c*CELT_LPC_ORDER,
971
89.9k
                  buf+decode_buffer_size-N, extrapolation_len, CELT_LPC_ORDER,
972
89.9k
                  lpc_mem, st->arch);
973
89.9k
#ifdef FIXED_POINT
974
28.0M
            for (i=0; i < extrapolation_len; i++)
975
27.9M
               buf[decode_buffer_size-N+i] = SATURATE(buf[decode_buffer_size-N+i], SIG_SAT);
976
89.9k
#endif
977
89.9k
         }
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
89.9k
         {
983
89.9k
            opus_val32 S2=0;
984
28.0M
            for (i=0;i<extrapolation_len;i++)
985
27.9M
            {
986
27.9M
               opus_val16 tmp = SROUND16(buf[decode_buffer_size-N+i], SIG_SHIFT);
987
27.9M
               S2 += SHR32(MULT16_16(tmp, tmp), 11);
988
27.9M
            }
989
            /* This checks for an "explosion" in the synthesis. */
990
89.9k
#ifdef FIXED_POINT
991
89.9k
            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
50.9k
            {
998
14.9M
               for (i=0;i<extrapolation_len;i++)
999
14.9M
                  buf[decode_buffer_size-N+i] = 0;
1000
50.9k
            } else if (S1 < S2)
1001
19.9k
            {
1002
19.9k
               opus_val16 ratio = celt_sqrt(frac_div32(SHR32(S1,1)+1,S2+1));
1003
2.41M
               for (i=0;i<overlap;i++)
1004
2.39M
               {
1005
2.39M
                  opus_val16 tmp_g = Q15ONE
1006
2.39M
                        - MULT16_16_Q15(COEF2VAL16(window[i]), Q15ONE-ratio);
1007
2.39M
                  buf[decode_buffer_size-N+i] =
1008
2.39M
                        MULT16_32_Q15(tmp_g, buf[decode_buffer_size-N+i]);
1009
2.39M
               }
1010
3.96M
               for (i=overlap;i<extrapolation_len;i++)
1011
3.94M
               {
1012
3.94M
                  buf[decode_buffer_size-N+i] =
1013
3.94M
                        MULT16_32_Q15(ratio, buf[decode_buffer_size-N+i]);
1014
3.94M
               }
1015
19.9k
            }
1016
89.9k
         }
1017
1018
89.9k
      } 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.8k
      st->prefilter_and_fold = 1;
1077
53.8k
   }
1078
1079
   /* Saturate to something large to avoid wrap-around. */
1080
65.8k
   st->loss_duration = IMIN(10000, loss_duration+(1<<LM));
1081
65.8k
   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.8k
   st->last_frame_type = curr_frame_type;
1089
65.8k
   RESTORE_STACK;
1090
65.8k
}
celt_decoder.c:celt_decode_lost
Line
Count
Source
680
57.2k
{
681
57.2k
   int c;
682
57.2k
   int i;
683
57.2k
   const int C = st->channels;
684
57.2k
   celt_sig *decode_mem[2];
685
57.2k
   celt_sig *out_syn[2];
686
57.2k
   opus_val16 *lpc;
687
57.2k
   celt_glog *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE;
688
57.2k
   const OpusCustomMode *mode;
689
57.2k
   int nbEBands;
690
57.2k
   int overlap;
691
57.2k
   int start;
692
57.2k
   int loss_duration;
693
57.2k
   int curr_frame_type;
694
57.2k
   const opus_int16 *eBands;
695
57.2k
   int decode_buffer_size;
696
57.2k
   int max_period;
697
57.2k
#ifdef ENABLE_QEXT
698
57.2k
   int qext_scale;
699
57.2k
#endif
700
57.2k
   SAVE_STACK;
701
57.2k
#ifdef ENABLE_QEXT
702
57.2k
   qext_scale = st->qext_scale;
703
57.2k
#endif
704
57.2k
   decode_buffer_size = QEXT_SCALE(DECODE_BUFFER_SIZE);
705
57.2k
   max_period = QEXT_SCALE(MAX_PERIOD);
706
57.2k
   mode = st->mode;
707
57.2k
   nbEBands = mode->nbEBands;
708
57.2k
   overlap = mode->overlap;
709
57.2k
   eBands = mode->eBands;
710
711
80.9k
   c=0; do {
712
80.9k
      decode_mem[c] = st->_decode_mem + c*(decode_buffer_size+overlap);
713
80.9k
      out_syn[c] = decode_mem[c]+decode_buffer_size-N;
714
80.9k
   } while (++c<C);
715
57.2k
   oldBandE = (celt_glog*)(st->_decode_mem+(decode_buffer_size+overlap)*C);
716
57.2k
   oldLogE = oldBandE + 2*nbEBands;
717
57.2k
   oldLogE2 = oldLogE + 2*nbEBands;
718
57.2k
   backgroundLogE = oldLogE2 + 2*nbEBands;
719
57.2k
   lpc = (opus_val16*)(backgroundLogE + 2*nbEBands);
720
721
57.2k
   loss_duration = st->loss_duration;
722
57.2k
   start = st->start;
723
57.2k
   curr_frame_type = FRAME_PLC_PERIODIC;
724
57.2k
   if (st->plc_duration >= 40 || start != 0 || st->skip_plc)
725
7.03k
      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
57.2k
   if (curr_frame_type == FRAME_PLC_NOISE)
739
7.03k
   {
740
      /* Noise-based PLC/CNG */
741
7.03k
      VARDECL(celt_norm, X);
742
7.03k
      opus_uint32 seed;
743
7.03k
      int end;
744
7.03k
      int effEnd;
745
7.03k
      celt_glog decay;
746
7.03k
      end = st->end;
747
7.03k
      effEnd = IMAX(start, IMIN(end, mode->effEBands));
748
749
7.03k
      ALLOC(X, C*N, celt_norm);   /**< Interleaved normalised MDCTs */
750
10.3k
      c=0; do {
751
10.3k
         OPUS_MOVE(decode_mem[c], decode_mem[c]+N,
752
10.3k
               decode_buffer_size-N+overlap);
753
10.3k
      } while (++c<C);
754
755
7.03k
      if (st->prefilter_and_fold) {
756
181
         prefilter_and_fold(st, N);
757
181
      }
758
759
      /* Energy decay */
760
7.03k
      decay = loss_duration==0 ? GCONST(1.5f) : GCONST(.5f);
761
7.03k
      c=0; do
762
10.3k
      {
763
51.5k
         for (i=start;i<end;i++)
764
41.1k
            oldBandE[c*nbEBands+i] = MAXG(backgroundLogE[c*nbEBands+i], oldBandE[c*nbEBands+i] - decay);
765
10.3k
      } while (++c<C);
766
7.03k
      seed = st->rng;
767
17.3k
      for (c=0;c<C;c++)
768
10.3k
      {
769
51.5k
         for (i=start;i<effEnd;i++)
770
41.1k
         {
771
41.1k
            int j;
772
41.1k
            int boffs;
773
41.1k
            int blen;
774
41.1k
            boffs = N*c+(eBands[i]<<LM);
775
41.1k
            blen = (eBands[i+1]-eBands[i])<<LM;
776
1.61M
            for (j=0;j<blen;j++)
777
1.57M
            {
778
1.57M
               seed = celt_lcg_rand(seed);
779
1.57M
               X[boffs+j] = SHL32((celt_norm)((opus_int32)seed>>20), NORM_SHIFT-14);
780
1.57M
            }
781
41.1k
            renormalise_vector(X+boffs, blen, Q31ONE, st->arch);
782
41.1k
         }
783
10.3k
      }
784
7.03k
      st->rng = seed;
785
786
7.03k
      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
10.3k
      c=0; do {
790
10.3k
         st->postfilter_period=IMAX(st->postfilter_period, COMBFILTER_MINPERIOD);
791
10.3k
         st->postfilter_period_old=IMAX(st->postfilter_period_old, COMBFILTER_MINPERIOD);
792
10.3k
         comb_filter(out_syn[c], out_syn[c], st->postfilter_period_old, st->postfilter_period, mode->shortMdctSize,
793
10.3k
               st->postfilter_gain_old, st->postfilter_gain, st->postfilter_tapset_old, st->postfilter_tapset,
794
10.3k
               mode->window, overlap, st->arch);
795
10.3k
         if (LM!=0)
796
9.63k
            comb_filter(out_syn[c]+mode->shortMdctSize, out_syn[c]+mode->shortMdctSize, st->postfilter_period, st->postfilter_period, N-mode->shortMdctSize,
797
9.63k
                  st->postfilter_gain, st->postfilter_gain, st->postfilter_tapset, st->postfilter_tapset,
798
9.63k
                  mode->window, overlap, st->arch);
799
800
10.3k
      } while (++c<C);
801
7.03k
      st->postfilter_period_old = st->postfilter_period;
802
7.03k
      st->postfilter_gain_old = st->postfilter_gain;
803
7.03k
      st->postfilter_tapset_old = st->postfilter_tapset;
804
805
7.03k
      st->prefilter_and_fold = 0;
806
      /* Skip regular PLC until we get two consecutive packets. */
807
7.03k
      st->skip_plc = 1;
808
50.2k
   } else {
809
50.2k
      int exc_length;
810
      /* Pitch-based PLC */
811
50.2k
      const celt_coef *window;
812
50.2k
      opus_val16 *exc;
813
50.2k
      opus_val16 fade = Q15ONE;
814
50.2k
      int pitch_index;
815
50.2k
      int curr_neural;
816
50.2k
      int last_neural;
817
50.2k
      VARDECL(opus_val16, _exc);
818
50.2k
      VARDECL(opus_val16, fir_tmp);
819
820
50.2k
      curr_neural = curr_frame_type == FRAME_PLC_NEURAL || curr_frame_type == FRAME_DRED;
821
50.2k
      last_neural = st->last_frame_type == FRAME_PLC_NEURAL || st->last_frame_type == FRAME_DRED;
822
50.2k
      if (st->last_frame_type != FRAME_PLC_PERIODIC && !(last_neural && curr_neural))
823
29.0k
      {
824
29.0k
         st->last_pitch_index = pitch_index = celt_plc_pitch_search(st, decode_mem, C, st->arch);
825
29.0k
      } else {
826
21.2k
         pitch_index = st->last_pitch_index;
827
21.2k
         fade = QCONST16(.8f,15);
828
21.2k
      }
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
50.2k
      exc_length = IMIN(2*pitch_index, max_period);
836
837
50.2k
      ALLOC(_exc, max_period+CELT_LPC_ORDER, opus_val16);
838
50.2k
      ALLOC(fir_tmp, exc_length, opus_val16);
839
50.2k
      exc = _exc+CELT_LPC_ORDER;
840
50.2k
      window = mode->window;
841
70.5k
      c=0; do {
842
70.5k
         opus_val16 decay;
843
70.5k
         opus_val16 attenuation;
844
70.5k
         opus_val32 S1=0;
845
70.5k
         celt_sig *buf;
846
70.5k
         int extrapolation_offset;
847
70.5k
         int extrapolation_len;
848
70.5k
         int j;
849
850
70.5k
         buf = decode_mem[c];
851
91.0M
         for (i=0;i<max_period+CELT_LPC_ORDER;i++)
852
91.0M
            exc[i-CELT_LPC_ORDER] = SROUND16(buf[decode_buffer_size-max_period-CELT_LPC_ORDER+i], SIG_SHIFT);
853
854
70.5k
         if (st->last_frame_type != FRAME_PLC_PERIODIC && !(last_neural && curr_neural))
855
39.6k
         {
856
39.6k
            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
39.6k
            _celt_autocorr(exc, ac, window, overlap,
860
39.6k
                   CELT_LPC_ORDER, max_period, st->arch);
861
            /* Add a noise floor of -40 dB. */
862
39.6k
#ifdef FIXED_POINT
863
39.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
990k
            for (i=1;i<=CELT_LPC_ORDER;i++)
869
950k
            {
870
               /*ac[i] *= exp(-.5*(2*M_PI*.002*i)*(2*M_PI*.002*i));*/
871
950k
#ifdef FIXED_POINT
872
950k
               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
950k
            }
877
39.6k
            _celt_lpc(lpc+c*CELT_LPC_ORDER, ac, CELT_LPC_ORDER);
878
39.6k
#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
62.4k
         while (1) {
883
62.4k
            opus_val16 tmp=Q15ONE;
884
62.4k
            opus_val32 sum=QCONST16(1., SIG_SHIFT);
885
1.56M
            for (i=0;i<CELT_LPC_ORDER;i++)
886
1.49M
               sum += ABS16(lpc[c*CELT_LPC_ORDER+i]);
887
62.4k
            if (sum < 65535) break;
888
570k
            for (i=0;i<CELT_LPC_ORDER;i++)
889
547k
            {
890
547k
               tmp = MULT16_16_Q15(QCONST16(.99f,15), tmp);
891
547k
               lpc[c*CELT_LPC_ORDER+i] = MULT16_16_Q15(lpc[c*CELT_LPC_ORDER+i], tmp);
892
547k
            }
893
22.8k
         }
894
39.6k
#endif
895
39.6k
         }
896
         /* Initialize the LPC history with the samples just before the start
897
            of the region for which we're computing the excitation. */
898
70.5k
         {
899
            /* Compute the excitation for exc_length samples before the loss. We need the copy
900
               because celt_fir() cannot filter in-place. */
901
70.5k
            celt_fir(exc+max_period-exc_length, lpc+c*CELT_LPC_ORDER,
902
70.5k
                  fir_tmp, exc_length, CELT_LPC_ORDER, st->arch);
903
70.5k
            OPUS_COPY(exc+max_period-exc_length, fir_tmp, exc_length);
904
70.5k
         }
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
70.5k
         {
910
70.5k
            opus_val32 E1=1, E2=1;
911
70.5k
            int decay_length;
912
70.5k
#ifdef FIXED_POINT
913
70.5k
            int shift = IMAX(0,2*celt_zlog2(celt_maxabs16(&exc[max_period-exc_length], exc_length))-20);
914
70.5k
#ifdef ENABLE_QEXT
915
70.5k
            if (st->qext_scale==2) shift++;
916
70.5k
#endif
917
70.5k
#endif
918
70.5k
            decay_length = exc_length>>1;
919
22.0M
            for (i=0;i<decay_length;i++)
920
21.9M
            {
921
21.9M
               opus_val16 e;
922
21.9M
               e = exc[max_period-decay_length+i];
923
21.9M
               E1 += SHR32(MULT16_16(e, e), shift);
924
21.9M
               e = exc[max_period-2*decay_length+i];
925
21.9M
               E2 += SHR32(MULT16_16(e, e), shift);
926
21.9M
            }
927
70.5k
            E1 = MIN32(E1, E2);
928
70.5k
            decay = celt_sqrt(frac_div32(SHR32(E1, 1), E2));
929
70.5k
         }
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
70.5k
         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
70.5k
         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
70.5k
         extrapolation_len = N+overlap;
943
         /* We also apply fading if this is not the first loss. */
944
70.5k
         attenuation = MULT16_16_Q15(fade, decay);
945
26.4M
         for (i=j=0;i<extrapolation_len;i++,j++)
946
26.3M
         {
947
26.3M
            opus_val16 tmp;
948
26.3M
            if (j >= pitch_index) {
949
83.6k
               j -= pitch_index;
950
83.6k
               attenuation = MULT16_16_Q15(attenuation, decay);
951
83.6k
            }
952
26.3M
            buf[decode_buffer_size-N+i] =
953
26.3M
                  SHL32(EXTEND32(MULT16_16_Q15(attenuation,
954
26.3M
                        exc[extrapolation_offset+j])), SIG_SHIFT);
955
            /* Compute the energy of the previously decoded signal whose
956
               excitation we're copying. */
957
26.3M
            tmp = SROUND16(
958
26.3M
                  buf[decode_buffer_size-max_period-N+extrapolation_offset+j],
959
26.3M
                  SIG_SHIFT);
960
26.3M
            S1 += SHR32(MULT16_16(tmp, tmp), 11);
961
26.3M
         }
962
70.5k
         {
963
70.5k
            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
1.76M
            for (i=0;i<CELT_LPC_ORDER;i++)
967
1.69M
               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
70.5k
            celt_iir(buf+decode_buffer_size-N, lpc+c*CELT_LPC_ORDER,
971
70.5k
                  buf+decode_buffer_size-N, extrapolation_len, CELT_LPC_ORDER,
972
70.5k
                  lpc_mem, st->arch);
973
70.5k
#ifdef FIXED_POINT
974
26.4M
            for (i=0; i < extrapolation_len; i++)
975
26.3M
               buf[decode_buffer_size-N+i] = SATURATE(buf[decode_buffer_size-N+i], SIG_SAT);
976
70.5k
#endif
977
70.5k
         }
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
70.5k
         {
983
70.5k
            opus_val32 S2=0;
984
26.4M
            for (i=0;i<extrapolation_len;i++)
985
26.3M
            {
986
26.3M
               opus_val16 tmp = SROUND16(buf[decode_buffer_size-N+i], SIG_SHIFT);
987
26.3M
               S2 += SHR32(MULT16_16(tmp, tmp), 11);
988
26.3M
            }
989
            /* This checks for an "explosion" in the synthesis. */
990
70.5k
#ifdef FIXED_POINT
991
70.5k
            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
41.9k
            {
998
14.7M
               for (i=0;i<extrapolation_len;i++)
999
14.6M
                  buf[decode_buffer_size-N+i] = 0;
1000
41.9k
            } else if (S1 < S2)
1001
10.9k
            {
1002
10.9k
               opus_val16 ratio = celt_sqrt(frac_div32(SHR32(S1,1)+1,S2+1));
1003
1.63M
               for (i=0;i<overlap;i++)
1004
1.62M
               {
1005
1.62M
                  opus_val16 tmp_g = Q15ONE
1006
1.62M
                        - MULT16_16_Q15(COEF2VAL16(window[i]), Q15ONE-ratio);
1007
1.62M
                  buf[decode_buffer_size-N+i] =
1008
1.62M
                        MULT16_32_Q15(tmp_g, buf[decode_buffer_size-N+i]);
1009
1.62M
               }
1010
2.47M
               for (i=overlap;i<extrapolation_len;i++)
1011
2.46M
               {
1012
2.46M
                  buf[decode_buffer_size-N+i] =
1013
2.46M
                        MULT16_32_Q15(ratio, buf[decode_buffer_size-N+i]);
1014
2.46M
               }
1015
10.9k
            }
1016
70.5k
         }
1017
1018
70.5k
      } 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
50.2k
      st->prefilter_and_fold = 1;
1077
50.2k
   }
1078
1079
   /* Saturate to something large to avoid wrap-around. */
1080
57.2k
   st->loss_duration = IMIN(10000, loss_duration+(1<<LM));
1081
57.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
57.2k
   st->last_frame_type = curr_frame_type;
1089
57.2k
   RESTORE_STACK;
1090
57.2k
}
celt_decoder.c:celt_decode_lost
Line
Count
Source
680
101k
{
681
101k
   int c;
682
101k
   int i;
683
101k
   const int C = st->channels;
684
101k
   celt_sig *decode_mem[2];
685
101k
   celt_sig *out_syn[2];
686
101k
   opus_val16 *lpc;
687
101k
   celt_glog *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE;
688
101k
   const OpusCustomMode *mode;
689
101k
   int nbEBands;
690
101k
   int overlap;
691
101k
   int start;
692
101k
   int loss_duration;
693
101k
   int curr_frame_type;
694
101k
   const opus_int16 *eBands;
695
101k
   int decode_buffer_size;
696
101k
   int max_period;
697
101k
#ifdef ENABLE_QEXT
698
101k
   int qext_scale;
699
101k
#endif
700
101k
   SAVE_STACK;
701
101k
#ifdef ENABLE_QEXT
702
101k
   qext_scale = st->qext_scale;
703
101k
#endif
704
101k
   decode_buffer_size = QEXT_SCALE(DECODE_BUFFER_SIZE);
705
101k
   max_period = QEXT_SCALE(MAX_PERIOD);
706
101k
   mode = st->mode;
707
101k
   nbEBands = mode->nbEBands;
708
101k
   overlap = mode->overlap;
709
101k
   eBands = mode->eBands;
710
711
157k
   c=0; do {
712
157k
      decode_mem[c] = st->_decode_mem + c*(decode_buffer_size+overlap);
713
157k
      out_syn[c] = decode_mem[c]+decode_buffer_size-N;
714
157k
   } while (++c<C);
715
101k
   oldBandE = (celt_glog*)(st->_decode_mem+(decode_buffer_size+overlap)*C);
716
101k
   oldLogE = oldBandE + 2*nbEBands;
717
101k
   oldLogE2 = oldLogE + 2*nbEBands;
718
101k
   backgroundLogE = oldLogE2 + 2*nbEBands;
719
101k
   lpc = (opus_val16*)(backgroundLogE + 2*nbEBands);
720
721
101k
   loss_duration = st->loss_duration;
722
101k
   start = st->start;
723
101k
   curr_frame_type = FRAME_PLC_PERIODIC;
724
101k
   if (st->plc_duration >= 40 || start != 0 || st->skip_plc)
725
22.8k
      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
101k
   if (curr_frame_type == FRAME_PLC_NOISE)
739
22.8k
   {
740
      /* Noise-based PLC/CNG */
741
22.8k
      VARDECL(celt_norm, X);
742
22.8k
      opus_uint32 seed;
743
22.8k
      int end;
744
22.8k
      int effEnd;
745
22.8k
      celt_glog decay;
746
22.8k
      end = st->end;
747
22.8k
      effEnd = IMAX(start, IMIN(end, mode->effEBands));
748
749
22.8k
      ALLOC(X, C*N, celt_norm);   /**< Interleaved normalised MDCTs */
750
33.1k
      c=0; do {
751
33.1k
         OPUS_MOVE(decode_mem[c], decode_mem[c]+N,
752
33.1k
               decode_buffer_size-N+overlap);
753
33.1k
      } while (++c<C);
754
755
22.8k
      if (st->prefilter_and_fold) {
756
453
         prefilter_and_fold(st, N);
757
453
      }
758
759
      /* Energy decay */
760
22.8k
      decay = loss_duration==0 ? GCONST(1.5f) : GCONST(.5f);
761
22.8k
      c=0; do
762
33.1k
      {
763
165k
         for (i=start;i<end;i++)
764
132k
            oldBandE[c*nbEBands+i] = MAXG(backgroundLogE[c*nbEBands+i], oldBandE[c*nbEBands+i] - decay);
765
33.1k
      } while (++c<C);
766
22.8k
      seed = st->rng;
767
56.0k
      for (c=0;c<C;c++)
768
33.1k
      {
769
165k
         for (i=start;i<effEnd;i++)
770
132k
         {
771
132k
            int j;
772
132k
            int boffs;
773
132k
            int blen;
774
132k
            boffs = N*c+(eBands[i]<<LM);
775
132k
            blen = (eBands[i+1]-eBands[i])<<LM;
776
6.00M
            for (j=0;j<blen;j++)
777
5.86M
            {
778
5.86M
               seed = celt_lcg_rand(seed);
779
5.86M
               X[boffs+j] = SHL32((celt_norm)((opus_int32)seed>>20), NORM_SHIFT-14);
780
5.86M
            }
781
132k
            renormalise_vector(X+boffs, blen, Q31ONE, st->arch);
782
132k
         }
783
33.1k
      }
784
22.8k
      st->rng = seed;
785
786
22.8k
      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
33.1k
      c=0; do {
790
33.1k
         st->postfilter_period=IMAX(st->postfilter_period, COMBFILTER_MINPERIOD);
791
33.1k
         st->postfilter_period_old=IMAX(st->postfilter_period_old, COMBFILTER_MINPERIOD);
792
33.1k
         comb_filter(out_syn[c], out_syn[c], st->postfilter_period_old, st->postfilter_period, mode->shortMdctSize,
793
33.1k
               st->postfilter_gain_old, st->postfilter_gain, st->postfilter_tapset_old, st->postfilter_tapset,
794
33.1k
               mode->window, overlap, st->arch);
795
33.1k
         if (LM!=0)
796
31.3k
            comb_filter(out_syn[c]+mode->shortMdctSize, out_syn[c]+mode->shortMdctSize, st->postfilter_period, st->postfilter_period, N-mode->shortMdctSize,
797
31.3k
                  st->postfilter_gain, st->postfilter_gain, st->postfilter_tapset, st->postfilter_tapset,
798
31.3k
                  mode->window, overlap, st->arch);
799
800
33.1k
      } while (++c<C);
801
22.8k
      st->postfilter_period_old = st->postfilter_period;
802
22.8k
      st->postfilter_gain_old = st->postfilter_gain;
803
22.8k
      st->postfilter_tapset_old = st->postfilter_tapset;
804
805
22.8k
      st->prefilter_and_fold = 0;
806
      /* Skip regular PLC until we get two consecutive packets. */
807
22.8k
      st->skip_plc = 1;
808
78.9k
   } else {
809
78.9k
      int exc_length;
810
      /* Pitch-based PLC */
811
78.9k
      const celt_coef *window;
812
78.9k
      opus_val16 *exc;
813
78.9k
      opus_val16 fade = Q15ONE;
814
78.9k
      int pitch_index;
815
78.9k
      int curr_neural;
816
78.9k
      int last_neural;
817
78.9k
      VARDECL(opus_val16, _exc);
818
78.9k
      VARDECL(opus_val16, fir_tmp);
819
820
78.9k
      curr_neural = curr_frame_type == FRAME_PLC_NEURAL || curr_frame_type == FRAME_DRED;
821
78.9k
      last_neural = st->last_frame_type == FRAME_PLC_NEURAL || st->last_frame_type == FRAME_DRED;
822
78.9k
      if (st->last_frame_type != FRAME_PLC_PERIODIC && !(last_neural && curr_neural))
823
44.4k
      {
824
44.4k
         st->last_pitch_index = pitch_index = celt_plc_pitch_search(st, decode_mem, C, st->arch);
825
44.4k
      } else {
826
34.4k
         pitch_index = st->last_pitch_index;
827
34.4k
         fade = QCONST16(.8f,15);
828
34.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
78.9k
      exc_length = IMIN(2*pitch_index, max_period);
836
837
78.9k
      ALLOC(_exc, max_period+CELT_LPC_ORDER, opus_val16);
838
78.9k
      ALLOC(fir_tmp, exc_length, opus_val16);
839
78.9k
      exc = _exc+CELT_LPC_ORDER;
840
78.9k
      window = mode->window;
841
124k
      c=0; do {
842
124k
         opus_val16 decay;
843
124k
         opus_val16 attenuation;
844
124k
         opus_val32 S1=0;
845
124k
         celt_sig *buf;
846
124k
         int extrapolation_offset;
847
124k
         int extrapolation_len;
848
124k
         int j;
849
850
124k
         buf = decode_mem[c];
851
146M
         for (i=0;i<max_period+CELT_LPC_ORDER;i++)
852
146M
            exc[i-CELT_LPC_ORDER] = SROUND16(buf[decode_buffer_size-max_period-CELT_LPC_ORDER+i], SIG_SHIFT);
853
854
124k
         if (st->last_frame_type != FRAME_PLC_PERIODIC && !(last_neural && curr_neural))
855
70.4k
         {
856
70.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
70.4k
            _celt_autocorr(exc, ac, window, overlap,
860
70.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
70.4k
            ac[0] *= 1.0001f;
866
70.4k
#endif
867
            /* Use lag windowing to stabilize the Levinson-Durbin recursion. */
868
1.76M
            for (i=1;i<=CELT_LPC_ORDER;i++)
869
1.69M
            {
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.69M
               ac[i] -= ac[i]*(0.008f*0.008f)*i*i;
875
1.69M
#endif
876
1.69M
            }
877
70.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
70.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
124k
         {
899
            /* Compute the excitation for exc_length samples before the loss. We need the copy
900
               because celt_fir() cannot filter in-place. */
901
124k
            celt_fir(exc+max_period-exc_length, lpc+c*CELT_LPC_ORDER,
902
124k
                  fir_tmp, exc_length, CELT_LPC_ORDER, st->arch);
903
124k
            OPUS_COPY(exc+max_period-exc_length, fir_tmp, exc_length);
904
124k
         }
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
124k
         {
910
124k
            opus_val32 E1=1, E2=1;
911
124k
            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
124k
            decay_length = exc_length>>1;
919
34.9M
            for (i=0;i<decay_length;i++)
920
34.8M
            {
921
34.8M
               opus_val16 e;
922
34.8M
               e = exc[max_period-decay_length+i];
923
34.8M
               E1 += SHR32(MULT16_16(e, e), shift);
924
34.8M
               e = exc[max_period-2*decay_length+i];
925
34.8M
               E2 += SHR32(MULT16_16(e, e), shift);
926
34.8M
            }
927
124k
            E1 = MIN32(E1, E2);
928
124k
            decay = celt_sqrt(frac_div32(SHR32(E1, 1), E2));
929
124k
         }
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
124k
         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
124k
         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
124k
         extrapolation_len = N+overlap;
943
         /* We also apply fading if this is not the first loss. */
944
124k
         attenuation = MULT16_16_Q15(fade, decay);
945
50.4M
         for (i=j=0;i<extrapolation_len;i++,j++)
946
50.3M
         {
947
50.3M
            opus_val16 tmp;
948
50.3M
            if (j >= pitch_index) {
949
158k
               j -= pitch_index;
950
158k
               attenuation = MULT16_16_Q15(attenuation, decay);
951
158k
            }
952
50.3M
            buf[decode_buffer_size-N+i] =
953
50.3M
                  SHL32(EXTEND32(MULT16_16_Q15(attenuation,
954
50.3M
                        exc[extrapolation_offset+j])), SIG_SHIFT);
955
            /* Compute the energy of the previously decoded signal whose
956
               excitation we're copying. */
957
50.3M
            tmp = SROUND16(
958
50.3M
                  buf[decode_buffer_size-max_period-N+extrapolation_offset+j],
959
50.3M
                  SIG_SHIFT);
960
50.3M
            S1 += SHR32(MULT16_16(tmp, tmp), 11);
961
50.3M
         }
962
124k
         {
963
124k
            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.11M
            for (i=0;i<CELT_LPC_ORDER;i++)
967
2.99M
               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
124k
            celt_iir(buf+decode_buffer_size-N, lpc+c*CELT_LPC_ORDER,
971
124k
                  buf+decode_buffer_size-N, extrapolation_len, CELT_LPC_ORDER,
972
124k
                  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
124k
         }
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
124k
         {
983
124k
            opus_val32 S2=0;
984
50.4M
            for (i=0;i<extrapolation_len;i++)
985
50.3M
            {
986
50.3M
               opus_val16 tmp = SROUND16(buf[decode_buffer_size-N+i], SIG_SHIFT);
987
50.3M
               S2 += SHR32(MULT16_16(tmp, tmp), 11);
988
50.3M
            }
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
124k
            if (!(S1 > 0.2f*S2))
996
17.2k
#endif
997
17.2k
            {
998
8.44M
               for (i=0;i<extrapolation_len;i++)
999
8.43M
                  buf[decode_buffer_size-N+i] = 0;
1000
107k
            } else if (S1 < S2)
1001
21.8k
            {
1002
21.8k
               opus_val16 ratio = celt_sqrt(frac_div32(SHR32(S1,1)+1,S2+1));
1003
2.99M
               for (i=0;i<overlap;i++)
1004
2.96M
               {
1005
2.96M
                  opus_val16 tmp_g = Q15ONE
1006
2.96M
                        - MULT16_16_Q15(COEF2VAL16(window[i]), Q15ONE-ratio);
1007
2.96M
                  buf[decode_buffer_size-N+i] =
1008
2.96M
                        MULT16_32_Q15(tmp_g, buf[decode_buffer_size-N+i]);
1009
2.96M
               }
1010
4.01M
               for (i=overlap;i<extrapolation_len;i++)
1011
3.99M
               {
1012
3.99M
                  buf[decode_buffer_size-N+i] =
1013
3.99M
                        MULT16_32_Q15(ratio, buf[decode_buffer_size-N+i]);
1014
3.99M
               }
1015
21.8k
            }
1016
124k
         }
1017
1018
124k
      } 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
78.9k
      st->prefilter_and_fold = 1;
1077
78.9k
   }
1078
1079
   /* Saturate to something large to avoid wrap-around. */
1080
101k
   st->loss_duration = IMIN(10000, loss_duration+(1<<LM));
1081
101k
   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
101k
   st->last_frame_type = curr_frame_type;
1089
101k
   RESTORE_STACK;
1090
101k
}
celt_decoder.c:celt_decode_lost
Line
Count
Source
680
101k
{
681
101k
   int c;
682
101k
   int i;
683
101k
   const int C = st->channels;
684
101k
   celt_sig *decode_mem[2];
685
101k
   celt_sig *out_syn[2];
686
101k
   opus_val16 *lpc;
687
101k
   celt_glog *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE;
688
101k
   const OpusCustomMode *mode;
689
101k
   int nbEBands;
690
101k
   int overlap;
691
101k
   int start;
692
101k
   int loss_duration;
693
101k
   int curr_frame_type;
694
101k
   const opus_int16 *eBands;
695
101k
   int decode_buffer_size;
696
101k
   int max_period;
697
#ifdef ENABLE_QEXT
698
   int qext_scale;
699
#endif
700
101k
   SAVE_STACK;
701
#ifdef ENABLE_QEXT
702
   qext_scale = st->qext_scale;
703
#endif
704
101k
   decode_buffer_size = QEXT_SCALE(DECODE_BUFFER_SIZE);
705
101k
   max_period = QEXT_SCALE(MAX_PERIOD);
706
101k
   mode = st->mode;
707
101k
   nbEBands = mode->nbEBands;
708
101k
   overlap = mode->overlap;
709
101k
   eBands = mode->eBands;
710
711
157k
   c=0; do {
712
157k
      decode_mem[c] = st->_decode_mem + c*(decode_buffer_size+overlap);
713
157k
      out_syn[c] = decode_mem[c]+decode_buffer_size-N;
714
157k
   } while (++c<C);
715
101k
   oldBandE = (celt_glog*)(st->_decode_mem+(decode_buffer_size+overlap)*C);
716
101k
   oldLogE = oldBandE + 2*nbEBands;
717
101k
   oldLogE2 = oldLogE + 2*nbEBands;
718
101k
   backgroundLogE = oldLogE2 + 2*nbEBands;
719
101k
   lpc = (opus_val16*)(backgroundLogE + 2*nbEBands);
720
721
101k
   loss_duration = st->loss_duration;
722
101k
   start = st->start;
723
101k
   curr_frame_type = FRAME_PLC_PERIODIC;
724
101k
   if (st->plc_duration >= 40 || start != 0 || st->skip_plc)
725
22.8k
      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
101k
   if (curr_frame_type == FRAME_PLC_NOISE)
739
22.8k
   {
740
      /* Noise-based PLC/CNG */
741
22.8k
      VARDECL(celt_norm, X);
742
22.8k
      opus_uint32 seed;
743
22.8k
      int end;
744
22.8k
      int effEnd;
745
22.8k
      celt_glog decay;
746
22.8k
      end = st->end;
747
22.8k
      effEnd = IMAX(start, IMIN(end, mode->effEBands));
748
749
22.8k
      ALLOC(X, C*N, celt_norm);   /**< Interleaved normalised MDCTs */
750
33.1k
      c=0; do {
751
33.1k
         OPUS_MOVE(decode_mem[c], decode_mem[c]+N,
752
33.1k
               decode_buffer_size-N+overlap);
753
33.1k
      } while (++c<C);
754
755
22.8k
      if (st->prefilter_and_fold) {
756
453
         prefilter_and_fold(st, N);
757
453
      }
758
759
      /* Energy decay */
760
22.8k
      decay = loss_duration==0 ? GCONST(1.5f) : GCONST(.5f);
761
22.8k
      c=0; do
762
33.1k
      {
763
165k
         for (i=start;i<end;i++)
764
132k
            oldBandE[c*nbEBands+i] = MAXG(backgroundLogE[c*nbEBands+i], oldBandE[c*nbEBands+i] - decay);
765
33.1k
      } while (++c<C);
766
22.8k
      seed = st->rng;
767
56.0k
      for (c=0;c<C;c++)
768
33.1k
      {
769
165k
         for (i=start;i<effEnd;i++)
770
132k
         {
771
132k
            int j;
772
132k
            int boffs;
773
132k
            int blen;
774
132k
            boffs = N*c+(eBands[i]<<LM);
775
132k
            blen = (eBands[i+1]-eBands[i])<<LM;
776
6.00M
            for (j=0;j<blen;j++)
777
5.86M
            {
778
5.86M
               seed = celt_lcg_rand(seed);
779
5.86M
               X[boffs+j] = SHL32((celt_norm)((opus_int32)seed>>20), NORM_SHIFT-14);
780
5.86M
            }
781
132k
            renormalise_vector(X+boffs, blen, Q31ONE, st->arch);
782
132k
         }
783
33.1k
      }
784
22.8k
      st->rng = seed;
785
786
22.8k
      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
33.1k
      c=0; do {
790
33.1k
         st->postfilter_period=IMAX(st->postfilter_period, COMBFILTER_MINPERIOD);
791
33.1k
         st->postfilter_period_old=IMAX(st->postfilter_period_old, COMBFILTER_MINPERIOD);
792
33.1k
         comb_filter(out_syn[c], out_syn[c], st->postfilter_period_old, st->postfilter_period, mode->shortMdctSize,
793
33.1k
               st->postfilter_gain_old, st->postfilter_gain, st->postfilter_tapset_old, st->postfilter_tapset,
794
33.1k
               mode->window, overlap, st->arch);
795
33.1k
         if (LM!=0)
796
31.3k
            comb_filter(out_syn[c]+mode->shortMdctSize, out_syn[c]+mode->shortMdctSize, st->postfilter_period, st->postfilter_period, N-mode->shortMdctSize,
797
31.3k
                  st->postfilter_gain, st->postfilter_gain, st->postfilter_tapset, st->postfilter_tapset,
798
31.3k
                  mode->window, overlap, st->arch);
799
800
33.1k
      } while (++c<C);
801
22.8k
      st->postfilter_period_old = st->postfilter_period;
802
22.8k
      st->postfilter_gain_old = st->postfilter_gain;
803
22.8k
      st->postfilter_tapset_old = st->postfilter_tapset;
804
805
22.8k
      st->prefilter_and_fold = 0;
806
      /* Skip regular PLC until we get two consecutive packets. */
807
22.8k
      st->skip_plc = 1;
808
78.9k
   } else {
809
78.9k
      int exc_length;
810
      /* Pitch-based PLC */
811
78.9k
      const celt_coef *window;
812
78.9k
      opus_val16 *exc;
813
78.9k
      opus_val16 fade = Q15ONE;
814
78.9k
      int pitch_index;
815
78.9k
      int curr_neural;
816
78.9k
      int last_neural;
817
78.9k
      VARDECL(opus_val16, _exc);
818
78.9k
      VARDECL(opus_val16, fir_tmp);
819
820
78.9k
      curr_neural = curr_frame_type == FRAME_PLC_NEURAL || curr_frame_type == FRAME_DRED;
821
78.9k
      last_neural = st->last_frame_type == FRAME_PLC_NEURAL || st->last_frame_type == FRAME_DRED;
822
78.9k
      if (st->last_frame_type != FRAME_PLC_PERIODIC && !(last_neural && curr_neural))
823
44.4k
      {
824
44.4k
         st->last_pitch_index = pitch_index = celt_plc_pitch_search(st, decode_mem, C, st->arch);
825
44.4k
      } else {
826
34.4k
         pitch_index = st->last_pitch_index;
827
34.4k
         fade = QCONST16(.8f,15);
828
34.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
78.9k
      exc_length = IMIN(2*pitch_index, max_period);
836
837
78.9k
      ALLOC(_exc, max_period+CELT_LPC_ORDER, opus_val16);
838
78.9k
      ALLOC(fir_tmp, exc_length, opus_val16);
839
78.9k
      exc = _exc+CELT_LPC_ORDER;
840
78.9k
      window = mode->window;
841
124k
      c=0; do {
842
124k
         opus_val16 decay;
843
124k
         opus_val16 attenuation;
844
124k
         opus_val32 S1=0;
845
124k
         celt_sig *buf;
846
124k
         int extrapolation_offset;
847
124k
         int extrapolation_len;
848
124k
         int j;
849
850
124k
         buf = decode_mem[c];
851
146M
         for (i=0;i<max_period+CELT_LPC_ORDER;i++)
852
146M
            exc[i-CELT_LPC_ORDER] = SROUND16(buf[decode_buffer_size-max_period-CELT_LPC_ORDER+i], SIG_SHIFT);
853
854
124k
         if (st->last_frame_type != FRAME_PLC_PERIODIC && !(last_neural && curr_neural))
855
70.4k
         {
856
70.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
70.4k
            _celt_autocorr(exc, ac, window, overlap,
860
70.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
70.4k
            ac[0] *= 1.0001f;
866
70.4k
#endif
867
            /* Use lag windowing to stabilize the Levinson-Durbin recursion. */
868
1.76M
            for (i=1;i<=CELT_LPC_ORDER;i++)
869
1.69M
            {
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.69M
               ac[i] -= ac[i]*(0.008f*0.008f)*i*i;
875
1.69M
#endif
876
1.69M
            }
877
70.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
70.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
124k
         {
899
            /* Compute the excitation for exc_length samples before the loss. We need the copy
900
               because celt_fir() cannot filter in-place. */
901
124k
            celt_fir(exc+max_period-exc_length, lpc+c*CELT_LPC_ORDER,
902
124k
                  fir_tmp, exc_length, CELT_LPC_ORDER, st->arch);
903
124k
            OPUS_COPY(exc+max_period-exc_length, fir_tmp, exc_length);
904
124k
         }
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
124k
         {
910
124k
            opus_val32 E1=1, E2=1;
911
124k
            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
124k
            decay_length = exc_length>>1;
919
34.9M
            for (i=0;i<decay_length;i++)
920
34.8M
            {
921
34.8M
               opus_val16 e;
922
34.8M
               e = exc[max_period-decay_length+i];
923
34.8M
               E1 += SHR32(MULT16_16(e, e), shift);
924
34.8M
               e = exc[max_period-2*decay_length+i];
925
34.8M
               E2 += SHR32(MULT16_16(e, e), shift);
926
34.8M
            }
927
124k
            E1 = MIN32(E1, E2);
928
124k
            decay = celt_sqrt(frac_div32(SHR32(E1, 1), E2));
929
124k
         }
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
124k
         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
124k
         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
124k
         extrapolation_len = N+overlap;
943
         /* We also apply fading if this is not the first loss. */
944
124k
         attenuation = MULT16_16_Q15(fade, decay);
945
50.4M
         for (i=j=0;i<extrapolation_len;i++,j++)
946
50.3M
         {
947
50.3M
            opus_val16 tmp;
948
50.3M
            if (j >= pitch_index) {
949
158k
               j -= pitch_index;
950
158k
               attenuation = MULT16_16_Q15(attenuation, decay);
951
158k
            }
952
50.3M
            buf[decode_buffer_size-N+i] =
953
50.3M
                  SHL32(EXTEND32(MULT16_16_Q15(attenuation,
954
50.3M
                        exc[extrapolation_offset+j])), SIG_SHIFT);
955
            /* Compute the energy of the previously decoded signal whose
956
               excitation we're copying. */
957
50.3M
            tmp = SROUND16(
958
50.3M
                  buf[decode_buffer_size-max_period-N+extrapolation_offset+j],
959
50.3M
                  SIG_SHIFT);
960
50.3M
            S1 += SHR32(MULT16_16(tmp, tmp), 11);
961
50.3M
         }
962
124k
         {
963
124k
            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.11M
            for (i=0;i<CELT_LPC_ORDER;i++)
967
2.99M
               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
124k
            celt_iir(buf+decode_buffer_size-N, lpc+c*CELT_LPC_ORDER,
971
124k
                  buf+decode_buffer_size-N, extrapolation_len, CELT_LPC_ORDER,
972
124k
                  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
124k
         }
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
124k
         {
983
124k
            opus_val32 S2=0;
984
50.4M
            for (i=0;i<extrapolation_len;i++)
985
50.3M
            {
986
50.3M
               opus_val16 tmp = SROUND16(buf[decode_buffer_size-N+i], SIG_SHIFT);
987
50.3M
               S2 += SHR32(MULT16_16(tmp, tmp), 11);
988
50.3M
            }
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
124k
            if (!(S1 > 0.2f*S2))
996
17.2k
#endif
997
17.2k
            {
998
8.44M
               for (i=0;i<extrapolation_len;i++)
999
8.43M
                  buf[decode_buffer_size-N+i] = 0;
1000
107k
            } else if (S1 < S2)
1001
21.8k
            {
1002
21.8k
               opus_val16 ratio = celt_sqrt(frac_div32(SHR32(S1,1)+1,S2+1));
1003
2.99M
               for (i=0;i<overlap;i++)
1004
2.96M
               {
1005
2.96M
                  opus_val16 tmp_g = Q15ONE
1006
2.96M
                        - MULT16_16_Q15(COEF2VAL16(window[i]), Q15ONE-ratio);
1007
2.96M
                  buf[decode_buffer_size-N+i] =
1008
2.96M
                        MULT16_32_Q15(tmp_g, buf[decode_buffer_size-N+i]);
1009
2.96M
               }
1010
4.01M
               for (i=overlap;i<extrapolation_len;i++)
1011
3.99M
               {
1012
3.99M
                  buf[decode_buffer_size-N+i] =
1013
3.99M
                        MULT16_32_Q15(ratio, buf[decode_buffer_size-N+i]);
1014
3.99M
               }
1015
21.8k
            }
1016
124k
         }
1017
1018
124k
      } 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
78.9k
      st->prefilter_and_fold = 1;
1077
78.9k
   }
1078
1079
   /* Saturate to something large to avoid wrap-around. */
1080
101k
   st->loss_duration = IMIN(10000, loss_duration+(1<<LM));
1081
101k
   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
101k
   st->last_frame_type = curr_frame_type;
1089
101k
   RESTORE_STACK;
1090
101k
}
1091
1092
#ifdef ENABLE_QEXT
1093
6.60k
static void decode_qext_stereo_params(ec_dec *ec, int qext_end, int *qext_intensity, int *qext_dual_stereo) {
1094
6.60k
   *qext_intensity = ec_dec_uint(ec, qext_end+1);
1095
6.60k
   if (*qext_intensity != 0) *qext_dual_stereo = ec_dec_bit_logp(ec, 1);
1096
3.32k
   else *qext_dual_stereo = 0;
1097
6.60k
}
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.06M
{
1108
1.06M
   int c, i, N;
1109
1.06M
   int spread_decision;
1110
1.06M
   opus_int32 bits;
1111
1.06M
   ec_dec _dec;
1112
1.06M
   VARDECL(celt_norm, X);
1113
1.06M
   VARDECL(int, fine_quant);
1114
1.06M
   VARDECL(int, pulses);
1115
1.06M
   VARDECL(int, cap);
1116
1.06M
   VARDECL(int, offsets);
1117
1.06M
   VARDECL(int, fine_priority);
1118
1.06M
   VARDECL(int, tf_res);
1119
1.06M
   VARDECL(unsigned char, collapse_masks);
1120
1.06M
   celt_sig *decode_mem[2];
1121
1.06M
   celt_sig *out_syn[2];
1122
1.06M
   celt_glog *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE;
1123
1124
1.06M
   int shortBlocks;
1125
1.06M
   int isTransient;
1126
1.06M
   int intra_ener;
1127
1.06M
   const int CC = st->channels;
1128
1.06M
   int LM, M;
1129
1.06M
   int start;
1130
1.06M
   int end;
1131
1.06M
   int effEnd;
1132
1.06M
   int codedBands;
1133
1.06M
   int alloc_trim;
1134
1.06M
   int postfilter_pitch;
1135
1.06M
   opus_val16 postfilter_gain;
1136
1.06M
   int intensity=0;
1137
1.06M
   int dual_stereo=0;
1138
1.06M
   opus_int32 total_bits;
1139
1.06M
   opus_int32 balance;
1140
1.06M
   opus_int32 tell;
1141
1.06M
   int dynalloc_logp;
1142
1.06M
   int postfilter_tapset;
1143
1.06M
   int anti_collapse_rsv;
1144
1.06M
   int anti_collapse_on=0;
1145
1.06M
   int silence;
1146
1.06M
   int C = st->stream_channels;
1147
1.06M
   const OpusCustomMode *mode;
1148
1.06M
   int nbEBands;
1149
1.06M
   int overlap;
1150
1.06M
   const opus_int16 *eBands;
1151
1.06M
   celt_glog max_background_increase;
1152
1.06M
   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
537k
   CELTMode qext_mode_struct;
1164
   int qext_scale;
1165
#else
1166
298k
# define qext_bytes 0
1167
#endif
1168
1.06M
   ALLOC_STACK;
1169
#ifdef ENABLE_QEXT
1170
   qext_scale = st->qext_scale;
1171
#endif
1172
1.06M
   decode_buffer_size = QEXT_SCALE(DECODE_BUFFER_SIZE);
1173
1174
1.06M
   VALIDATE_CELT_DECODER(st);
1175
1.06M
   mode = st->mode;
1176
1.06M
   nbEBands = mode->nbEBands;
1177
1.06M
   overlap = mode->overlap;
1178
1.06M
   eBands = mode->eBands;
1179
1.06M
   start = st->start;
1180
1.06M
   end = st->end;
1181
1.06M
   frame_size *= st->downsample;
1182
1183
1.06M
   oldBandE = (celt_glog*)(st->_decode_mem+(decode_buffer_size+overlap)*CC);
1184
1.06M
   oldLogE = oldBandE + 2*nbEBands;
1185
1.06M
   oldLogE2 = oldLogE + 2*nbEBands;
1186
1.06M
   backgroundLogE = oldLogE2 + 2*nbEBands;
1187
1188
#ifdef ENABLE_QEXT
1189
537k
   if (qext_payload) {
1190
26.1k
      ec_dec_init(&ext_dec, (unsigned char*)qext_payload, qext_payload_len);
1191
26.1k
      qext_bytes = qext_payload_len;
1192
511k
   } else {
1193
511k
      ec_dec_init(&ext_dec, NULL, 0);
1194
511k
   }
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.06M
   {
1255
1.06M
#endif
1256
1.99M
      for (LM=0;LM<=mode->maxLM;LM++)
1257
1.99M
         if (mode->shortMdctSize<<LM==frame_size)
1258
1.06M
            break;
1259
1.06M
      if (LM>mode->maxLM)
1260
0
         return OPUS_BAD_ARG;
1261
1.06M
   }
1262
1.06M
   M=1<<LM;
1263
1264
1.06M
   if (len<0 || len>1275 || pcm==NULL)
1265
0
      return OPUS_BAD_ARG;
1266
1267
1.06M
   N = M*mode->shortMdctSize;
1268
1.61M
   c=0; do {
1269
1.61M
      decode_mem[c] = st->_decode_mem + c*(decode_buffer_size+overlap);
1270
1.61M
      out_syn[c] = decode_mem[c]+decode_buffer_size-N;
1271
1.61M
   } while (++c<CC);
1272
1273
1.06M
   effEnd = end;
1274
1.06M
   if (effEnd > mode->effEBands)
1275
0
      effEnd = mode->effEBands;
1276
1277
1.06M
   if (data == NULL || len<=1)
1278
449k
   {
1279
449k
      celt_decode_lost(st, N, LM
1280
#ifdef ENABLE_DEEP_PLC
1281
      , lpcnet
1282
#endif
1283
449k
                      );
1284
449k
      deemphasis(out_syn, pcm, N, CC, st->downsample, mode->preemph, st->preemph_memD, accum);
1285
449k
      RESTORE_STACK;
1286
449k
      return frame_size/st->downsample;
1287
449k
   }
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
615k
   if (st->loss_duration == 0) st->skip_plc = 0;
1298
1299
615k
   if (dec == NULL)
1300
61.3k
   {
1301
61.3k
      ec_dec_init(&_dec,(unsigned char*)data,len);
1302
61.3k
      dec = &_dec;
1303
61.3k
   }
1304
1305
615k
   if (C==1)
1306
392k
   {
1307
8.62M
      for (i=0;i<nbEBands;i++)
1308
8.23M
         oldBandE[i]=MAXG(oldBandE[i],oldBandE[nbEBands+i]);
1309
392k
   }
1310
1311
615k
   total_bits = len*8;
1312
615k
   tell = ec_tell(dec);
1313
1314
615k
   if (tell >= total_bits)
1315
50.0k
      silence = 1;
1316
565k
   else if (tell==1)
1317
541k
      silence = ec_dec_bit_logp(dec, 15);
1318
23.7k
   else
1319
23.7k
      silence = 0;
1320
615k
   if (silence)
1321
78.8k
   {
1322
      /* Pretend we've read all the remaining bits */
1323
78.8k
      tell = len*8;
1324
78.8k
      dec->nbits_total+=tell-ec_tell(dec);
1325
78.8k
   }
1326
1327
615k
   postfilter_gain = 0;
1328
615k
   postfilter_pitch = 0;
1329
615k
   postfilter_tapset = 0;
1330
615k
   if (start==0 && tell+16 <= total_bits)
1331
348k
   {
1332
348k
      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
348k
      tell = ec_tell(dec);
1343
348k
   }
1344
1345
615k
   if (LM > 0 && tell+3 <= total_bits)
1346
280k
   {
1347
280k
      isTransient = ec_dec_bit_logp(dec, 3);
1348
280k
      tell = ec_tell(dec);
1349
280k
   }
1350
334k
   else
1351
334k
      isTransient = 0;
1352
1353
615k
   if (isTransient)
1354
57.3k
      shortBlocks = M;
1355
558k
   else
1356
558k
      shortBlocks = 0;
1357
1358
   /* Decode the global flags (first symbols in the stream) */
1359
615k
   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
615k
   if (!intra_ener && st->loss_duration != 0) {
1363
121k
      c=0; do
1364
243k
      {
1365
243k
         celt_glog safety = 0;
1366
243k
         int missing = IMIN(10, st->loss_duration>>LM);
1367
243k
         if (LM==0) safety = GCONST(1.5f);
1368
27.5k
         else if (LM==1) safety = GCONST(.5f);
1369
4.41M
         for (i=start;i<end;i++)
1370
4.17M
         {
1371
4.17M
            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.75M
               opus_val32 slope;
1374
1.75M
               opus_val32 E0, E1, E2;
1375
1.75M
               E0 = oldBandE[c*nbEBands+i];
1376
1.75M
               E1 = oldLogE[c*nbEBands+i];
1377
1.75M
               E2 = oldLogE2[c*nbEBands+i];
1378
1.75M
               slope = MAX32(E1 - E0, HALF32(E2 - E0));
1379
1.75M
               slope = MING(slope, GCONST(2.f));
1380
1.75M
               E0 -= MAX32(0, (1+missing)*slope);
1381
1.75M
               oldBandE[c*nbEBands+i] = MAX32(-GCONST(20.f), E0);
1382
2.41M
            } else {
1383
               /* Otherwise take the min of the last frames. */
1384
2.41M
               oldBandE[c*nbEBands+i] = MING(MING(oldBandE[c*nbEBands+i], oldLogE[c*nbEBands+i]), oldLogE2[c*nbEBands+i]);
1385
2.41M
            }
1386
            /* Shorter frames have more natural fluctuations -- play it safe. */
1387
4.17M
            oldBandE[c*nbEBands+i] -= safety;
1388
4.17M
         }
1389
243k
      } while (++c<2);
1390
121k
   }
1391
   /* Get band energies */
1392
615k
   unquant_coarse_energy(mode, start, end, oldBandE,
1393
615k
         intra_ener, dec, C, LM);
1394
1395
615k
   ALLOC(tf_res, nbEBands, int);
1396
615k
   tf_decode(start, end, isTransient, tf_res, LM, dec);
1397
1398
615k
   tell = ec_tell(dec);
1399
615k
   spread_decision = SPREAD_NORMAL;
1400
615k
   if (tell+4 <= total_bits)
1401
231k
      spread_decision = ec_dec_icdf(dec, spread_icdf, 5);
1402
1403
615k
   ALLOC(cap, nbEBands, int);
1404
1405
615k
   init_caps(mode,cap,LM,C);
1406
1407
615k
   ALLOC(offsets, nbEBands, int);
1408
1409
615k
   dynalloc_logp = 6;
1410
615k
   total_bits<<=BITRES;
1411
615k
   tell = ec_tell_frac(dec);
1412
10.4M
   for (i=start;i<end;i++)
1413
9.88M
   {
1414
9.88M
      int width, quanta;
1415
9.88M
      int dynalloc_loop_logp;
1416
9.88M
      int boost;
1417
9.88M
      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.88M
      quanta = IMIN(width<<BITRES, IMAX(6<<BITRES, width));
1421
9.88M
      dynalloc_loop_logp = dynalloc_logp;
1422
9.88M
      boost = 0;
1423
10.0M
      while (tell+(dynalloc_loop_logp<<BITRES) < total_bits && boost < cap[i])
1424
3.56M
      {
1425
3.56M
         int flag;
1426
3.56M
         flag = ec_dec_bit_logp(dec, dynalloc_loop_logp);
1427
3.56M
         tell = ec_tell_frac(dec);
1428
3.56M
         if (!flag)
1429
3.34M
            break;
1430
212k
         boost += quanta;
1431
212k
         total_bits -= quanta;
1432
212k
         dynalloc_loop_logp = 1;
1433
212k
      }
1434
9.88M
      offsets[i] = boost;
1435
      /* Making dynalloc more likely */
1436
9.88M
      if (boost>0)
1437
60.4k
         dynalloc_logp = IMAX(2, dynalloc_logp-1);
1438
9.88M
   }
1439
1440
615k
   ALLOC(fine_quant, nbEBands, int);
1441
615k
   alloc_trim = tell+(6<<BITRES) <= total_bits ?
1442
408k
         ec_dec_icdf(dec, trim_icdf, 7) : 5;
1443
1444
615k
   bits = (((opus_int32)len*8)<<BITRES) - (opus_int32)ec_tell_frac(dec) - 1;
1445
615k
   anti_collapse_rsv = isTransient&&LM>=2&&bits>=((LM+2)<<BITRES) ? (1<<BITRES) : 0;
1446
615k
   bits -= anti_collapse_rsv;
1447
1448
615k
   ALLOC(pulses, nbEBands, int);
1449
615k
   ALLOC(fine_priority, nbEBands, int);
1450
1451
615k
   codedBands = clt_compute_allocation(mode, start, end, offsets, cap,
1452
615k
         alloc_trim, &intensity, &dual_stereo, bits, &balance, pulses,
1453
615k
         fine_quant, fine_priority, C, LM, dec, 0, 0, 0);
1454
1455
615k
   unquant_fine_energy(mode, start, end, oldBandE, NULL, fine_quant, dec, C);
1456
1457
615k
   ALLOC(X, C*N, celt_norm);   /**< Interleaved normalised MDCTs */
1458
1459
#ifdef ENABLE_QEXT
1460
316k
   if (qext_bytes && end == nbEBands &&
1461
17.3k
         ((mode->Fs == 48000 && (mode->shortMdctSize==120 || mode->shortMdctSize==90))
1462
17.3k
       || (mode->Fs == 96000 && (mode->shortMdctSize==240 || mode->shortMdctSize==180)))) {
1463
17.3k
      int qext_intra_ener;
1464
17.3k
      compute_qext_mode(&qext_mode_struct, mode);
1465
17.3k
      qext_mode = &qext_mode_struct;
1466
17.3k
      qext_end = ec_dec_bit_logp(&ext_dec, 1) ? NB_QEXT_BANDS : 2;
1467
17.3k
      if (C==2) decode_qext_stereo_params(&ext_dec, qext_end, &qext_intensity, &qext_dual_stereo);
1468
17.3k
      qext_intra_ener = ec_tell(&ext_dec)+3<=qext_bytes*8 ? ec_dec_bit_logp(&ext_dec, 3) : 0;
1469
17.3k
      unquant_coarse_energy(qext_mode, 0, qext_end, st->qext_oldBandE,
1470
17.3k
            qext_intra_ener, &ext_dec, C, LM);
1471
17.3k
   }
1472
316k
   ALLOC(extra_quant, nbEBands+NB_QEXT_BANDS, int);
1473
316k
   ALLOC(extra_pulses, nbEBands+NB_QEXT_BANDS, int);
1474
316k
   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
316k
   if (qext_bytes > 0) {
1478
22.8k
      unquant_fine_energy(mode, start, end, oldBandE, fine_quant, extra_quant, &ext_dec, C);
1479
22.8k
   }
1480
#endif
1481
1482
919k
   c=0; do {
1483
919k
      OPUS_MOVE(decode_mem[c], decode_mem[c]+N, decode_buffer_size-N+overlap);
1484
919k
   } while (++c<CC);
1485
1486
   /* Decode fixed codebook */
1487
615k
   ALLOC(collapse_masks, C*nbEBands, unsigned char);
1488
1489
615k
   quant_all_bands(0, mode, start, end, X, C==2 ? X+N : NULL, collapse_masks,
1490
615k
         NULL, pulses, shortBlocks, spread_decision, dual_stereo, intensity, tf_res,
1491
615k
         len*(8<<BITRES)-anti_collapse_rsv, balance, dec, LM, codedBands, &st->rng, 0,
1492
615k
         st->arch, st->disable_inv
1493
615k
         ARG_QEXT(&ext_dec) ARG_QEXT(extra_pulses)
1494
615k
         ARG_QEXT(qext_bytes*(8<<BITRES)) ARG_QEXT(cap));
1495
1496
#ifdef ENABLE_QEXT
1497
316k
   if (qext_mode) {
1498
17.3k
      VARDECL(int, zeros);
1499
17.3k
      VARDECL(unsigned char, qext_collapse_masks);
1500
17.3k
      ec_dec dummy_dec;
1501
17.3k
      int ext_balance;
1502
17.3k
      ALLOC(zeros, nbEBands, int);
1503
17.3k
      ALLOC(qext_collapse_masks, C*NB_QEXT_BANDS, unsigned char);
1504
17.3k
      ec_dec_init(&dummy_dec, NULL, 0);
1505
17.3k
      OPUS_CLEAR(zeros, end);
1506
17.3k
      ext_balance = qext_bytes*(8<<BITRES) - ec_tell_frac(&ext_dec);
1507
119k
      for (i=0;i<qext_end;i++) ext_balance -= extra_pulses[nbEBands+i] + C*(extra_quant[nbEBands+1]<<BITRES);
1508
17.3k
      unquant_fine_energy(qext_mode, 0, qext_end, st->qext_oldBandE, NULL, &extra_quant[nbEBands], &ext_dec, C);
1509
17.3k
      quant_all_bands(0, qext_mode, 0, qext_end, X, C==2 ? X+N : NULL, qext_collapse_masks,
1510
17.3k
            NULL, &extra_pulses[nbEBands], shortBlocks, spread_decision, qext_dual_stereo, qext_intensity, zeros,
1511
17.3k
            qext_bytes*(8<<BITRES), ext_balance, &ext_dec, LM, qext_end, &st->rng, 0,
1512
17.3k
            st->arch, st->disable_inv, &dummy_dec, zeros, 0, NULL);
1513
17.3k
   }
1514
#endif
1515
1516
615k
   if (anti_collapse_rsv > 0)
1517
18.0k
   {
1518
18.0k
      anti_collapse_on = ec_dec_bits(dec, 1);
1519
18.0k
   }
1520
615k
   unquant_energy_finalise(mode, start, end, (qext_bytes > 0) ? NULL : oldBandE,
1521
615k
         fine_quant, fine_priority, len*8-ec_tell(dec), dec, C);
1522
615k
   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
615k
   if (silence)
1527
78.8k
   {
1528
2.74M
      for (i=0;i<C*nbEBands;i++)
1529
2.67M
         oldBandE[i] = -GCONST(28.f);
1530
78.8k
   }
1531
615k
   if (st->prefilter_and_fold) {
1532
125k
      prefilter_and_fold(st, N);
1533
125k
   }
1534
615k
   celt_synthesis(mode, X, out_syn, oldBandE, start, effEnd,
1535
615k
                  C, CC, isTransient, LM, st->downsample, silence, st->arch ARG_QEXT(qext_mode) ARG_QEXT(st->qext_oldBandE) ARG_QEXT(qext_end));
1536
1537
919k
   c=0; do {
1538
919k
      st->postfilter_period=IMAX(st->postfilter_period, COMBFILTER_MINPERIOD);
1539
919k
      st->postfilter_period_old=IMAX(st->postfilter_period_old, COMBFILTER_MINPERIOD);
1540
919k
      comb_filter(out_syn[c], out_syn[c], st->postfilter_period_old, st->postfilter_period, mode->shortMdctSize,
1541
919k
            st->postfilter_gain_old, st->postfilter_gain, st->postfilter_tapset_old, st->postfilter_tapset,
1542
919k
            mode->window, overlap, st->arch);
1543
919k
      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
919k
   } while (++c<CC);
1549
615k
   st->postfilter_period_old = st->postfilter_period;
1550
615k
   st->postfilter_gain_old = st->postfilter_gain;
1551
615k
   st->postfilter_tapset_old = st->postfilter_tapset;
1552
615k
   st->postfilter_period = postfilter_pitch;
1553
615k
   st->postfilter_gain = postfilter_gain;
1554
615k
   st->postfilter_tapset = postfilter_tapset;
1555
615k
   if (LM!=0)
1556
340k
   {
1557
340k
      st->postfilter_period_old = st->postfilter_period;
1558
340k
      st->postfilter_gain_old = st->postfilter_gain;
1559
340k
      st->postfilter_tapset_old = st->postfilter_tapset;
1560
340k
   }
1561
1562
615k
   if (C==1)
1563
392k
      OPUS_COPY(&oldBandE[nbEBands], oldBandE, nbEBands);
1564
1565
615k
   if (!isTransient)
1566
558k
   {
1567
558k
      OPUS_COPY(oldLogE2, oldLogE, 2*nbEBands);
1568
558k
      OPUS_COPY(oldLogE, oldBandE, 2*nbEBands);
1569
558k
   } else {
1570
2.46M
      for (i=0;i<2*nbEBands;i++)
1571
2.40M
         oldLogE[i] = MING(oldLogE[i], oldBandE[i]);
1572
57.3k
   }
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
615k
   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
615k
   c=0; do
1581
1.23M
   {
1582
3.73M
      for (i=0;i<start;i++)
1583
2.50M
      {
1584
2.50M
         oldBandE[c*nbEBands+i]=0;
1585
2.50M
         oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-GCONST(28.f);
1586
2.50M
      }
1587
4.79M
      for (i=end;i<nbEBands;i++)
1588
3.56M
      {
1589
3.56M
         oldBandE[c*nbEBands+i]=0;
1590
3.56M
         oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-GCONST(28.f);
1591
3.56M
      }
1592
1.23M
   } while (++c<2);
1593
615k
   st->rng = dec->rng;
1594
#ifdef ENABLE_QEXT
1595
316k
   if (qext_bytes) st->rng = st->rng ^ ext_dec.rng;
1596
#endif
1597
1598
615k
   deemphasis(out_syn, pcm, N, CC, st->downsample, mode->preemph, st->preemph_memD, accum);
1599
615k
   st->loss_duration = 0;
1600
615k
   st->plc_duration = 0;
1601
615k
   st->last_frame_type = FRAME_NORMAL;
1602
615k
   st->prefilter_and_fold = 0;
1603
615k
   RESTORE_STACK;
1604
615k
   if (ec_tell(dec) > 8*len)
1605
10
      return OPUS_INTERNAL_ERROR;
1606
#ifdef ENABLE_QEXT
1607
316k
   if (qext_bytes != 0 && ec_tell(&ext_dec) > 8*qext_bytes)
1608
0
      return OPUS_INTERNAL_ERROR;
1609
316k
#endif
1610
615k
   if(ec_get_error(dec))
1611
8.60k
      st->error = 1;
1612
615k
   return frame_size/st->downsample;
1613
316k
}
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
507k
      for (LM=0;LM<=mode->maxLM;LM++)
1257
507k
         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
413k
   c=0; do {
1269
413k
      decode_mem[c] = st->_decode_mem + c*(decode_buffer_size+overlap);
1270
413k
      out_syn[c] = decode_mem[c]+decode_buffer_size-N;
1271
413k
   } 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
114k
   {
1279
114k
      celt_decode_lost(st, N, LM
1280
#ifdef ENABLE_DEEP_PLC
1281
      , lpcnet
1282
#endif
1283
114k
                      );
1284
114k
      deemphasis(out_syn, pcm, N, CC, st->downsample, mode->preemph, st->preemph_memD, accum);
1285
114k
      RESTORE_STACK;
1286
114k
      return frame_size/st->downsample;
1287
114k
   }
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
149k
   if (st->loss_duration == 0) st->skip_plc = 0;
1298
1299
149k
   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
149k
   if (C==1)
1306
95.1k
   {
1307
2.09M
      for (i=0;i<nbEBands;i++)
1308
1.99M
         oldBandE[i]=MAXG(oldBandE[i],oldBandE[nbEBands+i]);
1309
95.1k
   }
1310
1311
149k
   total_bits = len*8;
1312
149k
   tell = ec_tell(dec);
1313
1314
149k
   if (tell >= total_bits)
1315
14.0k
      silence = 1;
1316
135k
   else if (tell==1)
1317
130k
      silence = ec_dec_bit_logp(dec, 15);
1318
4.93k
   else
1319
4.93k
      silence = 0;
1320
149k
   if (silence)
1321
20.7k
   {
1322
      /* Pretend we've read all the remaining bits */
1323
20.7k
      tell = len*8;
1324
20.7k
      dec->nbits_total+=tell-ec_tell(dec);
1325
20.7k
   }
1326
1327
149k
   postfilter_gain = 0;
1328
149k
   postfilter_pitch = 0;
1329
149k
   postfilter_tapset = 0;
1330
149k
   if (start==0 && tell+16 <= total_bits)
1331
75.0k
   {
1332
75.0k
      if(ec_dec_bit_logp(dec, 1))
1333
22.0k
      {
1334
22.0k
         int qg, octave;
1335
22.0k
         octave = ec_dec_uint(dec, 6);
1336
22.0k
         postfilter_pitch = (16<<octave)+ec_dec_bits(dec, 4+octave)-1;
1337
22.0k
         qg = ec_dec_bits(dec, 3);
1338
22.0k
         if (ec_tell(dec)+2<=total_bits)
1339
22.0k
            postfilter_tapset = ec_dec_icdf(dec, tapset_icdf, 2);
1340
22.0k
         postfilter_gain = QCONST16(.09375f,15)*(qg+1);
1341
22.0k
      }
1342
75.0k
      tell = ec_tell(dec);
1343
75.0k
   }
1344
1345
149k
   if (LM > 0 && tell+3 <= total_bits)
1346
65.9k
   {
1347
65.9k
      isTransient = ec_dec_bit_logp(dec, 3);
1348
65.9k
      tell = ec_tell(dec);
1349
65.9k
   }
1350
83.4k
   else
1351
83.4k
      isTransient = 0;
1352
1353
149k
   if (isTransient)
1354
15.1k
      shortBlocks = M;
1355
134k
   else
1356
134k
      shortBlocks = 0;
1357
1358
   /* Decode the global flags (first symbols in the stream) */
1359
149k
   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
149k
   if (!intra_ener && st->loss_duration != 0) {
1363
29.1k
      c=0; do
1364
58.3k
      {
1365
58.3k
         celt_glog safety = 0;
1366
58.3k
         int missing = IMIN(10, st->loss_duration>>LM);
1367
58.3k
         if (LM==0) safety = GCONST(1.5f);
1368
6.86k
         else if (LM==1) safety = GCONST(.5f);
1369
1.05M
         for (i=start;i<end;i++)
1370
998k
         {
1371
998k
            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
419k
               opus_val32 slope;
1374
419k
               opus_val32 E0, E1, E2;
1375
419k
               E0 = oldBandE[c*nbEBands+i];
1376
419k
               E1 = oldLogE[c*nbEBands+i];
1377
419k
               E2 = oldLogE2[c*nbEBands+i];
1378
419k
               slope = MAX32(E1 - E0, HALF32(E2 - E0));
1379
419k
               slope = MING(slope, GCONST(2.f));
1380
419k
               E0 -= MAX32(0, (1+missing)*slope);
1381
419k
               oldBandE[c*nbEBands+i] = MAX32(-GCONST(20.f), E0);
1382
578k
            } else {
1383
               /* Otherwise take the min of the last frames. */
1384
578k
               oldBandE[c*nbEBands+i] = MING(MING(oldBandE[c*nbEBands+i], oldLogE[c*nbEBands+i]), oldLogE2[c*nbEBands+i]);
1385
578k
            }
1386
            /* Shorter frames have more natural fluctuations -- play it safe. */
1387
998k
            oldBandE[c*nbEBands+i] -= safety;
1388
998k
         }
1389
58.3k
      } while (++c<2);
1390
29.1k
   }
1391
   /* Get band energies */
1392
149k
   unquant_coarse_energy(mode, start, end, oldBandE,
1393
149k
         intra_ener, dec, C, LM);
1394
1395
149k
   ALLOC(tf_res, nbEBands, int);
1396
149k
   tf_decode(start, end, isTransient, tf_res, LM, dec);
1397
1398
149k
   tell = ec_tell(dec);
1399
149k
   spread_decision = SPREAD_NORMAL;
1400
149k
   if (tell+4 <= total_bits)
1401
48.3k
      spread_decision = ec_dec_icdf(dec, spread_icdf, 5);
1402
1403
149k
   ALLOC(cap, nbEBands, int);
1404
1405
149k
   init_caps(mode,cap,LM,C);
1406
1407
149k
   ALLOC(offsets, nbEBands, int);
1408
1409
149k
   dynalloc_logp = 6;
1410
149k
   total_bits<<=BITRES;
1411
149k
   tell = ec_tell_frac(dec);
1412
2.52M
   for (i=start;i<end;i++)
1413
2.37M
   {
1414
2.37M
      int width, quanta;
1415
2.37M
      int dynalloc_loop_logp;
1416
2.37M
      int boost;
1417
2.37M
      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.37M
      quanta = IMIN(width<<BITRES, IMAX(6<<BITRES, width));
1421
2.37M
      dynalloc_loop_logp = dynalloc_logp;
1422
2.37M
      boost = 0;
1423
2.42M
      while (tell+(dynalloc_loop_logp<<BITRES) < total_bits && boost < cap[i])
1424
723k
      {
1425
723k
         int flag;
1426
723k
         flag = ec_dec_bit_logp(dec, dynalloc_loop_logp);
1427
723k
         tell = ec_tell_frac(dec);
1428
723k
         if (!flag)
1429
674k
            break;
1430
49.6k
         boost += quanta;
1431
49.6k
         total_bits -= quanta;
1432
49.6k
         dynalloc_loop_logp = 1;
1433
49.6k
      }
1434
2.37M
      offsets[i] = boost;
1435
      /* Making dynalloc more likely */
1436
2.37M
      if (boost>0)
1437
12.2k
         dynalloc_logp = IMAX(2, dynalloc_logp-1);
1438
2.37M
   }
1439
1440
149k
   ALLOC(fine_quant, nbEBands, int);
1441
149k
   alloc_trim = tell+(6<<BITRES) <= total_bits ?
1442
107k
         ec_dec_icdf(dec, trim_icdf, 7) : 5;
1443
1444
149k
   bits = (((opus_int32)len*8)<<BITRES) - (opus_int32)ec_tell_frac(dec) - 1;
1445
149k
   anti_collapse_rsv = isTransient&&LM>=2&&bits>=((LM+2)<<BITRES) ? (1<<BITRES) : 0;
1446
149k
   bits -= anti_collapse_rsv;
1447
1448
149k
   ALLOC(pulses, nbEBands, int);
1449
149k
   ALLOC(fine_priority, nbEBands, int);
1450
1451
149k
   codedBands = clt_compute_allocation(mode, start, end, offsets, cap,
1452
149k
         alloc_trim, &intensity, &dual_stereo, bits, &balance, pulses,
1453
149k
         fine_quant, fine_priority, C, LM, dec, 0, 0, 0);
1454
1455
149k
   unquant_fine_energy(mode, start, end, oldBandE, NULL, fine_quant, dec, C);
1456
1457
149k
   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
230k
   c=0; do {
1483
230k
      OPUS_MOVE(decode_mem[c], decode_mem[c]+N, decode_buffer_size-N+overlap);
1484
230k
   } while (++c<CC);
1485
1486
   /* Decode fixed codebook */
1487
149k
   ALLOC(collapse_masks, C*nbEBands, unsigned char);
1488
1489
149k
   quant_all_bands(0, mode, start, end, X, C==2 ? X+N : NULL, collapse_masks,
1490
149k
         NULL, pulses, shortBlocks, spread_decision, dual_stereo, intensity, tf_res,
1491
149k
         len*(8<<BITRES)-anti_collapse_rsv, balance, dec, LM, codedBands, &st->rng, 0,
1492
149k
         st->arch, st->disable_inv
1493
149k
         ARG_QEXT(&ext_dec) ARG_QEXT(extra_pulses)
1494
149k
         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
149k
   if (anti_collapse_rsv > 0)
1517
4.48k
   {
1518
4.48k
      anti_collapse_on = ec_dec_bits(dec, 1);
1519
4.48k
   }
1520
149k
   unquant_energy_finalise(mode, start, end, (qext_bytes > 0) ? NULL : oldBandE,
1521
149k
         fine_quant, fine_priority, len*8-ec_tell(dec), dec, C);
1522
149k
   if (anti_collapse_on)
1523
3.28k
      anti_collapse(mode, X, collapse_masks, LM, C, N,
1524
3.28k
            start, end, oldBandE, oldLogE, oldLogE2, pulses, st->rng, 0, st->arch);
1525
1526
149k
   if (silence)
1527
20.7k
   {
1528
705k
      for (i=0;i<C*nbEBands;i++)
1529
684k
         oldBandE[i] = -GCONST(28.f);
1530
20.7k
   }
1531
149k
   if (st->prefilter_and_fold) {
1532
30.5k
      prefilter_and_fold(st, N);
1533
30.5k
   }
1534
149k
   celt_synthesis(mode, X, out_syn, oldBandE, start, effEnd,
1535
149k
                  C, CC, isTransient, LM, st->downsample, silence, st->arch ARG_QEXT(qext_mode) ARG_QEXT(st->qext_oldBandE) ARG_QEXT(qext_end));
1536
1537
230k
   c=0; do {
1538
230k
      st->postfilter_period=IMAX(st->postfilter_period, COMBFILTER_MINPERIOD);
1539
230k
      st->postfilter_period_old=IMAX(st->postfilter_period_old, COMBFILTER_MINPERIOD);
1540
230k
      comb_filter(out_syn[c], out_syn[c], st->postfilter_period_old, st->postfilter_period, mode->shortMdctSize,
1541
230k
            st->postfilter_gain_old, st->postfilter_gain, st->postfilter_tapset_old, st->postfilter_tapset,
1542
230k
            mode->window, overlap, st->arch);
1543
230k
      if (LM!=0)
1544
118k
         comb_filter(out_syn[c]+mode->shortMdctSize, out_syn[c]+mode->shortMdctSize, st->postfilter_period, postfilter_pitch, N-mode->shortMdctSize,
1545
118k
               st->postfilter_gain, postfilter_gain, st->postfilter_tapset, postfilter_tapset,
1546
118k
               mode->window, overlap, st->arch);
1547
1548
230k
   } while (++c<CC);
1549
149k
   st->postfilter_period_old = st->postfilter_period;
1550
149k
   st->postfilter_gain_old = st->postfilter_gain;
1551
149k
   st->postfilter_tapset_old = st->postfilter_tapset;
1552
149k
   st->postfilter_period = postfilter_pitch;
1553
149k
   st->postfilter_gain = postfilter_gain;
1554
149k
   st->postfilter_tapset = postfilter_tapset;
1555
149k
   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
149k
   if (C==1)
1563
95.1k
      OPUS_COPY(&oldBandE[nbEBands], oldBandE, nbEBands);
1564
1565
149k
   if (!isTransient)
1566
134k
   {
1567
134k
      OPUS_COPY(oldLogE2, oldLogE, 2*nbEBands);
1568
134k
      OPUS_COPY(oldLogE, oldBandE, 2*nbEBands);
1569
134k
   } else {
1570
650k
      for (i=0;i<2*nbEBands;i++)
1571
635k
         oldLogE[i] = MING(oldLogE[i], oldBandE[i]);
1572
15.1k
   }
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
149k
   max_background_increase = IMIN(160, st->loss_duration+M)*GCONST(0.001f);
1577
6.42M
   for (i=0;i<2*nbEBands;i++)
1578
6.27M
      backgroundLogE[i] = MING(backgroundLogE[i] + max_background_increase, oldBandE[i]);
1579
   /* In case start or end were to change */
1580
149k
   c=0; do
1581
298k
   {
1582
945k
      for (i=0;i<start;i++)
1583
646k
      {
1584
646k
         oldBandE[c*nbEBands+i]=0;
1585
646k
         oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-GCONST(28.f);
1586
646k
      }
1587
1.18M
      for (i=end;i<nbEBands;i++)
1588
883k
      {
1589
883k
         oldBandE[c*nbEBands+i]=0;
1590
883k
         oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-GCONST(28.f);
1591
883k
      }
1592
298k
   } while (++c<2);
1593
149k
   st->rng = dec->rng;
1594
#ifdef ENABLE_QEXT
1595
   if (qext_bytes) st->rng = st->rng ^ ext_dec.rng;
1596
#endif
1597
1598
149k
   deemphasis(out_syn, pcm, N, CC, st->downsample, mode->preemph, st->preemph_memD, accum);
1599
149k
   st->loss_duration = 0;
1600
149k
   st->plc_duration = 0;
1601
149k
   st->last_frame_type = FRAME_NORMAL;
1602
149k
   st->prefilter_and_fold = 0;
1603
149k
   RESTORE_STACK;
1604
149k
   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
149k
   if(ec_get_error(dec))
1611
1.89k
      st->error = 1;
1612
149k
   return frame_size/st->downsample;
1613
149k
}
celt_decode_with_ec_dred
Line
Count
Source
1107
268k
{
1108
268k
   int c, i, N;
1109
268k
   int spread_decision;
1110
268k
   opus_int32 bits;
1111
268k
   ec_dec _dec;
1112
268k
   VARDECL(celt_norm, X);
1113
268k
   VARDECL(int, fine_quant);
1114
268k
   VARDECL(int, pulses);
1115
268k
   VARDECL(int, cap);
1116
268k
   VARDECL(int, offsets);
1117
268k
   VARDECL(int, fine_priority);
1118
268k
   VARDECL(int, tf_res);
1119
268k
   VARDECL(unsigned char, collapse_masks);
1120
268k
   celt_sig *decode_mem[2];
1121
268k
   celt_sig *out_syn[2];
1122
268k
   celt_glog *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE;
1123
1124
268k
   int shortBlocks;
1125
268k
   int isTransient;
1126
268k
   int intra_ener;
1127
268k
   const int CC = st->channels;
1128
268k
   int LM, M;
1129
268k
   int start;
1130
268k
   int end;
1131
268k
   int effEnd;
1132
268k
   int codedBands;
1133
268k
   int alloc_trim;
1134
268k
   int postfilter_pitch;
1135
268k
   opus_val16 postfilter_gain;
1136
268k
   int intensity=0;
1137
268k
   int dual_stereo=0;
1138
268k
   opus_int32 total_bits;
1139
268k
   opus_int32 balance;
1140
268k
   opus_int32 tell;
1141
268k
   int dynalloc_logp;
1142
268k
   int postfilter_tapset;
1143
268k
   int anti_collapse_rsv;
1144
268k
   int anti_collapse_on=0;
1145
268k
   int silence;
1146
268k
   int C = st->stream_channels;
1147
268k
   const OpusCustomMode *mode;
1148
268k
   int nbEBands;
1149
268k
   int overlap;
1150
268k
   const opus_int16 *eBands;
1151
268k
   celt_glog max_background_increase;
1152
268k
   int decode_buffer_size;
1153
268k
#ifdef ENABLE_QEXT
1154
268k
   opus_int32 qext_bits;
1155
268k
   ec_dec ext_dec;
1156
268k
   int qext_bytes=0;
1157
268k
   int qext_end=0;
1158
268k
   int qext_intensity=0;
1159
268k
   int qext_dual_stereo=0;
1160
268k
   VARDECL(int, extra_quant);
1161
268k
   VARDECL(int, extra_pulses);
1162
268k
   const CELTMode *qext_mode = NULL;
1163
268k
   CELTMode qext_mode_struct;
1164
268k
   int qext_scale;
1165
#else
1166
# define qext_bytes 0
1167
#endif
1168
268k
   ALLOC_STACK;
1169
268k
#ifdef ENABLE_QEXT
1170
268k
   qext_scale = st->qext_scale;
1171
268k
#endif
1172
268k
   decode_buffer_size = QEXT_SCALE(DECODE_BUFFER_SIZE);
1173
1174
268k
   VALIDATE_CELT_DECODER(st);
1175
268k
   mode = st->mode;
1176
268k
   nbEBands = mode->nbEBands;
1177
268k
   overlap = mode->overlap;
1178
268k
   eBands = mode->eBands;
1179
268k
   start = st->start;
1180
268k
   end = st->end;
1181
268k
   frame_size *= st->downsample;
1182
1183
268k
   oldBandE = (celt_glog*)(st->_decode_mem+(decode_buffer_size+overlap)*CC);
1184
268k
   oldLogE = oldBandE + 2*nbEBands;
1185
268k
   oldLogE2 = oldLogE + 2*nbEBands;
1186
268k
   backgroundLogE = oldLogE2 + 2*nbEBands;
1187
1188
268k
#ifdef ENABLE_QEXT
1189
268k
   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
255k
   } else {
1193
255k
      ec_dec_init(&ext_dec, NULL, 0);
1194
255k
   }
1195
268k
#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
268k
   {
1255
268k
#endif
1256
489k
      for (LM=0;LM<=mode->maxLM;LM++)
1257
489k
         if (mode->shortMdctSize<<LM==frame_size)
1258
268k
            break;
1259
268k
      if (LM>mode->maxLM)
1260
0
         return OPUS_BAD_ARG;
1261
268k
   }
1262
268k
   M=1<<LM;
1263
1264
268k
   if (len<0 || len>1275 || pcm==NULL)
1265
0
      return OPUS_BAD_ARG;
1266
1267
268k
   N = M*mode->shortMdctSize;
1268
392k
   c=0; do {
1269
392k
      decode_mem[c] = st->_decode_mem + c*(decode_buffer_size+overlap);
1270
392k
      out_syn[c] = decode_mem[c]+decode_buffer_size-N;
1271
392k
   } while (++c<CC);
1272
1273
268k
   effEnd = end;
1274
268k
   if (effEnd > mode->effEBands)
1275
0
      effEnd = mode->effEBands;
1276
1277
268k
   if (data == NULL || len<=1)
1278
110k
   {
1279
110k
      celt_decode_lost(st, N, LM
1280
#ifdef ENABLE_DEEP_PLC
1281
      , lpcnet
1282
#endif
1283
110k
                      );
1284
110k
      deemphasis(out_syn, pcm, N, CC, st->downsample, mode->preemph, st->preemph_memD, accum);
1285
110k
      RESTORE_STACK;
1286
110k
      return frame_size/st->downsample;
1287
110k
   }
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
158k
   if (st->loss_duration == 0) st->skip_plc = 0;
1298
1299
158k
   if (dec == NULL)
1300
16.6k
   {
1301
16.6k
      ec_dec_init(&_dec,(unsigned char*)data,len);
1302
16.6k
      dec = &_dec;
1303
16.6k
   }
1304
1305
158k
   if (C==1)
1306
100k
   {
1307
2.21M
      for (i=0;i<nbEBands;i++)
1308
2.11M
         oldBandE[i]=MAXG(oldBandE[i],oldBandE[nbEBands+i]);
1309
100k
   }
1310
1311
158k
   total_bits = len*8;
1312
158k
   tell = ec_tell(dec);
1313
1314
158k
   if (tell >= total_bits)
1315
10.9k
      silence = 1;
1316
147k
   else if (tell==1)
1317
140k
      silence = ec_dec_bit_logp(dec, 15);
1318
6.91k
   else
1319
6.91k
      silence = 0;
1320
158k
   if (silence)
1321
18.6k
   {
1322
      /* Pretend we've read all the remaining bits */
1323
18.6k
      tell = len*8;
1324
18.6k
      dec->nbits_total+=tell-ec_tell(dec);
1325
18.6k
   }
1326
1327
158k
   postfilter_gain = 0;
1328
158k
   postfilter_pitch = 0;
1329
158k
   postfilter_tapset = 0;
1330
158k
   if (start==0 && tell+16 <= total_bits)
1331
99.2k
   {
1332
99.2k
      if(ec_dec_bit_logp(dec, 1))
1333
28.1k
      {
1334
28.1k
         int qg, octave;
1335
28.1k
         octave = ec_dec_uint(dec, 6);
1336
28.1k
         postfilter_pitch = (16<<octave)+ec_dec_bits(dec, 4+octave)-1;
1337
28.1k
         qg = ec_dec_bits(dec, 3);
1338
28.1k
         if (ec_tell(dec)+2<=total_bits)
1339
28.1k
            postfilter_tapset = ec_dec_icdf(dec, tapset_icdf, 2);
1340
28.1k
         postfilter_gain = QCONST16(.09375f,15)*(qg+1);
1341
28.1k
      }
1342
99.2k
      tell = ec_tell(dec);
1343
99.2k
   }
1344
1345
158k
   if (LM > 0 && tell+3 <= total_bits)
1346
74.3k
   {
1347
74.3k
      isTransient = ec_dec_bit_logp(dec, 3);
1348
74.3k
      tell = ec_tell(dec);
1349
74.3k
   }
1350
83.9k
   else
1351
83.9k
      isTransient = 0;
1352
1353
158k
   if (isTransient)
1354
13.5k
      shortBlocks = M;
1355
144k
   else
1356
144k
      shortBlocks = 0;
1357
1358
   /* Decode the global flags (first symbols in the stream) */
1359
158k
   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
158k
   if (!intra_ener && st->loss_duration != 0) {
1363
31.7k
      c=0; do
1364
63.5k
      {
1365
63.5k
         celt_glog safety = 0;
1366
63.5k
         int missing = IMIN(10, st->loss_duration>>LM);
1367
63.5k
         if (LM==0) safety = GCONST(1.5f);
1368
6.92k
         else if (LM==1) safety = GCONST(.5f);
1369
1.15M
         for (i=start;i<end;i++)
1370
1.08M
         {
1371
1.08M
            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
455k
               opus_val32 slope;
1374
455k
               opus_val32 E0, E1, E2;
1375
455k
               E0 = oldBandE[c*nbEBands+i];
1376
455k
               E1 = oldLogE[c*nbEBands+i];
1377
455k
               E2 = oldLogE2[c*nbEBands+i];
1378
455k
               slope = MAX32(E1 - E0, HALF32(E2 - E0));
1379
455k
               slope = MING(slope, GCONST(2.f));
1380
455k
               E0 -= MAX32(0, (1+missing)*slope);
1381
455k
               oldBandE[c*nbEBands+i] = MAX32(-GCONST(20.f), E0);
1382
631k
            } else {
1383
               /* Otherwise take the min of the last frames. */
1384
631k
               oldBandE[c*nbEBands+i] = MING(MING(oldBandE[c*nbEBands+i], oldLogE[c*nbEBands+i]), oldLogE2[c*nbEBands+i]);
1385
631k
            }
1386
            /* Shorter frames have more natural fluctuations -- play it safe. */
1387
1.08M
            oldBandE[c*nbEBands+i] -= safety;
1388
1.08M
         }
1389
63.5k
      } while (++c<2);
1390
31.7k
   }
1391
   /* Get band energies */
1392
158k
   unquant_coarse_energy(mode, start, end, oldBandE,
1393
158k
         intra_ener, dec, C, LM);
1394
1395
158k
   ALLOC(tf_res, nbEBands, int);
1396
158k
   tf_decode(start, end, isTransient, tf_res, LM, dec);
1397
1398
158k
   tell = ec_tell(dec);
1399
158k
   spread_decision = SPREAD_NORMAL;
1400
158k
   if (tell+4 <= total_bits)
1401
67.4k
      spread_decision = ec_dec_icdf(dec, spread_icdf, 5);
1402
1403
158k
   ALLOC(cap, nbEBands, int);
1404
1405
158k
   init_caps(mode,cap,LM,C);
1406
1407
158k
   ALLOC(offsets, nbEBands, int);
1408
1409
158k
   dynalloc_logp = 6;
1410
158k
   total_bits<<=BITRES;
1411
158k
   tell = ec_tell_frac(dec);
1412
2.72M
   for (i=start;i<end;i++)
1413
2.56M
   {
1414
2.56M
      int width, quanta;
1415
2.56M
      int dynalloc_loop_logp;
1416
2.56M
      int boost;
1417
2.56M
      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.56M
      quanta = IMIN(width<<BITRES, IMAX(6<<BITRES, width));
1421
2.56M
      dynalloc_loop_logp = dynalloc_logp;
1422
2.56M
      boost = 0;
1423
2.62M
      while (tell+(dynalloc_loop_logp<<BITRES) < total_bits && boost < cap[i])
1424
1.05M
      {
1425
1.05M
         int flag;
1426
1.05M
         flag = ec_dec_bit_logp(dec, dynalloc_loop_logp);
1427
1.05M
         tell = ec_tell_frac(dec);
1428
1.05M
         if (!flag)
1429
999k
            break;
1430
56.6k
         boost += quanta;
1431
56.6k
         total_bits -= quanta;
1432
56.6k
         dynalloc_loop_logp = 1;
1433
56.6k
      }
1434
2.56M
      offsets[i] = boost;
1435
      /* Making dynalloc more likely */
1436
2.56M
      if (boost>0)
1437
18.0k
         dynalloc_logp = IMAX(2, dynalloc_logp-1);
1438
2.56M
   }
1439
1440
158k
   ALLOC(fine_quant, nbEBands, int);
1441
158k
   alloc_trim = tell+(6<<BITRES) <= total_bits ?
1442
97.3k
         ec_dec_icdf(dec, trim_icdf, 7) : 5;
1443
1444
158k
   bits = (((opus_int32)len*8)<<BITRES) - (opus_int32)ec_tell_frac(dec) - 1;
1445
158k
   anti_collapse_rsv = isTransient&&LM>=2&&bits>=((LM+2)<<BITRES) ? (1<<BITRES) : 0;
1446
158k
   bits -= anti_collapse_rsv;
1447
1448
158k
   ALLOC(pulses, nbEBands, int);
1449
158k
   ALLOC(fine_priority, nbEBands, int);
1450
1451
158k
   codedBands = clt_compute_allocation(mode, start, end, offsets, cap,
1452
158k
         alloc_trim, &intensity, &dual_stereo, bits, &balance, pulses,
1453
158k
         fine_quant, fine_priority, C, LM, dec, 0, 0, 0);
1454
1455
158k
   unquant_fine_energy(mode, start, end, oldBandE, NULL, fine_quant, dec, C);
1456
1457
158k
   ALLOC(X, C*N, celt_norm);   /**< Interleaved normalised MDCTs */
1458
1459
158k
#ifdef ENABLE_QEXT
1460
158k
   if (qext_bytes && end == nbEBands &&
1461
8.68k
         ((mode->Fs == 48000 && (mode->shortMdctSize==120 || mode->shortMdctSize==90))
1462
8.68k
       || (mode->Fs == 96000 && (mode->shortMdctSize==240 || mode->shortMdctSize==180)))) {
1463
8.68k
      int qext_intra_ener;
1464
8.68k
      compute_qext_mode(&qext_mode_struct, mode);
1465
8.68k
      qext_mode = &qext_mode_struct;
1466
8.68k
      qext_end = ec_dec_bit_logp(&ext_dec, 1) ? NB_QEXT_BANDS : 2;
1467
8.68k
      if (C==2) decode_qext_stereo_params(&ext_dec, qext_end, &qext_intensity, &qext_dual_stereo);
1468
8.68k
      qext_intra_ener = ec_tell(&ext_dec)+3<=qext_bytes*8 ? ec_dec_bit_logp(&ext_dec, 3) : 0;
1469
8.68k
      unquant_coarse_energy(qext_mode, 0, qext_end, st->qext_oldBandE,
1470
8.68k
            qext_intra_ener, &ext_dec, C, LM);
1471
8.68k
   }
1472
158k
   ALLOC(extra_quant, nbEBands+NB_QEXT_BANDS, int);
1473
158k
   ALLOC(extra_pulses, nbEBands+NB_QEXT_BANDS, int);
1474
158k
   qext_bits = ((opus_int32)qext_bytes*8<<BITRES) - (opus_int32)ec_tell_frac(dec) - 1;
1475
158k
   clt_compute_extra_allocation(mode, qext_mode, start, end, qext_end, NULL, NULL,
1476
158k
         qext_bits, extra_pulses, extra_quant, C, LM, &ext_dec, 0, 0, 0);
1477
158k
   if (qext_bytes > 0) {
1478
11.4k
      unquant_fine_energy(mode, start, end, oldBandE, fine_quant, extra_quant, &ext_dec, C);
1479
11.4k
   }
1480
158k
#endif
1481
1482
228k
   c=0; do {
1483
228k
      OPUS_MOVE(decode_mem[c], decode_mem[c]+N, decode_buffer_size-N+overlap);
1484
228k
   } while (++c<CC);
1485
1486
   /* Decode fixed codebook */
1487
158k
   ALLOC(collapse_masks, C*nbEBands, unsigned char);
1488
1489
158k
   quant_all_bands(0, mode, start, end, X, C==2 ? X+N : NULL, collapse_masks,
1490
158k
         NULL, pulses, shortBlocks, spread_decision, dual_stereo, intensity, tf_res,
1491
158k
         len*(8<<BITRES)-anti_collapse_rsv, balance, dec, LM, codedBands, &st->rng, 0,
1492
158k
         st->arch, st->disable_inv
1493
158k
         ARG_QEXT(&ext_dec) ARG_QEXT(extra_pulses)
1494
158k
         ARG_QEXT(qext_bytes*(8<<BITRES)) ARG_QEXT(cap));
1495
1496
158k
#ifdef ENABLE_QEXT
1497
158k
   if (qext_mode) {
1498
8.68k
      VARDECL(int, zeros);
1499
8.68k
      VARDECL(unsigned char, qext_collapse_masks);
1500
8.68k
      ec_dec dummy_dec;
1501
8.68k
      int ext_balance;
1502
8.68k
      ALLOC(zeros, nbEBands, int);
1503
8.68k
      ALLOC(qext_collapse_masks, C*NB_QEXT_BANDS, unsigned char);
1504
8.68k
      ec_dec_init(&dummy_dec, NULL, 0);
1505
8.68k
      OPUS_CLEAR(zeros, end);
1506
8.68k
      ext_balance = qext_bytes*(8<<BITRES) - ec_tell_frac(&ext_dec);
1507
59.5k
      for (i=0;i<qext_end;i++) ext_balance -= extra_pulses[nbEBands+i] + C*(extra_quant[nbEBands+1]<<BITRES);
1508
8.68k
      unquant_fine_energy(qext_mode, 0, qext_end, st->qext_oldBandE, NULL, &extra_quant[nbEBands], &ext_dec, C);
1509
8.68k
      quant_all_bands(0, qext_mode, 0, qext_end, X, C==2 ? X+N : NULL, qext_collapse_masks,
1510
8.68k
            NULL, &extra_pulses[nbEBands], shortBlocks, spread_decision, qext_dual_stereo, qext_intensity, zeros,
1511
8.68k
            qext_bytes*(8<<BITRES), ext_balance, &ext_dec, LM, qext_end, &st->rng, 0,
1512
8.68k
            st->arch, st->disable_inv, &dummy_dec, zeros, 0, NULL);
1513
8.68k
   }
1514
158k
#endif
1515
1516
158k
   if (anti_collapse_rsv > 0)
1517
4.54k
   {
1518
4.54k
      anti_collapse_on = ec_dec_bits(dec, 1);
1519
4.54k
   }
1520
158k
   unquant_energy_finalise(mode, start, end, (qext_bytes > 0) ? NULL : oldBandE,
1521
158k
         fine_quant, fine_priority, len*8-ec_tell(dec), dec, C);
1522
158k
   if (anti_collapse_on)
1523
3.45k
      anti_collapse(mode, X, collapse_masks, LM, C, N,
1524
3.45k
            start, end, oldBandE, oldLogE, oldLogE2, pulses, st->rng, 0, st->arch);
1525
1526
158k
   if (silence)
1527
18.6k
   {
1528
669k
      for (i=0;i<C*nbEBands;i++)
1529
650k
         oldBandE[i] = -GCONST(28.f);
1530
18.6k
   }
1531
158k
   if (st->prefilter_and_fold) {
1532
32.1k
      prefilter_and_fold(st, N);
1533
32.1k
   }
1534
158k
   celt_synthesis(mode, X, out_syn, oldBandE, start, effEnd,
1535
158k
                  C, CC, isTransient, LM, st->downsample, silence, st->arch ARG_QEXT(qext_mode) ARG_QEXT(st->qext_oldBandE) ARG_QEXT(qext_end));
1536
1537
228k
   c=0; do {
1538
228k
      st->postfilter_period=IMAX(st->postfilter_period, COMBFILTER_MINPERIOD);
1539
228k
      st->postfilter_period_old=IMAX(st->postfilter_period_old, COMBFILTER_MINPERIOD);
1540
228k
      comb_filter(out_syn[c], out_syn[c], st->postfilter_period_old, st->postfilter_period, mode->shortMdctSize,
1541
228k
            st->postfilter_gain_old, st->postfilter_gain, st->postfilter_tapset_old, st->postfilter_tapset,
1542
228k
            mode->window, overlap, st->arch);
1543
228k
      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
228k
   } while (++c<CC);
1549
158k
   st->postfilter_period_old = st->postfilter_period;
1550
158k
   st->postfilter_gain_old = st->postfilter_gain;
1551
158k
   st->postfilter_tapset_old = st->postfilter_tapset;
1552
158k
   st->postfilter_period = postfilter_pitch;
1553
158k
   st->postfilter_gain = postfilter_gain;
1554
158k
   st->postfilter_tapset = postfilter_tapset;
1555
158k
   if (LM!=0)
1556
87.5k
   {
1557
87.5k
      st->postfilter_period_old = st->postfilter_period;
1558
87.5k
      st->postfilter_gain_old = st->postfilter_gain;
1559
87.5k
      st->postfilter_tapset_old = st->postfilter_tapset;
1560
87.5k
   }
1561
1562
158k
   if (C==1)
1563
100k
      OPUS_COPY(&oldBandE[nbEBands], oldBandE, nbEBands);
1564
1565
158k
   if (!isTransient)
1566
144k
   {
1567
144k
      OPUS_COPY(oldLogE2, oldLogE, 2*nbEBands);
1568
144k
      OPUS_COPY(oldLogE, oldBandE, 2*nbEBands);
1569
144k
   } else {
1570
582k
      for (i=0;i<2*nbEBands;i++)
1571
568k
         oldLogE[i] = MING(oldLogE[i], oldBandE[i]);
1572
13.5k
   }
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
158k
   max_background_increase = IMIN(160, st->loss_duration+M)*GCONST(0.001f);
1577
6.80M
   for (i=0;i<2*nbEBands;i++)
1578
6.64M
      backgroundLogE[i] = MING(backgroundLogE[i] + max_background_increase, oldBandE[i]);
1579
   /* In case start or end were to change */
1580
158k
   c=0; do
1581
316k
   {
1582
924k
      for (i=0;i<start;i++)
1583
607k
      {
1584
607k
         oldBandE[c*nbEBands+i]=0;
1585
607k
         oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-GCONST(28.f);
1586
607k
      }
1587
1.21M
      for (i=end;i<nbEBands;i++)
1588
900k
      {
1589
900k
         oldBandE[c*nbEBands+i]=0;
1590
900k
         oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-GCONST(28.f);
1591
900k
      }
1592
316k
   } while (++c<2);
1593
158k
   st->rng = dec->rng;
1594
158k
#ifdef ENABLE_QEXT
1595
158k
   if (qext_bytes) st->rng = st->rng ^ ext_dec.rng;
1596
158k
#endif
1597
1598
158k
   deemphasis(out_syn, pcm, N, CC, st->downsample, mode->preemph, st->preemph_memD, accum);
1599
158k
   st->loss_duration = 0;
1600
158k
   st->plc_duration = 0;
1601
158k
   st->last_frame_type = FRAME_NORMAL;
1602
158k
   st->prefilter_and_fold = 0;
1603
158k
   RESTORE_STACK;
1604
158k
   if (ec_tell(dec) > 8*len)
1605
1
      return OPUS_INTERNAL_ERROR;
1606
158k
#ifdef ENABLE_QEXT
1607
158k
   if (qext_bytes != 0 && ec_tell(&ext_dec) > 8*qext_bytes)
1608
0
      return OPUS_INTERNAL_ERROR;
1609
158k
#endif
1610
158k
   if(ec_get_error(dec))
1611
2.40k
      st->error = 1;
1612
158k
   return frame_size/st->downsample;
1613
158k
}
celt_decode_with_ec_dred
Line
Count
Source
1107
268k
{
1108
268k
   int c, i, N;
1109
268k
   int spread_decision;
1110
268k
   opus_int32 bits;
1111
268k
   ec_dec _dec;
1112
268k
   VARDECL(celt_norm, X);
1113
268k
   VARDECL(int, fine_quant);
1114
268k
   VARDECL(int, pulses);
1115
268k
   VARDECL(int, cap);
1116
268k
   VARDECL(int, offsets);
1117
268k
   VARDECL(int, fine_priority);
1118
268k
   VARDECL(int, tf_res);
1119
268k
   VARDECL(unsigned char, collapse_masks);
1120
268k
   celt_sig *decode_mem[2];
1121
268k
   celt_sig *out_syn[2];
1122
268k
   celt_glog *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE;
1123
1124
268k
   int shortBlocks;
1125
268k
   int isTransient;
1126
268k
   int intra_ener;
1127
268k
   const int CC = st->channels;
1128
268k
   int LM, M;
1129
268k
   int start;
1130
268k
   int end;
1131
268k
   int effEnd;
1132
268k
   int codedBands;
1133
268k
   int alloc_trim;
1134
268k
   int postfilter_pitch;
1135
268k
   opus_val16 postfilter_gain;
1136
268k
   int intensity=0;
1137
268k
   int dual_stereo=0;
1138
268k
   opus_int32 total_bits;
1139
268k
   opus_int32 balance;
1140
268k
   opus_int32 tell;
1141
268k
   int dynalloc_logp;
1142
268k
   int postfilter_tapset;
1143
268k
   int anti_collapse_rsv;
1144
268k
   int anti_collapse_on=0;
1145
268k
   int silence;
1146
268k
   int C = st->stream_channels;
1147
268k
   const OpusCustomMode *mode;
1148
268k
   int nbEBands;
1149
268k
   int overlap;
1150
268k
   const opus_int16 *eBands;
1151
268k
   celt_glog max_background_increase;
1152
268k
   int decode_buffer_size;
1153
268k
#ifdef ENABLE_QEXT
1154
268k
   opus_int32 qext_bits;
1155
268k
   ec_dec ext_dec;
1156
268k
   int qext_bytes=0;
1157
268k
   int qext_end=0;
1158
268k
   int qext_intensity=0;
1159
268k
   int qext_dual_stereo=0;
1160
268k
   VARDECL(int, extra_quant);
1161
268k
   VARDECL(int, extra_pulses);
1162
268k
   const CELTMode *qext_mode = NULL;
1163
268k
   CELTMode qext_mode_struct;
1164
268k
   int qext_scale;
1165
#else
1166
# define qext_bytes 0
1167
#endif
1168
268k
   ALLOC_STACK;
1169
268k
#ifdef ENABLE_QEXT
1170
268k
   qext_scale = st->qext_scale;
1171
268k
#endif
1172
268k
   decode_buffer_size = QEXT_SCALE(DECODE_BUFFER_SIZE);
1173
1174
268k
   VALIDATE_CELT_DECODER(st);
1175
268k
   mode = st->mode;
1176
268k
   nbEBands = mode->nbEBands;
1177
268k
   overlap = mode->overlap;
1178
268k
   eBands = mode->eBands;
1179
268k
   start = st->start;
1180
268k
   end = st->end;
1181
268k
   frame_size *= st->downsample;
1182
1183
268k
   oldBandE = (celt_glog*)(st->_decode_mem+(decode_buffer_size+overlap)*CC);
1184
268k
   oldLogE = oldBandE + 2*nbEBands;
1185
268k
   oldLogE2 = oldLogE + 2*nbEBands;
1186
268k
   backgroundLogE = oldLogE2 + 2*nbEBands;
1187
1188
268k
#ifdef ENABLE_QEXT
1189
268k
   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
255k
   } else {
1193
255k
      ec_dec_init(&ext_dec, NULL, 0);
1194
255k
   }
1195
268k
#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
268k
   {
1255
268k
#endif
1256
489k
      for (LM=0;LM<=mode->maxLM;LM++)
1257
489k
         if (mode->shortMdctSize<<LM==frame_size)
1258
268k
            break;
1259
268k
      if (LM>mode->maxLM)
1260
0
         return OPUS_BAD_ARG;
1261
268k
   }
1262
268k
   M=1<<LM;
1263
1264
268k
   if (len<0 || len>1275 || pcm==NULL)
1265
0
      return OPUS_BAD_ARG;
1266
1267
268k
   N = M*mode->shortMdctSize;
1268
392k
   c=0; do {
1269
392k
      decode_mem[c] = st->_decode_mem + c*(decode_buffer_size+overlap);
1270
392k
      out_syn[c] = decode_mem[c]+decode_buffer_size-N;
1271
392k
   } while (++c<CC);
1272
1273
268k
   effEnd = end;
1274
268k
   if (effEnd > mode->effEBands)
1275
0
      effEnd = mode->effEBands;
1276
1277
268k
   if (data == NULL || len<=1)
1278
110k
   {
1279
110k
      celt_decode_lost(st, N, LM
1280
#ifdef ENABLE_DEEP_PLC
1281
      , lpcnet
1282
#endif
1283
110k
                      );
1284
110k
      deemphasis(out_syn, pcm, N, CC, st->downsample, mode->preemph, st->preemph_memD, accum);
1285
110k
      RESTORE_STACK;
1286
110k
      return frame_size/st->downsample;
1287
110k
   }
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
158k
   if (st->loss_duration == 0) st->skip_plc = 0;
1298
1299
158k
   if (dec == NULL)
1300
16.6k
   {
1301
16.6k
      ec_dec_init(&_dec,(unsigned char*)data,len);
1302
16.6k
      dec = &_dec;
1303
16.6k
   }
1304
1305
158k
   if (C==1)
1306
100k
   {
1307
2.21M
      for (i=0;i<nbEBands;i++)
1308
2.11M
         oldBandE[i]=MAXG(oldBandE[i],oldBandE[nbEBands+i]);
1309
100k
   }
1310
1311
158k
   total_bits = len*8;
1312
158k
   tell = ec_tell(dec);
1313
1314
158k
   if (tell >= total_bits)
1315
10.9k
      silence = 1;
1316
147k
   else if (tell==1)
1317
140k
      silence = ec_dec_bit_logp(dec, 15);
1318
6.91k
   else
1319
6.91k
      silence = 0;
1320
158k
   if (silence)
1321
18.6k
   {
1322
      /* Pretend we've read all the remaining bits */
1323
18.6k
      tell = len*8;
1324
18.6k
      dec->nbits_total+=tell-ec_tell(dec);
1325
18.6k
   }
1326
1327
158k
   postfilter_gain = 0;
1328
158k
   postfilter_pitch = 0;
1329
158k
   postfilter_tapset = 0;
1330
158k
   if (start==0 && tell+16 <= total_bits)
1331
99.2k
   {
1332
99.2k
      if(ec_dec_bit_logp(dec, 1))
1333
28.1k
      {
1334
28.1k
         int qg, octave;
1335
28.1k
         octave = ec_dec_uint(dec, 6);
1336
28.1k
         postfilter_pitch = (16<<octave)+ec_dec_bits(dec, 4+octave)-1;
1337
28.1k
         qg = ec_dec_bits(dec, 3);
1338
28.1k
         if (ec_tell(dec)+2<=total_bits)
1339
28.1k
            postfilter_tapset = ec_dec_icdf(dec, tapset_icdf, 2);
1340
28.1k
         postfilter_gain = QCONST16(.09375f,15)*(qg+1);
1341
28.1k
      }
1342
99.2k
      tell = ec_tell(dec);
1343
99.2k
   }
1344
1345
158k
   if (LM > 0 && tell+3 <= total_bits)
1346
74.3k
   {
1347
74.3k
      isTransient = ec_dec_bit_logp(dec, 3);
1348
74.3k
      tell = ec_tell(dec);
1349
74.3k
   }
1350
83.9k
   else
1351
83.9k
      isTransient = 0;
1352
1353
158k
   if (isTransient)
1354
13.5k
      shortBlocks = M;
1355
144k
   else
1356
144k
      shortBlocks = 0;
1357
1358
   /* Decode the global flags (first symbols in the stream) */
1359
158k
   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
158k
   if (!intra_ener && st->loss_duration != 0) {
1363
31.7k
      c=0; do
1364
63.5k
      {
1365
63.5k
         celt_glog safety = 0;
1366
63.5k
         int missing = IMIN(10, st->loss_duration>>LM);
1367
63.5k
         if (LM==0) safety = GCONST(1.5f);
1368
6.92k
         else if (LM==1) safety = GCONST(.5f);
1369
1.15M
         for (i=start;i<end;i++)
1370
1.08M
         {
1371
1.08M
            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
455k
               opus_val32 slope;
1374
455k
               opus_val32 E0, E1, E2;
1375
455k
               E0 = oldBandE[c*nbEBands+i];
1376
455k
               E1 = oldLogE[c*nbEBands+i];
1377
455k
               E2 = oldLogE2[c*nbEBands+i];
1378
455k
               slope = MAX32(E1 - E0, HALF32(E2 - E0));
1379
455k
               slope = MING(slope, GCONST(2.f));
1380
455k
               E0 -= MAX32(0, (1+missing)*slope);
1381
455k
               oldBandE[c*nbEBands+i] = MAX32(-GCONST(20.f), E0);
1382
631k
            } else {
1383
               /* Otherwise take the min of the last frames. */
1384
631k
               oldBandE[c*nbEBands+i] = MING(MING(oldBandE[c*nbEBands+i], oldLogE[c*nbEBands+i]), oldLogE2[c*nbEBands+i]);
1385
631k
            }
1386
            /* Shorter frames have more natural fluctuations -- play it safe. */
1387
1.08M
            oldBandE[c*nbEBands+i] -= safety;
1388
1.08M
         }
1389
63.5k
      } while (++c<2);
1390
31.7k
   }
1391
   /* Get band energies */
1392
158k
   unquant_coarse_energy(mode, start, end, oldBandE,
1393
158k
         intra_ener, dec, C, LM);
1394
1395
158k
   ALLOC(tf_res, nbEBands, int);
1396
158k
   tf_decode(start, end, isTransient, tf_res, LM, dec);
1397
1398
158k
   tell = ec_tell(dec);
1399
158k
   spread_decision = SPREAD_NORMAL;
1400
158k
   if (tell+4 <= total_bits)
1401
67.4k
      spread_decision = ec_dec_icdf(dec, spread_icdf, 5);
1402
1403
158k
   ALLOC(cap, nbEBands, int);
1404
1405
158k
   init_caps(mode,cap,LM,C);
1406
1407
158k
   ALLOC(offsets, nbEBands, int);
1408
1409
158k
   dynalloc_logp = 6;
1410
158k
   total_bits<<=BITRES;
1411
158k
   tell = ec_tell_frac(dec);
1412
2.72M
   for (i=start;i<end;i++)
1413
2.56M
   {
1414
2.56M
      int width, quanta;
1415
2.56M
      int dynalloc_loop_logp;
1416
2.56M
      int boost;
1417
2.56M
      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.56M
      quanta = IMIN(width<<BITRES, IMAX(6<<BITRES, width));
1421
2.56M
      dynalloc_loop_logp = dynalloc_logp;
1422
2.56M
      boost = 0;
1423
2.62M
      while (tell+(dynalloc_loop_logp<<BITRES) < total_bits && boost < cap[i])
1424
1.05M
      {
1425
1.05M
         int flag;
1426
1.05M
         flag = ec_dec_bit_logp(dec, dynalloc_loop_logp);
1427
1.05M
         tell = ec_tell_frac(dec);
1428
1.05M
         if (!flag)
1429
999k
            break;
1430
56.6k
         boost += quanta;
1431
56.6k
         total_bits -= quanta;
1432
56.6k
         dynalloc_loop_logp = 1;
1433
56.6k
      }
1434
2.56M
      offsets[i] = boost;
1435
      /* Making dynalloc more likely */
1436
2.56M
      if (boost>0)
1437
18.0k
         dynalloc_logp = IMAX(2, dynalloc_logp-1);
1438
2.56M
   }
1439
1440
158k
   ALLOC(fine_quant, nbEBands, int);
1441
158k
   alloc_trim = tell+(6<<BITRES) <= total_bits ?
1442
97.3k
         ec_dec_icdf(dec, trim_icdf, 7) : 5;
1443
1444
158k
   bits = (((opus_int32)len*8)<<BITRES) - (opus_int32)ec_tell_frac(dec) - 1;
1445
158k
   anti_collapse_rsv = isTransient&&LM>=2&&bits>=((LM+2)<<BITRES) ? (1<<BITRES) : 0;
1446
158k
   bits -= anti_collapse_rsv;
1447
1448
158k
   ALLOC(pulses, nbEBands, int);
1449
158k
   ALLOC(fine_priority, nbEBands, int);
1450
1451
158k
   codedBands = clt_compute_allocation(mode, start, end, offsets, cap,
1452
158k
         alloc_trim, &intensity, &dual_stereo, bits, &balance, pulses,
1453
158k
         fine_quant, fine_priority, C, LM, dec, 0, 0, 0);
1454
1455
158k
   unquant_fine_energy(mode, start, end, oldBandE, NULL, fine_quant, dec, C);
1456
1457
158k
   ALLOC(X, C*N, celt_norm);   /**< Interleaved normalised MDCTs */
1458
1459
158k
#ifdef ENABLE_QEXT
1460
158k
   if (qext_bytes && end == nbEBands &&
1461
8.68k
         ((mode->Fs == 48000 && (mode->shortMdctSize==120 || mode->shortMdctSize==90))
1462
8.68k
       || (mode->Fs == 96000 && (mode->shortMdctSize==240 || mode->shortMdctSize==180)))) {
1463
8.68k
      int qext_intra_ener;
1464
8.68k
      compute_qext_mode(&qext_mode_struct, mode);
1465
8.68k
      qext_mode = &qext_mode_struct;
1466
8.68k
      qext_end = ec_dec_bit_logp(&ext_dec, 1) ? NB_QEXT_BANDS : 2;
1467
8.68k
      if (C==2) decode_qext_stereo_params(&ext_dec, qext_end, &qext_intensity, &qext_dual_stereo);
1468
8.68k
      qext_intra_ener = ec_tell(&ext_dec)+3<=qext_bytes*8 ? ec_dec_bit_logp(&ext_dec, 3) : 0;
1469
8.68k
      unquant_coarse_energy(qext_mode, 0, qext_end, st->qext_oldBandE,
1470
8.68k
            qext_intra_ener, &ext_dec, C, LM);
1471
8.68k
   }
1472
158k
   ALLOC(extra_quant, nbEBands+NB_QEXT_BANDS, int);
1473
158k
   ALLOC(extra_pulses, nbEBands+NB_QEXT_BANDS, int);
1474
158k
   qext_bits = ((opus_int32)qext_bytes*8<<BITRES) - (opus_int32)ec_tell_frac(dec) - 1;
1475
158k
   clt_compute_extra_allocation(mode, qext_mode, start, end, qext_end, NULL, NULL,
1476
158k
         qext_bits, extra_pulses, extra_quant, C, LM, &ext_dec, 0, 0, 0);
1477
158k
   if (qext_bytes > 0) {
1478
11.4k
      unquant_fine_energy(mode, start, end, oldBandE, fine_quant, extra_quant, &ext_dec, C);
1479
11.4k
   }
1480
158k
#endif
1481
1482
228k
   c=0; do {
1483
228k
      OPUS_MOVE(decode_mem[c], decode_mem[c]+N, decode_buffer_size-N+overlap);
1484
228k
   } while (++c<CC);
1485
1486
   /* Decode fixed codebook */
1487
158k
   ALLOC(collapse_masks, C*nbEBands, unsigned char);
1488
1489
158k
   quant_all_bands(0, mode, start, end, X, C==2 ? X+N : NULL, collapse_masks,
1490
158k
         NULL, pulses, shortBlocks, spread_decision, dual_stereo, intensity, tf_res,
1491
158k
         len*(8<<BITRES)-anti_collapse_rsv, balance, dec, LM, codedBands, &st->rng, 0,
1492
158k
         st->arch, st->disable_inv
1493
158k
         ARG_QEXT(&ext_dec) ARG_QEXT(extra_pulses)
1494
158k
         ARG_QEXT(qext_bytes*(8<<BITRES)) ARG_QEXT(cap));
1495
1496
158k
#ifdef ENABLE_QEXT
1497
158k
   if (qext_mode) {
1498
8.68k
      VARDECL(int, zeros);
1499
8.68k
      VARDECL(unsigned char, qext_collapse_masks);
1500
8.68k
      ec_dec dummy_dec;
1501
8.68k
      int ext_balance;
1502
8.68k
      ALLOC(zeros, nbEBands, int);
1503
8.68k
      ALLOC(qext_collapse_masks, C*NB_QEXT_BANDS, unsigned char);
1504
8.68k
      ec_dec_init(&dummy_dec, NULL, 0);
1505
8.68k
      OPUS_CLEAR(zeros, end);
1506
8.68k
      ext_balance = qext_bytes*(8<<BITRES) - ec_tell_frac(&ext_dec);
1507
59.5k
      for (i=0;i<qext_end;i++) ext_balance -= extra_pulses[nbEBands+i] + C*(extra_quant[nbEBands+1]<<BITRES);
1508
8.68k
      unquant_fine_energy(qext_mode, 0, qext_end, st->qext_oldBandE, NULL, &extra_quant[nbEBands], &ext_dec, C);
1509
8.68k
      quant_all_bands(0, qext_mode, 0, qext_end, X, C==2 ? X+N : NULL, qext_collapse_masks,
1510
8.68k
            NULL, &extra_pulses[nbEBands], shortBlocks, spread_decision, qext_dual_stereo, qext_intensity, zeros,
1511
8.68k
            qext_bytes*(8<<BITRES), ext_balance, &ext_dec, LM, qext_end, &st->rng, 0,
1512
8.68k
            st->arch, st->disable_inv, &dummy_dec, zeros, 0, NULL);
1513
8.68k
   }
1514
158k
#endif
1515
1516
158k
   if (anti_collapse_rsv > 0)
1517
4.54k
   {
1518
4.54k
      anti_collapse_on = ec_dec_bits(dec, 1);
1519
4.54k
   }
1520
158k
   unquant_energy_finalise(mode, start, end, (qext_bytes > 0) ? NULL : oldBandE,
1521
158k
         fine_quant, fine_priority, len*8-ec_tell(dec), dec, C);
1522
158k
   if (anti_collapse_on)
1523
3.45k
      anti_collapse(mode, X, collapse_masks, LM, C, N,
1524
3.45k
            start, end, oldBandE, oldLogE, oldLogE2, pulses, st->rng, 0, st->arch);
1525
1526
158k
   if (silence)
1527
18.6k
   {
1528
669k
      for (i=0;i<C*nbEBands;i++)
1529
650k
         oldBandE[i] = -GCONST(28.f);
1530
18.6k
   }
1531
158k
   if (st->prefilter_and_fold) {
1532
32.1k
      prefilter_and_fold(st, N);
1533
32.1k
   }
1534
158k
   celt_synthesis(mode, X, out_syn, oldBandE, start, effEnd,
1535
158k
                  C, CC, isTransient, LM, st->downsample, silence, st->arch ARG_QEXT(qext_mode) ARG_QEXT(st->qext_oldBandE) ARG_QEXT(qext_end));
1536
1537
228k
   c=0; do {
1538
228k
      st->postfilter_period=IMAX(st->postfilter_period, COMBFILTER_MINPERIOD);
1539
228k
      st->postfilter_period_old=IMAX(st->postfilter_period_old, COMBFILTER_MINPERIOD);
1540
228k
      comb_filter(out_syn[c], out_syn[c], st->postfilter_period_old, st->postfilter_period, mode->shortMdctSize,
1541
228k
            st->postfilter_gain_old, st->postfilter_gain, st->postfilter_tapset_old, st->postfilter_tapset,
1542
228k
            mode->window, overlap, st->arch);
1543
228k
      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
228k
   } while (++c<CC);
1549
158k
   st->postfilter_period_old = st->postfilter_period;
1550
158k
   st->postfilter_gain_old = st->postfilter_gain;
1551
158k
   st->postfilter_tapset_old = st->postfilter_tapset;
1552
158k
   st->postfilter_period = postfilter_pitch;
1553
158k
   st->postfilter_gain = postfilter_gain;
1554
158k
   st->postfilter_tapset = postfilter_tapset;
1555
158k
   if (LM!=0)
1556
87.5k
   {
1557
87.5k
      st->postfilter_period_old = st->postfilter_period;
1558
87.5k
      st->postfilter_gain_old = st->postfilter_gain;
1559
87.5k
      st->postfilter_tapset_old = st->postfilter_tapset;
1560
87.5k
   }
1561
1562
158k
   if (C==1)
1563
100k
      OPUS_COPY(&oldBandE[nbEBands], oldBandE, nbEBands);
1564
1565
158k
   if (!isTransient)
1566
144k
   {
1567
144k
      OPUS_COPY(oldLogE2, oldLogE, 2*nbEBands);
1568
144k
      OPUS_COPY(oldLogE, oldBandE, 2*nbEBands);
1569
144k
   } else {
1570
582k
      for (i=0;i<2*nbEBands;i++)
1571
568k
         oldLogE[i] = MING(oldLogE[i], oldBandE[i]);
1572
13.5k
   }
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
158k
   max_background_increase = IMIN(160, st->loss_duration+M)*GCONST(0.001f);
1577
6.80M
   for (i=0;i<2*nbEBands;i++)
1578
6.64M
      backgroundLogE[i] = MING(backgroundLogE[i] + max_background_increase, oldBandE[i]);
1579
   /* In case start or end were to change */
1580
158k
   c=0; do
1581
316k
   {
1582
924k
      for (i=0;i<start;i++)
1583
607k
      {
1584
607k
         oldBandE[c*nbEBands+i]=0;
1585
607k
         oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-GCONST(28.f);
1586
607k
      }
1587
1.21M
      for (i=end;i<nbEBands;i++)
1588
900k
      {
1589
900k
         oldBandE[c*nbEBands+i]=0;
1590
900k
         oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-GCONST(28.f);
1591
900k
      }
1592
316k
   } while (++c<2);
1593
158k
   st->rng = dec->rng;
1594
158k
#ifdef ENABLE_QEXT
1595
158k
   if (qext_bytes) st->rng = st->rng ^ ext_dec.rng;
1596
158k
#endif
1597
1598
158k
   deemphasis(out_syn, pcm, N, CC, st->downsample, mode->preemph, st->preemph_memD, accum);
1599
158k
   st->loss_duration = 0;
1600
158k
   st->plc_duration = 0;
1601
158k
   st->last_frame_type = FRAME_NORMAL;
1602
158k
   st->prefilter_and_fold = 0;
1603
158k
   RESTORE_STACK;
1604
158k
   if (ec_tell(dec) > 8*len)
1605
1
      return OPUS_INTERNAL_ERROR;
1606
158k
#ifdef ENABLE_QEXT
1607
158k
   if (qext_bytes != 0 && ec_tell(&ext_dec) > 8*qext_bytes)
1608
0
      return OPUS_INTERNAL_ERROR;
1609
158k
#endif
1610
158k
   if(ec_get_error(dec))
1611
2.40k
      st->error = 1;
1612
158k
   return frame_size/st->downsample;
1613
158k
}
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
507k
      for (LM=0;LM<=mode->maxLM;LM++)
1257
507k
         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
413k
   c=0; do {
1269
413k
      decode_mem[c] = st->_decode_mem + c*(decode_buffer_size+overlap);
1270
413k
      out_syn[c] = decode_mem[c]+decode_buffer_size-N;
1271
413k
   } 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
114k
   {
1279
114k
      celt_decode_lost(st, N, LM
1280
#ifdef ENABLE_DEEP_PLC
1281
      , lpcnet
1282
#endif
1283
114k
                      );
1284
114k
      deemphasis(out_syn, pcm, N, CC, st->downsample, mode->preemph, st->preemph_memD, accum);
1285
114k
      RESTORE_STACK;
1286
114k
      return frame_size/st->downsample;
1287
114k
   }
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
149k
   if (st->loss_duration == 0) st->skip_plc = 0;
1298
1299
149k
   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
149k
   if (C==1)
1306
95.1k
   {
1307
2.09M
      for (i=0;i<nbEBands;i++)
1308
1.99M
         oldBandE[i]=MAXG(oldBandE[i],oldBandE[nbEBands+i]);
1309
95.1k
   }
1310
1311
149k
   total_bits = len*8;
1312
149k
   tell = ec_tell(dec);
1313
1314
149k
   if (tell >= total_bits)
1315
14.0k
      silence = 1;
1316
135k
   else if (tell==1)
1317
130k
      silence = ec_dec_bit_logp(dec, 15);
1318
4.93k
   else
1319
4.93k
      silence = 0;
1320
149k
   if (silence)
1321
20.7k
   {
1322
      /* Pretend we've read all the remaining bits */
1323
20.7k
      tell = len*8;
1324
20.7k
      dec->nbits_total+=tell-ec_tell(dec);
1325
20.7k
   }
1326
1327
149k
   postfilter_gain = 0;
1328
149k
   postfilter_pitch = 0;
1329
149k
   postfilter_tapset = 0;
1330
149k
   if (start==0 && tell+16 <= total_bits)
1331
75.0k
   {
1332
75.0k
      if(ec_dec_bit_logp(dec, 1))
1333
22.0k
      {
1334
22.0k
         int qg, octave;
1335
22.0k
         octave = ec_dec_uint(dec, 6);
1336
22.0k
         postfilter_pitch = (16<<octave)+ec_dec_bits(dec, 4+octave)-1;
1337
22.0k
         qg = ec_dec_bits(dec, 3);
1338
22.0k
         if (ec_tell(dec)+2<=total_bits)
1339
22.0k
            postfilter_tapset = ec_dec_icdf(dec, tapset_icdf, 2);
1340
22.0k
         postfilter_gain = QCONST16(.09375f,15)*(qg+1);
1341
22.0k
      }
1342
75.0k
      tell = ec_tell(dec);
1343
75.0k
   }
1344
1345
149k
   if (LM > 0 && tell+3 <= total_bits)
1346
65.9k
   {
1347
65.9k
      isTransient = ec_dec_bit_logp(dec, 3);
1348
65.9k
      tell = ec_tell(dec);
1349
65.9k
   }
1350
83.4k
   else
1351
83.4k
      isTransient = 0;
1352
1353
149k
   if (isTransient)
1354
15.1k
      shortBlocks = M;
1355
134k
   else
1356
134k
      shortBlocks = 0;
1357
1358
   /* Decode the global flags (first symbols in the stream) */
1359
149k
   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
149k
   if (!intra_ener && st->loss_duration != 0) {
1363
29.1k
      c=0; do
1364
58.3k
      {
1365
58.3k
         celt_glog safety = 0;
1366
58.3k
         int missing = IMIN(10, st->loss_duration>>LM);
1367
58.3k
         if (LM==0) safety = GCONST(1.5f);
1368
6.86k
         else if (LM==1) safety = GCONST(.5f);
1369
1.05M
         for (i=start;i<end;i++)
1370
998k
         {
1371
998k
            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
419k
               opus_val32 slope;
1374
419k
               opus_val32 E0, E1, E2;
1375
419k
               E0 = oldBandE[c*nbEBands+i];
1376
419k
               E1 = oldLogE[c*nbEBands+i];
1377
419k
               E2 = oldLogE2[c*nbEBands+i];
1378
419k
               slope = MAX32(E1 - E0, HALF32(E2 - E0));
1379
419k
               slope = MING(slope, GCONST(2.f));
1380
419k
               E0 -= MAX32(0, (1+missing)*slope);
1381
419k
               oldBandE[c*nbEBands+i] = MAX32(-GCONST(20.f), E0);
1382
578k
            } else {
1383
               /* Otherwise take the min of the last frames. */
1384
578k
               oldBandE[c*nbEBands+i] = MING(MING(oldBandE[c*nbEBands+i], oldLogE[c*nbEBands+i]), oldLogE2[c*nbEBands+i]);
1385
578k
            }
1386
            /* Shorter frames have more natural fluctuations -- play it safe. */
1387
998k
            oldBandE[c*nbEBands+i] -= safety;
1388
998k
         }
1389
58.3k
      } while (++c<2);
1390
29.1k
   }
1391
   /* Get band energies */
1392
149k
   unquant_coarse_energy(mode, start, end, oldBandE,
1393
149k
         intra_ener, dec, C, LM);
1394
1395
149k
   ALLOC(tf_res, nbEBands, int);
1396
149k
   tf_decode(start, end, isTransient, tf_res, LM, dec);
1397
1398
149k
   tell = ec_tell(dec);
1399
149k
   spread_decision = SPREAD_NORMAL;
1400
149k
   if (tell+4 <= total_bits)
1401
48.3k
      spread_decision = ec_dec_icdf(dec, spread_icdf, 5);
1402
1403
149k
   ALLOC(cap, nbEBands, int);
1404
1405
149k
   init_caps(mode,cap,LM,C);
1406
1407
149k
   ALLOC(offsets, nbEBands, int);
1408
1409
149k
   dynalloc_logp = 6;
1410
149k
   total_bits<<=BITRES;
1411
149k
   tell = ec_tell_frac(dec);
1412
2.52M
   for (i=start;i<end;i++)
1413
2.37M
   {
1414
2.37M
      int width, quanta;
1415
2.37M
      int dynalloc_loop_logp;
1416
2.37M
      int boost;
1417
2.37M
      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.37M
      quanta = IMIN(width<<BITRES, IMAX(6<<BITRES, width));
1421
2.37M
      dynalloc_loop_logp = dynalloc_logp;
1422
2.37M
      boost = 0;
1423
2.42M
      while (tell+(dynalloc_loop_logp<<BITRES) < total_bits && boost < cap[i])
1424
723k
      {
1425
723k
         int flag;
1426
723k
         flag = ec_dec_bit_logp(dec, dynalloc_loop_logp);
1427
723k
         tell = ec_tell_frac(dec);
1428
723k
         if (!flag)
1429
674k
            break;
1430
49.6k
         boost += quanta;
1431
49.6k
         total_bits -= quanta;
1432
49.6k
         dynalloc_loop_logp = 1;
1433
49.6k
      }
1434
2.37M
      offsets[i] = boost;
1435
      /* Making dynalloc more likely */
1436
2.37M
      if (boost>0)
1437
12.2k
         dynalloc_logp = IMAX(2, dynalloc_logp-1);
1438
2.37M
   }
1439
1440
149k
   ALLOC(fine_quant, nbEBands, int);
1441
149k
   alloc_trim = tell+(6<<BITRES) <= total_bits ?
1442
107k
         ec_dec_icdf(dec, trim_icdf, 7) : 5;
1443
1444
149k
   bits = (((opus_int32)len*8)<<BITRES) - (opus_int32)ec_tell_frac(dec) - 1;
1445
149k
   anti_collapse_rsv = isTransient&&LM>=2&&bits>=((LM+2)<<BITRES) ? (1<<BITRES) : 0;
1446
149k
   bits -= anti_collapse_rsv;
1447
1448
149k
   ALLOC(pulses, nbEBands, int);
1449
149k
   ALLOC(fine_priority, nbEBands, int);
1450
1451
149k
   codedBands = clt_compute_allocation(mode, start, end, offsets, cap,
1452
149k
         alloc_trim, &intensity, &dual_stereo, bits, &balance, pulses,
1453
149k
         fine_quant, fine_priority, C, LM, dec, 0, 0, 0);
1454
1455
149k
   unquant_fine_energy(mode, start, end, oldBandE, NULL, fine_quant, dec, C);
1456
1457
149k
   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
230k
   c=0; do {
1483
230k
      OPUS_MOVE(decode_mem[c], decode_mem[c]+N, decode_buffer_size-N+overlap);
1484
230k
   } while (++c<CC);
1485
1486
   /* Decode fixed codebook */
1487
149k
   ALLOC(collapse_masks, C*nbEBands, unsigned char);
1488
1489
149k
   quant_all_bands(0, mode, start, end, X, C==2 ? X+N : NULL, collapse_masks,
1490
149k
         NULL, pulses, shortBlocks, spread_decision, dual_stereo, intensity, tf_res,
1491
149k
         len*(8<<BITRES)-anti_collapse_rsv, balance, dec, LM, codedBands, &st->rng, 0,
1492
149k
         st->arch, st->disable_inv
1493
149k
         ARG_QEXT(&ext_dec) ARG_QEXT(extra_pulses)
1494
149k
         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
149k
   if (anti_collapse_rsv > 0)
1517
4.48k
   {
1518
4.48k
      anti_collapse_on = ec_dec_bits(dec, 1);
1519
4.48k
   }
1520
149k
   unquant_energy_finalise(mode, start, end, (qext_bytes > 0) ? NULL : oldBandE,
1521
149k
         fine_quant, fine_priority, len*8-ec_tell(dec), dec, C);
1522
149k
   if (anti_collapse_on)
1523
3.28k
      anti_collapse(mode, X, collapse_masks, LM, C, N,
1524
3.28k
            start, end, oldBandE, oldLogE, oldLogE2, pulses, st->rng, 0, st->arch);
1525
1526
149k
   if (silence)
1527
20.7k
   {
1528
705k
      for (i=0;i<C*nbEBands;i++)
1529
684k
         oldBandE[i] = -GCONST(28.f);
1530
20.7k
   }
1531
149k
   if (st->prefilter_and_fold) {
1532
30.5k
      prefilter_and_fold(st, N);
1533
30.5k
   }
1534
149k
   celt_synthesis(mode, X, out_syn, oldBandE, start, effEnd,
1535
149k
                  C, CC, isTransient, LM, st->downsample, silence, st->arch ARG_QEXT(qext_mode) ARG_QEXT(st->qext_oldBandE) ARG_QEXT(qext_end));
1536
1537
230k
   c=0; do {
1538
230k
      st->postfilter_period=IMAX(st->postfilter_period, COMBFILTER_MINPERIOD);
1539
230k
      st->postfilter_period_old=IMAX(st->postfilter_period_old, COMBFILTER_MINPERIOD);
1540
230k
      comb_filter(out_syn[c], out_syn[c], st->postfilter_period_old, st->postfilter_period, mode->shortMdctSize,
1541
230k
            st->postfilter_gain_old, st->postfilter_gain, st->postfilter_tapset_old, st->postfilter_tapset,
1542
230k
            mode->window, overlap, st->arch);
1543
230k
      if (LM!=0)
1544
118k
         comb_filter(out_syn[c]+mode->shortMdctSize, out_syn[c]+mode->shortMdctSize, st->postfilter_period, postfilter_pitch, N-mode->shortMdctSize,
1545
118k
               st->postfilter_gain, postfilter_gain, st->postfilter_tapset, postfilter_tapset,
1546
118k
               mode->window, overlap, st->arch);
1547
1548
230k
   } while (++c<CC);
1549
149k
   st->postfilter_period_old = st->postfilter_period;
1550
149k
   st->postfilter_gain_old = st->postfilter_gain;
1551
149k
   st->postfilter_tapset_old = st->postfilter_tapset;
1552
149k
   st->postfilter_period = postfilter_pitch;
1553
149k
   st->postfilter_gain = postfilter_gain;
1554
149k
   st->postfilter_tapset = postfilter_tapset;
1555
149k
   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
149k
   if (C==1)
1563
95.1k
      OPUS_COPY(&oldBandE[nbEBands], oldBandE, nbEBands);
1564
1565
149k
   if (!isTransient)
1566
134k
   {
1567
134k
      OPUS_COPY(oldLogE2, oldLogE, 2*nbEBands);
1568
134k
      OPUS_COPY(oldLogE, oldBandE, 2*nbEBands);
1569
134k
   } else {
1570
650k
      for (i=0;i<2*nbEBands;i++)
1571
635k
         oldLogE[i] = MING(oldLogE[i], oldBandE[i]);
1572
15.1k
   }
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
149k
   max_background_increase = IMIN(160, st->loss_duration+M)*GCONST(0.001f);
1577
6.42M
   for (i=0;i<2*nbEBands;i++)
1578
6.27M
      backgroundLogE[i] = MING(backgroundLogE[i] + max_background_increase, oldBandE[i]);
1579
   /* In case start or end were to change */
1580
149k
   c=0; do
1581
298k
   {
1582
945k
      for (i=0;i<start;i++)
1583
646k
      {
1584
646k
         oldBandE[c*nbEBands+i]=0;
1585
646k
         oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-GCONST(28.f);
1586
646k
      }
1587
1.18M
      for (i=end;i<nbEBands;i++)
1588
883k
      {
1589
883k
         oldBandE[c*nbEBands+i]=0;
1590
883k
         oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-GCONST(28.f);
1591
883k
      }
1592
298k
   } while (++c<2);
1593
149k
   st->rng = dec->rng;
1594
#ifdef ENABLE_QEXT
1595
   if (qext_bytes) st->rng = st->rng ^ ext_dec.rng;
1596
#endif
1597
1598
149k
   deemphasis(out_syn, pcm, N, CC, st->downsample, mode->preemph, st->preemph_memD, accum);
1599
149k
   st->loss_duration = 0;
1600
149k
   st->plc_duration = 0;
1601
149k
   st->last_frame_type = FRAME_NORMAL;
1602
149k
   st->prefilter_and_fold = 0;
1603
149k
   RESTORE_STACK;
1604
149k
   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
149k
   if(ec_get_error(dec))
1611
1.89k
      st->error = 1;
1612
149k
   return frame_size/st->downsample;
1613
149k
}
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
61.3k
{
1618
61.3k
   return celt_decode_with_ec_dred(st, data, len, pcm, frame_size, dec, accum
1619
#ifdef ENABLE_DEEP_PLC
1620
       , NULL
1621
#endif
1622
61.3k
       ARG_QEXT(NULL) ARG_QEXT(0)
1623
61.3k
       );
1624
61.3k
}
celt_decode_with_ec
Line
Count
Source
1617
30.6k
{
1618
30.6k
   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.6k
       ARG_QEXT(NULL) ARG_QEXT(0)
1623
30.6k
       );
1624
30.6k
}
celt_decode_with_ec
Line
Count
Source
1617
30.6k
{
1618
30.6k
   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.6k
       ARG_QEXT(NULL) ARG_QEXT(0)
1623
30.6k
       );
1624
30.6k
}
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.96M
{
1724
7.96M
   va_list ap;
1725
1726
7.96M
   va_start(ap, request);
1727
7.96M
   switch (request)
1728
7.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
1.47M
      case CELT_SET_START_BAND_REQUEST:
1750
1.47M
      {
1751
1.47M
         opus_int32 value = va_arg(ap, opus_int32);
1752
1.47M
         if (value<0 || value>=st->mode->nbEBands)
1753
0
            goto bad_arg;
1754
1.47M
         st->start = value;
1755
1.47M
      }
1756
0
      break;
1757
873k
      case CELT_SET_END_BAND_REQUEST:
1758
873k
      {
1759
873k
         opus_int32 value = va_arg(ap, opus_int32);
1760
873k
         if (value<1 || value>st->mode->nbEBands)
1761
0
            goto bad_arg;
1762
873k
         st->end = value;
1763
873k
      }
1764
0
      break;
1765
1.41M
      case CELT_SET_CHANNELS_REQUEST:
1766
1.41M
      {
1767
1.41M
         opus_int32 value = va_arg(ap, opus_int32);
1768
1.41M
         if (value<1 || value>2)
1769
0
            goto bad_arg;
1770
1.41M
         st->stream_channels = value;
1771
1.41M
      }
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
877k
      case OPUS_RESET_STATE:
1791
877k
      {
1792
877k
         int i;
1793
877k
         celt_glog *oldBandE, *oldLogE, *oldLogE2;
1794
877k
         int decode_buffer_size;
1795
#ifdef ENABLE_QEXT
1796
         int qext_scale = st->qext_scale;
1797
#endif
1798
877k
         decode_buffer_size = QEXT_SCALE(DECODE_BUFFER_SIZE);
1799
877k
         oldBandE = (celt_glog*)(st->_decode_mem+(decode_buffer_size+st->overlap)*st->channels);
1800
877k
         oldLogE = oldBandE + 2*st->mode->nbEBands;
1801
877k
         oldLogE2 = oldLogE + 2*st->mode->nbEBands;
1802
877k
         OPUS_CLEAR((char*)&st->DECODER_RESET_START,
1803
877k
               opus_custom_decoder_get_size(st->mode, st->channels)-
1804
877k
               ((char*)&st->DECODER_RESET_START - (char*)st));
1805
37.7M
         for (i=0;i<2*st->mode->nbEBands;i++)
1806
36.8M
            oldLogE[i]=oldLogE2[i]=-GCONST(28.f);
1807
877k
         st->skip_plc = 1;
1808
877k
         st->last_frame_type = FRAME_NONE;
1809
877k
      }
1810
877k
      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.41M
      case CELT_GET_MODE_REQUEST:
1820
1.41M
      {
1821
1.41M
         const CELTMode ** value = va_arg(ap, const CELTMode**);
1822
1.41M
         if (value==0)
1823
0
            goto bad_arg;
1824
1.41M
         *value=st->mode;
1825
1.41M
      }
1826
0
      break;
1827
850k
      case CELT_SET_SIGNALLING_REQUEST:
1828
850k
      {
1829
850k
         opus_int32 value = va_arg(ap, opus_int32);
1830
850k
         st->signalling = value;
1831
850k
      }
1832
850k
      break;
1833
1.06M
      case OPUS_GET_FINAL_RANGE_REQUEST:
1834
1.06M
      {
1835
1.06M
         opus_uint32 * value = va_arg(ap, opus_uint32 *);
1836
1.06M
         if (value==0)
1837
0
            goto bad_arg;
1838
1.06M
         *value=st->rng;
1839
1.06M
      }
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.96M
   }
1864
7.96M
   va_end(ap);
1865
7.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
7.96M
}
opus_custom_decoder_ctl
Line
Count
Source
1723
3.98M
{
1724
3.98M
   va_list ap;
1725
1726
3.98M
   va_start(ap, request);
1727
3.98M
   switch (request)
1728
3.98M
   {
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
736k
      case CELT_SET_START_BAND_REQUEST:
1750
736k
      {
1751
736k
         opus_int32 value = va_arg(ap, opus_int32);
1752
736k
         if (value<0 || value>=st->mode->nbEBands)
1753
0
            goto bad_arg;
1754
736k
         st->start = value;
1755
736k
      }
1756
0
      break;
1757
436k
      case CELT_SET_END_BAND_REQUEST:
1758
436k
      {
1759
436k
         opus_int32 value = va_arg(ap, opus_int32);
1760
436k
         if (value<1 || value>st->mode->nbEBands)
1761
0
            goto bad_arg;
1762
436k
         st->end = value;
1763
436k
      }
1764
0
      break;
1765
706k
      case CELT_SET_CHANNELS_REQUEST:
1766
706k
      {
1767
706k
         opus_int32 value = va_arg(ap, opus_int32);
1768
706k
         if (value<1 || value>2)
1769
0
            goto bad_arg;
1770
706k
         st->stream_channels = value;
1771
706k
      }
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
438k
      case OPUS_RESET_STATE:
1791
438k
      {
1792
438k
         int i;
1793
438k
         celt_glog *oldBandE, *oldLogE, *oldLogE2;
1794
438k
         int decode_buffer_size;
1795
#ifdef ENABLE_QEXT
1796
         int qext_scale = st->qext_scale;
1797
#endif
1798
438k
         decode_buffer_size = QEXT_SCALE(DECODE_BUFFER_SIZE);
1799
438k
         oldBandE = (celt_glog*)(st->_decode_mem+(decode_buffer_size+st->overlap)*st->channels);
1800
438k
         oldLogE = oldBandE + 2*st->mode->nbEBands;
1801
438k
         oldLogE2 = oldLogE + 2*st->mode->nbEBands;
1802
438k
         OPUS_CLEAR((char*)&st->DECODER_RESET_START,
1803
438k
               opus_custom_decoder_get_size(st->mode, st->channels)-
1804
438k
               ((char*)&st->DECODER_RESET_START - (char*)st));
1805
18.8M
         for (i=0;i<2*st->mode->nbEBands;i++)
1806
18.4M
            oldLogE[i]=oldLogE2[i]=-GCONST(28.f);
1807
438k
         st->skip_plc = 1;
1808
438k
         st->last_frame_type = FRAME_NONE;
1809
438k
      }
1810
438k
      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
706k
      case CELT_GET_MODE_REQUEST:
1820
706k
      {
1821
706k
         const CELTMode ** value = va_arg(ap, const CELTMode**);
1822
706k
         if (value==0)
1823
0
            goto bad_arg;
1824
706k
         *value=st->mode;
1825
706k
      }
1826
0
      break;
1827
425k
      case CELT_SET_SIGNALLING_REQUEST:
1828
425k
      {
1829
425k
         opus_int32 value = va_arg(ap, opus_int32);
1830
425k
         st->signalling = value;
1831
425k
      }
1832
425k
      break;
1833
532k
      case OPUS_GET_FINAL_RANGE_REQUEST:
1834
532k
      {
1835
532k
         opus_uint32 * value = va_arg(ap, opus_uint32 *);
1836
532k
         if (value==0)
1837
0
            goto bad_arg;
1838
532k
         *value=st->rng;
1839
532k
      }
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.98M
   }
1864
3.98M
   va_end(ap);
1865
3.98M
   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.98M
}
opus_custom_decoder_ctl
Line
Count
Source
1723
3.98M
{
1724
3.98M
   va_list ap;
1725
1726
3.98M
   va_start(ap, request);
1727
3.98M
   switch (request)
1728
3.98M
   {
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
736k
      case CELT_SET_START_BAND_REQUEST:
1750
736k
      {
1751
736k
         opus_int32 value = va_arg(ap, opus_int32);
1752
736k
         if (value<0 || value>=st->mode->nbEBands)
1753
0
            goto bad_arg;
1754
736k
         st->start = value;
1755
736k
      }
1756
0
      break;
1757
436k
      case CELT_SET_END_BAND_REQUEST:
1758
436k
      {
1759
436k
         opus_int32 value = va_arg(ap, opus_int32);
1760
436k
         if (value<1 || value>st->mode->nbEBands)
1761
0
            goto bad_arg;
1762
436k
         st->end = value;
1763
436k
      }
1764
0
      break;
1765
706k
      case CELT_SET_CHANNELS_REQUEST:
1766
706k
      {
1767
706k
         opus_int32 value = va_arg(ap, opus_int32);
1768
706k
         if (value<1 || value>2)
1769
0
            goto bad_arg;
1770
706k
         st->stream_channels = value;
1771
706k
      }
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
438k
      case OPUS_RESET_STATE:
1791
438k
      {
1792
438k
         int i;
1793
438k
         celt_glog *oldBandE, *oldLogE, *oldLogE2;
1794
438k
         int decode_buffer_size;
1795
438k
#ifdef ENABLE_QEXT
1796
438k
         int qext_scale = st->qext_scale;
1797
438k
#endif
1798
438k
         decode_buffer_size = QEXT_SCALE(DECODE_BUFFER_SIZE);
1799
438k
         oldBandE = (celt_glog*)(st->_decode_mem+(decode_buffer_size+st->overlap)*st->channels);
1800
438k
         oldLogE = oldBandE + 2*st->mode->nbEBands;
1801
438k
         oldLogE2 = oldLogE + 2*st->mode->nbEBands;
1802
438k
         OPUS_CLEAR((char*)&st->DECODER_RESET_START,
1803
438k
               opus_custom_decoder_get_size(st->mode, st->channels)-
1804
438k
               ((char*)&st->DECODER_RESET_START - (char*)st));
1805
18.8M
         for (i=0;i<2*st->mode->nbEBands;i++)
1806
18.4M
            oldLogE[i]=oldLogE2[i]=-GCONST(28.f);
1807
438k
         st->skip_plc = 1;
1808
438k
         st->last_frame_type = FRAME_NONE;
1809
438k
      }
1810
438k
      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
706k
      case CELT_GET_MODE_REQUEST:
1820
706k
      {
1821
706k
         const CELTMode ** value = va_arg(ap, const CELTMode**);
1822
706k
         if (value==0)
1823
0
            goto bad_arg;
1824
706k
         *value=st->mode;
1825
706k
      }
1826
0
      break;
1827
425k
      case CELT_SET_SIGNALLING_REQUEST:
1828
425k
      {
1829
425k
         opus_int32 value = va_arg(ap, opus_int32);
1830
425k
         st->signalling = value;
1831
425k
      }
1832
425k
      break;
1833
532k
      case OPUS_GET_FINAL_RANGE_REQUEST:
1834
532k
      {
1835
532k
         opus_uint32 * value = va_arg(ap, opus_uint32 *);
1836
532k
         if (value==0)
1837
0
            goto bad_arg;
1838
532k
         *value=st->rng;
1839
532k
      }
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.98M
   }
1864
3.98M
   va_end(ap);
1865
3.98M
   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.98M
}