You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
366 lines
8.3 KiB
366 lines
8.3 KiB
/* Copyright (C) 2002-2006 Jean-Marc Valin |
|
File: modes.c |
|
|
|
Describes the different modes of the codec |
|
|
|
Redistribution and use in source and binary forms, with or without |
|
modification, are permitted provided that the following conditions |
|
are met: |
|
|
|
- Redistributions of source code must retain the above copyright |
|
notice, this list of conditions and the following disclaimer. |
|
|
|
- Redistributions in binary form must reproduce the above copyright |
|
notice, this list of conditions and the following disclaimer in the |
|
documentation and/or other materials provided with the distribution. |
|
|
|
- Neither the name of the Xiph.org Foundation nor the names of its |
|
contributors may be used to endorse or promote products derived from |
|
this software without specific prior written permission. |
|
|
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR |
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
|
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
|
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
|
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
|
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
|
|
*/ |
|
|
|
#ifdef HAVE_CONFIG_H |
|
#include "config.h" |
|
#endif |
|
|
|
#include "modes.h" |
|
#include "ltp.h" |
|
#include "quant_lsp.h" |
|
#include "cb_search.h" |
|
#include "sb_celp.h" |
|
#include "nb_celp.h" |
|
#include "vbr.h" |
|
#include "arch.h" |
|
#include <math.h> |
|
|
|
#ifndef NULL |
|
#define NULL 0 |
|
#endif |
|
|
|
|
|
/* Extern declarations for all codebooks we use here */ |
|
extern const signed char gain_cdbk_nb[]; |
|
extern const signed char gain_cdbk_lbr[]; |
|
extern const signed char exc_5_256_table[]; |
|
extern const signed char exc_5_64_table[]; |
|
extern const signed char exc_8_128_table[]; |
|
extern const signed char exc_10_32_table[]; |
|
extern const signed char exc_10_16_table[]; |
|
extern const signed char exc_20_32_table[]; |
|
|
|
|
|
/* Parameters for Long-Term Prediction (LTP)*/ |
|
static const ltp_params ltp_params_nb = { |
|
gain_cdbk_nb, |
|
7, |
|
7 |
|
}; |
|
|
|
/* Parameters for Long-Term Prediction (LTP)*/ |
|
static const ltp_params ltp_params_vlbr = { |
|
gain_cdbk_lbr, |
|
5, |
|
0 |
|
}; |
|
|
|
/* Parameters for Long-Term Prediction (LTP)*/ |
|
static const ltp_params ltp_params_lbr = { |
|
gain_cdbk_lbr, |
|
5, |
|
7 |
|
}; |
|
|
|
/* Parameters for Long-Term Prediction (LTP)*/ |
|
static const ltp_params ltp_params_med = { |
|
gain_cdbk_lbr, |
|
5, |
|
7 |
|
}; |
|
|
|
/* Split-VQ innovation parameters for very low bit-rate narrowband */ |
|
static const split_cb_params split_cb_nb_vlbr = { |
|
10, /*subvect_size*/ |
|
4, /*nb_subvect*/ |
|
exc_10_16_table, /*shape_cb*/ |
|
4, /*shape_bits*/ |
|
0, |
|
}; |
|
|
|
/* Split-VQ innovation parameters for very low bit-rate narrowband */ |
|
static const split_cb_params split_cb_nb_ulbr = { |
|
20, /*subvect_size*/ |
|
2, /*nb_subvect*/ |
|
exc_20_32_table, /*shape_cb*/ |
|
5, /*shape_bits*/ |
|
0, |
|
}; |
|
|
|
/* Split-VQ innovation parameters for low bit-rate narrowband */ |
|
static const split_cb_params split_cb_nb_lbr = { |
|
10, /*subvect_size*/ |
|
4, /*nb_subvect*/ |
|
exc_10_32_table, /*shape_cb*/ |
|
5, /*shape_bits*/ |
|
0, |
|
}; |
|
|
|
|
|
/* Split-VQ innovation parameters narrowband */ |
|
static const split_cb_params split_cb_nb = { |
|
5, /*subvect_size*/ |
|
8, /*nb_subvect*/ |
|
exc_5_64_table, /*shape_cb*/ |
|
6, /*shape_bits*/ |
|
0, |
|
}; |
|
|
|
/* Split-VQ innovation parameters narrowband */ |
|
static const split_cb_params split_cb_nb_med = { |
|
8, /*subvect_size*/ |
|
5, /*nb_subvect*/ |
|
exc_8_128_table, /*shape_cb*/ |
|
7, /*shape_bits*/ |
|
0, |
|
}; |
|
|
|
/* Split-VQ innovation for low-band wideband */ |
|
static const split_cb_params split_cb_sb = { |
|
5, /*subvect_size*/ |
|
8, /*nb_subvect*/ |
|
exc_5_256_table, /*shape_cb*/ |
|
8, /*shape_bits*/ |
|
0, |
|
}; |
|
|
|
|
|
|
|
/* 2150 bps "vocoder-like" mode for comfort noise */ |
|
static const SpeexSubmode nb_submode1 = { |
|
0, |
|
1, |
|
0, |
|
0, |
|
/* LSP quantization */ |
|
lsp_quant_lbr, |
|
lsp_unquant_lbr, |
|
/* No pitch quantization */ |
|
forced_pitch_quant, |
|
forced_pitch_unquant, |
|
NULL, |
|
/* No innovation quantization (noise only) */ |
|
noise_codebook_quant, |
|
noise_codebook_unquant, |
|
NULL, |
|
-1, |
|
43 |
|
}; |
|
|
|
/* 3.95 kbps very low bit-rate mode */ |
|
static const SpeexSubmode nb_submode8 = { |
|
0, |
|
1, |
|
0, |
|
0, |
|
/*LSP quantization*/ |
|
lsp_quant_lbr, |
|
lsp_unquant_lbr, |
|
/*No pitch quantization*/ |
|
forced_pitch_quant, |
|
forced_pitch_unquant, |
|
NULL, |
|
/*Innovation quantization*/ |
|
split_cb_search_shape_sign, |
|
split_cb_shape_sign_unquant, |
|
&split_cb_nb_ulbr, |
|
QCONST16(.5,15), |
|
79 |
|
}; |
|
|
|
/* 5.95 kbps very low bit-rate mode */ |
|
static const SpeexSubmode nb_submode2 = { |
|
0, |
|
0, |
|
0, |
|
0, |
|
/*LSP quantization*/ |
|
lsp_quant_lbr, |
|
lsp_unquant_lbr, |
|
/*No pitch quantization*/ |
|
pitch_search_3tap, |
|
pitch_unquant_3tap, |
|
<p_params_vlbr, |
|
/*Innovation quantization*/ |
|
split_cb_search_shape_sign, |
|
split_cb_shape_sign_unquant, |
|
&split_cb_nb_vlbr, |
|
QCONST16(.6,15), |
|
119 |
|
}; |
|
|
|
/* 8 kbps low bit-rate mode */ |
|
static const SpeexSubmode nb_submode3 = { |
|
-1, |
|
0, |
|
1, |
|
0, |
|
/*LSP quantization*/ |
|
lsp_quant_lbr, |
|
lsp_unquant_lbr, |
|
/*Pitch quantization*/ |
|
pitch_search_3tap, |
|
pitch_unquant_3tap, |
|
<p_params_lbr, |
|
/*Innovation quantization*/ |
|
split_cb_search_shape_sign, |
|
split_cb_shape_sign_unquant, |
|
&split_cb_nb_lbr, |
|
QCONST16(.55,15), |
|
160 |
|
}; |
|
|
|
/* 11 kbps medium bit-rate mode */ |
|
static const SpeexSubmode nb_submode4 = { |
|
-1, |
|
0, |
|
1, |
|
0, |
|
/*LSP quantization*/ |
|
lsp_quant_lbr, |
|
lsp_unquant_lbr, |
|
/*Pitch quantization*/ |
|
pitch_search_3tap, |
|
pitch_unquant_3tap, |
|
<p_params_med, |
|
/*Innovation quantization*/ |
|
split_cb_search_shape_sign, |
|
split_cb_shape_sign_unquant, |
|
&split_cb_nb_med, |
|
QCONST16(.45,15), |
|
220 |
|
}; |
|
|
|
/* 15 kbps high bit-rate mode */ |
|
static const SpeexSubmode nb_submode5 = { |
|
-1, |
|
0, |
|
3, |
|
0, |
|
/*LSP quantization*/ |
|
lsp_quant_nb, |
|
lsp_unquant_nb, |
|
/*Pitch quantization*/ |
|
pitch_search_3tap, |
|
pitch_unquant_3tap, |
|
<p_params_nb, |
|
/*Innovation quantization*/ |
|
split_cb_search_shape_sign, |
|
split_cb_shape_sign_unquant, |
|
&split_cb_nb, |
|
QCONST16(.3,15), |
|
300 |
|
}; |
|
|
|
/* 18.2 high bit-rate mode */ |
|
static const SpeexSubmode nb_submode6 = { |
|
-1, |
|
0, |
|
3, |
|
0, |
|
/*LSP quantization*/ |
|
lsp_quant_nb, |
|
lsp_unquant_nb, |
|
/*Pitch quantization*/ |
|
pitch_search_3tap, |
|
pitch_unquant_3tap, |
|
<p_params_nb, |
|
/*Innovation quantization*/ |
|
split_cb_search_shape_sign, |
|
split_cb_shape_sign_unquant, |
|
&split_cb_sb, |
|
QCONST16(.2,15), |
|
364 |
|
}; |
|
|
|
/* 24.6 kbps high bit-rate mode */ |
|
static const SpeexSubmode nb_submode7 = { |
|
-1, |
|
0, |
|
3, |
|
1, |
|
/*LSP quantization*/ |
|
lsp_quant_nb, |
|
lsp_unquant_nb, |
|
/*Pitch quantization*/ |
|
pitch_search_3tap, |
|
pitch_unquant_3tap, |
|
<p_params_nb, |
|
/*Innovation quantization*/ |
|
split_cb_search_shape_sign, |
|
split_cb_shape_sign_unquant, |
|
&split_cb_nb, |
|
QCONST16(.1,15), |
|
492 |
|
}; |
|
|
|
|
|
/* Default mode for narrowband */ |
|
static const SpeexNBMode nb_mode = { |
|
160, /*frameSize*/ |
|
40, /*subframeSize*/ |
|
10, /*lpcSize*/ |
|
17, /*pitchStart*/ |
|
144, /*pitchEnd*/ |
|
#ifdef FIXED_POINT |
|
29491, 19661, /* gamma1, gamma2 */ |
|
#else |
|
0.9, 0.6, /* gamma1, gamma2 */ |
|
#endif |
|
QCONST16(.0002,15), /*lpc_floor*/ |
|
{NULL, &nb_submode1, &nb_submode2, &nb_submode3, &nb_submode4, &nb_submode5, &nb_submode6, &nb_submode7, |
|
&nb_submode8, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, |
|
5, |
|
{1, 8, 2, 3, 3, 4, 4, 5, 5, 6, 7} |
|
}; |
|
|
|
|
|
/* Default mode for narrowband */ |
|
EXPORT const SpeexMode speex_nb_mode = { |
|
&nb_mode, |
|
nb_mode_query, |
|
"narrowband", |
|
0, |
|
4, |
|
&nb_encoder_init, |
|
&nb_encoder_destroy, |
|
&nb_encode, |
|
&nb_decoder_init, |
|
&nb_decoder_destroy, |
|
&nb_decode, |
|
&nb_encoder_ctl, |
|
&nb_decoder_ctl, |
|
}; |
|
|
|
|
|
|
|
EXPORT int speex_mode_query(const SpeexMode *mode, int request, void *ptr) |
|
{ |
|
return mode->query(mode->mode, request, ptr); |
|
} |
|
|
|
#ifdef FIXED_DEBUG |
|
long long spx_mips=0; |
|
#endif |
|
|
|
|