Coverage Report

Created: 2024-03-26 07:25

/src/opus/silk/NLSF_del_dec_quant.c
Line
Count
Source
1
/***********************************************************************
2
Copyright (c) 2006-2011, Skype Limited. All rights reserved.
3
Redistribution and use in source and binary forms, with or without
4
modification, are permitted provided that the following conditions
5
are met:
6
- Redistributions of source code must retain the above copyright notice,
7
this list of conditions and the following disclaimer.
8
- Redistributions in binary form must reproduce the above copyright
9
notice, this list of conditions and the following disclaimer in the
10
documentation and/or other materials provided with the distribution.
11
- Neither the name of Internet Society, IETF or IETF Trust, nor the
12
names of specific contributors, may be used to endorse or promote
13
products derived from this software without specific prior written
14
permission.
15
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25
POSSIBILITY OF SUCH DAMAGE.
26
***********************************************************************/
27
28
#ifdef HAVE_CONFIG_H
29
#include "config.h"
30
#endif
31
32
#include "main.h"
33
34
/* Delayed-decision quantizer for NLSF residuals */
35
opus_int32 silk_NLSF_del_dec_quant(                             /* O    Returns RD value in Q25                     */
36
    opus_int8                   indices[],                      /* O    Quantization indices [ order ]              */
37
    const opus_int16            x_Q10[],                        /* I    Input [ order ]                             */
38
    const opus_int16            w_Q5[],                         /* I    Weights [ order ]                           */
39
    const opus_uint8            pred_coef_Q8[],                 /* I    Backward predictor coefs [ order ]          */
40
    const opus_int16            ec_ix[],                        /* I    Indices to entropy coding tables [ order ]  */
41
    const opus_uint8            ec_rates_Q5[],                  /* I    Rates []                                    */
42
    const opus_int              quant_step_size_Q16,            /* I    Quantization step size                      */
43
    const opus_int16            inv_quant_step_size_Q6,         /* I    Inverse quantization step size              */
44
    const opus_int32            mu_Q20,                         /* I    R/D tradeoff                                */
45
    const opus_int16            order                           /* I    Number of input values                      */
46
)
47
111M
{
48
111M
    opus_int         i, j, nStates, ind_tmp, ind_min_max, ind_max_min, in_Q10, res_Q10;
49
111M
    opus_int         pred_Q10, diff_Q10, rate0_Q5, rate1_Q5;
50
111M
    opus_int16       out0_Q10, out1_Q10;
51
111M
    opus_int32       RD_tmp_Q25, min_Q25, min_max_Q25, max_min_Q25;
52
111M
    opus_int         ind_sort[         NLSF_QUANT_DEL_DEC_STATES ];
53
111M
    opus_int8        ind[              NLSF_QUANT_DEL_DEC_STATES ][ MAX_LPC_ORDER ];
54
111M
    opus_int16       prev_out_Q10[ 2 * NLSF_QUANT_DEL_DEC_STATES ];
55
111M
    opus_int32       RD_Q25[       2 * NLSF_QUANT_DEL_DEC_STATES ];
56
111M
    opus_int32       RD_min_Q25[       NLSF_QUANT_DEL_DEC_STATES ];
57
111M
    opus_int32       RD_max_Q25[       NLSF_QUANT_DEL_DEC_STATES ];
58
111M
    const opus_uint8 *rates_Q5;
59
60
111M
    opus_int out0_Q10_table[2 * NLSF_QUANT_MAX_AMPLITUDE_EXT];
61
111M
    opus_int out1_Q10_table[2 * NLSF_QUANT_MAX_AMPLITUDE_EXT];
62
63
2.34G
    for (i = -NLSF_QUANT_MAX_AMPLITUDE_EXT; i <= NLSF_QUANT_MAX_AMPLITUDE_EXT-1; i++)
64
2.22G
    {
65
2.22G
        out0_Q10 = silk_LSHIFT( i, 10 );
66
2.22G
        out1_Q10 = silk_ADD16( out0_Q10, 1024 );
67
2.22G
        if( i > 0 ) {
68
1.00G
            out0_Q10 = silk_SUB16( out0_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) );
69
1.00G
            out1_Q10 = silk_SUB16( out1_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) );
70
1.22G
        } else if( i == 0 ) {
71
111M
            out1_Q10 = silk_SUB16( out1_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) );
72
1.11G
        } else if( i == -1 ) {
73
111M
            out0_Q10 = silk_ADD16( out0_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) );
74
1.00G
        } else {
75
1.00G
            out0_Q10 = silk_ADD16( out0_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) );
76
1.00G
            out1_Q10 = silk_ADD16( out1_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) );
77
1.00G
        }
78
2.22G
        out0_Q10_table[ i + NLSF_QUANT_MAX_AMPLITUDE_EXT ] = silk_RSHIFT( silk_SMULBB( out0_Q10, quant_step_size_Q16 ), 16 );
79
2.22G
        out1_Q10_table[ i + NLSF_QUANT_MAX_AMPLITUDE_EXT ] = silk_RSHIFT( silk_SMULBB( out1_Q10, quant_step_size_Q16 ), 16 );
80
2.22G
    }
81
82
111M
    silk_assert( (NLSF_QUANT_DEL_DEC_STATES & (NLSF_QUANT_DEL_DEC_STATES-1)) == 0 );     /* must be power of two */
83
84
111M
    nStates = 1;
85
111M
    RD_Q25[ 0 ] = 0;
86
111M
    prev_out_Q10[ 0 ] = 0;
87
1.34G
    for( i = order - 1; i >= 0; i-- ) {
88
1.23G
        rates_Q5 = &ec_rates_Q5[ ec_ix[ i ] ];
89
1.23G
        in_Q10 = x_Q10[ i ];
90
5.61G
        for( j = 0; j < nStates; j++ ) {
91
4.38G
            pred_Q10 = silk_RSHIFT( silk_SMULBB( (opus_int16)pred_coef_Q8[ i ], prev_out_Q10[ j ] ), 8 );
92
4.38G
            res_Q10  = silk_SUB16( in_Q10, pred_Q10 );
93
4.38G
            ind_tmp  = silk_RSHIFT( silk_SMULBB( inv_quant_step_size_Q6, res_Q10 ), 16 );
94
4.38G
            ind_tmp  = silk_LIMIT( ind_tmp, -NLSF_QUANT_MAX_AMPLITUDE_EXT, NLSF_QUANT_MAX_AMPLITUDE_EXT-1 );
95
4.38G
            ind[ j ][ i ] = (opus_int8)ind_tmp;
96
97
            /* compute outputs for ind_tmp and ind_tmp + 1 */
98
4.38G
            out0_Q10 = out0_Q10_table[ ind_tmp + NLSF_QUANT_MAX_AMPLITUDE_EXT ];
99
4.38G
            out1_Q10 = out1_Q10_table[ ind_tmp + NLSF_QUANT_MAX_AMPLITUDE_EXT ];
100
101
4.38G
            out0_Q10  = silk_ADD16( out0_Q10, pred_Q10 );
102
4.38G
            out1_Q10  = silk_ADD16( out1_Q10, pred_Q10 );
103
4.38G
            prev_out_Q10[ j           ] = out0_Q10;
104
4.38G
            prev_out_Q10[ j + nStates ] = out1_Q10;
105
106
            /* compute RD for ind_tmp and ind_tmp + 1 */
107
4.38G
            if( ind_tmp + 1 >= NLSF_QUANT_MAX_AMPLITUDE ) {
108
1.94M
                if( ind_tmp + 1 == NLSF_QUANT_MAX_AMPLITUDE ) {
109
1.42M
                    rate0_Q5 = rates_Q5[ ind_tmp + NLSF_QUANT_MAX_AMPLITUDE ];
110
1.42M
                    rate1_Q5 = 280;
111
1.42M
                } else {
112
527k
                    rate0_Q5 = silk_SMLABB( 280 - 43 * NLSF_QUANT_MAX_AMPLITUDE, 43, ind_tmp );
113
527k
                    rate1_Q5 = silk_ADD16( rate0_Q5, 43 );
114
527k
                }
115
4.38G
            } else if( ind_tmp <= -NLSF_QUANT_MAX_AMPLITUDE ) {
116
2.92M
                if( ind_tmp == -NLSF_QUANT_MAX_AMPLITUDE ) {
117
1.59M
                    rate0_Q5 = 280;
118
1.59M
                    rate1_Q5 = rates_Q5[ ind_tmp + 1 + NLSF_QUANT_MAX_AMPLITUDE ];
119
1.59M
                } else {
120
1.32M
                    rate0_Q5 = silk_SMLABB( 280 - 43 * NLSF_QUANT_MAX_AMPLITUDE, -43, ind_tmp );
121
1.32M
                    rate1_Q5 = silk_SUB16( rate0_Q5, 43 );
122
1.32M
                }
123
4.37G
            } else {
124
4.37G
                rate0_Q5 = rates_Q5[ ind_tmp +     NLSF_QUANT_MAX_AMPLITUDE ];
125
4.37G
                rate1_Q5 = rates_Q5[ ind_tmp + 1 + NLSF_QUANT_MAX_AMPLITUDE ];
126
4.37G
            }
127
4.38G
            RD_tmp_Q25            = RD_Q25[ j ];
128
4.38G
            diff_Q10              = silk_SUB16( in_Q10, out0_Q10 );
129
4.38G
            RD_Q25[ j ]           = silk_SMLABB( silk_MLA( RD_tmp_Q25, silk_SMULBB( diff_Q10, diff_Q10 ), w_Q5[ i ] ), mu_Q20, rate0_Q5 );
130
4.38G
            diff_Q10              = silk_SUB16( in_Q10, out1_Q10 );
131
4.38G
            RD_Q25[ j + nStates ] = silk_SMLABB( silk_MLA( RD_tmp_Q25, silk_SMULBB( diff_Q10, diff_Q10 ), w_Q5[ i ] ), mu_Q20, rate1_Q5 );
132
4.38G
        }
133
134
1.23G
        if( nStates <= NLSF_QUANT_DEL_DEC_STATES/2 ) {
135
            /* double number of states and copy */
136
557M
            for( j = 0; j < nStates; j++ ) {
137
334M
                ind[ j + nStates ][ i ] = ind[ j ][ i ] + 1;
138
334M
            }
139
222M
            nStates = silk_LSHIFT( nStates, 1 );
140
445M
            for( j = nStates; j < NLSF_QUANT_DEL_DEC_STATES; j++ ) {
141
222M
                ind[ j ][ i ] = ind[ j - nStates ][ i ];
142
222M
            }
143
1.01G
        } else {
144
            /* sort lower and upper half of RD_Q25, pairwise */
145
5.05G
            for( j = 0; j < NLSF_QUANT_DEL_DEC_STATES; j++ ) {
146
4.04G
                if( RD_Q25[ j ] > RD_Q25[ j + NLSF_QUANT_DEL_DEC_STATES ] ) {
147
2.06G
                    RD_max_Q25[ j ]                         = RD_Q25[ j ];
148
2.06G
                    RD_min_Q25[ j ]                         = RD_Q25[ j + NLSF_QUANT_DEL_DEC_STATES ];
149
2.06G
                    RD_Q25[ j ]                             = RD_min_Q25[ j ];
150
2.06G
                    RD_Q25[ j + NLSF_QUANT_DEL_DEC_STATES ] = RD_max_Q25[ j ];
151
                    /* swap prev_out values */
152
2.06G
                    out0_Q10 = prev_out_Q10[ j ];
153
2.06G
                    prev_out_Q10[ j ] = prev_out_Q10[ j + NLSF_QUANT_DEL_DEC_STATES ];
154
2.06G
                    prev_out_Q10[ j + NLSF_QUANT_DEL_DEC_STATES ] = out0_Q10;
155
2.06G
                    ind_sort[ j ] = j + NLSF_QUANT_DEL_DEC_STATES;
156
2.06G
                } else {
157
1.98G
                    RD_min_Q25[ j ] = RD_Q25[ j ];
158
1.98G
                    RD_max_Q25[ j ] = RD_Q25[ j + NLSF_QUANT_DEL_DEC_STATES ];
159
1.98G
                    ind_sort[ j ] = j;
160
1.98G
                }
161
4.04G
            }
162
            /* compare the highest RD values of the winning half with the lowest one in the losing half, and copy if necessary */
163
            /* afterwards ind_sort[] will contain the indices of the NLSF_QUANT_DEL_DEC_STATES winning RD values */
164
1.71G
            while( 1 ) {
165
1.71G
                min_max_Q25 = silk_int32_MAX;
166
1.71G
                max_min_Q25 = 0;
167
1.71G
                ind_min_max = 0;
168
1.71G
                ind_max_min = 0;
169
8.59G
                for( j = 0; j < NLSF_QUANT_DEL_DEC_STATES; j++ ) {
170
6.87G
                    if( min_max_Q25 > RD_max_Q25[ j ] ) {
171
3.14G
                        min_max_Q25 = RD_max_Q25[ j ];
172
3.14G
                        ind_min_max = j;
173
3.14G
                    }
174
6.87G
                    if( max_min_Q25 < RD_min_Q25[ j ] ) {
175
3.59G
                        max_min_Q25 = RD_min_Q25[ j ];
176
3.59G
                        ind_max_min = j;
177
3.59G
                    }
178
6.87G
                }
179
1.71G
                if( min_max_Q25 >= max_min_Q25 ) {
180
1.01G
                    break;
181
1.01G
                }
182
                /* copy ind_min_max to ind_max_min */
183
707M
                ind_sort[     ind_max_min ] = ind_sort[     ind_min_max ] ^ NLSF_QUANT_DEL_DEC_STATES;
184
707M
                RD_Q25[       ind_max_min ] = RD_Q25[       ind_min_max + NLSF_QUANT_DEL_DEC_STATES ];
185
707M
                prev_out_Q10[ ind_max_min ] = prev_out_Q10[ ind_min_max + NLSF_QUANT_DEL_DEC_STATES ];
186
707M
                RD_min_Q25[   ind_max_min ] = 0;
187
707M
                RD_max_Q25[   ind_min_max ] = silk_int32_MAX;
188
707M
                silk_memcpy( ind[ ind_max_min ], ind[ ind_min_max ], MAX_LPC_ORDER * sizeof( opus_int8 ) );
189
707M
            }
190
            /* increment index if it comes from the upper half */
191
5.05G
            for( j = 0; j < NLSF_QUANT_DEL_DEC_STATES; j++ ) {
192
4.04G
                ind[ j ][ i ] += silk_RSHIFT( ind_sort[ j ], NLSF_QUANT_DEL_DEC_STATES_LOG2 );
193
4.04G
            }
194
1.01G
        }
195
1.23G
    }
196
197
    /* last sample: find winner, copy indices and return RD value */
198
111M
    ind_tmp = 0;
199
111M
    min_Q25 = silk_int32_MAX;
200
1.00G
    for( j = 0; j < 2 * NLSF_QUANT_DEL_DEC_STATES; j++ ) {
201
891M
        if( min_Q25 > RD_Q25[ j ] ) {
202
216M
            min_Q25 = RD_Q25[ j ];
203
216M
            ind_tmp = j;
204
216M
        }
205
891M
    }
206
1.34G
    for( j = 0; j < order; j++ ) {
207
1.23G
        indices[ j ] = ind[ ind_tmp & ( NLSF_QUANT_DEL_DEC_STATES - 1 ) ][ j ];
208
1.23G
        silk_assert( indices[ j ] >= -NLSF_QUANT_MAX_AMPLITUDE_EXT );
209
1.23G
        silk_assert( indices[ j ] <=  NLSF_QUANT_MAX_AMPLITUDE_EXT );
210
1.23G
    }
211
111M
    indices[ 0 ] += silk_RSHIFT( ind_tmp, NLSF_QUANT_DEL_DEC_STATES_LOG2 );
212
111M
    silk_assert( indices[ 0 ] <= NLSF_QUANT_MAX_AMPLITUDE_EXT );
213
111M
    silk_assert( min_Q25 >= 0 );
214
111M
    return min_Q25;
215
111M
}