mirror of https://github.com/oxen-io/session-ios
				
				
				
			
			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
		
	
| /* 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
 | |
| 
 |