Coverage Report

Created: 2026-01-09 07:11

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.28M
#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
216k
#define LSP_MARGIN 16
80
19.6k
#define LSP_DELTA1 6553
81
#define LSP_DELTA2 1638
82
83
#else
84
85
static const float exc_gain_quant_scal3_bound[7]={0.112338f, 0.236980f, 0.369316f, 0.492054f, 0.637471f, 0.828874f, 1.132784f};
86
static const float exc_gain_quant_scal3[8]={0.061130f, 0.163546f, 0.310413f, 0.428220f, 0.555887f, 0.719055f, 0.938694f, 1.326874f};
87
static const float exc_gain_quant_scal1_bound[1]={0.87798f};
88
static const float exc_gain_quant_scal1[2]={0.70469f, 1.05127f};
89
90
111k
#define LSP_MARGIN .002f
91
8.57k
#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.89k
{
102
7.89k
   EncState *st;
103
7.89k
   const SpeexNBMode *mode;
104
7.89k
   int i;
105
106
7.89k
   mode=(const SpeexNBMode *)m->mode;
107
7.89k
   st = (EncState*)speex_alloc(sizeof(EncState));
108
7.89k
   if (!st)
109
0
      return NULL;
110
7.89k
#if defined(VAR_ARRAYS) || defined (USE_ALLOCA)
111
7.89k
   st->stack = NULL;
112
#else
113
   st->stack = (char*)speex_alloc_scratch(NB_ENC_STACK);
114
#endif
115
116
7.89k
   st->mode=m;
117
118
7.89k
   st->gamma1=mode->gamma1;
119
7.89k
   st->gamma2=mode->gamma2;
120
7.89k
   st->lpc_floor = mode->lpc_floor;
121
122
7.89k
   st->submodes=mode->submodes;
123
7.89k
   st->submodeID=st->submodeSelect=mode->defaultSubmode;
124
7.89k
   st->bounded_pitch = 1;
125
126
7.89k
   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.89k
   st->cumul_gain = 1024;
136
137
7.89k
   st->window= lpc_window;
138
139
   /* Create the window for autocorrelation (lag-windowing) */
140
7.89k
   st->lagWindow = lag_window;
141
142
7.89k
   st->first = 1;
143
86.8k
   for (i=0;i<NB_ORDER;i++)
144
78.9k
      st->old_lsp[i]= DIV32(MULT16_16(QCONST16(3.1415927f, LSP_SHIFT), i+1), NB_ORDER+1);
145
146
7.89k
   st->innov_rms_save = NULL;
147
148
7.89k
#ifndef DISABLE_VBR
149
7.89k
   vbr_init(&st->vbr);
150
7.89k
   st->vbr_quality = 8;
151
7.89k
   st->vbr_enabled = 0;
152
7.89k
   st->vbr_max = 0;
153
7.89k
   st->vad_enabled = 0;
154
7.89k
   st->dtx_enabled = 0;
155
7.89k
   st->dtx_count=0;
156
7.89k
   st->abr_enabled = 0;
157
7.89k
   st->abr_drift = 0;
158
7.89k
   st->abr_drift2 = 0;
159
7.89k
#endif /* #ifndef DISABLE_VBR */
160
161
7.89k
   st->plc_tuning = 2;
162
7.89k
   st->complexity=2;
163
7.89k
   st->sampling_rate=8000;
164
7.89k
   st->isWideband = 0;
165
7.89k
   st->highpass_enabled = 1;
166
167
#ifdef ENABLE_VALGRIND
168
   VALGRIND_MAKE_MEM_DEFINED(st, NB_ENC_STACK);
169
#endif
170
7.89k
   return st;
171
7.89k
}
nb_encoder_init
Line
Count
Source
101
3.94k
{
102
3.94k
   EncState *st;
103
3.94k
   const SpeexNBMode *mode;
104
3.94k
   int i;
105
106
3.94k
   mode=(const SpeexNBMode *)m->mode;
107
3.94k
   st = (EncState*)speex_alloc(sizeof(EncState));
108
3.94k
   if (!st)
109
0
      return NULL;
110
3.94k
#if defined(VAR_ARRAYS) || defined (USE_ALLOCA)
111
3.94k
   st->stack = NULL;
112
#else
113
   st->stack = (char*)speex_alloc_scratch(NB_ENC_STACK);
114
#endif
115
116
3.94k
   st->mode=m;
117
118
3.94k
   st->gamma1=mode->gamma1;
119
3.94k
   st->gamma2=mode->gamma2;
120
3.94k
   st->lpc_floor = mode->lpc_floor;
121
122
3.94k
   st->submodes=mode->submodes;
123
3.94k
   st->submodeID=st->submodeSelect=mode->defaultSubmode;
124
3.94k
   st->bounded_pitch = 1;
125
126
3.94k
   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.94k
   st->cumul_gain = 1024;
136
137
3.94k
   st->window= lpc_window;
138
139
   /* Create the window for autocorrelation (lag-windowing) */
140
3.94k
   st->lagWindow = lag_window;
141
142
3.94k
   st->first = 1;
143
43.4k
   for (i=0;i<NB_ORDER;i++)
144
39.4k
      st->old_lsp[i]= DIV32(MULT16_16(QCONST16(3.1415927f, LSP_SHIFT), i+1), NB_ORDER+1);
145
146
3.94k
   st->innov_rms_save = NULL;
147
148
3.94k
#ifndef DISABLE_VBR
149
3.94k
   vbr_init(&st->vbr);
150
3.94k
   st->vbr_quality = 8;
151
3.94k
   st->vbr_enabled = 0;
152
3.94k
   st->vbr_max = 0;
153
3.94k
   st->vad_enabled = 0;
154
3.94k
   st->dtx_enabled = 0;
155
3.94k
   st->dtx_count=0;
156
3.94k
   st->abr_enabled = 0;
157
3.94k
   st->abr_drift = 0;
158
3.94k
   st->abr_drift2 = 0;
159
3.94k
#endif /* #ifndef DISABLE_VBR */
160
161
3.94k
   st->plc_tuning = 2;
162
3.94k
   st->complexity=2;
163
3.94k
   st->sampling_rate=8000;
164
3.94k
   st->isWideband = 0;
165
3.94k
   st->highpass_enabled = 1;
166
167
#ifdef ENABLE_VALGRIND
168
   VALGRIND_MAKE_MEM_DEFINED(st, NB_ENC_STACK);
169
#endif
170
3.94k
   return st;
171
3.94k
}
nb_encoder_init
Line
Count
Source
101
3.94k
{
102
3.94k
   EncState *st;
103
3.94k
   const SpeexNBMode *mode;
104
3.94k
   int i;
105
106
3.94k
   mode=(const SpeexNBMode *)m->mode;
107
3.94k
   st = (EncState*)speex_alloc(sizeof(EncState));
108
3.94k
   if (!st)
109
0
      return NULL;
110
3.94k
#if defined(VAR_ARRAYS) || defined (USE_ALLOCA)
111
3.94k
   st->stack = NULL;
112
#else
113
   st->stack = (char*)speex_alloc_scratch(NB_ENC_STACK);
114
#endif
115
116
3.94k
   st->mode=m;
117
118
3.94k
   st->gamma1=mode->gamma1;
119
3.94k
   st->gamma2=mode->gamma2;
120
3.94k
   st->lpc_floor = mode->lpc_floor;
121
122
3.94k
   st->submodes=mode->submodes;
123
3.94k
   st->submodeID=st->submodeSelect=mode->defaultSubmode;
124
3.94k
   st->bounded_pitch = 1;
125
126
3.94k
   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.94k
   st->cumul_gain = 1024;
136
137
3.94k
   st->window= lpc_window;
138
139
   /* Create the window for autocorrelation (lag-windowing) */
140
3.94k
   st->lagWindow = lag_window;
141
142
3.94k
   st->first = 1;
143
43.4k
   for (i=0;i<NB_ORDER;i++)
144
39.4k
      st->old_lsp[i]= DIV32(MULT16_16(QCONST16(3.1415927f, LSP_SHIFT), i+1), NB_ORDER+1);
145
146
3.94k
   st->innov_rms_save = NULL;
147
148
3.94k
#ifndef DISABLE_VBR
149
3.94k
   vbr_init(&st->vbr);
150
3.94k
   st->vbr_quality = 8;
151
3.94k
   st->vbr_enabled = 0;
152
3.94k
   st->vbr_max = 0;
153
3.94k
   st->vad_enabled = 0;
154
3.94k
   st->dtx_enabled = 0;
155
3.94k
   st->dtx_count=0;
156
3.94k
   st->abr_enabled = 0;
157
3.94k
   st->abr_drift = 0;
158
3.94k
   st->abr_drift2 = 0;
159
3.94k
#endif /* #ifndef DISABLE_VBR */
160
161
3.94k
   st->plc_tuning = 2;
162
3.94k
   st->complexity=2;
163
3.94k
   st->sampling_rate=8000;
164
3.94k
   st->isWideband = 0;
165
3.94k
   st->highpass_enabled = 1;
166
167
#ifdef ENABLE_VALGRIND
168
   VALGRIND_MAKE_MEM_DEFINED(st, NB_ENC_STACK);
169
#endif
170
3.94k
   return st;
171
3.94k
}
172
173
void nb_encoder_destroy(void *state)
174
3.94k
{
175
3.94k
   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.94k
#ifndef DISABLE_VBR
182
3.94k
   vbr_destroy(&st->vbr);
183
3.94k
#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.94k
   speex_free(st);
194
3.94k
}
195
196
197
int nb_encoder_ctl(void *state, int request, void *ptr)
198
621k
{
199
621k
   EncState *st;
200
621k
   st=(EncState*)state;
201
621k
   switch(request)
202
621k
   {
203
15.5k
   case SPEEX_GET_FRAME_SIZE:
204
15.5k
      (*(spx_int32_t*)ptr) = NB_FRAME_SIZE;
205
15.5k
      break;
206
0
   case SPEEX_SET_LOW_MODE:
207
82.2k
   case SPEEX_SET_MODE:
208
82.2k
      st->submodeSelect = st->submodeID = (*(spx_int32_t*)ptr);
209
82.2k
      break;
210
20.9k
   case SPEEX_GET_LOW_MODE:
211
20.9k
   case SPEEX_GET_MODE:
212
20.9k
      (*(spx_int32_t*)ptr) = st->submodeID;
213
20.9k
      break;
214
0
#ifndef DISABLE_VBR
215
4.91k
      case SPEEX_SET_VBR:
216
4.91k
      st->vbr_enabled = (*(spx_int32_t*)ptr);
217
4.91k
      break;
218
0
   case SPEEX_GET_VBR:
219
0
      (*(spx_int32_t*)ptr) = st->vbr_enabled;
220
0
      break;
221
3.55k
   case SPEEX_SET_VAD:
222
3.55k
      st->vad_enabled = (*(spx_int32_t*)ptr);
223
3.55k
      break;
224
0
   case SPEEX_GET_VAD:
225
0
      (*(spx_int32_t*)ptr) = st->vad_enabled;
226
0
      break;
227
3.38k
   case SPEEX_SET_DTX:
228
3.38k
      st->dtx_enabled = (*(spx_int32_t*)ptr);
229
3.38k
      break;
230
0
   case SPEEX_GET_DTX:
231
0
      (*(spx_int32_t*)ptr) = st->dtx_enabled;
232
0
      break;
233
1.00k
   case SPEEX_SET_ABR:
234
1.00k
      st->abr_enabled = (*(spx_int32_t*)ptr);
235
1.00k
      st->vbr_enabled = st->abr_enabled!=0;
236
1.00k
      if (st->vbr_enabled)
237
1.00k
      {
238
1.00k
         spx_int32_t i=10;
239
1.00k
         spx_int32_t rate, target;
240
1.00k
         float vbr_qual;
241
1.00k
         target = (*(spx_int32_t*)ptr);
242
12.0k
         while (i>=0)
243
11.0k
         {
244
11.0k
            speex_encoder_ctl(st, SPEEX_SET_QUALITY, &i);
245
11.0k
            speex_encoder_ctl(st, SPEEX_GET_BITRATE, &rate);
246
11.0k
            if (rate <= target)
247
0
               break;
248
11.0k
            i--;
249
11.0k
         }
250
1.00k
         vbr_qual=i;
251
1.00k
         if (vbr_qual<0)
252
1.00k
            vbr_qual=0;
253
1.00k
         speex_encoder_ctl(st, SPEEX_SET_VBR_QUALITY, &vbr_qual);
254
1.00k
         st->abr_count=0;
255
1.00k
         st->abr_drift=0;
256
1.00k
         st->abr_drift2=0;
257
1.00k
      }
258
259
1.00k
      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.92k
   case SPEEX_SET_VBR_QUALITY:
266
5.92k
      st->vbr_quality = (*(float*)ptr);
267
5.92k
      if (st->vbr_quality < 0)
268
0
          st->vbr_quality = 0;
269
5.92k
      else if (st->vbr_quality > 10)
270
0
          st->vbr_quality = 10;
271
5.92k
      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
145k
   case SPEEX_SET_QUALITY:
277
145k
      {
278
145k
         int quality = (*(spx_int32_t*)ptr);
279
145k
         if (quality < 0)
280
0
            quality = 0;
281
145k
         if (quality > 10)
282
0
            quality = 10;
283
145k
         st->submodeSelect = st->submodeID = ((const SpeexNBMode*)(st->mode->mode))->quality_map[quality];
284
145k
      }
285
145k
      break;
286
7.89k
   case SPEEX_SET_COMPLEXITY:
287
7.89k
      st->complexity = (*(spx_int32_t*)ptr);
288
7.89k
      if (st->complexity<0)
289
0
         st->complexity=0;
290
7.89k
      break;
291
0
   case SPEEX_GET_COMPLEXITY:
292
0
      (*(spx_int32_t*)ptr) = st->complexity;
293
0
      break;
294
13.5k
   case SPEEX_SET_BITRATE:
295
13.5k
      {
296
13.5k
         spx_int32_t i=10;
297
13.5k
         spx_int32_t rate, target;
298
13.5k
         target = (*(spx_int32_t*)ptr);
299
135k
         while (i>=0)
300
128k
         {
301
128k
            speex_encoder_ctl(st, SPEEX_SET_QUALITY, &i);
302
128k
            speex_encoder_ctl(st, SPEEX_GET_BITRATE, &rate);
303
128k
            if (rate <= target)
304
6.90k
               break;
305
121k
            i--;
306
121k
         }
307
13.5k
      }
308
13.5k
      break;
309
220k
   case SPEEX_GET_BITRATE:
310
220k
      if (st->submodes[st->submodeID])
311
215k
         (*(spx_int32_t*)ptr) = st->sampling_rate*SUBMODE(bits_per_frame)/NB_FRAME_SIZE;
312
4.85k
      else
313
4.85k
         (*(spx_int32_t*)ptr) = st->sampling_rate*(NB_SUBMODE_BITS+1)/NB_FRAME_SIZE;
314
220k
      break;
315
7.89k
   case SPEEX_SET_SAMPLING_RATE:
316
7.89k
      st->sampling_rate = (*(spx_int32_t*)ptr);
317
7.89k
      break;
318
3.86k
   case SPEEX_GET_SAMPLING_RATE:
319
3.86k
      (*(spx_int32_t*)ptr)=st->sampling_rate;
320
3.86k
      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.89k
   case SPEEX_GET_LOOKAHEAD:
343
7.89k
      (*(spx_int32_t*)ptr)=(NB_WINDOW_SIZE-NB_FRAME_SIZE);
344
7.89k
      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.64k
   case SPEEX_SET_VBR_MAX_BITRATE:
355
3.64k
      st->vbr_max = (*(spx_int32_t*)ptr);
356
3.64k
      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.89k
   case SPEEX_SET_HIGHPASS:
362
7.89k
      st->highpass_enabled = (*(spx_int32_t*)ptr);
363
7.89k
      break;
364
0
   case SPEEX_GET_HIGHPASS:
365
0
      (*(spx_int32_t*)ptr) = st->highpass_enabled;
366
0
      break;
367
368
   /* This is all internal stuff past this point */
369
16.1k
   case SPEEX_GET_PI_GAIN:
370
16.1k
      {
371
16.1k
         int i;
372
16.1k
         spx_word32_t *g = (spx_word32_t*)ptr;
373
80.6k
         for (i=0;i<NB_NB_SUBFRAMES;i++)
374
64.4k
            g[i]=st->pi_gain[i];
375
16.1k
      }
376
16.1k
      break;
377
16.1k
   case SPEEX_GET_EXC:
378
16.1k
      {
379
16.1k
         int i;
380
80.6k
         for (i=0;i<NB_NB_SUBFRAMES;i++)
381
64.4k
            ((spx_word16_t*)ptr)[i] = compute_rms16(st->exc+i*NB_SUBFRAME_SIZE, NB_SUBFRAME_SIZE);
382
16.1k
      }
383
16.1k
      break;
384
0
#ifndef DISABLE_VBR
385
11.1k
   case SPEEX_GET_RELATIVE_QUALITY:
386
11.1k
      (*(float*)ptr)=st->relative_quality;
387
11.1k
      break;
388
0
#endif /* #ifndef DISABLE_VBR */
389
16.1k
   case SPEEX_SET_INNOVATION_SAVE:
390
16.1k
      st->innov_rms_save = (spx_word16_t*)ptr;
391
16.1k
      break;
392
5.46k
   case SPEEX_SET_WIDEBAND:
393
5.46k
      st->isWideband = *((spx_int32_t*)ptr);
394
5.46k
      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
621k
   }
402
621k
   return 0;
403
621k
}
nb_encoder_ctl
Line
Count
Source
198
310k
{
199
310k
   EncState *st;
200
310k
   st=(EncState*)state;
201
310k
   switch(request)
202
310k
   {
203
7.77k
   case SPEEX_GET_FRAME_SIZE:
204
7.77k
      (*(spx_int32_t*)ptr) = NB_FRAME_SIZE;
205
7.77k
      break;
206
0
   case SPEEX_SET_LOW_MODE:
207
41.1k
   case SPEEX_SET_MODE:
208
41.1k
      st->submodeSelect = st->submodeID = (*(spx_int32_t*)ptr);
209
41.1k
      break;
210
10.4k
   case SPEEX_GET_LOW_MODE:
211
10.4k
   case SPEEX_GET_MODE:
212
10.4k
      (*(spx_int32_t*)ptr) = st->submodeID;
213
10.4k
      break;
214
0
#ifndef DISABLE_VBR
215
2.45k
      case SPEEX_SET_VBR:
216
2.45k
      st->vbr_enabled = (*(spx_int32_t*)ptr);
217
2.45k
      break;
218
0
   case SPEEX_GET_VBR:
219
0
      (*(spx_int32_t*)ptr) = st->vbr_enabled;
220
0
      break;
221
1.77k
   case SPEEX_SET_VAD:
222
1.77k
      st->vad_enabled = (*(spx_int32_t*)ptr);
223
1.77k
      break;
224
0
   case SPEEX_GET_VAD:
225
0
      (*(spx_int32_t*)ptr) = st->vad_enabled;
226
0
      break;
227
1.69k
   case SPEEX_SET_DTX:
228
1.69k
      st->dtx_enabled = (*(spx_int32_t*)ptr);
229
1.69k
      break;
230
0
   case SPEEX_GET_DTX:
231
0
      (*(spx_int32_t*)ptr) = st->dtx_enabled;
232
0
      break;
233
502
   case SPEEX_SET_ABR:
234
502
      st->abr_enabled = (*(spx_int32_t*)ptr);
235
502
      st->vbr_enabled = st->abr_enabled!=0;
236
502
      if (st->vbr_enabled)
237
502
      {
238
502
         spx_int32_t i=10;
239
502
         spx_int32_t rate, target;
240
502
         float vbr_qual;
241
502
         target = (*(spx_int32_t*)ptr);
242
6.02k
         while (i>=0)
243
5.52k
         {
244
5.52k
            speex_encoder_ctl(st, SPEEX_SET_QUALITY, &i);
245
5.52k
            speex_encoder_ctl(st, SPEEX_GET_BITRATE, &rate);
246
5.52k
            if (rate <= target)
247
0
               break;
248
5.52k
            i--;
249
5.52k
         }
250
502
         vbr_qual=i;
251
502
         if (vbr_qual<0)
252
502
            vbr_qual=0;
253
502
         speex_encoder_ctl(st, SPEEX_SET_VBR_QUALITY, &vbr_qual);
254
502
         st->abr_count=0;
255
502
         st->abr_drift=0;
256
502
         st->abr_drift2=0;
257
502
      }
258
259
502
      break;
260
0
   case SPEEX_GET_ABR:
261
0
      (*(spx_int32_t*)ptr) = st->abr_enabled;
262
0
      break;
263
0
#endif /* #ifndef DISABLE_VBR */
264
0
#if !defined(DISABLE_VBR) && !defined(DISABLE_FLOAT_API)
265
2.96k
   case SPEEX_SET_VBR_QUALITY:
266
2.96k
      st->vbr_quality = (*(float*)ptr);
267
2.96k
      if (st->vbr_quality < 0)
268
0
          st->vbr_quality = 0;
269
2.96k
      else if (st->vbr_quality > 10)
270
0
          st->vbr_quality = 10;
271
2.96k
      break;
272
0
   case SPEEX_GET_VBR_QUALITY:
273
0
      (*(float*)ptr) = st->vbr_quality;
274
0
      break;
275
0
#endif /* !defined(DISABLE_VBR) && !defined(DISABLE_FLOAT_API) */
276
72.7k
   case SPEEX_SET_QUALITY:
277
72.7k
      {
278
72.7k
         int quality = (*(spx_int32_t*)ptr);
279
72.7k
         if (quality < 0)
280
0
            quality = 0;
281
72.7k
         if (quality > 10)
282
0
            quality = 10;
283
72.7k
         st->submodeSelect = st->submodeID = ((const SpeexNBMode*)(st->mode->mode))->quality_map[quality];
284
72.7k
      }
285
72.7k
      break;
286
3.94k
   case SPEEX_SET_COMPLEXITY:
287
3.94k
      st->complexity = (*(spx_int32_t*)ptr);
288
3.94k
      if (st->complexity<0)
289
0
         st->complexity=0;
290
3.94k
      break;
291
0
   case SPEEX_GET_COMPLEXITY:
292
0
      (*(spx_int32_t*)ptr) = st->complexity;
293
0
      break;
294
6.78k
   case SPEEX_SET_BITRATE:
295
6.78k
      {
296
6.78k
         spx_int32_t i=10;
297
6.78k
         spx_int32_t rate, target;
298
6.78k
         target = (*(spx_int32_t*)ptr);
299
67.7k
         while (i>=0)
300
64.3k
         {
301
64.3k
            speex_encoder_ctl(st, SPEEX_SET_QUALITY, &i);
302
64.3k
            speex_encoder_ctl(st, SPEEX_GET_BITRATE, &rate);
303
64.3k
            if (rate <= target)
304
3.45k
               break;
305
60.9k
            i--;
306
60.9k
         }
307
6.78k
      }
308
6.78k
      break;
309
110k
   case SPEEX_GET_BITRATE:
310
110k
      if (st->submodes[st->submodeID])
311
107k
         (*(spx_int32_t*)ptr) = st->sampling_rate*SUBMODE(bits_per_frame)/NB_FRAME_SIZE;
312
2.42k
      else
313
2.42k
         (*(spx_int32_t*)ptr) = st->sampling_rate*(NB_SUBMODE_BITS+1)/NB_FRAME_SIZE;
314
110k
      break;
315
3.94k
   case SPEEX_SET_SAMPLING_RATE:
316
3.94k
      st->sampling_rate = (*(spx_int32_t*)ptr);
317
3.94k
      break;
318
1.93k
   case SPEEX_GET_SAMPLING_RATE:
319
1.93k
      (*(spx_int32_t*)ptr)=st->sampling_rate;
320
1.93k
      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.94k
   case SPEEX_GET_LOOKAHEAD:
343
3.94k
      (*(spx_int32_t*)ptr)=(NB_WINDOW_SIZE-NB_FRAME_SIZE);
344
3.94k
      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.82k
   case SPEEX_SET_VBR_MAX_BITRATE:
355
1.82k
      st->vbr_max = (*(spx_int32_t*)ptr);
356
1.82k
      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.94k
   case SPEEX_SET_HIGHPASS:
362
3.94k
      st->highpass_enabled = (*(spx_int32_t*)ptr);
363
3.94k
      break;
364
0
   case SPEEX_GET_HIGHPASS:
365
0
      (*(spx_int32_t*)ptr) = st->highpass_enabled;
366
0
      break;
367
368
   /* This is all internal stuff past this point */
369
8.06k
   case SPEEX_GET_PI_GAIN:
370
8.06k
      {
371
8.06k
         int i;
372
8.06k
         spx_word32_t *g = (spx_word32_t*)ptr;
373
40.3k
         for (i=0;i<NB_NB_SUBFRAMES;i++)
374
32.2k
            g[i]=st->pi_gain[i];
375
8.06k
      }
376
8.06k
      break;
377
8.06k
   case SPEEX_GET_EXC:
378
8.06k
      {
379
8.06k
         int i;
380
40.3k
         for (i=0;i<NB_NB_SUBFRAMES;i++)
381
32.2k
            ((spx_word16_t*)ptr)[i] = compute_rms16(st->exc+i*NB_SUBFRAME_SIZE, NB_SUBFRAME_SIZE);
382
8.06k
      }
383
8.06k
      break;
384
0
#ifndef DISABLE_VBR
385
5.58k
   case SPEEX_GET_RELATIVE_QUALITY:
386
5.58k
      (*(float*)ptr)=st->relative_quality;
387
5.58k
      break;
388
0
#endif /* #ifndef DISABLE_VBR */
389
8.06k
   case SPEEX_SET_INNOVATION_SAVE:
390
8.06k
      st->innov_rms_save = (spx_word16_t*)ptr;
391
8.06k
      break;
392
2.73k
   case SPEEX_SET_WIDEBAND:
393
2.73k
      st->isWideband = *((spx_int32_t*)ptr);
394
2.73k
      break;
395
0
   case SPEEX_GET_STACK:
396
0
      *((char**)ptr) = st->stack;
397
0
      break;
398
0
   default:
399
0
      speex_warning_int("Unknown nb_ctl request: ", request);
400
0
      return -1;
401
310k
   }
402
310k
   return 0;
403
310k
}
nb_encoder_ctl
Line
Count
Source
198
310k
{
199
310k
   EncState *st;
200
310k
   st=(EncState*)state;
201
310k
   switch(request)
202
310k
   {
203
7.77k
   case SPEEX_GET_FRAME_SIZE:
204
7.77k
      (*(spx_int32_t*)ptr) = NB_FRAME_SIZE;
205
7.77k
      break;
206
0
   case SPEEX_SET_LOW_MODE:
207
41.1k
   case SPEEX_SET_MODE:
208
41.1k
      st->submodeSelect = st->submodeID = (*(spx_int32_t*)ptr);
209
41.1k
      break;
210
10.4k
   case SPEEX_GET_LOW_MODE:
211
10.4k
   case SPEEX_GET_MODE:
212
10.4k
      (*(spx_int32_t*)ptr) = st->submodeID;
213
10.4k
      break;
214
0
#ifndef DISABLE_VBR
215
2.45k
      case SPEEX_SET_VBR:
216
2.45k
      st->vbr_enabled = (*(spx_int32_t*)ptr);
217
2.45k
      break;
218
0
   case SPEEX_GET_VBR:
219
0
      (*(spx_int32_t*)ptr) = st->vbr_enabled;
220
0
      break;
221
1.77k
   case SPEEX_SET_VAD:
222
1.77k
      st->vad_enabled = (*(spx_int32_t*)ptr);
223
1.77k
      break;
224
0
   case SPEEX_GET_VAD:
225
0
      (*(spx_int32_t*)ptr) = st->vad_enabled;
226
0
      break;
227
1.69k
   case SPEEX_SET_DTX:
228
1.69k
      st->dtx_enabled = (*(spx_int32_t*)ptr);
229
1.69k
      break;
230
0
   case SPEEX_GET_DTX:
231
0
      (*(spx_int32_t*)ptr) = st->dtx_enabled;
232
0
      break;
233
502
   case SPEEX_SET_ABR:
234
502
      st->abr_enabled = (*(spx_int32_t*)ptr);
235
502
      st->vbr_enabled = st->abr_enabled!=0;
236
502
      if (st->vbr_enabled)
237
502
      {
238
502
         spx_int32_t i=10;
239
502
         spx_int32_t rate, target;
240
502
         float vbr_qual;
241
502
         target = (*(spx_int32_t*)ptr);
242
6.02k
         while (i>=0)
243
5.52k
         {
244
5.52k
            speex_encoder_ctl(st, SPEEX_SET_QUALITY, &i);
245
5.52k
            speex_encoder_ctl(st, SPEEX_GET_BITRATE, &rate);
246
5.52k
            if (rate <= target)
247
0
               break;
248
5.52k
            i--;
249
5.52k
         }
250
502
         vbr_qual=i;
251
502
         if (vbr_qual<0)
252
502
            vbr_qual=0;
253
502
         speex_encoder_ctl(st, SPEEX_SET_VBR_QUALITY, &vbr_qual);
254
502
         st->abr_count=0;
255
502
         st->abr_drift=0;
256
502
         st->abr_drift2=0;
257
502
      }
258
259
502
      break;
260
0
   case SPEEX_GET_ABR:
261
0
      (*(spx_int32_t*)ptr) = st->abr_enabled;
262
0
      break;
263
0
#endif /* #ifndef DISABLE_VBR */
264
0
#if !defined(DISABLE_VBR) && !defined(DISABLE_FLOAT_API)
265
2.96k
   case SPEEX_SET_VBR_QUALITY:
266
2.96k
      st->vbr_quality = (*(float*)ptr);
267
2.96k
      if (st->vbr_quality < 0)
268
0
          st->vbr_quality = 0;
269
2.96k
      else if (st->vbr_quality > 10)
270
0
          st->vbr_quality = 10;
271
2.96k
      break;
272
0
   case SPEEX_GET_VBR_QUALITY:
273
0
      (*(float*)ptr) = st->vbr_quality;
274
0
      break;
275
0
#endif /* !defined(DISABLE_VBR) && !defined(DISABLE_FLOAT_API) */
276
72.7k
   case SPEEX_SET_QUALITY:
277
72.7k
      {
278
72.7k
         int quality = (*(spx_int32_t*)ptr);
279
72.7k
         if (quality < 0)
280
0
            quality = 0;
281
72.7k
         if (quality > 10)
282
0
            quality = 10;
283
72.7k
         st->submodeSelect = st->submodeID = ((const SpeexNBMode*)(st->mode->mode))->quality_map[quality];
284
72.7k
      }
285
72.7k
      break;
286
3.94k
   case SPEEX_SET_COMPLEXITY:
287
3.94k
      st->complexity = (*(spx_int32_t*)ptr);
288
3.94k
      if (st->complexity<0)
289
0
         st->complexity=0;
290
3.94k
      break;
291
0
   case SPEEX_GET_COMPLEXITY:
292
0
      (*(spx_int32_t*)ptr) = st->complexity;
293
0
      break;
294
6.78k
   case SPEEX_SET_BITRATE:
295
6.78k
      {
296
6.78k
         spx_int32_t i=10;
297
6.78k
         spx_int32_t rate, target;
298
6.78k
         target = (*(spx_int32_t*)ptr);
299
67.7k
         while (i>=0)
300
64.3k
         {
301
64.3k
            speex_encoder_ctl(st, SPEEX_SET_QUALITY, &i);
302
64.3k
            speex_encoder_ctl(st, SPEEX_GET_BITRATE, &rate);
303
64.3k
            if (rate <= target)
304
3.45k
               break;
305
60.9k
            i--;
306
60.9k
         }
307
6.78k
      }
308
6.78k
      break;
309
110k
   case SPEEX_GET_BITRATE:
310
110k
      if (st->submodes[st->submodeID])
311
107k
         (*(spx_int32_t*)ptr) = st->sampling_rate*SUBMODE(bits_per_frame)/NB_FRAME_SIZE;
312
2.42k
      else
313
2.42k
         (*(spx_int32_t*)ptr) = st->sampling_rate*(NB_SUBMODE_BITS+1)/NB_FRAME_SIZE;
314
110k
      break;
315
3.94k
   case SPEEX_SET_SAMPLING_RATE:
316
3.94k
      st->sampling_rate = (*(spx_int32_t*)ptr);
317
3.94k
      break;
318
1.93k
   case SPEEX_GET_SAMPLING_RATE:
319
1.93k
      (*(spx_int32_t*)ptr)=st->sampling_rate;
320
1.93k
      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.94k
   case SPEEX_GET_LOOKAHEAD:
343
3.94k
      (*(spx_int32_t*)ptr)=(NB_WINDOW_SIZE-NB_FRAME_SIZE);
344
3.94k
      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.82k
   case SPEEX_SET_VBR_MAX_BITRATE:
355
1.82k
      st->vbr_max = (*(spx_int32_t*)ptr);
356
1.82k
      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.94k
   case SPEEX_SET_HIGHPASS:
362
3.94k
      st->highpass_enabled = (*(spx_int32_t*)ptr);
363
3.94k
      break;
364
0
   case SPEEX_GET_HIGHPASS:
365
0
      (*(spx_int32_t*)ptr) = st->highpass_enabled;
366
0
      break;
367
368
   /* This is all internal stuff past this point */
369
8.06k
   case SPEEX_GET_PI_GAIN:
370
8.06k
      {
371
8.06k
         int i;
372
8.06k
         spx_word32_t *g = (spx_word32_t*)ptr;
373
40.3k
         for (i=0;i<NB_NB_SUBFRAMES;i++)
374
32.2k
            g[i]=st->pi_gain[i];
375
8.06k
      }
376
8.06k
      break;
377
8.06k
   case SPEEX_GET_EXC:
378
8.06k
      {
379
8.06k
         int i;
380
40.3k
         for (i=0;i<NB_NB_SUBFRAMES;i++)
381
32.2k
            ((spx_word16_t*)ptr)[i] = compute_rms16(st->exc+i*NB_SUBFRAME_SIZE, NB_SUBFRAME_SIZE);
382
8.06k
      }
383
8.06k
      break;
384
0
#ifndef DISABLE_VBR
385
5.58k
   case SPEEX_GET_RELATIVE_QUALITY:
386
5.58k
      (*(float*)ptr)=st->relative_quality;
387
5.58k
      break;
388
0
#endif /* #ifndef DISABLE_VBR */
389
8.06k
   case SPEEX_SET_INNOVATION_SAVE:
390
8.06k
      st->innov_rms_save = (spx_word16_t*)ptr;
391
8.06k
      break;
392
2.73k
   case SPEEX_SET_WIDEBAND:
393
2.73k
      st->isWideband = *((spx_int32_t*)ptr);
394
2.73k
      break;
395
0
   case SPEEX_GET_STACK:
396
0
      *((char**)ptr) = st->stack;
397
0
      break;
398
0
   default:
399
0
      speex_warning_int("Unknown nb_ctl request: ", request);
400
0
      return -1;
401
310k
   }
402
310k
   return 0;
403
310k
}
404
405
406
int nb_encode(void *state, void *vin, SpeexBits *bits)
407
28.2k
{
408
28.2k
   EncState *st;
409
28.2k
   int i, sub, roots;
410
28.2k
   int ol_pitch;
411
28.2k
   spx_word16_t ol_pitch_coef;
412
28.2k
   spx_word32_t ol_gain;
413
28.2k
   VARDECL(spx_word16_t *target);
414
28.2k
   VARDECL(spx_sig_t *innov);
415
28.2k
   VARDECL(spx_word32_t *exc32);
416
28.2k
   VARDECL(spx_mem_t *mem);
417
28.2k
   VARDECL(spx_coef_t *bw_lpc1);
418
28.2k
   VARDECL(spx_coef_t *bw_lpc2);
419
28.2k
   VARDECL(spx_coef_t *lpc);
420
28.2k
   VARDECL(spx_lsp_t *lsp);
421
28.2k
   VARDECL(spx_lsp_t *qlsp);
422
28.2k
   VARDECL(spx_lsp_t *interp_lsp);
423
28.2k
   VARDECL(spx_lsp_t *interp_qlsp);
424
28.2k
   VARDECL(spx_coef_t *interp_lpc);
425
28.2k
   VARDECL(spx_coef_t *interp_qlpc);
426
28.2k
   char *stack;
427
28.2k
   VARDECL(spx_word16_t *syn_resp);
428
429
28.2k
   spx_word32_t ener=0;
430
28.2k
   spx_word16_t fine_gain;
431
28.2k
   spx_word16_t *in = (spx_word16_t*)vin;
432
433
28.2k
   st=(EncState *)state;
434
28.2k
   stack=st->stack;
435
436
28.2k
   ALLOC(lpc, NB_ORDER, spx_coef_t);
437
28.2k
   ALLOC(bw_lpc1, NB_ORDER, spx_coef_t);
438
28.2k
   ALLOC(bw_lpc2, NB_ORDER, spx_coef_t);
439
28.2k
   ALLOC(lsp, NB_ORDER, spx_lsp_t);
440
28.2k
   ALLOC(qlsp, NB_ORDER, spx_lsp_t);
441
28.2k
   ALLOC(interp_lsp, NB_ORDER, spx_lsp_t);
442
28.2k
   ALLOC(interp_qlsp, NB_ORDER, spx_lsp_t);
443
28.2k
   ALLOC(interp_lpc, NB_ORDER, spx_coef_t);
444
28.2k
   ALLOC(interp_qlpc, NB_ORDER, spx_coef_t);
445
446
28.2k
   st->exc = st->excBuf + NB_PITCH_END + 2;
447
28.2k
   st->sw = st->swBuf + NB_PITCH_END + 2;
448
   /* Move signals 1 frame towards the past */
449
28.2k
   SPEEX_MOVE(st->excBuf, st->excBuf+NB_FRAME_SIZE, NB_PITCH_END+2);
450
28.2k
   SPEEX_MOVE(st->swBuf, st->swBuf+NB_FRAME_SIZE, NB_PITCH_END+2);
451
452
28.2k
   if (st->highpass_enabled)
453
12.0k
      highpass(in, in, NB_FRAME_SIZE, (st->isWideband?HIGHPASS_WIDEBAND:HIGHPASS_NARROWBAND)|HIGHPASS_INPUT, st->mem_hp);
454
455
28.2k
   {
456
28.2k
      VARDECL(spx_word16_t *w_sig);
457
28.2k
      VARDECL(spx_word16_t *autocorr);
458
28.2k
      ALLOC(w_sig, NB_WINDOW_SIZE, spx_word16_t);
459
28.2k
      ALLOC(autocorr, NB_ORDER+1, spx_word16_t);
460
      /* Window for analysis */
461
1.15M
      for (i=0;i<NB_WINDOW_SIZE-NB_FRAME_SIZE;i++)
462
1.12M
         w_sig[i] = MULT16_16_Q15(st->winBuf[i],st->window[i]);
463
4.54M
      for (;i<NB_WINDOW_SIZE;i++)
464
4.51M
         w_sig[i] = MULT16_16_Q15(in[i-NB_WINDOW_SIZE+NB_FRAME_SIZE],st->window[i]);
465
      /* Compute auto-correlation */
466
28.2k
      _spx_autocorr(w_sig, autocorr, NB_ORDER+1, NB_WINDOW_SIZE);
467
28.2k
      autocorr[0] = ADD16(autocorr[0],MULT16_16_Q15(autocorr[0],st->lpc_floor)); /* Noise floor in auto-correlation domain */
468
469
      /* Lag windowing: equivalent to filtering in the power-spectrum domain */
470
338k
      for (i=0;i<NB_ORDER+1;i++)
471
310k
         autocorr[i] = MULT16_16_Q15(autocorr[i],st->lagWindow[i]);
472
28.2k
      autocorr[0] = ADD16(autocorr[0],1);
473
474
      /* Levinson-Durbin */
475
28.2k
      _spx_lpc(lpc, autocorr, NB_ORDER);
476
      /* LPC to LSPs (x-domain) transform */
477
28.2k
      roots=lpc_to_lsp (lpc, NB_ORDER, lsp, 10, LSP_DELTA1, stack);
478
      /* Check if we found all the roots */
479
28.2k
      if (roots!=NB_ORDER)
480
41
      {
481
         /*If we can't find all LSP's, do some damage control and use previous filter*/
482
451
         for (i=0;i<NB_ORDER;i++)
483
410
         {
484
410
            lsp[i]=st->old_lsp[i];
485
410
         }
486
41
      }
487
28.2k
   }
488
489
490
491
492
   /* Whole frame analysis (open-loop estimation of pitch and excitation gain) */
493
28.2k
   {
494
28.2k
      int diff = NB_WINDOW_SIZE-NB_FRAME_SIZE;
495
28.2k
      if (st->first)
496
62.8k
         for (i=0;i<NB_ORDER;i++)
497
57.1k
            interp_lsp[i] = lsp[i];
498
22.5k
      else
499
22.5k
         lsp_interpolate(st->old_lsp, lsp, interp_lsp, NB_ORDER, NB_NB_SUBFRAMES, NB_NB_SUBFRAMES<<1, LSP_MARGIN);
500
501
      /* Compute interpolated LPCs (unquantized) for whole frame*/
502
28.2k
      lsp_to_lpc(interp_lsp, interp_lpc, NB_ORDER,stack);
503
504
505
      /*Open-loop pitch*/
506
28.2k
      if (!st->submodes[st->submodeID] || (st->complexity>2 && SUBMODE(have_subframe_gain)<3) || SUBMODE(forced_pitch_gain) || SUBMODE(lbr_pitch) != -1
507
6.29k
#ifndef DISABLE_VBR
508
6.29k
           || st->vbr_enabled || st->vad_enabled
509
28.2k
#endif
510
28.2k
                  )
511
26.0k
      {
512
26.0k
         int nol_pitch[6];
513
26.0k
         spx_word16_t nol_pitch_coef[6];
514
515
26.0k
         bw_lpc(QCONST16(0.9,15), interp_lpc, bw_lpc1, NB_ORDER);
516
26.0k
         bw_lpc(QCONST16(0.55,15), interp_lpc, bw_lpc2, NB_ORDER);
517
518
26.0k
         SPEEX_COPY(st->sw, st->winBuf, diff);
519
26.0k
         SPEEX_COPY(st->sw+diff, in, NB_FRAME_SIZE-diff);
520
26.0k
         filter10(st->sw, bw_lpc1, bw_lpc2, st->sw, NB_FRAME_SIZE, st->mem_sw_whole, stack);
521
522
26.0k
         open_loop_nbest_pitch(st->sw, NB_PITCH_START, NB_PITCH_END, NB_FRAME_SIZE,
523
26.0k
                               nol_pitch, nol_pitch_coef, 6, stack);
524
26.0k
         ol_pitch=nol_pitch[0];
525
26.0k
         ol_pitch_coef = nol_pitch_coef[0];
526
         /*Try to remove pitch multiples*/
527
156k
         for (i=1;i<6;i++)
528
130k
         {
529
#ifdef FIXED_POINT
530
90.8k
            if ((nol_pitch_coef[i]>MULT16_16_Q15(nol_pitch_coef[0],27853)) &&
531
#else
532
39.5k
            if ((nol_pitch_coef[i]>.85*nol_pitch_coef[0]) &&
533
10.9k
#endif
534
29.7k
                (ABS(2*nol_pitch[i]-ol_pitch)<=2 || ABS(3*nol_pitch[i]-ol_pitch)<=3 ||
535
29.1k
                 ABS(4*nol_pitch[i]-ol_pitch)<=4 || ABS(5*nol_pitch[i]-ol_pitch)<=5))
536
1.08k
            {
537
               /*ol_pitch_coef=nol_pitch_coef[i];*/
538
1.08k
               ol_pitch = nol_pitch[i];
539
1.08k
            }
540
130k
         }
541
         /*if (ol_pitch>50)
542
           ol_pitch/=2;*/
543
         /*ol_pitch_coef = sqrt(ol_pitch_coef);*/
544
545
26.0k
      } else {
546
2.13k
         ol_pitch=0;
547
2.13k
         ol_pitch_coef=0;
548
2.13k
      }
549
550
      /*Compute "real" excitation*/
551
      /*SPEEX_COPY(st->exc, st->winBuf, diff);
552
      SPEEX_COPY(st->exc+diff, in, NB_FRAME_SIZE-diff);*/
553
28.2k
      fir_mem16(st->winBuf, interp_lpc, st->exc, diff, NB_ORDER, st->mem_exc, stack);
554
28.2k
      fir_mem16(in, interp_lpc, st->exc+diff, NB_FRAME_SIZE-diff, NB_ORDER, st->mem_exc, stack);
555
556
      /* Compute open-loop excitation gain */
557
28.2k
      {
558
28.2k
         spx_word16_t g = compute_rms16(st->exc, NB_FRAME_SIZE);
559
28.2k
         if (st->submodeID!=1 && ol_pitch>0)
560
12.6k
            ol_gain = MULT16_16(g, MULT16_16_Q14(QCONST16(1.1,14),
561
28.2k
                                spx_sqrt(QCONST32(1.,28)-MULT16_32_Q15(QCONST16(.8,15),SHL32(MULT16_16(ol_pitch_coef,ol_pitch_coef),16)))));
562
15.5k
         else
563
15.5k
            ol_gain = SHL32(EXTEND32(g),SIG_SHIFT);
564
28.2k
      }
565
28.2k
   }
566
567
#ifdef VORBIS_PSYCHO
568
   SPEEX_MOVE(st->psy_window, st->psy_window+NB_FRAME_SIZE, 256-NB_FRAME_SIZE);
569
   SPEEX_COPY(&st->psy_window[256-NB_FRAME_SIZE], in, NB_FRAME_SIZE);
570
   compute_curve(st->psy, st->psy_window, st->curve);
571
   /*print_vec(st->curve, 128, "curve");*/
572
   if (st->first)
573
      SPEEX_COPY(st->old_curve, st->curve, 128);
574
#endif
575
576
   /*VBR stuff*/
577
28.2k
#ifndef DISABLE_VBR
578
28.2k
   if (st->vbr_enabled||st->vad_enabled)
579
22.0k
   {
580
22.0k
      float lsp_dist=0;
581
242k
      for (i=0;i<NB_ORDER;i++)
582
220k
         lsp_dist += (st->old_lsp[i] - lsp[i])*(st->old_lsp[i] - lsp[i]);
583
22.0k
      lsp_dist /= LSP_SCALING*LSP_SCALING;
584
585
22.0k
      if (st->abr_enabled)
586
5.02k
      {
587
5.02k
         float qual_change=0;
588
5.02k
         if (st->abr_drift2 * st->abr_drift > 0)
589
4.51k
         {
590
            /* Only adapt if long-term and short-term drift are the same sign */
591
4.51k
            qual_change = -.00001*st->abr_drift/(1+st->abr_count);
592
4.51k
            if (qual_change>.05)
593
0
               qual_change=.05;
594
4.51k
            if (qual_change<-.05)
595
1.17k
               qual_change=-.05;
596
4.51k
         }
597
5.02k
         st->vbr_quality += qual_change;
598
5.02k
         if (st->vbr_quality>10)
599
0
            st->vbr_quality=10;
600
5.02k
         if (st->vbr_quality<0)
601
4.51k
            st->vbr_quality=0;
602
5.02k
      }
603
604
22.0k
      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
22.0k
      if (st->vbr_enabled)
608
17.2k
      {
609
17.2k
         spx_int32_t mode;
610
17.2k
         int choice=0;
611
17.2k
         float min_diff=100;
612
17.2k
         mode = 8;
613
155k
         while (mode)
614
137k
         {
615
137k
            int v1;
616
137k
            float thresh;
617
137k
            v1=(int)floor(st->vbr_quality);
618
137k
            if (v1==10)
619
8.50k
               thresh = vbr_nb_thresh[mode][v1];
620
129k
            else
621
129k
               thresh = (st->vbr_quality-v1)*vbr_nb_thresh[mode][v1+1] + (1+v1-st->vbr_quality)*vbr_nb_thresh[mode][v1];
622
137k
            if (st->relative_quality > thresh &&
623
39.4k
                st->relative_quality-thresh<min_diff)
624
18.2k
            {
625
18.2k
               choice = mode;
626
18.2k
               min_diff = st->relative_quality-thresh;
627
18.2k
            }
628
137k
            mode--;
629
137k
         }
630
17.2k
         mode=choice;
631
17.2k
         if (mode==0)
632
4.83k
         {
633
4.83k
            if (st->dtx_count==0 || lsp_dist>.05 || !st->dtx_enabled || st->dtx_count>20)
634
2.95k
            {
635
2.95k
               mode=1;
636
2.95k
               st->dtx_count=1;
637
2.95k
            } else {
638
1.88k
               mode=0;
639
1.88k
               st->dtx_count++;
640
1.88k
            }
641
12.3k
         } else {
642
12.3k
            st->dtx_count=0;
643
12.3k
         }
644
645
17.2k
         speex_encoder_ctl(state, SPEEX_SET_MODE, &mode);
646
17.2k
         if (st->vbr_max>0)
647
12.8k
         {
648
12.8k
            spx_int32_t rate;
649
12.8k
            speex_encoder_ctl(state, SPEEX_GET_BITRATE, &rate);
650
12.8k
            if (rate > st->vbr_max)
651
4.76k
            {
652
4.76k
               rate = st->vbr_max;
653
4.76k
               speex_encoder_ctl(state, SPEEX_SET_BITRATE, &rate);
654
4.76k
            }
655
12.8k
         }
656
657
17.2k
         if (st->abr_enabled)
658
5.02k
         {
659
5.02k
            spx_int32_t bitrate;
660
5.02k
            speex_encoder_ctl(state, SPEEX_GET_BITRATE, &bitrate);
661
5.02k
            st->abr_drift+=(bitrate-st->abr_enabled);
662
5.02k
            st->abr_drift2 = .95*st->abr_drift2 + .05*(bitrate-st->abr_enabled);
663
5.02k
            st->abr_count += 1.0;
664
5.02k
         }
665
666
17.2k
      } else {
667
         /*VAD only case*/
668
4.78k
         int mode;
669
4.78k
         if (st->relative_quality<2)
670
1.56k
         {
671
1.56k
            if (st->dtx_count==0 || lsp_dist>.05 || !st->dtx_enabled || st->dtx_count>20)
672
971
            {
673
971
               st->dtx_count=1;
674
971
               mode=1;
675
971
            } else {
676
590
               mode=0;
677
590
               st->dtx_count++;
678
590
            }
679
3.21k
         } else {
680
3.21k
            st->dtx_count = 0;
681
3.21k
            mode=st->submodeSelect;
682
3.21k
         }
683
         /*speex_encoder_ctl(state, SPEEX_SET_MODE, &mode);*/
684
4.78k
         st->submodeID=mode;
685
4.78k
      }
686
22.0k
   } else {
687
6.21k
      st->relative_quality = -1;
688
6.21k
   }
689
28.2k
#endif /* #ifndef DISABLE_VBR */
690
691
28.2k
   if (st->encode_submode)
692
28.2k
   {
693
      /* First, transmit a zero for narrowband */
694
28.2k
      speex_bits_pack(bits, 0, 1);
695
696
      /* Transmit the sub-mode we use for this frame */
697
28.2k
      speex_bits_pack(bits, st->submodeID, NB_SUBMODE_BITS);
698
699
28.2k
   }
700
701
   /* If null mode (no transmission), just set a couple things to zero*/
702
28.2k
   if (st->submodes[st->submodeID] == NULL)
703
2.34k
   {
704
377k
      for (i=0;i<NB_FRAME_SIZE;i++)
705
375k
         st->exc[i]=st->sw[i]=VERY_SMALL;
706
707
25.7k
      for (i=0;i<NB_ORDER;i++)
708
23.4k
         st->mem_sw[i]=0;
709
2.34k
      st->first=1;
710
2.34k
      st->bounded_pitch = 1;
711
712
2.34k
      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
25.7k
      for (i=0;i<NB_ORDER;i++)
716
23.4k
         st->mem_sp[i] = 0;
717
2.34k
      return 0;
718
719
2.34k
   }
720
721
   /* LSP Quantization */
722
25.8k
   if (st->first)
723
4.00k
   {
724
44.0k
      for (i=0;i<NB_ORDER;i++)
725
40.0k
         st->old_lsp[i] = lsp[i];
726
4.00k
   }
727
728
729
   /*Quantize LSPs*/
730
25.8k
#if 1 /*0 for unquantized*/
731
25.8k
   SUBMODE(lsp_quant)(lsp, qlsp, NB_ORDER, bits);
732
#else
733
   for (i=0;i<NB_ORDER;i++)
734
     qlsp[i]=lsp[i];
735
#endif
736
737
   /*If we use low bit-rate pitch mode, transmit open-loop pitch*/
738
25.8k
   if (SUBMODE(lbr_pitch)!=-1)
739
17.5k
   {
740
17.5k
      speex_bits_pack(bits, ol_pitch-NB_PITCH_START, 7);
741
17.5k
   }
742
743
25.8k
   if (SUBMODE(forced_pitch_gain))
744
16.0k
   {
745
16.0k
      int quant;
746
      /* This just damps the pitch a bit, because it tends to be too aggressive when forced */
747
16.0k
      ol_pitch_coef = MULT16_16_Q15(QCONST16(.9,15), ol_pitch_coef);
748
#ifdef FIXED_POINT
749
11.2k
      quant = PSHR16(MULT16_16_16(15, ol_pitch_coef),GAIN_SHIFT);
750
#else
751
4.72k
      quant = (int)floor(.5+15*ol_pitch_coef*GAIN_SCALING_1);
752
#endif
753
16.0k
      if (quant>15)
754
115
         quant=15;
755
16.0k
      if (quant<0)
756
0
         quant=0;
757
16.0k
      speex_bits_pack(bits, quant, 4);
758
16.0k
      ol_pitch_coef=MULT16_16_P15(QCONST16(0.066667,15),SHL16(quant,GAIN_SHIFT));
759
16.0k
   }
760
761
762
   /*Quantize and transmit open-loop excitation gain*/
763
#ifdef FIXED_POINT
764
   {
765
      int qe = scal_quant32(ol_gain, ol_gain_table, 32);
766
      /*ol_gain = exp(qe/3.5)*SIG_SCALING;*/
767
18.4k
      ol_gain = MULT16_32_Q15(28406,ol_gain_table[qe]);
768
      speex_bits_pack(bits, qe, 5);
769
   }
770
#else
771
   {
772
7.38k
      int qe = (int)(floor(.5+3.5*log(ol_gain*1.0/SIG_SCALING)));
773
7.38k
      if (qe<0)
774
4.66k
         qe=0;
775
7.38k
      if (qe>31)
776
439
         qe=31;
777
7.38k
      ol_gain = exp(qe/3.5)*SIG_SCALING;
778
      speex_bits_pack(bits, qe, 5);
779
   }
780
#endif
781
782
783
784
   /* Special case for first frame */
785
25.8k
   if (st->first)
786
4.00k
   {
787
44.0k
      for (i=0;i<NB_ORDER;i++)
788
40.0k
         st->old_qlsp[i] = qlsp[i];
789
4.00k
   }
790
791
   /* Target signal */
792
25.8k
   ALLOC(target, NB_SUBFRAME_SIZE, spx_word16_t);
793
25.8k
   ALLOC(innov, NB_SUBFRAME_SIZE, spx_sig_t);
794
25.8k
   ALLOC(exc32, NB_SUBFRAME_SIZE, spx_word32_t);
795
25.8k
   ALLOC(syn_resp, NB_SUBFRAME_SIZE, spx_word16_t);
796
25.8k
   ALLOC(mem, NB_ORDER, spx_mem_t);
797
798
   /* Loop on sub-frames */
799
129k
   for (sub=0;sub<NB_NB_SUBFRAMES;sub++)
800
103k
   {
801
103k
      int   offset;
802
103k
      spx_word16_t *sw;
803
103k
      spx_word16_t *exc, *inBuf;
804
103k
      int pitch;
805
103k
      int response_bound = NB_SUBFRAME_SIZE;
806
807
      /* Offset relative to start of frame */
808
103k
      offset = NB_SUBFRAME_SIZE*sub;
809
      /* Excitation */
810
103k
      exc=st->exc+offset;
811
      /* Weighted signal */
812
103k
      sw=st->sw+offset;
813
814
      /* LSP interpolation (quantized and unquantized) */
815
103k
      lsp_interpolate(st->old_lsp, lsp, interp_lsp, NB_ORDER, sub, NB_NB_SUBFRAMES, LSP_MARGIN);
816
103k
      lsp_interpolate(st->old_qlsp, qlsp, interp_qlsp, NB_ORDER, sub, NB_NB_SUBFRAMES, LSP_MARGIN);
817
818
      /* Compute interpolated LPCs (quantized and unquantized) */
819
103k
      lsp_to_lpc(interp_lsp, interp_lpc, NB_ORDER,stack);
820
821
103k
      lsp_to_lpc(interp_qlsp, interp_qlpc, NB_ORDER, stack);
822
823
      /* Compute analysis filter gain at w=pi (for use in SB-CELP) */
824
103k
      {
825
103k
         spx_word32_t pi_g=LPC_SCALING;
826
621k
         for (i=0;i<NB_ORDER;i+=2)
827
517k
         {
828
            /*pi_g += -st->interp_qlpc[i] +  st->interp_qlpc[i+1];*/
829
517k
            pi_g = ADD32(pi_g, SUB32(EXTEND32(interp_qlpc[i+1]),EXTEND32(interp_qlpc[i])));
830
517k
         }
831
103k
         st->pi_gain[sub] = pi_g;
832
103k
      }
833
834
#ifdef VORBIS_PSYCHO
835
      {
836
         float curr_curve[128];
837
         float fact = ((float)sub+1.0f)/NB_NB_SUBFRAMES;
838
         for (i=0;i<128;i++)
839
            curr_curve[i] = (1.0f-fact)*st->old_curve[i] + fact*st->curve[i];
840
         curve_to_lpc(st->psy, curr_curve, bw_lpc1, bw_lpc2, 10);
841
      }
842
#else
843
      /* Compute bandwidth-expanded (unquantized) LPCs for perceptual weighting */
844
103k
      bw_lpc(st->gamma1, interp_lpc, bw_lpc1, NB_ORDER);
845
103k
      bw_lpc(st->gamma2, interp_lpc, bw_lpc2, NB_ORDER);
846
      /*print_vec(st->bw_lpc1, 10, "bw_lpc");*/
847
103k
#endif
848
849
      /*FIXME: This will break if we change the window size */
850
103k
      speex_assert(NB_WINDOW_SIZE-NB_FRAME_SIZE == NB_SUBFRAME_SIZE);
851
103k
      if (sub==0)
852
25.8k
         inBuf = st->winBuf;
853
77.6k
      else
854
77.6k
         inBuf = &in[((sub-1)*NB_SUBFRAME_SIZE)];
855
4.24M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
856
4.14M
         sw[i] = inBuf[i];
857
858
103k
      if (st->complexity==0)
859
22.9k
         response_bound >>= 1;
860
103k
      compute_impulse_response(interp_qlpc, bw_lpc1, bw_lpc2, syn_resp, response_bound, NB_ORDER, stack);
861
562k
      for (i=response_bound;i<NB_SUBFRAME_SIZE;i++)
862
458k
         syn_resp[i]=VERY_SMALL;
863
864
      /* Compute zero response of A(z/g1) / ( A(z/g2) * A(z) ) */
865
1.13M
      for (i=0;i<NB_ORDER;i++)
866
1.03M
         mem[i]=SHL32(st->mem_sp[i],1);
867
4.24M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
868
4.14M
         exc[i] = VERY_SMALL;
869
#ifdef SHORTCUTS2
870
      iir_mem16(exc, interp_qlpc, exc, response_bound, NB_ORDER, mem, stack);
871
      for (i=0;i<NB_ORDER;i++)
872
         mem[i]=SHL32(st->mem_sw[i],1);
873
      filter10(exc, st->bw_lpc1, st->bw_lpc2, exc, response_bound, mem, stack);
874
      SPEEX_MEMSET(&exc[response_bound], 0, NB_SUBFRAME_SIZE-response_bound);
875
#else
876
103k
      iir_mem16(exc, interp_qlpc, exc, NB_SUBFRAME_SIZE, NB_ORDER, mem, stack);
877
1.13M
      for (i=0;i<NB_ORDER;i++)
878
1.03M
         mem[i]=SHL32(st->mem_sw[i],1);
879
103k
      filter10(exc, bw_lpc1, bw_lpc2, exc, NB_SUBFRAME_SIZE, mem, stack);
880
103k
#endif
881
882
      /* Compute weighted signal */
883
1.13M
      for (i=0;i<NB_ORDER;i++)
884
1.03M
         mem[i]=st->mem_sw[i];
885
103k
      filter10(sw, bw_lpc1, bw_lpc2, sw, NB_SUBFRAME_SIZE, mem, stack);
886
887
103k
      if (st->complexity==0)
888
252k
         for (i=0;i<NB_ORDER;i++)
889
229k
            st->mem_sw[i]=mem[i];
890
891
      /* Compute target signal (saturation prevents overflows on clipped input speech) */
892
4.24M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
893
4.14M
         target[i]=EXTRACT16(SATURATE(SUB32(sw[i],PSHR32(exc[i],1)),32767));
894
895
4.24M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
896
4.14M
         exc[i] = inBuf[i];
897
103k
      fir_mem16(exc, interp_qlpc, exc, NB_SUBFRAME_SIZE, NB_ORDER, st->mem_exc2, stack);
898
      /* If we have a long-term predictor (otherwise, something's wrong) */
899
103k
      speex_assert (SUBMODE(ltp_quant));
900
103k
      {
901
103k
         int pit_min, pit_max;
902
         /* Long-term prediction */
903
103k
         if (SUBMODE(lbr_pitch) != -1)
904
70.2k
         {
905
            /* Low bit-rate pitch handling */
906
70.2k
            int margin;
907
70.2k
            margin = SUBMODE(lbr_pitch);
908
70.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
70.2k
            } else {
917
70.2k
               pit_min=pit_max=ol_pitch;
918
70.2k
            }
919
70.2k
         } else {
920
33.2k
            pit_min = NB_PITCH_START;
921
33.2k
            pit_max = NB_PITCH_END;
922
33.2k
         }
923
924
         /* Force pitch to use only the current frame if needed */
925
103k
         if (st->bounded_pitch && pit_max>offset)
926
32.1k
            pit_max=offset;
927
928
         /* Perform pitch search */
929
103k
         pitch = SUBMODE(ltp_quant)(target, sw, interp_qlpc, bw_lpc1, bw_lpc2,
930
103k
                                    exc32, SUBMODE(ltp_params), pit_min, pit_max, ol_pitch_coef,
931
103k
                                    NB_ORDER, NB_SUBFRAME_SIZE, bits, stack,
932
103k
                                    exc, syn_resp, st->complexity, 0, st->plc_tuning, &st->cumul_gain);
933
934
103k
         st->pitch[sub]=pitch;
935
103k
      }
936
      /* Quantization of innovation */
937
103k
      SPEEX_MEMSET(innov, 0, NB_SUBFRAME_SIZE);
938
939
      /* FIXME: Make sure this is safe from overflows (so far so good) */
940
4.24M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
941
4.14M
         exc[i] = EXTRACT16(SUB32(EXTEND32(exc[i]), PSHR32(exc32[i],SIG_SHIFT-1)));
942
943
103k
      ener = SHL32(EXTEND32(compute_rms16(exc, NB_SUBFRAME_SIZE)),SIG_SHIFT);
944
945
      /*FIXME: Should use DIV32_16 and make sure result fits in 16 bits */
946
#ifdef FIXED_POINT
947
      {
948
73.9k
         spx_word32_t f = PDIV32(ener,PSHR32(ol_gain,SIG_SHIFT));
949
73.9k
         if (f<=32767)
950
68.6k
            fine_gain = f;
951
5.27k
         else
952
5.27k
            fine_gain = 32767;
953
      }
954
#else
955
29.5k
      fine_gain = PDIV32_16(ener,PSHR32(ol_gain,SIG_SHIFT));
956
#endif
957
      /* Calculate gain correction for the sub-frame (if any) */
958
103k
      if (SUBMODE(have_subframe_gain))
959
33.2k
      {
960
33.2k
         int qe;
961
33.2k
         if (SUBMODE(have_subframe_gain)==3)
962
19.4k
         {
963
19.4k
            qe = scal_quant(fine_gain, exc_gain_quant_scal3_bound, 8);
964
19.4k
            speex_bits_pack(bits, qe, 3);
965
19.4k
            ener=MULT16_32_Q14(exc_gain_quant_scal3[qe],ol_gain);
966
19.4k
         } else {
967
13.7k
            qe = scal_quant(fine_gain, exc_gain_quant_scal1_bound, 2);
968
13.7k
            speex_bits_pack(bits, qe, 1);
969
13.7k
            ener=MULT16_32_Q14(exc_gain_quant_scal1[qe],ol_gain);
970
13.7k
         }
971
70.2k
      } else {
972
70.2k
         ener=ol_gain;
973
70.2k
      }
974
975
      /*printf ("%f %f\n", ener, ol_gain);*/
976
977
      /* Normalize innovation */
978
103k
      signal_div(target, target, ener, NB_SUBFRAME_SIZE);
979
980
      /* Quantize innovation */
981
103k
      speex_assert (SUBMODE(innovation_quant));
982
103k
      {
983
         /* Codebook search */
984
103k
         SUBMODE(innovation_quant)(target, interp_qlpc, bw_lpc1, bw_lpc2,
985
103k
                  SUBMODE(innovation_params), NB_ORDER, NB_SUBFRAME_SIZE,
986
103k
                  innov, syn_resp, bits, stack, st->complexity, SUBMODE(double_codebook));
987
988
         /* De-normalize innovation and update excitation */
989
103k
         signal_mul(innov, innov, ener, NB_SUBFRAME_SIZE);
990
991
         /* In some (rare) modes, we do a second search (more bits) to reduce noise even more */
992
103k
         if (SUBMODE(double_codebook)) {
993
3.73k
            char *tmp_stack=stack;
994
3.73k
            VARDECL(spx_sig_t *innov2);
995
3.73k
            ALLOC(innov2, NB_SUBFRAME_SIZE, spx_sig_t);
996
3.73k
            SPEEX_MEMSET(innov2, 0, NB_SUBFRAME_SIZE);
997
153k
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
998
149k
               target[i]=MULT16_16_P13(QCONST16(2.2f,13), target[i]);
999
3.73k
            SUBMODE(innovation_quant)(target, interp_qlpc, bw_lpc1, bw_lpc2,
1000
3.73k
                                      SUBMODE(innovation_params), NB_ORDER, NB_SUBFRAME_SIZE,
1001
3.73k
                                      innov2, syn_resp, bits, stack, st->complexity, 0);
1002
3.73k
            signal_mul(innov2, innov2, MULT16_32_Q15(QCONST16(0.454545f,15),ener), NB_SUBFRAME_SIZE);
1003
153k
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
1004
149k
               innov[i] = ADD32(innov[i],innov2[i]);
1005
3.73k
            stack = tmp_stack;
1006
3.73k
         }
1007
4.24M
         for (i=0;i<NB_SUBFRAME_SIZE;i++)
1008
4.14M
            exc[i] = EXTRACT16(SATURATE32(PSHR32(ADD32(SHL32(exc32[i],1),innov[i]),SIG_SHIFT),32767));
1009
103k
         if (st->innov_rms_save)
1010
30.4k
            st->innov_rms_save[sub] = compute_rms(innov, NB_SUBFRAME_SIZE);
1011
103k
      }
1012
1013
      /* Final signal synthesis from excitation */
1014
103k
      iir_mem16(exc, interp_qlpc, sw, NB_SUBFRAME_SIZE, NB_ORDER, st->mem_sp, stack);
1015
1016
      /* Compute weighted signal again, from synthesized speech (not sure it's the right thing) */
1017
103k
      if (st->complexity!=0)
1018
80.5k
         filter10(sw, bw_lpc1, bw_lpc2, sw, NB_SUBFRAME_SIZE, st->mem_sw, stack);
1019
1020
103k
   }
1021
1022
   /* Store the LSPs for interpolation in the next frame */
1023
25.8k
   if (st->submodeID>=1)
1024
25.8k
   {
1025
284k
      for (i=0;i<NB_ORDER;i++)
1026
258k
         st->old_lsp[i] = lsp[i];
1027
284k
      for (i=0;i<NB_ORDER;i++)
1028
258k
         st->old_qlsp[i] = qlsp[i];
1029
25.8k
   }
1030
1031
#ifdef VORBIS_PSYCHO
1032
   if (st->submodeID>=1)
1033
      SPEEX_COPY(st->old_curve, st->curve, 128);
1034
#endif
1035
1036
25.8k
   if (st->submodeID==1)
1037
13.3k
   {
1038
13.3k
#ifndef DISABLE_VBR
1039
13.3k
      if (st->dtx_count)
1040
4.05k
         speex_bits_pack(bits, 15, 4);
1041
9.25k
      else
1042
9.25k
#endif
1043
9.25k
         speex_bits_pack(bits, 0, 4);
1044
13.3k
   }
1045
1046
   /* The next frame will not be the first (Duh!) */
1047
25.8k
   st->first = 0;
1048
25.8k
   SPEEX_COPY(st->winBuf, in+2*NB_FRAME_SIZE-NB_WINDOW_SIZE, NB_WINDOW_SIZE-NB_FRAME_SIZE);
1049
1050
25.8k
   if (SUBMODE(innovation_quant) == noise_codebook_quant || st->submodeID==0)
1051
13.3k
      st->bounded_pitch = 1;
1052
12.5k
   else
1053
12.5k
      st->bounded_pitch = 0;
1054
1055
25.8k
   return 1;
1056
28.2k
}
nb_encode
Line
Count
Source
407
8.57k
{
408
8.57k
   EncState *st;
409
8.57k
   int i, sub, roots;
410
8.57k
   int ol_pitch;
411
8.57k
   spx_word16_t ol_pitch_coef;
412
8.57k
   spx_word32_t ol_gain;
413
8.57k
   VARDECL(spx_word16_t *target);
414
8.57k
   VARDECL(spx_sig_t *innov);
415
8.57k
   VARDECL(spx_word32_t *exc32);
416
8.57k
   VARDECL(spx_mem_t *mem);
417
8.57k
   VARDECL(spx_coef_t *bw_lpc1);
418
8.57k
   VARDECL(spx_coef_t *bw_lpc2);
419
8.57k
   VARDECL(spx_coef_t *lpc);
420
8.57k
   VARDECL(spx_lsp_t *lsp);
421
8.57k
   VARDECL(spx_lsp_t *qlsp);
422
8.57k
   VARDECL(spx_lsp_t *interp_lsp);
423
8.57k
   VARDECL(spx_lsp_t *interp_qlsp);
424
8.57k
   VARDECL(spx_coef_t *interp_lpc);
425
8.57k
   VARDECL(spx_coef_t *interp_qlpc);
426
8.57k
   char *stack;
427
8.57k
   VARDECL(spx_word16_t *syn_resp);
428
429
8.57k
   spx_word32_t ener=0;
430
8.57k
   spx_word16_t fine_gain;
431
8.57k
   spx_word16_t *in = (spx_word16_t*)vin;
432
433
8.57k
   st=(EncState *)state;
434
8.57k
   stack=st->stack;
435
436
8.57k
   ALLOC(lpc, NB_ORDER, spx_coef_t);
437
8.57k
   ALLOC(bw_lpc1, NB_ORDER, spx_coef_t);
438
8.57k
   ALLOC(bw_lpc2, NB_ORDER, spx_coef_t);
439
8.57k
   ALLOC(lsp, NB_ORDER, spx_lsp_t);
440
8.57k
   ALLOC(qlsp, NB_ORDER, spx_lsp_t);
441
8.57k
   ALLOC(interp_lsp, NB_ORDER, spx_lsp_t);
442
8.57k
   ALLOC(interp_qlsp, NB_ORDER, spx_lsp_t);
443
8.57k
   ALLOC(interp_lpc, NB_ORDER, spx_coef_t);
444
8.57k
   ALLOC(interp_qlpc, NB_ORDER, spx_coef_t);
445
446
8.57k
   st->exc = st->excBuf + NB_PITCH_END + 2;
447
8.57k
   st->sw = st->swBuf + NB_PITCH_END + 2;
448
   /* Move signals 1 frame towards the past */
449
8.57k
   SPEEX_MOVE(st->excBuf, st->excBuf+NB_FRAME_SIZE, NB_PITCH_END+2);
450
8.57k
   SPEEX_MOVE(st->swBuf, st->swBuf+NB_FRAME_SIZE, NB_PITCH_END+2);
451
452
8.57k
   if (st->highpass_enabled)
453
4.84k
      highpass(in, in, NB_FRAME_SIZE, (st->isWideband?HIGHPASS_WIDEBAND:HIGHPASS_NARROWBAND)|HIGHPASS_INPUT, st->mem_hp);
454
455
8.57k
   {
456
8.57k
      VARDECL(spx_word16_t *w_sig);
457
8.57k
      VARDECL(spx_word16_t *autocorr);
458
8.57k
      ALLOC(w_sig, NB_WINDOW_SIZE, spx_word16_t);
459
8.57k
      ALLOC(autocorr, NB_ORDER+1, spx_word16_t);
460
      /* Window for analysis */
461
351k
      for (i=0;i<NB_WINDOW_SIZE-NB_FRAME_SIZE;i++)
462
342k
         w_sig[i] = MULT16_16_Q15(st->winBuf[i],st->window[i]);
463
1.38M
      for (;i<NB_WINDOW_SIZE;i++)
464
1.37M
         w_sig[i] = MULT16_16_Q15(in[i-NB_WINDOW_SIZE+NB_FRAME_SIZE],st->window[i]);
465
      /* Compute auto-correlation */
466
8.57k
      _spx_autocorr(w_sig, autocorr, NB_ORDER+1, NB_WINDOW_SIZE);
467
8.57k
      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
94.3k
         autocorr[i] = MULT16_16_Q15(autocorr[i],st->lagWindow[i]);
472
8.57k
      autocorr[0] = ADD16(autocorr[0],1);
473
474
      /* Levinson-Durbin */
475
8.57k
      _spx_lpc(lpc, autocorr, NB_ORDER);
476
      /* LPC to LSPs (x-domain) transform */
477
8.57k
      roots=lpc_to_lsp (lpc, NB_ORDER, lsp, 10, LSP_DELTA1, stack);
478
      /* Check if we found all the roots */
479
8.57k
      if (roots!=NB_ORDER)
480
4
      {
481
         /*If we can't find all LSP's, do some damage control and use previous filter*/
482
44
         for (i=0;i<NB_ORDER;i++)
483
40
         {
484
40
            lsp[i]=st->old_lsp[i];
485
40
         }
486
4
      }
487
8.57k
   }
488
489
490
491
492
   /* Whole frame analysis (open-loop estimation of pitch and excitation gain) */
493
8.57k
   {
494
8.57k
      int diff = NB_WINDOW_SIZE-NB_FRAME_SIZE;
495
8.57k
      if (st->first)
496
23.8k
         for (i=0;i<NB_ORDER;i++)
497
21.7k
            interp_lsp[i] = lsp[i];
498
6.40k
      else
499
6.40k
         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.57k
      lsp_to_lpc(interp_lsp, interp_lpc, NB_ORDER,stack);
503
504
505
      /*Open-loop pitch*/
506
8.57k
      if (!st->submodes[st->submodeID] || (st->complexity>2 && SUBMODE(have_subframe_gain)<3) || SUBMODE(forced_pitch_gain) || SUBMODE(lbr_pitch) != -1
507
1.79k
#ifndef DISABLE_VBR
508
1.79k
           || st->vbr_enabled || st->vad_enabled
509
8.57k
#endif
510
8.57k
                  )
511
7.91k
      {
512
7.91k
         int nol_pitch[6];
513
7.91k
         spx_word16_t nol_pitch_coef[6];
514
515
7.91k
         bw_lpc(QCONST16(0.9,15), interp_lpc, bw_lpc1, NB_ORDER);
516
7.91k
         bw_lpc(QCONST16(0.55,15), interp_lpc, bw_lpc2, NB_ORDER);
517
518
7.91k
         SPEEX_COPY(st->sw, st->winBuf, diff);
519
7.91k
         SPEEX_COPY(st->sw+diff, in, NB_FRAME_SIZE-diff);
520
7.91k
         filter10(st->sw, bw_lpc1, bw_lpc2, st->sw, NB_FRAME_SIZE, st->mem_sw_whole, stack);
521
522
7.91k
         open_loop_nbest_pitch(st->sw, NB_PITCH_START, NB_PITCH_END, NB_FRAME_SIZE,
523
7.91k
                               nol_pitch, nol_pitch_coef, 6, stack);
524
7.91k
         ol_pitch=nol_pitch[0];
525
7.91k
         ol_pitch_coef = nol_pitch_coef[0];
526
         /*Try to remove pitch multiples*/
527
47.4k
         for (i=1;i<6;i++)
528
39.5k
         {
529
#ifdef FIXED_POINT
530
            if ((nol_pitch_coef[i]>MULT16_16_Q15(nol_pitch_coef[0],27853)) &&
531
#else
532
39.5k
            if ((nol_pitch_coef[i]>.85*nol_pitch_coef[0]) &&
533
10.9k
#endif
534
10.9k
                (ABS(2*nol_pitch[i]-ol_pitch)<=2 || ABS(3*nol_pitch[i]-ol_pitch)<=3 ||
535
10.8k
                 ABS(4*nol_pitch[i]-ol_pitch)<=4 || ABS(5*nol_pitch[i]-ol_pitch)<=5))
536
247
            {
537
               /*ol_pitch_coef=nol_pitch_coef[i];*/
538
247
               ol_pitch = nol_pitch[i];
539
247
            }
540
39.5k
         }
541
         /*if (ol_pitch>50)
542
           ol_pitch/=2;*/
543
         /*ol_pitch_coef = sqrt(ol_pitch_coef);*/
544
545
7.91k
      } else {
546
662
         ol_pitch=0;
547
662
         ol_pitch_coef=0;
548
662
      }
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.57k
      fir_mem16(st->winBuf, interp_lpc, st->exc, diff, NB_ORDER, st->mem_exc, stack);
554
8.57k
      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.57k
      {
558
8.57k
         spx_word16_t g = compute_rms16(st->exc, NB_FRAME_SIZE);
559
8.57k
         if (st->submodeID!=1 && ol_pitch>0)
560
4.04k
            ol_gain = MULT16_16(g, MULT16_16_Q14(QCONST16(1.1,14),
561
8.57k
                                spx_sqrt(QCONST32(1.,28)-MULT16_32_Q15(QCONST16(.8,15),SHL32(MULT16_16(ol_pitch_coef,ol_pitch_coef),16)))));
562
4.52k
         else
563
4.52k
            ol_gain = SHL32(EXTEND32(g),SIG_SHIFT);
564
8.57k
      }
565
8.57k
   }
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.57k
#ifndef DISABLE_VBR
578
8.57k
   if (st->vbr_enabled||st->vad_enabled)
579
6.77k
   {
580
6.77k
      float lsp_dist=0;
581
74.5k
      for (i=0;i<NB_ORDER;i++)
582
67.7k
         lsp_dist += (st->old_lsp[i] - lsp[i])*(st->old_lsp[i] - lsp[i]);
583
6.77k
      lsp_dist /= LSP_SCALING*LSP_SCALING;
584
585
6.77k
      if (st->abr_enabled)
586
1.61k
      {
587
1.61k
         float qual_change=0;
588
1.61k
         if (st->abr_drift2 * st->abr_drift > 0)
589
1.44k
         {
590
            /* Only adapt if long-term and short-term drift are the same sign */
591
1.44k
            qual_change = -.00001*st->abr_drift/(1+st->abr_count);
592
1.44k
            if (qual_change>.05)
593
0
               qual_change=.05;
594
1.44k
            if (qual_change<-.05)
595
305
               qual_change=-.05;
596
1.44k
         }
597
1.61k
         st->vbr_quality += qual_change;
598
1.61k
         if (st->vbr_quality>10)
599
0
            st->vbr_quality=10;
600
1.61k
         if (st->vbr_quality<0)
601
1.44k
            st->vbr_quality=0;
602
1.61k
      }
603
604
6.77k
      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.77k
      if (st->vbr_enabled)
608
5.27k
      {
609
5.27k
         spx_int32_t mode;
610
5.27k
         int choice=0;
611
5.27k
         float min_diff=100;
612
5.27k
         mode = 8;
613
47.4k
         while (mode)
614
42.1k
         {
615
42.1k
            int v1;
616
42.1k
            float thresh;
617
42.1k
            v1=(int)floor(st->vbr_quality);
618
42.1k
            if (v1==10)
619
3.73k
               thresh = vbr_nb_thresh[mode][v1];
620
38.4k
            else
621
38.4k
               thresh = (st->vbr_quality-v1)*vbr_nb_thresh[mode][v1+1] + (1+v1-st->vbr_quality)*vbr_nb_thresh[mode][v1];
622
42.1k
            if (st->relative_quality > thresh &&
623
9.60k
                st->relative_quality-thresh<min_diff)
624
4.47k
            {
625
4.47k
               choice = mode;
626
4.47k
               min_diff = st->relative_quality-thresh;
627
4.47k
            }
628
42.1k
            mode--;
629
42.1k
         }
630
5.27k
         mode=choice;
631
5.27k
         if (mode==0)
632
2.02k
         {
633
2.02k
            if (st->dtx_count==0 || lsp_dist>.05 || !st->dtx_enabled || st->dtx_count>20)
634
1.10k
            {
635
1.10k
               mode=1;
636
1.10k
               st->dtx_count=1;
637
1.10k
            } else {
638
925
               mode=0;
639
925
               st->dtx_count++;
640
925
            }
641
3.24k
         } else {
642
3.24k
            st->dtx_count=0;
643
3.24k
         }
644
645
5.27k
         speex_encoder_ctl(state, SPEEX_SET_MODE, &mode);
646
5.27k
         if (st->vbr_max>0)
647
4.03k
         {
648
4.03k
            spx_int32_t rate;
649
4.03k
            speex_encoder_ctl(state, SPEEX_GET_BITRATE, &rate);
650
4.03k
            if (rate > st->vbr_max)
651
1.13k
            {
652
1.13k
               rate = st->vbr_max;
653
1.13k
               speex_encoder_ctl(state, SPEEX_SET_BITRATE, &rate);
654
1.13k
            }
655
4.03k
         }
656
657
5.27k
         if (st->abr_enabled)
658
1.61k
         {
659
1.61k
            spx_int32_t bitrate;
660
1.61k
            speex_encoder_ctl(state, SPEEX_GET_BITRATE, &bitrate);
661
1.61k
            st->abr_drift+=(bitrate-st->abr_enabled);
662
1.61k
            st->abr_drift2 = .95*st->abr_drift2 + .05*(bitrate-st->abr_enabled);
663
1.61k
            st->abr_count += 1.0;
664
1.61k
         }
665
666
5.27k
      } else {
667
         /*VAD only case*/
668
1.50k
         int mode;
669
1.50k
         if (st->relative_quality<2)
670
754
         {
671
754
            if (st->dtx_count==0 || lsp_dist>.05 || !st->dtx_enabled || st->dtx_count>20)
672
447
            {
673
447
               st->dtx_count=1;
674
447
               mode=1;
675
447
            } else {
676
307
               mode=0;
677
307
               st->dtx_count++;
678
307
            }
679
755
         } else {
680
755
            st->dtx_count = 0;
681
755
            mode=st->submodeSelect;
682
755
         }
683
         /*speex_encoder_ctl(state, SPEEX_SET_MODE, &mode);*/
684
1.50k
         st->submodeID=mode;
685
1.50k
      }
686
6.77k
   } else {
687
1.79k
      st->relative_quality = -1;
688
1.79k
   }
689
8.57k
#endif /* #ifndef DISABLE_VBR */
690
691
8.57k
   if (st->encode_submode)
692
8.57k
   {
693
      /* First, transmit a zero for narrowband */
694
8.57k
      speex_bits_pack(bits, 0, 1);
695
696
      /* Transmit the sub-mode we use for this frame */
697
8.57k
      speex_bits_pack(bits, st->submodeID, NB_SUBMODE_BITS);
698
699
8.57k
   }
700
701
   /* If null mode (no transmission), just set a couple things to zero*/
702
8.57k
   if (st->submodes[st->submodeID] == NULL)
703
1.19k
   {
704
191k
      for (i=0;i<NB_FRAME_SIZE;i++)
705
190k
         st->exc[i]=st->sw[i]=VERY_SMALL;
706
707
13.0k
      for (i=0;i<NB_ORDER;i++)
708
11.9k
         st->mem_sw[i]=0;
709
1.19k
      st->first=1;
710
1.19k
      st->bounded_pitch = 1;
711
712
1.19k
      SPEEX_COPY(st->winBuf, in+2*NB_FRAME_SIZE-NB_WINDOW_SIZE, NB_WINDOW_SIZE-NB_FRAME_SIZE);
713
714
      /* Clear memory (no need to really compute it) */
715
13.0k
      for (i=0;i<NB_ORDER;i++)
716
11.9k
         st->mem_sp[i] = 0;
717
1.19k
      return 0;
718
719
1.19k
   }
720
721
   /* LSP Quantization */
722
7.38k
   if (st->first)
723
1.28k
   {
724
14.1k
      for (i=0;i<NB_ORDER;i++)
725
12.8k
         st->old_lsp[i] = lsp[i];
726
1.28k
   }
727
728
729
   /*Quantize LSPs*/
730
7.38k
#if 1 /*0 for unquantized*/
731
7.38k
   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.38k
   if (SUBMODE(lbr_pitch)!=-1)
739
5.09k
   {
740
5.09k
      speex_bits_pack(bits, ol_pitch-NB_PITCH_START, 7);
741
5.09k
   }
742
743
7.38k
   if (SUBMODE(forced_pitch_gain))
744
4.72k
   {
745
4.72k
      int quant;
746
      /* This just damps the pitch a bit, because it tends to be too aggressive when forced */
747
4.72k
      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.72k
      quant = (int)floor(.5+15*ol_pitch_coef*GAIN_SCALING_1);
752
4.72k
#endif
753
4.72k
      if (quant>15)
754
39
         quant=15;
755
4.72k
      if (quant<0)
756
0
         quant=0;
757
4.72k
      speex_bits_pack(bits, quant, 4);
758
4.72k
      ol_pitch_coef=MULT16_16_P15(QCONST16(0.066667,15),SHL16(quant,GAIN_SHIFT));
759
4.72k
   }
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.38k
   {
772
7.38k
      int qe = (int)(floor(.5+3.5*log(ol_gain*1.0/SIG_SCALING)));
773
7.38k
      if (qe<0)
774
4.66k
         qe=0;
775
7.38k
      if (qe>31)
776
439
         qe=31;
777
7.38k
      ol_gain = exp(qe/3.5)*SIG_SCALING;
778
7.38k
      speex_bits_pack(bits, qe, 5);
779
7.38k
   }
780
7.38k
#endif
781
782
783
784
   /* Special case for first frame */
785
7.38k
   if (st->first)
786
1.28k
   {
787
14.1k
      for (i=0;i<NB_ORDER;i++)
788
12.8k
         st->old_qlsp[i] = qlsp[i];
789
1.28k
   }
790
791
   /* Target signal */
792
7.38k
   ALLOC(target, NB_SUBFRAME_SIZE, spx_word16_t);
793
7.38k
   ALLOC(innov, NB_SUBFRAME_SIZE, spx_sig_t);
794
7.38k
   ALLOC(exc32, NB_SUBFRAME_SIZE, spx_word32_t);
795
7.38k
   ALLOC(syn_resp, NB_SUBFRAME_SIZE, spx_word16_t);
796
7.38k
   ALLOC(mem, NB_ORDER, spx_mem_t);
797
798
   /* Loop on sub-frames */
799
36.9k
   for (sub=0;sub<NB_NB_SUBFRAMES;sub++)
800
29.5k
   {
801
29.5k
      int   offset;
802
29.5k
      spx_word16_t *sw;
803
29.5k
      spx_word16_t *exc, *inBuf;
804
29.5k
      int pitch;
805
29.5k
      int response_bound = NB_SUBFRAME_SIZE;
806
807
      /* Offset relative to start of frame */
808
29.5k
      offset = NB_SUBFRAME_SIZE*sub;
809
      /* Excitation */
810
29.5k
      exc=st->exc+offset;
811
      /* Weighted signal */
812
29.5k
      sw=st->sw+offset;
813
814
      /* LSP interpolation (quantized and unquantized) */
815
29.5k
      lsp_interpolate(st->old_lsp, lsp, interp_lsp, NB_ORDER, sub, NB_NB_SUBFRAMES, LSP_MARGIN);
816
29.5k
      lsp_interpolate(st->old_qlsp, qlsp, interp_qlsp, NB_ORDER, sub, NB_NB_SUBFRAMES, LSP_MARGIN);
817
818
      /* Compute interpolated LPCs (quantized and unquantized) */
819
29.5k
      lsp_to_lpc(interp_lsp, interp_lpc, NB_ORDER,stack);
820
821
29.5k
      lsp_to_lpc(interp_qlsp, interp_qlpc, NB_ORDER, stack);
822
823
      /* Compute analysis filter gain at w=pi (for use in SB-CELP) */
824
29.5k
      {
825
29.5k
         spx_word32_t pi_g=LPC_SCALING;
826
177k
         for (i=0;i<NB_ORDER;i+=2)
827
147k
         {
828
            /*pi_g += -st->interp_qlpc[i] +  st->interp_qlpc[i+1];*/
829
147k
            pi_g = ADD32(pi_g, SUB32(EXTEND32(interp_qlpc[i+1]),EXTEND32(interp_qlpc[i])));
830
147k
         }
831
29.5k
         st->pi_gain[sub] = pi_g;
832
29.5k
      }
833
834
#ifdef VORBIS_PSYCHO
835
      {
836
         float curr_curve[128];
837
         float fact = ((float)sub+1.0f)/NB_NB_SUBFRAMES;
838
         for (i=0;i<128;i++)
839
            curr_curve[i] = (1.0f-fact)*st->old_curve[i] + fact*st->curve[i];
840
         curve_to_lpc(st->psy, curr_curve, bw_lpc1, bw_lpc2, 10);
841
      }
842
#else
843
      /* Compute bandwidth-expanded (unquantized) LPCs for perceptual weighting */
844
29.5k
      bw_lpc(st->gamma1, interp_lpc, bw_lpc1, NB_ORDER);
845
29.5k
      bw_lpc(st->gamma2, interp_lpc, bw_lpc2, NB_ORDER);
846
      /*print_vec(st->bw_lpc1, 10, "bw_lpc");*/
847
29.5k
#endif
848
849
      /*FIXME: This will break if we change the window size */
850
29.5k
      speex_assert(NB_WINDOW_SIZE-NB_FRAME_SIZE == NB_SUBFRAME_SIZE);
851
29.5k
      if (sub==0)
852
7.38k
         inBuf = st->winBuf;
853
22.1k
      else
854
22.1k
         inBuf = &in[((sub-1)*NB_SUBFRAME_SIZE)];
855
1.21M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
856
1.18M
         sw[i] = inBuf[i];
857
858
29.5k
      if (st->complexity==0)
859
6.58k
         response_bound >>= 1;
860
29.5k
      compute_impulse_response(interp_qlpc, bw_lpc1, bw_lpc2, syn_resp, response_bound, NB_ORDER, stack);
861
161k
      for (i=response_bound;i<NB_SUBFRAME_SIZE;i++)
862
131k
         syn_resp[i]=VERY_SMALL;
863
864
      /* Compute zero response of A(z/g1) / ( A(z/g2) * A(z) ) */
865
324k
      for (i=0;i<NB_ORDER;i++)
866
295k
         mem[i]=SHL32(st->mem_sp[i],1);
867
1.21M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
868
1.18M
         exc[i] = VERY_SMALL;
869
#ifdef SHORTCUTS2
870
      iir_mem16(exc, interp_qlpc, exc, response_bound, NB_ORDER, mem, stack);
871
      for (i=0;i<NB_ORDER;i++)
872
         mem[i]=SHL32(st->mem_sw[i],1);
873
      filter10(exc, st->bw_lpc1, st->bw_lpc2, exc, response_bound, mem, stack);
874
      SPEEX_MEMSET(&exc[response_bound], 0, NB_SUBFRAME_SIZE-response_bound);
875
#else
876
29.5k
      iir_mem16(exc, interp_qlpc, exc, NB_SUBFRAME_SIZE, NB_ORDER, mem, stack);
877
324k
      for (i=0;i<NB_ORDER;i++)
878
295k
         mem[i]=SHL32(st->mem_sw[i],1);
879
29.5k
      filter10(exc, bw_lpc1, bw_lpc2, exc, NB_SUBFRAME_SIZE, mem, stack);
880
29.5k
#endif
881
882
      /* Compute weighted signal */
883
324k
      for (i=0;i<NB_ORDER;i++)
884
295k
         mem[i]=st->mem_sw[i];
885
29.5k
      filter10(sw, bw_lpc1, bw_lpc2, sw, NB_SUBFRAME_SIZE, mem, stack);
886
887
29.5k
      if (st->complexity==0)
888
72.4k
         for (i=0;i<NB_ORDER;i++)
889
65.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.5k
      fir_mem16(exc, interp_qlpc, exc, NB_SUBFRAME_SIZE, NB_ORDER, st->mem_exc2, stack);
898
      /* If we have a long-term predictor (otherwise, something's wrong) */
899
29.5k
      speex_assert (SUBMODE(ltp_quant));
900
29.5k
      {
901
29.5k
         int pit_min, pit_max;
902
         /* Long-term prediction */
903
29.5k
         if (SUBMODE(lbr_pitch) != -1)
904
20.3k
         {
905
            /* Low bit-rate pitch handling */
906
20.3k
            int margin;
907
20.3k
            margin = SUBMODE(lbr_pitch);
908
20.3k
            if (margin)
909
0
            {
910
0
               if (ol_pitch < NB_PITCH_START+margin-1)
911
0
                  ol_pitch=NB_PITCH_START+margin-1;
912
0
               if (ol_pitch > NB_PITCH_END-margin)
913
0
                  ol_pitch=NB_PITCH_END-margin;
914
0
               pit_min = ol_pitch-margin+1;
915
0
               pit_max = ol_pitch+margin;
916
20.3k
            } else {
917
20.3k
               pit_min=pit_max=ol_pitch;
918
20.3k
            }
919
20.3k
         } else {
920
9.15k
            pit_min = NB_PITCH_START;
921
9.15k
            pit_max = NB_PITCH_END;
922
9.15k
         }
923
924
         /* Force pitch to use only the current frame if needed */
925
29.5k
         if (st->bounded_pitch && pit_max>offset)
926
9.00k
            pit_max=offset;
927
928
         /* Perform pitch search */
929
29.5k
         pitch = SUBMODE(ltp_quant)(target, sw, interp_qlpc, bw_lpc1, bw_lpc2,
930
29.5k
                                    exc32, SUBMODE(ltp_params), pit_min, pit_max, ol_pitch_coef,
931
29.5k
                                    NB_ORDER, NB_SUBFRAME_SIZE, bits, stack,
932
29.5k
                                    exc, syn_resp, st->complexity, 0, st->plc_tuning, &st->cumul_gain);
933
934
29.5k
         st->pitch[sub]=pitch;
935
29.5k
      }
936
      /* Quantization of innovation */
937
29.5k
      SPEEX_MEMSET(innov, 0, NB_SUBFRAME_SIZE);
938
939
      /* FIXME: Make sure this is safe from overflows (so far so good) */
940
1.21M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
941
1.18M
         exc[i] = EXTRACT16(SUB32(EXTEND32(exc[i]), PSHR32(exc32[i],SIG_SHIFT-1)));
942
943
29.5k
      ener = SHL32(EXTEND32(compute_rms16(exc, NB_SUBFRAME_SIZE)),SIG_SHIFT);
944
945
      /*FIXME: Should use DIV32_16 and make sure result fits in 16 bits */
946
#ifdef FIXED_POINT
947
      {
948
         spx_word32_t f = PDIV32(ener,PSHR32(ol_gain,SIG_SHIFT));
949
         if (f<=32767)
950
            fine_gain = f;
951
         else
952
            fine_gain = 32767;
953
      }
954
#else
955
29.5k
      fine_gain = PDIV32_16(ener,PSHR32(ol_gain,SIG_SHIFT));
956
29.5k
#endif
957
      /* Calculate gain correction for the sub-frame (if any) */
958
29.5k
      if (SUBMODE(have_subframe_gain))
959
9.15k
      {
960
9.15k
         int qe;
961
9.15k
         if (SUBMODE(have_subframe_gain)==3)
962
5.36k
         {
963
5.36k
            qe = scal_quant(fine_gain, exc_gain_quant_scal3_bound, 8);
964
5.36k
            speex_bits_pack(bits, qe, 3);
965
5.36k
            ener=MULT16_32_Q14(exc_gain_quant_scal3[qe],ol_gain);
966
5.36k
         } else {
967
3.78k
            qe = scal_quant(fine_gain, exc_gain_quant_scal1_bound, 2);
968
3.78k
            speex_bits_pack(bits, qe, 1);
969
3.78k
            ener=MULT16_32_Q14(exc_gain_quant_scal1[qe],ol_gain);
970
3.78k
         }
971
20.3k
      } else {
972
20.3k
         ener=ol_gain;
973
20.3k
      }
974
975
      /*printf ("%f %f\n", ener, ol_gain);*/
976
977
      /* Normalize innovation */
978
29.5k
      signal_div(target, target, ener, NB_SUBFRAME_SIZE);
979
980
      /* Quantize innovation */
981
29.5k
      speex_assert (SUBMODE(innovation_quant));
982
29.5k
      {
983
         /* Codebook search */
984
29.5k
         SUBMODE(innovation_quant)(target, interp_qlpc, bw_lpc1, bw_lpc2,
985
29.5k
                  SUBMODE(innovation_params), NB_ORDER, NB_SUBFRAME_SIZE,
986
29.5k
                  innov, syn_resp, bits, stack, st->complexity, SUBMODE(double_codebook));
987
988
         /* De-normalize innovation and update excitation */
989
29.5k
         signal_mul(innov, innov, ener, NB_SUBFRAME_SIZE);
990
991
         /* In some (rare) modes, we do a second search (more bits) to reduce noise even more */
992
29.5k
         if (SUBMODE(double_codebook)) {
993
1.30k
            char *tmp_stack=stack;
994
1.30k
            VARDECL(spx_sig_t *innov2);
995
1.30k
            ALLOC(innov2, NB_SUBFRAME_SIZE, spx_sig_t);
996
1.30k
            SPEEX_MEMSET(innov2, 0, NB_SUBFRAME_SIZE);
997
53.3k
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
998
52.0k
               target[i]=MULT16_16_P13(QCONST16(2.2f,13), target[i]);
999
1.30k
            SUBMODE(innovation_quant)(target, interp_qlpc, bw_lpc1, bw_lpc2,
1000
1.30k
                                      SUBMODE(innovation_params), NB_ORDER, NB_SUBFRAME_SIZE,
1001
1.30k
                                      innov2, syn_resp, bits, stack, st->complexity, 0);
1002
1.30k
            signal_mul(innov2, innov2, MULT16_32_Q15(QCONST16(0.454545f,15),ener), NB_SUBFRAME_SIZE);
1003
53.3k
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
1004
52.0k
               innov[i] = ADD32(innov[i],innov2[i]);
1005
1.30k
            stack = tmp_stack;
1006
1.30k
         }
1007
1.21M
         for (i=0;i<NB_SUBFRAME_SIZE;i++)
1008
1.18M
            exc[i] = EXTRACT16(SATURATE32(PSHR32(ADD32(SHL32(exc32[i],1),innov[i]),SIG_SHIFT),32767));
1009
29.5k
         if (st->innov_rms_save)
1010
10.3k
            st->innov_rms_save[sub] = compute_rms(innov, NB_SUBFRAME_SIZE);
1011
29.5k
      }
1012
1013
      /* Final signal synthesis from excitation */
1014
29.5k
      iir_mem16(exc, interp_qlpc, sw, NB_SUBFRAME_SIZE, NB_ORDER, st->mem_sp, stack);
1015
1016
      /* Compute weighted signal again, from synthesized speech (not sure it's the right thing) */
1017
29.5k
      if (st->complexity!=0)
1018
22.9k
         filter10(sw, bw_lpc1, bw_lpc2, sw, NB_SUBFRAME_SIZE, st->mem_sw, stack);
1019
1020
29.5k
   }
1021
1022
   /* Store the LSPs for interpolation in the next frame */
1023
7.38k
   if (st->submodeID>=1)
1024
7.38k
   {
1025
81.2k
      for (i=0;i<NB_ORDER;i++)
1026
73.8k
         st->old_lsp[i] = lsp[i];
1027
81.2k
      for (i=0;i<NB_ORDER;i++)
1028
73.8k
         st->old_qlsp[i] = qlsp[i];
1029
7.38k
   }
1030
1031
#ifdef VORBIS_PSYCHO
1032
   if (st->submodeID>=1)
1033
      SPEEX_COPY(st->old_curve, st->curve, 128);
1034
#endif
1035
1036
7.38k
   if (st->submodeID==1)
1037
3.86k
   {
1038
3.86k
#ifndef DISABLE_VBR
1039
3.86k
      if (st->dtx_count)
1040
1.59k
         speex_bits_pack(bits, 15, 4);
1041
2.27k
      else
1042
2.27k
#endif
1043
2.27k
         speex_bits_pack(bits, 0, 4);
1044
3.86k
   }
1045
1046
   /* The next frame will not be the first (Duh!) */
1047
7.38k
   st->first = 0;
1048
7.38k
   SPEEX_COPY(st->winBuf, in+2*NB_FRAME_SIZE-NB_WINDOW_SIZE, NB_WINDOW_SIZE-NB_FRAME_SIZE);
1049
1050
7.38k
   if (SUBMODE(innovation_quant) == noise_codebook_quant || st->submodeID==0)
1051
3.86k
      st->bounded_pitch = 1;
1052
3.51k
   else
1053
3.51k
      st->bounded_pitch = 0;
1054
1055
7.38k
   return 1;
1056
8.57k
}
nb_encode
Line
Count
Source
407
19.6k
{
408
19.6k
   EncState *st;
409
19.6k
   int i, sub, roots;
410
19.6k
   int ol_pitch;
411
19.6k
   spx_word16_t ol_pitch_coef;
412
19.6k
   spx_word32_t ol_gain;
413
19.6k
   VARDECL(spx_word16_t *target);
414
19.6k
   VARDECL(spx_sig_t *innov);
415
19.6k
   VARDECL(spx_word32_t *exc32);
416
19.6k
   VARDECL(spx_mem_t *mem);
417
19.6k
   VARDECL(spx_coef_t *bw_lpc1);
418
19.6k
   VARDECL(spx_coef_t *bw_lpc2);
419
19.6k
   VARDECL(spx_coef_t *lpc);
420
19.6k
   VARDECL(spx_lsp_t *lsp);
421
19.6k
   VARDECL(spx_lsp_t *qlsp);
422
19.6k
   VARDECL(spx_lsp_t *interp_lsp);
423
19.6k
   VARDECL(spx_lsp_t *interp_qlsp);
424
19.6k
   VARDECL(spx_coef_t *interp_lpc);
425
19.6k
   VARDECL(spx_coef_t *interp_qlpc);
426
19.6k
   char *stack;
427
19.6k
   VARDECL(spx_word16_t *syn_resp);
428
429
19.6k
   spx_word32_t ener=0;
430
19.6k
   spx_word16_t fine_gain;
431
19.6k
   spx_word16_t *in = (spx_word16_t*)vin;
432
433
19.6k
   st=(EncState *)state;
434
19.6k
   stack=st->stack;
435
436
19.6k
   ALLOC(lpc, NB_ORDER, spx_coef_t);
437
19.6k
   ALLOC(bw_lpc1, NB_ORDER, spx_coef_t);
438
19.6k
   ALLOC(bw_lpc2, NB_ORDER, spx_coef_t);
439
19.6k
   ALLOC(lsp, NB_ORDER, spx_lsp_t);
440
19.6k
   ALLOC(qlsp, NB_ORDER, spx_lsp_t);
441
19.6k
   ALLOC(interp_lsp, NB_ORDER, spx_lsp_t);
442
19.6k
   ALLOC(interp_qlsp, NB_ORDER, spx_lsp_t);
443
19.6k
   ALLOC(interp_lpc, NB_ORDER, spx_coef_t);
444
19.6k
   ALLOC(interp_qlpc, NB_ORDER, spx_coef_t);
445
446
19.6k
   st->exc = st->excBuf + NB_PITCH_END + 2;
447
19.6k
   st->sw = st->swBuf + NB_PITCH_END + 2;
448
   /* Move signals 1 frame towards the past */
449
19.6k
   SPEEX_MOVE(st->excBuf, st->excBuf+NB_FRAME_SIZE, NB_PITCH_END+2);
450
19.6k
   SPEEX_MOVE(st->swBuf, st->swBuf+NB_FRAME_SIZE, NB_PITCH_END+2);
451
452
19.6k
   if (st->highpass_enabled)
453
7.21k
      highpass(in, in, NB_FRAME_SIZE, (st->isWideband?HIGHPASS_WIDEBAND:HIGHPASS_NARROWBAND)|HIGHPASS_INPUT, st->mem_hp);
454
455
19.6k
   {
456
19.6k
      VARDECL(spx_word16_t *w_sig);
457
19.6k
      VARDECL(spx_word16_t *autocorr);
458
19.6k
      ALLOC(w_sig, NB_WINDOW_SIZE, spx_word16_t);
459
19.6k
      ALLOC(autocorr, NB_ORDER+1, spx_word16_t);
460
      /* Window for analysis */
461
805k
      for (i=0;i<NB_WINDOW_SIZE-NB_FRAME_SIZE;i++)
462
785k
         w_sig[i] = MULT16_16_Q15(st->winBuf[i],st->window[i]);
463
3.16M
      for (;i<NB_WINDOW_SIZE;i++)
464
3.14M
         w_sig[i] = MULT16_16_Q15(in[i-NB_WINDOW_SIZE+NB_FRAME_SIZE],st->window[i]);
465
      /* Compute auto-correlation */
466
19.6k
      _spx_autocorr(w_sig, autocorr, NB_ORDER+1, NB_WINDOW_SIZE);
467
19.6k
      autocorr[0] = ADD16(autocorr[0],MULT16_16_Q15(autocorr[0],st->lpc_floor)); /* Noise floor in auto-correlation domain */
468
469
      /* Lag windowing: equivalent to filtering in the power-spectrum domain */
470
235k
      for (i=0;i<NB_ORDER+1;i++)
471
216k
         autocorr[i] = MULT16_16_Q15(autocorr[i],st->lagWindow[i]);
472
19.6k
      autocorr[0] = ADD16(autocorr[0],1);
473
474
      /* Levinson-Durbin */
475
19.6k
      _spx_lpc(lpc, autocorr, NB_ORDER);
476
      /* LPC to LSPs (x-domain) transform */
477
19.6k
      roots=lpc_to_lsp (lpc, NB_ORDER, lsp, 10, LSP_DELTA1, stack);
478
      /* Check if we found all the roots */
479
19.6k
      if (roots!=NB_ORDER)
480
37
      {
481
         /*If we can't find all LSP's, do some damage control and use previous filter*/
482
407
         for (i=0;i<NB_ORDER;i++)
483
370
         {
484
370
            lsp[i]=st->old_lsp[i];
485
370
         }
486
37
      }
487
19.6k
   }
488
489
490
491
492
   /* Whole frame analysis (open-loop estimation of pitch and excitation gain) */
493
19.6k
   {
494
19.6k
      int diff = NB_WINDOW_SIZE-NB_FRAME_SIZE;
495
19.6k
      if (st->first)
496
38.9k
         for (i=0;i<NB_ORDER;i++)
497
35.4k
            interp_lsp[i] = lsp[i];
498
16.1k
      else
499
16.1k
         lsp_interpolate(st->old_lsp, lsp, interp_lsp, NB_ORDER, NB_NB_SUBFRAMES, NB_NB_SUBFRAMES<<1, LSP_MARGIN);
500
501
      /* Compute interpolated LPCs (unquantized) for whole frame*/
502
19.6k
      lsp_to_lpc(interp_lsp, interp_lpc, NB_ORDER,stack);
503
504
505
      /*Open-loop pitch*/
506
19.6k
      if (!st->submodes[st->submodeID] || (st->complexity>2 && SUBMODE(have_subframe_gain)<3) || SUBMODE(forced_pitch_gain) || SUBMODE(lbr_pitch) != -1
507
4.50k
#ifndef DISABLE_VBR
508
4.50k
           || st->vbr_enabled || st->vad_enabled
509
19.6k
#endif
510
19.6k
                  )
511
18.1k
      {
512
18.1k
         int nol_pitch[6];
513
18.1k
         spx_word16_t nol_pitch_coef[6];
514
515
18.1k
         bw_lpc(QCONST16(0.9,15), interp_lpc, bw_lpc1, NB_ORDER);
516
18.1k
         bw_lpc(QCONST16(0.55,15), interp_lpc, bw_lpc2, NB_ORDER);
517
518
18.1k
         SPEEX_COPY(st->sw, st->winBuf, diff);
519
18.1k
         SPEEX_COPY(st->sw+diff, in, NB_FRAME_SIZE-diff);
520
18.1k
         filter10(st->sw, bw_lpc1, bw_lpc2, st->sw, NB_FRAME_SIZE, st->mem_sw_whole, stack);
521
522
18.1k
         open_loop_nbest_pitch(st->sw, NB_PITCH_START, NB_PITCH_END, NB_FRAME_SIZE,
523
18.1k
                               nol_pitch, nol_pitch_coef, 6, stack);
524
18.1k
         ol_pitch=nol_pitch[0];
525
18.1k
         ol_pitch_coef = nol_pitch_coef[0];
526
         /*Try to remove pitch multiples*/
527
109k
         for (i=1;i<6;i++)
528
90.8k
         {
529
90.8k
#ifdef FIXED_POINT
530
90.8k
            if ((nol_pitch_coef[i]>MULT16_16_Q15(nol_pitch_coef[0],27853)) &&
531
#else
532
            if ((nol_pitch_coef[i]>.85*nol_pitch_coef[0]) &&
533
#endif
534
18.8k
                (ABS(2*nol_pitch[i]-ol_pitch)<=2 || ABS(3*nol_pitch[i]-ol_pitch)<=3 ||
535
18.2k
                 ABS(4*nol_pitch[i]-ol_pitch)<=4 || ABS(5*nol_pitch[i]-ol_pitch)<=5))
536
833
            {
537
               /*ol_pitch_coef=nol_pitch_coef[i];*/
538
833
               ol_pitch = nol_pitch[i];
539
833
            }
540
90.8k
         }
541
         /*if (ol_pitch>50)
542
           ol_pitch/=2;*/
543
         /*ol_pitch_coef = sqrt(ol_pitch_coef);*/
544
545
18.1k
      } else {
546
1.47k
         ol_pitch=0;
547
1.47k
         ol_pitch_coef=0;
548
1.47k
      }
549
550
      /*Compute "real" excitation*/
551
      /*SPEEX_COPY(st->exc, st->winBuf, diff);
552
      SPEEX_COPY(st->exc+diff, in, NB_FRAME_SIZE-diff);*/
553
19.6k
      fir_mem16(st->winBuf, interp_lpc, st->exc, diff, NB_ORDER, st->mem_exc, stack);
554
19.6k
      fir_mem16(in, interp_lpc, st->exc+diff, NB_FRAME_SIZE-diff, NB_ORDER, st->mem_exc, stack);
555
556
      /* Compute open-loop excitation gain */
557
19.6k
      {
558
19.6k
         spx_word16_t g = compute_rms16(st->exc, NB_FRAME_SIZE);
559
19.6k
         if (st->submodeID!=1 && ol_pitch>0)
560
8.59k
            ol_gain = MULT16_16(g, MULT16_16_Q14(QCONST16(1.1,14),
561
19.6k
                                spx_sqrt(QCONST32(1.,28)-MULT16_32_Q15(QCONST16(.8,15),SHL32(MULT16_16(ol_pitch_coef,ol_pitch_coef),16)))));
562
11.0k
         else
563
11.0k
            ol_gain = SHL32(EXTEND32(g),SIG_SHIFT);
564
19.6k
      }
565
19.6k
   }
566
567
#ifdef VORBIS_PSYCHO
568
   SPEEX_MOVE(st->psy_window, st->psy_window+NB_FRAME_SIZE, 256-NB_FRAME_SIZE);
569
   SPEEX_COPY(&st->psy_window[256-NB_FRAME_SIZE], in, NB_FRAME_SIZE);
570
   compute_curve(st->psy, st->psy_window, st->curve);
571
   /*print_vec(st->curve, 128, "curve");*/
572
   if (st->first)
573
      SPEEX_COPY(st->old_curve, st->curve, 128);
574
#endif
575
576
   /*VBR stuff*/
577
19.6k
#ifndef DISABLE_VBR
578
19.6k
   if (st->vbr_enabled||st->vad_enabled)
579
15.2k
   {
580
15.2k
      float lsp_dist=0;
581
167k
      for (i=0;i<NB_ORDER;i++)
582
152k
         lsp_dist += (st->old_lsp[i] - lsp[i])*(st->old_lsp[i] - lsp[i]);
583
15.2k
      lsp_dist /= LSP_SCALING*LSP_SCALING;
584
585
15.2k
      if (st->abr_enabled)
586
3.41k
      {
587
3.41k
         float qual_change=0;
588
3.41k
         if (st->abr_drift2 * st->abr_drift > 0)
589
3.06k
         {
590
            /* Only adapt if long-term and short-term drift are the same sign */
591
3.06k
            qual_change = -.00001*st->abr_drift/(1+st->abr_count);
592
3.06k
            if (qual_change>.05)
593
0
               qual_change=.05;
594
3.06k
            if (qual_change<-.05)
595
872
               qual_change=-.05;
596
3.06k
         }
597
3.41k
         st->vbr_quality += qual_change;
598
3.41k
         if (st->vbr_quality>10)
599
0
            st->vbr_quality=10;
600
3.41k
         if (st->vbr_quality<0)
601
3.06k
            st->vbr_quality=0;
602
3.41k
      }
603
604
15.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
15.2k
      if (st->vbr_enabled)
608
11.9k
      {
609
11.9k
         spx_int32_t mode;
610
11.9k
         int choice=0;
611
11.9k
         float min_diff=100;
612
11.9k
         mode = 8;
613
107k
         while (mode)
614
95.6k
         {
615
95.6k
            int v1;
616
95.6k
            float thresh;
617
95.6k
            v1=(int)floor(st->vbr_quality);
618
95.6k
            if (v1==10)
619
4.76k
               thresh = vbr_nb_thresh[mode][v1];
620
90.8k
            else
621
90.8k
               thresh = (st->vbr_quality-v1)*vbr_nb_thresh[mode][v1+1] + (1+v1-st->vbr_quality)*vbr_nb_thresh[mode][v1];
622
95.6k
            if (st->relative_quality > thresh &&
623
29.8k
                st->relative_quality-thresh<min_diff)
624
13.8k
            {
625
13.8k
               choice = mode;
626
13.8k
               min_diff = st->relative_quality-thresh;
627
13.8k
            }
628
95.6k
            mode--;
629
95.6k
         }
630
11.9k
         mode=choice;
631
11.9k
         if (mode==0)
632
2.80k
         {
633
2.80k
            if (st->dtx_count==0 || lsp_dist>.05 || !st->dtx_enabled || st->dtx_count>20)
634
1.85k
            {
635
1.85k
               mode=1;
636
1.85k
               st->dtx_count=1;
637
1.85k
            } else {
638
955
               mode=0;
639
955
               st->dtx_count++;
640
955
            }
641
9.14k
         } else {
642
9.14k
            st->dtx_count=0;
643
9.14k
         }
644
645
11.9k
         speex_encoder_ctl(state, SPEEX_SET_MODE, &mode);
646
11.9k
         if (st->vbr_max>0)
647
8.81k
         {
648
8.81k
            spx_int32_t rate;
649
8.81k
            speex_encoder_ctl(state, SPEEX_GET_BITRATE, &rate);
650
8.81k
            if (rate > st->vbr_max)
651
3.62k
            {
652
3.62k
               rate = st->vbr_max;
653
3.62k
               speex_encoder_ctl(state, SPEEX_SET_BITRATE, &rate);
654
3.62k
            }
655
8.81k
         }
656
657
11.9k
         if (st->abr_enabled)
658
3.41k
         {
659
3.41k
            spx_int32_t bitrate;
660
3.41k
            speex_encoder_ctl(state, SPEEX_GET_BITRATE, &bitrate);
661
3.41k
            st->abr_drift+=(bitrate-st->abr_enabled);
662
3.41k
            st->abr_drift2 = .95*st->abr_drift2 + .05*(bitrate-st->abr_enabled);
663
3.41k
            st->abr_count += 1.0;
664
3.41k
         }
665
666
11.9k
      } else {
667
         /*VAD only case*/
668
3.27k
         int mode;
669
3.27k
         if (st->relative_quality<2)
670
807
         {
671
807
            if (st->dtx_count==0 || lsp_dist>.05 || !st->dtx_enabled || st->dtx_count>20)
672
524
            {
673
524
               st->dtx_count=1;
674
524
               mode=1;
675
524
            } else {
676
283
               mode=0;
677
283
               st->dtx_count++;
678
283
            }
679
2.46k
         } else {
680
2.46k
            st->dtx_count = 0;
681
2.46k
            mode=st->submodeSelect;
682
2.46k
         }
683
         /*speex_encoder_ctl(state, SPEEX_SET_MODE, &mode);*/
684
3.27k
         st->submodeID=mode;
685
3.27k
      }
686
15.2k
   } else {
687
4.42k
      st->relative_quality = -1;
688
4.42k
   }
689
19.6k
#endif /* #ifndef DISABLE_VBR */
690
691
19.6k
   if (st->encode_submode)
692
19.6k
   {
693
      /* First, transmit a zero for narrowband */
694
19.6k
      speex_bits_pack(bits, 0, 1);
695
696
      /* Transmit the sub-mode we use for this frame */
697
19.6k
      speex_bits_pack(bits, st->submodeID, NB_SUBMODE_BITS);
698
699
19.6k
   }
700
701
   /* If null mode (no transmission), just set a couple things to zero*/
702
19.6k
   if (st->submodes[st->submodeID] == NULL)
703
1.15k
   {
704
185k
      for (i=0;i<NB_FRAME_SIZE;i++)
705
184k
         st->exc[i]=st->sw[i]=VERY_SMALL;
706
707
12.7k
      for (i=0;i<NB_ORDER;i++)
708
11.5k
         st->mem_sw[i]=0;
709
1.15k
      st->first=1;
710
1.15k
      st->bounded_pitch = 1;
711
712
1.15k
      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
12.7k
      for (i=0;i<NB_ORDER;i++)
716
11.5k
         st->mem_sp[i] = 0;
717
1.15k
      return 0;
718
719
1.15k
   }
720
721
   /* LSP Quantization */
722
18.4k
   if (st->first)
723
2.72k
   {
724
29.9k
      for (i=0;i<NB_ORDER;i++)
725
27.2k
         st->old_lsp[i] = lsp[i];
726
2.72k
   }
727
728
729
   /*Quantize LSPs*/
730
18.4k
#if 1 /*0 for unquantized*/
731
18.4k
   SUBMODE(lsp_quant)(lsp, qlsp, NB_ORDER, bits);
732
#else
733
   for (i=0;i<NB_ORDER;i++)
734
     qlsp[i]=lsp[i];
735
#endif
736
737
   /*If we use low bit-rate pitch mode, transmit open-loop pitch*/
738
18.4k
   if (SUBMODE(lbr_pitch)!=-1)
739
12.4k
   {
740
12.4k
      speex_bits_pack(bits, ol_pitch-NB_PITCH_START, 7);
741
12.4k
   }
742
743
18.4k
   if (SUBMODE(forced_pitch_gain))
744
11.2k
   {
745
11.2k
      int quant;
746
      /* This just damps the pitch a bit, because it tends to be too aggressive when forced */
747
11.2k
      ol_pitch_coef = MULT16_16_Q15(QCONST16(.9,15), ol_pitch_coef);
748
11.2k
#ifdef FIXED_POINT
749
11.2k
      quant = PSHR16(MULT16_16_16(15, ol_pitch_coef),GAIN_SHIFT);
750
#else
751
      quant = (int)floor(.5+15*ol_pitch_coef*GAIN_SCALING_1);
752
#endif
753
11.2k
      if (quant>15)
754
76
         quant=15;
755
11.2k
      if (quant<0)
756
0
         quant=0;
757
11.2k
      speex_bits_pack(bits, quant, 4);
758
11.2k
      ol_pitch_coef=MULT16_16_P15(QCONST16(0.066667,15),SHL16(quant,GAIN_SHIFT));
759
11.2k
   }
760
761
762
   /*Quantize and transmit open-loop excitation gain*/
763
18.4k
#ifdef FIXED_POINT
764
18.4k
   {
765
18.4k
      int qe = scal_quant32(ol_gain, ol_gain_table, 32);
766
      /*ol_gain = exp(qe/3.5)*SIG_SCALING;*/
767
18.4k
      ol_gain = MULT16_32_Q15(28406,ol_gain_table[qe]);
768
18.4k
      speex_bits_pack(bits, qe, 5);
769
18.4k
   }
770
#else
771
   {
772
      int qe = (int)(floor(.5+3.5*log(ol_gain*1.0/SIG_SCALING)));
773
      if (qe<0)
774
         qe=0;
775
      if (qe>31)
776
         qe=31;
777
      ol_gain = exp(qe/3.5)*SIG_SCALING;
778
      speex_bits_pack(bits, qe, 5);
779
   }
780
#endif
781
782
783
784
   /* Special case for first frame */
785
18.4k
   if (st->first)
786
2.72k
   {
787
29.9k
      for (i=0;i<NB_ORDER;i++)
788
27.2k
         st->old_qlsp[i] = qlsp[i];
789
2.72k
   }
790
791
   /* Target signal */
792
18.4k
   ALLOC(target, NB_SUBFRAME_SIZE, spx_word16_t);
793
18.4k
   ALLOC(innov, NB_SUBFRAME_SIZE, spx_sig_t);
794
18.4k
   ALLOC(exc32, NB_SUBFRAME_SIZE, spx_word32_t);
795
18.4k
   ALLOC(syn_resp, NB_SUBFRAME_SIZE, spx_word16_t);
796
18.4k
   ALLOC(mem, NB_ORDER, spx_mem_t);
797
798
   /* Loop on sub-frames */
799
92.4k
   for (sub=0;sub<NB_NB_SUBFRAMES;sub++)
800
73.9k
   {
801
73.9k
      int   offset;
802
73.9k
      spx_word16_t *sw;
803
73.9k
      spx_word16_t *exc, *inBuf;
804
73.9k
      int pitch;
805
73.9k
      int response_bound = NB_SUBFRAME_SIZE;
806
807
      /* Offset relative to start of frame */
808
73.9k
      offset = NB_SUBFRAME_SIZE*sub;
809
      /* Excitation */
810
73.9k
      exc=st->exc+offset;
811
      /* Weighted signal */
812
73.9k
      sw=st->sw+offset;
813
814
      /* LSP interpolation (quantized and unquantized) */
815
73.9k
      lsp_interpolate(st->old_lsp, lsp, interp_lsp, NB_ORDER, sub, NB_NB_SUBFRAMES, LSP_MARGIN);
816
73.9k
      lsp_interpolate(st->old_qlsp, qlsp, interp_qlsp, NB_ORDER, sub, NB_NB_SUBFRAMES, LSP_MARGIN);
817
818
      /* Compute interpolated LPCs (quantized and unquantized) */
819
73.9k
      lsp_to_lpc(interp_lsp, interp_lpc, NB_ORDER,stack);
820
821
73.9k
      lsp_to_lpc(interp_qlsp, interp_qlpc, NB_ORDER, stack);
822
823
      /* Compute analysis filter gain at w=pi (for use in SB-CELP) */
824
73.9k
      {
825
73.9k
         spx_word32_t pi_g=LPC_SCALING;
826
443k
         for (i=0;i<NB_ORDER;i+=2)
827
369k
         {
828
            /*pi_g += -st->interp_qlpc[i] +  st->interp_qlpc[i+1];*/
829
369k
            pi_g = ADD32(pi_g, SUB32(EXTEND32(interp_qlpc[i+1]),EXTEND32(interp_qlpc[i])));
830
369k
         }
831
73.9k
         st->pi_gain[sub] = pi_g;
832
73.9k
      }
833
834
#ifdef VORBIS_PSYCHO
835
      {
836
         float curr_curve[128];
837
         float fact = ((float)sub+1.0f)/NB_NB_SUBFRAMES;
838
         for (i=0;i<128;i++)
839
            curr_curve[i] = (1.0f-fact)*st->old_curve[i] + fact*st->curve[i];
840
         curve_to_lpc(st->psy, curr_curve, bw_lpc1, bw_lpc2, 10);
841
      }
842
#else
843
      /* Compute bandwidth-expanded (unquantized) LPCs for perceptual weighting */
844
73.9k
      bw_lpc(st->gamma1, interp_lpc, bw_lpc1, NB_ORDER);
845
73.9k
      bw_lpc(st->gamma2, interp_lpc, bw_lpc2, NB_ORDER);
846
      /*print_vec(st->bw_lpc1, 10, "bw_lpc");*/
847
73.9k
#endif
848
849
      /*FIXME: This will break if we change the window size */
850
73.9k
      speex_assert(NB_WINDOW_SIZE-NB_FRAME_SIZE == NB_SUBFRAME_SIZE);
851
73.9k
      if (sub==0)
852
18.4k
         inBuf = st->winBuf;
853
55.4k
      else
854
55.4k
         inBuf = &in[((sub-1)*NB_SUBFRAME_SIZE)];
855
3.03M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
856
2.95M
         sw[i] = inBuf[i];
857
858
73.9k
      if (st->complexity==0)
859
16.3k
         response_bound >>= 1;
860
73.9k
      compute_impulse_response(interp_qlpc, bw_lpc1, bw_lpc2, syn_resp, response_bound, NB_ORDER, stack);
861
401k
      for (i=response_bound;i<NB_SUBFRAME_SIZE;i++)
862
327k
         syn_resp[i]=VERY_SMALL;
863
864
      /* Compute zero response of A(z/g1) / ( A(z/g2) * A(z) ) */
865
813k
      for (i=0;i<NB_ORDER;i++)
866
739k
         mem[i]=SHL32(st->mem_sp[i],1);
867
3.03M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
868
2.95M
         exc[i] = VERY_SMALL;
869
#ifdef SHORTCUTS2
870
      iir_mem16(exc, interp_qlpc, exc, response_bound, NB_ORDER, mem, stack);
871
      for (i=0;i<NB_ORDER;i++)
872
         mem[i]=SHL32(st->mem_sw[i],1);
873
      filter10(exc, st->bw_lpc1, st->bw_lpc2, exc, response_bound, mem, stack);
874
      SPEEX_MEMSET(&exc[response_bound], 0, NB_SUBFRAME_SIZE-response_bound);
875
#else
876
73.9k
      iir_mem16(exc, interp_qlpc, exc, NB_SUBFRAME_SIZE, NB_ORDER, mem, stack);
877
813k
      for (i=0;i<NB_ORDER;i++)
878
739k
         mem[i]=SHL32(st->mem_sw[i],1);
879
73.9k
      filter10(exc, bw_lpc1, bw_lpc2, exc, NB_SUBFRAME_SIZE, mem, stack);
880
73.9k
#endif
881
882
      /* Compute weighted signal */
883
813k
      for (i=0;i<NB_ORDER;i++)
884
739k
         mem[i]=st->mem_sw[i];
885
73.9k
      filter10(sw, bw_lpc1, bw_lpc2, sw, NB_SUBFRAME_SIZE, mem, stack);
886
887
73.9k
      if (st->complexity==0)
888
179k
         for (i=0;i<NB_ORDER;i++)
889
163k
            st->mem_sw[i]=mem[i];
890
891
      /* Compute target signal (saturation prevents overflows on clipped input speech) */
892
3.03M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
893
2.95M
         target[i]=EXTRACT16(SATURATE(SUB32(sw[i],PSHR32(exc[i],1)),32767));
894
895
3.03M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
896
2.95M
         exc[i] = inBuf[i];
897
73.9k
      fir_mem16(exc, interp_qlpc, exc, NB_SUBFRAME_SIZE, NB_ORDER, st->mem_exc2, stack);
898
      /* If we have a long-term predictor (otherwise, something's wrong) */
899
73.9k
      speex_assert (SUBMODE(ltp_quant));
900
73.9k
      {
901
73.9k
         int pit_min, pit_max;
902
         /* Long-term prediction */
903
73.9k
         if (SUBMODE(lbr_pitch) != -1)
904
49.9k
         {
905
            /* Low bit-rate pitch handling */
906
49.9k
            int margin;
907
49.9k
            margin = SUBMODE(lbr_pitch);
908
49.9k
            if (margin)
909
0
            {
910
0
               if (ol_pitch < NB_PITCH_START+margin-1)
911
0
                  ol_pitch=NB_PITCH_START+margin-1;
912
0
               if (ol_pitch > NB_PITCH_END-margin)
913
0
                  ol_pitch=NB_PITCH_END-margin;
914
0
               pit_min = ol_pitch-margin+1;
915
0
               pit_max = ol_pitch+margin;
916
49.9k
            } else {
917
49.9k
               pit_min=pit_max=ol_pitch;
918
49.9k
            }
919
49.9k
         } else {
920
24.0k
            pit_min = NB_PITCH_START;
921
24.0k
            pit_max = NB_PITCH_END;
922
24.0k
         }
923
924
         /* Force pitch to use only the current frame if needed */
925
73.9k
         if (st->bounded_pitch && pit_max>offset)
926
23.1k
            pit_max=offset;
927
928
         /* Perform pitch search */
929
73.9k
         pitch = SUBMODE(ltp_quant)(target, sw, interp_qlpc, bw_lpc1, bw_lpc2,
930
73.9k
                                    exc32, SUBMODE(ltp_params), pit_min, pit_max, ol_pitch_coef,
931
73.9k
                                    NB_ORDER, NB_SUBFRAME_SIZE, bits, stack,
932
73.9k
                                    exc, syn_resp, st->complexity, 0, st->plc_tuning, &st->cumul_gain);
933
934
73.9k
         st->pitch[sub]=pitch;
935
73.9k
      }
936
      /* Quantization of innovation */
937
73.9k
      SPEEX_MEMSET(innov, 0, NB_SUBFRAME_SIZE);
938
939
      /* FIXME: Make sure this is safe from overflows (so far so good) */
940
3.03M
      for (i=0;i<NB_SUBFRAME_SIZE;i++)
941
2.95M
         exc[i] = EXTRACT16(SUB32(EXTEND32(exc[i]), PSHR32(exc32[i],SIG_SHIFT-1)));
942
943
73.9k
      ener = SHL32(EXTEND32(compute_rms16(exc, NB_SUBFRAME_SIZE)),SIG_SHIFT);
944
945
      /*FIXME: Should use DIV32_16 and make sure result fits in 16 bits */
946
73.9k
#ifdef FIXED_POINT
947
73.9k
      {
948
73.9k
         spx_word32_t f = PDIV32(ener,PSHR32(ol_gain,SIG_SHIFT));
949
73.9k
         if (f<=32767)
950
68.6k
            fine_gain = f;
951
5.27k
         else
952
5.27k
            fine_gain = 32767;
953
73.9k
      }
954
#else
955
      fine_gain = PDIV32_16(ener,PSHR32(ol_gain,SIG_SHIFT));
956
#endif
957
      /* Calculate gain correction for the sub-frame (if any) */
958
73.9k
      if (SUBMODE(have_subframe_gain))
959
24.0k
      {
960
24.0k
         int qe;
961
24.0k
         if (SUBMODE(have_subframe_gain)==3)
962
14.0k
         {
963
14.0k
            qe = scal_quant(fine_gain, exc_gain_quant_scal3_bound, 8);
964
14.0k
            speex_bits_pack(bits, qe, 3);
965
14.0k
            ener=MULT16_32_Q14(exc_gain_quant_scal3[qe],ol_gain);
966
14.0k
         } else {
967
9.98k
            qe = scal_quant(fine_gain, exc_gain_quant_scal1_bound, 2);
968
9.98k
            speex_bits_pack(bits, qe, 1);
969
9.98k
            ener=MULT16_32_Q14(exc_gain_quant_scal1[qe],ol_gain);
970
9.98k
         }
971
49.9k
      } else {
972
49.9k
         ener=ol_gain;
973
49.9k
      }
974
975
      /*printf ("%f %f\n", ener, ol_gain);*/
976
977
      /* Normalize innovation */
978
73.9k
      signal_div(target, target, ener, NB_SUBFRAME_SIZE);
979
980
      /* Quantize innovation */
981
73.9k
      speex_assert (SUBMODE(innovation_quant));
982
73.9k
      {
983
         /* Codebook search */
984
73.9k
         SUBMODE(innovation_quant)(target, interp_qlpc, bw_lpc1, bw_lpc2,
985
73.9k
                  SUBMODE(innovation_params), NB_ORDER, NB_SUBFRAME_SIZE,
986
73.9k
                  innov, syn_resp, bits, stack, st->complexity, SUBMODE(double_codebook));
987
988
         /* De-normalize innovation and update excitation */
989
73.9k
         signal_mul(innov, innov, ener, NB_SUBFRAME_SIZE);
990
991
         /* In some (rare) modes, we do a second search (more bits) to reduce noise even more */
992
73.9k
         if (SUBMODE(double_codebook)) {
993
2.43k
            char *tmp_stack=stack;
994
2.43k
            VARDECL(spx_sig_t *innov2);
995
2.43k
            ALLOC(innov2, NB_SUBFRAME_SIZE, spx_sig_t);
996
2.43k
            SPEEX_MEMSET(innov2, 0, NB_SUBFRAME_SIZE);
997
99.8k
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
998
97.4k
               target[i]=MULT16_16_P13(QCONST16(2.2f,13), target[i]);
999
2.43k
            SUBMODE(innovation_quant)(target, interp_qlpc, bw_lpc1, bw_lpc2,
1000
2.43k
                                      SUBMODE(innovation_params), NB_ORDER, NB_SUBFRAME_SIZE,
1001
2.43k
                                      innov2, syn_resp, bits, stack, st->complexity, 0);
1002
2.43k
            signal_mul(innov2, innov2, MULT16_32_Q15(QCONST16(0.454545f,15),ener), NB_SUBFRAME_SIZE);
1003
99.8k
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
1004
97.4k
               innov[i] = ADD32(innov[i],innov2[i]);
1005
2.43k
            stack = tmp_stack;
1006
2.43k
         }
1007
3.03M
         for (i=0;i<NB_SUBFRAME_SIZE;i++)
1008
2.95M
            exc[i] = EXTRACT16(SATURATE32(PSHR32(ADD32(SHL32(exc32[i],1),innov[i]),SIG_SHIFT),32767));
1009
73.9k
         if (st->innov_rms_save)
1010
20.0k
            st->innov_rms_save[sub] = compute_rms(innov, NB_SUBFRAME_SIZE);
1011
73.9k
      }
1012
1013
      /* Final signal synthesis from excitation */
1014
73.9k
      iir_mem16(exc, interp_qlpc, sw, NB_SUBFRAME_SIZE, NB_ORDER, st->mem_sp, stack);
1015
1016
      /* Compute weighted signal again, from synthesized speech (not sure it's the right thing) */
1017
73.9k
      if (st->complexity!=0)
1018
57.6k
         filter10(sw, bw_lpc1, bw_lpc2, sw, NB_SUBFRAME_SIZE, st->mem_sw, stack);
1019
1020
73.9k
   }
1021
1022
   /* Store the LSPs for interpolation in the next frame */
1023
18.4k
   if (st->submodeID>=1)
1024
18.4k
   {
1025
203k
      for (i=0;i<NB_ORDER;i++)
1026
184k
         st->old_lsp[i] = lsp[i];
1027
203k
      for (i=0;i<NB_ORDER;i++)
1028
184k
         st->old_qlsp[i] = qlsp[i];
1029
18.4k
   }
1030
1031
#ifdef VORBIS_PSYCHO
1032
   if (st->submodeID>=1)
1033
      SPEEX_COPY(st->old_curve, st->curve, 128);
1034
#endif
1035
1036
18.4k
   if (st->submodeID==1)
1037
9.44k
   {
1038
9.44k
#ifndef DISABLE_VBR
1039
9.44k
      if (st->dtx_count)
1040
2.46k
         speex_bits_pack(bits, 15, 4);
1041
6.98k
      else
1042
6.98k
#endif
1043
6.98k
         speex_bits_pack(bits, 0, 4);
1044
9.44k
   }
1045
1046
   /* The next frame will not be the first (Duh!) */
1047
18.4k
   st->first = 0;
1048
18.4k
   SPEEX_COPY(st->winBuf, in+2*NB_FRAME_SIZE-NB_WINDOW_SIZE, NB_WINDOW_SIZE-NB_FRAME_SIZE);
1049
1050
18.4k
   if (SUBMODE(innovation_quant) == noise_codebook_quant || st->submodeID==0)
1051
9.44k
      st->bounded_pitch = 1;
1052
9.04k
   else
1053
9.04k
      st->bounded_pitch = 0;
1054
1055
18.4k
   return 1;
1056
19.6k
}
1057
#endif /* DISABLE_ENCODER */
1058
1059
1060
#ifndef DISABLE_DECODER
1061
void *nb_decoder_init(const SpeexMode *m)
1062
4.00k
{
1063
4.00k
   DecState *st;
1064
4.00k
   const SpeexNBMode *mode;
1065
4.00k
   int i;
1066
1067
4.00k
   mode=(const SpeexNBMode*)m->mode;
1068
4.00k
   st = (DecState *)speex_alloc(sizeof(DecState));
1069
4.00k
   if (!st)
1070
0
      return NULL;
1071
4.00k
#if defined(VAR_ARRAYS) || defined (USE_ALLOCA)
1072
4.00k
   st->stack = NULL;
1073
#else
1074
   st->stack = (char*)speex_alloc_scratch(NB_DEC_STACK);
1075
#endif
1076
1077
4.00k
   st->mode=m;
1078
1079
1080
4.00k
   st->encode_submode = 1;
1081
1082
4.00k
   st->first=1;
1083
   /* Codec parameters, should eventually have several "modes"*/
1084
1085
4.00k
   st->submodes=mode->submodes;
1086
4.00k
   st->submodeID=mode->defaultSubmode;
1087
1088
4.00k
   st->lpc_enh_enabled=1;
1089
1090
4.00k
   SPEEX_MEMSET(st->excBuf, 0, NB_FRAME_SIZE + NB_PITCH_END);
1091
1092
4.00k
   st->last_pitch = 40;
1093
4.00k
   st->count_lost=0;
1094
4.00k
   st->pitch_gain_buf[0] = st->pitch_gain_buf[1] = st->pitch_gain_buf[2] = 0;
1095
4.00k
   st->pitch_gain_buf_idx = 0;
1096
4.00k
   st->seed = 1000;
1097
1098
4.00k
   st->sampling_rate=8000;
1099
4.00k
   st->last_ol_gain = 0;
1100
1101
4.00k
   st->user_callback.func = &speex_default_user_handler;
1102
4.00k
   st->user_callback.data = NULL;
1103
68.0k
   for (i=0;i<16;i++)
1104
64.0k
      st->speex_callbacks[i].func = NULL;
1105
1106
4.00k
   st->voc_m1=st->voc_m2=st->voc_mean=0;
1107
4.00k
   st->voc_offset=0;
1108
4.00k
   st->dtx_enabled=0;
1109
4.00k
   st->isWideband = 0;
1110
4.00k
   st->highpass_enabled = 1;
1111
1112
#ifdef ENABLE_VALGRIND
1113
   VALGRIND_MAKE_MEM_DEFINED(st, NB_DEC_STACK);
1114
#endif
1115
4.00k
   return st;
1116
4.00k
}
1117
1118
void nb_decoder_destroy(void *state)
1119
4.00k
{
1120
#if !(defined(VAR_ARRAYS) || defined (USE_ALLOCA))
1121
   DecState *st;
1122
   st=(DecState*)state;
1123
1124
   speex_free_scratch(st->stack);
1125
#endif
1126
1127
4.00k
   speex_free(state);
1128
4.00k
}
1129
1130
int nb_decoder_ctl(void *state, int request, void *ptr)
1131
169k
{
1132
169k
   DecState *st;
1133
169k
   st=(DecState*)state;
1134
169k
   switch(request)
1135
169k
   {
1136
0
   case SPEEX_SET_LOW_MODE:
1137
0
   case SPEEX_SET_MODE:
1138
0
      st->submodeID = (*(spx_int32_t*)ptr);
1139
0
      break;
1140
0
   case SPEEX_GET_LOW_MODE:
1141
0
   case SPEEX_GET_MODE:
1142
0
      (*(spx_int32_t*)ptr) = st->submodeID;
1143
0
      break;
1144
4.00k
   case SPEEX_SET_ENH:
1145
4.00k
      st->lpc_enh_enabled = *((spx_int32_t*)ptr);
1146
4.00k
      break;
1147
0
   case SPEEX_GET_ENH:
1148
0
      *((spx_int32_t*)ptr) = st->lpc_enh_enabled;
1149
0
      break;
1150
11.3k
   case SPEEX_GET_FRAME_SIZE:
1151
11.3k
      (*(spx_int32_t*)ptr) = NB_FRAME_SIZE;
1152
11.3k
      break;
1153
0
   case SPEEX_GET_BITRATE:
1154
0
      if (st->submodes[st->submodeID])
1155
0
         (*(spx_int32_t*)ptr) = st->sampling_rate*SUBMODE(bits_per_frame)/NB_FRAME_SIZE;
1156
0
      else
1157
0
         (*(spx_int32_t*)ptr) = st->sampling_rate*(NB_SUBMODE_BITS+1)/NB_FRAME_SIZE;
1158
0
      break;
1159
4.00k
   case SPEEX_SET_SAMPLING_RATE:
1160
4.00k
      st->sampling_rate = (*(spx_int32_t*)ptr);
1161
4.00k
      break;
1162
2.94k
   case SPEEX_GET_SAMPLING_RATE:
1163
2.94k
      (*(spx_int32_t*)ptr)=st->sampling_rate;
1164
2.94k
      break;
1165
2.01k
   case SPEEX_SET_HANDLER:
1166
2.01k
      {
1167
2.01k
         SpeexCallback *c = (SpeexCallback*)ptr;
1168
2.01k
         st->speex_callbacks[c->callback_id].func=c->func;
1169
2.01k
         st->speex_callbacks[c->callback_id].data=c->data;
1170
2.01k
         st->speex_callbacks[c->callback_id].callback_id=c->callback_id;
1171
2.01k
      }
1172
2.01k
      break;
1173
0
   case SPEEX_SET_USER_HANDLER:
1174
0
      {
1175
0
         SpeexCallback *c = (SpeexCallback*)ptr;
1176
0
         st->user_callback.func=c->func;
1177
0
         st->user_callback.data=c->data;
1178
0
         st->user_callback.callback_id=c->callback_id;
1179
0
      }
1180
0
      break;
1181
0
   case SPEEX_RESET_STATE:
1182
0
      {
1183
0
         int i;
1184
0
         for (i=0;i<NB_ORDER;i++)
1185
0
            st->mem_sp[i]=0;
1186
0
         for (i=0;i<NB_FRAME_SIZE + NB_PITCH_END + 1;i++)
1187
0
            st->excBuf[i]=0;
1188
0
      }
1189
0
      break;
1190
0
   case SPEEX_SET_SUBMODE_ENCODING:
1191
0
      st->encode_submode = (*(spx_int32_t*)ptr);
1192
0
      break;
1193
0
   case SPEEX_GET_SUBMODE_ENCODING:
1194
0
      (*(spx_int32_t*)ptr) = st->encode_submode;
1195
0
      break;
1196
3.85k
   case SPEEX_GET_LOOKAHEAD:
1197
3.85k
      (*(spx_int32_t*)ptr)=NB_SUBFRAME_SIZE;
1198
3.85k
      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.42k
   case SPEEX_GET_PI_GAIN:
1222
4.42k
      {
1223
4.42k
         int i;
1224
4.42k
         spx_word32_t *g = (spx_word32_t*)ptr;
1225
22.1k
         for (i=0;i<NB_NB_SUBFRAMES;i++)
1226
17.7k
            g[i]=st->pi_gain[i];
1227
4.42k
      }
1228
4.42k
      break;
1229
4.42k
   case SPEEX_GET_EXC:
1230
4.42k
      {
1231
4.42k
         int i;
1232
22.1k
         for (i=0;i<NB_NB_SUBFRAMES;i++)
1233
17.7k
            ((spx_word16_t*)ptr)[i] = compute_rms16(st->exc+i*NB_SUBFRAME_SIZE, NB_SUBFRAME_SIZE);
1234
4.42k
      }
1235
4.42k
      break;
1236
80.3k
   case SPEEX_GET_DTX_STATUS:
1237
80.3k
      *((spx_int32_t*)ptr) = st->dtx_enabled;
1238
80.3k
      break;
1239
47.3k
   case SPEEX_SET_INNOVATION_SAVE:
1240
47.3k
      st->innov_save = (spx_word16_t*)ptr;
1241
47.3k
      break;
1242
4.85k
   case SPEEX_SET_WIDEBAND:
1243
4.85k
      st->isWideband = *((spx_int32_t*)ptr);
1244
4.85k
      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
169k
   }
1252
169k
   return 0;
1253
169k
}
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
64.5k
{
1332
64.5k
   DecState *st;
1333
64.5k
   int i, sub;
1334
64.5k
   int pitch;
1335
64.5k
   spx_word16_t pitch_gain[3];
1336
64.5k
   spx_word32_t ol_gain=0;
1337
64.5k
   int ol_pitch=0;
1338
64.5k
   spx_word16_t ol_pitch_coef=0;
1339
64.5k
   int best_pitch=40;
1340
64.5k
   spx_word16_t best_pitch_gain=0;
1341
64.5k
   int wideband;
1342
64.5k
   int m;
1343
64.5k
   char *stack;
1344
64.5k
   VARDECL(spx_sig_t *innov);
1345
64.5k
   VARDECL(spx_word32_t *exc32);
1346
64.5k
   VARDECL(spx_coef_t *ak);
1347
64.5k
   VARDECL(spx_lsp_t *qlsp);
1348
64.5k
   spx_word16_t pitch_average=0;
1349
1350
64.5k
   spx_word16_t *out = (spx_word16_t*)vout;
1351
64.5k
   VARDECL(spx_lsp_t *interp_qlsp);
1352
1353
64.5k
   st=(DecState*)state;
1354
64.5k
   stack=st->stack;
1355
1356
64.5k
   st->exc = st->excBuf + 2*NB_PITCH_END + NB_SUBFRAME_SIZE + 6;
1357
1358
   /* Check if we're in DTX mode*/
1359
64.5k
   if (!bits && st->dtx_enabled)
1360
0
   {
1361
0
      st->submodeID=0;
1362
0
   } else
1363
64.5k
   {
1364
      /* If bits is NULL, consider the packet to be lost (what could we do anyway) */
1365
64.5k
      if (!bits)
1366
0
      {
1367
0
         nb_decode_lost(st, out, stack);
1368
0
         return 0;
1369
0
      }
1370
1371
64.5k
      if (st->encode_submode)
1372
64.5k
      {
1373
1374
      /* Search for next narrowband block (handle requests, skip wideband blocks) */
1375
69.2k
      do {
1376
69.2k
         if (speex_bits_remaining(bits)<5)
1377
11.3k
            return -1;
1378
57.8k
         wideband = speex_bits_unpack_unsigned(bits, 1);
1379
57.8k
         if (wideband) /* Skip wideband block (for compatibility) */
1380
3.72k
         {
1381
3.72k
            int submode;
1382
3.72k
            int advance;
1383
3.72k
            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.72k
            advance = wb_skip_table[submode];
1386
3.72k
            if (advance < 0)
1387
0
            {
1388
0
               speex_notify("Invalid mode encountered. The stream is corrupted.");
1389
0
               return -2;
1390
0
            }
1391
3.72k
            advance -= (SB_SUBMODE_BITS+1);
1392
3.72k
            speex_bits_advance(bits, advance);
1393
1394
3.72k
            if (speex_bits_remaining(bits)<5)
1395
1.16k
               return -1;
1396
2.56k
            wideband = speex_bits_unpack_unsigned(bits, 1);
1397
2.56k
            if (wideband)
1398
1.99k
            {
1399
1.99k
               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.99k
               advance = wb_skip_table[submode];
1402
1.99k
               if (advance < 0)
1403
0
               {
1404
0
                  speex_notify("Invalid mode encountered. The stream is corrupted.");
1405
0
                  return -2;
1406
0
               }
1407
1.99k
               advance -= (SB_SUBMODE_BITS+1);
1408
1.99k
               speex_bits_advance(bits, advance);
1409
1.99k
               wideband = speex_bits_unpack_unsigned(bits, 1);
1410
1.99k
               if (wideband)
1411
1.58k
               {
1412
1.58k
                  speex_notify("More than two wideband layers found. The stream is corrupted.");
1413
1.58k
                  return -2;
1414
1.58k
               }
1415
1416
1.99k
            }
1417
2.56k
         }
1418
55.1k
         if (speex_bits_remaining(bits)<4)
1419
405
            return -1;
1420
         /* FIXME: Check for overflow */
1421
54.7k
         m = speex_bits_unpack_unsigned(bits, 4);
1422
54.7k
         if (m==15) /* We found a terminator */
1423
787
         {
1424
787
            return -1;
1425
53.9k
         } else if (m==14) /* Speex in-band request */
1426
4.04k
         {
1427
4.04k
            int ret = speex_inband_handler(bits, st->speex_callbacks, state);
1428
4.04k
            if (ret)
1429
0
               return ret;
1430
49.8k
         } else if (m==13) /* User in-band request */
1431
586
         {
1432
586
            int ret = st->user_callback.func(bits, state, st->user_callback.data);
1433
586
            if (ret)
1434
0
               return ret;
1435
49.3k
         } else if (m>8) /* Invalid mode */
1436
3.19k
         {
1437
3.19k
            speex_notify("Invalid mode encountered. The stream is corrupted.");
1438
3.19k
            return -2;
1439
3.19k
         }
1440
1441
54.7k
      } while (m>8);
1442
1443
      /* Get the sub-mode that was used */
1444
46.1k
      st->submodeID = m;
1445
46.1k
      }
1446
1447
64.5k
   }
1448
1449
   /* Shift all buffers by one frame */
1450
46.1k
   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
46.1k
   if (st->submodes[st->submodeID] == NULL)
1454
21.5k
   {
1455
21.5k
      VARDECL(spx_coef_t *lpc);
1456
21.5k
      ALLOC(lpc, NB_ORDER, spx_coef_t);
1457
21.5k
      bw_lpc(QCONST16(0.93f,15), st->interp_qlpc, lpc, NB_ORDER);
1458
21.5k
      {
1459
21.5k
         spx_word16_t innov_gain=0;
1460
         /* FIXME: This was innov, not exc */
1461
21.5k
         innov_gain = compute_rms16(st->exc, NB_FRAME_SIZE);
1462
3.47M
         for (i=0;i<NB_FRAME_SIZE;i++)
1463
3.45M
            st->exc[i]=speex_rand(innov_gain, &st->seed);
1464
21.5k
      }
1465
1466
1467
21.5k
      st->first=1;
1468
1469
      /* Final signal synthesis from excitation */
1470
21.5k
      iir_mem16(st->exc, lpc, out, NB_FRAME_SIZE, NB_ORDER, st->mem_sp, stack);
1471
1472
      /* Normally this is written to later but since this is returning early,
1473
         avoid reading uninitialized memory in caller */
1474
21.5k
      if (st->innov_save)
1475
17.6k
         SPEEX_MEMSET(st->innov_save, 0, NB_NB_SUBFRAMES*NB_SUBFRAME_SIZE);
1476
1477
21.5k
      st->count_lost=0;
1478
21.5k
      return 0;
1479
21.5k
   }
1480
1481
24.5k
   ALLOC(qlsp, NB_ORDER, spx_lsp_t);
1482
1483
   /* Unquantize LSPs */
1484
24.5k
   SUBMODE(lsp_unquant)(qlsp, NB_ORDER, bits);
1485
1486
   /*Damp memory if a frame was lost and the LSP changed too much*/
1487
24.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
#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.5k
   if (st->first || st->count_lost)
1505
4.61k
   {
1506
50.7k
      for (i=0;i<NB_ORDER;i++)
1507
46.1k
         st->old_qlsp[i] = qlsp[i];
1508
4.61k
   }
1509
1510
   /* Get open-loop pitch estimation for low bit-rate pitch coding */
1511
24.5k
   if (SUBMODE(lbr_pitch)!=-1)
1512
10.9k
   {
1513
10.9k
      ol_pitch = NB_PITCH_START+speex_bits_unpack_unsigned(bits, 7);
1514
10.9k
   }
1515
1516
24.5k
   if (SUBMODE(forced_pitch_gain))
1517
8.92k
   {
1518
8.92k
      int quant;
1519
8.92k
      quant = speex_bits_unpack_unsigned(bits, 4);
1520
8.92k
      ol_pitch_coef=MULT16_16_P15(QCONST16(0.066667,15),SHL16(quant,GAIN_SHIFT));
1521
8.92k
   }
1522
1523
   /* Get global excitation gain */
1524
24.5k
   {
1525
24.5k
      int qe;
1526
24.5k
      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.1k
      ol_gain = MULT16_32_Q15(28406,ol_gain_table[qe]);
1530
#else
1531
11.3k
      ol_gain = SIG_SCALING*exp(qe/3.5);
1532
#endif
1533
24.5k
   }
1534
1535
24.5k
   ALLOC(ak, NB_ORDER, spx_coef_t);
1536
24.5k
   ALLOC(innov, NB_SUBFRAME_SIZE, spx_sig_t);
1537
24.5k
   ALLOC(exc32, NB_SUBFRAME_SIZE, spx_word32_t);
1538
1539
24.5k
   if (st->submodeID==1)
1540
4.95k
   {
1541
4.95k
      int extra;
1542
4.95k
      extra = speex_bits_unpack_unsigned(bits, 4);
1543
1544
4.95k
      if (extra==15)
1545
719
         st->dtx_enabled=1;
1546
4.23k
      else
1547
4.23k
         st->dtx_enabled=0;
1548
4.95k
   }
1549
24.5k
   if (st->submodeID>1)
1550
19.5k
      st->dtx_enabled=0;
1551
1552
   /*Loop on subframes */
1553
122k
   for (sub=0;sub<NB_NB_SUBFRAMES;sub++)
1554
98.1k
   {
1555
98.1k
      int offset;
1556
98.1k
      spx_word16_t *exc;
1557
98.1k
      spx_word16_t *innov_save = NULL;
1558
98.1k
      spx_word16_t tmp;
1559
1560
      /* Offset relative to start of frame */
1561
98.1k
      offset = NB_SUBFRAME_SIZE*sub;
1562
      /* Excitation */
1563
98.1k
      exc=st->exc+offset;
1564
      /* Original signal */
1565
98.1k
      if (st->innov_save)
1566
65.5k
         innov_save = st->innov_save+offset;
1567
1568
1569
      /* Reset excitation */
1570
98.1k
      SPEEX_MEMSET(exc, 0, NB_SUBFRAME_SIZE);
1571
1572
      /*Adaptive codebook contribution*/
1573
98.1k
      speex_assert (SUBMODE(ltp_unquant));
1574
98.1k
      {
1575
98.1k
         int pit_min, pit_max;
1576
         /* Handle pitch constraints if any */
1577
98.1k
         if (SUBMODE(lbr_pitch) != -1)
1578
43.6k
         {
1579
43.6k
            int margin;
1580
43.6k
            margin = SUBMODE(lbr_pitch);
1581
43.6k
            if (margin)
1582
0
            {
1583
/* GT - need optimization?
1584
               if (ol_pitch < NB_PITCH_START+margin-1)
1585
                  ol_pitch=NB_PITCH_START+margin-1;
1586
               if (ol_pitch > NB_PITCH_END-margin)
1587
                  ol_pitch=NB_PITCH_END-margin;
1588
               pit_min = ol_pitch-margin+1;
1589
               pit_max = ol_pitch+margin;
1590
*/
1591
0
               pit_min = ol_pitch-margin+1;
1592
0
               if (pit_min < NB_PITCH_START)
1593
0
      pit_min = NB_PITCH_START;
1594
0
               pit_max = ol_pitch+margin;
1595
0
               if (pit_max > NB_PITCH_END)
1596
0
      pit_max = NB_PITCH_END;
1597
43.6k
            } else {
1598
43.6k
               pit_min = pit_max = ol_pitch;
1599
43.6k
            }
1600
54.4k
         } else {
1601
54.4k
            pit_min = NB_PITCH_START;
1602
54.4k
            pit_max = NB_PITCH_END;
1603
54.4k
         }
1604
1605
1606
1607
98.1k
         SUBMODE(ltp_unquant)(exc, exc32, pit_min, pit_max, ol_pitch_coef, SUBMODE(ltp_params),
1608
98.1k
                 NB_SUBFRAME_SIZE, &pitch, &pitch_gain[0], bits, stack,
1609
98.1k
                 st->count_lost, offset, st->last_pitch_gain, 0);
1610
1611
         /* Ensuring that things aren't blowing up as would happen if e.g. an encoder is
1612
         crafting packets to make us produce NaNs and slow down the decoder (vague DoS threat).
1613
         We can probably be even more aggressive and limit to 15000 or so. */
1614
98.1k
         sanitize_values32(exc32, NEG32(QCONST32(32000,SIG_SHIFT-1)), QCONST32(32000,SIG_SHIFT-1), NB_SUBFRAME_SIZE);
1615
1616
98.1k
         tmp = gain_3tap_to_1tap(pitch_gain);
1617
1618
98.1k
         pitch_average += tmp;
1619
98.1k
         if ((tmp>best_pitch_gain&&ABS(2*best_pitch-pitch)>=3&&ABS(3*best_pitch-pitch)>=4&&ABS(4*best_pitch-pitch)>=5)
1620
88.6k
              || (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.4k
              || (MULT16_16_Q15(QCONST16(.67,15),tmp)>best_pitch_gain&&(ABS(2*best_pitch-pitch)<3||ABS(3*best_pitch-pitch)<4||ABS(4*best_pitch-pitch)<5)) )
1622
14.5k
         {
1623
14.5k
            best_pitch = pitch;
1624
14.5k
            if (tmp > best_pitch_gain)
1625
13.3k
               best_pitch_gain = tmp;
1626
14.5k
         }
1627
98.1k
      }
1628
1629
      /* Unquantize the innovation */
1630
98.1k
      {
1631
98.1k
         int q_energy;
1632
98.1k
         spx_word32_t ener;
1633
1634
98.1k
         SPEEX_MEMSET(innov, 0, NB_SUBFRAME_SIZE);
1635
1636
         /* Decode sub-frame gain correction */
1637
98.1k
         if (SUBMODE(have_subframe_gain)==3)
1638
22.4k
         {
1639
22.4k
            q_energy = speex_bits_unpack_unsigned(bits, 3);
1640
22.4k
            ener = MULT16_32_Q14(exc_gain_quant_scal3[q_energy],ol_gain);
1641
75.6k
         } else if (SUBMODE(have_subframe_gain)==1)
1642
32.0k
         {
1643
32.0k
            q_energy = speex_bits_unpack_unsigned(bits, 1);
1644
32.0k
            ener = MULT16_32_Q14(exc_gain_quant_scal1[q_energy],ol_gain);
1645
43.6k
         } else {
1646
43.6k
            ener = ol_gain;
1647
43.6k
         }
1648
1649
98.1k
         speex_assert (SUBMODE(innovation_unquant));
1650
98.1k
         {
1651
            /*Fixed codebook contribution*/
1652
98.1k
            SUBMODE(innovation_unquant)(innov, SUBMODE(innovation_params), NB_SUBFRAME_SIZE, bits, stack, &st->seed);
1653
            /* De-normalize innovation and update excitation */
1654
1655
98.1k
            signal_mul(innov, innov, ener, NB_SUBFRAME_SIZE);
1656
1657
            /* Decode second codebook (only for some modes) */
1658
98.1k
            if (SUBMODE(double_codebook))
1659
6.62k
            {
1660
6.62k
               char *tmp_stack=stack;
1661
6.62k
               VARDECL(spx_sig_t *innov2);
1662
6.62k
               ALLOC(innov2, NB_SUBFRAME_SIZE, spx_sig_t);
1663
6.62k
               SPEEX_MEMSET(innov2, 0, NB_SUBFRAME_SIZE);
1664
6.62k
               SUBMODE(innovation_unquant)(innov2, SUBMODE(innovation_params), NB_SUBFRAME_SIZE, bits, stack, &st->seed);
1665
6.62k
               signal_mul(innov2, innov2, MULT16_32_Q15(QCONST16(0.454545f,15),ener), NB_SUBFRAME_SIZE);
1666
271k
               for (i=0;i<NB_SUBFRAME_SIZE;i++)
1667
264k
                  innov[i] = ADD32(innov[i], innov2[i]);
1668
6.62k
               stack = tmp_stack;
1669
6.62k
            }
1670
4.02M
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
1671
3.92M
               exc[i]=EXTRACT16(SATURATE32(PSHR32(ADD32(SHL32(exc32[i],1),innov[i]),SIG_SHIFT),32767));
1672
            /*print_vec(exc, 40, "innov");*/
1673
98.1k
            if (innov_save)
1674
65.5k
            {
1675
2.68M
               for (i=0;i<NB_SUBFRAME_SIZE;i++)
1676
2.62M
                  innov_save[i] = EXTRACT16(PSHR32(innov[i], SIG_SHIFT));
1677
65.5k
            }
1678
98.1k
         }
1679
1680
         /*Vocoder mode*/
1681
98.1k
         if (st->submodeID==1)
1682
19.8k
         {
1683
19.8k
            spx_word16_t g=ol_pitch_coef;
1684
19.8k
            g=MULT16_16_P14(QCONST16(1.5f,14),(g-QCONST16(.2f,6)));
1685
19.8k
            if (g<0)
1686
12.6k
               g=0;
1687
19.8k
            if (g>GAIN_SCALING)
1688
2.64k
               g=GAIN_SCALING;
1689
1690
19.8k
            SPEEX_MEMSET(exc, 0, NB_SUBFRAME_SIZE);
1691
50.7k
            while (st->voc_offset<NB_SUBFRAME_SIZE)
1692
30.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
30.9k
               if (st->voc_offset>=0)
1696
30.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
30.9k
               st->voc_offset+=ol_pitch;
1698
30.9k
            }
1699
19.8k
            st->voc_offset -= NB_SUBFRAME_SIZE;
1700
1701
811k
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
1702
792k
            {
1703
792k
               spx_word16_t exci=exc[i];
1704
792k
               exc[i]= ADD16(ADD16(MULT16_16_Q15(QCONST16(.7f,15),exc[i]) , MULT16_16_Q15(QCONST16(.3f,15),st->voc_m1)),
1705
792k
                             SUB16(MULT16_16_Q15(Q15_ONE-MULT16_16_16(QCONST16(.85f,9),g),EXTRACT16(PSHR32(innov[i],SIG_SHIFT))),
1706
792k
                                   MULT16_16_Q15(MULT16_16_16(QCONST16(.15f,9),g),EXTRACT16(PSHR32(st->voc_m2,SIG_SHIFT)))
1707
792k
                                  ));
1708
792k
               st->voc_m1 = exci;
1709
792k
               st->voc_m2=innov[i];
1710
792k
               st->voc_mean = EXTRACT16(PSHR32(ADD32(MULT16_16(QCONST16(.8f,15),st->voc_mean), MULT16_16(QCONST16(.2f,15),exc[i])), 15));
1711
792k
               exc[i]-=st->voc_mean;
1712
792k
            }
1713
19.8k
         }
1714
1715
98.1k
      }
1716
98.1k
   }
1717
1718
24.5k
   ALLOC(interp_qlsp, NB_ORDER, spx_lsp_t);
1719
1720
24.5k
   if (st->lpc_enh_enabled && SUBMODE(comb_gain)>0 && !st->count_lost)
1721
19.5k
   {
1722
19.5k
      multicomb(st->exc-NB_SUBFRAME_SIZE, out, st->interp_qlpc, NB_ORDER, 2*NB_SUBFRAME_SIZE, best_pitch, 40, SUBMODE(comb_gain), stack);
1723
19.5k
      multicomb(st->exc+NB_SUBFRAME_SIZE, out+2*NB_SUBFRAME_SIZE, st->interp_qlpc, NB_ORDER, 2*NB_SUBFRAME_SIZE, best_pitch, 40, SUBMODE(comb_gain), stack);
1724
19.5k
   } else {
1725
4.95k
      SPEEX_COPY(out, &st->exc[-NB_SUBFRAME_SIZE], NB_FRAME_SIZE);
1726
4.95k
   }
1727
1728
   /* If the last packet was lost, re-scale the excitation to obtain the same energy as encoded in ol_gain */
1729
24.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
#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
122k
   for (sub=0;sub<NB_NB_SUBFRAMES;sub++)
1754
98.1k
   {
1755
98.1k
      int offset;
1756
98.1k
      spx_word16_t *sp;
1757
1758
      /* Offset relative to start of frame */
1759
98.1k
      offset = NB_SUBFRAME_SIZE*sub;
1760
      /* Original signal */
1761
98.1k
      sp=out+offset;
1762
1763
      /* LSP interpolation (quantized and unquantized) */
1764
98.1k
      lsp_interpolate(st->old_qlsp, qlsp, interp_qlsp, NB_ORDER, sub, NB_NB_SUBFRAMES, LSP_MARGIN);
1765
1766
      /* Compute interpolated LPCs (unquantized) */
1767
98.1k
      lsp_to_lpc(interp_qlsp, ak, NB_ORDER, stack);
1768
1769
      /* Compute analysis filter at w=pi */
1770
98.1k
      {
1771
98.1k
         spx_word32_t pi_g=LPC_SCALING;
1772
588k
         for (i=0;i<NB_ORDER;i+=2)
1773
490k
         {
1774
            /*pi_g += -st->interp_qlpc[i] +  st->interp_qlpc[i+1];*/
1775
490k
            pi_g = ADD32(pi_g, SUB32(EXTEND32(ak[i+1]),EXTEND32(ak[i])));
1776
490k
         }
1777
98.1k
         st->pi_gain[sub] = pi_g;
1778
98.1k
      }
1779
1780
98.1k
      iir_mem16(sp, st->interp_qlpc, sp, NB_SUBFRAME_SIZE, NB_ORDER,
1781
98.1k
                st->mem_sp, stack);
1782
1783
1.07M
      for (i=0;i<NB_ORDER;i++)
1784
981k
         st->interp_qlpc[i] = ak[i];
1785
1786
98.1k
   }
1787
1788
24.5k
   if (st->highpass_enabled)
1789
24.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
24.5k
   st->level = 1+PSHR32(ol_gain,SIG_SHIFT);
1795
24.5k
   st->max_level = MAX16(MULT16_16_Q15(QCONST16(.99f,15), st->max_level), st->level);
1796
24.5k
   st->min_level = MIN16(ADD16(1,MULT16_16_Q14(QCONST16(1.01f,14), st->min_level)), st->level);
1797
24.5k
   if (st->max_level < st->min_level+1)
1798
7.90k
      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
269k
   for (i=0;i<NB_ORDER;i++)
1803
245k
      st->old_qlsp[i] = qlsp[i];
1804
1805
   /* The next frame will not be the first (Duh!) */
1806
24.5k
   st->first = 0;
1807
24.5k
   st->count_lost=0;
1808
24.5k
   st->last_pitch = best_pitch;
1809
#ifdef FIXED_POINT
1810
13.1k
   st->last_pitch_gain = PSHR16(pitch_average,2);
1811
#else
1812
   st->last_pitch_gain = .25*pitch_average;
1813
#endif
1814
24.5k
   st->pitch_gain_buf[st->pitch_gain_buf_idx++] = st->last_pitch_gain;
1815
24.5k
   if (st->pitch_gain_buf_idx > 2) /* rollover */
1816
7.31k
      st->pitch_gain_buf_idx = 0;
1817
1818
24.5k
   st->last_ol_gain = ol_gain;
1819
1820
24.5k
   return 0;
1821
46.1k
}
nb_decode
Line
Count
Source
1331
30.5k
{
1332
30.5k
   DecState *st;
1333
30.5k
   int i, sub;
1334
30.5k
   int pitch;
1335
30.5k
   spx_word16_t pitch_gain[3];
1336
30.5k
   spx_word32_t ol_gain=0;
1337
30.5k
   int ol_pitch=0;
1338
30.5k
   spx_word16_t ol_pitch_coef=0;
1339
30.5k
   int best_pitch=40;
1340
30.5k
   spx_word16_t best_pitch_gain=0;
1341
30.5k
   int wideband;
1342
30.5k
   int m;
1343
30.5k
   char *stack;
1344
30.5k
   VARDECL(spx_sig_t *innov);
1345
30.5k
   VARDECL(spx_word32_t *exc32);
1346
30.5k
   VARDECL(spx_coef_t *ak);
1347
30.5k
   VARDECL(spx_lsp_t *qlsp);
1348
30.5k
   spx_word16_t pitch_average=0;
1349
1350
30.5k
   spx_word16_t *out = (spx_word16_t*)vout;
1351
30.5k
   VARDECL(spx_lsp_t *interp_qlsp);
1352
1353
30.5k
   st=(DecState*)state;
1354
30.5k
   stack=st->stack;
1355
1356
30.5k
   st->exc = st->excBuf + 2*NB_PITCH_END + NB_SUBFRAME_SIZE + 6;
1357
1358
   /* Check if we're in DTX mode*/
1359
30.5k
   if (!bits && st->dtx_enabled)
1360
0
   {
1361
0
      st->submodeID=0;
1362
0
   } else
1363
30.5k
   {
1364
      /* If bits is NULL, consider the packet to be lost (what could we do anyway) */
1365
30.5k
      if (!bits)
1366
0
      {
1367
0
         nb_decode_lost(st, out, stack);
1368
0
         return 0;
1369
0
      }
1370
1371
30.5k
      if (st->encode_submode)
1372
30.5k
      {
1373
1374
      /* Search for next narrowband block (handle requests, skip wideband blocks) */
1375
33.0k
      do {
1376
33.0k
         if (speex_bits_remaining(bits)<5)
1377
6.18k
            return -1;
1378
26.8k
         wideband = speex_bits_unpack_unsigned(bits, 1);
1379
26.8k
         if (wideband) /* Skip wideband block (for compatibility) */
1380
1.87k
         {
1381
1.87k
            int submode;
1382
1.87k
            int advance;
1383
1.87k
            advance = submode = speex_bits_unpack_unsigned(bits, SB_SUBMODE_BITS);
1384
            /*speex_mode_query(&speex_wb_mode, SPEEX_SUBMODE_BITS_PER_FRAME, &advance);*/
1385
1.87k
            advance = wb_skip_table[submode];
1386
1.87k
            if (advance < 0)
1387
0
            {
1388
0
               speex_notify("Invalid mode encountered. The stream is corrupted.");
1389
0
               return -2;
1390
0
            }
1391
1.87k
            advance -= (SB_SUBMODE_BITS+1);
1392
1.87k
            speex_bits_advance(bits, advance);
1393
1394
1.87k
            if (speex_bits_remaining(bits)<5)
1395
657
               return -1;
1396
1.22k
            wideband = speex_bits_unpack_unsigned(bits, 1);
1397
1.22k
            if (wideband)
1398
924
            {
1399
924
               advance = submode = speex_bits_unpack_unsigned(bits, SB_SUBMODE_BITS);
1400
               /*speex_mode_query(&speex_wb_mode, SPEEX_SUBMODE_BITS_PER_FRAME, &advance);*/
1401
924
               advance = wb_skip_table[submode];
1402
924
               if (advance < 0)
1403
0
               {
1404
0
                  speex_notify("Invalid mode encountered. The stream is corrupted.");
1405
0
                  return -2;
1406
0
               }
1407
924
               advance -= (SB_SUBMODE_BITS+1);
1408
924
               speex_bits_advance(bits, advance);
1409
924
               wideband = speex_bits_unpack_unsigned(bits, 1);
1410
924
               if (wideband)
1411
716
               {
1412
716
                  speex_notify("More than two wideband layers found. The stream is corrupted.");
1413
716
                  return -2;
1414
716
               }
1415
1416
924
            }
1417
1.22k
         }
1418
25.4k
         if (speex_bits_remaining(bits)<4)
1419
204
            return -1;
1420
         /* FIXME: Check for overflow */
1421
25.2k
         m = speex_bits_unpack_unsigned(bits, 4);
1422
25.2k
         if (m==15) /* We found a terminator */
1423
381
         {
1424
381
            return -1;
1425
24.9k
         } else if (m==14) /* Speex in-band request */
1426
2.12k
         {
1427
2.12k
            int ret = speex_inband_handler(bits, st->speex_callbacks, state);
1428
2.12k
            if (ret)
1429
0
               return ret;
1430
22.7k
         } else if (m==13) /* User in-band request */
1431
327
         {
1432
327
            int ret = st->user_callback.func(bits, state, st->user_callback.data);
1433
327
            if (ret)
1434
0
               return ret;
1435
22.4k
         } else if (m>8) /* Invalid mode */
1436
1.54k
         {
1437
1.54k
            speex_notify("Invalid mode encountered. The stream is corrupted.");
1438
1.54k
            return -2;
1439
1.54k
         }
1440
1441
25.2k
      } while (m>8);
1442
1443
      /* Get the sub-mode that was used */
1444
20.9k
      st->submodeID = m;
1445
20.9k
      }
1446
1447
30.5k
   }
1448
1449
   /* Shift all buffers by one frame */
1450
20.9k
   SPEEX_MOVE(st->excBuf, st->excBuf+NB_FRAME_SIZE, 2*NB_PITCH_END + NB_SUBFRAME_SIZE + 12);
1451
1452
   /* If null mode (no transmission), just set a couple things to zero*/
1453
20.9k
   if (st->submodes[st->submodeID] == NULL)
1454
9.52k
   {
1455
9.52k
      VARDECL(spx_coef_t *lpc);
1456
9.52k
      ALLOC(lpc, NB_ORDER, spx_coef_t);
1457
9.52k
      bw_lpc(QCONST16(0.93f,15), st->interp_qlpc, lpc, NB_ORDER);
1458
9.52k
      {
1459
9.52k
         spx_word16_t innov_gain=0;
1460
         /* FIXME: This was innov, not exc */
1461
9.52k
         innov_gain = compute_rms16(st->exc, NB_FRAME_SIZE);
1462
1.53M
         for (i=0;i<NB_FRAME_SIZE;i++)
1463
1.52M
            st->exc[i]=speex_rand(innov_gain, &st->seed);
1464
9.52k
      }
1465
1466
1467
9.52k
      st->first=1;
1468
1469
      /* Final signal synthesis from excitation */
1470
9.52k
      iir_mem16(st->exc, lpc, out, NB_FRAME_SIZE, NB_ORDER, st->mem_sp, stack);
1471
1472
      /* Normally this is written to later but since this is returning early,
1473
         avoid reading uninitialized memory in caller */
1474
9.52k
      if (st->innov_save)
1475
8.54k
         SPEEX_MEMSET(st->innov_save, 0, NB_NB_SUBFRAMES*NB_SUBFRAME_SIZE);
1476
1477
9.52k
      st->count_lost=0;
1478
9.52k
      return 0;
1479
9.52k
   }
1480
1481
11.3k
   ALLOC(qlsp, NB_ORDER, spx_lsp_t);
1482
1483
   /* Unquantize LSPs */
1484
11.3k
   SUBMODE(lsp_unquant)(qlsp, NB_ORDER, bits);
1485
1486
   /*Damp memory if a frame was lost and the LSP changed too much*/
1487
11.3k
   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.3k
   if (st->first || st->count_lost)
1505
1.91k
   {
1506
21.0k
      for (i=0;i<NB_ORDER;i++)
1507
19.1k
         st->old_qlsp[i] = qlsp[i];
1508
1.91k
   }
1509
1510
   /* Get open-loop pitch estimation for low bit-rate pitch coding */
1511
11.3k
   if (SUBMODE(lbr_pitch)!=-1)
1512
5.48k
   {
1513
5.48k
      ol_pitch = NB_PITCH_START+speex_bits_unpack_unsigned(bits, 7);
1514
5.48k
   }
1515
1516
11.3k
   if (SUBMODE(forced_pitch_gain))
1517
4.70k
   {
1518
4.70k
      int quant;
1519
4.70k
      quant = speex_bits_unpack_unsigned(bits, 4);
1520
4.70k
      ol_pitch_coef=MULT16_16_P15(QCONST16(0.066667,15),SHL16(quant,GAIN_SHIFT));
1521
4.70k
   }
1522
1523
   /* Get global excitation gain */
1524
11.3k
   {
1525
11.3k
      int qe;
1526
11.3k
      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.3k
      ol_gain = SIG_SCALING*exp(qe/3.5);
1532
11.3k
#endif
1533
11.3k
   }
1534
1535
11.3k
   ALLOC(ak, NB_ORDER, spx_coef_t);
1536
11.3k
   ALLOC(innov, NB_SUBFRAME_SIZE, spx_sig_t);
1537
11.3k
   ALLOC(exc32, NB_SUBFRAME_SIZE, spx_word32_t);
1538
1539
11.3k
   if (st->submodeID==1)
1540
2.32k
   {
1541
2.32k
      int extra;
1542
2.32k
      extra = speex_bits_unpack_unsigned(bits, 4);
1543
1544
2.32k
      if (extra==15)
1545
379
         st->dtx_enabled=1;
1546
1.94k
      else
1547
1.94k
         st->dtx_enabled=0;
1548
2.32k
   }
1549
11.3k
   if (st->submodeID>1)
1550
9.05k
      st->dtx_enabled=0;
1551
1552
   /*Loop on subframes */
1553
56.9k
   for (sub=0;sub<NB_NB_SUBFRAMES;sub++)
1554
45.5k
   {
1555
45.5k
      int offset;
1556
45.5k
      spx_word16_t *exc;
1557
45.5k
      spx_word16_t *innov_save = NULL;
1558
45.5k
      spx_word16_t tmp;
1559
1560
      /* Offset relative to start of frame */
1561
45.5k
      offset = NB_SUBFRAME_SIZE*sub;
1562
      /* Excitation */
1563
45.5k
      exc=st->exc+offset;
1564
      /* Original signal */
1565
45.5k
      if (st->innov_save)
1566
30.5k
         innov_save = st->innov_save+offset;
1567
1568
1569
      /* Reset excitation */
1570
45.5k
      SPEEX_MEMSET(exc, 0, NB_SUBFRAME_SIZE);
1571
1572
      /*Adaptive codebook contribution*/
1573
45.5k
      speex_assert (SUBMODE(ltp_unquant));
1574
45.5k
      {
1575
45.5k
         int pit_min, pit_max;
1576
         /* Handle pitch constraints if any */
1577
45.5k
         if (SUBMODE(lbr_pitch) != -1)
1578
21.9k
         {
1579
21.9k
            int margin;
1580
21.9k
            margin = SUBMODE(lbr_pitch);
1581
21.9k
            if (margin)
1582
0
            {
1583
/* GT - need optimization?
1584
               if (ol_pitch < NB_PITCH_START+margin-1)
1585
                  ol_pitch=NB_PITCH_START+margin-1;
1586
               if (ol_pitch > NB_PITCH_END-margin)
1587
                  ol_pitch=NB_PITCH_END-margin;
1588
               pit_min = ol_pitch-margin+1;
1589
               pit_max = ol_pitch+margin;
1590
*/
1591
0
               pit_min = ol_pitch-margin+1;
1592
0
               if (pit_min < NB_PITCH_START)
1593
0
      pit_min = NB_PITCH_START;
1594
0
               pit_max = ol_pitch+margin;
1595
0
               if (pit_max > NB_PITCH_END)
1596
0
      pit_max = NB_PITCH_END;
1597
21.9k
            } else {
1598
21.9k
               pit_min = pit_max = ol_pitch;
1599
21.9k
            }
1600
23.5k
         } else {
1601
23.5k
            pit_min = NB_PITCH_START;
1602
23.5k
            pit_max = NB_PITCH_END;
1603
23.5k
         }
1604
1605
1606
1607
45.5k
         SUBMODE(ltp_unquant)(exc, exc32, pit_min, pit_max, ol_pitch_coef, SUBMODE(ltp_params),
1608
45.5k
                 NB_SUBFRAME_SIZE, &pitch, &pitch_gain[0], bits, stack,
1609
45.5k
                 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
45.5k
         sanitize_values32(exc32, NEG32(QCONST32(32000,SIG_SHIFT-1)), QCONST32(32000,SIG_SHIFT-1), NB_SUBFRAME_SIZE);
1615
1616
45.5k
         tmp = gain_3tap_to_1tap(pitch_gain);
1617
1618
45.5k
         pitch_average += tmp;
1619
45.5k
         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.8k
              || (tmp>MULT16_16_Q15(QCONST16(.6,15),best_pitch_gain)&&(ABS(best_pitch-2*pitch)<3||ABS(best_pitch-3*pitch)<4||ABS(best_pitch-4*pitch)<5))
1621
41.1k
              || (MULT16_16_Q15(QCONST16(.67,15),tmp)>best_pitch_gain&&(ABS(2*best_pitch-pitch)<3||ABS(3*best_pitch-pitch)<4||ABS(4*best_pitch-pitch)<5)) )
1622
6.01k
         {
1623
6.01k
            best_pitch = pitch;
1624
6.01k
            if (tmp > best_pitch_gain)
1625
5.32k
               best_pitch_gain = tmp;
1626
6.01k
         }
1627
45.5k
      }
1628
1629
      /* Unquantize the innovation */
1630
45.5k
      {
1631
45.5k
         int q_energy;
1632
45.5k
         spx_word32_t ener;
1633
1634
45.5k
         SPEEX_MEMSET(innov, 0, NB_SUBFRAME_SIZE);
1635
1636
         /* Decode sub-frame gain correction */
1637
45.5k
         if (SUBMODE(have_subframe_gain)==3)
1638
9.75k
         {
1639
9.75k
            q_energy = speex_bits_unpack_unsigned(bits, 3);
1640
9.75k
            ener = MULT16_32_Q14(exc_gain_quant_scal3[q_energy],ol_gain);
1641
35.7k
         } else if (SUBMODE(have_subframe_gain)==1)
1642
13.8k
         {
1643
13.8k
            q_energy = speex_bits_unpack_unsigned(bits, 1);
1644
13.8k
            ener = MULT16_32_Q14(exc_gain_quant_scal1[q_energy],ol_gain);
1645
21.9k
         } else {
1646
21.9k
            ener = ol_gain;
1647
21.9k
         }
1648
1649
45.5k
         speex_assert (SUBMODE(innovation_unquant));
1650
45.5k
         {
1651
            /*Fixed codebook contribution*/
1652
45.5k
            SUBMODE(innovation_unquant)(innov, SUBMODE(innovation_params), NB_SUBFRAME_SIZE, bits, stack, &st->seed);
1653
            /* De-normalize innovation and update excitation */
1654
1655
45.5k
            signal_mul(innov, innov, ener, NB_SUBFRAME_SIZE);
1656
1657
            /* Decode second codebook (only for some modes) */
1658
45.5k
            if (SUBMODE(double_codebook))
1659
2.02k
            {
1660
2.02k
               char *tmp_stack=stack;
1661
2.02k
               VARDECL(spx_sig_t *innov2);
1662
2.02k
               ALLOC(innov2, NB_SUBFRAME_SIZE, spx_sig_t);
1663
2.02k
               SPEEX_MEMSET(innov2, 0, NB_SUBFRAME_SIZE);
1664
2.02k
               SUBMODE(innovation_unquant)(innov2, SUBMODE(innovation_params), NB_SUBFRAME_SIZE, bits, stack, &st->seed);
1665
2.02k
               signal_mul(innov2, innov2, MULT16_32_Q15(QCONST16(0.454545f,15),ener), NB_SUBFRAME_SIZE);
1666
82.9k
               for (i=0;i<NB_SUBFRAME_SIZE;i++)
1667
80.9k
                  innov[i] = ADD32(innov[i], innov2[i]);
1668
2.02k
               stack = tmp_stack;
1669
2.02k
            }
1670
1.86M
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
1671
1.82M
               exc[i]=EXTRACT16(SATURATE32(PSHR32(ADD32(SHL32(exc32[i],1),innov[i]),SIG_SHIFT),32767));
1672
            /*print_vec(exc, 40, "innov");*/
1673
45.5k
            if (innov_save)
1674
30.5k
            {
1675
1.25M
               for (i=0;i<NB_SUBFRAME_SIZE;i++)
1676
1.22M
                  innov_save[i] = EXTRACT16(PSHR32(innov[i], SIG_SHIFT));
1677
30.5k
            }
1678
45.5k
         }
1679
1680
         /*Vocoder mode*/
1681
45.5k
         if (st->submodeID==1)
1682
9.31k
         {
1683
9.31k
            spx_word16_t g=ol_pitch_coef;
1684
9.31k
            g=MULT16_16_P14(QCONST16(1.5f,14),(g-QCONST16(.2f,6)));
1685
9.31k
            if (g<0)
1686
6.29k
               g=0;
1687
9.31k
            if (g>GAIN_SCALING)
1688
1.36k
               g=GAIN_SCALING;
1689
1690
9.31k
            SPEEX_MEMSET(exc, 0, NB_SUBFRAME_SIZE);
1691
24.3k
            while (st->voc_offset<NB_SUBFRAME_SIZE)
1692
15.0k
            {
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
15.0k
               if (st->voc_offset>=0)
1696
15.0k
                  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
15.0k
               st->voc_offset+=ol_pitch;
1698
15.0k
            }
1699
9.31k
            st->voc_offset -= NB_SUBFRAME_SIZE;
1700
1701
381k
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
1702
372k
            {
1703
372k
               spx_word16_t exci=exc[i];
1704
372k
               exc[i]= ADD16(ADD16(MULT16_16_Q15(QCONST16(.7f,15),exc[i]) , MULT16_16_Q15(QCONST16(.3f,15),st->voc_m1)),
1705
372k
                             SUB16(MULT16_16_Q15(Q15_ONE-MULT16_16_16(QCONST16(.85f,9),g),EXTRACT16(PSHR32(innov[i],SIG_SHIFT))),
1706
372k
                                   MULT16_16_Q15(MULT16_16_16(QCONST16(.15f,9),g),EXTRACT16(PSHR32(st->voc_m2,SIG_SHIFT)))
1707
372k
                                  ));
1708
372k
               st->voc_m1 = exci;
1709
372k
               st->voc_m2=innov[i];
1710
372k
               st->voc_mean = EXTRACT16(PSHR32(ADD32(MULT16_16(QCONST16(.8f,15),st->voc_mean), MULT16_16(QCONST16(.2f,15),exc[i])), 15));
1711
372k
               exc[i]-=st->voc_mean;
1712
372k
            }
1713
9.31k
         }
1714
1715
45.5k
      }
1716
45.5k
   }
1717
1718
11.3k
   ALLOC(interp_qlsp, NB_ORDER, spx_lsp_t);
1719
1720
11.3k
   if (st->lpc_enh_enabled && SUBMODE(comb_gain)>0 && !st->count_lost)
1721
9.05k
   {
1722
9.05k
      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.05k
      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.05k
   } else {
1725
2.32k
      SPEEX_COPY(out, &st->exc[-NB_SUBFRAME_SIZE], NB_FRAME_SIZE);
1726
2.32k
   }
1727
1728
   /* If the last packet was lost, re-scale the excitation to obtain the same energy as encoded in ol_gain */
1729
11.3k
   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
56.9k
   for (sub=0;sub<NB_NB_SUBFRAMES;sub++)
1754
45.5k
   {
1755
45.5k
      int offset;
1756
45.5k
      spx_word16_t *sp;
1757
1758
      /* Offset relative to start of frame */
1759
45.5k
      offset = NB_SUBFRAME_SIZE*sub;
1760
      /* Original signal */
1761
45.5k
      sp=out+offset;
1762
1763
      /* LSP interpolation (quantized and unquantized) */
1764
45.5k
      lsp_interpolate(st->old_qlsp, qlsp, interp_qlsp, NB_ORDER, sub, NB_NB_SUBFRAMES, LSP_MARGIN);
1765
1766
      /* Compute interpolated LPCs (unquantized) */
1767
45.5k
      lsp_to_lpc(interp_qlsp, ak, NB_ORDER, stack);
1768
1769
      /* Compute analysis filter at w=pi */
1770
45.5k
      {
1771
45.5k
         spx_word32_t pi_g=LPC_SCALING;
1772
273k
         for (i=0;i<NB_ORDER;i+=2)
1773
227k
         {
1774
            /*pi_g += -st->interp_qlpc[i] +  st->interp_qlpc[i+1];*/
1775
227k
            pi_g = ADD32(pi_g, SUB32(EXTEND32(ak[i+1]),EXTEND32(ak[i])));
1776
227k
         }
1777
45.5k
         st->pi_gain[sub] = pi_g;
1778
45.5k
      }
1779
1780
45.5k
      iir_mem16(sp, st->interp_qlpc, sp, NB_SUBFRAME_SIZE, NB_ORDER,
1781
45.5k
                st->mem_sp, stack);
1782
1783
500k
      for (i=0;i<NB_ORDER;i++)
1784
455k
         st->interp_qlpc[i] = ak[i];
1785
1786
45.5k
   }
1787
1788
11.3k
   if (st->highpass_enabled)
1789
11.3k
      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.3k
   st->level = 1+PSHR32(ol_gain,SIG_SHIFT);
1795
11.3k
   st->max_level = MAX16(MULT16_16_Q15(QCONST16(.99f,15), st->max_level), st->level);
1796
11.3k
   st->min_level = MIN16(ADD16(1,MULT16_16_Q14(QCONST16(1.01f,14), st->min_level)), st->level);
1797
11.3k
   if (st->max_level < st->min_level+1)
1798
3.71k
      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
125k
   for (i=0;i<NB_ORDER;i++)
1803
113k
      st->old_qlsp[i] = qlsp[i];
1804
1805
   /* The next frame will not be the first (Duh!) */
1806
11.3k
   st->first = 0;
1807
11.3k
   st->count_lost=0;
1808
11.3k
   st->last_pitch = best_pitch;
1809
#ifdef FIXED_POINT
1810
   st->last_pitch_gain = PSHR16(pitch_average,2);
1811
#else
1812
11.3k
   st->last_pitch_gain = .25*pitch_average;
1813
11.3k
#endif
1814
11.3k
   st->pitch_gain_buf[st->pitch_gain_buf_idx++] = st->last_pitch_gain;
1815
11.3k
   if (st->pitch_gain_buf_idx > 2) /* rollover */
1816
3.53k
      st->pitch_gain_buf_idx = 0;
1817
1818
11.3k
   st->last_ol_gain = ol_gain;
1819
1820
11.3k
   return 0;
1821
20.9k
}
nb_decode
Line
Count
Source
1331
33.9k
{
1332
33.9k
   DecState *st;
1333
33.9k
   int i, sub;
1334
33.9k
   int pitch;
1335
33.9k
   spx_word16_t pitch_gain[3];
1336
33.9k
   spx_word32_t ol_gain=0;
1337
33.9k
   int ol_pitch=0;
1338
33.9k
   spx_word16_t ol_pitch_coef=0;
1339
33.9k
   int best_pitch=40;
1340
33.9k
   spx_word16_t best_pitch_gain=0;
1341
33.9k
   int wideband;
1342
33.9k
   int m;
1343
33.9k
   char *stack;
1344
33.9k
   VARDECL(spx_sig_t *innov);
1345
33.9k
   VARDECL(spx_word32_t *exc32);
1346
33.9k
   VARDECL(spx_coef_t *ak);
1347
33.9k
   VARDECL(spx_lsp_t *qlsp);
1348
33.9k
   spx_word16_t pitch_average=0;
1349
1350
33.9k
   spx_word16_t *out = (spx_word16_t*)vout;
1351
33.9k
   VARDECL(spx_lsp_t *interp_qlsp);
1352
1353
33.9k
   st=(DecState*)state;
1354
33.9k
   stack=st->stack;
1355
1356
33.9k
   st->exc = st->excBuf + 2*NB_PITCH_END + NB_SUBFRAME_SIZE + 6;
1357
1358
   /* Check if we're in DTX mode*/
1359
33.9k
   if (!bits && st->dtx_enabled)
1360
0
   {
1361
0
      st->submodeID=0;
1362
0
   } else
1363
33.9k
   {
1364
      /* If bits is NULL, consider the packet to be lost (what could we do anyway) */
1365
33.9k
      if (!bits)
1366
0
      {
1367
0
         nb_decode_lost(st, out, stack);
1368
0
         return 0;
1369
0
      }
1370
1371
33.9k
      if (st->encode_submode)
1372
33.9k
      {
1373
1374
      /* Search for next narrowband block (handle requests, skip wideband blocks) */
1375
36.1k
      do {
1376
36.1k
         if (speex_bits_remaining(bits)<5)
1377
5.16k
            return -1;
1378
31.0k
         wideband = speex_bits_unpack_unsigned(bits, 1);
1379
31.0k
         if (wideband) /* Skip wideband block (for compatibility) */
1380
1.84k
         {
1381
1.84k
            int submode;
1382
1.84k
            int advance;
1383
1.84k
            advance = submode = speex_bits_unpack_unsigned(bits, SB_SUBMODE_BITS);
1384
            /*speex_mode_query(&speex_wb_mode, SPEEX_SUBMODE_BITS_PER_FRAME, &advance);*/
1385
1.84k
            advance = wb_skip_table[submode];
1386
1.84k
            if (advance < 0)
1387
0
            {
1388
0
               speex_notify("Invalid mode encountered. The stream is corrupted.");
1389
0
               return -2;
1390
0
            }
1391
1.84k
            advance -= (SB_SUBMODE_BITS+1);
1392
1.84k
            speex_bits_advance(bits, advance);
1393
1394
1.84k
            if (speex_bits_remaining(bits)<5)
1395
508
               return -1;
1396
1.33k
            wideband = speex_bits_unpack_unsigned(bits, 1);
1397
1.33k
            if (wideband)
1398
1.07k
            {
1399
1.07k
               advance = submode = speex_bits_unpack_unsigned(bits, SB_SUBMODE_BITS);
1400
               /*speex_mode_query(&speex_wb_mode, SPEEX_SUBMODE_BITS_PER_FRAME, &advance);*/
1401
1.07k
               advance = wb_skip_table[submode];
1402
1.07k
               if (advance < 0)
1403
0
               {
1404
0
                  speex_notify("Invalid mode encountered. The stream is corrupted.");
1405
0
                  return -2;
1406
0
               }
1407
1.07k
               advance -= (SB_SUBMODE_BITS+1);
1408
1.07k
               speex_bits_advance(bits, advance);
1409
1.07k
               wideband = speex_bits_unpack_unsigned(bits, 1);
1410
1.07k
               if (wideband)
1411
868
               {
1412
868
                  speex_notify("More than two wideband layers found. The stream is corrupted.");
1413
868
                  return -2;
1414
868
               }
1415
1416
1.07k
            }
1417
1.33k
         }
1418
29.6k
         if (speex_bits_remaining(bits)<4)
1419
201
            return -1;
1420
         /* FIXME: Check for overflow */
1421
29.4k
         m = speex_bits_unpack_unsigned(bits, 4);
1422
29.4k
         if (m==15) /* We found a terminator */
1423
406
         {
1424
406
            return -1;
1425
29.0k
         } else if (m==14) /* Speex in-band request */
1426
1.91k
         {
1427
1.91k
            int ret = speex_inband_handler(bits, st->speex_callbacks, state);
1428
1.91k
            if (ret)
1429
0
               return ret;
1430
27.1k
         } else if (m==13) /* User in-band request */
1431
259
         {
1432
259
            int ret = st->user_callback.func(bits, state, st->user_callback.data);
1433
259
            if (ret)
1434
0
               return ret;
1435
26.8k
         } else if (m>8) /* Invalid mode */
1436
1.64k
         {
1437
1.64k
            speex_notify("Invalid mode encountered. The stream is corrupted.");
1438
1.64k
            return -2;
1439
1.64k
         }
1440
1441
29.4k
      } while (m>8);
1442
1443
      /* Get the sub-mode that was used */
1444
25.2k
      st->submodeID = m;
1445
25.2k
      }
1446
1447
33.9k
   }
1448
1449
   /* Shift all buffers by one frame */
1450
25.2k
   SPEEX_MOVE(st->excBuf, st->excBuf+NB_FRAME_SIZE, 2*NB_PITCH_END + NB_SUBFRAME_SIZE + 12);
1451
1452
   /* If null mode (no transmission), just set a couple things to zero*/
1453
25.2k
   if (st->submodes[st->submodeID] == NULL)
1454
12.0k
   {
1455
12.0k
      VARDECL(spx_coef_t *lpc);
1456
12.0k
      ALLOC(lpc, NB_ORDER, spx_coef_t);
1457
12.0k
      bw_lpc(QCONST16(0.93f,15), st->interp_qlpc, lpc, NB_ORDER);
1458
12.0k
      {
1459
12.0k
         spx_word16_t innov_gain=0;
1460
         /* FIXME: This was innov, not exc */
1461
12.0k
         innov_gain = compute_rms16(st->exc, NB_FRAME_SIZE);
1462
1.94M
         for (i=0;i<NB_FRAME_SIZE;i++)
1463
1.92M
            st->exc[i]=speex_rand(innov_gain, &st->seed);
1464
12.0k
      }
1465
1466
1467
12.0k
      st->first=1;
1468
1469
      /* Final signal synthesis from excitation */
1470
12.0k
      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
12.0k
      if (st->innov_save)
1475
9.05k
         SPEEX_MEMSET(st->innov_save, 0, NB_NB_SUBFRAMES*NB_SUBFRAME_SIZE);
1476
1477
12.0k
      st->count_lost=0;
1478
12.0k
      return 0;
1479
12.0k
   }
1480
1481
13.1k
   ALLOC(qlsp, NB_ORDER, spx_lsp_t);
1482
1483
   /* Unquantize LSPs */
1484
13.1k
   SUBMODE(lsp_unquant)(qlsp, NB_ORDER, bits);
1485
1486
   /*Damp memory if a frame was lost and the LSP changed too much*/
1487
13.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
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.1k
   if (st->first || st->count_lost)
1505
2.69k
   {
1506
29.6k
      for (i=0;i<NB_ORDER;i++)
1507
26.9k
         st->old_qlsp[i] = qlsp[i];
1508
2.69k
   }
1509
1510
   /* Get open-loop pitch estimation for low bit-rate pitch coding */
1511
13.1k
   if (SUBMODE(lbr_pitch)!=-1)
1512
5.42k
   {
1513
5.42k
      ol_pitch = NB_PITCH_START+speex_bits_unpack_unsigned(bits, 7);
1514
5.42k
   }
1515
1516
13.1k
   if (SUBMODE(forced_pitch_gain))
1517
4.22k
   {
1518
4.22k
      int quant;
1519
4.22k
      quant = speex_bits_unpack_unsigned(bits, 4);
1520
4.22k
      ol_pitch_coef=MULT16_16_P15(QCONST16(0.066667,15),SHL16(quant,GAIN_SHIFT));
1521
4.22k
   }
1522
1523
   /* Get global excitation gain */
1524
13.1k
   {
1525
13.1k
      int qe;
1526
13.1k
      qe = speex_bits_unpack_unsigned(bits, 5);
1527
13.1k
#ifdef FIXED_POINT
1528
      /* FIXME: Perhaps we could slightly lower the gain here when the output is going to saturate? */
1529
13.1k
      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.1k
   }
1534
1535
13.1k
   ALLOC(ak, NB_ORDER, spx_coef_t);
1536
13.1k
   ALLOC(innov, NB_SUBFRAME_SIZE, spx_sig_t);
1537
13.1k
   ALLOC(exc32, NB_SUBFRAME_SIZE, spx_word32_t);
1538
1539
13.1k
   if (st->submodeID==1)
1540
2.62k
   {
1541
2.62k
      int extra;
1542
2.62k
      extra = speex_bits_unpack_unsigned(bits, 4);
1543
1544
2.62k
      if (extra==15)
1545
340
         st->dtx_enabled=1;
1546
2.28k
      else
1547
2.28k
         st->dtx_enabled=0;
1548
2.62k
   }
1549
13.1k
   if (st->submodeID>1)
1550
10.5k
      st->dtx_enabled=0;
1551
1552
   /*Loop on subframes */
1553
65.7k
   for (sub=0;sub<NB_NB_SUBFRAMES;sub++)
1554
52.5k
   {
1555
52.5k
      int offset;
1556
52.5k
      spx_word16_t *exc;
1557
52.5k
      spx_word16_t *innov_save = NULL;
1558
52.5k
      spx_word16_t tmp;
1559
1560
      /* Offset relative to start of frame */
1561
52.5k
      offset = NB_SUBFRAME_SIZE*sub;
1562
      /* Excitation */
1563
52.5k
      exc=st->exc+offset;
1564
      /* Original signal */
1565
52.5k
      if (st->innov_save)
1566
35.0k
         innov_save = st->innov_save+offset;
1567
1568
1569
      /* Reset excitation */
1570
52.5k
      SPEEX_MEMSET(exc, 0, NB_SUBFRAME_SIZE);
1571
1572
      /*Adaptive codebook contribution*/
1573
52.5k
      speex_assert (SUBMODE(ltp_unquant));
1574
52.5k
      {
1575
52.5k
         int pit_min, pit_max;
1576
         /* Handle pitch constraints if any */
1577
52.5k
         if (SUBMODE(lbr_pitch) != -1)
1578
21.6k
         {
1579
21.6k
            int margin;
1580
21.6k
            margin = SUBMODE(lbr_pitch);
1581
21.6k
            if (margin)
1582
0
            {
1583
/* GT - need optimization?
1584
               if (ol_pitch < NB_PITCH_START+margin-1)
1585
                  ol_pitch=NB_PITCH_START+margin-1;
1586
               if (ol_pitch > NB_PITCH_END-margin)
1587
                  ol_pitch=NB_PITCH_END-margin;
1588
               pit_min = ol_pitch-margin+1;
1589
               pit_max = ol_pitch+margin;
1590
*/
1591
0
               pit_min = ol_pitch-margin+1;
1592
0
               if (pit_min < NB_PITCH_START)
1593
0
      pit_min = NB_PITCH_START;
1594
0
               pit_max = ol_pitch+margin;
1595
0
               if (pit_max > NB_PITCH_END)
1596
0
      pit_max = NB_PITCH_END;
1597
21.6k
            } else {
1598
21.6k
               pit_min = pit_max = ol_pitch;
1599
21.6k
            }
1600
30.8k
         } else {
1601
30.8k
            pit_min = NB_PITCH_START;
1602
30.8k
            pit_max = NB_PITCH_END;
1603
30.8k
         }
1604
1605
1606
1607
52.5k
         SUBMODE(ltp_unquant)(exc, exc32, pit_min, pit_max, ol_pitch_coef, SUBMODE(ltp_params),
1608
52.5k
                 NB_SUBFRAME_SIZE, &pitch, &pitch_gain[0], bits, stack,
1609
52.5k
                 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
52.5k
         sanitize_values32(exc32, NEG32(QCONST32(32000,SIG_SHIFT-1)), QCONST32(32000,SIG_SHIFT-1), NB_SUBFRAME_SIZE);
1615
1616
52.5k
         tmp = gain_3tap_to_1tap(pitch_gain);
1617
1618
52.5k
         pitch_average += tmp;
1619
52.5k
         if ((tmp>best_pitch_gain&&ABS(2*best_pitch-pitch)>=3&&ABS(3*best_pitch-pitch)>=4&&ABS(4*best_pitch-pitch)>=5)
1620
46.7k
              || (tmp>MULT16_16_Q15(QCONST16(.6,15),best_pitch_gain)&&(ABS(best_pitch-2*pitch)<3||ABS(best_pitch-3*pitch)<4||ABS(best_pitch-4*pitch)<5))
1621
46.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
8.48k
         {
1623
8.48k
            best_pitch = pitch;
1624
8.48k
            if (tmp > best_pitch_gain)
1625
7.99k
               best_pitch_gain = tmp;
1626
8.48k
         }
1627
52.5k
      }
1628
1629
      /* Unquantize the innovation */
1630
52.5k
      {
1631
52.5k
         int q_energy;
1632
52.5k
         spx_word32_t ener;
1633
1634
52.5k
         SPEEX_MEMSET(innov, 0, NB_SUBFRAME_SIZE);
1635
1636
         /* Decode sub-frame gain correction */
1637
52.5k
         if (SUBMODE(have_subframe_gain)==3)
1638
12.6k
         {
1639
12.6k
            q_energy = speex_bits_unpack_unsigned(bits, 3);
1640
12.6k
            ener = MULT16_32_Q14(exc_gain_quant_scal3[q_energy],ol_gain);
1641
39.8k
         } else if (SUBMODE(have_subframe_gain)==1)
1642
18.1k
         {
1643
18.1k
            q_energy = speex_bits_unpack_unsigned(bits, 1);
1644
18.1k
            ener = MULT16_32_Q14(exc_gain_quant_scal1[q_energy],ol_gain);
1645
21.6k
         } else {
1646
21.6k
            ener = ol_gain;
1647
21.6k
         }
1648
1649
52.5k
         speex_assert (SUBMODE(innovation_unquant));
1650
52.5k
         {
1651
            /*Fixed codebook contribution*/
1652
52.5k
            SUBMODE(innovation_unquant)(innov, SUBMODE(innovation_params), NB_SUBFRAME_SIZE, bits, stack, &st->seed);
1653
            /* De-normalize innovation and update excitation */
1654
1655
52.5k
            signal_mul(innov, innov, ener, NB_SUBFRAME_SIZE);
1656
1657
            /* Decode second codebook (only for some modes) */
1658
52.5k
            if (SUBMODE(double_codebook))
1659
4.59k
            {
1660
4.59k
               char *tmp_stack=stack;
1661
4.59k
               VARDECL(spx_sig_t *innov2);
1662
4.59k
               ALLOC(innov2, NB_SUBFRAME_SIZE, spx_sig_t);
1663
4.59k
               SPEEX_MEMSET(innov2, 0, NB_SUBFRAME_SIZE);
1664
4.59k
               SUBMODE(innovation_unquant)(innov2, SUBMODE(innovation_params), NB_SUBFRAME_SIZE, bits, stack, &st->seed);
1665
4.59k
               signal_mul(innov2, innov2, MULT16_32_Q15(QCONST16(0.454545f,15),ener), NB_SUBFRAME_SIZE);
1666
188k
               for (i=0;i<NB_SUBFRAME_SIZE;i++)
1667
183k
                  innov[i] = ADD32(innov[i], innov2[i]);
1668
4.59k
               stack = tmp_stack;
1669
4.59k
            }
1670
2.15M
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
1671
2.10M
               exc[i]=EXTRACT16(SATURATE32(PSHR32(ADD32(SHL32(exc32[i],1),innov[i]),SIG_SHIFT),32767));
1672
            /*print_vec(exc, 40, "innov");*/
1673
52.5k
            if (innov_save)
1674
35.0k
            {
1675
1.43M
               for (i=0;i<NB_SUBFRAME_SIZE;i++)
1676
1.40M
                  innov_save[i] = EXTRACT16(PSHR32(innov[i], SIG_SHIFT));
1677
35.0k
            }
1678
52.5k
         }
1679
1680
         /*Vocoder mode*/
1681
52.5k
         if (st->submodeID==1)
1682
10.4k
         {
1683
10.4k
            spx_word16_t g=ol_pitch_coef;
1684
10.4k
            g=MULT16_16_P14(QCONST16(1.5f,14),(g-QCONST16(.2f,6)));
1685
10.4k
            if (g<0)
1686
6.39k
               g=0;
1687
10.4k
            if (g>GAIN_SCALING)
1688
1.28k
               g=GAIN_SCALING;
1689
1690
10.4k
            SPEEX_MEMSET(exc, 0, NB_SUBFRAME_SIZE);
1691
26.3k
            while (st->voc_offset<NB_SUBFRAME_SIZE)
1692
15.8k
            {
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
15.8k
               if (st->voc_offset>=0)
1696
15.8k
                  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
15.8k
               st->voc_offset+=ol_pitch;
1698
15.8k
            }
1699
10.4k
            st->voc_offset -= NB_SUBFRAME_SIZE;
1700
1701
430k
            for (i=0;i<NB_SUBFRAME_SIZE;i++)
1702
419k
            {
1703
419k
               spx_word16_t exci=exc[i];
1704
419k
               exc[i]= ADD16(ADD16(MULT16_16_Q15(QCONST16(.7f,15),exc[i]) , MULT16_16_Q15(QCONST16(.3f,15),st->voc_m1)),
1705
419k
                             SUB16(MULT16_16_Q15(Q15_ONE-MULT16_16_16(QCONST16(.85f,9),g),EXTRACT16(PSHR32(innov[i],SIG_SHIFT))),
1706
419k
                                   MULT16_16_Q15(MULT16_16_16(QCONST16(.15f,9),g),EXTRACT16(PSHR32(st->voc_m2,SIG_SHIFT)))
1707
419k
                                  ));
1708
419k
               st->voc_m1 = exci;
1709
419k
               st->voc_m2=innov[i];
1710
419k
               st->voc_mean = EXTRACT16(PSHR32(ADD32(MULT16_16(QCONST16(.8f,15),st->voc_mean), MULT16_16(QCONST16(.2f,15),exc[i])), 15));
1711
419k
               exc[i]-=st->voc_mean;
1712
419k
            }
1713
10.4k
         }
1714
1715
52.5k
      }
1716
52.5k
   }
1717
1718
13.1k
   ALLOC(interp_qlsp, NB_ORDER, spx_lsp_t);
1719
1720
13.1k
   if (st->lpc_enh_enabled && SUBMODE(comb_gain)>0 && !st->count_lost)
1721
10.5k
   {
1722
10.5k
      multicomb(st->exc-NB_SUBFRAME_SIZE, out, st->interp_qlpc, NB_ORDER, 2*NB_SUBFRAME_SIZE, best_pitch, 40, SUBMODE(comb_gain), stack);
1723
10.5k
      multicomb(st->exc+NB_SUBFRAME_SIZE, out+2*NB_SUBFRAME_SIZE, st->interp_qlpc, NB_ORDER, 2*NB_SUBFRAME_SIZE, best_pitch, 40, SUBMODE(comb_gain), stack);
1724
10.5k
   } else {
1725
2.62k
      SPEEX_COPY(out, &st->exc[-NB_SUBFRAME_SIZE], NB_FRAME_SIZE);
1726
2.62k
   }
1727
1728
   /* If the last packet was lost, re-scale the excitation to obtain the same energy as encoded in ol_gain */
1729
13.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
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
65.7k
   for (sub=0;sub<NB_NB_SUBFRAMES;sub++)
1754
52.5k
   {
1755
52.5k
      int offset;
1756
52.5k
      spx_word16_t *sp;
1757
1758
      /* Offset relative to start of frame */
1759
52.5k
      offset = NB_SUBFRAME_SIZE*sub;
1760
      /* Original signal */
1761
52.5k
      sp=out+offset;
1762
1763
      /* LSP interpolation (quantized and unquantized) */
1764
52.5k
      lsp_interpolate(st->old_qlsp, qlsp, interp_qlsp, NB_ORDER, sub, NB_NB_SUBFRAMES, LSP_MARGIN);
1765
1766
      /* Compute interpolated LPCs (unquantized) */
1767
52.5k
      lsp_to_lpc(interp_qlsp, ak, NB_ORDER, stack);
1768
1769
      /* Compute analysis filter at w=pi */
1770
52.5k
      {
1771
52.5k
         spx_word32_t pi_g=LPC_SCALING;
1772
315k
         for (i=0;i<NB_ORDER;i+=2)
1773
262k
         {
1774
            /*pi_g += -st->interp_qlpc[i] +  st->interp_qlpc[i+1];*/
1775
262k
            pi_g = ADD32(pi_g, SUB32(EXTEND32(ak[i+1]),EXTEND32(ak[i])));
1776
262k
         }
1777
52.5k
         st->pi_gain[sub] = pi_g;
1778
52.5k
      }
1779
1780
52.5k
      iir_mem16(sp, st->interp_qlpc, sp, NB_SUBFRAME_SIZE, NB_ORDER,
1781
52.5k
                st->mem_sp, stack);
1782
1783
578k
      for (i=0;i<NB_ORDER;i++)
1784
525k
         st->interp_qlpc[i] = ak[i];
1785
1786
52.5k
   }
1787
1788
13.1k
   if (st->highpass_enabled)
1789
13.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
13.1k
   st->level = 1+PSHR32(ol_gain,SIG_SHIFT);
1795
13.1k
   st->max_level = MAX16(MULT16_16_Q15(QCONST16(.99f,15), st->max_level), st->level);
1796
13.1k
   st->min_level = MIN16(ADD16(1,MULT16_16_Q14(QCONST16(1.01f,14), st->min_level)), st->level);
1797
13.1k
   if (st->max_level < st->min_level+1)
1798
4.18k
      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
144k
   for (i=0;i<NB_ORDER;i++)
1803
131k
      st->old_qlsp[i] = qlsp[i];
1804
1805
   /* The next frame will not be the first (Duh!) */
1806
13.1k
   st->first = 0;
1807
13.1k
   st->count_lost=0;
1808
13.1k
   st->last_pitch = best_pitch;
1809
13.1k
#ifdef FIXED_POINT
1810
13.1k
   st->last_pitch_gain = PSHR16(pitch_average,2);
1811
#else
1812
   st->last_pitch_gain = .25*pitch_average;
1813
#endif
1814
13.1k
   st->pitch_gain_buf[st->pitch_gain_buf_idx++] = st->last_pitch_gain;
1815
13.1k
   if (st->pitch_gain_buf_idx > 2) /* rollover */
1816
3.77k
      st->pitch_gain_buf_idx = 0;
1817
1818
13.1k
   st->last_ol_gain = ol_gain;
1819
1820
13.1k
   return 0;
1821
25.2k
}
1822
#endif /* DISABLE_DECODER */
1823