jitter buffer: histogram shifting function (not used yet)
[speexdsp.git] / libspeex / modes.c
1 /* Copyright (C) 2002-2006 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
54 /* Extern declarations for all codebooks we use here */
55 extern const signed char gain_cdbk_nb[];
56 extern const signed char gain_cdbk_lbr[];
57 extern const signed char exc_5_256_table[];
58 extern const signed char exc_5_64_table[];
59 extern const signed char exc_8_128_table[];
60 extern const signed char exc_10_32_table[];
61 extern const signed char exc_10_16_table[];
62 extern const signed char exc_20_32_table[];
63
64
65 /* Parameters for Long-Term Prediction (LTP)*/
66 static const ltp_params ltp_params_nb = {
67    gain_cdbk_nb,
68    7,
69    7
70 };
71
72 /* Parameters for Long-Term Prediction (LTP)*/
73 static const ltp_params ltp_params_vlbr = {
74    gain_cdbk_lbr,
75    5,
76    0
77 };
78
79 /* Parameters for Long-Term Prediction (LTP)*/
80 static const ltp_params ltp_params_lbr = {
81    gain_cdbk_lbr,
82    5,
83    7
84 };
85
86 /* Parameters for Long-Term Prediction (LTP)*/
87 static const 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 const 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 const 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 const 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 const 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 const 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 const 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
149
150 /* 2150 bps "vocoder-like" mode for comfort noise */
151 static const SpeexSubmode nb_submode1 = {
152    0,
153    1,
154    0,
155    0,
156    /* LSP quantization */
157    lsp_quant_lbr,
158    lsp_unquant_lbr,
159    /* No pitch quantization */
160    forced_pitch_quant,
161    forced_pitch_unquant,
162    NULL,
163    /* No innovation quantization (noise only) */
164    noise_codebook_quant,
165    noise_codebook_unquant,
166    NULL,
167    -1,
168    43
169 };
170
171 /* 3.95 kbps very low bit-rate mode */
172 static const SpeexSubmode nb_submode8 = {
173    0,
174    1,
175    0,
176    0,
177    /*LSP quantization*/
178    lsp_quant_lbr,
179    lsp_unquant_lbr,
180    /*No pitch quantization*/
181    forced_pitch_quant,
182    forced_pitch_unquant,
183    NULL,
184    /*Innovation quantization*/
185    split_cb_search_shape_sign,
186    split_cb_shape_sign_unquant,
187    &split_cb_nb_ulbr,
188    QCONST16(.5,15),
189    79
190 };
191
192 /* 5.95 kbps very low bit-rate mode */
193 static const SpeexSubmode nb_submode2 = {
194    0,
195    0,
196    0,
197    0,
198    /*LSP quantization*/
199    lsp_quant_lbr,
200    lsp_unquant_lbr,
201    /*No pitch quantization*/
202    pitch_search_3tap,
203    pitch_unquant_3tap,
204    &ltp_params_vlbr,
205    /*Innovation quantization*/
206    split_cb_search_shape_sign,
207    split_cb_shape_sign_unquant,
208    &split_cb_nb_vlbr,
209    QCONST16(.6,15),
210    119
211 };
212
213 /* 8 kbps low bit-rate mode */
214 static const SpeexSubmode nb_submode3 = {
215    -1,
216    0,
217    1,
218    0,
219    /*LSP quantization*/
220    lsp_quant_lbr,
221    lsp_unquant_lbr,
222    /*Pitch quantization*/
223    pitch_search_3tap,
224    pitch_unquant_3tap,
225    &ltp_params_lbr,
226    /*Innovation quantization*/
227    split_cb_search_shape_sign,
228    split_cb_shape_sign_unquant,
229    &split_cb_nb_lbr,
230    QCONST16(.55,15),
231    160
232 };
233
234 /* 11 kbps medium bit-rate mode */
235 static const SpeexSubmode nb_submode4 = {
236    -1,
237    0,
238    1,
239    0,
240    /*LSP quantization*/
241    lsp_quant_lbr,
242    lsp_unquant_lbr,
243    /*Pitch quantization*/
244    pitch_search_3tap,
245    pitch_unquant_3tap,
246    &ltp_params_med,
247    /*Innovation quantization*/
248    split_cb_search_shape_sign,
249    split_cb_shape_sign_unquant,
250    &split_cb_nb_med,
251    QCONST16(.45,15),
252    220
253 };
254
255 /* 15 kbps high bit-rate mode */
256 static const SpeexSubmode nb_submode5 = {
257    -1,
258    0,
259    3,
260    0,
261    /*LSP quantization*/
262    lsp_quant_nb,
263    lsp_unquant_nb,
264    /*Pitch quantization*/
265    pitch_search_3tap,
266    pitch_unquant_3tap,
267    &ltp_params_nb,
268    /*Innovation quantization*/
269    split_cb_search_shape_sign,
270    split_cb_shape_sign_unquant,
271    &split_cb_nb,
272    QCONST16(.3,15),
273    300
274 };
275
276 /* 18.2 high bit-rate mode */
277 static const SpeexSubmode nb_submode6 = {
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_sb,
293    QCONST16(.2,15),
294    364
295 };
296
297 /* 24.6 kbps high bit-rate mode */
298 static const SpeexSubmode nb_submode7 = {
299    -1,
300    0,
301    3,
302    1,
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    QCONST16(.1,15),
315    492
316 };
317
318
319 /* Default mode for narrowband */
320 static const SpeexNBMode nb_mode = {
321    160,    /*frameSize*/
322    40,     /*subframeSize*/
323    10,     /*lpcSize*/
324    17,     /*pitchStart*/
325    144,    /*pitchEnd*/
326 #ifdef FIXED_POINT
327    29491, 19661, /* gamma1, gamma2 */
328 #else
329    0.9, 0.6, /* gamma1, gamma2 */
330 #endif
331    .012,   /*lag_factor*/
332    QCONST16(.0002,15), /*lpc_floor*/
333 #ifdef EPIC_48K
334    0,
335 #endif
336    {NULL, &nb_submode1, &nb_submode2, &nb_submode3, &nb_submode4, &nb_submode5, &nb_submode6, &nb_submode7,
337    &nb_submode8, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
338    5,
339    {1, 8, 2, 3, 3, 4, 4, 5, 5, 6, 7}
340 };
341
342
343 /* Default mode for narrowband */
344 const SpeexMode speex_nb_mode = {
345    &nb_mode,
346    nb_mode_query,
347    "narrowband",
348    0,
349    4,
350    &nb_encoder_init,
351    &nb_encoder_destroy,
352    &nb_encode,
353    &nb_decoder_init,
354    &nb_decoder_destroy,
355    &nb_decode,
356    &nb_encoder_ctl,
357    &nb_decoder_ctl,
358 };
359
360
361 /* Wideband part */
362
363
364 #ifdef EPIC_48K
365
366 extern const signed char gain_cdbk_ulbr[];
367 extern const signed char exc_12_32_table[];
368
369 /* Parameters for Long-Term Prediction (LTP)*/
370 static const ltp_params ltp_params_48k = {
371    gain_cdbk_ulbr,
372    3,
373    0
374 };
375
376 static const split_cb_params split_cb_nb_48k = {
377    12,               /*subvect_size*/
378    4,               /*nb_subvect*/
379    exc_12_32_table, /*shape_cb*/
380    5,               /*shape_bits*/
381    0,
382 };
383
384
385 /* 4.8 kbps very low bit-rate mode */
386 static const SpeexSubmode nb_48k_submode = {
387    0,
388    0,
389    0,
390    0,
391    /*LSP quantization*/
392    lsp_quant_48k,
393    lsp_unquant_48k,
394    /*No pitch quantization*/
395    pitch_search_3tap,
396    pitch_unquant_3tap,
397    &ltp_params_48k,
398    /*Innovation quantization*/
399    split_cb_search_shape_sign,
400    split_cb_shape_sign_unquant,
401    &split_cb_nb_48k,
402    QCONST16(.7,15),
403    144
404 };
405
406
407 /* Special, non-standard 4.8 kbps mode */
408 static const SpeexNBMode nb_48k_mode = {
409    240,    /*frameSize*/
410    48,     /*subframeSize*/
411    10,     /*lpcSize*/
412    17,     /*pitchStart*/
413    144,    /*pitchEnd*/
414    0.9,    /*gamma1*/
415    0.6,    /*gamma2*/
416    .01,   /*lag_factor*/
417    QCONST16(.0003,15), /*lpc_floor*/
418    1,
419    {NULL, NULL, &nb_48k_submode, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
420    2,
421    {2,2,2,2,2,2,2,2,2,2,2}
422 };
423
424
425 /* Default mode for narrowband */
426 const SpeexMode speex_nb_48k_mode = {
427    &nb_48k_mode,
428    nb_mode_query,
429    "narrowband 4.8 kbps",
430    1000,
431    4,
432    &nb_encoder_init,
433    &nb_encoder_destroy,
434    &nb_encode,
435    &nb_decoder_init,
436    &nb_decoder_destroy,
437    &nb_decode,
438    &nb_encoder_ctl,
439    &nb_decoder_ctl,
440 };
441
442
443 #endif
444
445 int speex_mode_query(const SpeexMode *mode, int request, void *ptr)
446 {
447    return mode->query(mode->mode, request, ptr);
448 }
449