media/libopus/silk/decode_pulses.c

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/media/libopus/silk/decode_pulses.c	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,115 @@
     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 +/*********************************************/
    1.38 +/* Decode quantization indices of excitation */
    1.39 +/*********************************************/
    1.40 +void silk_decode_pulses(
    1.41 +    ec_dec                      *psRangeDec,                    /* I/O  Compressor data structure                   */
    1.42 +    opus_int                    pulses[],                       /* O    Excitation signal                           */
    1.43 +    const opus_int              signalType,                     /* I    Sigtype                                     */
    1.44 +    const opus_int              quantOffsetType,                /* I    quantOffsetType                             */
    1.45 +    const opus_int              frame_length                    /* I    Frame length                                */
    1.46 +)
    1.47 +{
    1.48 +    opus_int   i, j, k, iter, abs_q, nLS, RateLevelIndex;
    1.49 +    opus_int   sum_pulses[ MAX_NB_SHELL_BLOCKS ], nLshifts[ MAX_NB_SHELL_BLOCKS ];
    1.50 +    opus_int   *pulses_ptr;
    1.51 +    const opus_uint8 *cdf_ptr;
    1.52 +
    1.53 +    /*********************/
    1.54 +    /* Decode rate level */
    1.55 +    /*********************/
    1.56 +    RateLevelIndex = ec_dec_icdf( psRangeDec, silk_rate_levels_iCDF[ signalType >> 1 ], 8 );
    1.57 +
    1.58 +    /* Calculate number of shell blocks */
    1.59 +    silk_assert( 1 << LOG2_SHELL_CODEC_FRAME_LENGTH == SHELL_CODEC_FRAME_LENGTH );
    1.60 +    iter = silk_RSHIFT( frame_length, LOG2_SHELL_CODEC_FRAME_LENGTH );
    1.61 +    if( iter * SHELL_CODEC_FRAME_LENGTH < frame_length ) {
    1.62 +        silk_assert( frame_length == 12 * 10 ); /* Make sure only happens for 10 ms @ 12 kHz */
    1.63 +        iter++;
    1.64 +    }
    1.65 +
    1.66 +    /***************************************************/
    1.67 +    /* Sum-Weighted-Pulses Decoding                    */
    1.68 +    /***************************************************/
    1.69 +    cdf_ptr = silk_pulses_per_block_iCDF[ RateLevelIndex ];
    1.70 +    for( i = 0; i < iter; i++ ) {
    1.71 +        nLshifts[ i ] = 0;
    1.72 +        sum_pulses[ i ] = ec_dec_icdf( psRangeDec, cdf_ptr, 8 );
    1.73 +
    1.74 +        /* LSB indication */
    1.75 +        while( sum_pulses[ i ] == MAX_PULSES + 1 ) {
    1.76 +            nLshifts[ i ]++;
    1.77 +            /* When we've already got 10 LSBs, we shift the table to not allow (MAX_PULSES + 1) */
    1.78 +            sum_pulses[ i ] = ec_dec_icdf( psRangeDec,
    1.79 +                    silk_pulses_per_block_iCDF[ N_RATE_LEVELS - 1] + ( nLshifts[ i ] == 10 ), 8 );
    1.80 +        }
    1.81 +    }
    1.82 +
    1.83 +    /***************************************************/
    1.84 +    /* Shell decoding                                  */
    1.85 +    /***************************************************/
    1.86 +    for( i = 0; i < iter; i++ ) {
    1.87 +        if( sum_pulses[ i ] > 0 ) {
    1.88 +            silk_shell_decoder( &pulses[ silk_SMULBB( i, SHELL_CODEC_FRAME_LENGTH ) ], psRangeDec, sum_pulses[ i ] );
    1.89 +        } else {
    1.90 +            silk_memset( &pulses[ silk_SMULBB( i, SHELL_CODEC_FRAME_LENGTH ) ], 0, SHELL_CODEC_FRAME_LENGTH * sizeof( opus_int ) );
    1.91 +        }
    1.92 +    }
    1.93 +
    1.94 +    /***************************************************/
    1.95 +    /* LSB Decoding                                    */
    1.96 +    /***************************************************/
    1.97 +    for( i = 0; i < iter; i++ ) {
    1.98 +        if( nLshifts[ i ] > 0 ) {
    1.99 +            nLS = nLshifts[ i ];
   1.100 +            pulses_ptr = &pulses[ silk_SMULBB( i, SHELL_CODEC_FRAME_LENGTH ) ];
   1.101 +            for( k = 0; k < SHELL_CODEC_FRAME_LENGTH; k++ ) {
   1.102 +                abs_q = pulses_ptr[ k ];
   1.103 +                for( j = 0; j < nLS; j++ ) {
   1.104 +                    abs_q = silk_LSHIFT( abs_q, 1 );
   1.105 +                    abs_q += ec_dec_icdf( psRangeDec, silk_lsb_iCDF, 8 );
   1.106 +                }
   1.107 +                pulses_ptr[ k ] = abs_q;
   1.108 +            }
   1.109 +            /* Mark the number of pulses non-zero for sign decoding. */
   1.110 +            sum_pulses[ i ] |= nLS << 5;
   1.111 +        }
   1.112 +    }
   1.113 +
   1.114 +    /****************************************/
   1.115 +    /* Decode and add signs to pulse signal */
   1.116 +    /****************************************/
   1.117 +    silk_decode_signs( psRangeDec, pulses, frame_length, signalType, quantOffsetType, sum_pulses );
   1.118 +}

mercurial