Line data Source code
1 : /*====================================================================================
2 : EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0
3 : ====================================================================================*/
4 :
5 :
6 : #include <stdint.h>
7 : #include "options.h"
8 : #include "prot_fx.h"
9 : #include <memory.h>
10 : #include "rom_com.h"
11 :
12 : /** Linear prediction analysis/synthesis filter definition.
13 : * @param order filter order.
14 : * @param parCoeff filter (PARCOR) coefficients.
15 : * @param state state of the filter. Must be at least of 'order' size.
16 : * @param x the current input value.
17 : * @return the output of the filter.
18 : */
19 : typedef Word32 ( *TLinearPredictionFilter )( Word16 order, Word16 const parCoeff[], Word32 *state, Word32 x );
20 :
21 : /********************************/
22 : /* Interface functions */
23 : /********************************/
24 : /*---------------------------------------------------------------------*
25 : * ReadTnsData()
26 : *
27 : *
28 : *---------------------------------------------------------------------*/
29 :
30 : Word16
31 371 : ReadTnsData(
32 : STnsConfig const *pTnsConfig,
33 : Decoder_State *st,
34 : Word16 *pnBits, /*Q0*/
35 : Word16 *stream, /*Q0*/
36 : Word16 *pnSize /*Q0*/
37 : )
38 : {
39 : Word16 start_bit_pos;
40 :
41 :
42 371 : move16();
43 371 : start_bit_pos = st->next_bit_pos;
44 :
45 371 : IF( GT_16( pTnsConfig->nMaxFilters, 1 ) )
46 : {
47 : {
48 :
49 0 : IF( LT_16( pTnsConfig->iFilterBorders[0], 512 ) )
50 : {
51 0 : ReadFromBitstream_fx( &tnsEnabledSWBTCX10BitMap, 1, st, &stream, pnSize );
52 : }
53 : ELSE
54 : {
55 0 : ReadFromBitstream_fx( &tnsEnabledSWBTCX20BitMap, 1, st, &stream, pnSize );
56 : }
57 : }
58 : }
59 : ELSE
60 : {
61 371 : ReadFromBitstream_fx( &tnsEnabledWBTCX20BitMap, 1, st, &stream, pnSize );
62 : }
63 :
64 371 : move16();
65 371 : *pnBits = sub( st->next_bit_pos, start_bit_pos );
66 :
67 371 : return TNS_NO_ERROR;
68 : }
69 :
70 773023 : void ReadTnsData_ivas_fx(
71 : STnsConfig const *pTnsConfig,
72 : Decoder_State *st,
73 : Word16 *pnBits, /*Q0*/
74 : Word16 *stream, /*Q0*/
75 : Word16 *pnSize /*Q0*/
76 : )
77 : {
78 : Word16 start_bit_pos;
79 :
80 773023 : move16();
81 773023 : start_bit_pos = st->next_bit_pos;
82 :
83 773023 : IF( GT_16( pTnsConfig->nMaxFilters, 1 ) )
84 : {
85 673622 : IF( pTnsConfig->allowTnsOnWhite )
86 : {
87 563295 : IF( LT_16( pTnsConfig->iFilterBorders[0], 512 ) )
88 : {
89 27927 : ReadFromBitstream_fx( &tnsEnabledOnWhiteSWBTCX10BitMap, 1, st, &stream, pnSize );
90 : }
91 : ELSE
92 : {
93 535368 : ReadFromBitstream_fx( &tnsEnabledOnWhiteSWBTCX20BitMap, 1, st, &stream, pnSize );
94 : }
95 : }
96 : ELSE
97 : {
98 :
99 110327 : IF( LT_16( pTnsConfig->iFilterBorders[0], 512 ) )
100 : {
101 3912 : ReadFromBitstream_fx( &tnsEnabledSWBTCX10BitMap, 1, st, &stream, pnSize );
102 : }
103 : ELSE
104 : {
105 106415 : ReadFromBitstream_fx( &tnsEnabledSWBTCX20BitMap, 1, st, &stream, pnSize );
106 : }
107 : }
108 : }
109 : ELSE
110 : {
111 99401 : ReadFromBitstream_fx( &tnsEnabledWBTCX20BitMap, 1, st, &stream, pnSize );
112 : }
113 :
114 773023 : move16();
115 773023 : *pnBits = sub( st->next_bit_pos, start_bit_pos );
116 :
117 773023 : return;
118 : }
119 :
120 : /*---------------------------------------------------------------------*
121 : * DecodeTnsData()
122 : *
123 : *
124 : *---------------------------------------------------------------------*/
125 :
126 371 : Word16 DecodeTnsData(
127 : STnsConfig const *pTnsConfig,
128 : Word16 const *stream, /*Q0*/
129 : Word16 *pnSize, /*Q0*/
130 : STnsData *pTnsData )
131 : {
132 : Word16 result;
133 :
134 :
135 371 : ResetTnsData( pTnsData );
136 :
137 371 : IF( GT_16( pTnsConfig->nMaxFilters, 1 ) )
138 : {
139 : {
140 0 : IF( LT_16( pTnsConfig->iFilterBorders[0], 512 ) )
141 : {
142 0 : SetParameters( &tnsEnabledSWBTCX10BitMap, 1, pTnsData, &stream, pnSize );
143 : }
144 : ELSE
145 : {
146 0 : SetParameters( &tnsEnabledSWBTCX20BitMap, 1, pTnsData, &stream, pnSize );
147 : }
148 : }
149 : }
150 : ELSE
151 : {
152 371 : SetParameters( &tnsEnabledWBTCX20BitMap, 1, pTnsData, &stream, pnSize );
153 : }
154 :
155 371 : move16();
156 371 : result = FALSE;
157 371 : if ( pTnsData->nFilters > 0 )
158 : {
159 1 : move16();
160 1 : result = TRUE;
161 : }
162 :
163 :
164 371 : return result;
165 : }
166 :
167 775575 : Word16 DecodeTnsData_ivas_fx(
168 : STnsConfig const *pTnsConfig,
169 : Word16 const *stream, /*Q0*/
170 : Word16 *pnSize, /*Q0*/
171 : STnsData *pTnsData )
172 : {
173 : Word16 result;
174 :
175 775575 : ResetTnsData( pTnsData );
176 :
177 775575 : IF( GT_16( pTnsConfig->nMaxFilters, 1 ) )
178 : {
179 :
180 676111 : IF( pTnsConfig->allowTnsOnWhite )
181 : {
182 565784 : IF( LT_16( pTnsConfig->iFilterBorders[0], 512 ) )
183 : {
184 28408 : SetParameters_fx( &tnsEnabledOnWhiteSWBTCX10BitMap, 1, pTnsData, &stream, pnSize );
185 : }
186 : ELSE
187 : {
188 537376 : SetParameters_fx( &tnsEnabledOnWhiteSWBTCX20BitMap, 1, pTnsData, &stream, pnSize );
189 : }
190 : }
191 : ELSE
192 : {
193 110327 : IF( LT_16( pTnsConfig->iFilterBorders[0], 512 ) )
194 : {
195 3912 : SetParameters_fx( &tnsEnabledSWBTCX10BitMap, 1, pTnsData, &stream, pnSize );
196 : }
197 : ELSE
198 : {
199 106415 : SetParameters_fx( &tnsEnabledSWBTCX20BitMap, 1, pTnsData, &stream, pnSize );
200 : }
201 : }
202 : }
203 : ELSE
204 : {
205 99464 : SetParameters_fx( &tnsEnabledWBTCX20BitMap, 1, pTnsData, &stream, pnSize );
206 : }
207 :
208 775575 : move16();
209 775575 : result = FALSE;
210 775575 : if ( pTnsData->nFilters > 0 )
211 : {
212 86868 : move16();
213 86868 : result = TRUE;
214 : }
215 :
216 :
217 775575 : return result;
218 : }
|