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 374 : 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 374 : move16();
43 374 : start_bit_pos = st->next_bit_pos;
44 :
45 374 : 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 374 : ReadFromBitstream_fx( &tnsEnabledWBTCX20BitMap, 1, st, &stream, pnSize );
62 : }
63 :
64 374 : move16();
65 374 : *pnBits = sub( st->next_bit_pos, start_bit_pos );
66 :
67 374 : return TNS_NO_ERROR;
68 : }
69 :
70 719597 : 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 719597 : move16();
81 719597 : start_bit_pos = st->next_bit_pos;
82 :
83 719597 : IF( GT_16( pTnsConfig->nMaxFilters, 1 ) )
84 : {
85 630130 : IF( pTnsConfig->allowTnsOnWhite )
86 : {
87 520217 : IF( LT_16( pTnsConfig->iFilterBorders[0], 512 ) )
88 : {
89 24897 : ReadFromBitstream_fx( &tnsEnabledOnWhiteSWBTCX10BitMap, 1, st, &stream, pnSize );
90 : }
91 : ELSE
92 : {
93 495320 : ReadFromBitstream_fx( &tnsEnabledOnWhiteSWBTCX20BitMap, 1, st, &stream, pnSize );
94 : }
95 : }
96 : ELSE
97 : {
98 :
99 109913 : IF( LT_16( pTnsConfig->iFilterBorders[0], 512 ) )
100 : {
101 3884 : ReadFromBitstream_fx( &tnsEnabledSWBTCX10BitMap, 1, st, &stream, pnSize );
102 : }
103 : ELSE
104 : {
105 106029 : ReadFromBitstream_fx( &tnsEnabledSWBTCX20BitMap, 1, st, &stream, pnSize );
106 : }
107 : }
108 : }
109 : ELSE
110 : {
111 89467 : ReadFromBitstream_fx( &tnsEnabledWBTCX20BitMap, 1, st, &stream, pnSize );
112 : }
113 :
114 719597 : move16();
115 719597 : *pnBits = sub( st->next_bit_pos, start_bit_pos );
116 :
117 719597 : return;
118 : }
119 :
120 : /*---------------------------------------------------------------------*
121 : * DecodeTnsData()
122 : *
123 : *
124 : *---------------------------------------------------------------------*/
125 :
126 374 : 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 374 : ResetTnsData( pTnsData );
136 :
137 374 : 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 374 : SetParameters( &tnsEnabledWBTCX20BitMap, 1, pTnsData, &stream, pnSize );
153 : }
154 :
155 374 : move16();
156 374 : result = FALSE;
157 374 : if ( pTnsData->nFilters > 0 )
158 : {
159 1 : move16();
160 1 : result = TRUE;
161 : }
162 :
163 :
164 374 : return result;
165 : }
166 :
167 721991 : 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 721991 : ResetTnsData( pTnsData );
176 :
177 721991 : IF( GT_16( pTnsConfig->nMaxFilters, 1 ) )
178 : {
179 :
180 632464 : IF( pTnsConfig->allowTnsOnWhite )
181 : {
182 522551 : IF( LT_16( pTnsConfig->iFilterBorders[0], 512 ) )
183 : {
184 25354 : SetParameters_fx( &tnsEnabledOnWhiteSWBTCX10BitMap, 1, pTnsData, &stream, pnSize );
185 : }
186 : ELSE
187 : {
188 497197 : SetParameters_fx( &tnsEnabledOnWhiteSWBTCX20BitMap, 1, pTnsData, &stream, pnSize );
189 : }
190 : }
191 : ELSE
192 : {
193 109913 : IF( LT_16( pTnsConfig->iFilterBorders[0], 512 ) )
194 : {
195 3884 : SetParameters_fx( &tnsEnabledSWBTCX10BitMap, 1, pTnsData, &stream, pnSize );
196 : }
197 : ELSE
198 : {
199 106029 : SetParameters_fx( &tnsEnabledSWBTCX20BitMap, 1, pTnsData, &stream, pnSize );
200 : }
201 : }
202 : }
203 : ELSE
204 : {
205 89527 : SetParameters_fx( &tnsEnabledWBTCX20BitMap, 1, pTnsData, &stream, pnSize );
206 : }
207 :
208 721991 : move16();
209 721991 : result = FALSE;
210 721991 : if ( pTnsData->nFilters > 0 )
211 : {
212 81009 : move16();
213 81009 : result = TRUE;
214 : }
215 :
216 :
217 721991 : return result;
218 : }
|