Line data Source code
1 : /******************************************************************************************************
2 :
3 : (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
4 : Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
5 : Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
6 : Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
7 : contributors to this repository. All Rights Reserved.
8 :
9 : This software is protected by copyright law and by international treaties.
10 : The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
11 : Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
12 : Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
13 : Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
14 : contributors to this repository retain full ownership rights in their respective contributions in
15 : the software. This notice grants no license of any kind, including but not limited to patent
16 : license, nor is any license granted by implication, estoppel or otherwise.
17 :
18 : Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
19 : contributions.
20 :
21 : This software is provided "AS IS", without any express or implied warranties. The software is in the
22 : development stage. It is intended exclusively for experts who have experience with such software and
23 : solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
24 : and fitness for a particular purpose are hereby disclaimed and excluded.
25 :
26 : Any dispute, controversy or claim arising under or in relation to providing this software shall be
27 : submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
28 : accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
29 : the United Nations Convention on Contracts on the International Sales of Goods.
30 :
31 : *******************************************************************************************************/
32 :
33 : /*====================================================================================
34 : EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0
35 : ====================================================================================*/
36 :
37 : #include <stdint.h>
38 : #include "options.h"
39 : #include "cnst.h"
40 : #include "rom_com.h"
41 : #include "prot_fx.h"
42 : #include "wmc_auto.h"
43 :
44 :
45 7815 : void hq_configure_fx(
46 : const Word16 length, /* i : Frame length Q0 */
47 : const Word16 hqswb_clas, /* i : HQ SWB class Q0 */
48 : const Word32 core_brate, /* i : Codec bitrate Q0 */
49 : Word16 *num_sfm, /* o : Total number of subbands Q0 */
50 : Word16 *nb_sfm, /* o : Total number of coded bands Q0 */
51 : Word16 *start_norm, /* o : First norm to be SDE encoded Q0 */
52 : Word16 *num_env_bands, /* o : Number coded envelope bands Q0 */
53 : Word16 *numnrmibits, /* o : Number of bits in fall-back norm encoding Q0 */
54 : Word16 *hq_generic_offset, /* o : Freq offset for HQ GENERIC Q0 */
55 : Word16 *sfmsize, /* o : Subband bandwidths Q0 */
56 : Word16 *sfm_start, /* o : Subband start coefficients Q0 */
57 : Word16 *sfm_end /* o : Subband end coefficients Q0 */
58 : )
59 : {
60 : const Word16 *p_sfmsize;
61 : const Word16 *p_sfm_start;
62 : const Word16 *p_sfm_end;
63 : Word16 i, bw_ext;
64 :
65 7815 : bw_ext = 0;
66 7815 : move16();
67 :
68 7815 : *start_norm = 0;
69 7815 : move16();
70 :
71 7815 : IF( EQ_16( length, L_SPEC48k ) )
72 : {
73 6116 : IF( EQ_16( hqswb_clas, HQ_GEN_FB ) )
74 : {
75 2205 : *num_sfm = NB_SFM;
76 2205 : move16();
77 2205 : p_sfmsize = band_len_HQ; /* Q0 */
78 2205 : p_sfm_start = band_start_HQ; /* Q0 */
79 2205 : p_sfm_end = band_end_HQ; /* Q0 */
80 :
81 2205 : IF( GE_32( core_brate, HQ_32k ) )
82 : {
83 0 : *hq_generic_offset = HQ_GENERIC_FOFFSET_32K;
84 0 : move16();
85 0 : *num_env_bands = SFM_N_STA_10k;
86 0 : move16();
87 : }
88 : ELSE /*IF(EQ_32(core_brate, HQ_16k40) || EQ_32(core_brate, HQ_24k40))*/
89 : {
90 2205 : *hq_generic_offset = HQ_GENERIC_FOFFSET_24K4;
91 2205 : *num_env_bands = SFM_N_STA_8k;
92 2205 : move16();
93 2205 : move16();
94 : }
95 2205 : *nb_sfm = *num_sfm;
96 2205 : move16();
97 : }
98 : ELSE
99 : {
100 3911 : IF( EQ_16( hqswb_clas, HQ_HARMONIC ) )
101 : {
102 701 : *num_sfm = SFM_N_HARM_FB;
103 701 : move16();
104 701 : *nb_sfm = SFM_N_HARM_FB;
105 701 : move16();
106 701 : *num_env_bands = SFM_N_HARM_FB;
107 701 : move16();
108 :
109 701 : p_sfmsize = band_len_harm; /* Q0 */
110 701 : p_sfm_start = band_start_harm; /* Q0 */
111 701 : p_sfm_end = band_end_harm; /* Q0 */
112 : }
113 3210 : ELSE IF( EQ_16( hqswb_clas, HQ_HVQ ) )
114 : {
115 1228 : IF( LT_32( core_brate, HQ_BWE_CROSSOVER_BRATE ) )
116 : {
117 622 : *num_sfm = SFM_N_HARM_FB;
118 622 : move16();
119 622 : *nb_sfm = HVQ_THRES_SFM_24k;
120 622 : move16();
121 622 : *num_env_bands = sub( *num_sfm, *nb_sfm );
122 622 : move16();
123 622 : *start_norm = HVQ_THRES_SFM_24k;
124 622 : move16();
125 : }
126 : ELSE
127 : {
128 606 : *num_sfm = SFM_N_HARM_FB;
129 606 : move16();
130 606 : *nb_sfm = HVQ_THRES_SFM_32k;
131 606 : move16();
132 606 : *num_env_bands = sub( *num_sfm, *nb_sfm );
133 606 : move16();
134 606 : *start_norm = HVQ_THRES_SFM_32k;
135 606 : move16();
136 : }
137 1228 : p_sfmsize = band_len_harm; /* Q0 */
138 1228 : p_sfm_start = band_start_harm; /* Q0 */
139 1228 : p_sfm_end = band_end_harm; /* Q0 */
140 : }
141 : ELSE
142 : {
143 1982 : *num_sfm = NB_SFM;
144 1982 : move16();
145 1982 : *nb_sfm = *num_sfm; /* Q0 */
146 1982 : move16();
147 1982 : *num_env_bands = NB_SFM;
148 1982 : move16();
149 :
150 1982 : p_sfmsize = band_len_HQ; /* Q0 */
151 1982 : p_sfm_start = band_start_HQ; /* Q0 */
152 1982 : p_sfm_end = band_end_HQ; /* Q0 */
153 : }
154 : }
155 : }
156 1699 : ELSE IF( EQ_16( length, L_SPEC32k ) )
157 : {
158 1044 : IF( EQ_16( hqswb_clas, HQ_HARMONIC ) )
159 : {
160 88 : *num_sfm = SFM_N_HARM;
161 88 : move16();
162 88 : *nb_sfm = SFM_N_HARM;
163 88 : move16();
164 88 : *num_env_bands = SFM_N_HARM;
165 88 : move16();
166 :
167 88 : p_sfmsize = band_len_harm; /* Q0 */
168 88 : p_sfm_start = band_start_harm; /* Q0 */
169 88 : p_sfm_end = band_end_harm; /* Q0 */
170 : }
171 956 : ELSE IF( EQ_16( hqswb_clas, HQ_HVQ ) )
172 : {
173 235 : IF( LT_32( core_brate, HQ_BWE_CROSSOVER_BRATE ) )
174 : {
175 227 : *num_sfm = SFM_N_HARM;
176 227 : move16();
177 227 : *nb_sfm = HVQ_THRES_SFM_24k;
178 227 : move16();
179 227 : *num_env_bands = sub( *num_sfm, *nb_sfm ); /* Q0 */
180 227 : move16();
181 :
182 227 : *start_norm = HVQ_THRES_SFM_24k;
183 227 : move16();
184 : }
185 : ELSE
186 : {
187 8 : *num_sfm = SFM_N_HARM;
188 8 : move16();
189 8 : *nb_sfm = HVQ_THRES_SFM_32k;
190 8 : move16();
191 8 : *num_env_bands = sub( *num_sfm, *nb_sfm ); /* Q0 */
192 8 : move16();
193 :
194 8 : *start_norm = HVQ_THRES_SFM_32k;
195 8 : move16();
196 : }
197 235 : p_sfmsize = band_len_harm;
198 235 : p_sfm_start = band_start_harm;
199 235 : p_sfm_end = band_end_harm;
200 : }
201 721 : ELSE IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) )
202 : {
203 600 : *num_sfm = SFM_N_SWB;
204 600 : move16();
205 600 : p_sfmsize = band_len_HQ; /* Q0 */
206 600 : p_sfm_start = band_start_HQ; /* Q0 */
207 600 : p_sfm_end = band_end_HQ; /* Q0 */
208 :
209 600 : IF( GE_32( core_brate, HQ_32k ) )
210 : {
211 0 : *hq_generic_offset = HQ_GENERIC_FOFFSET_32K;
212 0 : move16();
213 0 : *num_env_bands = SFM_N_STA_10k;
214 0 : move16();
215 : }
216 : ELSE /*if( EQ_32(core_brate, HQ_24k40))*/
217 : {
218 600 : *hq_generic_offset = HQ_GENERIC_FOFFSET_24K4;
219 600 : move16();
220 600 : *num_env_bands = SFM_N_STA_8k;
221 600 : move16();
222 : }
223 :
224 600 : *nb_sfm = *num_sfm;
225 600 : move16();
226 : }
227 : ELSE
228 : {
229 : /* HQ_NORMAL and HQ_TRANSIENT */
230 121 : *num_sfm = SFM_N_SWB;
231 121 : move16();
232 121 : *nb_sfm = *num_sfm;
233 121 : move16();
234 121 : *num_env_bands = SFM_N_SWB;
235 121 : move16();
236 :
237 121 : p_sfmsize = band_len_HQ; /* Q0 */
238 121 : p_sfm_start = band_start_HQ; /* Q0 */
239 121 : p_sfm_end = band_end_HQ; /* Q0 */
240 : }
241 : }
242 655 : ELSE IF( EQ_16( length, L_SPEC48k_EXT ) )
243 : {
244 120 : bw_ext = 1;
245 120 : p_sfmsize = band_len_HQ; /* Q0 */
246 120 : p_sfm_start = band_start_HQ; /* Q0 */
247 120 : p_sfm_end = band_end_HQ; /* Q0 */
248 120 : *num_sfm = NB_SFM;
249 : }
250 535 : ELSE IF( EQ_16( length, L_SPEC16k_EXT ) )
251 : {
252 26 : bw_ext = 1;
253 26 : move16();
254 26 : p_sfmsize = band_len_wb; /* Q0 */
255 26 : p_sfm_start = band_start_wb; /* Q0 */
256 26 : p_sfm_end = band_end_wb; /* Q0 */
257 26 : *num_sfm = SFM_N_WB;
258 26 : move16();
259 : }
260 : ELSE
261 : {
262 509 : *num_sfm = SFM_N_WB;
263 509 : move16();
264 509 : *nb_sfm = *num_sfm; /* Q0 */
265 509 : move16();
266 509 : *num_env_bands = SFM_N_WB;
267 509 : move16();
268 :
269 509 : p_sfmsize = band_len_wb; /* Q0 */
270 509 : p_sfm_start = band_start_wb; /* Q0 */
271 509 : p_sfm_end = band_end_wb; /* Q0 */
272 : }
273 7815 : IF( bw_ext )
274 : {
275 6102 : FOR( i = 0; i < *num_sfm; i++ )
276 : {
277 : /*sfmsize[i] = (int16_t)(1.25f * p_sfmsize[i]);*/
278 5956 : sfmsize[i] = mult_r( shl( p_sfmsize[i], 1 ), 20480 /* 1.25 in Q14 */ ); /* Q0 */
279 5956 : move16();
280 : /*sfm_start[i] = (int16_t)(1.25f * p_sfm_start[i]);*/
281 5956 : sfm_start[i] = mult_r( shl( p_sfm_start[i], 1 ), 20480 /* 1.25 in Q14 */ ); /* Q0 */
282 5956 : move16();
283 : /*sfm_end[i] = (int16_t)(1.25f * p_sfm_end[i]);*/
284 5956 : sfm_end[i] = mult_r( shl( p_sfm_end[i], 1 ), 20480 /* 1.25 in Q14 */ ); /* Q0 */
285 5956 : move16();
286 : }
287 146 : *nb_sfm = *num_sfm; /* Q0 */
288 146 : *num_env_bands = *num_sfm; /* Q0 */
289 146 : move16();
290 146 : move16();
291 : }
292 : ELSE
293 : {
294 7669 : Copy( p_sfmsize, sfmsize, *num_sfm );
295 7669 : Copy( p_sfm_start, sfm_start, *num_sfm );
296 7669 : Copy( p_sfm_end, sfm_end, *num_sfm );
297 : }
298 :
299 7815 : *numnrmibits = extract_l( L_mult0( sub( *num_env_bands, 1 ), NORMI_BITS ) );
300 7815 : move16();
301 :
302 7815 : return;
303 : }
|