Fixed a couple stupid bugs
[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
44 SpeexMode *speex_mode_list[SPEEX_NB_MODES] = {&speex_nb_mode, &speex_wb_mode, &speex_uwb_mode};
45
46 /* Extern declarations for all codebooks we use here */
47 extern float gain_cdbk_nb[];
48 extern float gain_cdbk_lbr[];
49 extern float hexc_table[];
50 extern float exc_5_256_table[];
51 extern float exc_5_64_table[];
52 extern float exc_8_128_table[];
53 extern float exc_10_32_table[];
54 extern float exc_10_16_table[];
55 extern float hexc_10_32_table[];
56
57 static void nb_mode_query(void *mode, int request, void *ptr);
58 static void wb_mode_query(void *mode, int request, void *ptr);
59
60 /* Parameters for Long-Term Prediction (LTP)*/
61 static ltp_params ltp_params_nb = {
62    gain_cdbk_nb,
63    7,
64    7
65 };
66
67 /* Parameters for Long-Term Prediction (LTP)*/
68 static ltp_params ltp_params_vlbr = {
69    gain_cdbk_lbr,
70    5,
71    0
72 };
73
74 /* Parameters for Long-Term Prediction (LTP)*/
75 static ltp_params ltp_params_lbr = {
76    gain_cdbk_lbr,
77    5,
78    7
79 };
80
81 /* Parameters for Long-Term Prediction (LTP)*/
82 static ltp_params ltp_params_med = {
83    gain_cdbk_lbr,
84    5,
85    7
86 };
87
88 /* Split-VQ innovation parameters for very low bit-rate narrowband */
89 static split_cb_params split_cb_nb_vlbr = {
90    10,               /*subvect_size*/
91    4,               /*nb_subvect*/
92    exc_10_16_table, /*shape_cb*/
93    4,               /*shape_bits*/
94    0,
95 };
96
97 /* Split-VQ innovation parameters for low bit-rate narrowband */
98 static split_cb_params split_cb_nb_lbr = {
99    10,              /*subvect_size*/
100    4,               /*nb_subvect*/
101    exc_10_32_table, /*shape_cb*/
102    5,               /*shape_bits*/
103    0,
104 };
105
106
107 /* Split-VQ innovation parameters narrowband */
108 static split_cb_params split_cb_nb = {
109    5,               /*subvect_size*/
110    8,               /*nb_subvect*/
111    exc_5_64_table, /*shape_cb*/
112    6,               /*shape_bits*/
113    0,
114 };
115
116 /* Split-VQ innovation parameters narrowband */
117 static split_cb_params split_cb_nb_med = {
118    8,               /*subvect_size*/
119    5,               /*nb_subvect*/
120    exc_8_128_table, /*shape_cb*/
121    7,               /*shape_bits*/
122    0,
123 };
124
125 /* Split-VQ innovation for low-band wideband */
126 static split_cb_params split_cb_sb = {
127    5,               /*subvect_size*/
128    8,              /*nb_subvect*/
129    exc_5_256_table,    /*shape_cb*/
130    8,               /*shape_bits*/
131    0,
132 };
133
134 /* Split-VQ innovation for high-band wideband */
135 static split_cb_params split_cb_high = {
136    8,               /*subvect_size*/
137    5,               /*nb_subvect*/
138    hexc_table,       /*shape_cb*/
139    7,               /*shape_bits*/
140    1,
141 };
142
143
144 /* Split-VQ innovation for high-band wideband */
145 static split_cb_params split_cb_high_lbr = {
146    10,               /*subvect_size*/
147    4,               /*nb_subvect*/
148    hexc_10_32_table,       /*shape_cb*/
149    5,               /*shape_bits*/
150    0,
151 };
152
153 /* 2150 bps "vocoder-like" mode for comfort noise */
154 static SpeexSubmode nb_submode1 = {
155    0,
156    1,
157    1,
158    0,
159    /* LSP quantization */
160    lsp_quant_lbr,
161    lsp_unquant_lbr,
162    /* No pitch quantization */
163    forced_pitch_quant,
164    forced_pitch_unquant,
165    NULL,
166    /* No innovation quantization (noise only) */
167    noise_codebook_quant,
168    noise_codebook_unquant,
169    NULL,
170    0, 0, -1,
171    43
172 };
173
174 /* 5.95 kbps very low bit-rate mode */
175 static SpeexSubmode nb_submode2 = {
176    0,
177    0,
178    0,
179    0,
180    /*LSP quantization*/
181    lsp_quant_lbr,
182    lsp_unquant_lbr,
183    /*No pitch quantization*/
184    pitch_search_3tap,
185    pitch_unquant_3tap,
186    &ltp_params_vlbr,
187    /*Innovation quantization*/
188    split_cb_search_shape_sign,
189    split_cb_shape_sign_unquant,
190    &split_cb_nb_vlbr,
191
192    0.75, 0.6, .6,
193    119
194 };
195
196 /* 8 kbps low bit-rate mode */
197 static SpeexSubmode nb_submode3 = {
198    -1,
199    0,
200    1,
201    0,
202    /*LSP quantization*/
203    lsp_quant_lbr,
204    lsp_unquant_lbr,
205    /*Pitch quantization*/
206    pitch_search_3tap,
207    pitch_unquant_3tap,
208    &ltp_params_lbr,
209    /*Innovation quantization*/
210    split_cb_search_shape_sign,
211    split_cb_shape_sign_unquant,
212    &split_cb_nb_lbr,
213
214    0.75, 0.6, .5,
215    160
216 };
217
218 /* 11 kbps medium bit-rate mode */
219 static SpeexSubmode nb_submode4 = {
220    -1,
221    0,
222    1,
223    0,
224    /*LSP quantization*/
225    lsp_quant_lbr,
226    lsp_unquant_lbr,
227    /*Pitch quantization*/
228    pitch_search_3tap,
229    pitch_unquant_3tap,
230    &ltp_params_med,
231    /*Innovation quantization*/
232    split_cb_search_shape_sign,
233    split_cb_shape_sign_unquant,
234    &split_cb_nb_med,
235
236    0.72, 0.65, .3,
237    220
238 };
239
240 /* 15 kbps high bit-rate mode */
241 static SpeexSubmode nb_submode5 = {
242    -1,
243    0,
244    3,
245    0,
246    /*LSP quantization*/
247    lsp_quant_nb,
248    lsp_unquant_nb,
249    /*Pitch quantization*/
250    pitch_search_3tap,
251    pitch_unquant_3tap,
252    &ltp_params_nb,
253    /*Innovation quantization*/
254    split_cb_search_shape_sign,
255    split_cb_shape_sign_unquant,
256    &split_cb_nb,
257
258    0.7, 0.65, .2,
259    300
260 };
261
262 /* 18.2 high bit-rate mode */
263 static SpeexSubmode nb_submode6 = {
264    -1,
265    0,
266    3,
267    0,
268    /*LSP quantization*/
269    lsp_quant_nb,
270    lsp_unquant_nb,
271    /*Pitch quantization*/
272    pitch_search_3tap,
273    pitch_unquant_3tap,
274    &ltp_params_nb,
275    /*Innovation quantization*/
276    split_cb_search_shape_sign,
277    split_cb_shape_sign_unquant,
278    &split_cb_sb,
279
280    0.68, 0.65, .1,
281    364
282 };
283
284 /* 24.6 kbps high bit-rate mode */
285 static SpeexSubmode nb_submode7 = {
286    -1,
287    0,
288    3,
289    1,
290    /*LSP quantization*/
291    lsp_quant_nb,
292    lsp_unquant_nb,
293    /*Pitch quantization*/
294    pitch_search_3tap,
295    pitch_unquant_3tap,
296    &ltp_params_nb,
297    /*Innovation quantization*/
298    split_cb_search_shape_sign,
299    split_cb_shape_sign_unquant,
300    &split_cb_nb,
301
302    0.65, 0.65, 0,
303    492
304 };
305
306
307 /* Default mode for narrowband */
308 static SpeexNBMode nb_mode = {
309    160,    /*frameSize*/
310    40,     /*subframeSize*/
311    10,     /*lpcSize*/
312    640,    /*bufSize*/
313    17,     /*pitchStart*/
314    144,    /*pitchEnd*/
315    0.9,    /*gamma1*/
316    0.6,    /*gamma2*/
317    .01,   /*lag_factor*/
318    1.0001, /*lpc_floor*/
319    0.0,    /*preemph*/
320    {NULL, &nb_submode1, &nb_submode2, &nb_submode3, &nb_submode4, &nb_submode5, &nb_submode6, &nb_submode7,
321    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
322    5
323 };
324
325
326 /* Default mode for narrowband */
327 SpeexMode speex_nb_mode = {
328    &nb_mode,
329    nb_mode_query,
330    "narrowband",
331    0,
332    4,
333    &nb_encoder_init,
334    &nb_encoder_destroy,
335    &nb_encode,
336    &nb_decoder_init,
337    &nb_decoder_destroy,
338    &nb_decode,
339    &nb_encoder_ctl,
340    &nb_decoder_ctl,
341 };
342
343
344 /* Wideband part */
345
346 static SpeexSubmode wb_submode1 = {
347    0,
348    0,
349    1,
350    0,
351    /*LSP quantization*/
352    lsp_quant_high,
353    lsp_unquant_high,
354    /*Pitch quantization*/
355    NULL,
356    NULL,
357    NULL,
358    /*No innovation quantization*/
359    NULL,
360    NULL,
361    NULL,
362
363    0, 0, -1,
364    36
365 };
366
367
368 static SpeexSubmode wb_submode2 = {
369    0,
370    0,
371    1,
372    0,
373    /*LSP quantization*/
374    lsp_quant_high,
375    lsp_unquant_high,
376    /*Pitch quantization*/
377    NULL,
378    NULL,
379    NULL,
380    /*Innovation quantization*/
381    split_cb_search_shape_sign,
382    split_cb_shape_sign_unquant,
383    &split_cb_high_lbr,
384
385    0, 0, -1,
386    112
387 };
388
389
390 static SpeexSubmode wb_submode3 = {
391    0,
392    0,
393    1,
394    0,
395    /*LSP quantization*/
396    lsp_quant_high,
397    lsp_unquant_high,
398    /*Pitch quantization*/
399    NULL,
400    NULL,
401    NULL,
402    /*Innovation quantization*/
403    split_cb_search_shape_sign,
404    split_cb_shape_sign_unquant,
405    &split_cb_high,
406
407    0, 0, -1,
408    192
409 };
410
411 static SpeexSubmode wb_submode4 = {
412    0,
413    0,
414    1,
415    1,
416    /*LSP quantization*/
417    lsp_quant_high,
418    lsp_unquant_high,
419    /*Pitch quantization*/
420    NULL,
421    NULL,
422    NULL,
423    /*Innovation quantization*/
424    split_cb_search_shape_sign,
425    split_cb_shape_sign_unquant,
426    &split_cb_high,
427
428    0, 0, -1,
429    352
430 };
431
432
433 /* Split-band wideband CELP mode*/
434 static SpeexSBMode sb_wb_mode = {
435    &speex_nb_mode,
436    160,    /*frameSize*/
437    40,     /*subframeSize*/
438    8,     /*lpcSize*/
439    640,    /*bufSize*/
440    .9,    /*gamma1*/
441    0.6,    /*gamma2*/
442    .002,   /*lag_factor*/
443    1.0001, /*lpc_floor*/
444    0.0,    /*preemph*/
445    {NULL, &wb_submode1, &wb_submode2, &wb_submode3, &wb_submode4, NULL, NULL, NULL},
446    3
447 };
448
449
450 SpeexMode speex_wb_mode = {
451    &sb_wb_mode,
452    wb_mode_query,
453    "wideband (sub-band CELP)",
454    1,
455    4,
456    &sb_encoder_init,
457    &sb_encoder_destroy,
458    &sb_encode,
459    &sb_decoder_init,
460    &sb_decoder_destroy,
461    &sb_decode,
462    &sb_encoder_ctl,
463    &sb_decoder_ctl,
464 };
465
466
467
468 /* "Ultra-wideband" mode stuff */
469
470
471
472 /* Split-band "ultra-wideband" (32 kbps) CELP mode*/
473 static SpeexSBMode sb_uwb_mode = {
474    &speex_wb_mode,
475    320,    /*frameSize*/
476    80,     /*subframeSize*/
477    8,     /*lpcSize*/
478    1280,    /*bufSize*/
479    .9,    /*gamma1*/
480    0.6,    /*gamma2*/
481    .002,   /*lag_factor*/
482    1.0001, /*lpc_floor*/
483    0.0,    /*preemph*/
484    {NULL, &wb_submode1, NULL, NULL, NULL, NULL, NULL, NULL},
485    1
486 };
487
488
489 SpeexMode speex_uwb_mode = {
490    &sb_uwb_mode,
491    wb_mode_query,
492    "ultra-wideband (sub-band CELP)",
493    2,
494    4,
495    &sb_encoder_init,
496    &sb_encoder_destroy,
497    &sb_encode,
498    &sb_decoder_init,
499    &sb_decoder_destroy,
500    &sb_decode,
501    &sb_encoder_ctl,
502    &sb_decoder_ctl,
503 };
504
505
506
507
508 void *speex_encoder_init(SpeexMode *mode)
509 {
510    return mode->enc_init(mode);
511 }
512
513 void *speex_decoder_init(SpeexMode *mode)
514 {
515    return mode->dec_init(mode);
516 }
517
518 void speex_encoder_destroy(void *state)
519 {
520    (*((SpeexMode**)state))->enc_destroy(state);
521 }
522
523 void speex_encode(void *state, float *in, SpeexBits *bits)
524 {
525    (*((SpeexMode**)state))->enc(state, in, bits);
526 }
527
528 void speex_decoder_destroy(void *state)
529 {
530    (*((SpeexMode**)state))->dec_destroy(state);
531 }
532
533 int speex_decode(void *state, SpeexBits *bits, float *out)
534 {
535    return (*((SpeexMode**)state))->dec(state, bits, out);
536 }
537
538
539 void speex_encoder_ctl(void *state, int request, void *ptr)
540 {
541    (*((SpeexMode**)state))->enc_ctl(state, request, ptr);
542 }
543
544 void speex_decoder_ctl(void *state, int request, void *ptr)
545 {
546    (*((SpeexMode**)state))->dec_ctl(state, request, ptr);
547 }
548
549
550
551 static void nb_mode_query(void *mode, int request, void *ptr)
552 {
553    SpeexNBMode *m = (SpeexNBMode*)mode;
554    
555    switch (request)
556    {
557    case SPEEX_MODE_FRAME_SIZE:
558       *((int*)ptr)=m->frameSize;
559       break;
560    case SPEEX_SUBMODE_BITS_PER_FRAME:
561       *((int*)ptr) = m->submodes[*((int*)ptr)]->bits_per_frame;
562       break;
563    default:
564       fprintf(stderr, "Unknown wb_mode_query request: %d\n", request);
565    }
566
567 }
568
569 static void wb_mode_query(void *mode, int request, void *ptr)
570 {
571    SpeexSBMode *m = (SpeexSBMode*)mode;
572
573    switch (request)
574    {
575    case SPEEX_MODE_FRAME_SIZE:
576       *((int*)ptr)=m->frameSize;
577       break;
578    case SPEEX_SUBMODE_BITS_PER_FRAME:
579       *((int*)ptr) = m->submodes[*((int*)ptr)]->bits_per_frame;
580       break;
581    default:
582       fprintf(stderr, "Unknown wb_mode_query request: %d\n", request);
583    }
584 }
585
586
587 void speex_mode_query(SpeexMode *mode, int request, void *ptr)
588 {
589    mode->query(mode->mode, request, ptr);
590 }