media/libopus/silk/NLSF_decode.c

changeset 0
6474c204b198
     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 +}

mercurial