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 <assert.h>
38 : #include <stdint.h>
39 : #include "options.h"
40 : #ifdef DEBUGGING
41 : #include "debug.h"
42 : #endif
43 : #include "prot.h"
44 : #include "rom_com.h"
45 : #include "wmc_auto.h"
46 :
47 : /*---------------------------------------------------------------------*
48 : * IGF_ApplyTransFac()
49 : *
50 : *
51 : *---------------------------------------------------------------------*/
52 :
53 : /*! r: | multiplication factor */
54 104347848 : int16_t IGF_ApplyTransFac(
55 : const int16_t val, /* i : Q15 | input value for multiplication, Q15 */
56 : const float transFac /* i : Q14 | multiplicator for variable val, Q14: 1.25f=0x5000, 1.0f=0x4000, 0.5f=0x2000 */
57 : )
58 : {
59 104347848 : int16_t ret = val;
60 :
61 104347848 : if ( transFac != 1.f )
62 : {
63 68225337 : ret = (int16_t) round_f( val * transFac );
64 68225337 : ret += ( ret & 1 );
65 : }
66 :
67 104347848 : return ret;
68 : }
69 :
70 :
71 : /*---------------------------------------------------------------------*
72 : * IGF_MapBitRateToIndex()
73 : *
74 : * maps a given bitrate to the IGF_BITRATE index
75 : *---------------------------------------------------------------------*/
76 :
77 : /*! r: bitrate index */
78 40836008 : int16_t IGF_MapBitRateToIndex(
79 : const int32_t brate, /* i : bitrate */
80 : const int16_t bwidth, /* i : audio bandwidth */
81 : const int16_t element_mode, /* i : element mode */
82 : const int16_t rf_mode /* i : flag to signal the RF mode */
83 : )
84 : {
85 40836008 : int16_t bitRateIndex = IGF_BITRATE_UNKNOWN;
86 :
87 : /* Stereo/CPE modes */
88 40836008 : if ( element_mode > IVAS_SCE )
89 : {
90 39544896 : switch ( bwidth )
91 : {
92 8348 : case IGF_MODE_WB:
93 8348 : if ( brate <= IVAS_13k2 && rf_mode == 1 )
94 : {
95 0 : bitRateIndex = IGF_BITRATE_RF_WB_13200;
96 : }
97 8348 : else if ( brate <= ACELP_9k60 )
98 : {
99 5136 : bitRateIndex = IGF_BITRATE_WB_13200_CPE;
100 : }
101 3212 : else if ( brate <= IVAS_13k2 )
102 : {
103 3212 : bitRateIndex = IGF_BITRATE_WB_16400_CPE;
104 : }
105 8348 : break;
106 8949194 : case IGF_MODE_SWB:
107 : /* DFT and TD Stereo bitrates */
108 8949194 : if ( brate <= ACELP_9k60 )
109 : {
110 38358 : bitRateIndex = IGF_BITRATE_SWB_13200_CPE;
111 : }
112 8910836 : else if ( brate <= IVAS_13k2 )
113 : {
114 23776 : if ( rf_mode == 1 )
115 : {
116 0 : bitRateIndex = IGF_BITRATE_RF_SWB_13200;
117 : }
118 : else
119 : {
120 23776 : bitRateIndex = IGF_BITRATE_SWB_16400_CPE;
121 : }
122 : }
123 8887060 : else if ( brate <= IVAS_16k4 )
124 : {
125 66896 : bitRateIndex = IGF_BITRATE_SWB_24400_CPE;
126 : }
127 8820164 : else if ( brate <= IVAS_24k4 )
128 : {
129 26964 : bitRateIndex = IGF_BITRATE_SWB_32000_CPE;
130 : }
131 8793200 : else if ( brate <= IVAS_32k )
132 : {
133 0 : bitRateIndex = IGF_BITRATE_SWB_32000;
134 : }
135 : /* MDCT Stereo bitrates */
136 8793200 : else if ( brate <= IVAS_48k )
137 : {
138 3561235 : bitRateIndex = IGF_BITRATE_SWB_48000_CPE;
139 : }
140 5231965 : else if ( brate <= IVAS_64k )
141 : {
142 2693358 : bitRateIndex = IGF_BITRATE_SWB_64000_CPE;
143 : }
144 2538607 : else if ( brate <= IVAS_80k )
145 : {
146 1087438 : bitRateIndex = IGF_BITRATE_SWB_80000_CPE;
147 : }
148 1451169 : else if ( brate <= IVAS_96k )
149 : {
150 1451169 : bitRateIndex = IGF_BITRATE_SWB_96000_CPE;
151 : }
152 8949194 : break;
153 30587354 : case IGF_MODE_FB:
154 : /* DFT and TD Stereo bitrates */
155 30587354 : if ( brate <= IVAS_16k4 )
156 : {
157 39340 : bitRateIndex = IGF_BITRATE_FB_24400_CPE;
158 : }
159 30548014 : else if ( brate <= IVAS_24k4 )
160 : {
161 34332 : bitRateIndex = IGF_BITRATE_FB_32000_CPE;
162 : }
163 30513682 : else if ( brate <= IVAS_32k )
164 : {
165 0 : bitRateIndex = IGF_BITRATE_FB_32000;
166 : }
167 : /* MDCT Stereo bitrates */
168 30513682 : else if ( brate <= IVAS_48k )
169 : {
170 5417870 : bitRateIndex = IGF_BITRATE_FB_48000_CPE;
171 : }
172 25095812 : else if ( brate <= IVAS_64k )
173 : {
174 6652816 : bitRateIndex = IGF_BITRATE_FB_64000_CPE;
175 : }
176 18442996 : else if ( brate <= IVAS_80k )
177 : {
178 2324138 : bitRateIndex = IGF_BITRATE_FB_80000_CPE;
179 : }
180 16118858 : else if ( brate <= IVAS_96k )
181 : {
182 6324622 : bitRateIndex = IGF_BITRATE_FB_96000_CPE;
183 : }
184 9794236 : else if ( brate <= IVAS_128k )
185 : {
186 9794236 : bitRateIndex = IGF_BITRATE_FB_128000_CPE;
187 : }
188 30587354 : break;
189 : }
190 39544896 : }
191 : /* SCE modes: use tunings done for DFT stereo bitrates also for according SCE bitrates, otherwise same config as mono modes */
192 1291112 : else if ( element_mode == IVAS_SCE )
193 : {
194 1285332 : switch ( bwidth )
195 : {
196 12668 : case IGF_MODE_WB:
197 12668 : if ( brate <= IVAS_13k2 && rf_mode == 1 )
198 : {
199 0 : bitRateIndex = IGF_BITRATE_RF_WB_13200;
200 : }
201 12668 : else if ( brate <= ACELP_9k60 ) /* bitrates 8000 and 9600 */
202 : {
203 12668 : bitRateIndex = IGF_BITRATE_WB_9600;
204 : }
205 12668 : break;
206 508848 : case IGF_MODE_SWB:
207 508848 : if ( brate <= ACELP_9k60 )
208 : {
209 124312 : bitRateIndex = IGF_BITRATE_SWB_13200_CPE;
210 : }
211 384536 : else if ( brate <= IVAS_13k2 )
212 : {
213 127756 : if ( rf_mode == 1 )
214 : {
215 0 : bitRateIndex = IGF_BITRATE_RF_SWB_13200;
216 : }
217 : else
218 : {
219 127756 : bitRateIndex = IGF_BITRATE_SWB_16400_CPE;
220 : }
221 : }
222 256780 : else if ( brate <= IVAS_16k4 )
223 : {
224 101750 : bitRateIndex = IGF_BITRATE_SWB_24400_CPE;
225 : }
226 155030 : else if ( brate <= IVAS_24k4 )
227 : {
228 90070 : bitRateIndex = IGF_BITRATE_SWB_32000_CPE;
229 : }
230 64960 : else if ( brate <= IVAS_32k )
231 : {
232 32402 : bitRateIndex = IGF_BITRATE_SWB_32000;
233 : }
234 32558 : else if ( brate <= IVAS_48k )
235 : {
236 18182 : bitRateIndex = IGF_BITRATE_SWB_48000;
237 : }
238 14376 : else if ( brate <= IVAS_64k )
239 : {
240 14376 : bitRateIndex = IGF_BITRATE_SWB_64000;
241 : }
242 508848 : break;
243 763816 : case IGF_MODE_FB:
244 763816 : if ( brate <= IVAS_16k4 )
245 : {
246 135110 : bitRateIndex = IGF_BITRATE_FB_24400_CPE;
247 : }
248 628706 : else if ( brate <= IVAS_24k4 )
249 : {
250 246058 : bitRateIndex = IGF_BITRATE_FB_32000_CPE;
251 : }
252 382648 : else if ( brate <= IVAS_32k )
253 : {
254 143212 : bitRateIndex = IGF_BITRATE_FB_32000;
255 : }
256 239436 : else if ( brate <= IVAS_48k )
257 : {
258 106124 : bitRateIndex = IGF_BITRATE_FB_48000;
259 : }
260 133312 : else if ( brate <= IVAS_64k )
261 : {
262 77218 : bitRateIndex = IGF_BITRATE_FB_64000;
263 : }
264 56094 : else if ( brate <= IVAS_96k )
265 : {
266 42120 : bitRateIndex = IGF_BITRATE_FB_96000;
267 : }
268 13974 : else if ( brate <= IVAS_128k )
269 : {
270 13974 : bitRateIndex = IGF_BITRATE_FB_128000;
271 : }
272 763816 : break;
273 : }
274 1285332 : }
275 : /* EVS mono */
276 : else
277 : {
278 5780 : switch ( bwidth )
279 : {
280 312 : case IGF_MODE_WB:
281 312 : if ( brate <= ACELP_13k20 && rf_mode == 1 )
282 : {
283 96 : bitRateIndex = IGF_BITRATE_RF_WB_13200;
284 : }
285 216 : else if ( brate <= ACELP_9k60 ) /* bitrates 8000 and 9600 */
286 : {
287 216 : bitRateIndex = IGF_BITRATE_WB_9600;
288 : }
289 312 : break;
290 5104 : case IGF_MODE_SWB:
291 5104 : if ( brate <= ACELP_9k60 )
292 : {
293 48 : bitRateIndex = IGF_BITRATE_SWB_9600;
294 : }
295 5056 : else if ( brate <= ACELP_13k20 )
296 : {
297 1840 : if ( rf_mode == 1 )
298 : {
299 98 : bitRateIndex = IGF_BITRATE_RF_SWB_13200;
300 : }
301 : else
302 : {
303 1742 : bitRateIndex = IGF_BITRATE_SWB_13200;
304 : }
305 : }
306 3216 : else if ( brate <= ACELP_16k40 )
307 : {
308 316 : bitRateIndex = IGF_BITRATE_SWB_16400;
309 : }
310 2900 : else if ( brate <= ACELP_24k40 )
311 : {
312 2680 : bitRateIndex = IGF_BITRATE_SWB_24400;
313 : }
314 220 : else if ( brate <= ACELP_32k )
315 : {
316 64 : bitRateIndex = IGF_BITRATE_SWB_32000;
317 : }
318 156 : else if ( brate <= ACELP_48k )
319 : {
320 156 : bitRateIndex = IGF_BITRATE_SWB_48000;
321 : }
322 0 : else if ( brate <= ACELP_64k )
323 : {
324 0 : bitRateIndex = IGF_BITRATE_SWB_64000;
325 : }
326 5104 : break;
327 364 : case IGF_MODE_FB:
328 364 : if ( brate <= ACELP_16k40 )
329 : {
330 48 : bitRateIndex = IGF_BITRATE_FB_16400;
331 : }
332 316 : else if ( brate <= ACELP_24k40 )
333 : {
334 144 : bitRateIndex = IGF_BITRATE_FB_24400;
335 : }
336 172 : else if ( brate <= ACELP_32k )
337 : {
338 20 : bitRateIndex = IGF_BITRATE_FB_32000;
339 : }
340 152 : else if ( brate <= ACELP_48k )
341 : {
342 40 : bitRateIndex = IGF_BITRATE_FB_48000;
343 : }
344 112 : else if ( brate <= ACELP_64k )
345 : {
346 0 : bitRateIndex = IGF_BITRATE_FB_64000;
347 : }
348 112 : else if ( brate <= HQ_96k )
349 : {
350 52 : bitRateIndex = IGF_BITRATE_FB_96000;
351 : }
352 60 : else if ( brate <= HQ_128k )
353 : {
354 60 : bitRateIndex = IGF_BITRATE_FB_128000;
355 : }
356 364 : break;
357 : }
358 40836008 : }
359 :
360 40836008 : return bitRateIndex;
361 : }
362 :
363 :
364 : /*---------------------------------------------------------------------*
365 : * IGF_gridSetUp()
366 : *
367 : * IGF grid setup
368 : *---------------------------------------------------------------------*/
369 :
370 5071272 : static void IGF_gridSetUp(
371 : H_IGF_GRID hGrid, /* o : IGF grid handle */
372 : int16_t bitRateIndex, /* i : IGF bitrate index */
373 : const int32_t sampleRate, /* i : sample rate */
374 : int16_t frameLength, /* i : frame length */
375 : const float transFac, /* i : transFac */
376 : const int16_t igfMinFq /* i : IGF minimum frequency indicating lower start frequency for copy up */
377 : )
378 : {
379 : int16_t t, k;
380 : int16_t sfb;
381 : int16_t swb_offset_len;
382 : const int16_t *swb_offset;
383 : float bandwidth;
384 : const int16_t *igf_tile_offset;
385 :
386 : /* inits */
387 5071272 : swb_offset = NULL;
388 5071272 : swb_offset_len = 0;
389 5071272 : if ( transFac == 0.5f && bitRateIndex == IGF_BITRATE_SWB_48000_CPE )
390 : {
391 44339 : bitRateIndex = IGF_BITRATE_SWB_48000_CPE_TCX10;
392 : }
393 5026933 : else if ( transFac == 0.5f && bitRateIndex == IGF_BITRATE_FB_48000_CPE )
394 : {
395 242419 : bitRateIndex = IGF_BITRATE_FB_48000_CPE_TCX10;
396 : }
397 :
398 5071272 : if ( bitRateIndex != IGF_BITRATE_UNKNOWN )
399 : {
400 5071272 : swb_offset = &swb_offset_LB_new[bitRateIndex][1];
401 5071272 : swb_offset_len = swb_offset_LB_new[bitRateIndex][0];
402 5071272 : mvr2r( &igf_whitening_TH[bitRateIndex][0][0], &hGrid->whiteningThreshold[0][0], IGF_MAX_TILES * 2 );
403 : }
404 : else
405 : {
406 0 : assert( 0 );
407 : }
408 :
409 42680243 : for ( sfb = 0; sfb < swb_offset_len; sfb++ )
410 : {
411 37608971 : hGrid->swb_offset[sfb] = IGF_ApplyTransFac( swb_offset[sfb], transFac );
412 : }
413 84101557 : for ( sfb = swb_offset_len; sfb < IGF_MAX_SFB; sfb++ )
414 : {
415 79030285 : hGrid->swb_offset[sfb] = 0;
416 : }
417 :
418 5071272 : hGrid->infoIsRefined = 0;
419 5071272 : frameLength = IGF_ApplyTransFac( frameLength, transFac );
420 5071272 : bandwidth = (float) sampleRate / 2.0f / (float) frameLength;
421 5071272 : hGrid->swb_offset_len = swb_offset_len;
422 5071272 : hGrid->startSfb = 0;
423 5071272 : hGrid->stopSfb = hGrid->swb_offset_len - 1;
424 5071272 : hGrid->startLine = hGrid->swb_offset[hGrid->startSfb];
425 5071272 : hGrid->stopLine = hGrid->swb_offset[hGrid->stopSfb];
426 5071272 : hGrid->startFrequency = (int16_t) round_f( bandwidth * hGrid->startLine );
427 5071272 : hGrid->stopFrequency = (int16_t) round_f( bandwidth * hGrid->stopLine );
428 5071272 : hGrid->minSrcSubband = (int16_t) round_f( ( igfMinFq * ( frameLength ) ) / ( sampleRate >> 1 ) );
429 5071272 : hGrid->minSrcSubband += hGrid->minSrcSubband % 2;
430 5071272 : hGrid->minSrcFrequency = (int16_t) round_f( bandwidth * hGrid->minSrcSubband );
431 5071272 : hGrid->infoGranuleLen = frameLength;
432 5071272 : hGrid->sfbWrap[0] = 0;
433 5071272 : hGrid->tile[0] = hGrid->startLine;
434 :
435 5071272 : igf_tile_offset = &igf_tile_offset_table[bitRateIndex][1];
436 5071272 : hGrid->nTiles = igf_tile_offset_table[bitRateIndex][0];
437 5071272 : hGrid->tile[0] = hGrid->startLine;
438 5071272 : hGrid->sfbWrap[0] = 0;
439 29283717 : for ( k = 0; k < hGrid->nTiles; k++ )
440 : {
441 24212445 : hGrid->sfbWrap[k + 1] = igf_tile_offset[2 * k];
442 24212445 : hGrid->sbWrap[k] = hGrid->minSrcSubband + IGF_ApplyTransFac( igf_tile_offset[2 * k + 1], transFac );
443 24212445 : hGrid->tile[k + 1] = hGrid->swb_offset[igf_tile_offset[2 * k]];
444 : }
445 26920860 : for ( t = hGrid->nTiles + 1; t < IGF_MAX_TILES; t++ )
446 : {
447 21849588 : hGrid->tile[t] = 0;
448 21849588 : hGrid->sbWrap[t - 1] = 0;
449 21849588 : hGrid->sfbWrap[t] = 0;
450 : }
451 :
452 : /* adapt level envelope: */
453 5071272 : switch ( bitRateIndex )
454 : {
455 31992 : case IGF_BITRATE_RF_WB_13200:
456 : case IGF_BITRATE_WB_9600:
457 : case IGF_BITRATE_WB_13200_CPE:
458 : case IGF_BITRATE_WB_16400_CPE:
459 31992 : hGrid->gFactor = 0.800f;
460 31992 : hGrid->fFactor = 0.70f;
461 31992 : hGrid->lFactor = 0.60f;
462 31992 : break;
463 745101 : case IGF_BITRATE_SWB_13200:
464 : case IGF_BITRATE_SWB_16400_CPE:
465 : case IGF_BITRATE_FB_16400:
466 : case IGF_BITRATE_SWB_16400:
467 : case IGF_BITRATE_FB_24400_CPE:
468 : case IGF_BITRATE_SWB_24400_CPE:
469 745101 : hGrid->gFactor = 0.930f;
470 745101 : hGrid->fFactor = 0.20f;
471 745101 : hGrid->lFactor = 0.85f;
472 745101 : break;
473 1123774 : case IGF_BITRATE_FB_24400:
474 : case IGF_BITRATE_SWB_24400:
475 : case IGF_BITRATE_FB_32000_CPE:
476 : case IGF_BITRATE_SWB_32000_CPE:
477 : case IGF_BITRATE_FB_32000:
478 : case IGF_BITRATE_SWB_32000:
479 : case IGF_BITRATE_SWB_48000_CPE:
480 : case IGF_BITRATE_SWB_64000_CPE:
481 1123774 : hGrid->gFactor = 0.965f;
482 1123774 : hGrid->fFactor = 0.20f;
483 1123774 : hGrid->lFactor = 0.85f;
484 1123774 : break;
485 464235 : case IGF_BITRATE_FB_48000:
486 : case IGF_BITRATE_SWB_48000:
487 : case IGF_BITRATE_FB_64000:
488 : case IGF_BITRATE_SWB_64000:
489 : case IGF_BITRATE_SWB_80000_CPE:
490 : case IGF_BITRATE_SWB_96000_CPE:
491 464235 : hGrid->gFactor = 1.000f;
492 464235 : hGrid->fFactor = 0.20f;
493 464235 : hGrid->lFactor = 1.000f;
494 464235 : break;
495 2706170 : case IGF_BITRATE_SWB_9600:
496 : case IGF_BITRATE_SWB_13200_CPE:
497 : case IGF_BITRATE_RF_SWB_13200:
498 : default:
499 2706170 : hGrid->gFactor = 1.000f;
500 2706170 : hGrid->fFactor = 0.00f;
501 2706170 : hGrid->lFactor = 1.000f;
502 : }
503 :
504 26920860 : for ( t = hGrid->nTiles + 1; t < IGF_MAX_TILES; t++ )
505 : {
506 21849588 : hGrid->tile[t] = 0;
507 21849588 : hGrid->sbWrap[t - 1] = 0;
508 21849588 : hGrid->sfbWrap[t] = 0;
509 : }
510 :
511 5071272 : return;
512 : }
513 :
514 :
515 : /*---------------------------------------------------------------------*
516 : * IGFCommonFuncsIGFConfiguration()
517 : *
518 : * changes the IGF configuration
519 : *---------------------------------------------------------------------*/
520 :
521 : /*! r: error value: 0 -> error, 1 -> ok */
522 1690424 : int16_t IGFCommonFuncsIGFConfiguration(
523 : const int32_t total_brate, /* i : bitrate in bs e.g. 9600 for 9.6kbs */
524 : const int16_t bwidth, /* i : audio bandwidth */
525 : const int16_t element_mode, /* i : element mode */
526 : H_IGF_INFO hIGFInfo, /* o : IGF info handle */
527 : const int16_t rf_mode /* i : flag to signal the RF mode */
528 : )
529 : {
530 : H_IGF_GRID hGrid;
531 : int16_t retValue;
532 : int32_t sampleRate;
533 : int16_t frameLength;
534 : int16_t igfMinFq;
535 : int16_t maxHopsize;
536 :
537 1690424 : retValue = 0; /* bitrate index is unknown -> error! */
538 :
539 : /* interface call for reading in settings */
540 1690424 : hIGFInfo->bitRateIndex = IGF_MapBitRateToIndex( total_brate, bwidth, element_mode, rf_mode );
541 :
542 1690424 : if ( hIGFInfo->bitRateIndex != IGF_BITRATE_UNKNOWN )
543 : {
544 1690424 : retValue = 1; /* no error */
545 :
546 : /* mapping to local values */
547 1690424 : sampleRate = igfMode[hIGFInfo->bitRateIndex].sampleRate;
548 1690424 : frameLength = igfMode[hIGFInfo->bitRateIndex].frameLength;
549 1690424 : igfMinFq = igfMode[hIGFInfo->bitRateIndex].igfMinFq;
550 1690424 : maxHopsize = igfMode[hIGFInfo->bitRateIndex].maxHopsize;
551 :
552 : /* basic information */
553 1690424 : hIGFInfo->sampleRate = sampleRate;
554 1690424 : hIGFInfo->frameLength = frameLength;
555 1690424 : hIGFInfo->maxHopsize = maxHopsize;
556 1690424 : hIGFInfo->nfSeedBuf[0] = 0;
557 1690424 : hIGFInfo->nfSeedBuf[1] = 0;
558 1690424 : hIGFInfo->nfSeed = &hIGFInfo->nfSeedBuf[0];
559 :
560 : /* set up regular IGF grid for TCX 20 (transfac = 1.f) */
561 1690424 : hGrid = &hIGFInfo->grid[IGF_GRID_LB_NORM];
562 1690424 : IGF_gridSetUp( hGrid, hIGFInfo->bitRateIndex, sampleRate, frameLength, 1.00f, igfMinFq );
563 :
564 : /* set up IGF grid for CELP->TCX 20 transitions (transfac = 1.25) */
565 1690424 : hGrid = &hIGFInfo->grid[IGF_GRID_LB_TRAN];
566 1690424 : IGF_gridSetUp( hGrid, hIGFInfo->bitRateIndex, sampleRate, frameLength, 1.25f, igfMinFq );
567 :
568 : /* set up IGF grid for TCX 10 (transfac = 0.5) */
569 1690424 : hGrid = &hIGFInfo->grid[IGF_GRID_LB_SHORT];
570 1690424 : IGF_gridSetUp( hGrid, hIGFInfo->bitRateIndex, sampleRate, frameLength, 0.50f, igfMinFq );
571 : }
572 :
573 1690424 : return retValue;
574 : }
575 :
576 :
577 : /*---------------------------------------------------------------------*
578 : * IGFCommonFuncsIGFGetCFTables()
579 : *
580 : * selects cumulative frequency tables and offsets for the IGF SCF arithmetic coder
581 : *---------------------------------------------------------------------*/
582 :
583 : /*! r: error value: 0 -> error, 1 -> ok */
584 1690424 : int16_t IGFCommonFuncsIGFGetCFTables(
585 : const int32_t total_brate, /* i : bitrate in bs e.g. 9600 for 9.6kbs */
586 : const int16_t bwidth, /* i : audio bandwidth */
587 : const int16_t element_mode, /* i : element mode */
588 : const int16_t rf_mode, /* i : flag to signal the RF mode */
589 : const uint16_t **cf_se00, /* o : CF table for t == 0 and f == 0 */
590 : const uint16_t **cf_se01, /* o : CF table for t == 0 and f == 1 */
591 : int16_t *cf_off_se01, /* o : offset for CF table above */
592 : const uint16_t **cf_se02, /* o : CF tables for t == 0 and f >= 2 */
593 : const int16_t **cf_off_se02, /* o : offsets for CF tables above */
594 : const uint16_t **cf_se10, /* o : CF table for t == 1 and f == 0 */
595 : int16_t *cf_off_se10, /* o : offset for CF table above */
596 : const uint16_t **cf_se11, /* o : CF tables for t == 1 and f >= 1 */
597 : const int16_t **cf_off_se11 /* o : offsets for CF tables above */
598 : )
599 : {
600 : int16_t retValue;
601 : int16_t bitRateIndex;
602 :
603 1690424 : retValue = 0; /* bitrate index is unknown -> error! */
604 :
605 1690424 : bitRateIndex = IGF_MapBitRateToIndex( total_brate, bwidth, element_mode, rf_mode );
606 :
607 1690424 : if ( bitRateIndex != IGF_BITRATE_UNKNOWN )
608 : {
609 1690424 : retValue = 1; /* no error */
610 :
611 1690424 : switch ( bitRateIndex )
612 : {
613 2568 : case IGF_BITRATE_WB_13200_CPE:
614 2568 : bitRateIndex = IGF_BITRATE_WB_9600;
615 2568 : break;
616 1606 : case IGF_BITRATE_WB_16400_CPE:
617 1606 : bitRateIndex = IGF_BITRATE_WB_9600;
618 1606 : break;
619 81335 : case IGF_BITRATE_SWB_13200_CPE:
620 81335 : bitRateIndex = IGF_BITRATE_SWB_9600;
621 81335 : break;
622 75766 : case IGF_BITRATE_SWB_16400_CPE:
623 75766 : bitRateIndex = IGF_BITRATE_SWB_13200;
624 75766 : break;
625 84323 : case IGF_BITRATE_SWB_24400_CPE:
626 84323 : bitRateIndex = IGF_BITRATE_SWB_16400;
627 84323 : break;
628 87225 : case IGF_BITRATE_FB_24400_CPE:
629 87225 : bitRateIndex = IGF_BITRATE_FB_16400;
630 87225 : break;
631 58517 : case IGF_BITRATE_SWB_32000_CPE:
632 58517 : bitRateIndex = IGF_BITRATE_SWB_24400;
633 58517 : break;
634 140195 : case IGF_BITRATE_FB_32000_CPE:
635 140195 : bitRateIndex = IGF_BITRATE_FB_24400;
636 140195 : break;
637 435748 : case IGF_BITRATE_FB_48000_CPE:
638 : case IGF_BITRATE_FB_64000_CPE:
639 435748 : bitRateIndex = IGF_BITRATE_FB_32000;
640 435748 : break;
641 : }
642 :
643 1690424 : switch ( bitRateIndex )
644 : {
645 345637 : case IGF_BITRATE_WB_9600:
646 : case IGF_BITRATE_RF_WB_13200:
647 : case IGF_BITRATE_SWB_9600:
648 : case IGF_BITRATE_SWB_13200:
649 : case IGF_BITRATE_RF_SWB_13200:
650 : case IGF_BITRATE_SWB_16400:
651 : case IGF_BITRATE_SWB_24400:
652 : case IGF_BITRATE_SWB_32000:
653 : case IGF_BITRATE_SWB_48000:
654 : case IGF_BITRATE_SWB_64000:
655 345637 : *cf_se00 = cf_se00_tab;
656 345637 : *cf_se01 = cf_se01_tab[bitRateIndex];
657 345637 : *cf_off_se01 = cf_off_se01_tab[bitRateIndex];
658 345637 : *cf_se02 = &cf_se02_tab[bitRateIndex][0][0];
659 345637 : *cf_off_se02 = &cf_off_se02_tab[bitRateIndex][0];
660 345637 : *cf_se10 = &cf_se10_tab[0];
661 345637 : *cf_off_se10 = cf_off_se10_tab;
662 345637 : *cf_se11 = &cf_se11_tab[0][0][0];
663 345637 : *cf_off_se11 = &cf_off_se11_tab[0][0];
664 345637 : break;
665 734880 : case IGF_BITRATE_FB_16400:
666 : case IGF_BITRATE_FB_24400:
667 : case IGF_BITRATE_FB_32000:
668 734880 : bitRateIndex = bitRateIndex - IGF_BITRATE_FB_16400 + IGF_BITRATE_SWB_16400;
669 734880 : *cf_se00 = cf_se00_tab;
670 734880 : *cf_se01 = cf_se01_tab[bitRateIndex];
671 734880 : *cf_off_se01 = cf_off_se01_tab[bitRateIndex];
672 734880 : *cf_se02 = &cf_se02_tab[bitRateIndex][0][0];
673 734880 : *cf_off_se02 = &cf_off_se02_tab[bitRateIndex][0];
674 734880 : *cf_se10 = &cf_se10_tab[0];
675 734880 : *cf_off_se10 = cf_off_se10_tab;
676 734880 : *cf_se11 = &cf_se11_tab[0][0][0];
677 734880 : *cf_off_se11 = &cf_off_se11_tab[0][0];
678 734880 : break;
679 91691 : case IGF_BITRATE_FB_48000:
680 : case IGF_BITRATE_FB_64000:
681 91691 : bitRateIndex = bitRateIndex - IGF_BITRATE_FB_48000 + IGF_BITRATE_SWB_48000;
682 91691 : *cf_se00 = cf_se00_tab;
683 91691 : *cf_se01 = cf_se01_tab[bitRateIndex];
684 91691 : *cf_off_se01 = cf_off_se01_tab[bitRateIndex];
685 91691 : *cf_se02 = &cf_se02_tab[bitRateIndex][0][0];
686 91691 : *cf_off_se02 = &cf_off_se02_tab[bitRateIndex][0];
687 91691 : *cf_se10 = &cf_se10_tab[0];
688 91691 : *cf_off_se10 = cf_off_se10_tab;
689 91691 : *cf_se11 = &cf_se11_tab[0][0][0];
690 91691 : *cf_off_se11 = &cf_off_se11_tab[0][0];
691 91691 : break;
692 370121 : case IGF_BITRATE_FB_96000:
693 : case IGF_BITRATE_FB_128000:
694 : case IGF_BITRATE_FB_80000_CPE:
695 : case IGF_BITRATE_FB_96000_CPE:
696 : case IGF_BITRATE_FB_128000_CPE:
697 370121 : bitRateIndex = IGF_BITRATE_SWB_48000;
698 370121 : *cf_se00 = cf_se00_tab;
699 370121 : *cf_se01 = cf_se01_tab[bitRateIndex];
700 370121 : *cf_off_se01 = cf_off_se01_tab[bitRateIndex];
701 370121 : *cf_se02 = &cf_se02_tab[bitRateIndex][0][0];
702 370121 : *cf_off_se02 = &cf_off_se02_tab[bitRateIndex][0];
703 370121 : *cf_se10 = &cf_se10_tab[0];
704 370121 : *cf_off_se10 = cf_off_se10_tab;
705 370121 : *cf_se11 = &cf_se11_tab[0][0][0];
706 370121 : *cf_off_se11 = &cf_off_se11_tab[0][0];
707 370121 : break;
708 44339 : case IGF_BITRATE_SWB_48000_CPE:
709 44339 : bitRateIndex = IGF_BITRATE_SWB_16400;
710 44339 : *cf_se00 = cf_se00_tab;
711 44339 : *cf_se01 = cf_se01_tab[bitRateIndex];
712 44339 : *cf_off_se01 = cf_off_se01_tab[bitRateIndex];
713 44339 : *cf_se02 = &cf_se02_tab[bitRateIndex][0][0];
714 44339 : *cf_off_se02 = &cf_off_se02_tab[bitRateIndex][0];
715 44339 : *cf_se10 = &cf_se10_tab[0];
716 44339 : *cf_off_se10 = cf_off_se10_tab;
717 44339 : *cf_se11 = &cf_se11_tab[0][0][0];
718 44339 : *cf_off_se11 = &cf_off_se11_tab[0][0];
719 44339 : break;
720 103756 : case IGF_BITRATE_SWB_64000_CPE:
721 : case IGF_BITRATE_SWB_80000_CPE:
722 : case IGF_BITRATE_SWB_96000_CPE:
723 103756 : bitRateIndex = IGF_BITRATE_SWB_48000; /*bitRateIndex-IGF_BITRATE_SWB_56000+IGF_BITRATE_SWB_48000;*/
724 103756 : *cf_se00 = cf_se00_tab;
725 103756 : *cf_se01 = cf_se01_tab[bitRateIndex];
726 103756 : *cf_off_se01 = cf_off_se01_tab[bitRateIndex];
727 103756 : *cf_se02 = &cf_se02_tab[bitRateIndex][0][0];
728 103756 : *cf_off_se02 = &cf_off_se02_tab[bitRateIndex][0];
729 103756 : *cf_se10 = &cf_se10_tab[0];
730 103756 : *cf_off_se10 = cf_off_se10_tab;
731 103756 : *cf_se11 = &cf_se11_tab[0][0][0];
732 103756 : *cf_off_se11 = &cf_off_se11_tab[0][0];
733 103756 : break;
734 0 : case IGF_BITRATE_UNKNOWN:
735 : default:
736 0 : assert( 0 );
737 : }
738 0 : }
739 :
740 1690424 : return retValue;
741 : }
|