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