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