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 frontend 106 This module provides a frontend to the SBR decoder. The function openSBR() is 107 called for initialization. The function sbrDecoder_Apply() is called for each 108 frame. sbr_Apply() will call the required functions to decode the raw SBR data 109 (provided by env_extr.cpp), to decode the envelope data and noise floor levels 110 [decodeSbrData()], and to finally apply SBR to the current frame [sbr_dec()]. 111 112 \sa sbrDecoder_Apply(), \ref documentationOverview 113 */ 114 115 /*! 116 \page documentationOverview Overview of important information resources and 117 source code documentation 118 119 As part of this documentation you can find more extensive descriptions about 120 key concepts and algorithms at the following locations: 121 122 <h2>Programming</h2> 123 124 \li Buffer management: sbrDecoder_Apply() and sbr_dec() 125 \li Internal scale factors to maximize SNR on fixed point processors: 126 #QMF_SCALE_FACTOR \li Special mantissa-exponent format: Created in 127 requantizeEnvelopeData() and used in calculateSbrEnvelope() 128 129 <h2>Algorithmic details</h2> 130 \li About the SBR data format: \ref SBR_HEADER_ELEMENT and \ref 131 SBR_STANDARD_ELEMENT \li Details about the bitstream decoder: env_extr.cpp \li 132 Details about the QMF filterbank and the provided polyphase implementation: 133 qmf_dec.cpp \li Details about the transposer: lpp_tran.cpp \li Details about 134 the envelope adjuster: env_calc.cpp 135 136 */ 137 138 #include "sbrdecoder.h" 139 140 #include "FDK_bitstream.h" 141 142 #include "sbrdec_freq_sca.h" 143 #include "env_extr.h" 144 #include "sbr_dec.h" 145 #include "env_dec.h" 146 #include "sbr_crc.h" 147 #include "sbr_ram.h" 148 #include "sbr_rom.h" 149 #include "lpp_tran.h" 150 #include "transcendent.h" 151 152 #include "FDK_crc.h" 153 154 #include "sbrdec_drc.h" 155 156 #include "psbitdec.h" 157 158 /* Decoder library info */ 159 #define SBRDECODER_LIB_VL0 3 160 #define SBRDECODER_LIB_VL1 0 161 #define SBRDECODER_LIB_VL2 0 162 #define SBRDECODER_LIB_TITLE "SBR Decoder" 163 #ifdef __ANDROID__ 164 #define SBRDECODER_LIB_BUILD_DATE "" 165 #define SBRDECODER_LIB_BUILD_TIME "" 166 #else 167 #define SBRDECODER_LIB_BUILD_DATE __DATE__ 168 #define SBRDECODER_LIB_BUILD_TIME __TIME__ 169 #endif 170 171 static void setFrameErrorFlag(SBR_DECODER_ELEMENT *pSbrElement, UCHAR value) { 172 if (pSbrElement != NULL) { 173 switch (value) { 174 case FRAME_ERROR_ALLSLOTS: 175 FDKmemset(pSbrElement->frameErrorFlag, FRAME_ERROR, 176 sizeof(pSbrElement->frameErrorFlag)); 177 break; 178 default: 179 pSbrElement->frameErrorFlag[pSbrElement->useFrameSlot] = value; 180 } 181 } 182 } 183 184 static UCHAR getHeaderSlot(UCHAR currentSlot, UCHAR hdrSlotUsage[(1) + 1]) { 185 UINT occupied = 0; 186 int s; 187 UCHAR slot = hdrSlotUsage[currentSlot]; 188 189 FDK_ASSERT((1) + 1 < 32); 190 191 for (s = 0; s < (1) + 1; s++) { 192 if ((hdrSlotUsage[s] == slot) && (s != slot)) { 193 occupied = 1; 194 break; 195 } 196 } 197 198 if (occupied) { 199 occupied = 0; 200 201 for (s = 0; s < (1) + 1; s++) { 202 occupied |= 1 << hdrSlotUsage[s]; 203 } 204 for (s = 0; s < (1) + 1; s++) { 205 if (!(occupied & 0x1)) { 206 slot = s; 207 break; 208 } 209 occupied >>= 1; 210 } 211 } 212 213 return slot; 214 } 215 216 static void copySbrHeader(HANDLE_SBR_HEADER_DATA hDst, 217 const HANDLE_SBR_HEADER_DATA hSrc) { 218 /* copy the whole header memory (including pointers) */ 219 FDKmemcpy(hDst, hSrc, sizeof(SBR_HEADER_DATA)); 220 221 /* update pointers */ 222 hDst->freqBandData.freqBandTable[0] = hDst->freqBandData.freqBandTableLo; 223 hDst->freqBandData.freqBandTable[1] = hDst->freqBandData.freqBandTableHi; 224 } 225 226 static int compareSbrHeader(const HANDLE_SBR_HEADER_DATA hHdr1, 227 const HANDLE_SBR_HEADER_DATA hHdr2) { 228 int result = 0; 229 230 /* compare basic data */ 231 result |= (hHdr1->syncState != hHdr2->syncState) ? 1 : 0; 232 result |= (hHdr1->status != hHdr2->status) ? 1 : 0; 233 result |= (hHdr1->frameErrorFlag != hHdr2->frameErrorFlag) ? 1 : 0; 234 result |= (hHdr1->numberTimeSlots != hHdr2->numberTimeSlots) ? 1 : 0; 235 result |= 236 (hHdr1->numberOfAnalysisBands != hHdr2->numberOfAnalysisBands) ? 1 : 0; 237 result |= (hHdr1->timeStep != hHdr2->timeStep) ? 1 : 0; 238 result |= (hHdr1->sbrProcSmplRate != hHdr2->sbrProcSmplRate) ? 1 : 0; 239 240 /* compare bitstream data */ 241 result |= 242 FDKmemcmp(&hHdr1->bs_data, &hHdr2->bs_data, sizeof(SBR_HEADER_DATA_BS)); 243 result |= 244 FDKmemcmp(&hHdr1->bs_dflt, &hHdr2->bs_dflt, sizeof(SBR_HEADER_DATA_BS)); 245 result |= FDKmemcmp(&hHdr1->bs_info, &hHdr2->bs_info, 246 sizeof(SBR_HEADER_DATA_BS_INFO)); 247 248 /* compare frequency band data */ 249 result |= FDKmemcmp(&hHdr1->freqBandData, &hHdr2->freqBandData, 250 (8 + MAX_NUM_LIMITERS + 1) * sizeof(UCHAR)); 251 result |= FDKmemcmp(hHdr1->freqBandData.freqBandTableLo, 252 hHdr2->freqBandData.freqBandTableLo, 253 (MAX_FREQ_COEFFS / 2 + 1) * sizeof(UCHAR)); 254 result |= FDKmemcmp(hHdr1->freqBandData.freqBandTableHi, 255 hHdr2->freqBandData.freqBandTableHi, 256 (MAX_FREQ_COEFFS + 1) * sizeof(UCHAR)); 257 result |= FDKmemcmp(hHdr1->freqBandData.freqBandTableNoise, 258 hHdr2->freqBandData.freqBandTableNoise, 259 (MAX_NOISE_COEFFS + 1) * sizeof(UCHAR)); 260 result |= 261 FDKmemcmp(hHdr1->freqBandData.v_k_master, hHdr2->freqBandData.v_k_master, 262 (MAX_FREQ_COEFFS + 1) * sizeof(UCHAR)); 263 264 return result; 265 } 266 267 /*! 268 \brief Reset SBR decoder. 269 270 Reset should only be called if SBR has been sucessfully detected by 271 an appropriate checkForPayload() function. 272 273 \return Error code. 274 */ 275 static SBR_ERROR sbrDecoder_ResetElement(HANDLE_SBRDECODER self, 276 int sampleRateIn, int sampleRateOut, 277 int samplesPerFrame, 278 const MP4_ELEMENT_ID elementID, 279 const int elementIndex, 280 const int overlap) { 281 SBR_ERROR sbrError = SBRDEC_OK; 282 HANDLE_SBR_HEADER_DATA hSbrHeader; 283 UINT qmfFlags = 0; 284 285 int i, synDownsampleFac; 286 287 /* USAC: assuming theoretical case 8 kHz output sample rate with 4:1 SBR */ 288 const int sbr_min_sample_rate_in = IS_USAC(self->coreCodec) ? 2000 : 6400; 289 290 /* Check in/out samplerates */ 291 if (sampleRateIn < sbr_min_sample_rate_in || sampleRateIn > (96000)) { 292 sbrError = SBRDEC_UNSUPPORTED_CONFIG; 293 goto bail; 294 } 295 296 if (sampleRateOut > (96000)) { 297 sbrError = SBRDEC_UNSUPPORTED_CONFIG; 298 goto bail; 299 } 300 301 /* Set QMF mode flags */ 302 if (self->flags & SBRDEC_LOW_POWER) qmfFlags |= QMF_FLAG_LP; 303 304 if (self->coreCodec == AOT_ER_AAC_ELD) { 305 if (self->flags & SBRDEC_LD_MPS_QMF) { 306 qmfFlags |= QMF_FLAG_MPSLDFB; 307 } else { 308 qmfFlags |= QMF_FLAG_CLDFB; 309 } 310 } 311 312 /* Set downsampling factor for synthesis filter bank */ 313 if (sampleRateOut == 0) { 314 /* no single rate mode */ 315 sampleRateOut = 316 sampleRateIn 317 << 1; /* In case of implicit signalling, assume dual rate SBR */ 318 } 319 320 if (sampleRateIn == sampleRateOut) { 321 synDownsampleFac = 2; 322 self->flags |= SBRDEC_DOWNSAMPLE; 323 } else { 324 synDownsampleFac = 1; 325 self->flags &= ~SBRDEC_DOWNSAMPLE; 326 } 327 328 self->synDownsampleFac = synDownsampleFac; 329 self->sampleRateOut = sampleRateOut; 330 331 { 332 for (i = 0; i < (1) + 1; i++) { 333 int setDflt; 334 hSbrHeader = &(self->sbrHeader[elementIndex][i]); 335 setDflt = ((hSbrHeader->syncState == SBR_NOT_INITIALIZED) || 336 (self->flags & SBRDEC_FORCE_RESET)) 337 ? 1 338 : 0; 339 340 /* init a default header such that we can at least do upsampling later */ 341 sbrError = initHeaderData(hSbrHeader, sampleRateIn, sampleRateOut, 342 self->downscaleFactor, samplesPerFrame, 343 self->flags, setDflt); 344 345 /* Set synchState to UPSAMPLING in case it already is initialized */ 346 hSbrHeader->syncState = hSbrHeader->syncState > UPSAMPLING 347 ? UPSAMPLING 348 : hSbrHeader->syncState; 349 } 350 } 351 352 if (sbrError != SBRDEC_OK) { 353 goto bail; 354 } 355 356 if (!self->pQmfDomain->globalConf.qmfDomainExplicitConfig) { 357 self->pQmfDomain->globalConf.flags_requested |= qmfFlags; 358 self->pQmfDomain->globalConf.nBandsAnalysis_requested = 359 self->sbrHeader[elementIndex][0].numberOfAnalysisBands; 360 self->pQmfDomain->globalConf.nBandsSynthesis_requested = 361 (synDownsampleFac == 1) ? 64 : 32; /* may be overwritten by MPS */ 362 self->pQmfDomain->globalConf.nBandsSynthesis_requested /= 363 self->downscaleFactor; 364 self->pQmfDomain->globalConf.nQmfTimeSlots_requested = 365 self->sbrHeader[elementIndex][0].numberTimeSlots * 366 self->sbrHeader[elementIndex][0].timeStep; 367 self->pQmfDomain->globalConf.nQmfOvTimeSlots_requested = overlap; 368 self->pQmfDomain->globalConf.nQmfProcBands_requested = 64; /* always 64 */ 369 self->pQmfDomain->globalConf.nQmfProcChannels_requested = 370 1; /* may be overwritten by MPS */ 371 } 372 373 /* Init SBR channels going to be assigned to a SBR element */ 374 { 375 int ch; 376 for (ch = 0; ch < self->pSbrElement[elementIndex]->nChannels; ch++) { 377 int headerIndex = 378 getHeaderSlot(self->pSbrElement[elementIndex]->useFrameSlot, 379 self->pSbrElement[elementIndex]->useHeaderSlot); 380 381 /* and create sbrDec */ 382 sbrError = 383 createSbrDec(self->pSbrElement[elementIndex]->pSbrChannel[ch], 384 &self->sbrHeader[elementIndex][headerIndex], 385 &self->pSbrElement[elementIndex]->transposerSettings, 386 synDownsampleFac, qmfFlags, self->flags, overlap, ch, 387 self->codecFrameSize); 388 389 if (sbrError != SBRDEC_OK) { 390 goto bail; 391 } 392 } 393 } 394 395 // FDKmemclear(sbr_OverlapBuffer, sizeof(sbr_OverlapBuffer)); 396 397 if (self->numSbrElements == 1) { 398 switch (self->coreCodec) { 399 case AOT_AAC_LC: 400 case AOT_SBR: 401 case AOT_PS: 402 case AOT_ER_AAC_SCAL: 403 case AOT_DRM_AAC: 404 case AOT_DRM_SURROUND: 405 if (CreatePsDec(&self->hParametricStereoDec, samplesPerFrame)) { 406 sbrError = SBRDEC_CREATE_ERROR; 407 goto bail; 408 } 409 break; 410 default: 411 break; 412 } 413 } 414 415 /* Init frame delay slot handling */ 416 self->pSbrElement[elementIndex]->useFrameSlot = 0; 417 for (i = 0; i < ((1) + 1); i++) { 418 self->pSbrElement[elementIndex]->useHeaderSlot[i] = i; 419 } 420 421 bail: 422 423 return sbrError; 424 } 425 426 /*! 427 \brief Assign QMF domain provided QMF channels to SBR channels. 428 429 \return void 430 */ 431 static void sbrDecoder_AssignQmfChannels2SbrChannels(HANDLE_SBRDECODER self) { 432 int ch, el, absCh_offset = 0; 433 for (el = 0; el < self->numSbrElements; el++) { 434 if (self->pSbrElement[el] != NULL) { 435 for (ch = 0; ch < self->pSbrElement[el]->nChannels; ch++) { 436 FDK_ASSERT(((absCh_offset + ch) < ((8) + (1))) && 437 ((absCh_offset + ch) < ((8) + (1)))); 438 self->pSbrElement[el]->pSbrChannel[ch]->SbrDec.qmfDomainInCh = 439 &self->pQmfDomain->QmfDomainIn[absCh_offset + ch]; 440 self->pSbrElement[el]->pSbrChannel[ch]->SbrDec.qmfDomainOutCh = 441 &self->pQmfDomain->QmfDomainOut[absCh_offset + ch]; 442 } 443 absCh_offset += self->pSbrElement[el]->nChannels; 444 } 445 } 446 } 447 448 SBR_ERROR sbrDecoder_Open(HANDLE_SBRDECODER *pSelf, 449 HANDLE_FDK_QMF_DOMAIN pQmfDomain) { 450 HANDLE_SBRDECODER self = NULL; 451 SBR_ERROR sbrError = SBRDEC_OK; 452 int elIdx; 453 454 if ((pSelf == NULL) || (pQmfDomain == NULL)) { 455 return SBRDEC_INVALID_ARGUMENT; 456 } 457 458 /* Get memory for this instance */ 459 self = GetRam_SbrDecoder(); 460 if (self == NULL) { 461 sbrError = SBRDEC_MEM_ALLOC_FAILED; 462 goto bail; 463 } 464 465 self->pQmfDomain = pQmfDomain; 466 467 /* 468 Already zero because of calloc 469 self->numSbrElements = 0; 470 self->numSbrChannels = 0; 471 self->codecFrameSize = 0; 472 */ 473 474 self->numDelayFrames = (1); /* set to the max value by default */ 475 476 /* Initialize header sync state */ 477 for (elIdx = 0; elIdx < (8); elIdx += 1) { 478 int i; 479 for (i = 0; i < (1) + 1; i += 1) { 480 self->sbrHeader[elIdx][i].syncState = SBR_NOT_INITIALIZED; 481 } 482 } 483 484 *pSelf = self; 485 486 bail: 487 return sbrError; 488 } 489 490 /** 491 * \brief determine if the given core codec AOT can be processed or not. 492 * \param coreCodec core codec audio object type. 493 * \return 1 if SBR can be processed, 0 if SBR cannot be processed/applied. 494 */ 495 static int sbrDecoder_isCoreCodecValid(AUDIO_OBJECT_TYPE coreCodec) { 496 switch (coreCodec) { 497 case AOT_AAC_LC: 498 case AOT_SBR: 499 case AOT_PS: 500 case AOT_ER_AAC_SCAL: 501 case AOT_ER_AAC_ELD: 502 case AOT_DRM_AAC: 503 case AOT_DRM_SURROUND: 504 case AOT_USAC: 505 return 1; 506 default: 507 return 0; 508 } 509 } 510 511 static void sbrDecoder_DestroyElement(HANDLE_SBRDECODER self, 512 const int elementIndex) { 513 if (self->pSbrElement[elementIndex] != NULL) { 514 int ch; 515 516 for (ch = 0; ch < SBRDEC_MAX_CH_PER_ELEMENT; ch++) { 517 if (self->pSbrElement[elementIndex]->pSbrChannel[ch] != NULL) { 518 deleteSbrDec(self->pSbrElement[elementIndex]->pSbrChannel[ch]); 519 FreeRam_SbrDecChannel( 520 &self->pSbrElement[elementIndex]->pSbrChannel[ch]); 521 self->numSbrChannels -= 1; 522 } 523 } 524 FreeRam_SbrDecElement(&self->pSbrElement[elementIndex]); 525 self->numSbrElements -= 1; 526 } 527 } 528 529 SBR_ERROR sbrDecoder_InitElement( 530 HANDLE_SBRDECODER self, const int sampleRateIn, const int sampleRateOut, 531 const int samplesPerFrame, const AUDIO_OBJECT_TYPE coreCodec, 532 const MP4_ELEMENT_ID elementID, const int elementIndex, 533 const UCHAR harmonicSBR, const UCHAR stereoConfigIndex, 534 const UCHAR configMode, UCHAR *configChanged, const INT downscaleFactor) { 535 SBR_ERROR sbrError = SBRDEC_OK; 536 int chCnt = 0; 537 int nSbrElementsStart; 538 int nSbrChannelsStart; 539 if (self == NULL) { 540 return SBRDEC_INVALID_ARGUMENT; 541 } 542 543 nSbrElementsStart = self->numSbrElements; 544 nSbrChannelsStart = self->numSbrChannels; 545 546 /* Check core codec AOT */ 547 if (!sbrDecoder_isCoreCodecValid(coreCodec) || elementIndex >= (8)) { 548 sbrError = SBRDEC_UNSUPPORTED_CONFIG; 549 goto bail; 550 } 551 552 if (elementID != ID_SCE && elementID != ID_CPE && elementID != ID_LFE) { 553 sbrError = SBRDEC_UNSUPPORTED_CONFIG; 554 goto bail; 555 } 556 557 if (self->sampleRateIn == sampleRateIn && 558 self->codecFrameSize == samplesPerFrame && self->coreCodec == coreCodec && 559 self->pSbrElement[elementIndex] != NULL && 560 self->pSbrElement[elementIndex]->elementID == elementID && 561 !(self->flags & SBRDEC_FORCE_RESET) && 562 ((sampleRateOut == 0) ? 1 : (self->sampleRateOut == sampleRateOut)) && 563 ((harmonicSBR == 2) ? 1 564 : (self->harmonicSBR == 565 harmonicSBR)) /* The value 2 signalizes that 566 harmonicSBR shall be ignored in 567 the config change detection */ 568 ) { 569 /* Nothing to do */ 570 return SBRDEC_OK; 571 } else { 572 if (configMode & AC_CM_DET_CFG_CHANGE) { 573 *configChanged = 1; 574 } 575 } 576 577 /* reaching this point the SBR-decoder gets (re-)configured */ 578 579 /* The flags field is used for all elements! */ 580 self->flags &= 581 (SBRDEC_FORCE_RESET | SBRDEC_FLUSH); /* Keep the global flags. They will 582 be reset after decoding. */ 583 self->flags |= (downscaleFactor > 1) ? SBRDEC_ELD_DOWNSCALE : 0; 584 self->flags |= (coreCodec == AOT_ER_AAC_ELD) ? SBRDEC_ELD_GRID : 0; 585 self->flags |= (coreCodec == AOT_ER_AAC_SCAL) ? SBRDEC_SYNTAX_SCAL : 0; 586 self->flags |= 587 (coreCodec == AOT_DRM_AAC) ? SBRDEC_SYNTAX_SCAL | SBRDEC_SYNTAX_DRM : 0; 588 self->flags |= (coreCodec == AOT_DRM_SURROUND) 589 ? SBRDEC_SYNTAX_SCAL | SBRDEC_SYNTAX_DRM 590 : 0; 591 self->flags |= (coreCodec == AOT_USAC) ? SBRDEC_SYNTAX_USAC : 0; 592 /* Robustness: Take integer division rounding into consideration. E.g. 22050 593 * Hz with 4:1 SBR => 5512 Hz core sampling rate. */ 594 self->flags |= (sampleRateIn == sampleRateOut / 4) ? SBRDEC_QUAD_RATE : 0; 595 self->flags |= (harmonicSBR == 1) ? SBRDEC_USAC_HARMONICSBR : 0; 596 597 if (configMode & AC_CM_DET_CFG_CHANGE) { 598 return SBRDEC_OK; 599 } 600 601 self->sampleRateIn = sampleRateIn; 602 self->codecFrameSize = samplesPerFrame; 603 self->coreCodec = coreCodec; 604 self->harmonicSBR = harmonicSBR; 605 self->downscaleFactor = downscaleFactor; 606 607 /* Init SBR elements */ 608 { 609 int elChannels, ch; 610 611 if (self->pSbrElement[elementIndex] == NULL) { 612 self->pSbrElement[elementIndex] = GetRam_SbrDecElement(elementIndex); 613 if (self->pSbrElement[elementIndex] == NULL) { 614 sbrError = SBRDEC_MEM_ALLOC_FAILED; 615 goto bail; 616 } 617 self->numSbrElements++; 618 } else { 619 self->numSbrChannels -= self->pSbrElement[elementIndex]->nChannels; 620 } 621 622 /* Save element ID for sanity checks and to have a fallback for concealment. 623 */ 624 self->pSbrElement[elementIndex]->elementID = elementID; 625 626 /* Determine amount of channels for this element */ 627 switch (elementID) { 628 case ID_NONE: 629 case ID_CPE: 630 elChannels = 2; 631 break; 632 case ID_LFE: 633 case ID_SCE: 634 elChannels = 1; 635 break; 636 default: 637 elChannels = 0; 638 break; 639 } 640 641 /* Handle case of Parametric Stereo */ 642 if (elementIndex == 0 && elementID == ID_SCE) { 643 switch (coreCodec) { 644 case AOT_AAC_LC: 645 case AOT_SBR: 646 case AOT_PS: 647 case AOT_ER_AAC_SCAL: 648 case AOT_DRM_AAC: 649 case AOT_DRM_SURROUND: 650 elChannels = 2; 651 break; 652 default: 653 break; 654 } 655 } 656 657 /* Sanity check to avoid memory leaks */ 658 if (elChannels < self->pSbrElement[elementIndex]->nChannels) { 659 self->numSbrChannels += self->pSbrElement[elementIndex]->nChannels; 660 sbrError = SBRDEC_PARSE_ERROR; 661 goto bail; 662 } 663 664 self->pSbrElement[elementIndex]->nChannels = elChannels; 665 666 for (ch = 0; ch < elChannels; ch++) { 667 if (self->pSbrElement[elementIndex]->pSbrChannel[ch] == NULL) { 668 self->pSbrElement[elementIndex]->pSbrChannel[ch] = 669 GetRam_SbrDecChannel(chCnt); 670 if (self->pSbrElement[elementIndex]->pSbrChannel[ch] == NULL) { 671 sbrError = SBRDEC_MEM_ALLOC_FAILED; 672 goto bail; 673 } 674 } 675 self->numSbrChannels++; 676 677 sbrDecoder_drcInitChannel(&self->pSbrElement[elementIndex] 678 ->pSbrChannel[ch] 679 ->SbrDec.sbrDrcChannel); 680 681 chCnt++; 682 } 683 } 684 685 if (!self->pQmfDomain->globalConf.qmfDomainExplicitConfig) { 686 self->pQmfDomain->globalConf.nInputChannels_requested = 687 self->numSbrChannels; 688 self->pQmfDomain->globalConf.nOutputChannels_requested = 689 fMax((INT)self->numSbrChannels, 690 (INT)self->pQmfDomain->globalConf.nOutputChannels_requested); 691 } 692 693 /* Make sure each SBR channel has one QMF channel assigned even if 694 * numSbrChannels or element set-up has changed. */ 695 sbrDecoder_AssignQmfChannels2SbrChannels(self); 696 697 /* clear error flags for all delay slots */ 698 FDKmemclear(self->pSbrElement[elementIndex]->frameErrorFlag, 699 ((1) + 1) * sizeof(UCHAR)); 700 701 { 702 int overlap; 703 704 if (coreCodec == AOT_ER_AAC_ELD) { 705 overlap = 0; 706 } else if (self->flags & SBRDEC_QUAD_RATE) { 707 overlap = (3 * 4); 708 } else { 709 overlap = (3 * 2); 710 } 711 /* Initialize this instance */ 712 sbrError = sbrDecoder_ResetElement(self, sampleRateIn, sampleRateOut, 713 samplesPerFrame, elementID, elementIndex, 714 overlap); 715 } 716 717 bail: 718 if (sbrError != SBRDEC_OK) { 719 if ((nSbrElementsStart < self->numSbrElements) || 720 (nSbrChannelsStart < self->numSbrChannels)) { 721 /* Free the memory allocated for this element */ 722 sbrDecoder_DestroyElement(self, elementIndex); 723 } else if ((elementIndex < (8)) && 724 (self->pSbrElement[elementIndex] != 725 NULL)) { /* Set error flag to trigger concealment */ 726 setFrameErrorFlag(self->pSbrElement[elementIndex], FRAME_ERROR); 727 } 728 } 729 730 return sbrError; 731 } 732 733 /** 734 * \brief Free config dependent SBR memory. 735 * \param self SBR decoder instance handle 736 */ 737 SBR_ERROR sbrDecoder_FreeMem(HANDLE_SBRDECODER *self) { 738 int i; 739 int elIdx; 740 741 if (self != NULL && *self != NULL) { 742 for (i = 0; i < (8); i++) { 743 sbrDecoder_DestroyElement(*self, i); 744 } 745 746 for (elIdx = 0; elIdx < (8); elIdx += 1) { 747 for (i = 0; i < (1) + 1; i += 1) { 748 (*self)->sbrHeader[elIdx][i].syncState = SBR_NOT_INITIALIZED; 749 } 750 } 751 } 752 753 return SBRDEC_OK; 754 } 755 756 /** 757 * \brief Apply decoded SBR header for one element. 758 * \param self SBR decoder instance handle 759 * \param hSbrHeader SBR header handle to be processed. 760 * \param hSbrChannel pointer array to the SBR element channels corresponding to 761 * the SBR header. 762 * \param headerStatus header status value returned from SBR header parser. 763 * \param numElementChannels amount of channels for the SBR element whos header 764 * is to be processed. 765 */ 766 static SBR_ERROR sbrDecoder_HeaderUpdate(HANDLE_SBRDECODER self, 767 HANDLE_SBR_HEADER_DATA hSbrHeader, 768 SBR_HEADER_STATUS headerStatus, 769 HANDLE_SBR_CHANNEL hSbrChannel[], 770 const int numElementChannels) { 771 SBR_ERROR errorStatus = SBRDEC_OK; 772 773 /* 774 change of control data, reset decoder 775 */ 776 errorStatus = resetFreqBandTables(hSbrHeader, self->flags); 777 778 if (errorStatus == SBRDEC_OK) { 779 if (hSbrHeader->syncState == UPSAMPLING && headerStatus != HEADER_RESET) { 780 #if (SBRDEC_MAX_HB_FADE_FRAMES > 0) 781 int ch; 782 for (ch = 0; ch < numElementChannels; ch += 1) { 783 hSbrChannel[ch]->SbrDec.highBandFadeCnt = SBRDEC_MAX_HB_FADE_FRAMES; 784 } 785 786 #endif 787 /* As the default header would limit the frequency range, 788 lowSubband and highSubband must be patched. */ 789 hSbrHeader->freqBandData.lowSubband = hSbrHeader->numberOfAnalysisBands; 790 hSbrHeader->freqBandData.highSubband = hSbrHeader->numberOfAnalysisBands; 791 } 792 793 /* Trigger a reset before processing this slot */ 794 hSbrHeader->status |= SBRDEC_HDR_STAT_RESET; 795 } 796 797 return errorStatus; 798 } 799 800 INT sbrDecoder_Header(HANDLE_SBRDECODER self, HANDLE_FDK_BITSTREAM hBs, 801 const INT sampleRateIn, const INT sampleRateOut, 802 const INT samplesPerFrame, 803 const AUDIO_OBJECT_TYPE coreCodec, 804 const MP4_ELEMENT_ID elementID, const INT elementIndex, 805 const UCHAR harmonicSBR, const UCHAR stereoConfigIndex, 806 const UCHAR configMode, UCHAR *configChanged, 807 const INT downscaleFactor) { 808 SBR_HEADER_STATUS headerStatus; 809 HANDLE_SBR_HEADER_DATA hSbrHeader; 810 SBR_ERROR sbrError = SBRDEC_OK; 811 int headerIndex; 812 UINT flagsSaved = 813 0; /* flags should not be changed in AC_CM_DET_CFG_CHANGE - mode after 814 parsing */ 815 816 if (self == NULL || elementIndex >= (8)) { 817 return SBRDEC_UNSUPPORTED_CONFIG; 818 } 819 820 if (!sbrDecoder_isCoreCodecValid(coreCodec)) { 821 return SBRDEC_UNSUPPORTED_CONFIG; 822 } 823 824 if (configMode & AC_CM_DET_CFG_CHANGE) { 825 flagsSaved = self->flags; /* store */ 826 } 827 828 sbrError = sbrDecoder_InitElement( 829 self, sampleRateIn, sampleRateOut, samplesPerFrame, coreCodec, elementID, 830 elementIndex, harmonicSBR, stereoConfigIndex, configMode, configChanged, 831 downscaleFactor); 832 833 if ((sbrError != SBRDEC_OK) || (elementID == ID_LFE)) { 834 goto bail; 835 } 836 837 if (configMode & AC_CM_DET_CFG_CHANGE) { 838 hSbrHeader = NULL; 839 } else { 840 headerIndex = getHeaderSlot(self->pSbrElement[elementIndex]->useFrameSlot, 841 self->pSbrElement[elementIndex]->useHeaderSlot); 842 843 hSbrHeader = &(self->sbrHeader[elementIndex][headerIndex]); 844 } 845 846 headerStatus = sbrGetHeaderData(hSbrHeader, hBs, self->flags, 0, configMode); 847 848 if (coreCodec == AOT_USAC) { 849 if (configMode & AC_CM_DET_CFG_CHANGE) { 850 self->flags = flagsSaved; /* restore */ 851 } 852 return sbrError; 853 } 854 855 if (configMode & AC_CM_ALLOC_MEM) { 856 SBR_DECODER_ELEMENT *pSbrElement; 857 858 pSbrElement = self->pSbrElement[elementIndex]; 859 860 /* Sanity check */ 861 if (pSbrElement != NULL) { 862 if ((elementID == ID_CPE && pSbrElement->nChannels != 2) || 863 (elementID != ID_CPE && pSbrElement->nChannels != 1)) { 864 return SBRDEC_UNSUPPORTED_CONFIG; 865 } 866 if (headerStatus == HEADER_RESET) { 867 sbrError = sbrDecoder_HeaderUpdate(self, hSbrHeader, headerStatus, 868 pSbrElement->pSbrChannel, 869 pSbrElement->nChannels); 870 871 if (sbrError == SBRDEC_OK) { 872 hSbrHeader->syncState = SBR_HEADER; 873 hSbrHeader->status |= SBRDEC_HDR_STAT_UPDATE; 874 } 875 /* else { 876 Since we already have overwritten the old SBR header the only way out 877 is UPSAMPLING! This will be prepared in the next step. 878 } */ 879 } 880 } 881 } 882 bail: 883 if (configMode & AC_CM_DET_CFG_CHANGE) { 884 self->flags = flagsSaved; /* restore */ 885 } 886 return sbrError; 887 } 888 889 SBR_ERROR sbrDecoder_SetParam(HANDLE_SBRDECODER self, const SBRDEC_PARAM param, 890 const INT value) { 891 SBR_ERROR errorStatus = SBRDEC_OK; 892 893 /* configure the subsystems */ 894 switch (param) { 895 case SBR_SYSTEM_BITSTREAM_DELAY: 896 if (value < 0 || value > (1)) { 897 errorStatus = SBRDEC_SET_PARAM_FAIL; 898 break; 899 } 900 if (self == NULL) { 901 errorStatus = SBRDEC_NOT_INITIALIZED; 902 } else { 903 self->numDelayFrames = (UCHAR)value; 904 } 905 break; 906 case SBR_QMF_MODE: 907 if (self == NULL) { 908 errorStatus = SBRDEC_NOT_INITIALIZED; 909 } else { 910 if (value == 1) { 911 self->flags |= SBRDEC_LOW_POWER; 912 } else { 913 self->flags &= ~SBRDEC_LOW_POWER; 914 } 915 } 916 break; 917 case SBR_LD_QMF_TIME_ALIGN: 918 if (self == NULL) { 919 errorStatus = SBRDEC_NOT_INITIALIZED; 920 } else { 921 if (value == 1) { 922 self->flags |= SBRDEC_LD_MPS_QMF; 923 } else { 924 self->flags &= ~SBRDEC_LD_MPS_QMF; 925 } 926 } 927 break; 928 case SBR_FLUSH_DATA: 929 if (value != 0) { 930 if (self == NULL) { 931 errorStatus = SBRDEC_NOT_INITIALIZED; 932 } else { 933 self->flags |= SBRDEC_FLUSH; 934 } 935 } 936 break; 937 case SBR_CLEAR_HISTORY: 938 if (value != 0) { 939 if (self == NULL) { 940 errorStatus = SBRDEC_NOT_INITIALIZED; 941 } else { 942 self->flags |= SBRDEC_FORCE_RESET; 943 } 944 } 945 break; 946 case SBR_BS_INTERRUPTION: { 947 int elementIndex; 948 949 if (self == NULL) { 950 errorStatus = SBRDEC_NOT_INITIALIZED; 951 break; 952 } 953 954 /* Loop over SBR elements */ 955 for (elementIndex = 0; elementIndex < self->numSbrElements; 956 elementIndex++) { 957 if (self->pSbrElement[elementIndex] != NULL) { 958 HANDLE_SBR_HEADER_DATA hSbrHeader; 959 int headerIndex = 960 getHeaderSlot(self->pSbrElement[elementIndex]->useFrameSlot, 961 self->pSbrElement[elementIndex]->useHeaderSlot); 962 963 hSbrHeader = &(self->sbrHeader[elementIndex][headerIndex]); 964 965 /* Set sync state UPSAMPLING for the corresponding slot. 966 This switches off bitstream parsing until a new header arrives. */ 967 hSbrHeader->syncState = UPSAMPLING; 968 hSbrHeader->status |= SBRDEC_HDR_STAT_UPDATE; 969 } 970 } 971 } break; 972 973 case SBR_SKIP_QMF: 974 if (self == NULL) { 975 errorStatus = SBRDEC_NOT_INITIALIZED; 976 } else { 977 if (value == 1) { 978 self->flags |= SBRDEC_SKIP_QMF_ANA; 979 } else { 980 self->flags &= ~SBRDEC_SKIP_QMF_ANA; 981 } 982 if (value == 2) { 983 self->flags |= SBRDEC_SKIP_QMF_SYN; 984 } else { 985 self->flags &= ~SBRDEC_SKIP_QMF_SYN; 986 } 987 } 988 break; 989 default: 990 errorStatus = SBRDEC_SET_PARAM_FAIL; 991 break; 992 } /* switch(param) */ 993 994 return (errorStatus); 995 } 996 997 static SBRDEC_DRC_CHANNEL *sbrDecoder_drcGetChannel( 998 const HANDLE_SBRDECODER self, const INT channel) { 999 SBRDEC_DRC_CHANNEL *pSbrDrcChannelData = NULL; 1000 int elementIndex, elChanIdx = 0, numCh = 0; 1001 1002 for (elementIndex = 0; (elementIndex < (8)) && (numCh <= channel); 1003 elementIndex++) { 1004 SBR_DECODER_ELEMENT *pSbrElement = self->pSbrElement[elementIndex]; 1005 int c, elChannels; 1006 1007 elChanIdx = 0; 1008 if (pSbrElement == NULL) break; 1009 1010 /* Determine amount of channels for this element */ 1011 switch (pSbrElement->elementID) { 1012 case ID_CPE: 1013 elChannels = 2; 1014 break; 1015 case ID_LFE: 1016 case ID_SCE: 1017 elChannels = 1; 1018 break; 1019 case ID_NONE: 1020 default: 1021 elChannels = 0; 1022 break; 1023 } 1024 1025 /* Limit with actual allocated element channels */ 1026 elChannels = fMin(elChannels, pSbrElement->nChannels); 1027 1028 for (c = 0; (c < elChannels) && (numCh <= channel); c++) { 1029 if (pSbrElement->pSbrChannel[elChanIdx] != NULL) { 1030 numCh++; 1031 elChanIdx++; 1032 } 1033 } 1034 } 1035 elementIndex -= 1; 1036 elChanIdx -= 1; 1037 1038 if (elChanIdx < 0 || elementIndex < 0) { 1039 return NULL; 1040 } 1041 1042 if (self->pSbrElement[elementIndex] != NULL) { 1043 if (self->pSbrElement[elementIndex]->pSbrChannel[elChanIdx] != NULL) { 1044 pSbrDrcChannelData = &self->pSbrElement[elementIndex] 1045 ->pSbrChannel[elChanIdx] 1046 ->SbrDec.sbrDrcChannel; 1047 } 1048 } 1049 1050 return (pSbrDrcChannelData); 1051 } 1052 1053 SBR_ERROR sbrDecoder_drcFeedChannel(HANDLE_SBRDECODER self, INT ch, 1054 UINT numBands, FIXP_DBL *pNextFact_mag, 1055 INT nextFact_exp, 1056 SHORT drcInterpolationScheme, 1057 UCHAR winSequence, USHORT *pBandTop) { 1058 SBRDEC_DRC_CHANNEL *pSbrDrcChannelData = NULL; 1059 int band, isValidData = 0; 1060 1061 if (self == NULL) { 1062 return SBRDEC_NOT_INITIALIZED; 1063 } 1064 if (ch > (8) || pNextFact_mag == NULL) { 1065 return SBRDEC_SET_PARAM_FAIL; 1066 } 1067 1068 /* Search for gain values different to 1.0f */ 1069 for (band = 0; band < (int)numBands; band += 1) { 1070 if (!((pNextFact_mag[band] == FL2FXCONST_DBL(0.5)) && 1071 (nextFact_exp == 1)) && 1072 !((pNextFact_mag[band] == (FIXP_DBL)MAXVAL_DBL) && 1073 (nextFact_exp == 0))) { 1074 isValidData = 1; 1075 break; 1076 } 1077 } 1078 1079 /* Find the right SBR channel */ 1080 pSbrDrcChannelData = sbrDecoder_drcGetChannel(self, ch); 1081 1082 if (pSbrDrcChannelData != NULL) { 1083 if (pSbrDrcChannelData->enable || 1084 isValidData) { /* Activate processing only with real and valid data */ 1085 int i; 1086 1087 pSbrDrcChannelData->enable = 1; 1088 pSbrDrcChannelData->numBandsNext = numBands; 1089 1090 pSbrDrcChannelData->winSequenceNext = winSequence; 1091 pSbrDrcChannelData->drcInterpolationSchemeNext = drcInterpolationScheme; 1092 pSbrDrcChannelData->nextFact_exp = nextFact_exp; 1093 1094 for (i = 0; i < (int)numBands; i++) { 1095 pSbrDrcChannelData->bandTopNext[i] = pBandTop[i]; 1096 pSbrDrcChannelData->nextFact_mag[i] = pNextFact_mag[i]; 1097 } 1098 } 1099 } 1100 1101 return SBRDEC_OK; 1102 } 1103 1104 void sbrDecoder_drcDisable(HANDLE_SBRDECODER self, INT ch) { 1105 SBRDEC_DRC_CHANNEL *pSbrDrcChannelData = NULL; 1106 1107 if ((self == NULL) || (ch > (8)) || (self->numSbrElements == 0) || 1108 (self->numSbrChannels == 0)) { 1109 return; 1110 } 1111 1112 /* Find the right SBR channel */ 1113 pSbrDrcChannelData = sbrDecoder_drcGetChannel(self, ch); 1114 1115 if (pSbrDrcChannelData != NULL) { 1116 sbrDecoder_drcInitChannel(pSbrDrcChannelData); 1117 } 1118 } 1119 1120 SBR_ERROR sbrDecoder_Parse(HANDLE_SBRDECODER self, HANDLE_FDK_BITSTREAM hBs, 1121 UCHAR *pDrmBsBuffer, USHORT drmBsBufferSize, 1122 int *count, int bsPayLen, int crcFlag, 1123 MP4_ELEMENT_ID prevElement, int elementIndex, 1124 UINT acFlags, UINT acElFlags[]) { 1125 SBR_DECODER_ELEMENT *hSbrElement = NULL; 1126 HANDLE_SBR_HEADER_DATA hSbrHeader = NULL; 1127 HANDLE_SBR_CHANNEL *pSbrChannel; 1128 1129 SBR_FRAME_DATA *hFrameDataLeft = NULL; 1130 SBR_FRAME_DATA *hFrameDataRight = NULL; 1131 SBR_FRAME_DATA frameDataLeftCopy; 1132 SBR_FRAME_DATA frameDataRightCopy; 1133 1134 SBR_ERROR errorStatus = SBRDEC_OK; 1135 SBR_HEADER_STATUS headerStatus = HEADER_NOT_PRESENT; 1136 1137 INT startPos = FDKgetValidBits(hBs); 1138 INT CRCLen = 0; 1139 HANDLE_FDK_BITSTREAM hBsOriginal = hBs; 1140 FDK_BITSTREAM bsBwd; 1141 1142 FDK_CRCINFO crcInfo; 1143 INT crcReg = 0; 1144 USHORT drmSbrCrc = 0; 1145 const int fGlobalIndependencyFlag = acFlags & AC_INDEP; 1146 const int bs_pvc = acElFlags[elementIndex] & AC_EL_USAC_PVC; 1147 const int bs_interTes = acElFlags[elementIndex] & AC_EL_USAC_ITES; 1148 int stereo; 1149 int fDoDecodeSbrData = 1; 1150 1151 int lastSlot, lastHdrSlot = 0, thisHdrSlot = 0; 1152 1153 /* SBR sanity checks */ 1154 if (self == NULL) { 1155 errorStatus = SBRDEC_NOT_INITIALIZED; 1156 goto bail; 1157 } 1158 1159 /* Reverse bits of DRM SBR payload */ 1160 if ((self->flags & SBRDEC_SYNTAX_DRM) && *count > 0) { 1161 int dataBytes, dataBits; 1162 1163 FDK_ASSERT(drmBsBufferSize >= (512)); 1164 dataBits = *count; 1165 1166 if (dataBits > ((512) * 8)) { 1167 /* do not flip more data than needed */ 1168 dataBits = (512) * 8; 1169 } 1170 1171 dataBytes = (dataBits + 7) >> 3; 1172 1173 int j; 1174 1175 if ((j = (int)FDKgetValidBits(hBs)) != 8) { 1176 FDKpushBiDirectional(hBs, (j - 8)); 1177 } 1178 1179 j = 0; 1180 for (; dataBytes > 0; dataBytes--) { 1181 int i; 1182 UCHAR tmpByte; 1183 UCHAR buffer = 0x00; 1184 1185 tmpByte = (UCHAR)FDKreadBits(hBs, 8); 1186 for (i = 0; i < 4; i++) { 1187 int shift = 2 * i + 1; 1188 buffer |= (tmpByte & (0x08 >> i)) << shift; 1189 buffer |= (tmpByte & (0x10 << i)) >> shift; 1190 } 1191 pDrmBsBuffer[j++] = buffer; 1192 FDKpushBack(hBs, 16); 1193 } 1194 1195 FDKinitBitStream(&bsBwd, pDrmBsBuffer, (512), dataBits, BS_READER); 1196 1197 /* Use reversed data */ 1198 hBs = &bsBwd; 1199 bsPayLen = *count; 1200 } 1201 1202 /* Remember start position of SBR element */ 1203 startPos = FDKgetValidBits(hBs); 1204 1205 /* SBR sanity checks */ 1206 if (self->pSbrElement[elementIndex] == NULL) { 1207 errorStatus = SBRDEC_NOT_INITIALIZED; 1208 goto bail; 1209 } 1210 hSbrElement = self->pSbrElement[elementIndex]; 1211 1212 lastSlot = (hSbrElement->useFrameSlot > 0) ? hSbrElement->useFrameSlot - 1 1213 : self->numDelayFrames; 1214 lastHdrSlot = hSbrElement->useHeaderSlot[lastSlot]; 1215 thisHdrSlot = getHeaderSlot( 1216 hSbrElement->useFrameSlot, 1217 hSbrElement->useHeaderSlot); /* Get a free header slot not used by 1218 frames not processed yet. */ 1219 1220 /* Assign the free slot to store a new header if there is one. */ 1221 hSbrHeader = &self->sbrHeader[elementIndex][thisHdrSlot]; 1222 1223 pSbrChannel = hSbrElement->pSbrChannel; 1224 stereo = (hSbrElement->elementID == ID_CPE) ? 1 : 0; 1225 1226 hFrameDataLeft = &self->pSbrElement[elementIndex] 1227 ->pSbrChannel[0] 1228 ->frameData[hSbrElement->useFrameSlot]; 1229 if (stereo) { 1230 hFrameDataRight = &self->pSbrElement[elementIndex] 1231 ->pSbrChannel[1] 1232 ->frameData[hSbrElement->useFrameSlot]; 1233 } 1234 1235 /* store frameData; new parsed frameData possibly corrupted */ 1236 FDKmemcpy(&frameDataLeftCopy, hFrameDataLeft, sizeof(SBR_FRAME_DATA)); 1237 if (stereo) { 1238 FDKmemcpy(&frameDataRightCopy, hFrameDataRight, sizeof(SBR_FRAME_DATA)); 1239 } 1240 1241 /* reset PS flag; will be set after PS was found */ 1242 self->flags &= ~SBRDEC_PS_DECODED; 1243 1244 if (hSbrHeader->status & SBRDEC_HDR_STAT_UPDATE) { 1245 /* Got a new header from extern (e.g. from an ASC) */ 1246 headerStatus = HEADER_OK; 1247 hSbrHeader->status &= ~SBRDEC_HDR_STAT_UPDATE; 1248 } else if (thisHdrSlot != lastHdrSlot) { 1249 /* Copy the last header into this slot otherwise the 1250 header compare will trigger more HEADER_RESETs than needed. */ 1251 copySbrHeader(hSbrHeader, &self->sbrHeader[elementIndex][lastHdrSlot]); 1252 } 1253 1254 /* 1255 Check if bit stream data is valid and matches the element context 1256 */ 1257 if (((prevElement != ID_SCE) && (prevElement != ID_CPE)) || 1258 prevElement != hSbrElement->elementID) { 1259 /* In case of LFE we also land here, since there is no LFE SBR element (do 1260 * upsampling only) */ 1261 fDoDecodeSbrData = 0; 1262 } 1263 1264 if (fDoDecodeSbrData) { 1265 if ((INT)FDKgetValidBits(hBs) <= 0) { 1266 fDoDecodeSbrData = 0; 1267 } 1268 } 1269 1270 /* 1271 SBR CRC-check 1272 */ 1273 if (fDoDecodeSbrData) { 1274 if (crcFlag) { 1275 switch (self->coreCodec) { 1276 case AOT_ER_AAC_ELD: 1277 FDKpushFor(hBs, 10); 1278 /* check sbrcrc later: we don't know the payload length now */ 1279 break; 1280 case AOT_DRM_AAC: 1281 case AOT_DRM_SURROUND: 1282 drmSbrCrc = (USHORT)FDKreadBits(hBs, 8); 1283 /* Setup CRC decoder */ 1284 FDKcrcInit(&crcInfo, 0x001d, 0xFFFF, 8); 1285 /* Start CRC region */ 1286 crcReg = FDKcrcStartReg(&crcInfo, hBs, 0); 1287 break; 1288 default: 1289 CRCLen = bsPayLen - 10; /* change: 0 => i */ 1290 if (CRCLen < 0) { 1291 fDoDecodeSbrData = 0; 1292 } else { 1293 fDoDecodeSbrData = SbrCrcCheck(hBs, CRCLen); 1294 } 1295 break; 1296 } 1297 } 1298 } /* if (fDoDecodeSbrData) */ 1299 1300 /* 1301 Read in the header data and issue a reset if change occured 1302 */ 1303 if (fDoDecodeSbrData) { 1304 int sbrHeaderPresent; 1305 1306 if (self->flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC)) { 1307 SBR_HEADER_DATA_BS_INFO newSbrInfo; 1308 int sbrInfoPresent; 1309 1310 if (bs_interTes) { 1311 self->flags |= SBRDEC_USAC_ITES; 1312 } else { 1313 self->flags &= ~SBRDEC_USAC_ITES; 1314 } 1315 1316 if (fGlobalIndependencyFlag) { 1317 self->flags |= SBRDEC_USAC_INDEP; 1318 sbrInfoPresent = 1; 1319 sbrHeaderPresent = 1; 1320 } else { 1321 self->flags &= ~SBRDEC_USAC_INDEP; 1322 sbrInfoPresent = FDKreadBit(hBs); 1323 if (sbrInfoPresent) { 1324 sbrHeaderPresent = FDKreadBit(hBs); 1325 } else { 1326 sbrHeaderPresent = 0; 1327 } 1328 } 1329 1330 if (sbrInfoPresent) { 1331 newSbrInfo.ampResolution = FDKreadBit(hBs); 1332 newSbrInfo.xover_band = FDKreadBits(hBs, 4); 1333 newSbrInfo.sbr_preprocessing = FDKreadBit(hBs); 1334 if (bs_pvc) { 1335 newSbrInfo.pvc_mode = FDKreadBits(hBs, 2); 1336 /* bs_pvc_mode: 0 -> no PVC, 1 -> PVC mode 1, 2 -> PVC mode 2, 3 -> 1337 * reserved */ 1338 if (newSbrInfo.pvc_mode > 2) { 1339 headerStatus = HEADER_ERROR; 1340 } 1341 if (stereo && newSbrInfo.pvc_mode > 0) { 1342 /* bs_pvc is always transmitted but pvc_mode is set to zero in case 1343 * of stereo SBR. The config might be wrong but we cannot tell for 1344 * sure. */ 1345 newSbrInfo.pvc_mode = 0; 1346 } 1347 } else { 1348 newSbrInfo.pvc_mode = 0; 1349 } 1350 if (headerStatus != HEADER_ERROR) { 1351 if (FDKmemcmp(&hSbrHeader->bs_info, &newSbrInfo, 1352 sizeof(SBR_HEADER_DATA_BS_INFO))) { 1353 /* in case of ampResolution and preprocessing change no full reset 1354 * required */ 1355 /* HEADER reset would trigger HBE transposer reset which breaks 1356 * eSbr_3_Eaa.mp4 */ 1357 if ((hSbrHeader->bs_info.pvc_mode != newSbrInfo.pvc_mode) || 1358 (hSbrHeader->bs_info.xover_band != newSbrInfo.xover_band)) { 1359 headerStatus = HEADER_RESET; 1360 } else { 1361 headerStatus = HEADER_OK; 1362 } 1363 1364 hSbrHeader->bs_info = newSbrInfo; 1365 } else { 1366 headerStatus = HEADER_OK; 1367 } 1368 } 1369 } 1370 if (headerStatus == HEADER_ERROR) { 1371 /* Corrupt SBR info data, do not decode and switch to UPSAMPLING */ 1372 hSbrHeader->syncState = UPSAMPLING; 1373 fDoDecodeSbrData = 0; 1374 sbrHeaderPresent = 0; 1375 } 1376 1377 if (sbrHeaderPresent && fDoDecodeSbrData) { 1378 int useDfltHeader; 1379 1380 useDfltHeader = FDKreadBit(hBs); 1381 1382 if (useDfltHeader) { 1383 sbrHeaderPresent = 0; 1384 if (FDKmemcmp(&hSbrHeader->bs_data, &hSbrHeader->bs_dflt, 1385 sizeof(SBR_HEADER_DATA_BS)) || 1386 hSbrHeader->syncState != SBR_ACTIVE) { 1387 hSbrHeader->bs_data = hSbrHeader->bs_dflt; 1388 headerStatus = HEADER_RESET; 1389 } 1390 } 1391 } 1392 } else { 1393 sbrHeaderPresent = FDKreadBit(hBs); 1394 } 1395 1396 if (sbrHeaderPresent) { 1397 headerStatus = sbrGetHeaderData(hSbrHeader, hBs, self->flags, 1, 0); 1398 } 1399 1400 if (headerStatus == HEADER_RESET) { 1401 errorStatus = sbrDecoder_HeaderUpdate( 1402 self, hSbrHeader, headerStatus, pSbrChannel, hSbrElement->nChannels); 1403 1404 if (errorStatus == SBRDEC_OK) { 1405 hSbrHeader->syncState = SBR_HEADER; 1406 } else { 1407 hSbrHeader->syncState = SBR_NOT_INITIALIZED; 1408 headerStatus = HEADER_ERROR; 1409 } 1410 } 1411 1412 if (errorStatus != SBRDEC_OK) { 1413 fDoDecodeSbrData = 0; 1414 } 1415 } /* if (fDoDecodeSbrData) */ 1416 1417 /* 1418 Print debugging output only if state has changed 1419 */ 1420 1421 /* read frame data */ 1422 if ((hSbrHeader->syncState >= SBR_HEADER) && fDoDecodeSbrData) { 1423 int sbrFrameOk; 1424 /* read the SBR element data */ 1425 if (!stereo && (self->hParametricStereoDec != NULL)) { 1426 /* update slot index for PS bitstream parsing */ 1427 self->hParametricStereoDec->bsLastSlot = 1428 self->hParametricStereoDec->bsReadSlot; 1429 self->hParametricStereoDec->bsReadSlot = hSbrElement->useFrameSlot; 1430 } 1431 sbrFrameOk = sbrGetChannelElement( 1432 hSbrHeader, hFrameDataLeft, (stereo) ? hFrameDataRight : NULL, 1433 &pSbrChannel[0]->prevFrameData, 1434 pSbrChannel[0]->SbrDec.PvcStaticData.pvc_mode_last, hBs, 1435 (stereo) ? NULL : self->hParametricStereoDec, self->flags, 1436 self->pSbrElement[elementIndex]->transposerSettings.overlap); 1437 1438 if (!sbrFrameOk) { 1439 fDoDecodeSbrData = 0; 1440 } else { 1441 INT valBits; 1442 1443 if (bsPayLen > 0) { 1444 valBits = bsPayLen - ((INT)startPos - (INT)FDKgetValidBits(hBs)); 1445 } else { 1446 valBits = (INT)FDKgetValidBits(hBs); 1447 } 1448 1449 if (crcFlag) { 1450 switch (self->coreCodec) { 1451 case AOT_ER_AAC_ELD: { 1452 /* late crc check for eld */ 1453 INT payloadbits = 1454 (INT)startPos - (INT)FDKgetValidBits(hBs) - startPos; 1455 INT crcLen = payloadbits - 10; 1456 FDKpushBack(hBs, payloadbits); 1457 fDoDecodeSbrData = SbrCrcCheck(hBs, crcLen); 1458 FDKpushFor(hBs, crcLen); 1459 } break; 1460 case AOT_DRM_AAC: 1461 case AOT_DRM_SURROUND: 1462 /* End CRC region */ 1463 FDKcrcEndReg(&crcInfo, hBs, crcReg); 1464 /* Check CRC */ 1465 if ((FDKcrcGetCRC(&crcInfo) ^ 0xFF) != drmSbrCrc) { 1466 fDoDecodeSbrData = 0; 1467 if (headerStatus != HEADER_NOT_PRESENT) { 1468 headerStatus = HEADER_ERROR; 1469 hSbrHeader->syncState = SBR_NOT_INITIALIZED; 1470 } 1471 } 1472 break; 1473 default: 1474 break; 1475 } 1476 } 1477 1478 /* sanity check of remaining bits */ 1479 if (valBits < 0) { 1480 fDoDecodeSbrData = 0; 1481 } else { 1482 switch (self->coreCodec) { 1483 case AOT_SBR: 1484 case AOT_PS: 1485 case AOT_AAC_LC: { 1486 /* This sanity check is only meaningful with General Audio 1487 * bitstreams */ 1488 int alignBits = valBits & 0x7; 1489 1490 if (valBits > alignBits) { 1491 fDoDecodeSbrData = 0; 1492 } 1493 } break; 1494 default: 1495 /* No sanity check available */ 1496 break; 1497 } 1498 } 1499 } 1500 } else { 1501 /* The returned bit count will not be the actual payload size since we did 1502 not parse the frame data. Return an error so that the caller can react 1503 respectively. */ 1504 errorStatus = SBRDEC_PARSE_ERROR; 1505 } 1506 1507 if (!fDoDecodeSbrData) { 1508 /* Set error flag for this slot to trigger concealment */ 1509 setFrameErrorFlag(self->pSbrElement[elementIndex], FRAME_ERROR); 1510 /* restore old frameData for concealment */ 1511 FDKmemcpy(hFrameDataLeft, &frameDataLeftCopy, sizeof(SBR_FRAME_DATA)); 1512 if (stereo) { 1513 FDKmemcpy(hFrameDataRight, &frameDataRightCopy, sizeof(SBR_FRAME_DATA)); 1514 } 1515 errorStatus = SBRDEC_PARSE_ERROR; 1516 } else { 1517 /* Everything seems to be ok so clear the error flag */ 1518 setFrameErrorFlag(self->pSbrElement[elementIndex], FRAME_OK); 1519 } 1520 1521 if (!stereo) { 1522 /* Turn coupling off explicitely to avoid access to absent right frame data 1523 that might occur with corrupt bitstreams. */ 1524 hFrameDataLeft->coupling = COUPLING_OFF; 1525 } 1526 1527 bail: 1528 1529 if (self != NULL) { 1530 if (self->flags & SBRDEC_SYNTAX_DRM) { 1531 hBs = hBsOriginal; 1532 } 1533 1534 if (errorStatus != SBRDEC_NOT_INITIALIZED) { 1535 int useOldHdr = 1536 ((headerStatus == HEADER_NOT_PRESENT) || 1537 (headerStatus == HEADER_ERROR) || 1538 (headerStatus == HEADER_RESET && errorStatus == SBRDEC_PARSE_ERROR)) 1539 ? 1 1540 : 0; 1541 1542 if (!useOldHdr && (thisHdrSlot != lastHdrSlot) && (hSbrHeader != NULL)) { 1543 useOldHdr |= 1544 (compareSbrHeader(hSbrHeader, 1545 &self->sbrHeader[elementIndex][lastHdrSlot]) == 0) 1546 ? 1 1547 : 0; 1548 } 1549 1550 if (hSbrElement != NULL) { 1551 if (useOldHdr != 0) { 1552 /* Use the old header for this frame */ 1553 hSbrElement->useHeaderSlot[hSbrElement->useFrameSlot] = lastHdrSlot; 1554 } else { 1555 /* Use the new header for this frame */ 1556 hSbrElement->useHeaderSlot[hSbrElement->useFrameSlot] = thisHdrSlot; 1557 } 1558 1559 /* Move frame pointer to the next slot which is up to be decoded/applied 1560 * next */ 1561 hSbrElement->useFrameSlot = 1562 (hSbrElement->useFrameSlot + 1) % (self->numDelayFrames + 1); 1563 } 1564 } 1565 } 1566 1567 *count -= startPos - (INT)FDKgetValidBits(hBs); 1568 1569 return errorStatus; 1570 } 1571 1572 /** 1573 * \brief Render one SBR element into time domain signal. 1574 * \param self SBR decoder handle 1575 * \param timeData pointer to output buffer 1576 * \param channelMapping pointer to UCHAR array where next 2 channel offsets are 1577 * stored. 1578 * \param elementIndex enumerating index of the SBR element to render. 1579 * \param numInChannels number of channels from core coder. 1580 * \param numOutChannels pointer to a location to return number of output 1581 * channels. 1582 * \param psPossible flag indicating if PS is possible or not. 1583 * \return SBRDEC_OK if successfull, else error code 1584 */ 1585 static SBR_ERROR sbrDecoder_DecodeElement( 1586 HANDLE_SBRDECODER self, QDOM_PCM *input, INT_PCM *timeData, 1587 const int timeDataSize, const FDK_channelMapDescr *const mapDescr, 1588 const int mapIdx, int channelIndex, const int elementIndex, 1589 const int numInChannels, int *numOutChannels, const int psPossible) { 1590 SBR_DECODER_ELEMENT *hSbrElement = self->pSbrElement[elementIndex]; 1591 HANDLE_SBR_CHANNEL *pSbrChannel = 1592 self->pSbrElement[elementIndex]->pSbrChannel; 1593 HANDLE_SBR_HEADER_DATA hSbrHeader = 1594 &self->sbrHeader[elementIndex] 1595 [hSbrElement->useHeaderSlot[hSbrElement->useFrameSlot]]; 1596 HANDLE_PS_DEC h_ps_d = self->hParametricStereoDec; 1597 1598 /* get memory for frame data from scratch */ 1599 SBR_FRAME_DATA *hFrameDataLeft = NULL; 1600 SBR_FRAME_DATA *hFrameDataRight = NULL; 1601 1602 SBR_ERROR errorStatus = SBRDEC_OK; 1603 1604 INT strideOut, offset0 = 255, offset0_block = 0, offset1 = 255, 1605 offset1_block = 0; 1606 INT codecFrameSize = self->codecFrameSize; 1607 1608 int stereo = (hSbrElement->elementID == ID_CPE) ? 1 : 0; 1609 int numElementChannels = 1610 hSbrElement 1611 ->nChannels; /* Number of channels of the current SBR element */ 1612 1613 hFrameDataLeft = 1614 &hSbrElement->pSbrChannel[0]->frameData[hSbrElement->useFrameSlot]; 1615 if (stereo) { 1616 hFrameDataRight = 1617 &hSbrElement->pSbrChannel[1]->frameData[hSbrElement->useFrameSlot]; 1618 } 1619 1620 if (self->flags & SBRDEC_FLUSH) { 1621 if (self->numFlushedFrames > self->numDelayFrames) { 1622 int hdrIdx; 1623 /* No valid SBR payload available, hence switch to upsampling (in all 1624 * headers) */ 1625 for (hdrIdx = 0; hdrIdx < ((1) + 1); hdrIdx += 1) { 1626 self->sbrHeader[elementIndex][hdrIdx].syncState = UPSAMPLING; 1627 } 1628 } else { 1629 /* Move frame pointer to the next slot which is up to be decoded/applied 1630 * next */ 1631 hSbrElement->useFrameSlot = 1632 (hSbrElement->useFrameSlot + 1) % (self->numDelayFrames + 1); 1633 /* Update header and frame data pointer because they have already been set 1634 */ 1635 hSbrHeader = 1636 &self->sbrHeader[elementIndex] 1637 [hSbrElement 1638 ->useHeaderSlot[hSbrElement->useFrameSlot]]; 1639 hFrameDataLeft = 1640 &hSbrElement->pSbrChannel[0]->frameData[hSbrElement->useFrameSlot]; 1641 if (stereo) { 1642 hFrameDataRight = 1643 &hSbrElement->pSbrChannel[1]->frameData[hSbrElement->useFrameSlot]; 1644 } 1645 } 1646 } 1647 1648 /* Update the header error flag */ 1649 hSbrHeader->frameErrorFlag = 1650 hSbrElement->frameErrorFlag[hSbrElement->useFrameSlot]; 1651 1652 /* 1653 Prepare filterbank for upsampling if no valid bit stream data is available. 1654 */ 1655 if (hSbrHeader->syncState == SBR_NOT_INITIALIZED) { 1656 errorStatus = 1657 initHeaderData(hSbrHeader, self->sampleRateIn, self->sampleRateOut, 1658 self->downscaleFactor, codecFrameSize, self->flags, 1659 1 /* SET_DEFAULT_HDR */ 1660 ); 1661 1662 if (errorStatus != SBRDEC_OK) { 1663 return errorStatus; 1664 } 1665 1666 hSbrHeader->syncState = UPSAMPLING; 1667 1668 errorStatus = sbrDecoder_HeaderUpdate(self, hSbrHeader, HEADER_NOT_PRESENT, 1669 pSbrChannel, hSbrElement->nChannels); 1670 1671 if (errorStatus != SBRDEC_OK) { 1672 hSbrHeader->syncState = SBR_NOT_INITIALIZED; 1673 return errorStatus; 1674 } 1675 } 1676 1677 /* reset */ 1678 if (hSbrHeader->status & SBRDEC_HDR_STAT_RESET) { 1679 int ch; 1680 for (ch = 0; ch < numElementChannels; ch++) { 1681 SBR_ERROR errorStatusTmp = SBRDEC_OK; 1682 1683 errorStatusTmp = resetSbrDec( 1684 &pSbrChannel[ch]->SbrDec, hSbrHeader, &pSbrChannel[ch]->prevFrameData, 1685 self->synDownsampleFac, self->flags, pSbrChannel[ch]->frameData); 1686 1687 if (errorStatusTmp != SBRDEC_OK) { 1688 hSbrHeader->syncState = UPSAMPLING; 1689 } 1690 } 1691 hSbrHeader->status &= ~SBRDEC_HDR_STAT_RESET; 1692 } 1693 1694 /* decoding */ 1695 if ((hSbrHeader->syncState == SBR_ACTIVE) || 1696 ((hSbrHeader->syncState == SBR_HEADER) && 1697 (hSbrHeader->frameErrorFlag == 0))) { 1698 errorStatus = SBRDEC_OK; 1699 1700 decodeSbrData(hSbrHeader, hFrameDataLeft, &pSbrChannel[0]->prevFrameData, 1701 (stereo) ? hFrameDataRight : NULL, 1702 (stereo) ? &pSbrChannel[1]->prevFrameData : NULL); 1703 1704 /* Now we have a full parameter set and can do parameter 1705 based concealment instead of plain upsampling. */ 1706 hSbrHeader->syncState = SBR_ACTIVE; 1707 } 1708 1709 if (timeDataSize < 1710 hSbrHeader->numberTimeSlots * hSbrHeader->timeStep * 1711 self->pQmfDomain->globalConf.nBandsSynthesis * 1712 (psPossible ? fMax(2, numInChannels) : numInChannels)) { 1713 return SBRDEC_OUTPUT_BUFFER_TOO_SMALL; 1714 } 1715 1716 { 1717 self->flags &= ~SBRDEC_PS_DECODED; 1718 C_ALLOC_SCRATCH_START(pPsScratch, struct PS_DEC_COEFFICIENTS, 1) 1719 1720 /* decode PS data if available */ 1721 if (h_ps_d != NULL && psPossible && (hSbrHeader->syncState == SBR_ACTIVE)) { 1722 int applyPs = 1; 1723 1724 /* define which frame delay line slot to process */ 1725 h_ps_d->processSlot = hSbrElement->useFrameSlot; 1726 1727 applyPs = DecodePs(h_ps_d, hSbrHeader->frameErrorFlag, pPsScratch); 1728 self->flags |= (applyPs) ? SBRDEC_PS_DECODED : 0; 1729 } 1730 1731 offset0 = FDK_chMapDescr_getMapValue(mapDescr, channelIndex, mapIdx); 1732 offset0_block = offset0 * codecFrameSize; 1733 if (stereo || psPossible) { 1734 /* the value of offset1 only matters if the condition is true, however if 1735 it is not true channelIndex+1 may exceed the channel map resutling in an 1736 error, though the value of offset1 is actually meaningless. This is 1737 prevented here. */ 1738 offset1 = FDK_chMapDescr_getMapValue(mapDescr, channelIndex + 1, mapIdx); 1739 offset1_block = offset1 * codecFrameSize; 1740 } 1741 /* Set strides for reading and writing */ 1742 if (psPossible) 1743 strideOut = (numInChannels < 2) ? 2 : numInChannels; 1744 else 1745 strideOut = numInChannels; 1746 1747 /* use same buffers for left and right channel and apply PS per timeslot */ 1748 /* Process left channel */ 1749 sbr_dec(&pSbrChannel[0]->SbrDec, input + offset0_block, timeData + offset0, 1750 (self->flags & SBRDEC_PS_DECODED) ? &pSbrChannel[1]->SbrDec : NULL, 1751 timeData + offset1, strideOut, hSbrHeader, hFrameDataLeft, 1752 &pSbrChannel[0]->prevFrameData, 1753 (hSbrHeader->syncState == SBR_ACTIVE), h_ps_d, self->flags, 1754 codecFrameSize); 1755 1756 if (stereo) { 1757 /* Process right channel */ 1758 sbr_dec(&pSbrChannel[1]->SbrDec, input + offset1_block, 1759 timeData + offset1, NULL, NULL, strideOut, hSbrHeader, 1760 hFrameDataRight, &pSbrChannel[1]->prevFrameData, 1761 (hSbrHeader->syncState == SBR_ACTIVE), NULL, self->flags, 1762 codecFrameSize); 1763 } 1764 1765 C_ALLOC_SCRATCH_END(pPsScratch, struct PS_DEC_COEFFICIENTS, 1) 1766 } 1767 1768 if (h_ps_d != NULL) { 1769 /* save PS status for next run */ 1770 h_ps_d->psDecodedPrv = (self->flags & SBRDEC_PS_DECODED) ? 1 : 0; 1771 } 1772 1773 if (psPossible && !(self->flags & SBRDEC_SKIP_QMF_SYN)) { 1774 FDK_ASSERT(strideOut > 1); 1775 if (!(self->flags & SBRDEC_PS_DECODED)) { 1776 /* A decoder which is able to decode PS has to produce a stereo output 1777 * even if no PS data is available. */ 1778 /* So copy left channel to right channel. */ 1779 int copyFrameSize = 1780 codecFrameSize * self->pQmfDomain->QmfDomainOut->fb.no_channels; 1781 copyFrameSize /= self->pQmfDomain->QmfDomainIn->fb.no_channels; 1782 INT_PCM *ptr; 1783 INT i; 1784 FDK_ASSERT(strideOut == 2); 1785 1786 ptr = timeData; 1787 for (i = copyFrameSize >> 1; i--;) { 1788 INT_PCM tmp; /* This temporal variable is required because some 1789 compilers can't do *ptr++ = *ptr++ correctly. */ 1790 tmp = *ptr++; 1791 *ptr++ = tmp; 1792 tmp = *ptr++; 1793 *ptr++ = tmp; 1794 } 1795 } 1796 *numOutChannels = 2; /* Output minimum two channels when PS is enabled. */ 1797 } 1798 1799 return errorStatus; 1800 } 1801 1802 SBR_ERROR sbrDecoder_Apply(HANDLE_SBRDECODER self, INT_PCM *input, 1803 INT_PCM *timeData, const int timeDataSize, 1804 int *numChannels, int *sampleRate, 1805 const FDK_channelMapDescr *const mapDescr, 1806 const int mapIdx, const int coreDecodedOk, 1807 UCHAR *psDecoded) { 1808 SBR_ERROR errorStatus = SBRDEC_OK; 1809 1810 int psPossible; 1811 int sbrElementNum; 1812 int numCoreChannels; 1813 int numSbrChannels = 0; 1814 1815 if ((self == NULL) || (timeData == NULL) || (numChannels == NULL) || 1816 (sampleRate == NULL) || (psDecoded == NULL) || 1817 !FDK_chMapDescr_isValid(mapDescr)) { 1818 return SBRDEC_INVALID_ARGUMENT; 1819 } 1820 1821 psPossible = *psDecoded; 1822 numCoreChannels = *numChannels; 1823 if (numCoreChannels <= 0) { 1824 return SBRDEC_INVALID_ARGUMENT; 1825 } 1826 1827 if (self->numSbrElements < 1) { 1828 /* exit immediately to avoid access violations */ 1829 return SBRDEC_NOT_INITIALIZED; 1830 } 1831 1832 /* Sanity check of allocated SBR elements. */ 1833 for (sbrElementNum = 0; sbrElementNum < self->numSbrElements; 1834 sbrElementNum++) { 1835 if (self->pSbrElement[sbrElementNum] == NULL) { 1836 return SBRDEC_NOT_INITIALIZED; 1837 } 1838 } 1839 1840 if (self->numSbrElements != 1 || self->pSbrElement[0]->elementID != ID_SCE) { 1841 psPossible = 0; 1842 } 1843 1844 /* Make sure that even if no SBR data was found/parsed *psDecoded is returned 1845 * 1 if psPossible was 0. */ 1846 if (psPossible == 0) { 1847 self->flags &= ~SBRDEC_PS_DECODED; 1848 } 1849 1850 /* replaces channel based reset inside sbr_dec() */ 1851 if (((self->flags & SBRDEC_LOW_POWER) ? 1 : 0) != 1852 ((self->pQmfDomain->globalConf.flags & QMF_FLAG_LP) ? 1 : 0)) { 1853 if (self->flags & SBRDEC_LOW_POWER) { 1854 self->pQmfDomain->globalConf.flags |= QMF_FLAG_LP; 1855 self->pQmfDomain->globalConf.flags_requested |= QMF_FLAG_LP; 1856 } else { 1857 self->pQmfDomain->globalConf.flags &= ~QMF_FLAG_LP; 1858 self->pQmfDomain->globalConf.flags_requested &= ~QMF_FLAG_LP; 1859 } 1860 if (FDK_QmfDomain_InitFilterBank(self->pQmfDomain, QMF_FLAG_KEEP_STATES)) { 1861 return SBRDEC_UNSUPPORTED_CONFIG; 1862 } 1863 } 1864 if (self->numSbrChannels > self->pQmfDomain->globalConf.nInputChannels) { 1865 return SBRDEC_UNSUPPORTED_CONFIG; 1866 } 1867 1868 if (self->flags & SBRDEC_FLUSH) { 1869 /* flushing is signalized, hence increment the flush frame counter */ 1870 self->numFlushedFrames++; 1871 } else { 1872 /* no flushing is signalized, hence reset the flush frame counter */ 1873 self->numFlushedFrames = 0; 1874 } 1875 1876 /* Loop over SBR elements */ 1877 for (sbrElementNum = 0; sbrElementNum < self->numSbrElements; 1878 sbrElementNum++) { 1879 int numElementChan; 1880 1881 if (psPossible && 1882 self->pSbrElement[sbrElementNum]->pSbrChannel[1] == NULL) { 1883 /* Disable PS and try decoding SBR mono. */ 1884 psPossible = 0; 1885 } 1886 1887 numElementChan = 1888 (self->pSbrElement[sbrElementNum]->elementID == ID_CPE) ? 2 : 1; 1889 1890 /* If core signal is bad then force upsampling */ 1891 if (!coreDecodedOk) { 1892 setFrameErrorFlag(self->pSbrElement[sbrElementNum], FRAME_ERROR_ALLSLOTS); 1893 } 1894 1895 errorStatus = sbrDecoder_DecodeElement( 1896 self, input, timeData, timeDataSize, mapDescr, mapIdx, numSbrChannels, 1897 sbrElementNum, 1898 numCoreChannels, /* is correct even for USC SCI==2 case */ 1899 &numElementChan, psPossible); 1900 1901 if (errorStatus != SBRDEC_OK) { 1902 goto bail; 1903 } 1904 1905 numSbrChannels += numElementChan; 1906 1907 if (numSbrChannels >= numCoreChannels) { 1908 break; 1909 } 1910 } 1911 1912 /* Update numChannels and samplerate */ 1913 /* Do not mess with output channels in case of USAC. numSbrChannels != 1914 * numChannels for stereoConfigIndex == 2 */ 1915 if (!(self->flags & SBRDEC_SYNTAX_USAC)) { 1916 *numChannels = numSbrChannels; 1917 } 1918 *sampleRate = self->sampleRateOut; 1919 *psDecoded = (self->flags & SBRDEC_PS_DECODED) ? 1 : 0; 1920 1921 /* Clear reset and flush flag because everything seems to be done 1922 * successfully. */ 1923 self->flags &= ~SBRDEC_FORCE_RESET; 1924 self->flags &= ~SBRDEC_FLUSH; 1925 1926 bail: 1927 1928 return errorStatus; 1929 } 1930 1931 SBR_ERROR sbrDecoder_Close(HANDLE_SBRDECODER *pSelf) { 1932 HANDLE_SBRDECODER self = *pSelf; 1933 int i; 1934 1935 if (self != NULL) { 1936 if (self->hParametricStereoDec != NULL) { 1937 DeletePsDec(&self->hParametricStereoDec); 1938 } 1939 1940 for (i = 0; i < (8); i++) { 1941 sbrDecoder_DestroyElement(self, i); 1942 } 1943 1944 FreeRam_SbrDecoder(pSelf); 1945 } 1946 1947 return SBRDEC_OK; 1948 } 1949 1950 INT sbrDecoder_GetLibInfo(LIB_INFO *info) { 1951 int i; 1952 1953 if (info == NULL) { 1954 return -1; 1955 } 1956 1957 /* search for next free tab */ 1958 for (i = 0; i < FDK_MODULE_LAST; i++) { 1959 if (info[i].module_id == FDK_NONE) break; 1960 } 1961 if (i == FDK_MODULE_LAST) return -1; 1962 info += i; 1963 1964 info->module_id = FDK_SBRDEC; 1965 info->version = 1966 LIB_VERSION(SBRDECODER_LIB_VL0, SBRDECODER_LIB_VL1, SBRDECODER_LIB_VL2); 1967 LIB_VERSION_STRING(info); 1968 info->build_date = SBRDECODER_LIB_BUILD_DATE; 1969 info->build_time = SBRDECODER_LIB_BUILD_TIME; 1970 info->title = SBRDECODER_LIB_TITLE; 1971 1972 /* Set flags */ 1973 info->flags = 0 | CAPF_SBR_HQ | CAPF_SBR_LP | CAPF_SBR_PS_MPEG | 1974 CAPF_SBR_DRM_BS | CAPF_SBR_CONCEALMENT | CAPF_SBR_DRC | 1975 CAPF_SBR_ELD_DOWNSCALE | CAPF_SBR_HBEHQ; 1976 /* End of flags */ 1977 1978 return 0; 1979 } 1980 1981 UINT sbrDecoder_GetDelay(const HANDLE_SBRDECODER self) { 1982 UINT outputDelay = 0; 1983 1984 if (self != NULL) { 1985 UINT flags = self->flags; 1986 1987 /* See chapter 1.6.7.2 of ISO/IEC 14496-3 for the GA-SBR figures below. */ 1988 1989 /* Are we initialized? */ 1990 if ((self->numSbrChannels > 0) && (self->numSbrElements > 0)) { 1991 /* Add QMF synthesis delay */ 1992 if ((flags & SBRDEC_ELD_GRID) && IS_LOWDELAY(self->coreCodec)) { 1993 /* Low delay SBR: */ 1994 if (!(flags & SBRDEC_SKIP_QMF_SYN)) { 1995 outputDelay += 1996 (flags & SBRDEC_DOWNSAMPLE) ? 32 : 64; /* QMF synthesis */ 1997 if (flags & SBRDEC_LD_MPS_QMF) { 1998 outputDelay += 32; 1999 } 2000 } 2001 } else if (!IS_USAC(self->coreCodec)) { 2002 /* By the method of elimination this is the GA (AAC-LC, HE-AAC, ...) 2003 * branch: */ 2004 outputDelay += (flags & SBRDEC_DOWNSAMPLE) ? 481 : 962; 2005 if (flags & SBRDEC_SKIP_QMF_SYN) { 2006 outputDelay -= 257; /* QMF synthesis */ 2007 } 2008 } 2009 } 2010 } 2011 2012 return (outputDelay); 2013 } 2014