applied symbian related config and casting diffs from Colin Ward
[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 #ifdef HAVE_CONFIG_H
36 #include "config.h"
37 #endif
38
39 #include "modes.h"
40 #include "ltp.h"
41 #include "quant_lsp.h"
42 #include "cb_search.h"
43 #include "sb_celp.h"
44 #include "nb_celp.h"
45 #include "vbr.h"
46 #include "misc.h"
47 #include <math.h>
48
49 #ifndef NULL
50 #define NULL 0
51 #endif
52
53 #define MAX_IN_SAMPLES 640
54
55 const SpeexMode * const speex_mode_list[SPEEX_NB_MODES] = {&speex_nb_mode, &speex_wb_mode, &speex_uwb_mode};
56
57 /* Extern declarations for all codebooks we use here */
58 extern const signed char gain_cdbk_nb[];
59 extern const signed char gain_cdbk_lbr[];
60 extern const signed char hexc_table[];
61 extern const signed char exc_5_256_table[];
62 extern const signed char exc_5_64_table[];
63 extern const signed char exc_8_128_table[];
64 extern const signed char exc_10_32_table[];
65 extern const signed char exc_10_16_table[];
66 extern const signed char exc_20_32_table[];
67 extern const signed char hexc_10_32_table[];
68
69
70 /* Parameters for Long-Term Prediction (LTP)*/
71 static const ltp_params ltp_params_nb = {
72    gain_cdbk_nb,
73    7,
74    7
75 };
76
77 /* Parameters for Long-Term Prediction (LTP)*/
78 static const ltp_params ltp_params_vlbr = {
79    gain_cdbk_lbr,
80    5,
81    0
82 };
83
84 /* Parameters for Long-Term Prediction (LTP)*/
85 static const ltp_params ltp_params_lbr = {
86    gain_cdbk_lbr,
87    5,
88    7
89 };
90
91 /* Parameters for Long-Term Prediction (LTP)*/
92 static const ltp_params ltp_params_med = {
93    gain_cdbk_lbr,
94    5,
95    7
96 };
97
98 /* Split-VQ innovation parameters for very low bit-rate narrowband */
99 static const split_cb_params split_cb_nb_vlbr = {
100    10,               /*subvect_size*/
101    4,               /*nb_subvect*/
102    exc_10_16_table, /*shape_cb*/
103    4,               /*shape_bits*/
104    0,
105 };
106
107 /* Split-VQ innovation parameters for very low bit-rate narrowband */
108 static const split_cb_params split_cb_nb_ulbr = {
109    20,               /*subvect_size*/
110    2,               /*nb_subvect*/
111    exc_20_32_table, /*shape_cb*/
112    5,               /*shape_bits*/
113    0,
114 };
115
116 /* Split-VQ innovation parameters for low bit-rate narrowband */
117 static const split_cb_params split_cb_nb_lbr = {
118    10,              /*subvect_size*/
119    4,               /*nb_subvect*/
120    exc_10_32_table, /*shape_cb*/
121    5,               /*shape_bits*/
122    0,
123 };
124
125
126 /* Split-VQ innovation parameters narrowband */
127 static const split_cb_params split_cb_nb = {
128    5,               /*subvect_size*/
129    8,               /*nb_subvect*/
130    exc_5_64_table, /*shape_cb*/
131    6,               /*shape_bits*/
132    0,
133 };
134
135 /* Split-VQ innovation parameters narrowband */
136 static const split_cb_params split_cb_nb_med = {
137    8,               /*subvect_size*/
138    5,               /*nb_subvect*/
139    exc_8_128_table, /*shape_cb*/
140    7,               /*shape_bits*/
141    0,
142 };
143
144 /* Split-VQ innovation for low-band wideband */
145 static const split_cb_params split_cb_sb = {
146    5,               /*subvect_size*/
147    8,              /*nb_subvect*/
148    exc_5_256_table,    /*shape_cb*/
149    8,               /*shape_bits*/
150    0,
151 };
152
153 /* Split-VQ innovation for high-band wideband */
154 static const split_cb_params split_cb_high = {
155    8,               /*subvect_size*/
156    5,               /*nb_subvect*/
157    hexc_table,       /*shape_cb*/
158    7,               /*shape_bits*/
159    1,
160 };
161
162
163 /* Split-VQ innovation for high-band wideband */
164 static const split_cb_params split_cb_high_lbr = {
165    10,               /*subvect_size*/
166    4,               /*nb_subvect*/
167    hexc_10_32_table,       /*shape_cb*/
168    5,               /*shape_bits*/
169    0,
170 };
171
172 /* 2150 bps "vocoder-like" mode for comfort noise */
173 static const SpeexSubmode nb_submode1 = {
174    0,
175    1,
176    0,
177    0,
178    /* LSP quantization */
179    lsp_quant_lbr,
180    lsp_unquant_lbr,
181    /* No pitch quantization */
182    forced_pitch_quant,
183    forced_pitch_unquant,
184    NULL,
185    /* No innovation quantization (noise only) */
186    noise_codebook_quant,
187    noise_codebook_unquant,
188    NULL,
189 #ifdef FIXED_POINT
190    22938, 22938, 0, -1,
191 #else
192    .7, .7, 0, -1,
193 #endif
194    43
195 };
196
197 /* 3.95 kbps very low bit-rate mode */
198 static const SpeexSubmode nb_submode8 = {
199    0,
200    1,
201    0,
202    0,
203    /*LSP quantization*/
204    lsp_quant_lbr,
205    lsp_unquant_lbr,
206    /*No pitch quantization*/
207    forced_pitch_quant,
208    forced_pitch_unquant,
209    NULL,
210    /*Innovation quantization*/
211    split_cb_search_shape_sign,
212    split_cb_shape_sign_unquant,
213    &split_cb_nb_ulbr,
214 #ifdef FIXED_POINT
215    22938, 16384, 11796, 21299,
216 #else
217    0.7, 0.5, .36, .65,
218 #endif
219    79
220 };
221
222 /* 5.95 kbps very low bit-rate mode */
223 static const SpeexSubmode nb_submode2 = {
224    0,
225    0,
226    0,
227    0,
228    /*LSP quantization*/
229    lsp_quant_lbr,
230    lsp_unquant_lbr,
231    /*No pitch quantization*/
232    pitch_search_3tap,
233    pitch_unquant_3tap,
234    &ltp_params_vlbr,
235    /*Innovation quantization*/
236    split_cb_search_shape_sign,
237    split_cb_shape_sign_unquant,
238    &split_cb_nb_vlbr,
239 #ifdef FIXED_POINT
240    22938, 16384, 11796, 18022,
241 #else
242    0.7, 0.5, .36, .55,
243 #endif
244    119
245 };
246
247 /* 8 kbps low bit-rate mode */
248 static const SpeexSubmode nb_submode3 = {
249    -1,
250    0,
251    1,
252    0,
253    /*LSP quantization*/
254    lsp_quant_lbr,
255    lsp_unquant_lbr,
256    /*Pitch quantization*/
257    pitch_search_3tap,
258    pitch_unquant_3tap,
259    &ltp_params_lbr,
260    /*Innovation quantization*/
261    split_cb_search_shape_sign,
262    split_cb_shape_sign_unquant,
263    &split_cb_nb_lbr,
264 #ifdef FIXED_POINT
265    22938, 18022, 9830, 14746,
266 #else
267    0.7, 0.55, .30, .45,
268 #endif
269    160
270 };
271
272 /* 11 kbps medium bit-rate mode */
273 static const SpeexSubmode nb_submode4 = {
274    -1,
275    0,
276    1,
277    0,
278    /*LSP quantization*/
279    lsp_quant_lbr,
280    lsp_unquant_lbr,
281    /*Pitch quantization*/
282    pitch_search_3tap,
283    pitch_unquant_3tap,
284    &ltp_params_med,
285    /*Innovation quantization*/
286    split_cb_search_shape_sign,
287    split_cb_shape_sign_unquant,
288    &split_cb_nb_med,
289 #ifdef FIXED_POINT
290    22938, 20644, 5243, 11469,
291 #else
292    0.7, 0.63, .16, .35,
293 #endif
294    220
295 };
296
297 /* 15 kbps high bit-rate mode */
298 static const SpeexSubmode nb_submode5 = {
299    -1,
300    0,
301    3,
302    0,
303    /*LSP quantization*/
304    lsp_quant_nb,
305    lsp_unquant_nb,
306    /*Pitch quantization*/
307    pitch_search_3tap,
308    pitch_unquant_3tap,
309    &ltp_params_nb,
310    /*Innovation quantization*/
311    split_cb_search_shape_sign,
312    split_cb_shape_sign_unquant,
313    &split_cb_nb,
314 #ifdef FIXED_POINT
315    22938, 21299, 3932, 8192,
316 #else
317    0.7, 0.65, .12, .25,
318 #endif
319    300
320 };
321
322 /* 18.2 high bit-rate mode */
323 static const SpeexSubmode nb_submode6 = {
324    -1,
325    0,
326    3,
327    0,
328    /*LSP quantization*/
329    lsp_quant_nb,
330    lsp_unquant_nb,
331    /*Pitch quantization*/
332    pitch_search_3tap,
333    pitch_unquant_3tap,
334    &ltp_params_nb,
335    /*Innovation quantization*/
336    split_cb_search_shape_sign,
337    split_cb_shape_sign_unquant,
338    &split_cb_sb,
339 #ifdef FIXED_POINT
340    22282, 21299, 2294, 3277,
341 #else
342    0.68, 0.65, .07, .1,
343 #endif
344    364
345 };
346
347 /* 24.6 kbps high bit-rate mode */
348 static const SpeexSubmode nb_submode7 = {
349    -1,
350    0,
351    3,
352    1,
353    /*LSP quantization*/
354    lsp_quant_nb,
355    lsp_unquant_nb,
356    /*Pitch quantization*/
357    pitch_search_3tap,
358    pitch_unquant_3tap,
359    &ltp_params_nb,
360    /*Innovation quantization*/
361    split_cb_search_shape_sign,
362    split_cb_shape_sign_unquant,
363    &split_cb_nb,
364 #ifdef FIXED_POINT
365    21299, 21299, 0, -1,
366 #else
367    0.65, 0.65, .0, -1,
368 #endif
369    492
370 };
371
372
373 /* Default mode for narrowband */
374 static const SpeexNBMode nb_mode = {
375    160,    /*frameSize*/
376    40,     /*subframeSize*/
377    10,     /*lpcSize*/
378    640,    /*bufSize*/
379    17,     /*pitchStart*/
380    144,    /*pitchEnd*/
381 #ifdef FIXED_POINT
382    29491, 19661, /* gamma1, gamma2 */
383 #else
384    0.9, 0.6, /* gamma1, gamma2 */
385 #endif
386    .012,   /*lag_factor*/
387    1.0002, /*lpc_floor*/
388 #ifdef EPIC_48K
389    0,
390 #endif
391    {NULL, &nb_submode1, &nb_submode2, &nb_submode3, &nb_submode4, &nb_submode5, &nb_submode6, &nb_submode7,
392    &nb_submode8, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
393    5,
394    {1, 8, 2, 3, 3, 4, 4, 5, 5, 6, 7}
395 };
396
397
398 /* Default mode for narrowband */
399 const SpeexMode speex_nb_mode = {
400    &nb_mode,
401    nb_mode_query,
402    "narrowband",
403    0,
404    4,
405    &nb_encoder_init,
406    &nb_encoder_destroy,
407    &nb_encode,
408    &nb_decoder_init,
409    &nb_decoder_destroy,
410    &nb_decode,
411    &nb_encoder_ctl,
412    &nb_decoder_ctl,
413 };
414
415
416 /* Wideband part */
417
418 static const SpeexSubmode wb_submode1 = {
419    0,
420    0,
421    1,
422    0,
423    /*LSP quantization*/
424    lsp_quant_high,
425    lsp_unquant_high,
426    /*Pitch quantization*/
427    NULL,
428    NULL,
429    NULL,
430    /*No innovation quantization*/
431    NULL,
432    NULL,
433    NULL,
434 #ifdef FIXED_POINT
435    24576, 24576, 0, -1,
436 #else
437    .75, .75, .0, -1,
438 #endif
439    36
440 };
441
442
443 static const SpeexSubmode wb_submode2 = {
444    0,
445    0,
446    1,
447    0,
448    /*LSP quantization*/
449    lsp_quant_high,
450    lsp_unquant_high,
451    /*Pitch quantization*/
452    NULL,
453    NULL,
454    NULL,
455    /*Innovation quantization*/
456    split_cb_search_shape_sign,
457    split_cb_shape_sign_unquant,
458    &split_cb_high_lbr,
459 #ifdef FIXED_POINT
460    27853, 19661, 8192, -1,
461 #else
462    .85, .6, .25, -1,
463 #endif
464    112
465 };
466
467
468 static const SpeexSubmode wb_submode3 = {
469    0,
470    0,
471    1,
472    0,
473    /*LSP quantization*/
474    lsp_quant_high,
475    lsp_unquant_high,
476    /*Pitch quantization*/
477    NULL,
478    NULL,
479    NULL,
480    /*Innovation quantization*/
481    split_cb_search_shape_sign,
482    split_cb_shape_sign_unquant,
483    &split_cb_high,
484
485 #ifdef FIXED_POINT
486    24576, 22938, 1638, -1,
487 #else
488    .75, .7, .05, -1,
489 #endif
490    192
491 };
492
493 static const SpeexSubmode wb_submode4 = {
494    0,
495    0,
496    1,
497    1,
498    /*LSP quantization*/
499    lsp_quant_high,
500    lsp_unquant_high,
501    /*Pitch quantization*/
502    NULL,
503    NULL,
504    NULL,
505    /*Innovation quantization*/
506    split_cb_search_shape_sign,
507    split_cb_shape_sign_unquant,
508    &split_cb_high,
509 #ifdef FIXED_POINT
510    24576, 24576, 0, -1,
511 #else
512    .75, .75, .0, -1,
513 #endif
514    352
515 };
516
517
518 /* Split-band wideband CELP mode*/
519 static const SpeexSBMode sb_wb_mode = {
520    &speex_nb_mode,
521    160,    /*frameSize*/
522    40,     /*subframeSize*/
523    8,     /*lpcSize*/
524    640,    /*bufSize*/
525 #ifdef FIXED_POINT
526    29491, 19661, /* gamma1, gamma2 */
527 #else
528    0.9, 0.6, /* gamma1, gamma2 */
529 #endif
530    .001,   /*lag_factor*/
531    1.0001, /*lpc_floor*/
532    0.9,
533    {NULL, &wb_submode1, &wb_submode2, &wb_submode3, &wb_submode4, NULL, NULL, NULL},
534    3,
535    {1, 8, 2, 3, 4, 5, 5, 6, 6, 7, 7},
536    {1, 1, 1, 1, 1, 1, 2, 2, 3, 3, 4},
537    vbr_hb_thresh,
538    5
539 };
540
541
542 const SpeexMode speex_wb_mode = {
543    &sb_wb_mode,
544    wb_mode_query,
545    "wideband (sub-band CELP)",
546    1,
547    4,
548    &sb_encoder_init,
549    &sb_encoder_destroy,
550    &sb_encode,
551    &sb_decoder_init,
552    &sb_decoder_destroy,
553    &sb_decode,
554    &sb_encoder_ctl,
555    &sb_decoder_ctl,
556 };
557
558
559
560 /* "Ultra-wideband" mode stuff */
561
562
563
564 /* Split-band "ultra-wideband" (32 kbps) CELP mode*/
565 static const SpeexSBMode sb_uwb_mode = {
566    &speex_wb_mode,
567    320,    /*frameSize*/
568    80,     /*subframeSize*/
569    8,     /*lpcSize*/
570    1280,    /*bufSize*/
571 #ifdef FIXED_POINT
572    29491, 19661, /* gamma1, gamma2 */
573 #else
574    0.9, 0.6, /* gamma1, gamma2 */
575 #endif
576    .002,   /*lag_factor*/
577    1.0001, /*lpc_floor*/
578    0.7,
579    {NULL, &wb_submode1, NULL, NULL, NULL, NULL, NULL, NULL},
580    1,
581    {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
582    {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
583    vbr_uhb_thresh,
584    2
585 };
586
587
588 const SpeexMode speex_uwb_mode = {
589    &sb_uwb_mode,
590    wb_mode_query,
591    "ultra-wideband (sub-band CELP)",
592    2,
593    4,
594    &sb_encoder_init,
595    &sb_encoder_destroy,
596    &sb_encode,
597    &sb_decoder_init,
598    &sb_decoder_destroy,
599    &sb_decode,
600    &sb_encoder_ctl,
601    &sb_decoder_ctl,
602 };
603
604
605
606
607 #ifdef EPIC_48K
608
609 extern const signed char gain_cdbk_ulbr[];
610 extern const signed char exc_12_32_table[];
611
612 /* Parameters for Long-Term Prediction (LTP)*/
613 static const ltp_params ltp_params_48k = {
614    gain_cdbk_ulbr,
615    3,
616    0
617 };
618
619 static const split_cb_params split_cb_nb_48k = {
620    12,               /*subvect_size*/
621    4,               /*nb_subvect*/
622    exc_12_32_table, /*shape_cb*/
623    5,               /*shape_bits*/
624    0,
625 };
626
627
628 /* 4.8 kbps very low bit-rate mode */
629 static const SpeexSubmode nb_48k_submode = {
630    0,
631    0,
632    0,
633    0,
634    /*LSP quantization*/
635    lsp_quant_48k,
636    lsp_unquant_48k,
637    /*No pitch quantization*/
638    pitch_search_3tap,
639    pitch_unquant_3tap,
640    &ltp_params_48k,
641    /*Innovation quantization*/
642    split_cb_search_shape_sign,
643    split_cb_shape_sign_unquant,
644    &split_cb_nb_48k,
645 #ifdef FIXED_POINT
646    22938, 16384, 11796, 18022,
647 #else
648    0.7, 0.5, .36, .55,
649 #endif
650    144
651 };
652
653
654 /* Special, non-standard 4.8 kbps mode */
655 static const SpeexNBMode nb_48k_mode = {
656    240,    /*frameSize*/
657    48,     /*subframeSize*/
658    10,     /*lpcSize*/
659    640,    /*bufSize*/
660    17,     /*pitchStart*/
661    144,    /*pitchEnd*/
662    0.9,    /*gamma1*/
663    0.6,    /*gamma2*/
664    .01,   /*lag_factor*/
665    1.0003, /*lpc_floor*/
666    1,
667    {NULL, NULL, &nb_48k_submode, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
668    2,
669    {2,2,2,2,2,2,2,2,2,2,2}
670 };
671
672
673 /* Default mode for narrowband */
674 const SpeexMode speex_nb_48k_mode = {
675    &nb_48k_mode,
676    nb_mode_query,
677    "narrowband 4.8 kbps",
678    1000,
679    4,
680    &nb_encoder_init,
681    &nb_encoder_destroy,
682    &nb_encode,
683    &nb_decoder_init,
684    &nb_decoder_destroy,
685    &nb_decode,
686    &nb_encoder_ctl,
687    &nb_decoder_ctl,
688 };
689
690
691 #endif
692
693 int speex_mode_query(const SpeexMode *mode, int request, void *ptr)
694 {
695    return mode->query(mode->mode, request, ptr);
696 }
697
698 const SpeexMode * const speex_lib_get_mode (int mode)
699 {
700 #ifdef EPIC_48K
701   if (mode == SPEEX_MODEID_NB_48K) return &speex_nb_48k_mode;
702 #endif
703
704   if (mode < 0 || mode > SPEEX_NB_MODES) return NULL;
705
706   return speex_mode_list[mode];
707 }