annotate src/opus-1.3/silk/decode_pulses.c @ 70:9e21af8f0420

Opus for Windows (MSVC)
author Chris Cannam
date Fri, 25 Jan 2019 12:15:58 +0000
parents 7aeed7906520
children
rev   line source
Chris@69 1 /***********************************************************************
Chris@69 2 Copyright (c) 2006-2011, Skype Limited. All rights reserved.
Chris@69 3 Redistribution and use in source and binary forms, with or without
Chris@69 4 modification, are permitted provided that the following conditions
Chris@69 5 are met:
Chris@69 6 - Redistributions of source code must retain the above copyright notice,
Chris@69 7 this list of conditions and the following disclaimer.
Chris@69 8 - Redistributions in binary form must reproduce the above copyright
Chris@69 9 notice, this list of conditions and the following disclaimer in the
Chris@69 10 documentation and/or other materials provided with the distribution.
Chris@69 11 - Neither the name of Internet Society, IETF or IETF Trust, nor the
Chris@69 12 names of specific contributors, may be used to endorse or promote
Chris@69 13 products derived from this software without specific prior written
Chris@69 14 permission.
Chris@69 15 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
Chris@69 16 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Chris@69 17 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
Chris@69 18 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
Chris@69 19 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
Chris@69 20 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
Chris@69 21 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
Chris@69 22 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
Chris@69 23 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
Chris@69 24 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
Chris@69 25 POSSIBILITY OF SUCH DAMAGE.
Chris@69 26 ***********************************************************************/
Chris@69 27
Chris@69 28 #ifdef HAVE_CONFIG_H
Chris@69 29 #include "config.h"
Chris@69 30 #endif
Chris@69 31
Chris@69 32 #include "main.h"
Chris@69 33
Chris@69 34 /*********************************************/
Chris@69 35 /* Decode quantization indices of excitation */
Chris@69 36 /*********************************************/
Chris@69 37 void silk_decode_pulses(
Chris@69 38 ec_dec *psRangeDec, /* I/O Compressor data structure */
Chris@69 39 opus_int16 pulses[], /* O Excitation signal */
Chris@69 40 const opus_int signalType, /* I Sigtype */
Chris@69 41 const opus_int quantOffsetType, /* I quantOffsetType */
Chris@69 42 const opus_int frame_length /* I Frame length */
Chris@69 43 )
Chris@69 44 {
Chris@69 45 opus_int i, j, k, iter, abs_q, nLS, RateLevelIndex;
Chris@69 46 opus_int sum_pulses[ MAX_NB_SHELL_BLOCKS ], nLshifts[ MAX_NB_SHELL_BLOCKS ];
Chris@69 47 opus_int16 *pulses_ptr;
Chris@69 48 const opus_uint8 *cdf_ptr;
Chris@69 49
Chris@69 50 /*********************/
Chris@69 51 /* Decode rate level */
Chris@69 52 /*********************/
Chris@69 53 RateLevelIndex = ec_dec_icdf( psRangeDec, silk_rate_levels_iCDF[ signalType >> 1 ], 8 );
Chris@69 54
Chris@69 55 /* Calculate number of shell blocks */
Chris@69 56 silk_assert( 1 << LOG2_SHELL_CODEC_FRAME_LENGTH == SHELL_CODEC_FRAME_LENGTH );
Chris@69 57 iter = silk_RSHIFT( frame_length, LOG2_SHELL_CODEC_FRAME_LENGTH );
Chris@69 58 if( iter * SHELL_CODEC_FRAME_LENGTH < frame_length ) {
Chris@69 59 celt_assert( frame_length == 12 * 10 ); /* Make sure only happens for 10 ms @ 12 kHz */
Chris@69 60 iter++;
Chris@69 61 }
Chris@69 62
Chris@69 63 /***************************************************/
Chris@69 64 /* Sum-Weighted-Pulses Decoding */
Chris@69 65 /***************************************************/
Chris@69 66 cdf_ptr = silk_pulses_per_block_iCDF[ RateLevelIndex ];
Chris@69 67 for( i = 0; i < iter; i++ ) {
Chris@69 68 nLshifts[ i ] = 0;
Chris@69 69 sum_pulses[ i ] = ec_dec_icdf( psRangeDec, cdf_ptr, 8 );
Chris@69 70
Chris@69 71 /* LSB indication */
Chris@69 72 while( sum_pulses[ i ] == SILK_MAX_PULSES + 1 ) {
Chris@69 73 nLshifts[ i ]++;
Chris@69 74 /* When we've already got 10 LSBs, we shift the table to not allow (SILK_MAX_PULSES + 1) */
Chris@69 75 sum_pulses[ i ] = ec_dec_icdf( psRangeDec,
Chris@69 76 silk_pulses_per_block_iCDF[ N_RATE_LEVELS - 1] + ( nLshifts[ i ] == 10 ), 8 );
Chris@69 77 }
Chris@69 78 }
Chris@69 79
Chris@69 80 /***************************************************/
Chris@69 81 /* Shell decoding */
Chris@69 82 /***************************************************/
Chris@69 83 for( i = 0; i < iter; i++ ) {
Chris@69 84 if( sum_pulses[ i ] > 0 ) {
Chris@69 85 silk_shell_decoder( &pulses[ silk_SMULBB( i, SHELL_CODEC_FRAME_LENGTH ) ], psRangeDec, sum_pulses[ i ] );
Chris@69 86 } else {
Chris@69 87 silk_memset( &pulses[ silk_SMULBB( i, SHELL_CODEC_FRAME_LENGTH ) ], 0, SHELL_CODEC_FRAME_LENGTH * sizeof( pulses[0] ) );
Chris@69 88 }
Chris@69 89 }
Chris@69 90
Chris@69 91 /***************************************************/
Chris@69 92 /* LSB Decoding */
Chris@69 93 /***************************************************/
Chris@69 94 for( i = 0; i < iter; i++ ) {
Chris@69 95 if( nLshifts[ i ] > 0 ) {
Chris@69 96 nLS = nLshifts[ i ];
Chris@69 97 pulses_ptr = &pulses[ silk_SMULBB( i, SHELL_CODEC_FRAME_LENGTH ) ];
Chris@69 98 for( k = 0; k < SHELL_CODEC_FRAME_LENGTH; k++ ) {
Chris@69 99 abs_q = pulses_ptr[ k ];
Chris@69 100 for( j = 0; j < nLS; j++ ) {
Chris@69 101 abs_q = silk_LSHIFT( abs_q, 1 );
Chris@69 102 abs_q += ec_dec_icdf( psRangeDec, silk_lsb_iCDF, 8 );
Chris@69 103 }
Chris@69 104 pulses_ptr[ k ] = abs_q;
Chris@69 105 }
Chris@69 106 /* Mark the number of pulses non-zero for sign decoding. */
Chris@69 107 sum_pulses[ i ] |= nLS << 5;
Chris@69 108 }
Chris@69 109 }
Chris@69 110
Chris@69 111 /****************************************/
Chris@69 112 /* Decode and add signs to pulse signal */
Chris@69 113 /****************************************/
Chris@69 114 silk_decode_signs( psRangeDec, pulses, frame_length, signalType, quantOffsetType, sum_pulses );
Chris@69 115 }