13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*********************************************************************** 23c827367444ee418f129b2c238299f49d3264554Jarkko PoyryCopyright (c) 2006-2011, Skype Limited. All rights reserved. 33c827367444ee418f129b2c238299f49d3264554Jarkko PoyryRedistribution and use in source and binary forms, with or without 43c827367444ee418f129b2c238299f49d3264554Jarkko Poyrymodification, are permitted provided that the following conditions 53c827367444ee418f129b2c238299f49d3264554Jarkko Poyryare met: 63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry- Redistributions of source code must retain the above copyright notice, 73c827367444ee418f129b2c238299f49d3264554Jarkko Poyrythis list of conditions and the following disclaimer. 83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry- Redistributions in binary form must reproduce the above copyright 93c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynotice, this list of conditions and the following disclaimer in the 103c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydocumentation and/or other materials provided with the distribution. 113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry- Neither the name of Internet Society, IETF or IETF Trust, nor the 123c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynames of specific contributors, may be used to endorse or promote 133c827367444ee418f129b2c238299f49d3264554Jarkko Poyryproducts derived from this software without specific prior written 143c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypermission. 153c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 163c827367444ee418f129b2c238299f49d3264554Jarkko PoyryAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 173c827367444ee418f129b2c238299f49d3264554Jarkko PoyryIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 183c827367444ee418f129b2c238299f49d3264554Jarkko PoyryARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 193c827367444ee418f129b2c238299f49d3264554Jarkko PoyryLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 203c827367444ee418f129b2c238299f49d3264554Jarkko PoyryCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 213c827367444ee418f129b2c238299f49d3264554Jarkko PoyrySUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 223c827367444ee418f129b2c238299f49d3264554Jarkko PoyryINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 233c827367444ee418f129b2c238299f49d3264554Jarkko PoyryCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 243c827367444ee418f129b2c238299f49d3264554Jarkko PoyryARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 253c827367444ee418f129b2c238299f49d3264554Jarkko PoyryPOSSIBILITY OF SUCH DAMAGE. 263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry***********************************************************************/ 273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#ifdef HAVE_CONFIG_H 293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "config.h" 303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif 313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "main.h" 333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/* Delayed-decision quantizer for NLSF residuals */ 353c827367444ee418f129b2c238299f49d3264554Jarkko Poyryopus_int32 silk_NLSF_del_dec_quant( /* O Returns RD value in Q25 */ 363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry opus_int8 indices[], /* O Quantization indices [ order ] */ 373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const opus_int16 x_Q10[], /* I Input [ order ] */ 383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const opus_int16 w_Q5[], /* I Weights [ order ] */ 393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const opus_uint8 pred_coef_Q8[], /* I Backward predictor coefs [ order ] */ 403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const opus_int16 ec_ix[], /* I Indices to entropy coding tables [ order ] */ 413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const opus_uint8 ec_rates_Q5[], /* I Rates [] */ 423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const opus_int quant_step_size_Q16, /* I Quantization step size */ 433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const opus_int16 inv_quant_step_size_Q6, /* I Inverse quantization step size */ 443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const opus_int32 mu_Q20, /* I R/D tradeoff */ 453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const opus_int16 order /* I Number of input values */ 463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry) 473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry opus_int i, j, nStates, ind_tmp, ind_min_max, ind_max_min, in_Q10, res_Q10; 493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry opus_int pred_Q10, diff_Q10, out0_Q10, out1_Q10, rate0_Q5, rate1_Q5; 503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry opus_int32 RD_tmp_Q25, min_Q25, min_max_Q25, max_min_Q25, pred_coef_Q16; 513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry opus_int ind_sort[ NLSF_QUANT_DEL_DEC_STATES ]; 523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry opus_int8 ind[ NLSF_QUANT_DEL_DEC_STATES ][ MAX_LPC_ORDER ]; 533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry opus_int16 prev_out_Q10[ 2 * NLSF_QUANT_DEL_DEC_STATES ]; 543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry opus_int32 RD_Q25[ 2 * NLSF_QUANT_DEL_DEC_STATES ]; 553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry opus_int32 RD_min_Q25[ NLSF_QUANT_DEL_DEC_STATES ]; 563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry opus_int32 RD_max_Q25[ NLSF_QUANT_DEL_DEC_STATES ]; 573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const opus_uint8 *rates_Q5; 583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry silk_assert( (NLSF_QUANT_DEL_DEC_STATES & (NLSF_QUANT_DEL_DEC_STATES-1)) == 0 ); /* must be power of two */ 603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry nStates = 1; 623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry RD_Q25[ 0 ] = 0; 633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry prev_out_Q10[ 0 ] = 0; 643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for( i = order - 1; ; i-- ) { 653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry rates_Q5 = &ec_rates_Q5[ ec_ix[ i ] ]; 663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry pred_coef_Q16 = silk_LSHIFT( (opus_int32)pred_coef_Q8[ i ], 8 ); 673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry in_Q10 = x_Q10[ i ]; 683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for( j = 0; j < nStates; j++ ) { 693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry pred_Q10 = silk_SMULWB( pred_coef_Q16, prev_out_Q10[ j ] ); 703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry res_Q10 = silk_SUB16( in_Q10, pred_Q10 ); 713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ind_tmp = silk_SMULWB( (opus_int32)inv_quant_step_size_Q6, res_Q10 ); 723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ind_tmp = silk_LIMIT( ind_tmp, -NLSF_QUANT_MAX_AMPLITUDE_EXT, NLSF_QUANT_MAX_AMPLITUDE_EXT-1 ); 733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ind[ j ][ i ] = (opus_int8)ind_tmp; 743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry /* compute outputs for ind_tmp and ind_tmp + 1 */ 763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry out0_Q10 = silk_LSHIFT( ind_tmp, 10 ); 773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry out1_Q10 = silk_ADD16( out0_Q10, 1024 ); 783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if( ind_tmp > 0 ) { 793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry out0_Q10 = silk_SUB16( out0_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) ); 803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry out1_Q10 = silk_SUB16( out1_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) ); 813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } else if( ind_tmp == 0 ) { 823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry out1_Q10 = silk_SUB16( out1_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) ); 833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } else if( ind_tmp == -1 ) { 843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry out0_Q10 = silk_ADD16( out0_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) ); 853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } else { 863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry out0_Q10 = silk_ADD16( out0_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) ); 873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry out1_Q10 = silk_ADD16( out1_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) ); 883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry out0_Q10 = silk_SMULWB( (opus_int32)out0_Q10, quant_step_size_Q16 ); 903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry out1_Q10 = silk_SMULWB( (opus_int32)out1_Q10, quant_step_size_Q16 ); 913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry out0_Q10 = silk_ADD16( out0_Q10, pred_Q10 ); 923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry out1_Q10 = silk_ADD16( out1_Q10, pred_Q10 ); 933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry prev_out_Q10[ j ] = out0_Q10; 943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry prev_out_Q10[ j + nStates ] = out1_Q10; 953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry /* compute RD for ind_tmp and ind_tmp + 1 */ 973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if( ind_tmp + 1 >= NLSF_QUANT_MAX_AMPLITUDE ) { 983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if( ind_tmp + 1 == NLSF_QUANT_MAX_AMPLITUDE ) { 993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry rate0_Q5 = rates_Q5[ ind_tmp + NLSF_QUANT_MAX_AMPLITUDE ]; 1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry rate1_Q5 = 280; 1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } else { 1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry rate0_Q5 = silk_SMLABB( 280 - 43 * NLSF_QUANT_MAX_AMPLITUDE, 43, ind_tmp ); 1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry rate1_Q5 = silk_ADD16( rate0_Q5, 43 ); 1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } else if( ind_tmp <= -NLSF_QUANT_MAX_AMPLITUDE ) { 1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if( ind_tmp == -NLSF_QUANT_MAX_AMPLITUDE ) { 1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry rate0_Q5 = 280; 1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry rate1_Q5 = rates_Q5[ ind_tmp + 1 + NLSF_QUANT_MAX_AMPLITUDE ]; 1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } else { 1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry rate0_Q5 = silk_SMLABB( 280 - 43 * NLSF_QUANT_MAX_AMPLITUDE, -43, ind_tmp ); 1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry rate1_Q5 = silk_SUB16( rate0_Q5, 43 ); 1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } else { 1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry rate0_Q5 = rates_Q5[ ind_tmp + NLSF_QUANT_MAX_AMPLITUDE ]; 1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry rate1_Q5 = rates_Q5[ ind_tmp + 1 + NLSF_QUANT_MAX_AMPLITUDE ]; 1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry RD_tmp_Q25 = RD_Q25[ j ]; 1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry diff_Q10 = silk_SUB16( in_Q10, out0_Q10 ); 1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry RD_Q25[ j ] = silk_SMLABB( silk_MLA( RD_tmp_Q25, silk_SMULBB( diff_Q10, diff_Q10 ), w_Q5[ i ] ), mu_Q20, rate0_Q5 ); 1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry diff_Q10 = silk_SUB16( in_Q10, out1_Q10 ); 1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry RD_Q25[ j + nStates ] = silk_SMLABB( silk_MLA( RD_tmp_Q25, silk_SMULBB( diff_Q10, diff_Q10 ), w_Q5[ i ] ), mu_Q20, rate1_Q5 ); 1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if( nStates <= ( NLSF_QUANT_DEL_DEC_STATES >> 1 ) ) { 1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry /* double number of states and copy */ 1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for( j = 0; j < nStates; j++ ) { 1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ind[ j + nStates ][ i ] = ind[ j ][ i ] + 1; 1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry nStates = silk_LSHIFT( nStates, 1 ); 1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for( j = nStates; j < NLSF_QUANT_DEL_DEC_STATES; j++ ) { 1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ind[ j ][ i ] = ind[ j - nStates ][ i ]; 1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } else if( i > 0 ) { 1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry /* sort lower and upper half of RD_Q25, pairwise */ 1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for( j = 0; j < NLSF_QUANT_DEL_DEC_STATES; j++ ) { 1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if( RD_Q25[ j ] > RD_Q25[ j + NLSF_QUANT_DEL_DEC_STATES ] ) { 1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry RD_max_Q25[ j ] = RD_Q25[ j ]; 1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry RD_min_Q25[ j ] = RD_Q25[ j + NLSF_QUANT_DEL_DEC_STATES ]; 1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry RD_Q25[ j ] = RD_min_Q25[ j ]; 1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry RD_Q25[ j + NLSF_QUANT_DEL_DEC_STATES ] = RD_max_Q25[ j ]; 1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry /* swap prev_out values */ 142 out0_Q10 = prev_out_Q10[ j ]; 143 prev_out_Q10[ j ] = prev_out_Q10[ j + NLSF_QUANT_DEL_DEC_STATES ]; 144 prev_out_Q10[ j + NLSF_QUANT_DEL_DEC_STATES ] = out0_Q10; 145 ind_sort[ j ] = j + NLSF_QUANT_DEL_DEC_STATES; 146 } else { 147 RD_min_Q25[ j ] = RD_Q25[ j ]; 148 RD_max_Q25[ j ] = RD_Q25[ j + NLSF_QUANT_DEL_DEC_STATES ]; 149 ind_sort[ j ] = j; 150 } 151 } 152 /* compare the highest RD values of the winning half with the lowest one in the losing half, and copy if necessary */ 153 /* afterwards ind_sort[] will contain the indices of the NLSF_QUANT_DEL_DEC_STATES winning RD values */ 154 while( 1 ) { 155 min_max_Q25 = silk_int32_MAX; 156 max_min_Q25 = 0; 157 ind_min_max = 0; 158 ind_max_min = 0; 159 for( j = 0; j < NLSF_QUANT_DEL_DEC_STATES; j++ ) { 160 if( min_max_Q25 > RD_max_Q25[ j ] ) { 161 min_max_Q25 = RD_max_Q25[ j ]; 162 ind_min_max = j; 163 } 164 if( max_min_Q25 < RD_min_Q25[ j ] ) { 165 max_min_Q25 = RD_min_Q25[ j ]; 166 ind_max_min = j; 167 } 168 } 169 if( min_max_Q25 >= max_min_Q25 ) { 170 break; 171 } 172 /* copy ind_min_max to ind_max_min */ 173 ind_sort[ ind_max_min ] = ind_sort[ ind_min_max ] ^ NLSF_QUANT_DEL_DEC_STATES; 174 RD_Q25[ ind_max_min ] = RD_Q25[ ind_min_max + NLSF_QUANT_DEL_DEC_STATES ]; 175 prev_out_Q10[ ind_max_min ] = prev_out_Q10[ ind_min_max + NLSF_QUANT_DEL_DEC_STATES ]; 176 RD_min_Q25[ ind_max_min ] = 0; 177 RD_max_Q25[ ind_min_max ] = silk_int32_MAX; 178 silk_memcpy( ind[ ind_max_min ], ind[ ind_min_max ], MAX_LPC_ORDER * sizeof( opus_int8 ) ); 179 } 180 /* increment index if it comes from the upper half */ 181 for( j = 0; j < NLSF_QUANT_DEL_DEC_STATES; j++ ) { 182 ind[ j ][ i ] += silk_RSHIFT( ind_sort[ j ], NLSF_QUANT_DEL_DEC_STATES_LOG2 ); 183 } 184 } else { /* i == 0 */ 185 break; 186 } 187 } 188 189 /* last sample: find winner, copy indices and return RD value */ 190 ind_tmp = 0; 191 min_Q25 = silk_int32_MAX; 192 for( j = 0; j < 2 * NLSF_QUANT_DEL_DEC_STATES; j++ ) { 193 if( min_Q25 > RD_Q25[ j ] ) { 194 min_Q25 = RD_Q25[ j ]; 195 ind_tmp = j; 196 } 197 } 198 for( j = 0; j < order; j++ ) { 199 indices[ j ] = ind[ ind_tmp & ( NLSF_QUANT_DEL_DEC_STATES - 1 ) ][ j ]; 200 silk_assert( indices[ j ] >= -NLSF_QUANT_MAX_AMPLITUDE_EXT ); 201 silk_assert( indices[ j ] <= NLSF_QUANT_MAX_AMPLITUDE_EXT ); 202 } 203 indices[ 0 ] += silk_RSHIFT( ind_tmp, NLSF_QUANT_DEL_DEC_STATES_LOG2 ); 204 silk_assert( indices[ 0 ] <= NLSF_QUANT_MAX_AMPLITUDE_EXT ); 205 silk_assert( min_Q25 >= 0 ); 206 return min_Q25; 207} 208