Coverage Report

Created: 2025-07-18 06:42

/src/speex/libspeex/nb_celp.c
Line
Count
Source (jump to first uncovered line)
1
/* Copyright (C) 2002-2006 Jean-Marc Valin
2
   File: nb_celp.c
3
4
   Redistribution and use in source and binary forms, with or without
5
   modification, are permitted provided that the following conditions
6
   are met:
7
8
   - Redistributions of source code must retain the above copyright
9
   notice, this list of conditions and the following disclaimer.
10
11
   - Redistributions in binary form must reproduce the above copyright
12
   notice, this list of conditions and the following disclaimer in the
13
   documentation and/or other materials provided with the distribution.
14
15
   - Neither the name of the Xiph.org Foundation nor the names of its
16
   contributors may be used to endorse or promote products derived from
17
   this software without specific prior written permission.
18
19
   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20
   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21
   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22
   A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
23
   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24
   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25
   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26
   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
27
   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28
   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29
   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
*/
31
32
#ifdef HAVE_CONFIG_H
33
#include "config.h"
34
#endif
35
36
#include <math.h>
37
#include "nb_celp.h"
38
#include "lpc.h"
39
#include "lsp.h"
40
#include "ltp.h"
41
#include "quant_lsp.h"
42
#include "cb_search.h"
43
#include "filters.h"
44
#include "stack_alloc.h"
45
#include "vq.h"
46
#include "vbr.h"
47
#include "arch.h"
48
#include "math_approx.h"
49
#include "os_support.h"
50
51
#ifdef VORBIS_PSYCHO
52
#include "vorbis_psy.h"
53
#endif
54
55
#ifndef NULL
56
#define NULL 0
57
#endif
58
59
2.29M
#define SUBMODE(x) st->submodes[st->submodeID]->x
60
61
/* Default size for the encoder and decoder stack (can be changed at compile time).
62
   This does not apply when using variable-size arrays or alloca. */
63
#ifndef NB_ENC_STACK
64
#define NB_ENC_STACK (8000*sizeof(spx_sig_t))
65
#endif
66
67
#ifndef NB_DEC_STACK
68
#define NB_DEC_STACK (4000*sizeof(spx_sig_t))
69
#endif
70
71
72
#ifdef FIXED_POINT
73
static const spx_word32_t ol_gain_table[32]={18900, 25150, 33468, 44536, 59265, 78865, 104946, 139653, 185838, 247297, 329081, 437913, 582736, 775454, 1031906, 1373169, 1827293, 2431601, 3235761, 4305867, 5729870, 7624808, 10146425, 13501971, 17967238, 23909222, 31816294, 42338330, 56340132, 74972501, 99766822, 132760927};
74
static const spx_word16_t exc_gain_quant_scal3_bound[7]={1841, 3883, 6051, 8062, 10444, 13580, 18560};
75
static const spx_word16_t exc_gain_quant_scal3[8]={1002, 2680, 5086, 7016, 9108, 11781, 15380, 21740};
76
static const spx_word16_t exc_gain_quant_scal1_bound[1]={14385};
77
static const spx_word16_t exc_gain_quant_scal1[2]={11546, 17224};
78
79
219k
#define LSP_MARGIN 16
80
19.6k
#define LSP_DELTA1 6553
81
#define LSP_DELTA2 1638
82
83
#else
84
85
static const float exc_gain_quant_scal3_bound[7]={0.112338f, 0.236980f, 0.369316f, 0.492054f, 0.637471f, 0.828874f, 1.132784f};
86
static const float exc_gain_quant_scal3[8]={0.061130f, 0.163546f, 0.310413f, 0.428220f, 0.555887f, 0.719055f, 0.938694f, 1.326874f};
87
static const float exc_gain_quant_scal1_bound[1]={0.87798f};
88
static const float exc_gain_quant_scal1[2]={0.70469f, 1.05127f};
89
90
110k
#define LSP_MARGIN .002f
91
8.59k
#define LSP_DELTA1 .2f
92
#define LSP_DELTA2 .05f
93
94
#endif
95
96
extern const spx_word16_t lag_window[];
97
extern const spx_word16_t lpc_window[];
98
99
#ifndef DISABLE_ENCODER
100
void *nb_encoder_init(const SpeexMode *m)
101
7.91k
{
102
7.91k
   EncState *st;
103
7.91k
   const SpeexNBMode *mode;
104
7.91k
   int i;
105
106
7.91k
   mode=(const SpeexNBMode *)m->mode;
107
7.91k
   st = (EncState*)speex_alloc(sizeof(EncState));
108
7.91k
   if (!st)
109
0
      return NULL;
110
7.91k
#if defined(VAR_ARRAYS) || defined (USE_ALLOCA)
111
7.91k
   st->stack = NULL;
112
#else
113
   st->stack = (char*)speex_alloc_scratch(NB_ENC_STACK);
114
#endif
115
116
7.91k
   st->mode=m;
117
118
7.91k
   st->gamma1=mode->gamma1;
119
7.91k
   st->gamma2=mode->gamma2;
120
7.91k
   st->lpc_floor = mode->lpc_floor;
121
122
7.91k
   st->submodes=mode->submodes;
123
7.91k
   st->submodeID=st->submodeSelect=mode->defaultSubmode;
124
7.91k
   st->bounded_pitch = 1;
125
126
7.91k
   st->encode_submode = 1;
127
128
#ifdef VORBIS_PSYCHO
129
   st->psy = vorbis_psy_init(8000, 256);
130
   st->curve = (float*)speex_alloc(128*sizeof(float));
131
   st->old_curve = (float*)speex_alloc(128*sizeof(float));
132
   st->psy_window = (float*)speex_alloc(256*sizeof(float));
133
#endif
134
135
7.91k
   st->cumul_gain = 1024;
136
137
7.91k
   st->window= lpc_window;
138
139
   /* Create the window for autocorrelation (lag-windowing) */
140
7.91k
   st->lagWindow = lag_window;
141
142
7.91k
   st->first = 1;
143
87.0k
   for (i=0;i<NB_ORDER;i++)
144
79.1k
      st->old_lsp[i]= DIV32(MULT16_16(QCONST16(3.1415927f, LSP_SHIFT), i+1), NB_ORDER+1);
145
146
7.91k
   st->innov_rms_save = NULL;
147
148
7.91k
#ifndef DISABLE_VBR
149
7.91k
   vbr_init(&st->vbr);
150
7.91k
   st->vbr_quality = 8;
151
7.91k
   st->vbr_enabled = 0;
152
7.91k
   st->vbr_max = 0;
153
7.91k
   st->vad_enabled = 0;
154
7.91k
   st->dtx_enabled = 0;
155
7.91k
   st->dtx_count=0;
156
7.91k
   st->abr_enabled = 0;
157
7.91k
   st->abr_drift = 0;
158
7.91k
   st->abr_drift2 = 0;
159
7.91k
#endif /* #ifndef DISABLE_VBR */
160
161
7.91k
   st->plc_tuning = 2;
162
7.91k
   st->complexity=2;
163
7.91k
   st->sampling_rate=8000;
164
7.91k
   st->isWideband = 0;
165
7.91k
   st->highpass_enabled = 1;
166
167
#ifdef ENABLE_VALGRIND
168
   VALGRIND_MAKE_MEM_DEFINED(st, NB_ENC_STACK);
169
#endif
170
7.91k
   return st;
171
7.91k
}
nb_encoder_init
Line
Count
Source
101
3.95k
{
102
3.95k
   EncState *st;
103
3.95k
   const SpeexNBMode *mode;
104
3.95k
   int i;
105
106
3.95k
   mode=(const SpeexNBMode *)m->mode;
107
3.95k
   st = (EncState*)speex_alloc(sizeof(EncState));
108
3.95k
   if (!st)
109
0
      return NULL;
110
3.95k
#if defined(VAR_ARRAYS) || defined (USE_ALLOCA)
111
3.95k
   st->stack = NULL;
112
#else
113
   st->stack = (char*)speex_alloc_scratch(NB_ENC_STACK);
114
#endif
115
116
3.95k
   st->mode=m;
117
118
3.95k
   st->gamma1=mode->gamma1;
119
3.95k
   st->gamma2=mode->gamma2;
120
3.95k
   st->lpc_floor = mode->lpc_floor;
121
122
3.95k
   st->submodes=mode->submodes;
123
3.95k
   st->submodeID=st->submodeSelect=mode->defaultSubmode;
124
3.95k
   st->bounded_pitch = 1;
125
126
3.95k
   st->encode_submode = 1;
127
128
#ifdef VORBIS_PSYCHO
129
   st->psy = vorbis_psy_init(8000, 256);
130
   st->curve = (float*)speex_alloc(128*sizeof(float));
131
   st->old_curve = (float*)speex_alloc(128*sizeof(float));
132
   st->psy_window = (float*)speex_alloc(256*sizeof(float));
133
#endif
134
135
3.95k
   st->cumul_gain = 1024;
136
137
3.95k
   st->window= lpc_window;
138
139
   /* Create the window for autocorrelation (lag-windowing) */
140
3.95k
   st->lagWindow = lag_window;
141
142
3.95k
   st->first = 1;
143
43.5k
   for (i=0;i<NB_ORDER;i++)
144
39.5k
      st->old_lsp[i]= DIV32(MULT16_16(QCONST16(3.1415927f, LSP_SHIFT), i+1), NB_ORDER+1);
145
146
3.95k
   st->innov_rms_save = NULL;
147
148
3.95k
#ifndef DISABLE_VBR
149
3.95k
   vbr_init(&st->vbr);
150
3.95k
   st->vbr_quality = 8;
151
3.95k
   st->vbr_enabled = 0;
152
3.95k
   st->vbr_max = 0;
153
3.95k
   st->vad_enabled = 0;
154
3.95k
   st->dtx_enabled = 0;
155
3.95k
   st->dtx_count=0;
156
3.95k
   st->abr_enabled = 0;
157
3.95k
   st->abr_drift = 0;
158
3.95k
   st->abr_drift2 = 0;
159
3.95k
#endif /* #ifndef DISABLE_VBR */
160
161
3.95k
   st->plc_tuning = 2;
162
3.95k
   st->complexity=2;
163
3.95k
   st->sampling_rate=8000;
164
3.95k
   st->isWideband = 0;
165
3.95k
   st->highpass_enabled = 1;
166
167
#ifdef ENABLE_VALGRIND
168
   VALGRIND_MAKE_MEM_DEFINED(st, NB_ENC_STACK);
169
#endif
170
3.95k
   return st;
171
3.95k
}
nb_encoder_init
Line
Count
Source
101
3.95k
{
102
3.95k
   EncState *st;
103
3.95k
   const SpeexNBMode *mode;
104
3.95k
   int i;
105
106
3.95k
   mode=(const SpeexNBMode *)m->mode;
107
3.95k
   st = (EncState*)speex_alloc(sizeof(EncState));
108
3.95k
   if (!st)
109
0
      return NULL;
110
3.95k
#if defined(VAR_ARRAYS) || defined (USE_ALLOCA)
111
3.95k
   st->stack = NULL;
112
#else
113
   st->stack = (char*)speex_alloc_scratch(NB_ENC_STACK);
114
#endif
115
116
3.95k
   st->mode=m;
117
118
3.95k
   st->gamma1=mode->gamma1;
119
3.95k
   st->gamma2=mode->gamma2;
120
3.95k
   st->lpc_floor = mode->lpc_floor;
121
122
3.95k
   st->submodes=mode->submodes;
123
3.95k
   st->submodeID=st->submodeSelect=mode->defaultSubmode;
124
3.95k
   st->bounded_pitch = 1;
125
126
3.95k
   st->encode_submode = 1;
127
128
#ifdef VORBIS_PSYCHO
129
   st->psy = vorbis_psy_init(8000, 256);
130
   st->curve = (float*)speex_alloc(128*sizeof(float));
131
   st->old_curve = (float*)speex_alloc(128*sizeof(float));
132
   st->psy_window = (float*)speex_alloc(256*sizeof(float));
133
#endif
134
135
3.95k
   st->cumul_gain = 1024;
136
137
3.95k
   st->window= lpc_window;
138
139
   /* Create the window for autocorrelation (lag-windowing) */
140
3.95k
   st->lagWindow = lag_window;
141
142
3.95k
   st->first = 1;
143
43.5k
   for (i=0;i<NB_ORDER;i++)
144
39.5k
      st->old_lsp[i]= DIV32(MULT16_16(QCONST16(3.1415927f, LSP_SHIFT), i+1), NB_ORDER+1);
145
146
3.95k
   st->innov_rms_save = NULL;
147
148
3.95k
#ifndef DISABLE_VBR
149
3.95k
   vbr_init(&st->vbr);
150
3.95k
   st->vbr_quality = 8;
151
3.95k
   st->vbr_enabled = 0;
152
3.95k
   st->vbr_max = 0;
153
3.95k
   st->vad_enabled = 0;
154
3.95k
   st->dtx_enabled = 0;
155
3.95k
   st->dtx_count=0;
156
3.95k
   st->abr_enabled = 0;
157
3.95k
   st->abr_drift = 0;
158
3.95k
   st->abr_drift2 = 0;
159
3.95k
#endif /* #ifndef DISABLE_VBR */
160
161
3.95k
   st->plc_tuning = 2;
162
3.95k
   st->complexity=2;
163
3.95k
   st->sampling_rate=8000;
164
3.95k
   st->isWideband = 0;
165
3.95k
   st->highpass_enabled = 1;
166
167
#ifdef ENABLE_VALGRIND
168
   VALGRIND_MAKE_MEM_DEFINED(st, NB_ENC_STACK);
169
#endif
170
3.95k
   return st;
171
3.95k
}
172
173
void nb_encoder_destroy(void *state)
174
3.95k
{
175
3.95k
   EncState *st=(EncState *)state;
176
   /* Free all allocated memory */
177
#if !(defined(VAR_ARRAYS) || defined (USE_ALLOCA))
178
   speex_free_scratch(st->stack);
179
#endif
180
181
3.95k
#ifndef DISABLE_VBR
182
3.95k
   vbr_destroy(&st->vbr);
183
3.95k
#endif /* #ifndef DISABLE_VBR */
184
185
#ifdef VORBIS_PSYCHO
186
   vorbis_psy_destroy(st->psy);
187
   speex_free (st->curve);
188
   speex_free (st->old_curve);
189
   speex_free (st->psy_window);
190
#endif
191
192
   /*Free state memory... should be last*/
193
3.95k
   speex_free(st);
194
3.95k
}
195
196
197
int nb_encoder_ctl(void *state, int request, void *ptr)
198
620k
{
199
620k
   EncState *st;
200
620k
   st=(EncState*)state;
201
620k
   switch(request)
202
620k
   {
203
15.7k
   case SPEEX_GET_FRAME_SIZE:
204
15.7k
      (*(spx_int32_t*)ptr) = NB_FRAME_SIZE;
205
15.7k
      break;
206
0
   case SPEEX_SET_LOW_MODE:
207
82.6k
   case SPEEX_SET_MODE:
208
82.6k
      st->submodeSelect = st->submodeID = (*(spx_int32_t*)ptr);
209
82.6k
      break;
210
21.0k
   case SPEEX_GET_LOW_MODE:
211
21.0k
   case SPEEX_GET_MODE:
212
21.0k
      (*(spx_int32_t*)ptr) = st->submodeID;
213
21.0k
      break;
214
0
#ifndef DISABLE_VBR
215
4.85k
      case SPEEX_SET_VBR:
216
4.85k
      st->vbr_enabled = (*(spx_int32_t*)ptr);
217
4.85k
      break;
218
0
   case SPEEX_GET_VBR:
219
0
      (*(spx_int32_t*)ptr) = st->vbr_enabled;
220
0
      break;
221
3.57k
   case SPEEX_SET_VAD:
222
3.57k
      st->vad_enabled = (*(spx_int32_t*)ptr);
223
3.57k
      break;
224
0
   case SPEEX_GET_VAD:
225
0
      (*(spx_int32_t*)ptr) = st->vad_enabled;
226
0
      break;
227
3.42k
   case SPEEX_SET_DTX:
228
3.42k
      st->dtx_enabled = (*(spx_int32_t*)ptr);
229
3.42k
      break;
230
0
   case SPEEX_GET_DTX:
231
0
      (*(spx_int32_t*)ptr) = st->dtx_enabled;
232
0
      break;
233
1.08k
   case SPEEX_SET_ABR:
234
1.08k
      st->abr_enabled = (*(spx_int32_t*)ptr);
235
1.08k
      st->vbr_enabled = st->abr_enabled!=0;
236
1.08k
      if (st->vbr_enabled)
237
1.08k
      {
238
1.08k
         spx_int32_t i=10;
239
1.08k
         spx_int32_t rate, target;
240
1.08k
         float vbr_qual;
241
1.08k
         target = (*(spx_int32_t*)ptr);
242
13.0k
         while (i>=0)
243
11.9k
         {
244
11.9k
            speex_encoder_ctl(st, SPEEX_SET_QUALITY, &i);
245
11.9k
            speex_encoder_ctl(st, SPEEX_GET_BITRATE, &rate);
246
11.9k
            if (rate <= target)
247
0
               break;
248
11.9k
            i--;
249
11.9k
         }
250
1.08k
         vbr_qual=i;
251
1.08k
         if (vbr_qual<0)
252
1.08k
            vbr_qual=0;
253
1.08k
         speex_encoder_ctl(st, SPEEX_SET_VBR_QUALITY, &vbr_qual);
254
1.08k
         st->abr_count=0;
255
1.08k
         st->abr_drift=0;
256
1.08k
         st->abr_drift2=0;
257
1.08k
      }
258
259
1.08k
      break;
260
0
   case SPEEX_GET_ABR:
261
0
      (*(spx_int32_t*)ptr) = st->abr_enabled;
262
0
      break;
263
0
#endif /* #ifndef DISABLE_VBR */
264
0
#if !defined(DISABLE_VBR) && !defined(DISABLE_FLOAT_API)
265
5.93k
   case SPEEX_SET_VBR_QUALITY:
266
5.93k
      st->vbr_quality = (*(float*)ptr);
267
5.93k
      if (st->vbr_quality < 0)
268
0
          st->vbr_quality = 0;
269
5.93k
      else if (st->vbr_quality > 10)
270
0
          st->vbr_quality = 10;
271
5.93k
      break;
272
0
   case SPEEX_GET_VBR_QUALITY:
273
0
      (*(float*)ptr) = st->vbr_quality;
274
0
      break;
275
0
#endif /* !defined(DISABLE_VBR) && !defined(DISABLE_FLOAT_API) */
276
144k
   case SPEEX_SET_QUALITY:
277
144k
      {
278
144k
         int quality = (*(spx_int32_t*)ptr);
279
144k
         if (quality < 0)
280
0
            quality = 0;
281
144k
         if (quality > 10)
282
0
            quality = 10;
283
144k
         st->submodeSelect = st->submodeID = ((const SpeexNBMode*)(st->mode->mode))->quality_map[quality];
284
144k
      }
285
144k
      break;
286
7.91k
   case SPEEX_SET_COMPLEXITY:
287
7.91k
      st->complexity = (*(spx_int32_t*)ptr);
288
7.91k
      if (st->complexity<0)
289
0
         st->complexity=0;
290
7.91k
      break;
291
0
   case SPEEX_GET_COMPLEXITY:
292
0
      (*(spx_int32_t*)ptr) = st->complexity;
293
0
      break;
294
13.5k
   case SPEEX_SET_BITRATE:
295
13.5k
      {
296
13.5k
         spx_int32_t i=10;
297
13.5k
         spx_int32_t rate, target;
298
13.5k
         target = (*(spx_int32_t*)ptr);
299
133k
         while (i>=0)
300
126k
         {
301
126k
            speex_encoder_ctl(st, SPEEX_SET_QUALITY, &i);
302
126k
            speex_encoder_ctl(st, SPEEX_GET_BITRATE, &rate);
303
126k
            if (rate <= target)
304
6.65k
               break;
305
119k
            i--;
306
119k
         }
307
13.5k
      }
308
13.5k
      break;
309
220k
   case SPEEX_GET_BITRATE:
310
220k
      if (st->submodes[st->submodeID])
311
215k
         (*(spx_int32_t*)ptr) = st->sampling_rate*SUBMODE(bits_per_frame)/NB_FRAME_SIZE;
312
5.14k
      else
313
5.14k
         (*(spx_int32_t*)ptr) = st->sampling_rate*(NB_SUBMODE_BITS+1)/NB_FRAME_SIZE;
314
220k
      break;
315
7.91k
   case SPEEX_SET_SAMPLING_RATE:
316
7.91k
      st->sampling_rate = (*(spx_int32_t*)ptr);
317
7.91k
      break;
318
3.88k
   case SPEEX_GET_SAMPLING_RATE:
319
3.88k
      (*(spx_int32_t*)ptr)=st->sampling_rate;
320
3.88k
      break;
321
0
   case SPEEX_RESET_STATE:
322
0
      {
323
0
         int i;
324
0
         st->bounded_pitch = 1;
325
0
         st->first = 1;
326
0
         for (i=0;i<NB_ORDER;i++)
327
0
            st->old_lsp[i]= DIV32(MULT16_16(QCONST16(3.1415927f, LSP_SHIFT), i+1), NB_ORDER+1);
328
0
         for (i=0;i<NB_ORDER;i++)
329
0
            st->mem_sw[i]=st->mem_sw_whole[i]=st->mem_sp[i]=st->mem_exc[i]=0;
330
0
         for (i=0;i<NB_FRAME_SIZE+NB_PITCH_END+1;i++)
331
0
            st->excBuf[i]=st->swBuf[i]=0;
332
0
         for (i=0;i<NB_WINDOW_SIZE-NB_FRAME_SIZE;i++)
333
0
            st->winBuf[i]=0;
334
0
      }
335
0
      break;
336
0
   case SPEEX_SET_SUBMODE_ENCODING:
337
0
      st->encode_submode = (*(spx_int32_t*)ptr);
338
0
      break;
339
0
   case SPEEX_GET_SUBMODE_ENCODING:
340
0
      (*(spx_int32_t*)ptr) = st->encode_submode;
341
0
      break;
342
7.91k
   case SPEEX_GET_LOOKAHEAD:
343
7.91k
      (*(spx_int32_t*)ptr)=(NB_WINDOW_SIZE-NB_FRAME_SIZE);
344
7.91k
      break;
345
0
   case SPEEX_SET_PLC_TUNING:
346
0
      st->plc_tuning = (*(spx_int32_t*)ptr);
347
0
      if (st->plc_tuning>100)
348
0
         st->plc_tuning=100;
349
0
      break;
350
0
   case SPEEX_GET_PLC_TUNING:
351
0
      (*(spx_int32_t*)ptr)=(st->plc_tuning);
352
0
      break;
353
0
#ifndef DISABLE_VBR
354
3.55k
   case SPEEX_SET_VBR_MAX_BITRATE:
355
3.55k
      st->vbr_max = (*(spx_int32_t*)ptr);
356
3.55k
      break;
357
0
   case SPEEX_GET_VBR_MAX_BITRATE:
358
0
      (*(spx_int32_t*)ptr) = st->vbr_max;
359
0
      break;
360
0
#endif /* #ifndef DISABLE_VBR */
361
7.91k
   case SPEEX_SET_HIGHPASS:
362
7.91k
      st->highpass_enabled = (*(spx_int32_t*)ptr);
363
7.91k
      break;
364
0
   case SPEEX_GET_HIGHPASS:
365
0
      (*(spx_int32_t*)ptr) = st->highpass_enabled;
366
0
      break;
367
368
   /* This is all internal stuff past this point */
369
16.2k
   case SPEEX_GET_PI_GAIN:
370
16.2k
      {
371
16.2k
         int i;
372
16.2k
         spx_word32_t *g = (spx_word32_t*)ptr;
373
81.0k
         for (i=0;i<NB_NB_SUBFRAMES;i++)
374
64.8k
            g[i]=st->pi_gain[i];
375
16.2k
      }
376
16.2k
      break;
377
16.2k
   case SPEEX_GET_EXC:
378
16.2k
      {
379
16.2k
         int i;
380
81.0k
         for (i=0;i<NB_NB_SUBFRAMES;i++)
381
64.8k
            ((spx_word16_t*)ptr)[i] = compute_rms16(st->exc+i*NB_SUBFRAME_SIZE, NB_SUBFRAME_SIZE);
382
16.2k
      }
383
16.2k
      break;
384
0
#ifndef DISABLE_VBR
385
11.0k
   case SPEEX_GET_RELATIVE_QUALITY:
386
11.0k
      (*(float*)ptr)=st->relative_quality;
387
11.0k
      break;
388
0
#endif /* #ifndef DISABLE_VBR */
389
16.2k
   case SPEEX_SET_INNOVATION_SAVE:
390
16.2k
      st->innov_rms_save = (spx_word16_t*)ptr;
391
16.2k
      break;
392
5.48k
   case SPEEX_SET_WIDEBAND:
393
5.48k
      st->isWideband = *((spx_int32_t*)ptr);
394
5.48k
      break;
395
0
   case SPEEX_GET_STACK:
396
0
      *((char**)ptr) = st->stack;
397
0
      break;
398
0
   default:
399
0
      speex_warning_int("Unknown nb_ctl request: ", request);
400
0
      return -1;
401
620k
   }
402
620k
   return 0;
403
620k
}
nb_encoder_ctl
Line
Count
Source
198
310k
{
199
310k
   EncState *st;
200
310k
   st=(EncState*)state;
201
310k
   switch(request)
202
310k
   {
203
7.85k
   case SPEEX_GET_FRAME_SIZE:
204
7.85k
      (*(spx_int32_t*)ptr) = NB_FRAME_SIZE;
205
7.85k
      break;
206
0
   case SPEEX_SET_LOW_MODE:
207
41.3k
   case SPEEX_SET_MODE:
208
41.3k
      st->submodeSelect = st->submodeID = (*(spx_int32_t*)ptr);
209
41.3k
      break;
210
10.5k
   case SPEEX_GET_LOW_MODE:
211
10.5k
   case SPEEX_GET_MODE:
212
10.5k
      (*(spx_int32_t*)ptr) = st->submodeID;
213
10.5k
      break;
214
0
#ifndef DISABLE_VBR
215
2.42k
      case SPEEX_SET_VBR:
216
2.42k
      st->vbr_enabled = (*(spx_int32_t*)ptr);
217
2.42k
      break;
218
0
   case SPEEX_GET_VBR:
219
0
      (*(spx_int32_t*)ptr) = st->vbr_enabled;
220
0
      break;
221
1.78k
   case SPEEX_SET_VAD:
222
1.78k
      st->vad_enabled = (*(spx_int32_t*)ptr);
223
1.78k
      break;
224
0
   case SPEEX_GET_VAD:
225
0
      (*(spx_int32_t*)ptr) = st->vad_enabled;
226
0
      break;
227
1.71k
   case SPEEX_SET_DTX:
228
1.71k
      st->dtx_enabled = (*(spx_int32_t*)ptr);
229
1.71k
      break;
230
0
   case SPEEX_GET_DTX:
231
0
      (*(spx_int32_t*)ptr) = st->dtx_enabled;
232
0
      break;
233
544
   case SPEEX_SET_ABR:
234
544
      st->abr_enabled = (*(spx_int32_t*)ptr);
235
544
      st->vbr_enabled = st->abr_enabled!=0;
236
544
      if (st->vbr_enabled)
237
544
      {
238
544
         spx_int32_t i=10;
239
544
         spx_int32_t rate, target;
240
544
         float vbr_qual;
241
544
         target = (*(spx_int32_t*)ptr);
242
6.52k
         while (i>=0)
243
5.98k
         {
244
5.98k
            speex_encoder_ctl(st, SPEEX_SET_QUALITY, &i);
245
5.98k
            speex_encoder_ctl(st, SPEEX_GET_BITRATE, &rate);
246
5.98k
            if (rate <= target)
247
0
               break;
248
5.98k
            i--;
249
5.98k
         }
250
544
         vbr_qual=i;
251
544
         if (vbr_qual<0)
252
544
            vbr_qual=0;
253
544
         speex_encoder_ctl(st, SPEEX_SET_VBR_QUALITY, &vbr_qual);
254
544
         st->abr_count=0;
255
544
         st->abr_drift=0;
256
544
         st->abr_drift2=0;
257
544
      }
258
259
544
      break;
260
0
   case SPEEX_GET_ABR:
261
0
      (*(spx_int32_t*)ptr) = st->abr_enabled;
262
0
      break;
263
0
#endif /* #ifndef DISABLE_VBR */
264
0
#if !defined(DISABLE_VBR) && !defined(DISABLE_FLOAT_API)
265
2.96k
   case SPEEX_SET_VBR_QUALITY:
266
2.96k
      st->vbr_quality = (*(float*)ptr);
267
2.96k
      if (st->vbr_quality < 0)
268
0
          st->vbr_quality = 0;
269
2.96k
      else if (st->vbr_quality > 10)
270
0
          st->vbr_quality = 10;
271
2.96k
      break;
272
0
   case SPEEX_GET_VBR_QUALITY:
273
0
      (*(float*)ptr) = st->vbr_quality;
274
0
      break;
275
0
#endif /* !defined(DISABLE_VBR) && !defined(DISABLE_FLOAT_API) */
276
72.0k
   case SPEEX_SET_QUALITY:
277
72.0k
      {
278
72.0k
         int quality = (*(spx_int32_t*)ptr);
279
72.0k
         if (quality < 0)
280
0
            quality = 0;
281
72.0k
         if (quality > 10)
282
0
            quality = 10;
283
72.0k
         st->submodeSelect = st->submodeID = ((const SpeexNBMode*)(st->mode->mode))->quality_map[quality];
284
72.0k
      }
285
72.0k
      break;
286
3.95k
   case SPEEX_SET_COMPLEXITY:
287
3.95k
      st->complexity = (*(spx_int32_t*)ptr);
288
3.95k
      if (st->complexity<0)
289
0
         st->complexity=0;
290
3.95k
      break;
291
0
   case SPEEX_GET_COMPLEXITY:
292
0
      (*(spx_int32_t*)ptr) = st->complexity;
293
0
      break;
294
6.77k
   case SPEEX_SET_BITRATE:
295
6.77k
      {
296
6.77k
         spx_int32_t i=10;
297
6.77k
         spx_int32_t rate, target;
298
6.77k
         target = (*(spx_int32_t*)ptr);
299
66.5k
         while (i>=0)
300
63.1k
         {
301
63.1k
            speex_encoder_ctl(st, SPEEX_SET_QUALITY, &i);
302
63.1k
            speex_encoder_ctl(st, SPEEX_GET_BITRATE, &rate);
303
63.1k
            if (rate <= target)
304
3.32k
               break;
305
59.8k
            i--;
306
59.8k
         }
307
6.77k
      }
308
6.77k
      break;
309
110k
   case SPEEX_GET_BITRATE:
310
110k
      if (st->submodes[st->submodeID])
311
107k
         (*(spx_int32_t*)ptr) = st->sampling_rate*SUBMODE(bits_per_frame)/NB_FRAME_SIZE;
312
2.57k
      else
313
2.57k
         (*(spx_int32_t*)ptr) = st->sampling_rate*(NB_SUBMODE_BITS+1)/NB_FRAME_SIZE;
314
110k
      break;
315
3.95k
   case SPEEX_SET_SAMPLING_RATE:
316
3.95k
      st->sampling_rate = (*(spx_int32_t*)ptr);
317
3.95k
      break;
318
1.94k
   case SPEEX_GET_SAMPLING_RATE:
319
1.94k
      (*(spx_int32_t*)ptr)=st->sampling_rate;
320
1.94k
      break;
321
0
   case SPEEX_RESET_STATE:
322
0
      {
323
0
         int i;
324
0
         st->bounded_pitch = 1;
325
0
         st->first = 1;
326
0
         for (i=0;i<NB_ORDER;i++)
327
0
            st->old_lsp[i]= DIV32(MULT16_16(QCONST16(3.1415927f, LSP_SHIFT), i+1), NB_ORDER+1);
328
0
         for (i=0;i<NB_ORDER;i++)
329
0
            st->mem_sw[i]=st->mem_sw_whole[i]=st->mem_sp[i]=st->mem_exc[i]=0;
330
0
         for (i=0;i<NB_FRAME_SIZE+NB_PITCH_END+1;i++)
331
0
            st->excBuf[i]=st->swBuf[i]=0;
332
0
         for (i=0;i<NB_WINDOW_SIZE-NB_FRAME_SIZE;i++)
333
0
            st->winBuf[i]=0;
334
0
      }
335
0
      break;
336
0
   case SPEEX_SET_SUBMODE_ENCODING:
337
0
      st->encode_submode = (*(spx_int32_t*)ptr);
338
0
      break;
339
0
   case SPEEX_GET_SUBMODE_ENCODING:
340
0
      (*(spx_int32_t*)ptr) = st->encode_submode;
341
0
      break;
342
3.95k
   case SPEEX_GET_LOOKAHEAD:
343
3.95k
      (*(spx_int32_t*)ptr)=(NB_WINDOW_SIZE-NB_FRAME_SIZE);
344
3.95k
      break;
345
0
   case SPEEX_SET_PLC_TUNING:
346
0
      st->plc_tuning = (*(spx_int32_t*)ptr);
347
0
      if (st->plc_tuning>100)
348
0
         st->plc_tuning=100;
349
0
      break;
350
0
   case SPEEX_GET_PLC_TUNING:
351
0
      (*(spx_int32_t*)ptr)=(st->plc_tuning);
352
0
      break;
353
0
#ifndef DISABLE_VBR
354
1.77k
   case SPEEX_SET_VBR_MAX_BITRATE:
355
1.77k
      st->vbr_max = (*(spx_int32_t*)ptr);
356
1.77k
      break;
357
0
   case SPEEX_GET_VBR_MAX_BITRATE:
358
0
      (*(spx_int32_t*)ptr) = st->vbr_max;
359
0
      break;
360
0
#endif /* #ifndef DISABLE_VBR */
361
3.95k
   case SPEEX_SET_HIGHPASS:
362
3.95k
      st->highpass_enabled = (*(spx_int32_t*)ptr);
363
3.95k
      break;
364
0
   case SPEEX_GET_HIGHPASS:
365
0
      (*(spx_int32_t*)ptr) = st->highpass_enabled;
366
0
      break;
367
368
   /* This is all internal stuff past this point */
369
8.10k
   case SPEEX_GET_PI_GAIN:
370
8.10k
      {
371
8.10k
         int i;
372
8.10k
         spx_word32_t *g = (spx_word32_t*)ptr;
373
40.5k
         for (i=0;i<NB_NB_SUBFRAMES;i++)
374
32.4k
            g[i]=st->pi_gain[i];
375
8.10k
      }
376
8.10k
      break;
377
8.10k
   case SPEEX_GET_EXC:
378
8.10k
      {
379
8.10k
         int i;
380
40.5k
         for (i=0;i<NB_NB_SUBFRAMES;i++)
381
32.4k
            ((spx_word16_t*)ptr)[i] = compute_rms16(st->exc+i*NB_SUBFRAME_SIZE, NB_SUBFRAME_SIZE);
382
8.10k
      }
383
8.10k
      break;
384
0
#ifndef DISABLE_VBR
385
5.53k
   case SPEEX_GET_RELATIVE_QUALITY:
386
5.53k
      (*(float*)ptr)=st->relative_quality;
387
5.53k
      break;
388
0
#endif /* #ifndef DISABLE_VBR */
389
8.10k
   case SPEEX_SET_INNOVATION_SAVE:
390
8.10k
      st->innov_rms_save = (spx_word16_t*)ptr;
391
8.10k
      break;
392
2.74k
   case SPEEX_SET_WIDEBAND:
393
2.74k
      st->isWideband = *((spx_int32_t*)ptr);
394
2.74k
      break;
395
0
   case SPEEX_GET_STACK:
396
0
      *((char**)ptr) = st->stack;
397
0
      break;
398
0
   default:
399
0
      speex_warning_int("Unknown nb_ctl request: ", request);
400
0
      return -1;
401
310k
   }
402
310k
   return 0;
403
310k
}
nb_encoder_ctl
Line
Count
Source
198
310k
{
199
310k
   EncState *st;
200
310k
   st=(EncState*)state;
201
310k
   switch(request)
202
310k
   {
203
7.85k
   case SPEEX_GET_FRAME_SIZE:
204
7.85k
      (*(spx_int32_t*)ptr) = NB_FRAME_SIZE;
205
7.85k
      break;
206
0
   case SPEEX_SET_LOW_MODE:
207
41.3k
   case SPEEX_SET_MODE:
208
41.3k
      st->submodeSelect = st->submodeID = (*(spx_int32_t*)ptr);
209
41.3k
      break;
210
10.5k
   case SPEEX_GET_LOW_MODE:
211
10.5k
   case SPEEX_GET_MODE:
212
10.5k
      (*(spx_int32_t*)ptr) = st->submodeID;
213
10.5k
      break;
214
0
#ifndef DISABLE_VBR
215
2.42k
      case SPEEX_SET_VBR:
216
2.42k
      st->vbr_enabled = (*(spx_int32_t*)ptr);
217
2.42k
      break;
218
0
   case SPEEX_GET_VBR:
219
0
      (*(spx_int32_t*)ptr) = st->vbr_enabled;
220
0
      break;
221
1.78k
   case SPEEX_SET_VAD:
222
1.78k
      st->vad_enabled = (*(spx_int32_t*)ptr);
223
1.78k
      break;
224
0
   case SPEEX_GET_VAD:
225
0
      (*(spx_int32_t*)ptr) = st->vad_enabled;
226
0
      break;
227
1.71k
   case SPEEX_SET_DTX:
228
1.71k
      st->dtx_enabled = (*(spx_int32_t*)ptr);
229
1.71k
      break;
230
0
   case SPEEX_GET_DTX:
231
0
      (*(spx_int32_t*)ptr) = st->dtx_enabled;
232
0
      break;
233
544
   case SPEEX_SET_ABR:
234
544
      st->abr_enabled = (*(spx_int32_t*)ptr);
235
544
      st->vbr_enabled = st->abr_enabled!=0;
236
544
      if (st->vbr_enabled)
237
544
      {
238
544
         spx_int32_t i=10;
239
544
         spx_int32_t rate, target;
240
544
         float vbr_qual;
241
544
         target = (*(spx_int32_t*)ptr);
242
6.52k
         while (i>=0)
243
5.98k
         {
244
5.98k
            speex_encoder_ctl(st, SPEEX_SET_QUALITY, &i);
245
5.98k
            speex_encoder_ctl(st, SPEEX_GET_BITRATE, &rate);
246
5.98k
            if (rate <= target)
247
0
               break;
248
5.98k
            i--;
249
5.98k
         }
250
544
         vbr_qual=i;
251
544
         if (vbr_qual<0)
252
544
            vbr_qual=0;
253
544
         speex_encoder_ctl(st, SPEEX_SET_VBR_QUALITY, &vbr_qual);
254
544
         st->abr_count=0;
255
544
         st->abr_drift=0;
256
544
         st->abr_drift2=0;
257
544
      }
258
259
544
      break;
260
0
   case SPEEX_GET_ABR:
261
0
      (*(spx_int32_t*)ptr) = st->abr_enabled;
262
0
      break;
263
0
#endif /* #ifndef DISABLE_VBR */
264
0
#if !defined(DISABLE_VBR) && !defined(DISABLE_FLOAT_API)
265
2.96k
   case SPEEX_SET_VBR_QUALITY:
266
2.96k
      st->vbr_quality = (*(float*)ptr);
267
2.96k
      if (st->vbr_quality < 0)
268
0
          st->vbr_quality = 0;
269
2.96k
      else if (st->vbr_quality > 10)
270
0
          st->vbr_quality = 10;
271
2.96k
      break;
272
0
   case SPEEX_GET_VBR_QUALITY:
273
0
      (*(float*)ptr) = st->vbr_quality;
274
0
      break;
275
0
#endif /* !defined(DISABLE_VBR) && !defined(DISABLE_FLOAT_API) */
276
72.0k
   case SPEEX_SET_QUALITY:
277
72.0k
      {
278
72.0k
         int quality = (*(spx_int32_t*)ptr);
279
72.0k
         if (quality < 0)
280
0
            quality = 0;
281
72.0k
         if (quality > 10)
282
0
            quality = 10;
283
72.0k
         st->submodeSelect = st->submodeID = ((const SpeexNBMode*)(st->mode->mode))->quality_map[quality];
284
72.0k
      }
285
72.0k
      break;
286
3.95k
   case SPEEX_SET_COMPLEXITY:
287
3.95k
      st->complexity = (*(spx_int32_t*)ptr);
288
3.95k
      if (st->complexity<0)
289
0
         st->complexity=0;
290
3.95k
      break;
291
0
   case SPEEX_GET_COMPLEXITY:
292
0
      (*(spx_int32_t*)ptr) = st->complexity;
293
0
      break;
294
6.77k
   case SPEEX_SET_BITRATE:
295
6.77k
      {
296
6.77k
         spx_int32_t i=10;
297
6.77k
         spx_int32_t rate, target;
298
6.77k
         target = (*(spx_int32_t*)ptr);
299
66.5k
         while (i>=0)
300
63.1k
         {
301
63.1k
            speex_encoder_ctl(st, SPEEX_SET_QUALITY, &i);
302
63.1k
            speex_encoder_ctl(st, SPEEX_GET_BITRATE, &rate);
303
63.1k
            if (rate <= target)
304
3.32k
               break;
305
59.8k
            i--;
306
59.8k
         }
307
6.77k
      }
308
6.77k
      break;
309
110k
   case SPEEX_GET_BITRATE:
310
110k
      if (st->submodes[st->submodeID])
311
107k
         (*(spx_int32_t*)ptr) = st->sampling_rate*SUBMODE(bits_per_frame)/NB_FRAME_SIZE;
312
2.57k
      else
313
2.57k
         (*(spx_int32_t*)ptr) = st->sampling_rate*(NB_SUBMODE_BITS+1)/NB_FRAME_SIZE;
314
110k
      break;
315
3.95k
   case SPEEX_SET_SAMPLING_RATE:
316
3.95k
      st->sampling_rate = (*(spx_int32_t*)ptr);
317
3.95k
      break;
318
1.94k
   case SPEEX_GET_SAMPLING_RATE:
319
1.94k
      (*(spx_int32_t*)ptr)=st->sampling_rate;
320
1.94k
      break;
321
0
   case SPEEX_RESET_STATE:
322
0
      {
323
0
         int i;
324
0
         st->bounded_pitch = 1;
325
0
         st->first = 1;
326
0
         for (i=0;i<NB_ORDER;i++)
327
0
            st->old_lsp[i]= DIV32(MULT16_16(QCONST16(3.1415927f, LSP_SHIFT), i+1), NB_ORDER+1);
328
0
         for (i=0;i<NB_ORDER;i++)
329
0
            st->mem_sw[i]=st->mem_sw_whole[i]=st->mem_sp[i]=st->mem_exc[i]=0;
330
0
         for (i=0;i<NB_FRAME_SIZE+NB_PITCH_END+1;i++)
331
0
            st->excBuf[i]=st->swBuf[i]=0;
332
0
         for (i=0;i<NB_WINDOW_SIZE-NB_FRAME_SIZE;i++)
333
0
            st->winBuf[i]=0;
334
0
      }
335
0
      break;
336
0
   case SPEEX_SET_SUBMODE_ENCODING:
337
0
      st->encode_submode = (*(spx_int32_t*)ptr);
338
0
      break;
339
0
   case SPEEX_GET_SUBMODE_ENCODING:
340
0
      (*(spx_int32_t*)ptr) = st->encode_submode;
341
0
      break;
342
3.95k
   case SPEEX_GET_LOOKAHEAD:
343
3.95k
      (*(spx_int32_t*)ptr)=(NB_WINDOW_SIZE-NB_FRAME_SIZE);
344
3.95k
      break;
345
0
   case SPEEX_SET_PLC_TUNING:
346
0
      st->plc_tuning = (*(spx_int32_t*)ptr);
347
0
      if (st->plc_tuning>100)
348
0
         st->plc_tuning=100;
349
0
      break;
350
0
   case SPEEX_GET_PLC_TUNING:
351
0
      (*(spx_int32_t*)ptr)=(st->plc_tuning);
352
0
      break;
353
0
#ifndef DISABLE_VBR
354
1.77k
   case SPEEX_SET_VBR_MAX_BITRATE:
355
1.77k
      st->vbr_max = (*(spx_int32_t*)ptr);
356
1.77k
      break;
357
0
   case SPEEX_GET_VBR_MAX_BITRATE:
358
0
      (*(spx_int32_t*)ptr) = st->vbr_max;
359
0
      break;
360
0
#endif /* #ifndef DISABLE_VBR */
361
3.95k
   case SPEEX_SET_HIGHPASS:
362
3.95k
      st->highpass_enabled = (*(spx_int32_t*)ptr);
363
3.95k
      break;
364
0
   case SPEEX_GET_HIGHPASS:
365
0
      (*(spx_int32_t*)ptr) = st->highpass_enabled;
366
0
      break;
367
368
   /* This is all internal stuff past this point */
369
8.10k
   case SPEEX_GET_PI_GAIN:
370
8.10k
      {
371
8.10k
         int i;
372
8.10k
         spx_word32_t *g = (spx_word32_t*)ptr;
373
40.5k
         for (i=0;i<NB_NB_SUBFRAMES;i++)
374
32.4k
            g[i]=st->pi_gain[i];
375
8.10k
      }
376
8.10k
      break;
377
8.10k
   case SPEEX_GET_EXC:
378
8.10k
      {
379
8.10k
         int i;
380
40.5k
         for (i=0;i<NB_NB_SUBFRAMES;i++)
381
32.4k
            ((spx_word16_t*)ptr)[i] = compute_rms16(st->exc+i*NB_SUBFRAME_SIZE, NB_SUBFRAME_SIZE);
382
8.10k
      }
383
8.10k
      break;
384
0
#ifndef DISABLE_VBR
385
5.53k
   case SPEEX_GET_RELATIVE_QUALITY:
386
5.53k
      (*(float*)ptr)=st->relative_quality;
387
5.53k
      break;
388
0
#endif /* #ifndef DISABLE_VBR */
389
8.10k
   case SPEEX_SET_INNOVATION_SAVE:
390
8.10k
      st->innov_rms_save = (spx_word16_t*)ptr;
391
8.10k
      break;
392
2.74k
   case SPEEX_SET_WIDEBAND:
393
2.74k
      st->isWideband = *((spx_int32_t*)ptr);
394
2.74k
      break;
395
0
   case SPEEX_GET_STACK:
396
0
      *((char**)ptr) = st->stack;
397
0
      break;
398
0
   default:
399
0
      speex_warning_int("Unknown nb_ctl request: ", request);
400
0
      return -1;
401
310k
   }
402
310k
   return 0;
403
310k
}
404
405
406
int nb_encode(void *state, void *vin, SpeexBits *bits)
407
28.2k
{
408
28.2k
   EncState *st;
409
28.2k
   int i, sub, roots;
410
28.2k
   int ol_pitch;
411
28.2k
   spx_word16_t ol_pitch_coef;
412
28.2k
   spx_word32_t ol_gain;
413
28.2k
   VARDECL(spx_word16_t *target);
414
28.2k
   VARDECL(spx_sig_t *innov);
415
28.2k
   VARDECL(spx_word32_t *exc32);
416
28.2k
   VARDECL(spx_mem_t *mem);
417
28.2k
   VARDECL(spx_coef_t *bw_lpc1);
418
28.2k
   VARDECL(spx_coef_t *bw_lpc2);
419
28.2k
   VARDECL(spx_coef_t *lpc);
420
28.2k
   VARDECL(spx_lsp_t *lsp);
421
28.2k
   VARDECL(spx_lsp_t *qlsp);
422
28.2k
   VARDECL(spx_lsp_t *interp_lsp);
423
28.2k
   VARDECL(spx_lsp_t *interp_qlsp);
424
28.2k
   VARDECL(spx_coef_t *interp_lpc);
425
28.2k
   VARDECL(spx_coef_t *interp_qlpc);
426
28.2k
   char *stack;
427
28.2k
   VARDECL(spx_word16_t *syn_resp);
428
429
28.2k
   spx_word32_t ener=0;
430
28.2k
   spx_word16_t fine_gain;
431
28.2k
   spx_word16_t *in = (spx_word16_t*)vin;
432
433
28.2k
   st=(EncState *)state;
434
28.2k
   stack=st->stack;
435
436
28.2k
   ALLOC(lpc, NB_ORDER, spx_coef_t);
437
28.2k
   ALLOC(bw_lpc1, NB_ORDER, spx_coef_t);
438
28.2k
   ALLOC(bw_lpc2, NB_ORDER, spx_coef_t);
439
28.2k
   ALLOC(lsp, NB_ORDER, spx_lsp_t);
440
28.2k
   ALLOC(qlsp, NB_ORDER, spx_lsp_t);
441
28.2k
   ALLOC(interp_lsp, NB_ORDER, spx_lsp_t);
442
28.2k
   ALLOC(interp_qlsp, NB_ORDER, spx_lsp_t);
443
28.2k
   ALLOC(interp_lpc, NB_ORDER, spx_coef_t);
444
28.2k
   ALLOC(interp_qlpc, NB_ORDER, spx_coef_t);
445
446
28.2k
   st->exc = st->excBuf + NB_PITCH_END + 2;
447
28.2k
   st->sw = st->swBuf + NB_PITCH_END + 2;
448
   /* Move signals 1 frame towards the past */
449
28.2k
   SPEEX_MOVE(st->excBuf, st->excBuf+NB_FRAME_SIZE, NB_PITCH_END+2);
450
28.2k
   SPEEX_MOVE(st->swBuf, st->swBuf+NB_FRAME_SIZE, NB_PITCH_END+2);
451
452
28.2k
   if (st->highpass_enabled)
453
11.8k
      highpass(in, in, NB_FRAME_SIZE, (st->isWideband?HIGHPASS_WIDEBAND:HIGHPASS_NARROWBAND)|HIGHPASS_INPUT, st->mem_hp);
454
455
28.2k
   {
456
28.2k
      VARDECL(spx_word16_t *w_sig);
457
28.2k
      VARDECL(spx_word16_t *autocorr);
458
28.2k
      ALLOC(w_sig, NB_WINDOW_SIZE, spx_word16_t);
459
28.2k
      ALLOC(autocorr, NB_ORDER+1, spx_word16_t);
460
      /* Window for analysis */
461
1.15M
      for (i=0;i<NB_WINDOW_SIZE-NB_FRAME_SIZE;i++)
462
1.13M
         w_sig[i] = MULT16_16_Q15(st->winBuf[i],st->window[i]);
463
4.55M
      for (;i<NB_WINDOW_SIZE;i++)
464
4.52M
         w_sig[i] = MULT16_16_Q15(in[i-NB_WINDOW_SIZE+NB_FRAME_SIZE],st->window[i]);
465
      /* Compute auto-correlation */
466
28.2k
      _spx_autocorr(w_sig, autocorr, NB_ORDER+1, NB_WINDOW_SIZE);
467
28.2k
      autocorr[0] = ADD16(autocorr[0],MULT16_16_Q15(autocorr[0],st->lpc_floor)); /* Noise floor in auto-correlation domain */
468
469
      /* Lag windowing: equivalent to filtering in the power-spectrum domain */
470
339k
      for (i=0;i<NB_ORDER+1;i++)
471
311k
         autocorr[i] = MULT16_16_Q15(autocorr[i],st->lagWindow[i]);
472
28.2k
      autocorr[0] = ADD16(autocorr[0],1);
473
474
      /* Levinson-Durbin */
475
28.2k
      _spx_lpc(lpc, autocorr, NB_ORDER);
476
      /* LPC to LSPs (x-domain) transform */
477
28.2k
      roots=lpc_to_lsp (lpc, NB_ORDER, lsp, 10, LSP_DELTA1, stack);
478
      /* Check if we found all the roots */
479
28.2k
      if (roots!=NB_ORDER)
480
56
      {
481
         /*If we can't find all LSP's, do some damage control and use previous filter*/
482
616
         for (i=0;i<NB_ORDER;i++)
483
560
         {
484
560
            lsp[i]=st->old_lsp[i];
485
560
         }
486
56
      }
487
28.2k
   }
488
489
490
491
492
   /* Whole frame analysis (open-loop estimation of pitch and excitation gain) */
493
28.2k
   {
494
28.2k
      int diff = NB_WINDOW_SIZE-NB_FRAME_SIZE;
495
28.2k
      if (st->first)
496
63.3k
         for (i=0;i<NB_ORDER;i++)
497
57.6k
            interp_lsp[i] = lsp[i];
498
22.5k
      else
499
22.5k
         lsp_interpolate(st->old_lsp, lsp, interp_lsp, NB_ORDER, NB_NB_SUBFRAMES, NB_NB_SUBFRAMES<<1, LSP_MARGIN);
500
501
      /* Compute interpolated LPCs (unquantized) for whole frame*/
502
28.2k
      lsp_to_lpc(interp_lsp, interp_lpc, NB_ORDER,stack);
503
504
505
      /*Open-loop pitch*/
506
28.2k
      if (!st->submodes[st->submodeID] || (st->complexity>2 && SUBMODE(have_subframe_gain)<3) || SUBMODE(forced_pitch_gain) || SUBMODE(lbr_pitch) != -1
507
28.2k
#ifndef DISABLE_VBR
508
28.2k
           || st->vbr_enabled || st->vad_enabled
509
28.2k
#endif
510
28.2k
                  )
511
26.1k
      {
512
26.1k
         int nol_pitch[6];
513
26.1k
         spx_word16_t nol_pitch_coef[6];
514
515
26.1k
         bw_lpc(QCONST16(0.9,15), interp_lpc, bw_lpc1, NB_ORDER);
516
26.1k
         bw_lpc(QCONST16(0.55,15), interp_lpc, bw_lpc2, NB_ORDER);
517
518
26.1k
         SPEEX_COPY(st->sw, st->winBuf, diff);
519
26.1k
         SPEEX_COPY(st->sw+diff, in, NB_FRAME_SIZE-diff);
520
26.1k
         filter10(st->sw, bw_lpc1, bw_lpc2, st->sw, NB_FRAME_SIZE, st->mem_sw_whole, stack);
521
522
26.1k
         open_loop_nbest_pitch(st->sw, NB_PITCH_START, NB_PITCH_END, NB_FRAME_SIZE,
523
26.1k
                               nol_pitch, nol_pitch_coef, 6, stack);
524
26.1k
         ol_pitch=nol_pitch[0];
525
26.1k
         ol_pitch_coef = nol_pitch_coef[0];
526
         /*Try to remove pitch multiples*/
527
156k
         for (i=1;i<6;i++)
528
130k
         {
529
#ifdef FIXED_POINT
530
90.8k
            if ((nol_pitch_coef[i]>MULT16_16_Q15(nol_pitch_coef[0],27853)) &&
531
#else
532
39.9k
            if ((nol_pitch_coef[i]>.85*nol_pitch_coef[0]) &&
533
#endif
534
39.9k
                (ABS(2*nol_pitch[i]-ol_pitch)<=2 || ABS(3*nol_pitch[i]-ol_pitch)<=3 ||
535
29.7k
                 ABS(4*nol_pitch[i]-ol_pitch)<=4 || ABS(5*nol_pitch[i]-ol_pitch)<=5))
536
1.04k
            {
537
               /*ol_pitch_coef=nol_pitch_coef[i];*/
538
1.04k
               ol_pitch = nol_pitch[i];
539
1.04k
            }
540
130k
         }
541
         /*if (ol_pitch>50)
542
           ol_pitch/=2;*/
543
         /*ol_pitch_coef = sqrt(ol_pitch_coef);*/
544
545
26.1k
      } else {
546
2.11k
         ol_pitch=0;
547
2.11k
         ol_pitch_coef=0;
548
2.11k
      }
549
550
      /*Compute "real" excitation*/
551
      /*SPEEX_COPY(st->exc, st->winBuf, diff);
552
      SPEEX_COPY(st->exc+diff, in, NB_FRAME_SIZE-diff);*/
553
28.2k
      fir_mem16(st->winBuf, interp_lpc, st->exc, diff, NB_ORDER, st->mem_exc, stack);
554
28.2k
      fir_mem16(in, interp_lpc, st->exc+diff, NB_FRAME_SIZE-diff, NB_ORDER, st->mem_exc, stack);
555
556
      /* Compute open-loop excitation gain */
557
28.2k
      {
558
28.2k
         spx_word16_t g = compute_rms16(st->exc, NB_FRAME_SIZE);
559
28.2k
         if (st->submodeID!=1 && ol_pitch>0)
560
12.7k
            ol_gain = MULT16_16(g, MULT16_16_Q14(QCONST16(1.1,14),
561
28.2k
                                spx_sqrt(QCONST32(1.,28)-MULT16_32_Q15(QCONST16(.8,15),SHL32(MULT16_16(ol_pitch_coef,ol_pitch_coef),16)))));
562
15.5k
         else
563
15.5k
            ol_gain = SHL32(EXTEND32(g),SIG_SHIFT);
564
28.2k
      }
565
28.2k
   }
566
567
#ifdef VORBIS_PSYCHO
568
   SPEEX_MOVE(st->psy_window, st->psy_window+NB_FRAME_SIZE, 256-NB_FRAME_SIZE);
569
   SPEEX_COPY(&st->psy_window[256-NB_FRAME_SIZE], in, NB_FRAME_SIZE);
570
   compute_curve(st->psy, st->psy_window, st->curve);
571
   /*print_vec(st->curve, 128, "curve");*/
572
   if (st->first)
573
      SPEEX_COPY(st->old_curve, st->curve, 128);
574
#endif
575
576
   /*VBR stuff*/
577
28.2k
#ifndef DISABLE_VBR
578
28.2k
   if (st->vbr_enabled||st->vad_enabled)
579
21.5k
   {
580
21.5k
      float lsp_dist=0;
581
236k
      for (i=0;i<NB_ORDER;i++)
582
215k
         lsp_dist += (st->old_lsp[i] - lsp[i])*(st->old_lsp[i] - lsp[i]);
583
21.5k
      lsp_dist /= LSP_SCALING*LSP_SCALING;
584
585
21.5k
      if (st->abr_enabled)
586
5.44k
      {
587
5.44k
         float qual_change=0;
588
5.44k
         if (st->abr_drift2 * st->abr_drift > 0)
589
4.89k
         {
590
            /* Only adapt if long-term and short-term drift are the same sign */
591
4.89k
            qual_change = -.00001*st->abr_drift/(1+st->abr_count);
592
4.89k
            if (qual_change>.05)
593
0
               qual_change=.05;
594
4.89k
            if (qual_change<-.05)
595
1.19k
               qual_change=-.05;
596
4.89k
         }
597
5.44k
         st->vbr_quality += qual_change;
598
5.44k
         if (st->vbr_quality>10)
599
0
            st->vbr_quality=10;
600
5.44k
         if (st->vbr_quality<0)
601
4.89k
            st->vbr_quality=0;
602
5.44k
      }
603
604
21.5k
      st->relative_quality = vbr_analysis(&st->vbr, in, NB_FRAME_SIZE, ol_pitch, GAIN_SCALING_1*ol_pitch_coef);
605
      /*if (delta_qual<0)*/
606
      /*  delta_qual*=.1*(3+st->vbr_quality);*/
607
21.5k
      if (st->vbr_enabled)
608
16.9k
      {
609
16.9k
         spx_int32_t mode;
610
16.9k
         int choice=0;
611
16.9k
         float min_diff=100;
612
16.9k
         mode = 8;
613
152k
         while (mode)
614
135k
         {
615
135k
            int v1;
616
135k
            float thresh;
617
135k
            v1=(int)floor(st->vbr_quality);
618
135k
            if (v1==10)
619
9.61k
               thresh = vbr_nb_thresh[mode][v1];
620
125k
            else
621
125k
               thresh = (st->vbr_quality-v1)*vbr_nb_thresh[mode][v1+1] + (1+v1-st->vbr_quality)*vbr_nb_thresh[mode][v1];
622
135k
            if (st->relative_quality > thresh &&
623
135k
                st->relative_quality-thresh<min_diff)
624
17.5k
            {
625
17.5k
               choice = mode;
626
17.5k
               min_diff = st->relative_quality-thresh;
627
17.5k
            }
628
135k
            mode--;
629
135k
         }
630
16.9k
         mode=choice;
631
16.9k
         if (mode==0)
632
4.85k
         {
633
4.85k
            if (st->dtx_count==0 || lsp_dist>.05 || !st->dtx_enabled || st->dtx_count>20)
634
2.88k
            {
635
2.88k
               mode=1;
636
2.88k
               st->dtx_count=1;
637
2.88k
            } else {
638
1.96k
               mode=0;
639
1.96k
               st->dtx_count++;
640
1.96k
            }
641
12.0k
         } else {
642
12.0k
            st->dtx_count=0;
643
12.0k
         }
644
645
16.9k
         speex_encoder_ctl(state, SPEEX_SET_MODE, &mode);
646
16.9k
         if (st->vbr_max>0)
647
12.5k
         {
648
12.5k
            spx_int32_t rate;
649
12.5k
            speex_encoder_ctl(state, SPEEX_GET_BITRATE, &rate);
650
12.5k
            if (rate > st->vbr_max)
651
4.76k
            {
652
4.76k
               rate = st->vbr_max;
653
4.76k
               speex_encoder_ctl(state, SPEEX_SET_BITRATE, &rate);
654
4.76k
            }
655
12.5k
         }
656
657
16.9k
         if (st->abr_enabled)
658
5.44k
         {
659
5.44k
            spx_int32_t bitrate;
660
5.44k
            speex_encoder_ctl(state, SPEEX_GET_BITRATE, &bitrate);
661
5.44k
            st->abr_drift+=(bitrate-st->abr_enabled);
662
5.44k
            st->abr_drift2 = .95*st->abr_drift2 + .05*(bitrate-st->abr_enabled);
663
5.44k
            st->abr_count += 1.0;
664
5.44k
         }
665
666
16.9k
      } else {
667
         /*VAD only case*/
668
4.60k
         int mode;
669
4.60k
         if (st->relative_quality<2)
670
1.47k
         {
671
1.47k
            if (st->dtx_count==0 || lsp_dist>.05 || !st->dtx_enabled || st->dtx_count>20)
672
906
            {
673
906
               st->dtx_count=1;
674
906
               mode=1;
675
906
            } else {
676
564
               mode=0;
677
564
               st->dtx_count++;
678
564
            }
679
3.13k
         } else {
680
3.13k
            st->dtx_count = 0;
681
3.13k
            mode=st->submodeSelect;
682
3.13k
         }
683
         /*speex_encoder_ctl(state, SPEEX_SET_MODE, &mode);*/
684
4.60k
         st->submodeID=mode;
685
4.60k
      }
686
21.5k
   } else {
687
6.74k
      st->relative_quality = -1;
688
6.74k
   }
689
28.2k
#endif /* #ifndef DISABLE_VBR */
690
691
28.2k
   if (st->encode_submode)
692
28.2k
   {
693
      /* First, transmit a zero for narrowband */
694
28.2k
      speex_bits_pack(bits, 0, 1);
695
696
      /* Transmit the sub-mode we use for this frame */
697
28.2k
      speex_bits_pack(bits, st->submodeID, NB_SUBMODE_BITS);
698
699
28.2k
   }
700
701
   /* If null mode (no transmission), just set a couple things to zero*/
702
28.2k
   if (st->submodes[st->submodeID] == NULL)
703
2.38k
   {
704
384k
      for (i=0;i<NB_FRAME_SIZE;i++)
705
381k
         st->exc[i]=st->sw[i]=VERY_SMALL;
706
707
26.2k
      for (i=0;i<NB_ORDER;i++)
708
23.8k
         st->mem_sw[i]=0;
709
2.38k
      st->first=1;
710
2.38k
      st->bounded_pitch = 1;
711
712
2.38k
      SPEEX_COPY(st->winBuf, in+2*NB_FRAME_SIZE-NB_WINDOW_SIZE, NB_WINDOW_SIZE-NB_FRAME_SIZE);
713
714
      /* Clear memory (no need to really compute it) */
715
26.2k
      for (i=0;i<NB_ORDER;i++)
716
23.8k
         st->mem_sp[i] = 0;
717
2.38k
      return 0;
718
719
2.38k
   }
720
721
   /* LSP Quantization */
722
25.8k
   if (st->first)
723
4.02k
   {
724
44.2k
      for (i=0;i<NB_ORDER;i++)
725
40.2k
         st->old_lsp[i] = lsp[i];
726
4.02k
   }
727
728
729
   /*Quantize LSPs*/
730
25.8k
#if 1 /*0 for unquantized*/
731
25.8k
   SUBMODE(lsp_quant)(lsp, qlsp, NB_ORDER, bits);
732
#else
733
   for (i=0;i<NB_ORDER;i++)
734
     qlsp[i]=lsp[i];
735
#endif
736
737
   /*If we use low bit-rate pitch mode, transmit open-loop pitch*/
738
25.8k
   if (SUBMODE(lbr_pitch)!=-1)
739
17.4k
   {
740
17.4k
      speex_bits_pack(bits, ol_pitch-NB_PITCH_START, 7);
741
17.4k
   }
742
743
25.8k
   if (SUBMODE(forced_pitch_gain))
744
15.9k
   {
745
15.9k
      int quant;
746
      /* This just damps the pitch a bit, because it tends to be too aggressive when forced */
747
15.9k
      ol_pitch_coef = MULT16_16_Q15(QCONST16(.9,15), ol_pitch_coef);
748
#ifdef FIXED_POINT
749
11.2k
      quant = PSHR16(MULT16_16_16(15, ol_pitch_coef),GAIN_SHIFT);
750
#else
751
4.77k
      quant = (int)floor(.5+15*ol_pitch_coef*GAIN_SCALING_1);
752
#endif
753
15.9k
      if (quant>15)
754
131
         quant=15;
755
15.9k
      if (quant<0)
756
0
         quant=0;
757
15.9k
      speex_bits_pack(bits, quant, 4);
758
15.9k
      ol_pitch_coef=MULT16_16_P15(QCONST16(0.066667,15),SHL16(quant,GAIN_SHIFT));
759
15.9k
   }
760
761
762
   /*Quantize and transmit open-loop excitation gain*/
763
#ifdef FIXED_POINT
764
   {
765
      int qe = scal_quant32(ol_gain, ol_gain_table, 32);
766
      /*ol_gain = exp(qe/3.5)*SIG_SCALING;*/
767
18.4k
      ol_gain = MULT16_32_Q15(28406,ol_gain_table[qe]);
768
      speex_bits_pack(bits, qe, 5);
769
   }
770
#else
771
   {
772
7.39k
      int qe = (int)(floor(.5+3.5*log(ol_gain*1.0/SIG_SCALING)));
773
7.39k
      if (qe<0)
774
4.67k
         qe=0;
775
7.39k
      if (qe>31)
776
422
         qe=31;
777
7.39k
      ol_gain = exp(qe/3.5)*SIG_SCALING;
778
      speex_bits_pack(bits, qe, 5);
779
   }
780
#endif
781
782
783
784
   /* Special case for first frame */
785
25.8k
   if (st->first)
786
4.02k
   {
787
44.2k
      for (i=0;i<NB_ORDER;i++)
788
40.2k
         st->old_qlsp[i] = qlsp[i];
789
4.02k
   }
790
791
   /* Target signal */
792
25.8k
   ALLOC(target, NB_SUBFRAME_SIZE, spx_word16_t);
793
25.8k
   ALLOC(innov, NB_SUBFRAME_SIZE, spx_sig_t);
794
25.8k
   ALLOC(exc32, NB_SUBFRAME_SIZE, spx_word32_t);
795
25.8k
   ALLOC(syn_resp, NB_SUBFRAME_SIZE, spx_word16_t);
796
25.8k
   ALLOC(mem, NB_ORDER, spx_mem_t);
797
798
   /* Loop on sub-frames */
799
129k
   for (sub=0;sub<NB_NB_SUBFRAMES;sub++)
800
103k
   {
801
103k
      int   offset;
802
103k
      spx_word16_t *sw;
803
103k
      spx_word16_t *exc, *inBuf;
804
103k
      int pitch;
805
103k
      int response_bound = NB_SUBFRAME_SIZE;
806
807
      /* Offset relative to start of frame */
808
103k
      offset = NB_SUBFRAME_SIZE*sub;
809
      /* Excitation */
810
103k
      exc=st->exc+offset;
811
      /* Weighted signal */
812
103k
      sw=st->sw+offset;
813
814
      /* LSP interpolation (quantized and unquantized) */
815
103k
      lsp_interpolate(st->old_lsp, lsp, interp_lsp, NB_ORDER, sub, NB_NB_SUBFRAMES, LSP_MARGIN);
816
103k
      lsp_interpolate(st->old_qlsp, qlsp, interp_qlsp, NB_ORDER, sub, NB_NB_SUBFRAMES, LSP_MARGIN);
817
818
      /* Compute interpolated LPCs (quantized and unquantized) */
819
103k
      lsp_to_lpc(interp_lsp, interp_lpc, NB_ORDER,stack);
820
821
103k
      lsp_to_lpc(interp_qlsp, interp_qlpc, NB_ORDER, stack);
822
823
      /* Compute analysis filter gain at w=pi (for use in SB-CELP) */
824
103k
      {
825
103k
         spx_word32_t pi_g=LPC_SCALING;
826
621k
         for (i=0;i<NB_ORDER;i+=2)
827
517k
         {
828
            /*pi_g += -st->interp_qlpc[i] +  st->interp_qlpc[i+1];*/
829
517k
            pi_g = ADD32(pi_g, SUB32(EXTEND32(interp_qlpc[i+1]),EXTEND32(interp_qlpc[i])));
830
517k
         }
831
103k
         st->pi_gain[sub] = pi_g;
832
103k
      }
833
834
#ifdef VORBIS_PSYCHO
835
      {
836
         float curr_curve[128];
837
         float fact = ((float)sub+1.0f)/NB_NB_SUBFRAMES;
838
         for (i=0;i<128;i++)
839
            curr_curve[i] = (1.0f-fact)*st->old_curve[i] + fact*st->curve[i];
840
         curve_to_lpc(st->psy, curr_curve, bw_lpc1, bw_lpc2, 10);
841
      }
842
#else
843
      /* Compute bandwidth-expanded (unquantized) LPCs for perceptual weighting */
844
103k
      bw_lpc(st->gamma1, interp_lpc, bw_lpc1, NB_ORDER);
845
103k
      bw_lpc(st->gamma2, interp_lpc, bw_lpc2, NB_ORDER);
846
      /*print_vec(st->bw_lpc1, 10, "bw_lpc");*/
847
103k
#endif
848
849
      /*FIXME: This will break if we change the window size */
850
103k
      speex_assert(NB_WINDOW_SIZE-NB_FRAME_SIZE == NB_SUBFRAME_SIZE);
851
103k
      if (sub==0)
852
25.8k
         inBuf = st->winBuf;
853
77.6k
      else
854
77.6k
         inBuf = &in[((sub-1)*NB_SUBFRAME_SIZE)];
855
4.24M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
856
4.14M
         sw[i] = inBuf[i];
857
858
103k
      if (st->complexity==0)
859
25.1k
         response_bound >>= 1;
860
103k
      compute_impulse_response(interp_qlpc, bw_lpc1, bw_lpc2, syn_resp, response_bound, NB_ORDER, stack);
861
606k
      for (i=response_bound;i<NB_SUBFRAME_SIZE;i++)
862
503k
         syn_resp[i]=VERY_SMALL;
863
864
      /* Compute zero response of A(z/g1) / ( A(z/g2) * A(z) ) */
865
1.13M
      for (i=0;i<NB_ORDER;i++)
866
1.03M
         mem[i]=SHL32(st->mem_sp[i],1);
867
4.24M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
868
4.14M
         exc[i] = VERY_SMALL;
869
#ifdef SHORTCUTS2
870
      iir_mem16(exc, interp_qlpc, exc, response_bound, NB_ORDER, mem, stack);
871
      for (i=0;i<NB_ORDER;i++)
872
         mem[i]=SHL32(st->mem_sw[i],1);
873
      filter10(exc, st->bw_lpc1, st->bw_lpc2, exc, response_bound, mem, stack);
874
      SPEEX_MEMSET(&exc[response_bound], 0, NB_SUBFRAME_SIZE-response_bound);
875
#else
876
103k
      iir_mem16(exc, interp_qlpc, exc, NB_SUBFRAME_SIZE, NB_ORDER, mem, stack);
877
1.13M
      for (i=0;i<NB_ORDER;i++)
878
1.03M
         mem[i]=SHL32(st->mem_sw[i],1);
879
103k
      filter10(exc, bw_lpc1, bw_lpc2, exc, NB_SUBFRAME_SIZE, mem, stack);
880
103k
#endif
881
882
      /* Compute weighted signal */
883
1.13M
      for (i=0;i<NB_ORDER;i++)
884
1.03M
         mem[i]=st->mem_sw[i];
885
103k
      filter10(sw, bw_lpc1, bw_lpc2, sw, NB_SUBFRAME_SIZE, mem, stack);
886
887
103k
      if (st->complexity==0)
888
276k
         for (i=0;i<NB_ORDER;i++)
889
251k
            st->mem_sw[i]=mem[i];
890
891
      /* Compute target signal (saturation prevents overflows on clipped input speech) */
892
4.24M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
893
4.14M
         target[i]=EXTRACT16(SATURATE(SUB32(sw[i],PSHR32(exc[i],1)),32767));
894
895
4.24M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
896
4.14M
         exc[i] = inBuf[i];
897
103k
      fir_mem16(exc, interp_qlpc, exc, NB_SUBFRAME_SIZE, NB_ORDER, st->mem_exc2, stack);
898
      /* If we have a long-term predictor (otherwise, something's wrong) */
899
103k
      speex_assert (SUBMODE(ltp_quant));
900
103k
      {
901
103k
         int pit_min, pit_max;
902
         /* Long-term prediction */
903
103k
         if (SUBMODE(lbr_pitch) != -1)
904
69.9k
         {
905
            /* Low bit-rate pitch handling */
906
69.9k
            int margin;
907
69.9k
            margin = SUBMODE(lbr_pitch);
908
69.9k
            if (margin)
909
0
            {
910
0
               if (ol_pitch < NB_PITCH_START+margin-1)
911
0
                  ol_pitch=NB_PITCH_START+margin-1;
912
0
               if (ol_pitch > NB_PITCH_END-margin)
913
0
                  ol_pitch=NB_PITCH_END-margin;
914
0
               pit_min = ol_pitch-margin+1;
915
0
               pit_max = ol_pitch+margin;
916
69.9k
            } else {
917
69.9k
               pit_min=pit_max=ol_pitch;
918
69.9k
            }
919
69.9k
         } else {
920
33.5k
            pit_min = NB_PITCH_START;
921
33.5k
            pit_max = NB_PITCH_END;
922
33.5k
         }
923
924
         /* Force pitch to use only the current frame if needed */
925
103k
         if (st->bounded_pitch && pit_max>offset)
926
32.1k
            pit_max=offset;
927
928
         /* Perform pitch search */
929
103k
         pitch = SUBMODE(ltp_quant)(target, sw, interp_qlpc, bw_lpc1, bw_lpc2,
930
103k
                                    exc32, SUBMODE(ltp_params), pit_min, pit_max, ol_pitch_coef,
931
103k
                                    NB_ORDER, NB_SUBFRAME_SIZE, bits, stack,
932
103k
                                    exc, syn_resp, st->complexity, 0, st->plc_tuning, &st->cumul_gain);
933
934
103k
         st->pitch[sub]=pitch;
935
103k
      }
936
      /* Quantization of innovation */
937
103k
      SPEEX_MEMSET(innov, 0, NB_SUBFRAME_SIZE);
938
939
      /* FIXME: Make sure this is safe from overflows (so far so good) */
940
4.24M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
941
4.14M
         exc[i] = EXTRACT16(SUB32(EXTEND32(exc[i]), PSHR32(exc32[i],SIG_SHIFT-1)));
942
943
103k
      ener = SHL32(EXTEND32(compute_rms16(exc, NB_SUBFRAME_SIZE)),SIG_SHIFT);
944
945
      /*FIXME: Should use DIV32_16 and make sure result fits in 16 bits */
946
#ifdef FIXED_POINT
947
      {
948
73.9k
         spx_word32_t f = PDIV32(ener,PSHR32(ol_gain,SIG_SHIFT));
949
73.9k
         if (f<=32767)
950
68.2k
            fine_gain = f;
951
5.66k
         else
952
5.66k
            fine_gain = 32767;
953
      }
954
#else
955
29.5k
      fine_gain = PDIV32_16(ener,PSHR32(ol_gain,SIG_SHIFT));
956
#endif
957
      /* Calculate gain correction for the sub-frame (if any) */
958
103k
      if (SUBMODE(have_subframe_gain))
959
33.5k
      {
960
33.5k
         int qe;
961
33.5k
         if (SUBMODE(have_subframe_gain)==3)
962
20.3k
         {
963
20.3k
            qe = scal_quant(fine_gain, exc_gain_quant_scal3_bound, 8);
964
20.3k
            speex_bits_pack(bits, qe, 3);
965
20.3k
            ener=MULT16_32_Q14(exc_gain_quant_scal3[qe],ol_gain);
966
20.3k
         } else {
967
13.2k
            qe = scal_quant(fine_gain, exc_gain_quant_scal1_bound, 2);
968
13.2k
            speex_bits_pack(bits, qe, 1);
969
13.2k
            ener=MULT16_32_Q14(exc_gain_quant_scal1[qe],ol_gain);
970
13.2k
         }
971
69.9k
      } else {
972
69.9k
         ener=ol_gain;
973
69.9k
      }
974
975
      /*printf ("%f %f\n", ener, ol_gain);*/
976
977
      /* Normalize innovation */
978
103k
      signal_div(target, target, ener, NB_SUBFRAME_SIZE);
979
980
      /* Quantize innovation */
981
103k
      speex_assert (SUBMODE(innovation_quant));
982
103k
      {
983
         /* Codebook search */
984
103k
         SUBMODE(innovation_quant)(target, interp_qlpc, bw_lpc1, bw_lpc2,
985
103k
                  SUBMODE(innovation_params), NB_ORDER, NB_SUBFRAME_SIZE,
986
103k
                  innov, syn_resp, bits, stack, st->complexity, SUBMODE(double_codebook));
987
988
         /* De-normalize innovation and update excitation */
989
103k
         signal_mul(innov, innov, ener, NB_SUBFRAME_SIZE);
990
991
         /* In some (rare) modes, we do a second search (more bits) to reduce noise even more */
992
103k
         if (SUBMODE(double_codebook)) {
993
3.28k
            char *tmp_stack=stack;
994
3.28k
            VARDECL(spx_sig_t *innov2);
995
3.28k
            ALLOC(innov2, NB_SUBFRAME_SIZE, spx_sig_t);
996
3.28k
            SPEEX_MEMSET(innov2, 0, NB_SUBFRAME_SIZE);
997
134k
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
998
131k
               target[i]=MULT16_16_P13(QCONST16(2.2f,13), target[i]);
999
3.28k
            SUBMODE(innovation_quant)(target, interp_qlpc, bw_lpc1, bw_lpc2,
1000
3.28k
                                      SUBMODE(innovation_params), NB_ORDER, NB_SUBFRAME_SIZE,
1001
3.28k
                                      innov2, syn_resp, bits, stack, st->complexity, 0);
1002
3.28k
            signal_mul(innov2, innov2, MULT16_32_Q15(QCONST16(0.454545f,15),ener), NB_SUBFRAME_SIZE);
1003
134k
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
1004
131k
               innov[i] = ADD32(innov[i],innov2[i]);
1005
3.28k
            stack = tmp_stack;
1006
3.28k
         }
1007
4.24M
         for (i=0;i<NB_SUBFRAME_SIZE;i++)
1008
4.14M
            exc[i] = EXTRACT16(SATURATE32(PSHR32(ADD32(SHL32(exc32[i],1),innov[i]),SIG_SHIFT),32767));
1009
103k
         if (st->innov_rms_save)
1010
30.5k
            st->innov_rms_save[sub] = compute_rms(innov, NB_SUBFRAME_SIZE);
1011
103k
      }
1012
1013
      /* Final signal synthesis from excitation */
1014
103k
      iir_mem16(exc, interp_qlpc, sw, NB_SUBFRAME_SIZE, NB_ORDER, st->mem_sp, stack);
1015
1016
      /* Compute weighted signal again, from synthesized speech (not sure it's the right thing) */
1017
103k
      if (st->complexity!=0)
1018
78.3k
         filter10(sw, bw_lpc1, bw_lpc2, sw, NB_SUBFRAME_SIZE, st->mem_sw, stack);
1019
1020
103k
   }
1021
1022
   /* Store the LSPs for interpolation in the next frame */
1023
25.8k
   if (st->submodeID>=1)
1024
25.8k
   {
1025
284k
      for (i=0;i<NB_ORDER;i++)
1026
258k
         st->old_lsp[i] = lsp[i];
1027
284k
      for (i=0;i<NB_ORDER;i++)
1028
258k
         st->old_qlsp[i] = qlsp[i];
1029
25.8k
   }
1030
1031
#ifdef VORBIS_PSYCHO
1032
   if (st->submodeID>=1)
1033
      SPEEX_COPY(st->old_curve, st->curve, 128);
1034
#endif
1035
1036
25.8k
   if (st->submodeID==1)
1037
13.2k
   {
1038
13.2k
#ifndef DISABLE_VBR
1039
13.2k
      if (st->dtx_count)
1040
3.93k
         speex_bits_pack(bits, 15, 4);
1041
9.31k
      else
1042
9.31k
#endif
1043
9.31k
         speex_bits_pack(bits, 0, 4);
1044
13.2k
   }
1045
1046
   /* The next frame will not be the first (Duh!) */
1047
25.8k
   st->first = 0;
1048
25.8k
   SPEEX_COPY(st->winBuf, in+2*NB_FRAME_SIZE-NB_WINDOW_SIZE, NB_WINDOW_SIZE-NB_FRAME_SIZE);
1049
1050
25.8k
   if (SUBMODE(innovation_quant) == noise_codebook_quant || st->submodeID==0)
1051
13.2k
      st->bounded_pitch = 1;
1052
12.6k
   else
1053
12.6k
      st->bounded_pitch = 0;
1054
1055
25.8k
   return 1;
1056
28.2k
}
nb_encode
Line
Count
Source
407
8.59k
{
408
8.59k
   EncState *st;
409
8.59k
   int i, sub, roots;
410
8.59k
   int ol_pitch;
411
8.59k
   spx_word16_t ol_pitch_coef;
412
8.59k
   spx_word32_t ol_gain;
413
8.59k
   VARDECL(spx_word16_t *target);
414
8.59k
   VARDECL(spx_sig_t *innov);
415
8.59k
   VARDECL(spx_word32_t *exc32);
416
8.59k
   VARDECL(spx_mem_t *mem);
417
8.59k
   VARDECL(spx_coef_t *bw_lpc1);
418
8.59k
   VARDECL(spx_coef_t *bw_lpc2);
419
8.59k
   VARDECL(spx_coef_t *lpc);
420
8.59k
   VARDECL(spx_lsp_t *lsp);
421
8.59k
   VARDECL(spx_lsp_t *qlsp);
422
8.59k
   VARDECL(spx_lsp_t *interp_lsp);
423
8.59k
   VARDECL(spx_lsp_t *interp_qlsp);
424
8.59k
   VARDECL(spx_coef_t *interp_lpc);
425
8.59k
   VARDECL(spx_coef_t *interp_qlpc);
426
8.59k
   char *stack;
427
8.59k
   VARDECL(spx_word16_t *syn_resp);
428
429
8.59k
   spx_word32_t ener=0;
430
8.59k
   spx_word16_t fine_gain;
431
8.59k
   spx_word16_t *in = (spx_word16_t*)vin;
432
433
8.59k
   st=(EncState *)state;
434
8.59k
   stack=st->stack;
435
436
8.59k
   ALLOC(lpc, NB_ORDER, spx_coef_t);
437
8.59k
   ALLOC(bw_lpc1, NB_ORDER, spx_coef_t);
438
8.59k
   ALLOC(bw_lpc2, NB_ORDER, spx_coef_t);
439
8.59k
   ALLOC(lsp, NB_ORDER, spx_lsp_t);
440
8.59k
   ALLOC(qlsp, NB_ORDER, spx_lsp_t);
441
8.59k
   ALLOC(interp_lsp, NB_ORDER, spx_lsp_t);
442
8.59k
   ALLOC(interp_qlsp, NB_ORDER, spx_lsp_t);
443
8.59k
   ALLOC(interp_lpc, NB_ORDER, spx_coef_t);
444
8.59k
   ALLOC(interp_qlpc, NB_ORDER, spx_coef_t);
445
446
8.59k
   st->exc = st->excBuf + NB_PITCH_END + 2;
447
8.59k
   st->sw = st->swBuf + NB_PITCH_END + 2;
448
   /* Move signals 1 frame towards the past */
449
8.59k
   SPEEX_MOVE(st->excBuf, st->excBuf+NB_FRAME_SIZE, NB_PITCH_END+2);
450
8.59k
   SPEEX_MOVE(st->swBuf, st->swBuf+NB_FRAME_SIZE, NB_PITCH_END+2);
451
452
8.59k
   if (st->highpass_enabled)
453
4.82k
      highpass(in, in, NB_FRAME_SIZE, (st->isWideband?HIGHPASS_WIDEBAND:HIGHPASS_NARROWBAND)|HIGHPASS_INPUT, st->mem_hp);
454
455
8.59k
   {
456
8.59k
      VARDECL(spx_word16_t *w_sig);
457
8.59k
      VARDECL(spx_word16_t *autocorr);
458
8.59k
      ALLOC(w_sig, NB_WINDOW_SIZE, spx_word16_t);
459
8.59k
      ALLOC(autocorr, NB_ORDER+1, spx_word16_t);
460
      /* Window for analysis */
461
352k
      for (i=0;i<NB_WINDOW_SIZE-NB_FRAME_SIZE;i++)
462
343k
         w_sig[i] = MULT16_16_Q15(st->winBuf[i],st->window[i]);
463
1.38M
      for (;i<NB_WINDOW_SIZE;i++)
464
1.37M
         w_sig[i] = MULT16_16_Q15(in[i-NB_WINDOW_SIZE+NB_FRAME_SIZE],st->window[i]);
465
      /* Compute auto-correlation */
466
8.59k
      _spx_autocorr(w_sig, autocorr, NB_ORDER+1, NB_WINDOW_SIZE);
467
8.59k
      autocorr[0] = ADD16(autocorr[0],MULT16_16_Q15(autocorr[0],st->lpc_floor)); /* Noise floor in auto-correlation domain */
468
469
      /* Lag windowing: equivalent to filtering in the power-spectrum domain */
470
103k
      for (i=0;i<NB_ORDER+1;i++)
471
94.5k
         autocorr[i] = MULT16_16_Q15(autocorr[i],st->lagWindow[i]);
472
8.59k
      autocorr[0] = ADD16(autocorr[0],1);
473
474
      /* Levinson-Durbin */
475
8.59k
      _spx_lpc(lpc, autocorr, NB_ORDER);
476
      /* LPC to LSPs (x-domain) transform */
477
8.59k
      roots=lpc_to_lsp (lpc, NB_ORDER, lsp, 10, LSP_DELTA1, stack);
478
      /* Check if we found all the roots */
479
8.59k
      if (roots!=NB_ORDER)
480
4
      {
481
         /*If we can't find all LSP's, do some damage control and use previous filter*/
482
44
         for (i=0;i<NB_ORDER;i++)
483
40
         {
484
40
            lsp[i]=st->old_lsp[i];
485
40
         }
486
4
      }
487
8.59k
   }
488
489
490
491
492
   /* Whole frame analysis (open-loop estimation of pitch and excitation gain) */
493
8.59k
   {
494
8.59k
      int diff = NB_WINDOW_SIZE-NB_FRAME_SIZE;
495
8.59k
      if (st->first)
496
23.8k
         for (i=0;i<NB_ORDER;i++)
497
21.6k
            interp_lsp[i] = lsp[i];
498
6.42k
      else
499
6.42k
         lsp_interpolate(st->old_lsp, lsp, interp_lsp, NB_ORDER, NB_NB_SUBFRAMES, NB_NB_SUBFRAMES<<1, LSP_MARGIN);
500
501
      /* Compute interpolated LPCs (unquantized) for whole frame*/
502
8.59k
      lsp_to_lpc(interp_lsp, interp_lpc, NB_ORDER,stack);
503
504
505
      /*Open-loop pitch*/
506
8.59k
      if (!st->submodes[st->submodeID] || (st->complexity>2 && SUBMODE(have_subframe_gain)<3) || SUBMODE(forced_pitch_gain) || SUBMODE(lbr_pitch) != -1
507
8.59k
#ifndef DISABLE_VBR
508
8.59k
           || st->vbr_enabled || st->vad_enabled
509
8.59k
#endif
510
8.59k
                  )
511
7.98k
      {
512
7.98k
         int nol_pitch[6];
513
7.98k
         spx_word16_t nol_pitch_coef[6];
514
515
7.98k
         bw_lpc(QCONST16(0.9,15), interp_lpc, bw_lpc1, NB_ORDER);
516
7.98k
         bw_lpc(QCONST16(0.55,15), interp_lpc, bw_lpc2, NB_ORDER);
517
518
7.98k
         SPEEX_COPY(st->sw, st->winBuf, diff);
519
7.98k
         SPEEX_COPY(st->sw+diff, in, NB_FRAME_SIZE-diff);
520
7.98k
         filter10(st->sw, bw_lpc1, bw_lpc2, st->sw, NB_FRAME_SIZE, st->mem_sw_whole, stack);
521
522
7.98k
         open_loop_nbest_pitch(st->sw, NB_PITCH_START, NB_PITCH_END, NB_FRAME_SIZE,
523
7.98k
                               nol_pitch, nol_pitch_coef, 6, stack);
524
7.98k
         ol_pitch=nol_pitch[0];
525
7.98k
         ol_pitch_coef = nol_pitch_coef[0];
526
         /*Try to remove pitch multiples*/
527
47.9k
         for (i=1;i<6;i++)
528
39.9k
         {
529
#ifdef FIXED_POINT
530
            if ((nol_pitch_coef[i]>MULT16_16_Q15(nol_pitch_coef[0],27853)) &&
531
#else
532
39.9k
            if ((nol_pitch_coef[i]>.85*nol_pitch_coef[0]) &&
533
39.9k
#endif
534
39.9k
                (ABS(2*nol_pitch[i]-ol_pitch)<=2 || ABS(3*nol_pitch[i]-ol_pitch)<=3 ||
535
11.1k
                 ABS(4*nol_pitch[i]-ol_pitch)<=4 || ABS(5*nol_pitch[i]-ol_pitch)<=5))
536
245
            {
537
               /*ol_pitch_coef=nol_pitch_coef[i];*/
538
245
               ol_pitch = nol_pitch[i];
539
245
            }
540
39.9k
         }
541
         /*if (ol_pitch>50)
542
           ol_pitch/=2;*/
543
         /*ol_pitch_coef = sqrt(ol_pitch_coef);*/
544
545
7.98k
      } else {
546
611
         ol_pitch=0;
547
611
         ol_pitch_coef=0;
548
611
      }
549
550
      /*Compute "real" excitation*/
551
      /*SPEEX_COPY(st->exc, st->winBuf, diff);
552
      SPEEX_COPY(st->exc+diff, in, NB_FRAME_SIZE-diff);*/
553
8.59k
      fir_mem16(st->winBuf, interp_lpc, st->exc, diff, NB_ORDER, st->mem_exc, stack);
554
8.59k
      fir_mem16(in, interp_lpc, st->exc+diff, NB_FRAME_SIZE-diff, NB_ORDER, st->mem_exc, stack);
555
556
      /* Compute open-loop excitation gain */
557
8.59k
      {
558
8.59k
         spx_word16_t g = compute_rms16(st->exc, NB_FRAME_SIZE);
559
8.59k
         if (st->submodeID!=1 && ol_pitch>0)
560
4.09k
            ol_gain = MULT16_16(g, MULT16_16_Q14(QCONST16(1.1,14),
561
8.59k
                                spx_sqrt(QCONST32(1.,28)-MULT16_32_Q15(QCONST16(.8,15),SHL32(MULT16_16(ol_pitch_coef,ol_pitch_coef),16)))));
562
4.50k
         else
563
4.50k
            ol_gain = SHL32(EXTEND32(g),SIG_SHIFT);
564
8.59k
      }
565
8.59k
   }
566
567
#ifdef VORBIS_PSYCHO
568
   SPEEX_MOVE(st->psy_window, st->psy_window+NB_FRAME_SIZE, 256-NB_FRAME_SIZE);
569
   SPEEX_COPY(&st->psy_window[256-NB_FRAME_SIZE], in, NB_FRAME_SIZE);
570
   compute_curve(st->psy, st->psy_window, st->curve);
571
   /*print_vec(st->curve, 128, "curve");*/
572
   if (st->first)
573
      SPEEX_COPY(st->old_curve, st->curve, 128);
574
#endif
575
576
   /*VBR stuff*/
577
8.59k
#ifndef DISABLE_VBR
578
8.59k
   if (st->vbr_enabled||st->vad_enabled)
579
6.94k
   {
580
6.94k
      float lsp_dist=0;
581
76.3k
      for (i=0;i<NB_ORDER;i++)
582
69.4k
         lsp_dist += (st->old_lsp[i] - lsp[i])*(st->old_lsp[i] - lsp[i]);
583
6.94k
      lsp_dist /= LSP_SCALING*LSP_SCALING;
584
585
6.94k
      if (st->abr_enabled)
586
1.87k
      {
587
1.87k
         float qual_change=0;
588
1.87k
         if (st->abr_drift2 * st->abr_drift > 0)
589
1.68k
         {
590
            /* Only adapt if long-term and short-term drift are the same sign */
591
1.68k
            qual_change = -.00001*st->abr_drift/(1+st->abr_count);
592
1.68k
            if (qual_change>.05)
593
0
               qual_change=.05;
594
1.68k
            if (qual_change<-.05)
595
332
               qual_change=-.05;
596
1.68k
         }
597
1.87k
         st->vbr_quality += qual_change;
598
1.87k
         if (st->vbr_quality>10)
599
0
            st->vbr_quality=10;
600
1.87k
         if (st->vbr_quality<0)
601
1.68k
            st->vbr_quality=0;
602
1.87k
      }
603
604
6.94k
      st->relative_quality = vbr_analysis(&st->vbr, in, NB_FRAME_SIZE, ol_pitch, GAIN_SCALING_1*ol_pitch_coef);
605
      /*if (delta_qual<0)*/
606
      /*  delta_qual*=.1*(3+st->vbr_quality);*/
607
6.94k
      if (st->vbr_enabled)
608
5.51k
      {
609
5.51k
         spx_int32_t mode;
610
5.51k
         int choice=0;
611
5.51k
         float min_diff=100;
612
5.51k
         mode = 8;
613
49.6k
         while (mode)
614
44.0k
         {
615
44.0k
            int v1;
616
44.0k
            float thresh;
617
44.0k
            v1=(int)floor(st->vbr_quality);
618
44.0k
            if (v1==10)
619
4.90k
               thresh = vbr_nb_thresh[mode][v1];
620
39.1k
            else
621
39.1k
               thresh = (st->vbr_quality-v1)*vbr_nb_thresh[mode][v1+1] + (1+v1-st->vbr_quality)*vbr_nb_thresh[mode][v1];
622
44.0k
            if (st->relative_quality > thresh &&
623
44.0k
                st->relative_quality-thresh<min_diff)
624
4.71k
            {
625
4.71k
               choice = mode;
626
4.71k
               min_diff = st->relative_quality-thresh;
627
4.71k
            }
628
44.0k
            mode--;
629
44.0k
         }
630
5.51k
         mode=choice;
631
5.51k
         if (mode==0)
632
2.13k
         {
633
2.13k
            if (st->dtx_count==0 || lsp_dist>.05 || !st->dtx_enabled || st->dtx_count>20)
634
1.18k
            {
635
1.18k
               mode=1;
636
1.18k
               st->dtx_count=1;
637
1.18k
            } else {
638
945
               mode=0;
639
945
               st->dtx_count++;
640
945
            }
641
3.38k
         } else {
642
3.38k
            st->dtx_count=0;
643
3.38k
         }
644
645
5.51k
         speex_encoder_ctl(state, SPEEX_SET_MODE, &mode);
646
5.51k
         if (st->vbr_max>0)
647
4.14k
         {
648
4.14k
            spx_int32_t rate;
649
4.14k
            speex_encoder_ctl(state, SPEEX_GET_BITRATE, &rate);
650
4.14k
            if (rate > st->vbr_max)
651
1.23k
            {
652
1.23k
               rate = st->vbr_max;
653
1.23k
               speex_encoder_ctl(state, SPEEX_SET_BITRATE, &rate);
654
1.23k
            }
655
4.14k
         }
656
657
5.51k
         if (st->abr_enabled)
658
1.87k
         {
659
1.87k
            spx_int32_t bitrate;
660
1.87k
            speex_encoder_ctl(state, SPEEX_GET_BITRATE, &bitrate);
661
1.87k
            st->abr_drift+=(bitrate-st->abr_enabled);
662
1.87k
            st->abr_drift2 = .95*st->abr_drift2 + .05*(bitrate-st->abr_enabled);
663
1.87k
            st->abr_count += 1.0;
664
1.87k
         }
665
666
5.51k
      } else {
667
         /*VAD only case*/
668
1.43k
         int mode;
669
1.43k
         if (st->relative_quality<2)
670
732
         {
671
732
            if (st->dtx_count==0 || lsp_dist>.05 || !st->dtx_enabled || st->dtx_count>20)
672
415
            {
673
415
               st->dtx_count=1;
674
415
               mode=1;
675
415
            } else {
676
317
               mode=0;
677
317
               st->dtx_count++;
678
317
            }
679
732
         } else {
680
698
            st->dtx_count = 0;
681
698
            mode=st->submodeSelect;
682
698
         }
683
         /*speex_encoder_ctl(state, SPEEX_SET_MODE, &mode);*/
684
1.43k
         st->submodeID=mode;
685
1.43k
      }
686
6.94k
   } else {
687
1.65k
      st->relative_quality = -1;
688
1.65k
   }
689
8.59k
#endif /* #ifndef DISABLE_VBR */
690
691
8.59k
   if (st->encode_submode)
692
8.59k
   {
693
      /* First, transmit a zero for narrowband */
694
8.59k
      speex_bits_pack(bits, 0, 1);
695
696
      /* Transmit the sub-mode we use for this frame */
697
8.59k
      speex_bits_pack(bits, st->submodeID, NB_SUBMODE_BITS);
698
699
8.59k
   }
700
701
   /* If null mode (no transmission), just set a couple things to zero*/
702
8.59k
   if (st->submodes[st->submodeID] == NULL)
703
1.19k
   {
704
192k
      for (i=0;i<NB_FRAME_SIZE;i++)
705
191k
         st->exc[i]=st->sw[i]=VERY_SMALL;
706
707
13.1k
      for (i=0;i<NB_ORDER;i++)
708
11.9k
         st->mem_sw[i]=0;
709
1.19k
      st->first=1;
710
1.19k
      st->bounded_pitch = 1;
711
712
1.19k
      SPEEX_COPY(st->winBuf, in+2*NB_FRAME_SIZE-NB_WINDOW_SIZE, NB_WINDOW_SIZE-NB_FRAME_SIZE);
713
714
      /* Clear memory (no need to really compute it) */
715
13.1k
      for (i=0;i<NB_ORDER;i++)
716
11.9k
         st->mem_sp[i] = 0;
717
1.19k
      return 0;
718
719
1.19k
   }
720
721
   /* LSP Quantization */
722
7.39k
   if (st->first)
723
1.27k
   {
724
14.0k
      for (i=0;i<NB_ORDER;i++)
725
12.7k
         st->old_lsp[i] = lsp[i];
726
1.27k
   }
727
728
729
   /*Quantize LSPs*/
730
7.39k
#if 1 /*0 for unquantized*/
731
7.39k
   SUBMODE(lsp_quant)(lsp, qlsp, NB_ORDER, bits);
732
#else
733
   for (i=0;i<NB_ORDER;i++)
734
     qlsp[i]=lsp[i];
735
#endif
736
737
   /*If we use low bit-rate pitch mode, transmit open-loop pitch*/
738
7.39k
   if (SUBMODE(lbr_pitch)!=-1)
739
5.18k
   {
740
5.18k
      speex_bits_pack(bits, ol_pitch-NB_PITCH_START, 7);
741
5.18k
   }
742
743
7.39k
   if (SUBMODE(forced_pitch_gain))
744
4.77k
   {
745
4.77k
      int quant;
746
      /* This just damps the pitch a bit, because it tends to be too aggressive when forced */
747
4.77k
      ol_pitch_coef = MULT16_16_Q15(QCONST16(.9,15), ol_pitch_coef);
748
#ifdef FIXED_POINT
749
      quant = PSHR16(MULT16_16_16(15, ol_pitch_coef),GAIN_SHIFT);
750
#else
751
4.77k
      quant = (int)floor(.5+15*ol_pitch_coef*GAIN_SCALING_1);
752
4.77k
#endif
753
4.77k
      if (quant>15)
754
39
         quant=15;
755
4.77k
      if (quant<0)
756
0
         quant=0;
757
4.77k
      speex_bits_pack(bits, quant, 4);
758
4.77k
      ol_pitch_coef=MULT16_16_P15(QCONST16(0.066667,15),SHL16(quant,GAIN_SHIFT));
759
4.77k
   }
760
761
762
   /*Quantize and transmit open-loop excitation gain*/
763
#ifdef FIXED_POINT
764
   {
765
      int qe = scal_quant32(ol_gain, ol_gain_table, 32);
766
      /*ol_gain = exp(qe/3.5)*SIG_SCALING;*/
767
      ol_gain = MULT16_32_Q15(28406,ol_gain_table[qe]);
768
      speex_bits_pack(bits, qe, 5);
769
   }
770
#else
771
7.39k
   {
772
7.39k
      int qe = (int)(floor(.5+3.5*log(ol_gain*1.0/SIG_SCALING)));
773
7.39k
      if (qe<0)
774
4.67k
         qe=0;
775
7.39k
      if (qe>31)
776
422
         qe=31;
777
7.39k
      ol_gain = exp(qe/3.5)*SIG_SCALING;
778
7.39k
      speex_bits_pack(bits, qe, 5);
779
7.39k
   }
780
7.39k
#endif
781
782
783
784
   /* Special case for first frame */
785
7.39k
   if (st->first)
786
1.27k
   {
787
14.0k
      for (i=0;i<NB_ORDER;i++)
788
12.7k
         st->old_qlsp[i] = qlsp[i];
789
1.27k
   }
790
791
   /* Target signal */
792
7.39k
   ALLOC(target, NB_SUBFRAME_SIZE, spx_word16_t);
793
7.39k
   ALLOC(innov, NB_SUBFRAME_SIZE, spx_sig_t);
794
7.39k
   ALLOC(exc32, NB_SUBFRAME_SIZE, spx_word32_t);
795
7.39k
   ALLOC(syn_resp, NB_SUBFRAME_SIZE, spx_word16_t);
796
7.39k
   ALLOC(mem, NB_ORDER, spx_mem_t);
797
798
   /* Loop on sub-frames */
799
36.9k
   for (sub=0;sub<NB_NB_SUBFRAMES;sub++)
800
29.5k
   {
801
29.5k
      int   offset;
802
29.5k
      spx_word16_t *sw;
803
29.5k
      spx_word16_t *exc, *inBuf;
804
29.5k
      int pitch;
805
29.5k
      int response_bound = NB_SUBFRAME_SIZE;
806
807
      /* Offset relative to start of frame */
808
29.5k
      offset = NB_SUBFRAME_SIZE*sub;
809
      /* Excitation */
810
29.5k
      exc=st->exc+offset;
811
      /* Weighted signal */
812
29.5k
      sw=st->sw+offset;
813
814
      /* LSP interpolation (quantized and unquantized) */
815
29.5k
      lsp_interpolate(st->old_lsp, lsp, interp_lsp, NB_ORDER, sub, NB_NB_SUBFRAMES, LSP_MARGIN);
816
29.5k
      lsp_interpolate(st->old_qlsp, qlsp, interp_qlsp, NB_ORDER, sub, NB_NB_SUBFRAMES, LSP_MARGIN);
817
818
      /* Compute interpolated LPCs (quantized and unquantized) */
819
29.5k
      lsp_to_lpc(interp_lsp, interp_lpc, NB_ORDER,stack);
820
821
29.5k
      lsp_to_lpc(interp_qlsp, interp_qlpc, NB_ORDER, stack);
822
823
      /* Compute analysis filter gain at w=pi (for use in SB-CELP) */
824
29.5k
      {
825
29.5k
         spx_word32_t pi_g=LPC_SCALING;
826
177k
         for (i=0;i<NB_ORDER;i+=2)
827
147k
         {
828
            /*pi_g += -st->interp_qlpc[i] +  st->interp_qlpc[i+1];*/
829
147k
            pi_g = ADD32(pi_g, SUB32(EXTEND32(interp_qlpc[i+1]),EXTEND32(interp_qlpc[i])));
830
147k
         }
831
29.5k
         st->pi_gain[sub] = pi_g;
832
29.5k
      }
833
834
#ifdef VORBIS_PSYCHO
835
      {
836
         float curr_curve[128];
837
         float fact = ((float)sub+1.0f)/NB_NB_SUBFRAMES;
838
         for (i=0;i<128;i++)
839
            curr_curve[i] = (1.0f-fact)*st->old_curve[i] + fact*st->curve[i];
840
         curve_to_lpc(st->psy, curr_curve, bw_lpc1, bw_lpc2, 10);
841
      }
842
#else
843
      /* Compute bandwidth-expanded (unquantized) LPCs for perceptual weighting */
844
29.5k
      bw_lpc(st->gamma1, interp_lpc, bw_lpc1, NB_ORDER);
845
29.5k
      bw_lpc(st->gamma2, interp_lpc, bw_lpc2, NB_ORDER);
846
      /*print_vec(st->bw_lpc1, 10, "bw_lpc");*/
847
29.5k
#endif
848
849
      /*FIXME: This will break if we change the window size */
850
29.5k
      speex_assert(NB_WINDOW_SIZE-NB_FRAME_SIZE == NB_SUBFRAME_SIZE);
851
29.5k
      if (sub==0)
852
7.39k
         inBuf = st->winBuf;
853
22.1k
      else
854
22.1k
         inBuf = &in[((sub-1)*NB_SUBFRAME_SIZE)];
855
1.21M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
856
1.18M
         sw[i] = inBuf[i];
857
858
29.5k
      if (st->complexity==0)
859
6.75k
         response_bound >>= 1;
860
29.5k
      compute_impulse_response(interp_qlpc, bw_lpc1, bw_lpc2, syn_resp, response_bound, NB_ORDER, stack);
861
164k
      for (i=response_bound;i<NB_SUBFRAME_SIZE;i++)
862
135k
         syn_resp[i]=VERY_SMALL;
863
864
      /* Compute zero response of A(z/g1) / ( A(z/g2) * A(z) ) */
865
325k
      for (i=0;i<NB_ORDER;i++)
866
295k
         mem[i]=SHL32(st->mem_sp[i],1);
867
1.21M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
868
1.18M
         exc[i] = VERY_SMALL;
869
#ifdef SHORTCUTS2
870
      iir_mem16(exc, interp_qlpc, exc, response_bound, NB_ORDER, mem, stack);
871
      for (i=0;i<NB_ORDER;i++)
872
         mem[i]=SHL32(st->mem_sw[i],1);
873
      filter10(exc, st->bw_lpc1, st->bw_lpc2, exc, response_bound, mem, stack);
874
      SPEEX_MEMSET(&exc[response_bound], 0, NB_SUBFRAME_SIZE-response_bound);
875
#else
876
29.5k
      iir_mem16(exc, interp_qlpc, exc, NB_SUBFRAME_SIZE, NB_ORDER, mem, stack);
877
325k
      for (i=0;i<NB_ORDER;i++)
878
295k
         mem[i]=SHL32(st->mem_sw[i],1);
879
29.5k
      filter10(exc, bw_lpc1, bw_lpc2, exc, NB_SUBFRAME_SIZE, mem, stack);
880
29.5k
#endif
881
882
      /* Compute weighted signal */
883
325k
      for (i=0;i<NB_ORDER;i++)
884
295k
         mem[i]=st->mem_sw[i];
885
29.5k
      filter10(sw, bw_lpc1, bw_lpc2, sw, NB_SUBFRAME_SIZE, mem, stack);
886
887
29.5k
      if (st->complexity==0)
888
74.3k
         for (i=0;i<NB_ORDER;i++)
889
67.5k
            st->mem_sw[i]=mem[i];
890
891
      /* Compute target signal (saturation prevents overflows on clipped input speech) */
892
1.21M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
893
1.18M
         target[i]=EXTRACT16(SATURATE(SUB32(sw[i],PSHR32(exc[i],1)),32767));
894
895
1.21M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
896
1.18M
         exc[i] = inBuf[i];
897
29.5k
      fir_mem16(exc, interp_qlpc, exc, NB_SUBFRAME_SIZE, NB_ORDER, st->mem_exc2, stack);
898
      /* If we have a long-term predictor (otherwise, something's wrong) */
899
29.5k
      speex_assert (SUBMODE(ltp_quant));
900
29.5k
      {
901
29.5k
         int pit_min, pit_max;
902
         /* Long-term prediction */
903
29.5k
         if (SUBMODE(lbr_pitch) != -1)
904
20.7k
         {
905
            /* Low bit-rate pitch handling */
906
20.7k
            int margin;
907
20.7k
            margin = SUBMODE(lbr_pitch);
908
20.7k
            if (margin)
909
0
            {
910
0
               if (ol_pitch < NB_PITCH_START+margin-1)
911
0
                  ol_pitch=NB_PITCH_START+margin-1;
912
0
               if (ol_pitch > NB_PITCH_END-margin)
913
0
                  ol_pitch=NB_PITCH_END-margin;
914
0
               pit_min = ol_pitch-margin+1;
915
0
               pit_max = ol_pitch+margin;
916
20.7k
            } else {
917
20.7k
               pit_min=pit_max=ol_pitch;
918
20.7k
            }
919
20.7k
         } else {
920
8.87k
            pit_min = NB_PITCH_START;
921
8.87k
            pit_max = NB_PITCH_END;
922
8.87k
         }
923
924
         /* Force pitch to use only the current frame if needed */
925
29.5k
         if (st->bounded_pitch && pit_max>offset)
926
8.92k
            pit_max=offset;
927
928
         /* Perform pitch search */
929
29.5k
         pitch = SUBMODE(ltp_quant)(target, sw, interp_qlpc, bw_lpc1, bw_lpc2,
930
29.5k
                                    exc32, SUBMODE(ltp_params), pit_min, pit_max, ol_pitch_coef,
931
29.5k
                                    NB_ORDER, NB_SUBFRAME_SIZE, bits, stack,
932
29.5k
                                    exc, syn_resp, st->complexity, 0, st->plc_tuning, &st->cumul_gain);
933
934
29.5k
         st->pitch[sub]=pitch;
935
29.5k
      }
936
      /* Quantization of innovation */
937
29.5k
      SPEEX_MEMSET(innov, 0, NB_SUBFRAME_SIZE);
938
939
      /* FIXME: Make sure this is safe from overflows (so far so good) */
940
1.21M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
941
1.18M
         exc[i] = EXTRACT16(SUB32(EXTEND32(exc[i]), PSHR32(exc32[i],SIG_SHIFT-1)));
942
943
29.5k
      ener = SHL32(EXTEND32(compute_rms16(exc, NB_SUBFRAME_SIZE)),SIG_SHIFT);
944
945
      /*FIXME: Should use DIV32_16 and make sure result fits in 16 bits */
946
#ifdef FIXED_POINT
947
      {
948
         spx_word32_t f = PDIV32(ener,PSHR32(ol_gain,SIG_SHIFT));
949
         if (f<=32767)
950
            fine_gain = f;
951
         else
952
            fine_gain = 32767;
953
      }
954
#else
955
29.5k
      fine_gain = PDIV32_16(ener,PSHR32(ol_gain,SIG_SHIFT));
956
29.5k
#endif
957
      /* Calculate gain correction for the sub-frame (if any) */
958
29.5k
      if (SUBMODE(have_subframe_gain))
959
8.87k
      {
960
8.87k
         int qe;
961
8.87k
         if (SUBMODE(have_subframe_gain)==3)
962
5.43k
         {
963
5.43k
            qe = scal_quant(fine_gain, exc_gain_quant_scal3_bound, 8);
964
5.43k
            speex_bits_pack(bits, qe, 3);
965
5.43k
            ener=MULT16_32_Q14(exc_gain_quant_scal3[qe],ol_gain);
966
5.43k
         } else {
967
3.44k
            qe = scal_quant(fine_gain, exc_gain_quant_scal1_bound, 2);
968
3.44k
            speex_bits_pack(bits, qe, 1);
969
3.44k
            ener=MULT16_32_Q14(exc_gain_quant_scal1[qe],ol_gain);
970
3.44k
         }
971
20.7k
      } else {
972
20.7k
         ener=ol_gain;
973
20.7k
      }
974
975
      /*printf ("%f %f\n", ener, ol_gain);*/
976
977
      /* Normalize innovation */
978
29.5k
      signal_div(target, target, ener, NB_SUBFRAME_SIZE);
979
980
      /* Quantize innovation */
981
29.5k
      speex_assert (SUBMODE(innovation_quant));
982
29.5k
      {
983
         /* Codebook search */
984
29.5k
         SUBMODE(innovation_quant)(target, interp_qlpc, bw_lpc1, bw_lpc2,
985
29.5k
                  SUBMODE(innovation_params), NB_ORDER, NB_SUBFRAME_SIZE,
986
29.5k
                  innov, syn_resp, bits, stack, st->complexity, SUBMODE(double_codebook));
987
988
         /* De-normalize innovation and update excitation */
989
29.5k
         signal_mul(innov, innov, ener, NB_SUBFRAME_SIZE);
990
991
         /* In some (rare) modes, we do a second search (more bits) to reduce noise even more */
992
29.5k
         if (SUBMODE(double_codebook)) {
993
1.18k
            char *tmp_stack=stack;
994
1.18k
            VARDECL(spx_sig_t *innov2);
995
1.18k
            ALLOC(innov2, NB_SUBFRAME_SIZE, spx_sig_t);
996
1.18k
            SPEEX_MEMSET(innov2, 0, NB_SUBFRAME_SIZE);
997
48.7k
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
998
47.5k
               target[i]=MULT16_16_P13(QCONST16(2.2f,13), target[i]);
999
1.18k
            SUBMODE(innovation_quant)(target, interp_qlpc, bw_lpc1, bw_lpc2,
1000
1.18k
                                      SUBMODE(innovation_params), NB_ORDER, NB_SUBFRAME_SIZE,
1001
1.18k
                                      innov2, syn_resp, bits, stack, st->complexity, 0);
1002
1.18k
            signal_mul(innov2, innov2, MULT16_32_Q15(QCONST16(0.454545f,15),ener), NB_SUBFRAME_SIZE);
1003
48.7k
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
1004
47.5k
               innov[i] = ADD32(innov[i],innov2[i]);
1005
1.18k
            stack = tmp_stack;
1006
1.18k
         }
1007
1.21M
         for (i=0;i<NB_SUBFRAME_SIZE;i++)
1008
1.18M
            exc[i] = EXTRACT16(SATURATE32(PSHR32(ADD32(SHL32(exc32[i],1),innov[i]),SIG_SHIFT),32767));
1009
29.5k
         if (st->innov_rms_save)
1010
10.0k
            st->innov_rms_save[sub] = compute_rms(innov, NB_SUBFRAME_SIZE);
1011
29.5k
      }
1012
1013
      /* Final signal synthesis from excitation */
1014
29.5k
      iir_mem16(exc, interp_qlpc, sw, NB_SUBFRAME_SIZE, NB_ORDER, st->mem_sp, stack);
1015
1016
      /* Compute weighted signal again, from synthesized speech (not sure it's the right thing) */
1017
29.5k
      if (st->complexity!=0)
1018
22.8k
         filter10(sw, bw_lpc1, bw_lpc2, sw, NB_SUBFRAME_SIZE, st->mem_sw, stack);
1019
1020
29.5k
   }
1021
1022
   /* Store the LSPs for interpolation in the next frame */
1023
7.39k
   if (st->submodeID>=1)
1024
7.39k
   {
1025
81.3k
      for (i=0;i<NB_ORDER;i++)
1026
73.9k
         st->old_lsp[i] = lsp[i];
1027
81.3k
      for (i=0;i<NB_ORDER;i++)
1028
73.9k
         st->old_qlsp[i] = qlsp[i];
1029
7.39k
   }
1030
1031
#ifdef VORBIS_PSYCHO
1032
   if (st->submodeID>=1)
1033
      SPEEX_COPY(st->old_curve, st->curve, 128);
1034
#endif
1035
1036
7.39k
   if (st->submodeID==1)
1037
3.87k
   {
1038
3.87k
#ifndef DISABLE_VBR
1039
3.87k
      if (st->dtx_count)
1040
1.66k
         speex_bits_pack(bits, 15, 4);
1041
2.21k
      else
1042
2.21k
#endif
1043
2.21k
         speex_bits_pack(bits, 0, 4);
1044
3.87k
   }
1045
1046
   /* The next frame will not be the first (Duh!) */
1047
7.39k
   st->first = 0;
1048
7.39k
   SPEEX_COPY(st->winBuf, in+2*NB_FRAME_SIZE-NB_WINDOW_SIZE, NB_WINDOW_SIZE-NB_FRAME_SIZE);
1049
1050
7.39k
   if (SUBMODE(innovation_quant) == noise_codebook_quant || st->submodeID==0)
1051
3.87k
      st->bounded_pitch = 1;
1052
3.52k
   else
1053
3.52k
      st->bounded_pitch = 0;
1054
1055
7.39k
   return 1;
1056
8.59k
}
nb_encode
Line
Count
Source
407
19.6k
{
408
19.6k
   EncState *st;
409
19.6k
   int i, sub, roots;
410
19.6k
   int ol_pitch;
411
19.6k
   spx_word16_t ol_pitch_coef;
412
19.6k
   spx_word32_t ol_gain;
413
19.6k
   VARDECL(spx_word16_t *target);
414
19.6k
   VARDECL(spx_sig_t *innov);
415
19.6k
   VARDECL(spx_word32_t *exc32);
416
19.6k
   VARDECL(spx_mem_t *mem);
417
19.6k
   VARDECL(spx_coef_t *bw_lpc1);
418
19.6k
   VARDECL(spx_coef_t *bw_lpc2);
419
19.6k
   VARDECL(spx_coef_t *lpc);
420
19.6k
   VARDECL(spx_lsp_t *lsp);
421
19.6k
   VARDECL(spx_lsp_t *qlsp);
422
19.6k
   VARDECL(spx_lsp_t *interp_lsp);
423
19.6k
   VARDECL(spx_lsp_t *interp_qlsp);
424
19.6k
   VARDECL(spx_coef_t *interp_lpc);
425
19.6k
   VARDECL(spx_coef_t *interp_qlpc);
426
19.6k
   char *stack;
427
19.6k
   VARDECL(spx_word16_t *syn_resp);
428
429
19.6k
   spx_word32_t ener=0;
430
19.6k
   spx_word16_t fine_gain;
431
19.6k
   spx_word16_t *in = (spx_word16_t*)vin;
432
433
19.6k
   st=(EncState *)state;
434
19.6k
   stack=st->stack;
435
436
19.6k
   ALLOC(lpc, NB_ORDER, spx_coef_t);
437
19.6k
   ALLOC(bw_lpc1, NB_ORDER, spx_coef_t);
438
19.6k
   ALLOC(bw_lpc2, NB_ORDER, spx_coef_t);
439
19.6k
   ALLOC(lsp, NB_ORDER, spx_lsp_t);
440
19.6k
   ALLOC(qlsp, NB_ORDER, spx_lsp_t);
441
19.6k
   ALLOC(interp_lsp, NB_ORDER, spx_lsp_t);
442
19.6k
   ALLOC(interp_qlsp, NB_ORDER, spx_lsp_t);
443
19.6k
   ALLOC(interp_lpc, NB_ORDER, spx_coef_t);
444
19.6k
   ALLOC(interp_qlpc, NB_ORDER, spx_coef_t);
445
446
19.6k
   st->exc = st->excBuf + NB_PITCH_END + 2;
447
19.6k
   st->sw = st->swBuf + NB_PITCH_END + 2;
448
   /* Move signals 1 frame towards the past */
449
19.6k
   SPEEX_MOVE(st->excBuf, st->excBuf+NB_FRAME_SIZE, NB_PITCH_END+2);
450
19.6k
   SPEEX_MOVE(st->swBuf, st->swBuf+NB_FRAME_SIZE, NB_PITCH_END+2);
451
452
19.6k
   if (st->highpass_enabled)
453
7.07k
      highpass(in, in, NB_FRAME_SIZE, (st->isWideband?HIGHPASS_WIDEBAND:HIGHPASS_NARROWBAND)|HIGHPASS_INPUT, st->mem_hp);
454
455
19.6k
   {
456
19.6k
      VARDECL(spx_word16_t *w_sig);
457
19.6k
      VARDECL(spx_word16_t *autocorr);
458
19.6k
      ALLOC(w_sig, NB_WINDOW_SIZE, spx_word16_t);
459
19.6k
      ALLOC(autocorr, NB_ORDER+1, spx_word16_t);
460
      /* Window for analysis */
461
806k
      for (i=0;i<NB_WINDOW_SIZE-NB_FRAME_SIZE;i++)
462
787k
         w_sig[i] = MULT16_16_Q15(st->winBuf[i],st->window[i]);
463
3.16M
      for (;i<NB_WINDOW_SIZE;i++)
464
3.14M
         w_sig[i] = MULT16_16_Q15(in[i-NB_WINDOW_SIZE+NB_FRAME_SIZE],st->window[i]);
465
      /* Compute auto-correlation */
466
19.6k
      _spx_autocorr(w_sig, autocorr, NB_ORDER+1, NB_WINDOW_SIZE);
467
19.6k
      autocorr[0] = ADD16(autocorr[0],MULT16_16_Q15(autocorr[0],st->lpc_floor)); /* Noise floor in auto-correlation domain */
468
469
      /* Lag windowing: equivalent to filtering in the power-spectrum domain */
470
236k
      for (i=0;i<NB_ORDER+1;i++)
471
216k
         autocorr[i] = MULT16_16_Q15(autocorr[i],st->lagWindow[i]);
472
19.6k
      autocorr[0] = ADD16(autocorr[0],1);
473
474
      /* Levinson-Durbin */
475
19.6k
      _spx_lpc(lpc, autocorr, NB_ORDER);
476
      /* LPC to LSPs (x-domain) transform */
477
19.6k
      roots=lpc_to_lsp (lpc, NB_ORDER, lsp, 10, LSP_DELTA1, stack);
478
      /* Check if we found all the roots */
479
19.6k
      if (roots!=NB_ORDER)
480
52
      {
481
         /*If we can't find all LSP's, do some damage control and use previous filter*/
482
572
         for (i=0;i<NB_ORDER;i++)
483
520
         {
484
520
            lsp[i]=st->old_lsp[i];
485
520
         }
486
52
      }
487
19.6k
   }
488
489
490
491
492
   /* Whole frame analysis (open-loop estimation of pitch and excitation gain) */
493
19.6k
   {
494
19.6k
      int diff = NB_WINDOW_SIZE-NB_FRAME_SIZE;
495
19.6k
      if (st->first)
496
39.5k
         for (i=0;i<NB_ORDER;i++)
497
35.9k
            interp_lsp[i] = lsp[i];
498
16.0k
      else
499
16.0k
         lsp_interpolate(st->old_lsp, lsp, interp_lsp, NB_ORDER, NB_NB_SUBFRAMES, NB_NB_SUBFRAMES<<1, LSP_MARGIN);
500
501
      /* Compute interpolated LPCs (unquantized) for whole frame*/
502
19.6k
      lsp_to_lpc(interp_lsp, interp_lpc, NB_ORDER,stack);
503
504
505
      /*Open-loop pitch*/
506
19.6k
      if (!st->submodes[st->submodeID] || (st->complexity>2 && SUBMODE(have_subframe_gain)<3) || SUBMODE(forced_pitch_gain) || SUBMODE(lbr_pitch) != -1
507
19.6k
#ifndef DISABLE_VBR
508
19.6k
           || st->vbr_enabled || st->vad_enabled
509
19.6k
#endif
510
19.6k
                  )
511
18.1k
      {
512
18.1k
         int nol_pitch[6];
513
18.1k
         spx_word16_t nol_pitch_coef[6];
514
515
18.1k
         bw_lpc(QCONST16(0.9,15), interp_lpc, bw_lpc1, NB_ORDER);
516
18.1k
         bw_lpc(QCONST16(0.55,15), interp_lpc, bw_lpc2, NB_ORDER);
517
518
18.1k
         SPEEX_COPY(st->sw, st->winBuf, diff);
519
18.1k
         SPEEX_COPY(st->sw+diff, in, NB_FRAME_SIZE-diff);
520
18.1k
         filter10(st->sw, bw_lpc1, bw_lpc2, st->sw, NB_FRAME_SIZE, st->mem_sw_whole, stack);
521
522
18.1k
         open_loop_nbest_pitch(st->sw, NB_PITCH_START, NB_PITCH_END, NB_FRAME_SIZE,
523
18.1k
                               nol_pitch, nol_pitch_coef, 6, stack);
524
18.1k
         ol_pitch=nol_pitch[0];
525
18.1k
         ol_pitch_coef = nol_pitch_coef[0];
526
         /*Try to remove pitch multiples*/
527
109k
         for (i=1;i<6;i++)
528
90.8k
         {
529
90.8k
#ifdef FIXED_POINT
530
90.8k
            if ((nol_pitch_coef[i]>MULT16_16_Q15(nol_pitch_coef[0],27853)) &&
531
#else
532
            if ((nol_pitch_coef[i]>.85*nol_pitch_coef[0]) &&
533
#endif
534
90.8k
                (ABS(2*nol_pitch[i]-ol_pitch)<=2 || ABS(3*nol_pitch[i]-ol_pitch)<=3 ||
535
18.5k
                 ABS(4*nol_pitch[i]-ol_pitch)<=4 || ABS(5*nol_pitch[i]-ol_pitch)<=5))
536
796
            {
537
               /*ol_pitch_coef=nol_pitch_coef[i];*/
538
796
               ol_pitch = nol_pitch[i];
539
796
            }
540
90.8k
         }
541
         /*if (ol_pitch>50)
542
           ol_pitch/=2;*/
543
         /*ol_pitch_coef = sqrt(ol_pitch_coef);*/
544
545
18.1k
      } else {
546
1.49k
         ol_pitch=0;
547
1.49k
         ol_pitch_coef=0;
548
1.49k
      }
549
550
      /*Compute "real" excitation*/
551
      /*SPEEX_COPY(st->exc, st->winBuf, diff);
552
      SPEEX_COPY(st->exc+diff, in, NB_FRAME_SIZE-diff);*/
553
19.6k
      fir_mem16(st->winBuf, interp_lpc, st->exc, diff, NB_ORDER, st->mem_exc, stack);
554
19.6k
      fir_mem16(in, interp_lpc, st->exc+diff, NB_FRAME_SIZE-diff, NB_ORDER, st->mem_exc, stack);
555
556
      /* Compute open-loop excitation gain */
557
19.6k
      {
558
19.6k
         spx_word16_t g = compute_rms16(st->exc, NB_FRAME_SIZE);
559
19.6k
         if (st->submodeID!=1 && ol_pitch>0)
560
8.61k
            ol_gain = MULT16_16(g, MULT16_16_Q14(QCONST16(1.1,14),
561
19.6k
                                spx_sqrt(QCONST32(1.,28)-MULT16_32_Q15(QCONST16(.8,15),SHL32(MULT16_16(ol_pitch_coef,ol_pitch_coef),16)))));
562
11.0k
         else
563
11.0k
            ol_gain = SHL32(EXTEND32(g),SIG_SHIFT);
564
19.6k
      }
565
19.6k
   }
566
567
#ifdef VORBIS_PSYCHO
568
   SPEEX_MOVE(st->psy_window, st->psy_window+NB_FRAME_SIZE, 256-NB_FRAME_SIZE);
569
   SPEEX_COPY(&st->psy_window[256-NB_FRAME_SIZE], in, NB_FRAME_SIZE);
570
   compute_curve(st->psy, st->psy_window, st->curve);
571
   /*print_vec(st->curve, 128, "curve");*/
572
   if (st->first)
573
      SPEEX_COPY(st->old_curve, st->curve, 128);
574
#endif
575
576
   /*VBR stuff*/
577
19.6k
#ifndef DISABLE_VBR
578
19.6k
   if (st->vbr_enabled||st->vad_enabled)
579
14.5k
   {
580
14.5k
      float lsp_dist=0;
581
160k
      for (i=0;i<NB_ORDER;i++)
582
145k
         lsp_dist += (st->old_lsp[i] - lsp[i])*(st->old_lsp[i] - lsp[i]);
583
14.5k
      lsp_dist /= LSP_SCALING*LSP_SCALING;
584
585
14.5k
      if (st->abr_enabled)
586
3.57k
      {
587
3.57k
         float qual_change=0;
588
3.57k
         if (st->abr_drift2 * st->abr_drift > 0)
589
3.21k
         {
590
            /* Only adapt if long-term and short-term drift are the same sign */
591
3.21k
            qual_change = -.00001*st->abr_drift/(1+st->abr_count);
592
3.21k
            if (qual_change>.05)
593
0
               qual_change=.05;
594
3.21k
            if (qual_change<-.05)
595
862
               qual_change=-.05;
596
3.21k
         }
597
3.57k
         st->vbr_quality += qual_change;
598
3.57k
         if (st->vbr_quality>10)
599
0
            st->vbr_quality=10;
600
3.57k
         if (st->vbr_quality<0)
601
3.21k
            st->vbr_quality=0;
602
3.57k
      }
603
604
14.5k
      st->relative_quality = vbr_analysis(&st->vbr, in, NB_FRAME_SIZE, ol_pitch, GAIN_SCALING_1*ol_pitch_coef);
605
      /*if (delta_qual<0)*/
606
      /*  delta_qual*=.1*(3+st->vbr_quality);*/
607
14.5k
      if (st->vbr_enabled)
608
11.4k
      {
609
11.4k
         spx_int32_t mode;
610
11.4k
         int choice=0;
611
11.4k
         float min_diff=100;
612
11.4k
         mode = 8;
613
102k
         while (mode)
614
91.2k
         {
615
91.2k
            int v1;
616
91.2k
            float thresh;
617
91.2k
            v1=(int)floor(st->vbr_quality);
618
91.2k
            if (v1==10)
619
4.71k
               thresh = vbr_nb_thresh[mode][v1];
620
86.5k
            else
621
86.5k
               thresh = (st->vbr_quality-v1)*vbr_nb_thresh[mode][v1+1] + (1+v1-st->vbr_quality)*vbr_nb_thresh[mode][v1];
622
91.2k
            if (st->relative_quality > thresh &&
623
91.2k
                st->relative_quality-thresh<min_diff)
624
12.8k
            {
625
12.8k
               choice = mode;
626
12.8k
               min_diff = st->relative_quality-thresh;
627
12.8k
            }
628
91.2k
            mode--;
629
91.2k
         }
630
11.4k
         mode=choice;
631
11.4k
         if (mode==0)
632
2.72k
         {
633
2.72k
            if (st->dtx_count==0 || lsp_dist>.05 || !st->dtx_enabled || st->dtx_count>20)
634
1.70k
            {
635
1.70k
               mode=1;
636
1.70k
               st->dtx_count=1;
637
1.70k
            } else {
638
1.01k
               mode=0;
639
1.01k
               st->dtx_count++;
640
1.01k
            }
641
8.69k
         } else {
642
8.69k
            st->dtx_count=0;
643
8.69k
         }
644
645
11.4k
         speex_encoder_ctl(state, SPEEX_SET_MODE, &mode);
646
11.4k
         if (st->vbr_max>0)
647
8.36k
         {
648
8.36k
            spx_int32_t rate;
649
8.36k
            speex_encoder_ctl(state, SPEEX_GET_BITRATE, &rate);
650
8.36k
            if (rate > st->vbr_max)
651
3.52k
            {
652
3.52k
               rate = st->vbr_max;
653
3.52k
               speex_encoder_ctl(state, SPEEX_SET_BITRATE, &rate);
654
3.52k
            }
655
8.36k
         }
656
657
11.4k
         if (st->abr_enabled)
658
3.57k
         {
659
3.57k
            spx_int32_t bitrate;
660
3.57k
            speex_encoder_ctl(state, SPEEX_GET_BITRATE, &bitrate);
661
3.57k
            st->abr_drift+=(bitrate-st->abr_enabled);
662
3.57k
            st->abr_drift2 = .95*st->abr_drift2 + .05*(bitrate-st->abr_enabled);
663
3.57k
            st->abr_count += 1.0;
664
3.57k
         }
665
666
11.4k
      } else {
667
         /*VAD only case*/
668
3.17k
         int mode;
669
3.17k
         if (st->relative_quality<2)
670
738
         {
671
738
            if (st->dtx_count==0 || lsp_dist>.05 || !st->dtx_enabled || st->dtx_count>20)
672
491
            {
673
491
               st->dtx_count=1;
674
491
               mode=1;
675
491
            } else {
676
247
               mode=0;
677
247
               st->dtx_count++;
678
247
            }
679
2.43k
         } else {
680
2.43k
            st->dtx_count = 0;
681
2.43k
            mode=st->submodeSelect;
682
2.43k
         }
683
         /*speex_encoder_ctl(state, SPEEX_SET_MODE, &mode);*/
684
3.17k
         st->submodeID=mode;
685
3.17k
      }
686
14.5k
   } else {
687
5.09k
      st->relative_quality = -1;
688
5.09k
   }
689
19.6k
#endif /* #ifndef DISABLE_VBR */
690
691
19.6k
   if (st->encode_submode)
692
19.6k
   {
693
      /* First, transmit a zero for narrowband */
694
19.6k
      speex_bits_pack(bits, 0, 1);
695
696
      /* Transmit the sub-mode we use for this frame */
697
19.6k
      speex_bits_pack(bits, st->submodeID, NB_SUBMODE_BITS);
698
699
19.6k
   }
700
701
   /* If null mode (no transmission), just set a couple things to zero*/
702
19.6k
   if (st->submodes[st->submodeID] == NULL)
703
1.18k
   {
704
191k
      for (i=0;i<NB_FRAME_SIZE;i++)
705
190k
         st->exc[i]=st->sw[i]=VERY_SMALL;
706
707
13.0k
      for (i=0;i<NB_ORDER;i++)
708
11.8k
         st->mem_sw[i]=0;
709
1.18k
      st->first=1;
710
1.18k
      st->bounded_pitch = 1;
711
712
1.18k
      SPEEX_COPY(st->winBuf, in+2*NB_FRAME_SIZE-NB_WINDOW_SIZE, NB_WINDOW_SIZE-NB_FRAME_SIZE);
713
714
      /* Clear memory (no need to really compute it) */
715
13.0k
      for (i=0;i<NB_ORDER;i++)
716
11.8k
         st->mem_sp[i] = 0;
717
1.18k
      return 0;
718
719
1.18k
   }
720
721
   /* LSP Quantization */
722
18.4k
   if (st->first)
723
2.74k
   {
724
30.2k
      for (i=0;i<NB_ORDER;i++)
725
27.4k
         st->old_lsp[i] = lsp[i];
726
2.74k
   }
727
728
729
   /*Quantize LSPs*/
730
18.4k
#if 1 /*0 for unquantized*/
731
18.4k
   SUBMODE(lsp_quant)(lsp, qlsp, NB_ORDER, bits);
732
#else
733
   for (i=0;i<NB_ORDER;i++)
734
     qlsp[i]=lsp[i];
735
#endif
736
737
   /*If we use low bit-rate pitch mode, transmit open-loop pitch*/
738
18.4k
   if (SUBMODE(lbr_pitch)!=-1)
739
12.3k
   {
740
12.3k
      speex_bits_pack(bits, ol_pitch-NB_PITCH_START, 7);
741
12.3k
   }
742
743
18.4k
   if (SUBMODE(forced_pitch_gain))
744
11.2k
   {
745
11.2k
      int quant;
746
      /* This just damps the pitch a bit, because it tends to be too aggressive when forced */
747
11.2k
      ol_pitch_coef = MULT16_16_Q15(QCONST16(.9,15), ol_pitch_coef);
748
11.2k
#ifdef FIXED_POINT
749
11.2k
      quant = PSHR16(MULT16_16_16(15, ol_pitch_coef),GAIN_SHIFT);
750
#else
751
      quant = (int)floor(.5+15*ol_pitch_coef*GAIN_SCALING_1);
752
#endif
753
11.2k
      if (quant>15)
754
92
         quant=15;
755
11.2k
      if (quant<0)
756
0
         quant=0;
757
11.2k
      speex_bits_pack(bits, quant, 4);
758
11.2k
      ol_pitch_coef=MULT16_16_P15(QCONST16(0.066667,15),SHL16(quant,GAIN_SHIFT));
759
11.2k
   }
760
761
762
   /*Quantize and transmit open-loop excitation gain*/
763
18.4k
#ifdef FIXED_POINT
764
18.4k
   {
765
18.4k
      int qe = scal_quant32(ol_gain, ol_gain_table, 32);
766
      /*ol_gain = exp(qe/3.5)*SIG_SCALING;*/
767
18.4k
      ol_gain = MULT16_32_Q15(28406,ol_gain_table[qe]);
768
18.4k
      speex_bits_pack(bits, qe, 5);
769
18.4k
   }
770
#else
771
   {
772
      int qe = (int)(floor(.5+3.5*log(ol_gain*1.0/SIG_SCALING)));
773
      if (qe<0)
774
         qe=0;
775
      if (qe>31)
776
         qe=31;
777
      ol_gain = exp(qe/3.5)*SIG_SCALING;
778
      speex_bits_pack(bits, qe, 5);
779
   }
780
#endif
781
782
783
784
   /* Special case for first frame */
785
18.4k
   if (st->first)
786
2.74k
   {
787
30.2k
      for (i=0;i<NB_ORDER;i++)
788
27.4k
         st->old_qlsp[i] = qlsp[i];
789
2.74k
   }
790
791
   /* Target signal */
792
18.4k
   ALLOC(target, NB_SUBFRAME_SIZE, spx_word16_t);
793
18.4k
   ALLOC(innov, NB_SUBFRAME_SIZE, spx_sig_t);
794
18.4k
   ALLOC(exc32, NB_SUBFRAME_SIZE, spx_word32_t);
795
18.4k
   ALLOC(syn_resp, NB_SUBFRAME_SIZE, spx_word16_t);
796
18.4k
   ALLOC(mem, NB_ORDER, spx_mem_t);
797
798
   /* Loop on sub-frames */
799
92.4k
   for (sub=0;sub<NB_NB_SUBFRAMES;sub++)
800
73.9k
   {
801
73.9k
      int   offset;
802
73.9k
      spx_word16_t *sw;
803
73.9k
      spx_word16_t *exc, *inBuf;
804
73.9k
      int pitch;
805
73.9k
      int response_bound = NB_SUBFRAME_SIZE;
806
807
      /* Offset relative to start of frame */
808
73.9k
      offset = NB_SUBFRAME_SIZE*sub;
809
      /* Excitation */
810
73.9k
      exc=st->exc+offset;
811
      /* Weighted signal */
812
73.9k
      sw=st->sw+offset;
813
814
      /* LSP interpolation (quantized and unquantized) */
815
73.9k
      lsp_interpolate(st->old_lsp, lsp, interp_lsp, NB_ORDER, sub, NB_NB_SUBFRAMES, LSP_MARGIN);
816
73.9k
      lsp_interpolate(st->old_qlsp, qlsp, interp_qlsp, NB_ORDER, sub, NB_NB_SUBFRAMES, LSP_MARGIN);
817
818
      /* Compute interpolated LPCs (quantized and unquantized) */
819
73.9k
      lsp_to_lpc(interp_lsp, interp_lpc, NB_ORDER,stack);
820
821
73.9k
      lsp_to_lpc(interp_qlsp, interp_qlpc, NB_ORDER, stack);
822
823
      /* Compute analysis filter gain at w=pi (for use in SB-CELP) */
824
73.9k
      {
825
73.9k
         spx_word32_t pi_g=LPC_SCALING;
826
443k
         for (i=0;i<NB_ORDER;i+=2)
827
369k
         {
828
            /*pi_g += -st->interp_qlpc[i] +  st->interp_qlpc[i+1];*/
829
369k
            pi_g = ADD32(pi_g, SUB32(EXTEND32(interp_qlpc[i+1]),EXTEND32(interp_qlpc[i])));
830
369k
         }
831
73.9k
         st->pi_gain[sub] = pi_g;
832
73.9k
      }
833
834
#ifdef VORBIS_PSYCHO
835
      {
836
         float curr_curve[128];
837
         float fact = ((float)sub+1.0f)/NB_NB_SUBFRAMES;
838
         for (i=0;i<128;i++)
839
            curr_curve[i] = (1.0f-fact)*st->old_curve[i] + fact*st->curve[i];
840
         curve_to_lpc(st->psy, curr_curve, bw_lpc1, bw_lpc2, 10);
841
      }
842
#else
843
      /* Compute bandwidth-expanded (unquantized) LPCs for perceptual weighting */
844
73.9k
      bw_lpc(st->gamma1, interp_lpc, bw_lpc1, NB_ORDER);
845
73.9k
      bw_lpc(st->gamma2, interp_lpc, bw_lpc2, NB_ORDER);
846
      /*print_vec(st->bw_lpc1, 10, "bw_lpc");*/
847
73.9k
#endif
848
849
      /*FIXME: This will break if we change the window size */
850
73.9k
      speex_assert(NB_WINDOW_SIZE-NB_FRAME_SIZE == NB_SUBFRAME_SIZE);
851
73.9k
      if (sub==0)
852
18.4k
         inBuf = st->winBuf;
853
55.4k
      else
854
55.4k
         inBuf = &in[((sub-1)*NB_SUBFRAME_SIZE)];
855
3.03M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
856
2.95M
         sw[i] = inBuf[i];
857
858
73.9k
      if (st->complexity==0)
859
18.4k
         response_bound >>= 1;
860
73.9k
      compute_impulse_response(interp_qlpc, bw_lpc1, bw_lpc2, syn_resp, response_bound, NB_ORDER, stack);
861
442k
      for (i=response_bound;i<NB_SUBFRAME_SIZE;i++)
862
368k
         syn_resp[i]=VERY_SMALL;
863
864
      /* Compute zero response of A(z/g1) / ( A(z/g2) * A(z) ) */
865
813k
      for (i=0;i<NB_ORDER;i++)
866
739k
         mem[i]=SHL32(st->mem_sp[i],1);
867
3.03M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
868
2.95M
         exc[i] = VERY_SMALL;
869
#ifdef SHORTCUTS2
870
      iir_mem16(exc, interp_qlpc, exc, response_bound, NB_ORDER, mem, stack);
871
      for (i=0;i<NB_ORDER;i++)
872
         mem[i]=SHL32(st->mem_sw[i],1);
873
      filter10(exc, st->bw_lpc1, st->bw_lpc2, exc, response_bound, mem, stack);
874
      SPEEX_MEMSET(&exc[response_bound], 0, NB_SUBFRAME_SIZE-response_bound);
875
#else
876
73.9k
      iir_mem16(exc, interp_qlpc, exc, NB_SUBFRAME_SIZE, NB_ORDER, mem, stack);
877
813k
      for (i=0;i<NB_ORDER;i++)
878
739k
         mem[i]=SHL32(st->mem_sw[i],1);
879
73.9k
      filter10(exc, bw_lpc1, bw_lpc2, exc, NB_SUBFRAME_SIZE, mem, stack);
880
73.9k
#endif
881
882
      /* Compute weighted signal */
883
813k
      for (i=0;i<NB_ORDER;i++)
884
739k
         mem[i]=st->mem_sw[i];
885
73.9k
      filter10(sw, bw_lpc1, bw_lpc2, sw, NB_SUBFRAME_SIZE, mem, stack);
886
887
73.9k
      if (st->complexity==0)
888
202k
         for (i=0;i<NB_ORDER;i++)
889
184k
            st->mem_sw[i]=mem[i];
890
891
      /* Compute target signal (saturation prevents overflows on clipped input speech) */
892
3.03M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
893
2.95M
         target[i]=EXTRACT16(SATURATE(SUB32(sw[i],PSHR32(exc[i],1)),32767));
894
895
3.03M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
896
2.95M
         exc[i] = inBuf[i];
897
73.9k
      fir_mem16(exc, interp_qlpc, exc, NB_SUBFRAME_SIZE, NB_ORDER, st->mem_exc2, stack);
898
      /* If we have a long-term predictor (otherwise, something's wrong) */
899
73.9k
      speex_assert (SUBMODE(ltp_quant));
900
73.9k
      {
901
73.9k
         int pit_min, pit_max;
902
         /* Long-term prediction */
903
73.9k
         if (SUBMODE(lbr_pitch) != -1)
904
49.2k
         {
905
            /* Low bit-rate pitch handling */
906
49.2k
            int margin;
907
49.2k
            margin = SUBMODE(lbr_pitch);
908
49.2k
            if (margin)
909
0
            {
910
0
               if (ol_pitch < NB_PITCH_START+margin-1)
911
0
                  ol_pitch=NB_PITCH_START+margin-1;
912
0
               if (ol_pitch > NB_PITCH_END-margin)
913
0
                  ol_pitch=NB_PITCH_END-margin;
914
0
               pit_min = ol_pitch-margin+1;
915
0
               pit_max = ol_pitch+margin;
916
49.2k
            } else {
917
49.2k
               pit_min=pit_max=ol_pitch;
918
49.2k
            }
919
49.2k
         } else {
920
24.7k
            pit_min = NB_PITCH_START;
921
24.7k
            pit_max = NB_PITCH_END;
922
24.7k
         }
923
924
         /* Force pitch to use only the current frame if needed */
925
73.9k
         if (st->bounded_pitch && pit_max>offset)
926
23.2k
            pit_max=offset;
927
928
         /* Perform pitch search */
929
73.9k
         pitch = SUBMODE(ltp_quant)(target, sw, interp_qlpc, bw_lpc1, bw_lpc2,
930
73.9k
                                    exc32, SUBMODE(ltp_params), pit_min, pit_max, ol_pitch_coef,
931
73.9k
                                    NB_ORDER, NB_SUBFRAME_SIZE, bits, stack,
932
73.9k
                                    exc, syn_resp, st->complexity, 0, st->plc_tuning, &st->cumul_gain);
933
934
73.9k
         st->pitch[sub]=pitch;
935
73.9k
      }
936
      /* Quantization of innovation */
937
73.9k
      SPEEX_MEMSET(innov, 0, NB_SUBFRAME_SIZE);
938
939
      /* FIXME: Make sure this is safe from overflows (so far so good) */
940
3.03M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
941
2.95M
         exc[i] = EXTRACT16(SUB32(EXTEND32(exc[i]), PSHR32(exc32[i],SIG_SHIFT-1)));
942
943
73.9k
      ener = SHL32(EXTEND32(compute_rms16(exc, NB_SUBFRAME_SIZE)),SIG_SHIFT);
944
945
      /*FIXME: Should use DIV32_16 and make sure result fits in 16 bits */
946
73.9k
#ifdef FIXED_POINT
947
73.9k
      {
948
73.9k
         spx_word32_t f = PDIV32(ener,PSHR32(ol_gain,SIG_SHIFT));
949
73.9k
         if (f<=32767)
950
68.2k
            fine_gain = f;
951
5.66k
         else
952
5.66k
            fine_gain = 32767;
953
73.9k
      }
954
#else
955
      fine_gain = PDIV32_16(ener,PSHR32(ol_gain,SIG_SHIFT));
956
#endif
957
      /* Calculate gain correction for the sub-frame (if any) */
958
73.9k
      if (SUBMODE(have_subframe_gain))
959
24.7k
      {
960
24.7k
         int qe;
961
24.7k
         if (SUBMODE(have_subframe_gain)==3)
962
14.9k
         {
963
14.9k
            qe = scal_quant(fine_gain, exc_gain_quant_scal3_bound, 8);
964
14.9k
            speex_bits_pack(bits, qe, 3);
965
14.9k
            ener=MULT16_32_Q14(exc_gain_quant_scal3[qe],ol_gain);
966
14.9k
         } else {
967
9.77k
            qe = scal_quant(fine_gain, exc_gain_quant_scal1_bound, 2);
968
9.77k
            speex_bits_pack(bits, qe, 1);
969
9.77k
            ener=MULT16_32_Q14(exc_gain_quant_scal1[qe],ol_gain);
970
9.77k
         }
971
49.2k
      } else {
972
49.2k
         ener=ol_gain;
973
49.2k
      }
974
975
      /*printf ("%f %f\n", ener, ol_gain);*/
976
977
      /* Normalize innovation */
978
73.9k
      signal_div(target, target, ener, NB_SUBFRAME_SIZE);
979
980
      /* Quantize innovation */
981
73.9k
      speex_assert (SUBMODE(innovation_quant));
982
73.9k
      {
983
         /* Codebook search */
984
73.9k
         SUBMODE(innovation_quant)(target, interp_qlpc, bw_lpc1, bw_lpc2,
985
73.9k
                  SUBMODE(innovation_params), NB_ORDER, NB_SUBFRAME_SIZE,
986
73.9k
                  innov, syn_resp, bits, stack, st->complexity, SUBMODE(double_codebook));
987
988
         /* De-normalize innovation and update excitation */
989
73.9k
         signal_mul(innov, innov, ener, NB_SUBFRAME_SIZE);
990
991
         /* In some (rare) modes, we do a second search (more bits) to reduce noise even more */
992
73.9k
         if (SUBMODE(double_codebook)) {
993
2.09k
            char *tmp_stack=stack;
994
2.09k
            VARDECL(spx_sig_t *innov2);
995
2.09k
            ALLOC(innov2, NB_SUBFRAME_SIZE, spx_sig_t);
996
2.09k
            SPEEX_MEMSET(innov2, 0, NB_SUBFRAME_SIZE);
997
85.9k
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
998
83.8k
               target[i]=MULT16_16_P13(QCONST16(2.2f,13), target[i]);
999
2.09k
            SUBMODE(innovation_quant)(target, interp_qlpc, bw_lpc1, bw_lpc2,
1000
2.09k
                                      SUBMODE(innovation_params), NB_ORDER, NB_SUBFRAME_SIZE,
1001
2.09k
                                      innov2, syn_resp, bits, stack, st->complexity, 0);
1002
2.09k
            signal_mul(innov2, innov2, MULT16_32_Q15(QCONST16(0.454545f,15),ener), NB_SUBFRAME_SIZE);
1003
85.9k
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
1004
83.8k
               innov[i] = ADD32(innov[i],innov2[i]);
1005
2.09k
            stack = tmp_stack;
1006
2.09k
         }
1007
3.03M
         for (i=0;i<NB_SUBFRAME_SIZE;i++)
1008
2.95M
            exc[i] = EXTRACT16(SATURATE32(PSHR32(ADD32(SHL32(exc32[i],1),innov[i]),SIG_SHIFT),32767));
1009
73.9k
         if (st->innov_rms_save)
1010
20.4k
            st->innov_rms_save[sub] = compute_rms(innov, NB_SUBFRAME_SIZE);
1011
73.9k
      }
1012
1013
      /* Final signal synthesis from excitation */
1014
73.9k
      iir_mem16(exc, interp_qlpc, sw, NB_SUBFRAME_SIZE, NB_ORDER, st->mem_sp, stack);
1015
1016
      /* Compute weighted signal again, from synthesized speech (not sure it's the right thing) */
1017
73.9k
      if (st->complexity!=0)
1018
55.5k
         filter10(sw, bw_lpc1, bw_lpc2, sw, NB_SUBFRAME_SIZE, st->mem_sw, stack);
1019
1020
73.9k
   }
1021
1022
   /* Store the LSPs for interpolation in the next frame */
1023
18.4k
   if (st->submodeID>=1)
1024
18.4k
   {
1025
203k
      for (i=0;i<NB_ORDER;i++)
1026
184k
         st->old_lsp[i] = lsp[i];
1027
203k
      for (i=0;i<NB_ORDER;i++)
1028
184k
         st->old_qlsp[i] = qlsp[i];
1029
18.4k
   }
1030
1031
#ifdef VORBIS_PSYCHO
1032
   if (st->submodeID>=1)
1033
      SPEEX_COPY(st->old_curve, st->curve, 128);
1034
#endif
1035
1036
18.4k
   if (st->submodeID==1)
1037
9.37k
   {
1038
9.37k
#ifndef DISABLE_VBR
1039
9.37k
      if (st->dtx_count)
1040
2.26k
         speex_bits_pack(bits, 15, 4);
1041
7.10k
      else
1042
7.10k
#endif
1043
7.10k
         speex_bits_pack(bits, 0, 4);
1044
9.37k
   }
1045
1046
   /* The next frame will not be the first (Duh!) */
1047
18.4k
   st->first = 0;
1048
18.4k
   SPEEX_COPY(st->winBuf, in+2*NB_FRAME_SIZE-NB_WINDOW_SIZE, NB_WINDOW_SIZE-NB_FRAME_SIZE);
1049
1050
18.4k
   if (SUBMODE(innovation_quant) == noise_codebook_quant || st->submodeID==0)
1051
9.37k
      st->bounded_pitch = 1;
1052
9.11k
   else
1053
9.11k
      st->bounded_pitch = 0;
1054
1055
18.4k
   return 1;
1056
19.6k
}
1057
#endif /* DISABLE_ENCODER */
1058
1059
1060
#ifndef DISABLE_DECODER
1061
void *nb_decoder_init(const SpeexMode *m)
1062
4.07k
{
1063
4.07k
   DecState *st;
1064
4.07k
   const SpeexNBMode *mode;
1065
4.07k
   int i;
1066
1067
4.07k
   mode=(const SpeexNBMode*)m->mode;
1068
4.07k
   st = (DecState *)speex_alloc(sizeof(DecState));
1069
4.07k
   if (!st)
1070
0
      return NULL;
1071
4.07k
#if defined(VAR_ARRAYS) || defined (USE_ALLOCA)
1072
4.07k
   st->stack = NULL;
1073
#else
1074
   st->stack = (char*)speex_alloc_scratch(NB_DEC_STACK);
1075
#endif
1076
1077
4.07k
   st->mode=m;
1078
1079
1080
4.07k
   st->encode_submode = 1;
1081
1082
4.07k
   st->first=1;
1083
   /* Codec parameters, should eventually have several "modes"*/
1084
1085
4.07k
   st->submodes=mode->submodes;
1086
4.07k
   st->submodeID=mode->defaultSubmode;
1087
1088
4.07k
   st->lpc_enh_enabled=1;
1089
1090
4.07k
   SPEEX_MEMSET(st->excBuf, 0, NB_FRAME_SIZE + NB_PITCH_END);
1091
1092
4.07k
   st->last_pitch = 40;
1093
4.07k
   st->count_lost=0;
1094
4.07k
   st->pitch_gain_buf[0] = st->pitch_gain_buf[1] = st->pitch_gain_buf[2] = 0;
1095
4.07k
   st->pitch_gain_buf_idx = 0;
1096
4.07k
   st->seed = 1000;
1097
1098
4.07k
   st->sampling_rate=8000;
1099
4.07k
   st->last_ol_gain = 0;
1100
1101
4.07k
   st->user_callback.func = &speex_default_user_handler;
1102
4.07k
   st->user_callback.data = NULL;
1103
69.2k
   for (i=0;i<16;i++)
1104
65.2k
      st->speex_callbacks[i].func = NULL;
1105
1106
4.07k
   st->voc_m1=st->voc_m2=st->voc_mean=0;
1107
4.07k
   st->voc_offset=0;
1108
4.07k
   st->dtx_enabled=0;
1109
4.07k
   st->isWideband = 0;
1110
4.07k
   st->highpass_enabled = 1;
1111
1112
#ifdef ENABLE_VALGRIND
1113
   VALGRIND_MAKE_MEM_DEFINED(st, NB_DEC_STACK);
1114
#endif
1115
4.07k
   return st;
1116
4.07k
}
1117
1118
void nb_decoder_destroy(void *state)
1119
4.07k
{
1120
#if !(defined(VAR_ARRAYS) || defined (USE_ALLOCA))
1121
   DecState *st;
1122
   st=(DecState*)state;
1123
1124
   speex_free_scratch(st->stack);
1125
#endif
1126
1127
4.07k
   speex_free(state);
1128
4.07k
}
1129
1130
int nb_decoder_ctl(void *state, int request, void *ptr)
1131
181k
{
1132
181k
   DecState *st;
1133
181k
   st=(DecState*)state;
1134
181k
   switch(request)
1135
181k
   {
1136
0
   case SPEEX_SET_LOW_MODE:
1137
0
   case SPEEX_SET_MODE:
1138
0
      st->submodeID = (*(spx_int32_t*)ptr);
1139
0
      break;
1140
0
   case SPEEX_GET_LOW_MODE:
1141
0
   case SPEEX_GET_MODE:
1142
0
      (*(spx_int32_t*)ptr) = st->submodeID;
1143
0
      break;
1144
4.07k
   case SPEEX_SET_ENH:
1145
4.07k
      st->lpc_enh_enabled = *((spx_int32_t*)ptr);
1146
4.07k
      break;
1147
0
   case SPEEX_GET_ENH:
1148
0
      *((spx_int32_t*)ptr) = st->lpc_enh_enabled;
1149
0
      break;
1150
9.98k
   case SPEEX_GET_FRAME_SIZE:
1151
9.98k
      (*(spx_int32_t*)ptr) = NB_FRAME_SIZE;
1152
9.98k
      break;
1153
0
   case SPEEX_GET_BITRATE:
1154
0
      if (st->submodes[st->submodeID])
1155
0
         (*(spx_int32_t*)ptr) = st->sampling_rate*SUBMODE(bits_per_frame)/NB_FRAME_SIZE;
1156
0
      else
1157
0
         (*(spx_int32_t*)ptr) = st->sampling_rate*(NB_SUBMODE_BITS+1)/NB_FRAME_SIZE;
1158
0
      break;
1159
4.07k
   case SPEEX_SET_SAMPLING_RATE:
1160
4.07k
      st->sampling_rate = (*(spx_int32_t*)ptr);
1161
4.07k
      break;
1162
2.87k
   case SPEEX_GET_SAMPLING_RATE:
1163
2.87k
      (*(spx_int32_t*)ptr)=st->sampling_rate;
1164
2.87k
      break;
1165
2.09k
   case SPEEX_SET_HANDLER:
1166
2.09k
      {
1167
2.09k
         SpeexCallback *c = (SpeexCallback*)ptr;
1168
2.09k
         st->speex_callbacks[c->callback_id].func=c->func;
1169
2.09k
         st->speex_callbacks[c->callback_id].data=c->data;
1170
2.09k
         st->speex_callbacks[c->callback_id].callback_id=c->callback_id;
1171
2.09k
      }
1172
2.09k
      break;
1173
0
   case SPEEX_SET_USER_HANDLER:
1174
0
      {
1175
0
         SpeexCallback *c = (SpeexCallback*)ptr;
1176
0
         st->user_callback.func=c->func;
1177
0
         st->user_callback.data=c->data;
1178
0
         st->user_callback.callback_id=c->callback_id;
1179
0
      }
1180
0
      break;
1181
0
   case SPEEX_RESET_STATE:
1182
0
      {
1183
0
         int i;
1184
0
         for (i=0;i<NB_ORDER;i++)
1185
0
            st->mem_sp[i]=0;
1186
0
         for (i=0;i<NB_FRAME_SIZE + NB_PITCH_END + 1;i++)
1187
0
            st->excBuf[i]=0;
1188
0
      }
1189
0
      break;
1190
0
   case SPEEX_SET_SUBMODE_ENCODING:
1191
0
      st->encode_submode = (*(spx_int32_t*)ptr);
1192
0
      break;
1193
0
   case SPEEX_GET_SUBMODE_ENCODING:
1194
0
      (*(spx_int32_t*)ptr) = st->encode_submode;
1195
0
      break;
1196
3.91k
   case SPEEX_GET_LOOKAHEAD:
1197
3.91k
      (*(spx_int32_t*)ptr)=NB_SUBFRAME_SIZE;
1198
3.91k
      break;
1199
0
   case SPEEX_SET_HIGHPASS:
1200
0
      st->highpass_enabled = (*(spx_int32_t*)ptr);
1201
0
      break;
1202
0
   case SPEEX_GET_HIGHPASS:
1203
0
      (*(spx_int32_t*)ptr) = st->highpass_enabled;
1204
0
      break;
1205
      /* FIXME: Convert to fixed-point and re-enable even when float API is disabled */
1206
0
#ifndef DISABLE_FLOAT_API
1207
0
   case SPEEX_GET_ACTIVITY:
1208
0
   {
1209
0
      float ret;
1210
0
      ret = log(st->level/st->min_level)/log(st->max_level/st->min_level);
1211
0
      if (ret>1)
1212
0
         ret = 1;
1213
      /* Done in a strange way to catch NaNs as well */
1214
0
      if (!(ret > 0))
1215
0
         ret = 0;
1216
      /*printf ("%f %f %f %f\n", st->level, st->min_level, st->max_level, ret);*/
1217
0
      (*(spx_int32_t*)ptr) = (int)(100*ret);
1218
0
   }
1219
0
   break;
1220
0
#endif
1221
5.12k
   case SPEEX_GET_PI_GAIN:
1222
5.12k
      {
1223
5.12k
         int i;
1224
5.12k
         spx_word32_t *g = (spx_word32_t*)ptr;
1225
25.6k
         for (i=0;i<NB_NB_SUBFRAMES;i++)
1226
20.5k
            g[i]=st->pi_gain[i];
1227
5.12k
      }
1228
5.12k
      break;
1229
5.12k
   case SPEEX_GET_EXC:
1230
5.12k
      {
1231
5.12k
         int i;
1232
25.6k
         for (i=0;i<NB_NB_SUBFRAMES;i++)
1233
20.5k
            ((spx_word16_t*)ptr)[i] = compute_rms16(st->exc+i*NB_SUBFRAME_SIZE, NB_SUBFRAME_SIZE);
1234
5.12k
      }
1235
5.12k
      break;
1236
87.6k
   case SPEEX_GET_DTX_STATUS:
1237
87.6k
      *((spx_int32_t*)ptr) = st->dtx_enabled;
1238
87.6k
      break;
1239
51.8k
   case SPEEX_SET_INNOVATION_SAVE:
1240
51.8k
      st->innov_save = (spx_word16_t*)ptr;
1241
51.8k
      break;
1242
4.59k
   case SPEEX_SET_WIDEBAND:
1243
4.59k
      st->isWideband = *((spx_int32_t*)ptr);
1244
4.59k
      break;
1245
0
   case SPEEX_GET_STACK:
1246
0
      *((char**)ptr) = st->stack;
1247
0
      break;
1248
0
   default:
1249
0
      speex_warning_int("Unknown nb_ctl request: ", request);
1250
0
      return -1;
1251
181k
   }
1252
181k
   return 0;
1253
181k
}
1254
1255
1256
0
#define median3(a, b, c)  ((a) < (b) ? ((b) < (c) ? (b) : ((a) < (c) ? (c) : (a))) : ((c) < (b) ? (b) : ((c) < (a) ? (c) : (a))))
1257
1258
#ifdef FIXED_POINT
1259
const spx_word16_t attenuation[10] = {32767, 31483, 27923, 22861, 17278, 12055, 7764, 4616, 2533, 1283};
1260
#else
1261
const spx_word16_t attenuation[10] = {1., 0.961, 0.852, 0.698, 0.527, 0.368, 0.237, 0.141, 0.077, 0.039};
1262
1263
#endif
1264
1265
static void nb_decode_lost(DecState *st, spx_word16_t *out, char *stack)
1266
0
{
1267
0
   int i;
1268
0
   int pitch_val;
1269
0
   spx_word16_t pitch_gain;
1270
0
   spx_word16_t fact;
1271
0
   spx_word16_t gain_med;
1272
0
   spx_word16_t innov_gain;
1273
0
   spx_word16_t noise_gain;
1274
1275
0
   st->exc = st->excBuf + 2*NB_PITCH_END + NB_SUBFRAME_SIZE + 6;
1276
1277
0
   if (st->count_lost<10)
1278
0
      fact = attenuation[st->count_lost];
1279
0
   else
1280
0
      fact = 0;
1281
1282
0
   gain_med = median3(st->pitch_gain_buf[0], st->pitch_gain_buf[1], st->pitch_gain_buf[2]);
1283
0
   if (gain_med < st->last_pitch_gain)
1284
0
      st->last_pitch_gain = gain_med;
1285
1286
#ifdef FIXED_POINT
1287
   pitch_gain = st->last_pitch_gain;
1288
0
   if (pitch_gain>54)
1289
0
      pitch_gain = 54;
1290
0
   pitch_gain = SHL16(pitch_gain, 9);
1291
#else
1292
0
   pitch_gain = GAIN_SCALING_1*st->last_pitch_gain;
1293
0
   if (pitch_gain>.85)
1294
0
      pitch_gain=.85;
1295
#endif
1296
0
   pitch_gain = MULT16_16_Q15(fact,pitch_gain) + VERY_SMALL;
1297
   /* FIXME: This was rms of innovation (not exc) */
1298
0
   innov_gain = compute_rms16(st->exc, NB_FRAME_SIZE);
1299
0
   noise_gain = MULT16_16_Q15(innov_gain, MULT16_16_Q15(fact, SUB16(Q15ONE,MULT16_16_Q15(pitch_gain,pitch_gain))));
1300
   /* Shift all buffers by one frame */
1301
0
   SPEEX_MOVE(st->excBuf, st->excBuf+NB_FRAME_SIZE, 2*NB_PITCH_END + NB_SUBFRAME_SIZE + 12);
1302
1303
1304
0
   pitch_val = st->last_pitch + SHR32((spx_int32_t)speex_rand(1+st->count_lost, &st->seed),SIG_SHIFT);
1305
0
   if (pitch_val > NB_PITCH_END)
1306
0
      pitch_val = NB_PITCH_END;
1307
0
   if (pitch_val < NB_PITCH_START)
1308
0
      pitch_val = NB_PITCH_START;
1309
0
   for (i=0;i<NB_FRAME_SIZE;i++)
1310
0
   {
1311
0
      st->exc[i]= MULT16_16_Q15(pitch_gain, (st->exc[i-pitch_val]+VERY_SMALL)) +
1312
0
            speex_rand(noise_gain, &st->seed);
1313
0
   }
1314
1315
0
   bw_lpc(QCONST16(.98,15), st->interp_qlpc, st->interp_qlpc, NB_ORDER);
1316
0
   iir_mem16(&st->exc[-NB_SUBFRAME_SIZE], st->interp_qlpc, out, NB_FRAME_SIZE,
1317
0
             NB_ORDER, st->mem_sp, stack);
1318
0
   highpass(out, out, NB_FRAME_SIZE, HIGHPASS_NARROWBAND|HIGHPASS_OUTPUT, st->mem_hp);
1319
1320
0
   st->first = 0;
1321
0
   st->count_lost++;
1322
0
   st->pitch_gain_buf[st->pitch_gain_buf_idx++] = PSHR16(pitch_gain,9);
1323
0
   if (st->pitch_gain_buf_idx > 2) /* rollover */
1324
0
      st->pitch_gain_buf_idx = 0;
1325
0
}
Unexecuted instantiation: nb_celp.c:nb_decode_lost
Unexecuted instantiation: nb_celp.c:nb_decode_lost
1326
1327
/* Just so we don't need to carry the complete wideband mode information */
1328
static const int wb_skip_table[8] = {0, 36, 112, 192, 352, 0, 0, 0};
1329
1330
int nb_decode(void *state, SpeexBits *bits, void *vout)
1331
68.6k
{
1332
68.6k
   DecState *st;
1333
68.6k
   int i, sub;
1334
68.6k
   int pitch;
1335
68.6k
   spx_word16_t pitch_gain[3];
1336
68.6k
   spx_word32_t ol_gain=0;
1337
68.6k
   int ol_pitch=0;
1338
68.6k
   spx_word16_t ol_pitch_coef=0;
1339
68.6k
   int best_pitch=40;
1340
68.6k
   spx_word16_t best_pitch_gain=0;
1341
68.6k
   int wideband;
1342
68.6k
   int m;
1343
68.6k
   char *stack;
1344
68.6k
   VARDECL(spx_sig_t *innov);
1345
68.6k
   VARDECL(spx_word32_t *exc32);
1346
68.6k
   VARDECL(spx_coef_t *ak);
1347
68.6k
   VARDECL(spx_lsp_t *qlsp);
1348
68.6k
   spx_word16_t pitch_average=0;
1349
1350
68.6k
   spx_word16_t *out = (spx_word16_t*)vout;
1351
68.6k
   VARDECL(spx_lsp_t *interp_qlsp);
1352
1353
68.6k
   st=(DecState*)state;
1354
68.6k
   stack=st->stack;
1355
1356
68.6k
   st->exc = st->excBuf + 2*NB_PITCH_END + NB_SUBFRAME_SIZE + 6;
1357
1358
   /* Check if we're in DTX mode*/
1359
68.6k
   if (!bits && st->dtx_enabled)
1360
0
   {
1361
0
      st->submodeID=0;
1362
0
   } else
1363
68.6k
   {
1364
      /* If bits is NULL, consider the packet to be lost (what could we do anyway) */
1365
68.6k
      if (!bits)
1366
0
      {
1367
0
         nb_decode_lost(st, out, stack);
1368
0
         return 0;
1369
0
      }
1370
1371
68.6k
      if (st->encode_submode)
1372
68.6k
      {
1373
1374
      /* Search for next narrowband block (handle requests, skip wideband blocks) */
1375
73.7k
      do {
1376
73.7k
         if (speex_bits_remaining(bits)<5)
1377
13.5k
            return -1;
1378
60.1k
         wideband = speex_bits_unpack_unsigned(bits, 1);
1379
60.1k
         if (wideband) /* Skip wideband block (for compatibility) */
1380
3.93k
         {
1381
3.93k
            int submode;
1382
3.93k
            int advance;
1383
3.93k
            advance = submode = speex_bits_unpack_unsigned(bits, SB_SUBMODE_BITS);
1384
            /*speex_mode_query(&speex_wb_mode, SPEEX_SUBMODE_BITS_PER_FRAME, &advance);*/
1385
3.93k
            advance = wb_skip_table[submode];
1386
3.93k
            if (advance < 0)
1387
0
            {
1388
0
               speex_notify("Invalid mode encountered. The stream is corrupted.");
1389
0
               return -2;
1390
0
            }
1391
3.93k
            advance -= (SB_SUBMODE_BITS+1);
1392
3.93k
            speex_bits_advance(bits, advance);
1393
1394
3.93k
            if (speex_bits_remaining(bits)<5)
1395
936
               return -1;
1396
2.99k
            wideband = speex_bits_unpack_unsigned(bits, 1);
1397
2.99k
            if (wideband)
1398
2.34k
            {
1399
2.34k
               advance = submode = speex_bits_unpack_unsigned(bits, SB_SUBMODE_BITS);
1400
               /*speex_mode_query(&speex_wb_mode, SPEEX_SUBMODE_BITS_PER_FRAME, &advance);*/
1401
2.34k
               advance = wb_skip_table[submode];
1402
2.34k
               if (advance < 0)
1403
0
               {
1404
0
                  speex_notify("Invalid mode encountered. The stream is corrupted.");
1405
0
                  return -2;
1406
0
               }
1407
2.34k
               advance -= (SB_SUBMODE_BITS+1);
1408
2.34k
               speex_bits_advance(bits, advance);
1409
2.34k
               wideband = speex_bits_unpack_unsigned(bits, 1);
1410
2.34k
               if (wideband)
1411
1.89k
               {
1412
1.89k
                  speex_notify("More than two wideband layers found. The stream is corrupted.");
1413
1.89k
                  return -2;
1414
1.89k
               }
1415
1416
2.34k
            }
1417
2.99k
         }
1418
57.2k
         if (speex_bits_remaining(bits)<4)
1419
427
            return -1;
1420
         /* FIXME: Check for overflow */
1421
56.8k
         m = speex_bits_unpack_unsigned(bits, 4);
1422
56.8k
         if (m==15) /* We found a terminator */
1423
968
         {
1424
968
            return -1;
1425
55.9k
         } else if (m==14) /* Speex in-band request */
1426
4.36k
         {
1427
4.36k
            int ret = speex_inband_handler(bits, st->speex_callbacks, state);
1428
4.36k
            if (ret)
1429
0
               return ret;
1430
51.5k
         } else if (m==13) /* User in-band request */
1431
687
         {
1432
687
            int ret = st->user_callback.func(bits, state, st->user_callback.data);
1433
687
            if (ret)
1434
0
               return ret;
1435
50.8k
         } else if (m>8) /* Invalid mode */
1436
3.09k
         {
1437
3.09k
            speex_notify("Invalid mode encountered. The stream is corrupted.");
1438
3.09k
            return -2;
1439
3.09k
         }
1440
1441
56.8k
      } while (m>8);
1442
1443
      /* Get the sub-mode that was used */
1444
47.7k
      st->submodeID = m;
1445
47.7k
      }
1446
1447
68.6k
   }
1448
1449
   /* Shift all buffers by one frame */
1450
47.7k
   SPEEX_MOVE(st->excBuf, st->excBuf+NB_FRAME_SIZE, 2*NB_PITCH_END + NB_SUBFRAME_SIZE + 12);
1451
1452
   /* If null mode (no transmission), just set a couple things to zero*/
1453
47.7k
   if (st->submodes[st->submodeID] == NULL)
1454
22.8k
   {
1455
22.8k
      VARDECL(spx_coef_t *lpc);
1456
22.8k
      ALLOC(lpc, NB_ORDER, spx_coef_t);
1457
22.8k
      bw_lpc(QCONST16(0.93f,15), st->interp_qlpc, lpc, NB_ORDER);
1458
22.8k
      {
1459
22.8k
         spx_word16_t innov_gain=0;
1460
         /* FIXME: This was innov, not exc */
1461
22.8k
         innov_gain = compute_rms16(st->exc, NB_FRAME_SIZE);
1462
3.67M
         for (i=0;i<NB_FRAME_SIZE;i++)
1463
3.65M
            st->exc[i]=speex_rand(innov_gain, &st->seed);
1464
22.8k
      }
1465
1466
1467
22.8k
      st->first=1;
1468
1469
      /* Final signal synthesis from excitation */
1470
22.8k
      iir_mem16(st->exc, lpc, out, NB_FRAME_SIZE, NB_ORDER, st->mem_sp, stack);
1471
1472
      /* Normally this is written to later but since this is returning early,
1473
         avoid reading uninitialized memory in caller */
1474
22.8k
      if (st->innov_save)
1475
18.8k
         SPEEX_MEMSET(st->innov_save, 0, NB_NB_SUBFRAMES*NB_SUBFRAME_SIZE);
1476
1477
22.8k
      st->count_lost=0;
1478
22.8k
      return 0;
1479
22.8k
   }
1480
1481
24.9k
   ALLOC(qlsp, NB_ORDER, spx_lsp_t);
1482
1483
   /* Unquantize LSPs */
1484
24.9k
   SUBMODE(lsp_unquant)(qlsp, NB_ORDER, bits);
1485
1486
   /*Damp memory if a frame was lost and the LSP changed too much*/
1487
24.9k
   if (st->count_lost)
1488
0
   {
1489
0
      spx_word16_t fact;
1490
0
      spx_word32_t lsp_dist=0;
1491
0
      for (i=0;i<NB_ORDER;i++)
1492
0
         lsp_dist = ADD32(lsp_dist, EXTEND32(ABS(st->old_qlsp[i] - qlsp[i])));
1493
#ifdef FIXED_POINT
1494
0
      fact = SHR16(19661,SHR32(lsp_dist,LSP_SHIFT+2));
1495
#else
1496
      fact = .6*exp(-.2*lsp_dist);
1497
#endif
1498
0
      for (i=0;i<NB_ORDER;i++)
1499
0
         st->mem_sp[i] = MULT16_32_Q15(fact,st->mem_sp[i]);
1500
0
   }
1501
1502
1503
   /* Handle first frame and lost-packet case */
1504
24.9k
   if (st->first || st->count_lost)
1505
4.85k
   {
1506
53.4k
      for (i=0;i<NB_ORDER;i++)
1507
48.5k
         st->old_qlsp[i] = qlsp[i];
1508
4.85k
   }
1509
1510
   /* Get open-loop pitch estimation for low bit-rate pitch coding */
1511
24.9k
   if (SUBMODE(lbr_pitch)!=-1)
1512
10.1k
   {
1513
10.1k
      ol_pitch = NB_PITCH_START+speex_bits_unpack_unsigned(bits, 7);
1514
10.1k
   }
1515
1516
24.9k
   if (SUBMODE(forced_pitch_gain))
1517
8.36k
   {
1518
8.36k
      int quant;
1519
8.36k
      quant = speex_bits_unpack_unsigned(bits, 4);
1520
8.36k
      ol_pitch_coef=MULT16_16_P15(QCONST16(0.066667,15),SHL16(quant,GAIN_SHIFT));
1521
8.36k
   }
1522
1523
   /* Get global excitation gain */
1524
24.9k
   {
1525
24.9k
      int qe;
1526
24.9k
      qe = speex_bits_unpack_unsigned(bits, 5);
1527
#ifdef FIXED_POINT
1528
      /* FIXME: Perhaps we could slightly lower the gain here when the output is going to saturate? */
1529
13.8k
      ol_gain = MULT16_32_Q15(28406,ol_gain_table[qe]);
1530
#else
1531
11.1k
      ol_gain = SIG_SCALING*exp(qe/3.5);
1532
#endif
1533
24.9k
   }
1534
1535
24.9k
   ALLOC(ak, NB_ORDER, spx_coef_t);
1536
24.9k
   ALLOC(innov, NB_SUBFRAME_SIZE, spx_sig_t);
1537
24.9k
   ALLOC(exc32, NB_SUBFRAME_SIZE, spx_word32_t);
1538
1539
24.9k
   if (st->submodeID==1)
1540
4.23k
   {
1541
4.23k
      int extra;
1542
4.23k
      extra = speex_bits_unpack_unsigned(bits, 4);
1543
1544
4.23k
      if (extra==15)
1545
806
         st->dtx_enabled=1;
1546
3.42k
      else
1547
3.42k
         st->dtx_enabled=0;
1548
4.23k
   }
1549
24.9k
   if (st->submodeID>1)
1550
20.6k
      st->dtx_enabled=0;
1551
1552
   /*Loop on subframes */
1553
124k
   for (sub=0;sub<NB_NB_SUBFRAMES;sub++)
1554
99.7k
   {
1555
99.7k
      int offset;
1556
99.7k
      spx_word16_t *exc;
1557
99.7k
      spx_word16_t *innov_save = NULL;
1558
99.7k
      spx_word16_t tmp;
1559
1560
      /* Offset relative to start of frame */
1561
99.7k
      offset = NB_SUBFRAME_SIZE*sub;
1562
      /* Excitation */
1563
99.7k
      exc=st->exc+offset;
1564
      /* Original signal */
1565
99.7k
      if (st->innov_save)
1566
70.9k
         innov_save = st->innov_save+offset;
1567
1568
1569
      /* Reset excitation */
1570
99.7k
      SPEEX_MEMSET(exc, 0, NB_SUBFRAME_SIZE);
1571
1572
      /*Adaptive codebook contribution*/
1573
99.7k
      speex_assert (SUBMODE(ltp_unquant));
1574
99.7k
      {
1575
99.7k
         int pit_min, pit_max;
1576
         /* Handle pitch constraints if any */
1577
99.7k
         if (SUBMODE(lbr_pitch) != -1)
1578
40.5k
         {
1579
40.5k
            int margin;
1580
40.5k
            margin = SUBMODE(lbr_pitch);
1581
40.5k
            if (margin)
1582
0
            {
1583
/* GT - need optimization?
1584
               if (ol_pitch < NB_PITCH_START+margin-1)
1585
                  ol_pitch=NB_PITCH_START+margin-1;
1586
               if (ol_pitch > NB_PITCH_END-margin)
1587
                  ol_pitch=NB_PITCH_END-margin;
1588
               pit_min = ol_pitch-margin+1;
1589
               pit_max = ol_pitch+margin;
1590
*/
1591
0
               pit_min = ol_pitch-margin+1;
1592
0
               if (pit_min < NB_PITCH_START)
1593
0
      pit_min = NB_PITCH_START;
1594
0
               pit_max = ol_pitch+margin;
1595
0
               if (pit_max > NB_PITCH_END)
1596
0
      pit_max = NB_PITCH_END;
1597
40.5k
            } else {
1598
40.5k
               pit_min = pit_max = ol_pitch;
1599
40.5k
            }
1600
59.1k
         } else {
1601
59.1k
            pit_min = NB_PITCH_START;
1602
59.1k
            pit_max = NB_PITCH_END;
1603
59.1k
         }
1604
1605
1606
1607
99.7k
         SUBMODE(ltp_unquant)(exc, exc32, pit_min, pit_max, ol_pitch_coef, SUBMODE(ltp_params),
1608
99.7k
                 NB_SUBFRAME_SIZE, &pitch, &pitch_gain[0], bits, stack,
1609
99.7k
                 st->count_lost, offset, st->last_pitch_gain, 0);
1610
1611
         /* Ensuring that things aren't blowing up as would happen if e.g. an encoder is
1612
         crafting packets to make us produce NaNs and slow down the decoder (vague DoS threat).
1613
         We can probably be even more aggressive and limit to 15000 or so. */
1614
99.7k
         sanitize_values32(exc32, NEG32(QCONST32(32000,SIG_SHIFT-1)), QCONST32(32000,SIG_SHIFT-1), NB_SUBFRAME_SIZE);
1615
1616
99.7k
         tmp = gain_3tap_to_1tap(pitch_gain);
1617
1618
99.7k
         pitch_average += tmp;
1619
99.7k
         if ((tmp>best_pitch_gain&&ABS(2*best_pitch-pitch)>=3&&ABS(3*best_pitch-pitch)>=4&&ABS(4*best_pitch-pitch)>=5)
1620
99.7k
              || (tmp>MULT16_16_Q15(QCONST16(.6,15),best_pitch_gain)&&(ABS(best_pitch-2*pitch)<3||ABS(best_pitch-3*pitch)<4||ABS(best_pitch-4*pitch)<5))
1621
99.7k
              || (MULT16_16_Q15(QCONST16(.67,15),tmp)>best_pitch_gain&&(ABS(2*best_pitch-pitch)<3||ABS(3*best_pitch-pitch)<4||ABS(4*best_pitch-pitch)<5)) )
1622
15.3k
         {
1623
15.3k
            best_pitch = pitch;
1624
15.3k
            if (tmp > best_pitch_gain)
1625
14.0k
               best_pitch_gain = tmp;
1626
15.3k
         }
1627
99.7k
      }
1628
1629
      /* Unquantize the innovation */
1630
99.7k
      {
1631
99.7k
         int q_energy;
1632
99.7k
         spx_word32_t ener;
1633
1634
99.7k
         SPEEX_MEMSET(innov, 0, NB_SUBFRAME_SIZE);
1635
1636
         /* Decode sub-frame gain correction */
1637
99.7k
         if (SUBMODE(have_subframe_gain)==3)
1638
22.5k
         {
1639
22.5k
            q_energy = speex_bits_unpack_unsigned(bits, 3);
1640
22.5k
            ener = MULT16_32_Q14(exc_gain_quant_scal3[q_energy],ol_gain);
1641
77.2k
         } else if (SUBMODE(have_subframe_gain)==1)
1642
36.6k
         {
1643
36.6k
            q_energy = speex_bits_unpack_unsigned(bits, 1);
1644
36.6k
            ener = MULT16_32_Q14(exc_gain_quant_scal1[q_energy],ol_gain);
1645
40.5k
         } else {
1646
40.5k
            ener = ol_gain;
1647
40.5k
         }
1648
1649
99.7k
         speex_assert (SUBMODE(innovation_unquant));
1650
99.7k
         {
1651
            /*Fixed codebook contribution*/
1652
99.7k
            SUBMODE(innovation_unquant)(innov, SUBMODE(innovation_params), NB_SUBFRAME_SIZE, bits, stack, &st->seed);
1653
            /* De-normalize innovation and update excitation */
1654
1655
99.7k
            signal_mul(innov, innov, ener, NB_SUBFRAME_SIZE);
1656
1657
            /* Decode second codebook (only for some modes) */
1658
99.7k
            if (SUBMODE(double_codebook))
1659
5.88k
            {
1660
5.88k
               char *tmp_stack=stack;
1661
5.88k
               VARDECL(spx_sig_t *innov2);
1662
5.88k
               ALLOC(innov2, NB_SUBFRAME_SIZE, spx_sig_t);
1663
5.88k
               SPEEX_MEMSET(innov2, 0, NB_SUBFRAME_SIZE);
1664
5.88k
               SUBMODE(innovation_unquant)(innov2, SUBMODE(innovation_params), NB_SUBFRAME_SIZE, bits, stack, &st->seed);
1665
5.88k
               signal_mul(innov2, innov2, MULT16_32_Q15(QCONST16(0.454545f,15),ener), NB_SUBFRAME_SIZE);
1666
241k
               for (i=0;i<NB_SUBFRAME_SIZE;i++)
1667
235k
                  innov[i] = ADD32(innov[i], innov2[i]);
1668
5.88k
               stack = tmp_stack;
1669
5.88k
            }
1670
4.08M
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
1671
3.98M
               exc[i]=EXTRACT16(SATURATE32(PSHR32(ADD32(SHL32(exc32[i],1),innov[i]),SIG_SHIFT),32767));
1672
            /*print_vec(exc, 40, "innov");*/
1673
99.7k
            if (innov_save)
1674
70.9k
            {
1675
2.90M
               for (i=0;i<NB_SUBFRAME_SIZE;i++)
1676
2.83M
                  innov_save[i] = EXTRACT16(PSHR32(innov[i], SIG_SHIFT));
1677
70.9k
            }
1678
99.7k
         }
1679
1680
         /*Vocoder mode*/
1681
99.7k
         if (st->submodeID==1)
1682
16.9k
         {
1683
16.9k
            spx_word16_t g=ol_pitch_coef;
1684
16.9k
            g=MULT16_16_P14(QCONST16(1.5f,14),(g-QCONST16(.2f,6)));
1685
16.9k
            if (g<0)
1686
9.49k
               g=0;
1687
16.9k
            if (g>GAIN_SCALING)
1688
2.22k
               g=GAIN_SCALING;
1689
1690
16.9k
            SPEEX_MEMSET(exc, 0, NB_SUBFRAME_SIZE);
1691
40.1k
            while (st->voc_offset<NB_SUBFRAME_SIZE)
1692
23.2k
            {
1693
               /* exc[st->voc_offset]= g*sqrt(2*ol_pitch)*ol_gain;
1694
                  Not quite sure why we need the factor of two in the sqrt */
1695
23.2k
               if (st->voc_offset>=0)
1696
23.2k
                  exc[st->voc_offset]=MULT16_16(spx_sqrt(MULT16_16_16(2,ol_pitch)),EXTRACT16(PSHR32(MULT16_16(g,PSHR32(ol_gain,SIG_SHIFT)),6)));
1697
23.2k
               st->voc_offset+=ol_pitch;
1698
23.2k
            }
1699
16.9k
            st->voc_offset -= NB_SUBFRAME_SIZE;
1700
1701
694k
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
1702
677k
            {
1703
677k
               spx_word16_t exci=exc[i];
1704
677k
               exc[i]= ADD16(ADD16(MULT16_16_Q15(QCONST16(.7f,15),exc[i]) , MULT16_16_Q15(QCONST16(.3f,15),st->voc_m1)),
1705
677k
                             SUB16(MULT16_16_Q15(Q15_ONE-MULT16_16_16(QCONST16(.85f,9),g),EXTRACT16(PSHR32(innov[i],SIG_SHIFT))),
1706
677k
                                   MULT16_16_Q15(MULT16_16_16(QCONST16(.15f,9),g),EXTRACT16(PSHR32(st->voc_m2,SIG_SHIFT)))
1707
677k
                                  ));
1708
677k
               st->voc_m1 = exci;
1709
677k
               st->voc_m2=innov[i];
1710
677k
               st->voc_mean = EXTRACT16(PSHR32(ADD32(MULT16_16(QCONST16(.8f,15),st->voc_mean), MULT16_16(QCONST16(.2f,15),exc[i])), 15));
1711
677k
               exc[i]-=st->voc_mean;
1712
677k
            }
1713
16.9k
         }
1714
1715
99.7k
      }
1716
99.7k
   }
1717
1718
24.9k
   ALLOC(interp_qlsp, NB_ORDER, spx_lsp_t);
1719
1720
24.9k
   if (st->lpc_enh_enabled && SUBMODE(comb_gain)>0 && !st->count_lost)
1721
20.6k
   {
1722
20.6k
      multicomb(st->exc-NB_SUBFRAME_SIZE, out, st->interp_qlpc, NB_ORDER, 2*NB_SUBFRAME_SIZE, best_pitch, 40, SUBMODE(comb_gain), stack);
1723
20.6k
      multicomb(st->exc+NB_SUBFRAME_SIZE, out+2*NB_SUBFRAME_SIZE, st->interp_qlpc, NB_ORDER, 2*NB_SUBFRAME_SIZE, best_pitch, 40, SUBMODE(comb_gain), stack);
1724
20.6k
   } else {
1725
4.23k
      SPEEX_COPY(out, &st->exc[-NB_SUBFRAME_SIZE], NB_FRAME_SIZE);
1726
4.23k
   }
1727
1728
   /* If the last packet was lost, re-scale the excitation to obtain the same energy as encoded in ol_gain */
1729
24.9k
   if (st->count_lost)
1730
0
   {
1731
0
      spx_word16_t exc_ener;
1732
0
      spx_word32_t gain32;
1733
0
      spx_word16_t gain;
1734
0
      exc_ener = compute_rms16 (st->exc, NB_FRAME_SIZE);
1735
0
      gain32 = PDIV32(ol_gain, ADD16(exc_ener,1));
1736
#ifdef FIXED_POINT
1737
0
      if (gain32 > 32767)
1738
0
         gain32 = 32767;
1739
0
      gain = EXTRACT16(gain32);
1740
#else
1741
0
      if (gain32 > 2)
1742
0
         gain32=2;
1743
      gain = gain32;
1744
#endif
1745
0
      for (i=0;i<NB_FRAME_SIZE;i++)
1746
0
      {
1747
0
         st->exc[i] = MULT16_16_Q14(gain, st->exc[i]);
1748
0
         out[i]=st->exc[i-NB_SUBFRAME_SIZE];
1749
0
      }
1750
0
   }
1751
1752
   /*Loop on subframes */
1753
124k
   for (sub=0;sub<NB_NB_SUBFRAMES;sub++)
1754
99.7k
   {
1755
99.7k
      int offset;
1756
99.7k
      spx_word16_t *sp;
1757
1758
      /* Offset relative to start of frame */
1759
99.7k
      offset = NB_SUBFRAME_SIZE*sub;
1760
      /* Original signal */
1761
99.7k
      sp=out+offset;
1762
1763
      /* LSP interpolation (quantized and unquantized) */
1764
99.7k
      lsp_interpolate(st->old_qlsp, qlsp, interp_qlsp, NB_ORDER, sub, NB_NB_SUBFRAMES, LSP_MARGIN);
1765
1766
      /* Compute interpolated LPCs (unquantized) */
1767
99.7k
      lsp_to_lpc(interp_qlsp, ak, NB_ORDER, stack);
1768
1769
      /* Compute analysis filter at w=pi */
1770
99.7k
      {
1771
99.7k
         spx_word32_t pi_g=LPC_SCALING;
1772
598k
         for (i=0;i<NB_ORDER;i+=2)
1773
498k
         {
1774
            /*pi_g += -st->interp_qlpc[i] +  st->interp_qlpc[i+1];*/
1775
498k
            pi_g = ADD32(pi_g, SUB32(EXTEND32(ak[i+1]),EXTEND32(ak[i])));
1776
498k
         }
1777
99.7k
         st->pi_gain[sub] = pi_g;
1778
99.7k
      }
1779
1780
99.7k
      iir_mem16(sp, st->interp_qlpc, sp, NB_SUBFRAME_SIZE, NB_ORDER,
1781
99.7k
                st->mem_sp, stack);
1782
1783
1.09M
      for (i=0;i<NB_ORDER;i++)
1784
997k
         st->interp_qlpc[i] = ak[i];
1785
1786
99.7k
   }
1787
1788
24.9k
   if (st->highpass_enabled)
1789
24.9k
      highpass(out, out, NB_FRAME_SIZE, (st->isWideband?HIGHPASS_WIDEBAND:HIGHPASS_NARROWBAND)|HIGHPASS_OUTPUT, st->mem_hp);
1790
   /*for (i=0;i<NB_FRAME_SIZE;i++)
1791
     printf ("%d\n", (int)st->frame[i]);*/
1792
1793
   /* Tracking output level */
1794
24.9k
   st->level = 1+PSHR32(ol_gain,SIG_SHIFT);
1795
24.9k
   st->max_level = MAX16(MULT16_16_Q15(QCONST16(.99f,15), st->max_level), st->level);
1796
24.9k
   st->min_level = MIN16(ADD16(1,MULT16_16_Q14(QCONST16(1.01f,14), st->min_level)), st->level);
1797
24.9k
   if (st->max_level < st->min_level+1)
1798
7.98k
      st->max_level = st->min_level+1;
1799
   /*printf ("%f %f %f %d\n", og, st->min_level, st->max_level, update);*/
1800
1801
   /* Store the LSPs for interpolation in the next frame */
1802
274k
   for (i=0;i<NB_ORDER;i++)
1803
249k
      st->old_qlsp[i] = qlsp[i];
1804
1805
   /* The next frame will not be the first (Duh!) */
1806
24.9k
   st->first = 0;
1807
24.9k
   st->count_lost=0;
1808
24.9k
   st->last_pitch = best_pitch;
1809
#ifdef FIXED_POINT
1810
13.8k
   st->last_pitch_gain = PSHR16(pitch_average,2);
1811
#else
1812
   st->last_pitch_gain = .25*pitch_average;
1813
#endif
1814
24.9k
   st->pitch_gain_buf[st->pitch_gain_buf_idx++] = st->last_pitch_gain;
1815
24.9k
   if (st->pitch_gain_buf_idx > 2) /* rollover */
1816
7.41k
      st->pitch_gain_buf_idx = 0;
1817
1818
24.9k
   st->last_ol_gain = ol_gain;
1819
1820
24.9k
   return 0;
1821
47.7k
}
nb_decode
Line
Count
Source
1331
31.9k
{
1332
31.9k
   DecState *st;
1333
31.9k
   int i, sub;
1334
31.9k
   int pitch;
1335
31.9k
   spx_word16_t pitch_gain[3];
1336
31.9k
   spx_word32_t ol_gain=0;
1337
31.9k
   int ol_pitch=0;
1338
31.9k
   spx_word16_t ol_pitch_coef=0;
1339
31.9k
   int best_pitch=40;
1340
31.9k
   spx_word16_t best_pitch_gain=0;
1341
31.9k
   int wideband;
1342
31.9k
   int m;
1343
31.9k
   char *stack;
1344
31.9k
   VARDECL(spx_sig_t *innov);
1345
31.9k
   VARDECL(spx_word32_t *exc32);
1346
31.9k
   VARDECL(spx_coef_t *ak);
1347
31.9k
   VARDECL(spx_lsp_t *qlsp);
1348
31.9k
   spx_word16_t pitch_average=0;
1349
1350
31.9k
   spx_word16_t *out = (spx_word16_t*)vout;
1351
31.9k
   VARDECL(spx_lsp_t *interp_qlsp);
1352
1353
31.9k
   st=(DecState*)state;
1354
31.9k
   stack=st->stack;
1355
1356
31.9k
   st->exc = st->excBuf + 2*NB_PITCH_END + NB_SUBFRAME_SIZE + 6;
1357
1358
   /* Check if we're in DTX mode*/
1359
31.9k
   if (!bits && st->dtx_enabled)
1360
0
   {
1361
0
      st->submodeID=0;
1362
0
   } else
1363
31.9k
   {
1364
      /* If bits is NULL, consider the packet to be lost (what could we do anyway) */
1365
31.9k
      if (!bits)
1366
0
      {
1367
0
         nb_decode_lost(st, out, stack);
1368
0
         return 0;
1369
0
      }
1370
1371
31.9k
      if (st->encode_submode)
1372
31.9k
      {
1373
1374
      /* Search for next narrowband block (handle requests, skip wideband blocks) */
1375
34.4k
      do {
1376
34.4k
         if (speex_bits_remaining(bits)<5)
1377
7.98k
            return -1;
1378
26.5k
         wideband = speex_bits_unpack_unsigned(bits, 1);
1379
26.5k
         if (wideband) /* Skip wideband block (for compatibility) */
1380
1.80k
         {
1381
1.80k
            int submode;
1382
1.80k
            int advance;
1383
1.80k
            advance = submode = speex_bits_unpack_unsigned(bits, SB_SUBMODE_BITS);
1384
            /*speex_mode_query(&speex_wb_mode, SPEEX_SUBMODE_BITS_PER_FRAME, &advance);*/
1385
1.80k
            advance = wb_skip_table[submode];
1386
1.80k
            if (advance < 0)
1387
0
            {
1388
0
               speex_notify("Invalid mode encountered. The stream is corrupted.");
1389
0
               return -2;
1390
0
            }
1391
1.80k
            advance -= (SB_SUBMODE_BITS+1);
1392
1.80k
            speex_bits_advance(bits, advance);
1393
1394
1.80k
            if (speex_bits_remaining(bits)<5)
1395
438
               return -1;
1396
1.36k
            wideband = speex_bits_unpack_unsigned(bits, 1);
1397
1.36k
            if (wideband)
1398
1.07k
            {
1399
1.07k
               advance = submode = speex_bits_unpack_unsigned(bits, SB_SUBMODE_BITS);
1400
               /*speex_mode_query(&speex_wb_mode, SPEEX_SUBMODE_BITS_PER_FRAME, &advance);*/
1401
1.07k
               advance = wb_skip_table[submode];
1402
1.07k
               if (advance < 0)
1403
0
               {
1404
0
                  speex_notify("Invalid mode encountered. The stream is corrupted.");
1405
0
                  return -2;
1406
0
               }
1407
1.07k
               advance -= (SB_SUBMODE_BITS+1);
1408
1.07k
               speex_bits_advance(bits, advance);
1409
1.07k
               wideband = speex_bits_unpack_unsigned(bits, 1);
1410
1.07k
               if (wideband)
1411
857
               {
1412
857
                  speex_notify("More than two wideband layers found. The stream is corrupted.");
1413
857
                  return -2;
1414
857
               }
1415
1416
1.07k
            }
1417
1.36k
         }
1418
25.2k
         if (speex_bits_remaining(bits)<4)
1419
218
            return -1;
1420
         /* FIXME: Check for overflow */
1421
24.9k
         m = speex_bits_unpack_unsigned(bits, 4);
1422
24.9k
         if (m==15) /* We found a terminator */
1423
431
         {
1424
431
            return -1;
1425
24.5k
         } else if (m==14) /* Speex in-band request */
1426
2.23k
         {
1427
2.23k
            int ret = speex_inband_handler(bits, st->speex_callbacks, state);
1428
2.23k
            if (ret)
1429
0
               return ret;
1430
22.3k
         } else if (m==13) /* User in-band request */
1431
353
         {
1432
353
            int ret = st->user_callback.func(bits, state, st->user_callback.data);
1433
353
            if (ret)
1434
0
               return ret;
1435
21.9k
         } else if (m>8) /* Invalid mode */
1436
1.28k
         {
1437
1.28k
            speex_notify("Invalid mode encountered. The stream is corrupted.");
1438
1.28k
            return -2;
1439
1.28k
         }
1440
1441
24.9k
      } while (m>8);
1442
1443
      /* Get the sub-mode that was used */
1444
20.7k
      st->submodeID = m;
1445
20.7k
      }
1446
1447
31.9k
   }
1448
1449
   /* Shift all buffers by one frame */
1450
20.7k
   SPEEX_MOVE(st->excBuf, st->excBuf+NB_FRAME_SIZE, 2*NB_PITCH_END + NB_SUBFRAME_SIZE + 12);
1451
1452
   /* If null mode (no transmission), just set a couple things to zero*/
1453
20.7k
   if (st->submodes[st->submodeID] == NULL)
1454
9.59k
   {
1455
9.59k
      VARDECL(spx_coef_t *lpc);
1456
9.59k
      ALLOC(lpc, NB_ORDER, spx_coef_t);
1457
9.59k
      bw_lpc(QCONST16(0.93f,15), st->interp_qlpc, lpc, NB_ORDER);
1458
9.59k
      {
1459
9.59k
         spx_word16_t innov_gain=0;
1460
         /* FIXME: This was innov, not exc */
1461
9.59k
         innov_gain = compute_rms16(st->exc, NB_FRAME_SIZE);
1462
1.54M
         for (i=0;i<NB_FRAME_SIZE;i++)
1463
1.53M
            st->exc[i]=speex_rand(innov_gain, &st->seed);
1464
9.59k
      }
1465
1466
1467
9.59k
      st->first=1;
1468
1469
      /* Final signal synthesis from excitation */
1470
9.59k
      iir_mem16(st->exc, lpc, out, NB_FRAME_SIZE, NB_ORDER, st->mem_sp, stack);
1471
1472
      /* Normally this is written to later but since this is returning early,
1473
         avoid reading uninitialized memory in caller */
1474
9.59k
      if (st->innov_save)
1475
8.25k
         SPEEX_MEMSET(st->innov_save, 0, NB_NB_SUBFRAMES*NB_SUBFRAME_SIZE);
1476
1477
9.59k
      st->count_lost=0;
1478
9.59k
      return 0;
1479
9.59k
   }
1480
1481
11.1k
   ALLOC(qlsp, NB_ORDER, spx_lsp_t);
1482
1483
   /* Unquantize LSPs */
1484
11.1k
   SUBMODE(lsp_unquant)(qlsp, NB_ORDER, bits);
1485
1486
   /*Damp memory if a frame was lost and the LSP changed too much*/
1487
11.1k
   if (st->count_lost)
1488
0
   {
1489
0
      spx_word16_t fact;
1490
0
      spx_word32_t lsp_dist=0;
1491
0
      for (i=0;i<NB_ORDER;i++)
1492
0
         lsp_dist = ADD32(lsp_dist, EXTEND32(ABS(st->old_qlsp[i] - qlsp[i])));
1493
#ifdef FIXED_POINT
1494
      fact = SHR16(19661,SHR32(lsp_dist,LSP_SHIFT+2));
1495
#else
1496
0
      fact = .6*exp(-.2*lsp_dist);
1497
0
#endif
1498
0
      for (i=0;i<NB_ORDER;i++)
1499
0
         st->mem_sp[i] = MULT16_32_Q15(fact,st->mem_sp[i]);
1500
0
   }
1501
1502
1503
   /* Handle first frame and lost-packet case */
1504
11.1k
   if (st->first || st->count_lost)
1505
1.91k
   {
1506
21.0k
      for (i=0;i<NB_ORDER;i++)
1507
19.1k
         st->old_qlsp[i] = qlsp[i];
1508
1.91k
   }
1509
1510
   /* Get open-loop pitch estimation for low bit-rate pitch coding */
1511
11.1k
   if (SUBMODE(lbr_pitch)!=-1)
1512
4.72k
   {
1513
4.72k
      ol_pitch = NB_PITCH_START+speex_bits_unpack_unsigned(bits, 7);
1514
4.72k
   }
1515
1516
11.1k
   if (SUBMODE(forced_pitch_gain))
1517
4.04k
   {
1518
4.04k
      int quant;
1519
4.04k
      quant = speex_bits_unpack_unsigned(bits, 4);
1520
4.04k
      ol_pitch_coef=MULT16_16_P15(QCONST16(0.066667,15),SHL16(quant,GAIN_SHIFT));
1521
4.04k
   }
1522
1523
   /* Get global excitation gain */
1524
11.1k
   {
1525
11.1k
      int qe;
1526
11.1k
      qe = speex_bits_unpack_unsigned(bits, 5);
1527
#ifdef FIXED_POINT
1528
      /* FIXME: Perhaps we could slightly lower the gain here when the output is going to saturate? */
1529
      ol_gain = MULT16_32_Q15(28406,ol_gain_table[qe]);
1530
#else
1531
11.1k
      ol_gain = SIG_SCALING*exp(qe/3.5);
1532
11.1k
#endif
1533
11.1k
   }
1534
1535
11.1k
   ALLOC(ak, NB_ORDER, spx_coef_t);
1536
11.1k
   ALLOC(innov, NB_SUBFRAME_SIZE, spx_sig_t);
1537
11.1k
   ALLOC(exc32, NB_SUBFRAME_SIZE, spx_word32_t);
1538
1539
11.1k
   if (st->submodeID==1)
1540
1.91k
   {
1541
1.91k
      int extra;
1542
1.91k
      extra = speex_bits_unpack_unsigned(bits, 4);
1543
1544
1.91k
      if (extra==15)
1545
290
         st->dtx_enabled=1;
1546
1.62k
      else
1547
1.62k
         st->dtx_enabled=0;
1548
1.91k
   }
1549
11.1k
   if (st->submodeID>1)
1550
9.18k
      st->dtx_enabled=0;
1551
1552
   /*Loop on subframes */
1553
55.5k
   for (sub=0;sub<NB_NB_SUBFRAMES;sub++)
1554
44.4k
   {
1555
44.4k
      int offset;
1556
44.4k
      spx_word16_t *exc;
1557
44.4k
      spx_word16_t *innov_save = NULL;
1558
44.4k
      spx_word16_t tmp;
1559
1560
      /* Offset relative to start of frame */
1561
44.4k
      offset = NB_SUBFRAME_SIZE*sub;
1562
      /* Excitation */
1563
44.4k
      exc=st->exc+offset;
1564
      /* Original signal */
1565
44.4k
      if (st->innov_save)
1566
30.7k
         innov_save = st->innov_save+offset;
1567
1568
1569
      /* Reset excitation */
1570
44.4k
      SPEEX_MEMSET(exc, 0, NB_SUBFRAME_SIZE);
1571
1572
      /*Adaptive codebook contribution*/
1573
44.4k
      speex_assert (SUBMODE(ltp_unquant));
1574
44.4k
      {
1575
44.4k
         int pit_min, pit_max;
1576
         /* Handle pitch constraints if any */
1577
44.4k
         if (SUBMODE(lbr_pitch) != -1)
1578
18.8k
         {
1579
18.8k
            int margin;
1580
18.8k
            margin = SUBMODE(lbr_pitch);
1581
18.8k
            if (margin)
1582
0
            {
1583
/* GT - need optimization?
1584
               if (ol_pitch < NB_PITCH_START+margin-1)
1585
                  ol_pitch=NB_PITCH_START+margin-1;
1586
               if (ol_pitch > NB_PITCH_END-margin)
1587
                  ol_pitch=NB_PITCH_END-margin;
1588
               pit_min = ol_pitch-margin+1;
1589
               pit_max = ol_pitch+margin;
1590
*/
1591
0
               pit_min = ol_pitch-margin+1;
1592
0
               if (pit_min < NB_PITCH_START)
1593
0
      pit_min = NB_PITCH_START;
1594
0
               pit_max = ol_pitch+margin;
1595
0
               if (pit_max > NB_PITCH_END)
1596
0
      pit_max = NB_PITCH_END;
1597
18.8k
            } else {
1598
18.8k
               pit_min = pit_max = ol_pitch;
1599
18.8k
            }
1600
25.5k
         } else {
1601
25.5k
            pit_min = NB_PITCH_START;
1602
25.5k
            pit_max = NB_PITCH_END;
1603
25.5k
         }
1604
1605
1606
1607
44.4k
         SUBMODE(ltp_unquant)(exc, exc32, pit_min, pit_max, ol_pitch_coef, SUBMODE(ltp_params),
1608
44.4k
                 NB_SUBFRAME_SIZE, &pitch, &pitch_gain[0], bits, stack,
1609
44.4k
                 st->count_lost, offset, st->last_pitch_gain, 0);
1610
1611
         /* Ensuring that things aren't blowing up as would happen if e.g. an encoder is
1612
         crafting packets to make us produce NaNs and slow down the decoder (vague DoS threat).
1613
         We can probably be even more aggressive and limit to 15000 or so. */
1614
44.4k
         sanitize_values32(exc32, NEG32(QCONST32(32000,SIG_SHIFT-1)), QCONST32(32000,SIG_SHIFT-1), NB_SUBFRAME_SIZE);
1615
1616
44.4k
         tmp = gain_3tap_to_1tap(pitch_gain);
1617
1618
44.4k
         pitch_average += tmp;
1619
44.4k
         if ((tmp>best_pitch_gain&&ABS(2*best_pitch-pitch)>=3&&ABS(3*best_pitch-pitch)>=4&&ABS(4*best_pitch-pitch)>=5)
1620
44.4k
              || (tmp>MULT16_16_Q15(QCONST16(.6,15),best_pitch_gain)&&(ABS(best_pitch-2*pitch)<3||ABS(best_pitch-3*pitch)<4||ABS(best_pitch-4*pitch)<5))
1621
44.4k
              || (MULT16_16_Q15(QCONST16(.67,15),tmp)>best_pitch_gain&&(ABS(2*best_pitch-pitch)<3||ABS(3*best_pitch-pitch)<4||ABS(4*best_pitch-pitch)<5)) )
1622
6.10k
         {
1623
6.10k
            best_pitch = pitch;
1624
6.10k
            if (tmp > best_pitch_gain)
1625
5.47k
               best_pitch_gain = tmp;
1626
6.10k
         }
1627
44.4k
      }
1628
1629
      /* Unquantize the innovation */
1630
44.4k
      {
1631
44.4k
         int q_energy;
1632
44.4k
         spx_word32_t ener;
1633
1634
44.4k
         SPEEX_MEMSET(innov, 0, NB_SUBFRAME_SIZE);
1635
1636
         /* Decode sub-frame gain correction */
1637
44.4k
         if (SUBMODE(have_subframe_gain)==3)
1638
10.9k
         {
1639
10.9k
            q_energy = speex_bits_unpack_unsigned(bits, 3);
1640
10.9k
            ener = MULT16_32_Q14(exc_gain_quant_scal3[q_energy],ol_gain);
1641
33.4k
         } else if (SUBMODE(have_subframe_gain)==1)
1642
14.5k
         {
1643
14.5k
            q_energy = speex_bits_unpack_unsigned(bits, 1);
1644
14.5k
            ener = MULT16_32_Q14(exc_gain_quant_scal1[q_energy],ol_gain);
1645
18.8k
         } else {
1646
18.8k
            ener = ol_gain;
1647
18.8k
         }
1648
1649
44.4k
         speex_assert (SUBMODE(innovation_unquant));
1650
44.4k
         {
1651
            /*Fixed codebook contribution*/
1652
44.4k
            SUBMODE(innovation_unquant)(innov, SUBMODE(innovation_params), NB_SUBFRAME_SIZE, bits, stack, &st->seed);
1653
            /* De-normalize innovation and update excitation */
1654
1655
44.4k
            signal_mul(innov, innov, ener, NB_SUBFRAME_SIZE);
1656
1657
            /* Decode second codebook (only for some modes) */
1658
44.4k
            if (SUBMODE(double_codebook))
1659
2.47k
            {
1660
2.47k
               char *tmp_stack=stack;
1661
2.47k
               VARDECL(spx_sig_t *innov2);
1662
2.47k
               ALLOC(innov2, NB_SUBFRAME_SIZE, spx_sig_t);
1663
2.47k
               SPEEX_MEMSET(innov2, 0, NB_SUBFRAME_SIZE);
1664
2.47k
               SUBMODE(innovation_unquant)(innov2, SUBMODE(innovation_params), NB_SUBFRAME_SIZE, bits, stack, &st->seed);
1665
2.47k
               signal_mul(innov2, innov2, MULT16_32_Q15(QCONST16(0.454545f,15),ener), NB_SUBFRAME_SIZE);
1666
101k
               for (i=0;i<NB_SUBFRAME_SIZE;i++)
1667
99.0k
                  innov[i] = ADD32(innov[i], innov2[i]);
1668
2.47k
               stack = tmp_stack;
1669
2.47k
            }
1670
1.82M
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
1671
1.77M
               exc[i]=EXTRACT16(SATURATE32(PSHR32(ADD32(SHL32(exc32[i],1),innov[i]),SIG_SHIFT),32767));
1672
            /*print_vec(exc, 40, "innov");*/
1673
44.4k
            if (innov_save)
1674
30.7k
            {
1675
1.26M
               for (i=0;i<NB_SUBFRAME_SIZE;i++)
1676
1.23M
                  innov_save[i] = EXTRACT16(PSHR32(innov[i], SIG_SHIFT));
1677
30.7k
            }
1678
44.4k
         }
1679
1680
         /*Vocoder mode*/
1681
44.4k
         if (st->submodeID==1)
1682
7.66k
         {
1683
7.66k
            spx_word16_t g=ol_pitch_coef;
1684
7.66k
            g=MULT16_16_P14(QCONST16(1.5f,14),(g-QCONST16(.2f,6)));
1685
7.66k
            if (g<0)
1686
5.36k
               g=0;
1687
7.66k
            if (g>GAIN_SCALING)
1688
748
               g=GAIN_SCALING;
1689
1690
7.66k
            SPEEX_MEMSET(exc, 0, NB_SUBFRAME_SIZE);
1691
20.4k
            while (st->voc_offset<NB_SUBFRAME_SIZE)
1692
12.7k
            {
1693
               /* exc[st->voc_offset]= g*sqrt(2*ol_pitch)*ol_gain;
1694
                  Not quite sure why we need the factor of two in the sqrt */
1695
12.7k
               if (st->voc_offset>=0)
1696
12.7k
                  exc[st->voc_offset]=MULT16_16(spx_sqrt(MULT16_16_16(2,ol_pitch)),EXTRACT16(PSHR32(MULT16_16(g,PSHR32(ol_gain,SIG_SHIFT)),6)));
1697
12.7k
               st->voc_offset+=ol_pitch;
1698
12.7k
            }
1699
7.66k
            st->voc_offset -= NB_SUBFRAME_SIZE;
1700
1701
314k
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
1702
306k
            {
1703
306k
               spx_word16_t exci=exc[i];
1704
306k
               exc[i]= ADD16(ADD16(MULT16_16_Q15(QCONST16(.7f,15),exc[i]) , MULT16_16_Q15(QCONST16(.3f,15),st->voc_m1)),
1705
306k
                             SUB16(MULT16_16_Q15(Q15_ONE-MULT16_16_16(QCONST16(.85f,9),g),EXTRACT16(PSHR32(innov[i],SIG_SHIFT))),
1706
306k
                                   MULT16_16_Q15(MULT16_16_16(QCONST16(.15f,9),g),EXTRACT16(PSHR32(st->voc_m2,SIG_SHIFT)))
1707
306k
                                  ));
1708
306k
               st->voc_m1 = exci;
1709
306k
               st->voc_m2=innov[i];
1710
306k
               st->voc_mean = EXTRACT16(PSHR32(ADD32(MULT16_16(QCONST16(.8f,15),st->voc_mean), MULT16_16(QCONST16(.2f,15),exc[i])), 15));
1711
306k
               exc[i]-=st->voc_mean;
1712
306k
            }
1713
7.66k
         }
1714
1715
44.4k
      }
1716
44.4k
   }
1717
1718
11.1k
   ALLOC(interp_qlsp, NB_ORDER, spx_lsp_t);
1719
1720
11.1k
   if (st->lpc_enh_enabled && SUBMODE(comb_gain)>0 && !st->count_lost)
1721
9.18k
   {
1722
9.18k
      multicomb(st->exc-NB_SUBFRAME_SIZE, out, st->interp_qlpc, NB_ORDER, 2*NB_SUBFRAME_SIZE, best_pitch, 40, SUBMODE(comb_gain), stack);
1723
9.18k
      multicomb(st->exc+NB_SUBFRAME_SIZE, out+2*NB_SUBFRAME_SIZE, st->interp_qlpc, NB_ORDER, 2*NB_SUBFRAME_SIZE, best_pitch, 40, SUBMODE(comb_gain), stack);
1724
9.18k
   } else {
1725
1.91k
      SPEEX_COPY(out, &st->exc[-NB_SUBFRAME_SIZE], NB_FRAME_SIZE);
1726
1.91k
   }
1727
1728
   /* If the last packet was lost, re-scale the excitation to obtain the same energy as encoded in ol_gain */
1729
11.1k
   if (st->count_lost)
1730
0
   {
1731
0
      spx_word16_t exc_ener;
1732
0
      spx_word32_t gain32;
1733
0
      spx_word16_t gain;
1734
0
      exc_ener = compute_rms16 (st->exc, NB_FRAME_SIZE);
1735
0
      gain32 = PDIV32(ol_gain, ADD16(exc_ener,1));
1736
#ifdef FIXED_POINT
1737
      if (gain32 > 32767)
1738
         gain32 = 32767;
1739
      gain = EXTRACT16(gain32);
1740
#else
1741
0
      if (gain32 > 2)
1742
0
         gain32=2;
1743
0
      gain = gain32;
1744
0
#endif
1745
0
      for (i=0;i<NB_FRAME_SIZE;i++)
1746
0
      {
1747
0
         st->exc[i] = MULT16_16_Q14(gain, st->exc[i]);
1748
0
         out[i]=st->exc[i-NB_SUBFRAME_SIZE];
1749
0
      }
1750
0
   }
1751
1752
   /*Loop on subframes */
1753
55.5k
   for (sub=0;sub<NB_NB_SUBFRAMES;sub++)
1754
44.4k
   {
1755
44.4k
      int offset;
1756
44.4k
      spx_word16_t *sp;
1757
1758
      /* Offset relative to start of frame */
1759
44.4k
      offset = NB_SUBFRAME_SIZE*sub;
1760
      /* Original signal */
1761
44.4k
      sp=out+offset;
1762
1763
      /* LSP interpolation (quantized and unquantized) */
1764
44.4k
      lsp_interpolate(st->old_qlsp, qlsp, interp_qlsp, NB_ORDER, sub, NB_NB_SUBFRAMES, LSP_MARGIN);
1765
1766
      /* Compute interpolated LPCs (unquantized) */
1767
44.4k
      lsp_to_lpc(interp_qlsp, ak, NB_ORDER, stack);
1768
1769
      /* Compute analysis filter at w=pi */
1770
44.4k
      {
1771
44.4k
         spx_word32_t pi_g=LPC_SCALING;
1772
266k
         for (i=0;i<NB_ORDER;i+=2)
1773
222k
         {
1774
            /*pi_g += -st->interp_qlpc[i] +  st->interp_qlpc[i+1];*/
1775
222k
            pi_g = ADD32(pi_g, SUB32(EXTEND32(ak[i+1]),EXTEND32(ak[i])));
1776
222k
         }
1777
44.4k
         st->pi_gain[sub] = pi_g;
1778
44.4k
      }
1779
1780
44.4k
      iir_mem16(sp, st->interp_qlpc, sp, NB_SUBFRAME_SIZE, NB_ORDER,
1781
44.4k
                st->mem_sp, stack);
1782
1783
488k
      for (i=0;i<NB_ORDER;i++)
1784
444k
         st->interp_qlpc[i] = ak[i];
1785
1786
44.4k
   }
1787
1788
11.1k
   if (st->highpass_enabled)
1789
11.1k
      highpass(out, out, NB_FRAME_SIZE, (st->isWideband?HIGHPASS_WIDEBAND:HIGHPASS_NARROWBAND)|HIGHPASS_OUTPUT, st->mem_hp);
1790
   /*for (i=0;i<NB_FRAME_SIZE;i++)
1791
     printf ("%d\n", (int)st->frame[i]);*/
1792
1793
   /* Tracking output level */
1794
11.1k
   st->level = 1+PSHR32(ol_gain,SIG_SHIFT);
1795
11.1k
   st->max_level = MAX16(MULT16_16_Q15(QCONST16(.99f,15), st->max_level), st->level);
1796
11.1k
   st->min_level = MIN16(ADD16(1,MULT16_16_Q14(QCONST16(1.01f,14), st->min_level)), st->level);
1797
11.1k
   if (st->max_level < st->min_level+1)
1798
3.41k
      st->max_level = st->min_level+1;
1799
   /*printf ("%f %f %f %d\n", og, st->min_level, st->max_level, update);*/
1800
1801
   /* Store the LSPs for interpolation in the next frame */
1802
122k
   for (i=0;i<NB_ORDER;i++)
1803
111k
      st->old_qlsp[i] = qlsp[i];
1804
1805
   /* The next frame will not be the first (Duh!) */
1806
11.1k
   st->first = 0;
1807
11.1k
   st->count_lost=0;
1808
11.1k
   st->last_pitch = best_pitch;
1809
#ifdef FIXED_POINT
1810
   st->last_pitch_gain = PSHR16(pitch_average,2);
1811
#else
1812
11.1k
   st->last_pitch_gain = .25*pitch_average;
1813
11.1k
#endif
1814
11.1k
   st->pitch_gain_buf[st->pitch_gain_buf_idx++] = st->last_pitch_gain;
1815
11.1k
   if (st->pitch_gain_buf_idx > 2) /* rollover */
1816
3.43k
      st->pitch_gain_buf_idx = 0;
1817
1818
11.1k
   st->last_ol_gain = ol_gain;
1819
1820
11.1k
   return 0;
1821
20.7k
}
nb_decode
Line
Count
Source
1331
36.7k
{
1332
36.7k
   DecState *st;
1333
36.7k
   int i, sub;
1334
36.7k
   int pitch;
1335
36.7k
   spx_word16_t pitch_gain[3];
1336
36.7k
   spx_word32_t ol_gain=0;
1337
36.7k
   int ol_pitch=0;
1338
36.7k
   spx_word16_t ol_pitch_coef=0;
1339
36.7k
   int best_pitch=40;
1340
36.7k
   spx_word16_t best_pitch_gain=0;
1341
36.7k
   int wideband;
1342
36.7k
   int m;
1343
36.7k
   char *stack;
1344
36.7k
   VARDECL(spx_sig_t *innov);
1345
36.7k
   VARDECL(spx_word32_t *exc32);
1346
36.7k
   VARDECL(spx_coef_t *ak);
1347
36.7k
   VARDECL(spx_lsp_t *qlsp);
1348
36.7k
   spx_word16_t pitch_average=0;
1349
1350
36.7k
   spx_word16_t *out = (spx_word16_t*)vout;
1351
36.7k
   VARDECL(spx_lsp_t *interp_qlsp);
1352
1353
36.7k
   st=(DecState*)state;
1354
36.7k
   stack=st->stack;
1355
1356
36.7k
   st->exc = st->excBuf + 2*NB_PITCH_END + NB_SUBFRAME_SIZE + 6;
1357
1358
   /* Check if we're in DTX mode*/
1359
36.7k
   if (!bits && st->dtx_enabled)
1360
0
   {
1361
0
      st->submodeID=0;
1362
0
   } else
1363
36.7k
   {
1364
      /* If bits is NULL, consider the packet to be lost (what could we do anyway) */
1365
36.7k
      if (!bits)
1366
0
      {
1367
0
         nb_decode_lost(st, out, stack);
1368
0
         return 0;
1369
0
      }
1370
1371
36.7k
      if (st->encode_submode)
1372
36.7k
      {
1373
1374
      /* Search for next narrowband block (handle requests, skip wideband blocks) */
1375
39.2k
      do {
1376
39.2k
         if (speex_bits_remaining(bits)<5)
1377
5.61k
            return -1;
1378
33.6k
         wideband = speex_bits_unpack_unsigned(bits, 1);
1379
33.6k
         if (wideband) /* Skip wideband block (for compatibility) */
1380
2.12k
         {
1381
2.12k
            int submode;
1382
2.12k
            int advance;
1383
2.12k
            advance = submode = speex_bits_unpack_unsigned(bits, SB_SUBMODE_BITS);
1384
            /*speex_mode_query(&speex_wb_mode, SPEEX_SUBMODE_BITS_PER_FRAME, &advance);*/
1385
2.12k
            advance = wb_skip_table[submode];
1386
2.12k
            if (advance < 0)
1387
0
            {
1388
0
               speex_notify("Invalid mode encountered. The stream is corrupted.");
1389
0
               return -2;
1390
0
            }
1391
2.12k
            advance -= (SB_SUBMODE_BITS+1);
1392
2.12k
            speex_bits_advance(bits, advance);
1393
1394
2.12k
            if (speex_bits_remaining(bits)<5)
1395
498
               return -1;
1396
1.62k
            wideband = speex_bits_unpack_unsigned(bits, 1);
1397
1.62k
            if (wideband)
1398
1.26k
            {
1399
1.26k
               advance = submode = speex_bits_unpack_unsigned(bits, SB_SUBMODE_BITS);
1400
               /*speex_mode_query(&speex_wb_mode, SPEEX_SUBMODE_BITS_PER_FRAME, &advance);*/
1401
1.26k
               advance = wb_skip_table[submode];
1402
1.26k
               if (advance < 0)
1403
0
               {
1404
0
                  speex_notify("Invalid mode encountered. The stream is corrupted.");
1405
0
                  return -2;
1406
0
               }
1407
1.26k
               advance -= (SB_SUBMODE_BITS+1);
1408
1.26k
               speex_bits_advance(bits, advance);
1409
1.26k
               wideband = speex_bits_unpack_unsigned(bits, 1);
1410
1.26k
               if (wideband)
1411
1.03k
               {
1412
1.03k
                  speex_notify("More than two wideband layers found. The stream is corrupted.");
1413
1.03k
                  return -2;
1414
1.03k
               }
1415
1416
1.26k
            }
1417
1.62k
         }
1418
32.0k
         if (speex_bits_remaining(bits)<4)
1419
209
            return -1;
1420
         /* FIXME: Check for overflow */
1421
31.8k
         m = speex_bits_unpack_unsigned(bits, 4);
1422
31.8k
         if (m==15) /* We found a terminator */
1423
537
         {
1424
537
            return -1;
1425
31.3k
         } else if (m==14) /* Speex in-band request */
1426
2.13k
         {
1427
2.13k
            int ret = speex_inband_handler(bits, st->speex_callbacks, state);
1428
2.13k
            if (ret)
1429
0
               return ret;
1430
29.1k
         } else if (m==13) /* User in-band request */
1431
334
         {
1432
334
            int ret = st->user_callback.func(bits, state, st->user_callback.data);
1433
334
            if (ret)
1434
0
               return ret;
1435
28.8k
         } else if (m>8) /* Invalid mode */
1436
1.81k
         {
1437
1.81k
            speex_notify("Invalid mode encountered. The stream is corrupted.");
1438
1.81k
            return -2;
1439
1.81k
         }
1440
1441
31.8k
      } while (m>8);
1442
1443
      /* Get the sub-mode that was used */
1444
27.0k
      st->submodeID = m;
1445
27.0k
      }
1446
1447
36.7k
   }
1448
1449
   /* Shift all buffers by one frame */
1450
27.0k
   SPEEX_MOVE(st->excBuf, st->excBuf+NB_FRAME_SIZE, 2*NB_PITCH_END + NB_SUBFRAME_SIZE + 12);
1451
1452
   /* If null mode (no transmission), just set a couple things to zero*/
1453
27.0k
   if (st->submodes[st->submodeID] == NULL)
1454
13.2k
   {
1455
13.2k
      VARDECL(spx_coef_t *lpc);
1456
13.2k
      ALLOC(lpc, NB_ORDER, spx_coef_t);
1457
13.2k
      bw_lpc(QCONST16(0.93f,15), st->interp_qlpc, lpc, NB_ORDER);
1458
13.2k
      {
1459
13.2k
         spx_word16_t innov_gain=0;
1460
         /* FIXME: This was innov, not exc */
1461
13.2k
         innov_gain = compute_rms16(st->exc, NB_FRAME_SIZE);
1462
2.12M
         for (i=0;i<NB_FRAME_SIZE;i++)
1463
2.11M
            st->exc[i]=speex_rand(innov_gain, &st->seed);
1464
13.2k
      }
1465
1466
1467
13.2k
      st->first=1;
1468
1469
      /* Final signal synthesis from excitation */
1470
13.2k
      iir_mem16(st->exc, lpc, out, NB_FRAME_SIZE, NB_ORDER, st->mem_sp, stack);
1471
1472
      /* Normally this is written to later but since this is returning early,
1473
         avoid reading uninitialized memory in caller */
1474
13.2k
      if (st->innov_save)
1475
10.5k
         SPEEX_MEMSET(st->innov_save, 0, NB_NB_SUBFRAMES*NB_SUBFRAME_SIZE);
1476
1477
13.2k
      st->count_lost=0;
1478
13.2k
      return 0;
1479
13.2k
   }
1480
1481
13.8k
   ALLOC(qlsp, NB_ORDER, spx_lsp_t);
1482
1483
   /* Unquantize LSPs */
1484
13.8k
   SUBMODE(lsp_unquant)(qlsp, NB_ORDER, bits);
1485
1486
   /*Damp memory if a frame was lost and the LSP changed too much*/
1487
13.8k
   if (st->count_lost)
1488
0
   {
1489
0
      spx_word16_t fact;
1490
0
      spx_word32_t lsp_dist=0;
1491
0
      for (i=0;i<NB_ORDER;i++)
1492
0
         lsp_dist = ADD32(lsp_dist, EXTEND32(ABS(st->old_qlsp[i] - qlsp[i])));
1493
0
#ifdef FIXED_POINT
1494
0
      fact = SHR16(19661,SHR32(lsp_dist,LSP_SHIFT+2));
1495
#else
1496
      fact = .6*exp(-.2*lsp_dist);
1497
#endif
1498
0
      for (i=0;i<NB_ORDER;i++)
1499
0
         st->mem_sp[i] = MULT16_32_Q15(fact,st->mem_sp[i]);
1500
0
   }
1501
1502
1503
   /* Handle first frame and lost-packet case */
1504
13.8k
   if (st->first || st->count_lost)
1505
2.94k
   {
1506
32.3k
      for (i=0;i<NB_ORDER;i++)
1507
29.4k
         st->old_qlsp[i] = qlsp[i];
1508
2.94k
   }
1509
1510
   /* Get open-loop pitch estimation for low bit-rate pitch coding */
1511
13.8k
   if (SUBMODE(lbr_pitch)!=-1)
1512
5.42k
   {
1513
5.42k
      ol_pitch = NB_PITCH_START+speex_bits_unpack_unsigned(bits, 7);
1514
5.42k
   }
1515
1516
13.8k
   if (SUBMODE(forced_pitch_gain))
1517
4.32k
   {
1518
4.32k
      int quant;
1519
4.32k
      quant = speex_bits_unpack_unsigned(bits, 4);
1520
4.32k
      ol_pitch_coef=MULT16_16_P15(QCONST16(0.066667,15),SHL16(quant,GAIN_SHIFT));
1521
4.32k
   }
1522
1523
   /* Get global excitation gain */
1524
13.8k
   {
1525
13.8k
      int qe;
1526
13.8k
      qe = speex_bits_unpack_unsigned(bits, 5);
1527
13.8k
#ifdef FIXED_POINT
1528
      /* FIXME: Perhaps we could slightly lower the gain here when the output is going to saturate? */
1529
13.8k
      ol_gain = MULT16_32_Q15(28406,ol_gain_table[qe]);
1530
#else
1531
      ol_gain = SIG_SCALING*exp(qe/3.5);
1532
#endif
1533
13.8k
   }
1534
1535
13.8k
   ALLOC(ak, NB_ORDER, spx_coef_t);
1536
13.8k
   ALLOC(innov, NB_SUBFRAME_SIZE, spx_sig_t);
1537
13.8k
   ALLOC(exc32, NB_SUBFRAME_SIZE, spx_word32_t);
1538
1539
13.8k
   if (st->submodeID==1)
1540
2.31k
   {
1541
2.31k
      int extra;
1542
2.31k
      extra = speex_bits_unpack_unsigned(bits, 4);
1543
1544
2.31k
      if (extra==15)
1545
516
         st->dtx_enabled=1;
1546
1.80k
      else
1547
1.80k
         st->dtx_enabled=0;
1548
2.31k
   }
1549
13.8k
   if (st->submodeID>1)
1550
11.5k
      st->dtx_enabled=0;
1551
1552
   /*Loop on subframes */
1553
69.1k
   for (sub=0;sub<NB_NB_SUBFRAMES;sub++)
1554
55.3k
   {
1555
55.3k
      int offset;
1556
55.3k
      spx_word16_t *exc;
1557
55.3k
      spx_word16_t *innov_save = NULL;
1558
55.3k
      spx_word16_t tmp;
1559
1560
      /* Offset relative to start of frame */
1561
55.3k
      offset = NB_SUBFRAME_SIZE*sub;
1562
      /* Excitation */
1563
55.3k
      exc=st->exc+offset;
1564
      /* Original signal */
1565
55.3k
      if (st->innov_save)
1566
40.1k
         innov_save = st->innov_save+offset;
1567
1568
1569
      /* Reset excitation */
1570
55.3k
      SPEEX_MEMSET(exc, 0, NB_SUBFRAME_SIZE);
1571
1572
      /*Adaptive codebook contribution*/
1573
55.3k
      speex_assert (SUBMODE(ltp_unquant));
1574
55.3k
      {
1575
55.3k
         int pit_min, pit_max;
1576
         /* Handle pitch constraints if any */
1577
55.3k
         if (SUBMODE(lbr_pitch) != -1)
1578
21.7k
         {
1579
21.7k
            int margin;
1580
21.7k
            margin = SUBMODE(lbr_pitch);
1581
21.7k
            if (margin)
1582
0
            {
1583
/* GT - need optimization?
1584
               if (ol_pitch < NB_PITCH_START+margin-1)
1585
                  ol_pitch=NB_PITCH_START+margin-1;
1586
               if (ol_pitch > NB_PITCH_END-margin)
1587
                  ol_pitch=NB_PITCH_END-margin;
1588
               pit_min = ol_pitch-margin+1;
1589
               pit_max = ol_pitch+margin;
1590
*/
1591
0
               pit_min = ol_pitch-margin+1;
1592
0
               if (pit_min < NB_PITCH_START)
1593
0
      pit_min = NB_PITCH_START;
1594
0
               pit_max = ol_pitch+margin;
1595
0
               if (pit_max > NB_PITCH_END)
1596
0
      pit_max = NB_PITCH_END;
1597
21.7k
            } else {
1598
21.7k
               pit_min = pit_max = ol_pitch;
1599
21.7k
            }
1600
33.6k
         } else {
1601
33.6k
            pit_min = NB_PITCH_START;
1602
33.6k
            pit_max = NB_PITCH_END;
1603
33.6k
         }
1604
1605
1606
1607
55.3k
         SUBMODE(ltp_unquant)(exc, exc32, pit_min, pit_max, ol_pitch_coef, SUBMODE(ltp_params),
1608
55.3k
                 NB_SUBFRAME_SIZE, &pitch, &pitch_gain[0], bits, stack,
1609
55.3k
                 st->count_lost, offset, st->last_pitch_gain, 0);
1610
1611
         /* Ensuring that things aren't blowing up as would happen if e.g. an encoder is
1612
         crafting packets to make us produce NaNs and slow down the decoder (vague DoS threat).
1613
         We can probably be even more aggressive and limit to 15000 or so. */
1614
55.3k
         sanitize_values32(exc32, NEG32(QCONST32(32000,SIG_SHIFT-1)), QCONST32(32000,SIG_SHIFT-1), NB_SUBFRAME_SIZE);
1615
1616
55.3k
         tmp = gain_3tap_to_1tap(pitch_gain);
1617
1618
55.3k
         pitch_average += tmp;
1619
55.3k
         if ((tmp>best_pitch_gain&&ABS(2*best_pitch-pitch)>=3&&ABS(3*best_pitch-pitch)>=4&&ABS(4*best_pitch-pitch)>=5)
1620
55.3k
              || (tmp>MULT16_16_Q15(QCONST16(.6,15),best_pitch_gain)&&(ABS(best_pitch-2*pitch)<3||ABS(best_pitch-3*pitch)<4||ABS(best_pitch-4*pitch)<5))
1621
55.3k
              || (MULT16_16_Q15(QCONST16(.67,15),tmp)>best_pitch_gain&&(ABS(2*best_pitch-pitch)<3||ABS(3*best_pitch-pitch)<4||ABS(4*best_pitch-pitch)<5)) )
1622
9.27k
         {
1623
9.27k
            best_pitch = pitch;
1624
9.27k
            if (tmp > best_pitch_gain)
1625
8.56k
               best_pitch_gain = tmp;
1626
9.27k
         }
1627
55.3k
      }
1628
1629
      /* Unquantize the innovation */
1630
55.3k
      {
1631
55.3k
         int q_energy;
1632
55.3k
         spx_word32_t ener;
1633
1634
55.3k
         SPEEX_MEMSET(innov, 0, NB_SUBFRAME_SIZE);
1635
1636
         /* Decode sub-frame gain correction */
1637
55.3k
         if (SUBMODE(have_subframe_gain)==3)
1638
11.5k
         {
1639
11.5k
            q_energy = speex_bits_unpack_unsigned(bits, 3);
1640
11.5k
            ener = MULT16_32_Q14(exc_gain_quant_scal3[q_energy],ol_gain);
1641
43.7k
         } else if (SUBMODE(have_subframe_gain)==1)
1642
22.0k
         {
1643
22.0k
            q_energy = speex_bits_unpack_unsigned(bits, 1);
1644
22.0k
            ener = MULT16_32_Q14(exc_gain_quant_scal1[q_energy],ol_gain);
1645
22.0k
         } else {
1646
21.7k
            ener = ol_gain;
1647
21.7k
         }
1648
1649
55.3k
         speex_assert (SUBMODE(innovation_unquant));
1650
55.3k
         {
1651
            /*Fixed codebook contribution*/
1652
55.3k
            SUBMODE(innovation_unquant)(innov, SUBMODE(innovation_params), NB_SUBFRAME_SIZE, bits, stack, &st->seed);
1653
            /* De-normalize innovation and update excitation */
1654
1655
55.3k
            signal_mul(innov, innov, ener, NB_SUBFRAME_SIZE);
1656
1657
            /* Decode second codebook (only for some modes) */
1658
55.3k
            if (SUBMODE(double_codebook))
1659
3.40k
            {
1660
3.40k
               char *tmp_stack=stack;
1661
3.40k
               VARDECL(spx_sig_t *innov2);
1662
3.40k
               ALLOC(innov2, NB_SUBFRAME_SIZE, spx_sig_t);
1663
3.40k
               SPEEX_MEMSET(innov2, 0, NB_SUBFRAME_SIZE);
1664
3.40k
               SUBMODE(innovation_unquant)(innov2, SUBMODE(innovation_params), NB_SUBFRAME_SIZE, bits, stack, &st->seed);
1665
3.40k
               signal_mul(innov2, innov2, MULT16_32_Q15(QCONST16(0.454545f,15),ener), NB_SUBFRAME_SIZE);
1666
139k
               for (i=0;i<NB_SUBFRAME_SIZE;i++)
1667
136k
                  innov[i] = ADD32(innov[i], innov2[i]);
1668
3.40k
               stack = tmp_stack;
1669
3.40k
            }
1670
2.26M
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
1671
2.21M
               exc[i]=EXTRACT16(SATURATE32(PSHR32(ADD32(SHL32(exc32[i],1),innov[i]),SIG_SHIFT),32767));
1672
            /*print_vec(exc, 40, "innov");*/
1673
55.3k
            if (innov_save)
1674
40.1k
            {
1675
1.64M
               for (i=0;i<NB_SUBFRAME_SIZE;i++)
1676
1.60M
                  innov_save[i] = EXTRACT16(PSHR32(innov[i], SIG_SHIFT));
1677
40.1k
            }
1678
55.3k
         }
1679
1680
         /*Vocoder mode*/
1681
55.3k
         if (st->submodeID==1)
1682
9.26k
         {
1683
9.26k
            spx_word16_t g=ol_pitch_coef;
1684
9.26k
            g=MULT16_16_P14(QCONST16(1.5f,14),(g-QCONST16(.2f,6)));
1685
9.26k
            if (g<0)
1686
4.13k
               g=0;
1687
9.26k
            if (g>GAIN_SCALING)
1688
1.47k
               g=GAIN_SCALING;
1689
1690
9.26k
            SPEEX_MEMSET(exc, 0, NB_SUBFRAME_SIZE);
1691
19.7k
            while (st->voc_offset<NB_SUBFRAME_SIZE)
1692
10.4k
            {
1693
               /* exc[st->voc_offset]= g*sqrt(2*ol_pitch)*ol_gain;
1694
                  Not quite sure why we need the factor of two in the sqrt */
1695
10.4k
               if (st->voc_offset>=0)
1696
10.4k
                  exc[st->voc_offset]=MULT16_16(spx_sqrt(MULT16_16_16(2,ol_pitch)),EXTRACT16(PSHR32(MULT16_16(g,PSHR32(ol_gain,SIG_SHIFT)),6)));
1697
10.4k
               st->voc_offset+=ol_pitch;
1698
10.4k
            }
1699
9.26k
            st->voc_offset -= NB_SUBFRAME_SIZE;
1700
1701
379k
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
1702
370k
            {
1703
370k
               spx_word16_t exci=exc[i];
1704
370k
               exc[i]= ADD16(ADD16(MULT16_16_Q15(QCONST16(.7f,15),exc[i]) , MULT16_16_Q15(QCONST16(.3f,15),st->voc_m1)),
1705
370k
                             SUB16(MULT16_16_Q15(Q15_ONE-MULT16_16_16(QCONST16(.85f,9),g),EXTRACT16(PSHR32(innov[i],SIG_SHIFT))),
1706
370k
                                   MULT16_16_Q15(MULT16_16_16(QCONST16(.15f,9),g),EXTRACT16(PSHR32(st->voc_m2,SIG_SHIFT)))
1707
370k
                                  ));
1708
370k
               st->voc_m1 = exci;
1709
370k
               st->voc_m2=innov[i];
1710
370k
               st->voc_mean = EXTRACT16(PSHR32(ADD32(MULT16_16(QCONST16(.8f,15),st->voc_mean), MULT16_16(QCONST16(.2f,15),exc[i])), 15));
1711
370k
               exc[i]-=st->voc_mean;
1712
370k
            }
1713
9.26k
         }
1714
1715
55.3k
      }
1716
55.3k
   }
1717
1718
13.8k
   ALLOC(interp_qlsp, NB_ORDER, spx_lsp_t);
1719
1720
13.8k
   if (st->lpc_enh_enabled && SUBMODE(comb_gain)>0 && !st->count_lost)
1721
11.5k
   {
1722
11.5k
      multicomb(st->exc-NB_SUBFRAME_SIZE, out, st->interp_qlpc, NB_ORDER, 2*NB_SUBFRAME_SIZE, best_pitch, 40, SUBMODE(comb_gain), stack);
1723
11.5k
      multicomb(st->exc+NB_SUBFRAME_SIZE, out+2*NB_SUBFRAME_SIZE, st->interp_qlpc, NB_ORDER, 2*NB_SUBFRAME_SIZE, best_pitch, 40, SUBMODE(comb_gain), stack);
1724
11.5k
   } else {
1725
2.31k
      SPEEX_COPY(out, &st->exc[-NB_SUBFRAME_SIZE], NB_FRAME_SIZE);
1726
2.31k
   }
1727
1728
   /* If the last packet was lost, re-scale the excitation to obtain the same energy as encoded in ol_gain */
1729
13.8k
   if (st->count_lost)
1730
0
   {
1731
0
      spx_word16_t exc_ener;
1732
0
      spx_word32_t gain32;
1733
0
      spx_word16_t gain;
1734
0
      exc_ener = compute_rms16 (st->exc, NB_FRAME_SIZE);
1735
0
      gain32 = PDIV32(ol_gain, ADD16(exc_ener,1));
1736
0
#ifdef FIXED_POINT
1737
0
      if (gain32 > 32767)
1738
0
         gain32 = 32767;
1739
0
      gain = EXTRACT16(gain32);
1740
#else
1741
      if (gain32 > 2)
1742
         gain32=2;
1743
      gain = gain32;
1744
#endif
1745
0
      for (i=0;i<NB_FRAME_SIZE;i++)
1746
0
      {
1747
0
         st->exc[i] = MULT16_16_Q14(gain, st->exc[i]);
1748
0
         out[i]=st->exc[i-NB_SUBFRAME_SIZE];
1749
0
      }
1750
0
   }
1751
1752
   /*Loop on subframes */
1753
69.1k
   for (sub=0;sub<NB_NB_SUBFRAMES;sub++)
1754
55.3k
   {
1755
55.3k
      int offset;
1756
55.3k
      spx_word16_t *sp;
1757
1758
      /* Offset relative to start of frame */
1759
55.3k
      offset = NB_SUBFRAME_SIZE*sub;
1760
      /* Original signal */
1761
55.3k
      sp=out+offset;
1762
1763
      /* LSP interpolation (quantized and unquantized) */
1764
55.3k
      lsp_interpolate(st->old_qlsp, qlsp, interp_qlsp, NB_ORDER, sub, NB_NB_SUBFRAMES, LSP_MARGIN);
1765
1766
      /* Compute interpolated LPCs (unquantized) */
1767
55.3k
      lsp_to_lpc(interp_qlsp, ak, NB_ORDER, stack);
1768
1769
      /* Compute analysis filter at w=pi */
1770
55.3k
      {
1771
55.3k
         spx_word32_t pi_g=LPC_SCALING;
1772
331k
         for (i=0;i<NB_ORDER;i+=2)
1773
276k
         {
1774
            /*pi_g += -st->interp_qlpc[i] +  st->interp_qlpc[i+1];*/
1775
276k
            pi_g = ADD32(pi_g, SUB32(EXTEND32(ak[i+1]),EXTEND32(ak[i])));
1776
276k
         }
1777
55.3k
         st->pi_gain[sub] = pi_g;
1778
55.3k
      }
1779
1780
55.3k
      iir_mem16(sp, st->interp_qlpc, sp, NB_SUBFRAME_SIZE, NB_ORDER,
1781
55.3k
                st->mem_sp, stack);
1782
1783
608k
      for (i=0;i<NB_ORDER;i++)
1784
553k
         st->interp_qlpc[i] = ak[i];
1785
1786
55.3k
   }
1787
1788
13.8k
   if (st->highpass_enabled)
1789
13.8k
      highpass(out, out, NB_FRAME_SIZE, (st->isWideband?HIGHPASS_WIDEBAND:HIGHPASS_NARROWBAND)|HIGHPASS_OUTPUT, st->mem_hp);
1790
   /*for (i=0;i<NB_FRAME_SIZE;i++)
1791
     printf ("%d\n", (int)st->frame[i]);*/
1792
1793
   /* Tracking output level */
1794
13.8k
   st->level = 1+PSHR32(ol_gain,SIG_SHIFT);
1795
13.8k
   st->max_level = MAX16(MULT16_16_Q15(QCONST16(.99f,15), st->max_level), st->level);
1796
13.8k
   st->min_level = MIN16(ADD16(1,MULT16_16_Q14(QCONST16(1.01f,14), st->min_level)), st->level);
1797
13.8k
   if (st->max_level < st->min_level+1)
1798
4.57k
      st->max_level = st->min_level+1;
1799
   /*printf ("%f %f %f %d\n", og, st->min_level, st->max_level, update);*/
1800
1801
   /* Store the LSPs for interpolation in the next frame */
1802
152k
   for (i=0;i<NB_ORDER;i++)
1803
138k
      st->old_qlsp[i] = qlsp[i];
1804
1805
   /* The next frame will not be the first (Duh!) */
1806
13.8k
   st->first = 0;
1807
13.8k
   st->count_lost=0;
1808
13.8k
   st->last_pitch = best_pitch;
1809
13.8k
#ifdef FIXED_POINT
1810
13.8k
   st->last_pitch_gain = PSHR16(pitch_average,2);
1811
#else
1812
   st->last_pitch_gain = .25*pitch_average;
1813
#endif
1814
13.8k
   st->pitch_gain_buf[st->pitch_gain_buf_idx++] = st->last_pitch_gain;
1815
13.8k
   if (st->pitch_gain_buf_idx > 2) /* rollover */
1816
3.97k
      st->pitch_gain_buf_idx = 0;
1817
1818
13.8k
   st->last_ol_gain = ol_gain;
1819
1820
13.8k
   return 0;
1821
27.0k
}
1822
#endif /* DISABLE_DECODER */
1823