diff options
Diffstat (limited to 'lib/rbcodec/codecs/libopus/silk/NLSF_decode.c')
-rw-r--r-- | lib/rbcodec/codecs/libopus/silk/NLSF_decode.c | 22 |
1 files changed, 7 insertions, 15 deletions
diff --git a/lib/rbcodec/codecs/libopus/silk/NLSF_decode.c b/lib/rbcodec/codecs/libopus/silk/NLSF_decode.c index 9f715060b8..eeb0ba8c92 100644 --- a/lib/rbcodec/codecs/libopus/silk/NLSF_decode.c +++ b/lib/rbcodec/codecs/libopus/silk/NLSF_decode.c | |||
@@ -32,7 +32,7 @@ POSSIBILITY OF SUCH DAMAGE. | |||
32 | #include "main.h" | 32 | #include "main.h" |
33 | 33 | ||
34 | /* Predictive dequantizer for NLSF residuals */ | 34 | /* Predictive dequantizer for NLSF residuals */ |
35 | static OPUS_INLINE void silk_NLSF_residual_dequant( /* O Returns RD value in Q30 */ | 35 | static OPUS_INLINE void silk_NLSF_residual_dequant( /* O Returns RD value in Q30 */ |
36 | opus_int16 x_Q10[], /* O Output [ order ] */ | 36 | opus_int16 x_Q10[], /* O Output [ order ] */ |
37 | const opus_int8 indices[], /* I Quantization indices [ order ] */ | 37 | const opus_int8 indices[], /* I Quantization indices [ order ] */ |
38 | const opus_uint8 pred_coef_Q8[], /* I Backward predictor coefs [ order ] */ | 38 | const opus_uint8 pred_coef_Q8[], /* I Backward predictor coefs [ order ] */ |
@@ -70,15 +70,9 @@ void silk_NLSF_decode( | |||
70 | opus_uint8 pred_Q8[ MAX_LPC_ORDER ]; | 70 | opus_uint8 pred_Q8[ MAX_LPC_ORDER ]; |
71 | opus_int16 ec_ix[ MAX_LPC_ORDER ]; | 71 | opus_int16 ec_ix[ MAX_LPC_ORDER ]; |
72 | opus_int16 res_Q10[ MAX_LPC_ORDER ]; | 72 | opus_int16 res_Q10[ MAX_LPC_ORDER ]; |
73 | opus_int16 W_tmp_QW[ MAX_LPC_ORDER ]; | 73 | opus_int32 NLSF_Q15_tmp; |
74 | opus_int32 W_tmp_Q9, NLSF_Q15_tmp; | ||
75 | const opus_uint8 *pCB_element; | 74 | const opus_uint8 *pCB_element; |
76 | 75 | const opus_int16 *pCB_Wght_Q9; | |
77 | /* Decode first stage */ | ||
78 | pCB_element = &psNLSF_CB->CB1_NLSF_Q8[ NLSFIndices[ 0 ] * psNLSF_CB->order ]; | ||
79 | for( i = 0; i < psNLSF_CB->order; i++ ) { | ||
80 | pNLSF_Q15[ i ] = silk_LSHIFT( (opus_int16)pCB_element[ i ], 7 ); | ||
81 | } | ||
82 | 76 | ||
83 | /* Unpack entropy table indices and predictor for current CB1 index */ | 77 | /* Unpack entropy table indices and predictor for current CB1 index */ |
84 | silk_NLSF_unpack( ec_ix, pred_Q8, psNLSF_CB, NLSFIndices[ 0 ] ); | 78 | silk_NLSF_unpack( ec_ix, pred_Q8, psNLSF_CB, NLSFIndices[ 0 ] ); |
@@ -86,13 +80,11 @@ void silk_NLSF_decode( | |||
86 | /* Predictive residual dequantizer */ | 80 | /* Predictive residual dequantizer */ |
87 | silk_NLSF_residual_dequant( res_Q10, &NLSFIndices[ 1 ], pred_Q8, psNLSF_CB->quantStepSize_Q16, psNLSF_CB->order ); | 81 | silk_NLSF_residual_dequant( res_Q10, &NLSFIndices[ 1 ], pred_Q8, psNLSF_CB->quantStepSize_Q16, psNLSF_CB->order ); |
88 | 82 | ||
89 | /* Weights from codebook vector */ | 83 | /* Apply inverse square-rooted weights to first stage and add to output */ |
90 | silk_NLSF_VQ_weights_laroia( W_tmp_QW, pNLSF_Q15, psNLSF_CB->order ); | 84 | pCB_element = &psNLSF_CB->CB1_NLSF_Q8[ NLSFIndices[ 0 ] * psNLSF_CB->order ]; |
91 | 85 | pCB_Wght_Q9 = &psNLSF_CB->CB1_Wght_Q9[ NLSFIndices[ 0 ] * psNLSF_CB->order ]; | |
92 | /* Apply inverse square-rooted weights and add to output */ | ||
93 | for( i = 0; i < psNLSF_CB->order; i++ ) { | 86 | for( i = 0; i < psNLSF_CB->order; i++ ) { |
94 | W_tmp_Q9 = silk_SQRT_APPROX( silk_LSHIFT( (opus_int32)W_tmp_QW[ i ], 18 - NLSF_W_Q ) ); | 87 | NLSF_Q15_tmp = silk_ADD_LSHIFT32( silk_DIV32_16( silk_LSHIFT( (opus_int32)res_Q10[ i ], 14 ), pCB_Wght_Q9[ i ] ), (opus_int16)pCB_element[ i ], 7 ); |
95 | NLSF_Q15_tmp = silk_ADD32( pNLSF_Q15[ i ], silk_DIV32_16( silk_LSHIFT( (opus_int32)res_Q10[ i ], 14 ), W_tmp_Q9 ) ); | ||
96 | pNLSF_Q15[ i ] = (opus_int16)silk_LIMIT( NLSF_Q15_tmp, 0, 32767 ); | 88 | pNLSF_Q15[ i ] = (opus_int16)silk_LIMIT( NLSF_Q15_tmp, 0, 32767 ); |
97 | } | 89 | } |
98 | 90 | ||