1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/media/libopus/silk/NLSF_decode.c Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,101 @@ 1.4 +/*********************************************************************** 1.5 +Copyright (c) 2006-2011, Skype Limited. All rights reserved. 1.6 +Redistribution and use in source and binary forms, with or without 1.7 +modification, are permitted provided that the following conditions 1.8 +are met: 1.9 +- Redistributions of source code must retain the above copyright notice, 1.10 +this list of conditions and the following disclaimer. 1.11 +- Redistributions in binary form must reproduce the above copyright 1.12 +notice, this list of conditions and the following disclaimer in the 1.13 +documentation and/or other materials provided with the distribution. 1.14 +- Neither the name of Internet Society, IETF or IETF Trust, nor the 1.15 +names of specific contributors, may be used to endorse or promote 1.16 +products derived from this software without specific prior written 1.17 +permission. 1.18 +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 1.19 +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1.20 +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1.21 +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 1.22 +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 1.23 +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 1.24 +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 1.25 +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 1.26 +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 1.27 +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 1.28 +POSSIBILITY OF SUCH DAMAGE. 1.29 +***********************************************************************/ 1.30 + 1.31 +#ifdef HAVE_CONFIG_H 1.32 +#include "config.h" 1.33 +#endif 1.34 + 1.35 +#include "main.h" 1.36 + 1.37 +/* Predictive dequantizer for NLSF residuals */ 1.38 +static OPUS_INLINE void silk_NLSF_residual_dequant( /* O Returns RD value in Q30 */ 1.39 + opus_int16 x_Q10[], /* O Output [ order ] */ 1.40 + const opus_int8 indices[], /* I Quantization indices [ order ] */ 1.41 + const opus_uint8 pred_coef_Q8[], /* I Backward predictor coefs [ order ] */ 1.42 + const opus_int quant_step_size_Q16, /* I Quantization step size */ 1.43 + const opus_int16 order /* I Number of input values */ 1.44 +) 1.45 +{ 1.46 + opus_int i, out_Q10, pred_Q10; 1.47 + 1.48 + out_Q10 = 0; 1.49 + for( i = order-1; i >= 0; i-- ) { 1.50 + pred_Q10 = silk_RSHIFT( silk_SMULBB( out_Q10, (opus_int16)pred_coef_Q8[ i ] ), 8 ); 1.51 + out_Q10 = silk_LSHIFT( indices[ i ], 10 ); 1.52 + if( out_Q10 > 0 ) { 1.53 + out_Q10 = silk_SUB16( out_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) ); 1.54 + } else if( out_Q10 < 0 ) { 1.55 + out_Q10 = silk_ADD16( out_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) ); 1.56 + } 1.57 + out_Q10 = silk_SMLAWB( pred_Q10, (opus_int32)out_Q10, quant_step_size_Q16 ); 1.58 + x_Q10[ i ] = out_Q10; 1.59 + } 1.60 +} 1.61 + 1.62 + 1.63 +/***********************/ 1.64 +/* NLSF vector decoder */ 1.65 +/***********************/ 1.66 +void silk_NLSF_decode( 1.67 + opus_int16 *pNLSF_Q15, /* O Quantized NLSF vector [ LPC_ORDER ] */ 1.68 + opus_int8 *NLSFIndices, /* I Codebook path vector [ LPC_ORDER + 1 ] */ 1.69 + const silk_NLSF_CB_struct *psNLSF_CB /* I Codebook object */ 1.70 +) 1.71 +{ 1.72 + opus_int i; 1.73 + opus_uint8 pred_Q8[ MAX_LPC_ORDER ]; 1.74 + opus_int16 ec_ix[ MAX_LPC_ORDER ]; 1.75 + opus_int16 res_Q10[ MAX_LPC_ORDER ]; 1.76 + opus_int16 W_tmp_QW[ MAX_LPC_ORDER ]; 1.77 + opus_int32 W_tmp_Q9, NLSF_Q15_tmp; 1.78 + const opus_uint8 *pCB_element; 1.79 + 1.80 + /* Decode first stage */ 1.81 + pCB_element = &psNLSF_CB->CB1_NLSF_Q8[ NLSFIndices[ 0 ] * psNLSF_CB->order ]; 1.82 + for( i = 0; i < psNLSF_CB->order; i++ ) { 1.83 + pNLSF_Q15[ i ] = silk_LSHIFT( (opus_int16)pCB_element[ i ], 7 ); 1.84 + } 1.85 + 1.86 + /* Unpack entropy table indices and predictor for current CB1 index */ 1.87 + silk_NLSF_unpack( ec_ix, pred_Q8, psNLSF_CB, NLSFIndices[ 0 ] ); 1.88 + 1.89 + /* Predictive residual dequantizer */ 1.90 + silk_NLSF_residual_dequant( res_Q10, &NLSFIndices[ 1 ], pred_Q8, psNLSF_CB->quantStepSize_Q16, psNLSF_CB->order ); 1.91 + 1.92 + /* Weights from codebook vector */ 1.93 + silk_NLSF_VQ_weights_laroia( W_tmp_QW, pNLSF_Q15, psNLSF_CB->order ); 1.94 + 1.95 + /* Apply inverse square-rooted weights and add to output */ 1.96 + for( i = 0; i < psNLSF_CB->order; i++ ) { 1.97 + W_tmp_Q9 = silk_SQRT_APPROX( silk_LSHIFT( (opus_int32)W_tmp_QW[ i ], 18 - NLSF_W_Q ) ); 1.98 + NLSF_Q15_tmp = silk_ADD32( pNLSF_Q15[ i ], silk_DIV32_16( silk_LSHIFT( (opus_int32)res_Q10[ i ], 14 ), W_tmp_Q9 ) ); 1.99 + pNLSF_Q15[ i ] = (opus_int16)silk_LIMIT( NLSF_Q15_tmp, 0, 32767 ); 1.100 + } 1.101 + 1.102 + /* NLSF stabilization */ 1.103 + silk_NLSF_stabilize( pNLSF_Q15, psNLSF_CB->deltaMin_Q15, psNLSF_CB->order ); 1.104 +}