Coverage Report

Created: 2023-09-25 08:12

/src/opus/silk/encode_indices.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
/* Encode side-information parameters to payload */
35
void silk_encode_indices(
36
    silk_encoder_state          *psEncC,                        /* I/O  Encoder state                               */
37
    ec_enc                      *psRangeEnc,                    /* I/O  Compressor data structure                   */
38
    opus_int                    FrameIndex,                     /* I    Frame number                                */
39
    opus_int                    encode_LBRR,                    /* I    Flag indicating LBRR data is being encoded  */
40
    opus_int                    condCoding                      /* I    The type of conditional coding to use       */
41
)
42
23.2M
{
43
23.2M
    opus_int   i, k, typeOffset;
44
23.2M
    opus_int   encode_absolute_lagIndex, delta_lagIndex;
45
23.2M
    opus_int16 ec_ix[ MAX_LPC_ORDER ];
46
23.2M
    opus_uint8 pred_Q8[ MAX_LPC_ORDER ];
47
23.2M
    const SideInfoIndices *psIndices;
48
49
23.2M
    if( encode_LBRR ) {
50
153k
         psIndices = &psEncC->indices_LBRR[ FrameIndex ];
51
23.0M
    } else {
52
23.0M
         psIndices = &psEncC->indices;
53
23.0M
    }
54
55
    /*******************************************/
56
    /* Encode signal type and quantizer offset */
57
    /*******************************************/
58
23.2M
    typeOffset = 2 * psIndices->signalType + psIndices->quantOffsetType;
59
23.2M
    celt_assert( typeOffset >= 0 && typeOffset < 6 );
60
23.2M
    celt_assert( encode_LBRR == 0 || typeOffset >= 2 );
61
23.2M
    if( encode_LBRR || typeOffset >= 2 ) {
62
2.29M
        ec_enc_icdf( psRangeEnc, typeOffset - 2, silk_type_offset_VAD_iCDF, 8 );
63
20.9M
    } else {
64
20.9M
        ec_enc_icdf( psRangeEnc, typeOffset, silk_type_offset_no_VAD_iCDF, 8 );
65
20.9M
    }
66
67
    /****************/
68
    /* Encode gains */
69
    /****************/
70
    /* first subframe */
71
23.2M
    if( condCoding == CODE_CONDITIONALLY ) {
72
        /* conditional coding */
73
3.72M
        silk_assert( psIndices->GainsIndices[ 0 ] >= 0 && psIndices->GainsIndices[ 0 ] < MAX_DELTA_GAIN_QUANT - MIN_DELTA_GAIN_QUANT + 1 );
74
3.72M
        ec_enc_icdf( psRangeEnc, psIndices->GainsIndices[ 0 ], silk_delta_gain_iCDF, 8 );
75
19.4M
    } else {
76
        /* independent coding, in two stages: MSB bits followed by 3 LSBs */
77
19.4M
        silk_assert( psIndices->GainsIndices[ 0 ] >= 0 && psIndices->GainsIndices[ 0 ] < N_LEVELS_QGAIN );
78
19.4M
        ec_enc_icdf( psRangeEnc, silk_RSHIFT( psIndices->GainsIndices[ 0 ], 3 ), silk_gain_iCDF[ psIndices->signalType ], 8 );
79
19.4M
        ec_enc_icdf( psRangeEnc, psIndices->GainsIndices[ 0 ] & 7, silk_uniform8_iCDF, 8 );
80
19.4M
    }
81
82
    /* remaining subframes */
83
76.1M
    for( i = 1; i < psEncC->nb_subfr; i++ ) {
84
52.9M
        silk_assert( psIndices->GainsIndices[ i ] >= 0 && psIndices->GainsIndices[ i ] < MAX_DELTA_GAIN_QUANT - MIN_DELTA_GAIN_QUANT + 1 );
85
52.9M
        ec_enc_icdf( psRangeEnc, psIndices->GainsIndices[ i ], silk_delta_gain_iCDF, 8 );
86
52.9M
    }
87
88
    /****************/
89
    /* Encode NLSFs */
90
    /****************/
91
23.2M
    ec_enc_icdf( psRangeEnc, psIndices->NLSFIndices[ 0 ], &psEncC->psNLSF_CB->CB1_iCDF[ ( psIndices->signalType >> 1 ) * psEncC->psNLSF_CB->nVectors ], 8 );
92
23.2M
    silk_NLSF_unpack( ec_ix, pred_Q8, psEncC->psNLSF_CB, psIndices->NLSFIndices[ 0 ] );
93
23.2M
    celt_assert( psEncC->psNLSF_CB->order == psEncC->predictLPCOrder );
94
289M
    for( i = 0; i < psEncC->psNLSF_CB->order; i++ ) {
95
266M
        if( psIndices->NLSFIndices[ i+1 ] >= NLSF_QUANT_MAX_AMPLITUDE ) {
96
33.2k
            ec_enc_icdf( psRangeEnc, 2 * NLSF_QUANT_MAX_AMPLITUDE, &psEncC->psNLSF_CB->ec_iCDF[ ec_ix[ i ] ], 8 );
97
33.2k
            ec_enc_icdf( psRangeEnc, psIndices->NLSFIndices[ i+1 ] - NLSF_QUANT_MAX_AMPLITUDE, silk_NLSF_EXT_iCDF, 8 );
98
266M
        } else if( psIndices->NLSFIndices[ i+1 ] <= -NLSF_QUANT_MAX_AMPLITUDE ) {
99
97.8k
            ec_enc_icdf( psRangeEnc, 0, &psEncC->psNLSF_CB->ec_iCDF[ ec_ix[ i ] ], 8 );
100
97.8k
            ec_enc_icdf( psRangeEnc, -psIndices->NLSFIndices[ i+1 ] - NLSF_QUANT_MAX_AMPLITUDE, silk_NLSF_EXT_iCDF, 8 );
101
266M
        } else {
102
266M
            ec_enc_icdf( psRangeEnc, psIndices->NLSFIndices[ i+1 ] + NLSF_QUANT_MAX_AMPLITUDE, &psEncC->psNLSF_CB->ec_iCDF[ ec_ix[ i ] ], 8 );
103
266M
        }
104
266M
    }
105
106
    /* Encode NLSF interpolation factor */
107
23.2M
    if( psEncC->nb_subfr == MAX_NB_SUBFR ) {
108
14.8M
        silk_assert( psIndices->NLSFInterpCoef_Q2 >= 0 && psIndices->NLSFInterpCoef_Q2 < 5 );
109
14.8M
        ec_enc_icdf( psRangeEnc, psIndices->NLSFInterpCoef_Q2, silk_NLSF_interpolation_factor_iCDF, 8 );
110
14.8M
    }
111
112
23.2M
    if( psIndices->signalType == TYPE_VOICED )
113
955k
    {
114
        /*********************/
115
        /* Encode pitch lags */
116
        /*********************/
117
        /* lag index */
118
955k
        encode_absolute_lagIndex = 1;
119
955k
        if( condCoding == CODE_CONDITIONALLY && psEncC->ec_prevSignalType == TYPE_VOICED ) {
120
            /* Delta Encoding */
121
208k
            delta_lagIndex = psIndices->lagIndex - psEncC->ec_prevLagIndex;
122
208k
            if( delta_lagIndex < -8 || delta_lagIndex > 11 ) {
123
66.5k
                delta_lagIndex = 0;
124
142k
            } else {
125
142k
                delta_lagIndex = delta_lagIndex + 9;
126
142k
                encode_absolute_lagIndex = 0; /* Only use delta */
127
142k
            }
128
208k
            silk_assert( delta_lagIndex >= 0 && delta_lagIndex < 21 );
129
208k
            ec_enc_icdf( psRangeEnc, delta_lagIndex, silk_pitch_delta_iCDF, 8 );
130
208k
        }
131
955k
        if( encode_absolute_lagIndex ) {
132
            /* Absolute encoding */
133
813k
            opus_int32 pitch_high_bits, pitch_low_bits;
134
813k
            pitch_high_bits = silk_DIV32_16( psIndices->lagIndex, silk_RSHIFT( psEncC->fs_kHz, 1 ) );
135
813k
            pitch_low_bits = psIndices->lagIndex - silk_SMULBB( pitch_high_bits, silk_RSHIFT( psEncC->fs_kHz, 1 ) );
136
813k
            silk_assert( pitch_low_bits < psEncC->fs_kHz / 2 );
137
813k
            silk_assert( pitch_high_bits < 32 );
138
813k
            ec_enc_icdf( psRangeEnc, pitch_high_bits, silk_pitch_lag_iCDF, 8 );
139
813k
            ec_enc_icdf( psRangeEnc, pitch_low_bits, psEncC->pitch_lag_low_bits_iCDF, 8 );
140
813k
        }
141
955k
        psEncC->ec_prevLagIndex = psIndices->lagIndex;
142
143
        /* Countour index */
144
955k
        silk_assert(   psIndices->contourIndex  >= 0 );
145
955k
        silk_assert( ( psIndices->contourIndex < 34 && psEncC->fs_kHz  > 8 && psEncC->nb_subfr == 4 ) ||
146
955k
                    ( psIndices->contourIndex < 11 && psEncC->fs_kHz == 8 && psEncC->nb_subfr == 4 ) ||
147
955k
                    ( psIndices->contourIndex < 12 && psEncC->fs_kHz  > 8 && psEncC->nb_subfr == 2 ) ||
148
955k
                    ( psIndices->contourIndex <  3 && psEncC->fs_kHz == 8 && psEncC->nb_subfr == 2 ) );
149
955k
        ec_enc_icdf( psRangeEnc, psIndices->contourIndex, psEncC->pitch_contour_iCDF, 8 );
150
151
        /********************/
152
        /* Encode LTP gains */
153
        /********************/
154
        /* PERIndex value */
155
955k
        silk_assert( psIndices->PERIndex >= 0 && psIndices->PERIndex < 3 );
156
955k
        ec_enc_icdf( psRangeEnc, psIndices->PERIndex, silk_LTP_per_index_iCDF, 8 );
157
158
        /* Codebook Indices */
159
4.27M
        for( k = 0; k < psEncC->nb_subfr; k++ ) {
160
3.31M
            silk_assert( psIndices->LTPIndex[ k ] >= 0 && psIndices->LTPIndex[ k ] < ( 8 << psIndices->PERIndex ) );
161
3.31M
            ec_enc_icdf( psRangeEnc, psIndices->LTPIndex[ k ], silk_LTP_gain_iCDF_ptrs[ psIndices->PERIndex ], 8 );
162
3.31M
        }
163
164
        /**********************/
165
        /* Encode LTP scaling */
166
        /**********************/
167
955k
        if( condCoding == CODE_INDEPENDENTLY ) {
168
676k
            silk_assert( psIndices->LTP_scaleIndex >= 0 && psIndices->LTP_scaleIndex < 3 );
169
676k
            ec_enc_icdf( psRangeEnc, psIndices->LTP_scaleIndex, silk_LTPscale_iCDF, 8 );
170
676k
        }
171
955k
        silk_assert( !condCoding || psIndices->LTP_scaleIndex == 0 );
172
955k
    }
173
174
23.2M
    psEncC->ec_prevSignalType = psIndices->signalType;
175
176
    /***************/
177
    /* Encode seed */
178
    /***************/
179
23.2M
    silk_assert( psIndices->Seed >= 0 && psIndices->Seed < 4 );
180
23.2M
    ec_enc_icdf( psRangeEnc, psIndices->Seed, silk_uniform4_iCDF, 8 );
181
23.2M
}