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 decoder library ****************************** 96 97 Author(s): 98 99 Description: 100 101 *******************************************************************************/ 102 103 /*! 104 \file 105 \brief Sbr decoder 106 This module provides the actual decoder implementation. The SBR data (side 107 information) is already decoded. Only three functions are provided: 108 109 \li 1.) createSbrDec(): One time initialization 110 \li 2.) resetSbrDec(): Called by sbr_Apply() when the information contained in 111 an SBR_HEADER_ELEMENT requires a reset and recalculation of important SBR 112 structures. \li 3.) sbr_dec(): The actual decoder. Calls the different tools 113 such as filterbanks, lppTransposer(), and calculateSbrEnvelope() [the envelope 114 adjuster]. 115 116 \sa sbr_dec(), \ref documentationOverview 117 */ 118 119 #include "sbr_dec.h" 120 121 #include "sbr_ram.h" 122 #include "env_extr.h" 123 #include "env_calc.h" 124 #include "scale.h" 125 #include "FDK_matrixCalloc.h" 126 #include "hbe.h" 127 128 #include "genericStds.h" 129 130 #include "sbrdec_drc.h" 131 132 static void copyHarmonicSpectrum(int *xOverQmf, FIXP_DBL **qmfReal, 133 FIXP_DBL **qmfImag, int noCols, int overlap, 134 KEEP_STATES_SYNCED_MODE keepStatesSynced) { 135 int patchBands; 136 int patch, band, col, target, sourceBands, i; 137 int numPatches = 0; 138 int slotOffset = 0; 139 140 FIXP_DBL **ppqmfReal = qmfReal + overlap; 141 FIXP_DBL **ppqmfImag = qmfImag + overlap; 142 143 if (keepStatesSynced == KEEP_STATES_SYNCED_NORMAL) { 144 slotOffset = noCols - overlap - LPC_ORDER; 145 } 146 147 if (keepStatesSynced == KEEP_STATES_SYNCED_OUTDIFF) { 148 ppqmfReal = qmfReal; 149 ppqmfImag = qmfImag; 150 } 151 152 for (i = 1; i < MAX_NUM_PATCHES; i++) { 153 if (xOverQmf[i] != 0) { 154 numPatches++; 155 } 156 } 157 158 for (patch = (MAX_STRETCH_HBE - 1); patch < numPatches; patch++) { 159 patchBands = xOverQmf[patch + 1] - xOverQmf[patch]; 160 target = xOverQmf[patch]; 161 sourceBands = xOverQmf[MAX_STRETCH_HBE - 1] - xOverQmf[MAX_STRETCH_HBE - 2]; 162 163 while (patchBands > 0) { 164 int numBands = sourceBands; 165 int startBand = xOverQmf[MAX_STRETCH_HBE - 1] - 1; 166 if (target + numBands >= xOverQmf[patch + 1]) { 167 numBands = xOverQmf[patch + 1] - target; 168 } 169 if ((((target + numBands - 1) % 2) + 170 ((xOverQmf[MAX_STRETCH_HBE - 1] - 1) % 2)) % 171 2) { 172 if (numBands == sourceBands) { 173 numBands--; 174 } else { 175 startBand--; 176 } 177 } 178 if (keepStatesSynced == KEEP_STATES_SYNCED_OUTDIFF) { 179 for (col = slotOffset; col < overlap + LPC_ORDER; col++) { 180 i = 0; 181 for (band = numBands; band > 0; band--) { 182 if ((target + band - 1 < 64) && 183 (target + band - 1 < xOverQmf[patch + 1])) { 184 ppqmfReal[col][target + band - 1] = ppqmfReal[col][startBand - i]; 185 ppqmfImag[col][target + band - 1] = ppqmfImag[col][startBand - i]; 186 i++; 187 } 188 } 189 } 190 } else { 191 for (col = slotOffset; col < noCols; col++) { 192 i = 0; 193 for (band = numBands; band > 0; band--) { 194 if ((target + band - 1 < 64) && 195 (target + band - 1 < xOverQmf[patch + 1])) { 196 ppqmfReal[col][target + band - 1] = ppqmfReal[col][startBand - i]; 197 ppqmfImag[col][target + band - 1] = ppqmfImag[col][startBand - i]; 198 i++; 199 } 200 } 201 } 202 } 203 target += numBands; 204 patchBands -= numBands; 205 } 206 } 207 } 208 209 /*! 210 \brief SBR decoder core function for one channel 211 212 \image html BufferMgmtDetailed-1632.png 213 214 Besides the filter states of the QMF filter bank and the LPC-states of 215 the LPP-Transposer, processing is mainly based on four buffers: 216 #timeIn, #timeOut, #WorkBuffer2 and #OverlapBuffer. The #WorkBuffer2 217 is reused for all channels and might be used by the core decoder, a 218 static overlap buffer is required for each channel. Due to in-place 219 processing, #timeIn and #timeOut point to identical locations. 220 221 The spectral data is organized in so-called slots. Each slot 222 contains 64 bands of complex data. The number of slots per frame 223 depends on the frame size. For mp3PRO, there are 18 slots per frame 224 and 6 slots per #OverlapBuffer. It is not necessary to have the slots 225 in located consecutive address ranges. 226 227 To optimize memory usage and to minimize the number of memory 228 accesses, the memory management is organized as follows (slot numbers 229 based on mp3PRO): 230 231 1.) Input time domain signal is located in #timeIn. The last slots 232 (0..5) of the spectral data of the previous frame are located in the 233 #OverlapBuffer. In addition, #frameData of the current frame resides 234 in the upper part of #timeIn. 235 236 2.) During the cplxAnalysisQmfFiltering(), 32 samples from #timeIn are 237 transformed into a slot of up to 32 complex spectral low band values at a 238 time. The first spectral slot -- nr. 6 -- is written at slot number 239 zero of #WorkBuffer2. #WorkBuffer2 will be completely filled with 240 spectral data. 241 242 3.) LPP-Transposition in lppTransposer() is processed on 24 slots. During the 243 transposition, the high band part of the spectral data is replicated 244 based on the low band data. 245 246 Envelope Adjustment is processed on the high band part of the spectral 247 data only by calculateSbrEnvelope(). 248 249 4.) The cplxSynthesisQmfFiltering() creates 64 time domain samples out 250 of a slot of 64 complex spectral values at a time. The first 6 slots 251 in #timeOut are filled from the results of spectral slots 0..5 in the 252 #OverlapBuffer. The consecutive slots in timeOut are now filled with 253 the results of spectral slots 6..17. 254 255 5.) The preprocessed slots 18..23 have to be stored in the 256 #OverlapBuffer. 257 258 */ 259 260 void sbr_dec( 261 HANDLE_SBR_DEC hSbrDec, /*!< handle to Decoder channel */ 262 INT_PCM *timeIn, /*!< pointer to input time signal */ 263 INT_PCM *timeOut, /*!< pointer to output time signal */ 264 HANDLE_SBR_DEC hSbrDecRight, /*!< handle to Decoder channel right */ 265 INT_PCM *timeOutRight, /*!< pointer to output time signal */ 266 const int strideOut, /*!< Time data traversal strideOut */ 267 HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ 268 HANDLE_SBR_FRAME_DATA hFrameData, /*!< Control data of current frame */ 269 HANDLE_SBR_PREV_FRAME_DATA 270 hPrevFrameData, /*!< Some control data of last frame */ 271 const int applyProcessing, /*!< Flag for SBR operation */ 272 HANDLE_PS_DEC h_ps_d, const UINT flags, const int codecFrameSize) { 273 int i, slot, reserve; 274 int saveLbScale; 275 int lastSlotOffs; 276 FIXP_DBL maxVal; 277 278 /* temporary pointer / variable for QMF; 279 required as we want to use temporary buffer 280 creating one frame delay for HBE in LP mode */ 281 INT_PCM *pTimeInQmf = timeIn; 282 283 /* Number of QMF timeslots in the overlap buffer: */ 284 int ov_len = hSbrDec->LppTrans.pSettings->overlap; 285 286 /* Number of QMF slots per frame */ 287 int noCols = hHeaderData->numberTimeSlots * hHeaderData->timeStep; 288 289 /* create pointer array for data to use for HBE and legacy sbr */ 290 FIXP_DBL *pLowBandReal[(3 * 4) + 2 * ((1024) / (32) * (4) / 2)]; 291 FIXP_DBL *pLowBandImag[(3 * 4) + 2 * ((1024) / (32) * (4) / 2)]; 292 293 /* set pReal to where QMF analysis writes in case of legacy SBR */ 294 FIXP_DBL **pReal = pLowBandReal + ov_len; 295 FIXP_DBL **pImag = pLowBandImag + ov_len; 296 297 /* map QMF buffer to pointer array (Overlap + Frame)*/ 298 for (i = 0; i < noCols + ov_len; i++) { 299 pLowBandReal[i] = hSbrDec->qmfDomainInCh->hQmfSlotsReal[i]; 300 pLowBandImag[i] = hSbrDec->qmfDomainInCh->hQmfSlotsImag[i]; 301 } 302 303 if ((flags & SBRDEC_USAC_HARMONICSBR)) { 304 /* in case of harmonic SBR and no HBE_LP map additional buffer for 305 one more frame to pointer arry */ 306 for (i = 0; i < noCols; i++) { 307 pLowBandReal[i + noCols + ov_len] = hSbrDec->hQmfHBESlotsReal[i]; 308 pLowBandImag[i + noCols + ov_len] = hSbrDec->hQmfHBESlotsImag[i]; 309 } 310 311 /* shift scale values according to buffer */ 312 hSbrDec->scale_ov = hSbrDec->scale_lb; 313 hSbrDec->scale_lb = hSbrDec->scale_hbe; 314 315 /* set pReal to where QMF analysis writes in case of HBE */ 316 pReal += noCols; 317 pImag += noCols; 318 if (flags & SBRDEC_SKIP_QMF_ANA) { 319 /* stereoCfgIndex3 with HBE */ 320 FDK_QmfDomain_QmfData2HBE(hSbrDec->qmfDomainInCh, 321 hSbrDec->hQmfHBESlotsReal, 322 hSbrDec->hQmfHBESlotsImag); 323 } else { 324 /* We have to move old hbe frame data to lb area of buffer */ 325 for (i = 0; i < noCols; i++) { 326 FDKmemcpy(pLowBandReal[ov_len + i], hSbrDec->hQmfHBESlotsReal[i], 327 hHeaderData->numberOfAnalysisBands * sizeof(FIXP_DBL)); 328 FDKmemcpy(pLowBandImag[ov_len + i], hSbrDec->hQmfHBESlotsImag[i], 329 hHeaderData->numberOfAnalysisBands * sizeof(FIXP_DBL)); 330 } 331 } 332 } 333 334 /* 335 low band codec signal subband filtering 336 */ 337 338 if (flags & SBRDEC_SKIP_QMF_ANA) { 339 if (!(flags & SBRDEC_USAC_HARMONICSBR)) /* stereoCfgIndex3 w/o HBE */ 340 FDK_QmfDomain_WorkBuffer2ProcChannel(hSbrDec->qmfDomainInCh); 341 } else { 342 C_AALLOC_SCRATCH_START(qmfTemp, FIXP_DBL, 2 * (64)); 343 qmfAnalysisFiltering(&hSbrDec->qmfDomainInCh->fb, pReal, pImag, 344 &hSbrDec->qmfDomainInCh->scaling, pTimeInQmf, 0, 1, 345 qmfTemp); 346 347 C_AALLOC_SCRATCH_END(qmfTemp, FIXP_DBL, 2 * (64)); 348 } 349 350 /* 351 Clear upper half of spectrum 352 */ 353 if (!((flags & SBRDEC_USAC_HARMONICSBR) && 354 (hFrameData->sbrPatchingMode == 0))) { 355 int nAnalysisBands = hHeaderData->numberOfAnalysisBands; 356 357 if (!(flags & SBRDEC_LOW_POWER)) { 358 for (slot = ov_len; slot < noCols + ov_len; slot++) { 359 FDKmemclear(&pLowBandReal[slot][nAnalysisBands], 360 ((64) - nAnalysisBands) * sizeof(FIXP_DBL)); 361 FDKmemclear(&pLowBandImag[slot][nAnalysisBands], 362 ((64) - nAnalysisBands) * sizeof(FIXP_DBL)); 363 } 364 } else { 365 for (slot = ov_len; slot < noCols + ov_len; slot++) { 366 FDKmemclear(&pLowBandReal[slot][nAnalysisBands], 367 ((64) - nAnalysisBands) * sizeof(FIXP_DBL)); 368 } 369 } 370 } 371 372 /* 373 Shift spectral data left to gain accuracy in transposer and adjustor 374 */ 375 /* Range was increased from lsb to no_channels because in some cases (e.g. 376 USAC conf eSbr_4_Pvc.mp4 and some HBE cases) it could be observed that the 377 signal between lsb and no_channels is used for the patching process. 378 */ 379 maxVal = maxSubbandSample(pReal, (flags & SBRDEC_LOW_POWER) ? NULL : pImag, 0, 380 hSbrDec->qmfDomainInCh->fb.no_channels, 0, noCols); 381 382 reserve = fixMax(0, CntLeadingZeros(maxVal) - 1); 383 reserve = fixMin(reserve, 384 DFRACT_BITS - 1 - hSbrDec->qmfDomainInCh->scaling.lb_scale); 385 386 /* If all data is zero, lb_scale could become too large */ 387 rescaleSubbandSamples(pReal, (flags & SBRDEC_LOW_POWER) ? NULL : pImag, 0, 388 hSbrDec->qmfDomainInCh->fb.no_channels, 0, noCols, 389 reserve); 390 391 hSbrDec->qmfDomainInCh->scaling.lb_scale += reserve; 392 393 if ((flags & SBRDEC_USAC_HARMONICSBR)) { 394 /* actually this is our hbe_scale */ 395 hSbrDec->scale_hbe = hSbrDec->qmfDomainInCh->scaling.lb_scale; 396 /* the real lb_scale is stored in scale_lb from sbr */ 397 hSbrDec->qmfDomainInCh->scaling.lb_scale = hSbrDec->scale_lb; 398 } 399 /* 400 save low band scale, wavecoding or parametric stereo may modify it 401 */ 402 saveLbScale = hSbrDec->qmfDomainInCh->scaling.lb_scale; 403 404 if (applyProcessing) { 405 UCHAR *borders = hFrameData->frameInfo.borders; 406 lastSlotOffs = borders[hFrameData->frameInfo.nEnvelopes] - 407 hHeaderData->numberTimeSlots; 408 409 FIXP_DBL degreeAlias[(64)]; 410 PVC_DYNAMIC_DATA pvcDynamicData; 411 pvcInitFrame( 412 &hSbrDec->PvcStaticData, &pvcDynamicData, 413 (hHeaderData->frameErrorFlag ? 0 : hHeaderData->bs_info.pvc_mode), 414 hFrameData->ns, hHeaderData->timeStep, 415 hHeaderData->freqBandData.lowSubband, 416 hFrameData->frameInfo.pvcBorders[0], hFrameData->pvcID); 417 418 if (!hHeaderData->frameErrorFlag && (hHeaderData->bs_info.pvc_mode > 0)) { 419 pvcDecodeFrame(&hSbrDec->PvcStaticData, &pvcDynamicData, pLowBandReal, 420 pLowBandImag, ov_len, 421 SCALE2EXP(hSbrDec->qmfDomainInCh->scaling.ov_lb_scale), 422 SCALE2EXP(hSbrDec->qmfDomainInCh->scaling.lb_scale)); 423 } 424 pvcEndFrame(&hSbrDec->PvcStaticData, &pvcDynamicData); 425 426 /* The transposer will override most values in degreeAlias[]. 427 The array needs to be cleared at least from lowSubband to highSubband 428 before. */ 429 if (flags & SBRDEC_LOW_POWER) 430 FDKmemclear(°reeAlias[hHeaderData->freqBandData.lowSubband], 431 (hHeaderData->freqBandData.highSubband - 432 hHeaderData->freqBandData.lowSubband) * 433 sizeof(FIXP_DBL)); 434 435 /* 436 Inverse filtering of lowband and transposition into the SBR-frequency 437 range 438 */ 439 440 { 441 KEEP_STATES_SYNCED_MODE keepStatesSyncedMode = 442 ((flags & SBRDEC_USAC_HARMONICSBR) && 443 (hFrameData->sbrPatchingMode != 0)) 444 ? KEEP_STATES_SYNCED_NORMAL 445 : KEEP_STATES_SYNCED_OFF; 446 447 if (flags & SBRDEC_USAC_HARMONICSBR) { 448 if (flags & SBRDEC_QUAD_RATE) { 449 pReal -= 32; 450 pImag -= 32; 451 } 452 453 if ((hSbrDec->savedStates == 0) && (hFrameData->sbrPatchingMode == 1)) { 454 /* copy saved states from previous frame to legacy SBR lpc filterstate 455 * buffer */ 456 for (i = 0; i < LPC_ORDER + ov_len; i++) { 457 FDKmemcpy( 458 hSbrDec->LppTrans.lpcFilterStatesRealLegSBR[i], 459 hSbrDec->codecQMFBufferReal[noCols - LPC_ORDER - ov_len + i], 460 hSbrDec->hHBE->noChannels * sizeof(FIXP_DBL)); 461 FDKmemcpy( 462 hSbrDec->LppTrans.lpcFilterStatesImagLegSBR[i], 463 hSbrDec->codecQMFBufferImag[noCols - LPC_ORDER - ov_len + i], 464 hSbrDec->hHBE->noChannels * sizeof(FIXP_DBL)); 465 } 466 } 467 468 /* saving unmodified QMF states in case we are switching from legacy SBR 469 * to HBE */ 470 for (i = 0; i < hSbrDec->hHBE->noCols; i++) { 471 FDKmemcpy(hSbrDec->codecQMFBufferReal[i], pLowBandReal[ov_len + i], 472 hSbrDec->hHBE->noChannels * sizeof(FIXP_DBL)); 473 FDKmemcpy(hSbrDec->codecQMFBufferImag[i], pLowBandImag[ov_len + i], 474 hSbrDec->hHBE->noChannels * sizeof(FIXP_DBL)); 475 } 476 477 QmfTransposerApply( 478 hSbrDec->hHBE, pReal, pImag, noCols, pLowBandReal, pLowBandImag, 479 hSbrDec->LppTrans.lpcFilterStatesRealHBE, 480 hSbrDec->LppTrans.lpcFilterStatesImagHBE, 481 hFrameData->sbrPitchInBins, hSbrDec->scale_lb, hSbrDec->scale_hbe, 482 &hSbrDec->qmfDomainInCh->scaling.hb_scale, hHeaderData->timeStep, 483 borders[0], ov_len, keepStatesSyncedMode); 484 485 if (flags & SBRDEC_QUAD_RATE) { 486 int *xOverQmf = GetxOverBandQmfTransposer(hSbrDec->hHBE); 487 488 copyHarmonicSpectrum(xOverQmf, pLowBandReal, pLowBandImag, noCols, 489 ov_len, keepStatesSyncedMode); 490 } 491 } 492 } 493 494 if ((flags & SBRDEC_USAC_HARMONICSBR) && 495 (hFrameData->sbrPatchingMode == 0)) { 496 hSbrDec->prev_frame_lSbr = 0; 497 hSbrDec->prev_frame_hbeSbr = 1; 498 499 lppTransposerHBE( 500 &hSbrDec->LppTrans, hSbrDec->hHBE, &hSbrDec->qmfDomainInCh->scaling, 501 pLowBandReal, pLowBandImag, hHeaderData->timeStep, borders[0], 502 lastSlotOffs, hHeaderData->freqBandData.nInvfBands, 503 hFrameData->sbr_invf_mode, hPrevFrameData->sbr_invf_mode); 504 505 } else { 506 if (flags & SBRDEC_USAC_HARMONICSBR) { 507 for (i = 0; i < LPC_ORDER + hSbrDec->LppTrans.pSettings->overlap; i++) { 508 /* 509 Store the unmodified qmf Slots values for upper part of spectrum 510 (required for LPC filtering) required if next frame is a HBE frame 511 */ 512 FDKmemcpy(hSbrDec->LppTrans.lpcFilterStatesRealHBE[i], 513 hSbrDec->qmfDomainInCh 514 ->hQmfSlotsReal[hSbrDec->hHBE->noCols - LPC_ORDER + i], 515 (64) * sizeof(FIXP_DBL)); 516 FDKmemcpy(hSbrDec->LppTrans.lpcFilterStatesImagHBE[i], 517 hSbrDec->qmfDomainInCh 518 ->hQmfSlotsImag[hSbrDec->hHBE->noCols - LPC_ORDER + i], 519 (64) * sizeof(FIXP_DBL)); 520 } 521 } 522 { 523 hSbrDec->prev_frame_lSbr = 1; 524 hSbrDec->prev_frame_hbeSbr = 0; 525 } 526 527 lppTransposer( 528 &hSbrDec->LppTrans, &hSbrDec->qmfDomainInCh->scaling, pLowBandReal, 529 degreeAlias, // only used if useLP = 1 530 pLowBandImag, flags & SBRDEC_LOW_POWER, 531 hHeaderData->bs_info.sbr_preprocessing, 532 hHeaderData->freqBandData.v_k_master[0], hHeaderData->timeStep, 533 borders[0], lastSlotOffs, hHeaderData->freqBandData.nInvfBands, 534 hFrameData->sbr_invf_mode, hPrevFrameData->sbr_invf_mode); 535 } 536 537 /* 538 Adjust envelope of current frame. 539 */ 540 541 if ((hFrameData->sbrPatchingMode != 542 hSbrDec->SbrCalculateEnvelope.sbrPatchingMode)) { 543 ResetLimiterBands(hHeaderData->freqBandData.limiterBandTable, 544 &hHeaderData->freqBandData.noLimiterBands, 545 hHeaderData->freqBandData.freqBandTable[0], 546 hHeaderData->freqBandData.nSfb[0], 547 hSbrDec->LppTrans.pSettings->patchParam, 548 hSbrDec->LppTrans.pSettings->noOfPatches, 549 hHeaderData->bs_data.limiterBands, 550 hFrameData->sbrPatchingMode, 551 (flags & SBRDEC_USAC_HARMONICSBR) && 552 (hFrameData->sbrPatchingMode == 0) 553 ? GetxOverBandQmfTransposer(hSbrDec->hHBE) 554 : NULL, 555 Get41SbrQmfTransposer(hSbrDec->hHBE)); 556 557 hSbrDec->SbrCalculateEnvelope.sbrPatchingMode = 558 hFrameData->sbrPatchingMode; 559 } 560 561 calculateSbrEnvelope( 562 &hSbrDec->qmfDomainInCh->scaling, &hSbrDec->SbrCalculateEnvelope, 563 hHeaderData, hFrameData, &pvcDynamicData, pLowBandReal, pLowBandImag, 564 flags & SBRDEC_LOW_POWER, 565 566 degreeAlias, flags, 567 (hHeaderData->frameErrorFlag || hPrevFrameData->frameErrorFlag)); 568 569 #if (SBRDEC_MAX_HB_FADE_FRAMES > 0) 570 /* Avoid hard onsets of high band */ 571 if (hHeaderData->frameErrorFlag) { 572 if (hSbrDec->highBandFadeCnt < SBRDEC_MAX_HB_FADE_FRAMES) { 573 hSbrDec->highBandFadeCnt += 1; 574 } 575 } else { 576 if (hSbrDec->highBandFadeCnt > 577 0) { /* Manipulate high band scale factor to get a smooth fade-in */ 578 hSbrDec->qmfDomainInCh->scaling.hb_scale += hSbrDec->highBandFadeCnt; 579 hSbrDec->qmfDomainInCh->scaling.hb_scale = 580 fMin(hSbrDec->qmfDomainInCh->scaling.hb_scale, DFRACT_BITS - 1); 581 hSbrDec->highBandFadeCnt -= 1; 582 } 583 } 584 585 #endif 586 /* 587 Update hPrevFrameData (to be used in the next frame) 588 */ 589 for (i = 0; i < hHeaderData->freqBandData.nInvfBands; i++) { 590 hPrevFrameData->sbr_invf_mode[i] = hFrameData->sbr_invf_mode[i]; 591 } 592 hPrevFrameData->coupling = hFrameData->coupling; 593 hPrevFrameData->stopPos = borders[hFrameData->frameInfo.nEnvelopes]; 594 hPrevFrameData->ampRes = hFrameData->ampResolutionCurrentFrame; 595 hPrevFrameData->prevSbrPitchInBins = hFrameData->sbrPitchInBins; 596 /* could be done in extractFrameInfo_pvc() but hPrevFrameData is not 597 * available there */ 598 FDKmemcpy(&hPrevFrameData->prevFrameInfo, &hFrameData->frameInfo, 599 sizeof(FRAME_INFO)); 600 } else { 601 /* rescale from lsb to nAnalysisBands in order to compensate scaling with 602 * hb_scale in this area, done by synthesisFiltering*/ 603 int rescale; 604 int lsb; 605 int length; 606 607 /* Reset hb_scale if no highband is present, because hb_scale is considered 608 * in the QMF-synthesis */ 609 hSbrDec->qmfDomainInCh->scaling.hb_scale = saveLbScale; 610 611 rescale = hSbrDec->qmfDomainInCh->scaling.hb_scale - 612 hSbrDec->qmfDomainInCh->scaling.ov_lb_scale; 613 lsb = hSbrDec->qmfDomainOutCh->fb.lsb; 614 length = (hSbrDec->qmfDomainInCh->fb.no_channels - lsb); 615 616 if ((rescale < 0) && (length > 0)) { 617 if (!(flags & SBRDEC_LOW_POWER)) { 618 for (i = 0; i < ov_len; i++) { 619 scaleValues(&pLowBandReal[i][lsb], length, rescale); 620 scaleValues(&pLowBandImag[i][lsb], length, rescale); 621 } 622 } else { 623 for (i = 0; i < ov_len; i++) { 624 scaleValues(&pLowBandReal[i][lsb], length, rescale); 625 } 626 } 627 } 628 } 629 630 if (!(flags & SBRDEC_USAC_HARMONICSBR)) { 631 int length = hSbrDec->qmfDomainInCh->fb.lsb; 632 if (flags & SBRDEC_SYNTAX_USAC) { 633 length = hSbrDec->qmfDomainInCh->fb.no_channels; 634 } 635 636 /* in case of legacy sbr saving of filter states here */ 637 for (i = 0; i < LPC_ORDER + ov_len; i++) { 638 /* 639 Store the unmodified qmf Slots values (required for LPC filtering) 640 */ 641 if (!(flags & SBRDEC_LOW_POWER)) { 642 FDKmemcpy(hSbrDec->LppTrans.lpcFilterStatesRealLegSBR[i], 643 pLowBandReal[noCols - LPC_ORDER + i], 644 length * sizeof(FIXP_DBL)); 645 FDKmemcpy(hSbrDec->LppTrans.lpcFilterStatesImagLegSBR[i], 646 pLowBandImag[noCols - LPC_ORDER + i], 647 length * sizeof(FIXP_DBL)); 648 } else 649 FDKmemcpy(hSbrDec->LppTrans.lpcFilterStatesRealLegSBR[i], 650 pLowBandReal[noCols - LPC_ORDER + i], 651 length * sizeof(FIXP_DBL)); 652 } 653 } 654 655 /* 656 Synthesis subband filtering. 657 */ 658 659 if (!(flags & SBRDEC_PS_DECODED)) { 660 if (!(flags & SBRDEC_SKIP_QMF_SYN)) { 661 int outScalefactor = 0; 662 663 if (h_ps_d != NULL) { 664 h_ps_d->procFrameBased = 1; /* we here do frame based processing */ 665 } 666 667 sbrDecoder_drcApply(&hSbrDec->sbrDrcChannel, pLowBandReal, 668 (flags & SBRDEC_LOW_POWER) ? NULL : pLowBandImag, 669 hSbrDec->qmfDomainOutCh->fb.no_col, &outScalefactor); 670 671 qmfChangeOutScalefactor(&hSbrDec->qmfDomainOutCh->fb, outScalefactor); 672 673 { 674 HANDLE_FREQ_BAND_DATA hFreq = &hHeaderData->freqBandData; 675 int save_usb = hSbrDec->qmfDomainOutCh->fb.usb; 676 677 #if (QMF_MAX_SYNTHESIS_BANDS <= 64) 678 C_AALLOC_SCRATCH_START(qmfTemp, FIXP_DBL, 2 * QMF_MAX_SYNTHESIS_BANDS); 679 #else 680 C_AALLOC_STACK_START(qmfTemp, FIXP_DBL, 2 * QMF_MAX_SYNTHESIS_BANDS); 681 #endif 682 if (hSbrDec->qmfDomainOutCh->fb.usb < hFreq->ov_highSubband) { 683 /* we need to patch usb for this frame as overlap may contain higher 684 frequency range if headerchange occured; fb. usb is always limited 685 to maximum fb.no_channels; In case of wrongly decoded headers it 686 might be that ov_highSubband is higher than the number of synthesis 687 channels (fb.no_channels), which is forbidden, therefore we need to 688 limit ov_highSubband with fMin function to avoid not allowed usb in 689 synthesis filterbank. */ 690 hSbrDec->qmfDomainOutCh->fb.usb = 691 fMin((UINT)hFreq->ov_highSubband, 692 (UINT)hSbrDec->qmfDomainOutCh->fb.no_channels); 693 } 694 { 695 qmfSynthesisFiltering( 696 &hSbrDec->qmfDomainOutCh->fb, pLowBandReal, 697 (flags & SBRDEC_LOW_POWER) ? NULL : pLowBandImag, 698 &hSbrDec->qmfDomainInCh->scaling, 699 hSbrDec->LppTrans.pSettings->overlap, timeOut, strideOut, 700 qmfTemp); 701 } 702 /* restore saved value */ 703 hSbrDec->qmfDomainOutCh->fb.usb = save_usb; 704 hFreq->ov_highSubband = save_usb; 705 #if (QMF_MAX_SYNTHESIS_BANDS <= 64) 706 C_AALLOC_SCRATCH_END(qmfTemp, FIXP_DBL, 2 * QMF_MAX_SYNTHESIS_BANDS); 707 #else 708 C_AALLOC_STACK_END(qmfTemp, FIXP_DBL, 2 * QMF_MAX_SYNTHESIS_BANDS); 709 #endif 710 } 711 } 712 713 } else { /* (flags & SBRDEC_PS_DECODED) */ 714 INT sdiff; 715 INT scaleFactorHighBand, scaleFactorLowBand_ov, scaleFactorLowBand_no_ov; 716 717 HANDLE_QMF_FILTER_BANK synQmf = &hSbrDec->qmfDomainOutCh->fb; 718 HANDLE_QMF_FILTER_BANK synQmfRight = &hSbrDecRight->qmfDomainOutCh->fb; 719 720 /* adapt scaling */ 721 sdiff = hSbrDec->qmfDomainInCh->scaling.lb_scale - 722 reserve; /* Scaling difference */ 723 scaleFactorHighBand = sdiff - hSbrDec->qmfDomainInCh->scaling.hb_scale; 724 scaleFactorLowBand_ov = sdiff - hSbrDec->qmfDomainInCh->scaling.ov_lb_scale; 725 scaleFactorLowBand_no_ov = sdiff - hSbrDec->qmfDomainInCh->scaling.lb_scale; 726 727 /* Scale of low band overlapping QMF data */ 728 scaleFactorLowBand_ov = 729 fMin(DFRACT_BITS - 1, fMax(-(DFRACT_BITS - 1), scaleFactorLowBand_ov)); 730 /* Scale of low band current QMF data */ 731 scaleFactorLowBand_no_ov = fMin( 732 DFRACT_BITS - 1, fMax(-(DFRACT_BITS - 1), scaleFactorLowBand_no_ov)); 733 /* Scale of current high band */ 734 scaleFactorHighBand = 735 fMin(DFRACT_BITS - 1, fMax(-(DFRACT_BITS - 1), scaleFactorHighBand)); 736 737 if (h_ps_d->procFrameBased == 1) /* If we have switched from frame to slot 738 based processing copy filter states */ 739 { /* procFrameBased will be unset later */ 740 /* copy filter states from left to right */ 741 /* was ((640)-(64))*sizeof(FIXP_QSS) 742 flexible amount of synthesis bands needed for QMF based resampling 743 */ 744 FDK_ASSERT(hSbrDec->qmfDomainInCh->pGlobalConf->nBandsSynthesis <= 745 QMF_MAX_SYNTHESIS_BANDS); 746 FDKmemcpy(synQmfRight->FilterStates, synQmf->FilterStates, 747 9 * hSbrDec->qmfDomainInCh->pGlobalConf->nBandsSynthesis * 748 sizeof(FIXP_QSS)); 749 } 750 751 /* Feed delaylines when parametric stereo is switched on. */ 752 PreparePsProcessing(h_ps_d, pLowBandReal, pLowBandImag, 753 scaleFactorLowBand_ov); 754 755 /* use the same synthese qmf values for left and right channel */ 756 synQmfRight->no_col = synQmf->no_col; 757 synQmfRight->lsb = synQmf->lsb; 758 synQmfRight->usb = synQmf->usb; 759 760 int env = 0; 761 762 { 763 #if (QMF_MAX_SYNTHESIS_BANDS <= 64) 764 C_AALLOC_SCRATCH_START(pWorkBuffer, FIXP_DBL, 765 2 * QMF_MAX_SYNTHESIS_BANDS); 766 #else 767 C_AALLOC_STACK_START(pWorkBuffer, FIXP_DBL, 2 * QMF_MAX_SYNTHESIS_BANDS); 768 #endif 769 770 int maxShift = 0; 771 772 if (hSbrDec->sbrDrcChannel.enable != 0) { 773 if (hSbrDec->sbrDrcChannel.prevFact_exp > maxShift) { 774 maxShift = hSbrDec->sbrDrcChannel.prevFact_exp; 775 } 776 if (hSbrDec->sbrDrcChannel.currFact_exp > maxShift) { 777 maxShift = hSbrDec->sbrDrcChannel.currFact_exp; 778 } 779 if (hSbrDec->sbrDrcChannel.nextFact_exp > maxShift) { 780 maxShift = hSbrDec->sbrDrcChannel.nextFact_exp; 781 } 782 } 783 784 /* copy DRC data to right channel (with PS both channels use the same DRC 785 * gains) */ 786 FDKmemcpy(&hSbrDecRight->sbrDrcChannel, &hSbrDec->sbrDrcChannel, 787 sizeof(SBRDEC_DRC_CHANNEL)); 788 789 for (i = 0; i < synQmf->no_col; i++) { /* ----- no_col loop ----- */ 790 791 INT outScalefactorR, outScalefactorL; 792 793 /* qmf timeslot of right channel */ 794 FIXP_DBL *rQmfReal = pWorkBuffer; 795 FIXP_DBL *rQmfImag = pWorkBuffer + synQmf->no_channels; 796 797 { 798 if (i == 799 h_ps_d->bsData[h_ps_d->processSlot].mpeg.aEnvStartStop[env]) { 800 initSlotBasedRotation(h_ps_d, env, 801 hHeaderData->freqBandData.highSubband); 802 env++; 803 } 804 805 ApplyPsSlot( 806 h_ps_d, /* parametric stereo decoder handle */ 807 (pLowBandReal + i), /* one timeslot of left/mono channel */ 808 (pLowBandImag + i), /* one timeslot of left/mono channel */ 809 rQmfReal, /* one timeslot or right channel */ 810 rQmfImag, /* one timeslot or right channel */ 811 scaleFactorLowBand_no_ov, 812 (i < hSbrDec->LppTrans.pSettings->overlap) 813 ? scaleFactorLowBand_ov 814 : scaleFactorLowBand_no_ov, 815 scaleFactorHighBand, synQmf->lsb, synQmf->usb); 816 817 outScalefactorL = outScalefactorR = 1; /* psDiffScale! (MPEG-PS) */ 818 } 819 820 sbrDecoder_drcApplySlot(/* right channel */ 821 &hSbrDecRight->sbrDrcChannel, rQmfReal, 822 rQmfImag, i, synQmfRight->no_col, maxShift); 823 824 outScalefactorR += maxShift; 825 826 sbrDecoder_drcApplySlot(/* left channel */ 827 &hSbrDec->sbrDrcChannel, *(pLowBandReal + i), 828 *(pLowBandImag + i), i, synQmf->no_col, 829 maxShift); 830 831 outScalefactorL += maxShift; 832 833 if (!(flags & SBRDEC_SKIP_QMF_SYN)) { 834 qmfSynthesisFilteringSlot( 835 synQmfRight, rQmfReal, /* QMF real buffer */ 836 rQmfImag, /* QMF imag buffer */ 837 outScalefactorL, outScalefactorL, 838 timeOutRight + (i * synQmf->no_channels * strideOut), strideOut, 839 pWorkBuffer); 840 841 qmfSynthesisFilteringSlot( 842 synQmf, *(pLowBandReal + i), /* QMF real buffer */ 843 *(pLowBandImag + i), /* QMF imag buffer */ 844 outScalefactorR, outScalefactorR, 845 timeOut + (i * synQmf->no_channels * strideOut), strideOut, 846 pWorkBuffer); 847 } 848 } /* no_col loop i */ 849 #if (QMF_MAX_SYNTHESIS_BANDS <= 64) 850 C_AALLOC_SCRATCH_END(pWorkBuffer, FIXP_DBL, 2 * QMF_MAX_SYNTHESIS_BANDS); 851 #else 852 C_AALLOC_STACK_END(pWorkBuffer, FIXP_DBL, 2 * QMF_MAX_SYNTHESIS_BANDS); 853 #endif 854 } 855 } 856 857 sbrDecoder_drcUpdateChannel(&hSbrDec->sbrDrcChannel); 858 859 /* 860 Update overlap buffer 861 Even bands above usb are copied to avoid outdated spectral data in case 862 the stop frequency raises. 863 */ 864 865 if (!(flags & SBRDEC_SKIP_QMF_SYN)) { 866 { 867 FDK_QmfDomain_SaveOverlap(hSbrDec->qmfDomainInCh, 0); 868 FDK_ASSERT(hSbrDec->qmfDomainInCh->scaling.ov_lb_scale == saveLbScale); 869 } 870 } 871 872 hSbrDec->savedStates = 0; 873 874 /* Save current frame status */ 875 hPrevFrameData->frameErrorFlag = hHeaderData->frameErrorFlag; 876 hSbrDec->applySbrProc_old = applyProcessing; 877 878 } /* sbr_dec() */ 879 880 /*! 881 \brief Creates sbr decoder structure 882 \return errorCode, 0 if successful 883 */ 884 SBR_ERROR 885 createSbrDec(SBR_CHANNEL *hSbrChannel, 886 HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ 887 TRANSPOSER_SETTINGS *pSettings, 888 const int downsampleFac, /*!< Downsampling factor */ 889 const UINT qmfFlags, /*!< flags -> 1: HQ/LP selector, 2: CLDFB */ 890 const UINT flags, const int overlap, 891 int chan, /*!< Channel for which to assign buffers etc. */ 892 int codecFrameSize) 893 894 { 895 SBR_ERROR err = SBRDEC_OK; 896 int timeSlots = 897 hHeaderData->numberTimeSlots; /* Number of SBR slots per frame */ 898 int noCols = 899 timeSlots * hHeaderData->timeStep; /* Number of QMF slots per frame */ 900 HANDLE_SBR_DEC hs = &(hSbrChannel->SbrDec); 901 902 #if (SBRDEC_MAX_HB_FADE_FRAMES > 0) 903 hs->highBandFadeCnt = SBRDEC_MAX_HB_FADE_FRAMES; 904 905 #endif 906 hs->scale_hbe = 15; 907 hs->scale_lb = 15; 908 hs->scale_ov = 15; 909 910 hs->prev_frame_lSbr = 0; 911 hs->prev_frame_hbeSbr = 0; 912 913 hs->codecFrameSize = codecFrameSize; 914 915 /* 916 create envelope calculator 917 */ 918 err = createSbrEnvelopeCalc(&hs->SbrCalculateEnvelope, hHeaderData, chan, 919 flags); 920 if (err != SBRDEC_OK) { 921 return err; 922 } 923 924 initSbrPrevFrameData(&hSbrChannel->prevFrameData, timeSlots); 925 926 /* 927 create transposer 928 */ 929 err = createLppTransposer( 930 &hs->LppTrans, pSettings, hHeaderData->freqBandData.lowSubband, 931 hHeaderData->freqBandData.v_k_master, hHeaderData->freqBandData.numMaster, 932 hHeaderData->freqBandData.highSubband, timeSlots, noCols, 933 hHeaderData->freqBandData.freqBandTableNoise, 934 hHeaderData->freqBandData.nNfb, hHeaderData->sbrProcSmplRate, chan, 935 overlap); 936 if (err != SBRDEC_OK) { 937 return err; 938 } 939 940 if (flags & SBRDEC_USAC_HARMONICSBR) { 941 int noChannels, bSbr41 = flags & SBRDEC_QUAD_RATE ? 1 : 0; 942 943 noChannels = 944 QMF_SYNTH_CHANNELS / 945 ((bSbr41 + 1) * 2); /* 32 for (32:64 and 24:64) and 16 for 16:64 */ 946 947 /* shared memory between hbeLightTimeDelayBuffer and hQmfHBESlotsReal if 948 * SBRDEC_HBE_ENABLE */ 949 hSbrChannel->SbrDec.tmp_memory = (FIXP_DBL **)fdkCallocMatrix2D_aligned( 950 noCols, noChannels, sizeof(FIXP_DBL)); 951 if (hSbrChannel->SbrDec.tmp_memory == NULL) { 952 return SBRDEC_MEM_ALLOC_FAILED; 953 } 954 955 hSbrChannel->SbrDec.hQmfHBESlotsReal = hSbrChannel->SbrDec.tmp_memory; 956 hSbrChannel->SbrDec.hQmfHBESlotsImag = 957 (FIXP_DBL **)fdkCallocMatrix2D_aligned(noCols, noChannels, 958 sizeof(FIXP_DBL)); 959 if (hSbrChannel->SbrDec.hQmfHBESlotsImag == NULL) { 960 return SBRDEC_MEM_ALLOC_FAILED; 961 } 962 963 /* buffers containing unmodified qmf data; required when switching from 964 * legacy SBR to HBE */ 965 /* buffer can be used as LPCFilterstates buffer because legacy SBR needs 966 * exactly these values for LPC filtering */ 967 hSbrChannel->SbrDec.codecQMFBufferReal = 968 (FIXP_DBL **)fdkCallocMatrix2D_aligned(noCols, noChannels, 969 sizeof(FIXP_DBL)); 970 if (hSbrChannel->SbrDec.codecQMFBufferReal == NULL) { 971 return SBRDEC_MEM_ALLOC_FAILED; 972 } 973 974 hSbrChannel->SbrDec.codecQMFBufferImag = 975 (FIXP_DBL **)fdkCallocMatrix2D_aligned(noCols, noChannels, 976 sizeof(FIXP_DBL)); 977 if (hSbrChannel->SbrDec.codecQMFBufferImag == NULL) { 978 return SBRDEC_MEM_ALLOC_FAILED; 979 } 980 981 err = QmfTransposerCreate(&hs->hHBE, codecFrameSize, 0, bSbr41); 982 if (err != SBRDEC_OK) { 983 return err; 984 } 985 } 986 987 return err; 988 } 989 990 /*! 991 \brief Delete sbr decoder structure 992 \return errorCode, 0 if successful 993 */ 994 int deleteSbrDec(SBR_CHANNEL *hSbrChannel) { 995 HANDLE_SBR_DEC hs = &hSbrChannel->SbrDec; 996 997 deleteSbrEnvelopeCalc(&hs->SbrCalculateEnvelope); 998 999 if (hs->tmp_memory != NULL) { 1000 FDK_FREE_MEMORY_2D_ALIGNED(hs->tmp_memory); 1001 } 1002 1003 /* modify here */ 1004 FDK_FREE_MEMORY_2D_ALIGNED(hs->hQmfHBESlotsImag); 1005 1006 if (hs->hHBE != NULL) QmfTransposerClose(hs->hHBE); 1007 1008 if (hs->codecQMFBufferReal != NULL) { 1009 FDK_FREE_MEMORY_2D_ALIGNED(hs->codecQMFBufferReal); 1010 } 1011 1012 if (hs->codecQMFBufferImag != NULL) { 1013 FDK_FREE_MEMORY_2D_ALIGNED(hs->codecQMFBufferImag); 1014 } 1015 1016 return 0; 1017 } 1018 1019 /*! 1020 \brief resets sbr decoder structure 1021 \return errorCode, 0 if successful 1022 */ 1023 SBR_ERROR 1024 resetSbrDec(HANDLE_SBR_DEC hSbrDec, HANDLE_SBR_HEADER_DATA hHeaderData, 1025 HANDLE_SBR_PREV_FRAME_DATA hPrevFrameData, const int downsampleFac, 1026 const UINT flags, HANDLE_SBR_FRAME_DATA hFrameData) { 1027 SBR_ERROR sbrError = SBRDEC_OK; 1028 int i; 1029 FIXP_DBL *pLowBandReal[128]; 1030 FIXP_DBL *pLowBandImag[128]; 1031 int useLP = flags & SBRDEC_LOW_POWER; 1032 1033 int old_lsb = hSbrDec->qmfDomainInCh->fb.lsb; 1034 int old_usb = hSbrDec->qmfDomainInCh->fb.usb; 1035 int new_lsb = hHeaderData->freqBandData.lowSubband; 1036 /* int new_usb = hHeaderData->freqBandData.highSubband; */ 1037 int l, startBand, stopBand, startSlot, size; 1038 1039 FIXP_DBL **OverlapBufferReal = hSbrDec->qmfDomainInCh->hQmfSlotsReal; 1040 FIXP_DBL **OverlapBufferImag = hSbrDec->qmfDomainInCh->hQmfSlotsImag; 1041 1042 /* in case the previous frame was not active in terms of SBR processing, the 1043 full band from 0 to no_channels was rescaled and not overwritten. Thats why 1044 the scaling factor lb_scale can be seen as assigned to all bands from 0 to 1045 no_channels in the previous frame. The same states for the current frame if 1046 the current frame is not active in terms of SBR processing 1047 */ 1048 int applySbrProc = (hHeaderData->syncState == SBR_ACTIVE || 1049 (hHeaderData->frameErrorFlag == 0 && 1050 hHeaderData->syncState == SBR_HEADER)); 1051 int applySbrProc_old = hSbrDec->applySbrProc_old; 1052 1053 if (!applySbrProc) { 1054 new_lsb = (hSbrDec->qmfDomainInCh->fb).no_channels; 1055 } 1056 if (!applySbrProc_old) { 1057 old_lsb = (hSbrDec->qmfDomainInCh->fb).no_channels; 1058 old_usb = old_lsb; 1059 } 1060 1061 resetSbrEnvelopeCalc(&hSbrDec->SbrCalculateEnvelope); 1062 1063 /* Change lsb and usb */ 1064 /* Synthesis */ 1065 FDK_ASSERT(hSbrDec->qmfDomainOutCh != NULL); 1066 hSbrDec->qmfDomainOutCh->fb.lsb = 1067 fixMin((INT)hSbrDec->qmfDomainOutCh->fb.no_channels, 1068 (INT)hHeaderData->freqBandData.lowSubband); 1069 hSbrDec->qmfDomainOutCh->fb.usb = 1070 fixMin((INT)hSbrDec->qmfDomainOutCh->fb.no_channels, 1071 (INT)hHeaderData->freqBandData.highSubband); 1072 /* Analysis */ 1073 FDK_ASSERT(hSbrDec->qmfDomainInCh != NULL); 1074 hSbrDec->qmfDomainInCh->fb.lsb = hSbrDec->qmfDomainOutCh->fb.lsb; 1075 hSbrDec->qmfDomainInCh->fb.usb = hSbrDec->qmfDomainOutCh->fb.usb; 1076 1077 /* 1078 The following initialization of spectral data in the overlap buffer 1079 is required for dynamic x-over or a change of the start-freq for 2 reasons: 1080 1081 1. If the lowband gets _wider_, unadjusted data would remain 1082 1083 2. If the lowband becomes _smaller_, the highest bands of the old lowband 1084 must be cleared because the whitening would be affected 1085 */ 1086 startBand = old_lsb; 1087 stopBand = new_lsb; 1088 startSlot = fMax(0, hHeaderData->timeStep * (hPrevFrameData->stopPos - 1089 hHeaderData->numberTimeSlots)); 1090 size = fMax(0, stopBand - startBand); 1091 1092 /* in case of USAC we don't want to zero out the memory, as this can lead to 1093 holes in the spectrum; fix shall only be applied for USAC not for MPEG-4 1094 SBR, in this case setting zero remains */ 1095 if (!(flags & SBRDEC_SYNTAX_USAC)) { 1096 /* keep already adjusted data in the x-over-area */ 1097 if (!useLP) { 1098 for (l = startSlot; l < hSbrDec->LppTrans.pSettings->overlap; l++) { 1099 FDKmemclear(&OverlapBufferReal[l][startBand], size * sizeof(FIXP_DBL)); 1100 FDKmemclear(&OverlapBufferImag[l][startBand], size * sizeof(FIXP_DBL)); 1101 } 1102 } else { 1103 for (l = startSlot; l < hSbrDec->LppTrans.pSettings->overlap; l++) { 1104 FDKmemclear(&OverlapBufferReal[l][startBand], size * sizeof(FIXP_DBL)); 1105 } 1106 } 1107 1108 /* 1109 reset LPC filter states 1110 */ 1111 startBand = fixMin(old_lsb, new_lsb); 1112 stopBand = fixMax(old_lsb, new_lsb); 1113 size = fixMax(0, stopBand - startBand); 1114 1115 FDKmemclear(&hSbrDec->LppTrans.lpcFilterStatesRealLegSBR[0][startBand], 1116 size * sizeof(FIXP_DBL)); 1117 FDKmemclear(&hSbrDec->LppTrans.lpcFilterStatesRealLegSBR[1][startBand], 1118 size * sizeof(FIXP_DBL)); 1119 if (!useLP) { 1120 FDKmemclear(&hSbrDec->LppTrans.lpcFilterStatesImagLegSBR[0][startBand], 1121 size * sizeof(FIXP_DBL)); 1122 FDKmemclear(&hSbrDec->LppTrans.lpcFilterStatesImagLegSBR[1][startBand], 1123 size * sizeof(FIXP_DBL)); 1124 } 1125 } 1126 1127 if (startSlot != 0) { 1128 int source_exp, target_exp, delta_exp, target_lsb, target_usb, reserve; 1129 FIXP_DBL maxVal; 1130 1131 /* 1132 Rescale already processed spectral data between old and new x-over 1133 frequency. This must be done because of the separate scalefactors for 1134 lowband and highband. 1135 */ 1136 1137 /* We have four relevant transitions to cover: 1138 1. old_usb is lower than new_lsb; old SBR area is completely below new SBR 1139 area. 1140 -> entire old area was highband and belongs to lowband now 1141 and has to be rescaled. 1142 2. old_lsb is higher than new_usb; new SBR area is completely below old SBR 1143 area. 1144 -> old area between new_lsb and old_lsb was lowband and belongs to 1145 highband now and has to be rescaled to match new highband scale. 1146 3. old_lsb is lower and old_usb is higher than new_lsb; old and new SBR 1147 areas overlap. 1148 -> old area between old_lsb and new_lsb was highband and belongs to 1149 lowband now and has to be rescaled to match new lowband scale. 1150 4. new_lsb is lower and new_usb_is higher than old_lsb; old and new SBR 1151 areas overlap. 1152 -> old area between new_lsb and old_usb was lowband and belongs to 1153 highband now and has to be rescaled to match new highband scale. 1154 */ 1155 1156 if (new_lsb > old_lsb) { 1157 /* case 1 and 3 */ 1158 source_exp = SCALE2EXP(hSbrDec->qmfDomainInCh->scaling.ov_hb_scale); 1159 target_exp = SCALE2EXP(hSbrDec->qmfDomainInCh->scaling.ov_lb_scale); 1160 1161 startBand = old_lsb; 1162 1163 if (new_lsb >= old_usb) { 1164 /* case 1 */ 1165 stopBand = old_usb; 1166 } else { 1167 /* case 3 */ 1168 stopBand = new_lsb; 1169 } 1170 1171 target_lsb = 0; 1172 target_usb = old_lsb; 1173 } else { 1174 /* case 2 and 4 */ 1175 source_exp = SCALE2EXP(hSbrDec->qmfDomainInCh->scaling.ov_lb_scale); 1176 target_exp = SCALE2EXP(hSbrDec->qmfDomainInCh->scaling.ov_hb_scale); 1177 1178 startBand = new_lsb; 1179 stopBand = old_lsb; 1180 1181 target_lsb = old_lsb; 1182 target_usb = old_usb; 1183 } 1184 1185 maxVal = 1186 maxSubbandSample(OverlapBufferReal, (useLP) ? NULL : OverlapBufferImag, 1187 startBand, stopBand, 0, startSlot); 1188 1189 reserve = ((LONG)maxVal != 0 ? CntLeadingZeros(maxVal) - 1 : 0); 1190 reserve = fixMin( 1191 reserve, 1192 DFRACT_BITS - 1 - 1193 EXP2SCALE( 1194 source_exp)); /* what is this line for, why do we need it? */ 1195 1196 /* process only if x-over-area is not dominant after rescale; 1197 otherwise I'm not sure if all buffers are scaled correctly; 1198 */ 1199 if (target_exp - (source_exp - reserve) >= 0) { 1200 rescaleSubbandSamples(OverlapBufferReal, 1201 (useLP) ? NULL : OverlapBufferImag, startBand, 1202 stopBand, 0, startSlot, reserve); 1203 source_exp -= reserve; 1204 } 1205 1206 delta_exp = target_exp - source_exp; 1207 1208 if (delta_exp < 0) { /* x-over-area is dominant */ 1209 startBand = target_lsb; 1210 stopBand = target_usb; 1211 delta_exp = -delta_exp; 1212 1213 if (new_lsb > old_lsb) { 1214 /* The lowband has to be rescaled */ 1215 hSbrDec->qmfDomainInCh->scaling.ov_lb_scale = EXP2SCALE(source_exp); 1216 } else { 1217 /* The highband has to be rescaled */ 1218 hSbrDec->qmfDomainInCh->scaling.ov_hb_scale = EXP2SCALE(source_exp); 1219 } 1220 } 1221 1222 FDK_ASSERT(startBand <= stopBand); 1223 1224 if (!useLP) { 1225 for (l = 0; l < startSlot; l++) { 1226 scaleValues(OverlapBufferReal[l] + startBand, stopBand - startBand, 1227 -delta_exp); 1228 scaleValues(OverlapBufferImag[l] + startBand, stopBand - startBand, 1229 -delta_exp); 1230 } 1231 } else 1232 for (l = 0; l < startSlot; l++) { 1233 scaleValues(OverlapBufferReal[l] + startBand, stopBand - startBand, 1234 -delta_exp); 1235 } 1236 } /* startSlot != 0 */ 1237 1238 /* 1239 Initialize transposer and limiter 1240 */ 1241 sbrError = resetLppTransposer( 1242 &hSbrDec->LppTrans, hHeaderData->freqBandData.lowSubband, 1243 hHeaderData->freqBandData.v_k_master, hHeaderData->freqBandData.numMaster, 1244 hHeaderData->freqBandData.freqBandTableNoise, 1245 hHeaderData->freqBandData.nNfb, hHeaderData->freqBandData.highSubband, 1246 hHeaderData->sbrProcSmplRate); 1247 if (sbrError != SBRDEC_OK) return sbrError; 1248 1249 hSbrDec->savedStates = 0; 1250 1251 if ((flags & SBRDEC_USAC_HARMONICSBR) && applySbrProc) { 1252 sbrError = QmfTransposerReInit(hSbrDec->hHBE, 1253 hHeaderData->freqBandData.freqBandTable, 1254 hHeaderData->freqBandData.nSfb); 1255 if (sbrError != SBRDEC_OK) return sbrError; 1256 1257 /* copy saved states from previous frame to legacy SBR lpc filterstate 1258 * buffer */ 1259 for (i = 0; i < LPC_ORDER + hSbrDec->LppTrans.pSettings->overlap; i++) { 1260 FDKmemcpy( 1261 hSbrDec->LppTrans.lpcFilterStatesRealLegSBR[i], 1262 hSbrDec->codecQMFBufferReal[hSbrDec->hHBE->noCols - LPC_ORDER - 1263 hSbrDec->LppTrans.pSettings->overlap + i], 1264 hSbrDec->hHBE->noChannels * sizeof(FIXP_DBL)); 1265 FDKmemcpy( 1266 hSbrDec->LppTrans.lpcFilterStatesImagLegSBR[i], 1267 hSbrDec->codecQMFBufferImag[hSbrDec->hHBE->noCols - LPC_ORDER - 1268 hSbrDec->LppTrans.pSettings->overlap + i], 1269 hSbrDec->hHBE->noChannels * sizeof(FIXP_DBL)); 1270 } 1271 hSbrDec->savedStates = 1; 1272 1273 { 1274 /* map QMF buffer to pointer array (Overlap + Frame)*/ 1275 for (i = 0; i < hSbrDec->LppTrans.pSettings->overlap + LPC_ORDER; i++) { 1276 pLowBandReal[i] = hSbrDec->LppTrans.lpcFilterStatesRealHBE[i]; 1277 pLowBandImag[i] = hSbrDec->LppTrans.lpcFilterStatesImagHBE[i]; 1278 } 1279 1280 /* map QMF buffer to pointer array (Overlap + Frame)*/ 1281 for (i = 0; i < hSbrDec->hHBE->noCols; i++) { 1282 pLowBandReal[i + hSbrDec->LppTrans.pSettings->overlap + LPC_ORDER] = 1283 hSbrDec->codecQMFBufferReal[i]; 1284 pLowBandImag[i + hSbrDec->LppTrans.pSettings->overlap + LPC_ORDER] = 1285 hSbrDec->codecQMFBufferImag[i]; 1286 } 1287 1288 if (flags & SBRDEC_QUAD_RATE) { 1289 if (hFrameData->sbrPatchingMode == 0) { 1290 int *xOverQmf = GetxOverBandQmfTransposer(hSbrDec->hHBE); 1291 1292 /* in case of harmonic SBR and no HBE_LP map additional buffer for 1293 one more frame to pointer arry */ 1294 for (i = 0; i < hSbrDec->hHBE->noCols / 2; i++) { 1295 pLowBandReal[i + hSbrDec->hHBE->noCols + 1296 hSbrDec->LppTrans.pSettings->overlap + LPC_ORDER] = 1297 hSbrDec->hQmfHBESlotsReal[i]; 1298 pLowBandImag[i + hSbrDec->hHBE->noCols + 1299 hSbrDec->LppTrans.pSettings->overlap + LPC_ORDER] = 1300 hSbrDec->hQmfHBESlotsImag[i]; 1301 } 1302 1303 QmfTransposerApply( 1304 hSbrDec->hHBE, 1305 pLowBandReal + hSbrDec->LppTrans.pSettings->overlap + 1306 hSbrDec->hHBE->noCols / 2 + LPC_ORDER, 1307 pLowBandImag + hSbrDec->LppTrans.pSettings->overlap + 1308 hSbrDec->hHBE->noCols / 2 + LPC_ORDER, 1309 hSbrDec->hHBE->noCols, pLowBandReal, pLowBandImag, 1310 hSbrDec->LppTrans.lpcFilterStatesRealHBE, 1311 hSbrDec->LppTrans.lpcFilterStatesImagHBE, 1312 hPrevFrameData->prevSbrPitchInBins, hSbrDec->scale_lb, 1313 hSbrDec->scale_hbe, &hSbrDec->qmfDomainInCh->scaling.hb_scale, 1314 hHeaderData->timeStep, hFrameData->frameInfo.borders[0], 1315 hSbrDec->LppTrans.pSettings->overlap, KEEP_STATES_SYNCED_OUTDIFF); 1316 1317 copyHarmonicSpectrum( 1318 xOverQmf, pLowBandReal, pLowBandImag, hSbrDec->hHBE->noCols, 1319 hSbrDec->LppTrans.pSettings->overlap, KEEP_STATES_SYNCED_OUTDIFF); 1320 } 1321 } else { 1322 /* in case of harmonic SBR and no HBE_LP map additional buffer for 1323 one more frame to pointer arry */ 1324 for (i = 0; i < hSbrDec->hHBE->noCols; i++) { 1325 pLowBandReal[i + hSbrDec->hHBE->noCols + 1326 hSbrDec->LppTrans.pSettings->overlap + LPC_ORDER] = 1327 hSbrDec->hQmfHBESlotsReal[i]; 1328 pLowBandImag[i + hSbrDec->hHBE->noCols + 1329 hSbrDec->LppTrans.pSettings->overlap + LPC_ORDER] = 1330 hSbrDec->hQmfHBESlotsImag[i]; 1331 } 1332 1333 if (hFrameData->sbrPatchingMode == 0) { 1334 QmfTransposerApply( 1335 hSbrDec->hHBE, 1336 pLowBandReal + hSbrDec->LppTrans.pSettings->overlap + LPC_ORDER, 1337 pLowBandImag + hSbrDec->LppTrans.pSettings->overlap + LPC_ORDER, 1338 hSbrDec->hHBE->noCols, pLowBandReal, pLowBandImag, 1339 hSbrDec->LppTrans.lpcFilterStatesRealHBE, 1340 hSbrDec->LppTrans.lpcFilterStatesImagHBE, 1341 0 /* not required for keeping states updated in this frame*/, 1342 hSbrDec->scale_lb, hSbrDec->scale_lb, 1343 &hSbrDec->qmfDomainInCh->scaling.hb_scale, hHeaderData->timeStep, 1344 hFrameData->frameInfo.borders[0], 1345 hSbrDec->LppTrans.pSettings->overlap, KEEP_STATES_SYNCED_NOOUT); 1346 } 1347 1348 QmfTransposerApply( 1349 hSbrDec->hHBE, 1350 pLowBandReal + hSbrDec->LppTrans.pSettings->overlap + 1351 hSbrDec->hHBE->noCols + LPC_ORDER, 1352 pLowBandImag + hSbrDec->LppTrans.pSettings->overlap + 1353 hSbrDec->hHBE->noCols + LPC_ORDER, 1354 hSbrDec->hHBE->noCols, pLowBandReal, pLowBandImag, 1355 hSbrDec->LppTrans.lpcFilterStatesRealHBE, 1356 hSbrDec->LppTrans.lpcFilterStatesImagHBE, 1357 hPrevFrameData->prevSbrPitchInBins, hSbrDec->scale_lb, 1358 hSbrDec->scale_hbe, &hSbrDec->qmfDomainInCh->scaling.hb_scale, 1359 hHeaderData->timeStep, hFrameData->frameInfo.borders[0], 1360 hSbrDec->LppTrans.pSettings->overlap, KEEP_STATES_SYNCED_OUTDIFF); 1361 } 1362 1363 if (hFrameData->sbrPatchingMode == 0) { 1364 for (i = startSlot; i < hSbrDec->LppTrans.pSettings->overlap; i++) { 1365 /* 1366 Store the unmodified qmf Slots values for upper part of spectrum 1367 (required for LPC filtering) required if next frame is a HBE frame 1368 */ 1369 FDKmemcpy(hSbrDec->qmfDomainInCh->hQmfSlotsReal[i], 1370 hSbrDec->LppTrans.lpcFilterStatesRealHBE[i + LPC_ORDER], 1371 (64) * sizeof(FIXP_DBL)); 1372 FDKmemcpy(hSbrDec->qmfDomainInCh->hQmfSlotsImag[i], 1373 hSbrDec->LppTrans.lpcFilterStatesImagHBE[i + LPC_ORDER], 1374 (64) * sizeof(FIXP_DBL)); 1375 } 1376 1377 for (i = startSlot; i < hSbrDec->LppTrans.pSettings->overlap; i++) { 1378 /* 1379 Store the unmodified qmf Slots values for upper part of spectrum 1380 (required for LPC filtering) required if next frame is a HBE frame 1381 */ 1382 FDKmemcpy( 1383 hSbrDec->qmfDomainInCh->hQmfSlotsReal[i], 1384 hSbrDec->codecQMFBufferReal[hSbrDec->hHBE->noCols - 1385 hSbrDec->LppTrans.pSettings->overlap + 1386 i], 1387 new_lsb * sizeof(FIXP_DBL)); 1388 FDKmemcpy( 1389 hSbrDec->qmfDomainInCh->hQmfSlotsImag[i], 1390 hSbrDec->codecQMFBufferImag[hSbrDec->hHBE->noCols - 1391 hSbrDec->LppTrans.pSettings->overlap + 1392 i], 1393 new_lsb * sizeof(FIXP_DBL)); 1394 } 1395 } 1396 } 1397 } 1398 1399 { 1400 int adapt_lb = 0, diff = 0, 1401 new_scale = hSbrDec->qmfDomainInCh->scaling.ov_lb_scale; 1402 1403 if ((hSbrDec->qmfDomainInCh->scaling.ov_lb_scale != 1404 hSbrDec->qmfDomainInCh->scaling.lb_scale) && 1405 startSlot != 0) { 1406 /* we need to adapt spectrum to have equal scale factor, always larger 1407 * than zero */ 1408 diff = SCALE2EXP(hSbrDec->qmfDomainInCh->scaling.ov_lb_scale) - 1409 SCALE2EXP(hSbrDec->qmfDomainInCh->scaling.lb_scale); 1410 1411 if (diff > 0) { 1412 adapt_lb = 1; 1413 diff = -diff; 1414 new_scale = hSbrDec->qmfDomainInCh->scaling.ov_lb_scale; 1415 } 1416 1417 stopBand = new_lsb; 1418 } 1419 1420 if (hFrameData->sbrPatchingMode == 1) { 1421 /* scale states from LegSBR filterstates buffer */ 1422 for (i = 0; i < hSbrDec->LppTrans.pSettings->overlap + LPC_ORDER; i++) { 1423 scaleValues(hSbrDec->LppTrans.lpcFilterStatesRealLegSBR[i], new_lsb, 1424 diff); 1425 if (!useLP) { 1426 scaleValues(hSbrDec->LppTrans.lpcFilterStatesImagLegSBR[i], new_lsb, 1427 diff); 1428 } 1429 } 1430 1431 if (flags & SBRDEC_SYNTAX_USAC) { 1432 /* get missing states between old and new x_over from LegSBR 1433 * filterstates buffer */ 1434 /* in case of legacy SBR we leave these values zeroed out */ 1435 for (i = startSlot; i < hSbrDec->LppTrans.pSettings->overlap; i++) { 1436 FDKmemcpy(&OverlapBufferReal[i][old_lsb], 1437 &hSbrDec->LppTrans 1438 .lpcFilterStatesRealLegSBR[LPC_ORDER + i][old_lsb], 1439 fMax(new_lsb - old_lsb, 0) * sizeof(FIXP_DBL)); 1440 if (!useLP) { 1441 FDKmemcpy(&OverlapBufferImag[i][old_lsb], 1442 &hSbrDec->LppTrans 1443 .lpcFilterStatesImagLegSBR[LPC_ORDER + i][old_lsb], 1444 fMax(new_lsb - old_lsb, 0) * sizeof(FIXP_DBL)); 1445 } 1446 } 1447 } 1448 1449 if (new_lsb > old_lsb) { 1450 stopBand = old_lsb; 1451 } 1452 } 1453 if ((adapt_lb == 1) && (stopBand > startBand)) { 1454 for (l = startSlot; l < hSbrDec->LppTrans.pSettings->overlap; l++) { 1455 scaleValues(OverlapBufferReal[l] + startBand, stopBand - startBand, 1456 diff); 1457 if (!useLP) { 1458 scaleValues(OverlapBufferImag[l] + startBand, stopBand - startBand, 1459 diff); 1460 } 1461 } 1462 } 1463 hSbrDec->qmfDomainInCh->scaling.ov_lb_scale = new_scale; 1464 } 1465 1466 sbrError = ResetLimiterBands(hHeaderData->freqBandData.limiterBandTable, 1467 &hHeaderData->freqBandData.noLimiterBands, 1468 hHeaderData->freqBandData.freqBandTable[0], 1469 hHeaderData->freqBandData.nSfb[0], 1470 hSbrDec->LppTrans.pSettings->patchParam, 1471 hSbrDec->LppTrans.pSettings->noOfPatches, 1472 hHeaderData->bs_data.limiterBands, 1473 hFrameData->sbrPatchingMode, 1474 GetxOverBandQmfTransposer(hSbrDec->hHBE), 1475 Get41SbrQmfTransposer(hSbrDec->hHBE)); 1476 1477 hSbrDec->SbrCalculateEnvelope.sbrPatchingMode = hFrameData->sbrPatchingMode; 1478 1479 return sbrError; 1480 } 1481