1885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/*********************************************************************** 2885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgCopyright (c) 2006-2011, Skype Limited. All rights reserved. 3885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgRedistribution and use in source and binary forms, with or without 4885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgmodification, are permitted provided that the following conditions 5885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgare met: 6885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org- Redistributions of source code must retain the above copyright notice, 7885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgthis list of conditions and the following disclaimer. 8885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org- Redistributions in binary form must reproduce the above copyright 9885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgnotice, this list of conditions and the following disclaimer in the 10885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgdocumentation and/or other materials provided with the distribution. 11e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org- Neither the name of Internet Society, IETF or IETF Trust, nor the 12885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgnames of specific contributors, may be used to endorse or promote 13885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgproducts derived from this software without specific prior written 14885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgpermission. 15e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.orgTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 16885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 19885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgPOSSIBILITY OF SUCH DAMAGE. 26885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org***********************************************************************/ 27885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 28885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifndef SILK_MAIN_H 29885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define SILK_MAIN_H 30885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 31885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "SigProc_FIX.h" 32885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "define.h" 33885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "structs.h" 34885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "tables.h" 35885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "PLC.h" 36885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "control.h" 37885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "debug.h" 38885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "entenc.h" 39885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "entdec.h" 40885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 41885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Convert Left/Right stereo signal to adaptive Mid/Side representation */ 42885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_stereo_LR_to_MS( 43885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org stereo_enc_state *state, /* I/O State */ 44885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int16 x1[], /* I/O Left input signal, becomes mid signal */ 45885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int16 x2[], /* I/O Right input signal, becomes side signal */ 46885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int8 ix[ 2 ][ 3 ], /* O Quantization indices */ 47885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int8 *mid_only_flag, /* O Flag: only mid signal coded */ 48885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int32 mid_side_rates_bps[], /* O Bitrates for mid and side signals */ 49885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int32 total_rate_bps, /* I Total bitrate */ 50885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int prev_speech_act_Q8, /* I Speech activity level in previous frame */ 51885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int toMono, /* I Last frame before a stereo->mono transition */ 52885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int fs_kHz, /* I Sample rate (kHz) */ 53885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int frame_length /* I Number of samples */ 54885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 55885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 56885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Convert adaptive Mid/Side representation to Left/Right stereo signal */ 57885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_stereo_MS_to_LR( 58885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org stereo_dec_state *state, /* I/O State */ 59885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int16 x1[], /* I/O Left input signal, becomes mid signal */ 60885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int16 x2[], /* I/O Right input signal, becomes side signal */ 61885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int32 pred_Q13[], /* I Predictors */ 62885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int fs_kHz, /* I Samples rate (kHz) */ 63885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int frame_length /* I Number of samples */ 64885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 65885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 66885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Find least-squares prediction gain for one signal based on another and quantize it */ 67885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgopus_int32 silk_stereo_find_predictor( /* O Returns predictor in Q13 */ 68885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int32 *ratio_Q14, /* O Ratio of residual and mid energies */ 69885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int16 x[], /* I Basis signal */ 70885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int16 y[], /* I Target signal */ 71885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int32 mid_res_amp_Q0[], /* I/O Smoothed mid, residual norms */ 72885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int length, /* I Number of samples */ 73885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int smooth_coef_Q16 /* I Smoothing coefficient */ 74885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 75885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 76885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Quantize mid/side predictors */ 77885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_stereo_quant_pred( 78885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int32 pred_Q13[], /* I/O Predictors (out: quantized) */ 79885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int8 ix[ 2 ][ 3 ] /* O Quantization indices */ 80885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 81885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 82885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Entropy code the mid/side quantization indices */ 83885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_stereo_encode_pred( 84885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org ec_enc *psRangeEnc, /* I/O Compressor data structure */ 85885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int8 ix[ 2 ][ 3 ] /* I Quantization indices */ 86885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 87885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 88885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Entropy code the mid-only flag */ 89885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_stereo_encode_mid_only( 90885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org ec_enc *psRangeEnc, /* I/O Compressor data structure */ 91885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int8 mid_only_flag 92885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 93885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 94885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Decode mid/side predictors */ 95885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_stereo_decode_pred( 96885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org ec_dec *psRangeDec, /* I/O Compressor data structure */ 97885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int32 pred_Q13[] /* O Predictors */ 98885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 99885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 100885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Decode mid-only flag */ 101885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_stereo_decode_mid_only( 102885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org ec_dec *psRangeDec, /* I/O Compressor data structure */ 103885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int *decode_only_mid /* O Flag that only mid channel has been coded */ 104885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 105885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 106885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Encodes signs of excitation */ 107885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_encode_signs( 108885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org ec_enc *psRangeEnc, /* I/O Compressor data structure */ 109885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int8 pulses[], /* I pulse signal */ 110885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int length, /* I length of input */ 111885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int signalType, /* I Signal type */ 112885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int quantOffsetType, /* I Quantization offset type */ 113885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int sum_pulses[ MAX_NB_SHELL_BLOCKS ] /* I Sum of absolute pulses per block */ 114885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 115885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 116885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Decodes signs of excitation */ 117885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_decode_signs( 118885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org ec_dec *psRangeDec, /* I/O Compressor data structure */ 119885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int pulses[], /* I/O pulse signal */ 120885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int length, /* I length of input */ 121885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int signalType, /* I Signal type */ 122885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int quantOffsetType, /* I Quantization offset type */ 123885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int sum_pulses[ MAX_NB_SHELL_BLOCKS ] /* I Sum of absolute pulses per block */ 124885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 125885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 126885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Check encoder control struct */ 127885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgopus_int check_control_input( 128885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_EncControlStruct *encControl /* I Control structure */ 129885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 130885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 131885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Control internal sampling rate */ 132885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgopus_int silk_control_audio_bandwidth( 133885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_encoder_state *psEncC, /* I/O Pointer to Silk encoder state */ 134885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_EncControlStruct *encControl /* I Control structure */ 135885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 136885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 137885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Control SNR of redidual quantizer */ 138885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgopus_int silk_control_SNR( 139885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_encoder_state *psEncC, /* I/O Pointer to Silk encoder state */ 140885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int32 TargetRate_bps /* I Target max bitrate (bps) */ 141885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 142885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 143885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/***************/ 144885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Shell coder */ 145885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/***************/ 146885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 147885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Encode quantization indices of excitation */ 148885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_encode_pulses( 149885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org ec_enc *psRangeEnc, /* I/O compressor data structure */ 150885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int signalType, /* I Signal type */ 151885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int quantOffsetType, /* I quantOffsetType */ 152885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int8 pulses[], /* I quantization indices */ 153885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int frame_length /* I Frame length */ 154885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 155885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 156885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Shell encoder, operates on one shell code frame of 16 pulses */ 157885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_shell_encoder( 158885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org ec_enc *psRangeEnc, /* I/O compressor data structure */ 159885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int *pulses0 /* I data: nonnegative pulse amplitudes */ 160885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 161885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 162885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Shell decoder, operates on one shell code frame of 16 pulses */ 163885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_shell_decoder( 164885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int *pulses0, /* O data: nonnegative pulse amplitudes */ 165885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org ec_dec *psRangeDec, /* I/O Compressor data structure */ 166885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int pulses4 /* I number of pulses per pulse-subframe */ 167885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 168885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 169885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Gain scalar quantization with hysteresis, uniform on log scale */ 170885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_gains_quant( 171885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int8 ind[ MAX_NB_SUBFR ], /* O gain indices */ 172885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int32 gain_Q16[ MAX_NB_SUBFR ], /* I/O gains (quantized out) */ 173885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int8 *prev_ind, /* I/O last index in previous frame */ 174885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int conditional, /* I first gain is delta coded if 1 */ 175885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int nb_subfr /* I number of subframes */ 176885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 177885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 178885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Gains scalar dequantization, uniform on log scale */ 179885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_gains_dequant( 180885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int32 gain_Q16[ MAX_NB_SUBFR ], /* O quantized gains */ 181885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int8 ind[ MAX_NB_SUBFR ], /* I gain indices */ 182885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int8 *prev_ind, /* I/O last index in previous frame */ 183885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int conditional, /* I first gain is delta coded if 1 */ 184885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int nb_subfr /* I number of subframes */ 185885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 186885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 187885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Compute unique identifier of gain indices vector */ 188885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgopus_int32 silk_gains_ID( /* O returns unique identifier of gains */ 189885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int8 ind[ MAX_NB_SUBFR ], /* I gain indices */ 190885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int nb_subfr /* I number of subframes */ 191885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 192885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 193885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Interpolate two vectors */ 194885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_interpolate( 195885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int16 xi[ MAX_LPC_ORDER ], /* O interpolated vector */ 196885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int16 x0[ MAX_LPC_ORDER ], /* I first vector */ 197885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int16 x1[ MAX_LPC_ORDER ], /* I second vector */ 198885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int ifact_Q2, /* I interp. factor, weight on 2nd vector */ 199885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int d /* I number of parameters */ 200885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 201885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 202885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* LTP tap quantizer */ 203885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_quant_LTP_gains( 204885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int16 B_Q14[ MAX_NB_SUBFR * LTP_ORDER ], /* I/O (un)quantized LTP gains */ 205885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int8 cbk_index[ MAX_NB_SUBFR ], /* O Codebook Index */ 206885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int8 *periodicity_index, /* O Periodicity Index */ 2073c3902f0ac13428394f14f78f0fab05ef3468d69tlegrand@google.com opus_int32 *sum_gain_dB_Q7, /* I/O Cumulative max prediction gain */ 208885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int32 W_Q18[ MAX_NB_SUBFR*LTP_ORDER*LTP_ORDER ], /* I Error Weights in Q18 */ 209885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int mu_Q9, /* I Mu value (R/D tradeoff) */ 210885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int lowComplexity, /* I Flag for low complexity */ 211885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int nb_subfr /* I number of subframes */ 212885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 213885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 214885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Entropy constrained matrix-weighted VQ, for a single input data vector */ 215885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_VQ_WMat_EC( 216885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int8 *ind, /* O index of best codebook vector */ 217885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int32 *rate_dist_Q14, /* O best weighted quant error + mu * rate */ 2183c3902f0ac13428394f14f78f0fab05ef3468d69tlegrand@google.com opus_int *gain_Q7, /* O sum of absolute LTP coefficients */ 219885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int16 *in_Q14, /* I input vector to be quantized */ 220885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int32 *W_Q18, /* I weighting matrix */ 221885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int8 *cb_Q7, /* I codebook */ 2223c3902f0ac13428394f14f78f0fab05ef3468d69tlegrand@google.com const opus_uint8 *cb_gain_Q7, /* I codebook effective gain */ 223885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_uint8 *cl_Q5, /* I code length for each codebook vector */ 224885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int mu_Q9, /* I tradeoff betw. weighted error and rate */ 2253c3902f0ac13428394f14f78f0fab05ef3468d69tlegrand@google.com const opus_int32 max_gain_Q7, /* I maximum sum of absolute LTP coefficients */ 226885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int L /* I number of vectors in codebook */ 227885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 228885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 229885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/************************************/ 230885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Noise shaping quantization (NSQ) */ 231885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/************************************/ 232885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_NSQ( 233885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const silk_encoder_state *psEncC, /* I/O Encoder State */ 234885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_nsq_state *NSQ, /* I/O NSQ state */ 235885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org SideInfoIndices *psIndices, /* I/O Quantization Indices */ 236885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int32 x_Q3[], /* I Prefiltered input signal */ 237885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int8 pulses[], /* O Quantized pulse signal */ 238885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */ 239885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */ 240885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ 241885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */ 242885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */ 243885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */ 244885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I Quantization step sizes */ 245885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */ 246885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int Lambda_Q10, /* I Rate/distortion tradeoff */ 247885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int LTP_scale_Q14 /* I LTP state scaling */ 248885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 249885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 250885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Noise shaping using delayed decision */ 251885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_NSQ_del_dec( 252885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const silk_encoder_state *psEncC, /* I/O Encoder State */ 253885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_nsq_state *NSQ, /* I/O NSQ state */ 254885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org SideInfoIndices *psIndices, /* I/O Quantization Indices */ 255885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int32 x_Q3[], /* I Prefiltered input signal */ 256885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int8 pulses[], /* O Quantized pulse signal */ 257885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */ 258885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */ 259885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ 260885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */ 261885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */ 262885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */ 263885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I Quantization step sizes */ 264885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */ 265885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int Lambda_Q10, /* I Rate/distortion tradeoff */ 266885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int LTP_scale_Q14 /* I LTP state scaling */ 267885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 268885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 269885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/************/ 270885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Silk VAD */ 271885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/************/ 272885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Initialize the Silk VAD */ 273885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgopus_int silk_VAD_Init( /* O Return value, 0 if success */ 274885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_VAD_state *psSilk_VAD /* I/O Pointer to Silk VAD state */ 275885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 276885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 277885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Get speech activity level in Q8 */ 278885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgopus_int silk_VAD_GetSA_Q8( /* O Return value, 0 if success */ 279885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_encoder_state *psEncC, /* I/O Encoder state */ 280885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int16 pIn[] /* I PCM input */ 281885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 282885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 283885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Low-pass filter with variable cutoff frequency based on */ 284885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* piece-wise linear interpolation between elliptic filters */ 285885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Start by setting transition_frame_no = 1; */ 286885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_LP_variable_cutoff( 287885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_LP_state *psLP, /* I/O LP filter state */ 288885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int16 *frame, /* I/O Low-pass filtered output signal */ 289885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int frame_length /* I Frame length */ 290885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 291885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 292885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/******************/ 293885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* NLSF Quantizer */ 294885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/******************/ 295885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Limit, stabilize, convert and quantize NLSFs */ 296885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_process_NLSFs( 297885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_encoder_state *psEncC, /* I/O Encoder state */ 298885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int16 PredCoef_Q12[ 2 ][ MAX_LPC_ORDER ], /* O Prediction coefficients */ 299885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int16 pNLSF_Q15[ MAX_LPC_ORDER ], /* I/O Normalized LSFs (quant out) (0 - (2^15-1)) */ 300885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int16 prev_NLSFq_Q15[ MAX_LPC_ORDER ] /* I Previous Normalized LSFs (0 - (2^15-1)) */ 301885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 302885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 303885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgopus_int32 silk_NLSF_encode( /* O Returns RD value in Q25 */ 304885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int8 *NLSFIndices, /* I Codebook path vector [ LPC_ORDER + 1 ] */ 305885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int16 *pNLSF_Q15, /* I/O Quantized NLSF vector [ LPC_ORDER ] */ 306885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const silk_NLSF_CB_struct *psNLSF_CB, /* I Codebook object */ 307885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int16 *pW_QW, /* I NLSF weight vector [ LPC_ORDER ] */ 308885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int NLSF_mu_Q20, /* I Rate weight for the RD optimization */ 309885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int nSurvivors, /* I Max survivors after first stage */ 310885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int signalType /* I Signal type: 0/1/2 */ 311885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 312885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 313885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Compute quantization errors for an LPC_order element input vector for a VQ codebook */ 314885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_NLSF_VQ( 315885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int32 err_Q26[], /* O Quantization errors [K] */ 316885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int16 in_Q15[], /* I Input vectors to be quantized [LPC_order] */ 317885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_uint8 pCB_Q8[], /* I Codebook vectors [K*LPC_order] */ 318885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int K, /* I Number of codebook vectors */ 319885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int LPC_order /* I Number of LPCs */ 320885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 321885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 322885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Delayed-decision quantizer for NLSF residuals */ 323885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgopus_int32 silk_NLSF_del_dec_quant( /* O Returns RD value in Q25 */ 324885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int8 indices[], /* O Quantization indices [ order ] */ 325885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int16 x_Q10[], /* I Input [ order ] */ 326885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int16 w_Q5[], /* I Weights [ order ] */ 327885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_uint8 pred_coef_Q8[], /* I Backward predictor coefs [ order ] */ 328885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int16 ec_ix[], /* I Indices to entropy coding tables [ order ] */ 329885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_uint8 ec_rates_Q5[], /* I Rates [] */ 330885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int quant_step_size_Q16, /* I Quantization step size */ 331885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int16 inv_quant_step_size_Q6, /* I Inverse quantization step size */ 332885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int32 mu_Q20, /* I R/D tradeoff */ 333885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int16 order /* I Number of input values */ 334885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 335885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 336885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Unpack predictor values and indices for entropy coding tables */ 337885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_NLSF_unpack( 338885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int16 ec_ix[], /* O Indices to entropy tables [ LPC_ORDER ] */ 339885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_uint8 pred_Q8[], /* O LSF predictor [ LPC_ORDER ] */ 340885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const silk_NLSF_CB_struct *psNLSF_CB, /* I Codebook object */ 341885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int CB1_index /* I Index of vector in first LSF codebook */ 342885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 343885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 344885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/***********************/ 345885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* NLSF vector decoder */ 346885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/***********************/ 347885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_NLSF_decode( 348885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int16 *pNLSF_Q15, /* O Quantized NLSF vector [ LPC_ORDER ] */ 349885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int8 *NLSFIndices, /* I Codebook path vector [ LPC_ORDER + 1 ] */ 350885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const silk_NLSF_CB_struct *psNLSF_CB /* I Codebook object */ 351885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 352885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 353885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/****************************************************/ 354885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Decoder Functions */ 355885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/****************************************************/ 356885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgopus_int silk_init_decoder( 357885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_decoder_state *psDec /* I/O Decoder state pointer */ 358885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 359885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 360885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Set decoder sampling rate */ 361885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgopus_int silk_decoder_set_fs( 362885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_decoder_state *psDec, /* I/O Decoder state pointer */ 363885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int fs_kHz, /* I Sampling frequency (kHz) */ 364885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int32 fs_API_Hz /* I API Sampling frequency (Hz) */ 365885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 366885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 367885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/****************/ 368885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Decode frame */ 369885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/****************/ 370885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgopus_int silk_decode_frame( 371885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_decoder_state *psDec, /* I/O Pointer to Silk decoder state */ 372885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org ec_dec *psRangeDec, /* I/O Compressor data structure */ 373885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int16 pOut[], /* O Pointer to output speech frame */ 374885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int32 *pN, /* O Pointer to size of output frame */ 375885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int lostFlag, /* I 0: no loss, 1 loss, 2 decode fec */ 376885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int condCoding /* I The type of conditional coding to use */ 377885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 378885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 379885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Decode indices from bitstream */ 380885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_decode_indices( 381885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_decoder_state *psDec, /* I/O State */ 382885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org ec_dec *psRangeDec, /* I/O Compressor data structure */ 383885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int FrameIndex, /* I Frame number */ 384885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int decode_LBRR, /* I Flag indicating LBRR data is being decoded */ 385885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int condCoding /* I The type of conditional coding to use */ 386885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 387885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 388885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Decode parameters from payload */ 389885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_decode_parameters( 390885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_decoder_state *psDec, /* I/O State */ 391885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_decoder_control *psDecCtrl, /* I/O Decoder control */ 392885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int condCoding /* I The type of conditional coding to use */ 393885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 394885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 395885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Core decoder. Performs inverse NSQ operation LTP + LPC */ 396885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_decode_core( 397885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_decoder_state *psDec, /* I/O Decoder state */ 398885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_decoder_control *psDecCtrl, /* I Decoder control */ 399885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int16 xq[], /* O Decoded speech */ 400885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int pulses[ MAX_FRAME_LENGTH ] /* I Pulse signal */ 401885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 402885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 403885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Decode quantization indices of excitation (Shell coding) */ 404885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_decode_pulses( 405885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org ec_dec *psRangeDec, /* I/O Compressor data structure */ 406885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int pulses[], /* O Excitation signal */ 407885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int signalType, /* I Sigtype */ 408885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int quantOffsetType, /* I quantOffsetType */ 409885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int frame_length /* I Frame length */ 410885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 411885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 412885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/******************/ 413885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* CNG */ 414885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/******************/ 415885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 416885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Reset CNG */ 417885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_CNG_Reset( 418885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_decoder_state *psDec /* I/O Decoder state */ 419885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 420885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 421885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Updates CNG estimate, and applies the CNG when packet was lost */ 422885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_CNG( 423885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_decoder_state *psDec, /* I/O Decoder state */ 424885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_decoder_control *psDecCtrl, /* I/O Decoder control */ 425885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int16 frame[], /* I/O Signal */ 426885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int length /* I Length of residual */ 427885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 428885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 429885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Encoding of various parameters */ 430885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_encode_indices( 431885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_encoder_state *psEncC, /* I/O Encoder state */ 432885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org ec_enc *psRangeEnc, /* I/O Compressor data structure */ 433885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int FrameIndex, /* I Frame number */ 434885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int encode_LBRR, /* I Flag indicating LBRR data is being encoded */ 435885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int condCoding /* I The type of conditional coding to use */ 436885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org); 437885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 438885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif 439