Think DTX now works for wideband too
[speexdsp.git] / libspeex / modes.c
1 /* Copyright (C) 2002 Jean-Marc Valin 
2    File: modes.c
3
4    Describes the different modes of the codec
5
6    Redistribution and use in source and binary forms, with or without
7    modification, are permitted provided that the following conditions
8    are met:
9    
10    - Redistributions of source code must retain the above copyright
11    notice, this list of conditions and the following disclaimer.
12    
13    - Redistributions in binary form must reproduce the above copyright
14    notice, this list of conditions and the following disclaimer in the
15    documentation and/or other materials provided with the distribution.
16    
17    - Neither the name of the Xiph.org Foundation nor the names of its
18    contributors may be used to endorse or promote products derived from
19    this software without specific prior written permission.
20    
21    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22    ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24    A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
25    CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
26    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
27    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
28    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
29    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
33 */
34
35 #include <stdlib.h>
36 #include <stdio.h>
37 #include "modes.h"
38 #include "ltp.h"
39 #include "quant_lsp.h"
40 #include "cb_search.h"
41 #include "sb_celp.h"
42 #include "nb_celp.h"
43 #include "vbr.h"
44
45 SpeexMode *speex_mode_list[SPEEX_NB_MODES] = {&speex_nb_mode, &speex_wb_mode, &speex_uwb_mode};
46
47 /* Extern declarations for all codebooks we use here */
48 extern float gain_cdbk_nb[];
49 extern float gain_cdbk_lbr[];
50 extern float hexc_table[];
51 extern float exc_5_256_table[];
52 extern float exc_5_64_table[];
53 extern float exc_8_128_table[];
54 extern float exc_10_32_table[];
55 extern float exc_10_16_table[];
56 extern float hexc_10_32_table[];
57
58 static void nb_mode_query(void *mode, int request, void *ptr);
59 static void wb_mode_query(void *mode, int request, void *ptr);
60
61 /* Parameters for Long-Term Prediction (LTP)*/
62 static ltp_params ltp_params_nb = {
63    gain_cdbk_nb,
64    7,
65    7
66 };
67
68 /* Parameters for Long-Term Prediction (LTP)*/
69 static ltp_params ltp_params_vlbr = {
70    gain_cdbk_lbr,
71    5,
72    0
73 };
74
75 /* Parameters for Long-Term Prediction (LTP)*/
76 static ltp_params ltp_params_lbr = {
77    gain_cdbk_lbr,
78    5,
79    7
80 };
81
82 /* Parameters for Long-Term Prediction (LTP)*/
83 static ltp_params ltp_params_med = {
84    gain_cdbk_lbr,
85    5,
86    7
87 };
88
89 /* Split-VQ innovation parameters for very low bit-rate narrowband */
90 static split_cb_params split_cb_nb_vlbr = {
91    10,               /*subvect_size*/
92    4,               /*nb_subvect*/
93    exc_10_16_table, /*shape_cb*/
94    4,               /*shape_bits*/
95    0,
96 };
97
98 /* Split-VQ innovation parameters for low bit-rate narrowband */
99 static split_cb_params split_cb_nb_lbr = {
100    10,              /*subvect_size*/
101    4,               /*nb_subvect*/
102    exc_10_32_table, /*shape_cb*/
103    5,               /*shape_bits*/
104    0,
105 };
106
107
108 /* Split-VQ innovation parameters narrowband */
109 static split_cb_params split_cb_nb = {
110    5,               /*subvect_size*/
111    8,               /*nb_subvect*/
112    exc_5_64_table, /*shape_cb*/
113    6,               /*shape_bits*/
114    0,
115 };
116
117 /* Split-VQ innovation parameters narrowband */
118 static split_cb_params split_cb_nb_med = {
119    8,               /*subvect_size*/
120    5,               /*nb_subvect*/
121    exc_8_128_table, /*shape_cb*/
122    7,               /*shape_bits*/
123    0,
124 };
125
126 /* Split-VQ innovation for low-band wideband */
127 static split_cb_params split_cb_sb = {
128    5,               /*subvect_size*/
129    8,              /*nb_subvect*/
130    exc_5_256_table,    /*shape_cb*/
131    8,               /*shape_bits*/
132    0,
133 };
134
135 /* Split-VQ innovation for high-band wideband */
136 static split_cb_params split_cb_high = {
137    8,               /*subvect_size*/
138    5,               /*nb_subvect*/
139    hexc_table,       /*shape_cb*/
140    7,               /*shape_bits*/
141    1,
142 };
143
144
145 /* Split-VQ innovation for high-band wideband */
146 static split_cb_params split_cb_high_lbr = {
147    10,               /*subvect_size*/
148    4,               /*nb_subvect*/
149    hexc_10_32_table,       /*shape_cb*/
150    5,               /*shape_bits*/
151    0,
152 };
153
154 /* 2150 bps "vocoder-like" mode for comfort noise */
155 static SpeexSubmode nb_submode1 = {
156    0,
157    1,
158    1,
159    0,
160    /* LSP quantization */
161    lsp_quant_lbr,
162    lsp_unquant_lbr,
163    /* No pitch quantization */
164    forced_pitch_quant,
165    forced_pitch_unquant,
166    NULL,
167    /* No innovation quantization (noise only) */
168    noise_codebook_quant,
169    noise_codebook_unquant,
170    NULL,
171    0, 0, -1,
172    43
173 };
174
175 /* 5.95 kbps very low bit-rate mode */
176 static SpeexSubmode nb_submode2 = {
177    0,
178    0,
179    0,
180    0,
181    /*LSP quantization*/
182    lsp_quant_lbr,
183    lsp_unquant_lbr,
184    /*No pitch quantization*/
185    pitch_search_3tap,
186    pitch_unquant_3tap,
187    &ltp_params_vlbr,
188    /*Innovation quantization*/
189    split_cb_search_shape_sign,
190    split_cb_shape_sign_unquant,
191    &split_cb_nb_vlbr,
192
193    0.75, 0.6, .6,
194    119
195 };
196
197 /* 8 kbps low bit-rate mode */
198 static SpeexSubmode nb_submode3 = {
199    -1,
200    0,
201    1,
202    0,
203    /*LSP quantization*/
204    lsp_quant_lbr,
205    lsp_unquant_lbr,
206    /*Pitch quantization*/
207    pitch_search_3tap,
208    pitch_unquant_3tap,
209    &ltp_params_lbr,
210    /*Innovation quantization*/
211    split_cb_search_shape_sign,
212    split_cb_shape_sign_unquant,
213    &split_cb_nb_lbr,
214
215    0.75, 0.6, .5,
216    160
217 };
218
219 /* 11 kbps medium bit-rate mode */
220 static SpeexSubmode nb_submode4 = {
221    -1,
222    0,
223    1,
224    0,
225    /*LSP quantization*/
226    lsp_quant_lbr,
227    lsp_unquant_lbr,
228    /*Pitch quantization*/
229    pitch_search_3tap,
230    pitch_unquant_3tap,
231    &ltp_params_med,
232    /*Innovation quantization*/
233    split_cb_search_shape_sign,
234    split_cb_shape_sign_unquant,
235    &split_cb_nb_med,
236
237    0.72, 0.65, .3,
238    220
239 };
240
241 /* 15 kbps high bit-rate mode */
242 static SpeexSubmode nb_submode5 = {
243    -1,
244    0,
245    3,
246    0,
247    /*LSP quantization*/
248    lsp_quant_nb,
249    lsp_unquant_nb,
250    /*Pitch quantization*/
251    pitch_search_3tap,
252    pitch_unquant_3tap,
253    &ltp_params_nb,
254    /*Innovation quantization*/
255    split_cb_search_shape_sign,
256    split_cb_shape_sign_unquant,
257    &split_cb_nb,
258
259    0.7, 0.65, .2,
260    300
261 };
262
263 /* 18.2 high bit-rate mode */
264 static SpeexSubmode nb_submode6 = {
265    -1,
266    0,
267    3,
268    0,
269    /*LSP quantization*/
270    lsp_quant_nb,
271    lsp_unquant_nb,
272    /*Pitch quantization*/
273    pitch_search_3tap,
274    pitch_unquant_3tap,
275    &ltp_params_nb,
276    /*Innovation quantization*/
277    split_cb_search_shape_sign,
278    split_cb_shape_sign_unquant,
279    &split_cb_sb,
280
281    0.68, 0.65, .1,
282    364
283 };
284
285 /* 24.6 kbps high bit-rate mode */
286 static SpeexSubmode nb_submode7 = {
287    -1,
288    0,
289    3,
290    1,
291    /*LSP quantization*/
292    lsp_quant_nb,
293    lsp_unquant_nb,
294    /*Pitch quantization*/
295    pitch_search_3tap,
296    pitch_unquant_3tap,
297    &ltp_params_nb,
298    /*Innovation quantization*/
299    split_cb_search_shape_sign,
300    split_cb_shape_sign_unquant,
301    &split_cb_nb,
302
303    0.65, 0.65, 0,
304    492
305 };
306
307
308 /* Default mode for narrowband */
309 static SpeexNBMode nb_mode = {
310    160,    /*frameSize*/
311    40,     /*subframeSize*/
312    10,     /*lpcSize*/
313    640,    /*bufSize*/
314    17,     /*pitchStart*/
315    144,    /*pitchEnd*/
316    0.9,    /*gamma1*/
317    0.6,    /*gamma2*/
318    .01,   /*lag_factor*/
319    1.0001, /*lpc_floor*/
320    0.0,    /*preemph*/
321    {NULL, &nb_submode1, &nb_submode2, &nb_submode3, &nb_submode4, &nb_submode5, &nb_submode6, &nb_submode7,
322    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
323    5,
324    {1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7}
325 };
326
327
328 /* Default mode for narrowband */
329 SpeexMode speex_nb_mode = {
330    &nb_mode,
331    nb_mode_query,
332    "narrowband",
333    0,
334    4,
335    &nb_encoder_init,
336    &nb_encoder_destroy,
337    &nb_encode,
338    &nb_decoder_init,
339    &nb_decoder_destroy,
340    &nb_decode,
341    &nb_encoder_ctl,
342    &nb_decoder_ctl,
343 };
344
345
346 /* Wideband part */
347
348 static SpeexSubmode wb_submode1 = {
349    0,
350    0,
351    1,
352    0,
353    /*LSP quantization*/
354    lsp_quant_high,
355    lsp_unquant_high,
356    /*Pitch quantization*/
357    NULL,
358    NULL,
359    NULL,
360    /*No innovation quantization*/
361    NULL,
362    NULL,
363    NULL,
364
365    .75, .75, -1,
366    36
367 };
368
369
370 static SpeexSubmode wb_submode2 = {
371    0,
372    0,
373    1,
374    0,
375    /*LSP quantization*/
376    lsp_quant_high,
377    lsp_unquant_high,
378    /*Pitch quantization*/
379    NULL,
380    NULL,
381    NULL,
382    /*Innovation quantization*/
383    split_cb_search_shape_sign,
384    split_cb_shape_sign_unquant,
385    &split_cb_high_lbr,
386
387    .85, .6, -1,
388    112
389 };
390
391
392 static SpeexSubmode wb_submode3 = {
393    0,
394    0,
395    1,
396    0,
397    /*LSP quantization*/
398    lsp_quant_high,
399    lsp_unquant_high,
400    /*Pitch quantization*/
401    NULL,
402    NULL,
403    NULL,
404    /*Innovation quantization*/
405    split_cb_search_shape_sign,
406    split_cb_shape_sign_unquant,
407    &split_cb_high,
408
409    .75, .7, -1,
410    192
411 };
412
413 static SpeexSubmode wb_submode4 = {
414    0,
415    0,
416    1,
417    1,
418    /*LSP quantization*/
419    lsp_quant_high,
420    lsp_unquant_high,
421    /*Pitch quantization*/
422    NULL,
423    NULL,
424    NULL,
425    /*Innovation quantization*/
426    split_cb_search_shape_sign,
427    split_cb_shape_sign_unquant,
428    &split_cb_high,
429
430    .75, .75, -1,
431    352
432 };
433
434
435 /* Split-band wideband CELP mode*/
436 static SpeexSBMode sb_wb_mode = {
437    &speex_nb_mode,
438    160,    /*frameSize*/
439    40,     /*subframeSize*/
440    8,     /*lpcSize*/
441    640,    /*bufSize*/
442    .9,    /*gamma1*/
443    0.6,    /*gamma2*/
444    .002,   /*lag_factor*/
445    1.0001, /*lpc_floor*/
446    0.0,    /*preemph*/
447    {NULL, &wb_submode1, &wb_submode2, &wb_submode3, &wb_submode4, NULL, NULL, NULL},
448    3,
449    {1, 1, 2, 3, 4, 5, 5, 6, 6, 7, 7},
450    {0, 1, 1, 1, 1, 1, 2, 2, 3, 3, 4},
451    vbr_hb_thresh,
452    5
453 };
454
455
456 SpeexMode speex_wb_mode = {
457    &sb_wb_mode,
458    wb_mode_query,
459    "wideband (sub-band CELP)",
460    1,
461    4,
462    &sb_encoder_init,
463    &sb_encoder_destroy,
464    &sb_encode,
465    &sb_decoder_init,
466    &sb_decoder_destroy,
467    &sb_decode,
468    &sb_encoder_ctl,
469    &sb_decoder_ctl,
470 };
471
472
473
474 /* "Ultra-wideband" mode stuff */
475
476
477
478 /* Split-band "ultra-wideband" (32 kbps) CELP mode*/
479 static SpeexSBMode sb_uwb_mode = {
480    &speex_wb_mode,
481    320,    /*frameSize*/
482    80,     /*subframeSize*/
483    8,     /*lpcSize*/
484    1280,    /*bufSize*/
485    .9,    /*gamma1*/
486    0.6,    /*gamma2*/
487    .002,   /*lag_factor*/
488    1.0001, /*lpc_floor*/
489    0.0,    /*preemph*/
490    {NULL, &wb_submode1, NULL, NULL, NULL, NULL, NULL, NULL},
491    1,
492    {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
493    {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
494    vbr_uhb_thresh,
495    2
496 };
497
498
499 SpeexMode speex_uwb_mode = {
500    &sb_uwb_mode,
501    wb_mode_query,
502    "ultra-wideband (sub-band CELP)",
503    2,
504    4,
505    &sb_encoder_init,
506    &sb_encoder_destroy,
507    &sb_encode,
508    &sb_decoder_init,
509    &sb_decoder_destroy,
510    &sb_decode,
511    &sb_encoder_ctl,
512    &sb_decoder_ctl,
513 };
514
515
516
517
518 void *speex_encoder_init(SpeexMode *mode)
519 {
520    return mode->enc_init(mode);
521 }
522
523 void *speex_decoder_init(SpeexMode *mode)
524 {
525    return mode->dec_init(mode);
526 }
527
528 void speex_encoder_destroy(void *state)
529 {
530    (*((SpeexMode**)state))->enc_destroy(state);
531 }
532
533 void speex_encode(void *state, float *in, SpeexBits *bits)
534 {
535    (*((SpeexMode**)state))->enc(state, in, bits);
536 }
537
538 void speex_decoder_destroy(void *state)
539 {
540    (*((SpeexMode**)state))->dec_destroy(state);
541 }
542
543 int speex_decode(void *state, SpeexBits *bits, float *out)
544 {
545    return (*((SpeexMode**)state))->dec(state, bits, out);
546 }
547
548
549 void speex_encoder_ctl(void *state, int request, void *ptr)
550 {
551    (*((SpeexMode**)state))->enc_ctl(state, request, ptr);
552 }
553
554 void speex_decoder_ctl(void *state, int request, void *ptr)
555 {
556    (*((SpeexMode**)state))->dec_ctl(state, request, ptr);
557 }
558
559
560
561 static void nb_mode_query(void *mode, int request, void *ptr)
562 {
563    SpeexNBMode *m = (SpeexNBMode*)mode;
564    
565    switch (request)
566    {
567    case SPEEX_MODE_FRAME_SIZE:
568       *((int*)ptr)=m->frameSize;
569       break;
570    case SPEEX_SUBMODE_BITS_PER_FRAME:
571       *((int*)ptr) = m->submodes[*((int*)ptr)]->bits_per_frame;
572       break;
573    default:
574       fprintf(stderr, "Unknown wb_mode_query request: %d\n", request);
575    }
576
577 }
578
579 static void wb_mode_query(void *mode, int request, void *ptr)
580 {
581    SpeexSBMode *m = (SpeexSBMode*)mode;
582
583    switch (request)
584    {
585    case SPEEX_MODE_FRAME_SIZE:
586       *((int*)ptr)=m->frameSize;
587       break;
588    case SPEEX_SUBMODE_BITS_PER_FRAME:
589       *((int*)ptr) = m->submodes[*((int*)ptr)]->bits_per_frame;
590       break;
591    default:
592       fprintf(stderr, "Unknown wb_mode_query request: %d\n", request);
593    }
594 }
595
596
597 void speex_mode_query(SpeexMode *mode, int request, void *ptr)
598 {
599    mode->query(mode->mode, request, ptr);
600 }