1 /* ----------------------------------------------------------------------------- 2 Software License for The Fraunhofer FDK AAC Codec Library for Android 3 4 Copyright 1995 - 2019 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 } else { 875 hSbrHeader->syncState = SBR_NOT_INITIALIZED; 876 hSbrHeader->status = HEADER_ERROR; 877 } 878 } 879 } 880 } 881 bail: 882 if (configMode & AC_CM_DET_CFG_CHANGE) { 883 self->flags = flagsSaved; /* restore */ 884 } 885 return sbrError; 886 } 887 888 SBR_ERROR sbrDecoder_SetParam(HANDLE_SBRDECODER self, const SBRDEC_PARAM param, 889 const INT value) { 890 SBR_ERROR errorStatus = SBRDEC_OK; 891 892 /* configure the subsystems */ 893 switch (param) { 894 case SBR_SYSTEM_BITSTREAM_DELAY: 895 if (value < 0 || value > (1)) { 896 errorStatus = SBRDEC_SET_PARAM_FAIL; 897 break; 898 } 899 if (self == NULL) { 900 errorStatus = SBRDEC_NOT_INITIALIZED; 901 } else { 902 self->numDelayFrames = (UCHAR)value; 903 } 904 break; 905 case SBR_QMF_MODE: 906 if (self == NULL) { 907 errorStatus = SBRDEC_NOT_INITIALIZED; 908 } else { 909 if (value == 1) { 910 self->flags |= SBRDEC_LOW_POWER; 911 } else { 912 self->flags &= ~SBRDEC_LOW_POWER; 913 } 914 } 915 break; 916 case SBR_LD_QMF_TIME_ALIGN: 917 if (self == NULL) { 918 errorStatus = SBRDEC_NOT_INITIALIZED; 919 } else { 920 if (value == 1) { 921 self->flags |= SBRDEC_LD_MPS_QMF; 922 } else { 923 self->flags &= ~SBRDEC_LD_MPS_QMF; 924 } 925 } 926 break; 927 case SBR_FLUSH_DATA: 928 if (value != 0) { 929 if (self == NULL) { 930 errorStatus = SBRDEC_NOT_INITIALIZED; 931 } else { 932 self->flags |= SBRDEC_FLUSH; 933 } 934 } 935 break; 936 case SBR_CLEAR_HISTORY: 937 if (value != 0) { 938 if (self == NULL) { 939 errorStatus = SBRDEC_NOT_INITIALIZED; 940 } else { 941 self->flags |= SBRDEC_FORCE_RESET; 942 } 943 } 944 break; 945 case SBR_BS_INTERRUPTION: { 946 int elementIndex; 947 948 if (self == NULL) { 949 errorStatus = SBRDEC_NOT_INITIALIZED; 950 break; 951 } 952 953 /* Loop over SBR elements */ 954 for (elementIndex = 0; elementIndex < self->numSbrElements; 955 elementIndex++) { 956 if (self->pSbrElement[elementIndex] != NULL) { 957 HANDLE_SBR_HEADER_DATA hSbrHeader; 958 int headerIndex = 959 getHeaderSlot(self->pSbrElement[elementIndex]->useFrameSlot, 960 self->pSbrElement[elementIndex]->useHeaderSlot); 961 962 hSbrHeader = &(self->sbrHeader[elementIndex][headerIndex]); 963 964 /* Set sync state UPSAMPLING for the corresponding slot. 965 This switches off bitstream parsing until a new header arrives. */ 966 hSbrHeader->syncState = UPSAMPLING; 967 hSbrHeader->status |= SBRDEC_HDR_STAT_UPDATE; 968 } 969 } 970 } break; 971 972 case SBR_SKIP_QMF: 973 if (self == NULL) { 974 errorStatus = SBRDEC_NOT_INITIALIZED; 975 } else { 976 if (value == 1) { 977 self->flags |= SBRDEC_SKIP_QMF_ANA; 978 } else { 979 self->flags &= ~SBRDEC_SKIP_QMF_ANA; 980 } 981 if (value == 2) { 982 self->flags |= SBRDEC_SKIP_QMF_SYN; 983 } else { 984 self->flags &= ~SBRDEC_SKIP_QMF_SYN; 985 } 986 } 987 break; 988 default: 989 errorStatus = SBRDEC_SET_PARAM_FAIL; 990 break; 991 } /* switch(param) */ 992 993 return (errorStatus); 994 } 995 996 static SBRDEC_DRC_CHANNEL *sbrDecoder_drcGetChannel( 997 const HANDLE_SBRDECODER self, const INT channel) { 998 SBRDEC_DRC_CHANNEL *pSbrDrcChannelData = NULL; 999 int elementIndex, elChanIdx = 0, numCh = 0; 1000 1001 for (elementIndex = 0; (elementIndex < (8)) && (numCh <= channel); 1002 elementIndex++) { 1003 SBR_DECODER_ELEMENT *pSbrElement = self->pSbrElement[elementIndex]; 1004 int c, elChannels; 1005 1006 elChanIdx = 0; 1007 if (pSbrElement == NULL) break; 1008 1009 /* Determine amount of channels for this element */ 1010 switch (pSbrElement->elementID) { 1011 case ID_CPE: 1012 elChannels = 2; 1013 break; 1014 case ID_LFE: 1015 case ID_SCE: 1016 elChannels = 1; 1017 break; 1018 case ID_NONE: 1019 default: 1020 elChannels = 0; 1021 break; 1022 } 1023 1024 /* Limit with actual allocated element channels */ 1025 elChannels = fMin(elChannels, pSbrElement->nChannels); 1026 1027 for (c = 0; (c < elChannels) && (numCh <= channel); c++) { 1028 if (pSbrElement->pSbrChannel[elChanIdx] != NULL) { 1029 numCh++; 1030 elChanIdx++; 1031 } 1032 } 1033 } 1034 elementIndex -= 1; 1035 elChanIdx -= 1; 1036 1037 if (elChanIdx < 0 || elementIndex < 0) { 1038 return NULL; 1039 } 1040 1041 if (self->pSbrElement[elementIndex] != NULL) { 1042 if (self->pSbrElement[elementIndex]->pSbrChannel[elChanIdx] != NULL) { 1043 pSbrDrcChannelData = &self->pSbrElement[elementIndex] 1044 ->pSbrChannel[elChanIdx] 1045 ->SbrDec.sbrDrcChannel; 1046 } 1047 } 1048 1049 return (pSbrDrcChannelData); 1050 } 1051 1052 SBR_ERROR sbrDecoder_drcFeedChannel(HANDLE_SBRDECODER self, INT ch, 1053 UINT numBands, FIXP_DBL *pNextFact_mag, 1054 INT nextFact_exp, 1055 SHORT drcInterpolationScheme, 1056 UCHAR winSequence, USHORT *pBandTop) { 1057 SBRDEC_DRC_CHANNEL *pSbrDrcChannelData = NULL; 1058 int band, isValidData = 0; 1059 1060 if (self == NULL) { 1061 return SBRDEC_NOT_INITIALIZED; 1062 } 1063 if (ch > (8) || pNextFact_mag == NULL) { 1064 return SBRDEC_SET_PARAM_FAIL; 1065 } 1066 1067 /* Search for gain values different to 1.0f */ 1068 for (band = 0; band < (int)numBands; band += 1) { 1069 if (!((pNextFact_mag[band] == FL2FXCONST_DBL(0.5)) && 1070 (nextFact_exp == 1)) && 1071 !((pNextFact_mag[band] == (FIXP_DBL)MAXVAL_DBL) && 1072 (nextFact_exp == 0))) { 1073 isValidData = 1; 1074 break; 1075 } 1076 } 1077 1078 /* Find the right SBR channel */ 1079 pSbrDrcChannelData = sbrDecoder_drcGetChannel(self, ch); 1080 1081 if (pSbrDrcChannelData != NULL) { 1082 if (pSbrDrcChannelData->enable || 1083 isValidData) { /* Activate processing only with real and valid data */ 1084 int i; 1085 1086 pSbrDrcChannelData->enable = 1; 1087 pSbrDrcChannelData->numBandsNext = numBands; 1088 1089 pSbrDrcChannelData->winSequenceNext = winSequence; 1090 pSbrDrcChannelData->drcInterpolationSchemeNext = drcInterpolationScheme; 1091 pSbrDrcChannelData->nextFact_exp = nextFact_exp; 1092 1093 for (i = 0; i < (int)numBands; i++) { 1094 pSbrDrcChannelData->bandTopNext[i] = pBandTop[i]; 1095 pSbrDrcChannelData->nextFact_mag[i] = pNextFact_mag[i]; 1096 } 1097 } 1098 } 1099 1100 return SBRDEC_OK; 1101 } 1102 1103 void sbrDecoder_drcDisable(HANDLE_SBRDECODER self, INT ch) { 1104 SBRDEC_DRC_CHANNEL *pSbrDrcChannelData = NULL; 1105 1106 if ((self == NULL) || (ch > (8)) || (self->numSbrElements == 0) || 1107 (self->numSbrChannels == 0)) { 1108 return; 1109 } 1110 1111 /* Find the right SBR channel */ 1112 pSbrDrcChannelData = sbrDecoder_drcGetChannel(self, ch); 1113 1114 if (pSbrDrcChannelData != NULL) { 1115 sbrDecoder_drcInitChannel(pSbrDrcChannelData); 1116 } 1117 } 1118 1119 SBR_ERROR sbrDecoder_Parse(HANDLE_SBRDECODER self, HANDLE_FDK_BITSTREAM hBs, 1120 UCHAR *pDrmBsBuffer, USHORT drmBsBufferSize, 1121 int *count, int bsPayLen, int crcFlag, 1122 MP4_ELEMENT_ID prevElement, int elementIndex, 1123 UINT acFlags, UINT acElFlags[]) { 1124 SBR_DECODER_ELEMENT *hSbrElement = NULL; 1125 HANDLE_SBR_HEADER_DATA hSbrHeader = NULL; 1126 HANDLE_SBR_CHANNEL *pSbrChannel; 1127 1128 SBR_FRAME_DATA *hFrameDataLeft = NULL; 1129 SBR_FRAME_DATA *hFrameDataRight = NULL; 1130 SBR_FRAME_DATA frameDataLeftCopy; 1131 SBR_FRAME_DATA frameDataRightCopy; 1132 1133 SBR_ERROR errorStatus = SBRDEC_OK; 1134 SBR_HEADER_STATUS headerStatus = HEADER_NOT_PRESENT; 1135 1136 INT startPos = FDKgetValidBits(hBs); 1137 INT CRCLen = 0; 1138 HANDLE_FDK_BITSTREAM hBsOriginal = hBs; 1139 FDK_BITSTREAM bsBwd; 1140 1141 FDK_CRCINFO crcInfo; 1142 INT crcReg = 0; 1143 USHORT drmSbrCrc = 0; 1144 const int fGlobalIndependencyFlag = acFlags & AC_INDEP; 1145 const int bs_pvc = acElFlags[elementIndex] & AC_EL_USAC_PVC; 1146 const int bs_interTes = acElFlags[elementIndex] & AC_EL_USAC_ITES; 1147 int stereo; 1148 int fDoDecodeSbrData = 1; 1149 1150 int lastSlot, lastHdrSlot = 0, thisHdrSlot = 0; 1151 1152 if (*count <= 0) { 1153 setFrameErrorFlag(self->pSbrElement[elementIndex], FRAME_ERROR); 1154 return SBRDEC_OK; 1155 } 1156 1157 /* SBR sanity checks */ 1158 if (self == NULL) { 1159 errorStatus = SBRDEC_NOT_INITIALIZED; 1160 goto bail; 1161 } 1162 1163 /* Reverse bits of DRM SBR payload */ 1164 if ((self->flags & SBRDEC_SYNTAX_DRM) && *count > 0) { 1165 int dataBytes, dataBits; 1166 1167 FDK_ASSERT(drmBsBufferSize >= (512)); 1168 dataBits = *count; 1169 1170 if (dataBits > ((512) * 8)) { 1171 /* do not flip more data than needed */ 1172 dataBits = (512) * 8; 1173 } 1174 1175 dataBytes = (dataBits + 7) >> 3; 1176 1177 int j; 1178 1179 if ((j = (int)FDKgetValidBits(hBs)) != 8) { 1180 FDKpushBiDirectional(hBs, (j - 8)); 1181 } 1182 1183 j = 0; 1184 for (; dataBytes > 0; dataBytes--) { 1185 int i; 1186 UCHAR tmpByte; 1187 UCHAR buffer = 0x00; 1188 1189 tmpByte = (UCHAR)FDKreadBits(hBs, 8); 1190 for (i = 0; i < 4; i++) { 1191 int shift = 2 * i + 1; 1192 buffer |= (tmpByte & (0x08 >> i)) << shift; 1193 buffer |= (tmpByte & (0x10 << i)) >> shift; 1194 } 1195 pDrmBsBuffer[j++] = buffer; 1196 FDKpushBack(hBs, 16); 1197 } 1198 1199 FDKinitBitStream(&bsBwd, pDrmBsBuffer, (512), dataBits, BS_READER); 1200 1201 /* Use reversed data */ 1202 hBs = &bsBwd; 1203 bsPayLen = *count; 1204 } 1205 1206 /* Remember start position of SBR element */ 1207 startPos = FDKgetValidBits(hBs); 1208 1209 /* SBR sanity checks */ 1210 if (self->pSbrElement[elementIndex] == NULL) { 1211 errorStatus = SBRDEC_NOT_INITIALIZED; 1212 goto bail; 1213 } 1214 hSbrElement = self->pSbrElement[elementIndex]; 1215 1216 lastSlot = (hSbrElement->useFrameSlot > 0) ? hSbrElement->useFrameSlot - 1 1217 : self->numDelayFrames; 1218 lastHdrSlot = hSbrElement->useHeaderSlot[lastSlot]; 1219 thisHdrSlot = getHeaderSlot( 1220 hSbrElement->useFrameSlot, 1221 hSbrElement->useHeaderSlot); /* Get a free header slot not used by 1222 frames not processed yet. */ 1223 1224 /* Assign the free slot to store a new header if there is one. */ 1225 hSbrHeader = &self->sbrHeader[elementIndex][thisHdrSlot]; 1226 1227 pSbrChannel = hSbrElement->pSbrChannel; 1228 stereo = (hSbrElement->elementID == ID_CPE) ? 1 : 0; 1229 1230 hFrameDataLeft = &self->pSbrElement[elementIndex] 1231 ->pSbrChannel[0] 1232 ->frameData[hSbrElement->useFrameSlot]; 1233 if (stereo) { 1234 hFrameDataRight = &self->pSbrElement[elementIndex] 1235 ->pSbrChannel[1] 1236 ->frameData[hSbrElement->useFrameSlot]; 1237 } 1238 1239 /* store frameData; new parsed frameData possibly corrupted */ 1240 FDKmemcpy(&frameDataLeftCopy, hFrameDataLeft, sizeof(SBR_FRAME_DATA)); 1241 if (stereo) { 1242 FDKmemcpy(&frameDataRightCopy, hFrameDataRight, sizeof(SBR_FRAME_DATA)); 1243 } 1244 1245 /* reset PS flag; will be set after PS was found */ 1246 self->flags &= ~SBRDEC_PS_DECODED; 1247 1248 if (hSbrHeader->status & SBRDEC_HDR_STAT_UPDATE) { 1249 /* Got a new header from extern (e.g. from an ASC) */ 1250 headerStatus = HEADER_OK; 1251 hSbrHeader->status &= ~SBRDEC_HDR_STAT_UPDATE; 1252 } else if (thisHdrSlot != lastHdrSlot) { 1253 /* Copy the last header into this slot otherwise the 1254 header compare will trigger more HEADER_RESETs than needed. */ 1255 copySbrHeader(hSbrHeader, &self->sbrHeader[elementIndex][lastHdrSlot]); 1256 } 1257 1258 /* 1259 Check if bit stream data is valid and matches the element context 1260 */ 1261 if (((prevElement != ID_SCE) && (prevElement != ID_CPE)) || 1262 prevElement != hSbrElement->elementID) { 1263 /* In case of LFE we also land here, since there is no LFE SBR element (do 1264 * upsampling only) */ 1265 fDoDecodeSbrData = 0; 1266 } 1267 1268 if (fDoDecodeSbrData) { 1269 if ((INT)FDKgetValidBits(hBs) <= 0) { 1270 fDoDecodeSbrData = 0; 1271 } 1272 } 1273 1274 /* 1275 SBR CRC-check 1276 */ 1277 if (fDoDecodeSbrData) { 1278 if (crcFlag) { 1279 switch (self->coreCodec) { 1280 case AOT_ER_AAC_ELD: 1281 FDKpushFor(hBs, 10); 1282 /* check sbrcrc later: we don't know the payload length now */ 1283 break; 1284 case AOT_DRM_AAC: 1285 case AOT_DRM_SURROUND: 1286 drmSbrCrc = (USHORT)FDKreadBits(hBs, 8); 1287 /* Setup CRC decoder */ 1288 FDKcrcInit(&crcInfo, 0x001d, 0xFFFF, 8); 1289 /* Start CRC region */ 1290 crcReg = FDKcrcStartReg(&crcInfo, hBs, 0); 1291 break; 1292 default: 1293 CRCLen = bsPayLen - 10; /* change: 0 => i */ 1294 if (CRCLen < 0) { 1295 fDoDecodeSbrData = 0; 1296 } else { 1297 fDoDecodeSbrData = SbrCrcCheck(hBs, CRCLen); 1298 } 1299 break; 1300 } 1301 } 1302 } /* if (fDoDecodeSbrData) */ 1303 1304 /* 1305 Read in the header data and issue a reset if change occured 1306 */ 1307 if (fDoDecodeSbrData) { 1308 int sbrHeaderPresent; 1309 1310 if (self->flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC)) { 1311 SBR_HEADER_DATA_BS_INFO newSbrInfo; 1312 int sbrInfoPresent; 1313 1314 if (bs_interTes) { 1315 self->flags |= SBRDEC_USAC_ITES; 1316 } else { 1317 self->flags &= ~SBRDEC_USAC_ITES; 1318 } 1319 1320 if (fGlobalIndependencyFlag) { 1321 self->flags |= SBRDEC_USAC_INDEP; 1322 sbrInfoPresent = 1; 1323 sbrHeaderPresent = 1; 1324 } else { 1325 self->flags &= ~SBRDEC_USAC_INDEP; 1326 sbrInfoPresent = FDKreadBit(hBs); 1327 if (sbrInfoPresent) { 1328 sbrHeaderPresent = FDKreadBit(hBs); 1329 } else { 1330 sbrHeaderPresent = 0; 1331 } 1332 } 1333 1334 if (sbrInfoPresent) { 1335 newSbrInfo.ampResolution = FDKreadBit(hBs); 1336 newSbrInfo.xover_band = FDKreadBits(hBs, 4); 1337 newSbrInfo.sbr_preprocessing = FDKreadBit(hBs); 1338 if (bs_pvc) { 1339 newSbrInfo.pvc_mode = FDKreadBits(hBs, 2); 1340 /* bs_pvc_mode: 0 -> no PVC, 1 -> PVC mode 1, 2 -> PVC mode 2, 3 -> 1341 * reserved */ 1342 if (newSbrInfo.pvc_mode > 2) { 1343 headerStatus = HEADER_ERROR; 1344 } 1345 if (stereo && newSbrInfo.pvc_mode > 0) { 1346 /* bs_pvc is always transmitted but pvc_mode is set to zero in case 1347 * of stereo SBR. The config might be wrong but we cannot tell for 1348 * sure. */ 1349 newSbrInfo.pvc_mode = 0; 1350 } 1351 } else { 1352 newSbrInfo.pvc_mode = 0; 1353 } 1354 if (headerStatus != HEADER_ERROR) { 1355 if (FDKmemcmp(&hSbrHeader->bs_info, &newSbrInfo, 1356 sizeof(SBR_HEADER_DATA_BS_INFO))) { 1357 /* in case of ampResolution and preprocessing change no full reset 1358 * required */ 1359 /* HEADER reset would trigger HBE transposer reset which breaks 1360 * eSbr_3_Eaa.mp4 */ 1361 if ((hSbrHeader->bs_info.pvc_mode != newSbrInfo.pvc_mode) || 1362 (hSbrHeader->bs_info.xover_band != newSbrInfo.xover_band)) { 1363 headerStatus = HEADER_RESET; 1364 } else { 1365 headerStatus = HEADER_OK; 1366 } 1367 1368 hSbrHeader->bs_info = newSbrInfo; 1369 } else { 1370 headerStatus = HEADER_OK; 1371 } 1372 } 1373 } 1374 if (headerStatus == HEADER_ERROR) { 1375 /* Corrupt SBR info data, do not decode and switch to UPSAMPLING */ 1376 hSbrHeader->syncState = UPSAMPLING; 1377 fDoDecodeSbrData = 0; 1378 sbrHeaderPresent = 0; 1379 } 1380 1381 if (sbrHeaderPresent && fDoDecodeSbrData) { 1382 int useDfltHeader; 1383 1384 useDfltHeader = FDKreadBit(hBs); 1385 1386 if (useDfltHeader) { 1387 sbrHeaderPresent = 0; 1388 if (FDKmemcmp(&hSbrHeader->bs_data, &hSbrHeader->bs_dflt, 1389 sizeof(SBR_HEADER_DATA_BS)) || 1390 hSbrHeader->syncState != SBR_ACTIVE) { 1391 hSbrHeader->bs_data = hSbrHeader->bs_dflt; 1392 headerStatus = HEADER_RESET; 1393 } 1394 } 1395 } 1396 } else { 1397 sbrHeaderPresent = FDKreadBit(hBs); 1398 } 1399 1400 if (sbrHeaderPresent) { 1401 headerStatus = sbrGetHeaderData(hSbrHeader, hBs, self->flags, 1, 0); 1402 } 1403 1404 if (headerStatus == HEADER_RESET) { 1405 errorStatus = sbrDecoder_HeaderUpdate( 1406 self, hSbrHeader, headerStatus, pSbrChannel, hSbrElement->nChannels); 1407 1408 if (errorStatus == SBRDEC_OK) { 1409 hSbrHeader->syncState = SBR_HEADER; 1410 } else { 1411 hSbrHeader->syncState = SBR_NOT_INITIALIZED; 1412 headerStatus = HEADER_ERROR; 1413 } 1414 } 1415 1416 if (errorStatus != SBRDEC_OK) { 1417 fDoDecodeSbrData = 0; 1418 } 1419 } /* if (fDoDecodeSbrData) */ 1420 1421 /* 1422 Print debugging output only if state has changed 1423 */ 1424 1425 /* read frame data */ 1426 if ((hSbrHeader->syncState >= SBR_HEADER) && fDoDecodeSbrData) { 1427 int sbrFrameOk; 1428 /* read the SBR element data */ 1429 if (!stereo && (self->hParametricStereoDec != NULL)) { 1430 /* update slot index for PS bitstream parsing */ 1431 self->hParametricStereoDec->bsLastSlot = 1432 self->hParametricStereoDec->bsReadSlot; 1433 self->hParametricStereoDec->bsReadSlot = hSbrElement->useFrameSlot; 1434 } 1435 sbrFrameOk = sbrGetChannelElement( 1436 hSbrHeader, hFrameDataLeft, (stereo) ? hFrameDataRight : NULL, 1437 &pSbrChannel[0]->prevFrameData, 1438 pSbrChannel[0]->SbrDec.PvcStaticData.pvc_mode_last, hBs, 1439 (stereo) ? NULL : self->hParametricStereoDec, self->flags, 1440 self->pSbrElement[elementIndex]->transposerSettings.overlap); 1441 1442 if (!sbrFrameOk) { 1443 fDoDecodeSbrData = 0; 1444 } else { 1445 INT valBits; 1446 1447 if (bsPayLen > 0) { 1448 valBits = bsPayLen - ((INT)startPos - (INT)FDKgetValidBits(hBs)); 1449 } else { 1450 valBits = (INT)FDKgetValidBits(hBs); 1451 } 1452 1453 if (crcFlag) { 1454 switch (self->coreCodec) { 1455 case AOT_ER_AAC_ELD: { 1456 /* late crc check for eld */ 1457 INT payloadbits = 1458 (INT)startPos - (INT)FDKgetValidBits(hBs) - startPos; 1459 INT crcLen = payloadbits - 10; 1460 FDKpushBack(hBs, payloadbits); 1461 fDoDecodeSbrData = SbrCrcCheck(hBs, crcLen); 1462 FDKpushFor(hBs, crcLen); 1463 } break; 1464 case AOT_DRM_AAC: 1465 case AOT_DRM_SURROUND: 1466 /* End CRC region */ 1467 FDKcrcEndReg(&crcInfo, hBs, crcReg); 1468 /* Check CRC */ 1469 if ((FDKcrcGetCRC(&crcInfo) ^ 0xFF) != drmSbrCrc) { 1470 fDoDecodeSbrData = 0; 1471 if (headerStatus != HEADER_NOT_PRESENT) { 1472 headerStatus = HEADER_ERROR; 1473 hSbrHeader->syncState = SBR_NOT_INITIALIZED; 1474 } 1475 } 1476 break; 1477 default: 1478 break; 1479 } 1480 } 1481 1482 /* sanity check of remaining bits */ 1483 if (valBits < 0) { 1484 fDoDecodeSbrData = 0; 1485 } else { 1486 switch (self->coreCodec) { 1487 case AOT_SBR: 1488 case AOT_PS: 1489 case AOT_AAC_LC: { 1490 /* This sanity check is only meaningful with General Audio 1491 * bitstreams */ 1492 int alignBits = valBits & 0x7; 1493 1494 if (valBits > alignBits) { 1495 fDoDecodeSbrData = 0; 1496 } 1497 } break; 1498 default: 1499 /* No sanity check available */ 1500 break; 1501 } 1502 } 1503 } 1504 } else { 1505 /* The returned bit count will not be the actual payload size since we did 1506 not parse the frame data. Return an error so that the caller can react 1507 respectively. */ 1508 errorStatus = SBRDEC_PARSE_ERROR; 1509 } 1510 1511 if (!fDoDecodeSbrData) { 1512 /* Set error flag for this slot to trigger concealment */ 1513 setFrameErrorFlag(self->pSbrElement[elementIndex], FRAME_ERROR); 1514 /* restore old frameData for concealment */ 1515 FDKmemcpy(hFrameDataLeft, &frameDataLeftCopy, sizeof(SBR_FRAME_DATA)); 1516 if (stereo) { 1517 FDKmemcpy(hFrameDataRight, &frameDataRightCopy, sizeof(SBR_FRAME_DATA)); 1518 } 1519 errorStatus = SBRDEC_PARSE_ERROR; 1520 } else { 1521 /* Everything seems to be ok so clear the error flag */ 1522 setFrameErrorFlag(self->pSbrElement[elementIndex], FRAME_OK); 1523 } 1524 1525 if (!stereo) { 1526 /* Turn coupling off explicitely to avoid access to absent right frame data 1527 that might occur with corrupt bitstreams. */ 1528 hFrameDataLeft->coupling = COUPLING_OFF; 1529 } 1530 1531 bail: 1532 1533 if (self != NULL) { 1534 if (self->flags & SBRDEC_SYNTAX_DRM) { 1535 hBs = hBsOriginal; 1536 } 1537 1538 if (errorStatus != SBRDEC_NOT_INITIALIZED) { 1539 int useOldHdr = 1540 ((headerStatus == HEADER_NOT_PRESENT) || 1541 (headerStatus == HEADER_ERROR) || 1542 (headerStatus == HEADER_RESET && errorStatus == SBRDEC_PARSE_ERROR)) 1543 ? 1 1544 : 0; 1545 1546 if (!useOldHdr && (thisHdrSlot != lastHdrSlot) && (hSbrHeader != NULL)) { 1547 useOldHdr |= 1548 (compareSbrHeader(hSbrHeader, 1549 &self->sbrHeader[elementIndex][lastHdrSlot]) == 0) 1550 ? 1 1551 : 0; 1552 } 1553 1554 if (hSbrElement != NULL) { 1555 if (useOldHdr != 0) { 1556 /* Use the old header for this frame */ 1557 hSbrElement->useHeaderSlot[hSbrElement->useFrameSlot] = lastHdrSlot; 1558 } else { 1559 /* Use the new header for this frame */ 1560 hSbrElement->useHeaderSlot[hSbrElement->useFrameSlot] = thisHdrSlot; 1561 } 1562 1563 /* Move frame pointer to the next slot which is up to be decoded/applied 1564 * next */ 1565 hSbrElement->useFrameSlot = 1566 (hSbrElement->useFrameSlot + 1) % (self->numDelayFrames + 1); 1567 } 1568 } 1569 } 1570 1571 *count -= startPos - (INT)FDKgetValidBits(hBs); 1572 1573 return errorStatus; 1574 } 1575 1576 /** 1577 * \brief Render one SBR element into time domain signal. 1578 * \param self SBR decoder handle 1579 * \param timeData pointer to output buffer 1580 * \param channelMapping pointer to UCHAR array where next 2 channel offsets are 1581 * stored. 1582 * \param elementIndex enumerating index of the SBR element to render. 1583 * \param numInChannels number of channels from core coder. 1584 * \param numOutChannels pointer to a location to return number of output 1585 * channels. 1586 * \param psPossible flag indicating if PS is possible or not. 1587 * \return SBRDEC_OK if successfull, else error code 1588 */ 1589 static SBR_ERROR sbrDecoder_DecodeElement( 1590 HANDLE_SBRDECODER self, QDOM_PCM *input, INT_PCM *timeData, 1591 const int timeDataSize, const FDK_channelMapDescr *const mapDescr, 1592 const int mapIdx, int channelIndex, const int elementIndex, 1593 const int numInChannels, int *numOutChannels, const int psPossible) { 1594 SBR_DECODER_ELEMENT *hSbrElement = self->pSbrElement[elementIndex]; 1595 HANDLE_SBR_CHANNEL *pSbrChannel = 1596 self->pSbrElement[elementIndex]->pSbrChannel; 1597 HANDLE_SBR_HEADER_DATA hSbrHeader = 1598 &self->sbrHeader[elementIndex] 1599 [hSbrElement->useHeaderSlot[hSbrElement->useFrameSlot]]; 1600 HANDLE_PS_DEC h_ps_d = self->hParametricStereoDec; 1601 1602 /* get memory for frame data from scratch */ 1603 SBR_FRAME_DATA *hFrameDataLeft = NULL; 1604 SBR_FRAME_DATA *hFrameDataRight = NULL; 1605 1606 SBR_ERROR errorStatus = SBRDEC_OK; 1607 1608 INT strideOut, offset0 = 255, offset0_block = 0, offset1 = 255, 1609 offset1_block = 0; 1610 INT codecFrameSize = self->codecFrameSize; 1611 1612 int stereo = (hSbrElement->elementID == ID_CPE) ? 1 : 0; 1613 int numElementChannels = 1614 hSbrElement 1615 ->nChannels; /* Number of channels of the current SBR element */ 1616 1617 hFrameDataLeft = 1618 &hSbrElement->pSbrChannel[0]->frameData[hSbrElement->useFrameSlot]; 1619 if (stereo) { 1620 hFrameDataRight = 1621 &hSbrElement->pSbrChannel[1]->frameData[hSbrElement->useFrameSlot]; 1622 } 1623 1624 if (self->flags & SBRDEC_FLUSH) { 1625 if (self->numFlushedFrames > self->numDelayFrames) { 1626 int hdrIdx; 1627 /* No valid SBR payload available, hence switch to upsampling (in all 1628 * headers) */ 1629 for (hdrIdx = 0; hdrIdx < ((1) + 1); hdrIdx += 1) { 1630 self->sbrHeader[elementIndex][hdrIdx].syncState = UPSAMPLING; 1631 } 1632 } else { 1633 /* Move frame pointer to the next slot which is up to be decoded/applied 1634 * next */ 1635 hSbrElement->useFrameSlot = 1636 (hSbrElement->useFrameSlot + 1) % (self->numDelayFrames + 1); 1637 /* Update header and frame data pointer because they have already been set 1638 */ 1639 hSbrHeader = 1640 &self->sbrHeader[elementIndex] 1641 [hSbrElement 1642 ->useHeaderSlot[hSbrElement->useFrameSlot]]; 1643 hFrameDataLeft = 1644 &hSbrElement->pSbrChannel[0]->frameData[hSbrElement->useFrameSlot]; 1645 if (stereo) { 1646 hFrameDataRight = 1647 &hSbrElement->pSbrChannel[1]->frameData[hSbrElement->useFrameSlot]; 1648 } 1649 } 1650 } 1651 1652 /* Update the header error flag */ 1653 hSbrHeader->frameErrorFlag = 1654 hSbrElement->frameErrorFlag[hSbrElement->useFrameSlot]; 1655 1656 /* 1657 Prepare filterbank for upsampling if no valid bit stream data is available. 1658 */ 1659 if (hSbrHeader->syncState == SBR_NOT_INITIALIZED) { 1660 errorStatus = 1661 initHeaderData(hSbrHeader, self->sampleRateIn, self->sampleRateOut, 1662 self->downscaleFactor, codecFrameSize, self->flags, 1663 1 /* SET_DEFAULT_HDR */ 1664 ); 1665 1666 if (errorStatus != SBRDEC_OK) { 1667 return errorStatus; 1668 } 1669 1670 hSbrHeader->syncState = UPSAMPLING; 1671 1672 errorStatus = sbrDecoder_HeaderUpdate(self, hSbrHeader, HEADER_NOT_PRESENT, 1673 pSbrChannel, hSbrElement->nChannels); 1674 1675 if (errorStatus != SBRDEC_OK) { 1676 hSbrHeader->syncState = SBR_NOT_INITIALIZED; 1677 return errorStatus; 1678 } 1679 } 1680 1681 /* reset */ 1682 if (hSbrHeader->status & SBRDEC_HDR_STAT_RESET) { 1683 int ch; 1684 int applySbrProc = (hSbrHeader->syncState == SBR_ACTIVE || 1685 (hSbrHeader->frameErrorFlag == 0 && 1686 hSbrHeader->syncState == SBR_HEADER)); 1687 for (ch = 0; ch < numElementChannels; ch++) { 1688 SBR_ERROR errorStatusTmp = SBRDEC_OK; 1689 1690 errorStatusTmp = resetSbrDec( 1691 &pSbrChannel[ch]->SbrDec, hSbrHeader, &pSbrChannel[ch]->prevFrameData, 1692 self->synDownsampleFac, self->flags, pSbrChannel[ch]->frameData); 1693 1694 if (errorStatusTmp != SBRDEC_OK) { 1695 hSbrHeader->syncState = UPSAMPLING; 1696 } 1697 } 1698 if (applySbrProc) { 1699 hSbrHeader->status &= ~SBRDEC_HDR_STAT_RESET; 1700 } 1701 } 1702 1703 /* decoding */ 1704 if ((hSbrHeader->syncState == SBR_ACTIVE) || 1705 ((hSbrHeader->syncState == SBR_HEADER) && 1706 (hSbrHeader->frameErrorFlag == 0))) { 1707 errorStatus = SBRDEC_OK; 1708 1709 decodeSbrData(hSbrHeader, hFrameDataLeft, &pSbrChannel[0]->prevFrameData, 1710 (stereo) ? hFrameDataRight : NULL, 1711 (stereo) ? &pSbrChannel[1]->prevFrameData : NULL); 1712 1713 /* Now we have a full parameter set and can do parameter 1714 based concealment instead of plain upsampling. */ 1715 hSbrHeader->syncState = SBR_ACTIVE; 1716 } 1717 1718 if (timeDataSize < 1719 hSbrHeader->numberTimeSlots * hSbrHeader->timeStep * 1720 self->pQmfDomain->globalConf.nBandsSynthesis * 1721 (psPossible ? fMax(2, numInChannels) : numInChannels)) { 1722 return SBRDEC_OUTPUT_BUFFER_TOO_SMALL; 1723 } 1724 1725 { 1726 self->flags &= ~SBRDEC_PS_DECODED; 1727 C_ALLOC_SCRATCH_START(pPsScratch, struct PS_DEC_COEFFICIENTS, 1) 1728 1729 /* decode PS data if available */ 1730 if (h_ps_d != NULL && psPossible && (hSbrHeader->syncState == SBR_ACTIVE)) { 1731 int applyPs = 1; 1732 1733 /* define which frame delay line slot to process */ 1734 h_ps_d->processSlot = hSbrElement->useFrameSlot; 1735 1736 applyPs = DecodePs(h_ps_d, hSbrHeader->frameErrorFlag, pPsScratch); 1737 self->flags |= (applyPs) ? SBRDEC_PS_DECODED : 0; 1738 } 1739 1740 offset0 = FDK_chMapDescr_getMapValue(mapDescr, channelIndex, mapIdx); 1741 offset0_block = offset0 * codecFrameSize; 1742 if (stereo || psPossible) { 1743 /* the value of offset1 only matters if the condition is true, however if 1744 it is not true channelIndex+1 may exceed the channel map resutling in an 1745 error, though the value of offset1 is actually meaningless. This is 1746 prevented here. */ 1747 offset1 = FDK_chMapDescr_getMapValue(mapDescr, channelIndex + 1, mapIdx); 1748 offset1_block = offset1 * codecFrameSize; 1749 } 1750 /* Set strides for reading and writing */ 1751 if (psPossible) 1752 strideOut = (numInChannels < 2) ? 2 : numInChannels; 1753 else 1754 strideOut = numInChannels; 1755 1756 /* use same buffers for left and right channel and apply PS per timeslot */ 1757 /* Process left channel */ 1758 sbr_dec(&pSbrChannel[0]->SbrDec, input + offset0_block, timeData + offset0, 1759 (self->flags & SBRDEC_PS_DECODED) ? &pSbrChannel[1]->SbrDec : NULL, 1760 timeData + offset1, strideOut, hSbrHeader, hFrameDataLeft, 1761 &pSbrChannel[0]->prevFrameData, 1762 (hSbrHeader->syncState == SBR_ACTIVE), h_ps_d, self->flags, 1763 codecFrameSize); 1764 1765 if (stereo) { 1766 /* Process right channel */ 1767 sbr_dec(&pSbrChannel[1]->SbrDec, input + offset1_block, 1768 timeData + offset1, NULL, NULL, strideOut, hSbrHeader, 1769 hFrameDataRight, &pSbrChannel[1]->prevFrameData, 1770 (hSbrHeader->syncState == SBR_ACTIVE), NULL, self->flags, 1771 codecFrameSize); 1772 } 1773 1774 C_ALLOC_SCRATCH_END(pPsScratch, struct PS_DEC_COEFFICIENTS, 1) 1775 } 1776 1777 if (h_ps_d != NULL) { 1778 /* save PS status for next run */ 1779 h_ps_d->psDecodedPrv = (self->flags & SBRDEC_PS_DECODED) ? 1 : 0; 1780 } 1781 1782 if (psPossible && !(self->flags & SBRDEC_SKIP_QMF_SYN)) { 1783 FDK_ASSERT(strideOut > 1); 1784 if (!(self->flags & SBRDEC_PS_DECODED)) { 1785 /* A decoder which is able to decode PS has to produce a stereo output 1786 * even if no PS data is available. */ 1787 /* So copy left channel to right channel. */ 1788 int copyFrameSize = 1789 codecFrameSize * self->pQmfDomain->QmfDomainOut->fb.no_channels; 1790 copyFrameSize /= self->pQmfDomain->QmfDomainIn->fb.no_channels; 1791 INT_PCM *ptr; 1792 INT i; 1793 FDK_ASSERT(strideOut == 2); 1794 1795 ptr = timeData; 1796 for (i = copyFrameSize >> 1; i--;) { 1797 INT_PCM tmp; /* This temporal variable is required because some 1798 compilers can't do *ptr++ = *ptr++ correctly. */ 1799 tmp = *ptr++; 1800 *ptr++ = tmp; 1801 tmp = *ptr++; 1802 *ptr++ = tmp; 1803 } 1804 } 1805 *numOutChannels = 2; /* Output minimum two channels when PS is enabled. */ 1806 } 1807 1808 return errorStatus; 1809 } 1810 1811 SBR_ERROR sbrDecoder_Apply(HANDLE_SBRDECODER self, INT_PCM *input, 1812 INT_PCM *timeData, const int timeDataSize, 1813 int *numChannels, int *sampleRate, 1814 const FDK_channelMapDescr *const mapDescr, 1815 const int mapIdx, const int coreDecodedOk, 1816 UCHAR *psDecoded) { 1817 SBR_ERROR errorStatus = SBRDEC_OK; 1818 1819 int psPossible; 1820 int sbrElementNum; 1821 int numCoreChannels; 1822 int numSbrChannels = 0; 1823 1824 if ((self == NULL) || (timeData == NULL) || (numChannels == NULL) || 1825 (sampleRate == NULL) || (psDecoded == NULL) || 1826 !FDK_chMapDescr_isValid(mapDescr)) { 1827 return SBRDEC_INVALID_ARGUMENT; 1828 } 1829 1830 psPossible = *psDecoded; 1831 numCoreChannels = *numChannels; 1832 if (numCoreChannels <= 0) { 1833 return SBRDEC_INVALID_ARGUMENT; 1834 } 1835 1836 if (self->numSbrElements < 1) { 1837 /* exit immediately to avoid access violations */ 1838 return SBRDEC_NOT_INITIALIZED; 1839 } 1840 1841 /* Sanity check of allocated SBR elements. */ 1842 for (sbrElementNum = 0; sbrElementNum < self->numSbrElements; 1843 sbrElementNum++) { 1844 if (self->pSbrElement[sbrElementNum] == NULL) { 1845 return SBRDEC_NOT_INITIALIZED; 1846 } 1847 } 1848 1849 if (self->numSbrElements != 1 || self->pSbrElement[0]->elementID != ID_SCE) { 1850 psPossible = 0; 1851 } 1852 1853 /* Make sure that even if no SBR data was found/parsed *psDecoded is returned 1854 * 1 if psPossible was 0. */ 1855 if (psPossible == 0) { 1856 self->flags &= ~SBRDEC_PS_DECODED; 1857 } 1858 1859 /* replaces channel based reset inside sbr_dec() */ 1860 if (((self->flags & SBRDEC_LOW_POWER) ? 1 : 0) != 1861 ((self->pQmfDomain->globalConf.flags & QMF_FLAG_LP) ? 1 : 0)) { 1862 if (self->flags & SBRDEC_LOW_POWER) { 1863 self->pQmfDomain->globalConf.flags |= QMF_FLAG_LP; 1864 self->pQmfDomain->globalConf.flags_requested |= QMF_FLAG_LP; 1865 } else { 1866 self->pQmfDomain->globalConf.flags &= ~QMF_FLAG_LP; 1867 self->pQmfDomain->globalConf.flags_requested &= ~QMF_FLAG_LP; 1868 } 1869 if (FDK_QmfDomain_InitFilterBank(self->pQmfDomain, QMF_FLAG_KEEP_STATES)) { 1870 return SBRDEC_UNSUPPORTED_CONFIG; 1871 } 1872 } 1873 if (self->numSbrChannels > self->pQmfDomain->globalConf.nInputChannels) { 1874 return SBRDEC_UNSUPPORTED_CONFIG; 1875 } 1876 1877 if (self->flags & SBRDEC_FLUSH) { 1878 /* flushing is signalized, hence increment the flush frame counter */ 1879 self->numFlushedFrames++; 1880 } else { 1881 /* no flushing is signalized, hence reset the flush frame counter */ 1882 self->numFlushedFrames = 0; 1883 } 1884 1885 /* Loop over SBR elements */ 1886 for (sbrElementNum = 0; sbrElementNum < self->numSbrElements; 1887 sbrElementNum++) { 1888 int numElementChan; 1889 1890 if (psPossible && 1891 self->pSbrElement[sbrElementNum]->pSbrChannel[1] == NULL) { 1892 /* Disable PS and try decoding SBR mono. */ 1893 psPossible = 0; 1894 } 1895 1896 numElementChan = 1897 (self->pSbrElement[sbrElementNum]->elementID == ID_CPE) ? 2 : 1; 1898 1899 /* If core signal is bad then force upsampling */ 1900 if (!coreDecodedOk) { 1901 setFrameErrorFlag(self->pSbrElement[sbrElementNum], FRAME_ERROR_ALLSLOTS); 1902 } 1903 1904 errorStatus = sbrDecoder_DecodeElement( 1905 self, input, timeData, timeDataSize, mapDescr, mapIdx, numSbrChannels, 1906 sbrElementNum, 1907 numCoreChannels, /* is correct even for USC SCI==2 case */ 1908 &numElementChan, psPossible); 1909 1910 if (errorStatus != SBRDEC_OK) { 1911 goto bail; 1912 } 1913 1914 numSbrChannels += numElementChan; 1915 1916 if (numSbrChannels >= numCoreChannels) { 1917 break; 1918 } 1919 } 1920 1921 /* Update numChannels and samplerate */ 1922 /* Do not mess with output channels in case of USAC. numSbrChannels != 1923 * numChannels for stereoConfigIndex == 2 */ 1924 if (!(self->flags & SBRDEC_SYNTAX_USAC)) { 1925 *numChannels = numSbrChannels; 1926 } 1927 *sampleRate = self->sampleRateOut; 1928 *psDecoded = (self->flags & SBRDEC_PS_DECODED) ? 1 : 0; 1929 1930 /* Clear reset and flush flag because everything seems to be done 1931 * successfully. */ 1932 self->flags &= ~SBRDEC_FORCE_RESET; 1933 self->flags &= ~SBRDEC_FLUSH; 1934 1935 bail: 1936 1937 return errorStatus; 1938 } 1939 1940 SBR_ERROR sbrDecoder_Close(HANDLE_SBRDECODER *pSelf) { 1941 HANDLE_SBRDECODER self = *pSelf; 1942 int i; 1943 1944 if (self != NULL) { 1945 if (self->hParametricStereoDec != NULL) { 1946 DeletePsDec(&self->hParametricStereoDec); 1947 } 1948 1949 for (i = 0; i < (8); i++) { 1950 sbrDecoder_DestroyElement(self, i); 1951 } 1952 1953 FreeRam_SbrDecoder(pSelf); 1954 } 1955 1956 return SBRDEC_OK; 1957 } 1958 1959 INT sbrDecoder_GetLibInfo(LIB_INFO *info) { 1960 int i; 1961 1962 if (info == NULL) { 1963 return -1; 1964 } 1965 1966 /* search for next free tab */ 1967 for (i = 0; i < FDK_MODULE_LAST; i++) { 1968 if (info[i].module_id == FDK_NONE) break; 1969 } 1970 if (i == FDK_MODULE_LAST) return -1; 1971 info += i; 1972 1973 info->module_id = FDK_SBRDEC; 1974 info->version = 1975 LIB_VERSION(SBRDECODER_LIB_VL0, SBRDECODER_LIB_VL1, SBRDECODER_LIB_VL2); 1976 LIB_VERSION_STRING(info); 1977 info->build_date = SBRDECODER_LIB_BUILD_DATE; 1978 info->build_time = SBRDECODER_LIB_BUILD_TIME; 1979 info->title = SBRDECODER_LIB_TITLE; 1980 1981 /* Set flags */ 1982 info->flags = 0 | CAPF_SBR_HQ | CAPF_SBR_LP | CAPF_SBR_PS_MPEG | 1983 CAPF_SBR_DRM_BS | CAPF_SBR_CONCEALMENT | CAPF_SBR_DRC | 1984 CAPF_SBR_ELD_DOWNSCALE | CAPF_SBR_HBEHQ; 1985 /* End of flags */ 1986 1987 return 0; 1988 } 1989 1990 UINT sbrDecoder_GetDelay(const HANDLE_SBRDECODER self) { 1991 UINT outputDelay = 0; 1992 1993 if (self != NULL) { 1994 UINT flags = self->flags; 1995 1996 /* See chapter 1.6.7.2 of ISO/IEC 14496-3 for the GA-SBR figures below. */ 1997 1998 /* Are we initialized? */ 1999 if ((self->numSbrChannels > 0) && (self->numSbrElements > 0)) { 2000 /* Add QMF synthesis delay */ 2001 if ((flags & SBRDEC_ELD_GRID) && IS_LOWDELAY(self->coreCodec)) { 2002 /* Low delay SBR: */ 2003 if (!(flags & SBRDEC_SKIP_QMF_SYN)) { 2004 outputDelay += 2005 (flags & SBRDEC_DOWNSAMPLE) ? 32 : 64; /* QMF synthesis */ 2006 if (flags & SBRDEC_LD_MPS_QMF) { 2007 outputDelay += 32; 2008 } 2009 } 2010 } else if (!IS_USAC(self->coreCodec)) { 2011 /* By the method of elimination this is the GA (AAC-LC, HE-AAC, ...) 2012 * branch: */ 2013 outputDelay += (flags & SBRDEC_DOWNSAMPLE) ? 481 : 962; 2014 if (flags & SBRDEC_SKIP_QMF_SYN) { 2015 outputDelay -= 257; /* QMF synthesis */ 2016 } 2017 } 2018 } 2019 } 2020 2021 return (outputDelay); 2022 } 2023