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