Coverage Report

Created: 2025-08-11 06:29

/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
1.92M
#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
165k
#define LSP_MARGIN 16
80
13.5k
#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
102k
#define LSP_MARGIN .002f
91
7.67k
#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
5.84k
{
102
5.84k
   EncState *st;
103
5.84k
   const SpeexNBMode *mode;
104
5.84k
   int i;
105
106
5.84k
   mode=(const SpeexNBMode *)m->mode;
107
5.84k
   st = (EncState*)speex_alloc(sizeof(EncState));
108
5.84k
   if (!st)
109
0
      return NULL;
110
5.84k
#if defined(VAR_ARRAYS) || defined (USE_ALLOCA)
111
5.84k
   st->stack = NULL;
112
#else
113
   st->stack = (char*)speex_alloc_scratch(NB_ENC_STACK);
114
#endif
115
116
5.84k
   st->mode=m;
117
118
5.84k
   st->gamma1=mode->gamma1;
119
5.84k
   st->gamma2=mode->gamma2;
120
5.84k
   st->lpc_floor = mode->lpc_floor;
121
122
5.84k
   st->submodes=mode->submodes;
123
5.84k
   st->submodeID=st->submodeSelect=mode->defaultSubmode;
124
5.84k
   st->bounded_pitch = 1;
125
126
5.84k
   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
5.84k
   st->cumul_gain = 1024;
136
137
5.84k
   st->window= lpc_window;
138
139
   /* Create the window for autocorrelation (lag-windowing) */
140
5.84k
   st->lagWindow = lag_window;
141
142
5.84k
   st->first = 1;
143
64.2k
   for (i=0;i<NB_ORDER;i++)
144
58.4k
      st->old_lsp[i]= DIV32(MULT16_16(QCONST16(3.1415927f, LSP_SHIFT), i+1), NB_ORDER+1);
145
146
5.84k
   st->innov_rms_save = NULL;
147
148
5.84k
#ifndef DISABLE_VBR
149
5.84k
   vbr_init(&st->vbr);
150
5.84k
   st->vbr_quality = 8;
151
5.84k
   st->vbr_enabled = 0;
152
5.84k
   st->vbr_max = 0;
153
5.84k
   st->vad_enabled = 0;
154
5.84k
   st->dtx_enabled = 0;
155
5.84k
   st->dtx_count=0;
156
5.84k
   st->abr_enabled = 0;
157
5.84k
   st->abr_drift = 0;
158
5.84k
   st->abr_drift2 = 0;
159
5.84k
#endif /* #ifndef DISABLE_VBR */
160
161
5.84k
   st->plc_tuning = 2;
162
5.84k
   st->complexity=2;
163
5.84k
   st->sampling_rate=8000;
164
5.84k
   st->isWideband = 0;
165
5.84k
   st->highpass_enabled = 1;
166
167
#ifdef ENABLE_VALGRIND
168
   VALGRIND_MAKE_MEM_DEFINED(st, NB_ENC_STACK);
169
#endif
170
5.84k
   return st;
171
5.84k
}
nb_encoder_init
Line
Count
Source
101
2.92k
{
102
2.92k
   EncState *st;
103
2.92k
   const SpeexNBMode *mode;
104
2.92k
   int i;
105
106
2.92k
   mode=(const SpeexNBMode *)m->mode;
107
2.92k
   st = (EncState*)speex_alloc(sizeof(EncState));
108
2.92k
   if (!st)
109
0
      return NULL;
110
2.92k
#if defined(VAR_ARRAYS) || defined (USE_ALLOCA)
111
2.92k
   st->stack = NULL;
112
#else
113
   st->stack = (char*)speex_alloc_scratch(NB_ENC_STACK);
114
#endif
115
116
2.92k
   st->mode=m;
117
118
2.92k
   st->gamma1=mode->gamma1;
119
2.92k
   st->gamma2=mode->gamma2;
120
2.92k
   st->lpc_floor = mode->lpc_floor;
121
122
2.92k
   st->submodes=mode->submodes;
123
2.92k
   st->submodeID=st->submodeSelect=mode->defaultSubmode;
124
2.92k
   st->bounded_pitch = 1;
125
126
2.92k
   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
2.92k
   st->cumul_gain = 1024;
136
137
2.92k
   st->window= lpc_window;
138
139
   /* Create the window for autocorrelation (lag-windowing) */
140
2.92k
   st->lagWindow = lag_window;
141
142
2.92k
   st->first = 1;
143
32.1k
   for (i=0;i<NB_ORDER;i++)
144
29.2k
      st->old_lsp[i]= DIV32(MULT16_16(QCONST16(3.1415927f, LSP_SHIFT), i+1), NB_ORDER+1);
145
146
2.92k
   st->innov_rms_save = NULL;
147
148
2.92k
#ifndef DISABLE_VBR
149
2.92k
   vbr_init(&st->vbr);
150
2.92k
   st->vbr_quality = 8;
151
2.92k
   st->vbr_enabled = 0;
152
2.92k
   st->vbr_max = 0;
153
2.92k
   st->vad_enabled = 0;
154
2.92k
   st->dtx_enabled = 0;
155
2.92k
   st->dtx_count=0;
156
2.92k
   st->abr_enabled = 0;
157
2.92k
   st->abr_drift = 0;
158
2.92k
   st->abr_drift2 = 0;
159
2.92k
#endif /* #ifndef DISABLE_VBR */
160
161
2.92k
   st->plc_tuning = 2;
162
2.92k
   st->complexity=2;
163
2.92k
   st->sampling_rate=8000;
164
2.92k
   st->isWideband = 0;
165
2.92k
   st->highpass_enabled = 1;
166
167
#ifdef ENABLE_VALGRIND
168
   VALGRIND_MAKE_MEM_DEFINED(st, NB_ENC_STACK);
169
#endif
170
2.92k
   return st;
171
2.92k
}
nb_encoder_init
Line
Count
Source
101
2.92k
{
102
2.92k
   EncState *st;
103
2.92k
   const SpeexNBMode *mode;
104
2.92k
   int i;
105
106
2.92k
   mode=(const SpeexNBMode *)m->mode;
107
2.92k
   st = (EncState*)speex_alloc(sizeof(EncState));
108
2.92k
   if (!st)
109
0
      return NULL;
110
2.92k
#if defined(VAR_ARRAYS) || defined (USE_ALLOCA)
111
2.92k
   st->stack = NULL;
112
#else
113
   st->stack = (char*)speex_alloc_scratch(NB_ENC_STACK);
114
#endif
115
116
2.92k
   st->mode=m;
117
118
2.92k
   st->gamma1=mode->gamma1;
119
2.92k
   st->gamma2=mode->gamma2;
120
2.92k
   st->lpc_floor = mode->lpc_floor;
121
122
2.92k
   st->submodes=mode->submodes;
123
2.92k
   st->submodeID=st->submodeSelect=mode->defaultSubmode;
124
2.92k
   st->bounded_pitch = 1;
125
126
2.92k
   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
2.92k
   st->cumul_gain = 1024;
136
137
2.92k
   st->window= lpc_window;
138
139
   /* Create the window for autocorrelation (lag-windowing) */
140
2.92k
   st->lagWindow = lag_window;
141
142
2.92k
   st->first = 1;
143
32.1k
   for (i=0;i<NB_ORDER;i++)
144
29.2k
      st->old_lsp[i]= DIV32(MULT16_16(QCONST16(3.1415927f, LSP_SHIFT), i+1), NB_ORDER+1);
145
146
2.92k
   st->innov_rms_save = NULL;
147
148
2.92k
#ifndef DISABLE_VBR
149
2.92k
   vbr_init(&st->vbr);
150
2.92k
   st->vbr_quality = 8;
151
2.92k
   st->vbr_enabled = 0;
152
2.92k
   st->vbr_max = 0;
153
2.92k
   st->vad_enabled = 0;
154
2.92k
   st->dtx_enabled = 0;
155
2.92k
   st->dtx_count=0;
156
2.92k
   st->abr_enabled = 0;
157
2.92k
   st->abr_drift = 0;
158
2.92k
   st->abr_drift2 = 0;
159
2.92k
#endif /* #ifndef DISABLE_VBR */
160
161
2.92k
   st->plc_tuning = 2;
162
2.92k
   st->complexity=2;
163
2.92k
   st->sampling_rate=8000;
164
2.92k
   st->isWideband = 0;
165
2.92k
   st->highpass_enabled = 1;
166
167
#ifdef ENABLE_VALGRIND
168
   VALGRIND_MAKE_MEM_DEFINED(st, NB_ENC_STACK);
169
#endif
170
2.92k
   return st;
171
2.92k
}
172
173
void nb_encoder_destroy(void *state)
174
2.92k
{
175
2.92k
   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
2.92k
#ifndef DISABLE_VBR
182
2.92k
   vbr_destroy(&st->vbr);
183
2.92k
#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
2.92k
   speex_free(st);
194
2.92k
}
195
196
197
int nb_encoder_ctl(void *state, int request, void *ptr)
198
469k
{
199
469k
   EncState *st;
200
469k
   st=(EncState*)state;
201
469k
   switch(request)
202
469k
   {
203
13.5k
   case SPEEX_GET_FRAME_SIZE:
204
13.5k
      (*(spx_int32_t*)ptr) = NB_FRAME_SIZE;
205
13.5k
      break;
206
0
   case SPEEX_SET_LOW_MODE:
207
61.5k
   case SPEEX_SET_MODE:
208
61.5k
      st->submodeSelect = st->submodeID = (*(spx_int32_t*)ptr);
209
61.5k
      break;
210
14.9k
   case SPEEX_GET_LOW_MODE:
211
14.9k
   case SPEEX_GET_MODE:
212
14.9k
      (*(spx_int32_t*)ptr) = st->submodeID;
213
14.9k
      break;
214
0
#ifndef DISABLE_VBR
215
3.67k
      case SPEEX_SET_VBR:
216
3.67k
      st->vbr_enabled = (*(spx_int32_t*)ptr);
217
3.67k
      break;
218
0
   case SPEEX_GET_VBR:
219
0
      (*(spx_int32_t*)ptr) = st->vbr_enabled;
220
0
      break;
221
2.74k
   case SPEEX_SET_VAD:
222
2.74k
      st->vad_enabled = (*(spx_int32_t*)ptr);
223
2.74k
      break;
224
0
   case SPEEX_GET_VAD:
225
0
      (*(spx_int32_t*)ptr) = st->vad_enabled;
226
0
      break;
227
2.62k
   case SPEEX_SET_DTX:
228
2.62k
      st->dtx_enabled = (*(spx_int32_t*)ptr);
229
2.62k
      break;
230
0
   case SPEEX_GET_DTX:
231
0
      (*(spx_int32_t*)ptr) = st->dtx_enabled;
232
0
      break;
233
766
   case SPEEX_SET_ABR:
234
766
      st->abr_enabled = (*(spx_int32_t*)ptr);
235
766
      st->vbr_enabled = st->abr_enabled!=0;
236
766
      if (st->vbr_enabled)
237
766
      {
238
766
         spx_int32_t i=10;
239
766
         spx_int32_t rate, target;
240
766
         float vbr_qual;
241
766
         target = (*(spx_int32_t*)ptr);
242
9.19k
         while (i>=0)
243
8.42k
         {
244
8.42k
            speex_encoder_ctl(st, SPEEX_SET_QUALITY, &i);
245
8.42k
            speex_encoder_ctl(st, SPEEX_GET_BITRATE, &rate);
246
8.42k
            if (rate <= target)
247
0
               break;
248
8.42k
            i--;
249
8.42k
         }
250
766
         vbr_qual=i;
251
766
         if (vbr_qual<0)
252
766
            vbr_qual=0;
253
766
         speex_encoder_ctl(st, SPEEX_SET_VBR_QUALITY, &vbr_qual);
254
766
         st->abr_count=0;
255
766
         st->abr_drift=0;
256
766
         st->abr_drift2=0;
257
766
      }
258
259
766
      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
4.44k
   case SPEEX_SET_VBR_QUALITY:
266
4.44k
      st->vbr_quality = (*(float*)ptr);
267
4.44k
      if (st->vbr_quality < 0)
268
0
          st->vbr_quality = 0;
269
4.44k
      else if (st->vbr_quality > 10)
270
0
          st->vbr_quality = 10;
271
4.44k
      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
110k
   case SPEEX_SET_QUALITY:
277
110k
      {
278
110k
         int quality = (*(spx_int32_t*)ptr);
279
110k
         if (quality < 0)
280
0
            quality = 0;
281
110k
         if (quality > 10)
282
0
            quality = 10;
283
110k
         st->submodeSelect = st->submodeID = ((const SpeexNBMode*)(st->mode->mode))->quality_map[quality];
284
110k
      }
285
110k
      break;
286
5.84k
   case SPEEX_SET_COMPLEXITY:
287
5.84k
      st->complexity = (*(spx_int32_t*)ptr);
288
5.84k
      if (st->complexity<0)
289
0
         st->complexity=0;
290
5.84k
      break;
291
0
   case SPEEX_GET_COMPLEXITY:
292
0
      (*(spx_int32_t*)ptr) = st->complexity;
293
0
      break;
294
10.3k
   case SPEEX_SET_BITRATE:
295
10.3k
      {
296
10.3k
         spx_int32_t i=10;
297
10.3k
         spx_int32_t rate, target;
298
10.3k
         target = (*(spx_int32_t*)ptr);
299
102k
         while (i>=0)
300
97.8k
         {
301
97.8k
            speex_encoder_ctl(st, SPEEX_SET_QUALITY, &i);
302
97.8k
            speex_encoder_ctl(st, SPEEX_GET_BITRATE, &rate);
303
97.8k
            if (rate <= target)
304
5.17k
               break;
305
92.6k
            i--;
306
92.6k
         }
307
10.3k
      }
308
10.3k
      break;
309
168k
   case SPEEX_GET_BITRATE:
310
168k
      if (st->submodes[st->submodeID])
311
164k
         (*(spx_int32_t*)ptr) = st->sampling_rate*SUBMODE(bits_per_frame)/NB_FRAME_SIZE;
312
3.83k
      else
313
3.83k
         (*(spx_int32_t*)ptr) = st->sampling_rate*(NB_SUBMODE_BITS+1)/NB_FRAME_SIZE;
314
168k
      break;
315
5.84k
   case SPEEX_SET_SAMPLING_RATE:
316
5.84k
      st->sampling_rate = (*(spx_int32_t*)ptr);
317
5.84k
      break;
318
2.77k
   case SPEEX_GET_SAMPLING_RATE:
319
2.77k
      (*(spx_int32_t*)ptr)=st->sampling_rate;
320
2.77k
      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
5.84k
   case SPEEX_GET_LOOKAHEAD:
343
5.84k
      (*(spx_int32_t*)ptr)=(NB_WINDOW_SIZE-NB_FRAME_SIZE);
344
5.84k
      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
2.66k
   case SPEEX_SET_VBR_MAX_BITRATE:
355
2.66k
      st->vbr_max = (*(spx_int32_t*)ptr);
356
2.66k
      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
5.84k
   case SPEEX_SET_HIGHPASS:
362
5.84k
      st->highpass_enabled = (*(spx_int32_t*)ptr);
363
5.84k
      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
11.8k
   case SPEEX_GET_PI_GAIN:
370
11.8k
      {
371
11.8k
         int i;
372
11.8k
         spx_word32_t *g = (spx_word32_t*)ptr;
373
59.1k
         for (i=0;i<NB_NB_SUBFRAMES;i++)
374
47.3k
            g[i]=st->pi_gain[i];
375
11.8k
      }
376
11.8k
      break;
377
11.8k
   case SPEEX_GET_EXC:
378
11.8k
      {
379
11.8k
         int i;
380
59.1k
         for (i=0;i<NB_NB_SUBFRAMES;i++)
381
47.3k
            ((spx_word16_t*)ptr)[i] = compute_rms16(st->exc+i*NB_SUBFRAME_SIZE, NB_SUBFRAME_SIZE);
382
11.8k
      }
383
11.8k
      break;
384
0
#ifndef DISABLE_VBR
385
8.42k
   case SPEEX_GET_RELATIVE_QUALITY:
386
8.42k
      (*(float*)ptr)=st->relative_quality;
387
8.42k
      break;
388
0
#endif /* #ifndef DISABLE_VBR */
389
11.8k
   case SPEEX_SET_INNOVATION_SAVE:
390
11.8k
      st->innov_rms_save = (spx_word16_t*)ptr;
391
11.8k
      break;
392
3.80k
   case SPEEX_SET_WIDEBAND:
393
3.80k
      st->isWideband = *((spx_int32_t*)ptr);
394
3.80k
      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
469k
   }
402
469k
   return 0;
403
469k
}
nb_encoder_ctl
Line
Count
Source
198
234k
{
199
234k
   EncState *st;
200
234k
   st=(EncState*)state;
201
234k
   switch(request)
202
234k
   {
203
6.77k
   case SPEEX_GET_FRAME_SIZE:
204
6.77k
      (*(spx_int32_t*)ptr) = NB_FRAME_SIZE;
205
6.77k
      break;
206
0
   case SPEEX_SET_LOW_MODE:
207
30.7k
   case SPEEX_SET_MODE:
208
30.7k
      st->submodeSelect = st->submodeID = (*(spx_int32_t*)ptr);
209
30.7k
      break;
210
7.46k
   case SPEEX_GET_LOW_MODE:
211
7.46k
   case SPEEX_GET_MODE:
212
7.46k
      (*(spx_int32_t*)ptr) = st->submodeID;
213
7.46k
      break;
214
0
#ifndef DISABLE_VBR
215
1.83k
      case SPEEX_SET_VBR:
216
1.83k
      st->vbr_enabled = (*(spx_int32_t*)ptr);
217
1.83k
      break;
218
0
   case SPEEX_GET_VBR:
219
0
      (*(spx_int32_t*)ptr) = st->vbr_enabled;
220
0
      break;
221
1.37k
   case SPEEX_SET_VAD:
222
1.37k
      st->vad_enabled = (*(spx_int32_t*)ptr);
223
1.37k
      break;
224
0
   case SPEEX_GET_VAD:
225
0
      (*(spx_int32_t*)ptr) = st->vad_enabled;
226
0
      break;
227
1.31k
   case SPEEX_SET_DTX:
228
1.31k
      st->dtx_enabled = (*(spx_int32_t*)ptr);
229
1.31k
      break;
230
0
   case SPEEX_GET_DTX:
231
0
      (*(spx_int32_t*)ptr) = st->dtx_enabled;
232
0
      break;
233
383
   case SPEEX_SET_ABR:
234
383
      st->abr_enabled = (*(spx_int32_t*)ptr);
235
383
      st->vbr_enabled = st->abr_enabled!=0;
236
383
      if (st->vbr_enabled)
237
383
      {
238
383
         spx_int32_t i=10;
239
383
         spx_int32_t rate, target;
240
383
         float vbr_qual;
241
383
         target = (*(spx_int32_t*)ptr);
242
4.59k
         while (i>=0)
243
4.21k
         {
244
4.21k
            speex_encoder_ctl(st, SPEEX_SET_QUALITY, &i);
245
4.21k
            speex_encoder_ctl(st, SPEEX_GET_BITRATE, &rate);
246
4.21k
            if (rate <= target)
247
0
               break;
248
4.21k
            i--;
249
4.21k
         }
250
383
         vbr_qual=i;
251
383
         if (vbr_qual<0)
252
383
            vbr_qual=0;
253
383
         speex_encoder_ctl(st, SPEEX_SET_VBR_QUALITY, &vbr_qual);
254
383
         st->abr_count=0;
255
383
         st->abr_drift=0;
256
383
         st->abr_drift2=0;
257
383
      }
258
259
383
      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.22k
   case SPEEX_SET_VBR_QUALITY:
266
2.22k
      st->vbr_quality = (*(float*)ptr);
267
2.22k
      if (st->vbr_quality < 0)
268
0
          st->vbr_quality = 0;
269
2.22k
      else if (st->vbr_quality > 10)
270
0
          st->vbr_quality = 10;
271
2.22k
      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
55.2k
   case SPEEX_SET_QUALITY:
277
55.2k
      {
278
55.2k
         int quality = (*(spx_int32_t*)ptr);
279
55.2k
         if (quality < 0)
280
0
            quality = 0;
281
55.2k
         if (quality > 10)
282
0
            quality = 10;
283
55.2k
         st->submodeSelect = st->submodeID = ((const SpeexNBMode*)(st->mode->mode))->quality_map[quality];
284
55.2k
      }
285
55.2k
      break;
286
2.92k
   case SPEEX_SET_COMPLEXITY:
287
2.92k
      st->complexity = (*(spx_int32_t*)ptr);
288
2.92k
      if (st->complexity<0)
289
0
         st->complexity=0;
290
2.92k
      break;
291
0
   case SPEEX_GET_COMPLEXITY:
292
0
      (*(spx_int32_t*)ptr) = st->complexity;
293
0
      break;
294
5.16k
   case SPEEX_SET_BITRATE:
295
5.16k
      {
296
5.16k
         spx_int32_t i=10;
297
5.16k
         spx_int32_t rate, target;
298
5.16k
         target = (*(spx_int32_t*)ptr);
299
51.4k
         while (i>=0)
300
48.9k
         {
301
48.9k
            speex_encoder_ctl(st, SPEEX_SET_QUALITY, &i);
302
48.9k
            speex_encoder_ctl(st, SPEEX_GET_BITRATE, &rate);
303
48.9k
            if (rate <= target)
304
2.58k
               break;
305
46.3k
            i--;
306
46.3k
         }
307
5.16k
      }
308
5.16k
      break;
309
84.0k
   case SPEEX_GET_BITRATE:
310
84.0k
      if (st->submodes[st->submodeID])
311
82.1k
         (*(spx_int32_t*)ptr) = st->sampling_rate*SUBMODE(bits_per_frame)/NB_FRAME_SIZE;
312
1.91k
      else
313
1.91k
         (*(spx_int32_t*)ptr) = st->sampling_rate*(NB_SUBMODE_BITS+1)/NB_FRAME_SIZE;
314
84.0k
      break;
315
2.92k
   case SPEEX_SET_SAMPLING_RATE:
316
2.92k
      st->sampling_rate = (*(spx_int32_t*)ptr);
317
2.92k
      break;
318
1.38k
   case SPEEX_GET_SAMPLING_RATE:
319
1.38k
      (*(spx_int32_t*)ptr)=st->sampling_rate;
320
1.38k
      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
2.92k
   case SPEEX_GET_LOOKAHEAD:
343
2.92k
      (*(spx_int32_t*)ptr)=(NB_WINDOW_SIZE-NB_FRAME_SIZE);
344
2.92k
      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.33k
   case SPEEX_SET_VBR_MAX_BITRATE:
355
1.33k
      st->vbr_max = (*(spx_int32_t*)ptr);
356
1.33k
      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
2.92k
   case SPEEX_SET_HIGHPASS:
362
2.92k
      st->highpass_enabled = (*(spx_int32_t*)ptr);
363
2.92k
      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
5.91k
   case SPEEX_GET_PI_GAIN:
370
5.91k
      {
371
5.91k
         int i;
372
5.91k
         spx_word32_t *g = (spx_word32_t*)ptr;
373
29.5k
         for (i=0;i<NB_NB_SUBFRAMES;i++)
374
23.6k
            g[i]=st->pi_gain[i];
375
5.91k
      }
376
5.91k
      break;
377
5.91k
   case SPEEX_GET_EXC:
378
5.91k
      {
379
5.91k
         int i;
380
29.5k
         for (i=0;i<NB_NB_SUBFRAMES;i++)
381
23.6k
            ((spx_word16_t*)ptr)[i] = compute_rms16(st->exc+i*NB_SUBFRAME_SIZE, NB_SUBFRAME_SIZE);
382
5.91k
      }
383
5.91k
      break;
384
0
#ifndef DISABLE_VBR
385
4.21k
   case SPEEX_GET_RELATIVE_QUALITY:
386
4.21k
      (*(float*)ptr)=st->relative_quality;
387
4.21k
      break;
388
0
#endif /* #ifndef DISABLE_VBR */
389
5.91k
   case SPEEX_SET_INNOVATION_SAVE:
390
5.91k
      st->innov_rms_save = (spx_word16_t*)ptr;
391
5.91k
      break;
392
1.90k
   case SPEEX_SET_WIDEBAND:
393
1.90k
      st->isWideband = *((spx_int32_t*)ptr);
394
1.90k
      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
234k
   }
402
234k
   return 0;
403
234k
}
nb_encoder_ctl
Line
Count
Source
198
234k
{
199
234k
   EncState *st;
200
234k
   st=(EncState*)state;
201
234k
   switch(request)
202
234k
   {
203
6.77k
   case SPEEX_GET_FRAME_SIZE:
204
6.77k
      (*(spx_int32_t*)ptr) = NB_FRAME_SIZE;
205
6.77k
      break;
206
0
   case SPEEX_SET_LOW_MODE:
207
30.7k
   case SPEEX_SET_MODE:
208
30.7k
      st->submodeSelect = st->submodeID = (*(spx_int32_t*)ptr);
209
30.7k
      break;
210
7.46k
   case SPEEX_GET_LOW_MODE:
211
7.46k
   case SPEEX_GET_MODE:
212
7.46k
      (*(spx_int32_t*)ptr) = st->submodeID;
213
7.46k
      break;
214
0
#ifndef DISABLE_VBR
215
1.83k
      case SPEEX_SET_VBR:
216
1.83k
      st->vbr_enabled = (*(spx_int32_t*)ptr);
217
1.83k
      break;
218
0
   case SPEEX_GET_VBR:
219
0
      (*(spx_int32_t*)ptr) = st->vbr_enabled;
220
0
      break;
221
1.37k
   case SPEEX_SET_VAD:
222
1.37k
      st->vad_enabled = (*(spx_int32_t*)ptr);
223
1.37k
      break;
224
0
   case SPEEX_GET_VAD:
225
0
      (*(spx_int32_t*)ptr) = st->vad_enabled;
226
0
      break;
227
1.31k
   case SPEEX_SET_DTX:
228
1.31k
      st->dtx_enabled = (*(spx_int32_t*)ptr);
229
1.31k
      break;
230
0
   case SPEEX_GET_DTX:
231
0
      (*(spx_int32_t*)ptr) = st->dtx_enabled;
232
0
      break;
233
383
   case SPEEX_SET_ABR:
234
383
      st->abr_enabled = (*(spx_int32_t*)ptr);
235
383
      st->vbr_enabled = st->abr_enabled!=0;
236
383
      if (st->vbr_enabled)
237
383
      {
238
383
         spx_int32_t i=10;
239
383
         spx_int32_t rate, target;
240
383
         float vbr_qual;
241
383
         target = (*(spx_int32_t*)ptr);
242
4.59k
         while (i>=0)
243
4.21k
         {
244
4.21k
            speex_encoder_ctl(st, SPEEX_SET_QUALITY, &i);
245
4.21k
            speex_encoder_ctl(st, SPEEX_GET_BITRATE, &rate);
246
4.21k
            if (rate <= target)
247
0
               break;
248
4.21k
            i--;
249
4.21k
         }
250
383
         vbr_qual=i;
251
383
         if (vbr_qual<0)
252
383
            vbr_qual=0;
253
383
         speex_encoder_ctl(st, SPEEX_SET_VBR_QUALITY, &vbr_qual);
254
383
         st->abr_count=0;
255
383
         st->abr_drift=0;
256
383
         st->abr_drift2=0;
257
383
      }
258
259
383
      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.22k
   case SPEEX_SET_VBR_QUALITY:
266
2.22k
      st->vbr_quality = (*(float*)ptr);
267
2.22k
      if (st->vbr_quality < 0)
268
0
          st->vbr_quality = 0;
269
2.22k
      else if (st->vbr_quality > 10)
270
0
          st->vbr_quality = 10;
271
2.22k
      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
55.2k
   case SPEEX_SET_QUALITY:
277
55.2k
      {
278
55.2k
         int quality = (*(spx_int32_t*)ptr);
279
55.2k
         if (quality < 0)
280
0
            quality = 0;
281
55.2k
         if (quality > 10)
282
0
            quality = 10;
283
55.2k
         st->submodeSelect = st->submodeID = ((const SpeexNBMode*)(st->mode->mode))->quality_map[quality];
284
55.2k
      }
285
55.2k
      break;
286
2.92k
   case SPEEX_SET_COMPLEXITY:
287
2.92k
      st->complexity = (*(spx_int32_t*)ptr);
288
2.92k
      if (st->complexity<0)
289
0
         st->complexity=0;
290
2.92k
      break;
291
0
   case SPEEX_GET_COMPLEXITY:
292
0
      (*(spx_int32_t*)ptr) = st->complexity;
293
0
      break;
294
5.16k
   case SPEEX_SET_BITRATE:
295
5.16k
      {
296
5.16k
         spx_int32_t i=10;
297
5.16k
         spx_int32_t rate, target;
298
5.16k
         target = (*(spx_int32_t*)ptr);
299
51.4k
         while (i>=0)
300
48.9k
         {
301
48.9k
            speex_encoder_ctl(st, SPEEX_SET_QUALITY, &i);
302
48.9k
            speex_encoder_ctl(st, SPEEX_GET_BITRATE, &rate);
303
48.9k
            if (rate <= target)
304
2.58k
               break;
305
46.3k
            i--;
306
46.3k
         }
307
5.16k
      }
308
5.16k
      break;
309
84.0k
   case SPEEX_GET_BITRATE:
310
84.0k
      if (st->submodes[st->submodeID])
311
82.1k
         (*(spx_int32_t*)ptr) = st->sampling_rate*SUBMODE(bits_per_frame)/NB_FRAME_SIZE;
312
1.91k
      else
313
1.91k
         (*(spx_int32_t*)ptr) = st->sampling_rate*(NB_SUBMODE_BITS+1)/NB_FRAME_SIZE;
314
84.0k
      break;
315
2.92k
   case SPEEX_SET_SAMPLING_RATE:
316
2.92k
      st->sampling_rate = (*(spx_int32_t*)ptr);
317
2.92k
      break;
318
1.38k
   case SPEEX_GET_SAMPLING_RATE:
319
1.38k
      (*(spx_int32_t*)ptr)=st->sampling_rate;
320
1.38k
      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
2.92k
   case SPEEX_GET_LOOKAHEAD:
343
2.92k
      (*(spx_int32_t*)ptr)=(NB_WINDOW_SIZE-NB_FRAME_SIZE);
344
2.92k
      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.33k
   case SPEEX_SET_VBR_MAX_BITRATE:
355
1.33k
      st->vbr_max = (*(spx_int32_t*)ptr);
356
1.33k
      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
2.92k
   case SPEEX_SET_HIGHPASS:
362
2.92k
      st->highpass_enabled = (*(spx_int32_t*)ptr);
363
2.92k
      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
5.91k
   case SPEEX_GET_PI_GAIN:
370
5.91k
      {
371
5.91k
         int i;
372
5.91k
         spx_word32_t *g = (spx_word32_t*)ptr;
373
29.5k
         for (i=0;i<NB_NB_SUBFRAMES;i++)
374
23.6k
            g[i]=st->pi_gain[i];
375
5.91k
      }
376
5.91k
      break;
377
5.91k
   case SPEEX_GET_EXC:
378
5.91k
      {
379
5.91k
         int i;
380
29.5k
         for (i=0;i<NB_NB_SUBFRAMES;i++)
381
23.6k
            ((spx_word16_t*)ptr)[i] = compute_rms16(st->exc+i*NB_SUBFRAME_SIZE, NB_SUBFRAME_SIZE);
382
5.91k
      }
383
5.91k
      break;
384
0
#ifndef DISABLE_VBR
385
4.21k
   case SPEEX_GET_RELATIVE_QUALITY:
386
4.21k
      (*(float*)ptr)=st->relative_quality;
387
4.21k
      break;
388
0
#endif /* #ifndef DISABLE_VBR */
389
5.91k
   case SPEEX_SET_INNOVATION_SAVE:
390
5.91k
      st->innov_rms_save = (spx_word16_t*)ptr;
391
5.91k
      break;
392
1.90k
   case SPEEX_SET_WIDEBAND:
393
1.90k
      st->isWideband = *((spx_int32_t*)ptr);
394
1.90k
      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
234k
   }
402
234k
   return 0;
403
234k
}
404
405
406
int nb_encode(void *state, void *vin, SpeexBits *bits)
407
21.2k
{
408
21.2k
   EncState *st;
409
21.2k
   int i, sub, roots;
410
21.2k
   int ol_pitch;
411
21.2k
   spx_word16_t ol_pitch_coef;
412
21.2k
   spx_word32_t ol_gain;
413
21.2k
   VARDECL(spx_word16_t *target);
414
21.2k
   VARDECL(spx_sig_t *innov);
415
21.2k
   VARDECL(spx_word32_t *exc32);
416
21.2k
   VARDECL(spx_mem_t *mem);
417
21.2k
   VARDECL(spx_coef_t *bw_lpc1);
418
21.2k
   VARDECL(spx_coef_t *bw_lpc2);
419
21.2k
   VARDECL(spx_coef_t *lpc);
420
21.2k
   VARDECL(spx_lsp_t *lsp);
421
21.2k
   VARDECL(spx_lsp_t *qlsp);
422
21.2k
   VARDECL(spx_lsp_t *interp_lsp);
423
21.2k
   VARDECL(spx_lsp_t *interp_qlsp);
424
21.2k
   VARDECL(spx_coef_t *interp_lpc);
425
21.2k
   VARDECL(spx_coef_t *interp_qlpc);
426
21.2k
   char *stack;
427
21.2k
   VARDECL(spx_word16_t *syn_resp);
428
429
21.2k
   spx_word32_t ener=0;
430
21.2k
   spx_word16_t fine_gain;
431
21.2k
   spx_word16_t *in = (spx_word16_t*)vin;
432
433
21.2k
   st=(EncState *)state;
434
21.2k
   stack=st->stack;
435
436
21.2k
   ALLOC(lpc, NB_ORDER, spx_coef_t);
437
21.2k
   ALLOC(bw_lpc1, NB_ORDER, spx_coef_t);
438
21.2k
   ALLOC(bw_lpc2, NB_ORDER, spx_coef_t);
439
21.2k
   ALLOC(lsp, NB_ORDER, spx_lsp_t);
440
21.2k
   ALLOC(qlsp, NB_ORDER, spx_lsp_t);
441
21.2k
   ALLOC(interp_lsp, NB_ORDER, spx_lsp_t);
442
21.2k
   ALLOC(interp_qlsp, NB_ORDER, spx_lsp_t);
443
21.2k
   ALLOC(interp_lpc, NB_ORDER, spx_coef_t);
444
21.2k
   ALLOC(interp_qlpc, NB_ORDER, spx_coef_t);
445
446
21.2k
   st->exc = st->excBuf + NB_PITCH_END + 2;
447
21.2k
   st->sw = st->swBuf + NB_PITCH_END + 2;
448
   /* Move signals 1 frame towards the past */
449
21.2k
   SPEEX_MOVE(st->excBuf, st->excBuf+NB_FRAME_SIZE, NB_PITCH_END+2);
450
21.2k
   SPEEX_MOVE(st->swBuf, st->swBuf+NB_FRAME_SIZE, NB_PITCH_END+2);
451
452
21.2k
   if (st->highpass_enabled)
453
9.33k
      highpass(in, in, NB_FRAME_SIZE, (st->isWideband?HIGHPASS_WIDEBAND:HIGHPASS_NARROWBAND)|HIGHPASS_INPUT, st->mem_hp);
454
455
21.2k
   {
456
21.2k
      VARDECL(spx_word16_t *w_sig);
457
21.2k
      VARDECL(spx_word16_t *autocorr);
458
21.2k
      ALLOC(w_sig, NB_WINDOW_SIZE, spx_word16_t);
459
21.2k
      ALLOC(autocorr, NB_ORDER+1, spx_word16_t);
460
      /* Window for analysis */
461
870k
      for (i=0;i<NB_WINDOW_SIZE-NB_FRAME_SIZE;i++)
462
849k
         w_sig[i] = MULT16_16_Q15(st->winBuf[i],st->window[i]);
463
3.41M
      for (;i<NB_WINDOW_SIZE;i++)
464
3.39M
         w_sig[i] = MULT16_16_Q15(in[i-NB_WINDOW_SIZE+NB_FRAME_SIZE],st->window[i]);
465
      /* Compute auto-correlation */
466
21.2k
      _spx_autocorr(w_sig, autocorr, NB_ORDER+1, NB_WINDOW_SIZE);
467
21.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
254k
      for (i=0;i<NB_ORDER+1;i++)
471
233k
         autocorr[i] = MULT16_16_Q15(autocorr[i],st->lagWindow[i]);
472
21.2k
      autocorr[0] = ADD16(autocorr[0],1);
473
474
      /* Levinson-Durbin */
475
21.2k
      _spx_lpc(lpc, autocorr, NB_ORDER);
476
      /* LPC to LSPs (x-domain) transform */
477
21.2k
      roots=lpc_to_lsp (lpc, NB_ORDER, lsp, 10, LSP_DELTA1, stack);
478
      /* Check if we found all the roots */
479
21.2k
      if (roots!=NB_ORDER)
480
61
      {
481
         /*If we can't find all LSP's, do some damage control and use previous filter*/
482
671
         for (i=0;i<NB_ORDER;i++)
483
610
         {
484
610
            lsp[i]=st->old_lsp[i];
485
610
         }
486
61
      }
487
21.2k
   }
488
489
490
491
492
   /* Whole frame analysis (open-loop estimation of pitch and excitation gain) */
493
21.2k
   {
494
21.2k
      int diff = NB_WINDOW_SIZE-NB_FRAME_SIZE;
495
21.2k
      if (st->first)
496
46.5k
         for (i=0;i<NB_ORDER;i++)
497
42.3k
            interp_lsp[i] = lsp[i];
498
16.9k
      else
499
16.9k
         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
21.2k
      lsp_to_lpc(interp_lsp, interp_lpc, NB_ORDER,stack);
503
504
505
      /*Open-loop pitch*/
506
21.2k
      if (!st->submodes[st->submodeID] || (st->complexity>2 && SUBMODE(have_subframe_gain)<3) || SUBMODE(forced_pitch_gain) || SUBMODE(lbr_pitch) != -1
507
21.2k
#ifndef DISABLE_VBR
508
21.2k
           || st->vbr_enabled || st->vad_enabled
509
21.2k
#endif
510
21.2k
                  )
511
19.9k
      {
512
19.9k
         int nol_pitch[6];
513
19.9k
         spx_word16_t nol_pitch_coef[6];
514
515
19.9k
         bw_lpc(QCONST16(0.9,15), interp_lpc, bw_lpc1, NB_ORDER);
516
19.9k
         bw_lpc(QCONST16(0.55,15), interp_lpc, bw_lpc2, NB_ORDER);
517
518
19.9k
         SPEEX_COPY(st->sw, st->winBuf, diff);
519
19.9k
         SPEEX_COPY(st->sw+diff, in, NB_FRAME_SIZE-diff);
520
19.9k
         filter10(st->sw, bw_lpc1, bw_lpc2, st->sw, NB_FRAME_SIZE, st->mem_sw_whole, stack);
521
522
19.9k
         open_loop_nbest_pitch(st->sw, NB_PITCH_START, NB_PITCH_END, NB_FRAME_SIZE,
523
19.9k
                               nol_pitch, nol_pitch_coef, 6, stack);
524
19.9k
         ol_pitch=nol_pitch[0];
525
19.9k
         ol_pitch_coef = nol_pitch_coef[0];
526
         /*Try to remove pitch multiples*/
527
119k
         for (i=1;i<6;i++)
528
99.7k
         {
529
#ifdef FIXED_POINT
530
64.0k
            if ((nol_pitch_coef[i]>MULT16_16_Q15(nol_pitch_coef[0],27853)) &&
531
#else
532
35.6k
            if ((nol_pitch_coef[i]>.85*nol_pitch_coef[0]) &&
533
#endif
534
35.6k
                (ABS(2*nol_pitch[i]-ol_pitch)<=2 || ABS(3*nol_pitch[i]-ol_pitch)<=3 ||
535
24.4k
                 ABS(4*nol_pitch[i]-ol_pitch)<=4 || ABS(5*nol_pitch[i]-ol_pitch)<=5))
536
925
            {
537
               /*ol_pitch_coef=nol_pitch_coef[i];*/
538
925
               ol_pitch = nol_pitch[i];
539
925
            }
540
99.7k
         }
541
         /*if (ol_pitch>50)
542
           ol_pitch/=2;*/
543
         /*ol_pitch_coef = sqrt(ol_pitch_coef);*/
544
545
19.9k
      } else {
546
1.28k
         ol_pitch=0;
547
1.28k
         ol_pitch_coef=0;
548
1.28k
      }
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
21.2k
      fir_mem16(st->winBuf, interp_lpc, st->exc, diff, NB_ORDER, st->mem_exc, stack);
554
21.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
21.2k
      {
558
21.2k
         spx_word16_t g = compute_rms16(st->exc, NB_FRAME_SIZE);
559
21.2k
         if (st->submodeID!=1 && ol_pitch>0)
560
9.69k
            ol_gain = MULT16_16(g, MULT16_16_Q14(QCONST16(1.1,14),
561
21.2k
                                spx_sqrt(QCONST32(1.,28)-MULT16_32_Q15(QCONST16(.8,15),SHL32(MULT16_16(ol_pitch_coef,ol_pitch_coef),16)))));
562
11.5k
         else
563
11.5k
            ol_gain = SHL32(EXTEND32(g),SIG_SHIFT);
564
21.2k
      }
565
21.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
21.2k
#ifndef DISABLE_VBR
578
21.2k
   if (st->vbr_enabled||st->vad_enabled)
579
16.7k
   {
580
16.7k
      float lsp_dist=0;
581
183k
      for (i=0;i<NB_ORDER;i++)
582
167k
         lsp_dist += (st->old_lsp[i] - lsp[i])*(st->old_lsp[i] - lsp[i]);
583
16.7k
      lsp_dist /= LSP_SCALING*LSP_SCALING;
584
585
16.7k
      if (st->abr_enabled)
586
3.83k
      {
587
3.83k
         float qual_change=0;
588
3.83k
         if (st->abr_drift2 * st->abr_drift > 0)
589
3.44k
         {
590
            /* Only adapt if long-term and short-term drift are the same sign */
591
3.44k
            qual_change = -.00001*st->abr_drift/(1+st->abr_count);
592
3.44k
            if (qual_change>.05)
593
0
               qual_change=.05;
594
3.44k
            if (qual_change<-.05)
595
810
               qual_change=-.05;
596
3.44k
         }
597
3.83k
         st->vbr_quality += qual_change;
598
3.83k
         if (st->vbr_quality>10)
599
0
            st->vbr_quality=10;
600
3.83k
         if (st->vbr_quality<0)
601
3.44k
            st->vbr_quality=0;
602
3.83k
      }
603
604
16.7k
      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
16.7k
      if (st->vbr_enabled)
608
12.5k
      {
609
12.5k
         spx_int32_t mode;
610
12.5k
         int choice=0;
611
12.5k
         float min_diff=100;
612
12.5k
         mode = 8;
613
113k
         while (mode)
614
100k
         {
615
100k
            int v1;
616
100k
            float thresh;
617
100k
            v1=(int)floor(st->vbr_quality);
618
100k
            if (v1==10)
619
5.09k
               thresh = vbr_nb_thresh[mode][v1];
620
95.4k
            else
621
95.4k
               thresh = (st->vbr_quality-v1)*vbr_nb_thresh[mode][v1+1] + (1+v1-st->vbr_quality)*vbr_nb_thresh[mode][v1];
622
100k
            if (st->relative_quality > thresh &&
623
100k
                st->relative_quality-thresh<min_diff)
624
13.0k
            {
625
13.0k
               choice = mode;
626
13.0k
               min_diff = st->relative_quality-thresh;
627
13.0k
            }
628
100k
            mode--;
629
100k
         }
630
12.5k
         mode=choice;
631
12.5k
         if (mode==0)
632
3.56k
         {
633
3.56k
            if (st->dtx_count==0 || lsp_dist>.05 || !st->dtx_enabled || st->dtx_count>20)
634
2.15k
            {
635
2.15k
               mode=1;
636
2.15k
               st->dtx_count=1;
637
2.15k
            } else {
638
1.41k
               mode=0;
639
1.41k
               st->dtx_count++;
640
1.41k
            }
641
9.00k
         } else {
642
9.00k
            st->dtx_count=0;
643
9.00k
         }
644
645
12.5k
         speex_encoder_ctl(state, SPEEX_SET_MODE, &mode);
646
12.5k
         if (st->vbr_max>0)
647
9.52k
         {
648
9.52k
            spx_int32_t rate;
649
9.52k
            speex_encoder_ctl(state, SPEEX_GET_BITRATE, &rate);
650
9.52k
            if (rate > st->vbr_max)
651
3.63k
            {
652
3.63k
               rate = st->vbr_max;
653
3.63k
               speex_encoder_ctl(state, SPEEX_SET_BITRATE, &rate);
654
3.63k
            }
655
9.52k
         }
656
657
12.5k
         if (st->abr_enabled)
658
3.83k
         {
659
3.83k
            spx_int32_t bitrate;
660
3.83k
            speex_encoder_ctl(state, SPEEX_GET_BITRATE, &bitrate);
661
3.83k
            st->abr_drift+=(bitrate-st->abr_enabled);
662
3.83k
            st->abr_drift2 = .95*st->abr_drift2 + .05*(bitrate-st->abr_enabled);
663
3.83k
            st->abr_count += 1.0;
664
3.83k
         }
665
666
12.5k
      } else {
667
         /*VAD only case*/
668
4.15k
         int mode;
669
4.15k
         if (st->relative_quality<2)
670
1.16k
         {
671
1.16k
            if (st->dtx_count==0 || lsp_dist>.05 || !st->dtx_enabled || st->dtx_count>20)
672
726
            {
673
726
               st->dtx_count=1;
674
726
               mode=1;
675
726
            } else {
676
438
               mode=0;
677
438
               st->dtx_count++;
678
438
            }
679
2.98k
         } else {
680
2.98k
            st->dtx_count = 0;
681
2.98k
            mode=st->submodeSelect;
682
2.98k
         }
683
         /*speex_encoder_ctl(state, SPEEX_SET_MODE, &mode);*/
684
4.15k
         st->submodeID=mode;
685
4.15k
      }
686
16.7k
   } else {
687
4.50k
      st->relative_quality = -1;
688
4.50k
   }
689
21.2k
#endif /* #ifndef DISABLE_VBR */
690
691
21.2k
   if (st->encode_submode)
692
21.2k
   {
693
      /* First, transmit a zero for narrowband */
694
21.2k
      speex_bits_pack(bits, 0, 1);
695
696
      /* Transmit the sub-mode we use for this frame */
697
21.2k
      speex_bits_pack(bits, st->submodeID, NB_SUBMODE_BITS);
698
699
21.2k
   }
700
701
   /* If null mode (no transmission), just set a couple things to zero*/
702
21.2k
   if (st->submodes[st->submodeID] == NULL)
703
1.76k
   {
704
284k
      for (i=0;i<NB_FRAME_SIZE;i++)
705
282k
         st->exc[i]=st->sw[i]=VERY_SMALL;
706
707
19.4k
      for (i=0;i<NB_ORDER;i++)
708
17.6k
         st->mem_sw[i]=0;
709
1.76k
      st->first=1;
710
1.76k
      st->bounded_pitch = 1;
711
712
1.76k
      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
19.4k
      for (i=0;i<NB_ORDER;i++)
716
17.6k
         st->mem_sp[i] = 0;
717
1.76k
      return 0;
718
719
1.76k
   }
720
721
   /* LSP Quantization */
722
19.4k
   if (st->first)
723
2.97k
   {
724
32.7k
      for (i=0;i<NB_ORDER;i++)
725
29.7k
         st->old_lsp[i] = lsp[i];
726
2.97k
   }
727
728
729
   /*Quantize LSPs*/
730
19.4k
#if 1 /*0 for unquantized*/
731
19.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
19.4k
   if (SUBMODE(lbr_pitch)!=-1)
739
13.3k
   {
740
13.3k
      speex_bits_pack(bits, ol_pitch-NB_PITCH_START, 7);
741
13.3k
   }
742
743
19.4k
   if (SUBMODE(forced_pitch_gain))
744
12.2k
   {
745
12.2k
      int quant;
746
      /* This just damps the pitch a bit, because it tends to be too aggressive when forced */
747
12.2k
      ol_pitch_coef = MULT16_16_Q15(QCONST16(.9,15), ol_pitch_coef);
748
#ifdef FIXED_POINT
749
8.04k
      quant = PSHR16(MULT16_16_16(15, ol_pitch_coef),GAIN_SHIFT);
750
#else
751
4.25k
      quant = (int)floor(.5+15*ol_pitch_coef*GAIN_SCALING_1);
752
#endif
753
12.2k
      if (quant>15)
754
108
         quant=15;
755
12.2k
      if (quant<0)
756
0
         quant=0;
757
12.2k
      speex_bits_pack(bits, quant, 4);
758
12.2k
      ol_pitch_coef=MULT16_16_P15(QCONST16(0.066667,15),SHL16(quant,GAIN_SHIFT));
759
12.2k
   }
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
12.7k
      ol_gain = MULT16_32_Q15(28406,ol_gain_table[qe]);
768
      speex_bits_pack(bits, qe, 5);
769
   }
770
#else
771
   {
772
6.66k
      int qe = (int)(floor(.5+3.5*log(ol_gain*1.0/SIG_SCALING)));
773
6.66k
      if (qe<0)
774
4.05k
         qe=0;
775
6.66k
      if (qe>31)
776
491
         qe=31;
777
6.66k
      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
19.4k
   if (st->first)
786
2.97k
   {
787
32.7k
      for (i=0;i<NB_ORDER;i++)
788
29.7k
         st->old_qlsp[i] = qlsp[i];
789
2.97k
   }
790
791
   /* Target signal */
792
19.4k
   ALLOC(target, NB_SUBFRAME_SIZE, spx_word16_t);
793
19.4k
   ALLOC(innov, NB_SUBFRAME_SIZE, spx_sig_t);
794
19.4k
   ALLOC(exc32, NB_SUBFRAME_SIZE, spx_word32_t);
795
19.4k
   ALLOC(syn_resp, NB_SUBFRAME_SIZE, spx_word16_t);
796
19.4k
   ALLOC(mem, NB_ORDER, spx_mem_t);
797
798
   /* Loop on sub-frames */
799
97.3k
   for (sub=0;sub<NB_NB_SUBFRAMES;sub++)
800
77.8k
   {
801
77.8k
      int   offset;
802
77.8k
      spx_word16_t *sw;
803
77.8k
      spx_word16_t *exc, *inBuf;
804
77.8k
      int pitch;
805
77.8k
      int response_bound = NB_SUBFRAME_SIZE;
806
807
      /* Offset relative to start of frame */
808
77.8k
      offset = NB_SUBFRAME_SIZE*sub;
809
      /* Excitation */
810
77.8k
      exc=st->exc+offset;
811
      /* Weighted signal */
812
77.8k
      sw=st->sw+offset;
813
814
      /* LSP interpolation (quantized and unquantized) */
815
77.8k
      lsp_interpolate(st->old_lsp, lsp, interp_lsp, NB_ORDER, sub, NB_NB_SUBFRAMES, LSP_MARGIN);
816
77.8k
      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
77.8k
      lsp_to_lpc(interp_lsp, interp_lpc, NB_ORDER,stack);
820
821
77.8k
      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
77.8k
      {
825
77.8k
         spx_word32_t pi_g=LPC_SCALING;
826
467k
         for (i=0;i<NB_ORDER;i+=2)
827
389k
         {
828
            /*pi_g += -st->interp_qlpc[i] +  st->interp_qlpc[i+1];*/
829
389k
            pi_g = ADD32(pi_g, SUB32(EXTEND32(interp_qlpc[i+1]),EXTEND32(interp_qlpc[i])));
830
389k
         }
831
77.8k
         st->pi_gain[sub] = pi_g;
832
77.8k
      }
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
77.8k
      bw_lpc(st->gamma1, interp_lpc, bw_lpc1, NB_ORDER);
845
77.8k
      bw_lpc(st->gamma2, interp_lpc, bw_lpc2, NB_ORDER);
846
      /*print_vec(st->bw_lpc1, 10, "bw_lpc");*/
847
77.8k
#endif
848
849
      /*FIXME: This will break if we change the window size */
850
77.8k
      speex_assert(NB_WINDOW_SIZE-NB_FRAME_SIZE == NB_SUBFRAME_SIZE);
851
77.8k
      if (sub==0)
852
19.4k
         inBuf = st->winBuf;
853
58.3k
      else
854
58.3k
         inBuf = &in[((sub-1)*NB_SUBFRAME_SIZE)];
855
3.19M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
856
3.11M
         sw[i] = inBuf[i];
857
858
77.8k
      if (st->complexity==0)
859
20.0k
         response_bound >>= 1;
860
77.8k
      compute_impulse_response(interp_qlpc, bw_lpc1, bw_lpc2, syn_resp, response_bound, NB_ORDER, stack);
861
478k
      for (i=response_bound;i<NB_SUBFRAME_SIZE;i++)
862
400k
         syn_resp[i]=VERY_SMALL;
863
864
      /* Compute zero response of A(z/g1) / ( A(z/g2) * A(z) ) */
865
856k
      for (i=0;i<NB_ORDER;i++)
866
778k
         mem[i]=SHL32(st->mem_sp[i],1);
867
3.19M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
868
3.11M
         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
77.8k
      iir_mem16(exc, interp_qlpc, exc, NB_SUBFRAME_SIZE, NB_ORDER, mem, stack);
877
856k
      for (i=0;i<NB_ORDER;i++)
878
778k
         mem[i]=SHL32(st->mem_sw[i],1);
879
77.8k
      filter10(exc, bw_lpc1, bw_lpc2, exc, NB_SUBFRAME_SIZE, mem, stack);
880
77.8k
#endif
881
882
      /* Compute weighted signal */
883
856k
      for (i=0;i<NB_ORDER;i++)
884
778k
         mem[i]=st->mem_sw[i];
885
77.8k
      filter10(sw, bw_lpc1, bw_lpc2, sw, NB_SUBFRAME_SIZE, mem, stack);
886
887
77.8k
      if (st->complexity==0)
888
220k
         for (i=0;i<NB_ORDER;i++)
889
200k
            st->mem_sw[i]=mem[i];
890
891
      /* Compute target signal (saturation prevents overflows on clipped input speech) */
892
3.19M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
893
3.11M
         target[i]=EXTRACT16(SATURATE(SUB32(sw[i],PSHR32(exc[i],1)),32767));
894
895
3.19M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
896
3.11M
         exc[i] = inBuf[i];
897
77.8k
      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
77.8k
      speex_assert (SUBMODE(ltp_quant));
900
77.8k
      {
901
77.8k
         int pit_min, pit_max;
902
         /* Long-term prediction */
903
77.8k
         if (SUBMODE(lbr_pitch) != -1)
904
53.5k
         {
905
            /* Low bit-rate pitch handling */
906
53.5k
            int margin;
907
53.5k
            margin = SUBMODE(lbr_pitch);
908
53.5k
            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
53.5k
            } else {
917
53.5k
               pit_min=pit_max=ol_pitch;
918
53.5k
            }
919
53.5k
         } else {
920
24.2k
            pit_min = NB_PITCH_START;
921
24.2k
            pit_max = NB_PITCH_END;
922
24.2k
         }
923
924
         /* Force pitch to use only the current frame if needed */
925
77.8k
         if (st->bounded_pitch && pit_max>offset)
926
23.8k
            pit_max=offset;
927
928
         /* Perform pitch search */
929
77.8k
         pitch = SUBMODE(ltp_quant)(target, sw, interp_qlpc, bw_lpc1, bw_lpc2,
930
77.8k
                                    exc32, SUBMODE(ltp_params), pit_min, pit_max, ol_pitch_coef,
931
77.8k
                                    NB_ORDER, NB_SUBFRAME_SIZE, bits, stack,
932
77.8k
                                    exc, syn_resp, st->complexity, 0, st->plc_tuning, &st->cumul_gain);
933
934
77.8k
         st->pitch[sub]=pitch;
935
77.8k
      }
936
      /* Quantization of innovation */
937
77.8k
      SPEEX_MEMSET(innov, 0, NB_SUBFRAME_SIZE);
938
939
      /* FIXME: Make sure this is safe from overflows (so far so good) */
940
3.19M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
941
3.11M
         exc[i] = EXTRACT16(SUB32(EXTEND32(exc[i]), PSHR32(exc32[i],SIG_SHIFT-1)));
942
943
77.8k
      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
51.1k
         spx_word32_t f = PDIV32(ener,PSHR32(ol_gain,SIG_SHIFT));
949
51.1k
         if (f<=32767)
950
47.1k
            fine_gain = f;
951
4.01k
         else
952
4.01k
            fine_gain = 32767;
953
      }
954
#else
955
26.6k
      fine_gain = PDIV32_16(ener,PSHR32(ol_gain,SIG_SHIFT));
956
#endif
957
      /* Calculate gain correction for the sub-frame (if any) */
958
77.8k
      if (SUBMODE(have_subframe_gain))
959
24.2k
      {
960
24.2k
         int qe;
961
24.2k
         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.30k
            qe = scal_quant(fine_gain, exc_gain_quant_scal1_bound, 2);
968
9.30k
            speex_bits_pack(bits, qe, 1);
969
9.30k
            ener=MULT16_32_Q14(exc_gain_quant_scal1[qe],ol_gain);
970
9.30k
         }
971
53.5k
      } else {
972
53.5k
         ener=ol_gain;
973
53.5k
      }
974
975
      /*printf ("%f %f\n", ener, ol_gain);*/
976
977
      /* Normalize innovation */
978
77.8k
      signal_div(target, target, ener, NB_SUBFRAME_SIZE);
979
980
      /* Quantize innovation */
981
77.8k
      speex_assert (SUBMODE(innovation_quant));
982
77.8k
      {
983
         /* Codebook search */
984
77.8k
         SUBMODE(innovation_quant)(target, interp_qlpc, bw_lpc1, bw_lpc2,
985
77.8k
                  SUBMODE(innovation_params), NB_ORDER, NB_SUBFRAME_SIZE,
986
77.8k
                  innov, syn_resp, bits, stack, st->complexity, SUBMODE(double_codebook));
987
988
         /* De-normalize innovation and update excitation */
989
77.8k
         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
77.8k
         if (SUBMODE(double_codebook)) {
993
1.94k
            char *tmp_stack=stack;
994
1.94k
            VARDECL(spx_sig_t *innov2);
995
1.94k
            ALLOC(innov2, NB_SUBFRAME_SIZE, spx_sig_t);
996
1.94k
            SPEEX_MEMSET(innov2, 0, NB_SUBFRAME_SIZE);
997
79.8k
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
998
77.9k
               target[i]=MULT16_16_P13(QCONST16(2.2f,13), target[i]);
999
1.94k
            SUBMODE(innovation_quant)(target, interp_qlpc, bw_lpc1, bw_lpc2,
1000
1.94k
                                      SUBMODE(innovation_params), NB_ORDER, NB_SUBFRAME_SIZE,
1001
1.94k
                                      innov2, syn_resp, bits, stack, st->complexity, 0);
1002
1.94k
            signal_mul(innov2, innov2, MULT16_32_Q15(QCONST16(0.454545f,15),ener), NB_SUBFRAME_SIZE);
1003
79.8k
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
1004
77.9k
               innov[i] = ADD32(innov[i],innov2[i]);
1005
1.94k
            stack = tmp_stack;
1006
1.94k
         }
1007
3.19M
         for (i=0;i<NB_SUBFRAME_SIZE;i++)
1008
3.11M
            exc[i] = EXTRACT16(SATURATE32(PSHR32(ADD32(SHL32(exc32[i],1),innov[i]),SIG_SHIFT),32767));
1009
77.8k
         if (st->innov_rms_save)
1010
22.2k
            st->innov_rms_save[sub] = compute_rms(innov, NB_SUBFRAME_SIZE);
1011
77.8k
      }
1012
1013
      /* Final signal synthesis from excitation */
1014
77.8k
      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
77.8k
      if (st->complexity!=0)
1018
57.8k
         filter10(sw, bw_lpc1, bw_lpc2, sw, NB_SUBFRAME_SIZE, st->mem_sw, stack);
1019
1020
77.8k
   }
1021
1022
   /* Store the LSPs for interpolation in the next frame */
1023
19.4k
   if (st->submodeID>=1)
1024
19.4k
   {
1025
214k
      for (i=0;i<NB_ORDER;i++)
1026
194k
         st->old_lsp[i] = lsp[i];
1027
214k
      for (i=0;i<NB_ORDER;i++)
1028
194k
         st->old_qlsp[i] = qlsp[i];
1029
19.4k
   }
1030
1031
#ifdef VORBIS_PSYCHO
1032
   if (st->submodeID>=1)
1033
      SPEEX_COPY(st->old_curve, st->curve, 128);
1034
#endif
1035
1036
19.4k
   if (st->submodeID==1)
1037
10.0k
   {
1038
10.0k
#ifndef DISABLE_VBR
1039
10.0k
      if (st->dtx_count)
1040
2.96k
         speex_bits_pack(bits, 15, 4);
1041
7.10k
      else
1042
7.10k
#endif
1043
7.10k
         speex_bits_pack(bits, 0, 4);
1044
10.0k
   }
1045
1046
   /* The next frame will not be the first (Duh!) */
1047
19.4k
   st->first = 0;
1048
19.4k
   SPEEX_COPY(st->winBuf, in+2*NB_FRAME_SIZE-NB_WINDOW_SIZE, NB_WINDOW_SIZE-NB_FRAME_SIZE);
1049
1050
19.4k
   if (SUBMODE(innovation_quant) == noise_codebook_quant || st->submodeID==0)
1051
10.0k
      st->bounded_pitch = 1;
1052
9.38k
   else
1053
9.38k
      st->bounded_pitch = 0;
1054
1055
19.4k
   return 1;
1056
21.2k
}
nb_encode
Line
Count
Source
407
7.67k
{
408
7.67k
   EncState *st;
409
7.67k
   int i, sub, roots;
410
7.67k
   int ol_pitch;
411
7.67k
   spx_word16_t ol_pitch_coef;
412
7.67k
   spx_word32_t ol_gain;
413
7.67k
   VARDECL(spx_word16_t *target);
414
7.67k
   VARDECL(spx_sig_t *innov);
415
7.67k
   VARDECL(spx_word32_t *exc32);
416
7.67k
   VARDECL(spx_mem_t *mem);
417
7.67k
   VARDECL(spx_coef_t *bw_lpc1);
418
7.67k
   VARDECL(spx_coef_t *bw_lpc2);
419
7.67k
   VARDECL(spx_coef_t *lpc);
420
7.67k
   VARDECL(spx_lsp_t *lsp);
421
7.67k
   VARDECL(spx_lsp_t *qlsp);
422
7.67k
   VARDECL(spx_lsp_t *interp_lsp);
423
7.67k
   VARDECL(spx_lsp_t *interp_qlsp);
424
7.67k
   VARDECL(spx_coef_t *interp_lpc);
425
7.67k
   VARDECL(spx_coef_t *interp_qlpc);
426
7.67k
   char *stack;
427
7.67k
   VARDECL(spx_word16_t *syn_resp);
428
429
7.67k
   spx_word32_t ener=0;
430
7.67k
   spx_word16_t fine_gain;
431
7.67k
   spx_word16_t *in = (spx_word16_t*)vin;
432
433
7.67k
   st=(EncState *)state;
434
7.67k
   stack=st->stack;
435
436
7.67k
   ALLOC(lpc, NB_ORDER, spx_coef_t);
437
7.67k
   ALLOC(bw_lpc1, NB_ORDER, spx_coef_t);
438
7.67k
   ALLOC(bw_lpc2, NB_ORDER, spx_coef_t);
439
7.67k
   ALLOC(lsp, NB_ORDER, spx_lsp_t);
440
7.67k
   ALLOC(qlsp, NB_ORDER, spx_lsp_t);
441
7.67k
   ALLOC(interp_lsp, NB_ORDER, spx_lsp_t);
442
7.67k
   ALLOC(interp_qlsp, NB_ORDER, spx_lsp_t);
443
7.67k
   ALLOC(interp_lpc, NB_ORDER, spx_coef_t);
444
7.67k
   ALLOC(interp_qlpc, NB_ORDER, spx_coef_t);
445
446
7.67k
   st->exc = st->excBuf + NB_PITCH_END + 2;
447
7.67k
   st->sw = st->swBuf + NB_PITCH_END + 2;
448
   /* Move signals 1 frame towards the past */
449
7.67k
   SPEEX_MOVE(st->excBuf, st->excBuf+NB_FRAME_SIZE, NB_PITCH_END+2);
450
7.67k
   SPEEX_MOVE(st->swBuf, st->swBuf+NB_FRAME_SIZE, NB_PITCH_END+2);
451
452
7.67k
   if (st->highpass_enabled)
453
4.51k
      highpass(in, in, NB_FRAME_SIZE, (st->isWideband?HIGHPASS_WIDEBAND:HIGHPASS_NARROWBAND)|HIGHPASS_INPUT, st->mem_hp);
454
455
7.67k
   {
456
7.67k
      VARDECL(spx_word16_t *w_sig);
457
7.67k
      VARDECL(spx_word16_t *autocorr);
458
7.67k
      ALLOC(w_sig, NB_WINDOW_SIZE, spx_word16_t);
459
7.67k
      ALLOC(autocorr, NB_ORDER+1, spx_word16_t);
460
      /* Window for analysis */
461
314k
      for (i=0;i<NB_WINDOW_SIZE-NB_FRAME_SIZE;i++)
462
306k
         w_sig[i] = MULT16_16_Q15(st->winBuf[i],st->window[i]);
463
1.23M
      for (;i<NB_WINDOW_SIZE;i++)
464
1.22M
         w_sig[i] = MULT16_16_Q15(in[i-NB_WINDOW_SIZE+NB_FRAME_SIZE],st->window[i]);
465
      /* Compute auto-correlation */
466
7.67k
      _spx_autocorr(w_sig, autocorr, NB_ORDER+1, NB_WINDOW_SIZE);
467
7.67k
      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
92.0k
      for (i=0;i<NB_ORDER+1;i++)
471
84.3k
         autocorr[i] = MULT16_16_Q15(autocorr[i],st->lagWindow[i]);
472
7.67k
      autocorr[0] = ADD16(autocorr[0],1);
473
474
      /* Levinson-Durbin */
475
7.67k
      _spx_lpc(lpc, autocorr, NB_ORDER);
476
      /* LPC to LSPs (x-domain) transform */
477
7.67k
      roots=lpc_to_lsp (lpc, NB_ORDER, lsp, 10, LSP_DELTA1, stack);
478
      /* Check if we found all the roots */
479
7.67k
      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
7.67k
   }
488
489
490
491
492
   /* Whole frame analysis (open-loop estimation of pitch and excitation gain) */
493
7.67k
   {
494
7.67k
      int diff = NB_WINDOW_SIZE-NB_FRAME_SIZE;
495
7.67k
      if (st->first)
496
20.4k
         for (i=0;i<NB_ORDER;i++)
497
18.5k
            interp_lsp[i] = lsp[i];
498
5.81k
      else
499
5.81k
         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
7.67k
      lsp_to_lpc(interp_lsp, interp_lpc, NB_ORDER,stack);
503
504
505
      /*Open-loop pitch*/
506
7.67k
      if (!st->submodes[st->submodeID] || (st->complexity>2 && SUBMODE(have_subframe_gain)<3) || SUBMODE(forced_pitch_gain) || SUBMODE(lbr_pitch) != -1
507
7.67k
#ifndef DISABLE_VBR
508
7.67k
           || st->vbr_enabled || st->vad_enabled
509
7.67k
#endif
510
7.67k
                  )
511
7.13k
      {
512
7.13k
         int nol_pitch[6];
513
7.13k
         spx_word16_t nol_pitch_coef[6];
514
515
7.13k
         bw_lpc(QCONST16(0.9,15), interp_lpc, bw_lpc1, NB_ORDER);
516
7.13k
         bw_lpc(QCONST16(0.55,15), interp_lpc, bw_lpc2, NB_ORDER);
517
518
7.13k
         SPEEX_COPY(st->sw, st->winBuf, diff);
519
7.13k
         SPEEX_COPY(st->sw+diff, in, NB_FRAME_SIZE-diff);
520
7.13k
         filter10(st->sw, bw_lpc1, bw_lpc2, st->sw, NB_FRAME_SIZE, st->mem_sw_whole, stack);
521
522
7.13k
         open_loop_nbest_pitch(st->sw, NB_PITCH_START, NB_PITCH_END, NB_FRAME_SIZE,
523
7.13k
                               nol_pitch, nol_pitch_coef, 6, stack);
524
7.13k
         ol_pitch=nol_pitch[0];
525
7.13k
         ol_pitch_coef = nol_pitch_coef[0];
526
         /*Try to remove pitch multiples*/
527
42.8k
         for (i=1;i<6;i++)
528
35.6k
         {
529
#ifdef FIXED_POINT
530
            if ((nol_pitch_coef[i]>MULT16_16_Q15(nol_pitch_coef[0],27853)) &&
531
#else
532
35.6k
            if ((nol_pitch_coef[i]>.85*nol_pitch_coef[0]) &&
533
35.6k
#endif
534
35.6k
                (ABS(2*nol_pitch[i]-ol_pitch)<=2 || ABS(3*nol_pitch[i]-ol_pitch)<=3 ||
535
9.99k
                 ABS(4*nol_pitch[i]-ol_pitch)<=4 || ABS(5*nol_pitch[i]-ol_pitch)<=5))
536
242
            {
537
               /*ol_pitch_coef=nol_pitch_coef[i];*/
538
242
               ol_pitch = nol_pitch[i];
539
242
            }
540
35.6k
         }
541
         /*if (ol_pitch>50)
542
           ol_pitch/=2;*/
543
         /*ol_pitch_coef = sqrt(ol_pitch_coef);*/
544
545
7.13k
      } else {
546
536
         ol_pitch=0;
547
536
         ol_pitch_coef=0;
548
536
      }
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
7.67k
      fir_mem16(st->winBuf, interp_lpc, st->exc, diff, NB_ORDER, st->mem_exc, stack);
554
7.67k
      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
7.67k
      {
558
7.67k
         spx_word16_t g = compute_rms16(st->exc, NB_FRAME_SIZE);
559
7.67k
         if (st->submodeID!=1 && ol_pitch>0)
560
3.69k
            ol_gain = MULT16_16(g, MULT16_16_Q14(QCONST16(1.1,14),
561
7.67k
                                spx_sqrt(QCONST32(1.,28)-MULT16_32_Q15(QCONST16(.8,15),SHL32(MULT16_16(ol_pitch_coef,ol_pitch_coef),16)))));
562
3.97k
         else
563
3.97k
            ol_gain = SHL32(EXTEND32(g),SIG_SHIFT);
564
7.67k
      }
565
7.67k
   }
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
7.67k
#ifndef DISABLE_VBR
578
7.67k
   if (st->vbr_enabled||st->vad_enabled)
579
6.31k
   {
580
6.31k
      float lsp_dist=0;
581
69.4k
      for (i=0;i<NB_ORDER;i++)
582
63.1k
         lsp_dist += (st->old_lsp[i] - lsp[i])*(st->old_lsp[i] - lsp[i]);
583
6.31k
      lsp_dist /= LSP_SCALING*LSP_SCALING;
584
585
6.31k
      if (st->abr_enabled)
586
1.44k
      {
587
1.44k
         float qual_change=0;
588
1.44k
         if (st->abr_drift2 * st->abr_drift > 0)
589
1.29k
         {
590
            /* Only adapt if long-term and short-term drift are the same sign */
591
1.29k
            qual_change = -.00001*st->abr_drift/(1+st->abr_count);
592
1.29k
            if (qual_change>.05)
593
0
               qual_change=.05;
594
1.29k
            if (qual_change<-.05)
595
239
               qual_change=-.05;
596
1.29k
         }
597
1.44k
         st->vbr_quality += qual_change;
598
1.44k
         if (st->vbr_quality>10)
599
0
            st->vbr_quality=10;
600
1.44k
         if (st->vbr_quality<0)
601
1.29k
            st->vbr_quality=0;
602
1.44k
      }
603
604
6.31k
      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.31k
      if (st->vbr_enabled)
608
4.91k
      {
609
4.91k
         spx_int32_t mode;
610
4.91k
         int choice=0;
611
4.91k
         float min_diff=100;
612
4.91k
         mode = 8;
613
44.2k
         while (mode)
614
39.3k
         {
615
39.3k
            int v1;
616
39.3k
            float thresh;
617
39.3k
            v1=(int)floor(st->vbr_quality);
618
39.3k
            if (v1==10)
619
3.45k
               thresh = vbr_nb_thresh[mode][v1];
620
35.8k
            else
621
35.8k
               thresh = (st->vbr_quality-v1)*vbr_nb_thresh[mode][v1+1] + (1+v1-st->vbr_quality)*vbr_nb_thresh[mode][v1];
622
39.3k
            if (st->relative_quality > thresh &&
623
39.3k
                st->relative_quality-thresh<min_diff)
624
4.44k
            {
625
4.44k
               choice = mode;
626
4.44k
               min_diff = st->relative_quality-thresh;
627
4.44k
            }
628
39.3k
            mode--;
629
39.3k
         }
630
4.91k
         mode=choice;
631
4.91k
         if (mode==0)
632
1.76k
         {
633
1.76k
            if (st->dtx_count==0 || lsp_dist>.05 || !st->dtx_enabled || st->dtx_count>20)
634
1.00k
            {
635
1.00k
               mode=1;
636
1.00k
               st->dtx_count=1;
637
1.00k
            } else {
638
765
               mode=0;
639
765
               st->dtx_count++;
640
765
            }
641
3.14k
         } else {
642
3.14k
            st->dtx_count=0;
643
3.14k
         }
644
645
4.91k
         speex_encoder_ctl(state, SPEEX_SET_MODE, &mode);
646
4.91k
         if (st->vbr_max>0)
647
3.77k
         {
648
3.77k
            spx_int32_t rate;
649
3.77k
            speex_encoder_ctl(state, SPEEX_GET_BITRATE, &rate);
650
3.77k
            if (rate > st->vbr_max)
651
1.09k
            {
652
1.09k
               rate = st->vbr_max;
653
1.09k
               speex_encoder_ctl(state, SPEEX_SET_BITRATE, &rate);
654
1.09k
            }
655
3.77k
         }
656
657
4.91k
         if (st->abr_enabled)
658
1.44k
         {
659
1.44k
            spx_int32_t bitrate;
660
1.44k
            speex_encoder_ctl(state, SPEEX_GET_BITRATE, &bitrate);
661
1.44k
            st->abr_drift+=(bitrate-st->abr_enabled);
662
1.44k
            st->abr_drift2 = .95*st->abr_drift2 + .05*(bitrate-st->abr_enabled);
663
1.44k
            st->abr_count += 1.0;
664
1.44k
         }
665
666
4.91k
      } else {
667
         /*VAD only case*/
668
1.40k
         int mode;
669
1.40k
         if (st->relative_quality<2)
670
680
         {
671
680
            if (st->dtx_count==0 || lsp_dist>.05 || !st->dtx_enabled || st->dtx_count>20)
672
416
            {
673
416
               st->dtx_count=1;
674
416
               mode=1;
675
416
            } else {
676
264
               mode=0;
677
264
               st->dtx_count++;
678
264
            }
679
721
         } else {
680
721
            st->dtx_count = 0;
681
721
            mode=st->submodeSelect;
682
721
         }
683
         /*speex_encoder_ctl(state, SPEEX_SET_MODE, &mode);*/
684
1.40k
         st->submodeID=mode;
685
1.40k
      }
686
6.31k
   } else {
687
1.35k
      st->relative_quality = -1;
688
1.35k
   }
689
7.67k
#endif /* #ifndef DISABLE_VBR */
690
691
7.67k
   if (st->encode_submode)
692
7.67k
   {
693
      /* First, transmit a zero for narrowband */
694
7.67k
      speex_bits_pack(bits, 0, 1);
695
696
      /* Transmit the sub-mode we use for this frame */
697
7.67k
      speex_bits_pack(bits, st->submodeID, NB_SUBMODE_BITS);
698
699
7.67k
   }
700
701
   /* If null mode (no transmission), just set a couple things to zero*/
702
7.67k
   if (st->submodes[st->submodeID] == NULL)
703
1.00k
   {
704
161k
      for (i=0;i<NB_FRAME_SIZE;i++)
705
160k
         st->exc[i]=st->sw[i]=VERY_SMALL;
706
707
11.0k
      for (i=0;i<NB_ORDER;i++)
708
10.0k
         st->mem_sw[i]=0;
709
1.00k
      st->first=1;
710
1.00k
      st->bounded_pitch = 1;
711
712
1.00k
      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
11.0k
      for (i=0;i<NB_ORDER;i++)
716
10.0k
         st->mem_sp[i] = 0;
717
1.00k
      return 0;
718
719
1.00k
   }
720
721
   /* LSP Quantization */
722
6.66k
   if (st->first)
723
1.12k
   {
724
12.3k
      for (i=0;i<NB_ORDER;i++)
725
11.2k
         st->old_lsp[i] = lsp[i];
726
1.12k
   }
727
728
729
   /*Quantize LSPs*/
730
6.66k
#if 1 /*0 for unquantized*/
731
6.66k
   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
6.66k
   if (SUBMODE(lbr_pitch)!=-1)
739
4.59k
   {
740
4.59k
      speex_bits_pack(bits, ol_pitch-NB_PITCH_START, 7);
741
4.59k
   }
742
743
6.66k
   if (SUBMODE(forced_pitch_gain))
744
4.25k
   {
745
4.25k
      int quant;
746
      /* This just damps the pitch a bit, because it tends to be too aggressive when forced */
747
4.25k
      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.25k
      quant = (int)floor(.5+15*ol_pitch_coef*GAIN_SCALING_1);
752
4.25k
#endif
753
4.25k
      if (quant>15)
754
36
         quant=15;
755
4.25k
      if (quant<0)
756
0
         quant=0;
757
4.25k
      speex_bits_pack(bits, quant, 4);
758
4.25k
      ol_pitch_coef=MULT16_16_P15(QCONST16(0.066667,15),SHL16(quant,GAIN_SHIFT));
759
4.25k
   }
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
6.66k
   {
772
6.66k
      int qe = (int)(floor(.5+3.5*log(ol_gain*1.0/SIG_SCALING)));
773
6.66k
      if (qe<0)
774
4.05k
         qe=0;
775
6.66k
      if (qe>31)
776
491
         qe=31;
777
6.66k
      ol_gain = exp(qe/3.5)*SIG_SCALING;
778
6.66k
      speex_bits_pack(bits, qe, 5);
779
6.66k
   }
780
6.66k
#endif
781
782
783
784
   /* Special case for first frame */
785
6.66k
   if (st->first)
786
1.12k
   {
787
12.3k
      for (i=0;i<NB_ORDER;i++)
788
11.2k
         st->old_qlsp[i] = qlsp[i];
789
1.12k
   }
790
791
   /* Target signal */
792
6.66k
   ALLOC(target, NB_SUBFRAME_SIZE, spx_word16_t);
793
6.66k
   ALLOC(innov, NB_SUBFRAME_SIZE, spx_sig_t);
794
6.66k
   ALLOC(exc32, NB_SUBFRAME_SIZE, spx_word32_t);
795
6.66k
   ALLOC(syn_resp, NB_SUBFRAME_SIZE, spx_word16_t);
796
6.66k
   ALLOC(mem, NB_ORDER, spx_mem_t);
797
798
   /* Loop on sub-frames */
799
33.3k
   for (sub=0;sub<NB_NB_SUBFRAMES;sub++)
800
26.6k
   {
801
26.6k
      int   offset;
802
26.6k
      spx_word16_t *sw;
803
26.6k
      spx_word16_t *exc, *inBuf;
804
26.6k
      int pitch;
805
26.6k
      int response_bound = NB_SUBFRAME_SIZE;
806
807
      /* Offset relative to start of frame */
808
26.6k
      offset = NB_SUBFRAME_SIZE*sub;
809
      /* Excitation */
810
26.6k
      exc=st->exc+offset;
811
      /* Weighted signal */
812
26.6k
      sw=st->sw+offset;
813
814
      /* LSP interpolation (quantized and unquantized) */
815
26.6k
      lsp_interpolate(st->old_lsp, lsp, interp_lsp, NB_ORDER, sub, NB_NB_SUBFRAMES, LSP_MARGIN);
816
26.6k
      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
26.6k
      lsp_to_lpc(interp_lsp, interp_lpc, NB_ORDER,stack);
820
821
26.6k
      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
26.6k
      {
825
26.6k
         spx_word32_t pi_g=LPC_SCALING;
826
160k
         for (i=0;i<NB_ORDER;i+=2)
827
133k
         {
828
            /*pi_g += -st->interp_qlpc[i] +  st->interp_qlpc[i+1];*/
829
133k
            pi_g = ADD32(pi_g, SUB32(EXTEND32(interp_qlpc[i+1]),EXTEND32(interp_qlpc[i])));
830
133k
         }
831
26.6k
         st->pi_gain[sub] = pi_g;
832
26.6k
      }
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
26.6k
      bw_lpc(st->gamma1, interp_lpc, bw_lpc1, NB_ORDER);
845
26.6k
      bw_lpc(st->gamma2, interp_lpc, bw_lpc2, NB_ORDER);
846
      /*print_vec(st->bw_lpc1, 10, "bw_lpc");*/
847
26.6k
#endif
848
849
      /*FIXME: This will break if we change the window size */
850
26.6k
      speex_assert(NB_WINDOW_SIZE-NB_FRAME_SIZE == NB_SUBFRAME_SIZE);
851
26.6k
      if (sub==0)
852
6.66k
         inBuf = st->winBuf;
853
20.0k
      else
854
20.0k
         inBuf = &in[((sub-1)*NB_SUBFRAME_SIZE)];
855
1.09M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
856
1.06M
         sw[i] = inBuf[i];
857
858
26.6k
      if (st->complexity==0)
859
6.19k
         response_bound >>= 1;
860
26.6k
      compute_impulse_response(interp_qlpc, bw_lpc1, bw_lpc2, syn_resp, response_bound, NB_ORDER, stack);
861
150k
      for (i=response_bound;i<NB_SUBFRAME_SIZE;i++)
862
123k
         syn_resp[i]=VERY_SMALL;
863
864
      /* Compute zero response of A(z/g1) / ( A(z/g2) * A(z) ) */
865
293k
      for (i=0;i<NB_ORDER;i++)
866
266k
         mem[i]=SHL32(st->mem_sp[i],1);
867
1.09M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
868
1.06M
         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
26.6k
      iir_mem16(exc, interp_qlpc, exc, NB_SUBFRAME_SIZE, NB_ORDER, mem, stack);
877
293k
      for (i=0;i<NB_ORDER;i++)
878
266k
         mem[i]=SHL32(st->mem_sw[i],1);
879
26.6k
      filter10(exc, bw_lpc1, bw_lpc2, exc, NB_SUBFRAME_SIZE, mem, stack);
880
26.6k
#endif
881
882
      /* Compute weighted signal */
883
293k
      for (i=0;i<NB_ORDER;i++)
884
266k
         mem[i]=st->mem_sw[i];
885
26.6k
      filter10(sw, bw_lpc1, bw_lpc2, sw, NB_SUBFRAME_SIZE, mem, stack);
886
887
26.6k
      if (st->complexity==0)
888
68.1k
         for (i=0;i<NB_ORDER;i++)
889
61.9k
            st->mem_sw[i]=mem[i];
890
891
      /* Compute target signal (saturation prevents overflows on clipped input speech) */
892
1.09M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
893
1.06M
         target[i]=EXTRACT16(SATURATE(SUB32(sw[i],PSHR32(exc[i],1)),32767));
894
895
1.09M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
896
1.06M
         exc[i] = inBuf[i];
897
26.6k
      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
26.6k
      speex_assert (SUBMODE(ltp_quant));
900
26.6k
      {
901
26.6k
         int pit_min, pit_max;
902
         /* Long-term prediction */
903
26.6k
         if (SUBMODE(lbr_pitch) != -1)
904
18.3k
         {
905
            /* Low bit-rate pitch handling */
906
18.3k
            int margin;
907
18.3k
            margin = SUBMODE(lbr_pitch);
908
18.3k
            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
18.3k
            } else {
917
18.3k
               pit_min=pit_max=ol_pitch;
918
18.3k
            }
919
18.3k
         } else {
920
8.29k
            pit_min = NB_PITCH_START;
921
8.29k
            pit_max = NB_PITCH_END;
922
8.29k
         }
923
924
         /* Force pitch to use only the current frame if needed */
925
26.6k
         if (st->bounded_pitch && pit_max>offset)
926
8.01k
            pit_max=offset;
927
928
         /* Perform pitch search */
929
26.6k
         pitch = SUBMODE(ltp_quant)(target, sw, interp_qlpc, bw_lpc1, bw_lpc2,
930
26.6k
                                    exc32, SUBMODE(ltp_params), pit_min, pit_max, ol_pitch_coef,
931
26.6k
                                    NB_ORDER, NB_SUBFRAME_SIZE, bits, stack,
932
26.6k
                                    exc, syn_resp, st->complexity, 0, st->plc_tuning, &st->cumul_gain);
933
934
26.6k
         st->pitch[sub]=pitch;
935
26.6k
      }
936
      /* Quantization of innovation */
937
26.6k
      SPEEX_MEMSET(innov, 0, NB_SUBFRAME_SIZE);
938
939
      /* FIXME: Make sure this is safe from overflows (so far so good) */
940
1.09M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
941
1.06M
         exc[i] = EXTRACT16(SUB32(EXTEND32(exc[i]), PSHR32(exc32[i],SIG_SHIFT-1)));
942
943
26.6k
      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
26.6k
      fine_gain = PDIV32_16(ener,PSHR32(ol_gain,SIG_SHIFT));
956
26.6k
#endif
957
      /* Calculate gain correction for the sub-frame (if any) */
958
26.6k
      if (SUBMODE(have_subframe_gain))
959
8.29k
      {
960
8.29k
         int qe;
961
8.29k
         if (SUBMODE(have_subframe_gain)==3)
962
5.06k
         {
963
5.06k
            qe = scal_quant(fine_gain, exc_gain_quant_scal3_bound, 8);
964
5.06k
            speex_bits_pack(bits, qe, 3);
965
5.06k
            ener=MULT16_32_Q14(exc_gain_quant_scal3[qe],ol_gain);
966
5.06k
         } else {
967
3.23k
            qe = scal_quant(fine_gain, exc_gain_quant_scal1_bound, 2);
968
3.23k
            speex_bits_pack(bits, qe, 1);
969
3.23k
            ener=MULT16_32_Q14(exc_gain_quant_scal1[qe],ol_gain);
970
3.23k
         }
971
18.3k
      } else {
972
18.3k
         ener=ol_gain;
973
18.3k
      }
974
975
      /*printf ("%f %f\n", ener, ol_gain);*/
976
977
      /* Normalize innovation */
978
26.6k
      signal_div(target, target, ener, NB_SUBFRAME_SIZE);
979
980
      /* Quantize innovation */
981
26.6k
      speex_assert (SUBMODE(innovation_quant));
982
26.6k
      {
983
         /* Codebook search */
984
26.6k
         SUBMODE(innovation_quant)(target, interp_qlpc, bw_lpc1, bw_lpc2,
985
26.6k
                  SUBMODE(innovation_params), NB_ORDER, NB_SUBFRAME_SIZE,
986
26.6k
                  innov, syn_resp, bits, stack, st->complexity, SUBMODE(double_codebook));
987
988
         /* De-normalize innovation and update excitation */
989
26.6k
         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
26.6k
         if (SUBMODE(double_codebook)) {
993
988
            char *tmp_stack=stack;
994
988
            VARDECL(spx_sig_t *innov2);
995
988
            ALLOC(innov2, NB_SUBFRAME_SIZE, spx_sig_t);
996
988
            SPEEX_MEMSET(innov2, 0, NB_SUBFRAME_SIZE);
997
40.5k
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
998
39.5k
               target[i]=MULT16_16_P13(QCONST16(2.2f,13), target[i]);
999
988
            SUBMODE(innovation_quant)(target, interp_qlpc, bw_lpc1, bw_lpc2,
1000
988
                                      SUBMODE(innovation_params), NB_ORDER, NB_SUBFRAME_SIZE,
1001
988
                                      innov2, syn_resp, bits, stack, st->complexity, 0);
1002
988
            signal_mul(innov2, innov2, MULT16_32_Q15(QCONST16(0.454545f,15),ener), NB_SUBFRAME_SIZE);
1003
40.5k
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
1004
39.5k
               innov[i] = ADD32(innov[i],innov2[i]);
1005
988
            stack = tmp_stack;
1006
988
         }
1007
1.09M
         for (i=0;i<NB_SUBFRAME_SIZE;i++)
1008
1.06M
            exc[i] = EXTRACT16(SATURATE32(PSHR32(ADD32(SHL32(exc32[i],1),innov[i]),SIG_SHIFT),32767));
1009
26.6k
         if (st->innov_rms_save)
1010
8.94k
            st->innov_rms_save[sub] = compute_rms(innov, NB_SUBFRAME_SIZE);
1011
26.6k
      }
1012
1013
      /* Final signal synthesis from excitation */
1014
26.6k
      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
26.6k
      if (st->complexity!=0)
1018
20.4k
         filter10(sw, bw_lpc1, bw_lpc2, sw, NB_SUBFRAME_SIZE, st->mem_sw, stack);
1019
1020
26.6k
   }
1021
1022
   /* Store the LSPs for interpolation in the next frame */
1023
6.66k
   if (st->submodeID>=1)
1024
6.66k
   {
1025
73.3k
      for (i=0;i<NB_ORDER;i++)
1026
66.6k
         st->old_lsp[i] = lsp[i];
1027
73.3k
      for (i=0;i<NB_ORDER;i++)
1028
66.6k
         st->old_qlsp[i] = qlsp[i];
1029
6.66k
   }
1030
1031
#ifdef VORBIS_PSYCHO
1032
   if (st->submodeID>=1)
1033
      SPEEX_COPY(st->old_curve, st->curve, 128);
1034
#endif
1035
1036
6.66k
   if (st->submodeID==1)
1037
3.42k
   {
1038
3.42k
#ifndef DISABLE_VBR
1039
3.42k
      if (st->dtx_count)
1040
1.44k
         speex_bits_pack(bits, 15, 4);
1041
1.97k
      else
1042
1.97k
#endif
1043
1.97k
         speex_bits_pack(bits, 0, 4);
1044
3.42k
   }
1045
1046
   /* The next frame will not be the first (Duh!) */
1047
6.66k
   st->first = 0;
1048
6.66k
   SPEEX_COPY(st->winBuf, in+2*NB_FRAME_SIZE-NB_WINDOW_SIZE, NB_WINDOW_SIZE-NB_FRAME_SIZE);
1049
1050
6.66k
   if (SUBMODE(innovation_quant) == noise_codebook_quant || st->submodeID==0)
1051
3.42k
      st->bounded_pitch = 1;
1052
3.24k
   else
1053
3.24k
      st->bounded_pitch = 0;
1054
1055
6.66k
   return 1;
1056
7.67k
}
nb_encode
Line
Count
Source
407
13.5k
{
408
13.5k
   EncState *st;
409
13.5k
   int i, sub, roots;
410
13.5k
   int ol_pitch;
411
13.5k
   spx_word16_t ol_pitch_coef;
412
13.5k
   spx_word32_t ol_gain;
413
13.5k
   VARDECL(spx_word16_t *target);
414
13.5k
   VARDECL(spx_sig_t *innov);
415
13.5k
   VARDECL(spx_word32_t *exc32);
416
13.5k
   VARDECL(spx_mem_t *mem);
417
13.5k
   VARDECL(spx_coef_t *bw_lpc1);
418
13.5k
   VARDECL(spx_coef_t *bw_lpc2);
419
13.5k
   VARDECL(spx_coef_t *lpc);
420
13.5k
   VARDECL(spx_lsp_t *lsp);
421
13.5k
   VARDECL(spx_lsp_t *qlsp);
422
13.5k
   VARDECL(spx_lsp_t *interp_lsp);
423
13.5k
   VARDECL(spx_lsp_t *interp_qlsp);
424
13.5k
   VARDECL(spx_coef_t *interp_lpc);
425
13.5k
   VARDECL(spx_coef_t *interp_qlpc);
426
13.5k
   char *stack;
427
13.5k
   VARDECL(spx_word16_t *syn_resp);
428
429
13.5k
   spx_word32_t ener=0;
430
13.5k
   spx_word16_t fine_gain;
431
13.5k
   spx_word16_t *in = (spx_word16_t*)vin;
432
433
13.5k
   st=(EncState *)state;
434
13.5k
   stack=st->stack;
435
436
13.5k
   ALLOC(lpc, NB_ORDER, spx_coef_t);
437
13.5k
   ALLOC(bw_lpc1, NB_ORDER, spx_coef_t);
438
13.5k
   ALLOC(bw_lpc2, NB_ORDER, spx_coef_t);
439
13.5k
   ALLOC(lsp, NB_ORDER, spx_lsp_t);
440
13.5k
   ALLOC(qlsp, NB_ORDER, spx_lsp_t);
441
13.5k
   ALLOC(interp_lsp, NB_ORDER, spx_lsp_t);
442
13.5k
   ALLOC(interp_qlsp, NB_ORDER, spx_lsp_t);
443
13.5k
   ALLOC(interp_lpc, NB_ORDER, spx_coef_t);
444
13.5k
   ALLOC(interp_qlpc, NB_ORDER, spx_coef_t);
445
446
13.5k
   st->exc = st->excBuf + NB_PITCH_END + 2;
447
13.5k
   st->sw = st->swBuf + NB_PITCH_END + 2;
448
   /* Move signals 1 frame towards the past */
449
13.5k
   SPEEX_MOVE(st->excBuf, st->excBuf+NB_FRAME_SIZE, NB_PITCH_END+2);
450
13.5k
   SPEEX_MOVE(st->swBuf, st->swBuf+NB_FRAME_SIZE, NB_PITCH_END+2);
451
452
13.5k
   if (st->highpass_enabled)
453
4.81k
      highpass(in, in, NB_FRAME_SIZE, (st->isWideband?HIGHPASS_WIDEBAND:HIGHPASS_NARROWBAND)|HIGHPASS_INPUT, st->mem_hp);
454
455
13.5k
   {
456
13.5k
      VARDECL(spx_word16_t *w_sig);
457
13.5k
      VARDECL(spx_word16_t *autocorr);
458
13.5k
      ALLOC(w_sig, NB_WINDOW_SIZE, spx_word16_t);
459
13.5k
      ALLOC(autocorr, NB_ORDER+1, spx_word16_t);
460
      /* Window for analysis */
461
555k
      for (i=0;i<NB_WINDOW_SIZE-NB_FRAME_SIZE;i++)
462
542k
         w_sig[i] = MULT16_16_Q15(st->winBuf[i],st->window[i]);
463
2.18M
      for (;i<NB_WINDOW_SIZE;i++)
464
2.16M
         w_sig[i] = MULT16_16_Q15(in[i-NB_WINDOW_SIZE+NB_FRAME_SIZE],st->window[i]);
465
      /* Compute auto-correlation */
466
13.5k
      _spx_autocorr(w_sig, autocorr, NB_ORDER+1, NB_WINDOW_SIZE);
467
13.5k
      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
162k
      for (i=0;i<NB_ORDER+1;i++)
471
149k
         autocorr[i] = MULT16_16_Q15(autocorr[i],st->lagWindow[i]);
472
13.5k
      autocorr[0] = ADD16(autocorr[0],1);
473
474
      /* Levinson-Durbin */
475
13.5k
      _spx_lpc(lpc, autocorr, NB_ORDER);
476
      /* LPC to LSPs (x-domain) transform */
477
13.5k
      roots=lpc_to_lsp (lpc, NB_ORDER, lsp, 10, LSP_DELTA1, stack);
478
      /* Check if we found all the roots */
479
13.5k
      if (roots!=NB_ORDER)
480
57
      {
481
         /*If we can't find all LSP's, do some damage control and use previous filter*/
482
627
         for (i=0;i<NB_ORDER;i++)
483
570
         {
484
570
            lsp[i]=st->old_lsp[i];
485
570
         }
486
57
      }
487
13.5k
   }
488
489
490
491
492
   /* Whole frame analysis (open-loop estimation of pitch and excitation gain) */
493
13.5k
   {
494
13.5k
      int diff = NB_WINDOW_SIZE-NB_FRAME_SIZE;
495
13.5k
      if (st->first)
496
26.1k
         for (i=0;i<NB_ORDER;i++)
497
23.7k
            interp_lsp[i] = lsp[i];
498
11.1k
      else
499
11.1k
         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
13.5k
      lsp_to_lpc(interp_lsp, interp_lpc, NB_ORDER,stack);
503
504
505
      /*Open-loop pitch*/
506
13.5k
      if (!st->submodes[st->submodeID] || (st->complexity>2 && SUBMODE(have_subframe_gain)<3) || SUBMODE(forced_pitch_gain) || SUBMODE(lbr_pitch) != -1
507
13.5k
#ifndef DISABLE_VBR
508
13.5k
           || st->vbr_enabled || st->vad_enabled
509
13.5k
#endif
510
13.5k
                  )
511
12.8k
      {
512
12.8k
         int nol_pitch[6];
513
12.8k
         spx_word16_t nol_pitch_coef[6];
514
515
12.8k
         bw_lpc(QCONST16(0.9,15), interp_lpc, bw_lpc1, NB_ORDER);
516
12.8k
         bw_lpc(QCONST16(0.55,15), interp_lpc, bw_lpc2, NB_ORDER);
517
518
12.8k
         SPEEX_COPY(st->sw, st->winBuf, diff);
519
12.8k
         SPEEX_COPY(st->sw+diff, in, NB_FRAME_SIZE-diff);
520
12.8k
         filter10(st->sw, bw_lpc1, bw_lpc2, st->sw, NB_FRAME_SIZE, st->mem_sw_whole, stack);
521
522
12.8k
         open_loop_nbest_pitch(st->sw, NB_PITCH_START, NB_PITCH_END, NB_FRAME_SIZE,
523
12.8k
                               nol_pitch, nol_pitch_coef, 6, stack);
524
12.8k
         ol_pitch=nol_pitch[0];
525
12.8k
         ol_pitch_coef = nol_pitch_coef[0];
526
         /*Try to remove pitch multiples*/
527
76.8k
         for (i=1;i<6;i++)
528
64.0k
         {
529
64.0k
#ifdef FIXED_POINT
530
64.0k
            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
64.0k
                (ABS(2*nol_pitch[i]-ol_pitch)<=2 || ABS(3*nol_pitch[i]-ol_pitch)<=3 ||
535
14.5k
                 ABS(4*nol_pitch[i]-ol_pitch)<=4 || ABS(5*nol_pitch[i]-ol_pitch)<=5))
536
683
            {
537
               /*ol_pitch_coef=nol_pitch_coef[i];*/
538
683
               ol_pitch = nol_pitch[i];
539
683
            }
540
64.0k
         }
541
         /*if (ol_pitch>50)
542
           ol_pitch/=2;*/
543
         /*ol_pitch_coef = sqrt(ol_pitch_coef);*/
544
545
12.8k
      } else {
546
747
         ol_pitch=0;
547
747
         ol_pitch_coef=0;
548
747
      }
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
13.5k
      fir_mem16(st->winBuf, interp_lpc, st->exc, diff, NB_ORDER, st->mem_exc, stack);
554
13.5k
      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
13.5k
      {
558
13.5k
         spx_word16_t g = compute_rms16(st->exc, NB_FRAME_SIZE);
559
13.5k
         if (st->submodeID!=1 && ol_pitch>0)
560
6.00k
            ol_gain = MULT16_16(g, MULT16_16_Q14(QCONST16(1.1,14),
561
13.5k
                                spx_sqrt(QCONST32(1.,28)-MULT16_32_Q15(QCONST16(.8,15),SHL32(MULT16_16(ol_pitch_coef,ol_pitch_coef),16)))));
562
7.55k
         else
563
7.55k
            ol_gain = SHL32(EXTEND32(g),SIG_SHIFT);
564
13.5k
      }
565
13.5k
   }
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
13.5k
#ifndef DISABLE_VBR
578
13.5k
   if (st->vbr_enabled||st->vad_enabled)
579
10.4k
   {
580
10.4k
      float lsp_dist=0;
581
114k
      for (i=0;i<NB_ORDER;i++)
582
104k
         lsp_dist += (st->old_lsp[i] - lsp[i])*(st->old_lsp[i] - lsp[i]);
583
10.4k
      lsp_dist /= LSP_SCALING*LSP_SCALING;
584
585
10.4k
      if (st->abr_enabled)
586
2.39k
      {
587
2.39k
         float qual_change=0;
588
2.39k
         if (st->abr_drift2 * st->abr_drift > 0)
589
2.15k
         {
590
            /* Only adapt if long-term and short-term drift are the same sign */
591
2.15k
            qual_change = -.00001*st->abr_drift/(1+st->abr_count);
592
2.15k
            if (qual_change>.05)
593
0
               qual_change=.05;
594
2.15k
            if (qual_change<-.05)
595
571
               qual_change=-.05;
596
2.15k
         }
597
2.39k
         st->vbr_quality += qual_change;
598
2.39k
         if (st->vbr_quality>10)
599
0
            st->vbr_quality=10;
600
2.39k
         if (st->vbr_quality<0)
601
2.15k
            st->vbr_quality=0;
602
2.39k
      }
603
604
10.4k
      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
10.4k
      if (st->vbr_enabled)
608
7.65k
      {
609
7.65k
         spx_int32_t mode;
610
7.65k
         int choice=0;
611
7.65k
         float min_diff=100;
612
7.65k
         mode = 8;
613
68.9k
         while (mode)
614
61.2k
         {
615
61.2k
            int v1;
616
61.2k
            float thresh;
617
61.2k
            v1=(int)floor(st->vbr_quality);
618
61.2k
            if (v1==10)
619
1.64k
               thresh = vbr_nb_thresh[mode][v1];
620
59.6k
            else
621
59.6k
               thresh = (st->vbr_quality-v1)*vbr_nb_thresh[mode][v1+1] + (1+v1-st->vbr_quality)*vbr_nb_thresh[mode][v1];
622
61.2k
            if (st->relative_quality > thresh &&
623
61.2k
                st->relative_quality-thresh<min_diff)
624
8.63k
            {
625
8.63k
               choice = mode;
626
8.63k
               min_diff = st->relative_quality-thresh;
627
8.63k
            }
628
61.2k
            mode--;
629
61.2k
         }
630
7.65k
         mode=choice;
631
7.65k
         if (mode==0)
632
1.79k
         {
633
1.79k
            if (st->dtx_count==0 || lsp_dist>.05 || !st->dtx_enabled || st->dtx_count>20)
634
1.14k
            {
635
1.14k
               mode=1;
636
1.14k
               st->dtx_count=1;
637
1.14k
            } else {
638
652
               mode=0;
639
652
               st->dtx_count++;
640
652
            }
641
5.85k
         } else {
642
5.85k
            st->dtx_count=0;
643
5.85k
         }
644
645
7.65k
         speex_encoder_ctl(state, SPEEX_SET_MODE, &mode);
646
7.65k
         if (st->vbr_max>0)
647
5.74k
         {
648
5.74k
            spx_int32_t rate;
649
5.74k
            speex_encoder_ctl(state, SPEEX_GET_BITRATE, &rate);
650
5.74k
            if (rate > st->vbr_max)
651
2.53k
            {
652
2.53k
               rate = st->vbr_max;
653
2.53k
               speex_encoder_ctl(state, SPEEX_SET_BITRATE, &rate);
654
2.53k
            }
655
5.74k
         }
656
657
7.65k
         if (st->abr_enabled)
658
2.39k
         {
659
2.39k
            spx_int32_t bitrate;
660
2.39k
            speex_encoder_ctl(state, SPEEX_GET_BITRATE, &bitrate);
661
2.39k
            st->abr_drift+=(bitrate-st->abr_enabled);
662
2.39k
            st->abr_drift2 = .95*st->abr_drift2 + .05*(bitrate-st->abr_enabled);
663
2.39k
            st->abr_count += 1.0;
664
2.39k
         }
665
666
7.65k
      } else {
667
         /*VAD only case*/
668
2.75k
         int mode;
669
2.75k
         if (st->relative_quality<2)
670
484
         {
671
484
            if (st->dtx_count==0 || lsp_dist>.05 || !st->dtx_enabled || st->dtx_count>20)
672
310
            {
673
310
               st->dtx_count=1;
674
310
               mode=1;
675
310
            } else {
676
174
               mode=0;
677
174
               st->dtx_count++;
678
174
            }
679
2.26k
         } else {
680
2.26k
            st->dtx_count = 0;
681
2.26k
            mode=st->submodeSelect;
682
2.26k
         }
683
         /*speex_encoder_ctl(state, SPEEX_SET_MODE, &mode);*/
684
2.75k
         st->submodeID=mode;
685
2.75k
      }
686
10.4k
   } else {
687
3.14k
      st->relative_quality = -1;
688
3.14k
   }
689
13.5k
#endif /* #ifndef DISABLE_VBR */
690
691
13.5k
   if (st->encode_submode)
692
13.5k
   {
693
      /* First, transmit a zero for narrowband */
694
13.5k
      speex_bits_pack(bits, 0, 1);
695
696
      /* Transmit the sub-mode we use for this frame */
697
13.5k
      speex_bits_pack(bits, st->submodeID, NB_SUBMODE_BITS);
698
699
13.5k
   }
700
701
   /* If null mode (no transmission), just set a couple things to zero*/
702
13.5k
   if (st->submodes[st->submodeID] == NULL)
703
761
   {
704
122k
      for (i=0;i<NB_FRAME_SIZE;i++)
705
121k
         st->exc[i]=st->sw[i]=VERY_SMALL;
706
707
8.37k
      for (i=0;i<NB_ORDER;i++)
708
7.61k
         st->mem_sw[i]=0;
709
761
      st->first=1;
710
761
      st->bounded_pitch = 1;
711
712
761
      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
8.37k
      for (i=0;i<NB_ORDER;i++)
716
7.61k
         st->mem_sp[i] = 0;
717
761
      return 0;
718
719
761
   }
720
721
   /* LSP Quantization */
722
12.7k
   if (st->first)
723
1.85k
   {
724
20.4k
      for (i=0;i<NB_ORDER;i++)
725
18.5k
         st->old_lsp[i] = lsp[i];
726
1.85k
   }
727
728
729
   /*Quantize LSPs*/
730
12.7k
#if 1 /*0 for unquantized*/
731
12.7k
   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
12.7k
   if (SUBMODE(lbr_pitch)!=-1)
739
8.79k
   {
740
8.79k
      speex_bits_pack(bits, ol_pitch-NB_PITCH_START, 7);
741
8.79k
   }
742
743
12.7k
   if (SUBMODE(forced_pitch_gain))
744
8.04k
   {
745
8.04k
      int quant;
746
      /* This just damps the pitch a bit, because it tends to be too aggressive when forced */
747
8.04k
      ol_pitch_coef = MULT16_16_Q15(QCONST16(.9,15), ol_pitch_coef);
748
8.04k
#ifdef FIXED_POINT
749
8.04k
      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
8.04k
      if (quant>15)
754
72
         quant=15;
755
8.04k
      if (quant<0)
756
0
         quant=0;
757
8.04k
      speex_bits_pack(bits, quant, 4);
758
8.04k
      ol_pitch_coef=MULT16_16_P15(QCONST16(0.066667,15),SHL16(quant,GAIN_SHIFT));
759
8.04k
   }
760
761
762
   /*Quantize and transmit open-loop excitation gain*/
763
12.7k
#ifdef FIXED_POINT
764
12.7k
   {
765
12.7k
      int qe = scal_quant32(ol_gain, ol_gain_table, 32);
766
      /*ol_gain = exp(qe/3.5)*SIG_SCALING;*/
767
12.7k
      ol_gain = MULT16_32_Q15(28406,ol_gain_table[qe]);
768
12.7k
      speex_bits_pack(bits, qe, 5);
769
12.7k
   }
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
12.7k
   if (st->first)
786
1.85k
   {
787
20.4k
      for (i=0;i<NB_ORDER;i++)
788
18.5k
         st->old_qlsp[i] = qlsp[i];
789
1.85k
   }
790
791
   /* Target signal */
792
12.7k
   ALLOC(target, NB_SUBFRAME_SIZE, spx_word16_t);
793
12.7k
   ALLOC(innov, NB_SUBFRAME_SIZE, spx_sig_t);
794
12.7k
   ALLOC(exc32, NB_SUBFRAME_SIZE, spx_word32_t);
795
12.7k
   ALLOC(syn_resp, NB_SUBFRAME_SIZE, spx_word16_t);
796
12.7k
   ALLOC(mem, NB_ORDER, spx_mem_t);
797
798
   /* Loop on sub-frames */
799
63.9k
   for (sub=0;sub<NB_NB_SUBFRAMES;sub++)
800
51.1k
   {
801
51.1k
      int   offset;
802
51.1k
      spx_word16_t *sw;
803
51.1k
      spx_word16_t *exc, *inBuf;
804
51.1k
      int pitch;
805
51.1k
      int response_bound = NB_SUBFRAME_SIZE;
806
807
      /* Offset relative to start of frame */
808
51.1k
      offset = NB_SUBFRAME_SIZE*sub;
809
      /* Excitation */
810
51.1k
      exc=st->exc+offset;
811
      /* Weighted signal */
812
51.1k
      sw=st->sw+offset;
813
814
      /* LSP interpolation (quantized and unquantized) */
815
51.1k
      lsp_interpolate(st->old_lsp, lsp, interp_lsp, NB_ORDER, sub, NB_NB_SUBFRAMES, LSP_MARGIN);
816
51.1k
      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
51.1k
      lsp_to_lpc(interp_lsp, interp_lpc, NB_ORDER,stack);
820
821
51.1k
      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
51.1k
      {
825
51.1k
         spx_word32_t pi_g=LPC_SCALING;
826
307k
         for (i=0;i<NB_ORDER;i+=2)
827
255k
         {
828
            /*pi_g += -st->interp_qlpc[i] +  st->interp_qlpc[i+1];*/
829
255k
            pi_g = ADD32(pi_g, SUB32(EXTEND32(interp_qlpc[i+1]),EXTEND32(interp_qlpc[i])));
830
255k
         }
831
51.1k
         st->pi_gain[sub] = pi_g;
832
51.1k
      }
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
51.1k
      bw_lpc(st->gamma1, interp_lpc, bw_lpc1, NB_ORDER);
845
51.1k
      bw_lpc(st->gamma2, interp_lpc, bw_lpc2, NB_ORDER);
846
      /*print_vec(st->bw_lpc1, 10, "bw_lpc");*/
847
51.1k
#endif
848
849
      /*FIXME: This will break if we change the window size */
850
51.1k
      speex_assert(NB_WINDOW_SIZE-NB_FRAME_SIZE == NB_SUBFRAME_SIZE);
851
51.1k
      if (sub==0)
852
12.7k
         inBuf = st->winBuf;
853
38.3k
      else
854
38.3k
         inBuf = &in[((sub-1)*NB_SUBFRAME_SIZE)];
855
2.09M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
856
2.04M
         sw[i] = inBuf[i];
857
858
51.1k
      if (st->complexity==0)
859
13.8k
         response_bound >>= 1;
860
51.1k
      compute_impulse_response(interp_qlpc, bw_lpc1, bw_lpc2, syn_resp, response_bound, NB_ORDER, stack);
861
327k
      for (i=response_bound;i<NB_SUBFRAME_SIZE;i++)
862
276k
         syn_resp[i]=VERY_SMALL;
863
864
      /* Compute zero response of A(z/g1) / ( A(z/g2) * A(z) ) */
865
562k
      for (i=0;i<NB_ORDER;i++)
866
511k
         mem[i]=SHL32(st->mem_sp[i],1);
867
2.09M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
868
2.04M
         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
51.1k
      iir_mem16(exc, interp_qlpc, exc, NB_SUBFRAME_SIZE, NB_ORDER, mem, stack);
877
562k
      for (i=0;i<NB_ORDER;i++)
878
511k
         mem[i]=SHL32(st->mem_sw[i],1);
879
51.1k
      filter10(exc, bw_lpc1, bw_lpc2, exc, NB_SUBFRAME_SIZE, mem, stack);
880
51.1k
#endif
881
882
      /* Compute weighted signal */
883
562k
      for (i=0;i<NB_ORDER;i++)
884
511k
         mem[i]=st->mem_sw[i];
885
51.1k
      filter10(sw, bw_lpc1, bw_lpc2, sw, NB_SUBFRAME_SIZE, mem, stack);
886
887
51.1k
      if (st->complexity==0)
888
152k
         for (i=0;i<NB_ORDER;i++)
889
138k
            st->mem_sw[i]=mem[i];
890
891
      /* Compute target signal (saturation prevents overflows on clipped input speech) */
892
2.09M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
893
2.04M
         target[i]=EXTRACT16(SATURATE(SUB32(sw[i],PSHR32(exc[i],1)),32767));
894
895
2.09M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
896
2.04M
         exc[i] = inBuf[i];
897
51.1k
      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
51.1k
      speex_assert (SUBMODE(ltp_quant));
900
51.1k
      {
901
51.1k
         int pit_min, pit_max;
902
         /* Long-term prediction */
903
51.1k
         if (SUBMODE(lbr_pitch) != -1)
904
35.1k
         {
905
            /* Low bit-rate pitch handling */
906
35.1k
            int margin;
907
35.1k
            margin = SUBMODE(lbr_pitch);
908
35.1k
            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
35.1k
            } else {
917
35.1k
               pit_min=pit_max=ol_pitch;
918
35.1k
            }
919
35.1k
         } else {
920
15.9k
            pit_min = NB_PITCH_START;
921
15.9k
            pit_max = NB_PITCH_END;
922
15.9k
         }
923
924
         /* Force pitch to use only the current frame if needed */
925
51.1k
         if (st->bounded_pitch && pit_max>offset)
926
15.8k
            pit_max=offset;
927
928
         /* Perform pitch search */
929
51.1k
         pitch = SUBMODE(ltp_quant)(target, sw, interp_qlpc, bw_lpc1, bw_lpc2,
930
51.1k
                                    exc32, SUBMODE(ltp_params), pit_min, pit_max, ol_pitch_coef,
931
51.1k
                                    NB_ORDER, NB_SUBFRAME_SIZE, bits, stack,
932
51.1k
                                    exc, syn_resp, st->complexity, 0, st->plc_tuning, &st->cumul_gain);
933
934
51.1k
         st->pitch[sub]=pitch;
935
51.1k
      }
936
      /* Quantization of innovation */
937
51.1k
      SPEEX_MEMSET(innov, 0, NB_SUBFRAME_SIZE);
938
939
      /* FIXME: Make sure this is safe from overflows (so far so good) */
940
2.09M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
941
2.04M
         exc[i] = EXTRACT16(SUB32(EXTEND32(exc[i]), PSHR32(exc32[i],SIG_SHIFT-1)));
942
943
51.1k
      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
51.1k
#ifdef FIXED_POINT
947
51.1k
      {
948
51.1k
         spx_word32_t f = PDIV32(ener,PSHR32(ol_gain,SIG_SHIFT));
949
51.1k
         if (f<=32767)
950
47.1k
            fine_gain = f;
951
4.01k
         else
952
4.01k
            fine_gain = 32767;
953
51.1k
      }
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
51.1k
      if (SUBMODE(have_subframe_gain))
959
15.9k
      {
960
15.9k
         int qe;
961
15.9k
         if (SUBMODE(have_subframe_gain)==3)
962
9.91k
         {
963
9.91k
            qe = scal_quant(fine_gain, exc_gain_quant_scal3_bound, 8);
964
9.91k
            speex_bits_pack(bits, qe, 3);
965
9.91k
            ener=MULT16_32_Q14(exc_gain_quant_scal3[qe],ol_gain);
966
9.91k
         } else {
967
6.07k
            qe = scal_quant(fine_gain, exc_gain_quant_scal1_bound, 2);
968
6.07k
            speex_bits_pack(bits, qe, 1);
969
6.07k
            ener=MULT16_32_Q14(exc_gain_quant_scal1[qe],ol_gain);
970
6.07k
         }
971
35.1k
      } else {
972
35.1k
         ener=ol_gain;
973
35.1k
      }
974
975
      /*printf ("%f %f\n", ener, ol_gain);*/
976
977
      /* Normalize innovation */
978
51.1k
      signal_div(target, target, ener, NB_SUBFRAME_SIZE);
979
980
      /* Quantize innovation */
981
51.1k
      speex_assert (SUBMODE(innovation_quant));
982
51.1k
      {
983
         /* Codebook search */
984
51.1k
         SUBMODE(innovation_quant)(target, interp_qlpc, bw_lpc1, bw_lpc2,
985
51.1k
                  SUBMODE(innovation_params), NB_ORDER, NB_SUBFRAME_SIZE,
986
51.1k
                  innov, syn_resp, bits, stack, st->complexity, SUBMODE(double_codebook));
987
988
         /* De-normalize innovation and update excitation */
989
51.1k
         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
51.1k
         if (SUBMODE(double_codebook)) {
993
960
            char *tmp_stack=stack;
994
960
            VARDECL(spx_sig_t *innov2);
995
960
            ALLOC(innov2, NB_SUBFRAME_SIZE, spx_sig_t);
996
960
            SPEEX_MEMSET(innov2, 0, NB_SUBFRAME_SIZE);
997
39.3k
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
998
38.4k
               target[i]=MULT16_16_P13(QCONST16(2.2f,13), target[i]);
999
960
            SUBMODE(innovation_quant)(target, interp_qlpc, bw_lpc1, bw_lpc2,
1000
960
                                      SUBMODE(innovation_params), NB_ORDER, NB_SUBFRAME_SIZE,
1001
960
                                      innov2, syn_resp, bits, stack, st->complexity, 0);
1002
960
            signal_mul(innov2, innov2, MULT16_32_Q15(QCONST16(0.454545f,15),ener), NB_SUBFRAME_SIZE);
1003
39.3k
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
1004
38.4k
               innov[i] = ADD32(innov[i],innov2[i]);
1005
960
            stack = tmp_stack;
1006
960
         }
1007
2.09M
         for (i=0;i<NB_SUBFRAME_SIZE;i++)
1008
2.04M
            exc[i] = EXTRACT16(SATURATE32(PSHR32(ADD32(SHL32(exc32[i],1),innov[i]),SIG_SHIFT),32767));
1009
51.1k
         if (st->innov_rms_save)
1010
13.3k
            st->innov_rms_save[sub] = compute_rms(innov, NB_SUBFRAME_SIZE);
1011
51.1k
      }
1012
1013
      /* Final signal synthesis from excitation */
1014
51.1k
      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
51.1k
      if (st->complexity!=0)
1018
37.3k
         filter10(sw, bw_lpc1, bw_lpc2, sw, NB_SUBFRAME_SIZE, st->mem_sw, stack);
1019
1020
51.1k
   }
1021
1022
   /* Store the LSPs for interpolation in the next frame */
1023
12.7k
   if (st->submodeID>=1)
1024
12.7k
   {
1025
140k
      for (i=0;i<NB_ORDER;i++)
1026
127k
         st->old_lsp[i] = lsp[i];
1027
140k
      for (i=0;i<NB_ORDER;i++)
1028
127k
         st->old_qlsp[i] = qlsp[i];
1029
12.7k
   }
1030
1031
#ifdef VORBIS_PSYCHO
1032
   if (st->submodeID>=1)
1033
      SPEEX_COPY(st->old_curve, st->curve, 128);
1034
#endif
1035
1036
12.7k
   if (st->submodeID==1)
1037
6.65k
   {
1038
6.65k
#ifndef DISABLE_VBR
1039
6.65k
      if (st->dtx_count)
1040
1.52k
         speex_bits_pack(bits, 15, 4);
1041
5.13k
      else
1042
5.13k
#endif
1043
5.13k
         speex_bits_pack(bits, 0, 4);
1044
6.65k
   }
1045
1046
   /* The next frame will not be the first (Duh!) */
1047
12.7k
   st->first = 0;
1048
12.7k
   SPEEX_COPY(st->winBuf, in+2*NB_FRAME_SIZE-NB_WINDOW_SIZE, NB_WINDOW_SIZE-NB_FRAME_SIZE);
1049
1050
12.7k
   if (SUBMODE(innovation_quant) == noise_codebook_quant || st->submodeID==0)
1051
6.65k
      st->bounded_pitch = 1;
1052
6.14k
   else
1053
6.14k
      st->bounded_pitch = 0;
1054
1055
12.7k
   return 1;
1056
13.5k
}
1057
#endif /* DISABLE_ENCODER */
1058
1059
1060
#ifndef DISABLE_DECODER
1061
void *nb_decoder_init(const SpeexMode *m)
1062
3.77k
{
1063
3.77k
   DecState *st;
1064
3.77k
   const SpeexNBMode *mode;
1065
3.77k
   int i;
1066
1067
3.77k
   mode=(const SpeexNBMode*)m->mode;
1068
3.77k
   st = (DecState *)speex_alloc(sizeof(DecState));
1069
3.77k
   if (!st)
1070
0
      return NULL;
1071
3.77k
#if defined(VAR_ARRAYS) || defined (USE_ALLOCA)
1072
3.77k
   st->stack = NULL;
1073
#else
1074
   st->stack = (char*)speex_alloc_scratch(NB_DEC_STACK);
1075
#endif
1076
1077
3.77k
   st->mode=m;
1078
1079
1080
3.77k
   st->encode_submode = 1;
1081
1082
3.77k
   st->first=1;
1083
   /* Codec parameters, should eventually have several "modes"*/
1084
1085
3.77k
   st->submodes=mode->submodes;
1086
3.77k
   st->submodeID=mode->defaultSubmode;
1087
1088
3.77k
   st->lpc_enh_enabled=1;
1089
1090
3.77k
   SPEEX_MEMSET(st->excBuf, 0, NB_FRAME_SIZE + NB_PITCH_END);
1091
1092
3.77k
   st->last_pitch = 40;
1093
3.77k
   st->count_lost=0;
1094
3.77k
   st->pitch_gain_buf[0] = st->pitch_gain_buf[1] = st->pitch_gain_buf[2] = 0;
1095
3.77k
   st->pitch_gain_buf_idx = 0;
1096
3.77k
   st->seed = 1000;
1097
1098
3.77k
   st->sampling_rate=8000;
1099
3.77k
   st->last_ol_gain = 0;
1100
1101
3.77k
   st->user_callback.func = &speex_default_user_handler;
1102
3.77k
   st->user_callback.data = NULL;
1103
64.1k
   for (i=0;i<16;i++)
1104
60.4k
      st->speex_callbacks[i].func = NULL;
1105
1106
3.77k
   st->voc_m1=st->voc_m2=st->voc_mean=0;
1107
3.77k
   st->voc_offset=0;
1108
3.77k
   st->dtx_enabled=0;
1109
3.77k
   st->isWideband = 0;
1110
3.77k
   st->highpass_enabled = 1;
1111
1112
#ifdef ENABLE_VALGRIND
1113
   VALGRIND_MAKE_MEM_DEFINED(st, NB_DEC_STACK);
1114
#endif
1115
3.77k
   return st;
1116
3.77k
}
1117
1118
void nb_decoder_destroy(void *state)
1119
3.77k
{
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
3.77k
   speex_free(state);
1128
3.77k
}
1129
1130
int nb_decoder_ctl(void *state, int request, void *ptr)
1131
176k
{
1132
176k
   DecState *st;
1133
176k
   st=(DecState*)state;
1134
176k
   switch(request)
1135
176k
   {
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
3.77k
   case SPEEX_SET_ENH:
1145
3.77k
      st->lpc_enh_enabled = *((spx_int32_t*)ptr);
1146
3.77k
      break;
1147
0
   case SPEEX_GET_ENH:
1148
0
      *((spx_int32_t*)ptr) = st->lpc_enh_enabled;
1149
0
      break;
1150
9.29k
   case SPEEX_GET_FRAME_SIZE:
1151
9.29k
      (*(spx_int32_t*)ptr) = NB_FRAME_SIZE;
1152
9.29k
      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
3.77k
   case SPEEX_SET_SAMPLING_RATE:
1160
3.77k
      st->sampling_rate = (*(spx_int32_t*)ptr);
1161
3.77k
      break;
1162
2.60k
   case SPEEX_GET_SAMPLING_RATE:
1163
2.60k
      (*(spx_int32_t*)ptr)=st->sampling_rate;
1164
2.60k
      break;
1165
1.86k
   case SPEEX_SET_HANDLER:
1166
1.86k
      {
1167
1.86k
         SpeexCallback *c = (SpeexCallback*)ptr;
1168
1.86k
         st->speex_callbacks[c->callback_id].func=c->func;
1169
1.86k
         st->speex_callbacks[c->callback_id].data=c->data;
1170
1.86k
         st->speex_callbacks[c->callback_id].callback_id=c->callback_id;
1171
1.86k
      }
1172
1.86k
      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.63k
   case SPEEX_GET_LOOKAHEAD:
1197
3.63k
      (*(spx_int32_t*)ptr)=NB_SUBFRAME_SIZE;
1198
3.63k
      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
4.49k
   case SPEEX_GET_PI_GAIN:
1222
4.49k
      {
1223
4.49k
         int i;
1224
4.49k
         spx_word32_t *g = (spx_word32_t*)ptr;
1225
22.4k
         for (i=0;i<NB_NB_SUBFRAMES;i++)
1226
17.9k
            g[i]=st->pi_gain[i];
1227
4.49k
      }
1228
4.49k
      break;
1229
4.49k
   case SPEEX_GET_EXC:
1230
4.49k
      {
1231
4.49k
         int i;
1232
22.4k
         for (i=0;i<NB_NB_SUBFRAMES;i++)
1233
17.9k
            ((spx_word16_t*)ptr)[i] = compute_rms16(st->exc+i*NB_SUBFRAME_SIZE, NB_SUBFRAME_SIZE);
1234
4.49k
      }
1235
4.49k
      break;
1236
87.3k
   case SPEEX_GET_DTX_STATUS:
1237
87.3k
      *((spx_int32_t*)ptr) = st->dtx_enabled;
1238
87.3k
      break;
1239
50.5k
   case SPEEX_SET_INNOVATION_SAVE:
1240
50.5k
      st->innov_save = (spx_word16_t*)ptr;
1241
50.5k
      break;
1242
4.25k
   case SPEEX_SET_WIDEBAND:
1243
4.25k
      st->isWideband = *((spx_int32_t*)ptr);
1244
4.25k
      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
176k
   }
1252
176k
   return 0;
1253
176k
}
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
65.8k
{
1332
65.8k
   DecState *st;
1333
65.8k
   int i, sub;
1334
65.8k
   int pitch;
1335
65.8k
   spx_word16_t pitch_gain[3];
1336
65.8k
   spx_word32_t ol_gain=0;
1337
65.8k
   int ol_pitch=0;
1338
65.8k
   spx_word16_t ol_pitch_coef=0;
1339
65.8k
   int best_pitch=40;
1340
65.8k
   spx_word16_t best_pitch_gain=0;
1341
65.8k
   int wideband;
1342
65.8k
   int m;
1343
65.8k
   char *stack;
1344
65.8k
   VARDECL(spx_sig_t *innov);
1345
65.8k
   VARDECL(spx_word32_t *exc32);
1346
65.8k
   VARDECL(spx_coef_t *ak);
1347
65.8k
   VARDECL(spx_lsp_t *qlsp);
1348
65.8k
   spx_word16_t pitch_average=0;
1349
1350
65.8k
   spx_word16_t *out = (spx_word16_t*)vout;
1351
65.8k
   VARDECL(spx_lsp_t *interp_qlsp);
1352
1353
65.8k
   st=(DecState*)state;
1354
65.8k
   stack=st->stack;
1355
1356
65.8k
   st->exc = st->excBuf + 2*NB_PITCH_END + NB_SUBFRAME_SIZE + 6;
1357
1358
   /* Check if we're in DTX mode*/
1359
65.8k
   if (!bits && st->dtx_enabled)
1360
0
   {
1361
0
      st->submodeID=0;
1362
0
   } else
1363
65.8k
   {
1364
      /* If bits is NULL, consider the packet to be lost (what could we do anyway) */
1365
65.8k
      if (!bits)
1366
0
      {
1367
0
         nb_decode_lost(st, out, stack);
1368
0
         return 0;
1369
0
      }
1370
1371
65.8k
      if (st->encode_submode)
1372
65.8k
      {
1373
1374
      /* Search for next narrowband block (handle requests, skip wideband blocks) */
1375
70.7k
      do {
1376
70.7k
         if (speex_bits_remaining(bits)<5)
1377
13.1k
            return -1;
1378
57.6k
         wideband = speex_bits_unpack_unsigned(bits, 1);
1379
57.6k
         if (wideband) /* Skip wideband block (for compatibility) */
1380
3.76k
         {
1381
3.76k
            int submode;
1382
3.76k
            int advance;
1383
3.76k
            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.76k
            advance = wb_skip_table[submode];
1386
3.76k
            if (advance < 0)
1387
0
            {
1388
0
               speex_notify("Invalid mode encountered. The stream is corrupted.");
1389
0
               return -2;
1390
0
            }
1391
3.76k
            advance -= (SB_SUBMODE_BITS+1);
1392
3.76k
            speex_bits_advance(bits, advance);
1393
1394
3.76k
            if (speex_bits_remaining(bits)<5)
1395
921
               return -1;
1396
2.84k
            wideband = speex_bits_unpack_unsigned(bits, 1);
1397
2.84k
            if (wideband)
1398
2.24k
            {
1399
2.24k
               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.24k
               advance = wb_skip_table[submode];
1402
2.24k
               if (advance < 0)
1403
0
               {
1404
0
                  speex_notify("Invalid mode encountered. The stream is corrupted.");
1405
0
                  return -2;
1406
0
               }
1407
2.24k
               advance -= (SB_SUBMODE_BITS+1);
1408
2.24k
               speex_bits_advance(bits, advance);
1409
2.24k
               wideband = speex_bits_unpack_unsigned(bits, 1);
1410
2.24k
               if (wideband)
1411
1.82k
               {
1412
1.82k
                  speex_notify("More than two wideband layers found. The stream is corrupted.");
1413
1.82k
                  return -2;
1414
1.82k
               }
1415
1416
2.24k
            }
1417
2.84k
         }
1418
54.8k
         if (speex_bits_remaining(bits)<4)
1419
410
            return -1;
1420
         /* FIXME: Check for overflow */
1421
54.4k
         m = speex_bits_unpack_unsigned(bits, 4);
1422
54.4k
         if (m==15) /* We found a terminator */
1423
795
         {
1424
795
            return -1;
1425
53.6k
         } else if (m==14) /* Speex in-band request */
1426
4.15k
         {
1427
4.15k
            int ret = speex_inband_handler(bits, st->speex_callbacks, state);
1428
4.15k
            if (ret)
1429
0
               return ret;
1430
49.5k
         } else if (m==13) /* User in-band request */
1431
704
         {
1432
704
            int ret = st->user_callback.func(bits, state, st->user_callback.data);
1433
704
            if (ret)
1434
0
               return ret;
1435
48.8k
         } else if (m>8) /* Invalid mode */
1436
3.21k
         {
1437
3.21k
            speex_notify("Invalid mode encountered. The stream is corrupted.");
1438
3.21k
            return -2;
1439
3.21k
         }
1440
1441
54.4k
      } while (m>8);
1442
1443
      /* Get the sub-mode that was used */
1444
45.6k
      st->submodeID = m;
1445
45.6k
      }
1446
1447
65.8k
   }
1448
1449
   /* Shift all buffers by one frame */
1450
45.6k
   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
45.6k
   if (st->submodes[st->submodeID] == NULL)
1454
21.8k
   {
1455
21.8k
      VARDECL(spx_coef_t *lpc);
1456
21.8k
      ALLOC(lpc, NB_ORDER, spx_coef_t);
1457
21.8k
      bw_lpc(QCONST16(0.93f,15), st->interp_qlpc, lpc, NB_ORDER);
1458
21.8k
      {
1459
21.8k
         spx_word16_t innov_gain=0;
1460
         /* FIXME: This was innov, not exc */
1461
21.8k
         innov_gain = compute_rms16(st->exc, NB_FRAME_SIZE);
1462
3.51M
         for (i=0;i<NB_FRAME_SIZE;i++)
1463
3.49M
            st->exc[i]=speex_rand(innov_gain, &st->seed);
1464
21.8k
      }
1465
1466
1467
21.8k
      st->first=1;
1468
1469
      /* Final signal synthesis from excitation */
1470
21.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
21.8k
      if (st->innov_save)
1475
18.2k
         SPEEX_MEMSET(st->innov_save, 0, NB_NB_SUBFRAMES*NB_SUBFRAME_SIZE);
1476
1477
21.8k
      st->count_lost=0;
1478
21.8k
      return 0;
1479
21.8k
   }
1480
1481
23.7k
   ALLOC(qlsp, NB_ORDER, spx_lsp_t);
1482
1483
   /* Unquantize LSPs */
1484
23.7k
   SUBMODE(lsp_unquant)(qlsp, NB_ORDER, bits);
1485
1486
   /*Damp memory if a frame was lost and the LSP changed too much*/
1487
23.7k
   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
23.7k
   if (st->first || st->count_lost)
1505
4.37k
   {
1506
48.1k
      for (i=0;i<NB_ORDER;i++)
1507
43.7k
         st->old_qlsp[i] = qlsp[i];
1508
4.37k
   }
1509
1510
   /* Get open-loop pitch estimation for low bit-rate pitch coding */
1511
23.7k
   if (SUBMODE(lbr_pitch)!=-1)
1512
9.54k
   {
1513
9.54k
      ol_pitch = NB_PITCH_START+speex_bits_unpack_unsigned(bits, 7);
1514
9.54k
   }
1515
1516
23.7k
   if (SUBMODE(forced_pitch_gain))
1517
7.84k
   {
1518
7.84k
      int quant;
1519
7.84k
      quant = speex_bits_unpack_unsigned(bits, 4);
1520
7.84k
      ol_pitch_coef=MULT16_16_P15(QCONST16(0.066667,15),SHL16(quant,GAIN_SHIFT));
1521
7.84k
   }
1522
1523
   /* Get global excitation gain */
1524
23.7k
   {
1525
23.7k
      int qe;
1526
23.7k
      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
12.9k
      ol_gain = MULT16_32_Q15(28406,ol_gain_table[qe]);
1530
#else
1531
10.7k
      ol_gain = SIG_SCALING*exp(qe/3.5);
1532
#endif
1533
23.7k
   }
1534
1535
23.7k
   ALLOC(ak, NB_ORDER, spx_coef_t);
1536
23.7k
   ALLOC(innov, NB_SUBFRAME_SIZE, spx_sig_t);
1537
23.7k
   ALLOC(exc32, NB_SUBFRAME_SIZE, spx_word32_t);
1538
1539
23.7k
   if (st->submodeID==1)
1540
4.02k
   {
1541
4.02k
      int extra;
1542
4.02k
      extra = speex_bits_unpack_unsigned(bits, 4);
1543
1544
4.02k
      if (extra==15)
1545
797
         st->dtx_enabled=1;
1546
3.23k
      else
1547
3.23k
         st->dtx_enabled=0;
1548
4.02k
   }
1549
23.7k
   if (st->submodeID>1)
1550
19.7k
      st->dtx_enabled=0;
1551
1552
   /*Loop on subframes */
1553
118k
   for (sub=0;sub<NB_NB_SUBFRAMES;sub++)
1554
95.0k
   {
1555
95.0k
      int offset;
1556
95.0k
      spx_word16_t *exc;
1557
95.0k
      spx_word16_t *innov_save = NULL;
1558
95.0k
      spx_word16_t tmp;
1559
1560
      /* Offset relative to start of frame */
1561
95.0k
      offset = NB_SUBFRAME_SIZE*sub;
1562
      /* Excitation */
1563
95.0k
      exc=st->exc+offset;
1564
      /* Original signal */
1565
95.0k
      if (st->innov_save)
1566
66.7k
         innov_save = st->innov_save+offset;
1567
1568
1569
      /* Reset excitation */
1570
95.0k
      SPEEX_MEMSET(exc, 0, NB_SUBFRAME_SIZE);
1571
1572
      /*Adaptive codebook contribution*/
1573
95.0k
      speex_assert (SUBMODE(ltp_unquant));
1574
95.0k
      {
1575
95.0k
         int pit_min, pit_max;
1576
         /* Handle pitch constraints if any */
1577
95.0k
         if (SUBMODE(lbr_pitch) != -1)
1578
38.1k
         {
1579
38.1k
            int margin;
1580
38.1k
            margin = SUBMODE(lbr_pitch);
1581
38.1k
            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
38.1k
            } else {
1598
38.1k
               pit_min = pit_max = ol_pitch;
1599
38.1k
            }
1600
56.8k
         } else {
1601
56.8k
            pit_min = NB_PITCH_START;
1602
56.8k
            pit_max = NB_PITCH_END;
1603
56.8k
         }
1604
1605
1606
1607
95.0k
         SUBMODE(ltp_unquant)(exc, exc32, pit_min, pit_max, ol_pitch_coef, SUBMODE(ltp_params),
1608
95.0k
                 NB_SUBFRAME_SIZE, &pitch, &pitch_gain[0], bits, stack,
1609
95.0k
                 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
95.0k
         sanitize_values32(exc32, NEG32(QCONST32(32000,SIG_SHIFT-1)), QCONST32(32000,SIG_SHIFT-1), NB_SUBFRAME_SIZE);
1615
1616
95.0k
         tmp = gain_3tap_to_1tap(pitch_gain);
1617
1618
95.0k
         pitch_average += tmp;
1619
95.0k
         if ((tmp>best_pitch_gain&&ABS(2*best_pitch-pitch)>=3&&ABS(3*best_pitch-pitch)>=4&&ABS(4*best_pitch-pitch)>=5)
1620
95.0k
              || (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
95.0k
              || (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
14.0k
         {
1623
14.0k
            best_pitch = pitch;
1624
14.0k
            if (tmp > best_pitch_gain)
1625
12.7k
               best_pitch_gain = tmp;
1626
14.0k
         }
1627
95.0k
      }
1628
1629
      /* Unquantize the innovation */
1630
95.0k
      {
1631
95.0k
         int q_energy;
1632
95.0k
         spx_word32_t ener;
1633
1634
95.0k
         SPEEX_MEMSET(innov, 0, NB_SUBFRAME_SIZE);
1635
1636
         /* Decode sub-frame gain correction */
1637
95.0k
         if (SUBMODE(have_subframe_gain)==3)
1638
18.5k
         {
1639
18.5k
            q_energy = speex_bits_unpack_unsigned(bits, 3);
1640
18.5k
            ener = MULT16_32_Q14(exc_gain_quant_scal3[q_energy],ol_gain);
1641
76.4k
         } else if (SUBMODE(have_subframe_gain)==1)
1642
38.3k
         {
1643
38.3k
            q_energy = speex_bits_unpack_unsigned(bits, 1);
1644
38.3k
            ener = MULT16_32_Q14(exc_gain_quant_scal1[q_energy],ol_gain);
1645
38.3k
         } else {
1646
38.1k
            ener = ol_gain;
1647
38.1k
         }
1648
1649
95.0k
         speex_assert (SUBMODE(innovation_unquant));
1650
95.0k
         {
1651
            /*Fixed codebook contribution*/
1652
95.0k
            SUBMODE(innovation_unquant)(innov, SUBMODE(innovation_params), NB_SUBFRAME_SIZE, bits, stack, &st->seed);
1653
            /* De-normalize innovation and update excitation */
1654
1655
95.0k
            signal_mul(innov, innov, ener, NB_SUBFRAME_SIZE);
1656
1657
            /* Decode second codebook (only for some modes) */
1658
95.0k
            if (SUBMODE(double_codebook))
1659
5.73k
            {
1660
5.73k
               char *tmp_stack=stack;
1661
5.73k
               VARDECL(spx_sig_t *innov2);
1662
5.73k
               ALLOC(innov2, NB_SUBFRAME_SIZE, spx_sig_t);
1663
5.73k
               SPEEX_MEMSET(innov2, 0, NB_SUBFRAME_SIZE);
1664
5.73k
               SUBMODE(innovation_unquant)(innov2, SUBMODE(innovation_params), NB_SUBFRAME_SIZE, bits, stack, &st->seed);
1665
5.73k
               signal_mul(innov2, innov2, MULT16_32_Q15(QCONST16(0.454545f,15),ener), NB_SUBFRAME_SIZE);
1666
235k
               for (i=0;i<NB_SUBFRAME_SIZE;i++)
1667
229k
                  innov[i] = ADD32(innov[i], innov2[i]);
1668
5.73k
               stack = tmp_stack;
1669
5.73k
            }
1670
3.89M
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
1671
3.80M
               exc[i]=EXTRACT16(SATURATE32(PSHR32(ADD32(SHL32(exc32[i],1),innov[i]),SIG_SHIFT),32767));
1672
            /*print_vec(exc, 40, "innov");*/
1673
95.0k
            if (innov_save)
1674
66.7k
            {
1675
2.73M
               for (i=0;i<NB_SUBFRAME_SIZE;i++)
1676
2.67M
                  innov_save[i] = EXTRACT16(PSHR32(innov[i], SIG_SHIFT));
1677
66.7k
            }
1678
95.0k
         }
1679
1680
         /*Vocoder mode*/
1681
95.0k
         if (st->submodeID==1)
1682
16.1k
         {
1683
16.1k
            spx_word16_t g=ol_pitch_coef;
1684
16.1k
            g=MULT16_16_P14(QCONST16(1.5f,14),(g-QCONST16(.2f,6)));
1685
16.1k
            if (g<0)
1686
9.62k
               g=0;
1687
16.1k
            if (g>GAIN_SCALING)
1688
1.95k
               g=GAIN_SCALING;
1689
1690
16.1k
            SPEEX_MEMSET(exc, 0, NB_SUBFRAME_SIZE);
1691
38.8k
            while (st->voc_offset<NB_SUBFRAME_SIZE)
1692
22.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
22.7k
               if (st->voc_offset>=0)
1696
22.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
22.7k
               st->voc_offset+=ol_pitch;
1698
22.7k
            }
1699
16.1k
            st->voc_offset -= NB_SUBFRAME_SIZE;
1700
1701
660k
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
1702
644k
            {
1703
644k
               spx_word16_t exci=exc[i];
1704
644k
               exc[i]= ADD16(ADD16(MULT16_16_Q15(QCONST16(.7f,15),exc[i]) , MULT16_16_Q15(QCONST16(.3f,15),st->voc_m1)),
1705
644k
                             SUB16(MULT16_16_Q15(Q15_ONE-MULT16_16_16(QCONST16(.85f,9),g),EXTRACT16(PSHR32(innov[i],SIG_SHIFT))),
1706
644k
                                   MULT16_16_Q15(MULT16_16_16(QCONST16(.15f,9),g),EXTRACT16(PSHR32(st->voc_m2,SIG_SHIFT)))
1707
644k
                                  ));
1708
644k
               st->voc_m1 = exci;
1709
644k
               st->voc_m2=innov[i];
1710
644k
               st->voc_mean = EXTRACT16(PSHR32(ADD32(MULT16_16(QCONST16(.8f,15),st->voc_mean), MULT16_16(QCONST16(.2f,15),exc[i])), 15));
1711
644k
               exc[i]-=st->voc_mean;
1712
644k
            }
1713
16.1k
         }
1714
1715
95.0k
      }
1716
95.0k
   }
1717
1718
23.7k
   ALLOC(interp_qlsp, NB_ORDER, spx_lsp_t);
1719
1720
23.7k
   if (st->lpc_enh_enabled && SUBMODE(comb_gain)>0 && !st->count_lost)
1721
19.7k
   {
1722
19.7k
      multicomb(st->exc-NB_SUBFRAME_SIZE, out, st->interp_qlpc, NB_ORDER, 2*NB_SUBFRAME_SIZE, best_pitch, 40, SUBMODE(comb_gain), stack);
1723
19.7k
      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
19.7k
   } else {
1725
4.02k
      SPEEX_COPY(out, &st->exc[-NB_SUBFRAME_SIZE], NB_FRAME_SIZE);
1726
4.02k
   }
1727
1728
   /* If the last packet was lost, re-scale the excitation to obtain the same energy as encoded in ol_gain */
1729
23.7k
   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
118k
   for (sub=0;sub<NB_NB_SUBFRAMES;sub++)
1754
95.0k
   {
1755
95.0k
      int offset;
1756
95.0k
      spx_word16_t *sp;
1757
1758
      /* Offset relative to start of frame */
1759
95.0k
      offset = NB_SUBFRAME_SIZE*sub;
1760
      /* Original signal */
1761
95.0k
      sp=out+offset;
1762
1763
      /* LSP interpolation (quantized and unquantized) */
1764
95.0k
      lsp_interpolate(st->old_qlsp, qlsp, interp_qlsp, NB_ORDER, sub, NB_NB_SUBFRAMES, LSP_MARGIN);
1765
1766
      /* Compute interpolated LPCs (unquantized) */
1767
95.0k
      lsp_to_lpc(interp_qlsp, ak, NB_ORDER, stack);
1768
1769
      /* Compute analysis filter at w=pi */
1770
95.0k
      {
1771
95.0k
         spx_word32_t pi_g=LPC_SCALING;
1772
570k
         for (i=0;i<NB_ORDER;i+=2)
1773
475k
         {
1774
            /*pi_g += -st->interp_qlpc[i] +  st->interp_qlpc[i+1];*/
1775
475k
            pi_g = ADD32(pi_g, SUB32(EXTEND32(ak[i+1]),EXTEND32(ak[i])));
1776
475k
         }
1777
95.0k
         st->pi_gain[sub] = pi_g;
1778
95.0k
      }
1779
1780
95.0k
      iir_mem16(sp, st->interp_qlpc, sp, NB_SUBFRAME_SIZE, NB_ORDER,
1781
95.0k
                st->mem_sp, stack);
1782
1783
1.04M
      for (i=0;i<NB_ORDER;i++)
1784
950k
         st->interp_qlpc[i] = ak[i];
1785
1786
95.0k
   }
1787
1788
23.7k
   if (st->highpass_enabled)
1789
23.7k
      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
23.7k
   st->level = 1+PSHR32(ol_gain,SIG_SHIFT);
1795
23.7k
   st->max_level = MAX16(MULT16_16_Q15(QCONST16(.99f,15), st->max_level), st->level);
1796
23.7k
   st->min_level = MIN16(ADD16(1,MULT16_16_Q14(QCONST16(1.01f,14), st->min_level)), st->level);
1797
23.7k
   if (st->max_level < st->min_level+1)
1798
8.00k
      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
261k
   for (i=0;i<NB_ORDER;i++)
1803
237k
      st->old_qlsp[i] = qlsp[i];
1804
1805
   /* The next frame will not be the first (Duh!) */
1806
23.7k
   st->first = 0;
1807
23.7k
   st->count_lost=0;
1808
23.7k
   st->last_pitch = best_pitch;
1809
#ifdef FIXED_POINT
1810
12.9k
   st->last_pitch_gain = PSHR16(pitch_average,2);
1811
#else
1812
   st->last_pitch_gain = .25*pitch_average;
1813
#endif
1814
23.7k
   st->pitch_gain_buf[st->pitch_gain_buf_idx++] = st->last_pitch_gain;
1815
23.7k
   if (st->pitch_gain_buf_idx > 2) /* rollover */
1816
7.11k
      st->pitch_gain_buf_idx = 0;
1817
1818
23.7k
   st->last_ol_gain = ol_gain;
1819
1820
23.7k
   return 0;
1821
45.6k
}
nb_decode
Line
Count
Source
1331
32.6k
{
1332
32.6k
   DecState *st;
1333
32.6k
   int i, sub;
1334
32.6k
   int pitch;
1335
32.6k
   spx_word16_t pitch_gain[3];
1336
32.6k
   spx_word32_t ol_gain=0;
1337
32.6k
   int ol_pitch=0;
1338
32.6k
   spx_word16_t ol_pitch_coef=0;
1339
32.6k
   int best_pitch=40;
1340
32.6k
   spx_word16_t best_pitch_gain=0;
1341
32.6k
   int wideband;
1342
32.6k
   int m;
1343
32.6k
   char *stack;
1344
32.6k
   VARDECL(spx_sig_t *innov);
1345
32.6k
   VARDECL(spx_word32_t *exc32);
1346
32.6k
   VARDECL(spx_coef_t *ak);
1347
32.6k
   VARDECL(spx_lsp_t *qlsp);
1348
32.6k
   spx_word16_t pitch_average=0;
1349
1350
32.6k
   spx_word16_t *out = (spx_word16_t*)vout;
1351
32.6k
   VARDECL(spx_lsp_t *interp_qlsp);
1352
1353
32.6k
   st=(DecState*)state;
1354
32.6k
   stack=st->stack;
1355
1356
32.6k
   st->exc = st->excBuf + 2*NB_PITCH_END + NB_SUBFRAME_SIZE + 6;
1357
1358
   /* Check if we're in DTX mode*/
1359
32.6k
   if (!bits && st->dtx_enabled)
1360
0
   {
1361
0
      st->submodeID=0;
1362
0
   } else
1363
32.6k
   {
1364
      /* If bits is NULL, consider the packet to be lost (what could we do anyway) */
1365
32.6k
      if (!bits)
1366
0
      {
1367
0
         nb_decode_lost(st, out, stack);
1368
0
         return 0;
1369
0
      }
1370
1371
32.6k
      if (st->encode_submode)
1372
32.6k
      {
1373
1374
      /* Search for next narrowband block (handle requests, skip wideband blocks) */
1375
35.0k
      do {
1376
35.0k
         if (speex_bits_remaining(bits)<5)
1377
7.89k
            return -1;
1378
27.1k
         wideband = speex_bits_unpack_unsigned(bits, 1);
1379
27.1k
         if (wideband) /* Skip wideband block (for compatibility) */
1380
1.74k
         {
1381
1.74k
            int submode;
1382
1.74k
            int advance;
1383
1.74k
            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.74k
            advance = wb_skip_table[submode];
1386
1.74k
            if (advance < 0)
1387
0
            {
1388
0
               speex_notify("Invalid mode encountered. The stream is corrupted.");
1389
0
               return -2;
1390
0
            }
1391
1.74k
            advance -= (SB_SUBMODE_BITS+1);
1392
1.74k
            speex_bits_advance(bits, advance);
1393
1394
1.74k
            if (speex_bits_remaining(bits)<5)
1395
372
               return -1;
1396
1.37k
            wideband = speex_bits_unpack_unsigned(bits, 1);
1397
1.37k
            if (wideband)
1398
1.06k
            {
1399
1.06k
               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.06k
               advance = wb_skip_table[submode];
1402
1.06k
               if (advance < 0)
1403
0
               {
1404
0
                  speex_notify("Invalid mode encountered. The stream is corrupted.");
1405
0
                  return -2;
1406
0
               }
1407
1.06k
               advance -= (SB_SUBMODE_BITS+1);
1408
1.06k
               speex_bits_advance(bits, advance);
1409
1.06k
               wideband = speex_bits_unpack_unsigned(bits, 1);
1410
1.06k
               if (wideband)
1411
854
               {
1412
854
                  speex_notify("More than two wideband layers found. The stream is corrupted.");
1413
854
                  return -2;
1414
854
               }
1415
1416
1.06k
            }
1417
1.37k
         }
1418
25.8k
         if (speex_bits_remaining(bits)<4)
1419
207
            return -1;
1420
         /* FIXME: Check for overflow */
1421
25.6k
         m = speex_bits_unpack_unsigned(bits, 4);
1422
25.6k
         if (m==15) /* We found a terminator */
1423
297
         {
1424
297
            return -1;
1425
25.3k
         } else if (m==14) /* Speex in-band request */
1426
1.95k
         {
1427
1.95k
            int ret = speex_inband_handler(bits, st->speex_callbacks, state);
1428
1.95k
            if (ret)
1429
0
               return ret;
1430
23.4k
         } else if (m==13) /* User in-band request */
1431
452
         {
1432
452
            int ret = st->user_callback.func(bits, state, st->user_callback.data);
1433
452
            if (ret)
1434
0
               return ret;
1435
22.9k
         } else if (m>8) /* Invalid mode */
1436
1.60k
         {
1437
1.60k
            speex_notify("Invalid mode encountered. The stream is corrupted.");
1438
1.60k
            return -2;
1439
1.60k
         }
1440
1441
25.6k
      } while (m>8);
1442
1443
      /* Get the sub-mode that was used */
1444
21.3k
      st->submodeID = m;
1445
21.3k
      }
1446
1447
32.6k
   }
1448
1449
   /* Shift all buffers by one frame */
1450
21.3k
   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
21.3k
   if (st->submodes[st->submodeID] == NULL)
1454
10.5k
   {
1455
10.5k
      VARDECL(spx_coef_t *lpc);
1456
10.5k
      ALLOC(lpc, NB_ORDER, spx_coef_t);
1457
10.5k
      bw_lpc(QCONST16(0.93f,15), st->interp_qlpc, lpc, NB_ORDER);
1458
10.5k
      {
1459
10.5k
         spx_word16_t innov_gain=0;
1460
         /* FIXME: This was innov, not exc */
1461
10.5k
         innov_gain = compute_rms16(st->exc, NB_FRAME_SIZE);
1462
1.70M
         for (i=0;i<NB_FRAME_SIZE;i++)
1463
1.69M
            st->exc[i]=speex_rand(innov_gain, &st->seed);
1464
10.5k
      }
1465
1466
1467
10.5k
      st->first=1;
1468
1469
      /* Final signal synthesis from excitation */
1470
10.5k
      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
10.5k
      if (st->innov_save)
1475
8.95k
         SPEEX_MEMSET(st->innov_save, 0, NB_NB_SUBFRAMES*NB_SUBFRAME_SIZE);
1476
1477
10.5k
      st->count_lost=0;
1478
10.5k
      return 0;
1479
10.5k
   }
1480
1481
10.7k
   ALLOC(qlsp, NB_ORDER, spx_lsp_t);
1482
1483
   /* Unquantize LSPs */
1484
10.7k
   SUBMODE(lsp_unquant)(qlsp, NB_ORDER, bits);
1485
1486
   /*Damp memory if a frame was lost and the LSP changed too much*/
1487
10.7k
   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
10.7k
   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
10.7k
   if (SUBMODE(lbr_pitch)!=-1)
1512
4.63k
   {
1513
4.63k
      ol_pitch = NB_PITCH_START+speex_bits_unpack_unsigned(bits, 7);
1514
4.63k
   }
1515
1516
10.7k
   if (SUBMODE(forced_pitch_gain))
1517
4.06k
   {
1518
4.06k
      int quant;
1519
4.06k
      quant = speex_bits_unpack_unsigned(bits, 4);
1520
4.06k
      ol_pitch_coef=MULT16_16_P15(QCONST16(0.066667,15),SHL16(quant,GAIN_SHIFT));
1521
4.06k
   }
1522
1523
   /* Get global excitation gain */
1524
10.7k
   {
1525
10.7k
      int qe;
1526
10.7k
      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
10.7k
      ol_gain = SIG_SCALING*exp(qe/3.5);
1532
10.7k
#endif
1533
10.7k
   }
1534
1535
10.7k
   ALLOC(ak, NB_ORDER, spx_coef_t);
1536
10.7k
   ALLOC(innov, NB_SUBFRAME_SIZE, spx_sig_t);
1537
10.7k
   ALLOC(exc32, NB_SUBFRAME_SIZE, spx_word32_t);
1538
1539
10.7k
   if (st->submodeID==1)
1540
2.02k
   {
1541
2.02k
      int extra;
1542
2.02k
      extra = speex_bits_unpack_unsigned(bits, 4);
1543
1544
2.02k
      if (extra==15)
1545
247
         st->dtx_enabled=1;
1546
1.77k
      else
1547
1.77k
         st->dtx_enabled=0;
1548
2.02k
   }
1549
10.7k
   if (st->submodeID>1)
1550
8.77k
      st->dtx_enabled=0;
1551
1552
   /*Loop on subframes */
1553
53.9k
   for (sub=0;sub<NB_NB_SUBFRAMES;sub++)
1554
43.1k
   {
1555
43.1k
      int offset;
1556
43.1k
      spx_word16_t *exc;
1557
43.1k
      spx_word16_t *innov_save = NULL;
1558
43.1k
      spx_word16_t tmp;
1559
1560
      /* Offset relative to start of frame */
1561
43.1k
      offset = NB_SUBFRAME_SIZE*sub;
1562
      /* Excitation */
1563
43.1k
      exc=st->exc+offset;
1564
      /* Original signal */
1565
43.1k
      if (st->innov_save)
1566
30.2k
         innov_save = st->innov_save+offset;
1567
1568
1569
      /* Reset excitation */
1570
43.1k
      SPEEX_MEMSET(exc, 0, NB_SUBFRAME_SIZE);
1571
1572
      /*Adaptive codebook contribution*/
1573
43.1k
      speex_assert (SUBMODE(ltp_unquant));
1574
43.1k
      {
1575
43.1k
         int pit_min, pit_max;
1576
         /* Handle pitch constraints if any */
1577
43.1k
         if (SUBMODE(lbr_pitch) != -1)
1578
18.5k
         {
1579
18.5k
            int margin;
1580
18.5k
            margin = SUBMODE(lbr_pitch);
1581
18.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
18.5k
            } else {
1598
18.5k
               pit_min = pit_max = ol_pitch;
1599
18.5k
            }
1600
24.6k
         } else {
1601
24.6k
            pit_min = NB_PITCH_START;
1602
24.6k
            pit_max = NB_PITCH_END;
1603
24.6k
         }
1604
1605
1606
1607
43.1k
         SUBMODE(ltp_unquant)(exc, exc32, pit_min, pit_max, ol_pitch_coef, SUBMODE(ltp_params),
1608
43.1k
                 NB_SUBFRAME_SIZE, &pitch, &pitch_gain[0], bits, stack,
1609
43.1k
                 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
43.1k
         sanitize_values32(exc32, NEG32(QCONST32(32000,SIG_SHIFT-1)), QCONST32(32000,SIG_SHIFT-1), NB_SUBFRAME_SIZE);
1615
1616
43.1k
         tmp = gain_3tap_to_1tap(pitch_gain);
1617
1618
43.1k
         pitch_average += tmp;
1619
43.1k
         if ((tmp>best_pitch_gain&&ABS(2*best_pitch-pitch)>=3&&ABS(3*best_pitch-pitch)>=4&&ABS(4*best_pitch-pitch)>=5)
1620
43.1k
              || (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
43.1k
              || (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
5.88k
         {
1623
5.88k
            best_pitch = pitch;
1624
5.88k
            if (tmp > best_pitch_gain)
1625
5.08k
               best_pitch_gain = tmp;
1626
5.88k
         }
1627
43.1k
      }
1628
1629
      /* Unquantize the innovation */
1630
43.1k
      {
1631
43.1k
         int q_energy;
1632
43.1k
         spx_word32_t ener;
1633
1634
43.1k
         SPEEX_MEMSET(innov, 0, NB_SUBFRAME_SIZE);
1635
1636
         /* Decode sub-frame gain correction */
1637
43.1k
         if (SUBMODE(have_subframe_gain)==3)
1638
9.43k
         {
1639
9.43k
            q_energy = speex_bits_unpack_unsigned(bits, 3);
1640
9.43k
            ener = MULT16_32_Q14(exc_gain_quant_scal3[q_energy],ol_gain);
1641
33.7k
         } else if (SUBMODE(have_subframe_gain)==1)
1642
15.2k
         {
1643
15.2k
            q_energy = speex_bits_unpack_unsigned(bits, 1);
1644
15.2k
            ener = MULT16_32_Q14(exc_gain_quant_scal1[q_energy],ol_gain);
1645
18.5k
         } else {
1646
18.5k
            ener = ol_gain;
1647
18.5k
         }
1648
1649
43.1k
         speex_assert (SUBMODE(innovation_unquant));
1650
43.1k
         {
1651
            /*Fixed codebook contribution*/
1652
43.1k
            SUBMODE(innovation_unquant)(innov, SUBMODE(innovation_params), NB_SUBFRAME_SIZE, bits, stack, &st->seed);
1653
            /* De-normalize innovation and update excitation */
1654
1655
43.1k
            signal_mul(innov, innov, ener, NB_SUBFRAME_SIZE);
1656
1657
            /* Decode second codebook (only for some modes) */
1658
43.1k
            if (SUBMODE(double_codebook))
1659
2.35k
            {
1660
2.35k
               char *tmp_stack=stack;
1661
2.35k
               VARDECL(spx_sig_t *innov2);
1662
2.35k
               ALLOC(innov2, NB_SUBFRAME_SIZE, spx_sig_t);
1663
2.35k
               SPEEX_MEMSET(innov2, 0, NB_SUBFRAME_SIZE);
1664
2.35k
               SUBMODE(innovation_unquant)(innov2, SUBMODE(innovation_params), NB_SUBFRAME_SIZE, bits, stack, &st->seed);
1665
2.35k
               signal_mul(innov2, innov2, MULT16_32_Q15(QCONST16(0.454545f,15),ener), NB_SUBFRAME_SIZE);
1666
96.4k
               for (i=0;i<NB_SUBFRAME_SIZE;i++)
1667
94.0k
                  innov[i] = ADD32(innov[i], innov2[i]);
1668
2.35k
               stack = tmp_stack;
1669
2.35k
            }
1670
1.77M
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
1671
1.72M
               exc[i]=EXTRACT16(SATURATE32(PSHR32(ADD32(SHL32(exc32[i],1),innov[i]),SIG_SHIFT),32767));
1672
            /*print_vec(exc, 40, "innov");*/
1673
43.1k
            if (innov_save)
1674
30.2k
            {
1675
1.23M
               for (i=0;i<NB_SUBFRAME_SIZE;i++)
1676
1.20M
                  innov_save[i] = EXTRACT16(PSHR32(innov[i], SIG_SHIFT));
1677
30.2k
            }
1678
43.1k
         }
1679
1680
         /*Vocoder mode*/
1681
43.1k
         if (st->submodeID==1)
1682
8.08k
         {
1683
8.08k
            spx_word16_t g=ol_pitch_coef;
1684
8.08k
            g=MULT16_16_P14(QCONST16(1.5f,14),(g-QCONST16(.2f,6)));
1685
8.08k
            if (g<0)
1686
6.13k
               g=0;
1687
8.08k
            if (g>GAIN_SCALING)
1688
700
               g=GAIN_SCALING;
1689
1690
8.08k
            SPEEX_MEMSET(exc, 0, NB_SUBFRAME_SIZE);
1691
22.3k
            while (st->voc_offset<NB_SUBFRAME_SIZE)
1692
14.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
14.2k
               if (st->voc_offset>=0)
1696
14.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
14.2k
               st->voc_offset+=ol_pitch;
1698
14.2k
            }
1699
8.08k
            st->voc_offset -= NB_SUBFRAME_SIZE;
1700
1701
331k
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
1702
323k
            {
1703
323k
               spx_word16_t exci=exc[i];
1704
323k
               exc[i]= ADD16(ADD16(MULT16_16_Q15(QCONST16(.7f,15),exc[i]) , MULT16_16_Q15(QCONST16(.3f,15),st->voc_m1)),
1705
323k
                             SUB16(MULT16_16_Q15(Q15_ONE-MULT16_16_16(QCONST16(.85f,9),g),EXTRACT16(PSHR32(innov[i],SIG_SHIFT))),
1706
323k
                                   MULT16_16_Q15(MULT16_16_16(QCONST16(.15f,9),g),EXTRACT16(PSHR32(st->voc_m2,SIG_SHIFT)))
1707
323k
                                  ));
1708
323k
               st->voc_m1 = exci;
1709
323k
               st->voc_m2=innov[i];
1710
323k
               st->voc_mean = EXTRACT16(PSHR32(ADD32(MULT16_16(QCONST16(.8f,15),st->voc_mean), MULT16_16(QCONST16(.2f,15),exc[i])), 15));
1711
323k
               exc[i]-=st->voc_mean;
1712
323k
            }
1713
8.08k
         }
1714
1715
43.1k
      }
1716
43.1k
   }
1717
1718
10.7k
   ALLOC(interp_qlsp, NB_ORDER, spx_lsp_t);
1719
1720
10.7k
   if (st->lpc_enh_enabled && SUBMODE(comb_gain)>0 && !st->count_lost)
1721
8.77k
   {
1722
8.77k
      multicomb(st->exc-NB_SUBFRAME_SIZE, out, st->interp_qlpc, NB_ORDER, 2*NB_SUBFRAME_SIZE, best_pitch, 40, SUBMODE(comb_gain), stack);
1723
8.77k
      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
8.77k
   } else {
1725
2.02k
      SPEEX_COPY(out, &st->exc[-NB_SUBFRAME_SIZE], NB_FRAME_SIZE);
1726
2.02k
   }
1727
1728
   /* If the last packet was lost, re-scale the excitation to obtain the same energy as encoded in ol_gain */
1729
10.7k
   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
53.9k
   for (sub=0;sub<NB_NB_SUBFRAMES;sub++)
1754
43.1k
   {
1755
43.1k
      int offset;
1756
43.1k
      spx_word16_t *sp;
1757
1758
      /* Offset relative to start of frame */
1759
43.1k
      offset = NB_SUBFRAME_SIZE*sub;
1760
      /* Original signal */
1761
43.1k
      sp=out+offset;
1762
1763
      /* LSP interpolation (quantized and unquantized) */
1764
43.1k
      lsp_interpolate(st->old_qlsp, qlsp, interp_qlsp, NB_ORDER, sub, NB_NB_SUBFRAMES, LSP_MARGIN);
1765
1766
      /* Compute interpolated LPCs (unquantized) */
1767
43.1k
      lsp_to_lpc(interp_qlsp, ak, NB_ORDER, stack);
1768
1769
      /* Compute analysis filter at w=pi */
1770
43.1k
      {
1771
43.1k
         spx_word32_t pi_g=LPC_SCALING;
1772
259k
         for (i=0;i<NB_ORDER;i+=2)
1773
215k
         {
1774
            /*pi_g += -st->interp_qlpc[i] +  st->interp_qlpc[i+1];*/
1775
215k
            pi_g = ADD32(pi_g, SUB32(EXTEND32(ak[i+1]),EXTEND32(ak[i])));
1776
215k
         }
1777
43.1k
         st->pi_gain[sub] = pi_g;
1778
43.1k
      }
1779
1780
43.1k
      iir_mem16(sp, st->interp_qlpc, sp, NB_SUBFRAME_SIZE, NB_ORDER,
1781
43.1k
                st->mem_sp, stack);
1782
1783
475k
      for (i=0;i<NB_ORDER;i++)
1784
431k
         st->interp_qlpc[i] = ak[i];
1785
1786
43.1k
   }
1787
1788
10.7k
   if (st->highpass_enabled)
1789
10.7k
      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
10.7k
   st->level = 1+PSHR32(ol_gain,SIG_SHIFT);
1795
10.7k
   st->max_level = MAX16(MULT16_16_Q15(QCONST16(.99f,15), st->max_level), st->level);
1796
10.7k
   st->min_level = MIN16(ADD16(1,MULT16_16_Q14(QCONST16(1.01f,14), st->min_level)), st->level);
1797
10.7k
   if (st->max_level < st->min_level+1)
1798
3.47k
      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
118k
   for (i=0;i<NB_ORDER;i++)
1803
107k
      st->old_qlsp[i] = qlsp[i];
1804
1805
   /* The next frame will not be the first (Duh!) */
1806
10.7k
   st->first = 0;
1807
10.7k
   st->count_lost=0;
1808
10.7k
   st->last_pitch = best_pitch;
1809
#ifdef FIXED_POINT
1810
   st->last_pitch_gain = PSHR16(pitch_average,2);
1811
#else
1812
10.7k
   st->last_pitch_gain = .25*pitch_average;
1813
10.7k
#endif
1814
10.7k
   st->pitch_gain_buf[st->pitch_gain_buf_idx++] = st->last_pitch_gain;
1815
10.7k
   if (st->pitch_gain_buf_idx > 2) /* rollover */
1816
3.35k
      st->pitch_gain_buf_idx = 0;
1817
1818
10.7k
   st->last_ol_gain = ol_gain;
1819
1820
10.7k
   return 0;
1821
21.3k
}
nb_decode
Line
Count
Source
1331
33.2k
{
1332
33.2k
   DecState *st;
1333
33.2k
   int i, sub;
1334
33.2k
   int pitch;
1335
33.2k
   spx_word16_t pitch_gain[3];
1336
33.2k
   spx_word32_t ol_gain=0;
1337
33.2k
   int ol_pitch=0;
1338
33.2k
   spx_word16_t ol_pitch_coef=0;
1339
33.2k
   int best_pitch=40;
1340
33.2k
   spx_word16_t best_pitch_gain=0;
1341
33.2k
   int wideband;
1342
33.2k
   int m;
1343
33.2k
   char *stack;
1344
33.2k
   VARDECL(spx_sig_t *innov);
1345
33.2k
   VARDECL(spx_word32_t *exc32);
1346
33.2k
   VARDECL(spx_coef_t *ak);
1347
33.2k
   VARDECL(spx_lsp_t *qlsp);
1348
33.2k
   spx_word16_t pitch_average=0;
1349
1350
33.2k
   spx_word16_t *out = (spx_word16_t*)vout;
1351
33.2k
   VARDECL(spx_lsp_t *interp_qlsp);
1352
1353
33.2k
   st=(DecState*)state;
1354
33.2k
   stack=st->stack;
1355
1356
33.2k
   st->exc = st->excBuf + 2*NB_PITCH_END + NB_SUBFRAME_SIZE + 6;
1357
1358
   /* Check if we're in DTX mode*/
1359
33.2k
   if (!bits && st->dtx_enabled)
1360
0
   {
1361
0
      st->submodeID=0;
1362
0
   } else
1363
33.2k
   {
1364
      /* If bits is NULL, consider the packet to be lost (what could we do anyway) */
1365
33.2k
      if (!bits)
1366
0
      {
1367
0
         nb_decode_lost(st, out, stack);
1368
0
         return 0;
1369
0
      }
1370
1371
33.2k
      if (st->encode_submode)
1372
33.2k
      {
1373
1374
      /* Search for next narrowband block (handle requests, skip wideband blocks) */
1375
35.7k
      do {
1376
35.7k
         if (speex_bits_remaining(bits)<5)
1377
5.23k
            return -1;
1378
30.5k
         wideband = speex_bits_unpack_unsigned(bits, 1);
1379
30.5k
         if (wideband) /* Skip wideband block (for compatibility) */
1380
2.02k
         {
1381
2.02k
            int submode;
1382
2.02k
            int advance;
1383
2.02k
            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.02k
            advance = wb_skip_table[submode];
1386
2.02k
            if (advance < 0)
1387
0
            {
1388
0
               speex_notify("Invalid mode encountered. The stream is corrupted.");
1389
0
               return -2;
1390
0
            }
1391
2.02k
            advance -= (SB_SUBMODE_BITS+1);
1392
2.02k
            speex_bits_advance(bits, advance);
1393
1394
2.02k
            if (speex_bits_remaining(bits)<5)
1395
549
               return -1;
1396
1.47k
            wideband = speex_bits_unpack_unsigned(bits, 1);
1397
1.47k
            if (wideband)
1398
1.18k
            {
1399
1.18k
               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.18k
               advance = wb_skip_table[submode];
1402
1.18k
               if (advance < 0)
1403
0
               {
1404
0
                  speex_notify("Invalid mode encountered. The stream is corrupted.");
1405
0
                  return -2;
1406
0
               }
1407
1.18k
               advance -= (SB_SUBMODE_BITS+1);
1408
1.18k
               speex_bits_advance(bits, advance);
1409
1.18k
               wideband = speex_bits_unpack_unsigned(bits, 1);
1410
1.18k
               if (wideband)
1411
974
               {
1412
974
                  speex_notify("More than two wideband layers found. The stream is corrupted.");
1413
974
                  return -2;
1414
974
               }
1415
1416
1.18k
            }
1417
1.47k
         }
1418
28.9k
         if (speex_bits_remaining(bits)<4)
1419
203
            return -1;
1420
         /* FIXME: Check for overflow */
1421
28.7k
         m = speex_bits_unpack_unsigned(bits, 4);
1422
28.7k
         if (m==15) /* We found a terminator */
1423
498
         {
1424
498
            return -1;
1425
28.2k
         } else if (m==14) /* Speex in-band request */
1426
2.20k
         {
1427
2.20k
            int ret = speex_inband_handler(bits, st->speex_callbacks, state);
1428
2.20k
            if (ret)
1429
0
               return ret;
1430
26.0k
         } else if (m==13) /* User in-band request */
1431
252
         {
1432
252
            int ret = st->user_callback.func(bits, state, st->user_callback.data);
1433
252
            if (ret)
1434
0
               return ret;
1435
25.8k
         } else if (m>8) /* Invalid mode */
1436
1.60k
         {
1437
1.60k
            speex_notify("Invalid mode encountered. The stream is corrupted.");
1438
1.60k
            return -2;
1439
1.60k
         }
1440
1441
28.7k
      } while (m>8);
1442
1443
      /* Get the sub-mode that was used */
1444
24.2k
      st->submodeID = m;
1445
24.2k
      }
1446
1447
33.2k
   }
1448
1449
   /* Shift all buffers by one frame */
1450
24.2k
   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
24.2k
   if (st->submodes[st->submodeID] == NULL)
1454
11.2k
   {
1455
11.2k
      VARDECL(spx_coef_t *lpc);
1456
11.2k
      ALLOC(lpc, NB_ORDER, spx_coef_t);
1457
11.2k
      bw_lpc(QCONST16(0.93f,15), st->interp_qlpc, lpc, NB_ORDER);
1458
11.2k
      {
1459
11.2k
         spx_word16_t innov_gain=0;
1460
         /* FIXME: This was innov, not exc */
1461
11.2k
         innov_gain = compute_rms16(st->exc, NB_FRAME_SIZE);
1462
1.81M
         for (i=0;i<NB_FRAME_SIZE;i++)
1463
1.80M
            st->exc[i]=speex_rand(innov_gain, &st->seed);
1464
11.2k
      }
1465
1466
1467
11.2k
      st->first=1;
1468
1469
      /* Final signal synthesis from excitation */
1470
11.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
11.2k
      if (st->innov_save)
1475
9.27k
         SPEEX_MEMSET(st->innov_save, 0, NB_NB_SUBFRAMES*NB_SUBFRAME_SIZE);
1476
1477
11.2k
      st->count_lost=0;
1478
11.2k
      return 0;
1479
11.2k
   }
1480
1481
12.9k
   ALLOC(qlsp, NB_ORDER, spx_lsp_t);
1482
1483
   /* Unquantize LSPs */
1484
12.9k
   SUBMODE(lsp_unquant)(qlsp, NB_ORDER, bits);
1485
1486
   /*Damp memory if a frame was lost and the LSP changed too much*/
1487
12.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
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
12.9k
   if (st->first || st->count_lost)
1505
2.46k
   {
1506
27.0k
      for (i=0;i<NB_ORDER;i++)
1507
24.6k
         st->old_qlsp[i] = qlsp[i];
1508
2.46k
   }
1509
1510
   /* Get open-loop pitch estimation for low bit-rate pitch coding */
1511
12.9k
   if (SUBMODE(lbr_pitch)!=-1)
1512
4.91k
   {
1513
4.91k
      ol_pitch = NB_PITCH_START+speex_bits_unpack_unsigned(bits, 7);
1514
4.91k
   }
1515
1516
12.9k
   if (SUBMODE(forced_pitch_gain))
1517
3.78k
   {
1518
3.78k
      int quant;
1519
3.78k
      quant = speex_bits_unpack_unsigned(bits, 4);
1520
3.78k
      ol_pitch_coef=MULT16_16_P15(QCONST16(0.066667,15),SHL16(quant,GAIN_SHIFT));
1521
3.78k
   }
1522
1523
   /* Get global excitation gain */
1524
12.9k
   {
1525
12.9k
      int qe;
1526
12.9k
      qe = speex_bits_unpack_unsigned(bits, 5);
1527
12.9k
#ifdef FIXED_POINT
1528
      /* FIXME: Perhaps we could slightly lower the gain here when the output is going to saturate? */
1529
12.9k
      ol_gain = MULT16_32_Q15(28406,ol_gain_table[qe]);
1530
#else
1531
      ol_gain = SIG_SCALING*exp(qe/3.5);
1532
#endif
1533
12.9k
   }
1534
1535
12.9k
   ALLOC(ak, NB_ORDER, spx_coef_t);
1536
12.9k
   ALLOC(innov, NB_SUBFRAME_SIZE, spx_sig_t);
1537
12.9k
   ALLOC(exc32, NB_SUBFRAME_SIZE, spx_word32_t);
1538
1539
12.9k
   if (st->submodeID==1)
1540
2.00k
   {
1541
2.00k
      int extra;
1542
2.00k
      extra = speex_bits_unpack_unsigned(bits, 4);
1543
1544
2.00k
      if (extra==15)
1545
550
         st->dtx_enabled=1;
1546
1.45k
      else
1547
1.45k
         st->dtx_enabled=0;
1548
2.00k
   }
1549
12.9k
   if (st->submodeID>1)
1550
10.9k
      st->dtx_enabled=0;
1551
1552
   /*Loop on subframes */
1553
64.7k
   for (sub=0;sub<NB_NB_SUBFRAMES;sub++)
1554
51.8k
   {
1555
51.8k
      int offset;
1556
51.8k
      spx_word16_t *exc;
1557
51.8k
      spx_word16_t *innov_save = NULL;
1558
51.8k
      spx_word16_t tmp;
1559
1560
      /* Offset relative to start of frame */
1561
51.8k
      offset = NB_SUBFRAME_SIZE*sub;
1562
      /* Excitation */
1563
51.8k
      exc=st->exc+offset;
1564
      /* Original signal */
1565
51.8k
      if (st->innov_save)
1566
36.5k
         innov_save = st->innov_save+offset;
1567
1568
1569
      /* Reset excitation */
1570
51.8k
      SPEEX_MEMSET(exc, 0, NB_SUBFRAME_SIZE);
1571
1572
      /*Adaptive codebook contribution*/
1573
51.8k
      speex_assert (SUBMODE(ltp_unquant));
1574
51.8k
      {
1575
51.8k
         int pit_min, pit_max;
1576
         /* Handle pitch constraints if any */
1577
51.8k
         if (SUBMODE(lbr_pitch) != -1)
1578
19.6k
         {
1579
19.6k
            int margin;
1580
19.6k
            margin = SUBMODE(lbr_pitch);
1581
19.6k
            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
19.6k
            } else {
1598
19.6k
               pit_min = pit_max = ol_pitch;
1599
19.6k
            }
1600
32.1k
         } else {
1601
32.1k
            pit_min = NB_PITCH_START;
1602
32.1k
            pit_max = NB_PITCH_END;
1603
32.1k
         }
1604
1605
1606
1607
51.8k
         SUBMODE(ltp_unquant)(exc, exc32, pit_min, pit_max, ol_pitch_coef, SUBMODE(ltp_params),
1608
51.8k
                 NB_SUBFRAME_SIZE, &pitch, &pitch_gain[0], bits, stack,
1609
51.8k
                 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
51.8k
         sanitize_values32(exc32, NEG32(QCONST32(32000,SIG_SHIFT-1)), QCONST32(32000,SIG_SHIFT-1), NB_SUBFRAME_SIZE);
1615
1616
51.8k
         tmp = gain_3tap_to_1tap(pitch_gain);
1617
1618
51.8k
         pitch_average += tmp;
1619
51.8k
         if ((tmp>best_pitch_gain&&ABS(2*best_pitch-pitch)>=3&&ABS(3*best_pitch-pitch)>=4&&ABS(4*best_pitch-pitch)>=5)
1620
51.8k
              || (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
51.8k
              || (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
8.17k
         {
1623
8.17k
            best_pitch = pitch;
1624
8.17k
            if (tmp > best_pitch_gain)
1625
7.63k
               best_pitch_gain = tmp;
1626
8.17k
         }
1627
51.8k
      }
1628
1629
      /* Unquantize the innovation */
1630
51.8k
      {
1631
51.8k
         int q_energy;
1632
51.8k
         spx_word32_t ener;
1633
1634
51.8k
         SPEEX_MEMSET(innov, 0, NB_SUBFRAME_SIZE);
1635
1636
         /* Decode sub-frame gain correction */
1637
51.8k
         if (SUBMODE(have_subframe_gain)==3)
1638
9.10k
         {
1639
9.10k
            q_energy = speex_bits_unpack_unsigned(bits, 3);
1640
9.10k
            ener = MULT16_32_Q14(exc_gain_quant_scal3[q_energy],ol_gain);
1641
42.7k
         } else if (SUBMODE(have_subframe_gain)==1)
1642
23.0k
         {
1643
23.0k
            q_energy = speex_bits_unpack_unsigned(bits, 1);
1644
23.0k
            ener = MULT16_32_Q14(exc_gain_quant_scal1[q_energy],ol_gain);
1645
23.0k
         } else {
1646
19.6k
            ener = ol_gain;
1647
19.6k
         }
1648
1649
51.8k
         speex_assert (SUBMODE(innovation_unquant));
1650
51.8k
         {
1651
            /*Fixed codebook contribution*/
1652
51.8k
            SUBMODE(innovation_unquant)(innov, SUBMODE(innovation_params), NB_SUBFRAME_SIZE, bits, stack, &st->seed);
1653
            /* De-normalize innovation and update excitation */
1654
1655
51.8k
            signal_mul(innov, innov, ener, NB_SUBFRAME_SIZE);
1656
1657
            /* Decode second codebook (only for some modes) */
1658
51.8k
            if (SUBMODE(double_codebook))
1659
3.38k
            {
1660
3.38k
               char *tmp_stack=stack;
1661
3.38k
               VARDECL(spx_sig_t *innov2);
1662
3.38k
               ALLOC(innov2, NB_SUBFRAME_SIZE, spx_sig_t);
1663
3.38k
               SPEEX_MEMSET(innov2, 0, NB_SUBFRAME_SIZE);
1664
3.38k
               SUBMODE(innovation_unquant)(innov2, SUBMODE(innovation_params), NB_SUBFRAME_SIZE, bits, stack, &st->seed);
1665
3.38k
               signal_mul(innov2, innov2, MULT16_32_Q15(QCONST16(0.454545f,15),ener), NB_SUBFRAME_SIZE);
1666
138k
               for (i=0;i<NB_SUBFRAME_SIZE;i++)
1667
135k
                  innov[i] = ADD32(innov[i], innov2[i]);
1668
3.38k
               stack = tmp_stack;
1669
3.38k
            }
1670
2.12M
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
1671
2.07M
               exc[i]=EXTRACT16(SATURATE32(PSHR32(ADD32(SHL32(exc32[i],1),innov[i]),SIG_SHIFT),32767));
1672
            /*print_vec(exc, 40, "innov");*/
1673
51.8k
            if (innov_save)
1674
36.5k
            {
1675
1.49M
               for (i=0;i<NB_SUBFRAME_SIZE;i++)
1676
1.46M
                  innov_save[i] = EXTRACT16(PSHR32(innov[i], SIG_SHIFT));
1677
36.5k
            }
1678
51.8k
         }
1679
1680
         /*Vocoder mode*/
1681
51.8k
         if (st->submodeID==1)
1682
8.02k
         {
1683
8.02k
            spx_word16_t g=ol_pitch_coef;
1684
8.02k
            g=MULT16_16_P14(QCONST16(1.5f,14),(g-QCONST16(.2f,6)));
1685
8.02k
            if (g<0)
1686
3.48k
               g=0;
1687
8.02k
            if (g>GAIN_SCALING)
1688
1.25k
               g=GAIN_SCALING;
1689
1690
8.02k
            SPEEX_MEMSET(exc, 0, NB_SUBFRAME_SIZE);
1691
16.4k
            while (st->voc_offset<NB_SUBFRAME_SIZE)
1692
8.45k
            {
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
8.45k
               if (st->voc_offset>=0)
1696
8.45k
                  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
8.45k
               st->voc_offset+=ol_pitch;
1698
8.45k
            }
1699
8.02k
            st->voc_offset -= NB_SUBFRAME_SIZE;
1700
1701
329k
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
1702
321k
            {
1703
321k
               spx_word16_t exci=exc[i];
1704
321k
               exc[i]= ADD16(ADD16(MULT16_16_Q15(QCONST16(.7f,15),exc[i]) , MULT16_16_Q15(QCONST16(.3f,15),st->voc_m1)),
1705
321k
                             SUB16(MULT16_16_Q15(Q15_ONE-MULT16_16_16(QCONST16(.85f,9),g),EXTRACT16(PSHR32(innov[i],SIG_SHIFT))),
1706
321k
                                   MULT16_16_Q15(MULT16_16_16(QCONST16(.15f,9),g),EXTRACT16(PSHR32(st->voc_m2,SIG_SHIFT)))
1707
321k
                                  ));
1708
321k
               st->voc_m1 = exci;
1709
321k
               st->voc_m2=innov[i];
1710
321k
               st->voc_mean = EXTRACT16(PSHR32(ADD32(MULT16_16(QCONST16(.8f,15),st->voc_mean), MULT16_16(QCONST16(.2f,15),exc[i])), 15));
1711
321k
               exc[i]-=st->voc_mean;
1712
321k
            }
1713
8.02k
         }
1714
1715
51.8k
      }
1716
51.8k
   }
1717
1718
12.9k
   ALLOC(interp_qlsp, NB_ORDER, spx_lsp_t);
1719
1720
12.9k
   if (st->lpc_enh_enabled && SUBMODE(comb_gain)>0 && !st->count_lost)
1721
10.9k
   {
1722
10.9k
      multicomb(st->exc-NB_SUBFRAME_SIZE, out, st->interp_qlpc, NB_ORDER, 2*NB_SUBFRAME_SIZE, best_pitch, 40, SUBMODE(comb_gain), stack);
1723
10.9k
      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
10.9k
   } else {
1725
2.00k
      SPEEX_COPY(out, &st->exc[-NB_SUBFRAME_SIZE], NB_FRAME_SIZE);
1726
2.00k
   }
1727
1728
   /* If the last packet was lost, re-scale the excitation to obtain the same energy as encoded in ol_gain */
1729
12.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
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
64.7k
   for (sub=0;sub<NB_NB_SUBFRAMES;sub++)
1754
51.8k
   {
1755
51.8k
      int offset;
1756
51.8k
      spx_word16_t *sp;
1757
1758
      /* Offset relative to start of frame */
1759
51.8k
      offset = NB_SUBFRAME_SIZE*sub;
1760
      /* Original signal */
1761
51.8k
      sp=out+offset;
1762
1763
      /* LSP interpolation (quantized and unquantized) */
1764
51.8k
      lsp_interpolate(st->old_qlsp, qlsp, interp_qlsp, NB_ORDER, sub, NB_NB_SUBFRAMES, LSP_MARGIN);
1765
1766
      /* Compute interpolated LPCs (unquantized) */
1767
51.8k
      lsp_to_lpc(interp_qlsp, ak, NB_ORDER, stack);
1768
1769
      /* Compute analysis filter at w=pi */
1770
51.8k
      {
1771
51.8k
         spx_word32_t pi_g=LPC_SCALING;
1772
311k
         for (i=0;i<NB_ORDER;i+=2)
1773
259k
         {
1774
            /*pi_g += -st->interp_qlpc[i] +  st->interp_qlpc[i+1];*/
1775
259k
            pi_g = ADD32(pi_g, SUB32(EXTEND32(ak[i+1]),EXTEND32(ak[i])));
1776
259k
         }
1777
51.8k
         st->pi_gain[sub] = pi_g;
1778
51.8k
      }
1779
1780
51.8k
      iir_mem16(sp, st->interp_qlpc, sp, NB_SUBFRAME_SIZE, NB_ORDER,
1781
51.8k
                st->mem_sp, stack);
1782
1783
570k
      for (i=0;i<NB_ORDER;i++)
1784
518k
         st->interp_qlpc[i] = ak[i];
1785
1786
51.8k
   }
1787
1788
12.9k
   if (st->highpass_enabled)
1789
12.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
12.9k
   st->level = 1+PSHR32(ol_gain,SIG_SHIFT);
1795
12.9k
   st->max_level = MAX16(MULT16_16_Q15(QCONST16(.99f,15), st->max_level), st->level);
1796
12.9k
   st->min_level = MIN16(ADD16(1,MULT16_16_Q14(QCONST16(1.01f,14), st->min_level)), st->level);
1797
12.9k
   if (st->max_level < st->min_level+1)
1798
4.52k
      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
142k
   for (i=0;i<NB_ORDER;i++)
1803
129k
      st->old_qlsp[i] = qlsp[i];
1804
1805
   /* The next frame will not be the first (Duh!) */
1806
12.9k
   st->first = 0;
1807
12.9k
   st->count_lost=0;
1808
12.9k
   st->last_pitch = best_pitch;
1809
12.9k
#ifdef FIXED_POINT
1810
12.9k
   st->last_pitch_gain = PSHR16(pitch_average,2);
1811
#else
1812
   st->last_pitch_gain = .25*pitch_average;
1813
#endif
1814
12.9k
   st->pitch_gain_buf[st->pitch_gain_buf_idx++] = st->last_pitch_gain;
1815
12.9k
   if (st->pitch_gain_buf_idx > 2) /* rollover */
1816
3.75k
      st->pitch_gain_buf_idx = 0;
1817
1818
12.9k
   st->last_ol_gain = ol_gain;
1819
1820
12.9k
   return 0;
1821
24.2k
}
1822
#endif /* DISABLE_DECODER */
1823