SILK update with LBRR and some bugfixes
authorKoen Vos <koen.vos@skype.net>
Mon, 14 Feb 2011 19:21:57 +0000 (14:21 -0500)
committerJean-Marc Valin <jean-marc.valin@octasic.com>
Mon, 14 Feb 2011 19:43:54 +0000 (14:43 -0500)
196 files changed:
Makefile.am
interface/SKP_Silk_SDK_API.h
interface/SKP_Silk_control.h
interface/SKP_Silk_errors.h
interface/SKP_Silk_typedef.h
interface/SKP_debug.h
src_FIX/SKP_Silk_HP_variable_cutoff_FIX.c
src_FIX/SKP_Silk_LTP_analysis_filter_FIX.c
src_FIX/SKP_Silk_LTP_scale_ctrl_FIX.c
src_FIX/SKP_Silk_NLSF_MSVQ_encode_FIX.c
src_FIX/SKP_Silk_NLSF_VQ_rate_distortion_FIX.c
src_FIX/SKP_Silk_NLSF_VQ_sum_error_FIX.c
src_FIX/SKP_Silk_control_codec_FIX.c
src_FIX/SKP_Silk_corrMatrix_FIX.c
src_FIX/SKP_Silk_encode_frame_FIX.c
src_FIX/SKP_Silk_find_LPC_FIX.c
src_FIX/SKP_Silk_find_LTP_FIX.c
src_FIX/SKP_Silk_find_pitch_lags_FIX.c
src_FIX/SKP_Silk_find_pred_coefs_FIX.c
src_FIX/SKP_Silk_init_encoder_FIX.c
src_FIX/SKP_Silk_main_FIX.h
src_FIX/SKP_Silk_noise_shape_analysis_FIX.c
src_FIX/SKP_Silk_prefilter_FIX.c
src_FIX/SKP_Silk_process_NLSFs_FIX.c
src_FIX/SKP_Silk_process_gains_FIX.c
src_FIX/SKP_Silk_regularize_correlations_FIX.c
src_FIX/SKP_Silk_residual_energy16_FIX.c
src_FIX/SKP_Silk_residual_energy_FIX.c
src_FIX/SKP_Silk_solve_LS_FIX.c
src_FIX/SKP_Silk_structs_FIX.h
src_FIX/SKP_Silk_warped_autocorrelation_FIX.c
src_FLP/SKP_Silk_HP_variable_cutoff_FLP.c
src_FLP/SKP_Silk_LPC_analysis_filter_FLP.c
src_FLP/SKP_Silk_LTP_analysis_filter_FLP.c
src_FLP/SKP_Silk_LTP_scale_ctrl_FLP.c
src_FLP/SKP_Silk_NLSF_MSVQ_decode_FLP.c
src_FLP/SKP_Silk_NLSF_MSVQ_encode_FLP.c
src_FLP/SKP_Silk_NLSF_VQ_rate_distortion_FLP.c
src_FLP/SKP_Silk_NLSF_VQ_sum_error_FLP.c
src_FLP/SKP_Silk_apply_sine_window_FLP.c
src_FLP/SKP_Silk_assembler_FLP.h
src_FLP/SKP_Silk_control_codec_FLP.c
src_FLP/SKP_Silk_corrMatrix_FLP.c
src_FLP/SKP_Silk_encode_frame_FLP.c
src_FLP/SKP_Silk_find_LPC_FLP.c
src_FLP/SKP_Silk_find_LTP_FLP.c
src_FLP/SKP_Silk_find_pitch_lags_FLP.c
src_FLP/SKP_Silk_find_pred_coefs_FLP.c
src_FLP/SKP_Silk_init_encoder_FLP.c
src_FLP/SKP_Silk_main_FLP.h
src_FLP/SKP_Silk_noise_shape_analysis_FLP.c
src_FLP/SKP_Silk_prefilter_FLP.c
src_FLP/SKP_Silk_process_NLSFs_FLP.c
src_FLP/SKP_Silk_process_gains_FLP.c
src_FLP/SKP_Silk_regularize_correlations_FLP.c
src_FLP/SKP_Silk_residual_energy_FLP.c
src_FLP/SKP_Silk_solve_LS_FLP.c
src_FLP/SKP_Silk_structs_FLP.h
src_FLP/SKP_Silk_warped_autocorrelation_FLP.c
src_FLP/SKP_Silk_wrappers_FLP.c
src_FLP/src_FLP.vcxproj
src_FLP/src_FLP.vcxproj.filters
src_SigProc_FIX/SKP_Silk_A2NLSF.c
src_SigProc_FIX/SKP_Silk_Inlines.h
src_SigProc_FIX/SKP_Silk_LPC_analysis_filter.c [new file with mode: 0644]
src_SigProc_FIX/SKP_Silk_LPC_inv_pred_gain.c
src_SigProc_FIX/SKP_Silk_LPC_stabilize.c
src_SigProc_FIX/SKP_Silk_LPC_synthesis_filter.c
src_SigProc_FIX/SKP_Silk_LPC_synthesis_order16.c
src_SigProc_FIX/SKP_Silk_LSF_cos_table.c
src_SigProc_FIX/SKP_Silk_MA.c [deleted file]
src_SigProc_FIX/SKP_Silk_MacroCount.h
src_SigProc_FIX/SKP_Silk_MacroDebug.h
src_SigProc_FIX/SKP_Silk_NLSF2A.c
src_SigProc_FIX/SKP_Silk_NLSF_VQ_weights_laroia.c
src_SigProc_FIX/SKP_Silk_NLSF_stabilize.c
src_SigProc_FIX/SKP_Silk_SigProc_FIX.h
src_SigProc_FIX/SKP_Silk_allpass_int.c
src_SigProc_FIX/SKP_Silk_ana_filt_bank_1.c
src_SigProc_FIX/SKP_Silk_apply_sine_window.c
src_SigProc_FIX/SKP_Silk_array_maxabs.c
src_SigProc_FIX/SKP_Silk_autocorr.c
src_SigProc_FIX/SKP_Silk_biquad_alt.c
src_SigProc_FIX/SKP_Silk_burg_modified.c
src_SigProc_FIX/SKP_Silk_bwexpander.c
src_SigProc_FIX/SKP_Silk_bwexpander_32.c
src_SigProc_FIX/SKP_Silk_common_pitch_est_defines.h [deleted file]
src_SigProc_FIX/SKP_Silk_debug.c [new file with mode: 0644]
src_SigProc_FIX/SKP_Silk_decode_pitch.c
src_SigProc_FIX/SKP_Silk_inner_prod_aligned.c
src_SigProc_FIX/SKP_Silk_k2a.c
src_SigProc_FIX/SKP_Silk_k2a_Q16.c
src_SigProc_FIX/SKP_Silk_lin2log.c
src_SigProc_FIX/SKP_Silk_log2lin.c
src_SigProc_FIX/SKP_Silk_lowpass_int.c
src_SigProc_FIX/SKP_Silk_lowpass_short.c
src_SigProc_FIX/SKP_Silk_macros.h
src_SigProc_FIX/SKP_Silk_pitch_analysis_core.c
src_SigProc_FIX/SKP_Silk_pitch_est_defines.h
src_SigProc_FIX/SKP_Silk_pitch_est_tables.c
src_SigProc_FIX/SKP_Silk_resampler.c
src_SigProc_FIX/SKP_Silk_resampler_down2.c
src_SigProc_FIX/SKP_Silk_resampler_down2_3.c
src_SigProc_FIX/SKP_Silk_resampler_down3.c
src_SigProc_FIX/SKP_Silk_resampler_private.h
src_SigProc_FIX/SKP_Silk_resampler_private_AR2.c
src_SigProc_FIX/SKP_Silk_resampler_private_ARMA4.c
src_SigProc_FIX/SKP_Silk_resampler_private_IIR_FIR.c
src_SigProc_FIX/SKP_Silk_resampler_private_copy.c
src_SigProc_FIX/SKP_Silk_resampler_private_down4.c
src_SigProc_FIX/SKP_Silk_resampler_private_down_FIR.c
src_SigProc_FIX/SKP_Silk_resampler_private_up2_HQ.c
src_SigProc_FIX/SKP_Silk_resampler_private_up4.c
src_SigProc_FIX/SKP_Silk_resampler_rom.c
src_SigProc_FIX/SKP_Silk_resampler_rom.h
src_SigProc_FIX/SKP_Silk_resampler_structs.h
src_SigProc_FIX/SKP_Silk_resampler_up2.c
src_SigProc_FIX/SKP_Silk_scale_copy_vector16.c
src_SigProc_FIX/SKP_Silk_scale_vector.c
src_SigProc_FIX/SKP_Silk_schur.c
src_SigProc_FIX/SKP_Silk_schur64.c
src_SigProc_FIX/SKP_Silk_sigm_Q15.c
src_SigProc_FIX/SKP_Silk_sort.c
src_SigProc_FIX/SKP_Silk_sum_sqr_shift.c
src_SigProc_FIX/src_SigProc_FIX.vcxproj
src_SigProc_FIX/src_SigProc_FIX.vcxproj.filters
src_SigProc_FLP/SKP_Silk_LPC_inv_pred_gain_FLP.c
src_SigProc_FLP/SKP_Silk_NLSF_VQ_weights_laroia_FLP.c
src_SigProc_FLP/SKP_Silk_SigProc_FLP.h
src_SigProc_FLP/SKP_Silk_allpass_int_FLP.c [deleted file]
src_SigProc_FLP/SKP_Silk_autocorrelation_FLP.c
src_SigProc_FLP/SKP_Silk_burg_modified_FLP.c
src_SigProc_FLP/SKP_Silk_bwexpander_FLP.c
src_SigProc_FLP/SKP_Silk_decimate2_coarse_FLP.c [deleted file]
src_SigProc_FLP/SKP_Silk_decimate2_coarsest_FLP.c [deleted file]
src_SigProc_FLP/SKP_Silk_energy_FLP.c
src_SigProc_FLP/SKP_Silk_inner_product_FLP.c
src_SigProc_FLP/SKP_Silk_k2a_FLP.c
src_SigProc_FLP/SKP_Silk_levinsondurbin_FLP.c
src_SigProc_FLP/SKP_Silk_pitch_analysis_core_FLP.c
src_SigProc_FLP/SKP_Silk_scale_copy_vector_FLP.c
src_SigProc_FLP/SKP_Silk_scale_vector_FLP.c
src_SigProc_FLP/SKP_Silk_schur_FLP.c
src_SigProc_FLP/SKP_Silk_sort_FLP.c
src_SigProc_FLP/src_SigProc_FLP.vcxproj
src_SigProc_FLP/src_SigProc_FLP.vcxproj.filters
src_common/SKP_Silk_CNG.c
src_common/SKP_Silk_LBRR_embed.c [moved from src_FLP/SKP_Silk_NLSF_VQ_weights_laroia_FLP.c with 53% similarity]
src_common/SKP_Silk_LP_variable_cutoff.c
src_common/SKP_Silk_NLSF2A_stable.c
src_common/SKP_Silk_NLSF_MSVQ_decode.c
src_common/SKP_Silk_NSQ.c
src_common/SKP_Silk_NSQ_del_dec.c
src_common/SKP_Silk_PLC.c
src_common/SKP_Silk_PLC.h
src_common/SKP_Silk_VAD.c
src_common/SKP_Silk_VQ_WMat_EC.c
src_common/SKP_Silk_code_signs.c
src_common/SKP_Silk_control_audio_bandwidth.c
src_common/SKP_Silk_create_init_destroy.c
src_common/SKP_Silk_dec_API.c
src_common/SKP_Silk_decode_core.c
src_common/SKP_Silk_decode_frame.c
src_common/SKP_Silk_decode_indices.c
src_common/SKP_Silk_decode_parameters.c
src_common/SKP_Silk_decode_pulses.c
src_common/SKP_Silk_decoder_set_fs.c
src_common/SKP_Silk_define.h
src_common/SKP_Silk_enc_API.c
src_common/SKP_Silk_encode_indices.c
src_common/SKP_Silk_encode_pulses.c
src_common/SKP_Silk_gain_quant.c
src_common/SKP_Silk_interpolate.c
src_common/SKP_Silk_main.h
src_common/SKP_Silk_pulses_to_bytes.c [deleted file]
src_common/SKP_Silk_quant_LTP_gains.c
src_common/SKP_Silk_setup.h [moved from src_common/SKP_Silk_setup_complexity.h with 82% similarity]
src_common/SKP_Silk_shell_coder.c
src_common/SKP_Silk_structs.h
src_common/SKP_Silk_tables.h
src_common/SKP_Silk_tables_LTP.c
src_common/SKP_Silk_tables_NLSF_CB.h
src_common/SKP_Silk_tables_NLSF_CB0_10.c
src_common/SKP_Silk_tables_NLSF_CB0_16.c
src_common/SKP_Silk_tables_NLSF_CB1_10.c
src_common/SKP_Silk_tables_NLSF_CB1_16.c
src_common/SKP_Silk_tables_gain.c
src_common/SKP_Silk_tables_other.c
src_common/SKP_Silk_tables_pitch_lag.c
src_common/SKP_Silk_tables_pulses_per_block.c
src_common/SKP_Silk_tuning_parameters.h
src_common/src_common.vcxproj
src_common/src_common.vcxproj.filters
test/Decoder.c
test/Encoder.c
test/signalCompare.c

index 6556ee8..b2ce42c 100644 (file)
@@ -40,13 +40,13 @@ src_common/SKP_Silk_encode_indices.c \
 src_common/SKP_Silk_encode_pulses.c \
 src_common/SKP_Silk_gain_quant.c \
 src_common/SKP_Silk_interpolate.c \
+src_common/SKP_Silk_LBRR_embed.c \
 src_common/SKP_Silk_LP_variable_cutoff.c \
 src_common/SKP_Silk_NLSF2A_stable.c \
 src_common/SKP_Silk_NLSF_MSVQ_decode.c \
 src_common/SKP_Silk_NSQ.c \
 src_common/SKP_Silk_NSQ_del_dec.c \
 src_common/SKP_Silk_PLC.c \
-src_common/SKP_Silk_pulses_to_bytes.c \
 src_common/SKP_Silk_shell_coder.c \
 src_common/SKP_Silk_tables_gain.c \
 src_common/SKP_Silk_tables_LTP.c \
@@ -78,7 +78,6 @@ src_FLP/SKP_Silk_NLSF_MSVQ_decode_FLP.c \
 src_FLP/SKP_Silk_NLSF_MSVQ_encode_FLP.c \
 src_FLP/SKP_Silk_NLSF_VQ_rate_distortion_FLP.c \
 src_FLP/SKP_Silk_NLSF_VQ_sum_error_FLP.c \
-src_FLP/SKP_Silk_NLSF_VQ_weights_laroia_FLP.c \
 src_FLP/SKP_Silk_noise_shape_analysis_FLP.c \
 src_FLP/SKP_Silk_prefilter_FLP.c \
 src_FLP/SKP_Silk_process_gains_FLP.c \
@@ -98,6 +97,7 @@ src_SigProc_FIX/SKP_Silk_biquad_alt.c \
 src_SigProc_FIX/SKP_Silk_burg_modified.c \
 src_SigProc_FIX/SKP_Silk_bwexpander_32.c \
 src_SigProc_FIX/SKP_Silk_bwexpander.c \
+src_SigProc_FIX/SKP_Silk_debug.c \
 src_SigProc_FIX/SKP_Silk_decode_pitch.c \
 src_SigProc_FIX/SKP_Silk_inner_prod_aligned.c \
 src_SigProc_FIX/SKP_Silk_k2a.c \
@@ -106,12 +106,12 @@ src_SigProc_FIX/SKP_Silk_lin2log.c \
 src_SigProc_FIX/SKP_Silk_log2lin.c \
 src_SigProc_FIX/SKP_Silk_lowpass_int.c \
 src_SigProc_FIX/SKP_Silk_lowpass_short.c \
+src_SigProc_FIX/SKP_Silk_LPC_analysis_filter.c \
 src_SigProc_FIX/SKP_Silk_LPC_inv_pred_gain.c \
 src_SigProc_FIX/SKP_Silk_LPC_stabilize.c \
 src_SigProc_FIX/SKP_Silk_LPC_synthesis_filter.c \
 src_SigProc_FIX/SKP_Silk_LPC_synthesis_order16.c \
 src_SigProc_FIX/SKP_Silk_LSF_cos_table.c \
-src_SigProc_FIX/SKP_Silk_MA.c \
 src_SigProc_FIX/SKP_Silk_NLSF2A.c \
 src_SigProc_FIX/SKP_Silk_NLSF_stabilize.c \
 src_SigProc_FIX/SKP_Silk_NLSF_VQ_weights_laroia.c \
@@ -138,17 +138,15 @@ src_SigProc_FIX/SKP_Silk_schur.c \
 src_SigProc_FIX/SKP_Silk_sigm_Q15.c \
 src_SigProc_FIX/SKP_Silk_sort.c \
 src_SigProc_FIX/SKP_Silk_sum_sqr_shift.c \
-src_SigProc_FLP/SKP_Silk_allpass_int_FLP.c \
 src_SigProc_FLP/SKP_Silk_autocorrelation_FLP.c \
 src_SigProc_FLP/SKP_Silk_burg_modified_FLP.c \
 src_SigProc_FLP/SKP_Silk_bwexpander_FLP.c \
-src_SigProc_FLP/SKP_Silk_decimate2_coarse_FLP.c \
-src_SigProc_FLP/SKP_Silk_decimate2_coarsest_FLP.c \
 src_SigProc_FLP/SKP_Silk_energy_FLP.c \
 src_SigProc_FLP/SKP_Silk_inner_product_FLP.c \
 src_SigProc_FLP/SKP_Silk_k2a_FLP.c \
 src_SigProc_FLP/SKP_Silk_levinsondurbin_FLP.c \
 src_SigProc_FLP/SKP_Silk_LPC_inv_pred_gain_FLP.c \
+src_SigProc_FLP/SKP_Silk_NLSF_VQ_weights_laroia_FLP.c \
 src_SigProc_FLP/SKP_Silk_pitch_analysis_core_FLP.c \
 src_SigProc_FLP/SKP_Silk_scale_copy_vector_FLP.c \
 src_SigProc_FLP/SKP_Silk_scale_vector_FLP.c \
@@ -172,13 +170,12 @@ src_common/SKP_Silk_structs.h \
 src_common/SKP_Silk_tables.h \
 src_common/SKP_Silk_tables_NLSF_CB.h \
 src_common/SKP_Silk_tuning_parameters.h \
-src_common/SKP_Silk_setup_complexity.h \
+src_common/SKP_Silk_setup.h \
 src_FIX/SKP_Silk_main_FIX.h \
 src_FIX/SKP_Silk_structs_FIX.h \
 src_FLP/SKP_Silk_assembler_FLP.h \
 src_FLP/SKP_Silk_main_FLP.h \
 src_FLP/SKP_Silk_structs_FLP.h \
-src_SigProc_FIX/SKP_Silk_common_pitch_est_defines.h \
 src_SigProc_FIX/SKP_Silk_Inlines.h \
 src_SigProc_FIX/SKP_Silk_MacroCount.h \
 src_SigProc_FIX/SKP_Silk_MacroDebug.h \
index f8d981d..ed4fcc4 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
@@ -43,11 +43,9 @@ extern "C"
 \r
 /* Struct for TOC (Table of Contents) */\r
 typedef struct {\r
-    SKP_int     framesInPacket;                                 /* Number of 20 ms frames in packet     */\r
-    SKP_int     fs_kHz;                                         /* Sampling frequency in packet         */\r
-    SKP_int     inbandLBRR;                                     /* Does packet contain LBRR information */\r
-    SKP_int     corrupt;                                        /* Packet is corrupt                    */\r
-    SKP_int     signalTypeFlags[ SILK_MAX_FRAMES_PER_PACKET ];  /* Signal type for each frame in packet */\r
+    SKP_int     VADFlag;                                /* Voice activity for packet                            */\r
+    SKP_int     VADFlags[ SILK_MAX_FRAMES_PER_PACKET ]; /* Voice activity for each frame in packet              */\r
+    SKP_int     inbandFECFlag;                          /* Flag indicating if packet contains in-band FEC       */\r
 } SKP_Silk_TOC_struct;\r
 \r
 /****************************************/\r
@@ -113,7 +111,8 @@ SKP_int SKP_Silk_SDK_InitDecoder(                       /* O:   Returns error co
 SKP_int SKP_Silk_SDK_Decode(                            /* O:   Returns error code                              */\r
     void*                               decState,       /* I/O: State                                           */\r
     SKP_SILK_SDK_DecControlStruct*      decControl,     /* I/O: Control Structure                               */\r
-    SKP_int                             lostFlag,       /* I:   0: no loss, 1 loss                              */\r
+    SKP_int                             lostFlag,       /* I:   0: no loss, 1 loss, 2 decode fec                */\r
+    SKP_int                             newPacketFlag,  /* I:   Indicates first decoder call for this packet    */\r
     ec_dec                              *psRangeDec,    /* I/O  Compressor data structure                       */\r
     const SKP_int                       nBytesIn,       /* I:   Number of input bytes                           */\r
     SKP_int16                           *samplesOut,    /* O:   Decoded output speech vector                    */\r
@@ -134,10 +133,11 @@ void SKP_Silk_SDK_search_for_LBRR(
 /**************************************/\r
 /* Get table of contents for a packet */\r
 /**************************************/\r
-void SKP_Silk_SDK_get_TOC(\r
-    ec_dec                              *psRangeDec,    /* I/O  Compressor data structure                       */\r
-    const SKP_int16                     nBytesIn,       /* I:   Number of input bytes                           */\r
-    SKP_Silk_TOC_struct                 *Silk_TOC       /* O:   Table of contents                               */\r
+SKP_int SKP_Silk_SDK_get_TOC(\r
+    const SKP_uint8                     *payload,           /* I    Payload data                                */\r
+    const SKP_int                       nBytesIn,           /* I:   Number of input bytes                       */\r
+    const SKP_int                       nFramesPerPayload,  /* I:   Number of SILK frames per payload           */\r
+    SKP_Silk_TOC_struct                 *Silk_TOC           /* O:   Type of content                             */\r
 );\r
 \r
 #ifdef __cplusplus\r
index 2b7c6eb..0e283fb 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
@@ -42,10 +42,10 @@ typedef struct {
     /* I:   Input signal sampling rate in Hertz; 8000/12000/16000/24000/32000/44100/48000   */\r
     SKP_int32 API_sampleRate;\r
 \r
-    /* I:   Maximum internal sampling rate in Hertz; 8000/12000/16000/24000                 */\r
+    /* I:   Maximum internal sampling rate in Hertz; 8000/12000/16000                       */\r
     SKP_int32 maxInternalSampleRate;\r
 \r
-    /* I:   Minimum internal sampling rate in Hertz; 8000/12000/16000/24000                 */\r
+    /* I:   Minimum internal sampling rate in Hertz; 8000/12000/16000                       */\r
     SKP_int32 minInternalSampleRate;\r
 \r
     /* I:   Number of samples per packet in milliseconds; 10/20/40/60                       */\r
@@ -69,7 +69,7 @@ typedef struct {
     /* I:   Flag to use constant bitrate                                                    */\r
     SKP_int useCBR;\r
 \r
-    /* O:   Internal sampling rate used, in Hertz; 8000/12000/16000/24000                   */\r
+    /* O:   Internal sampling rate used, in Hertz; 8000/12000/16000                         */\r
     SKP_int32 internalSampleRate;\r
 } SKP_SILK_SDK_EncControlStruct;\r
 \r
@@ -83,7 +83,7 @@ typedef struct {
     /* I:   Number of samples per packet in milliseconds; 10/20/40/60                       */\r
     SKP_int payloadSize_ms;\r
 \r
-    /* I:   Internal sampling rate used, in Hertz; 8000/12000/16000/24000                   */\r
+    /* I:   Internal sampling rate used, in Hertz; 8000/12000/16000                         */\r
     SKP_int32 internalSampleRate;\r
 \r
     /* O:   Number of samples per frame                                                     */\r
@@ -91,12 +91,6 @@ typedef struct {
 \r
     /* O:   Frames per payload 1, 2, 3                                                      */\r
     SKP_int framesPerPayload;\r
-\r
-    /* O:   Flag to indicate that the decoder has remaining payloads internally             */\r
-    SKP_int moreInternalDecoderFrames;\r
-\r
-    /* O:   Distance between main payload and redundant payload in packets                  */\r
-    SKP_int inBandFECOffset;\r
 } SKP_SILK_SDK_DecControlStruct;\r
 \r
 #ifdef __cplusplus\r
index cb3079e..c751d9b 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
@@ -45,10 +45,10 @@ extern "C"
 /* Input length is not a multiple of 10 ms, or length is longer than the packet length */\r
 #define SKP_SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES        -101\r
 \r
-/* Sampling frequency not 8000, 12000, 16000 or 24000 Hertz */\r
+/* Sampling frequency not 8000, 12000 or 16000 Hertz */\r
 #define SKP_SILK_ENC_FS_NOT_SUPPORTED                   -102\r
 \r
-/* Packet size not 20, 40, 60, 80 or 100 ms */\r
+/* Packet size not 10, 20, 40, or 60 ms */\r
 #define SKP_SILK_ENC_PACKET_SIZE_NOT_SUPPORTED          -103\r
 \r
 /* Allocated payload buffer too short */\r
index 7cb661a..f2c1f6f 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
index f6e37cf..8495209 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
index c238687..bfc310b 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
index 1d90a97..4e21d65 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
index c7baece..090e003 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
@@ -41,7 +41,7 @@ void SKP_Silk_LTP_scale_ctrl_FIX(
     SKP_Silk_encoder_control_FIX    *psEncCtrl  /* I/O  encoder control FIX                         */\r
 )\r
 {\r
-    SKP_int round_loss, frames_per_packet;\r
+    SKP_int round_loss;\r
     SKP_int g_out_Q5, g_limit_Q15, thrld1_Q15, thrld2_Q15;\r
 \r
     /* 1st order high-pass filter */\r
@@ -55,27 +55,25 @@ void SKP_Silk_LTP_scale_ctrl_FIX(
     g_limit_Q15 = SKP_Silk_sigm_Q15( g_out_Q5 - ( 3 << 5 ) );\r
             \r
     /* Default is minimum scaling */\r
-    psEncCtrl->sCmn.LTP_scaleIndex = 0;\r
+    psEnc->sCmn.indices.LTP_scaleIndex = 0;\r
 \r
     /* Round the loss measure to whole pct */\r
     round_loss = ( SKP_int )psEnc->sCmn.PacketLoss_perc;\r
 \r
-    /* Only scale if first frame in packet 0% */\r
-    if( psEnc->sCmn.nFramesInPayloadBuf == 0 ) {\r
+    /* Only scale if first frame in packet */\r
+    if( psEnc->sCmn.nFramesAnalyzed == 0 ) {\r
         \r
-        frames_per_packet = SKP_DIV32_16( psEnc->sCmn.PacketSize_ms, SKP_SMULBB( SUB_FRAME_LENGTH_MS, psEnc->sCmn.nb_subfr ) );\r
-\r
-        round_loss += frames_per_packet - 1;\r
+        round_loss += psEnc->sCmn.nFramesPerPacket - 1;\r
         thrld1_Q15 = LTPScaleThresholds_Q15[ SKP_min_int( round_loss,     NB_THRESHOLDS - 1 ) ];\r
         thrld2_Q15 = LTPScaleThresholds_Q15[ SKP_min_int( round_loss + 1, NB_THRESHOLDS - 1 ) ];\r
     \r
         if( g_limit_Q15 > thrld1_Q15 ) {\r
             /* Maximum scaling */\r
-            psEncCtrl->sCmn.LTP_scaleIndex = 2;\r
+            psEnc->sCmn.indices.LTP_scaleIndex = 2;\r
         } else if( g_limit_Q15 > thrld2_Q15 ) {\r
             /* Medium scaling */\r
-            psEncCtrl->sCmn.LTP_scaleIndex = 1;\r
+            psEnc->sCmn.indices.LTP_scaleIndex = 1;\r
         }\r
     }\r
-    psEncCtrl->LTP_scale_Q14 = SKP_Silk_LTPScales_table_Q14[ psEncCtrl->sCmn.LTP_scaleIndex ];\r
+    psEncCtrl->LTP_scale_Q14 = SKP_Silk_LTPScales_table_Q14[ psEnc->sCmn.indices.LTP_scaleIndex ];\r
 }\r
index 2e926bb..81a5edd 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
@@ -31,7 +31,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 /* NLSF vector encoder */\r
 /***********************/\r
 void SKP_Silk_NLSF_MSVQ_encode_FIX(\r
-          SKP_int                   *NLSFIndices,           /* O    Codebook path vector [ CB_STAGES ]      */\r
+          SKP_int8                  *NLSFIndices,           /* O    Codebook path vector [ CB_STAGES ]      */\r
           SKP_int                   *pNLSF_Q15,             /* I/O  Quantized NLSF vector [ LPC_ORDER ]     */\r
     const SKP_Silk_NLSF_CB_struct   *psNLSF_CB,             /* I    Codebook object                         */\r
     const SKP_int                   *pNLSF_q_Q15_prev,      /* I    Prev. quantized NLSF vector [LPC_ORDER] */\r
@@ -53,13 +53,15 @@ void SKP_Silk_NLSF_MSVQ_encode_FIX(
     SKP_int32   pRate_Q5[       MAX_NLSF_MSVQ_SURVIVORS ];\r
     SKP_int32   pRate_new_Q5[   MAX_NLSF_MSVQ_SURVIVORS ];\r
     SKP_int     pTempIndices[   MAX_NLSF_MSVQ_SURVIVORS ];\r
-    SKP_int     pPath[          MAX_NLSF_MSVQ_SURVIVORS * NLSF_MSVQ_MAX_CB_STAGES ];\r
-    SKP_int     pPath_new[      MAX_NLSF_MSVQ_SURVIVORS * NLSF_MSVQ_MAX_CB_STAGES ];\r
-    SKP_int     pRes_Q15[       MAX_NLSF_MSVQ_SURVIVORS * MAX_LPC_ORDER ];\r
-    SKP_int     pRes_new_Q15[   MAX_NLSF_MSVQ_SURVIVORS * MAX_LPC_ORDER ];\r
-\r
-    const SKP_int   *pConstInt;\r
-          SKP_int   *pInt;\r
+    SKP_int8    pPath[          MAX_NLSF_MSVQ_SURVIVORS * NLSF_MSVQ_MAX_CB_STAGES ];\r
+    SKP_int8    pPath_new[      MAX_NLSF_MSVQ_SURVIVORS * NLSF_MSVQ_MAX_CB_STAGES ];\r
+    SKP_int16   pRes_Q15[       MAX_NLSF_MSVQ_SURVIVORS * MAX_LPC_ORDER ];\r
+    SKP_int16   pRes_new_Q15[   MAX_NLSF_MSVQ_SURVIVORS * MAX_LPC_ORDER ];\r
+\r
+    const SKP_int16 *pConstInt16;\r
+          SKP_int16 *pInt16;\r
+    const SKP_int8  *pConstInt8;\r
+          SKP_int8  *pInt8;\r
     const SKP_int8  *pCB_element;\r
     const SKP_Silk_NLSF_CBS *pCurrentCBStage;\r
 \r
@@ -140,35 +142,35 @@ void SKP_Silk_NLSF_MSVQ_encode_FIX(
             }\r
 \r
             /* Subtract new contribution from the previous residual vector for each of 'cur_survivors' */\r
-            pConstInt   = &pRes_Q15[ SKP_SMULBB( input_index, LPC_order ) ];\r
+            pConstInt16 = &pRes_Q15[ SKP_SMULBB( input_index, LPC_order ) ];\r
             pCB_element = &pCurrentCBStage->CB_NLSF_Q8[ SKP_SMULBB( cb_index, LPC_order ) ];\r
-            pInt        = &pRes_new_Q15[ SKP_SMULBB( k, LPC_order ) ];\r
+            pInt16      = &pRes_new_Q15[ SKP_SMULBB( k, LPC_order ) ];\r
             for( i = 0; i < LPC_order; i++ ) {\r
-                pInt[ i ] = pConstInt[ i ] - SKP_LSHIFT16( ( SKP_int )pCB_element[ i ], 7 );\r
+                pInt16[ i ] = pConstInt16[ i ] - SKP_LSHIFT16( ( SKP_int16 )pCB_element[ i ], 7 );\r
             }\r
 \r
             /* Update accumulated rate for stage 1 to the current */\r
             pRate_new_Q5[ k ] = pRate_Q5[ input_index ] + SKP_LSHIFT32( ( SKP_int32 )pCurrentCBStage->Rates_Q4[ cb_index ], 1 );\r
 \r
             /* Copy paths from previous matrix, starting with the best path */\r
-            pConstInt = &pPath[ SKP_SMULBB( input_index, psNLSF_CB->nStages ) ];\r
-            pInt      = &pPath_new[ SKP_SMULBB( k, psNLSF_CB->nStages ) ];\r
+            pConstInt8 = &pPath[ SKP_SMULBB( input_index, psNLSF_CB->nStages ) ];\r
+            pInt8      = &pPath_new[ SKP_SMULBB( k, psNLSF_CB->nStages ) ];\r
             for( i = 0; i < s; i++ ) {\r
-                pInt[ i ] = pConstInt[ i ];\r
+                pInt8[ i ] = pConstInt8[ i ];\r
             }\r
             /* Write the current stage indices for the 'cur_survivors' to the best path matrix */\r
-            pInt[ s ] = cb_index;\r
+            pInt8[ s ] = (SKP_int8)cb_index;\r
         }\r
 \r
         if( s < psNLSF_CB->nStages - 1 ) {\r
             /* Copy NLSF residual matrix for next stage */\r
-            SKP_memcpy( pRes_Q15, pRes_new_Q15, SKP_SMULBB( cur_survivors, LPC_order ) * sizeof( SKP_int ) );\r
+            SKP_memcpy( pRes_Q15, pRes_new_Q15, SKP_SMULBB( cur_survivors, LPC_order ) * sizeof( SKP_int16 ) );\r
 \r
             /* Copy rate vector for next stage */\r
             SKP_memcpy( pRate_Q5, pRate_new_Q5, cur_survivors * sizeof( SKP_int32 ) );\r
 \r
             /* Copy best path matrix for next stage */\r
-            SKP_memcpy( pPath, pPath_new, SKP_SMULBB( cur_survivors, psNLSF_CB->nStages ) * sizeof( SKP_int ) );\r
+            SKP_memcpy( pPath, pPath_new, SKP_SMULBB( cur_survivors, psNLSF_CB->nStages ) * sizeof( SKP_int8) );\r
         }\r
 \r
         prev_survivors = cur_survivors;\r
@@ -215,7 +217,7 @@ void SKP_Silk_NLSF_MSVQ_encode_FIX(
 #endif\r
 \r
     /* Copy best path to output argument */\r
-    SKP_memcpy( NLSFIndices, &pPath_new[ SKP_SMULBB( bestIndex, psNLSF_CB->nStages ) ], psNLSF_CB->nStages * sizeof( SKP_int ) );\r
+    SKP_memcpy( NLSFIndices, &pPath_new[ SKP_SMULBB( bestIndex, psNLSF_CB->nStages ) ], psNLSF_CB->nStages * sizeof( SKP_int8 ) );\r
 \r
     /* Decode and stabilize the best survivor */\r
     SKP_Silk_NLSF_MSVQ_decode( pNLSF_Q15, psNLSF_CB, NLSFIndices, LPC_order );\r
index e5bb81d..0caf4a5 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
@@ -31,7 +31,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 void SKP_Silk_NLSF_VQ_rate_distortion_FIX(\r
     SKP_int32                       *pRD_Q20,           /* O    Rate-distortion values [psNLSF_CBS->nVectors*N] */\r
     const SKP_Silk_NLSF_CBS         *psNLSF_CBS,        /* I    NLSF codebook stage struct                      */\r
-    const SKP_int                   *in_Q15,            /* I    Input vectors to be quantized                   */\r
+    const SKP_int16                 *in_Q15,            /* I    Input vectors to be quantized                   */\r
     const SKP_int                   *w_Q6,              /* I    Weight vector                                   */\r
     const SKP_int32                 *rate_acc_Q5,       /* I    Accumulated rates from previous stage           */\r
     const SKP_int                   mu_Q15,             /* I    Weight between weighted error and rate          */\r
index e1f5283..4c448f9 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
@@ -30,8 +30,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 /* Compute weighted quantization errors for an LPC_order element input vector, over one codebook stage */\r
 void SKP_Silk_NLSF_VQ_sum_error_FIX(\r
     SKP_int32                       *err_Q20,           /* O    Weighted quantization errors  [N*K]         */\r
-    const SKP_int                   *in_Q15,            /* I    Input vectors to be quantized [N*LPC_order] */\r
-    const SKP_int                   *w_Q6,              /* I    Weighting vectors             [N*LPC_order] */\r
+    const SKP_int16                 *in_Q15,            /* I    Input vectors to be quantized [N*LPC_order] */\r
+    const SKP_int                   *w_Q6,              /* I    Weighting vectors             [LPC_order]   */\r
     const SKP_int8                  *pCB_Q8,            /* I    Codebook vectors              [K*LPC_order] */\r
     const SKP_int                   N,                  /* I    Number of input vectors                     */\r
     const SKP_int                   K,                  /* I    Number of codebook vectors                  */\r
@@ -62,11 +62,11 @@ void SKP_Silk_NLSF_VQ_sum_error_FIX(
                 Wtmp_Q6 = Wcpy_Q6[ SKP_RSHIFT( m, 1 ) ];\r
 \r
                 /* Compute weighted squared quantization error for index m */\r
-                diff_Q15 = in_Q15[ m ] - SKP_LSHIFT16( ( SKP_int )( *cb_vec_Q8++ ), 7 ); // range: [ -32767 : 32767 ]\r
+                diff_Q15 = in_Q15[ m ] - SKP_LSHIFT16( ( SKP_int16 )( *cb_vec_Q8++ ), 7 ); // range: [ -32767 : 32767 ]\r
                 sum_error = SKP_SMLAWB( sum_error, SKP_SMULBB( diff_Q15, diff_Q15 ), Wtmp_Q6 );\r
 \r
                 /* Compute weighted squared quantization error for index m + 1 */\r
-                diff_Q15 = in_Q15[m + 1] - SKP_LSHIFT16( ( SKP_int )( *cb_vec_Q8++ ), 7 ); // range: [ -32767 : 32767 ]\r
+                diff_Q15 = in_Q15[m + 1] - SKP_LSHIFT16( ( SKP_int16 )( *cb_vec_Q8++ ), 7 ); // range: [ -32767 : 32767 ]\r
                 sum_error = SKP_SMLAWT( sum_error, SKP_SMULBB( diff_Q15, diff_Q15 ), Wtmp_Q6 );\r
             }\r
             SKP_assert( sum_error >= 0 );\r
index e62e042..016c88e 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
@@ -26,7 +26,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 ***********************************************************************/\r
 \r
 #include "SKP_Silk_main_FIX.h"\r
-#include "SKP_Silk_setup_complexity.h"\r
+#include "SKP_Silk_setup.h"\r
 \r
 /* ToDo: Move the functions belowto common to be able to use them in FLP control codec also */\r
 SKP_INLINE SKP_int SKP_Silk_setup_resamplers(\r
@@ -42,11 +42,7 @@ SKP_INLINE SKP_int SKP_Silk_setup_fs(
 \r
 SKP_INLINE SKP_int SKP_Silk_setup_rate(\r
     SKP_Silk_encoder_state_FIX      *psEnc,             /* I/O                      */\r
-    SKP_int                         TargetRate_bps      /* I                        */\r
-);\r
-\r
-SKP_INLINE SKP_int SKP_Silk_setup_LBRR(\r
-    SKP_Silk_encoder_state_FIX      *psEnc              /* I/O                      */\r
+    SKP_int32                       TargetRate_bps      /* I                        */\r
 );\r
 \r
 /* Control encoder SNR */\r
@@ -106,7 +102,7 @@ SKP_int SKP_Silk_control_encoder_FIX(
     /********************************************/\r
     /* Set LBRR usage                           */\r
     /********************************************/\r
-    ret += SKP_Silk_setup_LBRR( psEnc );\r
+    ret += SKP_Silk_setup_LBRR( &psEnc->sCmn );\r
 \r
     psEnc->sCmn.controlled_since_last_payload = 1;\r
 \r
@@ -182,7 +178,7 @@ SKP_INLINE SKP_int SKP_Silk_setup_fs(
             ret = SKP_SILK_ENC_PACKET_SIZE_NOT_SUPPORTED;\r
         }\r
         if( PacketSize_ms == 10 ) {\r
-            /* Only allowed when the payload buffer is empty */\r
+            psEnc->sCmn.nFramesPerPacket = 1;\r
             psEnc->sCmn.nb_subfr = MAX_NB_SUBFR >> 1;\r
             psEnc->sPred.pitch_LPC_win_length = SKP_SMULBB( FIND_PITCH_LPC_WIN_MS_2_SF, fs_kHz );\r
             if( psEnc->sCmn.fs_kHz == 8 ) {\r
@@ -191,6 +187,7 @@ SKP_INLINE SKP_int SKP_Silk_setup_fs(
                 psEnc->sCmn.pitch_contour_iCDF = SKP_Silk_pitch_contour_10_ms_iCDF;\r
             }\r
         } else {\r
+            psEnc->sCmn.nFramesPerPacket = SKP_DIV32_16( PacketSize_ms, MAX_FRAME_LENGTH_MS );\r
             psEnc->sCmn.nb_subfr = MAX_NB_SUBFR;\r
             psEnc->sPred.pitch_LPC_win_length = SKP_SMULBB( FIND_PITCH_LPC_WIN_MS, fs_kHz );\r
             if( psEnc->sCmn.fs_kHz == 8 ) {\r
@@ -200,21 +197,18 @@ SKP_INLINE SKP_int SKP_Silk_setup_fs(
             }\r
         }\r
         psEnc->sCmn.PacketSize_ms = PacketSize_ms;\r
-        psEnc->sCmn.LBRR_nBytes = 0;\r
     }\r
 \r
     /* Set internal sampling frequency */\r
     if( psEnc->sCmn.fs_kHz != fs_kHz ) {\r
         /* reset part of the state */\r
-        SKP_memset( &psEnc->sShape,              0,                        sizeof( SKP_Silk_shape_state_FIX ) );\r
-        SKP_memset( &psEnc->sPrefilt,            0,                        sizeof( SKP_Silk_prefilter_state_FIX ) );\r
-        SKP_memset( &psEnc->sNSQ,                0,                        sizeof( SKP_Silk_nsq_state ) );\r
-        SKP_memset( &psEnc->sPred,               0,                        sizeof( SKP_Silk_predict_state_FIX ) );\r
-        SKP_memset( psEnc->sNSQ.xq,              0, 2 * MAX_FRAME_LENGTH * sizeof( SKP_int16 ) );\r
-        SKP_memset( psEnc->sNSQ_LBRR.xq,         0, 2 * MAX_FRAME_LENGTH * sizeof( SKP_int16 ) );\r
-        SKP_memset( psEnc->sPred.prev_NLSFq_Q15, 0,        MAX_LPC_ORDER * sizeof( SKP_int ) );\r
+        SKP_memset( &psEnc->sShape,              0, sizeof( SKP_Silk_shape_state_FIX ) );\r
+        SKP_memset( &psEnc->sPrefilt,            0, sizeof( SKP_Silk_prefilter_state_FIX ) );\r
+        SKP_memset( &psEnc->sCmn.sNSQ,           0, sizeof( SKP_Silk_nsq_state ) );\r
+        SKP_memset( &psEnc->sPred,               0, sizeof( SKP_Silk_predict_state_FIX ) );\r
+        SKP_memset( psEnc->sPred.prev_NLSFq_Q15, 0, sizeof( psEnc->sPred.prev_NLSFq_Q15 ) );\r
 #if SWITCH_TRANSITION_FILTERING\r
-        SKP_memset( psEnc->sCmn.sLP.In_LP_State, 0, 2 * sizeof( SKP_int32 ) );\r
+        SKP_memset( psEnc->sCmn.sLP.In_LP_State, 0, sizeof( psEnc->sCmn.sLP.In_LP_State ) );\r
         if( psEnc->sCmn.sLP.mode == 1 ) {\r
             /* Begin transition phase */\r
             psEnc->sCmn.sLP.transition_frame_no = 1;\r
@@ -223,20 +217,17 @@ SKP_INLINE SKP_int SKP_Silk_setup_fs(
             psEnc->sCmn.sLP.transition_frame_no = 0;\r
         }\r
 #endif\r
-        psEnc->sCmn.LBRR_nBytes         = 0;\r
         psEnc->sCmn.inputBufIx          = 0;\r
-        psEnc->sCmn.nFramesInPayloadBuf = 0;\r
-        psEnc->sCmn.nBytesInPayloadBuf  = 0;\r
+        psEnc->sCmn.nFramesAnalyzed     = 0;\r
         psEnc->sCmn.TargetRate_bps      = 0; /* Ensures that psEnc->SNR_dB is recomputed */\r
 \r
         /* Initialize non-zero parameters */\r
-        psEnc->sCmn.prevLag                 = 100;\r
-        psEnc->sCmn.first_frame_after_reset = 1;\r
-        psEnc->sPrefilt.lagPrev             = 100;\r
-        psEnc->sShape.LastGainIndex         = 1;\r
-        psEnc->sNSQ.lagPrev                 = 100;\r
-        psEnc->sNSQ.prev_inv_gain_Q16       = 65536;\r
-        psEnc->sNSQ_LBRR.prev_inv_gain_Q16  = 65536;\r
+        psEnc->sCmn.prevLag                     = 100;\r
+        psEnc->sCmn.first_frame_after_reset     = 1;\r
+        psEnc->sPrefilt.lagPrev                 = 100;\r
+        psEnc->sShape.LastGainIndex             = 10;\r
+        psEnc->sCmn.sNSQ.lagPrev                = 100;\r
+        psEnc->sCmn.sNSQ.prev_inv_gain_Q16      = 65536;\r
 \r
         psEnc->sCmn.fs_kHz = fs_kHz;\r
         if( psEnc->sCmn.fs_kHz == 8 ) {\r
@@ -297,7 +288,6 @@ SKP_INLINE SKP_int SKP_Silk_setup_fs(
             /* unsupported sampling rate */\r
             SKP_assert( 0 );\r
         }\r
-        psEnc->sCmn.fs_kHz_changed = 1;\r
     }\r
 \r
     /* Check that settings are valid */\r
@@ -308,12 +298,12 @@ SKP_INLINE SKP_int SKP_Silk_setup_fs(
 \r
 SKP_INLINE SKP_int SKP_Silk_setup_rate(\r
     SKP_Silk_encoder_state_FIX      *psEnc,             /* I/O                      */\r
-    SKP_int                         TargetRate_bps      /* I                        */\r
+    SKP_int32                       TargetRate_bps      /* I                        */\r
 )\r
 {\r
     SKP_int k, ret = SKP_SILK_NO_ERROR;\r
     SKP_int32 frac_Q6;\r
-    const SKP_uint16 *rateTable;\r
+    const SKP_int32 *rateTable;\r
 \r
     /* Set bitrate/coding quality */\r
     if( TargetRate_bps != psEnc->sCmn.TargetRate_bps ) {\r
@@ -335,7 +325,7 @@ SKP_INLINE SKP_int SKP_Silk_setup_rate(
         }\r
         for( k = 1; k < TARGET_RATE_TAB_SZ; k++ ) {\r
             /* Find bitrate interval in table and interpolate */\r
-            if( TargetRate_bps < rateTable[ k ] ) {\r
+            if( TargetRate_bps <= rateTable[ k ] ) {\r
                 frac_Q6 = SKP_DIV32( SKP_LSHIFT( TargetRate_bps - rateTable[ k - 1 ], 6 ), \r
                                                  rateTable[ k ] - rateTable[ k - 1 ] );\r
                 psEnc->SNR_dB_Q7 = SKP_LSHIFT( SNR_table_Q1[ k - 1 ], 6 ) + SKP_MUL( frac_Q6, SNR_table_Q1[ k ] - SNR_table_Q1[ k - 1 ] );\r
@@ -345,55 +335,3 @@ SKP_INLINE SKP_int SKP_Silk_setup_rate(
     }\r
     return( ret );\r
 }\r
-\r
-SKP_INLINE SKP_int SKP_Silk_setup_LBRR(\r
-    SKP_Silk_encoder_state_FIX      *psEnc             /* I/O                      */\r
-)\r
-{\r
-    SKP_int   ret = SKP_SILK_NO_ERROR;\r
-\r
-#if USE_LBRR\r
-    SKP_int32 LBRRRate_thres_bps;\r
-\r
-    if( psEnc->sCmn.useInBandFEC < 0 || psEnc->sCmn.useInBandFEC > 1 ) {\r
-        ret = SKP_SILK_ENC_INVALID_INBAND_FEC_SETTING;\r
-    }\r
-    \r
-    psEnc->sCmn.LBRR_enabled = psEnc->sCmn.useInBandFEC;\r
-    if( psEnc->sCmn.fs_kHz == 8 ) {\r
-        LBRRRate_thres_bps = INBAND_FEC_MIN_RATE_BPS - 9000;\r
-    } else if( psEnc->sCmn.fs_kHz == 12 ) {\r
-        LBRRRate_thres_bps = INBAND_FEC_MIN_RATE_BPS - 6000;;\r
-    } else if( psEnc->sCmn.fs_kHz == 16 ) {\r
-        LBRRRate_thres_bps = INBAND_FEC_MIN_RATE_BPS - 3000;\r
-    } else {\r
-        LBRRRate_thres_bps = INBAND_FEC_MIN_RATE_BPS;\r
-    }\r
-\r
-    if( psEnc->sCmn.TargetRate_bps >= LBRRRate_thres_bps ) {\r
-        /* Set gain increase / rate reduction for LBRR usage */\r
-        /* Coarsely tuned with PESQ for now. */\r
-        /* Linear regression coefs G = 8 - 0.5 * loss */\r
-        /* Meaning that at 16% loss main rate and redundant rate is the same, -> G = 0 */\r
-        psEnc->sCmn.LBRR_GainIncreases = SKP_max_int( 8 - SKP_RSHIFT( psEnc->sCmn.PacketLoss_perc, 1 ), 0 );\r
-\r
-        /* Set main stream rate compensation */\r
-        if( psEnc->sCmn.LBRR_enabled && psEnc->sCmn.PacketLoss_perc > LBRR_LOSS_THRES ) {\r
-            /* Tuned to give approx same mean / weighted bitrate as no inband FEC */\r
-            psEnc->inBandFEC_SNR_comp_Q8 = SKP_FIX_CONST( 6.0f, 8 ) - SKP_LSHIFT( psEnc->sCmn.LBRR_GainIncreases, 7 );\r
-        } else {\r
-            psEnc->inBandFEC_SNR_comp_Q8 = 0;\r
-            psEnc->sCmn.LBRR_enabled     = 0;\r
-        }\r
-    } else {\r
-        psEnc->inBandFEC_SNR_comp_Q8     = 0;\r
-        psEnc->sCmn.LBRR_enabled         = 0;\r
-    }\r
-#else\r
-    if( psEnc->sCmn.LBRR_enabled != 0 ) {\r
-        ret = SKP_SILK_ENC_INVALID_INBAND_FEC_SETTING;\r
-        psEnc->sCmn.LBRR_enabled = 0;\r
-    }\r
-#endif\r
-    return ret;\r
-}\r
index 2370a55..1ac1b19 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
index 348f4d2..46adc81 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
@@ -34,21 +34,38 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 SKP_int SKP_Silk_encode_frame_FIX( \r
     SKP_Silk_encoder_state_FIX      *psEnc,             /* I/O  Encoder state FIX                       */\r
     SKP_int32                       *pnBytesOut,        /*   O  Number of payload bytes                 */\r
-    ec_enc                          *psRangeEnc,        /* I/O  compressor data structure               */\r
-    const SKP_int16                 *pIn                /* I    Input speech frame                      */\r
+    ec_enc                          *psRangeEnc         /* I/O  compressor data structure               */\r
 )\r
 {\r
     SKP_Silk_encoder_control_FIX sEncCtrl;\r
-    SKP_int     i, nBytes, ret = 0;\r
+    SKP_int     i, nBits, SNR_dB_Q7, ret = 0;\r
+    SKP_uint8   flags;\r
     SKP_int16   *x_frame, *res_pitch_frame;\r
     SKP_int16   xfw[ MAX_FRAME_LENGTH ];\r
-    SKP_int16   pIn_HP[ MAX_FRAME_LENGTH ];\r
     SKP_int16   res_pitch[ 2 * MAX_FRAME_LENGTH + LA_PITCH_MAX ];\r
-    SKP_int     frame_terminator, SNR_dB_Q7;\r
 \r
 TIC(ENCODE_FRAME)\r
 \r
-    sEncCtrl.sCmn.Seed = psEnc->sCmn.frameCounter++ & 3;\r
+    if( psEnc->sCmn.nFramesAnalyzed == 0 ) {\r
+        /* Create space at start of payload for VAD and FEC flags */\r
+        SKP_uint8 iCDF[ 2 ] = { 0, 0 };\r
+        iCDF[ 0 ] = 256 - SKP_RSHIFT( 256, psEnc->sCmn.nFramesPerPacket + 1 );\r
+        ec_enc_icdf( psRangeEnc, 0, iCDF, 8 );\r
+\r
+        /* Encode any LBRR data from previous packet */\r
+        SKP_Silk_LBRR_embed( &psEnc->sCmn, psRangeEnc );\r
+\r
+        /* Reduce coding SNR depending on how many bits used by LBRR */\r
+        nBits = ec_tell( psRangeEnc );\r
+        psEnc->inBandFEC_SNR_comp_Q7 = SKP_DIV32_16( SKP_SMULBB( SKP_FIX_CONST( 6.0f, 7 ), nBits ), \r
+            SKP_SMULBB( psEnc->sCmn.nFramesPerPacket, psEnc->sCmn.frame_length ) );\r
+\r
+        /* Reset LBRR flags */\r
+        SKP_memset( psEnc->sCmn.LBRR_flags, 0, sizeof( psEnc->sCmn.LBRR_flags ) );\r
+    }\r
+\r
+    psEnc->sCmn.indices.Seed = psEnc->sCmn.frameCounter++ & 3;\r
+\r
     /**************************************************************/\r
     /* Setup Input Pointers, and insert frame in input buffer    */\r
     /*************************************************************/\r
@@ -62,14 +79,14 @@ TIC(ENCODE_FRAME)
 TIC(VAD)\r
     ret = SKP_Silk_VAD_GetSA_Q8( &psEnc->sCmn.sVAD, &psEnc->speech_activity_Q8, &SNR_dB_Q7, \r
                                  sEncCtrl.input_quality_bands_Q15, &sEncCtrl.input_tilt_Q15,\r
-                                 pIn, psEnc->sCmn.frame_length, psEnc->sCmn.fs_kHz );\r
+                                 psEnc->sCmn.inputBuf, psEnc->sCmn.frame_length, psEnc->sCmn.fs_kHz );\r
 TOC(VAD)\r
 \r
     /**************************************************/\r
     /* Convert speech activity into VAD and DTX flags */\r
     /**************************************************/\r
     if( psEnc->speech_activity_Q8 < SKP_FIX_CONST( SPEECH_ACTIVITY_DTX_THRES, 8 ) ) {\r
-        sEncCtrl.sCmn.signalType = TYPE_NO_VOICE_ACTIVITY;\r
+        psEnc->sCmn.indices.signalType = TYPE_NO_VOICE_ACTIVITY;\r
         psEnc->sCmn.noSpeechCounter++;\r
         if( psEnc->sCmn.noSpeechCounter > NO_SPEECH_FRAMES_BEFORE_DTX ) {\r
             psEnc->sCmn.inDTX = 1;\r
@@ -78,10 +95,12 @@ TOC(VAD)
             psEnc->sCmn.noSpeechCounter = 0;\r
             psEnc->sCmn.inDTX           = 0;\r
         }\r
+        psEnc->sCmn.VAD_flags[ psEnc->sCmn.nFramesAnalyzed ] = 0;\r
     } else {\r
-        psEnc->sCmn.noSpeechCounter = 0;\r
-        psEnc->sCmn.inDTX           = 0;\r
-        sEncCtrl.sCmn.signalType = TYPE_UNVOICED;\r
+        psEnc->sCmn.noSpeechCounter    = 0;\r
+        psEnc->sCmn.inDTX              = 0;\r
+        psEnc->sCmn.indices.signalType = TYPE_UNVOICED;\r
+        psEnc->sCmn.VAD_flags[ psEnc->sCmn.nFramesAnalyzed ] = 1;\r
     }\r
 \r
     /*******************************************/\r
@@ -90,17 +109,15 @@ TOC(VAD)
 TIC(HP_IN)\r
 #if HIGH_PASS_INPUT\r
     /* Variable high-pass filter */\r
-    SKP_Silk_HP_variable_cutoff_FIX( psEnc, &sEncCtrl, pIn_HP, pIn );\r
+    SKP_Silk_HP_variable_cutoff_FIX( psEnc, &sEncCtrl, x_frame + LA_SHAPE_MS * psEnc->sCmn.fs_kHz, psEnc->sCmn.inputBuf );\r
 #else\r
-    SKP_memcpy( pIn_HP, pIn, psEnc->sCmn.frame_length * sizeof( SKP_int16 ) );\r
+    SKP_memcpy( x_frame + LA_SHAPE_MS * psEnc->sCmn.fs_kHz, psEnc->sCmn.inputBuf, psEnc->sCmn.frame_length * sizeof( SKP_int16 ) );\r
 #endif\r
 TOC(HP_IN)\r
 \r
 #if SWITCH_TRANSITION_FILTERING\r
     /* Ensure smooth bandwidth transitions */\r
-    SKP_Silk_LP_variable_cutoff( &psEnc->sCmn.sLP, x_frame + LA_SHAPE_MS * psEnc->sCmn.fs_kHz, pIn_HP, psEnc->sCmn.frame_length );\r
-#else\r
-    SKP_memcpy( x_frame + LA_SHAPE_MS * psEnc->sCmn.fs_kHz, pIn_HP,psEnc->sCmn.frame_length * sizeof( SKP_int16 ) );\r
+    SKP_Silk_LP_variable_cutoff( &psEnc->sCmn.sLP, x_frame + LA_SHAPE_MS * psEnc->sCmn.fs_kHz, psEnc->sCmn.frame_length );\r
 #endif\r
     \r
     /*****************************************/\r
@@ -138,15 +155,11 @@ TIC(PROCESS_GAINS)
     SKP_Silk_process_gains_FIX( psEnc, &sEncCtrl );\r
 TOC(PROCESS_GAINS)\r
     \r
-    psEnc->sCmn.quantOffsetType[ psEnc->sCmn.nFramesInPayloadBuf ] = sEncCtrl.sCmn.quantOffsetType;\r
-    psEnc->sCmn.signalType[      psEnc->sCmn.nFramesInPayloadBuf ] = sEncCtrl.sCmn.signalType;\r
-\r
     /****************************************/\r
     /* Low Bitrate Redundant Encoding       */\r
     /****************************************/\r
-    psEnc->sCmn.LBRR_nBytes = MAX_ARITHM_BYTES;\r
 TIC(LBRR)\r
-    //SKP_Silk_LBRR_encode_FIX( psEnc, &sEncCtrl, psEnc->sCmn.LBRR_payload, &psEnc->sCmn.LBRR_nBytes, xfw );\r
+    SKP_Silk_LBRR_encode_FIX( psEnc, &sEncCtrl, xfw );\r
 TOC(LBRR)\r
 \r
     /*****************************************/\r
@@ -154,35 +167,42 @@ TOC(LBRR)
     /*****************************************/\r
 TIC(NSQ)\r
     if( psEnc->sCmn.nStatesDelayedDecision > 1 || psEnc->sCmn.warping_Q16 > 0 ) {\r
-        SKP_Silk_NSQ_del_dec( &psEnc->sCmn, &sEncCtrl.sCmn, &psEnc->sNSQ, xfw,\r
-            psEnc->sCmn.q, sEncCtrl.sCmn.NLSFInterpCoef_Q2, \r
+        SKP_Silk_NSQ_del_dec( &psEnc->sCmn, &psEnc->sCmn.sNSQ, &psEnc->sCmn.indices, xfw, psEnc->sCmn.pulses, \r
             sEncCtrl.PredCoef_Q12[ 0 ], sEncCtrl.LTPCoef_Q14, sEncCtrl.AR2_Q13, sEncCtrl.HarmShapeGain_Q14, \r
-            sEncCtrl.Tilt_Q14, sEncCtrl.LF_shp_Q14, sEncCtrl.Gains_Q16, sEncCtrl.Lambda_Q10, \r
-            sEncCtrl.LTP_scale_Q14 );\r
+            sEncCtrl.Tilt_Q14, sEncCtrl.LF_shp_Q14, sEncCtrl.Gains_Q16, sEncCtrl.pitchL, sEncCtrl.Lambda_Q10, sEncCtrl.LTP_scale_Q14 );\r
     } else {\r
-        SKP_Silk_NSQ( &psEnc->sCmn, &sEncCtrl.sCmn, &psEnc->sNSQ, xfw, \r
-            psEnc->sCmn.q, sEncCtrl.sCmn.NLSFInterpCoef_Q2, \r
+        SKP_Silk_NSQ( &psEnc->sCmn, &psEnc->sCmn.sNSQ, &psEnc->sCmn.indices, xfw, psEnc->sCmn.pulses, \r
             sEncCtrl.PredCoef_Q12[ 0 ], sEncCtrl.LTPCoef_Q14, sEncCtrl.AR2_Q13, sEncCtrl.HarmShapeGain_Q14, \r
-            sEncCtrl.Tilt_Q14, sEncCtrl.LF_shp_Q14, sEncCtrl.Gains_Q16, sEncCtrl.Lambda_Q10, \r
-            sEncCtrl.LTP_scale_Q14 );\r
+            sEncCtrl.Tilt_Q14, sEncCtrl.LF_shp_Q14, sEncCtrl.Gains_Q16, sEncCtrl.pitchL, sEncCtrl.Lambda_Q10, sEncCtrl.LTP_scale_Q14 );\r
     }\r
 TOC(NSQ)\r
 \r
     /****************************************/\r
-    /* Initialize range coder               */\r
-    /****************************************/\r
-    if( psEnc->sCmn.nFramesInPayloadBuf == 0 ) {\r
-        psEnc->sCmn.nBytesInPayloadBuf = 0;\r
-    }\r
-\r
-    /****************************************/\r
     /* Encode Parameters                    */\r
     /****************************************/\r
 TIC(ENCODE_PARAMS)\r
-    SKP_Silk_encode_indices( &psEnc->sCmn, &sEncCtrl.sCmn, psRangeEnc );\r
+    SKP_Silk_encode_indices( &psEnc->sCmn, psRangeEnc, psEnc->sCmn.nFramesAnalyzed, 0 );\r
 TOC(ENCODE_PARAMS)\r
 \r
     /****************************************/\r
+    /* Encode Excitation Signal             */\r
+    /****************************************/\r
+TIC(ENCODE_PULSES)\r
+    SKP_Silk_encode_pulses( psRangeEnc, psEnc->sCmn.indices.signalType, psEnc->sCmn.indices.quantOffsetType, \r
+        psEnc->sCmn.pulses, psEnc->sCmn.frame_length );\r
+TOC(ENCODE_PULSES)\r
+\r
+    /****************************************/\r
+    /* Simulate network buffer delay caused */\r
+    /* by exceeding TargetRate              */\r
+    /****************************************/\r
+    nBits = ec_tell( psRangeEnc );\r
+    psEnc->BufferedInChannel_ms += SKP_DIV32( SKP_SMULBB( 1000, nBits - psEnc->sCmn.prev_nBits ), psEnc->sCmn.TargetRate_bps );\r
+    psEnc->BufferedInChannel_ms -= psEnc->sCmn.PacketSize_ms;\r
+    psEnc->BufferedInChannel_ms  = SKP_LIMIT_int( psEnc->BufferedInChannel_ms, 0, 100 );\r
+    psEnc->sCmn.prev_nBits = nBits;\r
+\r
+    /****************************************/\r
     /* Update Buffers and State             */\r
     /****************************************/\r
     /* Update input buffer */\r
@@ -190,56 +210,36 @@ TOC(ENCODE_PARAMS)
         ( psEnc->sCmn.ltp_mem_length + LA_SHAPE_MS * psEnc->sCmn.fs_kHz ) * sizeof( SKP_int16 ) );\r
     \r
     /* Parameters needed for next frame */\r
-    psEnc->sCmn.prevLag                 = sEncCtrl.sCmn.pitchL[ psEnc->sCmn.nb_subfr - 1 ];\r
-    psEnc->sCmn.prevSignalType          = sEncCtrl.sCmn.signalType;\r
+    psEnc->sCmn.prevLag                 = sEncCtrl.pitchL[ psEnc->sCmn.nb_subfr - 1 ];\r
+    psEnc->sCmn.prevSignalType          = psEnc->sCmn.indices.signalType;\r
     psEnc->sCmn.first_frame_after_reset = 0;\r
-    psEnc->sCmn.nFramesInPayloadBuf++;\r
+    psEnc->sCmn.nFramesAnalyzed++;\r
 \r
     /****************************************/\r
-    /* Finalize payload and copy to output  */\r
+    /* Finalize payload                     */\r
     /****************************************/\r
-    if( psEnc->sCmn.nFramesInPayloadBuf * SUB_FRAME_LENGTH_MS * psEnc->sCmn.nb_subfr >= psEnc->sCmn.PacketSize_ms ) {\r
-\r
-        /* Check if FEC information should be added */\r
-        //frame_terminator = psEnc->sCmn.usage;\r
-        frame_terminator = SKP_SILK_NO_LBRR;\r
-\r
-        /* Add the frame termination info to stream */\r
-        ec_enc_icdf( psRangeEnc, frame_terminator, SKP_Silk_LBRR_Present_iCDF, 8 );\r
-\r
-        /* Code excitation signal */\r
-        for( i = 0; i < psEnc->sCmn.nFramesInPayloadBuf; i++ ) {\r
-            SKP_Silk_encode_pulses( psRangeEnc, psEnc->sCmn.signalType[ i ], psEnc->sCmn.quantOffsetType[ i ], \r
-                &psEnc->sCmn.q[ i * psEnc->sCmn.frame_length ], psEnc->sCmn.frame_length );\r
+    if( psEnc->sCmn.nFramesAnalyzed >= psEnc->sCmn.nFramesPerPacket ) {\r
+        /* Insert VAD flags and FEC flag at beginning of bitstream */\r
+        flags = 0;\r
+        for( i = 0; i < psEnc->sCmn.nFramesPerPacket; i++ ) {\r
+            flags |= psEnc->sCmn.VAD_flags[i];\r
+            flags  = SKP_LSHIFT( flags, 1 );\r
         }\r
+        flags |= psEnc->sCmn.LBRR_flag;\r
+        ret = ec_enc_patch_initial_bits( psRangeEnc, flags, psEnc->sCmn.nFramesPerPacket + 1 );\r
+        SKP_assert( ret == 0 );\r
 \r
-        /* Payload length so far */\r
-        nBytes = SKP_RSHIFT( ec_tell( psRangeEnc ) + 7, 3 );\r
-        *pnBytesOut = nBytes;\r
+        /* Payload size */\r
+        nBits = ec_tell( psRangeEnc );\r
+        *pnBytesOut = SKP_RSHIFT( nBits + 7, 3 );\r
 \r
         /* Reset the number of frames in payload buffer */\r
-        psEnc->sCmn.nFramesInPayloadBuf = 0;\r
+        psEnc->sCmn.nFramesAnalyzed = 0;\r
+        psEnc->sCmn.prev_nBits = 0;\r
     } else {\r
         /* No payload this time */\r
         *pnBytesOut = 0;\r
-\r
-        /* Payload length so far */\r
-        nBytes = SKP_RSHIFT( ec_tell( psRangeEnc ) + 7, 3 );\r
-\r
-        /* Take into account the q signal that isn't in the bitstream yet */\r
-        nBytes += SKP_Silk_pulses_to_bytes( &psEnc->sCmn, \r
-            &psEnc->sCmn.q[ psEnc->sCmn.nFramesInPayloadBuf * psEnc->sCmn.frame_length ] );\r
     }\r
-\r
-    /* Simulate number of ms buffered in channel because of exceeding TargetRate */\r
-    SKP_assert(  ( 8 * 1000 * ( (SKP_int64)nBytes - (SKP_int64)psEnc->sCmn.nBytesInPayloadBuf ) ) == \r
-        SKP_SAT32( 8 * 1000 * ( (SKP_int64)nBytes - (SKP_int64)psEnc->sCmn.nBytesInPayloadBuf ) ) );\r
-    SKP_assert( psEnc->sCmn.TargetRate_bps > 0 );\r
-    psEnc->BufferedInChannel_ms   += SKP_DIV32( 8 * 1000 * ( nBytes - psEnc->sCmn.nBytesInPayloadBuf ), psEnc->sCmn.TargetRate_bps );\r
-    psEnc->BufferedInChannel_ms   -= SKP_SMULBB( SUB_FRAME_LENGTH_MS, psEnc->sCmn.nb_subfr );\r
-    psEnc->BufferedInChannel_ms    = SKP_LIMIT_int( psEnc->BufferedInChannel_ms, 0, 100 );\r
-    psEnc->sCmn.nBytesInPayloadBuf = nBytes;\r
-\r
 TOC(ENCODE_FRAME)\r
 \r
 #ifdef SAVE_ALL_INTERNAL_DATA\r
@@ -248,7 +248,7 @@ TOC(ENCODE_FRAME)
         int i;\r
         DEBUG_STORE_DATA( xf.dat,                   x_frame + LA_SHAPE_MS * psEnc->sCmn.fs_kHz, psEnc->sCmn.frame_length    * sizeof( SKP_int16 ) );\r
         DEBUG_STORE_DATA( xfw.dat,                  xfw,                            psEnc->sCmn.frame_length    * sizeof( SKP_int16 ) );\r
-        DEBUG_STORE_DATA( pitchL.dat,               sEncCtrl.sCmn.pitchL,           psEnc->sCmn.nb_subfr            * sizeof( SKP_int ) );\r
+        DEBUG_STORE_DATA( pitchL.dat,               sEncCtrl.pitchL,                psEnc->sCmn.nb_subfr            * sizeof( SKP_int ) );\r
         for( i = 0; i < psEnc->sCmn.nb_subfr * LTP_ORDER; i++ ) {\r
             tmp[ i ] = (SKP_float)sEncCtrl.LTPCoef_Q14[ i ] / 16384.0f;\r
         }\r
@@ -270,190 +270,81 @@ TOC(ENCODE_FRAME)
             tmp[ i ] = (SKP_float)sEncCtrl.Gains_Q16[ i ] / 65536.0f;\r
         }\r
         DEBUG_STORE_DATA( gains.dat,                tmp,                            psEnc->sCmn.nb_subfr * sizeof( SKP_float ) );\r
-        DEBUG_STORE_DATA( gains_indices.dat,        &sEncCtrl.sCmn.GainsIndices,    psEnc->sCmn.nb_subfr * sizeof( SKP_int ) );\r
-        DEBUG_STORE_DATA( nBytes.dat,               &nBytes,                        sizeof( SKP_int ) );\r
+        DEBUG_STORE_DATA( gains_indices.dat,        &psEnc->sCmn.indices.GainsIndices,       psEnc->sCmn.nb_subfr * sizeof( SKP_int ) );\r
+        DEBUG_STORE_DATA( nBits.dat,                &nBits,                         sizeof( SKP_int ) );\r
         tmp[ 0 ] = (SKP_float)sEncCtrl.current_SNR_dB_Q7 / 128.0f;\r
         DEBUG_STORE_DATA( current_SNR_db.dat,       tmp,                            sizeof( SKP_float ) );\r
-        DEBUG_STORE_DATA( quantOffsetType.dat,      &sEncCtrl.sCmn.quantOffsetType, sizeof( SKP_int ) );\r
+        DEBUG_STORE_DATA( quantOffsetType.dat,      &psEnc->sCmn.indices.quantOffsetType,    sizeof( SKP_int ) );\r
         tmp[ 0 ] = (SKP_float)psEnc->speech_activity_Q8 / 256.0f;\r
         DEBUG_STORE_DATA( speech_activity.dat,      tmp,                            sizeof( SKP_float ) );\r
         for( i = 0; i < VAD_N_BANDS; i++ ) {\r
             tmp[ i ] = (SKP_float)sEncCtrl.input_quality_bands_Q15[ i ] / 32768.0f;\r
         }\r
         DEBUG_STORE_DATA( input_quality_bands.dat,  tmp,                            VAD_N_BANDS * sizeof( SKP_float ) );\r
-        DEBUG_STORE_DATA( signalType.dat,           &sEncCtrl.sCmn.signalType,      sizeof( SKP_int ) ); \r
-        DEBUG_STORE_DATA( ratelevel.dat,            &sEncCtrl.sCmn.RateLevelIndex,  sizeof( SKP_int ) ); \r
-        DEBUG_STORE_DATA( lag_index.dat,            &sEncCtrl.sCmn.lagIndex,        sizeof( SKP_int ) ); \r
-        DEBUG_STORE_DATA( contour_index.dat,        &sEncCtrl.sCmn.contourIndex,    sizeof( SKP_int ) ); \r
-        DEBUG_STORE_DATA( per_index.dat,            &sEncCtrl.sCmn.PERIndex,        sizeof( SKP_int ) ); \r
+        DEBUG_STORE_DATA( signalType.dat,           &psEnc->sCmn.indices.signalType,         sizeof( SKP_int ) ); \r
+        DEBUG_STORE_DATA( ratelevel.dat,            &psEnc->sCmn.indices.RateLevelIndex,     sizeof( SKP_int ) ); \r
+        DEBUG_STORE_DATA( lag_index.dat,            &psEnc->sCmn.indices.lagIndex,           sizeof( SKP_int16 ) ); \r
+        DEBUG_STORE_DATA( contour_index.dat,        &psEnc->sCmn.indices.contourIndex,       sizeof( SKP_int8 ) ); \r
+        DEBUG_STORE_DATA( per_index.dat,            &psEnc->sCmn.indices.PERIndex,           sizeof( SKP_int ) ); \r
     }\r
 #endif\r
     return( ret );\r
 }\r
 \r
-#if 0  //tmp\r
-/* Low BitRate Redundancy encoding functionality. Reuse all parameters but encode residual with lower bitrate */\r
+/* Low-Bitrate Redundancy (LBRR) encoding. Reuse all parameters but encode excitation at lower bitrate  */\r
 void SKP_Silk_LBRR_encode_FIX(\r
-    SKP_Silk_encoder_state_FIX      *psEnc,         /* I/O  Pointer to Silk encoder state           */\r
-    SKP_Silk_encoder_control_FIX    *psEncCtrl,     /* I/O  Pointer to Silk encoder control struct  */\r
-    SKP_uint8                       *pCode,         /* O    Pointer to payload                      */\r
-    SKP_int16                       *pnBytesOut,    /* I/O  Pointer to number of payload bytes      */\r
-    SKP_int16                       xfw[]           /* I    Input signal                            */\r
+    SKP_Silk_encoder_state_FIX      *psEnc,         /* I/O  Pointer to Silk FIX encoder state           */\r
+    SKP_Silk_encoder_control_FIX    *psEncCtrl,     /* I/O  Pointer to Silk FIX encoder control struct  */\r
+    const SKP_int16                 xfw[]           /* I    Input signal                                */\r
 )\r
 {\r
-    SKP_int     i, TempGainsIndices[ MAX_NB_SUBFR ], frame_terminator;\r
-    SKP_int     nBytes, nFramesInPayloadBuf;\r
     SKP_int32   TempGains_Q16[ MAX_NB_SUBFR ];\r
-    SKP_int     typeOffset, LTP_scaleIndex, Rate_only_parameters = 0;\r
+    SideInfoIndices *psIndices_LBRR = &psEnc->sCmn.indices_LBRR[ psEnc->sCmn.nFramesAnalyzed ];\r
+    SKP_Silk_nsq_state sNSQ_LBRR;\r
 \r
     /*******************************************/\r
     /* Control use of inband LBRR              */\r
     /*******************************************/\r
-    psEnc->sCmn.LBRR_usage = SKP_SILK_NO_LBRR;\r
-    if( psEnc->sCmn.LBRR_enabled ) {\r
-        /* Control LBRR */\r
-        /* Usage Control based on sensitivity and packet loss caracteristics */\r
-        if( psEnc->speech_activity_Q8 > SKP_FIX_CONST( LBRR_SPEECH_ACTIVITY_THRES, 8 ) && psEnc->sCmn.PacketLoss_perc > LBRR_LOSS_THRES ) {\r
-            psEnc->sCmn.LBRR_usage = SKP_SILK_LBRR;\r
-        }\r
-    }\r
+    if( psEnc->sCmn.LBRR_enabled && psEnc->speech_activity_Q8 > SKP_FIX_CONST( LBRR_SPEECH_ACTIVITY_THRES, 8 ) ) {\r
+        psEnc->sCmn.LBRR_flags[ psEnc->sCmn.nFramesAnalyzed ] = 1;\r
+\r
+        /* Copy noise shaping quantizer state and quantization indices from regular encoding */\r
+        SKP_memcpy( &sNSQ_LBRR, &psEnc->sCmn.sNSQ, sizeof( SKP_Silk_nsq_state ) );\r
+        SKP_memcpy( psIndices_LBRR, &psEnc->sCmn.indices, sizeof( SideInfoIndices ) );\r
 \r
-    if( psEnc->sCmn.LBRR_enabled ) {\r
         /* Save original gains */\r
-        SKP_memcpy( TempGainsIndices, psEncCtrl->sCmn.GainsIndices, MAX_NB_SUBFR * sizeof( SKP_int   ) );\r
-        SKP_memcpy( TempGains_Q16,    psEncCtrl->Gains_Q16,         MAX_NB_SUBFR * sizeof( SKP_int32 ) );\r
-\r
-        typeOffset     = psEnc->sCmn.typeOffsetPrev; // Temp save as cannot be overwritten\r
-        LTP_scaleIndex = psEncCtrl->sCmn.LTP_scaleIndex;\r
-\r
-        /* Set max rate where quant signal is encoded */\r
-        if( psEnc->sCmn.fs_kHz == 8 ) {\r
-            Rate_only_parameters = 13500;\r
-        } else if( psEnc->sCmn.fs_kHz == 12 ) {\r
-            Rate_only_parameters = 15500;\r
-        } else if( psEnc->sCmn.fs_kHz == 16 ) {\r
-            Rate_only_parameters = 17500;\r
-        } else {\r
-            SKP_assert( 0 );\r
-        }\r
+        SKP_memcpy( TempGains_Q16, psEncCtrl->Gains_Q16, psEnc->sCmn.nb_subfr * sizeof( SKP_int32 ) );\r
 \r
-        if( psEnc->sCmn.Complexity >= 4 && psEnc->sCmn.TargetRate_bps > Rate_only_parameters ) {\r
-            if( psEnc->sCmn.nFramesInPayloadBuf == 0 ) {\r
-                /* First frame in packet; copy everything */\r
-                SKP_memcpy( &psEnc->sNSQ_LBRR, &psEnc->sNSQ, sizeof( SKP_Silk_nsq_state ) );\r
-\r
-                psEnc->sCmn.LBRRprevLastGainIndex = psEnc->sShape.LastGainIndex;\r
-                /* Increase Gains to get target LBRR rate */\r
-                psEncCtrl->sCmn.GainsIndices[ 0 ] = psEncCtrl->sCmn.GainsIndices[ 0 ] + psEnc->sCmn.LBRR_GainIncreases;\r
-                psEncCtrl->sCmn.GainsIndices[ 0 ] = SKP_LIMIT_int( psEncCtrl->sCmn.GainsIndices[ 0 ], 0, N_LEVELS_QGAIN - 1 );\r
-            }\r
-            /* Decode to get gains in sync with decoder         */\r
-            /* Overwrite unquantized gains with quantized gains */\r
-            SKP_Silk_gains_dequant( psEncCtrl->Gains_Q16, psEncCtrl->sCmn.GainsIndices, \r
-                &psEnc->sCmn.LBRRprevLastGainIndex, psEnc->sCmn.nFramesInPayloadBuf, psEnc->sCmn.nb_subfr );\r
-\r
-            /*****************************************/\r
-            /* Noise shaping quantization            */\r
-            /*****************************************/\r
-            if( psEnc->sCmn.nStatesDelayedDecision > 1 || psEnc->sCmn.warping_Q16 > 0 ) {\r
-                SKP_Silk_NSQ_del_dec( &psEnc->sCmn, &psEncCtrl->sCmn, &psEnc->sNSQ_LBRR, xfw, psEnc->sCmn.q_LBRR, \r
-                    psEncCtrl->sCmn.NLSFInterpCoef_Q2, psEncCtrl->PredCoef_Q12[ 0 ], psEncCtrl->LTPCoef_Q14, \r
-                    psEncCtrl->AR2_Q13, psEncCtrl->HarmShapeGain_Q14, psEncCtrl->Tilt_Q14, psEncCtrl->LF_shp_Q14, \r
-                    psEncCtrl->Gains_Q16, psEncCtrl->Lambda_Q10, psEncCtrl->LTP_scale_Q14 );\r
-            } else {\r
-                SKP_Silk_NSQ( &psEnc->sCmn, &psEncCtrl->sCmn, &psEnc->sNSQ_LBRR, xfw, psEnc->sCmn.q_LBRR, \r
-                    psEncCtrl->sCmn.NLSFInterpCoef_Q2, psEncCtrl->PredCoef_Q12[ 0 ], psEncCtrl->LTPCoef_Q14, \r
-                    psEncCtrl->AR2_Q13, psEncCtrl->HarmShapeGain_Q14, psEncCtrl->Tilt_Q14, psEncCtrl->LF_shp_Q14, \r
-                    psEncCtrl->Gains_Q16, psEncCtrl->Lambda_Q10, psEncCtrl->LTP_scale_Q14 );\r
-            }\r
-        } else {\r
-            SKP_memset( psEnc->sCmn.q_LBRR, 0, psEnc->sCmn.frame_length * sizeof( SKP_int8 ) );\r
-            psEncCtrl->sCmn.LTP_scaleIndex = 0;\r
-        }\r
-        /****************************************/\r
-        /* Initialize arithmetic coder          */\r
-        /****************************************/\r
-        if( psEnc->sCmn.nFramesInPayloadBuf == 0 ) {\r
-            ec_enc_init( &psEnc->sCmn.sRC_LBRR.range_enc_celt_state, psEnc->sCmn.sRC_LBRR.buffer, MAX_ARITHM_BYTES );\r
-\r
-            SKP_Silk_range_enc_init( &psEnc->sCmn.sRC_LBRR );\r
-            psEnc->sCmn.nBytesInPayloadBuf = 0;\r
-        }\r
+        if( psEnc->sCmn.nFramesAnalyzed == 0 || psEnc->sCmn.LBRR_flags[ psEnc->sCmn.nFramesAnalyzed - 1 ] == 0 ) {\r
+            /* First frame in packet or previous frame not LBRR coded */\r
+            psEnc->sCmn.LBRRprevLastGainIndex = psEnc->sShape.LastGainIndex;\r
 \r
-        /****************************************/\r
-        /* Encode Parameters                    */\r
-        /****************************************/\r
-        SKP_Silk_encode_indices( &psEnc->sCmn, &psEncCtrl->sCmn, &psEnc->sCmn.sRC_LBRR );\r
-\r
-        /****************************************/\r
-        /* Encode Parameters                    */\r
-        /****************************************/\r
-        if( psEnc->sCmn.sRC_LBRR.error ) {\r
-            /* Encoder returned error: clear payload buffer */\r
-            nFramesInPayloadBuf = 0;\r
-        } else {\r
-            nFramesInPayloadBuf = psEnc->sCmn.nFramesInPayloadBuf + 1;\r
+            /* Increase Gains to get target LBRR rate */\r
+            psIndices_LBRR->GainsIndices[ 0 ] = psIndices_LBRR->GainsIndices[ 0 ] + psEnc->sCmn.LBRR_GainIncreases;\r
+            psIndices_LBRR->GainsIndices[ 0 ] = SKP_min_int( psIndices_LBRR->GainsIndices[ 0 ], N_LEVELS_QGAIN - 1 );\r
         }\r
 \r
-        /****************************************/\r
-        /* Finalize payload and copy to output  */\r
-        /****************************************/\r
-        if( SKP_SMULBB( nFramesInPayloadBuf, SKP_SMULBB( SUB_FRAME_LENGTH_MS, psEnc->sCmn.nb_subfr ) ) >= psEnc->sCmn.PacketSize_ms ) {\r
-\r
-            /* Check if FEC information should be added */\r
-            frame_terminator = SKP_SILK_LAST_FRAME;\r
-\r
-            /* Add the frame termination info to stream */\r
-            ec_enc_icdf( psRangeEnc, frame_terminator, SKP_Silk_LBRR_Present_iCDF, 8 );\r
-\r
-            /*********************************************/\r
-            /* Encode quantization indices of excitation */\r
-            /*********************************************/\r
-            for( i = 0; i < nFramesInPayloadBuf; i++ ) {\r
-                SKP_Silk_encode_pulses( &psEnc->sCmn.sRC_LBRR, psEnc->sCmn.signalType[ i ], psEnc->sCmn.quantOffsetType[ i ],\r
-                    &psEnc->sCmn.q_LBRR[ i * psEnc->sCmn.frame_length ], psEnc->sCmn.frame_length );\r
-            }\r
-\r
-            /* Payload length so far */\r
-            nBytes = SKP_RSHIFT( ec_tell( psRangeEnc_LBRR ) + 7, 3 );\r
-\r
-            /* Check that there is enough space in external output buffer and move data */\r
-            if( *pnBytesOut >= nBytes ) {\r
-                SKP_int bits_in_stream, mask;\r
-                bits_in_stream = ec_tell( &psEnc->sCmn.sRC_LBRR.range_enc_celt_state );\r
-                ec_enc_done( &psEnc->sCmn.sRC_LBRR.range_enc_celt_state );\r
-\r
-                /* Fill up any remaining bits in the last byte with 1s */\r
-                if( bits_in_stream & 7 ) {\r
-                    mask = SKP_RSHIFT( 0xFF, bits_in_stream & 7 );\r
-                    if( nBytes - 1 < *pnBytesOut ) {\r
-                        psEnc->sCmn.sRC_LBRR.range_enc_celt_state.buf->buf[ nBytes - 1 ] |= mask;\r
-                    }\r
-                }\r
-                SKP_memcpy( pCode, psEnc->sCmn.sRC_LBRR.range_enc_celt_state.buf->buf, nBytes * sizeof( SKP_uint8 ) );\r
-\r
-                *pnBytesOut = nBytes;\r
-            } else {\r
-                /* Not enough space: payload will be discarded */\r
-                *pnBytesOut = 0;\r
-                SKP_assert( 0 );\r
-            }\r
+        /* Decode to get gains in sync with decoder         */\r
+        /* Overwrite unquantized gains with quantized gains */\r
+        SKP_Silk_gains_dequant( psEncCtrl->Gains_Q16, psIndices_LBRR->GainsIndices, \r
+            &psEnc->sCmn.LBRRprevLastGainIndex, psEnc->sCmn.nFramesAnalyzed, psEnc->sCmn.nb_subfr );\r
+\r
+        /*****************************************/\r
+        /* Noise shaping quantization            */\r
+        /*****************************************/\r
+        if( psEnc->sCmn.nStatesDelayedDecision > 1 || psEnc->sCmn.warping_Q16 > 0 ) {\r
+            SKP_Silk_NSQ_del_dec( &psEnc->sCmn, &sNSQ_LBRR, psIndices_LBRR, xfw, \r
+                psEnc->sCmn.pulses_LBRR[ psEnc->sCmn.nFramesAnalyzed ], psEncCtrl->PredCoef_Q12[ 0 ], psEncCtrl->LTPCoef_Q14, \r
+                psEncCtrl->AR2_Q13, psEncCtrl->HarmShapeGain_Q14, psEncCtrl->Tilt_Q14, psEncCtrl->LF_shp_Q14, \r
+                psEncCtrl->Gains_Q16, psEncCtrl->pitchL, psEncCtrl->Lambda_Q10, psEncCtrl->LTP_scale_Q14 );\r
         } else {\r
-            /* No payload this time */\r
-            *pnBytesOut = 0;\r
-\r
-            /* Encode that more frames follows */\r
-            frame_terminator = SKP_SILK_MORE_FRAMES;\r
-            ec_enc_icdf( psRangeEnc, frame_terminator, SKP_Silk_LBRR_Present_iCDF, 8 );\r
+            SKP_Silk_NSQ( &psEnc->sCmn, &sNSQ_LBRR, psIndices_LBRR, xfw, \r
+                psEnc->sCmn.pulses_LBRR[ psEnc->sCmn.nFramesAnalyzed ], psEncCtrl->PredCoef_Q12[ 0 ], psEncCtrl->LTPCoef_Q14, \r
+                psEncCtrl->AR2_Q13, psEncCtrl->HarmShapeGain_Q14, psEncCtrl->Tilt_Q14, psEncCtrl->LF_shp_Q14, \r
+                psEncCtrl->Gains_Q16, psEncCtrl->pitchL, psEncCtrl->Lambda_Q10, psEncCtrl->LTP_scale_Q14 );\r
         }\r
 \r
         /* Restore original Gains */\r
-        SKP_memcpy( psEncCtrl->sCmn.GainsIndices, TempGainsIndices, psEnc->sCmn.nb_subfr * sizeof( SKP_int   ) );\r
-        SKP_memcpy( psEncCtrl->Gains_Q16,         TempGains_Q16,    psEnc->sCmn.nb_subfr * sizeof( SKP_int32 ) );\r
-    \r
-        /* Restore LTP scale index and typeoffset */\r
-        psEncCtrl->sCmn.LTP_scaleIndex = LTP_scaleIndex;\r
-        psEnc->sCmn.typeOffsetPrev     = typeOffset;\r
+        SKP_memcpy( psEncCtrl->Gains_Q16, TempGains_Q16, psEnc->sCmn.nb_subfr * sizeof( SKP_int32 ) );\r
     }\r
 }\r
-#endif\r
index 450ec1e..8b0a96c 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
@@ -31,7 +31,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 /* Finds LPC vector from correlations, and converts to NLSF */\r
 void SKP_Silk_find_LPC_FIX(\r
     SKP_int             NLSF_Q15[],             /* O    NLSFs                                                                       */\r
-    SKP_int             *interpIndex,           /* O    NLSF interpolation index, only used for NLSF interpolation                  */\r
+    SKP_int8            *interpIndex,           /* O    NLSF interpolation index, only used for NLSF interpolation                  */\r
     const SKP_int       prev_NLSFq_Q15[],       /* I    previous NLSFs, only used for NLSF interpolation                            */\r
     const SKP_int       useInterpolatedNLSFs,   /* I    Flag                                                                        */\r
     const SKP_int       LPC_order,              /* I    LPC order                                                                   */\r
@@ -43,7 +43,6 @@ void SKP_Silk_find_LPC_FIX(
     SKP_int     k;\r
     SKP_int32   a_Q16[ MAX_LPC_ORDER ];\r
     SKP_int     isInterpLower, shift;\r
-    SKP_int16   S[ MAX_LPC_ORDER ];\r
     SKP_int32   res_nrg0, res_nrg1;\r
     SKP_int     rshift0, rshift1; \r
 \r
@@ -96,8 +95,7 @@ void SKP_Silk_find_LPC_FIX(
             SKP_Silk_NLSF2A_stable( a_tmp_Q12, NLSF0_Q15, LPC_order );\r
 \r
             /* Calculate residual energy with NLSF interpolation */\r
-            SKP_memset( S, 0, LPC_order * sizeof( SKP_int16 ) );\r
-            SKP_Silk_LPC_analysis_filter( x, a_tmp_Q12, S, LPC_res, 2 * subfr_length, LPC_order );\r
+            SKP_Silk_LPC_analysis_filter( LPC_res, x, a_tmp_Q12, 2 * subfr_length, LPC_order );\r
 \r
             SKP_Silk_sum_sqr_shift( &res_nrg0, &rshift0, LPC_res + LPC_order,                subfr_length - LPC_order );\r
             SKP_Silk_sum_sqr_shift( &res_nrg1, &rshift1, LPC_res + LPC_order + subfr_length, subfr_length - LPC_order );\r
@@ -138,7 +136,7 @@ void SKP_Silk_find_LPC_FIX(
                 /* Interpolation has lower residual energy */\r
                 res_nrg   = res_nrg_interp;\r
                 res_nrg_Q = res_nrg_interp_Q;\r
-                *interpIndex = k;\r
+                *interpIndex = (SKP_int8)k;\r
             }\r
             res_nrg_2nd   = res_nrg_interp;\r
             res_nrg_2nd_Q = res_nrg_interp_Q;\r
index cddc29a..014cd08 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
index 12f62a0..2a66f52 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
@@ -44,7 +44,6 @@ void SKP_Silk_find_pitch_lags_FIX(
     SKP_int32 auto_corr[ MAX_FIND_PITCH_LPC_ORDER + 1 ];\r
     SKP_int16 rc_Q15[    MAX_FIND_PITCH_LPC_ORDER ];\r
     SKP_int32 A_Q24[     MAX_FIND_PITCH_LPC_ORDER ];\r
-    SKP_int32 FiltState[ MAX_FIND_PITCH_LPC_ORDER ];\r
     SKP_int16 A_Q12[     MAX_FIND_PITCH_LPC_ORDER ];\r
 \r
     /******************************************/\r
@@ -104,11 +103,9 @@ void SKP_Silk_find_pitch_lags_FIX(
     /*****************************************/\r
     /* LPC analysis filtering                */\r
     /*****************************************/\r
-    SKP_memset( FiltState, 0, psEnc->sCmn.pitchEstimationLPCOrder * sizeof( SKP_int32 ) ); /* Not really necessary, but Valgrind will complain otherwise */\r
-    SKP_Silk_MA_Prediction( x_buf, A_Q12, FiltState, res, buf_len, psEnc->sCmn.pitchEstimationLPCOrder );\r
-    SKP_memset( res, 0, psEnc->sCmn.pitchEstimationLPCOrder * sizeof( SKP_int16 ) );\r
+    SKP_Silk_LPC_analysis_filter( res, x_buf, A_Q12, buf_len, psEnc->sCmn.pitchEstimationLPCOrder );\r
 \r
-    if( psEncCtrl->sCmn.signalType != TYPE_NO_VOICE_ACTIVITY ) {\r
+    if( psEnc->sCmn.indices.signalType != TYPE_NO_VOICE_ACTIVITY ) {\r
         /* Threshold for pitch estimator */\r
         thrhld_Q15 = SKP_FIX_CONST( 0.6, 15 );\r
         thrhld_Q15 = SKP_SMLABB( thrhld_Q15, SKP_FIX_CONST( -0.004, 15 ), psEnc->sCmn.pitchEstimationLPCOrder );\r
@@ -120,18 +117,18 @@ void SKP_Silk_find_pitch_lags_FIX(
         /*****************************************/\r
         /* Call pitch estimator                  */\r
         /*****************************************/\r
-        if( SKP_Silk_pitch_analysis_core( res, psEncCtrl->sCmn.pitchL, &psEncCtrl->sCmn.lagIndex, \r
-                &psEncCtrl->sCmn.contourIndex, &psEnc->LTPCorr_Q15, psEnc->sCmn.prevLag, psEnc->sCmn.pitchEstimationThreshold_Q16, \r
+        if( SKP_Silk_pitch_analysis_core( res, psEncCtrl->pitchL, &psEnc->sCmn.indices.lagIndex, &psEnc->sCmn.indices.contourIndex, \r
+                &psEnc->LTPCorr_Q15, psEnc->sCmn.prevLag, psEnc->sCmn.pitchEstimationThreshold_Q16, \r
                 ( SKP_int16 )thrhld_Q15, psEnc->sCmn.fs_kHz, psEnc->sCmn.pitchEstimationComplexity, psEnc->sCmn.nb_subfr ) == 0 ) \r
         {\r
-            psEncCtrl->sCmn.signalType = TYPE_VOICED;\r
+            psEnc->sCmn.indices.signalType = TYPE_VOICED;\r
         } else {\r
-            psEncCtrl->sCmn.signalType = TYPE_UNVOICED;\r
+            psEnc->sCmn.indices.signalType = TYPE_UNVOICED;\r
         }\r
     } else {\r
-        SKP_memset( psEncCtrl->sCmn.pitchL, 0, sizeof( psEncCtrl->sCmn.pitchL ) );\r
-        psEncCtrl->sCmn.lagIndex = 0;\r
-        psEncCtrl->sCmn.contourIndex = 0;\r
+        SKP_memset( psEncCtrl->pitchL, 0, sizeof( psEncCtrl->pitchL ) );\r
+        psEnc->sCmn.indices.lagIndex = 0;\r
+        psEnc->sCmn.indices.contourIndex = 0;\r
         psEnc->LTPCorr_Q15 = 0;\r
     }\r
 }\r
index efe2dfb..5f3dcdc 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
@@ -27,48 +27,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 \r
 #include "SKP_Silk_main_FIX.h"\r
 \r
-#ifdef SAVE_ALL_INTERNAL_DATA\r
-#include <math.h>\r
-\r
-void SKP_Silk_LTP_ana_core(\r
-    SKP_float                       r_LPC[],        /* I    LPC residual            */\r
-    SKP_float                       r_LTP[],        /* O    LTP residual            */\r
-    const SKP_int                   pitchL[],       /* I    pitch lags              */\r
-    const SKP_float                 LTPCoef[],      /* I    LTP Coeficients         */\r
-    SKP_int                         subfr_length,   /* I    smpls in one sub frame  */\r
-    SKP_int                         LTP_mem_length  /* I    Length of LTP state of input */\r
-);\r
-\r
-void SKP_Silk_LPC_analysis_filter_FLP(\r
-    SKP_float                       r_LPC[],        /* O    LPC residual signal             */\r
-    const SKP_float                 PredCoef[],     /* I    LPC coeficicnts                 */\r
-    const SKP_float                 s[],            /* I    Input Signal                    */\r
-    SKP_int                         length,         /* I    length of signal                */\r
-    SKP_int                         Order           /* I    LPC order                       */\r
-);\r
-\r
-double SKP_Silk_energy_FLP( \r
-    const SKP_float     *data, \r
-    SKP_int             dataSize\r
-);\r
-\r
-/* integer to floating-point conversion */\r
-SKP_INLINE void SKP_short2float_array(\r
-    SKP_float       *out, \r
-    const SKP_int16 *in, \r
-    SKP_int32       length\r
-) \r
-{\r
-    SKP_int32 k;\r
-    for (k = length-1; k >= 0; k--) {\r
-        out[k] = (SKP_float)in[k];\r
-    }\r
-}\r
-\r
-SKP_INLINE SKP_float SKP_Silk_log2( double x ) { return ( SKP_float )( 3.32192809488736 * log10( x ) ); }\r
-\r
-#endif\r
-\r
 void SKP_Silk_find_pred_coefs_FIX(\r
     SKP_Silk_encoder_state_FIX      *psEnc,         /* I/O  encoder state                               */\r
     SKP_Silk_encoder_control_FIX    *psEncCtrl,     /* I/O  encoder control                             */\r
@@ -85,12 +43,6 @@ void SKP_Silk_find_pred_coefs_FIX(
     SKP_int32       tmp, min_gain_Q16;\r
     SKP_int         LTP_corrs_rshift[ MAX_NB_SUBFR ];\r
 \r
-#ifdef SAVE_ALL_INTERNAL_DATA\r
-    SKP_int16 uq_PredCoef_Q12[ MAX_NB_SUBFR >> 1 ][ MAX_LPC_ORDER ];\r
-    SKP_float uq_PredCoef[     MAX_NB_SUBFR >> 1 ][ MAX_LPC_ORDER ];\r
-    SKP_float uq_LTPCoef[ MAX_NB_SUBFR * LTP_ORDER ];\r
-#endif\r
-\r
     /* weighting for weighted least squares */\r
     min_gain_Q16 = SKP_int32_MAX >> 6;\r
     for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) {\r
@@ -114,26 +66,19 @@ void SKP_Silk_find_pred_coefs_FIX(
         local_gains[ i ] = SKP_DIV32( ( 1 << 16 ), invGains_Q16[ i ] );\r
     }\r
 \r
-    if( psEncCtrl->sCmn.signalType == TYPE_VOICED ) {\r
+    if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) {\r
         /**********/\r
         /* VOICED */\r
         /**********/\r
-        SKP_assert( psEnc->sCmn.ltp_mem_length - psEnc->sCmn.predictLPCOrder >= psEncCtrl->sCmn.pitchL[ 0 ] + LTP_ORDER / 2 );\r
+        SKP_assert( psEnc->sCmn.ltp_mem_length - psEnc->sCmn.predictLPCOrder >= psEncCtrl->pitchL[ 0 ] + LTP_ORDER / 2 );\r
 \r
         /* LTP analysis */\r
         SKP_Silk_find_LTP_FIX( psEncCtrl->LTPCoef_Q14, WLTP, &psEncCtrl->LTPredCodGain_Q7, \r
-            res_pitch, psEncCtrl->sCmn.pitchL, Wght_Q15, psEnc->sCmn.subfr_length, \r
+            res_pitch, psEncCtrl->pitchL, Wght_Q15, psEnc->sCmn.subfr_length, \r
             psEnc->sCmn.nb_subfr, psEnc->sCmn.ltp_mem_length, LTP_corrs_rshift );\r
 \r
-#ifdef SAVE_ALL_INTERNAL_DATA\r
-        /* Save unquantized LTP coefficients */\r
-        for( i = 0; i < LTP_ORDER * psEnc->sCmn.nb_subfr; i++ ) {\r
-            uq_LTPCoef[ i ] = (SKP_float)psEncCtrl->LTPCoef_Q14[ i ] / 16384.0f;\r
-        }\r
-#endif\r
-\r
         /* Quantize LTP gain parameters */\r
-        SKP_Silk_quant_LTP_gains( psEncCtrl->LTPCoef_Q14, psEncCtrl->sCmn.LTPIndex, &psEncCtrl->sCmn.PERIndex, \r
+        SKP_Silk_quant_LTP_gains( psEncCtrl->LTPCoef_Q14, psEnc->sCmn.indices.LTPIndex, &psEnc->sCmn.indices.PERIndex, \r
             WLTP, psEnc->sCmn.mu_LTP_Q9, psEnc->sCmn.LTPQuantLowComplexity, psEnc->sCmn.nb_subfr);\r
 \r
         /* Control LTP scaling */\r
@@ -141,7 +86,7 @@ void SKP_Silk_find_pred_coefs_FIX(
 \r
         /* Create LTP residual */\r
         SKP_Silk_LTP_analysis_filter_FIX( LPC_in_pre, psEnc->x_buf + psEnc->sCmn.ltp_mem_length - psEnc->sCmn.predictLPCOrder, \r
-            psEncCtrl->LTPCoef_Q14, psEncCtrl->sCmn.pitchL, invGains_Q16, psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr, psEnc->sCmn.predictLPCOrder );\r
+            psEncCtrl->LTPCoef_Q14, psEncCtrl->pitchL, invGains_Q16, psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr, psEnc->sCmn.predictLPCOrder );\r
 \r
     } else {\r
         /************/\r
@@ -163,37 +108,11 @@ void SKP_Silk_find_pred_coefs_FIX(
 \r
     /* LPC_in_pre contains the LTP-filtered input for voiced, and the unfiltered input for unvoiced */\r
     TIC(FIND_LPC)\r
-    SKP_Silk_find_LPC_FIX( NLSF_Q15, &psEncCtrl->sCmn.NLSFInterpCoef_Q2, psEnc->sPred.prev_NLSFq_Q15, \r
+    SKP_Silk_find_LPC_FIX( NLSF_Q15, &psEnc->sCmn.indices.NLSFInterpCoef_Q2, psEnc->sPred.prev_NLSFq_Q15, \r
         psEnc->sCmn.useInterpolatedNLSFs * ( 1 - psEnc->sCmn.first_frame_after_reset ), psEnc->sCmn.predictLPCOrder, \r
         LPC_in_pre, psEnc->sCmn.subfr_length + psEnc->sCmn.predictLPCOrder, psEnc->sCmn.nb_subfr );\r
     TOC(FIND_LPC)\r
 \r
-#ifdef SAVE_ALL_INTERNAL_DATA /* Save unquantized LPC's */\r
-    if( psEnc->sCmn.useInterpolatedNLSFs == 0 ) {\r
-        /* Convert back to filter representation */\r
-        SKP_Silk_NLSF2A_stable( uq_PredCoef_Q12[ 0 ], NLSF_Q15, psEnc->sCmn.predictLPCOrder );\r
-        SKP_memcpy( uq_PredCoef_Q12[ 1 ], uq_PredCoef_Q12[ 0 ], psEnc->sCmn.predictLPCOrder * sizeof( SKP_int16 ) );\r
-    } else { /* i.e. if( psEnc->useInterpolatedLSFs != 0 ) */\r
-        SKP_int iNLSF_Q15[ MAX_LPC_ORDER ];\r
-\r
-        /* Update interpolated LSF0 coefficients taking quantization of LSF1 coefficients into account */\r
-        SKP_Silk_interpolate( iNLSF_Q15, psEnc->sPred.prev_NLSFq_Q15, NLSF_Q15, \r
-            psEncCtrl->sCmn.NLSFInterpCoef_Q2, psEnc->sCmn.predictLPCOrder );\r
-\r
-        /* Convert back to filter representation */\r
-        SKP_Silk_NLSF2A_stable( uq_PredCoef_Q12[ 0 ], iNLSF_Q15, psEnc->sCmn.predictLPCOrder );\r
-\r
-        /* Convert back to filter representation */\r
-        SKP_Silk_NLSF2A_stable( uq_PredCoef_Q12[ 1 ], NLSF_Q15, psEnc->sCmn.predictLPCOrder );\r
-    }\r
-    \r
-    /* Convert to FLP */\r
-    for( i = 0; i < psEnc->sCmn.predictLPCOrder; i++ ) {\r
-        uq_PredCoef[ 0 ][ i ] = (SKP_float)uq_PredCoef_Q12[ 0 ][ i ] / 4096.0f;\r
-        uq_PredCoef[ 1 ][ i ] = (SKP_float)uq_PredCoef_Q12[ 1 ][ i ] / 4096.0f;\r
-    }\r
-#endif\r
-\r
     /* Quantize LSFs */\r
     TIC(PROCESS_LSFS)\r
         SKP_Silk_process_NLSFs_FIX( psEnc, psEncCtrl, NLSF_Q15 );\r
@@ -205,231 +124,4 @@ void SKP_Silk_find_pred_coefs_FIX(
 \r
     /* Copy to prediction struct for use in next frame for fluctuation reduction */\r
     SKP_memcpy( psEnc->sPred.prev_NLSFq_Q15, NLSF_Q15, psEnc->sCmn.predictLPCOrder * sizeof( SKP_int ) );\r
-\r
-#ifdef SAVE_ALL_INTERNAL_DATA\r
-    {\r
-        SKP_int   j, k;\r
-        SKP_float in_nrg, *in_ptr;\r
-        SKP_float LPC_res_nrg, qLPC_res_nrg, LTP_res_nrg, qLTP_res_nrg;\r
-        SKP_float LPC_predCodGain, QLPC_predCodGain, QLTP_predCodGain, LTPredCodGain, predCodGain;\r
-        SKP_float LPC_res[ MAX_FRAME_LENGTH << 1 ], LTP_res[ MAX_FRAME_LENGTH ];\r
-        SKP_float SF_resNrg[ MAX_NB_SUBFR ];\r
-\r
-        SKP_float x_flp[ 2 * MAX_FRAME_LENGTH ];\r
-        SKP_float Wght[ MAX_NB_SUBFR ];\r
-        SKP_float PredCoef[ 2 ][ MAX_LPC_ORDER ];\r
-        SKP_float LTPCoef[ MAX_NB_SUBFR * LTP_ORDER ];\r
-\r
-        /* Convert various FIX data to FLP */\r
-        SKP_short2float_array( x_flp, psEnc->x_buf, psEnc->sCmn.ltp_mem_length + psEnc->sCmn.frame_length );\r
-        for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) {\r
-            Wght[ k ] = ( (SKP_float)Wght_Q15[ k ] / 32768.0f );\r
-        }\r
-        for( i = 0; i < psEnc->sCmn.predictLPCOrder; i++ ) {\r
-            PredCoef[ 0 ][ i ] = (SKP_float)psEncCtrl->PredCoef_Q12[ 0 ][ i ] / 4096.0f;\r
-            PredCoef[ 1 ][ i ] = (SKP_float)psEncCtrl->PredCoef_Q12[ 1 ][ i ] / 4096.0f;\r
-        }\r
-        for( i = 0; i < psEnc->sCmn.nb_subfr * LTP_ORDER; i++ ) {\r
-            LTPCoef[ i ] = (SKP_float)psEncCtrl->LTPCoef_Q14[ i ] / 16384.0f;\r
-        }\r
-\r
-        /* Weighted input energy */\r
-        in_ptr = &x_flp[ psEnc->sCmn.ltp_mem_length ];\r
-        DEBUG_STORE_DATA( x_flp.dat,  x_flp,  psEnc->sCmn.frame_length * sizeof( SKP_float ) );\r
-        DEBUG_STORE_DATA( in_ptr.dat, in_ptr, psEnc->sCmn.frame_length * sizeof( SKP_float ) );\r
-        in_nrg = 0.0f;\r
-        for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) {\r
-            in_nrg += (SKP_float)SKP_Silk_energy_FLP( in_ptr, psEnc->sCmn.subfr_length ) * Wght[ k ];\r
-            in_ptr += psEnc->sCmn.subfr_length;\r
-        }\r
-\r
-        if( psEnc->sCmn.useInterpolatedNLSFs == 0 ) {\r
-            SKP_memcpy( PredCoef[ 0 ], PredCoef[ 1 ], psEnc->sCmn.predictLPCOrder * sizeof( SKP_float ) );\r
-        }\r
-\r
-        DEBUG_STORE_DATA( uq_PredCoef.dat, uq_PredCoef[0], psEnc->sCmn.predictLPCOrder * sizeof( SKP_float ) );\r
-        DEBUG_STORE_DATA( PredCoef.dat,    PredCoef[0],    psEnc->sCmn.predictLPCOrder * sizeof( SKP_float ) );\r
-\r
-        LPC_res_nrg  = 0.0f;\r
-        LTP_res_nrg  = 0.0f;\r
-        qLPC_res_nrg = 0.0f;\r
-        qLTP_res_nrg = 0.0f;\r
-        for( j = 0; j < psEnc->sCmn.nb_subfr; j += 2 ) {\r
-            /* Calculate LPC residual with unquantized LPC */\r
-            SKP_Silk_LPC_analysis_filter_FLP( LPC_res, uq_PredCoef[ j >> 1 ], x_flp + j * psEnc->sCmn.subfr_length,\r
-                ( psEnc->sCmn.ltp_mem_length + ( psEnc->sCmn.subfr_length << 1 ) ), psEnc->sCmn.predictLPCOrder );\r
-\r
-            /* Weighted energy */\r
-            in_ptr = &LPC_res[ psEnc->sCmn.ltp_mem_length ];\r
-            for( k = 0; k < 2; k++ ) {\r
-                LPC_res_nrg += (SKP_float)SKP_Silk_energy_FLP( in_ptr, psEnc->sCmn.subfr_length ) * Wght[ j + k ];\r
-                in_ptr      += psEnc->sCmn.subfr_length;\r
-            }\r
-                \r
-            if( psEncCtrl->sCmn.signalType == TYPE_VOICED ) {\r
-                /* Calculate LTP residual with unquantized LTP and unquantized LPC */\r
-                SKP_Silk_LTP_ana_core( LPC_res, LTP_res, &psEncCtrl->sCmn.pitchL[ j ],\r
-                    &uq_LTPCoef[ j * LTP_ORDER ], psEnc->sCmn.subfr_length, psEnc->sCmn.ltp_mem_length );\r
-\r
-                /* Weighted energy */\r
-                in_ptr = LTP_res;\r
-                for( k = 0; k < 2; k++ ) {\r
-                    LTP_res_nrg += (SKP_float)SKP_Silk_energy_FLP( in_ptr, psEnc->sCmn.subfr_length ) * Wght[ j + k ];\r
-                    in_ptr      += psEnc->sCmn.subfr_length;\r
-                }\r
-            }\r
-\r
-            /* Calculate LPC residual with quantized LPC */\r
-            SKP_Silk_LPC_analysis_filter_FLP( LPC_res, PredCoef[ j >> 1 ], x_flp + j * psEnc->sCmn.subfr_length,\r
-                ( psEnc->sCmn.ltp_mem_length + ( psEnc->sCmn.subfr_length << 1 ) ), psEnc->sCmn.predictLPCOrder );\r
-\r
-            /* Weighted energy */\r
-            in_ptr = &LPC_res[ psEnc->sCmn.ltp_mem_length ];\r
-            for( k = 0; k < 2; k++ ) {\r
-                SF_resNrg[ k + j ] = (SKP_float)SKP_Silk_energy_FLP( in_ptr, psEnc->sCmn.subfr_length );\r
-                qLPC_res_nrg += SF_resNrg[ k + j ] * Wght[ j + k ];\r
-                in_ptr       += psEnc->sCmn.subfr_length;\r
-            }\r
-\r
-            if( psEncCtrl->sCmn.signalType == TYPE_VOICED ) {\r
-                /* Calculate LTP residual with unquantized LTP and unquantized LPC */\r
-                SKP_Silk_LTP_ana_core( LPC_res, LTP_res, &psEncCtrl->sCmn.pitchL[ j ],\r
-                    &LTPCoef[ j * LTP_ORDER ], psEnc->sCmn.subfr_length, psEnc->sCmn.ltp_mem_length );\r
-\r
-                /* Weighted energy */\r
-                in_ptr = LTP_res;\r
-                for( k = 0; k < 2; k++ ) {\r
-                    SF_resNrg[ k + j ] = (SKP_float)SKP_Silk_energy_FLP( in_ptr, psEnc->sCmn.subfr_length );\r
-                    qLTP_res_nrg += SF_resNrg[ k + j ] * Wght[ j + k ];\r
-                    in_ptr       += psEnc->sCmn.subfr_length;\r
-                }\r
-            } else {\r
-                SKP_memcpy( LTP_res, &LPC_res[ psEnc->sCmn.ltp_mem_length ], ( psEnc->sCmn.subfr_length << 1 ) * sizeof( SKP_float ) );\r
-            }\r
-            /* Save residual */\r
-            DEBUG_STORE_DATA( LPC_res.dat, &LPC_res[ psEnc->sCmn.ltp_mem_length ], ( psEnc->sCmn.subfr_length << 1 ) * sizeof( SKP_float ) );\r
-            DEBUG_STORE_DATA( res.dat,     LTP_res,                                ( psEnc->sCmn.subfr_length << 1 ) * sizeof( SKP_float ) );\r
-        }\r
-        if( psEncCtrl->sCmn.signalType == TYPE_VOICED ) {\r
-            LPC_predCodGain  = 3.0f * SKP_Silk_log2( in_nrg       / LPC_res_nrg  );\r
-            QLPC_predCodGain = 3.0f * SKP_Silk_log2( in_nrg       / qLPC_res_nrg );\r
-            LTPredCodGain    = 3.0f * SKP_Silk_log2( LPC_res_nrg  / LTP_res_nrg  );\r
-            QLTP_predCodGain = 3.0f * SKP_Silk_log2( qLPC_res_nrg / qLTP_res_nrg );\r
-        } else {\r
-            LPC_predCodGain  = 3.0f * SKP_Silk_log2( in_nrg       / LPC_res_nrg  );\r
-            QLPC_predCodGain = 3.0f * SKP_Silk_log2( in_nrg       / qLPC_res_nrg );\r
-            LTPredCodGain    = 0.0f;\r
-            QLTP_predCodGain = 0.0f;\r
-        }\r
-        predCodGain = QLPC_predCodGain + QLTP_predCodGain;\r
-\r
-        DEBUG_STORE_DATA( LTPredCodGain.dat,    &LTPredCodGain,                                        sizeof( SKP_float ) );\r
-        DEBUG_STORE_DATA( QLTP_predCodGain.dat, &QLTP_predCodGain,                                     sizeof( SKP_float ) ); \r
-        DEBUG_STORE_DATA( LPC_predCodGain.dat,  &LPC_predCodGain,                                      sizeof( SKP_float ) );\r
-        DEBUG_STORE_DATA( QLPC_predCodGain.dat, &QLPC_predCodGain,                                     sizeof( SKP_float ) );\r
-        DEBUG_STORE_DATA( predCodGain.dat,      &predCodGain,                                          sizeof( SKP_float ) ); \r
-        DEBUG_STORE_DATA( ResNrg.dat,           SF_resNrg,                      psEnc->sCmn.nb_subfr * sizeof( SKP_float ) );\r
-    }\r
-#endif\r
-}\r
-\r
-#ifdef SAVE_ALL_INTERNAL_DATA\r
-/****************************************************/\r
-/* LTP analysis filter. Filters two subframes       */\r
-/****************************************************/\r
-void SKP_Silk_LTP_ana_core(\r
-    SKP_float                       r_LPC[],        /* I    LPC residual            */\r
-    SKP_float                       r_LTP[],        /* O    LTP residual            */\r
-    const SKP_int                   pitchL[],       /* I    pitch lags              */\r
-    const SKP_float                 LTPCoef[],      /* I    LTP Coeficients         */\r
-    SKP_int                         subfr_length,   /* I    smpls in one sub frame  */\r
-    SKP_int                         LTP_mem_length  /* I    Length of LTP state of input */\r
-)\r
-{\r
-    SKP_int   k, i;\r
-    SKP_float LTP_pred;\r
-    const SKP_float *r, *b_ptr, *lag_ptr;\r
-\r
-    r = &r_LPC[ LTP_mem_length ];\r
-    b_ptr = LTPCoef;\r
-    for( k = 0; k < (MAX_NB_SUBFR >> 1); k++ ) {\r
-        lag_ptr = r - pitchL[k];\r
-        /* LTP analysis FIR filter */\r
-        for( i = 0; i < subfr_length; i++ ) {\r
-            /* long-term prediction */\r
-            LTP_pred  = lag_ptr[LTP_ORDER/2]     * b_ptr[0];\r
-            LTP_pred += lag_ptr[LTP_ORDER/2 - 1] * b_ptr[1];\r
-            LTP_pred += lag_ptr[LTP_ORDER/2 - 2] * b_ptr[2];\r
-            LTP_pred += lag_ptr[LTP_ORDER/2 - 3] * b_ptr[3];\r
-            LTP_pred += lag_ptr[LTP_ORDER/2 - 4] * b_ptr[4];\r
-\r
-            /* subtract prediction */\r
-            r_LTP[i] = r[i] - LTP_pred;\r
-            lag_ptr++;\r
-        }\r
-        r += subfr_length;\r
-        r_LTP += subfr_length;\r
-        b_ptr += LTP_ORDER;\r
-    }\r
-}\r
-\r
-/*******************************************/\r
-/* LPC analysis filter                     */\r
-/* NB! State is kept internally and the    */\r
-/* filter always starts with zero state    */\r
-/* first Order output samples are not set  */\r
-/*******************************************/\r
-void SKP_Silk_LPC_analysis_filter_FLP(\r
-    SKP_float                       r_LPC[],        /* O    LPC residual signal             */\r
-    const SKP_float                 PredCoef[],     /* I    LPC coeficicnts                 */\r
-    const SKP_float                 s[],            /* I    Input Signal                    */\r
-    SKP_int                         length,         /* I    length of signal                */\r
-    SKP_int                         Order           /* I    LPC order                       */\r
-)\r
-{\r
-    SKP_int   i, j;\r
-    SKP_float LPC_pred;\r
-    const SKP_float *s_ptr;\r
-\r
-    for ( i = Order; i < length; i++ ) {\r
-        s_ptr = &s[i - 1];\r
-\r
-        LPC_pred = 0;\r
-        /* short-term prediction */\r
-        for( j = 0; j < Order; j++ ) {\r
-            LPC_pred += s_ptr[ -j ] * PredCoef[ j ];\r
-        }\r
-\r
-        /* prediction error */\r
-        r_LPC[ i ] = s_ptr[ 1 ] - LPC_pred;\r
-    }\r
-}\r
-\r
-/* sum of squares of a SKP_float array, with result as double */\r
-double SKP_Silk_energy_FLP( \r
-    const SKP_float     *data, \r
-    SKP_int             dataSize\r
-)\r
-{\r
-    SKP_int  i, dataSize4;\r
-    double   result;\r
-\r
-    /* 4x unrolled loop */\r
-    result = 0.0f;\r
-    dataSize4 = dataSize & 0xFFFC;\r
-    for( i = 0; i < dataSize4; i += 4 ) {\r
-        result += data[ i + 0 ] * data[ i + 0 ] + \r
-                  data[ i + 1 ] * data[ i + 1 ] +\r
-                  data[ i + 2 ] * data[ i + 2 ] +\r
-                  data[ i + 3 ] * data[ i + 3 ];\r
-    }\r
-\r
-    /* add any remaining products */\r
-    for( ; i < dataSize; i++ ) {\r
-        result += data[ i ] * data[ i ];\r
-    }\r
-\r
-    SKP_assert( result >= 0.0 );\r
-    return result;\r
 }\r
-#endif\r
index 01bfc5e..d57d15b 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
@@ -48,9 +48,5 @@ SKP_int SKP_Silk_init_encoder_FIX(
     /* Initialize Silk VAD */\r
     ret += SKP_Silk_VAD_Init( &psEnc->sCmn.sVAD );\r
 \r
-    /* Initialize NSQ */\r
-    psEnc->sNSQ.prev_inv_gain_Q16      = 65536;\r
-    psEnc->sNSQ_LBRR.prev_inv_gain_Q16 = 65536;\r
-\r
     return( ret );\r
 }\r
index 382443e..64c5b8b 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
@@ -57,19 +57,15 @@ void SKP_Silk_HP_variable_cutoff_FIX(
 /* Encoder main function */\r
 SKP_int SKP_Silk_encode_frame_FIX( \r
     SKP_Silk_encoder_state_FIX      *psEnc,             /* I/O  Pointer to Silk FIX encoder state       */\r
-    SKP_int32                       *pnBytesOut,        /* I/O  Pointer to number of payload bytes;     */\r
-                                                        /*      input: max length; output: used         */\r
-    ec_enc                          *psRangeEnc,        /* I/O  compressor data structure               */\r
-    const SKP_int16                 *pIn                /* I    Pointer to input speech frame           */\r
+    SKP_int32                       *pnBytesOut,        /*   O  Pointer to number of payload bytes;     */\r
+    ec_enc                          *psRangeEnc         /* I/O  compressor data structure               */\r
 );\r
 \r
 /* Low Bitrate Redundancy (LBRR) encoding. Reuse all parameters but encode with lower bitrate           */\r
 void SKP_Silk_LBRR_encode_FIX(\r
     SKP_Silk_encoder_state_FIX      *psEnc,         /* I/O  Pointer to Silk FIX encoder state           */\r
     SKP_Silk_encoder_control_FIX    *psEncCtrl,     /* I/O  Pointer to Silk FIX encoder control struct  */\r
-    SKP_uint8                       *pCode,         /* O    Pointer to payload                          */\r
-    SKP_int32                       *pnBytesOut,    /* I/O  Pointer to number of payload bytes          */\r
-    SKP_int16                       xfw[]           /* I    Input signal                                */\r
+    const SKP_int16                 xfw[]           /* I    Input signal                                */\r
 );\r
 \r
 /* Initializes the Silk encoder state */\r
@@ -145,7 +141,7 @@ void SKP_Silk_find_pred_coefs_FIX(
 /* LPC analysis */\r
 void SKP_Silk_find_LPC_FIX(\r
     SKP_int             NLSF_Q15[],                 /* O    NLSFs                                                                       */\r
-    SKP_int             *interpIndex,               /* O    NLSF interpolation index, only used for NLSF interpolation                  */\r
+    SKP_int8            *interpIndex,               /* O    NLSF interpolation index, only used for NLSF interpolation                  */\r
     const SKP_int       prev_NLSFq_Q15[],           /* I    previous NLSFs, only used for NLSF interpolation                            */\r
     const SKP_int       useInterpolatedNLSFs,       /* I    Flag                                                                        */\r
     const SKP_int       LPC_order,                  /* I    LPC order                                                                   */\r
@@ -204,7 +200,7 @@ void SKP_Silk_process_NLSFs_FIX(
 \r
 /* NLSF vector encoder */\r
 void SKP_Silk_NLSF_MSVQ_encode_FIX(\r
-          SKP_int                   *NLSFIndices,           /* O    Codebook path vector [ CB_STAGES ]      */\r
+          SKP_int8                  *NLSFIndices,           /* O    Codebook path vector [ CB_STAGES ]      */\r
           SKP_int                   *pNLSF_Q15,             /* I/O  Quantized NLSF vector [ LPC_ORDER ]     */\r
     const SKP_Silk_NLSF_CB_struct   *psNLSF_CB,             /* I    Codebook object                         */\r
     const SKP_int                   *pNLSF_q_Q15_prev,      /* I    Prev. quantized NLSF vector [LPC_ORDER] */\r
@@ -220,7 +216,7 @@ void SKP_Silk_NLSF_MSVQ_encode_FIX(
 void SKP_Silk_NLSF_VQ_rate_distortion_FIX(\r
     SKP_int32                       *pRD_Q20,           /* O    Rate-distortion values [psNLSF_CBS->nVectors*N] */\r
     const SKP_Silk_NLSF_CBS         *psNLSF_CBS,        /* I    NLSF codebook stage struct                      */\r
-    const SKP_int                   *in_Q15,            /* I    Input vectors to be quantized                   */\r
+    const SKP_int16                 *in_Q15,            /* I    Input vectors to be quantized                   */\r
     const SKP_int                   *w_Q6,              /* I    Weight vector                                   */\r
     const SKP_int32                 *rate_acc_Q5,       /* I    Accumulated rates from previous stage           */\r
     const SKP_int                   mu_Q15,             /* I    Weight between weighted error and rate          */\r
@@ -231,7 +227,7 @@ void SKP_Silk_NLSF_VQ_rate_distortion_FIX(
 /* Compute weighted quantization errors for an LPC_order element input vector, over one codebook stage */\r
 void SKP_Silk_NLSF_VQ_sum_error_FIX(\r
     SKP_int32                       *err_Q20,           /* O    Weighted quantization errors  [N*K]         */\r
-    const SKP_int                   *in_Q15,            /* I    Input vectors to be quantized [N*LPC_order] */\r
+    const SKP_int16                 *in_Q15,            /* I    Input vectors to be quantized [N*LPC_order] */\r
     const SKP_int                   *w_Q6,              /* I    Weighting vectors             [N*LPC_order] */\r
     const SKP_int8                  *pCB_Q9,            /* I    Codebook vectors              [K*LPC_order] */\r
     const SKP_int                   N,                  /* I    Number of input vectors                     */\r
index 1513486..649161d 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
@@ -151,9 +151,8 @@ void SKP_Silk_noise_shape_analysis_FIX(
     SKP_int32   AR1_Q24[       MAX_SHAPE_LPC_ORDER ];\r
     SKP_int32   AR2_Q24[       MAX_SHAPE_LPC_ORDER ];\r
     SKP_int16   x_windowed[    SHAPE_LPC_WIN_MAX ];\r
-    const SKP_int16 *x_ptr, *pitch_res_ptr;\r
-\r
     SKP_int32   sqrt_nrg[ MAX_NB_SUBFR ], Qnrg_vec[ MAX_NB_SUBFR ];\r
+    const SKP_int16 *x_ptr, *pitch_res_ptr;\r
 \r
     /* Point to start of first LPC analysis block */\r
     x_ptr = x - psEnc->sCmn.la_shape;\r
@@ -162,13 +161,10 @@ void SKP_Silk_noise_shape_analysis_FIX(
     /* CONTROL SNR  */\r
     /****************/\r
     /* Reduce SNR_dB values if recent bitstream has exceeded TargetRate */\r
-    psEncCtrl->current_SNR_dB_Q7 = psEnc->SNR_dB_Q7 - SKP_SMULWB( SKP_LSHIFT( ( SKP_int32 )psEnc->BufferedInChannel_ms, 7 ), \r
-        SKP_FIX_CONST( 0.1, 16 ) );\r
+    psEncCtrl->current_SNR_dB_Q7 = psEnc->SNR_dB_Q7 - SKP_SMULBB( psEnc->BufferedInChannel_ms, SKP_FIX_CONST( 0.1, 7 ) );\r
 \r
-    /* Reduce SNR_dB if inband FEC used */\r
-    if( psEnc->speech_activity_Q8 > SKP_FIX_CONST( LBRR_SPEECH_ACTIVITY_THRES, 8 ) ) {\r
-        psEncCtrl->current_SNR_dB_Q7 -= SKP_RSHIFT( psEnc->inBandFEC_SNR_comp_Q8, 1 );\r
-    }\r
+    /* Reduce SNR_dB because of any inband FEC used */\r
+    psEncCtrl->current_SNR_dB_Q7 -= psEnc->inBandFEC_SNR_comp_Q7;\r
 \r
     /****************/\r
     /* GAIN CONTROL */\r
@@ -191,7 +187,7 @@ void SKP_Silk_noise_shape_analysis_FIX(
             SKP_SMULWB( SKP_FIX_CONST( 1.0, 14 ) + psEncCtrl->input_quality_Q14, psEncCtrl->coding_quality_Q14 ) );     // Q12\r
     }\r
 \r
-    if( psEncCtrl->sCmn.signalType == TYPE_VOICED ) {\r
+    if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) {\r
         /* Reduce gains for periodic signals */\r
         SNR_adj_dB_Q7 = SKP_SMLAWB( SNR_adj_dB_Q7, SKP_FIX_CONST( HARM_SNR_INCR_dB, 8 ), psEnc->LTPCorr_Q15 );\r
     } else { \r
@@ -205,9 +201,9 @@ void SKP_Silk_noise_shape_analysis_FIX(
     /* SPARSENESS PROCESSING */\r
     /*************************/\r
     /* Set quantizer offset */\r
-    if( psEncCtrl->sCmn.signalType == TYPE_VOICED ) {\r
+    if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) {\r
         /* Initally set to 0; may be overruled in process_gains(..) */\r
-        psEncCtrl->sCmn.quantOffsetType = 0;\r
+        psEnc->sCmn.indices.quantOffsetType = 0;\r
         psEncCtrl->sparseness_Q8 = 0;\r
     } else {\r
         /* Sparseness measure, based on relative fluctuations of energy per 2 milliseconds */\r
@@ -232,9 +228,9 @@ void SKP_Silk_noise_shape_analysis_FIX(
 \r
         /* Set quantization offset depending on sparseness measure */\r
         if( psEncCtrl->sparseness_Q8 > SKP_FIX_CONST( SPARSENESS_THRESHOLD_QNT_OFFSET, 8 ) ) {\r
-            psEncCtrl->sCmn.quantOffsetType = 0;\r
+            psEnc->sCmn.indices.quantOffsetType = 0;\r
         } else {\r
-            psEncCtrl->sCmn.quantOffsetType = 1;\r
+            psEnc->sCmn.indices.quantOffsetType = 1;\r
         }\r
         \r
         /* Increase coding SNR for sparse signals */\r
@@ -383,12 +379,12 @@ void SKP_Silk_noise_shape_analysis_FIX(
         SKP_FIX_CONST( LOW_QUALITY_LOW_FREQ_SHAPING_DECR, 13 ), psEncCtrl->input_quality_bands_Q15[ 0 ] - SKP_FIX_CONST( 1.0, 15 ) ) );\r
 #endif\r
     strength_Q16 = SKP_RSHIFT( SKP_MUL( strength_Q16, psEnc->speech_activity_Q8 ), 8 );\r
-    if( psEncCtrl->sCmn.signalType == TYPE_VOICED ) {\r
+    if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) {\r
         /* Reduce low frequencies quantization noise for periodic signals, depending on pitch lag */\r
         /*f = 400; freqz([1, -0.98 + 2e-4 * f], [1, -0.97 + 7e-4 * f], 2^12, Fs); axis([0, 1000, -10, 1])*/\r
         SKP_int fs_kHz_inv = SKP_DIV32_16( SKP_FIX_CONST( 0.2, 14 ), psEnc->sCmn.fs_kHz );\r
         for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) {\r
-            b_Q14 = fs_kHz_inv + SKP_DIV32_16( SKP_FIX_CONST( 3.0, 14 ), psEncCtrl->sCmn.pitchL[ k ] ); \r
+            b_Q14 = fs_kHz_inv + SKP_DIV32_16( SKP_FIX_CONST( 3.0, 14 ), psEncCtrl->pitchL[ k ] ); \r
             /* Pack two coefficients in one int32 */\r
             psEncCtrl->LF_shp_Q14[ k ]  = SKP_LSHIFT( SKP_FIX_CONST( 1.0, 14 ) - b_Q14 - SKP_SMULWB( strength_Q16, b_Q14 ), 16 );\r
             psEncCtrl->LF_shp_Q14[ k ] |= (SKP_uint16)( b_Q14 - SKP_FIX_CONST( 1.0, 14 ) );\r
@@ -420,7 +416,7 @@ void SKP_Silk_noise_shape_analysis_FIX(
     HarmBoost_Q16 = SKP_SMLAWB( HarmBoost_Q16, \r
         SKP_FIX_CONST( 1.0, 16 ) - SKP_LSHIFT( psEncCtrl->input_quality_Q14, 2 ), SKP_FIX_CONST( LOW_INPUT_QUALITY_HARMONIC_BOOST, 16 ) );\r
 \r
-    if( USE_HARM_SHAPING && psEncCtrl->sCmn.signalType == TYPE_VOICED ) {\r
+    if( USE_HARM_SHAPING && psEnc->sCmn.indices.signalType == TYPE_VOICED ) {\r
         /* More harmonic noise shaping for high bitrates or noisy input */\r
         HarmShapeGain_Q16 = SKP_SMLAWB( SKP_FIX_CONST( HARMONIC_SHAPING, 16 ), \r
                 SKP_FIX_CONST( 1.0, 16 ) - SKP_SMULWB( SKP_FIX_CONST( 1.0, 18 ) - SKP_LSHIFT( psEncCtrl->coding_quality_Q14, 4 ),\r
index 994bac2..58be293 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
@@ -106,8 +106,8 @@ void SKP_Silk_prefilter_FIX(
     lag = P->lagPrev;\r
     for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) {\r
         /* Update Variables that change per sub frame */\r
-        if( psEncCtrl->sCmn.signalType == TYPE_VOICED ) {\r
-            lag = psEncCtrl->sCmn.pitchL[ k ];\r
+        if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) {\r
+            lag = psEncCtrl->pitchL[ k ];\r
         }\r
 \r
         /* Noise shape parameters */\r
@@ -144,7 +144,7 @@ void SKP_Silk_prefilter_FIX(
         pxw += psEnc->sCmn.subfr_length;\r
     }\r
 \r
-    P->lagPrev = psEncCtrl->sCmn.pitchL[ MAX_NB_SUBFR - 1 ];\r
+    P->lagPrev = psEncCtrl->pitchL[ MAX_NB_SUBFR - 1 ];\r
 }\r
 \r
 /* SKP_Silk_prefilter. Prefilter for finding Quantizer input signal                           */\r
index 9e41e75..09e7ba7 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
@@ -53,7 +53,7 @@ void SKP_Silk_process_NLSFs_FIX(
     /***********************/\r
     /* Calculate mu values */\r
     /***********************/\r
-    if( psEncCtrl->sCmn.signalType == TYPE_VOICED ) {\r
+    if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) {\r
         /* NLSF_mu           = 0.002f - 0.001f * psEnc->speech_activity; */\r
         /* NLSF_mu_fluc_red  = 0.1f   - 0.05f  * psEnc->speech_activity; */\r
         NLSF_mu_Q15          = SKP_SMLAWB(   66,   -8388, psEnc->speech_activity_Q8 );\r
@@ -72,25 +72,21 @@ void SKP_Silk_process_NLSFs_FIX(
     NLSF_mu_Q15 = SKP_max( NLSF_mu_Q15, 1 );\r
 \r
     /* Calculate NLSF weights */\r
-    TIC(NLSF_weights_FIX)\r
     SKP_Silk_NLSF_VQ_weights_laroia( pNLSFW_Q6, pNLSF_Q15, psEnc->sCmn.predictLPCOrder );\r
-    TOC(NLSF_weights_FIX)\r
 \r
     /* Update NLSF weights for interpolated NLSFs */\r
-    doInterpolate = ( psEnc->sCmn.useInterpolatedNLSFs == 1 ) && ( psEncCtrl->sCmn.NLSFInterpCoef_Q2 < ( 1 << 2 ) );\r
+    doInterpolate = ( psEnc->sCmn.useInterpolatedNLSFs == 1 ) && ( psEnc->sCmn.indices.NLSFInterpCoef_Q2 < ( 1 << 2 ) );\r
     if( doInterpolate ) {\r
 \r
         /* Calculate the interpolated NLSF vector for the first half */\r
         SKP_Silk_interpolate( pNLSF0_temp_Q15, psEnc->sPred.prev_NLSFq_Q15, pNLSF_Q15, \r
-            psEncCtrl->sCmn.NLSFInterpCoef_Q2, psEnc->sCmn.predictLPCOrder );\r
+            psEnc->sCmn.indices.NLSFInterpCoef_Q2, psEnc->sCmn.predictLPCOrder );\r
 \r
         /* Calculate first half NLSF weights for the interpolated NLSFs */\r
-        TIC(NLSF_weights_FIX)\r
         SKP_Silk_NLSF_VQ_weights_laroia( pNLSFW0_temp_Q6, pNLSF0_temp_Q15, psEnc->sCmn.predictLPCOrder );\r
-        TOC(NLSF_weights_FIX)\r
 \r
         /* Update NLSF weights with contribution from first half */\r
-        i_sqr_Q15 = SKP_LSHIFT( SKP_SMULBB( psEncCtrl->sCmn.NLSFInterpCoef_Q2, psEncCtrl->sCmn.NLSFInterpCoef_Q2 ), 11 );\r
+        i_sqr_Q15 = SKP_LSHIFT( SKP_SMULBB( psEnc->sCmn.indices.NLSFInterpCoef_Q2, psEnc->sCmn.indices.NLSFInterpCoef_Q2 ), 11 );\r
         for( i = 0; i < psEnc->sCmn.predictLPCOrder; i++ ) {\r
             pNLSFW_Q6[ i ] = SKP_SMLAWB( SKP_RSHIFT( pNLSFW_Q6[ i ], 1 ), pNLSFW0_temp_Q6[ i ], i_sqr_Q15 );\r
             SKP_assert( pNLSFW_Q6[ i ] <= SKP_int16_MAX );\r
@@ -99,11 +95,11 @@ void SKP_Silk_process_NLSFs_FIX(
     }\r
 \r
     /* Set pointer to the NLSF codebook for the current signal type and LPC order */\r
-    psNLSF_CB = psEnc->sCmn.psNLSF_CB[ 1 - ( psEncCtrl->sCmn.signalType >> 1 ) ];\r
+    psNLSF_CB = psEnc->sCmn.psNLSF_CB[ 1 - ( psEnc->sCmn.indices.signalType >> 1 ) ];\r
 \r
     /* Quantize NLSF parameters given the trained NLSF codebooks */\r
     TIC(MSVQ_encode_FIX)\r
-    SKP_Silk_NLSF_MSVQ_encode_FIX( psEncCtrl->sCmn.NLSFIndices, pNLSF_Q15, psNLSF_CB, \r
+    SKP_Silk_NLSF_MSVQ_encode_FIX( psEnc->sCmn.indices.NLSFIndices, pNLSF_Q15, psNLSF_CB, \r
         psEnc->sPred.prev_NLSFq_Q15, pNLSFW_Q6, NLSF_mu_Q15, NLSF_mu_fluc_red_Q16, \r
         psEnc->sCmn.NLSF_MSVQ_Survivors, psEnc->sCmn.predictLPCOrder, psEnc->sCmn.first_frame_after_reset );\r
     TOC(MSVQ_encode_FIX)\r
@@ -114,7 +110,7 @@ void SKP_Silk_process_NLSFs_FIX(
     if( doInterpolate ) {\r
         /* Calculate the interpolated, quantized LSF vector for the first half */\r
         SKP_Silk_interpolate( pNLSF0_temp_Q15, psEnc->sPred.prev_NLSFq_Q15, pNLSF_Q15, \r
-            psEncCtrl->sCmn.NLSFInterpCoef_Q2, psEnc->sCmn.predictLPCOrder );\r
+            psEnc->sCmn.indices.NLSFInterpCoef_Q2, psEnc->sCmn.predictLPCOrder );\r
 \r
         /* Convert back to LPC coefficients */\r
         SKP_Silk_NLSF2A_stable( psEncCtrl->PredCoef_Q12[ 0 ], pNLSF0_temp_Q15, psEnc->sCmn.predictLPCOrder );\r
index 23ea9cc..dfa0980 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
@@ -39,7 +39,7 @@ void SKP_Silk_process_gains_FIX(
     SKP_int32   s_Q16, InvMaxSqrVal_Q16, gain, gain_squared, ResNrg, ResNrgPart, quant_offset_Q10;\r
 \r
     /* Gain reduction when LTP coding gain is high */\r
-    if( psEncCtrl->sCmn.signalType == TYPE_VOICED ) {\r
+    if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) {\r
         /*s = -0.5f * SKP_sigmoid( 0.25f * ( psEncCtrl->LTPredCodGain - 12.0f ) ); */\r
         s_Q16 = -SKP_Silk_sigm_Q15( SKP_RSHIFT_ROUND( psEncCtrl->LTPredCodGain_Q7 - SKP_FIX_CONST( 12.0, 7 ), 4 ) );\r
         for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) {\r
@@ -83,19 +83,19 @@ void SKP_Silk_process_gains_FIX(
     }\r
 \r
     /* Noise shaping quantization */\r
-    SKP_Silk_gains_quant( psEncCtrl->sCmn.GainsIndices, psEncCtrl->Gains_Q16, \r
-        &psShapeSt->LastGainIndex, psEnc->sCmn.nFramesInPayloadBuf, psEnc->sCmn.nb_subfr );\r
+    SKP_Silk_gains_quant( psEnc->sCmn.indices.GainsIndices, psEncCtrl->Gains_Q16, \r
+        &psShapeSt->LastGainIndex, psEnc->sCmn.nFramesAnalyzed, psEnc->sCmn.nb_subfr );\r
     /* Set quantizer offset for voiced signals. Larger offset when LTP coding gain is low or tilt is high (ie low-pass) */\r
-    if( psEncCtrl->sCmn.signalType == TYPE_VOICED ) {\r
+    if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) {\r
         if( psEncCtrl->LTPredCodGain_Q7 + SKP_RSHIFT( psEncCtrl->input_tilt_Q15, 8 ) > SKP_FIX_CONST( 1.0, 7 ) ) {\r
-            psEncCtrl->sCmn.quantOffsetType = 0;\r
+            psEnc->sCmn.indices.quantOffsetType = 0;\r
         } else {\r
-            psEncCtrl->sCmn.quantOffsetType = 1;\r
+            psEnc->sCmn.indices.quantOffsetType = 1;\r
         }\r
     }\r
 \r
     /* Quantizer boundary adjustment */\r
-    quant_offset_Q10 = SKP_Silk_Quantization_Offsets_Q10[ psEncCtrl->sCmn.signalType >> 1 ][ psEncCtrl->sCmn.quantOffsetType ];\r
+    quant_offset_Q10 = SKP_Silk_Quantization_Offsets_Q10[ psEnc->sCmn.indices.signalType >> 1 ][ psEnc->sCmn.indices.quantOffsetType ];\r
     psEncCtrl->Lambda_Q10 = SKP_FIX_CONST( LAMBDA_OFFSET, 10 )\r
                           + SKP_SMULBB( SKP_FIX_CONST( LAMBDA_DELAYED_DECISIONS, 10 ), psEnc->sCmn.nStatesDelayedDecision )\r
                           + SKP_SMULWB( SKP_FIX_CONST( LAMBDA_SPEECH_ACT,        18 ), psEnc->speech_activity_Q8          )\r
index fa2e8cd..f30f631 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
index 223ad14..b559ce6 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
index 6d538ec..2fb531c 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
@@ -43,7 +43,6 @@ void SKP_Silk_residual_energy_FIX(
     SKP_int         offset, i, j, rshift, lz1, lz2;\r
     SKP_int16       *LPC_res_ptr, LPC_res[ ( MAX_FRAME_LENGTH + MAX_NB_SUBFR * MAX_LPC_ORDER ) / 2 ];\r
     const SKP_int16 *x_ptr;\r
-    SKP_int16       S[ MAX_LPC_ORDER ];\r
     SKP_int32       tmp32;\r
 \r
     x_ptr  = x;\r
@@ -52,8 +51,7 @@ void SKP_Silk_residual_energy_FIX(
     /* Filter input to create the LPC residual for each frame half, and measure subframe energies */\r
     for( i = 0; i < nb_subfr >> 1; i++ ) {\r
         /* Calculate half frame LPC residual signal including preceeding samples */\r
-        SKP_memset( S, 0, LPC_order * sizeof( SKP_int16 ) );\r
-        SKP_Silk_LPC_analysis_filter( x_ptr, a_Q12[ i ], S, LPC_res, ( MAX_NB_SUBFR >> 1 ) * offset, LPC_order );\r
+        SKP_Silk_LPC_analysis_filter( LPC_res, x_ptr, a_Q12[ i ], ( MAX_NB_SUBFR >> 1 ) * offset, LPC_order );\r
 \r
         /* Point to first subframe of the just calculated LPC residual signal */\r
         LPC_res_ptr = LPC_res + LPC_order;\r
index f61e9fb..2568418 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
index f422d93..0cc0489 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
@@ -41,7 +41,7 @@ extern "C"
 /* Noise shaping analysis state */\r
 /********************************/\r
 typedef struct {\r
-    SKP_int     LastGainIndex;\r
+    SKP_int8    LastGainIndex;\r
     SKP_int32   HarmBoost_smth_Q16;\r
     SKP_int32   HarmShapeGain_smth_Q16;\r
     SKP_int32   Tilt_smth_Q16;\r
@@ -85,8 +85,6 @@ typedef struct {
     SKP_Silk_shape_state_FIX        sShape;                         /* Shape state                                                          */\r
     SKP_Silk_prefilter_state_FIX    sPrefilt;                       /* Prefilter State                                                      */\r
     SKP_Silk_predict_state_FIX      sPred;                          /* Prediction state                                                     */\r
-    SKP_Silk_nsq_state              sNSQ;                           /* Noise Shape Quantizer State                                          */\r
-    SKP_Silk_nsq_state              sNSQ_LBRR;                      /* Noise Shape Quantizer State ( for low bitrate redundancy )           */\r
 \r
     /* Buffer for find pitch and noise shape analysis */\r
     SKP_DWORD_ALIGN SKP_int16 x_buf[ 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ];\r
@@ -99,7 +97,7 @@ typedef struct {
     SKP_int                         prevLTPredCodGain_Q7;\r
     SKP_int                         HPLTPredCodGain_Q7;\r
 \r
-    SKP_int32                       inBandFEC_SNR_comp_Q8;          /* Compensation to SNR_dB when using inband FEC Voiced      */\r
+    SKP_int32                       inBandFEC_SNR_comp_Q7;          /* Compensation to SNR_dB when using inband FEC Voiced                  */\r
 \r
 } SKP_Silk_encoder_state_FIX;\r
 \r
@@ -107,13 +105,12 @@ typedef struct {
 /* Encoder control FIX  */\r
 /************************/\r
 typedef struct {\r
-    SKP_Silk_encoder_control        sCmn;                           /* Common struct, shared with floating-point code */\r
-\r
     /* Prediction and coding parameters */\r
     SKP_int32                   Gains_Q16[ MAX_NB_SUBFR ];\r
     SKP_DWORD_ALIGN SKP_int16   PredCoef_Q12[ 2 ][ MAX_LPC_ORDER ];\r
     SKP_int16                   LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ];\r
     SKP_int                     LTP_scale_Q14;\r
+    SKP_int                     pitchL[ MAX_NB_SUBFR ];\r
 \r
     /* Noise shaping parameters */\r
     /* Testing */\r
index b9dabed..380104f 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
index 4d3fdfa..dcac37b 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
index ae400b5..b340f55 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
@@ -43,11 +43,11 @@ void SKP_Silk_LPC_analysis_filter16_FLP(
     const SKP_int                   length              /* I    Length of input signal                  */\r
 )\r
 {\r
-    SKP_int   ix = 16;\r
+    SKP_int   ix;\r
     SKP_float LPC_pred;\r
     const SKP_float *s_ptr;\r
 \r
-    for ( ; ix < length; ix++) {\r
+    for ( ix = 16; ix < length; ix++) {\r
         s_ptr = &s[ix - 1];\r
 \r
         /* short-term prediction */\r
@@ -81,11 +81,11 @@ void SKP_Silk_LPC_analysis_filter14_FLP(
     const SKP_int                   length              /* I    Length of input signal                  */\r
 )\r
 {\r
-    SKP_int   ix = 14;\r
+    SKP_int   ix;\r
     SKP_float LPC_pred;\r
     const SKP_float *s_ptr;\r
 \r
-    for ( ; ix < length; ix++) {\r
+    for ( ix = 14; ix < length; ix++) {\r
         s_ptr = &s[ix - 1];\r
 \r
         /* short-term prediction */\r
@@ -117,11 +117,11 @@ void SKP_Silk_LPC_analysis_filter12_FLP(
     const SKP_int                   length              /* I    Length of input signal                  */\r
 )\r
 {\r
-    SKP_int   ix = 12;\r
+    SKP_int   ix;\r
     SKP_float LPC_pred;\r
     const SKP_float *s_ptr;\r
 \r
-    for ( ; ix < length; ix++) {\r
+    for ( ix = 12; ix < length; ix++) {\r
         s_ptr = &s[ix - 1];\r
 \r
         /* short-term prediction */\r
@@ -151,11 +151,11 @@ void SKP_Silk_LPC_analysis_filter10_FLP(
     const SKP_int                   length              /* I    Length of input signal                  */\r
 )\r
 {\r
-    SKP_int   ix = 10;\r
+    SKP_int   ix;\r
     SKP_float LPC_pred;\r
     const SKP_float *s_ptr;\r
 \r
-    for ( ; ix < length; ix++) {\r
+    for ( ix = 10; ix < length; ix++) {\r
         s_ptr = &s[ix - 1];\r
 \r
         /* short-term prediction */\r
@@ -183,11 +183,11 @@ void SKP_Silk_LPC_analysis_filter8_FLP(
     const SKP_int                   length              /* I    Length of input signal                  */\r
 )\r
 {\r
-    SKP_int   ix = 8;\r
+    SKP_int   ix;\r
     SKP_float LPC_pred;\r
     const SKP_float *s_ptr;\r
 \r
-    for ( ; ix < length; ix++) {\r
+    for ( ix = 8; ix < length; ix++) {\r
         s_ptr = &s[ix - 1];\r
 \r
         /* short-term prediction */\r
@@ -213,11 +213,11 @@ void SKP_Silk_LPC_analysis_filter6_FLP(
     const SKP_int                   length              /* I    Length of input signal                  */\r
 )\r
 {\r
-    SKP_int   ix = 6;\r
+    SKP_int   ix;\r
     SKP_float LPC_pred;\r
     const SKP_float *s_ptr;\r
 \r
-    for ( ; ix < length; ix++) {\r
+    for ( ix = 6; ix < length; ix++) {\r
         s_ptr = &s[ix - 1];\r
 \r
         /* short-term prediction */\r
index 1b565c7..b27b08d 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
index 5039d54..b94d2fe 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
@@ -28,6 +28,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #include "SKP_Silk_main_FLP.h"\r
 \r
 #define NB_THRESHOLDS           11\r
+\r
 /* Table containing trained thresholds for LTP scaling */\r
 static const SKP_float LTPScaleThresholds[ NB_THRESHOLDS ] = \r
 {\r
@@ -41,7 +42,7 @@ void SKP_Silk_LTP_scale_ctrl_FLP(
     SKP_Silk_encoder_control_FLP    *psEncCtrl          /* I/O  Encoder control FLP                     */\r
 )\r
 {\r
-    SKP_int round_loss, frames_per_packet;\r
+    SKP_int round_loss;\r
     SKP_float g_out, g_limit, thrld1, thrld2;\r
 \r
     /* 1st order high-pass filter */\r
@@ -57,28 +58,26 @@ void SKP_Silk_LTP_scale_ctrl_FLP(
     \r
     \r
     /* Default is minimum scaling */\r
-    psEncCtrl->sCmn.LTP_scaleIndex = 0;\r
+    psEnc->sCmn.indices.LTP_scaleIndex = 0;\r
 \r
     /* Round the loss measure to whole pct */\r
     round_loss = ( SKP_int )( psEnc->sCmn.PacketLoss_perc );\r
     round_loss = SKP_max( 0, round_loss );\r
 \r
-    /* Only scale if first frame in packet 0% */\r
-    if( psEnc->sCmn.nFramesInPayloadBuf == 0 ){\r
+    /* Only scale if first frame in packet */\r
+    if( psEnc->sCmn.nFramesAnalyzed == 0 ){\r
         \r
-        frames_per_packet = psEnc->sCmn.PacketSize_ms / ( SUB_FRAME_LENGTH_MS * psEnc->sCmn.nb_subfr );\r
-\r
-        round_loss += ( frames_per_packet - 1 );\r
+        round_loss += psEnc->sCmn.nFramesPerPacket - 1;\r
         thrld1 = LTPScaleThresholds[ SKP_min_int( round_loss,     NB_THRESHOLDS - 1 ) ];\r
         thrld2 = LTPScaleThresholds[ SKP_min_int( round_loss + 1, NB_THRESHOLDS - 1 ) ];\r
     \r
         if( g_limit > thrld1 ) {\r
             /* High Scaling */\r
-            psEncCtrl->sCmn.LTP_scaleIndex = 2;\r
+            psEnc->sCmn.indices.LTP_scaleIndex = 2;\r
         } else if( g_limit > thrld2 ) {\r
             /* Middle Scaling */\r
-            psEncCtrl->sCmn.LTP_scaleIndex = 1;\r
+            psEnc->sCmn.indices.LTP_scaleIndex = 1;\r
         }\r
     }\r
-    psEncCtrl->LTP_scale = ( SKP_float)SKP_Silk_LTPScales_table_Q14[ psEncCtrl->sCmn.LTP_scaleIndex ] / 16384.0f;\r
+    psEncCtrl->LTP_scale = ( SKP_float)SKP_Silk_LTPScales_table_Q14[ psEnc->sCmn.indices.LTP_scaleIndex ] / 16384.0f;\r
 }\r
index 9774723..6525371 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
@@ -31,7 +31,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 void SKP_Silk_NLSF_MSVQ_decode_FLP(\r
           SKP_float                 *pNLSF,             /* O    Decoded output vector [ LPC_ORDER ]     */\r
     const SKP_Silk_NLSF_CB_struct   *psNLSF_CB,         /* I    NLSF codebook struct                    */  \r
-    const SKP_int                   *NLSFIndices,       /* I    NLSF indices [ nStages ]                */\r
+    const SKP_int8                  *NLSFIndices,       /* I    NLSF indices [ nStages ]                */\r
     const SKP_int                   LPC_order           /* I    LPC order used                          */\r
 )\r
 {\r
@@ -43,7 +43,7 @@ void SKP_Silk_NLSF_MSVQ_decode_FLP(
     SKP_assert( 0 <= NLSFIndices[ 0 ] && NLSFIndices[ 0 ] < psNLSF_CB->CBStages[ 0 ].nVectors );\r
 \r
     /* Point to the first vector element */\r
-    pCB_element = &psNLSF_CB->CBStages[ 0 ].CB_NLSF_Q8[ SKP_MUL( NLSFIndices[ 0 ], LPC_order ) ];\r
+    pCB_element = &psNLSF_CB->CBStages[ 0 ].CB_NLSF_Q8[ SKP_SMULBB( (SKP_int)NLSFIndices[ 0 ], LPC_order ) ];\r
 \r
     /* Initialize with the codebook vector from stage 0 */\r
     for( i = 0; i < LPC_order; i++ ) {\r
@@ -56,7 +56,7 @@ void SKP_Silk_NLSF_MSVQ_decode_FLP(
 \r
         if( LPC_order == 16 ) {\r
             /* Point to the first vector element */\r
-            pCB_element = &psNLSF_CB->CBStages[ s ].CB_NLSF_Q8[ SKP_LSHIFT( NLSFIndices[ s ], 4 ) ];\r
+            pCB_element = &psNLSF_CB->CBStages[ s ].CB_NLSF_Q8[ 16 * (SKP_int)NLSFIndices[ s ] ];\r
 \r
             /* Add the codebook vector from the current stage */\r
             pNLSF[ 0 ]  += ( SKP_float )pCB_element[ 0 ];\r
@@ -77,7 +77,7 @@ void SKP_Silk_NLSF_MSVQ_decode_FLP(
             pNLSF[ 15 ] += ( SKP_float )pCB_element[ 15 ];\r
         } else {\r
             /* Point to the first vector element */\r
-            pCB_element = &psNLSF_CB->CBStages[ s ].CB_NLSF_Q8[ NLSFIndices[ s ] * LPC_order ];\r
+            pCB_element = &psNLSF_CB->CBStages[ s ].CB_NLSF_Q8[ (SKP_int)NLSFIndices[ s ] * LPC_order ];\r
 \r
             /* Add the codebook vector from the current stage */\r
             for( i = 0; i < LPC_order; i++ ) {\r
index 585bf77..416a1ce 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
@@ -31,7 +31,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 /* NLSF vector encoder */\r
 /***********************/\r
 void SKP_Silk_NLSF_MSVQ_encode_FLP(\r
-          SKP_int                   *NLSFIndices,       /* O    Codebook path vector [ CB_STAGES ]      */\r
+          SKP_int8                  *NLSFIndices,       /* O    Codebook path vector [ CB_STAGES ]      */\r
           SKP_float                 *pNLSF,             /* I/O  Quantized NLSF vector [ LPC_ORDER ]     */\r
     const SKP_Silk_NLSF_CB_struct   *psNLSF_CB,         /* I    Codebook object                         */\r
     const SKP_float                 *pNLSF_q_prev,      /* I    Prev. quantized NLSF vector [LPC_ORDER] */\r
@@ -53,15 +53,15 @@ void SKP_Silk_NLSF_MSVQ_encode_FLP(
     SKP_float   pRate[          MAX_NLSF_MSVQ_SURVIVORS ];\r
     SKP_float   pRate_new[      MAX_NLSF_MSVQ_SURVIVORS ];\r
     SKP_int     pTempIndices[   MAX_NLSF_MSVQ_SURVIVORS ];\r
-    SKP_int     pPath[          MAX_NLSF_MSVQ_SURVIVORS * NLSF_MSVQ_MAX_CB_STAGES ];\r
-    SKP_int     pPath_new[      MAX_NLSF_MSVQ_SURVIVORS * NLSF_MSVQ_MAX_CB_STAGES ];\r
+    SKP_int8    pPath[          MAX_NLSF_MSVQ_SURVIVORS * NLSF_MSVQ_MAX_CB_STAGES ];\r
+    SKP_int8    pPath_new[      MAX_NLSF_MSVQ_SURVIVORS * NLSF_MSVQ_MAX_CB_STAGES ];\r
     SKP_float   pRes_Q8[        MAX_NLSF_MSVQ_SURVIVORS * MAX_LPC_ORDER ];\r
     SKP_float   pRes_Q8_new[    MAX_NLSF_MSVQ_SURVIVORS * MAX_LPC_ORDER ];\r
 \r
     const SKP_float *pConstFloat;\r
           SKP_float *pFloat;\r
-    const SKP_int   *pConstInt;\r
-          SKP_int   *pInt;\r
+    const SKP_int8  *pConstInt8;\r
+          SKP_int8  *pInt8;\r
     const SKP_int8  *pCB_element;\r
     const SKP_Silk_NLSF_CBS *pCurrentCBStage;\r
 \r
@@ -150,13 +150,13 @@ void SKP_Silk_NLSF_MSVQ_encode_FLP(
             pRate_new[ k ] = pRate[ input_index ] + 0.0625f * ( SKP_float )pCurrentCBStage->Rates_Q4[ cb_index ];\r
 \r
             /* Copy paths from previous matrix, starting with the best path */\r
-            pConstInt = &pPath[ input_index * psNLSF_CB->nStages ];\r
-            pInt      = &pPath_new[       k * psNLSF_CB->nStages ];\r
+            pConstInt8 = &pPath[ input_index * psNLSF_CB->nStages ];\r
+            pInt8      = &pPath_new[       k * psNLSF_CB->nStages ];\r
             for( i = 0; i < s; i++ ) {\r
-                pInt[ i ] = pConstInt[ i ];\r
+                pInt8[ i ] = pConstInt8[ i ];\r
             }\r
             /* Write the current stage indices for the 'cur_survivors' to the best path matrix */\r
-            pInt[ s ] = cb_index;\r
+            pInt8[ s ] = (SKP_int8)cb_index;\r
         }\r
 \r
         if( s < psNLSF_CB->nStages - 1 ) {\r
@@ -167,7 +167,7 @@ void SKP_Silk_NLSF_MSVQ_encode_FLP(
             SKP_memcpy( pRate, pRate_new, cur_survivors * sizeof( SKP_float ) );\r
 \r
             /* Copy best path matrix for next stage */\r
-            SKP_memcpy( pPath, pPath_new, cur_survivors * psNLSF_CB->nStages * sizeof( SKP_int ) );\r
+            SKP_memcpy( pPath, pPath_new, cur_survivors * psNLSF_CB->nStages * sizeof( SKP_int8) );\r
         }\r
 \r
         prev_survivors = cur_survivors;\r
@@ -213,7 +213,7 @@ void SKP_Silk_NLSF_MSVQ_encode_FLP(
 #endif\r
 \r
     /* Copy best path to output argument */\r
-    SKP_memcpy( NLSFIndices, &pPath_new[ bestIndex * psNLSF_CB->nStages ], psNLSF_CB->nStages * sizeof( SKP_int ) );\r
+    SKP_memcpy( NLSFIndices, &pPath_new[ bestIndex * psNLSF_CB->nStages ], psNLSF_CB->nStages * sizeof( SKP_int8 ) );\r
 \r
     /* Decode and stabilize the best survivor */\r
     SKP_Silk_NLSF_MSVQ_decode_FLP( pNLSF, psNLSF_CB, NLSFIndices, LPC_order );\r
index 5b92da1..c45b683 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
index 78db9b7..6e4df16 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
index 17e8f1c..1db6b14 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
index d949c67..e4129ad 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
index 45440d6..028729c 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
@@ -26,7 +26,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 ***********************************************************************/\r
 \r
 #include "SKP_Silk_main_FLP.h"\r
-#include "SKP_Silk_setup_complexity.h"\r
+#include "SKP_Silk_setup.h"\r
 \r
 SKP_INLINE SKP_int SKP_Silk_setup_resamplers(\r
     SKP_Silk_encoder_state_FLP      *psEnc,             /* I/O  Pointer to Silk encoder state FLP       */\r
@@ -41,11 +41,7 @@ SKP_INLINE SKP_int SKP_Silk_setup_fs(
 \r
 SKP_INLINE SKP_int SKP_Silk_setup_rate(\r
     SKP_Silk_encoder_state_FLP      *psEnc,             /* I/O  Pointer to Silk encoder state FLP       */\r
-    SKP_int                         TargetRate_bps      /* I    Target max bitrate                      */\r
-);\r
-\r
-SKP_INLINE SKP_int SKP_Silk_setup_LBRR(\r
-    SKP_Silk_encoder_state_FLP      *psEnc              /* I/O  Pointer to Silk encoder state FLP       */\r
+    SKP_int32                       TargetRate_bps      /* I    Target max bitrate                      */\r
 );\r
 \r
 /* Control encoder */\r
@@ -105,7 +101,7 @@ SKP_int SKP_Silk_control_encoder_FLP(
     /********************************************/\r
     /* Set LBRR usage                           */\r
     /********************************************/\r
-    ret += SKP_Silk_setup_LBRR( psEnc );\r
+    ret += SKP_Silk_setup_LBRR( &psEnc->sCmn );\r
 \r
     psEnc->sCmn.controlled_since_last_payload = 1;\r
 \r
@@ -186,6 +182,7 @@ SKP_INLINE SKP_int SKP_Silk_setup_fs(
         }\r
         if( PacketSize_ms == 10 ) {\r
             /* Only allowed when the payload buffer is empty */\r
+            psEnc->sCmn.nFramesPerPacket = 1;\r
             psEnc->sCmn.nb_subfr = MAX_NB_SUBFR >> 1;\r
             psEnc->sPred.pitch_LPC_win_length = SKP_SMULBB( FIND_PITCH_LPC_WIN_MS_2_SF, fs_kHz );\r
             if( psEnc->sCmn.fs_kHz == 8 ) {\r
@@ -194,6 +191,7 @@ SKP_INLINE SKP_int SKP_Silk_setup_fs(
                 psEnc->sCmn.pitch_contour_iCDF = SKP_Silk_pitch_contour_10_ms_iCDF;\r
             }\r
         } else {\r
+            psEnc->sCmn.nFramesPerPacket = SKP_DIV32_16( PacketSize_ms, MAX_FRAME_LENGTH_MS );\r
             psEnc->sCmn.nb_subfr = MAX_NB_SUBFR;\r
             psEnc->sPred.pitch_LPC_win_length = SKP_SMULBB( FIND_PITCH_LPC_WIN_MS, fs_kHz );\r
             if( psEnc->sCmn.fs_kHz == 8 ) {\r
@@ -203,21 +201,18 @@ SKP_INLINE SKP_int SKP_Silk_setup_fs(
             }\r
         }\r
         psEnc->sCmn.PacketSize_ms = PacketSize_ms;\r
-        psEnc->sCmn.LBRR_nBytes = 0;\r
     }\r
 \r
     /* Set internal sampling frequency */\r
     if( psEnc->sCmn.fs_kHz != fs_kHz ) {\r
         /* reset part of the state */\r
-        SKP_memset( &psEnc->sShape,          0,                        sizeof( SKP_Silk_shape_state_FLP ) );\r
-        SKP_memset( &psEnc->sPrefilt,        0,                        sizeof( SKP_Silk_prefilter_state_FLP ) );\r
-        SKP_memset( &psEnc->sNSQ,            0,                        sizeof( SKP_Silk_nsq_state ) );\r
-        SKP_memset( &psEnc->sPred,           0,                        sizeof( SKP_Silk_predict_state_FLP ) );\r
-        SKP_memset( psEnc->sNSQ.xq,          0, 2 * MAX_FRAME_LENGTH * sizeof( SKP_int16 ) );\r
-        SKP_memset( psEnc->sNSQ_LBRR.xq,     0, 2 * MAX_FRAME_LENGTH * sizeof( SKP_int16 ) );\r
-        SKP_memset( psEnc->sPred.prev_NLSFq, 0,        MAX_LPC_ORDER * sizeof( SKP_float ) );\r
+        SKP_memset( &psEnc->sShape,          0, sizeof( SKP_Silk_shape_state_FLP ) );\r
+        SKP_memset( &psEnc->sPrefilt,        0, sizeof( SKP_Silk_prefilter_state_FLP ) );\r
+        SKP_memset( &psEnc->sCmn.sNSQ,       0, sizeof( SKP_Silk_nsq_state ) );\r
+        SKP_memset( &psEnc->sPred,           0, sizeof( SKP_Silk_predict_state_FLP ) );\r
+        SKP_memset( psEnc->sPred.prev_NLSFq, 0, sizeof( psEnc->sPred.prev_NLSFq ) );\r
 #if SWITCH_TRANSITION_FILTERING\r
-        SKP_memset( psEnc->sCmn.sLP.In_LP_State, 0, 2 * sizeof( SKP_int32 ) );\r
+        SKP_memset( psEnc->sCmn.sLP.In_LP_State, 0, sizeof( psEnc->sCmn.sLP.In_LP_State ) );\r
         if( psEnc->sCmn.sLP.mode == 1 ) {\r
             /* Begin transition phase */\r
             psEnc->sCmn.sLP.transition_frame_no = 1;\r
@@ -226,20 +221,17 @@ SKP_INLINE SKP_int SKP_Silk_setup_fs(
             psEnc->sCmn.sLP.transition_frame_no = 0;\r
         }\r
 #endif\r
-        psEnc->sCmn.LBRR_nBytes         = 0;\r
         psEnc->sCmn.inputBufIx          = 0;\r
-        psEnc->sCmn.nFramesInPayloadBuf = 0;\r
-        psEnc->sCmn.nBytesInPayloadBuf  = 0;\r
+        psEnc->sCmn.nFramesAnalyzed     = 0;\r
         psEnc->sCmn.TargetRate_bps      = 0; /* Ensures that psEnc->SNR_dB is recomputed */\r
 \r
         /* Initialize non-zero parameters */\r
-        psEnc->sCmn.prevLag                 = 100;\r
-        psEnc->sCmn.first_frame_after_reset = 1;\r
-        psEnc->sPrefilt.lagPrev             = 100;\r
-        psEnc->sShape.LastGainIndex         = 1;\r
-        psEnc->sNSQ.lagPrev                 = 100;\r
-        psEnc->sNSQ.prev_inv_gain_Q16       = 65536;\r
-        psEnc->sNSQ_LBRR.prev_inv_gain_Q16  = 65536;\r
+        psEnc->sCmn.prevLag                     = 100;\r
+        psEnc->sCmn.first_frame_after_reset     = 1;\r
+        psEnc->sPrefilt.lagPrev                 = 100;\r
+        psEnc->sShape.LastGainIndex             = 10;\r
+        psEnc->sCmn.sNSQ.lagPrev                = 100;\r
+        psEnc->sCmn.sNSQ.prev_inv_gain_Q16      = 65536;\r
 \r
         psEnc->sCmn.fs_kHz = fs_kHz;\r
         if( psEnc->sCmn.fs_kHz == 8 ) {\r
@@ -300,7 +292,6 @@ SKP_INLINE SKP_int SKP_Silk_setup_fs(
             /* unsupported sampling rate */\r
             SKP_assert( 0 );\r
         }\r
-        psEnc->sCmn.fs_kHz_changed = 1;\r
     }\r
 \r
     /* Check that settings are valid */\r
@@ -311,12 +302,12 @@ SKP_INLINE SKP_int SKP_Silk_setup_fs(
 \r
 SKP_INLINE SKP_int SKP_Silk_setup_rate(\r
     SKP_Silk_encoder_state_FLP      *psEnc,             /* I/O  Pointer to Silk encoder state FLP       */\r
-    SKP_int                         TargetRate_bps      /* I    Target max bitrate                      */\r
+    SKP_int32                       TargetRate_bps      /* I    Target max bitrate                      */\r
 )\r
 {\r
     SKP_int k, ret = SKP_SILK_NO_ERROR;\r
     SKP_float frac;\r
-    const SKP_uint16 *rateTable;\r
+    const SKP_int32 *rateTable;\r
 \r
     /* Set bitrate/coding quality */\r
     if( TargetRate_bps != psEnc->sCmn.TargetRate_bps ) {\r
@@ -338,7 +329,7 @@ SKP_INLINE SKP_int SKP_Silk_setup_rate(
         }\r
         for( k = 1; k < TARGET_RATE_TAB_SZ; k++ ) {\r
             /* Find bitrate interval in table and interpolate */\r
-            if( TargetRate_bps < rateTable[ k ] ) {\r
+            if( TargetRate_bps <= rateTable[ k ] ) {\r
                 frac = (SKP_float)( TargetRate_bps - rateTable[ k - 1 ] ) / \r
                        (SKP_float)( rateTable[ k ] - rateTable[ k - 1 ] );\r
                 psEnc->SNR_dB = 0.5f * ( SNR_table_Q1[ k - 1 ] + frac * ( SNR_table_Q1[ k ] - SNR_table_Q1[ k - 1 ] ) );\r
@@ -348,55 +339,3 @@ SKP_INLINE SKP_int SKP_Silk_setup_rate(
     }\r
     return( ret );\r
 }\r
-\r
-SKP_INLINE SKP_int SKP_Silk_setup_LBRR(\r
-    SKP_Silk_encoder_state_FLP      *psEnc              /* I/O  Pointer to Silk encoder state FLP       */\r
-)\r
-{\r
-    SKP_int   ret = SKP_SILK_NO_ERROR;\r
-\r
-#if USE_LBRR\r
-    SKP_int32 LBRRRate_thres_bps;\r
-\r
-    if( psEnc->sCmn.useInBandFEC < 0 || psEnc->sCmn.useInBandFEC > 1 ) {\r
-        ret = SKP_SILK_ENC_INVALID_INBAND_FEC_SETTING;\r
-    }\r
-    \r
-    psEnc->sCmn.LBRR_enabled = psEnc->sCmn.useInBandFEC;\r
-    if( psEnc->sCmn.fs_kHz == 8 ) {\r
-        LBRRRate_thres_bps = INBAND_FEC_MIN_RATE_BPS - 9000;\r
-    } else if( psEnc->sCmn.fs_kHz == 12 ) {\r
-        LBRRRate_thres_bps = INBAND_FEC_MIN_RATE_BPS - 6000;;\r
-    } else if( psEnc->sCmn.fs_kHz == 16 ) {\r
-        LBRRRate_thres_bps = INBAND_FEC_MIN_RATE_BPS - 3000;\r
-    } else {\r
-        LBRRRate_thres_bps = INBAND_FEC_MIN_RATE_BPS;\r
-    }\r
-\r
-    if( psEnc->sCmn.TargetRate_bps >= LBRRRate_thres_bps ) {\r
-        /* Set gain increase / rate reduction for LBRR usage */\r
-        /* Coarsely tuned with PESQ for now. */\r
-        /* Linear regression coefs G = 8 - 0.5 * loss */\r
-        /* Meaning that at 16% loss main rate and redundant rate is the same, -> G = 0 */\r
-        psEnc->sCmn.LBRR_GainIncreases = SKP_max_int( 8 - SKP_RSHIFT( psEnc->sCmn.PacketLoss_perc, 1 ), 0 );\r
-\r
-        /* Set main stream rate compensation */\r
-        if( psEnc->sCmn.LBRR_enabled && psEnc->sCmn.PacketLoss_perc > LBRR_LOSS_THRES ) {\r
-            /* Tuned to give approx same mean / weighted bitrate as no inband FEC */\r
-            psEnc->inBandFEC_SNR_comp = 6.0f - 0.5f * psEnc->sCmn.LBRR_GainIncreases;\r
-        } else {\r
-            psEnc->inBandFEC_SNR_comp = 0;\r
-            psEnc->sCmn.LBRR_enabled  = 0;\r
-        }\r
-    } else {\r
-        psEnc->inBandFEC_SNR_comp     = 0;\r
-        psEnc->sCmn.LBRR_enabled      = 0;\r
-    }\r
-#else\r
-    if( psEnc->sCmn.LBRR_enabled != 0 ) {\r
-        ret = SKP_SILK_ENC_INVALID_INBAND_FEC_SETTING;\r
-        psEnc->sCmn.LBRR_enabled = 0;\r
-    }\r
-#endif\r
-    return ret;\r
-}\r
index 996e20d..0fdaabd 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
index b2a9037..b87def7 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
@@ -34,22 +34,39 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 SKP_int SKP_Silk_encode_frame_FLP( \r
     SKP_Silk_encoder_state_FLP      *psEnc,             /* I/O  Encoder state FLP                       */\r
     SKP_int32                       *pnBytesOut,        /*   O  Number of payload bytes                 */\r
-    ec_enc                          *psRangeEnc,        /* I/O  compressor data structure               */\r
-    const SKP_int16                 *pIn                /* I    Input speech frame                      */\r
+    ec_enc                          *psRangeEnc         /* I/O  compressor data structure               */\r
 )\r
 {\r
     SKP_Silk_encoder_control_FLP sEncCtrl;\r
-    SKP_int     k, i, nBytes, ret = 0;\r
+    SKP_int     i, nBits, ret = 0;\r
+    SKP_uint8   flags;\r
     SKP_float   *x_frame, *res_pitch_frame;\r
-    SKP_int16   pIn_HP[    MAX_FRAME_LENGTH ];\r
-    SKP_int16   pIn_HP_LP[ MAX_FRAME_LENGTH ];\r
-    SKP_float   xfw[       MAX_FRAME_LENGTH ];\r
+    SKP_int16   pIn_HP[ MAX_FRAME_LENGTH ];\r
+    SKP_float   xfw[ MAX_FRAME_LENGTH ];\r
     SKP_float   res_pitch[ 2 * MAX_FRAME_LENGTH + LA_PITCH_MAX ];\r
-    SKP_int     frame_terminator;\r
 \r
 TIC(ENCODE_FRAME)\r
 \r
-    sEncCtrl.sCmn.Seed = psEnc->sCmn.frameCounter++ & 3;\r
+    if( psEnc->sCmn.nFramesAnalyzed == 0 ) {\r
+        /* Create space at start of payload for VAD and FEC flags */\r
+        SKP_uint8 iCDF[ 2 ] = { 0, 0 };\r
+        iCDF[ 0 ] = 256 - SKP_RSHIFT( 256, psEnc->sCmn.nFramesPerPacket + 1 );\r
+        ec_enc_icdf( psRangeEnc, 0, iCDF, 8 );\r
+\r
+        /* Encode any LBRR data from previous packet */\r
+        SKP_Silk_LBRR_embed( &psEnc->sCmn, psRangeEnc );\r
+\r
+        /* Reduce coding SNR depending on how many bits used by LBRR */\r
+        nBits = ec_tell( psRangeEnc );\r
+        psEnc->inBandFEC_SNR_comp = ( 6.0f * nBits ) / \r
+            ( psEnc->sCmn.nFramesPerPacket * psEnc->sCmn.frame_length );\r
+\r
+        /* Reset LBRR flags */\r
+        SKP_memset( psEnc->sCmn.LBRR_flags, 0, sizeof( psEnc->sCmn.LBRR_flags ) );\r
+    }\r
+\r
+    psEnc->sCmn.indices.Seed = psEnc->sCmn.frameCounter++ & 3;\r
+\r
     /**************************************************************/\r
     /* Setup Input Pointers, and insert frame in input buffer    */\r
     /*************************************************************/\r
@@ -61,14 +78,14 @@ TIC(ENCODE_FRAME)
     /* Voice Activity Detection */\r
     /****************************/\r
 TIC(VAD)\r
-    SKP_Silk_VAD_FLP( psEnc, &sEncCtrl, pIn );\r
+    SKP_Silk_VAD_FLP( psEnc, &sEncCtrl, psEnc->sCmn.inputBuf );\r
 TOC(VAD)\r
 \r
     /**************************************************/\r
     /* Convert speech activity into VAD and DTX flags */\r
     /**************************************************/\r
     if( psEnc->speech_activity < SPEECH_ACTIVITY_DTX_THRES ) {\r
-        sEncCtrl.sCmn.signalType = TYPE_NO_VOICE_ACTIVITY;\r
+        psEnc->sCmn.indices.signalType = TYPE_NO_VOICE_ACTIVITY;\r
         psEnc->sCmn.noSpeechCounter++;\r
         if( psEnc->sCmn.noSpeechCounter > NO_SPEECH_FRAMES_BEFORE_DTX ) {\r
             psEnc->sCmn.inDTX = 1;\r
@@ -77,10 +94,12 @@ TOC(VAD)
             psEnc->sCmn.noSpeechCounter = 0;\r
             psEnc->sCmn.inDTX           = 0;\r
         }\r
+        psEnc->sCmn.VAD_flags[ psEnc->sCmn.nFramesAnalyzed ] = 0;\r
     } else {\r
         psEnc->sCmn.noSpeechCounter = 0;\r
         psEnc->sCmn.inDTX           = 0;\r
-        sEncCtrl.sCmn.signalType    = TYPE_UNVOICED;\r
+        psEnc->sCmn.indices.signalType       = TYPE_UNVOICED;\r
+        psEnc->sCmn.VAD_flags[ psEnc->sCmn.nFramesAnalyzed ] = 1;\r
     }\r
 \r
     /*******************************************/\r
@@ -89,27 +108,25 @@ TOC(VAD)
 TIC(HP_IN)\r
 #if HIGH_PASS_INPUT\r
     /* Variable high-pass filter */\r
-    SKP_Silk_HP_variable_cutoff_FLP( psEnc, &sEncCtrl, pIn_HP, pIn );\r
+    SKP_Silk_HP_variable_cutoff_FLP( psEnc, &sEncCtrl, pIn_HP, psEnc->sCmn.inputBuf );\r
 #else\r
-    SKP_memcpy( pIn_HP, pIn, psEnc->sCmn.frame_length * sizeof( SKP_int16 ) );\r
+    SKP_memcpy( pIn_HP, psEnc->sCmn.inputBuf, psEnc->sCmn.frame_length * sizeof( SKP_int16 ) );\r
 #endif\r
 TOC(HP_IN)\r
 \r
 #if SWITCH_TRANSITION_FILTERING\r
     /* Ensure smooth bandwidth transitions */\r
-    SKP_Silk_LP_variable_cutoff( &psEnc->sCmn.sLP, pIn_HP_LP, pIn_HP, psEnc->sCmn.frame_length );\r
-#else\r
-    SKP_memcpy( pIn_HP_LP, pIn_HP, psEnc->sCmn.frame_length * sizeof( SKP_int16 ) );\r
+    SKP_Silk_LP_variable_cutoff( &psEnc->sCmn.sLP, pIn_HP, psEnc->sCmn.frame_length );\r
 #endif\r
 \r
     /*******************************************/\r
     /* Copy new frame to front of input buffer */\r
     /*******************************************/\r
-    SKP_short2float_array( x_frame + LA_SHAPE_MS * psEnc->sCmn.fs_kHz, pIn_HP_LP, psEnc->sCmn.frame_length );\r
+    SKP_short2float_array( x_frame + LA_SHAPE_MS * psEnc->sCmn.fs_kHz, pIn_HP, psEnc->sCmn.frame_length );\r
 \r
     /* Add tiny signal to avoid high CPU load from denormalized floating point numbers */\r
-    for( k = 0; k < 8; k++ ) {\r
-        x_frame[ LA_SHAPE_MS * psEnc->sCmn.fs_kHz + k * ( psEnc->sCmn.frame_length >> 3 ) ] += ( 1 - ( k & 2 ) ) * 1e-6f;\r
+    for( i = 0; i < 8; i++ ) {\r
+        x_frame[ LA_SHAPE_MS * psEnc->sCmn.fs_kHz + i * ( psEnc->sCmn.frame_length >> 3 ) ] += ( 1 - ( i & 2 ) ) * 1e-6f;\r
     }\r
 \r
     /*****************************************/\r
@@ -147,39 +164,46 @@ TIC(PROCESS_GAINS)
     SKP_Silk_process_gains_FLP( psEnc, &sEncCtrl );\r
 TOC(PROCESS_GAINS)\r
     \r
-    psEnc->sCmn.quantOffsetType[ psEnc->sCmn.nFramesInPayloadBuf ] = sEncCtrl.sCmn.quantOffsetType;\r
-    psEnc->sCmn.signalType[      psEnc->sCmn.nFramesInPayloadBuf ] = sEncCtrl.sCmn.signalType;\r
-\r
     /****************************************/\r
     /* Low Bitrate Redundant Encoding       */\r
     /****************************************/\r
-    psEnc->sCmn.LBRR_nBytes = MAX_ARITHM_BYTES;\r
 TIC(LBRR)\r
-    //SKP_Silk_LBRR_encode_FLP( psEnc, &sEncCtrl, psEnc->sCmn.LBRR_payload, &psEnc->sCmn.LBRR_nBytes, xfw );\r
+    SKP_Silk_LBRR_encode_FLP( psEnc, &sEncCtrl, xfw );\r
 TOC(LBRR)\r
 \r
     /*****************************************/\r
     /* Noise shaping quantization            */\r
     /*****************************************/\r
 TIC(NSQ)\r
-    SKP_Silk_NSQ_wrapper_FLP( psEnc, &sEncCtrl, xfw, &psEnc->sCmn.q[ psEnc->sCmn.nFramesInPayloadBuf * MAX_FRAME_LENGTH ], 0 );\r
+    SKP_Silk_NSQ_wrapper_FLP( psEnc, &sEncCtrl, &psEnc->sCmn.indices, &psEnc->sCmn.sNSQ, psEnc->sCmn.pulses, xfw );\r
 TOC(NSQ)\r
 \r
     /****************************************/\r
-    /* Initialize range coder               */\r
-    /****************************************/\r
-    if( psEnc->sCmn.nFramesInPayloadBuf == 0 ) {\r
-        psEnc->sCmn.nBytesInPayloadBuf = 0;\r
-    }\r
-\r
-    /****************************************/\r
     /* Encode Parameters                    */\r
     /****************************************/\r
 TIC(ENCODE_PARAMS)\r
-    SKP_Silk_encode_indices( &psEnc->sCmn, &sEncCtrl.sCmn, psRangeEnc );\r
+    SKP_Silk_encode_indices( &psEnc->sCmn, psRangeEnc, psEnc->sCmn.nFramesAnalyzed, 0 );\r
 TOC(ENCODE_PARAMS)\r
 \r
     /****************************************/\r
+    /* Encode Excitation Signal             */\r
+    /****************************************/\r
+TIC(ENCODE_PULSES)\r
+    SKP_Silk_encode_pulses( psRangeEnc, psEnc->sCmn.indices.signalType, psEnc->sCmn.indices.quantOffsetType, \r
+        psEnc->sCmn.pulses, psEnc->sCmn.frame_length );\r
+TOC(ENCODE_PULSES)\r
+\r
+    /****************************************/\r
+    /* Simulate network buffer delay caused */\r
+    /* by exceeding TargetRate              */\r
+    /****************************************/\r
+    nBits = ec_tell( psRangeEnc );\r
+    psEnc->BufferedInChannel_ms += 1000.0f * ( nBits - psEnc->sCmn.prev_nBits ) / psEnc->sCmn.TargetRate_bps;\r
+    psEnc->BufferedInChannel_ms -= psEnc->sCmn.nb_subfr * SUB_FRAME_LENGTH_MS;\r
+    psEnc->BufferedInChannel_ms  = SKP_LIMIT_float( psEnc->BufferedInChannel_ms, 0.0f, 100.0f );\r
+    psEnc->sCmn.prev_nBits = nBits;\r
+\r
+    /****************************************/\r
     /* Update Buffers and State             */\r
     /****************************************/\r
     /* Update input buffer */\r
@@ -187,65 +211,49 @@ TOC(ENCODE_PARAMS)
         ( psEnc->sCmn.ltp_mem_length + LA_SHAPE_MS * psEnc->sCmn.fs_kHz ) * sizeof( SKP_float ) );\r
     \r
     /* Parameters needed for next frame */\r
-    psEnc->sCmn.prevSignalType          = sEncCtrl.sCmn.signalType;\r
-    psEnc->sCmn.prevLag                 = sEncCtrl.sCmn.pitchL[ psEnc->sCmn.nb_subfr - 1 ];\r
+    psEnc->sCmn.prevLag                 = sEncCtrl.pitchL[ psEnc->sCmn.nb_subfr - 1 ];\r
+    psEnc->sCmn.prevSignalType          = psEnc->sCmn.indices.signalType;\r
     psEnc->sCmn.first_frame_after_reset = 0;\r
-    psEnc->sCmn.nFramesInPayloadBuf++;\r
+    psEnc->sCmn.nFramesAnalyzed++;\r
 \r
     /****************************************/\r
-    /* Finalize payload and copy to output  */\r
+    /* Finalize payload                     */\r
     /****************************************/\r
-    if( psEnc->sCmn.nFramesInPayloadBuf * SUB_FRAME_LENGTH_MS * psEnc->sCmn.nb_subfr >= psEnc->sCmn.PacketSize_ms ) {\r
-\r
-        /* Check if FEC information should be added */\r
-        //frame_terminator = psEnc->sCmn.LBRR_usage;\r
-        frame_terminator = SKP_SILK_NO_LBRR;\r
-\r
-        /* Add the frame termination info to stream */\r
-        ec_enc_icdf( psRangeEnc, frame_terminator, SKP_Silk_LBRR_Present_iCDF, 8 );\r
-\r
-        /* Code excitation signal */\r
-        for( i = 0; i < psEnc->sCmn.nFramesInPayloadBuf; i++ ) {\r
-            SKP_Silk_encode_pulses( psRangeEnc, psEnc->sCmn.signalType[ i ], psEnc->sCmn.quantOffsetType[ i ], \r
-                &psEnc->sCmn.q[ i * MAX_FRAME_LENGTH ], psEnc->sCmn.frame_length );\r
+    if( psEnc->sCmn.nFramesAnalyzed >= psEnc->sCmn.nFramesPerPacket ) {\r
+        /* Insert VAD flags and FEC flag at beginning of bitstream */\r
+        flags = 0;\r
+        for( i = 0; i < psEnc->sCmn.nFramesPerPacket; i++ ) {\r
+            flags |= psEnc->sCmn.VAD_flags[i];\r
+            flags  = SKP_LSHIFT( flags, 1 );\r
         }\r
+        flags |= psEnc->sCmn.LBRR_flag;\r
+        ret = ec_enc_patch_initial_bits( psRangeEnc, flags, psEnc->sCmn.nFramesPerPacket + 1 );\r
+        SKP_assert( ret == 0 );\r
 \r
-        /* Payload length so far */\r
-        nBytes = SKP_RSHIFT( ec_tell( psRangeEnc ) + 7, 3 );\r
-        *pnBytesOut = nBytes;\r
+        /* Payload size */\r
+        nBits = ec_tell( psRangeEnc );\r
+        *pnBytesOut = SKP_RSHIFT( nBits + 7, 3 );\r
 \r
         /* Reset the number of frames in payload buffer */\r
-        psEnc->sCmn.nFramesInPayloadBuf = 0;\r
+        psEnc->sCmn.nFramesAnalyzed = 0;\r
+        psEnc->sCmn.prev_nBits = 0;\r
     } else {\r
         /* No payload this time */\r
         *pnBytesOut = 0;\r
-\r
-        /* Payload length so far */\r
-        nBytes = SKP_RSHIFT( ec_tell( psRangeEnc ) + 7, 3 );\r
-\r
-        /* Take into account the q signal that isn't in the bitstream yet */\r
-        nBytes += SKP_Silk_pulses_to_bytes( &psEnc->sCmn, \r
-            &psEnc->sCmn.q[ psEnc->sCmn.nFramesInPayloadBuf * MAX_FRAME_LENGTH ] );\r
     }\r
-\r
-    /* Simulate number of ms buffered in channel because of exceeding TargetRate */\r
-    psEnc->BufferedInChannel_ms   += ( 8.0f * 1000.0f * ( nBytes - psEnc->sCmn.nBytesInPayloadBuf ) ) / psEnc->sCmn.TargetRate_bps;\r
-    psEnc->BufferedInChannel_ms   -= SKP_SMULBB( SUB_FRAME_LENGTH_MS, psEnc->sCmn.nb_subfr );\r
-    psEnc->BufferedInChannel_ms    = SKP_LIMIT_float( psEnc->BufferedInChannel_ms, 0.0f, 100.0f );\r
-    psEnc->sCmn.nBytesInPayloadBuf = nBytes;\r
-\r
 TOC(ENCODE_FRAME)\r
+\r
 #ifdef SAVE_ALL_INTERNAL_DATA\r
     //DEBUG_STORE_DATA( xf.dat,                   pIn_HP_LP,                           psEnc->sCmn.frame_length * sizeof( SKP_int16 ) );\r
     //DEBUG_STORE_DATA( xfw.dat,                  xfw,                                 psEnc->sCmn.frame_length * sizeof( SKP_float ) );\r
-    DEBUG_STORE_DATA( pitchL.dat,               sEncCtrl.sCmn.pitchL,                            MAX_NB_SUBFR * sizeof( SKP_int   ) );\r
+    DEBUG_STORE_DATA( pitchL.dat,               sEncCtrl.pitchL,                                 MAX_NB_SUBFR * sizeof( SKP_int   ) );\r
     DEBUG_STORE_DATA( pitchG_quantized.dat,     sEncCtrl.LTPCoef,            psEnc->sCmn.nb_subfr * LTP_ORDER * sizeof( SKP_float ) );\r
     DEBUG_STORE_DATA( pitch_freq_low_Hz.dat,    &sEncCtrl.pitch_freq_low_Hz,                                    sizeof( SKP_float ) );\r
     DEBUG_STORE_DATA( LTPcorr.dat,              &psEnc->LTPCorr,                                                sizeof( SKP_float ) );\r
     DEBUG_STORE_DATA( tilt.dat,                 &sEncCtrl.input_tilt,                                           sizeof( SKP_float ) );\r
     DEBUG_STORE_DATA( gains.dat,                sEncCtrl.Gains,                          psEnc->sCmn.nb_subfr * sizeof( SKP_float ) );\r
     DEBUG_STORE_DATA( gains_indices.dat,        &sEncCtrl.sCmn.GainsIndices,             psEnc->sCmn.nb_subfr * sizeof( SKP_int   ) );\r
-    DEBUG_STORE_DATA( nBytes.dat,               &nBytes,                                                        sizeof( SKP_int   ) );\r
+    DEBUG_STORE_DATA( nBits.dat,                &nBits,                                                         sizeof( SKP_int   ) );\r
     DEBUG_STORE_DATA( current_SNR_db.dat,       &sEncCtrl.current_SNR_dB,                                       sizeof( SKP_float ) );\r
     DEBUG_STORE_DATA( quantOffsetType.dat,      &sEncCtrl.sCmn.quantOffsetType,                                 sizeof( SKP_int   ) );\r
     DEBUG_STORE_DATA( speech_activity.dat,      &psEnc->speech_activity,                                        sizeof( SKP_float ) );\r
@@ -257,165 +265,63 @@ TOC(ENCODE_FRAME)
     DEBUG_STORE_DATA( per_index.dat,            &sEncCtrl.sCmn.PERIndex,                                        sizeof( SKP_int   ) );\r
     DEBUG_STORE_DATA( PredCoef.dat,             &sEncCtrl.PredCoef[ 1 ],          psEnc->sCmn.predictLPCOrder * sizeof( SKP_float ) );\r
     DEBUG_STORE_DATA( ltp_scale_idx.dat,        &sEncCtrl.sCmn.LTP_scaleIndex,                                  sizeof( SKP_int   ) );\r
-//  DEBUG_STORE_DATA( xq.dat,                   psEnc->sNSQ.xqBuf,                   psEnc->sCmn.frame_length * sizeof( SKP_float ) );\r
+//  DEBUG_STORE_DATA( xq.dat,                   psEnc->sCmn.sNSQ.xqBuf,                psEnc->sCmn.frame_length * sizeof( SKP_float ) );\r
 #endif\r
     return( ret );\r
 }\r
 \r
-#if 0\r
-/* Low-Bitrate Redundancy (LBRR) encoding. Reuse all parameters but encode with lower bitrate           */\r
+/* Low-Bitrate Redundancy (LBRR) encoding. Reuse all parameters but encode excitation at lower bitrate  */\r
 void SKP_Silk_LBRR_encode_FLP(\r
     SKP_Silk_encoder_state_FLP      *psEnc,             /* I/O  Encoder state FLP                       */\r
     SKP_Silk_encoder_control_FLP    *psEncCtrl,         /* I/O  Encoder control FLP                     */\r
-          SKP_uint8                 *pCode,             /* O    Payload                                 */\r
-          SKP_int16                 *pnBytesOut,        /* I/O  Payload bytes; in: max; out: used       */\r
     const SKP_float                 xfw[]               /* I    Input signal                            */\r
 )\r
 {\r
+    SKP_int     k;\r
     SKP_int32   Gains_Q16[ MAX_NB_SUBFR ];\r
-    SKP_int     i, k, TempGainsIndices[ MAX_NB_SUBFR ], frame_terminator;\r
-    SKP_int     nBytes, nFramesInPayloadBuf;\r
     SKP_float   TempGains[ MAX_NB_SUBFR ];\r
-    SKP_int     typeOffset, LTP_scaleIndex, Rate_only_parameters = 0;\r
-    ec_byte_buffer range_enc_celt_buf;\r
+    SideInfoIndices *psIndices_LBRR = &psEnc->sCmn.indices_LBRR[ psEnc->sCmn.nFramesAnalyzed ];\r
+    SKP_Silk_nsq_state sNSQ_LBRR;\r
 \r
     /*******************************************/\r
     /* Control use of inband LBRR              */\r
     /*******************************************/\r
-    psEnc->sCmn.LBRR_usage = SKP_SILK_NO_LBRR;\r
-    if( psEnc->sCmn.LBRR_enabled ) {\r
-        /* Control LBRR based on sensitivity and packet loss caracteristics */\r
-        if( psEnc->speech_activity > LBRR_SPEECH_ACTIVITY_THRES && psEnc->sCmn.PacketLoss_perc > LBRR_LOSS_THRES ) {\r
-            psEnc->sCmn.LBRR_usage = SKP_SILK_LBRR;\r
-        }\r
+    if( psEnc->sCmn.LBRR_enabled && psEnc->speech_activity > LBRR_SPEECH_ACTIVITY_THRES ) {\r
+        psEnc->sCmn.LBRR_flags[ psEnc->sCmn.nFramesAnalyzed ] = 1;\r
+\r
+        /* Copy noise shaping quantizer state and quantization indices from regular encoding */\r
+        SKP_memcpy( &sNSQ_LBRR, &psEnc->sCmn.sNSQ, sizeof( SKP_Silk_nsq_state ) );\r
+        SKP_memcpy( psIndices_LBRR, &psEnc->sCmn.indices, sizeof( SideInfoIndices ) );\r
 \r
         /* Save original gains */\r
-        SKP_memcpy( TempGainsIndices, psEncCtrl->sCmn.GainsIndices, MAX_NB_SUBFR * sizeof( SKP_int   ) );\r
-        SKP_memcpy( TempGains,        psEncCtrl->Gains,             MAX_NB_SUBFR * sizeof( SKP_float ) );\r
-\r
-        typeOffset     = psEnc->sCmn.typeOffsetPrev; // Temp save as cannot be overwritten\r
-        LTP_scaleIndex = psEncCtrl->sCmn.LTP_scaleIndex;\r
-\r
-        /* Set max rate where quant signal is encoded */\r
-        if( psEnc->sCmn.fs_kHz == 8 ) {\r
-            Rate_only_parameters = 13500;\r
-        } else if( psEnc->sCmn.fs_kHz == 12 ) {\r
-            Rate_only_parameters = 15500;\r
-        } else if( psEnc->sCmn.fs_kHz == 16 ) {\r
-            Rate_only_parameters = 17500;\r
-        } else {\r
-            SKP_assert( 0 );\r
-        }\r
+        SKP_memcpy( TempGains, psEncCtrl->Gains, psEnc->sCmn.nb_subfr * sizeof( SKP_float ) );\r
 \r
-        if( psEnc->sCmn.Complexity >= 4 && psEnc->sCmn.TargetRate_bps > Rate_only_parameters ) {\r
-            if( psEnc->sCmn.nFramesInPayloadBuf == 0 ) {\r
-                /* First frame in packet copy everything */\r
-                SKP_memcpy( &psEnc->sNSQ_LBRR, &psEnc->sNSQ, sizeof( SKP_Silk_nsq_state ) );\r
-                psEnc->sCmn.LBRRprevLastGainIndex = psEnc->sShape.LastGainIndex;\r
-                /* Increase Gains to get target LBRR rate */\r
-                psEncCtrl->sCmn.GainsIndices[ 0 ] += psEnc->sCmn.LBRR_GainIncreases;\r
-                psEncCtrl->sCmn.GainsIndices[ 0 ]  = SKP_LIMIT_int( psEncCtrl->sCmn.GainsIndices[ 0 ], 0, N_LEVELS_QGAIN - 1 );\r
-            }\r
-            /* Decode to get gains in sync with decoder */\r
-            SKP_Silk_gains_dequant( Gains_Q16, psEncCtrl->sCmn.GainsIndices, \r
-                &psEnc->sCmn.LBRRprevLastGainIndex, psEnc->sCmn.nFramesInPayloadBuf, psEnc->sCmn.nb_subfr );\r
-\r
-            /* Overwrite unquantized gains with quantized gains and convert back to Q0 from Q16 */\r
-            for( k = 0; k <  psEnc->sCmn.nb_subfr; k++ ) {\r
-                psEncCtrl->Gains[ k ] = Gains_Q16[ k ] / 65536.0f;\r
-            }\r
-\r
-            /*****************************************/\r
-            /* Noise shaping quantization            */\r
-            /*****************************************/\r
-            SKP_Silk_NSQ_wrapper_FLP( psEnc, psEncCtrl, xfw, &psEnc->sCmn.q_LBRR[ psEnc->sCmn.nFramesInPayloadBuf * MAX_FRAME_LENGTH ], 1 );\r
-        } else {\r
-            SKP_memset( &psEnc->sCmn.q_LBRR[ psEnc->sCmn.nFramesInPayloadBuf * MAX_FRAME_LENGTH ], 0, psEnc->sCmn.frame_length * sizeof( SKP_int8 ) );\r
-            psEncCtrl->sCmn.LTP_scaleIndex = 0;\r
-        }\r
-        /****************************************/\r
-        /* Initialize arithmetic coder          */\r
-        /****************************************/\r
-        if( psEnc->sCmn.nFramesInPayloadBuf == 0 ) {\r
-            ec_enc_init( &psEnc->sCmn.sRC_LBRR.range_enc_celt_state, psEnc->sCmn.sRC_LBRR.buffer, MAX_ARITHM_BYTES );\r
-\r
-            SKP_Silk_range_enc_init( &psEnc->sCmn.sRC_LBRR );\r
-            psEnc->sCmn.nBytesInPayloadBuf = 0;\r
-        }\r
 \r
-        /****************************************/\r
-        /* Encode Parameters                    */\r
-        /****************************************/\r
-        SKP_Silk_encode_indices( &psEnc->sCmn, &psEncCtrl->sCmn, &psEnc->sCmn.sRC_LBRR );\r
+        if( psEnc->sCmn.nFramesAnalyzed == 0 || psEnc->sCmn.LBRR_flags[ psEnc->sCmn.nFramesAnalyzed - 1 ] == 0 ) {\r
+            /* First frame in packet or previous frame not LBRR coded */\r
+            psEnc->sCmn.LBRRprevLastGainIndex = psEnc->sShape.LastGainIndex;\r
 \r
-        if( psEnc->sCmn.sRC_LBRR.error ) {\r
-            /* Encoder returned error: Clear payload buffer */\r
-            nFramesInPayloadBuf = 0;\r
-        } else {\r
-            nFramesInPayloadBuf = psEnc->sCmn.nFramesInPayloadBuf + 1;\r
+            /* Increase Gains to get target LBRR rate */\r
+            psIndices_LBRR->GainsIndices[ 0 ] += psEnc->sCmn.LBRR_GainIncreases;\r
+            psIndices_LBRR->GainsIndices[ 0 ] = SKP_min_int( psIndices_LBRR->GainsIndices[ 0 ], N_LEVELS_QGAIN - 1 );\r
         }\r
 \r
-        /****************************************/\r
-        /* Finalize payload and copy to output  */\r
-        /****************************************/\r
-        if( psEnc->sCmn.nFramesInPayloadBuf * SUB_FRAME_LENGTH_MS * psEnc->sCmn.nb_subfr >= psEnc->sCmn.PacketSize_ms ) {\r
-\r
-            /* Check if FEC information should be added */\r
-            frame_terminator = SKP_SILK_LAST_FRAME;\r
-\r
-            /* Add the frame termination info to stream */\r
-            ec_encode_bin( psRangeEnc_LBRR, FrameTermination_CDF[ frame_terminator ], \r
-                FrameTermination_CDF[ frame_terminator + 1 ], 16 );\r
-\r
-            /*********************************************/\r
-            /* Encode quantization indices of excitation */\r
-            /*********************************************/\r
-            for( i = 0; i < nFramesInPayloadBuf; i++ ) {\r
-                SKP_Silk_encode_pulses( &psEnc->sCmn.sRC_LBRR, psEnc->sCmn.signalType[ i ], psEnc->sCmn.quantOffsetType[ i ],\r
-                    &psEnc->sCmn.q_LBRR[ i * MAX_FRAME_LENGTH ], psEnc->sCmn.frame_length );\r
-            }\r
-\r
-            /* Payload length so far */\r
-            nBytes = SKP_RSHIFT( ec_tell( psRangeEnc_LBRR ) + 7, 3 );\r
-\r
-            /* Check that there is enough space in external output buffer and move data */\r
-            if( *pnBytesOut >= nBytes ) {\r
-                SKP_int bits_in_stream, mask;\r
-                bits_in_stream = ec_tell( &psEnc->sCmn.sRC_LBRR.range_enc_celt_state );\r
-                ec_enc_done( &psEnc->sCmn.sRC_LBRR.range_enc_celt_state );\r
-\r
-                /* Fill up any remaining bits in the last byte with 1s */\r
-                if( bits_in_stream & 7 ) {\r
-                    mask = SKP_RSHIFT( 0xFF, bits_in_stream & 7 );\r
-                    if( nBytes - 1 < *pnBytesOut ) {\r
-                        psEnc->sCmn.sRC_LBRR.range_enc_celt_state.buf->buf[ nBytes - 1 ] |= mask;\r
-                    }\r
-                }\r
-                SKP_memcpy( pCode, psEnc->sCmn.sRC_LBRR.range_enc_celt_state.buf->buf, nBytes * sizeof( SKP_uint8 ) );\r
-\r
-                *pnBytesOut = nBytes;               \r
-            } else {\r
-                /* Not enough space: payload will be discarded */\r
-                *pnBytesOut = 0;\r
-                SKP_assert( 0 );\r
-            }\r
-        } else {\r
-            /* No payload this time */\r
-            *pnBytesOut = 0;\r
-\r
-            /* Encode that more frames follows */\r
-            frame_terminator = SKP_SILK_MORE_FRAMES;\r
-            ec_encode_bin( psRangeEnc_LBRR, FrameTermination_CDF[ frame_terminator ], \r
-                FrameTermination_CDF[ frame_terminator + 1 ], 16 );\r
+        /* Decode to get gains in sync with decoder */\r
+        SKP_Silk_gains_dequant( Gains_Q16, psIndices_LBRR->GainsIndices, \r
+            &psEnc->sCmn.LBRRprevLastGainIndex, psEnc->sCmn.nFramesAnalyzed, psEnc->sCmn.nb_subfr );\r
+\r
+        /* Overwrite unquantized gains with quantized gains and convert back to Q0 from Q16 */\r
+        for( k = 0; k <  psEnc->sCmn.nb_subfr; k++ ) {\r
+            psEncCtrl->Gains[ k ] = Gains_Q16[ k ] / 65536.0f;\r
         }\r
 \r
+        /*****************************************/\r
+        /* Noise shaping quantization            */\r
+        /*****************************************/\r
+        SKP_Silk_NSQ_wrapper_FLP( psEnc, psEncCtrl, psIndices_LBRR, &sNSQ_LBRR, \r
+            psEnc->sCmn.pulses_LBRR[ psEnc->sCmn.nFramesAnalyzed ], xfw );\r
+\r
         /* Restore original Gains */\r
-        SKP_memcpy( psEncCtrl->sCmn.GainsIndices, TempGainsIndices, psEnc->sCmn.nb_subfr * sizeof( SKP_int   ) );\r
-        SKP_memcpy( psEncCtrl->Gains,             TempGains,        psEnc->sCmn.nb_subfr * sizeof( SKP_float ) );\r
-    \r
-        /* Restore LTP scale index and typeoffset */\r
-        psEncCtrl->sCmn.LTP_scaleIndex = LTP_scaleIndex;\r
-        psEnc->sCmn.typeOffsetPrev     = typeOffset;\r
+        SKP_memcpy( psEncCtrl->Gains, TempGains, psEnc->sCmn.nb_subfr * sizeof( SKP_float ) );\r
     }\r
 }\r
-#endif\r
index e5ffa7e..8f6be16 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
@@ -30,7 +30,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 \r
 void SKP_Silk_find_LPC_FLP(\r
           SKP_float                 NLSF[],             /* O    NLSFs                                   */\r
-          SKP_int                   *interpIndex,       /* O    NLSF interp. index for NLSF interp.     */\r
+          SKP_int8                  *interpIndex,       /* O    NLSF interp. index for NLSF interp.     */\r
     const SKP_float                 prev_NLSFq[],       /* I    Previous NLSFs, for NLSF interpolation  */\r
     const SKP_int                   useInterpNLSFs,     /* I    Flag                                    */\r
     const SKP_int                   LPC_order,          /* I    LPC order                               */\r
@@ -82,7 +82,7 @@ void SKP_Silk_find_LPC_FLP(
             if( res_nrg_interp < res_nrg ) {\r
                 /* Interpolation has lower residual energy */\r
                 res_nrg = res_nrg_interp;\r
-                *interpIndex = k;\r
+                *interpIndex = (SKP_int8)k;\r
             } else if( res_nrg_interp > res_nrg_2nd ) {\r
                 /* No reason to continue iterating - residual energies will continue to climb */\r
                 break;\r
index 155105f..1238498 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
index 01e8348..f35899d 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
@@ -99,9 +99,8 @@ void SKP_Silk_find_pitch_lags_FLP(
     /* LPC analysis filtering                */\r
     /*****************************************/\r
     SKP_Silk_LPC_analysis_filter_FLP( res, A, x_buf, buf_len, psEnc->sCmn.pitchEstimationLPCOrder );\r
-    SKP_memset( res, 0, psEnc->sCmn.pitchEstimationLPCOrder * sizeof( SKP_float ) );\r
 \r
-    if( psEncCtrl->sCmn.signalType != TYPE_NO_VOICE_ACTIVITY ) {\r
+    if( psEnc->sCmn.indices.signalType != TYPE_NO_VOICE_ACTIVITY ) {\r
         /* Threshold for pitch estimator */\r
         thrhld  = 0.6f;\r
         thrhld -= 0.004f * psEnc->sCmn.pitchEstimationLPCOrder;\r
@@ -112,18 +111,18 @@ void SKP_Silk_find_pitch_lags_FLP(
         /*****************************************/\r
         /* Call Pitch estimator                  */\r
         /*****************************************/\r
-        if( SKP_Silk_pitch_analysis_core_FLP( res, psEncCtrl->sCmn.pitchL, &psEncCtrl->sCmn.lagIndex, \r
-            &psEncCtrl->sCmn.contourIndex, &psEnc->LTPCorr, psEnc->sCmn.prevLag, psEnc->sCmn.pitchEstimationThreshold_Q16 / 65536.0f,\r
+        if( SKP_Silk_pitch_analysis_core_FLP( res, psEncCtrl->pitchL, &psEnc->sCmn.indices.lagIndex, \r
+            &psEnc->sCmn.indices.contourIndex, &psEnc->LTPCorr, psEnc->sCmn.prevLag, psEnc->sCmn.pitchEstimationThreshold_Q16 / 65536.0f,\r
             thrhld, psEnc->sCmn.fs_kHz, psEnc->sCmn.pitchEstimationComplexity, psEnc->sCmn.nb_subfr ) == 0 ) \r
         {\r
-            psEncCtrl->sCmn.signalType = TYPE_VOICED;\r
+            psEnc->sCmn.indices.signalType = TYPE_VOICED;\r
         } else {\r
-            psEncCtrl->sCmn.signalType = TYPE_UNVOICED;\r
+            psEnc->sCmn.indices.signalType = TYPE_UNVOICED;\r
         }\r
     } else {\r
-        SKP_memset( psEncCtrl->sCmn.pitchL, 0, sizeof( psEncCtrl->sCmn.pitchL ) );\r
-        psEncCtrl->sCmn.lagIndex = 0;\r
-        psEncCtrl->sCmn.contourIndex = 0;\r
+        SKP_memset( psEncCtrl->pitchL, 0, sizeof( psEncCtrl->pitchL ) );\r
+        psEnc->sCmn.indices.lagIndex = 0;\r
+        psEnc->sCmn.indices.contourIndex = 0;\r
         psEnc->LTPCorr = 0;\r
     }\r
 }\r
index c408e81..5ef9a21 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
@@ -42,7 +42,6 @@ void SKP_Silk_find_pred_coefs_FLP(
     const SKP_float *x_ptr;\r
     SKP_float       *x_pre_ptr, LPC_in_pre[ MAX_NB_SUBFR * MAX_LPC_ORDER + MAX_FRAME_LENGTH ];\r
 \r
-\r
     /* Weighting for weighted least squares */\r
     for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) {\r
         SKP_assert( psEncCtrl->Gains[ i ] > 0.0f );\r
@@ -50,16 +49,15 @@ void SKP_Silk_find_pred_coefs_FLP(
         Wght[ i ]     = invGains[ i ] * invGains[ i ];\r
     }\r
 \r
-    if( psEncCtrl->sCmn.signalType == TYPE_VOICED ) {\r
+    if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) {\r
         /**********/\r
         /* VOICED */\r
         /**********/\r
-        SKP_assert( psEnc->sCmn.ltp_mem_length - psEnc->sCmn.predictLPCOrder >= psEncCtrl->sCmn.pitchL[ 0 ] + LTP_ORDER / 2 );\r
+        SKP_assert( psEnc->sCmn.ltp_mem_length - psEnc->sCmn.predictLPCOrder >= psEncCtrl->pitchL[ 0 ] + LTP_ORDER / 2 );\r
 \r
         /* LTP analysis */\r
         SKP_Silk_find_LTP_FLP( psEncCtrl->LTPCoef, WLTP, &psEncCtrl->LTPredCodGain, res_pitch, \r
-            psEncCtrl->sCmn.pitchL, Wght, psEnc->sCmn.subfr_length,\r
-            psEnc->sCmn.nb_subfr, psEnc->sCmn.ltp_mem_length );\r
+            psEncCtrl->pitchL, Wght, psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr, psEnc->sCmn.ltp_mem_length );\r
 \r
 #ifdef SAVE_ALL_INTERNAL_DATA\r
                DEBUG_STORE_DATA( ltp_gains.dat, psEncCtrl->LTPCoef, sizeof( psEncCtrl->LTPCoef ) );\r
@@ -67,7 +65,7 @@ void SKP_Silk_find_pred_coefs_FLP(
 #endif\r
 \r
         /* Quantize LTP gain parameters */\r
-        SKP_Silk_quant_LTP_gains_FLP( psEncCtrl->LTPCoef, psEncCtrl->sCmn.LTPIndex, &psEncCtrl->sCmn.PERIndex, \r
+        SKP_Silk_quant_LTP_gains_FLP( psEncCtrl->LTPCoef, psEnc->sCmn.indices.LTPIndex, &psEnc->sCmn.indices.PERIndex, \r
             WLTP, psEnc->sCmn.mu_LTP_Q9, psEnc->sCmn.LTPQuantLowComplexity , psEnc->sCmn.nb_subfr );\r
 \r
         /* Control LTP scaling */\r
@@ -75,7 +73,7 @@ void SKP_Silk_find_pred_coefs_FLP(
 \r
         /* Create LTP residual */\r
         SKP_Silk_LTP_analysis_filter_FLP( LPC_in_pre, psEnc->x_buf + psEnc->sCmn.ltp_mem_length - psEnc->sCmn.predictLPCOrder, \r
-            psEncCtrl->LTPCoef, psEncCtrl->sCmn.pitchL, invGains, psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr, psEnc->sCmn.predictLPCOrder );\r
+            psEncCtrl->LTPCoef, psEncCtrl->pitchL, invGains, psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr, psEnc->sCmn.predictLPCOrder );\r
 \r
     } else {\r
         /************/\r
@@ -96,13 +94,15 @@ void SKP_Silk_find_pred_coefs_FLP(
     }\r
 \r
     /* LPC_in_pre contains the LTP-filtered input for voiced, and the unfiltered input for unvoiced */\r
-    SKP_Silk_find_LPC_FLP( NLSF, &psEncCtrl->sCmn.NLSFInterpCoef_Q2, psEnc->sPred.prev_NLSFq, \r
+    SKP_Silk_find_LPC_FLP( NLSF, &psEnc->sCmn.indices.NLSFInterpCoef_Q2, psEnc->sPred.prev_NLSFq, \r
         psEnc->sCmn.useInterpolatedNLSFs * ( 1 - psEnc->sCmn.first_frame_after_reset ), psEnc->sCmn.predictLPCOrder, \r
         LPC_in_pre, psEnc->sCmn.subfr_length + psEnc->sCmn.predictLPCOrder, psEnc->sCmn.nb_subfr );\r
 \r
 \r
     /* Quantize LSFs */\r
+TIC(LSF_quant);\r
     SKP_Silk_process_NLSFs_FLP( psEnc, psEncCtrl, NLSF );\r
+TOC(LSF_quant);\r
 \r
     /* Calculate residual energy using quantized LPC coefficients */\r
     SKP_Silk_residual_energy_FLP( psEncCtrl->ResNrg, LPC_in_pre, psEncCtrl->PredCoef, psEncCtrl->Gains,\r
index d3e60b8..4b9ffdf 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
@@ -50,9 +50,5 @@ SKP_int SKP_Silk_init_encoder_FLP(
     /* Initialize Silk VAD */\r
     ret += SKP_Silk_VAD_Init( &psEnc->sCmn.sVAD );\r
 \r
-    /* Initialize NSQ */\r
-    psEnc->sNSQ.prev_inv_gain_Q16      = 65536;\r
-    psEnc->sNSQ_LBRR.prev_inv_gain_Q16 = 65536;\r
-\r
     return( ret );\r
 }\r
index d91af20..d406421 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
@@ -59,18 +59,14 @@ void SKP_Silk_HP_variable_cutoff_FLP(
 /* Encoder main function */\r
 SKP_int SKP_Silk_encode_frame_FLP( \r
     SKP_Silk_encoder_state_FLP      *psEnc,             /* I/O  Encoder state FLP                       */\r
-    SKP_int32                       *pnBytesOut,        /* I/O  Number of payload bytes;                */\r
-                                                        /*      input: max length; output: used         */\r
-    ec_enc                          *psRangeEnc,        /* I/O  compressor data structure                */\r
-    const SKP_int16                 *pIn                /* I    Input speech frame                      */\r
+    SKP_int32                       *pnBytesOut,        /*   O  Number of payload bytes;                */\r
+    ec_enc                          *psRangeEnc         /* I/O  compressor data structure                */\r
 );\r
 \r
 /* Low Bitrate Redundancy (LBRR) encoding. Reuse all parameters but encode with lower bitrate           */\r
 void SKP_Silk_LBRR_encode_FLP(\r
     SKP_Silk_encoder_state_FLP      *psEnc,             /* I/O  Encoder state FLP                       */\r
     SKP_Silk_encoder_control_FLP    *psEncCtrl,         /* I/O  Encoder control FLP                     */\r
-          SKP_uint8                 *pCode,             /* O    Payload                                 */\r
-          SKP_int32                 *pnBytesOut,        /* I/O  Payload bytes; in: max; out: used       */\r
     const SKP_float                 xfw[]               /* I    Input signal                            */\r
 );\r
 \r
@@ -146,7 +142,7 @@ void SKP_Silk_find_pred_coefs_FLP(
 /* LPC analysis */\r
 void SKP_Silk_find_LPC_FLP(\r
           SKP_float                 NLSF[],             /* O    NLSFs                                   */\r
-          SKP_int                   *interpIndex,       /* O    NLSF interp. index for NLSF interp.     */\r
+          SKP_int8                  *interpIndex,       /* O    NLSF interp. index for NLSF interp.     */\r
     const SKP_float                 prev_NLSFq[],       /* I    Previous NLSFs, for NLSF interpolation  */\r
     const SKP_int                   useInterpNLSFs,     /* I    Flag                                    */\r
     const SKP_int                   LPC_order,          /* I    LPC order                               */\r
@@ -203,10 +199,10 @@ void SKP_Silk_LPC_analysis_filter_FLP(
 /* LTP tap quantizer */\r
 void SKP_Silk_quant_LTP_gains_FLP(\r
           SKP_float B[ MAX_NB_SUBFR * LTP_ORDER ],              /* I/O  (Un-)quantized LTP gains                */\r
-          SKP_int   cbk_index[ MAX_NB_SUBFR ],                  /* O    Codebook index                          */\r
-          SKP_int   *periodicity_index,                         /* O    Periodicity index                       */\r
+          SKP_int8  cbk_index[ MAX_NB_SUBFR ],                  /* O    Codebook index                          */\r
+          SKP_int8  *periodicity_index,                         /* O    Periodicity index                       */\r
     const SKP_float W[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ],  /* I    Error weights                           */\r
-    const SKP_int   mu_Q10,                                     /* I    Mu value (R/D tradeoff)     */\r
+    const SKP_int   mu_Q10,                                     /* I    Mu value (R/D tradeoff)                 */\r
     const SKP_int   lowComplexity,                              /* I    Flag for low complexity                 */\r
     const SKP_int   nb_subfr                                    /* I    number of subframes                     */\r
 );\r
@@ -223,7 +219,7 @@ void SKP_Silk_process_NLSFs_FLP(
 \r
 /* NLSF vector encoder */\r
 void SKP_Silk_NLSF_MSVQ_encode_FLP(\r
-          SKP_int                   *NLSFIndices,       /* O    Codebook path vector [ CB_STAGES ]      */\r
+          SKP_int8                  *NLSFIndices,       /* O    Codebook path vector [ CB_STAGES ]      */\r
           SKP_float                 *pNLSF,             /* I/O  Quantized NLSF vector [ LPC_ORDER ]     */\r
     const SKP_Silk_NLSF_CB_struct   *psNLSF_CB,         /* I    Codebook object                         */\r
     const SKP_float                 *pNLSF_q_prev,      /* I    Prev. quantized NLSF vector [LPC_ORDER] */\r
@@ -262,7 +258,7 @@ void SKP_Silk_NLSF_VQ_sum_error_FLP(
 void SKP_Silk_NLSF_MSVQ_decode_FLP(\r
           SKP_float                 *pNLSF,             /* O    Decoded output vector [ LPC_ORDER ]     */\r
     const SKP_Silk_NLSF_CB_struct   *psNLSF_CB,         /* I    NLSF codebook struct                    */  \r
-    const SKP_int                   *NLSFIndices,       /* I    NLSF indices [ nStages ]                */\r
+    const SKP_int8                  *NLSFIndices,       /* I    NLSF indices [ nStages ]                */\r
     const SKP_int                   LPC_order           /* I    LPC order used                          */\r
 );\r
 \r
@@ -387,9 +383,10 @@ SKP_int SKP_Silk_VAD_FLP(
 void SKP_Silk_NSQ_wrapper_FLP(\r
     SKP_Silk_encoder_state_FLP      *psEnc,         /* I/O  Encoder state FLP                           */\r
     SKP_Silk_encoder_control_FLP    *psEncCtrl,     /* I/O  Encoder control FLP                         */\r
-    const SKP_float                 x[],            /* I    Prefiltered input signal                    */\r
-          SKP_int8                  q[],            /* O    Quantized pulse signal                      */\r
-    const SKP_int                   useLBRR         /* I    LBRR flag                                   */\r
+    SideInfoIndices                 *psIndices,     /* I/O  Quantization indices                        */\r
+    SKP_Silk_nsq_state              *psNSQ,         /* I/O  Noise Shaping Quantzation state             */\r
+          SKP_int8                  pulses[],       /* O    Quantized pulse signal                      */\r
+    const SKP_float                 x[]             /* I    Prefiltered input signal                    */\r
 );\r
 \r
 /* using log2() helps the fixed-point conversion */\r
index 57e09f7..17a991e 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
@@ -144,10 +144,8 @@ void SKP_Silk_noise_shape_analysis_FLP(
     /* Reduce SNR_dB values if recent bitstream has exceeded TargetRate */\r
     psEncCtrl->current_SNR_dB = psEnc->SNR_dB - 0.1f * psEnc->BufferedInChannel_ms;\r
 \r
-    /* Reduce SNR_dB if inband FEC used */\r
-    if( psEnc->speech_activity > LBRR_SPEECH_ACTIVITY_THRES ) {\r
-        psEncCtrl->current_SNR_dB -= psEnc->inBandFEC_SNR_comp;\r
-    }\r
+    /* Reduce SNR_dB because of any inband FEC used */\r
+    psEncCtrl->current_SNR_dB -= psEnc->inBandFEC_SNR_comp;\r
 \r
     /****************/\r
     /* GAIN CONTROL */\r
@@ -165,7 +163,7 @@ void SKP_Silk_noise_shape_analysis_FLP(
         SNR_adj_dB -= BG_SNR_DECR_dB * psEncCtrl->coding_quality * ( 0.5f + 0.5f * psEncCtrl->input_quality ) * b * b;\r
     }\r
 \r
-    if( psEncCtrl->sCmn.signalType == TYPE_VOICED ) {\r
+    if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) {\r
         /* Reduce gains for periodic signals */\r
         SNR_adj_dB += HARM_SNR_INCR_dB * psEnc->LTPCorr;\r
     } else { \r
@@ -177,9 +175,9 @@ void SKP_Silk_noise_shape_analysis_FLP(
     /* SPARSENESS PROCESSING */\r
     /*************************/\r
     /* Set quantizer offset */\r
-    if( psEncCtrl->sCmn.signalType == TYPE_VOICED ) {\r
+    if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) {\r
         /* Initally set to 0; may be overruled in process_gains(..) */\r
-        psEncCtrl->sCmn.quantOffsetType = 0;\r
+        psEnc->sCmn.indices.quantOffsetType = 0;\r
         psEncCtrl->sparseness = 0.0f;\r
     } else {\r
         /* Sparseness measure, based on relative fluctuations of energy per 2 milliseconds */\r
@@ -200,9 +198,9 @@ void SKP_Silk_noise_shape_analysis_FLP(
 \r
         /* Set quantization offset depending on sparseness measure */\r
         if( psEncCtrl->sparseness > SPARSENESS_THRESHOLD_QNT_OFFSET ) {\r
-            psEncCtrl->sCmn.quantOffsetType = 0;\r
+            psEnc->sCmn.indices.quantOffsetType = 0;\r
         } else {\r
-            psEncCtrl->sCmn.quantOffsetType = 1;\r
+            psEnc->sCmn.indices.quantOffsetType = 1;\r
         }\r
         \r
         /* Increase coding SNR for sparse signals */\r
@@ -311,11 +309,11 @@ void SKP_Silk_noise_shape_analysis_FLP(
     /* Less low frequency shaping for noisy inputs */\r
     strength = LOW_FREQ_SHAPING * ( 1.0f + LOW_QUALITY_LOW_FREQ_SHAPING_DECR * ( psEncCtrl->input_quality_bands[ 0 ] - 1.0f ) );\r
     strength *= psEnc->speech_activity;\r
-    if( psEncCtrl->sCmn.signalType == TYPE_VOICED ) {\r
+    if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) {\r
         /* Reduce low frequencies quantization noise for periodic signals, depending on pitch lag */\r
         /*f = 400; freqz([1, -0.98 + 2e-4 * f], [1, -0.97 + 7e-4 * f], 2^12, Fs); axis([0, 1000, -10, 1])*/\r
         for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) {\r
-            b = 0.2f / psEnc->sCmn.fs_kHz + 3.0f / psEncCtrl->sCmn.pitchL[ k ];\r
+            b = 0.2f / psEnc->sCmn.fs_kHz + 3.0f / psEncCtrl->pitchL[ k ];\r
             psEncCtrl->LF_MA_shp[ k ] = -1.0f + b;\r
             psEncCtrl->LF_AR_shp[ k ] =  1.0f - b - b * strength;\r
         }\r
@@ -341,7 +339,7 @@ void SKP_Silk_noise_shape_analysis_FLP(
     /* More harmonic boost for noisy input signals */\r
     HarmBoost += LOW_INPUT_QUALITY_HARMONIC_BOOST * ( 1.0f - psEncCtrl->input_quality );\r
 \r
-    if( USE_HARM_SHAPING && psEncCtrl->sCmn.signalType == TYPE_VOICED ) {\r
+    if( USE_HARM_SHAPING && psEnc->sCmn.indices.signalType == TYPE_VOICED ) {\r
         /* Harmonic noise shaping */\r
         HarmShapeGain = HARMONIC_SHAPING;\r
 \r
index d8b0f66..c3a23d1 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
@@ -110,8 +110,8 @@ void SKP_Silk_prefilter_FLP(
     lag = P->lagPrev;\r
     for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) {\r
         /* Update Variables that change per sub frame */\r
-        if( psEncCtrl->sCmn.signalType == TYPE_VOICED ) {\r
-            lag = psEncCtrl->sCmn.pitchL[ k ];\r
+        if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) {\r
+            lag = psEncCtrl->pitchL[ k ];\r
         }\r
 \r
         /* Noise shape parameters */\r
@@ -143,7 +143,7 @@ void SKP_Silk_prefilter_FLP(
         px  += psEnc->sCmn.subfr_length;\r
         pxw += psEnc->sCmn.subfr_length;\r
     }\r
-    P->lagPrev = psEncCtrl->sCmn.pitchL[ psEnc->sCmn.nb_subfr - 1 ];\r
+    P->lagPrev = psEncCtrl->pitchL[ psEnc->sCmn.nb_subfr - 1 ];\r
 }\r
 \r
 /*\r
index e21ac88..0f13a47 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
@@ -48,7 +48,7 @@ void SKP_Silk_process_NLSFs_FLP(
     /***********************/\r
     /* Calculate mu values */\r
     /***********************/\r
-    if( psEncCtrl->sCmn.signalType == TYPE_VOICED ) {\r
+    if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) {\r
         NLSF_mu          = 0.002f - 0.001f * psEnc->speech_activity;\r
         NLSF_mu_fluc_red = 0.1f   - 0.05f  * psEnc->speech_activity;\r
     } else { \r
@@ -60,11 +60,11 @@ void SKP_Silk_process_NLSFs_FLP(
     SKP_Silk_NLSF_VQ_weights_laroia_FLP( pNLSFW, pNLSF, psEnc->sCmn.predictLPCOrder );\r
 \r
     /* Update NLSF weights for interpolated NLSFs */\r
-    doInterpolate = ( psEnc->sCmn.useInterpolatedNLSFs == 1 ) && ( psEncCtrl->sCmn.NLSFInterpCoef_Q2 < ( 1 << 2 ) );\r
+    doInterpolate = ( psEnc->sCmn.useInterpolatedNLSFs == 1 ) && ( psEnc->sCmn.indices.NLSFInterpCoef_Q2 < ( 1 << 2 ) );\r
     if( doInterpolate ) {\r
 \r
         /* Calculate the interpolated NLSF vector for the first half */\r
-        NLSF_interpolation_factor = 0.25f * psEncCtrl->sCmn.NLSFInterpCoef_Q2;\r
+        NLSF_interpolation_factor = 0.25f * psEnc->sCmn.indices.NLSFInterpCoef_Q2;\r
         SKP_Silk_interpolate_wrapper_FLP( pNLSF0_temp, psEnc->sPred.prev_NLSFq, pNLSF, \r
             NLSF_interpolation_factor, psEnc->sCmn.predictLPCOrder );\r
 \r
@@ -79,10 +79,10 @@ void SKP_Silk_process_NLSFs_FLP(
     }\r
 \r
     /* Set pointer to the NLSF codebook for the current signal type and LPC order */\r
-    psNLSF_CB = psEnc->sCmn.psNLSF_CB[ 1 - (psEncCtrl->sCmn.signalType >> 1) ];\r
+    psNLSF_CB = psEnc->sCmn.psNLSF_CB[ 1 - ( psEnc->sCmn.indices.signalType >> 1 ) ];\r
 \r
     /* Quantize NLSF parameters given the trained NLSF codebooks */\r
-    SKP_Silk_NLSF_MSVQ_encode_FLP( psEncCtrl->sCmn.NLSFIndices, pNLSF, psNLSF_CB, psEnc->sPred.prev_NLSFq, pNLSFW, NLSF_mu, \r
+    SKP_Silk_NLSF_MSVQ_encode_FLP( psEnc->sCmn.indices.NLSFIndices, pNLSF, psNLSF_CB, psEnc->sPred.prev_NLSFq, pNLSFW, NLSF_mu, \r
         NLSF_mu_fluc_red, psEnc->sCmn.NLSF_MSVQ_Survivors, psEnc->sCmn.predictLPCOrder, psEnc->sCmn.first_frame_after_reset );\r
 \r
     /* Convert quantized NLSFs back to LPC coefficients */\r
index e49e9ba..9a0d462 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
@@ -40,7 +40,7 @@ void SKP_Silk_process_gains_FLP(
     SKP_float   s, InvMaxSqrVal, gain, quant_offset;\r
 \r
     /* Gain reduction when LTP coding gain is high */\r
-    if( psEncCtrl->sCmn.signalType == TYPE_VOICED ) {\r
+    if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) {\r
         s = 1.0f - 0.5f * SKP_sigmoid( 0.25f * ( psEncCtrl->LTPredCodGain - 12.0f ) );\r
         for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) {\r
             psEncCtrl->Gains[ k ] *= s;\r
@@ -63,8 +63,8 @@ void SKP_Silk_process_gains_FLP(
     }\r
 \r
     /* Noise shaping quantization */\r
-    SKP_Silk_gains_quant( psEncCtrl->sCmn.GainsIndices, pGains_Q16, \r
-            &psShapeSt->LastGainIndex, psEnc->sCmn.nFramesInPayloadBuf, psEnc->sCmn.nb_subfr );\r
+    SKP_Silk_gains_quant( psEnc->sCmn.indices.GainsIndices, pGains_Q16, \r
+            &psShapeSt->LastGainIndex, psEnc->sCmn.nFramesAnalyzed, psEnc->sCmn.nb_subfr );\r
 \r
     /* Overwrite unquantized gains with quantized gains and convert back to Q0 from Q16 */\r
     for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) {\r
@@ -72,16 +72,16 @@ void SKP_Silk_process_gains_FLP(
     }\r
 \r
     /* Set quantizer offset for voiced signals. Larger offset when LTP coding gain is low or tilt is high (ie low-pass) */\r
-    if( psEncCtrl->sCmn.signalType == TYPE_VOICED ) {\r
+    if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) {\r
         if( psEncCtrl->LTPredCodGain + psEncCtrl->input_tilt > 1.0f ) {\r
-            psEncCtrl->sCmn.quantOffsetType = 0;\r
+            psEnc->sCmn.indices.quantOffsetType = 0;\r
         } else {\r
-            psEncCtrl->sCmn.quantOffsetType = 1;\r
+            psEnc->sCmn.indices.quantOffsetType = 1;\r
         }\r
     }\r
 \r
     /* Quantizer boundary adjustment */\r
-    quant_offset = SKP_Silk_Quantization_Offsets_Q10[ psEncCtrl->sCmn.signalType >> 1 ][ psEncCtrl->sCmn.quantOffsetType ] / 1024.0f;\r
+    quant_offset = SKP_Silk_Quantization_Offsets_Q10[ psEnc->sCmn.indices.signalType >> 1 ][ psEnc->sCmn.indices.quantOffsetType ] / 1024.0f;\r
     psEncCtrl->Lambda = LAMBDA_OFFSET \r
                       + LAMBDA_DELAYED_DECISIONS * psEnc->sCmn.nStatesDelayedDecision\r
                       + LAMBDA_SPEECH_ACT        * psEnc->speech_activity \r
index 14eadb7..3acb944 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
index f7a734c..1d11b4e 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
index 6e52b37..e6c02c4 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
index b2dd926..5a950e0 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
@@ -40,7 +40,7 @@ extern "C"
 /* Noise shaping analysis state */\r
 /********************************/\r
 typedef struct {\r
-    SKP_int     LastGainIndex;\r
+    SKP_int8    LastGainIndex;\r
     SKP_float   HarmBoost_smth;\r
     SKP_float   HarmShapeGain_smth;\r
     SKP_float   Tilt_smth;\r
@@ -82,8 +82,6 @@ typedef struct {
     SKP_Silk_shape_state_FLP            sShape;                     /* Noise shaping state */\r
     SKP_Silk_prefilter_state_FLP        sPrefilt;                   /* Prefilter State */\r
     SKP_Silk_predict_state_FLP          sPred;                      /* Prediction State */\r
-    SKP_Silk_nsq_state                  sNSQ;                       /* Noise Shape Quantizer State */\r
-    SKP_Silk_nsq_state                  sNSQ_LBRR;                  /* Noise Shape Quantizer State ( for low bitrate redundancy )*/\r
 \r
     /* Buffer for find pitch and noise shape analysis */\r
     SKP_float                           x_buf[ 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ];/* Buffer for find pitch and noise shape analysis */\r
@@ -104,13 +102,12 @@ typedef struct {
 /* Encoder control FLP  */\r
 /************************/\r
 typedef struct {\r
-    SKP_Silk_encoder_control    sCmn;                               /* Common struct, shared with fixed-point code */\r
-\r
     /* Prediction and coding parameters */\r
        SKP_float                                       Gains[MAX_NB_SUBFR];\r
        SKP_float                                       PredCoef[ 2 ][ MAX_LPC_ORDER ];         /* holds interpolated and final coefficients */\r
        SKP_float                                       LTPCoef[LTP_ORDER * MAX_NB_SUBFR];\r
        SKP_float                                       LTP_scale;\r
+    SKP_int                     pitchL[ MAX_NB_SUBFR ];\r
 \r
     /* Noise shaping parameters */\r
        SKP_float                                       AR1[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ];\r
index 5ed5dc8..355d7e4 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
index 83ac58c..0af6813 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
@@ -155,13 +155,13 @@ SKP_int SKP_Silk_VAD_FLP(
 void SKP_Silk_NSQ_wrapper_FLP(\r
     SKP_Silk_encoder_state_FLP      *psEnc,         /* I/O  Encoder state FLP                           */\r
     SKP_Silk_encoder_control_FLP    *psEncCtrl,     /* I/O  Encoder control FLP                         */\r
-    const SKP_float                 x[],            /* I    Prefiltered input signal                    */\r
-          SKP_int8                  q[],            /* O    Quantized pulse signal                      */\r
-    const SKP_int                   useLBRR         /* I    LBRR flag                                   */\r
+    SideInfoIndices                 *psIndices,     /* I/O  Quantization indices                        */\r
+    SKP_Silk_nsq_state              *psNSQ,         /* I/O  Noise Shaping Quantzation state             */\r
+          SKP_int8                  pulses[],       /* O    Quantized pulse signal                      */\r
+    const SKP_float                 x[]             /* I    Prefiltered input signal                    */\r
 )\r
 {\r
     SKP_int     i, j;\r
-    SKP_float   tmp_float;\r
     SKP_int16   x_16[ MAX_FRAME_LENGTH ];\r
     SKP_int32   Gains_Q16[ MAX_NB_SUBFR ];\r
     SKP_DWORD_ALIGN SKP_int16 PredCoef_Q12[ 2 ][ MAX_LPC_ORDER ];\r
@@ -169,7 +169,6 @@ void SKP_Silk_NSQ_wrapper_FLP(
     SKP_int     LTP_scale_Q14;\r
 \r
     /* Noise shaping parameters */\r
-    /* Testing */\r
     SKP_int16   AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ];\r
     SKP_int32   LF_shp_Q14[ MAX_NB_SUBFR ];         /* Packs two int16 coefficients per int32 value             */\r
     SKP_int     Lambda_Q10;\r
@@ -204,16 +203,12 @@ void SKP_Silk_NSQ_wrapper_FLP(
     }\r
 \r
     for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) {\r
-        tmp_float = SKP_LIMIT( ( psEncCtrl->Gains[ i ] * 65536.0f ), 2147483000.0f, -2147483000.0f );\r
-        Gains_Q16[ i ] = SKP_float2int( tmp_float );\r
-        if( psEncCtrl->Gains[ i ] > 0.0f ) {\r
-            SKP_assert( tmp_float >= 0.0f );\r
-            SKP_assert( Gains_Q16[ i ] >= 0 );\r
-        }\r
+        Gains_Q16[ i ] = SKP_float2int( psEncCtrl->Gains[ i ] * 65536.0f );\r
+        SKP_assert( Gains_Q16[ i ] > 0 );\r
     }\r
 \r
-    if( psEncCtrl->sCmn.signalType == TYPE_VOICED ) {\r
-        LTP_scale_Q14 = SKP_Silk_LTPScales_table_Q14[ psEncCtrl->sCmn.LTP_scaleIndex ];\r
+    if( psIndices->signalType == TYPE_VOICED ) {\r
+        LTP_scale_Q14 = SKP_Silk_LTPScales_table_Q14[ psIndices->LTP_scaleIndex ];\r
     } else {\r
         LTP_scale_Q14 = 0;\r
     }\r
@@ -222,26 +217,12 @@ void SKP_Silk_NSQ_wrapper_FLP(
     SKP_float2short_array( x_16, x, psEnc->sCmn.frame_length );\r
 \r
     /* Call NSQ */\r
-    if( useLBRR ) {\r
-        if( psEnc->sCmn.nStatesDelayedDecision > 1 || psEnc->sCmn.warping_Q16 > 0 ) {\r
-            SKP_Silk_NSQ_del_dec( &psEnc->sCmn, &psEncCtrl->sCmn, &psEnc->sNSQ_LBRR, \r
-                x_16, q, psEncCtrl->sCmn.NLSFInterpCoef_Q2, PredCoef_Q12[ 0 ], LTPCoef_Q14, AR2_Q13, \r
-                HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, Lambda_Q10, LTP_scale_Q14 );\r
-        } else {\r
-            SKP_Silk_NSQ( &psEnc->sCmn, &psEncCtrl->sCmn, &psEnc->sNSQ_LBRR, \r
-                x_16, q, psEncCtrl->sCmn.NLSFInterpCoef_Q2, PredCoef_Q12[ 0 ], LTPCoef_Q14, AR2_Q13, \r
-                HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, Lambda_Q10, LTP_scale_Q14 );\r
-        }\r
+    if( psEnc->sCmn.nStatesDelayedDecision > 1 || psEnc->sCmn.warping_Q16 > 0 ) {\r
+        SKP_Silk_NSQ_del_dec( &psEnc->sCmn, psNSQ, psIndices, x_16, pulses, PredCoef_Q12[ 0 ], LTPCoef_Q14, \r
+            AR2_Q13, HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, psEncCtrl->pitchL, Lambda_Q10, LTP_scale_Q14 );\r
     } else {\r
-        if( psEnc->sCmn.nStatesDelayedDecision > 1 || psEnc->sCmn.warping_Q16 > 0 ) {\r
-            SKP_Silk_NSQ_del_dec( &psEnc->sCmn, &psEncCtrl->sCmn, &psEnc->sNSQ, \r
-                x_16, q, psEncCtrl->sCmn.NLSFInterpCoef_Q2, PredCoef_Q12[ 0 ], LTPCoef_Q14, AR2_Q13, \r
-                HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, Lambda_Q10, LTP_scale_Q14 );\r
-        } else {\r
-            SKP_Silk_NSQ( &psEnc->sCmn, &psEncCtrl->sCmn, &psEnc->sNSQ, \r
-                x_16, q, psEncCtrl->sCmn.NLSFInterpCoef_Q2, PredCoef_Q12[ 0 ], LTPCoef_Q14, AR2_Q13, \r
-                HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, Lambda_Q10, LTP_scale_Q14 );\r
-        }\r
+        SKP_Silk_NSQ( &psEnc->sCmn, psNSQ, psIndices, x_16, pulses, PredCoef_Q12[ 0 ], LTPCoef_Q14, \r
+            AR2_Q13, HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, psEncCtrl->pitchL, Lambda_Q10, LTP_scale_Q14 );\r
     }\r
 }\r
 \r
@@ -250,10 +231,10 @@ void SKP_Silk_NSQ_wrapper_FLP(
 /***********************************************/\r
 void SKP_Silk_quant_LTP_gains_FLP(\r
           SKP_float B[ MAX_NB_SUBFR * LTP_ORDER ],              /* I/O  (Un-)quantized LTP gains                */\r
-          SKP_int   cbk_index[ MAX_NB_SUBFR ],                  /* O    Codebook index                          */\r
-          SKP_int   *periodicity_index,                         /* O    Periodicity index                       */\r
+          SKP_int8  cbk_index[ MAX_NB_SUBFR ],                  /* O    Codebook index                          */\r
+          SKP_int8  *periodicity_index,                         /* O    Periodicity index                       */\r
     const SKP_float W[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ],  /* I    Error weights                           */\r
-    const SKP_int   mu_Q10,                                     /* I    Mu value (R/D tradeoff)     */\r
+    const SKP_int   mu_Q10,                                     /* I    Mu value (R/D tradeoff)                 */\r
     const SKP_int   lowComplexity,                              /* I    Flag for low complexity                 */\r
     const SKP_int   nb_subfr                                    /* I    number of subframes                     */\r
 )\r
index 97d8035..8e28b7e 100644 (file)
@@ -96,7 +96,6 @@
     <ClCompile Include="SKP_Silk_NLSF_MSVQ_encode_FLP.c" />\r
     <ClCompile Include="SKP_Silk_NLSF_VQ_rate_distortion_FLP.c" />\r
     <ClCompile Include="SKP_Silk_NLSF_VQ_sum_error_FLP.c" />\r
-    <ClCompile Include="SKP_Silk_NLSF_VQ_weights_laroia_FLP.c" />\r
     <ClCompile Include="SKP_Silk_noise_shape_analysis_FLP.c" />\r
     <ClCompile Include="SKP_Silk_prefilter_FLP.c" />\r
     <ClCompile Include="SKP_Silk_process_gains_FLP.c" />\r
index eb30f7f..781af93 100644 (file)
@@ -80,9 +80,6 @@
     <ClCompile Include="SKP_Silk_NLSF_VQ_sum_error_FLP.c">\r
       <Filter>Source Files</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="SKP_Silk_NLSF_VQ_weights_laroia_FLP.c">\r
-      <Filter>Source Files</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="SKP_Silk_noise_shape_analysis_FLP.c">\r
       <Filter>Source Files</Filter>\r
     </ClCompile>\r
index d098ae1..e2e0e29 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
index 6eb0bb1..88a2046 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
diff --git a/src_SigProc_FIX/SKP_Silk_LPC_analysis_filter.c b/src_SigProc_FIX/SKP_Silk_LPC_analysis_filter.c
new file mode 100644 (file)
index 0000000..6029ae6
--- /dev/null
@@ -0,0 +1,79 @@
+/***********************************************************************\r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
+Redistribution and use in source and binary forms, with or without \r
+modification, (subject to the limitations in the disclaimer below) \r
+are permitted provided that the following conditions are met:\r
+- Redistributions of source code must retain the above copyright notice,\r
+this list of conditions and the following disclaimer.\r
+- Redistributions in binary form must reproduce the above copyright \r
+notice, this list of conditions and the following disclaimer in the \r
+documentation and/or other materials provided with the distribution.\r
+- Neither the name of Skype Limited, nor the names of specific \r
+contributors, may be used to endorse or promote products derived from \r
+this software without specific prior written permission.\r
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED \r
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND \r
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,\r
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND \r
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE \r
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, \r
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\r
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF \r
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON \r
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+***********************************************************************/\r
+\r
+#include "SKP_Silk_SigProc_FIX.h"\r
+\r
+/*******************************************/\r
+/* LPC analysis filter                     */\r
+/* NB! State is kept internally and the    */\r
+/* filter always starts with zero state    */\r
+/* first Order output samples are not set  */\r
+/*******************************************/\r
+\r
+void SKP_Silk_LPC_analysis_filter(\r
+    SKP_int16            *out,           /* O:   Output signal                               */\r
+    const SKP_int16      *in,            /* I:   Input signal                                */\r
+    const SKP_int16      *B,             /* I:   MA prediction coefficients, Q12 [order]     */\r
+    const SKP_int32      len,            /* I:   Signal length                               */\r
+    const SKP_int32      d               /* I:   Filter order                                */\r
+)\r
+{\r
+    SKP_int         ix, j;\r
+    SKP_int32       out32_Q12, out32;\r
+    const SKP_int16 *in_ptr;\r
+\r
+    SKP_assert( d >= 6 );\r
+    SKP_assert( (d & 1) == 0 );\r
+    SKP_assert( d <= len );\r
+\r
+    for ( ix = d; ix < len; ix++) {\r
+        in_ptr = &in[ ix - 1 ];\r
+\r
+        out32_Q12 = SKP_SMULBB(            in_ptr[  0 ], B[ 0 ] );\r
+        out32_Q12 = SKP_SMLABB( out32_Q12, in_ptr[ -1 ], B[ 1 ] );\r
+        out32_Q12 = SKP_SMLABB( out32_Q12, in_ptr[ -2 ], B[ 2 ] );\r
+        out32_Q12 = SKP_SMLABB( out32_Q12, in_ptr[ -3 ], B[ 3 ] );\r
+        out32_Q12 = SKP_SMLABB( out32_Q12, in_ptr[ -4 ], B[ 4 ] );\r
+        out32_Q12 = SKP_SMLABB( out32_Q12, in_ptr[ -5 ], B[ 5 ] );\r
+        for( j = 6; j < d; j += 2 ) {\r
+            out32_Q12 = SKP_SMLABB( out32_Q12, in_ptr[ -j     ], B[ j     ] );\r
+            out32_Q12 = SKP_SMLABB( out32_Q12, in_ptr[ -j - 1 ], B[ j + 1 ] );\r
+        }\r
+\r
+        /* Subtract prediction */\r
+        out32_Q12 = SKP_SUB32( SKP_LSHIFT( (SKP_int32)in_ptr[ 1 ], 12 ), out32_Q12 );\r
+\r
+        /* Scale to Q0 */\r
+        out32 = SKP_RSHIFT_ROUND( out32_Q12, 12 );\r
+\r
+        /* Saturate output */\r
+        out[ ix ] = ( SKP_int16 )SKP_SAT16( out32 );\r
+    }\r
+\r
+    /* Set first LPC d samples to zero instead of undefined */\r
+    SKP_memset( out, 0, d * sizeof( SKP_int16 ) );\r
+}\r
index d274fb4..06aaa19 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
index e1dc7db..3dd5847 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
index c7916f3..e5f8d24 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
index 2b9c6a4..82d8afd 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
index 099324f..1fc87a7 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
diff --git a/src_SigProc_FIX/SKP_Silk_MA.c b/src_SigProc_FIX/SKP_Silk_MA.c
deleted file mode 100644 (file)
index 3470a92..0000000
+++ /dev/null
@@ -1,167 +0,0 @@
-/***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
-Redistribution and use in source and binary forms, with or without \r
-modification, (subject to the limitations in the disclaimer below) \r
-are permitted provided that the following conditions are met:\r
-- Redistributions of source code must retain the above copyright notice,\r
-this list of conditions and the following disclaimer.\r
-- Redistributions in binary form must reproduce the above copyright \r
-notice, this list of conditions and the following disclaimer in the \r
-documentation and/or other materials provided with the distribution.\r
-- Neither the name of Skype Limited, nor the names of specific \r
-contributors, may be used to endorse or promote products derived from \r
-this software without specific prior written permission.\r
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED \r
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND \r
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,\r
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND \r
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE \r
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, \r
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\r
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF \r
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON \r
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
-***********************************************************************/\r
-\r
-/*                                                                      *\r
- * SKP_Silk_MA.c                                                      *\r
- *                                                                      *\r
- * Variable order MA filter                                             *\r
- *                                                                      *\r
- * Copyright 2006 (c), Skype Limited                                    *\r
- * Date: 060221                                                         *\r
- *                                                                      */\r
-#include "SKP_Silk_SigProc_FIX.h"\r
-\r
-/* Variable order MA filter */\r
-void SKP_Silk_MA(\r
-    const SKP_int16      *in,            /* I:   input signal                                */\r
-    const SKP_int16      *B,             /* I:   MA coefficients, Q13 [order+1]              */\r
-    SKP_int32            *S,             /* I/O: state vector [order]                        */\r
-    SKP_int16            *out,           /* O:   output signal                               */\r
-    const SKP_int32      len,            /* I:   signal length                               */\r
-    const SKP_int32      order           /* I:   filter order                                */\r
-)\r
-{\r
-    SKP_int   k, d, in16;\r
-    SKP_int32 out32;\r
-    \r
-    for( k = 0; k < len; k++ ) {\r
-        in16 = in[ k ];\r
-        out32 = SKP_SMLABB( S[ 0 ], in16, B[ 0 ] );\r
-        out32 = SKP_RSHIFT_ROUND( out32, 13 );\r
-        \r
-        for( d = 1; d < order; d++ ) {\r
-            S[ d - 1 ] = SKP_SMLABB( S[ d ], in16, B[ d ] );\r
-        }\r
-        S[ order - 1 ] = SKP_SMULBB( in16, B[ order ] );\r
-\r
-        /* Limit */\r
-        out[ k ] = (SKP_int16)SKP_SAT16( out32 );\r
-    }\r
-}\r
-/* Variable order MA prediction error filter */\r
-void SKP_Silk_MA_Prediction(\r
-    const SKP_int16      *in,            /* I:   Input signal                                */\r
-    const SKP_int16      *B,             /* I:   MA prediction coefficients, Q12 [order]     */\r
-    SKP_int32            *S,             /* I/O: State vector [order]                        */\r
-    SKP_int16            *out,           /* O:   Output signal                               */\r
-    const SKP_int32      len,            /* I:   Signal length                               */\r
-    const SKP_int32      order           /* I:   Filter order                                */\r
-)\r
-{\r
-    SKP_int   k, d, in16;\r
-    SKP_int32 out32;\r
-\r
-    for( k = 0; k < len; k++ ) {\r
-        in16 = in[ k ];\r
-        out32 = SKP_LSHIFT( in16, 12 ) - S[ 0 ];\r
-        out32 = SKP_RSHIFT_ROUND( out32, 12 );\r
-        \r
-        for( d = 0; d < order - 1; d++ ) {\r
-            S[ d ] = SKP_SMLABB_ovflw( S[ d + 1 ], in16, B[ d ] );\r
-        }\r
-        S[ order - 1 ] = SKP_SMULBB( in16, B[ order - 1 ] );\r
-\r
-        /* Limit */\r
-        out[ k ] = (SKP_int16)SKP_SAT16( out32 );\r
-    }\r
-}\r
-\r
-void SKP_Silk_MA_Prediction_Q13(\r
-    const SKP_int16      *in,            /* I:   input signal                                */\r
-    const SKP_int16      *B,             /* I:   MA prediction coefficients, Q13 [order]     */\r
-    SKP_int32            *S,             /* I/O: state vector [order]                        */\r
-    SKP_int16            *out,           /* O:   output signal                               */\r
-    SKP_int32            len,            /* I:   signal length                               */\r
-    SKP_int32            order           /* I:   filter order                                */\r
-)\r
-{\r
-    SKP_int   k, d, in16;\r
-    SKP_int32 out32;\r
-    for( k = 0; k < len; k++ ) {\r
-        in16 = in[ k ];\r
-        out32 = SKP_LSHIFT( in16, 13 ) - S[ 0 ];\r
-        out32 = SKP_RSHIFT_ROUND( out32, 13 );\r
-        \r
-        for( d = 0; d < order - 1; d++ ) {\r
-            S[ d ] = SKP_SMLABB( S[ d + 1 ], in16, B[ d ] );\r
-        }\r
-        S[ order - 1 ] = SKP_SMULBB( in16, B[ order - 1 ] );\r
-\r
-        /* Limit */\r
-        out[ k ] = ( SKP_int16 )SKP_SAT16( out32 );\r
-    }\r
-}\r
-\r
-void SKP_Silk_LPC_analysis_filter(\r
-    const SKP_int16      *in,            /* I:   Input signal                                */\r
-    const SKP_int16      *B,             /* I:   MA prediction coefficients, Q12 [order]     */\r
-    SKP_int16            *S,             /* I/O: State vector [order]                        */\r
-    SKP_int16            *out,           /* O:   Output signal                               */\r
-    const SKP_int32      len,            /* I:   Signal length                               */\r
-    const SKP_int32      Order           /* I:   Filter order                                */\r
-)\r
-{\r
-    SKP_int   k, j, idx, Order_half = SKP_RSHIFT( Order, 1 );\r
-    SKP_int32 out32_Q12, out32;\r
-    SKP_int16 SA, SB;\r
-    /* Order must be even */\r
-    SKP_assert( 2 * Order_half == Order );\r
-\r
-    /* S[] values are in Q0 */\r
-    for( k = 0; k < len; k++ ) {\r
-        SA = S[ 0 ];\r
-        out32_Q12 = 0;\r
-        for( j = 0; j < ( Order_half - 1 ); j++ ) {\r
-            idx = SKP_SMULBB( 2, j ) + 1;\r
-            /* Multiply-add two prediction coefficients for each loop */\r
-            SB = S[ idx ];\r
-            S[ idx ] = SA;\r
-            out32_Q12 = SKP_SMLABB( out32_Q12, SA, B[ idx - 1 ] );\r
-            out32_Q12 = SKP_SMLABB( out32_Q12, SB, B[ idx ] );\r
-            SA = S[ idx + 1 ];\r
-            S[ idx + 1 ] = SB;\r
-        }\r
-\r
-        /* Unrolled loop: epilog */\r
-        SB = S[ Order - 1 ];\r
-        S[ Order - 1 ] = SA;\r
-        out32_Q12 = SKP_SMLABB( out32_Q12, SA, B[ Order - 2 ] );\r
-        out32_Q12 = SKP_SMLABB( out32_Q12, SB, B[ Order - 1 ] );\r
-\r
-        /* Subtract prediction */\r
-        out32_Q12 = SKP_SUB_SAT32( SKP_LSHIFT( (SKP_int32)in[ k ], 12 ), out32_Q12 );\r
-\r
-        /* Scale to Q0 */\r
-        out32 = SKP_RSHIFT_ROUND( out32_Q12, 12 );\r
-\r
-        /* Saturate output */\r
-        out[ k ] = ( SKP_int16 )SKP_SAT16( out32 );\r
-\r
-        /* Move input line */\r
-        S[ 0 ] = in[ k ];\r
-    }\r
-}\r
index 93fbe4d..be9f0d0 100644 (file)
@@ -1,3 +1,30 @@
+/***********************************************************************\r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
+Redistribution and use in source and binary forms, with or without \r
+modification, (subject to the limitations in the disclaimer below) \r
+are permitted provided that the following conditions are met:\r
+- Redistributions of source code must retain the above copyright notice,\r
+this list of conditions and the following disclaimer.\r
+- Redistributions in binary form must reproduce the above copyright \r
+notice, this list of conditions and the following disclaimer in the \r
+documentation and/or other materials provided with the distribution.\r
+- Neither the name of Skype Limited, nor the names of specific \r
+contributors, may be used to endorse or promote products derived from \r
+this software without specific prior written permission.\r
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED \r
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND \r
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,\r
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND \r
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE \r
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, \r
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\r
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF \r
+USE, DATA, OR PROFIT