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
 | 
						|
 |