1 2 /* ----------------------------------------------------------------------------------------------------------- 3 Software License for The Fraunhofer FDK AAC Codec Library for Android 4 5 Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Frderung der angewandten Forschung e.V. 6 All rights reserved. 7 8 1. INTRODUCTION 9 The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements 10 the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. 11 This FDK AAC Codec software is intended to be used on a wide variety of Android devices. 12 13 AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual 14 audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by 15 independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part 16 of the MPEG specifications. 17 18 Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) 19 may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners 20 individually for the purpose of encoding or decoding bit streams in products that are compliant with 21 the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license 22 these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec 23 software may already be covered under those patent licenses when it is used for those licensed purposes only. 24 25 Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, 26 are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional 27 applications information and documentation. 28 29 2. COPYRIGHT LICENSE 30 31 Redistribution and use in source and binary forms, with or without modification, are permitted without 32 payment of copyright license fees provided that you satisfy the following conditions: 33 34 You must retain the complete text of this software license in redistributions of the FDK AAC Codec or 35 your modifications thereto in source code form. 36 37 You must retain the complete text of this software license in the documentation and/or other materials 38 provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. 39 You must make available free of charge copies of the complete source code of the FDK AAC Codec and your 40 modifications thereto to recipients of copies in binary form. 41 42 The name of Fraunhofer may not be used to endorse or promote products derived from this library without 43 prior written permission. 44 45 You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec 46 software or your modifications thereto. 47 48 Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software 49 and the date of any change. For modified versions of the FDK AAC Codec, the term 50 "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term 51 "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 52 53 3. NO PATENT LICENSE 54 55 NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, 56 ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with 57 respect to this software. 58 59 You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized 60 by appropriate patent licenses. 61 62 4. DISCLAIMER 63 64 This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors 65 "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties 66 of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 67 CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, 68 including but not limited to procurement of substitute goods or services; loss of use, data, or profits, 69 or business interruption, however caused and on any theory of liability, whether in contract, strict 70 liability, or tort (including negligence), arising in any way out of the use of this software, even if 71 advised of the possibility of such damage. 72 73 5. CONTACT INFORMATION 74 75 Fraunhofer Institute for Integrated Circuits IIS 76 Attention: Audio and Multimedia Departments - FDK AAC LL 77 Am Wolfsmantel 33 78 91058 Erlangen, Germany 79 80 www.iis.fraunhofer.de/amm 81 amm-info (at) iis.fraunhofer.de 82 ----------------------------------------------------------------------------------------------------------- */ 83 84 /*! 85 \file 86 \brief SBR decoder frontend 87 This module provides a frontend to the SBR decoder. The function openSBR() is called for 88 initialization. The function sbrDecoder_Apply() is called for each frame. sbr_Apply() will call the 89 required functions to decode the raw SBR data (provided by env_extr.cpp), to decode the envelope data and noise floor levels [decodeSbrData()], 90 and to finally apply SBR to the current frame [sbr_dec()]. 91 92 \sa sbrDecoder_Apply(), \ref documentationOverview 93 */ 94 95 /*! 96 \page documentationOverview Overview of important information resources and source code documentation 97 98 The primary source code documentation is based on generated and cross-referenced HTML files using 99 <a HREF="http://www.doxygen.org">doxygen</a>. As part of this documentation 100 you can find more extensive descriptions about key concepts and algorithms at the following locations: 101 102 <h2>Programming</h2> 103 104 \li Buffer management: sbrDecoder_Apply() and sbr_dec() 105 \li Internal scale factors to maximize SNR on fixed point processors: #QMF_SCALE_FACTOR 106 \li Special mantissa-exponent format: Created in requantizeEnvelopeData() and used in calculateSbrEnvelope() 107 108 <h2>Algorithmic details</h2> 109 \li About the SBR data format: \ref SBR_HEADER_ELEMENT and \ref SBR_STANDARD_ELEMENT 110 \li Details about the bitstream decoder: env_extr.cpp 111 \li Details about the QMF filterbank and the provided polyphase implementation: qmf_dec.cpp 112 \li Details about the transposer: lpp_tran.cpp 113 \li Details about the envelope adjuster: env_calc.cpp 114 115 */ 116 117 #include "sbrdecoder.h" 118 119 #include "FDK_bitstream.h" 120 121 #include "sbrdec_freq_sca.h" 122 #include "env_extr.h" 123 #include "sbr_dec.h" 124 #include "env_dec.h" 125 #include "sbr_crc.h" 126 #include "sbr_ram.h" 127 #include "sbr_rom.h" 128 #include "lpp_tran.h" 129 #include "transcendent.h" 130 131 132 #include "sbrdec_drc.h" 133 134 #include "psbitdec.h" 135 136 137 /* Decoder library info */ 138 #define SBRDECODER_LIB_VL0 2 139 #define SBRDECODER_LIB_VL1 2 140 #define SBRDECODER_LIB_VL2 6 141 #define SBRDECODER_LIB_TITLE "SBR Decoder" 142 #define SBRDECODER_LIB_BUILD_DATE __DATE__ 143 #define SBRDECODER_LIB_BUILD_TIME __TIME__ 144 145 146 147 148 static UCHAR getHeaderSlot( UCHAR currentSlot, UCHAR hdrSlotUsage[(1)+1] ) 149 { 150 UINT occupied = 0; 151 int s; 152 UCHAR slot = hdrSlotUsage[currentSlot]; 153 154 FDK_ASSERT((1)+1 < 32); 155 156 for (s = 0; s < (1)+1; s++) { 157 if ( (hdrSlotUsage[s] == slot) 158 && (s != slot) ) { 159 occupied = 1; 160 break; 161 } 162 } 163 164 if (occupied) { 165 occupied = 0; 166 167 for (s = 0; s < (1)+1; s++) { 168 occupied |= 1 << hdrSlotUsage[s]; 169 } 170 for (s = 0; s < (1)+1; s++) { 171 if ( !(occupied & 0x1) ) { 172 slot = s; 173 break; 174 } 175 occupied >>= 1; 176 } 177 } 178 179 return slot; 180 } 181 182 static void copySbrHeader( HANDLE_SBR_HEADER_DATA hDst, const HANDLE_SBR_HEADER_DATA hSrc ) 183 { 184 /* copy the whole header memory (including pointers) */ 185 FDKmemcpy( hDst, hSrc, sizeof(SBR_HEADER_DATA) ); 186 187 /* update pointers */ 188 hDst->freqBandData.freqBandTable[0] = hDst->freqBandData.freqBandTableLo; 189 hDst->freqBandData.freqBandTable[1] = hDst->freqBandData.freqBandTableHi; 190 } 191 192 193 /*! 194 \brief Reset SBR decoder. 195 196 Reset should only be called if SBR has been sucessfully detected by 197 an appropriate checkForPayload() function. 198 199 \return Error code. 200 */ 201 static 202 SBR_ERROR sbrDecoder_ResetElement ( 203 HANDLE_SBRDECODER self, 204 int sampleRateIn, 205 int sampleRateOut, 206 int samplesPerFrame, 207 const MP4_ELEMENT_ID elementID, 208 const int elementIndex, 209 const int overlap 210 ) 211 { 212 SBR_ERROR sbrError = SBRDEC_OK; 213 HANDLE_SBR_HEADER_DATA hSbrHeader; 214 UINT qmfFlags = 0; 215 216 int i, synDownsampleFac; 217 218 /* Check in/out samplerates */ 219 if ( sampleRateIn < 6400 220 || sampleRateIn > 48000 221 ) 222 { 223 sbrError = SBRDEC_UNSUPPORTED_CONFIG; 224 goto bail; 225 } 226 227 if ( sampleRateOut > 96000 ) 228 { 229 sbrError = SBRDEC_UNSUPPORTED_CONFIG; 230 goto bail; 231 } 232 233 /* Set QMF mode flags */ 234 if (self->flags & SBRDEC_LOW_POWER) 235 qmfFlags |= QMF_FLAG_LP; 236 237 if (self->coreCodec == AOT_ER_AAC_ELD) { 238 if (self->flags & SBRDEC_LD_MPS_QMF) { 239 qmfFlags |= QMF_FLAG_MPSLDFB; 240 } else { 241 qmfFlags |= QMF_FLAG_CLDFB; 242 } 243 } 244 245 /* Set downsampling factor for synthesis filter bank */ 246 if (sampleRateOut == 0) 247 { 248 /* no single rate mode */ 249 sampleRateOut = sampleRateIn<<1; /* In case of implicit signalling, assume dual rate SBR */ 250 } 251 252 if ( sampleRateIn == sampleRateOut ) { 253 synDownsampleFac = 2; 254 self->flags |= SBRDEC_DOWNSAMPLE; 255 } else { 256 synDownsampleFac = 1; 257 self->flags &= ~SBRDEC_DOWNSAMPLE; 258 } 259 260 self->synDownsampleFac = synDownsampleFac; 261 self->sampleRateOut = sampleRateOut; 262 263 { 264 int i; 265 266 for (i = 0; i < (1)+1; i++) 267 { 268 hSbrHeader = &(self->sbrHeader[elementIndex][i]); 269 270 /* init a default header such that we can at least do upsampling later */ 271 sbrError = initHeaderData( 272 hSbrHeader, 273 sampleRateIn, 274 sampleRateOut, 275 samplesPerFrame, 276 self->flags 277 ); 278 } 279 } 280 281 if (sbrError != SBRDEC_OK) { 282 goto bail; 283 } 284 285 /* Init SBR channels going to be assigned to a SBR element */ 286 { 287 int ch; 288 289 for (ch=0; ch<self->pSbrElement[elementIndex]->nChannels; ch++) 290 { 291 /* and create sbrDec */ 292 sbrError = createSbrDec (self->pSbrElement[elementIndex]->pSbrChannel[ch], 293 hSbrHeader, 294 &self->pSbrElement[elementIndex]->transposerSettings, 295 synDownsampleFac, 296 qmfFlags, 297 self->flags, 298 overlap, 299 ch ); 300 301 if (sbrError != SBRDEC_OK) { 302 goto bail; 303 } 304 } 305 } 306 307 //FDKmemclear(sbr_OverlapBuffer, sizeof(sbr_OverlapBuffer)); 308 309 if (self->numSbrElements == 1) { 310 switch ( self->coreCodec ) { 311 case AOT_AAC_LC: 312 case AOT_SBR: 313 case AOT_PS: 314 case AOT_ER_AAC_SCAL: 315 case AOT_DRM_AAC: 316 case AOT_DRM_SURROUND: 317 if (CreatePsDec ( &self->hParametricStereoDec, samplesPerFrame )) { 318 sbrError = SBRDEC_CREATE_ERROR; 319 goto bail; 320 } 321 break; 322 default: 323 break; 324 } 325 } 326 327 /* Init frame delay slot handling */ 328 self->pSbrElement[elementIndex]->useFrameSlot = 0; 329 for (i = 0; i < ((1)+1); i++) { 330 self->pSbrElement[elementIndex]->useHeaderSlot[i] = i; 331 } 332 333 bail: 334 335 return sbrError; 336 } 337 338 339 SBR_ERROR sbrDecoder_Open ( HANDLE_SBRDECODER * pSelf ) 340 { 341 HANDLE_SBRDECODER self = NULL; 342 SBR_ERROR sbrError = SBRDEC_OK; 343 344 /* Get memory for this instance */ 345 self = GetRam_SbrDecoder(); 346 if (self == NULL) { 347 sbrError = SBRDEC_MEM_ALLOC_FAILED; 348 goto bail; 349 } 350 351 self->workBuffer1 = GetRam_SbrDecWorkBuffer1(); 352 self->workBuffer2 = GetRam_SbrDecWorkBuffer2(); 353 354 if ( self->workBuffer1 == NULL 355 || self->workBuffer2 == NULL ) 356 { 357 sbrError = SBRDEC_MEM_ALLOC_FAILED; 358 goto bail; 359 } 360 361 /* 362 Already zero because of calloc 363 self->numSbrElements = 0; 364 self->numSbrChannels = 0; 365 self->codecFrameSize = 0; 366 */ 367 368 self->numDelayFrames = (1); /* set to the max value by default */ 369 370 *pSelf = self; 371 372 bail: 373 return sbrError; 374 } 375 376 /** 377 * \brief determine if the given core codec AOT can be processed or not. 378 * \param coreCodec core codec audio object type. 379 * \return 1 if SBR can be processed, 0 if SBR cannot be processed/applied. 380 */ 381 static 382 int sbrDecoder_isCoreCodecValid(AUDIO_OBJECT_TYPE coreCodec) 383 { 384 switch (coreCodec) { 385 case AOT_AAC_LC: 386 case AOT_SBR: 387 case AOT_PS: 388 case AOT_ER_AAC_SCAL: 389 case AOT_ER_AAC_ELD: 390 return 1; 391 default: 392 return 0; 393 } 394 } 395 396 static 397 void sbrDecoder_DestroyElement ( 398 HANDLE_SBRDECODER self, 399 const int elementIndex 400 ) 401 { 402 if (self->pSbrElement[elementIndex] != NULL) { 403 int ch; 404 405 for (ch=0; ch<SBRDEC_MAX_CH_PER_ELEMENT; ch++) { 406 if (self->pSbrElement[elementIndex]->pSbrChannel[ch] != NULL) { 407 deleteSbrDec( self->pSbrElement[elementIndex]->pSbrChannel[ch] ); 408 FreeRam_SbrDecChannel( &self->pSbrElement[elementIndex]->pSbrChannel[ch] ); 409 self->numSbrChannels -= 1; 410 } 411 } 412 FreeRam_SbrDecElement( &self->pSbrElement[elementIndex] ); 413 self->numSbrElements -= 1; 414 } 415 } 416 417 418 SBR_ERROR sbrDecoder_InitElement ( 419 HANDLE_SBRDECODER self, 420 const int sampleRateIn, 421 const int sampleRateOut, 422 const int samplesPerFrame, 423 const AUDIO_OBJECT_TYPE coreCodec, 424 const MP4_ELEMENT_ID elementID, 425 const int elementIndex 426 ) 427 { 428 SBR_ERROR sbrError = SBRDEC_OK; 429 int chCnt=0; 430 int nSbrElementsStart = self->numSbrElements; 431 432 /* Check core codec AOT */ 433 if (! sbrDecoder_isCoreCodecValid(coreCodec) || elementIndex >= (8)) { 434 sbrError = SBRDEC_UNSUPPORTED_CONFIG; 435 goto bail; 436 } 437 438 if ( elementID != ID_SCE && elementID != ID_CPE && elementID != ID_LFE ) 439 { 440 sbrError = SBRDEC_UNSUPPORTED_CONFIG; 441 goto bail; 442 } 443 444 if ( self->sampleRateIn == sampleRateIn 445 && self->codecFrameSize == samplesPerFrame 446 && self->coreCodec == coreCodec 447 && self->pSbrElement[elementIndex] != NULL 448 && self->pSbrElement[elementIndex]->elementID == elementID 449 && !(self->flags & SBRDEC_FORCE_RESET) 450 ) 451 { 452 /* Nothing to do */ 453 return SBRDEC_OK; 454 } 455 456 self->sampleRateIn = sampleRateIn; 457 self->codecFrameSize = samplesPerFrame; 458 self->coreCodec = coreCodec; 459 460 self->flags = 0; 461 self->flags |= (coreCodec == AOT_ER_AAC_ELD) ? SBRDEC_ELD_GRID : 0; 462 463 /* Init SBR elements */ 464 { 465 int elChannels, ch; 466 467 if (self->pSbrElement[elementIndex] == NULL) { 468 self->pSbrElement[elementIndex] = GetRam_SbrDecElement(elementIndex); 469 if (self->pSbrElement[elementIndex] == NULL) { 470 sbrError = SBRDEC_MEM_ALLOC_FAILED; 471 goto bail; 472 } 473 self->numSbrElements ++; 474 } else { 475 self->numSbrChannels -= self->pSbrElement[elementIndex]->nChannels; 476 } 477 478 /* Save element ID for sanity checks and to have a fallback for concealment. */ 479 self->pSbrElement[elementIndex]->elementID = elementID; 480 481 /* Determine amount of channels for this element */ 482 switch (elementID) { 483 case ID_NONE: 484 case ID_CPE: elChannels=2; 485 break; 486 case ID_LFE: 487 case ID_SCE: elChannels=1; 488 break; 489 default: elChannels=0; 490 break; 491 } 492 493 /* Handle case of Parametric Stereo */ 494 if ( elementIndex == 0 && elementID == ID_SCE ) { 495 switch (coreCodec) { 496 case AOT_AAC_LC: 497 case AOT_SBR: 498 case AOT_PS: 499 case AOT_ER_AAC_SCAL: 500 case AOT_DRM_AAC: 501 case AOT_DRM_SURROUND: 502 elChannels = 2; 503 break; 504 default: 505 break; 506 } 507 } 508 509 self->pSbrElement[elementIndex]->nChannels = elChannels; 510 511 for (ch=0; ch<elChannels; ch++) 512 { 513 if (self->pSbrElement[elementIndex]->pSbrChannel[ch] == NULL) { 514 self->pSbrElement[elementIndex]->pSbrChannel[ch] = GetRam_SbrDecChannel(chCnt); 515 if (self->pSbrElement[elementIndex]->pSbrChannel[ch] == NULL) { 516 sbrError = SBRDEC_MEM_ALLOC_FAILED; 517 goto bail; 518 } 519 } 520 self->numSbrChannels ++; 521 522 sbrDecoder_drcInitChannel( &self->pSbrElement[elementIndex]->pSbrChannel[ch]->SbrDec.sbrDrcChannel ); 523 524 /* Add reference pointer to workbuffers. */ 525 self->pSbrElement[elementIndex]->pSbrChannel[ch]->SbrDec.WorkBuffer1 = self->workBuffer1; 526 self->pSbrElement[elementIndex]->pSbrChannel[ch]->SbrDec.WorkBuffer2 = self->workBuffer2; 527 chCnt++; 528 } 529 if (elChannels == 1 && self->pSbrElement[elementIndex]->pSbrChannel[ch] != NULL) { 530 deleteSbrDec( self->pSbrElement[elementIndex]->pSbrChannel[ch] ); 531 FreeRam_SbrDecChannel( &self->pSbrElement[elementIndex]->pSbrChannel[ch] ); 532 } 533 } 534 535 /* clear error flags for all delay slots */ 536 FDKmemclear(self->pSbrElement[elementIndex]->frameErrorFlag, ((1)+1)*sizeof(UCHAR)); 537 538 /* Initialize this instance */ 539 sbrError = sbrDecoder_ResetElement( 540 self, 541 sampleRateIn, 542 sampleRateOut, 543 samplesPerFrame, 544 elementID, 545 elementIndex, 546 (coreCodec == AOT_ER_AAC_ELD) ? 0 : (6) 547 ); 548 549 550 551 bail: 552 if (sbrError != SBRDEC_OK) { 553 if (nSbrElementsStart < self->numSbrElements) { 554 /* Free the memory allocated for this element */ 555 sbrDecoder_DestroyElement( self, elementIndex ); 556 } else if ( (self->pSbrElement[elementIndex] != NULL) 557 && (elementIndex < (8))) 558 { /* Set error flag to trigger concealment */ 559 self->pSbrElement[elementIndex]->frameErrorFlag[self->pSbrElement[elementIndex]->useFrameSlot] = 1; 560 } 561 } 562 563 return sbrError; 564 } 565 566 /** 567 * \brief Apply decoded SBR header for one element. 568 * \param self SBR decoder instance handle 569 * \param hSbrHeader SBR header handle to be processed. 570 * \param hSbrChannel pointer array to the SBR element channels corresponding to the SBR header. 571 * \param headerStatus header status value returned from SBR header parser. 572 * \param numElementChannels amount of channels for the SBR element whos header is to be processed. 573 */ 574 static 575 SBR_ERROR sbrDecoder_HeaderUpdate( 576 HANDLE_SBRDECODER self, 577 HANDLE_SBR_HEADER_DATA hSbrHeader, 578 SBR_HEADER_STATUS headerStatus, 579 HANDLE_SBR_CHANNEL hSbrChannel[], 580 const int numElementChannels 581 ) 582 { 583 SBR_ERROR errorStatus = SBRDEC_OK; 584 585 /* 586 change of control data, reset decoder 587 */ 588 errorStatus = resetFreqBandTables(hSbrHeader, self->flags); 589 590 if (errorStatus == SBRDEC_OK) { 591 if (hSbrHeader->syncState == UPSAMPLING && headerStatus != HEADER_RESET) 592 { 593 /* As the default header would limit the frequency range, 594 lowSubband and highSubband must be patched. */ 595 hSbrHeader->freqBandData.lowSubband = hSbrHeader->numberOfAnalysisBands; 596 hSbrHeader->freqBandData.highSubband = hSbrHeader->numberOfAnalysisBands; 597 } 598 599 /* Trigger a reset before processing this slot */ 600 hSbrHeader->status |= SBRDEC_HDR_STAT_RESET; 601 } 602 603 return errorStatus; 604 } 605 606 INT sbrDecoder_Header ( 607 HANDLE_SBRDECODER self, 608 HANDLE_FDK_BITSTREAM hBs, 609 const INT sampleRateIn, 610 const INT sampleRateOut, 611 const INT samplesPerFrame, 612 const AUDIO_OBJECT_TYPE coreCodec, 613 const MP4_ELEMENT_ID elementID, 614 const INT elementIndex 615 ) 616 { 617 SBR_HEADER_STATUS headerStatus; 618 HANDLE_SBR_HEADER_DATA hSbrHeader; 619 SBR_ERROR sbrError = SBRDEC_OK; 620 int headerIndex; 621 622 if ( self == NULL || elementIndex > (8) ) 623 { 624 return SBRDEC_UNSUPPORTED_CONFIG; 625 } 626 627 if (! sbrDecoder_isCoreCodecValid(coreCodec)) { 628 return SBRDEC_UNSUPPORTED_CONFIG; 629 } 630 631 sbrError = sbrDecoder_InitElement( 632 self, 633 sampleRateIn, 634 sampleRateOut, 635 samplesPerFrame, 636 coreCodec, 637 elementID, 638 elementIndex 639 ); 640 641 if (sbrError != SBRDEC_OK) { 642 goto bail; 643 } 644 645 headerIndex = getHeaderSlot(self->pSbrElement[elementIndex]->useFrameSlot, 646 self->pSbrElement[elementIndex]->useHeaderSlot); 647 hSbrHeader = &(self->sbrHeader[elementIndex][headerIndex]); 648 649 headerStatus = sbrGetHeaderData ( hSbrHeader, 650 hBs, 651 self->flags, 652 0); 653 654 655 { 656 SBR_DECODER_ELEMENT *pSbrElement; 657 658 pSbrElement = self->pSbrElement[elementIndex]; 659 660 /* Sanity check */ 661 if (pSbrElement != NULL) { 662 if ( (elementID == ID_CPE && pSbrElement->nChannels != 2) 663 || (elementID != ID_CPE && pSbrElement->nChannels != 1) ) 664 { 665 return SBRDEC_UNSUPPORTED_CONFIG; 666 } 667 if ( headerStatus == HEADER_RESET ) { 668 669 sbrError = sbrDecoder_HeaderUpdate( 670 self, 671 hSbrHeader, 672 headerStatus, 673 pSbrElement->pSbrChannel, 674 pSbrElement->nChannels 675 ); 676 677 if (sbrError == SBRDEC_OK) { 678 hSbrHeader->syncState = SBR_HEADER; 679 hSbrHeader->status |= SBRDEC_HDR_STAT_UPDATE; 680 } 681 /* else { 682 Since we already have overwritten the old SBR header the only way out is UPSAMPLING! 683 This will be prepared in the next step. 684 } */ 685 } 686 } 687 } 688 bail: 689 return sbrError; 690 } 691 692 693 SBR_ERROR sbrDecoder_SetParam (HANDLE_SBRDECODER self, 694 const SBRDEC_PARAM param, 695 const INT value ) 696 { 697 SBR_ERROR errorStatus = SBRDEC_OK; 698 699 /* configure the subsystems */ 700 switch (param) 701 { 702 case SBR_SYSTEM_BITSTREAM_DELAY: 703 if (value < 0 || value > (1)) { 704 errorStatus = SBRDEC_SET_PARAM_FAIL; 705 break; 706 } 707 if (self == NULL) { 708 errorStatus = SBRDEC_NOT_INITIALIZED; 709 } else { 710 self->numDelayFrames = (UCHAR)value; 711 } 712 break; 713 case SBR_QMF_MODE: 714 if (self == NULL) { 715 errorStatus = SBRDEC_NOT_INITIALIZED; 716 } else { 717 if (value == 1) { 718 self->flags |= SBRDEC_LOW_POWER; 719 } else { 720 self->flags &= ~SBRDEC_LOW_POWER; 721 } 722 } 723 break; 724 case SBR_LD_QMF_TIME_ALIGN: 725 if (self == NULL) { 726 errorStatus = SBRDEC_NOT_INITIALIZED; 727 } else { 728 if (value == 1) { 729 self->flags |= SBRDEC_LD_MPS_QMF; 730 } else { 731 self->flags &= ~SBRDEC_LD_MPS_QMF; 732 } 733 } 734 break; 735 case SBR_FLUSH_DATA: 736 if (value != 0) { 737 if (self == NULL) { 738 errorStatus = SBRDEC_NOT_INITIALIZED; 739 } else { 740 self->flags |= SBRDEC_FLUSH; 741 } 742 } 743 break; 744 case SBR_CLEAR_HISTORY: 745 if (value != 0) { 746 if (self == NULL) { 747 errorStatus = SBRDEC_NOT_INITIALIZED; 748 } else { 749 self->flags |= SBRDEC_FORCE_RESET; 750 } 751 } 752 break; 753 case SBR_BS_INTERRUPTION: 754 { 755 int elementIndex; 756 757 if (self == NULL) { 758 errorStatus = SBRDEC_NOT_INITIALIZED; 759 break; 760 } 761 762 /* Loop over SBR elements */ 763 for (elementIndex = 0; elementIndex < self->numSbrElements; elementIndex++) { 764 if (self->pSbrElement[elementIndex] != NULL) 765 { 766 HANDLE_SBR_HEADER_DATA hSbrHeader; 767 int headerIndex = getHeaderSlot(self->pSbrElement[elementIndex]->useFrameSlot, 768 self->pSbrElement[elementIndex]->useHeaderSlot); 769 770 hSbrHeader = &(self->sbrHeader[elementIndex][headerIndex]); 771 772 /* Set sync state UPSAMPLING for the corresponding slot. 773 This switches off bitstream parsing until a new header arrives. */ 774 hSbrHeader->syncState = UPSAMPLING; 775 hSbrHeader->status |= SBRDEC_HDR_STAT_UPDATE; 776 } } 777 } 778 break; 779 default: 780 errorStatus = SBRDEC_SET_PARAM_FAIL; 781 break; 782 } /* switch(param) */ 783 784 return (errorStatus); 785 } 786 787 static 788 SBRDEC_DRC_CHANNEL * sbrDecoder_drcGetChannel( const HANDLE_SBRDECODER self, const INT channel ) 789 { 790 SBRDEC_DRC_CHANNEL *pSbrDrcChannelData = NULL; 791 int elementIndex, elChanIdx=0, numCh=0; 792 793 for (elementIndex = 0; (elementIndex < (8)) && (numCh <= channel); elementIndex++) 794 { 795 SBR_DECODER_ELEMENT *pSbrElement = self->pSbrElement[elementIndex]; 796 int c, elChannels; 797 798 elChanIdx = 0; 799 if (pSbrElement == NULL) break; 800 801 /* Determine amount of channels for this element */ 802 switch (pSbrElement->elementID) { 803 case ID_CPE: elChannels = 2; 804 break; 805 case ID_LFE: 806 case ID_SCE: elChannels = 1; 807 break; 808 case ID_NONE: 809 default: elChannels = 0; 810 break; 811 } 812 813 /* Limit with actual allocated element channels */ 814 elChannels = FDKmin(elChannels, pSbrElement->nChannels); 815 816 for (c = 0; (c < elChannels) && (numCh <= channel); c++) { 817 if (pSbrElement->pSbrChannel[elChanIdx] != NULL) { 818 numCh++; 819 elChanIdx++; 820 } 821 } 822 } 823 elementIndex -= 1; 824 elChanIdx -= 1; 825 826 if (elChanIdx < 0 || elementIndex < 0) { 827 return NULL; 828 } 829 830 if ( self->pSbrElement[elementIndex] != NULL ) { 831 if ( self->pSbrElement[elementIndex]->pSbrChannel[elChanIdx] != NULL ) 832 { 833 pSbrDrcChannelData = &self->pSbrElement[elementIndex]->pSbrChannel[elChanIdx]->SbrDec.sbrDrcChannel; 834 } 835 } 836 837 return (pSbrDrcChannelData); 838 } 839 840 SBR_ERROR sbrDecoder_drcFeedChannel ( HANDLE_SBRDECODER self, 841 INT ch, 842 UINT numBands, 843 FIXP_DBL *pNextFact_mag, 844 INT nextFact_exp, 845 SHORT drcInterpolationScheme, 846 UCHAR winSequence, 847 USHORT *pBandTop ) 848 { 849 SBRDEC_DRC_CHANNEL *pSbrDrcChannelData = NULL; 850 int band, isValidData = 0; 851 852 if (self == NULL) { 853 return SBRDEC_NOT_INITIALIZED; 854 } 855 if (ch > (8) || pNextFact_mag == NULL) { 856 return SBRDEC_SET_PARAM_FAIL; 857 } 858 859 /* Search for gain values different to 1.0f */ 860 for (band = 0; band < numBands; band += 1) { 861 if ( !((pNextFact_mag[band] == FL2FXCONST_DBL(0.5)) && (nextFact_exp == 1)) 862 && !((pNextFact_mag[band] == (FIXP_DBL)MAXVAL_DBL) && (nextFact_exp == 0)) ) { 863 isValidData = 1; 864 break; 865 } 866 } 867 868 /* Find the right SBR channel */ 869 pSbrDrcChannelData = sbrDecoder_drcGetChannel( self, ch ); 870 871 if ( pSbrDrcChannelData != NULL ) { 872 if ( pSbrDrcChannelData->enable || isValidData ) 873 { /* Activate processing only with real and valid data */ 874 int i; 875 876 pSbrDrcChannelData->enable = 1; 877 pSbrDrcChannelData->numBandsNext = numBands; 878 879 pSbrDrcChannelData->winSequenceNext = winSequence; 880 pSbrDrcChannelData->drcInterpolationSchemeNext = drcInterpolationScheme; 881 pSbrDrcChannelData->nextFact_exp = nextFact_exp; 882 883 for (i = 0; i < (int)numBands; i++) { 884 pSbrDrcChannelData->bandTopNext[i] = pBandTop[i]; 885 pSbrDrcChannelData->nextFact_mag[i] = pNextFact_mag[i]; 886 } 887 } 888 } 889 890 return SBRDEC_OK; 891 } 892 893 894 void sbrDecoder_drcDisable ( HANDLE_SBRDECODER self, 895 INT ch ) 896 { 897 SBRDEC_DRC_CHANNEL *pSbrDrcChannelData = NULL; 898 899 if ( (self == NULL) 900 || (ch > (8)) 901 || (self->numSbrElements == 0) 902 || (self->numSbrChannels == 0) ) { 903 return; 904 } 905 906 /* Find the right SBR channel */ 907 pSbrDrcChannelData = sbrDecoder_drcGetChannel( self, ch ); 908 909 if ( pSbrDrcChannelData != NULL ) { 910 sbrDecoder_drcInitChannel( pSbrDrcChannelData ); 911 } 912 } 913 914 915 916 SBR_ERROR sbrDecoder_Parse( 917 HANDLE_SBRDECODER self, 918 HANDLE_FDK_BITSTREAM hBs, 919 int *count, 920 int bsPayLen, 921 int crcFlag, 922 MP4_ELEMENT_ID prevElement, 923 int elementIndex, 924 int fGlobalIndependencyFlag 925 ) 926 { 927 SBR_DECODER_ELEMENT *hSbrElement; 928 HANDLE_SBR_HEADER_DATA hSbrHeader; 929 HANDLE_SBR_CHANNEL *pSbrChannel; 930 931 SBR_FRAME_DATA *hFrameDataLeft; 932 SBR_FRAME_DATA *hFrameDataRight; 933 934 SBR_ERROR errorStatus = SBRDEC_OK; 935 SBR_SYNC_STATE initialSyncState; 936 SBR_HEADER_STATUS headerStatus = HEADER_NOT_PRESENT; 937 938 INT startPos; 939 INT CRCLen = 0; 940 941 int stereo; 942 int fDoDecodeSbrData = 1; 943 944 int lastSlot, lastHdrSlot = 0, thisHdrSlot; 945 946 /* Remember start position of SBR element */ 947 startPos = FDKgetValidBits(hBs); 948 949 /* SBR sanity checks */ 950 if ( self == NULL || self->pSbrElement[elementIndex] == NULL ) { 951 errorStatus = SBRDEC_NOT_INITIALIZED; 952 goto bail; 953 } 954 955 hSbrElement = self->pSbrElement[elementIndex]; 956 957 lastSlot = (hSbrElement->useFrameSlot > 0) ? hSbrElement->useFrameSlot-1 : self->numDelayFrames; 958 lastHdrSlot = hSbrElement->useHeaderSlot[lastSlot]; 959 thisHdrSlot = getHeaderSlot( hSbrElement->useFrameSlot, hSbrElement->useHeaderSlot ); /* Get a free header slot not used by frames not processed yet. */ 960 961 /* Assign the free slot to store a new header if there is one. */ 962 hSbrHeader = &self->sbrHeader[elementIndex][thisHdrSlot]; 963 964 pSbrChannel = hSbrElement->pSbrChannel; 965 stereo = (hSbrElement->elementID == ID_CPE) ? 1 : 0; 966 967 hFrameDataLeft = &self->pSbrElement[elementIndex]->pSbrChannel[0]->frameData[hSbrElement->useFrameSlot]; 968 hFrameDataRight = &self->pSbrElement[elementIndex]->pSbrChannel[1]->frameData[hSbrElement->useFrameSlot]; 969 970 initialSyncState = hSbrHeader->syncState; 971 972 /* reset PS flag; will be set after PS was found */ 973 self->flags &= ~SBRDEC_PS_DECODED; 974 975 if (hSbrHeader->status & SBRDEC_HDR_STAT_UPDATE) { 976 /* Got a new header from extern (e.g. from an ASC) */ 977 headerStatus = HEADER_OK; 978 hSbrHeader->status &= ~SBRDEC_HDR_STAT_UPDATE; 979 } 980 else if (thisHdrSlot != lastHdrSlot) { 981 /* Copy the last header into this slot otherwise the 982 header compare will trigger more HEADER_RESETs than needed. */ 983 copySbrHeader( hSbrHeader, &self->sbrHeader[elementIndex][lastHdrSlot] ); 984 } 985 986 /* 987 Check if bit stream data is valid and matches the element context 988 */ 989 if ( ((prevElement != ID_SCE) && (prevElement != ID_CPE)) || prevElement != hSbrElement->elementID) { 990 /* In case of LFE we also land here, since there is no LFE SBR element (do upsampling only) */ 991 fDoDecodeSbrData = 0; 992 } 993 994 if (fDoDecodeSbrData) 995 { 996 if ((INT)FDKgetValidBits(hBs) <= 0) { 997 fDoDecodeSbrData = 0; 998 } 999 } 1000 1001 /* 1002 SBR CRC-check 1003 */ 1004 if (fDoDecodeSbrData) 1005 { 1006 if (crcFlag == 1) { 1007 switch (self->coreCodec) { 1008 case AOT_ER_AAC_ELD: 1009 FDKpushFor (hBs, 10); 1010 /* check sbrcrc later: we don't know the payload length now */ 1011 break; 1012 default: 1013 CRCLen = bsPayLen - 10; /* change: 0 => i */ 1014 if (CRCLen < 0) { 1015 fDoDecodeSbrData = 0; 1016 } else { 1017 fDoDecodeSbrData = SbrCrcCheck (hBs, CRCLen); 1018 } 1019 break; 1020 } 1021 } 1022 } /* if (fDoDecodeSbrData) */ 1023 1024 /* 1025 Read in the header data and issue a reset if change occured 1026 */ 1027 if (fDoDecodeSbrData) 1028 { 1029 int sbrHeaderPresent; 1030 1031 { 1032 sbrHeaderPresent = FDKreadBit(hBs); 1033 } 1034 1035 if ( sbrHeaderPresent ) { 1036 headerStatus = sbrGetHeaderData (hSbrHeader, 1037 hBs, 1038 self->flags, 1039 1); 1040 } 1041 1042 if (headerStatus == HEADER_RESET) 1043 { 1044 errorStatus = sbrDecoder_HeaderUpdate( 1045 self, 1046 hSbrHeader, 1047 headerStatus, 1048 pSbrChannel, 1049 hSbrElement->nChannels 1050 ); 1051 1052 if (errorStatus == SBRDEC_OK) { 1053 hSbrHeader->syncState = SBR_HEADER; 1054 } else { 1055 hSbrHeader->syncState = SBR_NOT_INITIALIZED; 1056 } 1057 } 1058 1059 if (errorStatus != SBRDEC_OK) { 1060 fDoDecodeSbrData = 0; 1061 } 1062 } /* if (fDoDecodeSbrData) */ 1063 1064 /* 1065 Print debugging output only if state has changed 1066 */ 1067 1068 /* read frame data */ 1069 if ((hSbrHeader->syncState >= SBR_HEADER) && fDoDecodeSbrData) { 1070 int sbrFrameOk; 1071 /* read the SBR element data */ 1072 if (stereo) { 1073 sbrFrameOk = sbrGetChannelPairElement(hSbrHeader, 1074 hFrameDataLeft, 1075 hFrameDataRight, 1076 hBs, 1077 self->flags, 1078 self->pSbrElement[elementIndex]->transposerSettings.overlap); 1079 } 1080 else { 1081 if (self->hParametricStereoDec != NULL) { 1082 /* update slot index for PS bitstream parsing */ 1083 self->hParametricStereoDec->bsLastSlot = self->hParametricStereoDec->bsReadSlot; 1084 self->hParametricStereoDec->bsReadSlot = hSbrElement->useFrameSlot; 1085 } 1086 sbrFrameOk = sbrGetSingleChannelElement(hSbrHeader, 1087 hFrameDataLeft, 1088 hBs, 1089 self->hParametricStereoDec, 1090 self->flags, 1091 self->pSbrElement[elementIndex]->transposerSettings.overlap); 1092 } 1093 if (!sbrFrameOk) { 1094 fDoDecodeSbrData = 0; 1095 } 1096 else { 1097 INT valBits; 1098 1099 if (bsPayLen > 0) { 1100 valBits = bsPayLen - ((INT)startPos - (INT)FDKgetValidBits(hBs)); 1101 } else { 1102 valBits = (INT)FDKgetValidBits(hBs); 1103 } 1104 1105 if ( crcFlag == 1 ) { 1106 switch (self->coreCodec) { 1107 case AOT_ER_AAC_ELD: 1108 { 1109 /* late crc check for eld */ 1110 INT payloadbits = (INT)startPos - (INT)FDKgetValidBits(hBs) - startPos; 1111 INT crcLen = payloadbits - 10; 1112 FDKpushBack(hBs, payloadbits); 1113 fDoDecodeSbrData = SbrCrcCheck (hBs, crcLen); 1114 FDKpushFor(hBs, crcLen); 1115 } 1116 break; 1117 default: 1118 break; 1119 } 1120 } 1121 1122 /* sanity check of remaining bits */ 1123 if (valBits < 0) { 1124 fDoDecodeSbrData = 0; 1125 } else { 1126 switch (self->coreCodec) { 1127 case AOT_SBR: 1128 case AOT_PS: 1129 case AOT_AAC_LC: 1130 { 1131 /* This sanity check is only meaningful with General Audio bitstreams */ 1132 int alignBits = valBits & 0x7; 1133 1134 if (valBits > alignBits) { 1135 fDoDecodeSbrData = 0; 1136 } 1137 } 1138 break; 1139 default: 1140 /* No sanity check available */ 1141 break; 1142 } 1143 } 1144 } 1145 } else { 1146 /* The returned bit count will not be the actual payload size since we did not 1147 parse the frame data. Return an error so that the caller can react respectively. */ 1148 errorStatus = SBRDEC_PARSE_ERROR; 1149 } 1150 1151 if (!fDoDecodeSbrData) { 1152 /* Set error flag for this slot to trigger concealment */ 1153 self->pSbrElement[elementIndex]->frameErrorFlag[hSbrElement->useFrameSlot] = 1; 1154 errorStatus = SBRDEC_PARSE_ERROR; 1155 } else { 1156 /* Everything seems to be ok so clear the error flag */ 1157 self->pSbrElement[elementIndex]->frameErrorFlag[hSbrElement->useFrameSlot] = 0; 1158 } 1159 1160 if (!stereo) { 1161 /* Turn coupling off explicitely to avoid access to absent right frame data 1162 that might occur with corrupt bitstreams. */ 1163 hFrameDataLeft->coupling = COUPLING_OFF; 1164 } 1165 1166 bail: 1167 if (errorStatus == SBRDEC_OK) { 1168 if (headerStatus == HEADER_NOT_PRESENT) { 1169 /* Use the old header for this frame */ 1170 hSbrElement->useHeaderSlot[hSbrElement->useFrameSlot] = lastHdrSlot; 1171 } else { 1172 /* Use the new header for this frame */ 1173 hSbrElement->useHeaderSlot[hSbrElement->useFrameSlot] = thisHdrSlot; 1174 } 1175 1176 /* Move frame pointer to the next slot which is up to be decoded/applied next */ 1177 hSbrElement->useFrameSlot = (hSbrElement->useFrameSlot+1) % (self->numDelayFrames+1); 1178 } 1179 1180 *count -= startPos - FDKgetValidBits(hBs); 1181 1182 return errorStatus; 1183 } 1184 1185 1186 /** 1187 * \brief Render one SBR element into time domain signal. 1188 * \param self SBR decoder handle 1189 * \param timeData pointer to output buffer 1190 * \param interleaved flag indicating interleaved channel output 1191 * \param channelMapping pointer to UCHAR array where next 2 channel offsets are stored. 1192 * \param elementIndex enumerating index of the SBR element to render. 1193 * \param numInChannels number of channels from core coder (reading stride). 1194 * \param numOutChannels pointer to a location to return number of output channels. 1195 * \param psPossible flag indicating if PS is possible or not. 1196 * \return SBRDEC_OK if successfull, else error code 1197 */ 1198 static SBR_ERROR 1199 sbrDecoder_DecodeElement ( 1200 HANDLE_SBRDECODER self, 1201 INT_PCM *timeData, 1202 const int interleaved, 1203 const UCHAR *channelMapping, 1204 const int elementIndex, 1205 const int numInChannels, 1206 int *numOutChannels, 1207 const int psPossible 1208 ) 1209 { 1210 SBR_DECODER_ELEMENT *hSbrElement = self->pSbrElement[elementIndex]; 1211 HANDLE_SBR_CHANNEL *pSbrChannel = self->pSbrElement[elementIndex]->pSbrChannel; 1212 HANDLE_SBR_HEADER_DATA hSbrHeader = &self->sbrHeader[elementIndex][hSbrElement->useHeaderSlot[hSbrElement->useFrameSlot]]; 1213 HANDLE_PS_DEC h_ps_d = self->hParametricStereoDec; 1214 1215 /* get memory for frame data from scratch */ 1216 SBR_FRAME_DATA *hFrameDataLeft = &hSbrElement->pSbrChannel[0]->frameData[hSbrElement->useFrameSlot]; 1217 SBR_FRAME_DATA *hFrameDataRight = &hSbrElement->pSbrChannel[1]->frameData[hSbrElement->useFrameSlot]; 1218 1219 SBR_ERROR errorStatus = SBRDEC_OK; 1220 1221 1222 INT strideIn, strideOut, offset0, offset1; 1223 INT codecFrameSize = self->codecFrameSize; 1224 1225 int stereo = (hSbrElement->elementID == ID_CPE) ? 1 : 0; 1226 int numElementChannels = hSbrElement->nChannels; /* Number of channels of the current SBR element */ 1227 1228 if (self->flags & SBRDEC_FLUSH) { 1229 /* Move frame pointer to the next slot which is up to be decoded/applied next */ 1230 hSbrElement->useFrameSlot = (hSbrElement->useFrameSlot+1) % (self->numDelayFrames+1); 1231 /* Update header and frame data pointer because they have already been set */ 1232 hSbrHeader = &self->sbrHeader[elementIndex][hSbrElement->useHeaderSlot[hSbrElement->useFrameSlot]]; 1233 hFrameDataLeft = &hSbrElement->pSbrChannel[0]->frameData[hSbrElement->useFrameSlot]; 1234 hFrameDataRight = &hSbrElement->pSbrChannel[1]->frameData[hSbrElement->useFrameSlot]; 1235 } 1236 1237 /* Update the header error flag */ 1238 hSbrHeader->frameErrorFlag = hSbrElement->frameErrorFlag[hSbrElement->useFrameSlot]; 1239 1240 /* 1241 Prepare filterbank for upsampling if no valid bit stream data is available. 1242 */ 1243 if ( hSbrHeader->syncState == SBR_NOT_INITIALIZED ) 1244 { 1245 errorStatus = initHeaderData( 1246 hSbrHeader, 1247 self->sampleRateIn, 1248 self->sampleRateOut, 1249 codecFrameSize, 1250 self->flags 1251 ); 1252 1253 if (errorStatus != SBRDEC_OK) { 1254 return errorStatus; 1255 } 1256 1257 hSbrHeader->syncState = UPSAMPLING; 1258 1259 errorStatus = sbrDecoder_HeaderUpdate( 1260 self, 1261 hSbrHeader, 1262 HEADER_NOT_PRESENT, 1263 pSbrChannel, 1264 hSbrElement->nChannels 1265 ); 1266 1267 if (errorStatus != SBRDEC_OK) { 1268 hSbrHeader->syncState = SBR_NOT_INITIALIZED; 1269 return errorStatus; 1270 } 1271 } 1272 1273 /* reset */ 1274 if (hSbrHeader->status & SBRDEC_HDR_STAT_RESET) { 1275 int ch; 1276 for (ch = 0 ; ch < numElementChannels; ch++) { 1277 SBR_ERROR errorStatusTmp = SBRDEC_OK; 1278 1279 errorStatusTmp = resetSbrDec ( 1280 &pSbrChannel[ch]->SbrDec, 1281 hSbrHeader, 1282 &pSbrChannel[ch]->prevFrameData, 1283 self->flags & SBRDEC_LOW_POWER, 1284 self->synDownsampleFac 1285 ); 1286 1287 if (errorStatusTmp != SBRDEC_OK) { 1288 errorStatus = errorStatusTmp; 1289 } 1290 } 1291 hSbrHeader->status &= ~SBRDEC_HDR_STAT_RESET; 1292 } 1293 1294 /* decoding */ 1295 if ( (hSbrHeader->syncState == SBR_ACTIVE) 1296 || ((hSbrHeader->syncState == SBR_HEADER) && (hSbrHeader->frameErrorFlag == 0)) ) 1297 { 1298 errorStatus = SBRDEC_OK; 1299 1300 decodeSbrData (hSbrHeader, 1301 hFrameDataLeft, 1302 &pSbrChannel[0]->prevFrameData, 1303 (stereo) ? hFrameDataRight : NULL, 1304 (stereo) ? &pSbrChannel[1]->prevFrameData : NULL); 1305 1306 1307 /* Now we have a full parameter set and can do parameter 1308 based concealment instead of plain upsampling. */ 1309 hSbrHeader->syncState = SBR_ACTIVE; 1310 } 1311 1312 /* decode PS data if available */ 1313 if (h_ps_d != NULL && psPossible) { 1314 int applyPs = 1; 1315 1316 /* define which frame delay line slot to process */ 1317 h_ps_d->processSlot = hSbrElement->useFrameSlot; 1318 1319 applyPs = DecodePs(h_ps_d, hSbrHeader->frameErrorFlag); 1320 self->flags |= (applyPs) ? SBRDEC_PS_DECODED : 0; 1321 } 1322 1323 /* Set strides for reading and writing */ 1324 if (interleaved) { 1325 strideIn = numInChannels; 1326 if ( psPossible ) 1327 strideOut = (numInChannels < 2) ? 2 : numInChannels; 1328 else 1329 strideOut = numInChannels; 1330 offset0 = channelMapping[0]; 1331 offset1 = channelMapping[1]; 1332 } else { 1333 strideIn = 1; 1334 strideOut = 1; 1335 offset0 = channelMapping[0]*2*codecFrameSize; 1336 offset1 = channelMapping[1]*2*codecFrameSize; 1337 } 1338 1339 /* use same buffers for left and right channel and apply PS per timeslot */ 1340 /* Process left channel */ 1341 //FDKprintf("self->codecFrameSize %d\t%d\n",self->codecFrameSize,self->sampleRateIn); 1342 sbr_dec (&pSbrChannel[0]->SbrDec, 1343 timeData + offset0, 1344 timeData + offset0, 1345 &pSbrChannel[1]->SbrDec, 1346 timeData + offset1, 1347 strideIn, 1348 strideOut, 1349 hSbrHeader, 1350 hFrameDataLeft, 1351 &pSbrChannel[0]->prevFrameData, 1352 (hSbrHeader->syncState == SBR_ACTIVE), 1353 h_ps_d, 1354 self->flags 1355 ); 1356 1357 if (stereo) { 1358 /* Process right channel */ 1359 sbr_dec (&pSbrChannel[1]->SbrDec, 1360 timeData + offset1, 1361 timeData + offset1, 1362 NULL, 1363 NULL, 1364 strideIn, 1365 strideOut, 1366 hSbrHeader, 1367 hFrameDataRight, 1368 &pSbrChannel[1]->prevFrameData, 1369 (hSbrHeader->syncState == SBR_ACTIVE), 1370 NULL, 1371 self->flags 1372 ); 1373 } 1374 1375 if (h_ps_d != NULL) { 1376 /* save PS status for next run */ 1377 h_ps_d->psDecodedPrv = (self->flags & SBRDEC_PS_DECODED) ? 1 : 0 ; 1378 } 1379 1380 if ( psPossible 1381 ) 1382 { 1383 FDK_ASSERT(strideOut > 1); 1384 if ( !(self->flags & SBRDEC_PS_DECODED) ) { 1385 /* A decoder which is able to decode PS has to produce a stereo output even if no PS data is availble. */ 1386 /* So copy left channel to right channel. */ 1387 if (interleaved) { 1388 INT_PCM *ptr; 1389 INT i; 1390 FDK_ASSERT(strideOut == 2); 1391 1392 ptr = timeData; 1393 for (i = codecFrameSize; i--; ) 1394 { 1395 INT_PCM tmp; /* This temporal variable is required because some compilers can't do *ptr++ = *ptr++ correctly. */ 1396 tmp = *ptr++; *ptr++ = tmp; 1397 tmp = *ptr++; *ptr++ = tmp; 1398 } 1399 } else { 1400 FDKmemcpy( timeData+2*codecFrameSize, timeData, 2*codecFrameSize*sizeof(INT_PCM) ); 1401 } 1402 } 1403 *numOutChannels = 2; /* Output minimum two channels when PS is enabled. */ 1404 } 1405 1406 return errorStatus; 1407 } 1408 1409 1410 SBR_ERROR sbrDecoder_Apply ( HANDLE_SBRDECODER self, 1411 INT_PCM *timeData, 1412 int *numChannels, 1413 int *sampleRate, 1414 const UCHAR channelMapping[(8)], 1415 const int interleaved, 1416 const int coreDecodedOk, 1417 UCHAR *psDecoded ) 1418 { 1419 SBR_ERROR errorStatus = SBRDEC_OK; 1420 1421 int psPossible = 0; 1422 int sbrElementNum; 1423 int numCoreChannels = *numChannels; 1424 int numSbrChannels = 0; 1425 1426 psPossible = *psDecoded; 1427 1428 if (self->numSbrElements < 1) { 1429 /* exit immediately to avoid access violations */ 1430 return SBRDEC_CREATE_ERROR; 1431 } 1432 1433 /* Sanity check of allocated SBR elements. */ 1434 for (sbrElementNum=0; sbrElementNum<self->numSbrElements; sbrElementNum++) { 1435 if (self->pSbrElement[sbrElementNum] == NULL) { 1436 return SBRDEC_CREATE_ERROR; 1437 } 1438 } 1439 1440 if (self->numSbrElements != 1 || self->pSbrElement[0]->elementID != ID_SCE) { 1441 psPossible = 0; 1442 } 1443 1444 1445 /* In case of non-interleaved time domain data and upsampling, make room for bigger SBR output. */ 1446 if (self->synDownsampleFac == 1 && interleaved == 0) { 1447 int c, outputFrameSize; 1448 1449 outputFrameSize = 1450 self->pSbrElement[0]->pSbrChannel[0]->SbrDec.SynthesisQMF.no_channels 1451 * self->pSbrElement[0]->pSbrChannel[0]->SbrDec.SynthesisQMF.no_col; 1452 1453 for (c=numCoreChannels-1; c>0; c--) { 1454 FDKmemmove(timeData + c*outputFrameSize, timeData + c*self->codecFrameSize , self->codecFrameSize*sizeof(INT_PCM)); 1455 } 1456 } 1457 1458 1459 /* Make sure that even if no SBR data was found/parsed *psDecoded is returned 1 if psPossible was 0. */ 1460 if (psPossible == 0) { 1461 self->flags &= ~SBRDEC_PS_DECODED; 1462 } 1463 1464 /* Loop over SBR elements */ 1465 for (sbrElementNum = 0; sbrElementNum<self->numSbrElements; sbrElementNum++) 1466 { 1467 int numElementChan; 1468 1469 if (psPossible && self->pSbrElement[sbrElementNum]->pSbrChannel[1] == NULL) { 1470 errorStatus = SBRDEC_UNSUPPORTED_CONFIG; 1471 goto bail; 1472 } 1473 1474 numElementChan = (self->pSbrElement[sbrElementNum]->elementID == ID_CPE) ? 2 : 1; 1475 1476 /* If core signal is bad then force upsampling */ 1477 if ( ! coreDecodedOk ) { 1478 self->pSbrElement[sbrElementNum]->frameErrorFlag[self->pSbrElement[sbrElementNum]->useFrameSlot] = 1; 1479 } 1480 1481 errorStatus = sbrDecoder_DecodeElement ( 1482 self, 1483 timeData, 1484 interleaved, 1485 channelMapping, 1486 sbrElementNum, 1487 numCoreChannels, 1488 &numElementChan, 1489 psPossible 1490 ); 1491 1492 if (errorStatus != SBRDEC_OK) { 1493 goto bail; 1494 } 1495 1496 numSbrChannels += numElementChan; 1497 channelMapping += numElementChan; 1498 1499 if (numSbrChannels >= numCoreChannels) { 1500 break; 1501 } 1502 } 1503 1504 /* Update numChannels and samplerate */ 1505 *numChannels = numSbrChannels; 1506 *sampleRate = self->sampleRateOut; 1507 *psDecoded = (self->flags & SBRDEC_PS_DECODED) ? 1 : 0; 1508 1509 1510 1511 /* Clear reset and flush flag because everything seems to be done successfully. */ 1512 self->flags &= ~SBRDEC_FORCE_RESET; 1513 self->flags &= ~SBRDEC_FLUSH; 1514 1515 bail: 1516 1517 return errorStatus; 1518 } 1519 1520 1521 SBR_ERROR sbrDecoder_Close ( HANDLE_SBRDECODER *pSelf ) 1522 { 1523 HANDLE_SBRDECODER self = *pSelf; 1524 int i; 1525 1526 if (self != NULL) 1527 { 1528 if (self->hParametricStereoDec != NULL) { 1529 DeletePsDec ( &self->hParametricStereoDec ); 1530 } 1531 1532 if (self->workBuffer1 != NULL) { 1533 FreeRam_SbrDecWorkBuffer1(&self->workBuffer1); 1534 } 1535 if (self->workBuffer2 != NULL) { 1536 FreeRam_SbrDecWorkBuffer2(&self->workBuffer2); 1537 } 1538 1539 for (i = 0; i < (8); i++) { 1540 sbrDecoder_DestroyElement( self, i ); 1541 } 1542 1543 FreeRam_SbrDecoder(pSelf); 1544 } 1545 1546 return SBRDEC_OK; 1547 } 1548 1549 1550 INT sbrDecoder_GetLibInfo( LIB_INFO *info ) 1551 { 1552 int i; 1553 1554 if (info == NULL) { 1555 return -1; 1556 } 1557 1558 /* search for next free tab */ 1559 for (i = 0; i < FDK_MODULE_LAST; i++) { 1560 if (info[i].module_id == FDK_NONE) 1561 break; 1562 } 1563 if (i == FDK_MODULE_LAST) 1564 return -1; 1565 info += i; 1566 1567 info->module_id = FDK_SBRDEC; 1568 info->version = LIB_VERSION(SBRDECODER_LIB_VL0, SBRDECODER_LIB_VL1, SBRDECODER_LIB_VL2); 1569 LIB_VERSION_STRING(info); 1570 info->build_date = (char *)SBRDECODER_LIB_BUILD_DATE; 1571 info->build_time = (char *)SBRDECODER_LIB_BUILD_TIME; 1572 info->title = (char *)SBRDECODER_LIB_TITLE; 1573 1574 /* Set flags */ 1575 info->flags = 0 1576 | CAPF_SBR_HQ 1577 | CAPF_SBR_LP 1578 | CAPF_SBR_PS_MPEG 1579 | CAPF_SBR_CONCEALMENT 1580 | CAPF_SBR_DRC 1581 ; 1582 /* End of flags */ 1583 1584 return 0; 1585 } 1586 1587 1588 UINT sbrDecoder_GetDelay( const HANDLE_SBRDECODER self ) 1589 { 1590 UINT outputDelay = 0; 1591 1592 if ( self != NULL) { 1593 UINT flags = self->flags; 1594 1595 /* See chapter 1.6.7.2 of ISO/IEC 14496-3 for the GA-SBR figures below. */ 1596 1597 /* Are we initialized? */ 1598 if ( (self->numSbrChannels > 0) 1599 && (self->numSbrElements > 0) ) 1600 { 1601 /* Add QMF synthesis delay */ 1602 if ( (flags & SBRDEC_ELD_GRID) 1603 && IS_LOWDELAY(self->coreCodec) ) { 1604 /* Low delay SBR: */ 1605 { 1606 outputDelay += (flags & SBRDEC_DOWNSAMPLE) ? 32 : 64; /* QMF synthesis */ 1607 } 1608 } 1609 else if (!IS_USAC(self->coreCodec)) { 1610 /* By the method of elimination this is the GA (AAC-LC, HE-AAC, ...) branch: */ 1611 outputDelay += (flags & SBRDEC_DOWNSAMPLE) ? 481 : 962; 1612 } 1613 } 1614 } 1615 1616 return (outputDelay); 1617 } 1618