You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			367 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			C
		
	
		
		
			
		
	
	
			367 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			C
		
	
| 
											10 years ago
										 | /* 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
 | ||
|  | 
 |