Coverage Report

Created: 2026-09-01 07:15

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/speex/libspeex/nb_celp.c
Line
Count
Source
1
/* Copyright (C) 2002-2006 Jean-Marc Valin
2
   File: nb_celp.c
3
4
   Redistribution and use in source and binary forms, with or without
5
   modification, are permitted provided that the following conditions
6
   are met:
7
8
   - Redistributions of source code must retain the above copyright
9
   notice, this list of conditions and the following disclaimer.
10
11
   - Redistributions in binary form must reproduce the above copyright
12
   notice, this list of conditions and the following disclaimer in the
13
   documentation and/or other materials provided with the distribution.
14
15
   - Neither the name of the Xiph.org Foundation nor the names of its
16
   contributors may be used to endorse or promote products derived from
17
   this software without specific prior written permission.
18
19
   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20
   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21
   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22
   A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
23
   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24
   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25
   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26
   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
27
   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28
   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29
   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
*/
31
32
#ifdef HAVE_CONFIG_H
33
#include "config.h"
34
#endif
35
36
#include <math.h>
37
#include "nb_celp.h"
38
#include "lpc.h"
39
#include "lsp.h"
40
#include "ltp.h"
41
#include "quant_lsp.h"
42
#include "cb_search.h"
43
#include "filters.h"
44
#include "stack_alloc.h"
45
#include "vq.h"
46
#include "vbr.h"
47
#include "arch.h"
48
#include "math_approx.h"
49
#include "os_support.h"
50
51
#ifdef VORBIS_PSYCHO
52
#include "vorbis_psy.h"
53
#endif
54
55
#ifndef NULL
56
#define NULL 0
57
#endif
58
59
2.17M
#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
195k
#define LSP_MARGIN 16
80
16.9k
#define LSP_DELTA1 6553
81
#define LSP_DELTA2 1638
82
83
#else
84
85
static const float exc_gain_quant_scal3_bound[7]={0.112338f, 0.236980f, 0.369316f, 0.492054f, 0.637471f, 0.828874f, 1.132784f};
86
static const float exc_gain_quant_scal3[8]={0.061130f, 0.163546f, 0.310413f, 0.428220f, 0.555887f, 0.719055f, 0.938694f, 1.326874f};
87
static const float exc_gain_quant_scal1_bound[1]={0.87798f};
88
static const float exc_gain_quant_scal1[2]={0.70469f, 1.05127f};
89
90
110k
#define LSP_MARGIN .002f
91
8.51k
#define LSP_DELTA1 .2f
92
#define LSP_DELTA2 .05f
93
94
#endif
95
96
extern const spx_word16_t lag_window[];
97
extern const spx_word16_t lpc_window[];
98
99
#ifndef DISABLE_ENCODER
100
void *nb_encoder_init(const SpeexMode *m)
101
7.15k
{
102
7.15k
   EncState *st;
103
7.15k
   const SpeexNBMode *mode;
104
7.15k
   int i;
105
106
7.15k
   mode=(const SpeexNBMode *)m->mode;
107
7.15k
   st = (EncState*)speex_alloc(sizeof(EncState));
108
7.15k
   if (!st)
109
0
      return NULL;
110
7.15k
#if defined(VAR_ARRAYS) || defined (USE_ALLOCA)
111
7.15k
   st->stack = NULL;
112
#else
113
   st->stack = (char*)speex_alloc_scratch(NB_ENC_STACK);
114
#endif
115
116
7.15k
   st->mode=m;
117
118
7.15k
   st->gamma1=mode->gamma1;
119
7.15k
   st->gamma2=mode->gamma2;
120
7.15k
   st->lpc_floor = mode->lpc_floor;
121
122
7.15k
   st->submodes=mode->submodes;
123
7.15k
   st->submodeID=st->submodeSelect=mode->defaultSubmode;
124
7.15k
   st->bounded_pitch = 1;
125
126
7.15k
   st->encode_submode = 1;
127
128
#ifdef VORBIS_PSYCHO
129
   st->psy = vorbis_psy_init(8000, 256);
130
   st->curve = (float*)speex_alloc(128*sizeof(float));
131
   st->old_curve = (float*)speex_alloc(128*sizeof(float));
132
   st->psy_window = (float*)speex_alloc(256*sizeof(float));
133
#endif
134
135
7.15k
   st->cumul_gain = 1024;
136
137
7.15k
   st->window= lpc_window;
138
139
   /* Create the window for autocorrelation (lag-windowing) */
140
7.15k
   st->lagWindow = lag_window;
141
142
7.15k
   st->first = 1;
143
78.6k
   for (i=0;i<NB_ORDER;i++)
144
71.5k
      st->old_lsp[i]= DIV32(MULT16_16(QCONST16(3.1415927f, LSP_SHIFT), i+1), NB_ORDER+1);
145
146
7.15k
   st->innov_rms_save = NULL;
147
148
7.15k
#ifndef DISABLE_VBR
149
7.15k
   vbr_init(&st->vbr);
150
7.15k
   st->vbr_quality = 8;
151
7.15k
   st->vbr_enabled = 0;
152
7.15k
   st->vbr_max = 0;
153
7.15k
   st->vad_enabled = 0;
154
7.15k
   st->dtx_enabled = 0;
155
7.15k
   st->dtx_count=0;
156
7.15k
   st->abr_enabled = 0;
157
7.15k
   st->abr_drift = 0;
158
7.15k
   st->abr_drift2 = 0;
159
7.15k
#endif /* #ifndef DISABLE_VBR */
160
161
7.15k
   st->plc_tuning = 2;
162
7.15k
   st->complexity=2;
163
7.15k
   st->sampling_rate=8000;
164
7.15k
   st->isWideband = 0;
165
7.15k
   st->highpass_enabled = 1;
166
167
#ifdef ENABLE_VALGRIND
168
   VALGRIND_MAKE_MEM_DEFINED(st, NB_ENC_STACK);
169
#endif
170
7.15k
   return st;
171
7.15k
}
nb_encoder_init
Line
Count
Source
101
3.57k
{
102
3.57k
   EncState *st;
103
3.57k
   const SpeexNBMode *mode;
104
3.57k
   int i;
105
106
3.57k
   mode=(const SpeexNBMode *)m->mode;
107
3.57k
   st = (EncState*)speex_alloc(sizeof(EncState));
108
3.57k
   if (!st)
109
0
      return NULL;
110
3.57k
#if defined(VAR_ARRAYS) || defined (USE_ALLOCA)
111
3.57k
   st->stack = NULL;
112
#else
113
   st->stack = (char*)speex_alloc_scratch(NB_ENC_STACK);
114
#endif
115
116
3.57k
   st->mode=m;
117
118
3.57k
   st->gamma1=mode->gamma1;
119
3.57k
   st->gamma2=mode->gamma2;
120
3.57k
   st->lpc_floor = mode->lpc_floor;
121
122
3.57k
   st->submodes=mode->submodes;
123
3.57k
   st->submodeID=st->submodeSelect=mode->defaultSubmode;
124
3.57k
   st->bounded_pitch = 1;
125
126
3.57k
   st->encode_submode = 1;
127
128
#ifdef VORBIS_PSYCHO
129
   st->psy = vorbis_psy_init(8000, 256);
130
   st->curve = (float*)speex_alloc(128*sizeof(float));
131
   st->old_curve = (float*)speex_alloc(128*sizeof(float));
132
   st->psy_window = (float*)speex_alloc(256*sizeof(float));
133
#endif
134
135
3.57k
   st->cumul_gain = 1024;
136
137
3.57k
   st->window= lpc_window;
138
139
   /* Create the window for autocorrelation (lag-windowing) */
140
3.57k
   st->lagWindow = lag_window;
141
142
3.57k
   st->first = 1;
143
39.3k
   for (i=0;i<NB_ORDER;i++)
144
35.7k
      st->old_lsp[i]= DIV32(MULT16_16(QCONST16(3.1415927f, LSP_SHIFT), i+1), NB_ORDER+1);
145
146
3.57k
   st->innov_rms_save = NULL;
147
148
3.57k
#ifndef DISABLE_VBR
149
3.57k
   vbr_init(&st->vbr);
150
3.57k
   st->vbr_quality = 8;
151
3.57k
   st->vbr_enabled = 0;
152
3.57k
   st->vbr_max = 0;
153
3.57k
   st->vad_enabled = 0;
154
3.57k
   st->dtx_enabled = 0;
155
3.57k
   st->dtx_count=0;
156
3.57k
   st->abr_enabled = 0;
157
3.57k
   st->abr_drift = 0;
158
3.57k
   st->abr_drift2 = 0;
159
3.57k
#endif /* #ifndef DISABLE_VBR */
160
161
3.57k
   st->plc_tuning = 2;
162
3.57k
   st->complexity=2;
163
3.57k
   st->sampling_rate=8000;
164
3.57k
   st->isWideband = 0;
165
3.57k
   st->highpass_enabled = 1;
166
167
#ifdef ENABLE_VALGRIND
168
   VALGRIND_MAKE_MEM_DEFINED(st, NB_ENC_STACK);
169
#endif
170
3.57k
   return st;
171
3.57k
}
nb_encoder_init
Line
Count
Source
101
3.57k
{
102
3.57k
   EncState *st;
103
3.57k
   const SpeexNBMode *mode;
104
3.57k
   int i;
105
106
3.57k
   mode=(const SpeexNBMode *)m->mode;
107
3.57k
   st = (EncState*)speex_alloc(sizeof(EncState));
108
3.57k
   if (!st)
109
0
      return NULL;
110
3.57k
#if defined(VAR_ARRAYS) || defined (USE_ALLOCA)
111
3.57k
   st->stack = NULL;
112
#else
113
   st->stack = (char*)speex_alloc_scratch(NB_ENC_STACK);
114
#endif
115
116
3.57k
   st->mode=m;
117
118
3.57k
   st->gamma1=mode->gamma1;
119
3.57k
   st->gamma2=mode->gamma2;
120
3.57k
   st->lpc_floor = mode->lpc_floor;
121
122
3.57k
   st->submodes=mode->submodes;
123
3.57k
   st->submodeID=st->submodeSelect=mode->defaultSubmode;
124
3.57k
   st->bounded_pitch = 1;
125
126
3.57k
   st->encode_submode = 1;
127
128
#ifdef VORBIS_PSYCHO
129
   st->psy = vorbis_psy_init(8000, 256);
130
   st->curve = (float*)speex_alloc(128*sizeof(float));
131
   st->old_curve = (float*)speex_alloc(128*sizeof(float));
132
   st->psy_window = (float*)speex_alloc(256*sizeof(float));
133
#endif
134
135
3.57k
   st->cumul_gain = 1024;
136
137
3.57k
   st->window= lpc_window;
138
139
   /* Create the window for autocorrelation (lag-windowing) */
140
3.57k
   st->lagWindow = lag_window;
141
142
3.57k
   st->first = 1;
143
39.3k
   for (i=0;i<NB_ORDER;i++)
144
35.7k
      st->old_lsp[i]= DIV32(MULT16_16(QCONST16(3.1415927f, LSP_SHIFT), i+1), NB_ORDER+1);
145
146
3.57k
   st->innov_rms_save = NULL;
147
148
3.57k
#ifndef DISABLE_VBR
149
3.57k
   vbr_init(&st->vbr);
150
3.57k
   st->vbr_quality = 8;
151
3.57k
   st->vbr_enabled = 0;
152
3.57k
   st->vbr_max = 0;
153
3.57k
   st->vad_enabled = 0;
154
3.57k
   st->dtx_enabled = 0;
155
3.57k
   st->dtx_count=0;
156
3.57k
   st->abr_enabled = 0;
157
3.57k
   st->abr_drift = 0;
158
3.57k
   st->abr_drift2 = 0;
159
3.57k
#endif /* #ifndef DISABLE_VBR */
160
161
3.57k
   st->plc_tuning = 2;
162
3.57k
   st->complexity=2;
163
3.57k
   st->sampling_rate=8000;
164
3.57k
   st->isWideband = 0;
165
3.57k
   st->highpass_enabled = 1;
166
167
#ifdef ENABLE_VALGRIND
168
   VALGRIND_MAKE_MEM_DEFINED(st, NB_ENC_STACK);
169
#endif
170
3.57k
   return st;
171
3.57k
}
172
173
void nb_encoder_destroy(void *state)
174
3.57k
{
175
3.57k
   EncState *st=(EncState *)state;
176
   /* Free all allocated memory */
177
#if !(defined(VAR_ARRAYS) || defined (USE_ALLOCA))
178
   speex_free_scratch(st->stack);
179
#endif
180
181
3.57k
#ifndef DISABLE_VBR
182
3.57k
   vbr_destroy(&st->vbr);
183
3.57k
#endif /* #ifndef DISABLE_VBR */
184
185
#ifdef VORBIS_PSYCHO
186
   vorbis_psy_destroy(st->psy);
187
   speex_free (st->curve);
188
   speex_free (st->old_curve);
189
   speex_free (st->psy_window);
190
#endif
191
192
   /*Free state memory... should be last*/
193
3.57k
   speex_free(st);
194
3.57k
}
195
196
197
int nb_encoder_ctl(void *state, int request, void *ptr)
198
580k
{
199
580k
   EncState *st;
200
580k
   st=(EncState*)state;
201
580k
   switch(request)
202
580k
   {
203
15.1k
   case SPEEX_GET_FRAME_SIZE:
204
15.1k
      (*(spx_int32_t*)ptr) = NB_FRAME_SIZE;
205
15.1k
      break;
206
0
   case SPEEX_SET_LOW_MODE:
207
77.5k
   case SPEEX_SET_MODE:
208
77.5k
      st->submodeSelect = st->submodeID = (*(spx_int32_t*)ptr);
209
77.5k
      break;
210
19.1k
   case SPEEX_GET_LOW_MODE:
211
19.1k
   case SPEEX_GET_MODE:
212
19.1k
      (*(spx_int32_t*)ptr) = st->submodeID;
213
19.1k
      break;
214
0
#ifndef DISABLE_VBR
215
4.71k
      case SPEEX_SET_VBR:
216
4.71k
      st->vbr_enabled = (*(spx_int32_t*)ptr);
217
4.71k
      break;
218
0
   case SPEEX_GET_VBR:
219
0
      (*(spx_int32_t*)ptr) = st->vbr_enabled;
220
0
      break;
221
3.33k
   case SPEEX_SET_VAD:
222
3.33k
      st->vad_enabled = (*(spx_int32_t*)ptr);
223
3.33k
      break;
224
0
   case SPEEX_GET_VAD:
225
0
      (*(spx_int32_t*)ptr) = st->vad_enabled;
226
0
      break;
227
3.12k
   case SPEEX_SET_DTX:
228
3.12k
      st->dtx_enabled = (*(spx_int32_t*)ptr);
229
3.12k
      break;
230
0
   case SPEEX_GET_DTX:
231
0
      (*(spx_int32_t*)ptr) = st->dtx_enabled;
232
0
      break;
233
1.03k
   case SPEEX_SET_ABR:
234
1.03k
      st->abr_enabled = (*(spx_int32_t*)ptr);
235
1.03k
      st->vbr_enabled = st->abr_enabled!=0;
236
1.03k
      if (st->vbr_enabled)
237
1.03k
      {
238
1.03k
         spx_int32_t i=10;
239
1.03k
         spx_int32_t rate, target;
240
1.03k
         float vbr_qual;
241
1.03k
         target = (*(spx_int32_t*)ptr);
242
12.3k
         while (i>=0)
243
11.3k
         {
244
11.3k
            speex_encoder_ctl(st, SPEEX_SET_QUALITY, &i);
245
11.3k
            speex_encoder_ctl(st, SPEEX_GET_BITRATE, &rate);
246
11.3k
            if (rate <= target)
247
0
               break;
248
11.3k
            i--;
249
11.3k
         }
250
1.03k
         vbr_qual=i;
251
1.03k
         if (vbr_qual<0)
252
1.03k
            vbr_qual=0;
253
1.03k
         speex_encoder_ctl(st, SPEEX_SET_VBR_QUALITY, &vbr_qual);
254
1.03k
         st->abr_count=0;
255
1.03k
         st->abr_drift=0;
256
1.03k
         st->abr_drift2=0;
257
1.03k
      }
258
259
1.03k
      break;
260
0
   case SPEEX_GET_ABR:
261
0
      (*(spx_int32_t*)ptr) = st->abr_enabled;
262
0
      break;
263
0
#endif /* #ifndef DISABLE_VBR */
264
0
#if !defined(DISABLE_VBR) && !defined(DISABLE_FLOAT_API)
265
5.74k
   case SPEEX_SET_VBR_QUALITY:
266
5.74k
      st->vbr_quality = (*(float*)ptr);
267
5.74k
      if (st->vbr_quality < 0)
268
0
          st->vbr_quality = 0;
269
5.74k
      else if (st->vbr_quality > 10)
270
0
          st->vbr_quality = 10;
271
5.74k
      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
135k
   case SPEEX_SET_QUALITY:
277
135k
      {
278
135k
         int quality = (*(spx_int32_t*)ptr);
279
135k
         if (quality < 0)
280
0
            quality = 0;
281
135k
         if (quality > 10)
282
0
            quality = 10;
283
135k
         st->submodeSelect = st->submodeID = ((const SpeexNBMode*)(st->mode->mode))->quality_map[quality];
284
135k
      }
285
135k
      break;
286
7.15k
   case SPEEX_SET_COMPLEXITY:
287
7.15k
      st->complexity = (*(spx_int32_t*)ptr);
288
7.15k
      if (st->complexity<0)
289
0
         st->complexity=0;
290
7.15k
      break;
291
0
   case SPEEX_GET_COMPLEXITY:
292
0
      (*(spx_int32_t*)ptr) = st->complexity;
293
0
      break;
294
12.6k
   case SPEEX_SET_BITRATE:
295
12.6k
      {
296
12.6k
         spx_int32_t i=10;
297
12.6k
         spx_int32_t rate, target;
298
12.6k
         target = (*(spx_int32_t*)ptr);
299
125k
         while (i>=0)
300
119k
         {
301
119k
            speex_encoder_ctl(st, SPEEX_SET_QUALITY, &i);
302
119k
            speex_encoder_ctl(st, SPEEX_GET_BITRATE, &rate);
303
119k
            if (rate <= target)
304
6.01k
               break;
305
113k
            i--;
306
113k
         }
307
12.6k
      }
308
12.6k
      break;
309
207k
   case SPEEX_GET_BITRATE:
310
207k
      if (st->submodes[st->submodeID])
311
203k
         (*(spx_int32_t*)ptr) = st->sampling_rate*SUBMODE(bits_per_frame)/NB_FRAME_SIZE;
312
4.56k
      else
313
4.56k
         (*(spx_int32_t*)ptr) = st->sampling_rate*(NB_SUBMODE_BITS+1)/NB_FRAME_SIZE;
314
207k
      break;
315
7.15k
   case SPEEX_SET_SAMPLING_RATE:
316
7.15k
      st->sampling_rate = (*(spx_int32_t*)ptr);
317
7.15k
      break;
318
3.53k
   case SPEEX_GET_SAMPLING_RATE:
319
3.53k
      (*(spx_int32_t*)ptr)=st->sampling_rate;
320
3.53k
      break;
321
0
   case SPEEX_RESET_STATE:
322
0
      {
323
0
         int i;
324
0
         st->bounded_pitch = 1;
325
0
         st->first = 1;
326
0
         for (i=0;i<NB_ORDER;i++)
327
0
            st->old_lsp[i]= DIV32(MULT16_16(QCONST16(3.1415927f, LSP_SHIFT), i+1), NB_ORDER+1);
328
0
         for (i=0;i<NB_ORDER;i++)
329
0
            st->mem_sw[i]=st->mem_sw_whole[i]=st->mem_sp[i]=st->mem_exc[i]=0;
330
0
         for (i=0;i<NB_FRAME_SIZE+NB_PITCH_END+1;i++)
331
0
            st->excBuf[i]=st->swBuf[i]=0;
332
0
         for (i=0;i<NB_WINDOW_SIZE-NB_FRAME_SIZE;i++)
333
0
            st->winBuf[i]=0;
334
0
      }
335
0
      break;
336
0
   case SPEEX_SET_SUBMODE_ENCODING:
337
0
      st->encode_submode = (*(spx_int32_t*)ptr);
338
0
      break;
339
0
   case SPEEX_GET_SUBMODE_ENCODING:
340
0
      (*(spx_int32_t*)ptr) = st->encode_submode;
341
0
      break;
342
7.15k
   case SPEEX_GET_LOOKAHEAD:
343
7.15k
      (*(spx_int32_t*)ptr)=(NB_WINDOW_SIZE-NB_FRAME_SIZE);
344
7.15k
      break;
345
0
   case SPEEX_SET_PLC_TUNING:
346
0
      st->plc_tuning = (*(spx_int32_t*)ptr);
347
0
      if (st->plc_tuning>100)
348
0
         st->plc_tuning=100;
349
0
      break;
350
0
   case SPEEX_GET_PLC_TUNING:
351
0
      (*(spx_int32_t*)ptr)=(st->plc_tuning);
352
0
      break;
353
0
#ifndef DISABLE_VBR
354
3.49k
   case SPEEX_SET_VBR_MAX_BITRATE:
355
3.49k
      st->vbr_max = (*(spx_int32_t*)ptr);
356
3.49k
      break;
357
0
   case SPEEX_GET_VBR_MAX_BITRATE:
358
0
      (*(spx_int32_t*)ptr) = st->vbr_max;
359
0
      break;
360
0
#endif /* #ifndef DISABLE_VBR */
361
7.15k
   case SPEEX_SET_HIGHPASS:
362
7.15k
      st->highpass_enabled = (*(spx_int32_t*)ptr);
363
7.15k
      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
14.6k
   case SPEEX_GET_PI_GAIN:
370
14.6k
      {
371
14.6k
         int i;
372
14.6k
         spx_word32_t *g = (spx_word32_t*)ptr;
373
73.4k
         for (i=0;i<NB_NB_SUBFRAMES;i++)
374
58.7k
            g[i]=st->pi_gain[i];
375
14.6k
      }
376
14.6k
      break;
377
14.6k
   case SPEEX_GET_EXC:
378
14.6k
      {
379
14.6k
         int i;
380
73.4k
         for (i=0;i<NB_NB_SUBFRAMES;i++)
381
58.7k
            ((spx_word16_t*)ptr)[i] = compute_rms16(st->exc+i*NB_SUBFRAME_SIZE, NB_SUBFRAME_SIZE);
382
14.6k
      }
383
14.6k
      break;
384
0
#ifndef DISABLE_VBR
385
10.1k
   case SPEEX_GET_RELATIVE_QUALITY:
386
10.1k
      (*(float*)ptr)=st->relative_quality;
387
10.1k
      break;
388
0
#endif /* #ifndef DISABLE_VBR */
389
14.6k
   case SPEEX_SET_INNOVATION_SAVE:
390
14.6k
      st->innov_rms_save = (spx_word16_t*)ptr;
391
14.6k
      break;
392
5.02k
   case SPEEX_SET_WIDEBAND:
393
5.02k
      st->isWideband = *((spx_int32_t*)ptr);
394
5.02k
      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
580k
   }
402
580k
   return 0;
403
580k
}
nb_encoder_ctl
Line
Count
Source
198
290k
{
199
290k
   EncState *st;
200
290k
   st=(EncState*)state;
201
290k
   switch(request)
202
290k
   {
203
7.59k
   case SPEEX_GET_FRAME_SIZE:
204
7.59k
      (*(spx_int32_t*)ptr) = NB_FRAME_SIZE;
205
7.59k
      break;
206
0
   case SPEEX_SET_LOW_MODE:
207
38.7k
   case SPEEX_SET_MODE:
208
38.7k
      st->submodeSelect = st->submodeID = (*(spx_int32_t*)ptr);
209
38.7k
      break;
210
9.58k
   case SPEEX_GET_LOW_MODE:
211
9.58k
   case SPEEX_GET_MODE:
212
9.58k
      (*(spx_int32_t*)ptr) = st->submodeID;
213
9.58k
      break;
214
0
#ifndef DISABLE_VBR
215
2.35k
      case SPEEX_SET_VBR:
216
2.35k
      st->vbr_enabled = (*(spx_int32_t*)ptr);
217
2.35k
      break;
218
0
   case SPEEX_GET_VBR:
219
0
      (*(spx_int32_t*)ptr) = st->vbr_enabled;
220
0
      break;
221
1.66k
   case SPEEX_SET_VAD:
222
1.66k
      st->vad_enabled = (*(spx_int32_t*)ptr);
223
1.66k
      break;
224
0
   case SPEEX_GET_VAD:
225
0
      (*(spx_int32_t*)ptr) = st->vad_enabled;
226
0
      break;
227
1.56k
   case SPEEX_SET_DTX:
228
1.56k
      st->dtx_enabled = (*(spx_int32_t*)ptr);
229
1.56k
      break;
230
0
   case SPEEX_GET_DTX:
231
0
      (*(spx_int32_t*)ptr) = st->dtx_enabled;
232
0
      break;
233
515
   case SPEEX_SET_ABR:
234
515
      st->abr_enabled = (*(spx_int32_t*)ptr);
235
515
      st->vbr_enabled = st->abr_enabled!=0;
236
515
      if (st->vbr_enabled)
237
515
      {
238
515
         spx_int32_t i=10;
239
515
         spx_int32_t rate, target;
240
515
         float vbr_qual;
241
515
         target = (*(spx_int32_t*)ptr);
242
6.18k
         while (i>=0)
243
5.66k
         {
244
5.66k
            speex_encoder_ctl(st, SPEEX_SET_QUALITY, &i);
245
5.66k
            speex_encoder_ctl(st, SPEEX_GET_BITRATE, &rate);
246
5.66k
            if (rate <= target)
247
0
               break;
248
5.66k
            i--;
249
5.66k
         }
250
515
         vbr_qual=i;
251
515
         if (vbr_qual<0)
252
515
            vbr_qual=0;
253
515
         speex_encoder_ctl(st, SPEEX_SET_VBR_QUALITY, &vbr_qual);
254
515
         st->abr_count=0;
255
515
         st->abr_drift=0;
256
515
         st->abr_drift2=0;
257
515
      }
258
259
515
      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.87k
   case SPEEX_SET_VBR_QUALITY:
266
2.87k
      st->vbr_quality = (*(float*)ptr);
267
2.87k
      if (st->vbr_quality < 0)
268
0
          st->vbr_quality = 0;
269
2.87k
      else if (st->vbr_quality > 10)
270
0
          st->vbr_quality = 10;
271
2.87k
      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
67.8k
   case SPEEX_SET_QUALITY:
277
67.8k
      {
278
67.8k
         int quality = (*(spx_int32_t*)ptr);
279
67.8k
         if (quality < 0)
280
0
            quality = 0;
281
67.8k
         if (quality > 10)
282
0
            quality = 10;
283
67.8k
         st->submodeSelect = st->submodeID = ((const SpeexNBMode*)(st->mode->mode))->quality_map[quality];
284
67.8k
      }
285
67.8k
      break;
286
3.57k
   case SPEEX_SET_COMPLEXITY:
287
3.57k
      st->complexity = (*(spx_int32_t*)ptr);
288
3.57k
      if (st->complexity<0)
289
0
         st->complexity=0;
290
3.57k
      break;
291
0
   case SPEEX_GET_COMPLEXITY:
292
0
      (*(spx_int32_t*)ptr) = st->complexity;
293
0
      break;
294
6.33k
   case SPEEX_SET_BITRATE:
295
6.33k
      {
296
6.33k
         spx_int32_t i=10;
297
6.33k
         spx_int32_t rate, target;
298
6.33k
         target = (*(spx_int32_t*)ptr);
299
62.9k
         while (i>=0)
300
59.6k
         {
301
59.6k
            speex_encoder_ctl(st, SPEEX_SET_QUALITY, &i);
302
59.6k
            speex_encoder_ctl(st, SPEEX_GET_BITRATE, &rate);
303
59.6k
            if (rate <= target)
304
3.00k
               break;
305
56.6k
            i--;
306
56.6k
         }
307
6.33k
      }
308
6.33k
      break;
309
103k
   case SPEEX_GET_BITRATE:
310
103k
      if (st->submodes[st->submodeID])
311
101k
         (*(spx_int32_t*)ptr) = st->sampling_rate*SUBMODE(bits_per_frame)/NB_FRAME_SIZE;
312
2.28k
      else
313
2.28k
         (*(spx_int32_t*)ptr) = st->sampling_rate*(NB_SUBMODE_BITS+1)/NB_FRAME_SIZE;
314
103k
      break;
315
3.57k
   case SPEEX_SET_SAMPLING_RATE:
316
3.57k
      st->sampling_rate = (*(spx_int32_t*)ptr);
317
3.57k
      break;
318
1.76k
   case SPEEX_GET_SAMPLING_RATE:
319
1.76k
      (*(spx_int32_t*)ptr)=st->sampling_rate;
320
1.76k
      break;
321
0
   case SPEEX_RESET_STATE:
322
0
      {
323
0
         int i;
324
0
         st->bounded_pitch = 1;
325
0
         st->first = 1;
326
0
         for (i=0;i<NB_ORDER;i++)
327
0
            st->old_lsp[i]= DIV32(MULT16_16(QCONST16(3.1415927f, LSP_SHIFT), i+1), NB_ORDER+1);
328
0
         for (i=0;i<NB_ORDER;i++)
329
0
            st->mem_sw[i]=st->mem_sw_whole[i]=st->mem_sp[i]=st->mem_exc[i]=0;
330
0
         for (i=0;i<NB_FRAME_SIZE+NB_PITCH_END+1;i++)
331
0
            st->excBuf[i]=st->swBuf[i]=0;
332
0
         for (i=0;i<NB_WINDOW_SIZE-NB_FRAME_SIZE;i++)
333
0
            st->winBuf[i]=0;
334
0
      }
335
0
      break;
336
0
   case SPEEX_SET_SUBMODE_ENCODING:
337
0
      st->encode_submode = (*(spx_int32_t*)ptr);
338
0
      break;
339
0
   case SPEEX_GET_SUBMODE_ENCODING:
340
0
      (*(spx_int32_t*)ptr) = st->encode_submode;
341
0
      break;
342
3.57k
   case SPEEX_GET_LOOKAHEAD:
343
3.57k
      (*(spx_int32_t*)ptr)=(NB_WINDOW_SIZE-NB_FRAME_SIZE);
344
3.57k
      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.74k
   case SPEEX_SET_VBR_MAX_BITRATE:
355
1.74k
      st->vbr_max = (*(spx_int32_t*)ptr);
356
1.74k
      break;
357
0
   case SPEEX_GET_VBR_MAX_BITRATE:
358
0
      (*(spx_int32_t*)ptr) = st->vbr_max;
359
0
      break;
360
0
#endif /* #ifndef DISABLE_VBR */
361
3.57k
   case SPEEX_SET_HIGHPASS:
362
3.57k
      st->highpass_enabled = (*(spx_int32_t*)ptr);
363
3.57k
      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
7.34k
   case SPEEX_GET_PI_GAIN:
370
7.34k
      {
371
7.34k
         int i;
372
7.34k
         spx_word32_t *g = (spx_word32_t*)ptr;
373
36.7k
         for (i=0;i<NB_NB_SUBFRAMES;i++)
374
29.3k
            g[i]=st->pi_gain[i];
375
7.34k
      }
376
7.34k
      break;
377
7.34k
   case SPEEX_GET_EXC:
378
7.34k
      {
379
7.34k
         int i;
380
36.7k
         for (i=0;i<NB_NB_SUBFRAMES;i++)
381
29.3k
            ((spx_word16_t*)ptr)[i] = compute_rms16(st->exc+i*NB_SUBFRAME_SIZE, NB_SUBFRAME_SIZE);
382
7.34k
      }
383
7.34k
      break;
384
0
#ifndef DISABLE_VBR
385
5.06k
   case SPEEX_GET_RELATIVE_QUALITY:
386
5.06k
      (*(float*)ptr)=st->relative_quality;
387
5.06k
      break;
388
0
#endif /* #ifndef DISABLE_VBR */
389
7.34k
   case SPEEX_SET_INNOVATION_SAVE:
390
7.34k
      st->innov_rms_save = (spx_word16_t*)ptr;
391
7.34k
      break;
392
2.51k
   case SPEEX_SET_WIDEBAND:
393
2.51k
      st->isWideband = *((spx_int32_t*)ptr);
394
2.51k
      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
290k
   }
402
290k
   return 0;
403
290k
}
nb_encoder_ctl
Line
Count
Source
198
290k
{
199
290k
   EncState *st;
200
290k
   st=(EncState*)state;
201
290k
   switch(request)
202
290k
   {
203
7.59k
   case SPEEX_GET_FRAME_SIZE:
204
7.59k
      (*(spx_int32_t*)ptr) = NB_FRAME_SIZE;
205
7.59k
      break;
206
0
   case SPEEX_SET_LOW_MODE:
207
38.7k
   case SPEEX_SET_MODE:
208
38.7k
      st->submodeSelect = st->submodeID = (*(spx_int32_t*)ptr);
209
38.7k
      break;
210
9.58k
   case SPEEX_GET_LOW_MODE:
211
9.58k
   case SPEEX_GET_MODE:
212
9.58k
      (*(spx_int32_t*)ptr) = st->submodeID;
213
9.58k
      break;
214
0
#ifndef DISABLE_VBR
215
2.35k
      case SPEEX_SET_VBR:
216
2.35k
      st->vbr_enabled = (*(spx_int32_t*)ptr);
217
2.35k
      break;
218
0
   case SPEEX_GET_VBR:
219
0
      (*(spx_int32_t*)ptr) = st->vbr_enabled;
220
0
      break;
221
1.66k
   case SPEEX_SET_VAD:
222
1.66k
      st->vad_enabled = (*(spx_int32_t*)ptr);
223
1.66k
      break;
224
0
   case SPEEX_GET_VAD:
225
0
      (*(spx_int32_t*)ptr) = st->vad_enabled;
226
0
      break;
227
1.56k
   case SPEEX_SET_DTX:
228
1.56k
      st->dtx_enabled = (*(spx_int32_t*)ptr);
229
1.56k
      break;
230
0
   case SPEEX_GET_DTX:
231
0
      (*(spx_int32_t*)ptr) = st->dtx_enabled;
232
0
      break;
233
515
   case SPEEX_SET_ABR:
234
515
      st->abr_enabled = (*(spx_int32_t*)ptr);
235
515
      st->vbr_enabled = st->abr_enabled!=0;
236
515
      if (st->vbr_enabled)
237
515
      {
238
515
         spx_int32_t i=10;
239
515
         spx_int32_t rate, target;
240
515
         float vbr_qual;
241
515
         target = (*(spx_int32_t*)ptr);
242
6.18k
         while (i>=0)
243
5.66k
         {
244
5.66k
            speex_encoder_ctl(st, SPEEX_SET_QUALITY, &i);
245
5.66k
            speex_encoder_ctl(st, SPEEX_GET_BITRATE, &rate);
246
5.66k
            if (rate <= target)
247
0
               break;
248
5.66k
            i--;
249
5.66k
         }
250
515
         vbr_qual=i;
251
515
         if (vbr_qual<0)
252
515
            vbr_qual=0;
253
515
         speex_encoder_ctl(st, SPEEX_SET_VBR_QUALITY, &vbr_qual);
254
515
         st->abr_count=0;
255
515
         st->abr_drift=0;
256
515
         st->abr_drift2=0;
257
515
      }
258
259
515
      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.87k
   case SPEEX_SET_VBR_QUALITY:
266
2.87k
      st->vbr_quality = (*(float*)ptr);
267
2.87k
      if (st->vbr_quality < 0)
268
0
          st->vbr_quality = 0;
269
2.87k
      else if (st->vbr_quality > 10)
270
0
          st->vbr_quality = 10;
271
2.87k
      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
67.8k
   case SPEEX_SET_QUALITY:
277
67.8k
      {
278
67.8k
         int quality = (*(spx_int32_t*)ptr);
279
67.8k
         if (quality < 0)
280
0
            quality = 0;
281
67.8k
         if (quality > 10)
282
0
            quality = 10;
283
67.8k
         st->submodeSelect = st->submodeID = ((const SpeexNBMode*)(st->mode->mode))->quality_map[quality];
284
67.8k
      }
285
67.8k
      break;
286
3.57k
   case SPEEX_SET_COMPLEXITY:
287
3.57k
      st->complexity = (*(spx_int32_t*)ptr);
288
3.57k
      if (st->complexity<0)
289
0
         st->complexity=0;
290
3.57k
      break;
291
0
   case SPEEX_GET_COMPLEXITY:
292
0
      (*(spx_int32_t*)ptr) = st->complexity;
293
0
      break;
294
6.33k
   case SPEEX_SET_BITRATE:
295
6.33k
      {
296
6.33k
         spx_int32_t i=10;
297
6.33k
         spx_int32_t rate, target;
298
6.33k
         target = (*(spx_int32_t*)ptr);
299
62.9k
         while (i>=0)
300
59.6k
         {
301
59.6k
            speex_encoder_ctl(st, SPEEX_SET_QUALITY, &i);
302
59.6k
            speex_encoder_ctl(st, SPEEX_GET_BITRATE, &rate);
303
59.6k
            if (rate <= target)
304
3.00k
               break;
305
56.6k
            i--;
306
56.6k
         }
307
6.33k
      }
308
6.33k
      break;
309
103k
   case SPEEX_GET_BITRATE:
310
103k
      if (st->submodes[st->submodeID])
311
101k
         (*(spx_int32_t*)ptr) = st->sampling_rate*SUBMODE(bits_per_frame)/NB_FRAME_SIZE;
312
2.28k
      else
313
2.28k
         (*(spx_int32_t*)ptr) = st->sampling_rate*(NB_SUBMODE_BITS+1)/NB_FRAME_SIZE;
314
103k
      break;
315
3.57k
   case SPEEX_SET_SAMPLING_RATE:
316
3.57k
      st->sampling_rate = (*(spx_int32_t*)ptr);
317
3.57k
      break;
318
1.76k
   case SPEEX_GET_SAMPLING_RATE:
319
1.76k
      (*(spx_int32_t*)ptr)=st->sampling_rate;
320
1.76k
      break;
321
0
   case SPEEX_RESET_STATE:
322
0
      {
323
0
         int i;
324
0
         st->bounded_pitch = 1;
325
0
         st->first = 1;
326
0
         for (i=0;i<NB_ORDER;i++)
327
0
            st->old_lsp[i]= DIV32(MULT16_16(QCONST16(3.1415927f, LSP_SHIFT), i+1), NB_ORDER+1);
328
0
         for (i=0;i<NB_ORDER;i++)
329
0
            st->mem_sw[i]=st->mem_sw_whole[i]=st->mem_sp[i]=st->mem_exc[i]=0;
330
0
         for (i=0;i<NB_FRAME_SIZE+NB_PITCH_END+1;i++)
331
0
            st->excBuf[i]=st->swBuf[i]=0;
332
0
         for (i=0;i<NB_WINDOW_SIZE-NB_FRAME_SIZE;i++)
333
0
            st->winBuf[i]=0;
334
0
      }
335
0
      break;
336
0
   case SPEEX_SET_SUBMODE_ENCODING:
337
0
      st->encode_submode = (*(spx_int32_t*)ptr);
338
0
      break;
339
0
   case SPEEX_GET_SUBMODE_ENCODING:
340
0
      (*(spx_int32_t*)ptr) = st->encode_submode;
341
0
      break;
342
3.57k
   case SPEEX_GET_LOOKAHEAD:
343
3.57k
      (*(spx_int32_t*)ptr)=(NB_WINDOW_SIZE-NB_FRAME_SIZE);
344
3.57k
      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.74k
   case SPEEX_SET_VBR_MAX_BITRATE:
355
1.74k
      st->vbr_max = (*(spx_int32_t*)ptr);
356
1.74k
      break;
357
0
   case SPEEX_GET_VBR_MAX_BITRATE:
358
0
      (*(spx_int32_t*)ptr) = st->vbr_max;
359
0
      break;
360
0
#endif /* #ifndef DISABLE_VBR */
361
3.57k
   case SPEEX_SET_HIGHPASS:
362
3.57k
      st->highpass_enabled = (*(spx_int32_t*)ptr);
363
3.57k
      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
7.34k
   case SPEEX_GET_PI_GAIN:
370
7.34k
      {
371
7.34k
         int i;
372
7.34k
         spx_word32_t *g = (spx_word32_t*)ptr;
373
36.7k
         for (i=0;i<NB_NB_SUBFRAMES;i++)
374
29.3k
            g[i]=st->pi_gain[i];
375
7.34k
      }
376
7.34k
      break;
377
7.34k
   case SPEEX_GET_EXC:
378
7.34k
      {
379
7.34k
         int i;
380
36.7k
         for (i=0;i<NB_NB_SUBFRAMES;i++)
381
29.3k
            ((spx_word16_t*)ptr)[i] = compute_rms16(st->exc+i*NB_SUBFRAME_SIZE, NB_SUBFRAME_SIZE);
382
7.34k
      }
383
7.34k
      break;
384
0
#ifndef DISABLE_VBR
385
5.06k
   case SPEEX_GET_RELATIVE_QUALITY:
386
5.06k
      (*(float*)ptr)=st->relative_quality;
387
5.06k
      break;
388
0
#endif /* #ifndef DISABLE_VBR */
389
7.34k
   case SPEEX_SET_INNOVATION_SAVE:
390
7.34k
      st->innov_rms_save = (spx_word16_t*)ptr;
391
7.34k
      break;
392
2.51k
   case SPEEX_SET_WIDEBAND:
393
2.51k
      st->isWideband = *((spx_int32_t*)ptr);
394
2.51k
      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
290k
   }
402
290k
   return 0;
403
290k
}
404
405
406
int nb_encode(void *state, void *vin, SpeexBits *bits)
407
25.4k
{
408
25.4k
   EncState *st;
409
25.4k
   int i, sub, roots;
410
25.4k
   int ol_pitch;
411
25.4k
   spx_word16_t ol_pitch_coef;
412
25.4k
   spx_word32_t ol_gain;
413
25.4k
   VARDECL(spx_word16_t *target);
414
25.4k
   VARDECL(spx_sig_t *innov);
415
25.4k
   VARDECL(spx_word32_t *exc32);
416
25.4k
   VARDECL(spx_mem_t *mem);
417
25.4k
   VARDECL(spx_coef_t *bw_lpc1);
418
25.4k
   VARDECL(spx_coef_t *bw_lpc2);
419
25.4k
   VARDECL(spx_coef_t *lpc);
420
25.4k
   VARDECL(spx_lsp_t *lsp);
421
25.4k
   VARDECL(spx_lsp_t *qlsp);
422
25.4k
   VARDECL(spx_lsp_t *interp_lsp);
423
25.4k
   VARDECL(spx_lsp_t *interp_qlsp);
424
25.4k
   VARDECL(spx_coef_t *interp_lpc);
425
25.4k
   VARDECL(spx_coef_t *interp_qlpc);
426
25.4k
   char *stack;
427
25.4k
   VARDECL(spx_word16_t *syn_resp);
428
429
25.4k
   spx_word32_t ener=0;
430
25.4k
   spx_word16_t fine_gain;
431
25.4k
   spx_word16_t *in = (spx_word16_t*)vin;
432
433
25.4k
   st=(EncState *)state;
434
25.4k
   stack=st->stack;
435
436
25.4k
   ALLOC(lpc, NB_ORDER, spx_coef_t);
437
25.4k
   ALLOC(bw_lpc1, NB_ORDER, spx_coef_t);
438
25.4k
   ALLOC(bw_lpc2, NB_ORDER, spx_coef_t);
439
25.4k
   ALLOC(lsp, NB_ORDER, spx_lsp_t);
440
25.4k
   ALLOC(qlsp, NB_ORDER, spx_lsp_t);
441
25.4k
   ALLOC(interp_lsp, NB_ORDER, spx_lsp_t);
442
25.4k
   ALLOC(interp_qlsp, NB_ORDER, spx_lsp_t);
443
25.4k
   ALLOC(interp_lpc, NB_ORDER, spx_coef_t);
444
25.4k
   ALLOC(interp_qlpc, NB_ORDER, spx_coef_t);
445
446
25.4k
   st->exc = st->excBuf + NB_PITCH_END + 2;
447
25.4k
   st->sw = st->swBuf + NB_PITCH_END + 2;
448
   /* Move signals 1 frame towards the past */
449
25.4k
   SPEEX_MOVE(st->excBuf, st->excBuf+NB_FRAME_SIZE, NB_PITCH_END+2);
450
25.4k
   SPEEX_MOVE(st->swBuf, st->swBuf+NB_FRAME_SIZE, NB_PITCH_END+2);
451
452
25.4k
   if (st->highpass_enabled)
453
11.1k
      highpass(in, in, NB_FRAME_SIZE, (st->isWideband?HIGHPASS_WIDEBAND:HIGHPASS_NARROWBAND)|HIGHPASS_INPUT, st->mem_hp);
454
455
25.4k
   {
456
25.4k
      VARDECL(spx_word16_t *w_sig);
457
25.4k
      VARDECL(spx_word16_t *autocorr);
458
25.4k
      ALLOC(w_sig, NB_WINDOW_SIZE, spx_word16_t);
459
25.4k
      ALLOC(autocorr, NB_ORDER+1, spx_word16_t);
460
      /* Window for analysis */
461
1.04M
      for (i=0;i<NB_WINDOW_SIZE-NB_FRAME_SIZE;i++)
462
1.01M
         w_sig[i] = MULT16_16_Q15(st->winBuf[i],st->window[i]);
463
4.09M
      for (;i<NB_WINDOW_SIZE;i++)
464
4.06M
         w_sig[i] = MULT16_16_Q15(in[i-NB_WINDOW_SIZE+NB_FRAME_SIZE],st->window[i]);
465
      /* Compute auto-correlation */
466
25.4k
      _spx_autocorr(w_sig, autocorr, NB_ORDER+1, NB_WINDOW_SIZE);
467
25.4k
      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
305k
      for (i=0;i<NB_ORDER+1;i++)
471
279k
         autocorr[i] = MULT16_16_Q15(autocorr[i],st->lagWindow[i]);
472
25.4k
      autocorr[0] = ADD16(autocorr[0],1);
473
474
      /* Levinson-Durbin */
475
25.4k
      _spx_lpc(lpc, autocorr, NB_ORDER);
476
      /* LPC to LSPs (x-domain) transform */
477
25.4k
      roots=lpc_to_lsp (lpc, NB_ORDER, lsp, 10, LSP_DELTA1, stack);
478
      /* Check if we found all the roots */
479
25.4k
      if (roots!=NB_ORDER)
480
85
      {
481
         /*If we can't find all LSP's, do some damage control and use previous filter*/
482
935
         for (i=0;i<NB_ORDER;i++)
483
850
         {
484
850
            lsp[i]=st->old_lsp[i];
485
850
         }
486
85
      }
487
25.4k
   }
488
489
490
491
492
   /* Whole frame analysis (open-loop estimation of pitch and excitation gain) */
493
25.4k
   {
494
25.4k
      int diff = NB_WINDOW_SIZE-NB_FRAME_SIZE;
495
25.4k
      if (st->first)
496
56.1k
         for (i=0;i<NB_ORDER;i++)
497
51.0k
            interp_lsp[i] = lsp[i];
498
20.3k
      else
499
20.3k
         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
25.4k
      lsp_to_lpc(interp_lsp, interp_lpc, NB_ORDER,stack);
503
504
505
      /*Open-loop pitch*/
506
25.4k
      if (!st->submodes[st->submodeID] || (st->complexity>2 && SUBMODE(have_subframe_gain)<3) || SUBMODE(forced_pitch_gain) || SUBMODE(lbr_pitch) != -1
507
5.66k
#ifndef DISABLE_VBR
508
5.66k
           || st->vbr_enabled || st->vad_enabled
509
25.4k
#endif
510
25.4k
                  )
511
23.4k
      {
512
23.4k
         int nol_pitch[6];
513
23.4k
         spx_word16_t nol_pitch_coef[6];
514
515
23.4k
         bw_lpc(QCONST16(0.9,15), interp_lpc, bw_lpc1, NB_ORDER);
516
23.4k
         bw_lpc(QCONST16(0.55,15), interp_lpc, bw_lpc2, NB_ORDER);
517
518
23.4k
         SPEEX_COPY(st->sw, st->winBuf, diff);
519
23.4k
         SPEEX_COPY(st->sw+diff, in, NB_FRAME_SIZE-diff);
520
23.4k
         filter10(st->sw, bw_lpc1, bw_lpc2, st->sw, NB_FRAME_SIZE, st->mem_sw_whole, stack);
521
522
23.4k
         open_loop_nbest_pitch(st->sw, NB_PITCH_START, NB_PITCH_END, NB_FRAME_SIZE,
523
23.4k
                               nol_pitch, nol_pitch_coef, 6, stack);
524
23.4k
         ol_pitch=nol_pitch[0];
525
23.4k
         ol_pitch_coef = nol_pitch_coef[0];
526
         /*Try to remove pitch multiples*/
527
140k
         for (i=1;i<6;i++)
528
117k
         {
529
#ifdef FIXED_POINT
530
77.6k
            if ((nol_pitch_coef[i]>MULT16_16_Q15(nol_pitch_coef[0],27853)) &&
531
#else
532
39.3k
            if ((nol_pitch_coef[i]>.85*nol_pitch_coef[0]) &&
533
10.5k
#endif
534
26.8k
                (ABS(2*nol_pitch[i]-ol_pitch)<=2 || ABS(3*nol_pitch[i]-ol_pitch)<=3 ||
535
26.1k
                 ABS(4*nol_pitch[i]-ol_pitch)<=4 || ABS(5*nol_pitch[i]-ol_pitch)<=5))
536
1.03k
            {
537
               /*ol_pitch_coef=nol_pitch_coef[i];*/
538
1.03k
               ol_pitch = nol_pitch[i];
539
1.03k
            }
540
117k
         }
541
         /*if (ol_pitch>50)
542
           ol_pitch/=2;*/
543
         /*ol_pitch_coef = sqrt(ol_pitch_coef);*/
544
545
23.4k
      } else {
546
2.03k
         ol_pitch=0;
547
2.03k
         ol_pitch_coef=0;
548
2.03k
      }
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
25.4k
      fir_mem16(st->winBuf, interp_lpc, st->exc, diff, NB_ORDER, st->mem_exc, stack);
554
25.4k
      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
25.4k
      {
558
25.4k
         spx_word16_t g = compute_rms16(st->exc, NB_FRAME_SIZE);
559
25.4k
         if (st->submodeID!=1 && ol_pitch>0)
560
11.4k
            ol_gain = MULT16_16(g, MULT16_16_Q14(QCONST16(1.1,14),
561
25.4k
                                spx_sqrt(QCONST32(1.,28)-MULT16_32_Q15(QCONST16(.8,15),SHL32(MULT16_16(ol_pitch_coef,ol_pitch_coef),16)))));
562
14.0k
         else
563
14.0k
            ol_gain = SHL32(EXTEND32(g),SIG_SHIFT);
564
25.4k
      }
565
25.4k
   }
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
25.4k
#ifndef DISABLE_VBR
578
25.4k
   if (st->vbr_enabled||st->vad_enabled)
579
20.1k
   {
580
20.1k
      float lsp_dist=0;
581
221k
      for (i=0;i<NB_ORDER;i++)
582
201k
         lsp_dist += (st->old_lsp[i] - lsp[i])*(st->old_lsp[i] - lsp[i]);
583
20.1k
      lsp_dist /= LSP_SCALING*LSP_SCALING;
584
585
20.1k
      if (st->abr_enabled)
586
5.15k
      {
587
5.15k
         float qual_change=0;
588
5.15k
         if (st->abr_drift2 * st->abr_drift > 0)
589
4.63k
         {
590
            /* Only adapt if long-term and short-term drift are the same sign */
591
4.63k
            qual_change = -.00001*st->abr_drift/(1+st->abr_count);
592
4.63k
            if (qual_change>.05)
593
0
               qual_change=.05;
594
4.63k
            if (qual_change<-.05)
595
1.14k
               qual_change=-.05;
596
4.63k
         }
597
5.15k
         st->vbr_quality += qual_change;
598
5.15k
         if (st->vbr_quality>10)
599
0
            st->vbr_quality=10;
600
5.15k
         if (st->vbr_quality<0)
601
4.63k
            st->vbr_quality=0;
602
5.15k
      }
603
604
20.1k
      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
20.1k
      if (st->vbr_enabled)
608
16.0k
      {
609
16.0k
         spx_int32_t mode;
610
16.0k
         int choice=0;
611
16.0k
         float min_diff=100;
612
16.0k
         mode = 8;
613
144k
         while (mode)
614
128k
         {
615
128k
            int v1;
616
128k
            float thresh;
617
128k
            v1=(int)floor(st->vbr_quality);
618
128k
            if (v1==10)
619
6.48k
               thresh = vbr_nb_thresh[mode][v1];
620
121k
            else
621
121k
               thresh = (st->vbr_quality-v1)*vbr_nb_thresh[mode][v1+1] + (1+v1-st->vbr_quality)*vbr_nb_thresh[mode][v1];
622
128k
            if (st->relative_quality > thresh &&
623
35.7k
                st->relative_quality-thresh<min_diff)
624
16.7k
            {
625
16.7k
               choice = mode;
626
16.7k
               min_diff = st->relative_quality-thresh;
627
16.7k
            }
628
128k
            mode--;
629
128k
         }
630
16.0k
         mode=choice;
631
16.0k
         if (mode==0)
632
4.62k
         {
633
4.62k
            if (st->dtx_count==0 || lsp_dist>.05 || !st->dtx_enabled || st->dtx_count>20)
634
2.82k
            {
635
2.82k
               mode=1;
636
2.82k
               st->dtx_count=1;
637
2.82k
            } else {
638
1.79k
               mode=0;
639
1.79k
               st->dtx_count++;
640
1.79k
            }
641
11.3k
         } else {
642
11.3k
            st->dtx_count=0;
643
11.3k
         }
644
645
16.0k
         speex_encoder_ctl(state, SPEEX_SET_MODE, &mode);
646
16.0k
         if (st->vbr_max>0)
647
12.0k
         {
648
12.0k
            spx_int32_t rate;
649
12.0k
            speex_encoder_ctl(state, SPEEX_GET_BITRATE, &rate);
650
12.0k
            if (rate > st->vbr_max)
651
4.53k
            {
652
4.53k
               rate = st->vbr_max;
653
4.53k
               speex_encoder_ctl(state, SPEEX_SET_BITRATE, &rate);
654
4.53k
            }
655
12.0k
         }
656
657
16.0k
         if (st->abr_enabled)
658
5.15k
         {
659
5.15k
            spx_int32_t bitrate;
660
5.15k
            speex_encoder_ctl(state, SPEEX_GET_BITRATE, &bitrate);
661
5.15k
            st->abr_drift+=(bitrate-st->abr_enabled);
662
5.15k
            st->abr_drift2 = .95*st->abr_drift2 + .05*(bitrate-st->abr_enabled);
663
5.15k
            st->abr_count += 1.0;
664
5.15k
         }
665
666
16.0k
      } else {
667
         /*VAD only case*/
668
4.09k
         int mode;
669
4.09k
         if (st->relative_quality<2)
670
1.29k
         {
671
1.29k
            if (st->dtx_count==0 || lsp_dist>.05 || !st->dtx_enabled || st->dtx_count>20)
672
850
            {
673
850
               st->dtx_count=1;
674
850
               mode=1;
675
850
            } else {
676
444
               mode=0;
677
444
               st->dtx_count++;
678
444
            }
679
2.80k
         } else {
680
2.80k
            st->dtx_count = 0;
681
2.80k
            mode=st->submodeSelect;
682
2.80k
         }
683
         /*speex_encoder_ctl(state, SPEEX_SET_MODE, &mode);*/
684
4.09k
         st->submodeID=mode;
685
4.09k
      }
686
20.1k
   } else {
687
5.32k
      st->relative_quality = -1;
688
5.32k
   }
689
25.4k
#endif /* #ifndef DISABLE_VBR */
690
691
25.4k
   if (st->encode_submode)
692
25.4k
   {
693
      /* First, transmit a zero for narrowband */
694
25.4k
      speex_bits_pack(bits, 0, 1);
695
696
      /* Transmit the sub-mode we use for this frame */
697
25.4k
      speex_bits_pack(bits, st->submodeID, NB_SUBMODE_BITS);
698
699
25.4k
   }
700
701
   /* If null mode (no transmission), just set a couple things to zero*/
702
25.4k
   if (st->submodes[st->submodeID] == NULL)
703
2.04k
   {
704
329k
      for (i=0;i<NB_FRAME_SIZE;i++)
705
327k
         st->exc[i]=st->sw[i]=VERY_SMALL;
706
707
22.5k
      for (i=0;i<NB_ORDER;i++)
708
20.4k
         st->mem_sw[i]=0;
709
2.04k
      st->first=1;
710
2.04k
      st->bounded_pitch = 1;
711
712
2.04k
      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
22.5k
      for (i=0;i<NB_ORDER;i++)
716
20.4k
         st->mem_sp[i] = 0;
717
2.04k
      return 0;
718
719
2.04k
   }
720
721
   /* LSP Quantization */
722
23.3k
   if (st->first)
723
3.65k
   {
724
40.2k
      for (i=0;i<NB_ORDER;i++)
725
36.5k
         st->old_lsp[i] = lsp[i];
726
3.65k
   }
727
728
729
   /*Quantize LSPs*/
730
23.3k
#if 1 /*0 for unquantized*/
731
23.3k
   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
23.3k
   if (SUBMODE(lbr_pitch)!=-1)
739
15.5k
   {
740
15.5k
      speex_bits_pack(bits, ol_pitch-NB_PITCH_START, 7);
741
15.5k
   }
742
743
23.3k
   if (SUBMODE(forced_pitch_gain))
744
14.2k
   {
745
14.2k
      int quant;
746
      /* This just damps the pitch a bit, because it tends to be too aggressive when forced */
747
14.2k
      ol_pitch_coef = MULT16_16_Q15(QCONST16(.9,15), ol_pitch_coef);
748
#ifdef FIXED_POINT
749
9.39k
      quant = PSHR16(MULT16_16_16(15, ol_pitch_coef),GAIN_SHIFT);
750
#else
751
4.85k
      quant = (int)floor(.5+15*ol_pitch_coef*GAIN_SCALING_1);
752
#endif
753
14.2k
      if (quant>15)
754
100
         quant=15;
755
14.2k
      if (quant<0)
756
0
         quant=0;
757
14.2k
      speex_bits_pack(bits, quant, 4);
758
14.2k
      ol_pitch_coef=MULT16_16_P15(QCONST16(0.066667,15),SHL16(quant,GAIN_SHIFT));
759
14.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
15.9k
      ol_gain = MULT16_32_Q15(28406,ol_gain_table[qe]);
768
      speex_bits_pack(bits, qe, 5);
769
   }
770
#else
771
   {
772
7.42k
      int qe = (int)(floor(.5+3.5*log(ol_gain*1.0/SIG_SCALING)));
773
7.42k
      if (qe<0)
774
4.85k
         qe=0;
775
7.42k
      if (qe>31)
776
422
         qe=31;
777
7.42k
      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
23.3k
   if (st->first)
786
3.65k
   {
787
40.2k
      for (i=0;i<NB_ORDER;i++)
788
36.5k
         st->old_qlsp[i] = qlsp[i];
789
3.65k
   }
790
791
   /* Target signal */
792
23.3k
   ALLOC(target, NB_SUBFRAME_SIZE, spx_word16_t);
793
23.3k
   ALLOC(innov, NB_SUBFRAME_SIZE, spx_sig_t);
794
23.3k
   ALLOC(exc32, NB_SUBFRAME_SIZE, spx_word32_t);
795
23.3k
   ALLOC(syn_resp, NB_SUBFRAME_SIZE, spx_word16_t);
796
23.3k
   ALLOC(mem, NB_ORDER, spx_mem_t);
797
798
   /* Loop on sub-frames */
799
116k
   for (sub=0;sub<NB_NB_SUBFRAMES;sub++)
800
93.5k
   {
801
93.5k
      int   offset;
802
93.5k
      spx_word16_t *sw;
803
93.5k
      spx_word16_t *exc, *inBuf;
804
93.5k
      int pitch;
805
93.5k
      int response_bound = NB_SUBFRAME_SIZE;
806
807
      /* Offset relative to start of frame */
808
93.5k
      offset = NB_SUBFRAME_SIZE*sub;
809
      /* Excitation */
810
93.5k
      exc=st->exc+offset;
811
      /* Weighted signal */
812
93.5k
      sw=st->sw+offset;
813
814
      /* LSP interpolation (quantized and unquantized) */
815
93.5k
      lsp_interpolate(st->old_lsp, lsp, interp_lsp, NB_ORDER, sub, NB_NB_SUBFRAMES, LSP_MARGIN);
816
93.5k
      lsp_interpolate(st->old_qlsp, qlsp, interp_qlsp, NB_ORDER, sub, NB_NB_SUBFRAMES, LSP_MARGIN);
817
818
      /* Compute interpolated LPCs (quantized and unquantized) */
819
93.5k
      lsp_to_lpc(interp_lsp, interp_lpc, NB_ORDER,stack);
820
821
93.5k
      lsp_to_lpc(interp_qlsp, interp_qlpc, NB_ORDER, stack);
822
823
      /* Compute analysis filter gain at w=pi (for use in SB-CELP) */
824
93.5k
      {
825
93.5k
         spx_word32_t pi_g=LPC_SCALING;
826
561k
         for (i=0;i<NB_ORDER;i+=2)
827
467k
         {
828
            /*pi_g += -st->interp_qlpc[i] +  st->interp_qlpc[i+1];*/
829
467k
            pi_g = ADD32(pi_g, SUB32(EXTEND32(interp_qlpc[i+1]),EXTEND32(interp_qlpc[i])));
830
467k
         }
831
93.5k
         st->pi_gain[sub] = pi_g;
832
93.5k
      }
833
834
#ifdef VORBIS_PSYCHO
835
      {
836
         float curr_curve[128];
837
         float fact = ((float)sub+1.0f)/NB_NB_SUBFRAMES;
838
         for (i=0;i<128;i++)
839
            curr_curve[i] = (1.0f-fact)*st->old_curve[i] + fact*st->curve[i];
840
         curve_to_lpc(st->psy, curr_curve, bw_lpc1, bw_lpc2, 10);
841
      }
842
#else
843
      /* Compute bandwidth-expanded (unquantized) LPCs for perceptual weighting */
844
93.5k
      bw_lpc(st->gamma1, interp_lpc, bw_lpc1, NB_ORDER);
845
93.5k
      bw_lpc(st->gamma2, interp_lpc, bw_lpc2, NB_ORDER);
846
      /*print_vec(st->bw_lpc1, 10, "bw_lpc");*/
847
93.5k
#endif
848
849
      /*FIXME: This will break if we change the window size */
850
93.5k
      speex_assert(NB_WINDOW_SIZE-NB_FRAME_SIZE == NB_SUBFRAME_SIZE);
851
93.5k
      if (sub==0)
852
23.3k
         inBuf = st->winBuf;
853
70.1k
      else
854
70.1k
         inBuf = &in[((sub-1)*NB_SUBFRAME_SIZE)];
855
3.83M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
856
3.74M
         sw[i] = inBuf[i];
857
858
93.5k
      if (st->complexity==0)
859
19.2k
         response_bound >>= 1;
860
93.5k
      compute_impulse_response(interp_qlpc, bw_lpc1, bw_lpc2, syn_resp, response_bound, NB_ORDER, stack);
861
479k
      for (i=response_bound;i<NB_SUBFRAME_SIZE;i++)
862
385k
         syn_resp[i]=VERY_SMALL;
863
864
      /* Compute zero response of A(z/g1) / ( A(z/g2) * A(z) ) */
865
1.02M
      for (i=0;i<NB_ORDER;i++)
866
935k
         mem[i]=SHL32(st->mem_sp[i],1);
867
3.83M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
868
3.74M
         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
93.5k
      iir_mem16(exc, interp_qlpc, exc, NB_SUBFRAME_SIZE, NB_ORDER, mem, stack);
877
1.02M
      for (i=0;i<NB_ORDER;i++)
878
935k
         mem[i]=SHL32(st->mem_sw[i],1);
879
93.5k
      filter10(exc, bw_lpc1, bw_lpc2, exc, NB_SUBFRAME_SIZE, mem, stack);
880
93.5k
#endif
881
882
      /* Compute weighted signal */
883
1.02M
      for (i=0;i<NB_ORDER;i++)
884
935k
         mem[i]=st->mem_sw[i];
885
93.5k
      filter10(sw, bw_lpc1, bw_lpc2, sw, NB_SUBFRAME_SIZE, mem, stack);
886
887
93.5k
      if (st->complexity==0)
888
212k
         for (i=0;i<NB_ORDER;i++)
889
192k
            st->mem_sw[i]=mem[i];
890
891
      /* Compute target signal (saturation prevents overflows on clipped input speech) */
892
3.83M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
893
3.74M
         target[i]=EXTRACT16(SATURATE(SUB32(sw[i],PSHR32(exc[i],1)),32767));
894
895
3.83M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
896
3.74M
         exc[i] = inBuf[i];
897
93.5k
      fir_mem16(exc, interp_qlpc, exc, NB_SUBFRAME_SIZE, NB_ORDER, st->mem_exc2, stack);
898
      /* If we have a long-term predictor (otherwise, something's wrong) */
899
93.5k
      speex_assert (SUBMODE(ltp_quant));
900
93.5k
      {
901
93.5k
         int pit_min, pit_max;
902
         /* Long-term prediction */
903
93.5k
         if (SUBMODE(lbr_pitch) != -1)
904
62.1k
         {
905
            /* Low bit-rate pitch handling */
906
62.1k
            int margin;
907
62.1k
            margin = SUBMODE(lbr_pitch);
908
62.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
62.1k
            } else {
917
62.1k
               pit_min=pit_max=ol_pitch;
918
62.1k
            }
919
62.1k
         } else {
920
31.4k
            pit_min = NB_PITCH_START;
921
31.4k
            pit_max = NB_PITCH_END;
922
31.4k
         }
923
924
         /* Force pitch to use only the current frame if needed */
925
93.5k
         if (st->bounded_pitch && pit_max>offset)
926
28.6k
            pit_max=offset;
927
928
         /* Perform pitch search */
929
93.5k
         pitch = SUBMODE(ltp_quant)(target, sw, interp_qlpc, bw_lpc1, bw_lpc2,
930
93.5k
                                    exc32, SUBMODE(ltp_params), pit_min, pit_max, ol_pitch_coef,
931
93.5k
                                    NB_ORDER, NB_SUBFRAME_SIZE, bits, stack,
932
93.5k
                                    exc, syn_resp, st->complexity, 0, st->plc_tuning, &st->cumul_gain);
933
934
93.5k
         st->pitch[sub]=pitch;
935
93.5k
      }
936
      /* Quantization of innovation */
937
93.5k
      SPEEX_MEMSET(innov, 0, NB_SUBFRAME_SIZE);
938
939
      /* FIXME: Make sure this is safe from overflows (so far so good) */
940
3.83M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
941
3.74M
         exc[i] = EXTRACT16(SUB32(EXTEND32(exc[i]), PSHR32(exc32[i],SIG_SHIFT-1)));
942
943
93.5k
      ener = SHL32(EXTEND32(compute_rms16(exc, NB_SUBFRAME_SIZE)),SIG_SHIFT);
944
945
      /*FIXME: Should use DIV32_16 and make sure result fits in 16 bits */
946
#ifdef FIXED_POINT
947
      {
948
63.8k
         spx_word32_t f = PDIV32(ener,PSHR32(ol_gain,SIG_SHIFT));
949
63.8k
         if (f<=32767)
950
59.0k
            fine_gain = f;
951
4.76k
         else
952
4.76k
            fine_gain = 32767;
953
      }
954
#else
955
29.7k
      fine_gain = PDIV32_16(ener,PSHR32(ol_gain,SIG_SHIFT));
956
#endif
957
      /* Calculate gain correction for the sub-frame (if any) */
958
93.5k
      if (SUBMODE(have_subframe_gain))
959
31.4k
      {
960
31.4k
         int qe;
961
31.4k
         if (SUBMODE(have_subframe_gain)==3)
962
17.9k
         {
963
17.9k
            qe = scal_quant(fine_gain, exc_gain_quant_scal3_bound, 8);
964
17.9k
            speex_bits_pack(bits, qe, 3);
965
17.9k
            ener=MULT16_32_Q14(exc_gain_quant_scal3[qe],ol_gain);
966
17.9k
         } else {
967
13.4k
            qe = scal_quant(fine_gain, exc_gain_quant_scal1_bound, 2);
968
13.4k
            speex_bits_pack(bits, qe, 1);
969
13.4k
            ener=MULT16_32_Q14(exc_gain_quant_scal1[qe],ol_gain);
970
13.4k
         }
971
62.1k
      } else {
972
62.1k
         ener=ol_gain;
973
62.1k
      }
974
975
      /*printf ("%f %f\n", ener, ol_gain);*/
976
977
      /* Normalize innovation */
978
93.5k
      signal_div(target, target, ener, NB_SUBFRAME_SIZE);
979
980
      /* Quantize innovation */
981
93.5k
      speex_assert (SUBMODE(innovation_quant));
982
93.5k
      {
983
         /* Codebook search */
984
93.5k
         SUBMODE(innovation_quant)(target, interp_qlpc, bw_lpc1, bw_lpc2,
985
93.5k
                  SUBMODE(innovation_params), NB_ORDER, NB_SUBFRAME_SIZE,
986
93.5k
                  innov, syn_resp, bits, stack, st->complexity, SUBMODE(double_codebook));
987
988
         /* De-normalize innovation and update excitation */
989
93.5k
         signal_mul(innov, innov, ener, NB_SUBFRAME_SIZE);
990
991
         /* In some (rare) modes, we do a second search (more bits) to reduce noise even more */
992
93.5k
         if (SUBMODE(double_codebook)) {
993
2.85k
            char *tmp_stack=stack;
994
2.85k
            VARDECL(spx_sig_t *innov2);
995
2.85k
            ALLOC(innov2, NB_SUBFRAME_SIZE, spx_sig_t);
996
2.85k
            SPEEX_MEMSET(innov2, 0, NB_SUBFRAME_SIZE);
997
117k
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
998
114k
               target[i]=MULT16_16_P13(QCONST16(2.2f,13), target[i]);
999
2.85k
            SUBMODE(innovation_quant)(target, interp_qlpc, bw_lpc1, bw_lpc2,
1000
2.85k
                                      SUBMODE(innovation_params), NB_ORDER, NB_SUBFRAME_SIZE,
1001
2.85k
                                      innov2, syn_resp, bits, stack, st->complexity, 0);
1002
2.85k
            signal_mul(innov2, innov2, MULT16_32_Q15(QCONST16(0.454545f,15),ener), NB_SUBFRAME_SIZE);
1003
117k
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
1004
114k
               innov[i] = ADD32(innov[i],innov2[i]);
1005
2.85k
            stack = tmp_stack;
1006
2.85k
         }
1007
3.83M
         for (i=0;i<NB_SUBFRAME_SIZE;i++)
1008
3.74M
            exc[i] = EXTRACT16(SATURATE32(PSHR32(ADD32(SHL32(exc32[i],1),innov[i]),SIG_SHIFT),32767));
1009
93.5k
         if (st->innov_rms_save)
1010
27.6k
            st->innov_rms_save[sub] = compute_rms(innov, NB_SUBFRAME_SIZE);
1011
93.5k
      }
1012
1013
      /* Final signal synthesis from excitation */
1014
93.5k
      iir_mem16(exc, interp_qlpc, sw, NB_SUBFRAME_SIZE, NB_ORDER, st->mem_sp, stack);
1015
1016
      /* Compute weighted signal again, from synthesized speech (not sure it's the right thing) */
1017
93.5k
      if (st->complexity!=0)
1018
74.2k
         filter10(sw, bw_lpc1, bw_lpc2, sw, NB_SUBFRAME_SIZE, st->mem_sw, stack);
1019
1020
93.5k
   }
1021
1022
   /* Store the LSPs for interpolation in the next frame */
1023
23.3k
   if (st->submodeID>=1)
1024
23.3k
   {
1025
257k
      for (i=0;i<NB_ORDER;i++)
1026
233k
         st->old_lsp[i] = lsp[i];
1027
257k
      for (i=0;i<NB_ORDER;i++)
1028
233k
         st->old_qlsp[i] = qlsp[i];
1029
23.3k
   }
1030
1031
#ifdef VORBIS_PSYCHO
1032
   if (st->submodeID>=1)
1033
      SPEEX_COPY(st->old_curve, st->curve, 128);
1034
#endif
1035
1036
23.3k
   if (st->submodeID==1)
1037
11.9k
   {
1038
11.9k
#ifndef DISABLE_VBR
1039
11.9k
      if (st->dtx_count)
1040
3.86k
         speex_bits_pack(bits, 15, 4);
1041
8.04k
      else
1042
8.04k
#endif
1043
8.04k
         speex_bits_pack(bits, 0, 4);
1044
11.9k
   }
1045
1046
   /* The next frame will not be the first (Duh!) */
1047
23.3k
   st->first = 0;
1048
23.3k
   SPEEX_COPY(st->winBuf, in+2*NB_FRAME_SIZE-NB_WINDOW_SIZE, NB_WINDOW_SIZE-NB_FRAME_SIZE);
1049
1050
23.3k
   if (SUBMODE(innovation_quant) == noise_codebook_quant || st->submodeID==0)
1051
11.9k
      st->bounded_pitch = 1;
1052
11.4k
   else
1053
11.4k
      st->bounded_pitch = 0;
1054
1055
23.3k
   return 1;
1056
25.4k
}
nb_encode
Line
Count
Source
407
8.51k
{
408
8.51k
   EncState *st;
409
8.51k
   int i, sub, roots;
410
8.51k
   int ol_pitch;
411
8.51k
   spx_word16_t ol_pitch_coef;
412
8.51k
   spx_word32_t ol_gain;
413
8.51k
   VARDECL(spx_word16_t *target);
414
8.51k
   VARDECL(spx_sig_t *innov);
415
8.51k
   VARDECL(spx_word32_t *exc32);
416
8.51k
   VARDECL(spx_mem_t *mem);
417
8.51k
   VARDECL(spx_coef_t *bw_lpc1);
418
8.51k
   VARDECL(spx_coef_t *bw_lpc2);
419
8.51k
   VARDECL(spx_coef_t *lpc);
420
8.51k
   VARDECL(spx_lsp_t *lsp);
421
8.51k
   VARDECL(spx_lsp_t *qlsp);
422
8.51k
   VARDECL(spx_lsp_t *interp_lsp);
423
8.51k
   VARDECL(spx_lsp_t *interp_qlsp);
424
8.51k
   VARDECL(spx_coef_t *interp_lpc);
425
8.51k
   VARDECL(spx_coef_t *interp_qlpc);
426
8.51k
   char *stack;
427
8.51k
   VARDECL(spx_word16_t *syn_resp);
428
429
8.51k
   spx_word32_t ener=0;
430
8.51k
   spx_word16_t fine_gain;
431
8.51k
   spx_word16_t *in = (spx_word16_t*)vin;
432
433
8.51k
   st=(EncState *)state;
434
8.51k
   stack=st->stack;
435
436
8.51k
   ALLOC(lpc, NB_ORDER, spx_coef_t);
437
8.51k
   ALLOC(bw_lpc1, NB_ORDER, spx_coef_t);
438
8.51k
   ALLOC(bw_lpc2, NB_ORDER, spx_coef_t);
439
8.51k
   ALLOC(lsp, NB_ORDER, spx_lsp_t);
440
8.51k
   ALLOC(qlsp, NB_ORDER, spx_lsp_t);
441
8.51k
   ALLOC(interp_lsp, NB_ORDER, spx_lsp_t);
442
8.51k
   ALLOC(interp_qlsp, NB_ORDER, spx_lsp_t);
443
8.51k
   ALLOC(interp_lpc, NB_ORDER, spx_coef_t);
444
8.51k
   ALLOC(interp_qlpc, NB_ORDER, spx_coef_t);
445
446
8.51k
   st->exc = st->excBuf + NB_PITCH_END + 2;
447
8.51k
   st->sw = st->swBuf + NB_PITCH_END + 2;
448
   /* Move signals 1 frame towards the past */
449
8.51k
   SPEEX_MOVE(st->excBuf, st->excBuf+NB_FRAME_SIZE, NB_PITCH_END+2);
450
8.51k
   SPEEX_MOVE(st->swBuf, st->swBuf+NB_FRAME_SIZE, NB_PITCH_END+2);
451
452
8.51k
   if (st->highpass_enabled)
453
4.70k
      highpass(in, in, NB_FRAME_SIZE, (st->isWideband?HIGHPASS_WIDEBAND:HIGHPASS_NARROWBAND)|HIGHPASS_INPUT, st->mem_hp);
454
455
8.51k
   {
456
8.51k
      VARDECL(spx_word16_t *w_sig);
457
8.51k
      VARDECL(spx_word16_t *autocorr);
458
8.51k
      ALLOC(w_sig, NB_WINDOW_SIZE, spx_word16_t);
459
8.51k
      ALLOC(autocorr, NB_ORDER+1, spx_word16_t);
460
      /* Window for analysis */
461
349k
      for (i=0;i<NB_WINDOW_SIZE-NB_FRAME_SIZE;i++)
462
340k
         w_sig[i] = MULT16_16_Q15(st->winBuf[i],st->window[i]);
463
1.37M
      for (;i<NB_WINDOW_SIZE;i++)
464
1.36M
         w_sig[i] = MULT16_16_Q15(in[i-NB_WINDOW_SIZE+NB_FRAME_SIZE],st->window[i]);
465
      /* Compute auto-correlation */
466
8.51k
      _spx_autocorr(w_sig, autocorr, NB_ORDER+1, NB_WINDOW_SIZE);
467
8.51k
      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
102k
      for (i=0;i<NB_ORDER+1;i++)
471
93.6k
         autocorr[i] = MULT16_16_Q15(autocorr[i],st->lagWindow[i]);
472
8.51k
      autocorr[0] = ADD16(autocorr[0],1);
473
474
      /* Levinson-Durbin */
475
8.51k
      _spx_lpc(lpc, autocorr, NB_ORDER);
476
      /* LPC to LSPs (x-domain) transform */
477
8.51k
      roots=lpc_to_lsp (lpc, NB_ORDER, lsp, 10, LSP_DELTA1, stack);
478
      /* Check if we found all the roots */
479
8.51k
      if (roots!=NB_ORDER)
480
43
      {
481
         /*If we can't find all LSP's, do some damage control and use previous filter*/
482
473
         for (i=0;i<NB_ORDER;i++)
483
430
         {
484
430
            lsp[i]=st->old_lsp[i];
485
430
         }
486
43
      }
487
8.51k
   }
488
489
490
491
492
   /* Whole frame analysis (open-loop estimation of pitch and excitation gain) */
493
8.51k
   {
494
8.51k
      int diff = NB_WINDOW_SIZE-NB_FRAME_SIZE;
495
8.51k
      if (st->first)
496
22.6k
         for (i=0;i<NB_ORDER;i++)
497
20.6k
            interp_lsp[i] = lsp[i];
498
6.45k
      else
499
6.45k
         lsp_interpolate(st->old_lsp, lsp, interp_lsp, NB_ORDER, NB_NB_SUBFRAMES, NB_NB_SUBFRAMES<<1, LSP_MARGIN);
500
501
      /* Compute interpolated LPCs (unquantized) for whole frame*/
502
8.51k
      lsp_to_lpc(interp_lsp, interp_lpc, NB_ORDER,stack);
503
504
505
      /*Open-loop pitch*/
506
8.51k
      if (!st->submodes[st->submodeID] || (st->complexity>2 && SUBMODE(have_subframe_gain)<3) || SUBMODE(forced_pitch_gain) || SUBMODE(lbr_pitch) != -1
507
1.71k
#ifndef DISABLE_VBR
508
1.71k
           || st->vbr_enabled || st->vad_enabled
509
8.51k
#endif
510
8.51k
                  )
511
7.86k
      {
512
7.86k
         int nol_pitch[6];
513
7.86k
         spx_word16_t nol_pitch_coef[6];
514
515
7.86k
         bw_lpc(QCONST16(0.9,15), interp_lpc, bw_lpc1, NB_ORDER);
516
7.86k
         bw_lpc(QCONST16(0.55,15), interp_lpc, bw_lpc2, NB_ORDER);
517
518
7.86k
         SPEEX_COPY(st->sw, st->winBuf, diff);
519
7.86k
         SPEEX_COPY(st->sw+diff, in, NB_FRAME_SIZE-diff);
520
7.86k
         filter10(st->sw, bw_lpc1, bw_lpc2, st->sw, NB_FRAME_SIZE, st->mem_sw_whole, stack);
521
522
7.86k
         open_loop_nbest_pitch(st->sw, NB_PITCH_START, NB_PITCH_END, NB_FRAME_SIZE,
523
7.86k
                               nol_pitch, nol_pitch_coef, 6, stack);
524
7.86k
         ol_pitch=nol_pitch[0];
525
7.86k
         ol_pitch_coef = nol_pitch_coef[0];
526
         /*Try to remove pitch multiples*/
527
47.1k
         for (i=1;i<6;i++)
528
39.3k
         {
529
#ifdef FIXED_POINT
530
            if ((nol_pitch_coef[i]>MULT16_16_Q15(nol_pitch_coef[0],27853)) &&
531
#else
532
39.3k
            if ((nol_pitch_coef[i]>.85*nol_pitch_coef[0]) &&
533
10.5k
#endif
534
10.5k
                (ABS(2*nol_pitch[i]-ol_pitch)<=2 || ABS(3*nol_pitch[i]-ol_pitch)<=3 ||
535
10.4k
                 ABS(4*nol_pitch[i]-ol_pitch)<=4 || ABS(5*nol_pitch[i]-ol_pitch)<=5))
536
256
            {
537
               /*ol_pitch_coef=nol_pitch_coef[i];*/
538
256
               ol_pitch = nol_pitch[i];
539
256
            }
540
39.3k
         }
541
         /*if (ol_pitch>50)
542
           ol_pitch/=2;*/
543
         /*ol_pitch_coef = sqrt(ol_pitch_coef);*/
544
545
7.86k
      } else {
546
655
         ol_pitch=0;
547
655
         ol_pitch_coef=0;
548
655
      }
549
550
      /*Compute "real" excitation*/
551
      /*SPEEX_COPY(st->exc, st->winBuf, diff);
552
      SPEEX_COPY(st->exc+diff, in, NB_FRAME_SIZE-diff);*/
553
8.51k
      fir_mem16(st->winBuf, interp_lpc, st->exc, diff, NB_ORDER, st->mem_exc, stack);
554
8.51k
      fir_mem16(in, interp_lpc, st->exc+diff, NB_FRAME_SIZE-diff, NB_ORDER, st->mem_exc, stack);
555
556
      /* Compute open-loop excitation gain */
557
8.51k
      {
558
8.51k
         spx_word16_t g = compute_rms16(st->exc, NB_FRAME_SIZE);
559
8.51k
         if (st->submodeID!=1 && ol_pitch>0)
560
3.85k
            ol_gain = MULT16_16(g, MULT16_16_Q14(QCONST16(1.1,14),
561
8.51k
                                spx_sqrt(QCONST32(1.,28)-MULT16_32_Q15(QCONST16(.8,15),SHL32(MULT16_16(ol_pitch_coef,ol_pitch_coef),16)))));
562
4.66k
         else
563
4.66k
            ol_gain = SHL32(EXTEND32(g),SIG_SHIFT);
564
8.51k
      }
565
8.51k
   }
566
567
#ifdef VORBIS_PSYCHO
568
   SPEEX_MOVE(st->psy_window, st->psy_window+NB_FRAME_SIZE, 256-NB_FRAME_SIZE);
569
   SPEEX_COPY(&st->psy_window[256-NB_FRAME_SIZE], in, NB_FRAME_SIZE);
570
   compute_curve(st->psy, st->psy_window, st->curve);
571
   /*print_vec(st->curve, 128, "curve");*/
572
   if (st->first)
573
      SPEEX_COPY(st->old_curve, st->curve, 128);
574
#endif
575
576
   /*VBR stuff*/
577
8.51k
#ifndef DISABLE_VBR
578
8.51k
   if (st->vbr_enabled||st->vad_enabled)
579
6.88k
   {
580
6.88k
      float lsp_dist=0;
581
75.7k
      for (i=0;i<NB_ORDER;i++)
582
68.8k
         lsp_dist += (st->old_lsp[i] - lsp[i])*(st->old_lsp[i] - lsp[i]);
583
6.88k
      lsp_dist /= LSP_SCALING*LSP_SCALING;
584
585
6.88k
      if (st->abr_enabled)
586
1.70k
      {
587
1.70k
         float qual_change=0;
588
1.70k
         if (st->abr_drift2 * st->abr_drift > 0)
589
1.53k
         {
590
            /* Only adapt if long-term and short-term drift are the same sign */
591
1.53k
            qual_change = -.00001*st->abr_drift/(1+st->abr_count);
592
1.53k
            if (qual_change>.05)
593
0
               qual_change=.05;
594
1.53k
            if (qual_change<-.05)
595
270
               qual_change=-.05;
596
1.53k
         }
597
1.70k
         st->vbr_quality += qual_change;
598
1.70k
         if (st->vbr_quality>10)
599
0
            st->vbr_quality=10;
600
1.70k
         if (st->vbr_quality<0)
601
1.53k
            st->vbr_quality=0;
602
1.70k
      }
603
604
6.88k
      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.88k
      if (st->vbr_enabled)
608
5.52k
      {
609
5.52k
         spx_int32_t mode;
610
5.52k
         int choice=0;
611
5.52k
         float min_diff=100;
612
5.52k
         mode = 8;
613
49.7k
         while (mode)
614
44.2k
         {
615
44.2k
            int v1;
616
44.2k
            float thresh;
617
44.2k
            v1=(int)floor(st->vbr_quality);
618
44.2k
            if (v1==10)
619
4.20k
               thresh = vbr_nb_thresh[mode][v1];
620
40.0k
            else
621
40.0k
               thresh = (st->vbr_quality-v1)*vbr_nb_thresh[mode][v1+1] + (1+v1-st->vbr_quality)*vbr_nb_thresh[mode][v1];
622
44.2k
            if (st->relative_quality > thresh &&
623
9.98k
                st->relative_quality-thresh<min_diff)
624
4.70k
            {
625
4.70k
               choice = mode;
626
4.70k
               min_diff = st->relative_quality-thresh;
627
4.70k
            }
628
44.2k
            mode--;
629
44.2k
         }
630
5.52k
         mode=choice;
631
5.52k
         if (mode==0)
632
2.17k
         {
633
2.17k
            if (st->dtx_count==0 || lsp_dist>.05 || !st->dtx_enabled || st->dtx_count>20)
634
1.26k
            {
635
1.26k
               mode=1;
636
1.26k
               st->dtx_count=1;
637
1.26k
            } else {
638
904
               mode=0;
639
904
               st->dtx_count++;
640
904
            }
641
3.35k
         } else {
642
3.35k
            st->dtx_count=0;
643
3.35k
         }
644
645
5.52k
         speex_encoder_ctl(state, SPEEX_SET_MODE, &mode);
646
5.52k
         if (st->vbr_max>0)
647
4.13k
         {
648
4.13k
            spx_int32_t rate;
649
4.13k
            speex_encoder_ctl(state, SPEEX_GET_BITRATE, &rate);
650
4.13k
            if (rate > st->vbr_max)
651
1.25k
            {
652
1.25k
               rate = st->vbr_max;
653
1.25k
               speex_encoder_ctl(state, SPEEX_SET_BITRATE, &rate);
654
1.25k
            }
655
4.13k
         }
656
657
5.52k
         if (st->abr_enabled)
658
1.70k
         {
659
1.70k
            spx_int32_t bitrate;
660
1.70k
            speex_encoder_ctl(state, SPEEX_GET_BITRATE, &bitrate);
661
1.70k
            st->abr_drift+=(bitrate-st->abr_enabled);
662
1.70k
            st->abr_drift2 = .95*st->abr_drift2 + .05*(bitrate-st->abr_enabled);
663
1.70k
            st->abr_count += 1.0;
664
1.70k
         }
665
666
5.52k
      } else {
667
         /*VAD only case*/
668
1.36k
         int mode;
669
1.36k
         if (st->relative_quality<2)
670
691
         {
671
691
            if (st->dtx_count==0 || lsp_dist>.05 || !st->dtx_enabled || st->dtx_count>20)
672
444
            {
673
444
               st->dtx_count=1;
674
444
               mode=1;
675
444
            } else {
676
247
               mode=0;
677
247
               st->dtx_count++;
678
247
            }
679
691
         } else {
680
671
            st->dtx_count = 0;
681
671
            mode=st->submodeSelect;
682
671
         }
683
         /*speex_encoder_ctl(state, SPEEX_SET_MODE, &mode);*/
684
1.36k
         st->submodeID=mode;
685
1.36k
      }
686
6.88k
   } else {
687
1.63k
      st->relative_quality = -1;
688
1.63k
   }
689
8.51k
#endif /* #ifndef DISABLE_VBR */
690
691
8.51k
   if (st->encode_submode)
692
8.51k
   {
693
      /* First, transmit a zero for narrowband */
694
8.51k
      speex_bits_pack(bits, 0, 1);
695
696
      /* Transmit the sub-mode we use for this frame */
697
8.51k
      speex_bits_pack(bits, st->submodeID, NB_SUBMODE_BITS);
698
699
8.51k
   }
700
701
   /* If null mode (no transmission), just set a couple things to zero*/
702
8.51k
   if (st->submodes[st->submodeID] == NULL)
703
1.08k
   {
704
175k
      for (i=0;i<NB_FRAME_SIZE;i++)
705
174k
         st->exc[i]=st->sw[i]=VERY_SMALL;
706
707
11.9k
      for (i=0;i<NB_ORDER;i++)
708
10.8k
         st->mem_sw[i]=0;
709
1.08k
      st->first=1;
710
1.08k
      st->bounded_pitch = 1;
711
712
1.08k
      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.9k
      for (i=0;i<NB_ORDER;i++)
716
10.8k
         st->mem_sp[i] = 0;
717
1.08k
      return 0;
718
719
1.08k
   }
720
721
   /* LSP Quantization */
722
7.42k
   if (st->first)
723
1.27k
   {
724
13.9k
      for (i=0;i<NB_ORDER;i++)
725
12.7k
         st->old_lsp[i] = lsp[i];
726
1.27k
   }
727
728
729
   /*Quantize LSPs*/
730
7.42k
#if 1 /*0 for unquantized*/
731
7.42k
   SUBMODE(lsp_quant)(lsp, qlsp, NB_ORDER, bits);
732
#else
733
   for (i=0;i<NB_ORDER;i++)
734
     qlsp[i]=lsp[i];
735
#endif
736
737
   /*If we use low bit-rate pitch mode, transmit open-loop pitch*/
738
7.42k
   if (SUBMODE(lbr_pitch)!=-1)
739
5.21k
   {
740
5.21k
      speex_bits_pack(bits, ol_pitch-NB_PITCH_START, 7);
741
5.21k
   }
742
743
7.42k
   if (SUBMODE(forced_pitch_gain))
744
4.85k
   {
745
4.85k
      int quant;
746
      /* This just damps the pitch a bit, because it tends to be too aggressive when forced */
747
4.85k
      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.85k
      quant = (int)floor(.5+15*ol_pitch_coef*GAIN_SCALING_1);
752
4.85k
#endif
753
4.85k
      if (quant>15)
754
40
         quant=15;
755
4.85k
      if (quant<0)
756
0
         quant=0;
757
4.85k
      speex_bits_pack(bits, quant, 4);
758
4.85k
      ol_pitch_coef=MULT16_16_P15(QCONST16(0.066667,15),SHL16(quant,GAIN_SHIFT));
759
4.85k
   }
760
761
762
   /*Quantize and transmit open-loop excitation gain*/
763
#ifdef FIXED_POINT
764
   {
765
      int qe = scal_quant32(ol_gain, ol_gain_table, 32);
766
      /*ol_gain = exp(qe/3.5)*SIG_SCALING;*/
767
      ol_gain = MULT16_32_Q15(28406,ol_gain_table[qe]);
768
      speex_bits_pack(bits, qe, 5);
769
   }
770
#else
771
7.42k
   {
772
7.42k
      int qe = (int)(floor(.5+3.5*log(ol_gain*1.0/SIG_SCALING)));
773
7.42k
      if (qe<0)
774
4.85k
         qe=0;
775
7.42k
      if (qe>31)
776
422
         qe=31;
777
7.42k
      ol_gain = exp(qe/3.5)*SIG_SCALING;
778
7.42k
      speex_bits_pack(bits, qe, 5);
779
7.42k
   }
780
7.42k
#endif
781
782
783
784
   /* Special case for first frame */
785
7.42k
   if (st->first)
786
1.27k
   {
787
13.9k
      for (i=0;i<NB_ORDER;i++)
788
12.7k
         st->old_qlsp[i] = qlsp[i];
789
1.27k
   }
790
791
   /* Target signal */
792
7.42k
   ALLOC(target, NB_SUBFRAME_SIZE, spx_word16_t);
793
7.42k
   ALLOC(innov, NB_SUBFRAME_SIZE, spx_sig_t);
794
7.42k
   ALLOC(exc32, NB_SUBFRAME_SIZE, spx_word32_t);
795
7.42k
   ALLOC(syn_resp, NB_SUBFRAME_SIZE, spx_word16_t);
796
7.42k
   ALLOC(mem, NB_ORDER, spx_mem_t);
797
798
   /* Loop on sub-frames */
799
37.1k
   for (sub=0;sub<NB_NB_SUBFRAMES;sub++)
800
29.7k
   {
801
29.7k
      int   offset;
802
29.7k
      spx_word16_t *sw;
803
29.7k
      spx_word16_t *exc, *inBuf;
804
29.7k
      int pitch;
805
29.7k
      int response_bound = NB_SUBFRAME_SIZE;
806
807
      /* Offset relative to start of frame */
808
29.7k
      offset = NB_SUBFRAME_SIZE*sub;
809
      /* Excitation */
810
29.7k
      exc=st->exc+offset;
811
      /* Weighted signal */
812
29.7k
      sw=st->sw+offset;
813
814
      /* LSP interpolation (quantized and unquantized) */
815
29.7k
      lsp_interpolate(st->old_lsp, lsp, interp_lsp, NB_ORDER, sub, NB_NB_SUBFRAMES, LSP_MARGIN);
816
29.7k
      lsp_interpolate(st->old_qlsp, qlsp, interp_qlsp, NB_ORDER, sub, NB_NB_SUBFRAMES, LSP_MARGIN);
817
818
      /* Compute interpolated LPCs (quantized and unquantized) */
819
29.7k
      lsp_to_lpc(interp_lsp, interp_lpc, NB_ORDER,stack);
820
821
29.7k
      lsp_to_lpc(interp_qlsp, interp_qlpc, NB_ORDER, stack);
822
823
      /* Compute analysis filter gain at w=pi (for use in SB-CELP) */
824
29.7k
      {
825
29.7k
         spx_word32_t pi_g=LPC_SCALING;
826
178k
         for (i=0;i<NB_ORDER;i+=2)
827
148k
         {
828
            /*pi_g += -st->interp_qlpc[i] +  st->interp_qlpc[i+1];*/
829
148k
            pi_g = ADD32(pi_g, SUB32(EXTEND32(interp_qlpc[i+1]),EXTEND32(interp_qlpc[i])));
830
148k
         }
831
29.7k
         st->pi_gain[sub] = pi_g;
832
29.7k
      }
833
834
#ifdef VORBIS_PSYCHO
835
      {
836
         float curr_curve[128];
837
         float fact = ((float)sub+1.0f)/NB_NB_SUBFRAMES;
838
         for (i=0;i<128;i++)
839
            curr_curve[i] = (1.0f-fact)*st->old_curve[i] + fact*st->curve[i];
840
         curve_to_lpc(st->psy, curr_curve, bw_lpc1, bw_lpc2, 10);
841
      }
842
#else
843
      /* Compute bandwidth-expanded (unquantized) LPCs for perceptual weighting */
844
29.7k
      bw_lpc(st->gamma1, interp_lpc, bw_lpc1, NB_ORDER);
845
29.7k
      bw_lpc(st->gamma2, interp_lpc, bw_lpc2, NB_ORDER);
846
      /*print_vec(st->bw_lpc1, 10, "bw_lpc");*/
847
29.7k
#endif
848
849
      /*FIXME: This will break if we change the window size */
850
29.7k
      speex_assert(NB_WINDOW_SIZE-NB_FRAME_SIZE == NB_SUBFRAME_SIZE);
851
29.7k
      if (sub==0)
852
7.42k
         inBuf = st->winBuf;
853
22.2k
      else
854
22.2k
         inBuf = &in[((sub-1)*NB_SUBFRAME_SIZE)];
855
1.21M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
856
1.18M
         sw[i] = inBuf[i];
857
858
29.7k
      if (st->complexity==0)
859
6.68k
         response_bound >>= 1;
860
29.7k
      compute_impulse_response(interp_qlpc, bw_lpc1, bw_lpc2, syn_resp, response_bound, NB_ORDER, stack);
861
163k
      for (i=response_bound;i<NB_SUBFRAME_SIZE;i++)
862
133k
         syn_resp[i]=VERY_SMALL;
863
864
      /* Compute zero response of A(z/g1) / ( A(z/g2) * A(z) ) */
865
326k
      for (i=0;i<NB_ORDER;i++)
866
297k
         mem[i]=SHL32(st->mem_sp[i],1);
867
1.21M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
868
1.18M
         exc[i] = VERY_SMALL;
869
#ifdef SHORTCUTS2
870
      iir_mem16(exc, interp_qlpc, exc, response_bound, NB_ORDER, mem, stack);
871
      for (i=0;i<NB_ORDER;i++)
872
         mem[i]=SHL32(st->mem_sw[i],1);
873
      filter10(exc, st->bw_lpc1, st->bw_lpc2, exc, response_bound, mem, stack);
874
      SPEEX_MEMSET(&exc[response_bound], 0, NB_SUBFRAME_SIZE-response_bound);
875
#else
876
29.7k
      iir_mem16(exc, interp_qlpc, exc, NB_SUBFRAME_SIZE, NB_ORDER, mem, stack);
877
326k
      for (i=0;i<NB_ORDER;i++)
878
297k
         mem[i]=SHL32(st->mem_sw[i],1);
879
29.7k
      filter10(exc, bw_lpc1, bw_lpc2, exc, NB_SUBFRAME_SIZE, mem, stack);
880
29.7k
#endif
881
882
      /* Compute weighted signal */
883
326k
      for (i=0;i<NB_ORDER;i++)
884
297k
         mem[i]=st->mem_sw[i];
885
29.7k
      filter10(sw, bw_lpc1, bw_lpc2, sw, NB_SUBFRAME_SIZE, mem, stack);
886
887
29.7k
      if (st->complexity==0)
888
73.4k
         for (i=0;i<NB_ORDER;i++)
889
66.8k
            st->mem_sw[i]=mem[i];
890
891
      /* Compute target signal (saturation prevents overflows on clipped input speech) */
892
1.21M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
893
1.18M
         target[i]=EXTRACT16(SATURATE(SUB32(sw[i],PSHR32(exc[i],1)),32767));
894
895
1.21M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
896
1.18M
         exc[i] = inBuf[i];
897
29.7k
      fir_mem16(exc, interp_qlpc, exc, NB_SUBFRAME_SIZE, NB_ORDER, st->mem_exc2, stack);
898
      /* If we have a long-term predictor (otherwise, something's wrong) */
899
29.7k
      speex_assert (SUBMODE(ltp_quant));
900
29.7k
      {
901
29.7k
         int pit_min, pit_max;
902
         /* Long-term prediction */
903
29.7k
         if (SUBMODE(lbr_pitch) != -1)
904
20.8k
         {
905
            /* Low bit-rate pitch handling */
906
20.8k
            int margin;
907
20.8k
            margin = SUBMODE(lbr_pitch);
908
20.8k
            if (margin)
909
0
            {
910
0
               if (ol_pitch < NB_PITCH_START+margin-1)
911
0
                  ol_pitch=NB_PITCH_START+margin-1;
912
0
               if (ol_pitch > NB_PITCH_END-margin)
913
0
                  ol_pitch=NB_PITCH_END-margin;
914
0
               pit_min = ol_pitch-margin+1;
915
0
               pit_max = ol_pitch+margin;
916
20.8k
            } else {
917
20.8k
               pit_min=pit_max=ol_pitch;
918
20.8k
            }
919
20.8k
         } else {
920
8.84k
            pit_min = NB_PITCH_START;
921
8.84k
            pit_max = NB_PITCH_END;
922
8.84k
         }
923
924
         /* Force pitch to use only the current frame if needed */
925
29.7k
         if (st->bounded_pitch && pit_max>offset)
926
9.34k
            pit_max=offset;
927
928
         /* Perform pitch search */
929
29.7k
         pitch = SUBMODE(ltp_quant)(target, sw, interp_qlpc, bw_lpc1, bw_lpc2,
930
29.7k
                                    exc32, SUBMODE(ltp_params), pit_min, pit_max, ol_pitch_coef,
931
29.7k
                                    NB_ORDER, NB_SUBFRAME_SIZE, bits, stack,
932
29.7k
                                    exc, syn_resp, st->complexity, 0, st->plc_tuning, &st->cumul_gain);
933
934
29.7k
         st->pitch[sub]=pitch;
935
29.7k
      }
936
      /* Quantization of innovation */
937
29.7k
      SPEEX_MEMSET(innov, 0, NB_SUBFRAME_SIZE);
938
939
      /* FIXME: Make sure this is safe from overflows (so far so good) */
940
1.21M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
941
1.18M
         exc[i] = EXTRACT16(SUB32(EXTEND32(exc[i]), PSHR32(exc32[i],SIG_SHIFT-1)));
942
943
29.7k
      ener = SHL32(EXTEND32(compute_rms16(exc, NB_SUBFRAME_SIZE)),SIG_SHIFT);
944
945
      /*FIXME: Should use DIV32_16 and make sure result fits in 16 bits */
946
#ifdef FIXED_POINT
947
      {
948
         spx_word32_t f = PDIV32(ener,PSHR32(ol_gain,SIG_SHIFT));
949
         if (f<=32767)
950
            fine_gain = f;
951
         else
952
            fine_gain = 32767;
953
      }
954
#else
955
29.7k
      fine_gain = PDIV32_16(ener,PSHR32(ol_gain,SIG_SHIFT));
956
29.7k
#endif
957
      /* Calculate gain correction for the sub-frame (if any) */
958
29.7k
      if (SUBMODE(have_subframe_gain))
959
8.84k
      {
960
8.84k
         int qe;
961
8.84k
         if (SUBMODE(have_subframe_gain)==3)
962
4.88k
         {
963
4.88k
            qe = scal_quant(fine_gain, exc_gain_quant_scal3_bound, 8);
964
4.88k
            speex_bits_pack(bits, qe, 3);
965
4.88k
            ener=MULT16_32_Q14(exc_gain_quant_scal3[qe],ol_gain);
966
4.88k
         } else {
967
3.95k
            qe = scal_quant(fine_gain, exc_gain_quant_scal1_bound, 2);
968
3.95k
            speex_bits_pack(bits, qe, 1);
969
3.95k
            ener=MULT16_32_Q14(exc_gain_quant_scal1[qe],ol_gain);
970
3.95k
         }
971
20.8k
      } else {
972
20.8k
         ener=ol_gain;
973
20.8k
      }
974
975
      /*printf ("%f %f\n", ener, ol_gain);*/
976
977
      /* Normalize innovation */
978
29.7k
      signal_div(target, target, ener, NB_SUBFRAME_SIZE);
979
980
      /* Quantize innovation */
981
29.7k
      speex_assert (SUBMODE(innovation_quant));
982
29.7k
      {
983
         /* Codebook search */
984
29.7k
         SUBMODE(innovation_quant)(target, interp_qlpc, bw_lpc1, bw_lpc2,
985
29.7k
                  SUBMODE(innovation_params), NB_ORDER, NB_SUBFRAME_SIZE,
986
29.7k
                  innov, syn_resp, bits, stack, st->complexity, SUBMODE(double_codebook));
987
988
         /* De-normalize innovation and update excitation */
989
29.7k
         signal_mul(innov, innov, ener, NB_SUBFRAME_SIZE);
990
991
         /* In some (rare) modes, we do a second search (more bits) to reduce noise even more */
992
29.7k
         if (SUBMODE(double_codebook)) {
993
1.31k
            char *tmp_stack=stack;
994
1.31k
            VARDECL(spx_sig_t *innov2);
995
1.31k
            ALLOC(innov2, NB_SUBFRAME_SIZE, spx_sig_t);
996
1.31k
            SPEEX_MEMSET(innov2, 0, NB_SUBFRAME_SIZE);
997
53.7k
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
998
52.4k
               target[i]=MULT16_16_P13(QCONST16(2.2f,13), target[i]);
999
1.31k
            SUBMODE(innovation_quant)(target, interp_qlpc, bw_lpc1, bw_lpc2,
1000
1.31k
                                      SUBMODE(innovation_params), NB_ORDER, NB_SUBFRAME_SIZE,
1001
1.31k
                                      innov2, syn_resp, bits, stack, st->complexity, 0);
1002
1.31k
            signal_mul(innov2, innov2, MULT16_32_Q15(QCONST16(0.454545f,15),ener), NB_SUBFRAME_SIZE);
1003
53.7k
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
1004
52.4k
               innov[i] = ADD32(innov[i],innov2[i]);
1005
1.31k
            stack = tmp_stack;
1006
1.31k
         }
1007
1.21M
         for (i=0;i<NB_SUBFRAME_SIZE;i++)
1008
1.18M
            exc[i] = EXTRACT16(SATURATE32(PSHR32(ADD32(SHL32(exc32[i],1),innov[i]),SIG_SHIFT),32767));
1009
29.7k
         if (st->innov_rms_save)
1010
9.98k
            st->innov_rms_save[sub] = compute_rms(innov, NB_SUBFRAME_SIZE);
1011
29.7k
      }
1012
1013
      /* Final signal synthesis from excitation */
1014
29.7k
      iir_mem16(exc, interp_qlpc, sw, NB_SUBFRAME_SIZE, NB_ORDER, st->mem_sp, stack);
1015
1016
      /* Compute weighted signal again, from synthesized speech (not sure it's the right thing) */
1017
29.7k
      if (st->complexity!=0)
1018
23.0k
         filter10(sw, bw_lpc1, bw_lpc2, sw, NB_SUBFRAME_SIZE, st->mem_sw, stack);
1019
1020
29.7k
   }
1021
1022
   /* Store the LSPs for interpolation in the next frame */
1023
7.42k
   if (st->submodeID>=1)
1024
7.42k
   {
1025
81.7k
      for (i=0;i<NB_ORDER;i++)
1026
74.2k
         st->old_lsp[i] = lsp[i];
1027
81.7k
      for (i=0;i<NB_ORDER;i++)
1028
74.2k
         st->old_qlsp[i] = qlsp[i];
1029
7.42k
   }
1030
1031
#ifdef VORBIS_PSYCHO
1032
   if (st->submodeID>=1)
1033
      SPEEX_COPY(st->old_curve, st->curve, 128);
1034
#endif
1035
1036
7.42k
   if (st->submodeID==1)
1037
4.02k
   {
1038
4.02k
#ifndef DISABLE_VBR
1039
4.02k
      if (st->dtx_count)
1040
1.77k
         speex_bits_pack(bits, 15, 4);
1041
2.24k
      else
1042
2.24k
#endif
1043
2.24k
         speex_bits_pack(bits, 0, 4);
1044
4.02k
   }
1045
1046
   /* The next frame will not be the first (Duh!) */
1047
7.42k
   st->first = 0;
1048
7.42k
   SPEEX_COPY(st->winBuf, in+2*NB_FRAME_SIZE-NB_WINDOW_SIZE, NB_WINDOW_SIZE-NB_FRAME_SIZE);
1049
1050
7.42k
   if (SUBMODE(innovation_quant) == noise_codebook_quant || st->submodeID==0)
1051
4.02k
      st->bounded_pitch = 1;
1052
3.40k
   else
1053
3.40k
      st->bounded_pitch = 0;
1054
1055
7.42k
   return 1;
1056
8.51k
}
nb_encode
Line
Count
Source
407
16.9k
{
408
16.9k
   EncState *st;
409
16.9k
   int i, sub, roots;
410
16.9k
   int ol_pitch;
411
16.9k
   spx_word16_t ol_pitch_coef;
412
16.9k
   spx_word32_t ol_gain;
413
16.9k
   VARDECL(spx_word16_t *target);
414
16.9k
   VARDECL(spx_sig_t *innov);
415
16.9k
   VARDECL(spx_word32_t *exc32);
416
16.9k
   VARDECL(spx_mem_t *mem);
417
16.9k
   VARDECL(spx_coef_t *bw_lpc1);
418
16.9k
   VARDECL(spx_coef_t *bw_lpc2);
419
16.9k
   VARDECL(spx_coef_t *lpc);
420
16.9k
   VARDECL(spx_lsp_t *lsp);
421
16.9k
   VARDECL(spx_lsp_t *qlsp);
422
16.9k
   VARDECL(spx_lsp_t *interp_lsp);
423
16.9k
   VARDECL(spx_lsp_t *interp_qlsp);
424
16.9k
   VARDECL(spx_coef_t *interp_lpc);
425
16.9k
   VARDECL(spx_coef_t *interp_qlpc);
426
16.9k
   char *stack;
427
16.9k
   VARDECL(spx_word16_t *syn_resp);
428
429
16.9k
   spx_word32_t ener=0;
430
16.9k
   spx_word16_t fine_gain;
431
16.9k
   spx_word16_t *in = (spx_word16_t*)vin;
432
433
16.9k
   st=(EncState *)state;
434
16.9k
   stack=st->stack;
435
436
16.9k
   ALLOC(lpc, NB_ORDER, spx_coef_t);
437
16.9k
   ALLOC(bw_lpc1, NB_ORDER, spx_coef_t);
438
16.9k
   ALLOC(bw_lpc2, NB_ORDER, spx_coef_t);
439
16.9k
   ALLOC(lsp, NB_ORDER, spx_lsp_t);
440
16.9k
   ALLOC(qlsp, NB_ORDER, spx_lsp_t);
441
16.9k
   ALLOC(interp_lsp, NB_ORDER, spx_lsp_t);
442
16.9k
   ALLOC(interp_qlsp, NB_ORDER, spx_lsp_t);
443
16.9k
   ALLOC(interp_lpc, NB_ORDER, spx_coef_t);
444
16.9k
   ALLOC(interp_qlpc, NB_ORDER, spx_coef_t);
445
446
16.9k
   st->exc = st->excBuf + NB_PITCH_END + 2;
447
16.9k
   st->sw = st->swBuf + NB_PITCH_END + 2;
448
   /* Move signals 1 frame towards the past */
449
16.9k
   SPEEX_MOVE(st->excBuf, st->excBuf+NB_FRAME_SIZE, NB_PITCH_END+2);
450
16.9k
   SPEEX_MOVE(st->swBuf, st->swBuf+NB_FRAME_SIZE, NB_PITCH_END+2);
451
452
16.9k
   if (st->highpass_enabled)
453
6.42k
      highpass(in, in, NB_FRAME_SIZE, (st->isWideband?HIGHPASS_WIDEBAND:HIGHPASS_NARROWBAND)|HIGHPASS_INPUT, st->mem_hp);
454
455
16.9k
   {
456
16.9k
      VARDECL(spx_word16_t *w_sig);
457
16.9k
      VARDECL(spx_word16_t *autocorr);
458
16.9k
      ALLOC(w_sig, NB_WINDOW_SIZE, spx_word16_t);
459
16.9k
      ALLOC(autocorr, NB_ORDER+1, spx_word16_t);
460
      /* Window for analysis */
461
693k
      for (i=0;i<NB_WINDOW_SIZE-NB_FRAME_SIZE;i++)
462
676k
         w_sig[i] = MULT16_16_Q15(st->winBuf[i],st->window[i]);
463
2.72M
      for (;i<NB_WINDOW_SIZE;i++)
464
2.70M
         w_sig[i] = MULT16_16_Q15(in[i-NB_WINDOW_SIZE+NB_FRAME_SIZE],st->window[i]);
465
      /* Compute auto-correlation */
466
16.9k
      _spx_autocorr(w_sig, autocorr, NB_ORDER+1, NB_WINDOW_SIZE);
467
16.9k
      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
202k
      for (i=0;i<NB_ORDER+1;i++)
471
186k
         autocorr[i] = MULT16_16_Q15(autocorr[i],st->lagWindow[i]);
472
16.9k
      autocorr[0] = ADD16(autocorr[0],1);
473
474
      /* Levinson-Durbin */
475
16.9k
      _spx_lpc(lpc, autocorr, NB_ORDER);
476
      /* LPC to LSPs (x-domain) transform */
477
16.9k
      roots=lpc_to_lsp (lpc, NB_ORDER, lsp, 10, LSP_DELTA1, stack);
478
      /* Check if we found all the roots */
479
16.9k
      if (roots!=NB_ORDER)
480
42
      {
481
         /*If we can't find all LSP's, do some damage control and use previous filter*/
482
462
         for (i=0;i<NB_ORDER;i++)
483
420
         {
484
420
            lsp[i]=st->old_lsp[i];
485
420
         }
486
42
      }
487
16.9k
   }
488
489
490
491
492
   /* Whole frame analysis (open-loop estimation of pitch and excitation gain) */
493
16.9k
   {
494
16.9k
      int diff = NB_WINDOW_SIZE-NB_FRAME_SIZE;
495
16.9k
      if (st->first)
496
33.5k
         for (i=0;i<NB_ORDER;i++)
497
30.4k
            interp_lsp[i] = lsp[i];
498
13.8k
      else
499
13.8k
         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
16.9k
      lsp_to_lpc(interp_lsp, interp_lpc, NB_ORDER,stack);
503
504
505
      /*Open-loop pitch*/
506
16.9k
      if (!st->submodes[st->submodeID] || (st->complexity>2 && SUBMODE(have_subframe_gain)<3) || SUBMODE(forced_pitch_gain) || SUBMODE(lbr_pitch) != -1
507
3.95k
#ifndef DISABLE_VBR
508
3.95k
           || st->vbr_enabled || st->vad_enabled
509
16.9k
#endif
510
16.9k
                  )
511
15.5k
      {
512
15.5k
         int nol_pitch[6];
513
15.5k
         spx_word16_t nol_pitch_coef[6];
514
515
15.5k
         bw_lpc(QCONST16(0.9,15), interp_lpc, bw_lpc1, NB_ORDER);
516
15.5k
         bw_lpc(QCONST16(0.55,15), interp_lpc, bw_lpc2, NB_ORDER);
517
518
15.5k
         SPEEX_COPY(st->sw, st->winBuf, diff);
519
15.5k
         SPEEX_COPY(st->sw+diff, in, NB_FRAME_SIZE-diff);
520
15.5k
         filter10(st->sw, bw_lpc1, bw_lpc2, st->sw, NB_FRAME_SIZE, st->mem_sw_whole, stack);
521
522
15.5k
         open_loop_nbest_pitch(st->sw, NB_PITCH_START, NB_PITCH_END, NB_FRAME_SIZE,
523
15.5k
                               nol_pitch, nol_pitch_coef, 6, stack);
524
15.5k
         ol_pitch=nol_pitch[0];
525
15.5k
         ol_pitch_coef = nol_pitch_coef[0];
526
         /*Try to remove pitch multiples*/
527
93.2k
         for (i=1;i<6;i++)
528
77.6k
         {
529
77.6k
#ifdef FIXED_POINT
530
77.6k
            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
16.2k
                (ABS(2*nol_pitch[i]-ol_pitch)<=2 || ABS(3*nol_pitch[i]-ol_pitch)<=3 ||
535
15.7k
                 ABS(4*nol_pitch[i]-ol_pitch)<=4 || ABS(5*nol_pitch[i]-ol_pitch)<=5))
536
778
            {
537
               /*ol_pitch_coef=nol_pitch_coef[i];*/
538
778
               ol_pitch = nol_pitch[i];
539
778
            }
540
77.6k
         }
541
         /*if (ol_pitch>50)
542
           ol_pitch/=2;*/
543
         /*ol_pitch_coef = sqrt(ol_pitch_coef);*/
544
545
15.5k
      } else {
546
1.37k
         ol_pitch=0;
547
1.37k
         ol_pitch_coef=0;
548
1.37k
      }
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
16.9k
      fir_mem16(st->winBuf, interp_lpc, st->exc, diff, NB_ORDER, st->mem_exc, stack);
554
16.9k
      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
16.9k
      {
558
16.9k
         spx_word16_t g = compute_rms16(st->exc, NB_FRAME_SIZE);
559
16.9k
         if (st->submodeID!=1 && ol_pitch>0)
560
7.54k
            ol_gain = MULT16_16(g, MULT16_16_Q14(QCONST16(1.1,14),
561
16.9k
                                spx_sqrt(QCONST32(1.,28)-MULT16_32_Q15(QCONST16(.8,15),SHL32(MULT16_16(ol_pitch_coef,ol_pitch_coef),16)))));
562
9.36k
         else
563
9.36k
            ol_gain = SHL32(EXTEND32(g),SIG_SHIFT);
564
16.9k
      }
565
16.9k
   }
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
16.9k
#ifndef DISABLE_VBR
578
16.9k
   if (st->vbr_enabled||st->vad_enabled)
579
13.2k
   {
580
13.2k
      float lsp_dist=0;
581
145k
      for (i=0;i<NB_ORDER;i++)
582
132k
         lsp_dist += (st->old_lsp[i] - lsp[i])*(st->old_lsp[i] - lsp[i]);
583
13.2k
      lsp_dist /= LSP_SCALING*LSP_SCALING;
584
585
13.2k
      if (st->abr_enabled)
586
3.45k
      {
587
3.45k
         float qual_change=0;
588
3.45k
         if (st->abr_drift2 * st->abr_drift > 0)
589
3.10k
         {
590
            /* Only adapt if long-term and short-term drift are the same sign */
591
3.10k
            qual_change = -.00001*st->abr_drift/(1+st->abr_count);
592
3.10k
            if (qual_change>.05)
593
0
               qual_change=.05;
594
3.10k
            if (qual_change<-.05)
595
876
               qual_change=-.05;
596
3.10k
         }
597
3.45k
         st->vbr_quality += qual_change;
598
3.45k
         if (st->vbr_quality>10)
599
0
            st->vbr_quality=10;
600
3.45k
         if (st->vbr_quality<0)
601
3.10k
            st->vbr_quality=0;
602
3.45k
      }
603
604
13.2k
      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
13.2k
      if (st->vbr_enabled)
608
10.4k
      {
609
10.4k
         spx_int32_t mode;
610
10.4k
         int choice=0;
611
10.4k
         float min_diff=100;
612
10.4k
         mode = 8;
613
94.3k
         while (mode)
614
83.8k
         {
615
83.8k
            int v1;
616
83.8k
            float thresh;
617
83.8k
            v1=(int)floor(st->vbr_quality);
618
83.8k
            if (v1==10)
619
2.28k
               thresh = vbr_nb_thresh[mode][v1];
620
81.5k
            else
621
81.5k
               thresh = (st->vbr_quality-v1)*vbr_nb_thresh[mode][v1+1] + (1+v1-st->vbr_quality)*vbr_nb_thresh[mode][v1];
622
83.8k
            if (st->relative_quality > thresh &&
623
25.7k
                st->relative_quality-thresh<min_diff)
624
12.0k
            {
625
12.0k
               choice = mode;
626
12.0k
               min_diff = st->relative_quality-thresh;
627
12.0k
            }
628
83.8k
            mode--;
629
83.8k
         }
630
10.4k
         mode=choice;
631
10.4k
         if (mode==0)
632
2.44k
         {
633
2.44k
            if (st->dtx_count==0 || lsp_dist>.05 || !st->dtx_enabled || st->dtx_count>20)
634
1.55k
            {
635
1.55k
               mode=1;
636
1.55k
               st->dtx_count=1;
637
1.55k
            } else {
638
889
               mode=0;
639
889
               st->dtx_count++;
640
889
            }
641
8.03k
         } else {
642
8.03k
            st->dtx_count=0;
643
8.03k
         }
644
645
10.4k
         speex_encoder_ctl(state, SPEEX_SET_MODE, &mode);
646
10.4k
         if (st->vbr_max>0)
647
7.89k
         {
648
7.89k
            spx_int32_t rate;
649
7.89k
            speex_encoder_ctl(state, SPEEX_GET_BITRATE, &rate);
650
7.89k
            if (rate > st->vbr_max)
651
3.27k
            {
652
3.27k
               rate = st->vbr_max;
653
3.27k
               speex_encoder_ctl(state, SPEEX_SET_BITRATE, &rate);
654
3.27k
            }
655
7.89k
         }
656
657
10.4k
         if (st->abr_enabled)
658
3.45k
         {
659
3.45k
            spx_int32_t bitrate;
660
3.45k
            speex_encoder_ctl(state, SPEEX_GET_BITRATE, &bitrate);
661
3.45k
            st->abr_drift+=(bitrate-st->abr_enabled);
662
3.45k
            st->abr_drift2 = .95*st->abr_drift2 + .05*(bitrate-st->abr_enabled);
663
3.45k
            st->abr_count += 1.0;
664
3.45k
         }
665
666
10.4k
      } else {
667
         /*VAD only case*/
668
2.73k
         int mode;
669
2.73k
         if (st->relative_quality<2)
670
603
         {
671
603
            if (st->dtx_count==0 || lsp_dist>.05 || !st->dtx_enabled || st->dtx_count>20)
672
406
            {
673
406
               st->dtx_count=1;
674
406
               mode=1;
675
406
            } else {
676
197
               mode=0;
677
197
               st->dtx_count++;
678
197
            }
679
2.13k
         } else {
680
2.13k
            st->dtx_count = 0;
681
2.13k
            mode=st->submodeSelect;
682
2.13k
         }
683
         /*speex_encoder_ctl(state, SPEEX_SET_MODE, &mode);*/
684
2.73k
         st->submodeID=mode;
685
2.73k
      }
686
13.2k
   } else {
687
3.69k
      st->relative_quality = -1;
688
3.69k
   }
689
16.9k
#endif /* #ifndef DISABLE_VBR */
690
691
16.9k
   if (st->encode_submode)
692
16.9k
   {
693
      /* First, transmit a zero for narrowband */
694
16.9k
      speex_bits_pack(bits, 0, 1);
695
696
      /* Transmit the sub-mode we use for this frame */
697
16.9k
      speex_bits_pack(bits, st->submodeID, NB_SUBMODE_BITS);
698
699
16.9k
   }
700
701
   /* If null mode (no transmission), just set a couple things to zero*/
702
16.9k
   if (st->submodes[st->submodeID] == NULL)
703
958
   {
704
154k
      for (i=0;i<NB_FRAME_SIZE;i++)
705
153k
         st->exc[i]=st->sw[i]=VERY_SMALL;
706
707
10.5k
      for (i=0;i<NB_ORDER;i++)
708
9.58k
         st->mem_sw[i]=0;
709
958
      st->first=1;
710
958
      st->bounded_pitch = 1;
711
712
958
      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
10.5k
      for (i=0;i<NB_ORDER;i++)
716
9.58k
         st->mem_sp[i] = 0;
717
958
      return 0;
718
719
958
   }
720
721
   /* LSP Quantization */
722
15.9k
   if (st->first)
723
2.38k
   {
724
26.2k
      for (i=0;i<NB_ORDER;i++)
725
23.8k
         st->old_lsp[i] = lsp[i];
726
2.38k
   }
727
728
729
   /*Quantize LSPs*/
730
15.9k
#if 1 /*0 for unquantized*/
731
15.9k
   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
15.9k
   if (SUBMODE(lbr_pitch)!=-1)
739
10.3k
   {
740
10.3k
      speex_bits_pack(bits, ol_pitch-NB_PITCH_START, 7);
741
10.3k
   }
742
743
15.9k
   if (SUBMODE(forced_pitch_gain))
744
9.39k
   {
745
9.39k
      int quant;
746
      /* This just damps the pitch a bit, because it tends to be too aggressive when forced */
747
9.39k
      ol_pitch_coef = MULT16_16_Q15(QCONST16(.9,15), ol_pitch_coef);
748
9.39k
#ifdef FIXED_POINT
749
9.39k
      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
9.39k
      if (quant>15)
754
60
         quant=15;
755
9.39k
      if (quant<0)
756
0
         quant=0;
757
9.39k
      speex_bits_pack(bits, quant, 4);
758
9.39k
      ol_pitch_coef=MULT16_16_P15(QCONST16(0.066667,15),SHL16(quant,GAIN_SHIFT));
759
9.39k
   }
760
761
762
   /*Quantize and transmit open-loop excitation gain*/
763
15.9k
#ifdef FIXED_POINT
764
15.9k
   {
765
15.9k
      int qe = scal_quant32(ol_gain, ol_gain_table, 32);
766
      /*ol_gain = exp(qe/3.5)*SIG_SCALING;*/
767
15.9k
      ol_gain = MULT16_32_Q15(28406,ol_gain_table[qe]);
768
15.9k
      speex_bits_pack(bits, qe, 5);
769
15.9k
   }
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
15.9k
   if (st->first)
786
2.38k
   {
787
26.2k
      for (i=0;i<NB_ORDER;i++)
788
23.8k
         st->old_qlsp[i] = qlsp[i];
789
2.38k
   }
790
791
   /* Target signal */
792
15.9k
   ALLOC(target, NB_SUBFRAME_SIZE, spx_word16_t);
793
15.9k
   ALLOC(innov, NB_SUBFRAME_SIZE, spx_sig_t);
794
15.9k
   ALLOC(exc32, NB_SUBFRAME_SIZE, spx_word32_t);
795
15.9k
   ALLOC(syn_resp, NB_SUBFRAME_SIZE, spx_word16_t);
796
15.9k
   ALLOC(mem, NB_ORDER, spx_mem_t);
797
798
   /* Loop on sub-frames */
799
79.7k
   for (sub=0;sub<NB_NB_SUBFRAMES;sub++)
800
63.8k
   {
801
63.8k
      int   offset;
802
63.8k
      spx_word16_t *sw;
803
63.8k
      spx_word16_t *exc, *inBuf;
804
63.8k
      int pitch;
805
63.8k
      int response_bound = NB_SUBFRAME_SIZE;
806
807
      /* Offset relative to start of frame */
808
63.8k
      offset = NB_SUBFRAME_SIZE*sub;
809
      /* Excitation */
810
63.8k
      exc=st->exc+offset;
811
      /* Weighted signal */
812
63.8k
      sw=st->sw+offset;
813
814
      /* LSP interpolation (quantized and unquantized) */
815
63.8k
      lsp_interpolate(st->old_lsp, lsp, interp_lsp, NB_ORDER, sub, NB_NB_SUBFRAMES, LSP_MARGIN);
816
63.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
63.8k
      lsp_to_lpc(interp_lsp, interp_lpc, NB_ORDER,stack);
820
821
63.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
63.8k
      {
825
63.8k
         spx_word32_t pi_g=LPC_SCALING;
826
382k
         for (i=0;i<NB_ORDER;i+=2)
827
319k
         {
828
            /*pi_g += -st->interp_qlpc[i] +  st->interp_qlpc[i+1];*/
829
319k
            pi_g = ADD32(pi_g, SUB32(EXTEND32(interp_qlpc[i+1]),EXTEND32(interp_qlpc[i])));
830
319k
         }
831
63.8k
         st->pi_gain[sub] = pi_g;
832
63.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
63.8k
      bw_lpc(st->gamma1, interp_lpc, bw_lpc1, NB_ORDER);
845
63.8k
      bw_lpc(st->gamma2, interp_lpc, bw_lpc2, NB_ORDER);
846
      /*print_vec(st->bw_lpc1, 10, "bw_lpc");*/
847
63.8k
#endif
848
849
      /*FIXME: This will break if we change the window size */
850
63.8k
      speex_assert(NB_WINDOW_SIZE-NB_FRAME_SIZE == NB_SUBFRAME_SIZE);
851
63.8k
      if (sub==0)
852
15.9k
         inBuf = st->winBuf;
853
47.8k
      else
854
47.8k
         inBuf = &in[((sub-1)*NB_SUBFRAME_SIZE)];
855
2.61M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
856
2.55M
         sw[i] = inBuf[i];
857
858
63.8k
      if (st->complexity==0)
859
12.6k
         response_bound >>= 1;
860
63.8k
      compute_impulse_response(interp_qlpc, bw_lpc1, bw_lpc2, syn_resp, response_bound, NB_ORDER, stack);
861
316k
      for (i=response_bound;i<NB_SUBFRAME_SIZE;i++)
862
252k
         syn_resp[i]=VERY_SMALL;
863
864
      /* Compute zero response of A(z/g1) / ( A(z/g2) * A(z) ) */
865
702k
      for (i=0;i<NB_ORDER;i++)
866
638k
         mem[i]=SHL32(st->mem_sp[i],1);
867
2.61M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
868
2.55M
         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
63.8k
      iir_mem16(exc, interp_qlpc, exc, NB_SUBFRAME_SIZE, NB_ORDER, mem, stack);
877
702k
      for (i=0;i<NB_ORDER;i++)
878
638k
         mem[i]=SHL32(st->mem_sw[i],1);
879
63.8k
      filter10(exc, bw_lpc1, bw_lpc2, exc, NB_SUBFRAME_SIZE, mem, stack);
880
63.8k
#endif
881
882
      /* Compute weighted signal */
883
702k
      for (i=0;i<NB_ORDER;i++)
884
638k
         mem[i]=st->mem_sw[i];
885
63.8k
      filter10(sw, bw_lpc1, bw_lpc2, sw, NB_SUBFRAME_SIZE, mem, stack);
886
887
63.8k
      if (st->complexity==0)
888
138k
         for (i=0;i<NB_ORDER;i++)
889
126k
            st->mem_sw[i]=mem[i];
890
891
      /* Compute target signal (saturation prevents overflows on clipped input speech) */
892
2.61M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
893
2.55M
         target[i]=EXTRACT16(SATURATE(SUB32(sw[i],PSHR32(exc[i],1)),32767));
894
895
2.61M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
896
2.55M
         exc[i] = inBuf[i];
897
63.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
63.8k
      speex_assert (SUBMODE(ltp_quant));
900
63.8k
      {
901
63.8k
         int pit_min, pit_max;
902
         /* Long-term prediction */
903
63.8k
         if (SUBMODE(lbr_pitch) != -1)
904
41.2k
         {
905
            /* Low bit-rate pitch handling */
906
41.2k
            int margin;
907
41.2k
            margin = SUBMODE(lbr_pitch);
908
41.2k
            if (margin)
909
0
            {
910
0
               if (ol_pitch < NB_PITCH_START+margin-1)
911
0
                  ol_pitch=NB_PITCH_START+margin-1;
912
0
               if (ol_pitch > NB_PITCH_END-margin)
913
0
                  ol_pitch=NB_PITCH_END-margin;
914
0
               pit_min = ol_pitch-margin+1;
915
0
               pit_max = ol_pitch+margin;
916
41.2k
            } else {
917
41.2k
               pit_min=pit_max=ol_pitch;
918
41.2k
            }
919
41.2k
         } else {
920
22.5k
            pit_min = NB_PITCH_START;
921
22.5k
            pit_max = NB_PITCH_END;
922
22.5k
         }
923
924
         /* Force pitch to use only the current frame if needed */
925
63.8k
         if (st->bounded_pitch && pit_max>offset)
926
19.3k
            pit_max=offset;
927
928
         /* Perform pitch search */
929
63.8k
         pitch = SUBMODE(ltp_quant)(target, sw, interp_qlpc, bw_lpc1, bw_lpc2,
930
63.8k
                                    exc32, SUBMODE(ltp_params), pit_min, pit_max, ol_pitch_coef,
931
63.8k
                                    NB_ORDER, NB_SUBFRAME_SIZE, bits, stack,
932
63.8k
                                    exc, syn_resp, st->complexity, 0, st->plc_tuning, &st->cumul_gain);
933
934
63.8k
         st->pitch[sub]=pitch;
935
63.8k
      }
936
      /* Quantization of innovation */
937
63.8k
      SPEEX_MEMSET(innov, 0, NB_SUBFRAME_SIZE);
938
939
      /* FIXME: Make sure this is safe from overflows (so far so good) */
940
2.61M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
941
2.55M
         exc[i] = EXTRACT16(SUB32(EXTEND32(exc[i]), PSHR32(exc32[i],SIG_SHIFT-1)));
942
943
63.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
63.8k
#ifdef FIXED_POINT
947
63.8k
      {
948
63.8k
         spx_word32_t f = PDIV32(ener,PSHR32(ol_gain,SIG_SHIFT));
949
63.8k
         if (f<=32767)
950
59.0k
            fine_gain = f;
951
4.76k
         else
952
4.76k
            fine_gain = 32767;
953
63.8k
      }
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
63.8k
      if (SUBMODE(have_subframe_gain))
959
22.5k
      {
960
22.5k
         int qe;
961
22.5k
         if (SUBMODE(have_subframe_gain)==3)
962
13.1k
         {
963
13.1k
            qe = scal_quant(fine_gain, exc_gain_quant_scal3_bound, 8);
964
13.1k
            speex_bits_pack(bits, qe, 3);
965
13.1k
            ener=MULT16_32_Q14(exc_gain_quant_scal3[qe],ol_gain);
966
13.1k
         } else {
967
9.47k
            qe = scal_quant(fine_gain, exc_gain_quant_scal1_bound, 2);
968
9.47k
            speex_bits_pack(bits, qe, 1);
969
9.47k
            ener=MULT16_32_Q14(exc_gain_quant_scal1[qe],ol_gain);
970
9.47k
         }
971
41.2k
      } else {
972
41.2k
         ener=ol_gain;
973
41.2k
      }
974
975
      /*printf ("%f %f\n", ener, ol_gain);*/
976
977
      /* Normalize innovation */
978
63.8k
      signal_div(target, target, ener, NB_SUBFRAME_SIZE);
979
980
      /* Quantize innovation */
981
63.8k
      speex_assert (SUBMODE(innovation_quant));
982
63.8k
      {
983
         /* Codebook search */
984
63.8k
         SUBMODE(innovation_quant)(target, interp_qlpc, bw_lpc1, bw_lpc2,
985
63.8k
                  SUBMODE(innovation_params), NB_ORDER, NB_SUBFRAME_SIZE,
986
63.8k
                  innov, syn_resp, bits, stack, st->complexity, SUBMODE(double_codebook));
987
988
         /* De-normalize innovation and update excitation */
989
63.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
63.8k
         if (SUBMODE(double_codebook)) {
993
1.54k
            char *tmp_stack=stack;
994
1.54k
            VARDECL(spx_sig_t *innov2);
995
1.54k
            ALLOC(innov2, NB_SUBFRAME_SIZE, spx_sig_t);
996
1.54k
            SPEEX_MEMSET(innov2, 0, NB_SUBFRAME_SIZE);
997
63.3k
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
998
61.7k
               target[i]=MULT16_16_P13(QCONST16(2.2f,13), target[i]);
999
1.54k
            SUBMODE(innovation_quant)(target, interp_qlpc, bw_lpc1, bw_lpc2,
1000
1.54k
                                      SUBMODE(innovation_params), NB_ORDER, NB_SUBFRAME_SIZE,
1001
1.54k
                                      innov2, syn_resp, bits, stack, st->complexity, 0);
1002
1.54k
            signal_mul(innov2, innov2, MULT16_32_Q15(QCONST16(0.454545f,15),ener), NB_SUBFRAME_SIZE);
1003
63.3k
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
1004
61.7k
               innov[i] = ADD32(innov[i],innov2[i]);
1005
1.54k
            stack = tmp_stack;
1006
1.54k
         }
1007
2.61M
         for (i=0;i<NB_SUBFRAME_SIZE;i++)
1008
2.55M
            exc[i] = EXTRACT16(SATURATE32(PSHR32(ADD32(SHL32(exc32[i],1),innov[i]),SIG_SHIFT),32767));
1009
63.8k
         if (st->innov_rms_save)
1010
17.6k
            st->innov_rms_save[sub] = compute_rms(innov, NB_SUBFRAME_SIZE);
1011
63.8k
      }
1012
1013
      /* Final signal synthesis from excitation */
1014
63.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
63.8k
      if (st->complexity!=0)
1018
51.2k
         filter10(sw, bw_lpc1, bw_lpc2, sw, NB_SUBFRAME_SIZE, st->mem_sw, stack);
1019
1020
63.8k
   }
1021
1022
   /* Store the LSPs for interpolation in the next frame */
1023
15.9k
   if (st->submodeID>=1)
1024
15.9k
   {
1025
175k
      for (i=0;i<NB_ORDER;i++)
1026
159k
         st->old_lsp[i] = lsp[i];
1027
175k
      for (i=0;i<NB_ORDER;i++)
1028
159k
         st->old_qlsp[i] = qlsp[i];
1029
15.9k
   }
1030
1031
#ifdef VORBIS_PSYCHO
1032
   if (st->submodeID>=1)
1033
      SPEEX_COPY(st->old_curve, st->curve, 128);
1034
#endif
1035
1036
15.9k
   if (st->submodeID==1)
1037
7.89k
   {
1038
7.89k
#ifndef DISABLE_VBR
1039
7.89k
      if (st->dtx_count)
1040
2.09k
         speex_bits_pack(bits, 15, 4);
1041
5.79k
      else
1042
5.79k
#endif
1043
5.79k
         speex_bits_pack(bits, 0, 4);
1044
7.89k
   }
1045
1046
   /* The next frame will not be the first (Duh!) */
1047
15.9k
   st->first = 0;
1048
15.9k
   SPEEX_COPY(st->winBuf, in+2*NB_FRAME_SIZE-NB_WINDOW_SIZE, NB_WINDOW_SIZE-NB_FRAME_SIZE);
1049
1050
15.9k
   if (SUBMODE(innovation_quant) == noise_codebook_quant || st->submodeID==0)
1051
7.89k
      st->bounded_pitch = 1;
1052
8.06k
   else
1053
8.06k
      st->bounded_pitch = 0;
1054
1055
15.9k
   return 1;
1056
16.9k
}
1057
#endif /* DISABLE_ENCODER */
1058
1059
1060
#ifndef DISABLE_DECODER
1061
void *nb_decoder_init(const SpeexMode *m)
1062
2.97k
{
1063
2.97k
   DecState *st;
1064
2.97k
   const SpeexNBMode *mode;
1065
2.97k
   int i;
1066
1067
2.97k
   mode=(const SpeexNBMode*)m->mode;
1068
2.97k
   st = (DecState *)speex_alloc(sizeof(DecState));
1069
2.97k
   if (!st)
1070
0
      return NULL;
1071
2.97k
#if defined(VAR_ARRAYS) || defined (USE_ALLOCA)
1072
2.97k
   st->stack = NULL;
1073
#else
1074
   st->stack = (char*)speex_alloc_scratch(NB_DEC_STACK);
1075
#endif
1076
1077
2.97k
   st->mode=m;
1078
1079
1080
2.97k
   st->encode_submode = 1;
1081
1082
2.97k
   st->first=1;
1083
   /* Codec parameters, should eventually have several "modes"*/
1084
1085
2.97k
   st->submodes=mode->submodes;
1086
2.97k
   st->submodeID=mode->defaultSubmode;
1087
1088
2.97k
   st->lpc_enh_enabled=1;
1089
1090
2.97k
   SPEEX_MEMSET(st->excBuf, 0, NB_FRAME_SIZE + NB_PITCH_END);
1091
1092
2.97k
   st->last_pitch = 40;
1093
2.97k
   st->count_lost=0;
1094
2.97k
   st->pitch_gain_buf[0] = st->pitch_gain_buf[1] = st->pitch_gain_buf[2] = 0;
1095
2.97k
   st->pitch_gain_buf_idx = 0;
1096
2.97k
   st->seed = 1000;
1097
1098
2.97k
   st->sampling_rate=8000;
1099
2.97k
   st->last_ol_gain = 0;
1100
1101
2.97k
   st->user_callback.func = &speex_default_user_handler;
1102
2.97k
   st->user_callback.data = NULL;
1103
50.5k
   for (i=0;i<16;i++)
1104
47.5k
      st->speex_callbacks[i].func = NULL;
1105
1106
2.97k
   st->voc_m1=st->voc_m2=st->voc_mean=0;
1107
2.97k
   st->voc_offset=0;
1108
2.97k
   st->dtx_enabled=0;
1109
2.97k
   st->isWideband = 0;
1110
2.97k
   st->highpass_enabled = 1;
1111
1112
#ifdef ENABLE_VALGRIND
1113
   VALGRIND_MAKE_MEM_DEFINED(st, NB_DEC_STACK);
1114
#endif
1115
2.97k
   return st;
1116
2.97k
}
1117
1118
void nb_decoder_destroy(void *state)
1119
2.97k
{
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
2.97k
   speex_free(state);
1128
2.97k
}
1129
1130
int nb_decoder_ctl(void *state, int request, void *ptr)
1131
180k
{
1132
180k
   DecState *st;
1133
180k
   st=(DecState*)state;
1134
180k
   switch(request)
1135
180k
   {
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
2.97k
   case SPEEX_SET_ENH:
1145
2.97k
      st->lpc_enh_enabled = *((spx_int32_t*)ptr);
1146
2.97k
      break;
1147
0
   case SPEEX_GET_ENH:
1148
0
      *((spx_int32_t*)ptr) = st->lpc_enh_enabled;
1149
0
      break;
1150
8.97k
   case SPEEX_GET_FRAME_SIZE:
1151
8.97k
      (*(spx_int32_t*)ptr) = NB_FRAME_SIZE;
1152
8.97k
      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
2.97k
   case SPEEX_SET_SAMPLING_RATE:
1160
2.97k
      st->sampling_rate = (*(spx_int32_t*)ptr);
1161
2.97k
      break;
1162
2.06k
   case SPEEX_GET_SAMPLING_RATE:
1163
2.06k
      (*(spx_int32_t*)ptr)=st->sampling_rate;
1164
2.06k
      break;
1165
1.48k
   case SPEEX_SET_HANDLER:
1166
1.48k
      {
1167
1.48k
         SpeexCallback *c = (SpeexCallback*)ptr;
1168
1.48k
         st->speex_callbacks[c->callback_id].func=c->func;
1169
1.48k
         st->speex_callbacks[c->callback_id].data=c->data;
1170
1.48k
         st->speex_callbacks[c->callback_id].callback_id=c->callback_id;
1171
1.48k
      }
1172
1.48k
      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
2.87k
   case SPEEX_GET_LOOKAHEAD:
1197
2.87k
      (*(spx_int32_t*)ptr)=NB_SUBFRAME_SIZE;
1198
2.87k
      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.99k
   case SPEEX_GET_PI_GAIN:
1222
4.99k
      {
1223
4.99k
         int i;
1224
4.99k
         spx_word32_t *g = (spx_word32_t*)ptr;
1225
24.9k
         for (i=0;i<NB_NB_SUBFRAMES;i++)
1226
19.9k
            g[i]=st->pi_gain[i];
1227
4.99k
      }
1228
4.99k
      break;
1229
4.99k
   case SPEEX_GET_EXC:
1230
4.99k
      {
1231
4.99k
         int i;
1232
24.9k
         for (i=0;i<NB_NB_SUBFRAMES;i++)
1233
19.9k
            ((spx_word16_t*)ptr)[i] = compute_rms16(st->exc+i*NB_SUBFRAME_SIZE, NB_SUBFRAME_SIZE);
1234
4.99k
      }
1235
4.99k
      break;
1236
91.5k
   case SPEEX_GET_DTX_STATUS:
1237
91.5k
      *((spx_int32_t*)ptr) = st->dtx_enabled;
1238
91.5k
      break;
1239
54.3k
   case SPEEX_SET_INNOVATION_SAVE:
1240
54.3k
      st->innov_save = (spx_word16_t*)ptr;
1241
54.3k
      break;
1242
3.48k
   case SPEEX_SET_WIDEBAND:
1243
3.48k
      st->isWideband = *((spx_int32_t*)ptr);
1244
3.48k
      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
180k
   }
1252
180k
   return 0;
1253
180k
}
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
71.0k
{
1332
71.0k
   DecState *st;
1333
71.0k
   int i, sub;
1334
71.0k
   int pitch;
1335
71.0k
   spx_word16_t pitch_gain[3];
1336
71.0k
   spx_word32_t ol_gain=0;
1337
71.0k
   int ol_pitch=0;
1338
71.0k
   spx_word16_t ol_pitch_coef=0;
1339
71.0k
   int best_pitch=40;
1340
71.0k
   spx_word16_t best_pitch_gain=0;
1341
71.0k
   int wideband;
1342
71.0k
   int m;
1343
71.0k
   char *stack;
1344
71.0k
   VARDECL(spx_sig_t *innov);
1345
71.0k
   VARDECL(spx_word32_t *exc32);
1346
71.0k
   VARDECL(spx_coef_t *ak);
1347
71.0k
   VARDECL(spx_lsp_t *qlsp);
1348
71.0k
   spx_word16_t pitch_average=0;
1349
1350
71.0k
   spx_word16_t *out = (spx_word16_t*)vout;
1351
71.0k
   VARDECL(spx_lsp_t *interp_qlsp);
1352
1353
71.0k
   st=(DecState*)state;
1354
71.0k
   stack=st->stack;
1355
1356
71.0k
   st->exc = st->excBuf + 2*NB_PITCH_END + NB_SUBFRAME_SIZE + 6;
1357
1358
   /* Check if we're in DTX mode*/
1359
71.0k
   if (!bits && st->dtx_enabled)
1360
0
   {
1361
0
      st->submodeID=0;
1362
0
   } else
1363
71.0k
   {
1364
      /* If bits is NULL, consider the packet to be lost (what could we do anyway) */
1365
71.0k
      if (!bits)
1366
0
      {
1367
0
         nb_decode_lost(st, out, stack);
1368
0
         return 0;
1369
0
      }
1370
1371
71.0k
      if (st->encode_submode)
1372
71.0k
      {
1373
1374
      /* Search for next narrowband block (handle requests, skip wideband blocks) */
1375
76.0k
      do {
1376
76.0k
         if (speex_bits_remaining(bits)<5)
1377
12.5k
            return -1;
1378
63.5k
         wideband = speex_bits_unpack_unsigned(bits, 1);
1379
63.5k
         if (wideband) /* Skip wideband block (for compatibility) */
1380
5.38k
         {
1381
5.38k
            int submode;
1382
5.38k
            int advance;
1383
5.38k
            advance = submode = speex_bits_unpack_unsigned(bits, SB_SUBMODE_BITS);
1384
            /*speex_mode_query(&speex_wb_mode, SPEEX_SUBMODE_BITS_PER_FRAME, &advance);*/
1385
5.38k
            advance = wb_skip_table[submode];
1386
5.38k
            if (advance < 0)
1387
0
            {
1388
0
               speex_notify("Invalid mode encountered. The stream is corrupted.");
1389
0
               return -2;
1390
0
            }
1391
5.38k
            advance -= (SB_SUBMODE_BITS+1);
1392
5.38k
            speex_bits_advance(bits, advance);
1393
1394
5.38k
            if (speex_bits_remaining(bits)<5)
1395
1.59k
               return -1;
1396
3.79k
            wideband = speex_bits_unpack_unsigned(bits, 1);
1397
3.79k
            if (wideband)
1398
3.12k
            {
1399
3.12k
               advance = submode = speex_bits_unpack_unsigned(bits, SB_SUBMODE_BITS);
1400
               /*speex_mode_query(&speex_wb_mode, SPEEX_SUBMODE_BITS_PER_FRAME, &advance);*/
1401
3.12k
               advance = wb_skip_table[submode];
1402
3.12k
               if (advance < 0)
1403
0
               {
1404
0
                  speex_notify("Invalid mode encountered. The stream is corrupted.");
1405
0
                  return -2;
1406
0
               }
1407
3.12k
               advance -= (SB_SUBMODE_BITS+1);
1408
3.12k
               speex_bits_advance(bits, advance);
1409
3.12k
               wideband = speex_bits_unpack_unsigned(bits, 1);
1410
3.12k
               if (wideband)
1411
2.61k
               {
1412
2.61k
                  speex_notify("More than two wideband layers found. The stream is corrupted.");
1413
2.61k
                  return -2;
1414
2.61k
               }
1415
1416
3.12k
            }
1417
3.79k
         }
1418
59.2k
         if (speex_bits_remaining(bits)<4)
1419
499
            return -1;
1420
         /* FIXME: Check for overflow */
1421
58.7k
         m = speex_bits_unpack_unsigned(bits, 4);
1422
58.7k
         if (m==15) /* We found a terminator */
1423
759
         {
1424
759
            return -1;
1425
58.0k
         } else if (m==14) /* Speex in-band request */
1426
4.35k
         {
1427
4.35k
            int ret = speex_inband_handler(bits, st->speex_callbacks, state);
1428
4.35k
            if (ret)
1429
0
               return ret;
1430
53.6k
         } else if (m==13) /* User in-band request */
1431
694
         {
1432
694
            int ret = st->user_callback.func(bits, state, st->user_callback.data);
1433
694
            if (ret)
1434
0
               return ret;
1435
52.9k
         } else if (m>8) /* Invalid mode */
1436
4.46k
         {
1437
4.46k
            speex_notify("Invalid mode encountered. The stream is corrupted.");
1438
4.46k
            return -2;
1439
4.46k
         }
1440
1441
58.7k
      } while (m>8);
1442
1443
      /* Get the sub-mode that was used */
1444
48.5k
      st->submodeID = m;
1445
48.5k
      }
1446
1447
71.0k
   }
1448
1449
   /* Shift all buffers by one frame */
1450
48.5k
   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
48.5k
   if (st->submodes[st->submodeID] == NULL)
1454
23.8k
   {
1455
23.8k
      VARDECL(spx_coef_t *lpc);
1456
23.8k
      ALLOC(lpc, NB_ORDER, spx_coef_t);
1457
23.8k
      bw_lpc(QCONST16(0.93f,15), st->interp_qlpc, lpc, NB_ORDER);
1458
23.8k
      {
1459
23.8k
         spx_word16_t innov_gain=0;
1460
         /* FIXME: This was innov, not exc */
1461
23.8k
         innov_gain = compute_rms16(st->exc, NB_FRAME_SIZE);
1462
3.83M
         for (i=0;i<NB_FRAME_SIZE;i++)
1463
3.81M
            st->exc[i]=speex_rand(innov_gain, &st->seed);
1464
23.8k
      }
1465
1466
1467
23.8k
      st->first=1;
1468
1469
      /* Final signal synthesis from excitation */
1470
23.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
23.8k
      if (st->innov_save)
1475
18.9k
         SPEEX_MEMSET(st->innov_save, 0, NB_NB_SUBFRAMES*NB_SUBFRAME_SIZE);
1476
1477
23.8k
      st->count_lost=0;
1478
23.8k
      return 0;
1479
23.8k
   }
1480
1481
24.6k
   ALLOC(qlsp, NB_ORDER, spx_lsp_t);
1482
1483
   /* Unquantize LSPs */
1484
24.6k
   SUBMODE(lsp_unquant)(qlsp, NB_ORDER, bits);
1485
1486
   /*Damp memory if a frame was lost and the LSP changed too much*/
1487
24.6k
   if (st->count_lost)
1488
0
   {
1489
0
      spx_word16_t fact;
1490
0
      spx_word32_t lsp_dist=0;
1491
0
      for (i=0;i<NB_ORDER;i++)
1492
0
         lsp_dist = ADD32(lsp_dist, EXTEND32(ABS(st->old_qlsp[i] - qlsp[i])));
1493
#ifdef FIXED_POINT
1494
0
      fact = SHR16(19661,SHR32(lsp_dist,LSP_SHIFT+2));
1495
#else
1496
      fact = .6*exp(-.2*lsp_dist);
1497
#endif
1498
0
      for (i=0;i<NB_ORDER;i++)
1499
0
         st->mem_sp[i] = MULT16_32_Q15(fact,st->mem_sp[i]);
1500
0
   }
1501
1502
1503
   /* Handle first frame and lost-packet case */
1504
24.6k
   if (st->first || st->count_lost)
1505
5.65k
   {
1506
62.1k
      for (i=0;i<NB_ORDER;i++)
1507
56.5k
         st->old_qlsp[i] = qlsp[i];
1508
5.65k
   }
1509
1510
   /* Get open-loop pitch estimation for low bit-rate pitch coding */
1511
24.6k
   if (SUBMODE(lbr_pitch)!=-1)
1512
11.0k
   {
1513
11.0k
      ol_pitch = NB_PITCH_START+speex_bits_unpack_unsigned(bits, 7);
1514
11.0k
   }
1515
1516
24.6k
   if (SUBMODE(forced_pitch_gain))
1517
9.12k
   {
1518
9.12k
      int quant;
1519
9.12k
      quant = speex_bits_unpack_unsigned(bits, 4);
1520
9.12k
      ol_pitch_coef=MULT16_16_P15(QCONST16(0.066667,15),SHL16(quant,GAIN_SHIFT));
1521
9.12k
   }
1522
1523
   /* Get global excitation gain */
1524
24.6k
   {
1525
24.6k
      int qe;
1526
24.6k
      qe = speex_bits_unpack_unsigned(bits, 5);
1527
#ifdef FIXED_POINT
1528
      /* FIXME: Perhaps we could slightly lower the gain here when the output is going to saturate? */
1529
13.5k
      ol_gain = MULT16_32_Q15(28406,ol_gain_table[qe]);
1530
#else
1531
11.1k
      ol_gain = SIG_SCALING*exp(qe/3.5);
1532
#endif
1533
24.6k
   }
1534
1535
24.6k
   ALLOC(ak, NB_ORDER, spx_coef_t);
1536
24.6k
   ALLOC(innov, NB_SUBFRAME_SIZE, spx_sig_t);
1537
24.6k
   ALLOC(exc32, NB_SUBFRAME_SIZE, spx_word32_t);
1538
1539
24.6k
   if (st->submodeID==1)
1540
4.39k
   {
1541
4.39k
      int extra;
1542
4.39k
      extra = speex_bits_unpack_unsigned(bits, 4);
1543
1544
4.39k
      if (extra==15)
1545
809
         st->dtx_enabled=1;
1546
3.58k
      else
1547
3.58k
         st->dtx_enabled=0;
1548
4.39k
   }
1549
24.6k
   if (st->submodeID>1)
1550
20.2k
      st->dtx_enabled=0;
1551
1552
   /*Loop on subframes */
1553
123k
   for (sub=0;sub<NB_NB_SUBFRAMES;sub++)
1554
98.7k
   {
1555
98.7k
      int offset;
1556
98.7k
      spx_word16_t *exc;
1557
98.7k
      spx_word16_t *innov_save = NULL;
1558
98.7k
      spx_word16_t tmp;
1559
1560
      /* Offset relative to start of frame */
1561
98.7k
      offset = NB_SUBFRAME_SIZE*sub;
1562
      /* Excitation */
1563
98.7k
      exc=st->exc+offset;
1564
      /* Original signal */
1565
98.7k
      if (st->innov_save)
1566
73.4k
         innov_save = st->innov_save+offset;
1567
1568
1569
      /* Reset excitation */
1570
98.7k
      SPEEX_MEMSET(exc, 0, NB_SUBFRAME_SIZE);
1571
1572
      /*Adaptive codebook contribution*/
1573
98.7k
      speex_assert (SUBMODE(ltp_unquant));
1574
98.7k
      {
1575
98.7k
         int pit_min, pit_max;
1576
         /* Handle pitch constraints if any */
1577
98.7k
         if (SUBMODE(lbr_pitch) != -1)
1578
44.1k
         {
1579
44.1k
            int margin;
1580
44.1k
            margin = SUBMODE(lbr_pitch);
1581
44.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
44.1k
            } else {
1598
44.1k
               pit_min = pit_max = ol_pitch;
1599
44.1k
            }
1600
54.6k
         } else {
1601
54.6k
            pit_min = NB_PITCH_START;
1602
54.6k
            pit_max = NB_PITCH_END;
1603
54.6k
         }
1604
1605
1606
1607
98.7k
         SUBMODE(ltp_unquant)(exc, exc32, pit_min, pit_max, ol_pitch_coef, SUBMODE(ltp_params),
1608
98.7k
                 NB_SUBFRAME_SIZE, &pitch, &pitch_gain[0], bits, stack,
1609
98.7k
                 st->count_lost, offset, st->last_pitch_gain, 0);
1610
1611
         /* Ensuring that things aren't blowing up as would happen if e.g. an encoder is
1612
         crafting packets to make us produce NaNs and slow down the decoder (vague DoS threat).
1613
         We can probably be even more aggressive and limit to 15000 or so. */
1614
98.7k
         sanitize_values32(exc32, NEG32(QCONST32(32000,SIG_SHIFT-1)), QCONST32(32000,SIG_SHIFT-1), NB_SUBFRAME_SIZE);
1615
1616
98.7k
         tmp = gain_3tap_to_1tap(pitch_gain);
1617
1618
98.7k
         pitch_average += tmp;
1619
98.7k
         if ((tmp>best_pitch_gain&&ABS(2*best_pitch-pitch)>=3&&ABS(3*best_pitch-pitch)>=4&&ABS(4*best_pitch-pitch)>=5)
1620
89.5k
              || (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
87.9k
              || (MULT16_16_Q15(QCONST16(.67,15),tmp)>best_pitch_gain&&(ABS(2*best_pitch-pitch)<3||ABS(3*best_pitch-pitch)<4||ABS(4*best_pitch-pitch)<5)) )
1622
15.0k
         {
1623
15.0k
            best_pitch = pitch;
1624
15.0k
            if (tmp > best_pitch_gain)
1625
13.4k
               best_pitch_gain = tmp;
1626
15.0k
         }
1627
98.7k
      }
1628
1629
      /* Unquantize the innovation */
1630
98.7k
      {
1631
98.7k
         int q_energy;
1632
98.7k
         spx_word32_t ener;
1633
1634
98.7k
         SPEEX_MEMSET(innov, 0, NB_SUBFRAME_SIZE);
1635
1636
         /* Decode sub-frame gain correction */
1637
98.7k
         if (SUBMODE(have_subframe_gain)==3)
1638
20.1k
         {
1639
20.1k
            q_energy = speex_bits_unpack_unsigned(bits, 3);
1640
20.1k
            ener = MULT16_32_Q14(exc_gain_quant_scal3[q_energy],ol_gain);
1641
78.5k
         } else if (SUBMODE(have_subframe_gain)==1)
1642
34.4k
         {
1643
34.4k
            q_energy = speex_bits_unpack_unsigned(bits, 1);
1644
34.4k
            ener = MULT16_32_Q14(exc_gain_quant_scal1[q_energy],ol_gain);
1645
44.1k
         } else {
1646
44.1k
            ener = ol_gain;
1647
44.1k
         }
1648
1649
98.7k
         speex_assert (SUBMODE(innovation_unquant));
1650
98.7k
         {
1651
            /*Fixed codebook contribution*/
1652
98.7k
            SUBMODE(innovation_unquant)(innov, SUBMODE(innovation_params), NB_SUBFRAME_SIZE, bits, stack, &st->seed);
1653
            /* De-normalize innovation and update excitation */
1654
1655
98.7k
            signal_mul(innov, innov, ener, NB_SUBFRAME_SIZE);
1656
1657
            /* Decode second codebook (only for some modes) */
1658
98.7k
            if (SUBMODE(double_codebook))
1659
8.31k
            {
1660
8.31k
               char *tmp_stack=stack;
1661
8.31k
               VARDECL(spx_sig_t *innov2);
1662
8.31k
               ALLOC(innov2, NB_SUBFRAME_SIZE, spx_sig_t);
1663
8.31k
               SPEEX_MEMSET(innov2, 0, NB_SUBFRAME_SIZE);
1664
8.31k
               SUBMODE(innovation_unquant)(innov2, SUBMODE(innovation_params), NB_SUBFRAME_SIZE, bits, stack, &st->seed);
1665
8.31k
               signal_mul(innov2, innov2, MULT16_32_Q15(QCONST16(0.454545f,15),ener), NB_SUBFRAME_SIZE);
1666
340k
               for (i=0;i<NB_SUBFRAME_SIZE;i++)
1667
332k
                  innov[i] = ADD32(innov[i], innov2[i]);
1668
8.31k
               stack = tmp_stack;
1669
8.31k
            }
1670
4.05M
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
1671
3.95M
               exc[i]=EXTRACT16(SATURATE32(PSHR32(ADD32(SHL32(exc32[i],1),innov[i]),SIG_SHIFT),32767));
1672
            /*print_vec(exc, 40, "innov");*/
1673
98.7k
            if (innov_save)
1674
73.4k
            {
1675
3.00M
               for (i=0;i<NB_SUBFRAME_SIZE;i++)
1676
2.93M
                  innov_save[i] = EXTRACT16(PSHR32(innov[i], SIG_SHIFT));
1677
73.4k
            }
1678
98.7k
         }
1679
1680
         /*Vocoder mode*/
1681
98.7k
         if (st->submodeID==1)
1682
17.5k
         {
1683
17.5k
            spx_word16_t g=ol_pitch_coef;
1684
17.5k
            g=MULT16_16_P14(QCONST16(1.5f,14),(g-QCONST16(.2f,6)));
1685
17.5k
            if (g<0)
1686
10.3k
               g=0;
1687
17.5k
            if (g>GAIN_SCALING)
1688
2.53k
               g=GAIN_SCALING;
1689
1690
17.5k
            SPEEX_MEMSET(exc, 0, NB_SUBFRAME_SIZE);
1691
43.5k
            while (st->voc_offset<NB_SUBFRAME_SIZE)
1692
25.9k
            {
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
25.9k
               if (st->voc_offset>=0)
1696
25.9k
                  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
25.9k
               st->voc_offset+=ol_pitch;
1698
25.9k
            }
1699
17.5k
            st->voc_offset -= NB_SUBFRAME_SIZE;
1700
1701
721k
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
1702
703k
            {
1703
703k
               spx_word16_t exci=exc[i];
1704
703k
               exc[i]= ADD16(ADD16(MULT16_16_Q15(QCONST16(.7f,15),exc[i]) , MULT16_16_Q15(QCONST16(.3f,15),st->voc_m1)),
1705
703k
                             SUB16(MULT16_16_Q15(Q15_ONE-MULT16_16_16(QCONST16(.85f,9),g),EXTRACT16(PSHR32(innov[i],SIG_SHIFT))),
1706
703k
                                   MULT16_16_Q15(MULT16_16_16(QCONST16(.15f,9),g),EXTRACT16(PSHR32(st->voc_m2,SIG_SHIFT)))
1707
703k
                                  ));
1708
703k
               st->voc_m1 = exci;
1709
703k
               st->voc_m2=innov[i];
1710
703k
               st->voc_mean = EXTRACT16(PSHR32(ADD32(MULT16_16(QCONST16(.8f,15),st->voc_mean), MULT16_16(QCONST16(.2f,15),exc[i])), 15));
1711
703k
               exc[i]-=st->voc_mean;
1712
703k
            }
1713
17.5k
         }
1714
1715
98.7k
      }
1716
98.7k
   }
1717
1718
24.6k
   ALLOC(interp_qlsp, NB_ORDER, spx_lsp_t);
1719
1720
24.6k
   if (st->lpc_enh_enabled && SUBMODE(comb_gain)>0 && !st->count_lost)
1721
20.2k
   {
1722
20.2k
      multicomb(st->exc-NB_SUBFRAME_SIZE, out, st->interp_qlpc, NB_ORDER, 2*NB_SUBFRAME_SIZE, best_pitch, 40, SUBMODE(comb_gain), stack);
1723
20.2k
      multicomb(st->exc+NB_SUBFRAME_SIZE, out+2*NB_SUBFRAME_SIZE, st->interp_qlpc, NB_ORDER, 2*NB_SUBFRAME_SIZE, best_pitch, 40, SUBMODE(comb_gain), stack);
1724
20.2k
   } else {
1725
4.39k
      SPEEX_COPY(out, &st->exc[-NB_SUBFRAME_SIZE], NB_FRAME_SIZE);
1726
4.39k
   }
1727
1728
   /* If the last packet was lost, re-scale the excitation to obtain the same energy as encoded in ol_gain */
1729
24.6k
   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
123k
   for (sub=0;sub<NB_NB_SUBFRAMES;sub++)
1754
98.7k
   {
1755
98.7k
      int offset;
1756
98.7k
      spx_word16_t *sp;
1757
1758
      /* Offset relative to start of frame */
1759
98.7k
      offset = NB_SUBFRAME_SIZE*sub;
1760
      /* Original signal */
1761
98.7k
      sp=out+offset;
1762
1763
      /* LSP interpolation (quantized and unquantized) */
1764
98.7k
      lsp_interpolate(st->old_qlsp, qlsp, interp_qlsp, NB_ORDER, sub, NB_NB_SUBFRAMES, LSP_MARGIN);
1765
1766
      /* Compute interpolated LPCs (unquantized) */
1767
98.7k
      lsp_to_lpc(interp_qlsp, ak, NB_ORDER, stack);
1768
1769
      /* Compute analysis filter at w=pi */
1770
98.7k
      {
1771
98.7k
         spx_word32_t pi_g=LPC_SCALING;
1772
592k
         for (i=0;i<NB_ORDER;i+=2)
1773
493k
         {
1774
            /*pi_g += -st->interp_qlpc[i] +  st->interp_qlpc[i+1];*/
1775
493k
            pi_g = ADD32(pi_g, SUB32(EXTEND32(ak[i+1]),EXTEND32(ak[i])));
1776
493k
         }
1777
98.7k
         st->pi_gain[sub] = pi_g;
1778
98.7k
      }
1779
1780
98.7k
      iir_mem16(sp, st->interp_qlpc, sp, NB_SUBFRAME_SIZE, NB_ORDER,
1781
98.7k
                st->mem_sp, stack);
1782
1783
1.08M
      for (i=0;i<NB_ORDER;i++)
1784
987k
         st->interp_qlpc[i] = ak[i];
1785
1786
98.7k
   }
1787
1788
24.6k
   if (st->highpass_enabled)
1789
24.6k
      highpass(out, out, NB_FRAME_SIZE, (st->isWideband?HIGHPASS_WIDEBAND:HIGHPASS_NARROWBAND)|HIGHPASS_OUTPUT, st->mem_hp);
1790
   /*for (i=0;i<NB_FRAME_SIZE;i++)
1791
     printf ("%d\n", (int)st->frame[i]);*/
1792
1793
   /* Tracking output level */
1794
24.6k
   st->level = 1+PSHR32(ol_gain,SIG_SHIFT);
1795
24.6k
   st->max_level = MAX16(MULT16_16_Q15(QCONST16(.99f,15), st->max_level), st->level);
1796
24.6k
   st->min_level = MIN16(ADD16(1,MULT16_16_Q14(QCONST16(1.01f,14), st->min_level)), st->level);
1797
24.6k
   if (st->max_level < st->min_level+1)
1798
7.84k
      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
271k
   for (i=0;i<NB_ORDER;i++)
1803
246k
      st->old_qlsp[i] = qlsp[i];
1804
1805
   /* The next frame will not be the first (Duh!) */
1806
24.6k
   st->first = 0;
1807
24.6k
   st->count_lost=0;
1808
24.6k
   st->last_pitch = best_pitch;
1809
#ifdef FIXED_POINT
1810
13.5k
   st->last_pitch_gain = PSHR16(pitch_average,2);
1811
#else
1812
   st->last_pitch_gain = .25*pitch_average;
1813
#endif
1814
24.6k
   st->pitch_gain_buf[st->pitch_gain_buf_idx++] = st->last_pitch_gain;
1815
24.6k
   if (st->pitch_gain_buf_idx > 2) /* rollover */
1816
7.63k
      st->pitch_gain_buf_idx = 0;
1817
1818
24.6k
   st->last_ol_gain = ol_gain;
1819
1820
24.6k
   return 0;
1821
48.5k
}
nb_decode
Line
Count
Source
1331
33.8k
{
1332
33.8k
   DecState *st;
1333
33.8k
   int i, sub;
1334
33.8k
   int pitch;
1335
33.8k
   spx_word16_t pitch_gain[3];
1336
33.8k
   spx_word32_t ol_gain=0;
1337
33.8k
   int ol_pitch=0;
1338
33.8k
   spx_word16_t ol_pitch_coef=0;
1339
33.8k
   int best_pitch=40;
1340
33.8k
   spx_word16_t best_pitch_gain=0;
1341
33.8k
   int wideband;
1342
33.8k
   int m;
1343
33.8k
   char *stack;
1344
33.8k
   VARDECL(spx_sig_t *innov);
1345
33.8k
   VARDECL(spx_word32_t *exc32);
1346
33.8k
   VARDECL(spx_coef_t *ak);
1347
33.8k
   VARDECL(spx_lsp_t *qlsp);
1348
33.8k
   spx_word16_t pitch_average=0;
1349
1350
33.8k
   spx_word16_t *out = (spx_word16_t*)vout;
1351
33.8k
   VARDECL(spx_lsp_t *interp_qlsp);
1352
1353
33.8k
   st=(DecState*)state;
1354
33.8k
   stack=st->stack;
1355
1356
33.8k
   st->exc = st->excBuf + 2*NB_PITCH_END + NB_SUBFRAME_SIZE + 6;
1357
1358
   /* Check if we're in DTX mode*/
1359
33.8k
   if (!bits && st->dtx_enabled)
1360
0
   {
1361
0
      st->submodeID=0;
1362
0
   } else
1363
33.8k
   {
1364
      /* If bits is NULL, consider the packet to be lost (what could we do anyway) */
1365
33.8k
      if (!bits)
1366
0
      {
1367
0
         nb_decode_lost(st, out, stack);
1368
0
         return 0;
1369
0
      }
1370
1371
33.8k
      if (st->encode_submode)
1372
33.8k
      {
1373
1374
      /* Search for next narrowband block (handle requests, skip wideband blocks) */
1375
36.4k
      do {
1376
36.4k
         if (speex_bits_remaining(bits)<5)
1377
7.90k
            return -1;
1378
28.5k
         wideband = speex_bits_unpack_unsigned(bits, 1);
1379
28.5k
         if (wideband) /* Skip wideband block (for compatibility) */
1380
2.24k
         {
1381
2.24k
            int submode;
1382
2.24k
            int advance;
1383
2.24k
            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.24k
            advance = wb_skip_table[submode];
1386
2.24k
            if (advance < 0)
1387
0
            {
1388
0
               speex_notify("Invalid mode encountered. The stream is corrupted.");
1389
0
               return -2;
1390
0
            }
1391
2.24k
            advance -= (SB_SUBMODE_BITS+1);
1392
2.24k
            speex_bits_advance(bits, advance);
1393
1394
2.24k
            if (speex_bits_remaining(bits)<5)
1395
796
               return -1;
1396
1.45k
            wideband = speex_bits_unpack_unsigned(bits, 1);
1397
1.45k
            if (wideband)
1398
1.19k
            {
1399
1.19k
               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.19k
               advance = wb_skip_table[submode];
1402
1.19k
               if (advance < 0)
1403
0
               {
1404
0
                  speex_notify("Invalid mode encountered. The stream is corrupted.");
1405
0
                  return -2;
1406
0
               }
1407
1.19k
               advance -= (SB_SUBMODE_BITS+1);
1408
1.19k
               speex_bits_advance(bits, advance);
1409
1.19k
               wideband = speex_bits_unpack_unsigned(bits, 1);
1410
1.19k
               if (wideband)
1411
941
               {
1412
941
                  speex_notify("More than two wideband layers found. The stream is corrupted.");
1413
941
                  return -2;
1414
941
               }
1415
1416
1.19k
            }
1417
1.45k
         }
1418
26.8k
         if (speex_bits_remaining(bits)<4)
1419
246
            return -1;
1420
         /* FIXME: Check for overflow */
1421
26.5k
         m = speex_bits_unpack_unsigned(bits, 4);
1422
26.5k
         if (m==15) /* We found a terminator */
1423
371
         {
1424
371
            return -1;
1425
26.1k
         } else if (m==14) /* Speex in-band request */
1426
2.28k
         {
1427
2.28k
            int ret = speex_inband_handler(bits, st->speex_callbacks, state);
1428
2.28k
            if (ret)
1429
0
               return ret;
1430
23.9k
         } else if (m==13) /* User in-band request */
1431
364
         {
1432
364
            int ret = st->user_callback.func(bits, state, st->user_callback.data);
1433
364
            if (ret)
1434
0
               return ret;
1435
23.5k
         } else if (m>8) /* Invalid mode */
1436
1.92k
         {
1437
1.92k
            speex_notify("Invalid mode encountered. The stream is corrupted.");
1438
1.92k
            return -2;
1439
1.92k
         }
1440
1441
26.5k
      } while (m>8);
1442
1443
      /* Get the sub-mode that was used */
1444
21.6k
      st->submodeID = m;
1445
21.6k
      }
1446
1447
33.8k
   }
1448
1449
   /* Shift all buffers by one frame */
1450
21.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
21.6k
   if (st->submodes[st->submodeID] == NULL)
1454
10.4k
   {
1455
10.4k
      VARDECL(spx_coef_t *lpc);
1456
10.4k
      ALLOC(lpc, NB_ORDER, spx_coef_t);
1457
10.4k
      bw_lpc(QCONST16(0.93f,15), st->interp_qlpc, lpc, NB_ORDER);
1458
10.4k
      {
1459
10.4k
         spx_word16_t innov_gain=0;
1460
         /* FIXME: This was innov, not exc */
1461
10.4k
         innov_gain = compute_rms16(st->exc, NB_FRAME_SIZE);
1462
1.68M
         for (i=0;i<NB_FRAME_SIZE;i++)
1463
1.67M
            st->exc[i]=speex_rand(innov_gain, &st->seed);
1464
10.4k
      }
1465
1466
1467
10.4k
      st->first=1;
1468
1469
      /* Final signal synthesis from excitation */
1470
10.4k
      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.4k
      if (st->innov_save)
1475
8.31k
         SPEEX_MEMSET(st->innov_save, 0, NB_NB_SUBFRAMES*NB_SUBFRAME_SIZE);
1476
1477
10.4k
      st->count_lost=0;
1478
10.4k
      return 0;
1479
10.4k
   }
1480
1481
11.1k
   ALLOC(qlsp, NB_ORDER, spx_lsp_t);
1482
1483
   /* Unquantize LSPs */
1484
11.1k
   SUBMODE(lsp_unquant)(qlsp, NB_ORDER, bits);
1485
1486
   /*Damp memory if a frame was lost and the LSP changed too much*/
1487
11.1k
   if (st->count_lost)
1488
0
   {
1489
0
      spx_word16_t fact;
1490
0
      spx_word32_t lsp_dist=0;
1491
0
      for (i=0;i<NB_ORDER;i++)
1492
0
         lsp_dist = ADD32(lsp_dist, EXTEND32(ABS(st->old_qlsp[i] - qlsp[i])));
1493
#ifdef FIXED_POINT
1494
      fact = SHR16(19661,SHR32(lsp_dist,LSP_SHIFT+2));
1495
#else
1496
0
      fact = .6*exp(-.2*lsp_dist);
1497
0
#endif
1498
0
      for (i=0;i<NB_ORDER;i++)
1499
0
         st->mem_sp[i] = MULT16_32_Q15(fact,st->mem_sp[i]);
1500
0
   }
1501
1502
1503
   /* Handle first frame and lost-packet case */
1504
11.1k
   if (st->first || st->count_lost)
1505
2.37k
   {
1506
26.1k
      for (i=0;i<NB_ORDER;i++)
1507
23.7k
         st->old_qlsp[i] = qlsp[i];
1508
2.37k
   }
1509
1510
   /* Get open-loop pitch estimation for low bit-rate pitch coding */
1511
11.1k
   if (SUBMODE(lbr_pitch)!=-1)
1512
4.93k
   {
1513
4.93k
      ol_pitch = NB_PITCH_START+speex_bits_unpack_unsigned(bits, 7);
1514
4.93k
   }
1515
1516
11.1k
   if (SUBMODE(forced_pitch_gain))
1517
4.35k
   {
1518
4.35k
      int quant;
1519
4.35k
      quant = speex_bits_unpack_unsigned(bits, 4);
1520
4.35k
      ol_pitch_coef=MULT16_16_P15(QCONST16(0.066667,15),SHL16(quant,GAIN_SHIFT));
1521
4.35k
   }
1522
1523
   /* Get global excitation gain */
1524
11.1k
   {
1525
11.1k
      int qe;
1526
11.1k
      qe = speex_bits_unpack_unsigned(bits, 5);
1527
#ifdef FIXED_POINT
1528
      /* FIXME: Perhaps we could slightly lower the gain here when the output is going to saturate? */
1529
      ol_gain = MULT16_32_Q15(28406,ol_gain_table[qe]);
1530
#else
1531
11.1k
      ol_gain = SIG_SCALING*exp(qe/3.5);
1532
11.1k
#endif
1533
11.1k
   }
1534
1535
11.1k
   ALLOC(ak, NB_ORDER, spx_coef_t);
1536
11.1k
   ALLOC(innov, NB_SUBFRAME_SIZE, spx_sig_t);
1537
11.1k
   ALLOC(exc32, NB_SUBFRAME_SIZE, spx_word32_t);
1538
1539
11.1k
   if (st->submodeID==1)
1540
1.88k
   {
1541
1.88k
      int extra;
1542
1.88k
      extra = speex_bits_unpack_unsigned(bits, 4);
1543
1544
1.88k
      if (extra==15)
1545
311
         st->dtx_enabled=1;
1546
1.57k
      else
1547
1.57k
         st->dtx_enabled=0;
1548
1.88k
   }
1549
11.1k
   if (st->submodeID>1)
1550
9.29k
      st->dtx_enabled=0;
1551
1552
   /*Loop on subframes */
1553
55.8k
   for (sub=0;sub<NB_NB_SUBFRAMES;sub++)
1554
44.6k
   {
1555
44.6k
      int offset;
1556
44.6k
      spx_word16_t *exc;
1557
44.6k
      spx_word16_t *innov_save = NULL;
1558
44.6k
      spx_word16_t tmp;
1559
1560
      /* Offset relative to start of frame */
1561
44.6k
      offset = NB_SUBFRAME_SIZE*sub;
1562
      /* Excitation */
1563
44.6k
      exc=st->exc+offset;
1564
      /* Original signal */
1565
44.6k
      if (st->innov_save)
1566
31.7k
         innov_save = st->innov_save+offset;
1567
1568
1569
      /* Reset excitation */
1570
44.6k
      SPEEX_MEMSET(exc, 0, NB_SUBFRAME_SIZE);
1571
1572
      /*Adaptive codebook contribution*/
1573
44.6k
      speex_assert (SUBMODE(ltp_unquant));
1574
44.6k
      {
1575
44.6k
         int pit_min, pit_max;
1576
         /* Handle pitch constraints if any */
1577
44.6k
         if (SUBMODE(lbr_pitch) != -1)
1578
19.7k
         {
1579
19.7k
            int margin;
1580
19.7k
            margin = SUBMODE(lbr_pitch);
1581
19.7k
            if (margin)
1582
0
            {
1583
/* GT - need optimization?
1584
               if (ol_pitch < NB_PITCH_START+margin-1)
1585
                  ol_pitch=NB_PITCH_START+margin-1;
1586
               if (ol_pitch > NB_PITCH_END-margin)
1587
                  ol_pitch=NB_PITCH_END-margin;
1588
               pit_min = ol_pitch-margin+1;
1589
               pit_max = ol_pitch+margin;
1590
*/
1591
0
               pit_min = ol_pitch-margin+1;
1592
0
               if (pit_min < NB_PITCH_START)
1593
0
      pit_min = NB_PITCH_START;
1594
0
               pit_max = ol_pitch+margin;
1595
0
               if (pit_max > NB_PITCH_END)
1596
0
      pit_max = NB_PITCH_END;
1597
19.7k
            } else {
1598
19.7k
               pit_min = pit_max = ol_pitch;
1599
19.7k
            }
1600
24.9k
         } else {
1601
24.9k
            pit_min = NB_PITCH_START;
1602
24.9k
            pit_max = NB_PITCH_END;
1603
24.9k
         }
1604
1605
1606
1607
44.6k
         SUBMODE(ltp_unquant)(exc, exc32, pit_min, pit_max, ol_pitch_coef, SUBMODE(ltp_params),
1608
44.6k
                 NB_SUBFRAME_SIZE, &pitch, &pitch_gain[0], bits, stack,
1609
44.6k
                 st->count_lost, offset, st->last_pitch_gain, 0);
1610
1611
         /* Ensuring that things aren't blowing up as would happen if e.g. an encoder is
1612
         crafting packets to make us produce NaNs and slow down the decoder (vague DoS threat).
1613
         We can probably be even more aggressive and limit to 15000 or so. */
1614
44.6k
         sanitize_values32(exc32, NEG32(QCONST32(32000,SIG_SHIFT-1)), QCONST32(32000,SIG_SHIFT-1), NB_SUBFRAME_SIZE);
1615
1616
44.6k
         tmp = gain_3tap_to_1tap(pitch_gain);
1617
1618
44.6k
         pitch_average += tmp;
1619
44.6k
         if ((tmp>best_pitch_gain&&ABS(2*best_pitch-pitch)>=3&&ABS(3*best_pitch-pitch)>=4&&ABS(4*best_pitch-pitch)>=5)
1620
41.4k
              || (tmp>MULT16_16_Q15(QCONST16(.6,15),best_pitch_gain)&&(ABS(best_pitch-2*pitch)<3||ABS(best_pitch-3*pitch)<4||ABS(best_pitch-4*pitch)<5))
1621
40.6k
              || (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.69k
         {
1623
5.69k
            best_pitch = pitch;
1624
5.69k
            if (tmp > best_pitch_gain)
1625
4.86k
               best_pitch_gain = tmp;
1626
5.69k
         }
1627
44.6k
      }
1628
1629
      /* Unquantize the innovation */
1630
44.6k
      {
1631
44.6k
         int q_energy;
1632
44.6k
         spx_word32_t ener;
1633
1634
44.6k
         SPEEX_MEMSET(innov, 0, NB_SUBFRAME_SIZE);
1635
1636
         /* Decode sub-frame gain correction */
1637
44.6k
         if (SUBMODE(have_subframe_gain)==3)
1638
10.7k
         {
1639
10.7k
            q_energy = speex_bits_unpack_unsigned(bits, 3);
1640
10.7k
            ener = MULT16_32_Q14(exc_gain_quant_scal3[q_energy],ol_gain);
1641
33.9k
         } else if (SUBMODE(have_subframe_gain)==1)
1642
14.2k
         {
1643
14.2k
            q_energy = speex_bits_unpack_unsigned(bits, 1);
1644
14.2k
            ener = MULT16_32_Q14(exc_gain_quant_scal1[q_energy],ol_gain);
1645
19.7k
         } else {
1646
19.7k
            ener = ol_gain;
1647
19.7k
         }
1648
1649
44.6k
         speex_assert (SUBMODE(innovation_unquant));
1650
44.6k
         {
1651
            /*Fixed codebook contribution*/
1652
44.6k
            SUBMODE(innovation_unquant)(innov, SUBMODE(innovation_params), NB_SUBFRAME_SIZE, bits, stack, &st->seed);
1653
            /* De-normalize innovation and update excitation */
1654
1655
44.6k
            signal_mul(innov, innov, ener, NB_SUBFRAME_SIZE);
1656
1657
            /* Decode second codebook (only for some modes) */
1658
44.6k
            if (SUBMODE(double_codebook))
1659
4.34k
            {
1660
4.34k
               char *tmp_stack=stack;
1661
4.34k
               VARDECL(spx_sig_t *innov2);
1662
4.34k
               ALLOC(innov2, NB_SUBFRAME_SIZE, spx_sig_t);
1663
4.34k
               SPEEX_MEMSET(innov2, 0, NB_SUBFRAME_SIZE);
1664
4.34k
               SUBMODE(innovation_unquant)(innov2, SUBMODE(innovation_params), NB_SUBFRAME_SIZE, bits, stack, &st->seed);
1665
4.34k
               signal_mul(innov2, innov2, MULT16_32_Q15(QCONST16(0.454545f,15),ener), NB_SUBFRAME_SIZE);
1666
178k
               for (i=0;i<NB_SUBFRAME_SIZE;i++)
1667
173k
                  innov[i] = ADD32(innov[i], innov2[i]);
1668
4.34k
               stack = tmp_stack;
1669
4.34k
            }
1670
1.83M
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
1671
1.78M
               exc[i]=EXTRACT16(SATURATE32(PSHR32(ADD32(SHL32(exc32[i],1),innov[i]),SIG_SHIFT),32767));
1672
            /*print_vec(exc, 40, "innov");*/
1673
44.6k
            if (innov_save)
1674
31.7k
            {
1675
1.30M
               for (i=0;i<NB_SUBFRAME_SIZE;i++)
1676
1.27M
                  innov_save[i] = EXTRACT16(PSHR32(innov[i], SIG_SHIFT));
1677
31.7k
            }
1678
44.6k
         }
1679
1680
         /*Vocoder mode*/
1681
44.6k
         if (st->submodeID==1)
1682
7.53k
         {
1683
7.53k
            spx_word16_t g=ol_pitch_coef;
1684
7.53k
            g=MULT16_16_P14(QCONST16(1.5f,14),(g-QCONST16(.2f,6)));
1685
7.53k
            if (g<0)
1686
5.00k
               g=0;
1687
7.53k
            if (g>GAIN_SCALING)
1688
1.22k
               g=GAIN_SCALING;
1689
1690
7.53k
            SPEEX_MEMSET(exc, 0, NB_SUBFRAME_SIZE);
1691
20.1k
            while (st->voc_offset<NB_SUBFRAME_SIZE)
1692
12.5k
            {
1693
               /* exc[st->voc_offset]= g*sqrt(2*ol_pitch)*ol_gain;
1694
                  Not quite sure why we need the factor of two in the sqrt */
1695
12.5k
               if (st->voc_offset>=0)
1696
12.5k
                  exc[st->voc_offset]=MULT16_16(spx_sqrt(MULT16_16_16(2,ol_pitch)),EXTRACT16(PSHR32(MULT16_16(g,PSHR32(ol_gain,SIG_SHIFT)),6)));
1697
12.5k
               st->voc_offset+=ol_pitch;
1698
12.5k
            }
1699
7.53k
            st->voc_offset -= NB_SUBFRAME_SIZE;
1700
1701
308k
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
1702
301k
            {
1703
301k
               spx_word16_t exci=exc[i];
1704
301k
               exc[i]= ADD16(ADD16(MULT16_16_Q15(QCONST16(.7f,15),exc[i]) , MULT16_16_Q15(QCONST16(.3f,15),st->voc_m1)),
1705
301k
                             SUB16(MULT16_16_Q15(Q15_ONE-MULT16_16_16(QCONST16(.85f,9),g),EXTRACT16(PSHR32(innov[i],SIG_SHIFT))),
1706
301k
                                   MULT16_16_Q15(MULT16_16_16(QCONST16(.15f,9),g),EXTRACT16(PSHR32(st->voc_m2,SIG_SHIFT)))
1707
301k
                                  ));
1708
301k
               st->voc_m1 = exci;
1709
301k
               st->voc_m2=innov[i];
1710
301k
               st->voc_mean = EXTRACT16(PSHR32(ADD32(MULT16_16(QCONST16(.8f,15),st->voc_mean), MULT16_16(QCONST16(.2f,15),exc[i])), 15));
1711
301k
               exc[i]-=st->voc_mean;
1712
301k
            }
1713
7.53k
         }
1714
1715
44.6k
      }
1716
44.6k
   }
1717
1718
11.1k
   ALLOC(interp_qlsp, NB_ORDER, spx_lsp_t);
1719
1720
11.1k
   if (st->lpc_enh_enabled && SUBMODE(comb_gain)>0 && !st->count_lost)
1721
9.29k
   {
1722
9.29k
      multicomb(st->exc-NB_SUBFRAME_SIZE, out, st->interp_qlpc, NB_ORDER, 2*NB_SUBFRAME_SIZE, best_pitch, 40, SUBMODE(comb_gain), stack);
1723
9.29k
      multicomb(st->exc+NB_SUBFRAME_SIZE, out+2*NB_SUBFRAME_SIZE, st->interp_qlpc, NB_ORDER, 2*NB_SUBFRAME_SIZE, best_pitch, 40, SUBMODE(comb_gain), stack);
1724
9.29k
   } else {
1725
1.88k
      SPEEX_COPY(out, &st->exc[-NB_SUBFRAME_SIZE], NB_FRAME_SIZE);
1726
1.88k
   }
1727
1728
   /* If the last packet was lost, re-scale the excitation to obtain the same energy as encoded in ol_gain */
1729
11.1k
   if (st->count_lost)
1730
0
   {
1731
0
      spx_word16_t exc_ener;
1732
0
      spx_word32_t gain32;
1733
0
      spx_word16_t gain;
1734
0
      exc_ener = compute_rms16 (st->exc, NB_FRAME_SIZE);
1735
0
      gain32 = PDIV32(ol_gain, ADD16(exc_ener,1));
1736
#ifdef FIXED_POINT
1737
      if (gain32 > 32767)
1738
         gain32 = 32767;
1739
      gain = EXTRACT16(gain32);
1740
#else
1741
0
      if (gain32 > 2)
1742
0
         gain32=2;
1743
0
      gain = gain32;
1744
0
#endif
1745
0
      for (i=0;i<NB_FRAME_SIZE;i++)
1746
0
      {
1747
0
         st->exc[i] = MULT16_16_Q14(gain, st->exc[i]);
1748
0
         out[i]=st->exc[i-NB_SUBFRAME_SIZE];
1749
0
      }
1750
0
   }
1751
1752
   /*Loop on subframes */
1753
55.8k
   for (sub=0;sub<NB_NB_SUBFRAMES;sub++)
1754
44.6k
   {
1755
44.6k
      int offset;
1756
44.6k
      spx_word16_t *sp;
1757
1758
      /* Offset relative to start of frame */
1759
44.6k
      offset = NB_SUBFRAME_SIZE*sub;
1760
      /* Original signal */
1761
44.6k
      sp=out+offset;
1762
1763
      /* LSP interpolation (quantized and unquantized) */
1764
44.6k
      lsp_interpolate(st->old_qlsp, qlsp, interp_qlsp, NB_ORDER, sub, NB_NB_SUBFRAMES, LSP_MARGIN);
1765
1766
      /* Compute interpolated LPCs (unquantized) */
1767
44.6k
      lsp_to_lpc(interp_qlsp, ak, NB_ORDER, stack);
1768
1769
      /* Compute analysis filter at w=pi */
1770
44.6k
      {
1771
44.6k
         spx_word32_t pi_g=LPC_SCALING;
1772
268k
         for (i=0;i<NB_ORDER;i+=2)
1773
223k
         {
1774
            /*pi_g += -st->interp_qlpc[i] +  st->interp_qlpc[i+1];*/
1775
223k
            pi_g = ADD32(pi_g, SUB32(EXTEND32(ak[i+1]),EXTEND32(ak[i])));
1776
223k
         }
1777
44.6k
         st->pi_gain[sub] = pi_g;
1778
44.6k
      }
1779
1780
44.6k
      iir_mem16(sp, st->interp_qlpc, sp, NB_SUBFRAME_SIZE, NB_ORDER,
1781
44.6k
                st->mem_sp, stack);
1782
1783
491k
      for (i=0;i<NB_ORDER;i++)
1784
446k
         st->interp_qlpc[i] = ak[i];
1785
1786
44.6k
   }
1787
1788
11.1k
   if (st->highpass_enabled)
1789
11.1k
      highpass(out, out, NB_FRAME_SIZE, (st->isWideband?HIGHPASS_WIDEBAND:HIGHPASS_NARROWBAND)|HIGHPASS_OUTPUT, st->mem_hp);
1790
   /*for (i=0;i<NB_FRAME_SIZE;i++)
1791
     printf ("%d\n", (int)st->frame[i]);*/
1792
1793
   /* Tracking output level */
1794
11.1k
   st->level = 1+PSHR32(ol_gain,SIG_SHIFT);
1795
11.1k
   st->max_level = MAX16(MULT16_16_Q15(QCONST16(.99f,15), st->max_level), st->level);
1796
11.1k
   st->min_level = MIN16(ADD16(1,MULT16_16_Q14(QCONST16(1.01f,14), st->min_level)), st->level);
1797
11.1k
   if (st->max_level < st->min_level+1)
1798
3.96k
      st->max_level = st->min_level+1;
1799
   /*printf ("%f %f %f %d\n", og, st->min_level, st->max_level, update);*/
1800
1801
   /* Store the LSPs for interpolation in the next frame */
1802
122k
   for (i=0;i<NB_ORDER;i++)
1803
111k
      st->old_qlsp[i] = qlsp[i];
1804
1805
   /* The next frame will not be the first (Duh!) */
1806
11.1k
   st->first = 0;
1807
11.1k
   st->count_lost=0;
1808
11.1k
   st->last_pitch = best_pitch;
1809
#ifdef FIXED_POINT
1810
   st->last_pitch_gain = PSHR16(pitch_average,2);
1811
#else
1812
11.1k
   st->last_pitch_gain = .25*pitch_average;
1813
11.1k
#endif
1814
11.1k
   st->pitch_gain_buf[st->pitch_gain_buf_idx++] = st->last_pitch_gain;
1815
11.1k
   if (st->pitch_gain_buf_idx > 2) /* rollover */
1816
3.50k
      st->pitch_gain_buf_idx = 0;
1817
1818
11.1k
   st->last_ol_gain = ol_gain;
1819
1820
11.1k
   return 0;
1821
21.6k
}
nb_decode
Line
Count
Source
1331
37.2k
{
1332
37.2k
   DecState *st;
1333
37.2k
   int i, sub;
1334
37.2k
   int pitch;
1335
37.2k
   spx_word16_t pitch_gain[3];
1336
37.2k
   spx_word32_t ol_gain=0;
1337
37.2k
   int ol_pitch=0;
1338
37.2k
   spx_word16_t ol_pitch_coef=0;
1339
37.2k
   int best_pitch=40;
1340
37.2k
   spx_word16_t best_pitch_gain=0;
1341
37.2k
   int wideband;
1342
37.2k
   int m;
1343
37.2k
   char *stack;
1344
37.2k
   VARDECL(spx_sig_t *innov);
1345
37.2k
   VARDECL(spx_word32_t *exc32);
1346
37.2k
   VARDECL(spx_coef_t *ak);
1347
37.2k
   VARDECL(spx_lsp_t *qlsp);
1348
37.2k
   spx_word16_t pitch_average=0;
1349
1350
37.2k
   spx_word16_t *out = (spx_word16_t*)vout;
1351
37.2k
   VARDECL(spx_lsp_t *interp_qlsp);
1352
1353
37.2k
   st=(DecState*)state;
1354
37.2k
   stack=st->stack;
1355
1356
37.2k
   st->exc = st->excBuf + 2*NB_PITCH_END + NB_SUBFRAME_SIZE + 6;
1357
1358
   /* Check if we're in DTX mode*/
1359
37.2k
   if (!bits && st->dtx_enabled)
1360
0
   {
1361
0
      st->submodeID=0;
1362
0
   } else
1363
37.2k
   {
1364
      /* If bits is NULL, consider the packet to be lost (what could we do anyway) */
1365
37.2k
      if (!bits)
1366
0
      {
1367
0
         nb_decode_lost(st, out, stack);
1368
0
         return 0;
1369
0
      }
1370
1371
37.2k
      if (st->encode_submode)
1372
37.2k
      {
1373
1374
      /* Search for next narrowband block (handle requests, skip wideband blocks) */
1375
39.6k
      do {
1376
39.6k
         if (speex_bits_remaining(bits)<5)
1377
4.67k
            return -1;
1378
34.9k
         wideband = speex_bits_unpack_unsigned(bits, 1);
1379
34.9k
         if (wideband) /* Skip wideband block (for compatibility) */
1380
3.14k
         {
1381
3.14k
            int submode;
1382
3.14k
            int advance;
1383
3.14k
            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.14k
            advance = wb_skip_table[submode];
1386
3.14k
            if (advance < 0)
1387
0
            {
1388
0
               speex_notify("Invalid mode encountered. The stream is corrupted.");
1389
0
               return -2;
1390
0
            }
1391
3.14k
            advance -= (SB_SUBMODE_BITS+1);
1392
3.14k
            speex_bits_advance(bits, advance);
1393
1394
3.14k
            if (speex_bits_remaining(bits)<5)
1395
801
               return -1;
1396
2.34k
            wideband = speex_bits_unpack_unsigned(bits, 1);
1397
2.34k
            if (wideband)
1398
1.93k
            {
1399
1.93k
               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.93k
               advance = wb_skip_table[submode];
1402
1.93k
               if (advance < 0)
1403
0
               {
1404
0
                  speex_notify("Invalid mode encountered. The stream is corrupted.");
1405
0
                  return -2;
1406
0
               }
1407
1.93k
               advance -= (SB_SUBMODE_BITS+1);
1408
1.93k
               speex_bits_advance(bits, advance);
1409
1.93k
               wideband = speex_bits_unpack_unsigned(bits, 1);
1410
1.93k
               if (wideband)
1411
1.67k
               {
1412
1.67k
                  speex_notify("More than two wideband layers found. The stream is corrupted.");
1413
1.67k
                  return -2;
1414
1.67k
               }
1415
1416
1.93k
            }
1417
2.34k
         }
1418
32.4k
         if (speex_bits_remaining(bits)<4)
1419
253
            return -1;
1420
         /* FIXME: Check for overflow */
1421
32.2k
         m = speex_bits_unpack_unsigned(bits, 4);
1422
32.2k
         if (m==15) /* We found a terminator */
1423
388
         {
1424
388
            return -1;
1425
31.8k
         } else if (m==14) /* Speex in-band request */
1426
2.07k
         {
1427
2.07k
            int ret = speex_inband_handler(bits, st->speex_callbacks, state);
1428
2.07k
            if (ret)
1429
0
               return ret;
1430
29.7k
         } else if (m==13) /* User in-band request */
1431
330
         {
1432
330
            int ret = st->user_callback.func(bits, state, st->user_callback.data);
1433
330
            if (ret)
1434
0
               return ret;
1435
29.4k
         } else if (m>8) /* Invalid mode */
1436
2.53k
         {
1437
2.53k
            speex_notify("Invalid mode encountered. The stream is corrupted.");
1438
2.53k
            return -2;
1439
2.53k
         }
1440
1441
32.2k
      } while (m>8);
1442
1443
      /* Get the sub-mode that was used */
1444
26.8k
      st->submodeID = m;
1445
26.8k
      }
1446
1447
37.2k
   }
1448
1449
   /* Shift all buffers by one frame */
1450
26.8k
   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
26.8k
   if (st->submodes[st->submodeID] == NULL)
1454
13.3k
   {
1455
13.3k
      VARDECL(spx_coef_t *lpc);
1456
13.3k
      ALLOC(lpc, NB_ORDER, spx_coef_t);
1457
13.3k
      bw_lpc(QCONST16(0.93f,15), st->interp_qlpc, lpc, NB_ORDER);
1458
13.3k
      {
1459
13.3k
         spx_word16_t innov_gain=0;
1460
         /* FIXME: This was innov, not exc */
1461
13.3k
         innov_gain = compute_rms16(st->exc, NB_FRAME_SIZE);
1462
2.15M
         for (i=0;i<NB_FRAME_SIZE;i++)
1463
2.13M
            st->exc[i]=speex_rand(innov_gain, &st->seed);
1464
13.3k
      }
1465
1466
1467
13.3k
      st->first=1;
1468
1469
      /* Final signal synthesis from excitation */
1470
13.3k
      iir_mem16(st->exc, lpc, out, NB_FRAME_SIZE, NB_ORDER, st->mem_sp, stack);
1471
1472
      /* Normally this is written to later but since this is returning early,
1473
         avoid reading uninitialized memory in caller */
1474
13.3k
      if (st->innov_save)
1475
10.6k
         SPEEX_MEMSET(st->innov_save, 0, NB_NB_SUBFRAMES*NB_SUBFRAME_SIZE);
1476
1477
13.3k
      st->count_lost=0;
1478
13.3k
      return 0;
1479
13.3k
   }
1480
1481
13.5k
   ALLOC(qlsp, NB_ORDER, spx_lsp_t);
1482
1483
   /* Unquantize LSPs */
1484
13.5k
   SUBMODE(lsp_unquant)(qlsp, NB_ORDER, bits);
1485
1486
   /*Damp memory if a frame was lost and the LSP changed too much*/
1487
13.5k
   if (st->count_lost)
1488
0
   {
1489
0
      spx_word16_t fact;
1490
0
      spx_word32_t lsp_dist=0;
1491
0
      for (i=0;i<NB_ORDER;i++)
1492
0
         lsp_dist = ADD32(lsp_dist, EXTEND32(ABS(st->old_qlsp[i] - qlsp[i])));
1493
0
#ifdef FIXED_POINT
1494
0
      fact = SHR16(19661,SHR32(lsp_dist,LSP_SHIFT+2));
1495
#else
1496
      fact = .6*exp(-.2*lsp_dist);
1497
#endif
1498
0
      for (i=0;i<NB_ORDER;i++)
1499
0
         st->mem_sp[i] = MULT16_32_Q15(fact,st->mem_sp[i]);
1500
0
   }
1501
1502
1503
   /* Handle first frame and lost-packet case */
1504
13.5k
   if (st->first || st->count_lost)
1505
3.27k
   {
1506
36.0k
      for (i=0;i<NB_ORDER;i++)
1507
32.7k
         st->old_qlsp[i] = qlsp[i];
1508
3.27k
   }
1509
1510
   /* Get open-loop pitch estimation for low bit-rate pitch coding */
1511
13.5k
   if (SUBMODE(lbr_pitch)!=-1)
1512
6.10k
   {
1513
6.10k
      ol_pitch = NB_PITCH_START+speex_bits_unpack_unsigned(bits, 7);
1514
6.10k
   }
1515
1516
13.5k
   if (SUBMODE(forced_pitch_gain))
1517
4.76k
   {
1518
4.76k
      int quant;
1519
4.76k
      quant = speex_bits_unpack_unsigned(bits, 4);
1520
4.76k
      ol_pitch_coef=MULT16_16_P15(QCONST16(0.066667,15),SHL16(quant,GAIN_SHIFT));
1521
4.76k
   }
1522
1523
   /* Get global excitation gain */
1524
13.5k
   {
1525
13.5k
      int qe;
1526
13.5k
      qe = speex_bits_unpack_unsigned(bits, 5);
1527
13.5k
#ifdef FIXED_POINT
1528
      /* FIXME: Perhaps we could slightly lower the gain here when the output is going to saturate? */
1529
13.5k
      ol_gain = MULT16_32_Q15(28406,ol_gain_table[qe]);
1530
#else
1531
      ol_gain = SIG_SCALING*exp(qe/3.5);
1532
#endif
1533
13.5k
   }
1534
1535
13.5k
   ALLOC(ak, NB_ORDER, spx_coef_t);
1536
13.5k
   ALLOC(innov, NB_SUBFRAME_SIZE, spx_sig_t);
1537
13.5k
   ALLOC(exc32, NB_SUBFRAME_SIZE, spx_word32_t);
1538
1539
13.5k
   if (st->submodeID==1)
1540
2.51k
   {
1541
2.51k
      int extra;
1542
2.51k
      extra = speex_bits_unpack_unsigned(bits, 4);
1543
1544
2.51k
      if (extra==15)
1545
498
         st->dtx_enabled=1;
1546
2.01k
      else
1547
2.01k
         st->dtx_enabled=0;
1548
2.51k
   }
1549
13.5k
   if (st->submodeID>1)
1550
11.0k
      st->dtx_enabled=0;
1551
1552
   /*Loop on subframes */
1553
67.6k
   for (sub=0;sub<NB_NB_SUBFRAMES;sub++)
1554
54.0k
   {
1555
54.0k
      int offset;
1556
54.0k
      spx_word16_t *exc;
1557
54.0k
      spx_word16_t *innov_save = NULL;
1558
54.0k
      spx_word16_t tmp;
1559
1560
      /* Offset relative to start of frame */
1561
54.0k
      offset = NB_SUBFRAME_SIZE*sub;
1562
      /* Excitation */
1563
54.0k
      exc=st->exc+offset;
1564
      /* Original signal */
1565
54.0k
      if (st->innov_save)
1566
41.6k
         innov_save = st->innov_save+offset;
1567
1568
1569
      /* Reset excitation */
1570
54.0k
      SPEEX_MEMSET(exc, 0, NB_SUBFRAME_SIZE);
1571
1572
      /*Adaptive codebook contribution*/
1573
54.0k
      speex_assert (SUBMODE(ltp_unquant));
1574
54.0k
      {
1575
54.0k
         int pit_min, pit_max;
1576
         /* Handle pitch constraints if any */
1577
54.0k
         if (SUBMODE(lbr_pitch) != -1)
1578
24.4k
         {
1579
24.4k
            int margin;
1580
24.4k
            margin = SUBMODE(lbr_pitch);
1581
24.4k
            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
24.4k
            } else {
1598
24.4k
               pit_min = pit_max = ol_pitch;
1599
24.4k
            }
1600
29.6k
         } else {
1601
29.6k
            pit_min = NB_PITCH_START;
1602
29.6k
            pit_max = NB_PITCH_END;
1603
29.6k
         }
1604
1605
1606
1607
54.0k
         SUBMODE(ltp_unquant)(exc, exc32, pit_min, pit_max, ol_pitch_coef, SUBMODE(ltp_params),
1608
54.0k
                 NB_SUBFRAME_SIZE, &pitch, &pitch_gain[0], bits, stack,
1609
54.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
54.0k
         sanitize_values32(exc32, NEG32(QCONST32(32000,SIG_SHIFT-1)), QCONST32(32000,SIG_SHIFT-1), NB_SUBFRAME_SIZE);
1615
1616
54.0k
         tmp = gain_3tap_to_1tap(pitch_gain);
1617
1618
54.0k
         pitch_average += tmp;
1619
54.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
48.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
47.2k
              || (MULT16_16_Q15(QCONST16(.67,15),tmp)>best_pitch_gain&&(ABS(2*best_pitch-pitch)<3||ABS(3*best_pitch-pitch)<4||ABS(4*best_pitch-pitch)<5)) )
1622
9.30k
         {
1623
9.30k
            best_pitch = pitch;
1624
9.30k
            if (tmp > best_pitch_gain)
1625
8.54k
               best_pitch_gain = tmp;
1626
9.30k
         }
1627
54.0k
      }
1628
1629
      /* Unquantize the innovation */
1630
54.0k
      {
1631
54.0k
         int q_energy;
1632
54.0k
         spx_word32_t ener;
1633
1634
54.0k
         SPEEX_MEMSET(innov, 0, NB_SUBFRAME_SIZE);
1635
1636
         /* Decode sub-frame gain correction */
1637
54.0k
         if (SUBMODE(have_subframe_gain)==3)
1638
9.45k
         {
1639
9.45k
            q_energy = speex_bits_unpack_unsigned(bits, 3);
1640
9.45k
            ener = MULT16_32_Q14(exc_gain_quant_scal3[q_energy],ol_gain);
1641
44.6k
         } else if (SUBMODE(have_subframe_gain)==1)
1642
20.2k
         {
1643
20.2k
            q_energy = speex_bits_unpack_unsigned(bits, 1);
1644
20.2k
            ener = MULT16_32_Q14(exc_gain_quant_scal1[q_energy],ol_gain);
1645
24.4k
         } else {
1646
24.4k
            ener = ol_gain;
1647
24.4k
         }
1648
1649
54.0k
         speex_assert (SUBMODE(innovation_unquant));
1650
54.0k
         {
1651
            /*Fixed codebook contribution*/
1652
54.0k
            SUBMODE(innovation_unquant)(innov, SUBMODE(innovation_params), NB_SUBFRAME_SIZE, bits, stack, &st->seed);
1653
            /* De-normalize innovation and update excitation */
1654
1655
54.0k
            signal_mul(innov, innov, ener, NB_SUBFRAME_SIZE);
1656
1657
            /* Decode second codebook (only for some modes) */
1658
54.0k
            if (SUBMODE(double_codebook))
1659
3.97k
            {
1660
3.97k
               char *tmp_stack=stack;
1661
3.97k
               VARDECL(spx_sig_t *innov2);
1662
3.97k
               ALLOC(innov2, NB_SUBFRAME_SIZE, spx_sig_t);
1663
3.97k
               SPEEX_MEMSET(innov2, 0, NB_SUBFRAME_SIZE);
1664
3.97k
               SUBMODE(innovation_unquant)(innov2, SUBMODE(innovation_params), NB_SUBFRAME_SIZE, bits, stack, &st->seed);
1665
3.97k
               signal_mul(innov2, innov2, MULT16_32_Q15(QCONST16(0.454545f,15),ener), NB_SUBFRAME_SIZE);
1666
162k
               for (i=0;i<NB_SUBFRAME_SIZE;i++)
1667
158k
                  innov[i] = ADD32(innov[i], innov2[i]);
1668
3.97k
               stack = tmp_stack;
1669
3.97k
            }
1670
2.21M
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
1671
2.16M
               exc[i]=EXTRACT16(SATURATE32(PSHR32(ADD32(SHL32(exc32[i],1),innov[i]),SIG_SHIFT),32767));
1672
            /*print_vec(exc, 40, "innov");*/
1673
54.0k
            if (innov_save)
1674
41.6k
            {
1675
1.70M
               for (i=0;i<NB_SUBFRAME_SIZE;i++)
1676
1.66M
                  innov_save[i] = EXTRACT16(PSHR32(innov[i], SIG_SHIFT));
1677
41.6k
            }
1678
54.0k
         }
1679
1680
         /*Vocoder mode*/
1681
54.0k
         if (st->submodeID==1)
1682
10.0k
         {
1683
10.0k
            spx_word16_t g=ol_pitch_coef;
1684
10.0k
            g=MULT16_16_P14(QCONST16(1.5f,14),(g-QCONST16(.2f,6)));
1685
10.0k
            if (g<0)
1686
5.32k
               g=0;
1687
10.0k
            if (g>GAIN_SCALING)
1688
1.30k
               g=GAIN_SCALING;
1689
1690
10.0k
            SPEEX_MEMSET(exc, 0, NB_SUBFRAME_SIZE);
1691
23.4k
            while (st->voc_offset<NB_SUBFRAME_SIZE)
1692
13.3k
            {
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
13.3k
               if (st->voc_offset>=0)
1696
13.3k
                  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
13.3k
               st->voc_offset+=ol_pitch;
1698
13.3k
            }
1699
10.0k
            st->voc_offset -= NB_SUBFRAME_SIZE;
1700
1701
412k
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
1702
402k
            {
1703
402k
               spx_word16_t exci=exc[i];
1704
402k
               exc[i]= ADD16(ADD16(MULT16_16_Q15(QCONST16(.7f,15),exc[i]) , MULT16_16_Q15(QCONST16(.3f,15),st->voc_m1)),
1705
402k
                             SUB16(MULT16_16_Q15(Q15_ONE-MULT16_16_16(QCONST16(.85f,9),g),EXTRACT16(PSHR32(innov[i],SIG_SHIFT))),
1706
402k
                                   MULT16_16_Q15(MULT16_16_16(QCONST16(.15f,9),g),EXTRACT16(PSHR32(st->voc_m2,SIG_SHIFT)))
1707
402k
                                  ));
1708
402k
               st->voc_m1 = exci;
1709
402k
               st->voc_m2=innov[i];
1710
402k
               st->voc_mean = EXTRACT16(PSHR32(ADD32(MULT16_16(QCONST16(.8f,15),st->voc_mean), MULT16_16(QCONST16(.2f,15),exc[i])), 15));
1711
402k
               exc[i]-=st->voc_mean;
1712
402k
            }
1713
10.0k
         }
1714
1715
54.0k
      }
1716
54.0k
   }
1717
1718
13.5k
   ALLOC(interp_qlsp, NB_ORDER, spx_lsp_t);
1719
1720
13.5k
   if (st->lpc_enh_enabled && SUBMODE(comb_gain)>0 && !st->count_lost)
1721
11.0k
   {
1722
11.0k
      multicomb(st->exc-NB_SUBFRAME_SIZE, out, st->interp_qlpc, NB_ORDER, 2*NB_SUBFRAME_SIZE, best_pitch, 40, SUBMODE(comb_gain), stack);
1723
11.0k
      multicomb(st->exc+NB_SUBFRAME_SIZE, out+2*NB_SUBFRAME_SIZE, st->interp_qlpc, NB_ORDER, 2*NB_SUBFRAME_SIZE, best_pitch, 40, SUBMODE(comb_gain), stack);
1724
11.0k
   } else {
1725
2.51k
      SPEEX_COPY(out, &st->exc[-NB_SUBFRAME_SIZE], NB_FRAME_SIZE);
1726
2.51k
   }
1727
1728
   /* If the last packet was lost, re-scale the excitation to obtain the same energy as encoded in ol_gain */
1729
13.5k
   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
67.6k
   for (sub=0;sub<NB_NB_SUBFRAMES;sub++)
1754
54.0k
   {
1755
54.0k
      int offset;
1756
54.0k
      spx_word16_t *sp;
1757
1758
      /* Offset relative to start of frame */
1759
54.0k
      offset = NB_SUBFRAME_SIZE*sub;
1760
      /* Original signal */
1761
54.0k
      sp=out+offset;
1762
1763
      /* LSP interpolation (quantized and unquantized) */
1764
54.0k
      lsp_interpolate(st->old_qlsp, qlsp, interp_qlsp, NB_ORDER, sub, NB_NB_SUBFRAMES, LSP_MARGIN);
1765
1766
      /* Compute interpolated LPCs (unquantized) */
1767
54.0k
      lsp_to_lpc(interp_qlsp, ak, NB_ORDER, stack);
1768
1769
      /* Compute analysis filter at w=pi */
1770
54.0k
      {
1771
54.0k
         spx_word32_t pi_g=LPC_SCALING;
1772
324k
         for (i=0;i<NB_ORDER;i+=2)
1773
270k
         {
1774
            /*pi_g += -st->interp_qlpc[i] +  st->interp_qlpc[i+1];*/
1775
270k
            pi_g = ADD32(pi_g, SUB32(EXTEND32(ak[i+1]),EXTEND32(ak[i])));
1776
270k
         }
1777
54.0k
         st->pi_gain[sub] = pi_g;
1778
54.0k
      }
1779
1780
54.0k
      iir_mem16(sp, st->interp_qlpc, sp, NB_SUBFRAME_SIZE, NB_ORDER,
1781
54.0k
                st->mem_sp, stack);
1782
1783
594k
      for (i=0;i<NB_ORDER;i++)
1784
540k
         st->interp_qlpc[i] = ak[i];
1785
1786
54.0k
   }
1787
1788
13.5k
   if (st->highpass_enabled)
1789
13.5k
      highpass(out, out, NB_FRAME_SIZE, (st->isWideband?HIGHPASS_WIDEBAND:HIGHPASS_NARROWBAND)|HIGHPASS_OUTPUT, st->mem_hp);
1790
   /*for (i=0;i<NB_FRAME_SIZE;i++)
1791
     printf ("%d\n", (int)st->frame[i]);*/
1792
1793
   /* Tracking output level */
1794
13.5k
   st->level = 1+PSHR32(ol_gain,SIG_SHIFT);
1795
13.5k
   st->max_level = MAX16(MULT16_16_Q15(QCONST16(.99f,15), st->max_level), st->level);
1796
13.5k
   st->min_level = MIN16(ADD16(1,MULT16_16_Q14(QCONST16(1.01f,14), st->min_level)), st->level);
1797
13.5k
   if (st->max_level < st->min_level+1)
1798
3.87k
      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
148k
   for (i=0;i<NB_ORDER;i++)
1803
135k
      st->old_qlsp[i] = qlsp[i];
1804
1805
   /* The next frame will not be the first (Duh!) */
1806
13.5k
   st->first = 0;
1807
13.5k
   st->count_lost=0;
1808
13.5k
   st->last_pitch = best_pitch;
1809
13.5k
#ifdef FIXED_POINT
1810
13.5k
   st->last_pitch_gain = PSHR16(pitch_average,2);
1811
#else
1812
   st->last_pitch_gain = .25*pitch_average;
1813
#endif
1814
13.5k
   st->pitch_gain_buf[st->pitch_gain_buf_idx++] = st->last_pitch_gain;
1815
13.5k
   if (st->pitch_gain_buf_idx > 2) /* rollover */
1816
4.12k
      st->pitch_gain_buf_idx = 0;
1817
1818
13.5k
   st->last_ol_gain = ol_gain;
1819
1820
13.5k
   return 0;
1821
26.8k
}
1822
#endif /* DISABLE_DECODER */
1823