1 /* ----------------------------------------------------------------------------- 2 Software License for The Fraunhofer FDK AAC Codec Library for Android 3 4 Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Frderung der angewandten 5 Forschung e.V. All rights reserved. 6 7 1. INTRODUCTION 8 The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software 9 that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding 10 scheme for digital audio. This FDK AAC Codec software is intended to be used on 11 a wide variety of Android devices. 12 13 AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient 14 general perceptual audio codecs. AAC-ELD is considered the best-performing 15 full-bandwidth communications codec by independent studies and is widely 16 deployed. AAC has been standardized by ISO and IEC as part of the MPEG 17 specifications. 18 19 Patent licenses for necessary patent claims for the FDK AAC Codec (including 20 those of Fraunhofer) may be obtained through Via Licensing 21 (www.vialicensing.com) or through the respective patent owners individually for 22 the purpose of encoding or decoding bit streams in products that are compliant 23 with the ISO/IEC MPEG audio standards. Please note that most manufacturers of 24 Android devices already license these patent claims through Via Licensing or 25 directly from the patent owners, and therefore FDK AAC Codec software may 26 already be covered under those patent licenses when it is used for those 27 licensed purposes only. 28 29 Commercially-licensed AAC software libraries, including floating-point versions 30 with enhanced sound quality, are also available from Fraunhofer. Users are 31 encouraged to check the Fraunhofer website for additional applications 32 information and documentation. 33 34 2. COPYRIGHT LICENSE 35 36 Redistribution and use in source and binary forms, with or without modification, 37 are permitted without payment of copyright license fees provided that you 38 satisfy the following conditions: 39 40 You must retain the complete text of this software license in redistributions of 41 the FDK AAC Codec or your modifications thereto in source code form. 42 43 You must retain the complete text of this software license in the documentation 44 and/or other materials provided with redistributions of the FDK AAC Codec or 45 your modifications thereto in binary form. You must make available free of 46 charge copies of the complete source code of the FDK AAC Codec and your 47 modifications thereto to recipients of copies in binary form. 48 49 The name of Fraunhofer may not be used to endorse or promote products derived 50 from this library without prior written permission. 51 52 You may not charge copyright license fees for anyone to use, copy or distribute 53 the FDK AAC Codec software or your modifications thereto. 54 55 Your modified versions of the FDK AAC Codec must carry prominent notices stating 56 that you changed the software and the date of any change. For modified versions 57 of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" 58 must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK 59 AAC Codec Library for Android." 60 61 3. NO PATENT LICENSE 62 63 NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without 64 limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. 65 Fraunhofer provides no warranty of patent non-infringement with respect to this 66 software. 67 68 You may use this FDK AAC Codec software or modifications thereto only for 69 purposes that are authorized by appropriate patent licenses. 70 71 4. DISCLAIMER 72 73 This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright 74 holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, 75 including but not limited to the implied warranties of merchantability and 76 fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 77 CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, 78 or consequential damages, including but not limited to procurement of substitute 79 goods or services; loss of use, data, or profits, or business interruption, 80 however caused and on any theory of liability, whether in contract, strict 81 liability, or tort (including negligence), arising in any way out of the use of 82 this software, even if advised of the possibility of such damage. 83 84 5. CONTACT INFORMATION 85 86 Fraunhofer Institute for Integrated Circuits IIS 87 Attention: Audio and Multimedia Departments - FDK AAC LL 88 Am Wolfsmantel 33 89 91058 Erlangen, Germany 90 91 www.iis.fraunhofer.de/amm 92 amm-info (at) iis.fraunhofer.de 93 ----------------------------------------------------------------------------- */ 94 95 /**************************** SBR encoder library ****************************** 96 97 Author(s): Andreas Ehret, Tobias Chalupka 98 99 Description: SBR encoder top level processing. 100 101 *******************************************************************************/ 102 103 #include "sbr_encoder.h" 104 105 #include "sbrenc_ram.h" 106 #include "sbrenc_rom.h" 107 #include "sbrenc_freq_sca.h" 108 #include "env_bit.h" 109 #include "cmondata.h" 110 #include "sbr_misc.h" 111 #include "sbr.h" 112 #include "qmf.h" 113 114 #include "ps_main.h" 115 116 #define SBRENCODER_LIB_VL0 4 117 #define SBRENCODER_LIB_VL1 0 118 #define SBRENCODER_LIB_VL2 0 119 120 /***************************************************************************/ 121 /* 122 * SBR Delay balancing definitions. 123 */ 124 125 /* 126 input buffer (1ch) 127 128 |------------ 1537 -------------|-----|---------- 2048 -------------| 129 (core2sbr delay ) ds (read, core and ds area) 130 */ 131 132 #define SFB(dwnsmp) \ 133 (32 << (dwnsmp - \ 134 1)) /* SBR Frequency bands: 64 for dual-rate, 32 for single-rate */ 135 #define STS(fl) \ 136 (((fl) == 1024) ? 32 \ 137 : 30) /* SBR Time Slots: 32 for core frame length 1024, 30 \ 138 for core frame length 960 */ 139 140 #define DELAY_QMF_ANA(dwnsmp) \ 141 ((320 << ((dwnsmp)-1)) - (32 << ((dwnsmp)-1))) /* Full bandwidth */ 142 #define DELAY_HYB_ANA (10 * 64) /* + 0.5 */ /* */ 143 #define DELAY_HYB_SYN (6 * 64 - 32) /* */ 144 #define DELAY_QMF_POSTPROC(dwnsmp) \ 145 (32 * (dwnsmp)) /* QMF postprocessing delay */ 146 #define DELAY_DEC_QMF(dwnsmp) (6 * SFB(dwnsmp)) /* Decoder QMF overlap */ 147 #define DELAY_QMF_SYN(dwnsmp) \ 148 (1 << (dwnsmp - \ 149 1)) /* QMF_NO_POLY/2=2.5, rounded down to 2, half for single-rate */ 150 #define DELAY_QMF_DS (32) /* QMF synthesis for downsampled time signal */ 151 152 /* Delay in QMF paths */ 153 #define DELAY_SBR(fl, dwnsmp) \ 154 (DELAY_QMF_ANA(dwnsmp) + (SFB(dwnsmp) * STS(fl) - 1) + DELAY_QMF_SYN(dwnsmp)) 155 #define DELAY_PS(fl, dwnsmp) \ 156 (DELAY_QMF_ANA(dwnsmp) + DELAY_HYB_ANA + DELAY_DEC_QMF(dwnsmp) + \ 157 (SFB(dwnsmp) * STS(fl) - 1) + DELAY_HYB_SYN + DELAY_QMF_SYN(dwnsmp)) 158 #define DELAY_ELDSBR(fl, dwnsmp) \ 159 ((((fl) / 2) * (dwnsmp)) - 1 + DELAY_QMF_POSTPROC(dwnsmp)) 160 #define DELAY_ELDv2SBR(fl, dwnsmp) \ 161 ((((fl) / 2) * (dwnsmp)) - 1 + 80 * (dwnsmp)) /* 80 is the delay caused \ 162 by the sum of the CLD \ 163 analysis and the MPSLD \ 164 synthesis filterbank */ 165 166 /* Delay in core path (core and downsampler not taken into account) */ 167 #define DELAY_COREPATH_SBR(fl, dwnsmp) \ 168 ((DELAY_QMF_ANA(dwnsmp) + DELAY_DEC_QMF(dwnsmp) + DELAY_QMF_SYN(dwnsmp))) 169 #define DELAY_COREPATH_ELDSBR(fl, dwnsmp) ((DELAY_QMF_POSTPROC(dwnsmp))) 170 #define DELAY_COREPATH_ELDv2SBR(fl, dwnsmp) (128 * (dwnsmp)) /* 4 slots */ 171 #define DELAY_COREPATH_PS(fl, dwnsmp) \ 172 ((DELAY_QMF_ANA(dwnsmp) + DELAY_QMF_DS + \ 173 /*(DELAY_AAC(fl)*2) + */ DELAY_QMF_ANA(dwnsmp) + DELAY_DEC_QMF(dwnsmp) + \ 174 DELAY_HYB_SYN + DELAY_QMF_SYN(dwnsmp))) /* 2048 - 463*2 */ 175 176 /* Delay differences between SBR- and downsampled path for SBR and SBR+PS */ 177 #define DELAY_AAC2SBR(fl, dwnsmp) \ 178 ((DELAY_COREPATH_SBR(fl, dwnsmp)) - DELAY_SBR((fl), (dwnsmp))) 179 #define DELAY_ELD2SBR(fl, dwnsmp) \ 180 ((DELAY_COREPATH_ELDSBR(fl, dwnsmp)) - DELAY_ELDSBR(fl, dwnsmp)) 181 #define DELAY_AAC2PS(fl, dwnsmp) \ 182 ((DELAY_COREPATH_PS(fl, dwnsmp)) - DELAY_PS(fl, dwnsmp)) /* 2048 - 463*2 */ 183 184 /* Assumption: The sample delay resulting of of DELAY_AAC2PS is always smaller 185 * than the sample delay implied by DELAY_AAC2SBR */ 186 #define MAX_DS_FILTER_DELAY \ 187 (5) /* the additional max downsampler filter delay (source fs) */ 188 #define MAX_SAMPLE_DELAY \ 189 (DELAY_AAC2SBR(1024, 2) + MAX_DS_FILTER_DELAY) /* maximum delay: frame \ 190 length of 1024 and \ 191 dual-rate sbr */ 192 193 /***************************************************************************/ 194 195 /*************** Delay parameters for sbrEncoder_Init_delay() **************/ 196 typedef struct { 197 int dsDelay; /* the delay of the (time-domain) downsampler itself */ 198 int delay; /* overall delay / samples */ 199 int sbrDecDelay; /* SBR decoder's delay */ 200 int corePathOffset; /* core path offset / samples; added by 201 sbrEncoder_Init_delay() */ 202 int sbrPathOffset; /* SBR path offset / samples; added by 203 sbrEncoder_Init_delay() */ 204 int bitstrDelay; /* bitstream delay / frames; added by sbrEncoder_Init_delay() 205 */ 206 int delayInput2Core; /* delay of the input to the core / samples */ 207 } DELAY_PARAM; 208 /***************************************************************************/ 209 210 #define INVALID_TABLE_IDX -1 211 212 /***************************************************************************/ 213 /*! 214 215 \brief Selects the SBR tuning settings to use dependent on number of 216 channels, bitrate, sample rate and core coder 217 218 \return Index to the appropriate table 219 220 ****************************************************************************/ 221 #define DISTANCE_CEIL_VALUE 5000000 222 static INT getSbrTuningTableIndex( 223 UINT bitrate, /*! the total bitrate in bits/sec */ 224 UINT numChannels, /*! the number of channels for the core coder */ 225 UINT sampleRate, /*! the sampling rate of the core coder */ 226 AUDIO_OBJECT_TYPE core, UINT *pBitRateClosest) { 227 int i, bitRateClosestLowerIndex = -1, bitRateClosestUpperIndex = -1, 228 found = 0; 229 UINT bitRateClosestUpper = 0, bitRateClosestLower = DISTANCE_CEIL_VALUE; 230 231 #define isForThisCore(i) \ 232 ((sbrTuningTable[i].coreCoder == CODEC_AACLD && core == AOT_ER_AAC_ELD) || \ 233 (sbrTuningTable[i].coreCoder == CODEC_AAC && core != AOT_ER_AAC_ELD)) 234 235 for (i = 0; i < sbrTuningTableSize; i++) { 236 if (isForThisCore(i)) /* tuning table is for this core codec */ 237 { 238 if (numChannels == sbrTuningTable[i].numChannels && 239 sampleRate == sbrTuningTable[i].sampleRate) { 240 found = 1; 241 if ((bitrate >= sbrTuningTable[i].bitrateFrom) && 242 (bitrate < sbrTuningTable[i].bitrateTo)) { 243 return i; 244 } else { 245 if (sbrTuningTable[i].bitrateFrom > bitrate) { 246 if (sbrTuningTable[i].bitrateFrom < bitRateClosestLower) { 247 bitRateClosestLower = sbrTuningTable[i].bitrateFrom; 248 bitRateClosestLowerIndex = i; 249 } 250 } 251 if (sbrTuningTable[i].bitrateTo <= bitrate) { 252 if (sbrTuningTable[i].bitrateTo > bitRateClosestUpper) { 253 bitRateClosestUpper = sbrTuningTable[i].bitrateTo - 1; 254 bitRateClosestUpperIndex = i; 255 } 256 } 257 } 258 } 259 } 260 } 261 262 if (bitRateClosestUpperIndex >= 0) { 263 return bitRateClosestUpperIndex; 264 } 265 266 if (pBitRateClosest != NULL) { 267 /* If there was at least one matching tuning entry pick the least distance 268 * bit rate */ 269 if (found) { 270 int distanceUpper = DISTANCE_CEIL_VALUE, 271 distanceLower = DISTANCE_CEIL_VALUE; 272 if (bitRateClosestLowerIndex >= 0) { 273 distanceLower = 274 sbrTuningTable[bitRateClosestLowerIndex].bitrateFrom - bitrate; 275 } 276 if (bitRateClosestUpperIndex >= 0) { 277 distanceUpper = 278 bitrate - sbrTuningTable[bitRateClosestUpperIndex].bitrateTo; 279 } 280 if (distanceUpper < distanceLower) { 281 *pBitRateClosest = bitRateClosestUpper; 282 } else { 283 *pBitRateClosest = bitRateClosestLower; 284 } 285 } else { 286 *pBitRateClosest = 0; 287 } 288 } 289 290 return INVALID_TABLE_IDX; 291 } 292 293 /***************************************************************************/ 294 /*! 295 296 \brief Selects the PS tuning settings to use dependent on bitrate 297 and core coder 298 299 \return Index to the appropriate table 300 301 ****************************************************************************/ 302 static INT getPsTuningTableIndex(UINT bitrate, UINT *pBitRateClosest) { 303 INT i, paramSets = sizeof(psTuningTable) / sizeof(psTuningTable[0]); 304 int bitRateClosestLowerIndex = -1, bitRateClosestUpperIndex = -1; 305 UINT bitRateClosestUpper = 0, bitRateClosestLower = DISTANCE_CEIL_VALUE; 306 307 for (i = 0; i < paramSets; i++) { 308 if ((bitrate >= psTuningTable[i].bitrateFrom) && 309 (bitrate < psTuningTable[i].bitrateTo)) { 310 return i; 311 } else { 312 if (psTuningTable[i].bitrateFrom > bitrate) { 313 if (psTuningTable[i].bitrateFrom < bitRateClosestLower) { 314 bitRateClosestLower = psTuningTable[i].bitrateFrom; 315 bitRateClosestLowerIndex = i; 316 } 317 } 318 if (psTuningTable[i].bitrateTo <= bitrate) { 319 if (psTuningTable[i].bitrateTo > bitRateClosestUpper) { 320 bitRateClosestUpper = psTuningTable[i].bitrateTo - 1; 321 bitRateClosestUpperIndex = i; 322 } 323 } 324 } 325 } 326 327 if (bitRateClosestUpperIndex >= 0) { 328 return bitRateClosestUpperIndex; 329 } 330 331 if (pBitRateClosest != NULL) { 332 int distanceUpper = DISTANCE_CEIL_VALUE, 333 distanceLower = DISTANCE_CEIL_VALUE; 334 if (bitRateClosestLowerIndex >= 0) { 335 distanceLower = 336 sbrTuningTable[bitRateClosestLowerIndex].bitrateFrom - bitrate; 337 } 338 if (bitRateClosestUpperIndex >= 0) { 339 distanceUpper = 340 bitrate - sbrTuningTable[bitRateClosestUpperIndex].bitrateTo; 341 } 342 if (distanceUpper < distanceLower) { 343 *pBitRateClosest = bitRateClosestUpper; 344 } else { 345 *pBitRateClosest = bitRateClosestLower; 346 } 347 } 348 349 return INVALID_TABLE_IDX; 350 } 351 352 /***************************************************************************/ 353 /*! 354 355 \brief In case of downsampled SBR we may need to lower the stop freq 356 of a tuning setting to fit into the lower half of the 357 spectrum ( which is sampleRate/4 ) 358 359 \return the adapted stop frequency index (-1 -> error) 360 361 \ingroup SbrEncCfg 362 363 ****************************************************************************/ 364 static INT FDKsbrEnc_GetDownsampledStopFreq(const INT sampleRateCore, 365 const INT startFreq, INT stopFreq, 366 const INT downSampleFactor) { 367 INT maxStopFreqRaw = sampleRateCore / 2; 368 INT startBand, stopBand; 369 HANDLE_ERROR_INFO err; 370 371 while (stopFreq > 0 && FDKsbrEnc_getSbrStopFreqRAW(stopFreq, sampleRateCore) > 372 maxStopFreqRaw) { 373 stopFreq--; 374 } 375 376 if (FDKsbrEnc_getSbrStopFreqRAW(stopFreq, sampleRateCore) > maxStopFreqRaw) 377 return -1; 378 379 err = FDKsbrEnc_FindStartAndStopBand( 380 sampleRateCore << (downSampleFactor - 1), sampleRateCore, 381 32 << (downSampleFactor - 1), startFreq, stopFreq, &startBand, &stopBand); 382 if (err) return -1; 383 384 return stopFreq; 385 } 386 387 /***************************************************************************/ 388 /*! 389 390 \brief tells us, if for the given coreCoder, bitrate, number of channels 391 and input sampling rate an SBR setting is available. If yes, it 392 tells us also the core sampling rate we would need to run with 393 394 \return a flag indicating success: yes (1) or no (0) 395 396 ****************************************************************************/ 397 static UINT FDKsbrEnc_IsSbrSettingAvail( 398 UINT bitrate, /*! the total bitrate in bits/sec */ 399 UINT vbrMode, /*! the vbr paramter, 0 means constant bitrate */ 400 UINT numOutputChannels, /*! the number of channels for the core coder */ 401 UINT sampleRateInput, /*! the input sample rate [in Hz] */ 402 UINT sampleRateCore, /*! the core's sampling rate */ 403 AUDIO_OBJECT_TYPE core) { 404 INT idx = INVALID_TABLE_IDX; 405 406 if (sampleRateInput < 16000) return 0; 407 408 if (bitrate == 0) { 409 /* map vbr quality to bitrate */ 410 if (vbrMode < 30) 411 bitrate = 24000; 412 else if (vbrMode < 40) 413 bitrate = 28000; 414 else if (vbrMode < 60) 415 bitrate = 32000; 416 else if (vbrMode < 75) 417 bitrate = 40000; 418 else 419 bitrate = 48000; 420 bitrate *= numOutputChannels; 421 } 422 423 idx = getSbrTuningTableIndex(bitrate, numOutputChannels, sampleRateCore, core, 424 NULL); 425 426 return (idx == INVALID_TABLE_IDX ? 0 : 1); 427 } 428 429 /***************************************************************************/ 430 /*! 431 432 \brief Adjusts the SBR settings according to the chosen core coder 433 settings which are accessible via config->codecSettings 434 435 \return A flag indicating success: yes (1) or no (0) 436 437 ****************************************************************************/ 438 static UINT FDKsbrEnc_AdjustSbrSettings( 439 const sbrConfigurationPtr config, /*! output, modified */ 440 UINT bitRate, /*! the total bitrate in bits/sec */ 441 UINT numChannels, /*! the core coder number of channels */ 442 UINT sampleRateCore, /*! the core coder sampling rate in Hz */ 443 UINT sampleRateSbr, /*! the sbr coder sampling rate in Hz */ 444 UINT transFac, /*! the short block to long block ratio */ 445 UINT standardBitrate, /*! the standard bitrate per channel in bits/sec */ 446 UINT vbrMode, /*! the vbr paramter, 0 poor quality .. 100 high quality*/ 447 UINT useSpeechConfig, /*!< adapt tuning parameters for speech ? */ 448 UINT lcsMode, /*! the low complexity stereo mode */ 449 UINT bParametricStereo, /*!< use parametric stereo */ 450 AUDIO_OBJECT_TYPE core) /* Core audio codec object type */ 451 { 452 INT idx = INVALID_TABLE_IDX; 453 /* set the core codec settings */ 454 config->codecSettings.bitRate = bitRate; 455 config->codecSettings.nChannels = numChannels; 456 config->codecSettings.sampleFreq = sampleRateCore; 457 config->codecSettings.transFac = transFac; 458 config->codecSettings.standardBitrate = standardBitrate; 459 460 if (bitRate < 28000) { 461 config->threshold_AmpRes_FF_m = (FIXP_DBL)MAXVAL_DBL; 462 config->threshold_AmpRes_FF_e = 7; 463 } else if (bitRate >= 28000 && bitRate <= 48000) { 464 /* The float threshold is 75 465 0.524288f is fractional part of RELAXATION, the quotaMatrix and therefore 466 tonality are scaled by this 2/3 is because the original implementation 467 divides the tonality values by 3, here it's divided by 2 128 compensates 468 the necessary shiftfactor of 7 */ 469 config->threshold_AmpRes_FF_m = 470 FL2FXCONST_DBL(75.0f * 0.524288f / (2.0f / 3.0f) / 128.0f); 471 config->threshold_AmpRes_FF_e = 7; 472 } else if (bitRate > 48000) { 473 config->threshold_AmpRes_FF_m = FL2FXCONST_DBL(0); 474 config->threshold_AmpRes_FF_e = 0; 475 } 476 477 if (bitRate == 0) { 478 /* map vbr quality to bitrate */ 479 if (vbrMode < 30) 480 bitRate = 24000; 481 else if (vbrMode < 40) 482 bitRate = 28000; 483 else if (vbrMode < 60) 484 bitRate = 32000; 485 else if (vbrMode < 75) 486 bitRate = 40000; 487 else 488 bitRate = 48000; 489 bitRate *= numChannels; 490 /* fix to enable mono vbrMode<40 @ 44.1 of 48kHz */ 491 if (numChannels == 1) { 492 if (sampleRateSbr == 44100 || sampleRateSbr == 48000) { 493 if (vbrMode < 40) bitRate = 32000; 494 } 495 } 496 } 497 498 idx = 499 getSbrTuningTableIndex(bitRate, numChannels, sampleRateCore, core, NULL); 500 501 if (idx != INVALID_TABLE_IDX) { 502 config->startFreq = sbrTuningTable[idx].startFreq; 503 config->stopFreq = sbrTuningTable[idx].stopFreq; 504 if (useSpeechConfig) { 505 config->startFreq = sbrTuningTable[idx].startFreqSpeech; 506 config->stopFreq = sbrTuningTable[idx].stopFreqSpeech; 507 } 508 509 /* Adapt stop frequency in case of downsampled SBR - only 32 bands then */ 510 if (1 == config->downSampleFactor) { 511 INT dsStopFreq = FDKsbrEnc_GetDownsampledStopFreq( 512 sampleRateCore, config->startFreq, config->stopFreq, 513 config->downSampleFactor); 514 if (dsStopFreq < 0) { 515 return 0; 516 } 517 518 config->stopFreq = dsStopFreq; 519 } 520 521 config->sbr_noise_bands = sbrTuningTable[idx].numNoiseBands; 522 if (core == AOT_ER_AAC_ELD) config->init_amp_res_FF = SBR_AMP_RES_1_5; 523 config->noiseFloorOffset = sbrTuningTable[idx].noiseFloorOffset; 524 525 config->ana_max_level = sbrTuningTable[idx].noiseMaxLevel; 526 config->stereoMode = sbrTuningTable[idx].stereoMode; 527 config->freqScale = sbrTuningTable[idx].freqScale; 528 529 if (numChannels == 1) { 530 /* stereo case */ 531 switch (core) { 532 case AOT_AAC_LC: 533 if (bitRate <= (useSpeechConfig ? 24000U : 20000U)) { 534 config->freq_res_fixfix[0] = FREQ_RES_LOW; /* set low frequency 535 resolution for 536 non-split frames */ 537 config->freq_res_fixfix[1] = FREQ_RES_LOW; /* set low frequency 538 resolution for split 539 frames */ 540 } 541 break; 542 case AOT_ER_AAC_ELD: 543 if (bitRate < 36000) 544 config->freq_res_fixfix[1] = FREQ_RES_LOW; /* set low frequency 545 resolution for split 546 frames */ 547 if (bitRate < 26000) { 548 config->freq_res_fixfix[0] = FREQ_RES_LOW; /* set low frequency 549 resolution for 550 non-split frames */ 551 config->fResTransIsLow = 552 1; /* for transient frames, set low frequency resolution */ 553 } 554 break; 555 default: 556 break; 557 } 558 } else { 559 /* stereo case */ 560 switch (core) { 561 case AOT_AAC_LC: 562 if (bitRate <= 28000) { 563 config->freq_res_fixfix[0] = FREQ_RES_LOW; /* set low frequency 564 resolution for 565 non-split frames */ 566 config->freq_res_fixfix[1] = FREQ_RES_LOW; /* set low frequency 567 resolution for split 568 frames */ 569 } 570 break; 571 case AOT_ER_AAC_ELD: 572 if (bitRate < 72000) { 573 config->freq_res_fixfix[1] = FREQ_RES_LOW; /* set low frequency 574 resolution for split 575 frames */ 576 } 577 if (bitRate < 52000) { 578 config->freq_res_fixfix[0] = FREQ_RES_LOW; /* set low frequency 579 resolution for 580 non-split frames */ 581 config->fResTransIsLow = 582 1; /* for transient frames, set low frequency resolution */ 583 } 584 break; 585 default: 586 break; 587 } 588 if (bitRate <= 28000) { 589 /* 590 additionally restrict frequency resolution in FIXFIX frames 591 to further reduce SBR payload size */ 592 config->freq_res_fixfix[0] = FREQ_RES_LOW; 593 config->freq_res_fixfix[1] = FREQ_RES_LOW; 594 } 595 } 596 597 /* adjust usage of parametric coding dependent on bitrate and speech config 598 * flag */ 599 if (useSpeechConfig) config->parametricCoding = 0; 600 601 if (core == AOT_ER_AAC_ELD) { 602 if (bitRate < 28000) config->init_amp_res_FF = SBR_AMP_RES_3_0; 603 config->SendHeaderDataTime = -1; 604 } 605 606 if (numChannels == 1) { 607 if (bitRate < 16000) { 608 config->parametricCoding = 0; 609 } 610 } else { 611 if (bitRate < 20000) { 612 config->parametricCoding = 0; 613 } 614 } 615 616 config->useSpeechConfig = useSpeechConfig; 617 618 /* PS settings */ 619 config->bParametricStereo = bParametricStereo; 620 621 return 1; 622 } else { 623 return 0; 624 } 625 } 626 627 /***************************************************************************** 628 629 functionname: FDKsbrEnc_InitializeSbrDefaults 630 description: initializes the SBR configuration 631 returns: error status 632 input: - core codec type, 633 - factor of SBR to core frame length, 634 - core frame length 635 output: initialized SBR configuration 636 637 *****************************************************************************/ 638 static UINT FDKsbrEnc_InitializeSbrDefaults(sbrConfigurationPtr config, 639 INT downSampleFactor, 640 UINT codecGranuleLen, 641 const INT isLowDelay) { 642 if ((downSampleFactor < 1 || downSampleFactor > 2) || 643 (codecGranuleLen * downSampleFactor > 64 * 32)) 644 return (0); /* error */ 645 646 config->SendHeaderDataTime = 1000; 647 config->useWaveCoding = 0; 648 config->crcSbr = 0; 649 config->dynBwSupported = 1; 650 if (isLowDelay) 651 config->tran_thr = 6000; 652 else 653 config->tran_thr = 13000; 654 655 config->parametricCoding = 1; 656 657 config->sbrFrameSize = codecGranuleLen * downSampleFactor; 658 config->downSampleFactor = downSampleFactor; 659 660 /* sbr default parameters */ 661 config->sbr_data_extra = 0; 662 config->amp_res = SBR_AMP_RES_3_0; 663 config->tran_fc = 0; 664 config->tran_det_mode = 1; 665 config->spread = 1; 666 config->stat = 0; 667 config->e = 1; 668 config->deltaTAcrossFrames = 1; 669 config->dF_edge_1stEnv = FL2FXCONST_DBL(0.3f); 670 config->dF_edge_incr = FL2FXCONST_DBL(0.3f); 671 672 config->sbr_invf_mode = INVF_SWITCHED; 673 config->sbr_xpos_mode = XPOS_LC; 674 config->sbr_xpos_ctrl = SBR_XPOS_CTRL_DEFAULT; 675 config->sbr_xpos_level = 0; 676 config->useSaPan = 0; 677 config->dynBwEnabled = 0; 678 679 /* the following parameters are overwritten by the 680 FDKsbrEnc_AdjustSbrSettings() function since they are included in the 681 tuning table */ 682 config->stereoMode = SBR_SWITCH_LRC; 683 config->ana_max_level = 6; 684 config->noiseFloorOffset = 0; 685 config->startFreq = 5; /* 5.9 respectively 6.0 kHz at fs = 44.1/48 kHz */ 686 config->stopFreq = 9; /* 16.2 respectively 16.8 kHz at fs = 44.1/48 kHz */ 687 config->freq_res_fixfix[0] = FREQ_RES_HIGH; /* non-split case */ 688 config->freq_res_fixfix[1] = FREQ_RES_HIGH; /* split case */ 689 config->fResTransIsLow = 0; /* for transient frames, set variable frequency 690 resolution according to freqResTable */ 691 692 /* header_extra_1 */ 693 config->freqScale = SBR_FREQ_SCALE_DEFAULT; 694 config->alterScale = SBR_ALTER_SCALE_DEFAULT; 695 config->sbr_noise_bands = SBR_NOISE_BANDS_DEFAULT; 696 697 /* header_extra_2 */ 698 config->sbr_limiter_bands = SBR_LIMITER_BANDS_DEFAULT; 699 config->sbr_limiter_gains = SBR_LIMITER_GAINS_DEFAULT; 700 config->sbr_interpol_freq = SBR_INTERPOL_FREQ_DEFAULT; 701 config->sbr_smoothing_length = SBR_SMOOTHING_LENGTH_DEFAULT; 702 703 return 1; 704 } 705 706 /***************************************************************************** 707 708 functionname: DeleteEnvChannel 709 description: frees memory of one SBR channel 710 returns: - 711 input: handle of channel 712 output: released handle 713 714 *****************************************************************************/ 715 static void deleteEnvChannel(HANDLE_ENV_CHANNEL hEnvCut) { 716 if (hEnvCut) { 717 FDKsbrEnc_DeleteTonCorrParamExtr(&hEnvCut->TonCorr); 718 719 FDKsbrEnc_deleteExtractSbrEnvelope(&hEnvCut->sbrExtractEnvelope); 720 } 721 } 722 723 /***************************************************************************** 724 725 functionname: sbrEncoder_ChannelClose 726 description: close the channel coding handle 727 returns: 728 input: phSbrChannel 729 output: 730 731 *****************************************************************************/ 732 static void sbrEncoder_ChannelClose(HANDLE_SBR_CHANNEL hSbrChannel) { 733 if (hSbrChannel != NULL) { 734 deleteEnvChannel(&hSbrChannel->hEnvChannel); 735 } 736 } 737 738 /***************************************************************************** 739 740 functionname: sbrEncoder_ElementClose 741 description: close the channel coding handle 742 returns: 743 input: phSbrChannel 744 output: 745 746 *****************************************************************************/ 747 static void sbrEncoder_ElementClose(HANDLE_SBR_ELEMENT *phSbrElement) { 748 HANDLE_SBR_ELEMENT hSbrElement = *phSbrElement; 749 750 if (hSbrElement != NULL) { 751 if (hSbrElement->sbrConfigData.v_k_master) 752 FreeRam_Sbr_v_k_master(&hSbrElement->sbrConfigData.v_k_master); 753 if (hSbrElement->sbrConfigData.freqBandTable[LO]) 754 FreeRam_Sbr_freqBandTableLO( 755 &hSbrElement->sbrConfigData.freqBandTable[LO]); 756 if (hSbrElement->sbrConfigData.freqBandTable[HI]) 757 FreeRam_Sbr_freqBandTableHI( 758 &hSbrElement->sbrConfigData.freqBandTable[HI]); 759 760 FreeRam_SbrElement(phSbrElement); 761 } 762 return; 763 } 764 765 void sbrEncoder_Close(HANDLE_SBR_ENCODER *phSbrEncoder) { 766 HANDLE_SBR_ENCODER hSbrEncoder = *phSbrEncoder; 767 768 if (hSbrEncoder != NULL) { 769 int el, ch; 770 771 for (el = 0; el < (8); el++) { 772 if (hSbrEncoder->sbrElement[el] != NULL) { 773 sbrEncoder_ElementClose(&hSbrEncoder->sbrElement[el]); 774 } 775 } 776 777 /* Close sbr Channels */ 778 for (ch = 0; ch < (8); ch++) { 779 if (hSbrEncoder->pSbrChannel[ch]) { 780 sbrEncoder_ChannelClose(hSbrEncoder->pSbrChannel[ch]); 781 FreeRam_SbrChannel(&hSbrEncoder->pSbrChannel[ch]); 782 } 783 784 if (hSbrEncoder->QmfAnalysis[ch].FilterStates) 785 FreeRam_Sbr_QmfStatesAnalysis( 786 (FIXP_QAS **)&hSbrEncoder->QmfAnalysis[ch].FilterStates); 787 } 788 789 if (hSbrEncoder->hParametricStereo) 790 PSEnc_Destroy(&hSbrEncoder->hParametricStereo); 791 if (hSbrEncoder->qmfSynthesisPS.FilterStates) 792 FreeRam_PsQmfStatesSynthesis( 793 (FIXP_DBL **)&hSbrEncoder->qmfSynthesisPS.FilterStates); 794 795 /* Release Overlay */ 796 if (hSbrEncoder->pSBRdynamic_RAM) 797 FreeRam_SbrDynamic_RAM((FIXP_DBL **)&hSbrEncoder->pSBRdynamic_RAM); 798 799 FreeRam_SbrEncoder(phSbrEncoder); 800 } 801 } 802 803 /***************************************************************************** 804 805 functionname: updateFreqBandTable 806 description: updates vk_master 807 returns: - 808 input: config handle 809 output: error info 810 811 *****************************************************************************/ 812 static INT updateFreqBandTable(HANDLE_SBR_CONFIG_DATA sbrConfigData, 813 HANDLE_SBR_HEADER_DATA sbrHeaderData, 814 const INT downSampleFactor) { 815 INT k0, k2; 816 817 if (FDKsbrEnc_FindStartAndStopBand( 818 sbrConfigData->sampleFreq, 819 sbrConfigData->sampleFreq >> (downSampleFactor - 1), 820 sbrConfigData->noQmfBands, sbrHeaderData->sbr_start_frequency, 821 sbrHeaderData->sbr_stop_frequency, &k0, &k2)) 822 return (1); 823 824 if (FDKsbrEnc_UpdateFreqScale( 825 sbrConfigData->v_k_master, &sbrConfigData->num_Master, k0, k2, 826 sbrHeaderData->freqScale, sbrHeaderData->alterScale)) 827 return (1); 828 829 sbrHeaderData->sbr_xover_band = 0; 830 831 if (FDKsbrEnc_UpdateHiRes(sbrConfigData->freqBandTable[HI], 832 &sbrConfigData->nSfb[HI], sbrConfigData->v_k_master, 833 sbrConfigData->num_Master, 834 &sbrHeaderData->sbr_xover_band)) 835 return (1); 836 837 FDKsbrEnc_UpdateLoRes( 838 sbrConfigData->freqBandTable[LO], &sbrConfigData->nSfb[LO], 839 sbrConfigData->freqBandTable[HI], sbrConfigData->nSfb[HI]); 840 841 sbrConfigData->xOverFreq = 842 (sbrConfigData->freqBandTable[LOW_RES][0] * sbrConfigData->sampleFreq / 843 sbrConfigData->noQmfBands + 844 1) >> 845 1; 846 847 return (0); 848 } 849 850 /***************************************************************************** 851 852 functionname: resetEnvChannel 853 description: resets parameters and allocates memory 854 returns: error status 855 input: 856 output: hEnv 857 858 *****************************************************************************/ 859 static INT resetEnvChannel(HANDLE_SBR_CONFIG_DATA sbrConfigData, 860 HANDLE_SBR_HEADER_DATA sbrHeaderData, 861 HANDLE_ENV_CHANNEL hEnv) { 862 /* note !!! hEnv->encEnvData.noOfnoisebands will be updated later in function 863 * FDKsbrEnc_extractSbrEnvelope !!!*/ 864 hEnv->TonCorr.sbrNoiseFloorEstimate.noiseBands = 865 sbrHeaderData->sbr_noise_bands; 866 867 if (FDKsbrEnc_ResetTonCorrParamExtr( 868 &hEnv->TonCorr, sbrConfigData->xposCtrlSwitch, 869 sbrConfigData->freqBandTable[HI][0], sbrConfigData->v_k_master, 870 sbrConfigData->num_Master, sbrConfigData->sampleFreq, 871 sbrConfigData->freqBandTable, sbrConfigData->nSfb, 872 sbrConfigData->noQmfBands)) 873 return (1); 874 875 hEnv->sbrCodeNoiseFloor.nSfb[LO] = 876 hEnv->TonCorr.sbrNoiseFloorEstimate.noNoiseBands; 877 hEnv->sbrCodeNoiseFloor.nSfb[HI] = 878 hEnv->TonCorr.sbrNoiseFloorEstimate.noNoiseBands; 879 880 hEnv->sbrCodeEnvelope.nSfb[LO] = sbrConfigData->nSfb[LO]; 881 hEnv->sbrCodeEnvelope.nSfb[HI] = sbrConfigData->nSfb[HI]; 882 883 hEnv->encEnvData.noHarmonics = sbrConfigData->nSfb[HI]; 884 885 hEnv->sbrCodeEnvelope.upDate = 0; 886 hEnv->sbrCodeNoiseFloor.upDate = 0; 887 888 return (0); 889 } 890 891 /* ****************************** FDKsbrEnc_SbrGetXOverFreq 892 * ******************************/ 893 /** 894 * @fn 895 * @brief calculates the closest possible crossover frequency 896 * @return the crossover frequency SBR accepts 897 * 898 */ 899 static INT FDKsbrEnc_SbrGetXOverFreq( 900 HANDLE_SBR_ELEMENT hEnv, /*!< handle to SBR encoder instance */ 901 INT xoverFreq) /*!< from core coder suggested crossover frequency */ 902 { 903 INT band; 904 INT lastDiff, newDiff; 905 INT cutoffSb; 906 907 UCHAR *RESTRICT pVKMaster = hEnv->sbrConfigData.v_k_master; 908 909 /* Check if there is a matching cutoff frequency in the master table */ 910 cutoffSb = (4 * xoverFreq * hEnv->sbrConfigData.noQmfBands / 911 hEnv->sbrConfigData.sampleFreq + 912 1) >> 913 1; 914 lastDiff = cutoffSb; 915 for (band = 0; band < hEnv->sbrConfigData.num_Master; band++) { 916 newDiff = fixp_abs((INT)pVKMaster[band] - cutoffSb); 917 918 if (newDiff >= lastDiff) { 919 band--; 920 break; 921 } 922 923 lastDiff = newDiff; 924 } 925 926 return ((pVKMaster[band] * hEnv->sbrConfigData.sampleFreq / 927 hEnv->sbrConfigData.noQmfBands + 928 1) >> 929 1); 930 } 931 932 /***************************************************************************** 933 934 functionname: FDKsbrEnc_EnvEncodeFrame 935 description: performs the sbr envelope calculation for one element 936 returns: 937 input: 938 output: 939 940 *****************************************************************************/ 941 INT FDKsbrEnc_EnvEncodeFrame( 942 HANDLE_SBR_ENCODER hEnvEncoder, int iElement, 943 INT_PCM *samples, /*!< time samples, always deinterleaved */ 944 UINT samplesBufSize, /*!< time buffer channel stride */ 945 UINT *sbrDataBits, /*!< Size of SBR payload */ 946 UCHAR *sbrData, /*!< SBR payload */ 947 int clearOutput /*!< Do not consider any input signal */ 948 ) { 949 HANDLE_SBR_ELEMENT hSbrElement = NULL; 950 FDK_CRCINFO crcInfo; 951 INT crcReg; 952 INT ch; 953 INT band; 954 INT cutoffSb; 955 INT newXOver; 956 957 if (hEnvEncoder == NULL) return -1; 958 959 hSbrElement = hEnvEncoder->sbrElement[iElement]; 960 961 if (hSbrElement == NULL) return -1; 962 963 /* header bitstream handling */ 964 HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData = &hSbrElement->sbrBitstreamData; 965 966 INT psHeaderActive = 0; 967 sbrBitstreamData->HeaderActive = 0; 968 969 /* Anticipate PS header because of internal PS bitstream delay in order to be 970 * in sync with SBR header. */ 971 if (sbrBitstreamData->CountSendHeaderData == 972 (sbrBitstreamData->NrSendHeaderData - 1)) { 973 psHeaderActive = 1; 974 } 975 976 /* Signal SBR header to be written into bitstream */ 977 if (sbrBitstreamData->CountSendHeaderData == 0) { 978 sbrBitstreamData->HeaderActive = 1; 979 } 980 981 /* Increment header interval counter */ 982 if (sbrBitstreamData->NrSendHeaderData == 0) { 983 sbrBitstreamData->CountSendHeaderData = 1; 984 } else { 985 if (sbrBitstreamData->CountSendHeaderData >= 0) { 986 sbrBitstreamData->CountSendHeaderData++; 987 sbrBitstreamData->CountSendHeaderData %= 988 sbrBitstreamData->NrSendHeaderData; 989 } 990 } 991 992 if (hSbrElement->CmonData.dynBwEnabled) { 993 INT i; 994 for (i = 4; i > 0; i--) 995 hSbrElement->dynXOverFreqDelay[i] = hSbrElement->dynXOverFreqDelay[i - 1]; 996 997 hSbrElement->dynXOverFreqDelay[0] = hSbrElement->CmonData.dynXOverFreqEnc; 998 if (hSbrElement->dynXOverFreqDelay[1] > hSbrElement->dynXOverFreqDelay[2]) 999 newXOver = hSbrElement->dynXOverFreqDelay[2]; 1000 else 1001 newXOver = hSbrElement->dynXOverFreqDelay[1]; 1002 1003 /* has the crossover frequency changed? */ 1004 if (hSbrElement->sbrConfigData.dynXOverFreq != newXOver) { 1005 /* get corresponding master band */ 1006 cutoffSb = ((4 * newXOver * hSbrElement->sbrConfigData.noQmfBands / 1007 hSbrElement->sbrConfigData.sampleFreq) + 1008 1) >> 1009 1; 1010 1011 for (band = 0; band < hSbrElement->sbrConfigData.num_Master; band++) { 1012 if (cutoffSb == hSbrElement->sbrConfigData.v_k_master[band]) break; 1013 } 1014 FDK_ASSERT(band < hSbrElement->sbrConfigData.num_Master); 1015 1016 hSbrElement->sbrConfigData.dynXOverFreq = newXOver; 1017 hSbrElement->sbrHeaderData.sbr_xover_band = band; 1018 hSbrElement->sbrBitstreamData.HeaderActive = 1; 1019 psHeaderActive = 1; /* ps header is one frame delayed */ 1020 1021 /* 1022 update vk_master table 1023 */ 1024 if (updateFreqBandTable(&hSbrElement->sbrConfigData, 1025 &hSbrElement->sbrHeaderData, 1026 hEnvEncoder->downSampleFactor)) 1027 return (1); 1028 1029 /* reset SBR channels */ 1030 INT nEnvCh = hSbrElement->sbrConfigData.nChannels; 1031 for (ch = 0; ch < nEnvCh; ch++) { 1032 if (resetEnvChannel(&hSbrElement->sbrConfigData, 1033 &hSbrElement->sbrHeaderData, 1034 &hSbrElement->sbrChannel[ch]->hEnvChannel)) 1035 return (1); 1036 } 1037 } 1038 } 1039 1040 /* 1041 allocate space for dummy header and crc 1042 */ 1043 crcReg = FDKsbrEnc_InitSbrBitstream( 1044 &hSbrElement->CmonData, 1045 hSbrElement->payloadDelayLine[hEnvEncoder->nBitstrDelay], 1046 MAX_PAYLOAD_SIZE * sizeof(UCHAR), &crcInfo, 1047 hSbrElement->sbrConfigData.sbrSyntaxFlags); 1048 1049 /* Temporal Envelope Data */ 1050 SBR_FRAME_TEMP_DATA _fData; 1051 SBR_FRAME_TEMP_DATA *fData = &_fData; 1052 SBR_ENV_TEMP_DATA eData[MAX_NUM_CHANNELS]; 1053 1054 /* Init Temporal Envelope Data */ 1055 { 1056 int i; 1057 1058 FDKmemclear(&eData[0], sizeof(SBR_ENV_TEMP_DATA)); 1059 FDKmemclear(&eData[1], sizeof(SBR_ENV_TEMP_DATA)); 1060 FDKmemclear(fData, sizeof(SBR_FRAME_TEMP_DATA)); 1061 1062 for (i = 0; i < MAX_NUM_NOISE_VALUES; i++) fData->res[i] = FREQ_RES_HIGH; 1063 } 1064 1065 if (!clearOutput) { 1066 /* 1067 * Transform audio data into QMF domain 1068 */ 1069 for (ch = 0; ch < hSbrElement->sbrConfigData.nChannels; ch++) { 1070 HANDLE_ENV_CHANNEL h_envChan = &hSbrElement->sbrChannel[ch]->hEnvChannel; 1071 HANDLE_SBR_EXTRACT_ENVELOPE sbrExtrEnv = &h_envChan->sbrExtractEnvelope; 1072 1073 if (hSbrElement->elInfo.fParametricStereo == 0) { 1074 QMF_SCALE_FACTOR tmpScale; 1075 FIXP_DBL **pQmfReal, **pQmfImag; 1076 C_AALLOC_SCRATCH_START(qmfWorkBuffer, FIXP_DBL, 64 * 2) 1077 1078 /* Obtain pointers to QMF buffers. */ 1079 pQmfReal = sbrExtrEnv->rBuffer; 1080 pQmfImag = sbrExtrEnv->iBuffer; 1081 1082 qmfAnalysisFiltering( 1083 hSbrElement->hQmfAnalysis[ch], pQmfReal, pQmfImag, &tmpScale, 1084 samples + hSbrElement->elInfo.ChannelIndex[ch] * samplesBufSize, 0, 1085 1, qmfWorkBuffer); 1086 1087 h_envChan->qmfScale = tmpScale.lb_scale + 7; 1088 1089 C_AALLOC_SCRATCH_END(qmfWorkBuffer, FIXP_DBL, 64 * 2) 1090 1091 } /* fParametricStereo == 0 */ 1092 1093 /* 1094 Parametric Stereo processing 1095 */ 1096 if (hSbrElement->elInfo.fParametricStereo) { 1097 INT error = noError; 1098 1099 /* Limit Parametric Stereo to one instance */ 1100 FDK_ASSERT(ch == 0); 1101 1102 if (error == noError) { 1103 /* parametric stereo processing: 1104 - input: 1105 o left and right time domain samples 1106 - processing: 1107 o stereo qmf analysis 1108 o stereo hybrid analysis 1109 o ps parameter extraction 1110 o downmix + hybrid synthesis 1111 - output: 1112 o downmixed qmf data is written to sbrExtrEnv->rBuffer and 1113 sbrExtrEnv->iBuffer 1114 */ 1115 SCHAR qmfScale; 1116 INT_PCM *pSamples[2] = { 1117 samples + hSbrElement->elInfo.ChannelIndex[0] * samplesBufSize, 1118 samples + hSbrElement->elInfo.ChannelIndex[1] * samplesBufSize}; 1119 error = FDKsbrEnc_PSEnc_ParametricStereoProcessing( 1120 hEnvEncoder->hParametricStereo, pSamples, samplesBufSize, 1121 hSbrElement->hQmfAnalysis, sbrExtrEnv->rBuffer, 1122 sbrExtrEnv->iBuffer, 1123 samples + hSbrElement->elInfo.ChannelIndex[ch] * samplesBufSize, 1124 &hEnvEncoder->qmfSynthesisPS, &qmfScale, psHeaderActive); 1125 h_envChan->qmfScale = (int)qmfScale; 1126 } 1127 1128 } /* if (hEnvEncoder->hParametricStereo) */ 1129 1130 /* 1131 1132 Extract Envelope relevant things from QMF data 1133 1134 */ 1135 FDKsbrEnc_extractSbrEnvelope1(&hSbrElement->sbrConfigData, 1136 &hSbrElement->sbrHeaderData, 1137 &hSbrElement->sbrBitstreamData, h_envChan, 1138 &hSbrElement->CmonData, &eData[ch], fData); 1139 1140 } /* hEnvEncoder->sbrConfigData.nChannels */ 1141 } 1142 1143 /* 1144 Process Envelope relevant things and calculate envelope data and write 1145 payload 1146 */ 1147 FDKsbrEnc_extractSbrEnvelope2( 1148 &hSbrElement->sbrConfigData, &hSbrElement->sbrHeaderData, 1149 (hSbrElement->elInfo.fParametricStereo) ? hEnvEncoder->hParametricStereo 1150 : NULL, 1151 &hSbrElement->sbrBitstreamData, &hSbrElement->sbrChannel[0]->hEnvChannel, 1152 (hSbrElement->sbrConfigData.stereoMode != SBR_MONO) 1153 ? &hSbrElement->sbrChannel[1]->hEnvChannel 1154 : NULL, 1155 &hSbrElement->CmonData, eData, fData, clearOutput); 1156 1157 hSbrElement->sbrBitstreamData.rightBorderFIX = 0; 1158 1159 /* 1160 format payload, calculate crc 1161 */ 1162 FDKsbrEnc_AssembleSbrBitstream(&hSbrElement->CmonData, &crcInfo, crcReg, 1163 hSbrElement->sbrConfigData.sbrSyntaxFlags); 1164 1165 /* 1166 save new payload, set to zero length if greater than MAX_PAYLOAD_SIZE 1167 */ 1168 hSbrElement->payloadDelayLineSize[hEnvEncoder->nBitstrDelay] = 1169 FDKgetValidBits(&hSbrElement->CmonData.sbrBitbuf); 1170 1171 if (hSbrElement->payloadDelayLineSize[hEnvEncoder->nBitstrDelay] > 1172 (MAX_PAYLOAD_SIZE << 3)) 1173 hSbrElement->payloadDelayLineSize[hEnvEncoder->nBitstrDelay] = 0; 1174 1175 /* While filling the Delay lines, sbrData is NULL */ 1176 if (sbrData) { 1177 *sbrDataBits = hSbrElement->payloadDelayLineSize[0]; 1178 FDKmemcpy(sbrData, hSbrElement->payloadDelayLine[0], 1179 (hSbrElement->payloadDelayLineSize[0] + 7) >> 3); 1180 } 1181 1182 /* delay header active flag */ 1183 if (hSbrElement->sbrBitstreamData.HeaderActive == 1) { 1184 hSbrElement->sbrBitstreamData.HeaderActiveDelay = 1185 1 + hEnvEncoder->nBitstrDelay; 1186 } else { 1187 if (hSbrElement->sbrBitstreamData.HeaderActiveDelay > 0) { 1188 hSbrElement->sbrBitstreamData.HeaderActiveDelay--; 1189 } 1190 } 1191 1192 return (0); 1193 } 1194 1195 /***************************************************************************** 1196 1197 functionname: FDKsbrEnc_Downsample 1198 description: performs downsampling and delay compensation of the core path 1199 returns: 1200 input: 1201 output: 1202 1203 *****************************************************************************/ 1204 INT FDKsbrEnc_Downsample( 1205 HANDLE_SBR_ENCODER hSbrEncoder, 1206 INT_PCM *samples, /*!< time samples, always deinterleaved */ 1207 UINT samplesBufSize, /*!< time buffer size per channel */ 1208 UINT numChannels, /*!< number of channels */ 1209 UINT *sbrDataBits, /*!< Size of SBR payload */ 1210 UCHAR *sbrData, /*!< SBR payload */ 1211 int clearOutput /*!< Do not consider any input signal */ 1212 ) { 1213 HANDLE_SBR_ELEMENT hSbrElement = NULL; 1214 INT nOutSamples; 1215 int el; 1216 if (hSbrEncoder->downSampleFactor > 1) { 1217 /* Do downsampling */ 1218 1219 /* Loop over elements (LFE is handled later) */ 1220 for (el = 0; el < hSbrEncoder->noElements; el++) { 1221 hSbrElement = hSbrEncoder->sbrElement[el]; 1222 if (hSbrEncoder->sbrElement[el] != NULL) { 1223 if (hSbrEncoder->downsamplingMethod == SBRENC_DS_TIME) { 1224 int ch; 1225 int nChannels = hSbrElement->sbrConfigData.nChannels; 1226 1227 for (ch = 0; ch < nChannels; ch++) { 1228 FDKaacEnc_Downsample( 1229 &hSbrElement->sbrChannel[ch]->downSampler, 1230 samples + 1231 hSbrElement->elInfo.ChannelIndex[ch] * samplesBufSize + 1232 hSbrEncoder->bufferOffset / numChannels, 1233 hSbrElement->sbrConfigData.frameSize, 1234 samples + hSbrElement->elInfo.ChannelIndex[ch] * samplesBufSize, 1235 &nOutSamples); 1236 } 1237 } 1238 } 1239 } 1240 1241 /* Handle LFE (if existing) */ 1242 if (hSbrEncoder->lfeChIdx != -1) { /* lfe downsampler */ 1243 FDKaacEnc_Downsample(&hSbrEncoder->lfeDownSampler, 1244 samples + hSbrEncoder->lfeChIdx * samplesBufSize + 1245 hSbrEncoder->bufferOffset / numChannels, 1246 hSbrEncoder->frameSize, 1247 samples + hSbrEncoder->lfeChIdx * samplesBufSize, 1248 &nOutSamples); 1249 } 1250 } else { 1251 /* No downsampling. Still, some buffer shifting for correct delay */ 1252 int samples2Copy = hSbrEncoder->frameSize; 1253 if (hSbrEncoder->bufferOffset / (int)numChannels < samples2Copy) { 1254 for (int c = 0; c < (int)numChannels; c++) { 1255 /* Do memmove while taking care of overlapping memory areas. (memcpy 1256 does not necessarily take care) Distinguish between oeverlapping and 1257 non overlapping version due to reasons of complexity. */ 1258 FDKmemmove(samples + c * samplesBufSize, 1259 samples + c * samplesBufSize + 1260 hSbrEncoder->bufferOffset / numChannels, 1261 samples2Copy * sizeof(INT_PCM)); 1262 } 1263 } else { 1264 for (int c = 0; c < (int)numChannels; c++) { 1265 /* Simple memcpy since the memory areas are not overlapping */ 1266 FDKmemcpy(samples + c * samplesBufSize, 1267 samples + c * samplesBufSize + 1268 hSbrEncoder->bufferOffset / numChannels, 1269 samples2Copy * sizeof(INT_PCM)); 1270 } 1271 } 1272 } 1273 1274 return 0; 1275 } 1276 1277 /***************************************************************************** 1278 1279 functionname: createEnvChannel 1280 description: initializes parameters and allocates memory 1281 returns: error status 1282 input: 1283 output: hEnv 1284 1285 *****************************************************************************/ 1286 1287 static INT createEnvChannel(HANDLE_ENV_CHANNEL hEnv, INT channel, 1288 UCHAR *dynamic_RAM) { 1289 FDKmemclear(hEnv, sizeof(struct ENV_CHANNEL)); 1290 1291 if (FDKsbrEnc_CreateTonCorrParamExtr(&hEnv->TonCorr, channel)) { 1292 return (1); 1293 } 1294 1295 if (FDKsbrEnc_CreateExtractSbrEnvelope(&hEnv->sbrExtractEnvelope, channel, 1296 /*chan*/ 0, dynamic_RAM)) { 1297 return (1); 1298 } 1299 1300 return 0; 1301 } 1302 1303 /***************************************************************************** 1304 1305 functionname: initEnvChannel 1306 description: initializes parameters 1307 returns: error status 1308 input: 1309 output: 1310 1311 *****************************************************************************/ 1312 static INT initEnvChannel(HANDLE_SBR_CONFIG_DATA sbrConfigData, 1313 HANDLE_SBR_HEADER_DATA sbrHeaderData, 1314 HANDLE_ENV_CHANNEL hEnv, sbrConfigurationPtr params, 1315 ULONG statesInitFlag, INT chanInEl, 1316 UCHAR *dynamic_RAM) { 1317 int frameShift, tran_off = 0; 1318 INT e; 1319 INT tran_fc; 1320 INT timeSlots, timeStep, startIndex; 1321 INT noiseBands[2] = {3, 3}; 1322 1323 e = 1 << params->e; 1324 1325 FDK_ASSERT(params->e >= 0); 1326 1327 hEnv->encEnvData.freq_res_fixfix[0] = params->freq_res_fixfix[0]; 1328 hEnv->encEnvData.freq_res_fixfix[1] = params->freq_res_fixfix[1]; 1329 hEnv->encEnvData.fResTransIsLow = params->fResTransIsLow; 1330 1331 hEnv->fLevelProtect = 0; 1332 1333 hEnv->encEnvData.ldGrid = 1334 (sbrConfigData->sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) ? 1 : 0; 1335 1336 hEnv->encEnvData.sbr_xpos_mode = (XPOS_MODE)params->sbr_xpos_mode; 1337 1338 if (hEnv->encEnvData.sbr_xpos_mode == XPOS_SWITCHED) { 1339 /* 1340 no other type than XPOS_MDCT or XPOS_SPEECH allowed, 1341 but enable switching 1342 */ 1343 sbrConfigData->switchTransposers = TRUE; 1344 hEnv->encEnvData.sbr_xpos_mode = XPOS_MDCT; 1345 } else { 1346 sbrConfigData->switchTransposers = FALSE; 1347 } 1348 1349 hEnv->encEnvData.sbr_xpos_ctrl = params->sbr_xpos_ctrl; 1350 1351 /* extended data */ 1352 if (params->parametricCoding) { 1353 hEnv->encEnvData.extended_data = 1; 1354 } else { 1355 hEnv->encEnvData.extended_data = 0; 1356 } 1357 1358 hEnv->encEnvData.extension_size = 0; 1359 1360 startIndex = QMF_FILTER_PROTOTYPE_SIZE - sbrConfigData->noQmfBands; 1361 1362 switch (params->sbrFrameSize) { 1363 case 2304: 1364 timeSlots = 18; 1365 break; 1366 case 2048: 1367 case 1024: 1368 case 512: 1369 timeSlots = 16; 1370 break; 1371 case 1920: 1372 case 960: 1373 case 480: 1374 timeSlots = 15; 1375 break; 1376 case 1152: 1377 timeSlots = 9; 1378 break; 1379 default: 1380 return (1); /* Illegal frame size */ 1381 } 1382 1383 timeStep = sbrConfigData->noQmfSlots / timeSlots; 1384 1385 if (FDKsbrEnc_InitTonCorrParamExtr( 1386 params->sbrFrameSize, &hEnv->TonCorr, sbrConfigData, timeSlots, 1387 params->sbr_xpos_ctrl, params->ana_max_level, 1388 sbrHeaderData->sbr_noise_bands, params->noiseFloorOffset, 1389 params->useSpeechConfig)) 1390 return (1); 1391 1392 hEnv->encEnvData.noOfnoisebands = 1393 hEnv->TonCorr.sbrNoiseFloorEstimate.noNoiseBands; 1394 1395 noiseBands[0] = hEnv->encEnvData.noOfnoisebands; 1396 noiseBands[1] = hEnv->encEnvData.noOfnoisebands; 1397 1398 hEnv->encEnvData.sbr_invf_mode = (INVF_MODE)params->sbr_invf_mode; 1399 1400 if (hEnv->encEnvData.sbr_invf_mode == INVF_SWITCHED) { 1401 hEnv->encEnvData.sbr_invf_mode = INVF_MID_LEVEL; 1402 hEnv->TonCorr.switchInverseFilt = TRUE; 1403 } else { 1404 hEnv->TonCorr.switchInverseFilt = FALSE; 1405 } 1406 1407 tran_fc = params->tran_fc; 1408 1409 if (tran_fc == 0) { 1410 tran_fc = fixMin( 1411 5000, FDKsbrEnc_getSbrStartFreqRAW(sbrHeaderData->sbr_start_frequency, 1412 params->codecSettings.sampleFreq)); 1413 } 1414 1415 tran_fc = 1416 (tran_fc * 4 * sbrConfigData->noQmfBands / sbrConfigData->sampleFreq + 1417 1) >> 1418 1; 1419 1420 if (sbrConfigData->sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) { 1421 frameShift = LD_PRETRAN_OFF; 1422 tran_off = LD_PRETRAN_OFF + FRAME_MIDDLE_SLOT_512LD * timeStep; 1423 } else { 1424 frameShift = 0; 1425 switch (timeSlots) { 1426 /* The factor of 2 is by definition. */ 1427 case NUMBER_TIME_SLOTS_2048: 1428 tran_off = 8 + FRAME_MIDDLE_SLOT_2048 * timeStep; 1429 break; 1430 case NUMBER_TIME_SLOTS_1920: 1431 tran_off = 7 + FRAME_MIDDLE_SLOT_1920 * timeStep; 1432 break; 1433 default: 1434 return 1; 1435 } 1436 } 1437 if (FDKsbrEnc_InitExtractSbrEnvelope( 1438 &hEnv->sbrExtractEnvelope, sbrConfigData->noQmfSlots, 1439 sbrConfigData->noQmfBands, startIndex, timeSlots, timeStep, tran_off, 1440 statesInitFlag, chanInEl, dynamic_RAM, sbrConfigData->sbrSyntaxFlags)) 1441 return (1); 1442 1443 if (FDKsbrEnc_InitSbrCodeEnvelope(&hEnv->sbrCodeEnvelope, sbrConfigData->nSfb, 1444 params->deltaTAcrossFrames, 1445 params->dF_edge_1stEnv, 1446 params->dF_edge_incr)) 1447 return (1); 1448 1449 if (FDKsbrEnc_InitSbrCodeEnvelope(&hEnv->sbrCodeNoiseFloor, noiseBands, 1450 params->deltaTAcrossFrames, 0, 0)) 1451 return (1); 1452 1453 sbrConfigData->initAmpResFF = params->init_amp_res_FF; 1454 1455 if (FDKsbrEnc_InitSbrHuffmanTables(&hEnv->encEnvData, &hEnv->sbrCodeEnvelope, 1456 &hEnv->sbrCodeNoiseFloor, 1457 sbrHeaderData->sbr_amp_res)) 1458 return (1); 1459 1460 FDKsbrEnc_initFrameInfoGenerator( 1461 &hEnv->SbrEnvFrame, params->spread, e, params->stat, timeSlots, 1462 hEnv->encEnvData.freq_res_fixfix, hEnv->encEnvData.fResTransIsLow, 1463 hEnv->encEnvData.ldGrid); 1464 1465 if (sbrConfigData->sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) 1466 1467 { 1468 INT bandwidth_qmf_slot = 1469 (sbrConfigData->sampleFreq >> 1) / (sbrConfigData->noQmfBands); 1470 if (FDKsbrEnc_InitSbrFastTransientDetector( 1471 &hEnv->sbrFastTransientDetector, sbrConfigData->noQmfSlots, 1472 bandwidth_qmf_slot, sbrConfigData->noQmfBands, 1473 sbrConfigData->freqBandTable[0][0])) 1474 return (1); 1475 } 1476 1477 /* The transient detector has to be initialized also if the fast transient 1478 detector was active, because the values from the transient detector 1479 structure are used. */ 1480 if (FDKsbrEnc_InitSbrTransientDetector( 1481 &hEnv->sbrTransientDetector, sbrConfigData->sbrSyntaxFlags, 1482 sbrConfigData->frameSize, sbrConfigData->sampleFreq, params, tran_fc, 1483 sbrConfigData->noQmfSlots, sbrConfigData->noQmfBands, 1484 hEnv->sbrExtractEnvelope.YBufferWriteOffset, 1485 hEnv->sbrExtractEnvelope.YBufferSzShift, frameShift, tran_off)) 1486 return (1); 1487 1488 sbrConfigData->xposCtrlSwitch = params->sbr_xpos_ctrl; 1489 1490 hEnv->encEnvData.noHarmonics = sbrConfigData->nSfb[HI]; 1491 hEnv->encEnvData.addHarmonicFlag = 0; 1492 1493 return (0); 1494 } 1495 1496 INT sbrEncoder_Open(HANDLE_SBR_ENCODER *phSbrEncoder, INT nElements, 1497 INT nChannels, INT supportPS) { 1498 INT i; 1499 INT errorStatus = 1; 1500 HANDLE_SBR_ENCODER hSbrEncoder = NULL; 1501 1502 if (phSbrEncoder == NULL) { 1503 goto bail; 1504 } 1505 1506 hSbrEncoder = GetRam_SbrEncoder(); 1507 if (hSbrEncoder == NULL) { 1508 goto bail; 1509 } 1510 FDKmemclear(hSbrEncoder, sizeof(SBR_ENCODER)); 1511 1512 if (NULL == 1513 (hSbrEncoder->pSBRdynamic_RAM = (UCHAR *)GetRam_SbrDynamic_RAM())) { 1514 goto bail; 1515 } 1516 hSbrEncoder->dynamicRam = hSbrEncoder->pSBRdynamic_RAM; 1517 1518 /* Create SBR elements */ 1519 for (i = 0; i < nElements; i++) { 1520 hSbrEncoder->sbrElement[i] = GetRam_SbrElement(i); 1521 if (hSbrEncoder->sbrElement[i] == NULL) { 1522 goto bail; 1523 } 1524 FDKmemclear(hSbrEncoder->sbrElement[i], sizeof(SBR_ELEMENT)); 1525 hSbrEncoder->sbrElement[i]->sbrConfigData.freqBandTable[LO] = 1526 GetRam_Sbr_freqBandTableLO(i); 1527 hSbrEncoder->sbrElement[i]->sbrConfigData.freqBandTable[HI] = 1528 GetRam_Sbr_freqBandTableHI(i); 1529 hSbrEncoder->sbrElement[i]->sbrConfigData.v_k_master = 1530 GetRam_Sbr_v_k_master(i); 1531 if ((hSbrEncoder->sbrElement[i]->sbrConfigData.freqBandTable[LO] == NULL) || 1532 (hSbrEncoder->sbrElement[i]->sbrConfigData.freqBandTable[HI] == NULL) || 1533 (hSbrEncoder->sbrElement[i]->sbrConfigData.v_k_master == NULL)) { 1534 goto bail; 1535 } 1536 } 1537 1538 /* Create SBR channels */ 1539 for (i = 0; i < nChannels; i++) { 1540 hSbrEncoder->pSbrChannel[i] = GetRam_SbrChannel(i); 1541 if (hSbrEncoder->pSbrChannel[i] == NULL) { 1542 goto bail; 1543 } 1544 1545 if (createEnvChannel(&hSbrEncoder->pSbrChannel[i]->hEnvChannel, i, 1546 hSbrEncoder->dynamicRam)) { 1547 goto bail; 1548 } 1549 } 1550 1551 /* Create QMF States */ 1552 for (i = 0; i < fixMax(nChannels, (supportPS) ? 2 : 0); i++) { 1553 hSbrEncoder->QmfAnalysis[i].FilterStates = GetRam_Sbr_QmfStatesAnalysis(i); 1554 if (hSbrEncoder->QmfAnalysis[i].FilterStates == NULL) { 1555 goto bail; 1556 } 1557 } 1558 1559 /* Create Parametric Stereo handle */ 1560 if (supportPS) { 1561 if (PSEnc_Create(&hSbrEncoder->hParametricStereo)) { 1562 goto bail; 1563 } 1564 1565 hSbrEncoder->qmfSynthesisPS.FilterStates = GetRam_PsQmfStatesSynthesis(); 1566 if (hSbrEncoder->qmfSynthesisPS.FilterStates == NULL) { 1567 goto bail; 1568 } 1569 } /* supportPS */ 1570 1571 *phSbrEncoder = hSbrEncoder; 1572 1573 errorStatus = 0; 1574 return errorStatus; 1575 1576 bail: 1577 /* Close SBR encoder instance */ 1578 sbrEncoder_Close(&hSbrEncoder); 1579 return errorStatus; 1580 } 1581 1582 static INT FDKsbrEnc_Reallocate(HANDLE_SBR_ENCODER hSbrEncoder, 1583 SBR_ELEMENT_INFO elInfo[(8)], 1584 const INT noElements) { 1585 INT totalCh = 0; 1586 INT totalQmf = 0; 1587 INT coreEl; 1588 INT el = -1; 1589 1590 hSbrEncoder->lfeChIdx = -1; /* default value, until lfe found */ 1591 1592 for (coreEl = 0; coreEl < noElements; coreEl++) { 1593 /* SBR only handles SCE and CPE's */ 1594 if (elInfo[coreEl].elType == ID_SCE || elInfo[coreEl].elType == ID_CPE) { 1595 el++; 1596 } else { 1597 if (elInfo[coreEl].elType == ID_LFE) { 1598 hSbrEncoder->lfeChIdx = elInfo[coreEl].ChannelIndex[0]; 1599 } 1600 continue; 1601 } 1602 1603 SBR_ELEMENT_INFO *pelInfo = &elInfo[coreEl]; 1604 HANDLE_SBR_ELEMENT hSbrElement = hSbrEncoder->sbrElement[el]; 1605 1606 int ch; 1607 for (ch = 0; ch < pelInfo->nChannelsInEl; ch++) { 1608 hSbrElement->sbrChannel[ch] = hSbrEncoder->pSbrChannel[totalCh]; 1609 totalCh++; 1610 } 1611 /* analysis QMF */ 1612 for (ch = 0; 1613 ch < ((pelInfo->fParametricStereo) ? 2 : pelInfo->nChannelsInEl); 1614 ch++) { 1615 hSbrElement->elInfo.ChannelIndex[ch] = pelInfo->ChannelIndex[ch]; 1616 hSbrElement->hQmfAnalysis[ch] = &hSbrEncoder->QmfAnalysis[totalQmf++]; 1617 } 1618 1619 /* Copy Element info */ 1620 hSbrElement->elInfo.elType = pelInfo->elType; 1621 hSbrElement->elInfo.instanceTag = pelInfo->instanceTag; 1622 hSbrElement->elInfo.nChannelsInEl = pelInfo->nChannelsInEl; 1623 hSbrElement->elInfo.fParametricStereo = pelInfo->fParametricStereo; 1624 hSbrElement->elInfo.fDualMono = pelInfo->fDualMono; 1625 } /* coreEl */ 1626 1627 return 0; 1628 } 1629 1630 /***************************************************************************** 1631 1632 functionname: FDKsbrEnc_bsBufInit 1633 description: initializes bitstream buffer 1634 returns: initialized bitstream buffer in env encoder 1635 input: 1636 output: hEnv 1637 1638 *****************************************************************************/ 1639 static INT FDKsbrEnc_bsBufInit(HANDLE_SBR_ELEMENT hSbrElement, 1640 int nBitstrDelay) { 1641 UCHAR *bitstreamBuffer; 1642 1643 /* initialize the bitstream buffer */ 1644 bitstreamBuffer = hSbrElement->payloadDelayLine[nBitstrDelay]; 1645 FDKinitBitStream(&hSbrElement->CmonData.sbrBitbuf, bitstreamBuffer, 1646 MAX_PAYLOAD_SIZE * sizeof(UCHAR), 0, BS_WRITER); 1647 1648 return (0); 1649 } 1650 1651 /***************************************************************************** 1652 1653 functionname: FDKsbrEnc_EnvInit 1654 description: initializes parameters 1655 returns: error status 1656 input: 1657 output: hEnv 1658 1659 *****************************************************************************/ 1660 static INT FDKsbrEnc_EnvInit(HANDLE_SBR_ELEMENT hSbrElement, 1661 sbrConfigurationPtr params, INT *coreBandWith, 1662 AUDIO_OBJECT_TYPE aot, int nElement, 1663 const int headerPeriod, ULONG statesInitFlag, 1664 const SBRENC_DS_TYPE downsamplingMethod, 1665 UCHAR *dynamic_RAM) { 1666 int ch, i; 1667 1668 if ((params->codecSettings.nChannels < 1) || 1669 (params->codecSettings.nChannels > MAX_NUM_CHANNELS)) { 1670 return (1); 1671 } 1672 1673 /* init and set syntax flags */ 1674 hSbrElement->sbrConfigData.sbrSyntaxFlags = 0; 1675 1676 switch (aot) { 1677 case AOT_ER_AAC_ELD: 1678 hSbrElement->sbrConfigData.sbrSyntaxFlags |= SBR_SYNTAX_LOW_DELAY; 1679 break; 1680 default: 1681 break; 1682 } 1683 if (params->crcSbr) { 1684 hSbrElement->sbrConfigData.sbrSyntaxFlags |= SBR_SYNTAX_CRC; 1685 } 1686 1687 hSbrElement->sbrConfigData.noQmfBands = 64 >> (2 - params->downSampleFactor); 1688 switch (hSbrElement->sbrConfigData.noQmfBands) { 1689 case 64: 1690 hSbrElement->sbrConfigData.noQmfSlots = params->sbrFrameSize >> 6; 1691 break; 1692 case 32: 1693 hSbrElement->sbrConfigData.noQmfSlots = params->sbrFrameSize >> 5; 1694 break; 1695 default: 1696 hSbrElement->sbrConfigData.noQmfSlots = params->sbrFrameSize >> 6; 1697 return (2); 1698 } 1699 1700 /* 1701 now initialize sbrConfigData, sbrHeaderData and sbrBitstreamData, 1702 */ 1703 hSbrElement->sbrConfigData.nChannels = params->codecSettings.nChannels; 1704 1705 if (params->codecSettings.nChannels == 2) { 1706 if ((hSbrElement->elInfo.elType == ID_CPE) && 1707 ((hSbrElement->elInfo.fDualMono == 1))) { 1708 hSbrElement->sbrConfigData.stereoMode = SBR_LEFT_RIGHT; 1709 } else { 1710 hSbrElement->sbrConfigData.stereoMode = params->stereoMode; 1711 } 1712 } else { 1713 hSbrElement->sbrConfigData.stereoMode = SBR_MONO; 1714 } 1715 1716 hSbrElement->sbrConfigData.frameSize = params->sbrFrameSize; 1717 1718 hSbrElement->sbrConfigData.sampleFreq = 1719 params->downSampleFactor * params->codecSettings.sampleFreq; 1720 1721 hSbrElement->sbrBitstreamData.CountSendHeaderData = 0; 1722 if (params->SendHeaderDataTime > 0) { 1723 if (headerPeriod == -1) { 1724 hSbrElement->sbrBitstreamData.NrSendHeaderData = (INT)( 1725 params->SendHeaderDataTime * hSbrElement->sbrConfigData.sampleFreq / 1726 (1000 * hSbrElement->sbrConfigData.frameSize)); 1727 hSbrElement->sbrBitstreamData.NrSendHeaderData = 1728 fixMax(hSbrElement->sbrBitstreamData.NrSendHeaderData, 1); 1729 } else { 1730 /* assure header period at least once per second */ 1731 hSbrElement->sbrBitstreamData.NrSendHeaderData = fixMin( 1732 fixMax(headerPeriod, 1), (hSbrElement->sbrConfigData.sampleFreq / 1733 hSbrElement->sbrConfigData.frameSize)); 1734 } 1735 } else { 1736 hSbrElement->sbrBitstreamData.NrSendHeaderData = 0; 1737 } 1738 1739 hSbrElement->sbrHeaderData.sbr_data_extra = params->sbr_data_extra; 1740 hSbrElement->sbrBitstreamData.HeaderActive = 0; 1741 hSbrElement->sbrBitstreamData.rightBorderFIX = 0; 1742 hSbrElement->sbrHeaderData.sbr_start_frequency = params->startFreq; 1743 hSbrElement->sbrHeaderData.sbr_stop_frequency = params->stopFreq; 1744 hSbrElement->sbrHeaderData.sbr_xover_band = 0; 1745 hSbrElement->sbrHeaderData.sbr_lc_stereo_mode = 0; 1746 1747 /* data_extra */ 1748 if (params->sbr_xpos_ctrl != SBR_XPOS_CTRL_DEFAULT) 1749 hSbrElement->sbrHeaderData.sbr_data_extra = 1; 1750 1751 hSbrElement->sbrHeaderData.sbr_amp_res = (AMP_RES)params->amp_res; 1752 1753 /* header_extra_1 */ 1754 hSbrElement->sbrHeaderData.freqScale = params->freqScale; 1755 hSbrElement->sbrHeaderData.alterScale = params->alterScale; 1756 hSbrElement->sbrHeaderData.sbr_noise_bands = params->sbr_noise_bands; 1757 hSbrElement->sbrHeaderData.header_extra_1 = 0; 1758 1759 if ((params->freqScale != SBR_FREQ_SCALE_DEFAULT) || 1760 (params->alterScale != SBR_ALTER_SCALE_DEFAULT) || 1761 (params->sbr_noise_bands != SBR_NOISE_BANDS_DEFAULT)) { 1762 hSbrElement->sbrHeaderData.header_extra_1 = 1; 1763 } 1764 1765 /* header_extra_2 */ 1766 hSbrElement->sbrHeaderData.sbr_limiter_bands = params->sbr_limiter_bands; 1767 hSbrElement->sbrHeaderData.sbr_limiter_gains = params->sbr_limiter_gains; 1768 1769 if ((hSbrElement->sbrConfigData.sampleFreq > 48000) && 1770 (hSbrElement->sbrHeaderData.sbr_start_frequency >= 9)) { 1771 hSbrElement->sbrHeaderData.sbr_limiter_gains = SBR_LIMITER_GAINS_INFINITE; 1772 } 1773 1774 hSbrElement->sbrHeaderData.sbr_interpol_freq = params->sbr_interpol_freq; 1775 hSbrElement->sbrHeaderData.sbr_smoothing_length = 1776 params->sbr_smoothing_length; 1777 hSbrElement->sbrHeaderData.header_extra_2 = 0; 1778 1779 if ((params->sbr_limiter_bands != SBR_LIMITER_BANDS_DEFAULT) || 1780 (params->sbr_limiter_gains != SBR_LIMITER_GAINS_DEFAULT) || 1781 (params->sbr_interpol_freq != SBR_INTERPOL_FREQ_DEFAULT) || 1782 (params->sbr_smoothing_length != SBR_SMOOTHING_LENGTH_DEFAULT)) { 1783 hSbrElement->sbrHeaderData.header_extra_2 = 1; 1784 } 1785 1786 /* other switches */ 1787 hSbrElement->sbrConfigData.useWaveCoding = params->useWaveCoding; 1788 hSbrElement->sbrConfigData.useParametricCoding = params->parametricCoding; 1789 hSbrElement->sbrConfigData.thresholdAmpResFF_m = 1790 params->threshold_AmpRes_FF_m; 1791 hSbrElement->sbrConfigData.thresholdAmpResFF_e = 1792 params->threshold_AmpRes_FF_e; 1793 1794 /* init freq band table */ 1795 if (updateFreqBandTable(&hSbrElement->sbrConfigData, 1796 &hSbrElement->sbrHeaderData, 1797 params->downSampleFactor)) { 1798 return (1); 1799 } 1800 1801 /* now create envelope ext and QMF for each available channel */ 1802 for (ch = 0; ch < hSbrElement->sbrConfigData.nChannels; ch++) { 1803 if (initEnvChannel(&hSbrElement->sbrConfigData, &hSbrElement->sbrHeaderData, 1804 &hSbrElement->sbrChannel[ch]->hEnvChannel, params, 1805 statesInitFlag, ch, dynamic_RAM)) { 1806 return (1); 1807 } 1808 1809 } /* nChannels */ 1810 1811 /* reset and intialize analysis qmf */ 1812 for (ch = 0; ch < ((hSbrElement->elInfo.fParametricStereo) 1813 ? 2 1814 : hSbrElement->sbrConfigData.nChannels); 1815 ch++) { 1816 int err; 1817 UINT qmfFlags = 1818 (hSbrElement->sbrConfigData.sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) 1819 ? QMF_FLAG_CLDFB 1820 : 0; 1821 if (statesInitFlag) 1822 qmfFlags &= ~QMF_FLAG_KEEP_STATES; 1823 else 1824 qmfFlags |= QMF_FLAG_KEEP_STATES; 1825 1826 err = qmfInitAnalysisFilterBank( 1827 hSbrElement->hQmfAnalysis[ch], 1828 (FIXP_QAS *)hSbrElement->hQmfAnalysis[ch]->FilterStates, 1829 hSbrElement->sbrConfigData.noQmfSlots, 1830 hSbrElement->sbrConfigData.noQmfBands, 1831 hSbrElement->sbrConfigData.noQmfBands, 1832 hSbrElement->sbrConfigData.noQmfBands, qmfFlags); 1833 if (0 != err) { 1834 return err; 1835 } 1836 } 1837 1838 /* */ 1839 hSbrElement->CmonData.xOverFreq = hSbrElement->sbrConfigData.xOverFreq; 1840 hSbrElement->CmonData.dynBwEnabled = 1841 (params->dynBwSupported && params->dynBwEnabled); 1842 hSbrElement->CmonData.dynXOverFreqEnc = 1843 FDKsbrEnc_SbrGetXOverFreq(hSbrElement, hSbrElement->CmonData.xOverFreq); 1844 for (i = 0; i < 5; i++) 1845 hSbrElement->dynXOverFreqDelay[i] = hSbrElement->CmonData.dynXOverFreqEnc; 1846 hSbrElement->CmonData.sbrNumChannels = hSbrElement->sbrConfigData.nChannels; 1847 hSbrElement->sbrConfigData.dynXOverFreq = hSbrElement->CmonData.xOverFreq; 1848 1849 /* Update Bandwith to be passed to the core encoder */ 1850 *coreBandWith = hSbrElement->CmonData.xOverFreq; 1851 1852 return (0); 1853 } 1854 1855 INT sbrEncoder_GetInBufferSize(int noChannels) { 1856 INT temp; 1857 1858 temp = (2048); 1859 temp += 1024 + MAX_SAMPLE_DELAY; 1860 temp *= noChannels; 1861 temp *= sizeof(INT_PCM); 1862 return temp; 1863 } 1864 1865 /* 1866 * Encode Dummy SBR payload frames to fill the delay lines. 1867 */ 1868 static INT FDKsbrEnc_DelayCompensation(HANDLE_SBR_ENCODER hEnvEnc, 1869 INT_PCM *timeBuffer, 1870 UINT timeBufferBufSize) { 1871 int n, el; 1872 1873 for (n = hEnvEnc->nBitstrDelay; n > 0; n--) { 1874 for (el = 0; el < hEnvEnc->noElements; el++) { 1875 if (FDKsbrEnc_EnvEncodeFrame( 1876 hEnvEnc, el, 1877 timeBuffer + hEnvEnc->downsampledOffset / hEnvEnc->nChannels, 1878 timeBufferBufSize, NULL, NULL, 1)) 1879 return -1; 1880 } 1881 sbrEncoder_UpdateBuffers(hEnvEnc, timeBuffer, timeBufferBufSize); 1882 } 1883 return 0; 1884 } 1885 1886 UINT sbrEncoder_LimitBitRate(UINT bitRate, UINT numChannels, 1887 UINT coreSampleRate, AUDIO_OBJECT_TYPE aot) { 1888 UINT newBitRate = bitRate; 1889 INT index; 1890 1891 FDK_ASSERT(numChannels > 0 && numChannels <= 2); 1892 if (aot == AOT_PS) { 1893 if (numChannels == 1) { 1894 index = getPsTuningTableIndex(bitRate, &newBitRate); 1895 if (index == INVALID_TABLE_IDX) { 1896 bitRate = newBitRate; 1897 } 1898 } else { 1899 return 0; 1900 } 1901 } 1902 index = getSbrTuningTableIndex(bitRate, numChannels, coreSampleRate, aot, 1903 &newBitRate); 1904 if (index != INVALID_TABLE_IDX) { 1905 newBitRate = bitRate; 1906 } 1907 1908 return newBitRate; 1909 } 1910 1911 UINT sbrEncoder_IsSingleRatePossible(AUDIO_OBJECT_TYPE aot) { 1912 UINT isPossible = (AOT_PS == aot) ? 0 : 1; 1913 return isPossible; 1914 } 1915 1916 /*****************************************************************************/ 1917 /* */ 1918 /*functionname: sbrEncoder_Init_delay */ 1919 /*description: Determine Delay balancing and new encoder delay */ 1920 /* */ 1921 /*returns: - error status */ 1922 /*input: - frame length of the core (i.e. e.g. AAC) */ 1923 /* - number of channels */ 1924 /* - downsample factor (1 for downsampled, 2 for dual-rate SBR) */ 1925 /* - low delay presence */ 1926 /* - ps presence */ 1927 /* - downsampling method: QMF-, time domain or no downsampling */ 1928 /* - various delay values (see DELAY_PARAM struct description) */ 1929 /* */ 1930 /*Example: Delay balancing for a HE-AACv1 encoder (time-domain downsampling) */ 1931 /*========================================================================== */ 1932 /* */ 1933 /* +--------+ +--------+ +--------+ +--------+ +--------+ */ 1934 /* |core | |ds 2:1 | |AAC | |QMF | |QMF | */ 1935 /* +-+path +------------+ +-+core +-+analysis+-+overlap +-+ */ 1936 /* | |offset | | | | | |32 bands| | | | */ 1937 /* | +--------+ +--------+ +--------+ +--------+ +--------+ | */ 1938 /* | core path +-------++ */ 1939 /* | |QMF | */ 1940 /*->+ +synth. +-> */ 1941 /* | |64 bands| */ 1942 /* | +-------++ */ 1943 /* | +--------+ +--------+ +--------+ +--------+ | */ 1944 /* | |SBR path| |QMF | |subband | |bs delay| | */ 1945 /* +-+offset +-+analysis+-+sample +-+(full +-----------------------+ */ 1946 /* | | |64 bands| |buffer | | frames)| */ 1947 /* +--------+ +--------+ +--------+ +--------+ */ 1948 /* SBR path */ 1949 /* */ 1950 /*****************************************************************************/ 1951 static INT sbrEncoder_Init_delay( 1952 const int coreFrameLength, /* input */ 1953 const int numChannels, /* input */ 1954 const int downSampleFactor, /* input */ 1955 const int lowDelay, /* input */ 1956 const int usePs, /* input */ 1957 const int is212, /* input */ 1958 const SBRENC_DS_TYPE downsamplingMethod, /* input */ 1959 DELAY_PARAM *hDelayParam /* input/output */ 1960 ) { 1961 int delayCorePath = 0; /* delay in core path */ 1962 int delaySbrPath = 0; /* delay difference in QMF aka SBR path */ 1963 int delayInput2Core = 0; /* delay from the input to the core */ 1964 int delaySbrDec = 0; /* delay of the decoder's SBR module */ 1965 1966 int delayCore = hDelayParam->delay; /* delay of the core */ 1967 1968 /* Added delay by the SBR delay initialization */ 1969 int corePathOffset = 0; /* core path */ 1970 int sbrPathOffset = 0; /* sbr path */ 1971 int bitstreamDelay = 0; /* sbr path, framewise */ 1972 1973 int flCore = coreFrameLength; /* core frame length */ 1974 1975 int returnValue = 0; /* return value - 0 means: no error */ 1976 1977 /* 1) Calculate actual delay for core and SBR path */ 1978 if (is212) { 1979 delayCorePath = DELAY_COREPATH_ELDv2SBR(flCore, downSampleFactor); 1980 delaySbrPath = DELAY_ELDv2SBR(flCore, downSampleFactor); 1981 delaySbrDec = ((flCore) / 2) * (downSampleFactor); 1982 } else if (lowDelay) { 1983 delayCorePath = DELAY_COREPATH_ELDSBR(flCore, downSampleFactor); 1984 delaySbrPath = DELAY_ELDSBR(flCore, downSampleFactor); 1985 delaySbrDec = DELAY_QMF_POSTPROC(downSampleFactor); 1986 } else if (usePs) { 1987 delayCorePath = DELAY_COREPATH_PS(flCore, downSampleFactor); 1988 delaySbrPath = DELAY_PS(flCore, downSampleFactor); 1989 delaySbrDec = DELAY_COREPATH_SBR(flCore, downSampleFactor); 1990 } else { 1991 delayCorePath = DELAY_COREPATH_SBR(flCore, downSampleFactor); 1992 delaySbrPath = DELAY_SBR(flCore, downSampleFactor); 1993 delaySbrDec = DELAY_COREPATH_SBR(flCore, downSampleFactor); 1994 } 1995 delayCorePath += delayCore * downSampleFactor; 1996 delayCorePath += 1997 (downsamplingMethod == SBRENC_DS_TIME) ? hDelayParam->dsDelay : 0; 1998 1999 /* 2) Manage coupling of paths */ 2000 if (downsamplingMethod == SBRENC_DS_QMF && delayCorePath > delaySbrPath) { 2001 /* In case of QMF downsampling, both paths are coupled, i.e. the SBR path 2002 offset would be added to both the SBR path and to the core path 2003 as well, thus making it impossible to achieve delay balancing. 2004 To overcome that problem, a framewise delay is added to the SBR path 2005 first, until the overall delay of the core path is shorter than 2006 the delay of the SBR path. When this is achieved, the missing delay 2007 difference can be added as downsampled offset to the core path. 2008 */ 2009 while (delayCorePath > delaySbrPath) { 2010 /* Add one frame delay to SBR path */ 2011 delaySbrPath += flCore * downSampleFactor; 2012 bitstreamDelay += 1; 2013 } 2014 } 2015 2016 /* 3) Calculate necessary additional delay to balance the paths */ 2017 if (delayCorePath > delaySbrPath) { 2018 /* Delay QMF input */ 2019 while (delayCorePath > delaySbrPath + (int)flCore * (int)downSampleFactor) { 2020 /* Do bitstream frame-wise delay balancing if there are 2021 more than SBR framelength samples delay difference */ 2022 delaySbrPath += flCore * downSampleFactor; 2023 bitstreamDelay += 1; 2024 } 2025 /* Multiply input offset by input channels */ 2026 corePathOffset = 0; 2027 sbrPathOffset = (delayCorePath - delaySbrPath) * numChannels; 2028 } else { 2029 /* Delay AAC data */ 2030 /* Multiply downsampled offset by AAC core channels. Divide by 2 because of 2031 half samplerate of downsampled data. */ 2032 corePathOffset = ((delaySbrPath - delayCorePath) * numChannels) >> 2033 (downSampleFactor - 1); 2034 sbrPathOffset = 0; 2035 } 2036 2037 /* 4) Calculate delay from input to core */ 2038 if (usePs) { 2039 delayInput2Core = 2040 (DELAY_QMF_ANA(downSampleFactor) + DELAY_QMF_DS + DELAY_HYB_SYN) + 2041 (downSampleFactor * corePathOffset) + 1; 2042 } else if (downsamplingMethod == SBRENC_DS_TIME) { 2043 delayInput2Core = corePathOffset + hDelayParam->dsDelay; 2044 } else { 2045 delayInput2Core = corePathOffset; 2046 } 2047 2048 /* 6) Set output parameters */ 2049 hDelayParam->delay = FDKmax(delayCorePath, delaySbrPath); /* overall delay */ 2050 hDelayParam->sbrDecDelay = delaySbrDec; /* SBR decoder delay */ 2051 hDelayParam->delayInput2Core = delayInput2Core; /* delay input - core */ 2052 hDelayParam->bitstrDelay = bitstreamDelay; /* bitstream delay, in frames */ 2053 hDelayParam->corePathOffset = corePathOffset; /* offset added to core path */ 2054 hDelayParam->sbrPathOffset = sbrPathOffset; /* offset added to SBR path */ 2055 2056 return returnValue; 2057 } 2058 2059 /***************************************************************************** 2060 2061 functionname: sbrEncoder_Init 2062 description: initializes the SBR encoder 2063 returns: error status 2064 2065 *****************************************************************************/ 2066 INT sbrEncoder_Init(HANDLE_SBR_ENCODER hSbrEncoder, 2067 SBR_ELEMENT_INFO elInfo[(8)], int noElements, 2068 INT_PCM *inputBuffer, UINT inputBufferBufSize, 2069 INT *coreBandwidth, INT *inputBufferOffset, 2070 INT *numChannels, const UINT syntaxFlags, 2071 INT *coreSampleRate, UINT *downSampleFactor, 2072 INT *frameLength, AUDIO_OBJECT_TYPE aot, int *delay, 2073 int transformFactor, const int headerPeriod, 2074 ULONG statesInitFlag) { 2075 HANDLE_ERROR_INFO errorInfo = noError; 2076 sbrConfiguration sbrConfig[(8)]; 2077 INT error = 0; 2078 INT lowestBandwidth; 2079 /* Save input parameters */ 2080 INT inputSampleRate = *coreSampleRate; 2081 int coreFrameLength = *frameLength; 2082 int inputBandWidth = *coreBandwidth; 2083 int inputChannels = *numChannels; 2084 2085 SBRENC_DS_TYPE downsamplingMethod = SBRENC_DS_NONE; 2086 int highestSbrStartFreq, highestSbrStopFreq; 2087 int lowDelay = 0; 2088 int usePs = 0; 2089 int is212 = 0; 2090 2091 DELAY_PARAM delayParam; 2092 2093 /* check whether SBR setting is available for the current encoder 2094 * configuration (bitrate, samplerate) */ 2095 if (!sbrEncoder_IsSingleRatePossible(aot)) { 2096 *downSampleFactor = 2; 2097 } 2098 2099 if (aot == AOT_PS) { 2100 usePs = 1; 2101 } 2102 if (aot == AOT_ER_AAC_ELD) { 2103 lowDelay = 1; 2104 } else if (aot == AOT_ER_AAC_LD) { 2105 error = 1; 2106 goto bail; 2107 } 2108 2109 /* Parametric Stereo */ 2110 if (usePs) { 2111 if (*numChannels == 2 && noElements == 1) { 2112 /* Override Element type in case of Parametric stereo */ 2113 elInfo[0].elType = ID_SCE; 2114 elInfo[0].fParametricStereo = 1; 2115 elInfo[0].nChannelsInEl = 1; 2116 /* core encoder gets downmixed mono signal */ 2117 *numChannels = 1; 2118 } else { 2119 error = 1; 2120 goto bail; 2121 } 2122 } /* usePs */ 2123 2124 /* set the core's sample rate */ 2125 switch (*downSampleFactor) { 2126 case 1: 2127 *coreSampleRate = inputSampleRate; 2128 downsamplingMethod = SBRENC_DS_NONE; 2129 break; 2130 case 2: 2131 *coreSampleRate = inputSampleRate >> 1; 2132 downsamplingMethod = usePs ? SBRENC_DS_QMF : SBRENC_DS_TIME; 2133 break; 2134 default: 2135 *coreSampleRate = inputSampleRate >> 1; 2136 return 0; /* return error */ 2137 } 2138 2139 /* check whether SBR setting is available for the current encoder 2140 * configuration (bitrate, coreSampleRate) */ 2141 { 2142 int el, coreEl; 2143 2144 /* Check if every element config is feasible */ 2145 for (coreEl = 0; coreEl < noElements; coreEl++) { 2146 /* SBR only handles SCE and CPE's */ 2147 if (elInfo[coreEl].elType != ID_SCE && elInfo[coreEl].elType != ID_CPE) { 2148 continue; 2149 } 2150 /* check if desired configuration is available */ 2151 if (!FDKsbrEnc_IsSbrSettingAvail(elInfo[coreEl].bitRate, 0, 2152 elInfo[coreEl].nChannelsInEl, 2153 inputSampleRate, *coreSampleRate, aot)) { 2154 error = 1; 2155 goto bail; 2156 } 2157 } 2158 2159 hSbrEncoder->nChannels = *numChannels; 2160 hSbrEncoder->frameSize = coreFrameLength * *downSampleFactor; 2161 hSbrEncoder->downsamplingMethod = downsamplingMethod; 2162 hSbrEncoder->downSampleFactor = *downSampleFactor; 2163 hSbrEncoder->estimateBitrate = 0; 2164 hSbrEncoder->inputDataDelay = 0; 2165 is212 = ((aot == AOT_ER_AAC_ELD) && (syntaxFlags & AC_LD_MPS)) ? 1 : 0; 2166 2167 /* Open SBR elements */ 2168 el = -1; 2169 highestSbrStartFreq = highestSbrStopFreq = 0; 2170 lowestBandwidth = 99999; 2171 2172 /* Loop through each core encoder element and get a matching SBR element 2173 * config */ 2174 for (coreEl = 0; coreEl < noElements; coreEl++) { 2175 /* SBR only handles SCE and CPE's */ 2176 if (elInfo[coreEl].elType == ID_SCE || elInfo[coreEl].elType == ID_CPE) { 2177 el++; 2178 } else { 2179 continue; 2180 } 2181 2182 /* Set parametric Stereo Flag. */ 2183 if (usePs) { 2184 elInfo[coreEl].fParametricStereo = 1; 2185 } else { 2186 elInfo[coreEl].fParametricStereo = 0; 2187 } 2188 2189 /* 2190 * Init sbrConfig structure 2191 */ 2192 if (!FDKsbrEnc_InitializeSbrDefaults(&sbrConfig[el], *downSampleFactor, 2193 coreFrameLength, IS_LOWDELAY(aot))) { 2194 error = 1; 2195 goto bail; 2196 } 2197 2198 /* 2199 * Modify sbrConfig structure according to Element parameters 2200 */ 2201 if (!FDKsbrEnc_AdjustSbrSettings( 2202 &sbrConfig[el], elInfo[coreEl].bitRate, 2203 elInfo[coreEl].nChannelsInEl, *coreSampleRate, inputSampleRate, 2204 transformFactor, 24000, 0, 0, /* useSpeechConfig */ 2205 0, /* lcsMode */ 2206 usePs, /* bParametricStereo */ 2207 aot)) { 2208 error = 1; 2209 goto bail; 2210 } 2211 2212 /* Find common frequency border for all SBR elements */ 2213 highestSbrStartFreq = 2214 fixMax(highestSbrStartFreq, sbrConfig[el].startFreq); 2215 highestSbrStopFreq = fixMax(highestSbrStopFreq, sbrConfig[el].stopFreq); 2216 2217 } /* first element loop */ 2218 2219 /* Set element count (can be less than core encoder element count) */ 2220 hSbrEncoder->noElements = el + 1; 2221 2222 FDKsbrEnc_Reallocate(hSbrEncoder, elInfo, noElements); 2223 2224 for (el = 0; el < hSbrEncoder->noElements; el++) { 2225 int bandwidth = *coreBandwidth; 2226 2227 /* Use lowest common bandwidth */ 2228 sbrConfig[el].startFreq = highestSbrStartFreq; 2229 sbrConfig[el].stopFreq = highestSbrStopFreq; 2230 2231 /* initialize SBR element, and get core bandwidth */ 2232 error = FDKsbrEnc_EnvInit(hSbrEncoder->sbrElement[el], &sbrConfig[el], 2233 &bandwidth, aot, el, headerPeriod, 2234 statesInitFlag, hSbrEncoder->downsamplingMethod, 2235 hSbrEncoder->dynamicRam); 2236 2237 if (error != 0) { 2238 error = 2; 2239 goto bail; 2240 } 2241 2242 /* Get lowest core encoder bandwidth to be returned later. */ 2243 lowestBandwidth = fixMin(lowestBandwidth, bandwidth); 2244 2245 } /* second element loop */ 2246 2247 /* Initialize a downsampler for each channel in each SBR element */ 2248 if (hSbrEncoder->downsamplingMethod == SBRENC_DS_TIME) { 2249 for (el = 0; el < hSbrEncoder->noElements; el++) { 2250 HANDLE_SBR_ELEMENT hSbrEl = hSbrEncoder->sbrElement[el]; 2251 INT Wc, ch; 2252 2253 Wc = 500; /* Cutoff frequency with full bandwidth */ 2254 2255 for (ch = 0; ch < hSbrEl->elInfo.nChannelsInEl; ch++) { 2256 FDKaacEnc_InitDownsampler(&hSbrEl->sbrChannel[ch]->downSampler, Wc, 2257 *downSampleFactor); 2258 FDK_ASSERT(hSbrEl->sbrChannel[ch]->downSampler.delay <= 2259 MAX_DS_FILTER_DELAY); 2260 } 2261 } /* third element loop */ 2262 2263 /* lfe */ 2264 FDKaacEnc_InitDownsampler(&hSbrEncoder->lfeDownSampler, 0, 2265 *downSampleFactor); 2266 } 2267 2268 /* Get delay information */ 2269 delayParam.dsDelay = 2270 hSbrEncoder->sbrElement[0]->sbrChannel[0]->downSampler.delay; 2271 delayParam.delay = *delay; 2272 2273 error = sbrEncoder_Init_delay(coreFrameLength, *numChannels, 2274 *downSampleFactor, lowDelay, usePs, is212, 2275 downsamplingMethod, &delayParam); 2276 2277 if (error != 0) { 2278 error = 3; 2279 goto bail; 2280 } 2281 2282 hSbrEncoder->nBitstrDelay = delayParam.bitstrDelay; 2283 hSbrEncoder->sbrDecDelay = delayParam.sbrDecDelay; 2284 hSbrEncoder->inputDataDelay = delayParam.delayInput2Core; 2285 2286 /* Assign core encoder Bandwidth */ 2287 *coreBandwidth = lowestBandwidth; 2288 2289 /* Estimate sbr bitrate, 2.5 kBit/s per sbr channel */ 2290 hSbrEncoder->estimateBitrate += 2500 * (*numChannels); 2291 2292 /* Initialize bitstream buffer for each element */ 2293 for (el = 0; el < hSbrEncoder->noElements; el++) { 2294 FDKsbrEnc_bsBufInit(hSbrEncoder->sbrElement[el], delayParam.bitstrDelay); 2295 } 2296 2297 /* initialize parametric stereo */ 2298 if (usePs) { 2299 PSENC_CONFIG psEncConfig; 2300 FDK_ASSERT(hSbrEncoder->noElements == 1); 2301 INT psTuningTableIdx = getPsTuningTableIndex(elInfo[0].bitRate, NULL); 2302 2303 psEncConfig.frameSize = coreFrameLength; // sbrConfig.sbrFrameSize; 2304 psEncConfig.qmfFilterMode = 0; 2305 psEncConfig.sbrPsDelay = 0; 2306 2307 /* tuning parameters */ 2308 if (psTuningTableIdx != INVALID_TABLE_IDX) { 2309 psEncConfig.nStereoBands = psTuningTable[psTuningTableIdx].nStereoBands; 2310 psEncConfig.maxEnvelopes = psTuningTable[psTuningTableIdx].nEnvelopes; 2311 psEncConfig.iidQuantErrorThreshold = 2312 (FIXP_DBL)psTuningTable[psTuningTableIdx].iidQuantErrorThreshold; 2313 2314 /* calculation is not quite linear, increased number of envelopes causes 2315 * more bits */ 2316 /* assume avg. 50 bits per frame for 10 stereo bands / 1 envelope 2317 * configuration */ 2318 hSbrEncoder->estimateBitrate += 2319 ((((*coreSampleRate) * 5 * psEncConfig.nStereoBands * 2320 psEncConfig.maxEnvelopes) / 2321 hSbrEncoder->frameSize)); 2322 2323 } else { 2324 error = ERROR(CDI, "Invalid ps tuning table index."); 2325 goto bail; 2326 } 2327 2328 qmfInitSynthesisFilterBank( 2329 &hSbrEncoder->qmfSynthesisPS, 2330 (FIXP_DBL *)hSbrEncoder->qmfSynthesisPS.FilterStates, 2331 hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfSlots, 2332 hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfBands >> 1, 2333 hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfBands >> 1, 2334 hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfBands >> 1, 2335 (statesInitFlag) ? 0 : QMF_FLAG_KEEP_STATES); 2336 2337 if (errorInfo == noError) { 2338 /* update delay */ 2339 psEncConfig.sbrPsDelay = 2340 FDKsbrEnc_GetEnvEstDelay(&hSbrEncoder->sbrElement[0] 2341 ->sbrChannel[0] 2342 ->hEnvChannel.sbrExtractEnvelope); 2343 2344 errorInfo = 2345 PSEnc_Init(hSbrEncoder->hParametricStereo, &psEncConfig, 2346 hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfSlots, 2347 hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfBands, 2348 hSbrEncoder->dynamicRam); 2349 } 2350 } 2351 2352 hSbrEncoder->downsampledOffset = delayParam.corePathOffset; 2353 hSbrEncoder->bufferOffset = delayParam.sbrPathOffset; 2354 *delay = delayParam.delay; 2355 2356 { hSbrEncoder->downmixSize = coreFrameLength * (*numChannels); } 2357 2358 /* Delay Compensation: fill bitstream delay buffer with zero input signal */ 2359 if (hSbrEncoder->nBitstrDelay > 0) { 2360 error = FDKsbrEnc_DelayCompensation(hSbrEncoder, inputBuffer, 2361 inputBufferBufSize); 2362 if (error != 0) goto bail; 2363 } 2364 2365 /* Set Output frame length */ 2366 *frameLength = coreFrameLength * *downSampleFactor; 2367 /* Input buffer offset */ 2368 *inputBufferOffset = 2369 fixMax(delayParam.sbrPathOffset, delayParam.corePathOffset); 2370 } 2371 2372 return error; 2373 2374 bail: 2375 /* Restore input settings */ 2376 *coreSampleRate = inputSampleRate; 2377 *frameLength = coreFrameLength; 2378 *numChannels = inputChannels; 2379 *coreBandwidth = inputBandWidth; 2380 2381 return error; 2382 } 2383 2384 INT sbrEncoder_EncodeFrame(HANDLE_SBR_ENCODER hSbrEncoder, INT_PCM *samples, 2385 UINT samplesBufSize, UINT sbrDataBits[(8)], 2386 UCHAR sbrData[(8)][MAX_PAYLOAD_SIZE]) { 2387 INT error; 2388 int el; 2389 2390 for (el = 0; el < hSbrEncoder->noElements; el++) { 2391 if (hSbrEncoder->sbrElement[el] != NULL) { 2392 error = FDKsbrEnc_EnvEncodeFrame( 2393 hSbrEncoder, el, 2394 samples + hSbrEncoder->downsampledOffset / hSbrEncoder->nChannels, 2395 samplesBufSize, &sbrDataBits[el], sbrData[el], 0); 2396 if (error) return error; 2397 } 2398 } 2399 2400 error = FDKsbrEnc_Downsample( 2401 hSbrEncoder, 2402 samples + hSbrEncoder->downsampledOffset / hSbrEncoder->nChannels, 2403 samplesBufSize, hSbrEncoder->nChannels, &sbrDataBits[el], sbrData[el], 0); 2404 if (error) return error; 2405 2406 return 0; 2407 } 2408 2409 INT sbrEncoder_UpdateBuffers(HANDLE_SBR_ENCODER hSbrEncoder, 2410 INT_PCM *timeBuffer, UINT timeBufferBufSize) { 2411 if (hSbrEncoder->downsampledOffset > 0) { 2412 int c; 2413 int nd = hSbrEncoder->downmixSize / hSbrEncoder->nChannels; 2414 2415 for (c = 0; c < hSbrEncoder->nChannels; c++) { 2416 /* Move delayed downsampled data */ 2417 FDKmemcpy(timeBuffer + timeBufferBufSize * c, 2418 timeBuffer + timeBufferBufSize * c + nd, 2419 sizeof(INT_PCM) * 2420 (hSbrEncoder->downsampledOffset / hSbrEncoder->nChannels)); 2421 } 2422 } else { 2423 int c; 2424 2425 for (c = 0; c < hSbrEncoder->nChannels; c++) { 2426 /* Move delayed input data */ 2427 FDKmemcpy( 2428 timeBuffer + timeBufferBufSize * c, 2429 timeBuffer + timeBufferBufSize * c + hSbrEncoder->frameSize, 2430 sizeof(INT_PCM) * hSbrEncoder->bufferOffset / hSbrEncoder->nChannels); 2431 } 2432 } 2433 if (hSbrEncoder->nBitstrDelay > 0) { 2434 int el; 2435 2436 for (el = 0; el < hSbrEncoder->noElements; el++) { 2437 FDKmemmove( 2438 hSbrEncoder->sbrElement[el]->payloadDelayLine[0], 2439 hSbrEncoder->sbrElement[el]->payloadDelayLine[1], 2440 sizeof(UCHAR) * (hSbrEncoder->nBitstrDelay * MAX_PAYLOAD_SIZE)); 2441 2442 FDKmemmove(&hSbrEncoder->sbrElement[el]->payloadDelayLineSize[0], 2443 &hSbrEncoder->sbrElement[el]->payloadDelayLineSize[1], 2444 sizeof(UINT) * (hSbrEncoder->nBitstrDelay)); 2445 } 2446 } 2447 return 0; 2448 } 2449 2450 INT sbrEncoder_SendHeader(HANDLE_SBR_ENCODER hSbrEncoder) { 2451 INT error = -1; 2452 if (hSbrEncoder) { 2453 int el; 2454 for (el = 0; el < hSbrEncoder->noElements; el++) { 2455 if ((hSbrEncoder->noElements == 1) && 2456 (hSbrEncoder->sbrElement[0]->elInfo.fParametricStereo == 1)) { 2457 hSbrEncoder->sbrElement[el]->sbrBitstreamData.CountSendHeaderData = 2458 hSbrEncoder->sbrElement[el]->sbrBitstreamData.NrSendHeaderData - 1; 2459 } else { 2460 hSbrEncoder->sbrElement[el]->sbrBitstreamData.CountSendHeaderData = 0; 2461 } 2462 } 2463 error = 0; 2464 } 2465 return error; 2466 } 2467 2468 INT sbrEncoder_ContainsHeader(HANDLE_SBR_ENCODER hSbrEncoder) { 2469 INT sbrHeader = 1; 2470 if (hSbrEncoder) { 2471 int el; 2472 for (el = 0; el < hSbrEncoder->noElements; el++) { 2473 sbrHeader &= 2474 (hSbrEncoder->sbrElement[el]->sbrBitstreamData.HeaderActiveDelay == 1) 2475 ? 1 2476 : 0; 2477 } 2478 } 2479 return sbrHeader; 2480 } 2481 2482 INT sbrEncoder_GetHeaderDelay(HANDLE_SBR_ENCODER hSbrEncoder) { 2483 INT delay = -1; 2484 2485 if (hSbrEncoder) { 2486 if ((hSbrEncoder->noElements == 1) && 2487 (hSbrEncoder->sbrElement[0]->elInfo.fParametricStereo == 1)) { 2488 delay = hSbrEncoder->nBitstrDelay + 1; 2489 } else { 2490 delay = hSbrEncoder->nBitstrDelay; 2491 } 2492 } 2493 return delay; 2494 } 2495 INT sbrEncoder_GetBsDelay(HANDLE_SBR_ENCODER hSbrEncoder) { 2496 INT delay = -1; 2497 2498 if (hSbrEncoder) { 2499 delay = hSbrEncoder->nBitstrDelay; 2500 } 2501 return delay; 2502 } 2503 2504 INT sbrEncoder_SAPPrepare(HANDLE_SBR_ENCODER hSbrEncoder) { 2505 INT error = -1; 2506 if (hSbrEncoder) { 2507 int el; 2508 for (el = 0; el < hSbrEncoder->noElements; el++) { 2509 hSbrEncoder->sbrElement[el]->sbrBitstreamData.rightBorderFIX = 1; 2510 } 2511 error = 0; 2512 } 2513 return error; 2514 } 2515 2516 INT sbrEncoder_GetEstimateBitrate(HANDLE_SBR_ENCODER hSbrEncoder) { 2517 INT estimateBitrate = 0; 2518 2519 if (hSbrEncoder) { 2520 estimateBitrate += hSbrEncoder->estimateBitrate; 2521 } 2522 2523 return estimateBitrate; 2524 } 2525 2526 INT sbrEncoder_GetInputDataDelay(HANDLE_SBR_ENCODER hSbrEncoder) { 2527 INT delay = -1; 2528 2529 if (hSbrEncoder) { 2530 delay = hSbrEncoder->inputDataDelay; 2531 } 2532 return delay; 2533 } 2534 2535 INT sbrEncoder_GetSbrDecDelay(HANDLE_SBR_ENCODER hSbrEncoder) { 2536 INT delay = -1; 2537 2538 if (hSbrEncoder) { 2539 delay = hSbrEncoder->sbrDecDelay; 2540 } 2541 return delay; 2542 } 2543 2544 INT sbrEncoder_GetLibInfo(LIB_INFO *info) { 2545 int i; 2546 2547 if (info == NULL) { 2548 return -1; 2549 } 2550 /* search for next free tab */ 2551 for (i = 0; i < FDK_MODULE_LAST; i++) { 2552 if (info[i].module_id == FDK_NONE) break; 2553 } 2554 if (i == FDK_MODULE_LAST) { 2555 return -1; 2556 } 2557 info += i; 2558 2559 info->module_id = FDK_SBRENC; 2560 info->version = 2561 LIB_VERSION(SBRENCODER_LIB_VL0, SBRENCODER_LIB_VL1, SBRENCODER_LIB_VL2); 2562 LIB_VERSION_STRING(info); 2563 #ifdef __ANDROID__ 2564 info->build_date = ""; 2565 info->build_time = ""; 2566 #else 2567 info->build_date = __DATE__; 2568 info->build_time = __TIME__; 2569 #endif 2570 info->title = "SBR Encoder"; 2571 2572 /* Set flags */ 2573 info->flags = 0 | CAPF_SBR_HQ | CAPF_SBR_PS_MPEG; 2574 /* End of flags */ 2575 2576 return 0; 2577 } 2578