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 /***************************** MPEG-4 AAC Decoder ************************** 85 86 Author(s): Josef Hoepfl 87 Description: 88 89 ******************************************************************************/ 90 91 92 /*! 93 \page default General Overview of the AAC Decoder Implementation 94 95 The main entry point to decode a AAC frame is CAacDecoder_DecodeFrame(). It handles the different 96 transport multiplexes and bitstream formats supported by this implementation. It extracts the 97 AAC_raw_data_blocks from these bitstreams to further process then in the actual decoding stages. 98 99 Note: Click on a function of file in the above image to see details about the function. Also note, that 100 this is just an overview of the most important functions and not a complete call graph. 101 102 <h2>1 Bitstream deformatter</h2> 103 The basic bit stream parser function CChannelElement_Read() is called. It uses other subcalls in order 104 to parse and unpack the bitstreams. Note, that this includes huffmann decoding of the coded spectral data. 105 This operation can be computational significant specifically at higher bitrates. Optimization is likely in 106 CBlock_ReadSpectralData(). 107 108 The bitstream deformatter also includes many bitfield operations. Profiling on the target will determine 109 required optimizations. 110 111 <h2>2 Actual decoding to retain the time domain output</h2> 112 The basic bitstream deformatter function CChannelElement_Decode() for CPE elements and SCE elements are called. 113 Except for the stereo processing (2.1) which is only used for CPE elements, the function calls for CPE or SCE 114 are similar, except that CPE always processes to independent channels while SCE only processes one channel. 115 116 Often there is the distinction between long blocks and short blocks. However, computational expensive functions 117 that ususally require optimization are being shared by these two groups, 118 119 <h3>2.1 Stereo processing for CPE elements</h3> 120 CChannelPairElement_Decode() first calles the joint stereo tools in stereo.cpp when required. 121 122 <h3>2.2 Scaling of spectral data</h3> 123 CBlock_ScaleSpectralData(). 124 125 <h3>2.3 Apply additional coding tools</h3> 126 ApplyTools() calles the PNS tools in case of MPEG-4 bitstreams, and TNS filtering CTns_Apply() for MPEG-2 and MPEG-4 bitstreams. 127 The function TnsFilterIIR() which is called by CTns_Apply() (2.3.1) might require some optimization. 128 129 <h2>3 Frequency-To-Time conversion</h3> 130 The filterbank is called using CBlock_FrequencyToTime() using the MDCT module from the FDK Tools 131 132 */ 133 134 135 136 #include "aacdecoder.h" 137 138 #include "aac_rom.h" 139 #include "aac_ram.h" 140 #include "channel.h" 141 #include "FDK_audio.h" 142 143 #include "FDK_tools_rom.h" 144 145 #include "aacdec_pns.h" 146 147 #include "sbrdecoder.h" 148 149 150 151 152 #include "aacdec_hcr.h" 153 #include "rvlc.h" 154 155 156 #include "tpdec_lib.h" 157 158 #include "conceal.h" 159 160 161 162 #define CAN_DO_PS(aot) \ 163 ((aot) == AOT_AAC_LC \ 164 || (aot) == AOT_SBR \ 165 || (aot) == AOT_PS \ 166 || (aot) == AOT_ER_BSAC \ 167 || (aot) == AOT_DRM_AAC) 168 169 #define IS_USAC(aot) \ 170 ((aot) == AOT_USAC \ 171 || (aot) == AOT_RSVD50) 172 173 #define IS_LOWDELAY(aot) \ 174 ((aot) == AOT_ER_AAC_LD \ 175 || (aot) == AOT_ER_AAC_ELD) 176 177 void CAacDecoder_SyncQmfMode(HANDLE_AACDECODER self) 178 { 179 180 /* Assign user requested mode */ 181 self->qmfModeCurr = self->qmfModeUser; 182 183 if ( self->qmfModeCurr == NOT_DEFINED ) 184 { 185 if ( (IS_LOWDELAY(self->streamInfo.aot) && (self->flags & AC_MPS_PRESENT)) 186 || ( (self->streamInfo.aacNumChannels == 1) 187 && ( (CAN_DO_PS(self->streamInfo.aot) && !(self->flags & AC_MPS_PRESENT)) 188 || ( IS_USAC(self->streamInfo.aot) && (self->flags & AC_MPS_PRESENT)) ) ) ) 189 { 190 self->qmfModeCurr = MODE_HQ; 191 } else { 192 self->qmfModeCurr = MODE_LP; 193 } 194 } 195 196 197 /* Set SBR to current QMF mode. Error does not matter. */ 198 sbrDecoder_SetParam(self->hSbrDecoder, SBR_QMF_MODE, (self->qmfModeCurr == MODE_LP)); 199 self->psPossible = ((CAN_DO_PS(self->streamInfo.aot) && self->streamInfo.aacNumChannels == 1 && ! (self->flags & AC_MPS_PRESENT))) && self->qmfModeCurr == MODE_HQ ; 200 FDK_ASSERT( ! ( (self->flags & AC_MPS_PRESENT) && self->psPossible ) ); 201 } 202 203 void CAacDecoder_SignalInterruption(HANDLE_AACDECODER self) 204 { 205 } 206 207 /*! 208 \brief Reset ancillary data struct. Call before parsing a new frame. 209 210 \ancData Pointer to ancillary data structure 211 212 \return Error code 213 */ 214 static AAC_DECODER_ERROR CAacDecoder_AncDataReset(CAncData *ancData) 215 { 216 int i; 217 for (i=0; i<8; i++) 218 { 219 ancData->offset[i] = 0; 220 } 221 ancData->nrElements = 0; 222 223 return AAC_DEC_OK; 224 } 225 226 /*! 227 \brief Initialize ancillary buffer 228 229 \ancData Pointer to ancillary data structure 230 \buffer Pointer to (external) anc data buffer 231 \size Size of the buffer pointed on by buffer in bytes 232 233 \return Error code 234 */ 235 AAC_DECODER_ERROR CAacDecoder_AncDataInit(CAncData *ancData, unsigned char *buffer, int size) 236 { 237 if (size >= 0) { 238 ancData->buffer = buffer; 239 ancData->bufferSize = size; 240 241 CAacDecoder_AncDataReset(ancData); 242 243 return AAC_DEC_OK; 244 } 245 246 return AAC_DEC_ANC_DATA_ERROR; 247 } 248 249 /*! 250 \brief Get one ancillary data element 251 252 \ancData Pointer to ancillary data structure 253 \index Index of the anc data element to get 254 \ptr Pointer to a buffer receiving a pointer to the requested anc data element 255 \size Pointer to a buffer receiving the length of the requested anc data element in bytes 256 257 \return Error code 258 */ 259 AAC_DECODER_ERROR CAacDecoder_AncDataGet(CAncData *ancData, int index, unsigned char **ptr, int *size) 260 { 261 AAC_DECODER_ERROR error = AAC_DEC_OK; 262 263 *ptr = NULL; 264 *size = 0; 265 266 if (index >= 0 && index < 8 && index < ancData->nrElements) 267 { 268 *ptr = &ancData->buffer[ancData->offset[index]]; 269 *size = ancData->offset[index+1] - ancData->offset[index]; 270 } 271 272 return error; 273 } 274 275 276 /*! 277 \brief Parse ancillary data 278 279 \ancData Pointer to ancillary data structure 280 \hBs Handle to FDK bitstream 281 \ancBytes Length of ancillary data to read from the bitstream 282 283 \return Error code 284 */ 285 static 286 AAC_DECODER_ERROR CAacDecoder_AncDataParse ( 287 CAncData *ancData, 288 HANDLE_FDK_BITSTREAM hBs, 289 const int ancBytes ) 290 { 291 AAC_DECODER_ERROR error = AAC_DEC_OK; 292 int readBytes = 0; 293 294 if (ancData->buffer != NULL) 295 { 296 if (ancBytes > 0) { 297 /* write ancillary data to external buffer */ 298 int offset = ancData->offset[ancData->nrElements]; 299 300 if ((offset + ancBytes) > ancData->bufferSize) 301 { 302 error = AAC_DEC_TOO_SMALL_ANC_BUFFER; 303 } 304 else if (ancData->nrElements >= 8-1) 305 { 306 error = AAC_DEC_TOO_MANY_ANC_ELEMENTS; 307 } 308 else 309 { 310 int i; 311 312 for (i = 0; i < ancBytes; i++) { 313 ancData->buffer[i+offset] = FDKreadBits(hBs, 8); 314 readBytes++; 315 } 316 317 ancData->nrElements++; 318 ancData->offset[ancData->nrElements] = ancBytes + ancData->offset[ancData->nrElements-1]; 319 } 320 } 321 } 322 323 readBytes = ancBytes - readBytes; 324 325 if (readBytes > 0) { 326 /* skip data */ 327 FDKpushFor(hBs, readBytes<<3); 328 } 329 330 return error; 331 } 332 333 /*! 334 \brief Read Stream Data Element 335 336 \bs Bitstream Handle 337 338 \return Error code 339 */ 340 static AAC_DECODER_ERROR CDataStreamElement_Read ( 341 HANDLE_AACDECODER self, 342 HANDLE_FDK_BITSTREAM bs, 343 UCHAR *elementInstanceTag, 344 UINT alignmentAnchor ) 345 { 346 HANDLE_TRANSPORTDEC pTp; 347 CAncData *ancData; 348 AAC_DECODER_ERROR error = AAC_DEC_OK; 349 UINT dataStart, dseBits; 350 int dataByteAlignFlag, count; 351 352 FDK_ASSERT(self != NULL); 353 354 ancData = &self->ancData; 355 pTp = self->hInput; 356 357 int crcReg = transportDec_CrcStartReg(pTp, 0); 358 359 /* Element Instance Tag */ 360 *elementInstanceTag = FDKreadBits(bs,4); 361 /* Data Byte Align Flag */ 362 dataByteAlignFlag = FDKreadBits(bs,1); 363 364 count = FDKreadBits(bs,8); 365 366 if (count == 255) { 367 count += FDKreadBits(bs,8); /* EscCount */ 368 } 369 dseBits = count*8; 370 371 if (dataByteAlignFlag) { 372 FDKbyteAlign(bs, alignmentAnchor); 373 } 374 375 dataStart = FDKgetValidBits(bs); 376 377 error = CAacDecoder_AncDataParse(ancData, bs, count); 378 transportDec_CrcEndReg(pTp, crcReg); 379 380 { 381 /* Move to the beginning of the data junk */ 382 FDKpushBack(bs, dataStart-FDKgetValidBits(bs)); 383 384 /* Read Anc data if available */ 385 aacDecoder_drcMarkPayload( self->hDrcInfo, bs, DVB_DRC_ANC_DATA ); 386 } 387 388 { 389 PCMDMX_ERROR dmxErr = PCMDMX_OK; 390 391 /* Move to the beginning of the data junk */ 392 FDKpushBack(bs, dataStart-FDKgetValidBits(bs)); 393 394 /* Read DMX meta-data */ 395 dmxErr = pcmDmx_Parse ( 396 self->hPcmUtils, 397 bs, 398 dseBits, 399 0 /* not mpeg2 */ ); 400 } 401 402 /* Move to the very end of the element. */ 403 FDKpushBiDirectional(bs, FDKgetValidBits(bs)-dataStart+dseBits); 404 405 return error; 406 } 407 408 #ifdef TP_PCE_ENABLE 409 /*! 410 \brief Read Program Config Element 411 412 \bs Bitstream Handle 413 \pTp Transport decoder handle for CRC handling 414 \pce Pointer to PCE buffer 415 \channelConfig Current channel configuration 416 \alignAnchor Anchor for byte alignment 417 418 \return PCE status (-1: fail, 0: no new PCE, 1: PCE updated, 2: PCE updated need re-config). 419 */ 420 static int CProgramConfigElement_Read ( 421 HANDLE_FDK_BITSTREAM bs, 422 HANDLE_TRANSPORTDEC pTp, 423 CProgramConfig *pce, 424 const UINT channelConfig, 425 const UINT alignAnchor ) 426 { 427 int pceStatus = 0; 428 int crcReg; 429 430 /* read PCE to temporal buffer first */ 431 C_ALLOC_SCRATCH_START(tmpPce, CProgramConfig, 1); 432 433 CProgramConfig_Init(tmpPce); 434 CProgramConfig_Reset(tmpPce); 435 436 crcReg = transportDec_CrcStartReg(pTp, 0); 437 438 CProgramConfig_Read(tmpPce, bs, alignAnchor); 439 440 transportDec_CrcEndReg(pTp, crcReg); 441 442 if ( CProgramConfig_IsValid(tmpPce) 443 && (tmpPce->Profile == 1) ) 444 { 445 if ( !pce->isValid && (channelConfig > 0) ) { 446 /* Create a standard channel config PCE to compare with */ 447 CProgramConfig_GetDefault( pce, channelConfig ); 448 } 449 450 if (pce->isValid) { 451 /* Compare the new and the old PCE (tags ignored) */ 452 switch ( CProgramConfig_Compare( pce, tmpPce ) ) 453 { 454 case 1: /* Channel configuration not changed. Just new metadata. */ 455 FDKmemcpy(pce, tmpPce, sizeof(CProgramConfig)); /* Store the complete PCE */ 456 pceStatus = 1; /* New PCE but no change of config */ 457 break; 458 case 2: /* The number of channels are identical but not the config */ 459 if (channelConfig == 0) { 460 FDKmemcpy(pce, tmpPce, sizeof(CProgramConfig)); /* Store the complete PCE */ 461 pceStatus = 2; /* Decoder needs re-configuration */ 462 } 463 break; 464 case -1: /* The channel configuration is completely different */ 465 pceStatus = -1; /* Not supported! */ 466 break; 467 case 0: /* Nothing to do because PCE matches the old one exactly. */ 468 default: 469 /* pceStatus = 0; */ 470 break; 471 } 472 } 473 } 474 475 C_ALLOC_SCRATCH_END(tmpPce, CProgramConfig, 1); 476 477 return pceStatus; 478 } 479 #endif /* TP_PCE_ENABLE */ 480 481 /*! 482 \brief Parse Extension Payload 483 484 \self Handle of AAC decoder 485 \count Pointer to bit counter. 486 \previous_element ID of previous element (required by some extension payloads) 487 488 \return Error code 489 */ 490 static 491 AAC_DECODER_ERROR CAacDecoder_ExtPayloadParse (HANDLE_AACDECODER self, 492 HANDLE_FDK_BITSTREAM hBs, 493 int *count, 494 MP4_ELEMENT_ID previous_element, 495 int elIndex, 496 int fIsFillElement) 497 { 498 AAC_DECODER_ERROR error = AAC_DEC_OK; 499 EXT_PAYLOAD_TYPE extension_type; 500 int bytes = (*count) >> 3; 501 int crcFlag = 0; 502 503 if (*count < 4) { 504 return AAC_DEC_PARSE_ERROR; 505 } else if ((INT)FDKgetValidBits(hBs) < *count) { 506 return AAC_DEC_DECODE_FRAME_ERROR; 507 } 508 509 extension_type = (EXT_PAYLOAD_TYPE) FDKreadBits(hBs, 4); /* bs_extension_type */ 510 *count -= 4; 511 512 switch (extension_type) 513 { 514 case EXT_DYNAMIC_RANGE: 515 { 516 INT readBits = aacDecoder_drcMarkPayload( self->hDrcInfo, hBs, MPEG_DRC_EXT_DATA ); 517 518 if (readBits > *count) 519 { /* Read too much. Something went wrong! */ 520 error = AAC_DEC_PARSE_ERROR; 521 } 522 *count -= readBits; 523 } 524 break; 525 526 527 case EXT_SBR_DATA_CRC: 528 crcFlag = 1; 529 case EXT_SBR_DATA: 530 if (IS_CHANNEL_ELEMENT(previous_element)) { 531 SBR_ERROR sbrError; 532 533 CAacDecoder_SyncQmfMode(self); 534 535 sbrError = sbrDecoder_InitElement( 536 self->hSbrDecoder, 537 self->streamInfo.aacSampleRate, 538 self->streamInfo.extSamplingRate, 539 self->streamInfo.aacSamplesPerFrame, 540 self->streamInfo.aot, 541 previous_element, 542 elIndex 543 ); 544 545 if (sbrError == SBRDEC_OK) { 546 sbrError = sbrDecoder_Parse ( 547 self->hSbrDecoder, 548 hBs, 549 count, 550 *count, 551 crcFlag, 552 previous_element, 553 elIndex, 554 self->flags & AC_INDEP ); 555 /* Enable SBR for implicit SBR signalling. */ 556 if (sbrError == SBRDEC_OK) { 557 self->sbrEnabled = 1; 558 } 559 } else { 560 /* Do not try to apply SBR because initializing the element failed. */ 561 self->sbrEnabled = 0; 562 } 563 /* Citation from ISO/IEC 14496-3 chapter 4.5.2.1.5.2 564 Fill elements containing an extension_payload() with an extension_type of EXT_SBR_DATA 565 or EXT_SBR_DATA_CRC shall not contain any other extension_payload of any other extension_type. 566 */ 567 if (fIsFillElement) { 568 FDKpushBiDirectional(hBs, *count); 569 *count = 0; 570 } else { 571 /* If this is not a fill element with a known length, we are screwed an no further parsing makes sense. */ 572 if (sbrError != SBRDEC_OK) { 573 self->frameOK = 0; 574 } 575 } 576 } else { 577 error = AAC_DEC_PARSE_ERROR; 578 } 579 break; 580 581 case EXT_FILL_DATA: 582 { 583 int temp; 584 585 temp = FDKreadBits(hBs,4); 586 bytes--; 587 if (temp != 0) { 588 error = AAC_DEC_PARSE_ERROR; 589 break; 590 } 591 while (bytes > 0) { 592 temp = FDKreadBits(hBs,8); 593 bytes--; 594 if (temp != 0xa5) { 595 error = AAC_DEC_PARSE_ERROR; 596 break; 597 } 598 } 599 *count = bytes<<3; 600 } 601 break; 602 603 case EXT_DATA_ELEMENT: 604 { 605 int dataElementVersion; 606 607 dataElementVersion = FDKreadBits(hBs,4); 608 *count -= 4; 609 if (dataElementVersion == 0) /* ANC_DATA */ 610 { 611 int temp, dataElementLength = 0; 612 do { 613 temp = FDKreadBits(hBs,8); 614 *count -= 8; 615 dataElementLength += temp; 616 } while (temp == 255 ); 617 618 CAacDecoder_AncDataParse(&self->ancData, hBs, dataElementLength); 619 *count -= (dataElementLength<<3); 620 } else { 621 /* align = 0 */ 622 error = AAC_DEC_PARSE_ERROR; 623 goto bail; 624 } 625 } 626 break; 627 628 case EXT_DATA_LENGTH: 629 if ( !fIsFillElement /* Makes no sens to have an additional length in a fill ... */ 630 && (self->flags & AC_ER) ) /* ... element because this extension payload type was ... */ 631 { /* ... created to circumvent the missing length in ER-Syntax. */ 632 int bitCnt, len = FDKreadBits(hBs, 4); 633 *count -= 4; 634 635 if (len == 15) { 636 int add_len = FDKreadBits(hBs, 8); 637 *count -= 8; 638 len += add_len; 639 640 if (add_len == 255) { 641 len += FDKreadBits(hBs, 16); 642 *count -= 16; 643 } 644 } 645 len <<= 3; 646 bitCnt = len; 647 648 if ( (EXT_PAYLOAD_TYPE)FDKreadBits(hBs, 4) == EXT_DATA_LENGTH ) { 649 /* Check NOTE 2: The extension_payload() included here must 650 not have extension_type == EXT_DATA_LENGTH. */ 651 error = AAC_DEC_PARSE_ERROR; 652 } else { 653 /* rewind and call myself again. */ 654 FDKpushBack(hBs, 4); 655 656 error = 657 CAacDecoder_ExtPayloadParse ( 658 self, 659 hBs, 660 &bitCnt, 661 previous_element, 662 elIndex, 663 0 ); 664 665 *count -= len - bitCnt; 666 } 667 /* Note: the fall through in case the if statement above is not taken is intentional. */ 668 break; 669 } 670 671 case EXT_FIL: 672 673 default: 674 /* align = 4 */ 675 FDKpushFor(hBs, *count); 676 *count = 0; 677 break; 678 } 679 680 bail: 681 if ( (error != AAC_DEC_OK) 682 && fIsFillElement ) 683 { /* Skip the remaining extension bytes */ 684 FDKpushBiDirectional(hBs, *count); 685 *count = 0; 686 /* Patch error code because decoding can go on. */ 687 error = AAC_DEC_OK; 688 /* Be sure that parsing errors have been stored. */ 689 } 690 return error; 691 } 692 693 /* Stream Configuration and Information. 694 695 This class holds configuration and information data for a stream to be decoded. It 696 provides the calling application as well as the decoder with substantial information, 697 e.g. profile, sampling rate, number of channels found in the bitstream etc. 698 */ 699 static 700 void CStreamInfoInit(CStreamInfo *pStreamInfo) 701 { 702 pStreamInfo->aacSampleRate = 0; 703 pStreamInfo->profile = -1; 704 pStreamInfo->aot = AOT_NONE; 705 706 pStreamInfo->channelConfig = -1; 707 pStreamInfo->bitRate = 0; 708 pStreamInfo->aacSamplesPerFrame = 0; 709 710 pStreamInfo->extAot = AOT_NONE; 711 pStreamInfo->extSamplingRate = 0; 712 713 pStreamInfo->flags = 0; 714 715 pStreamInfo->epConfig = -1; /* default is no ER */ 716 717 pStreamInfo->numChannels = 0; 718 pStreamInfo->sampleRate = 0; 719 pStreamInfo->frameSize = 0; 720 721 pStreamInfo->outputDelay = 0; 722 723 /* DRC */ 724 pStreamInfo->drcProgRefLev = -1; /* set program reference level to not indicated */ 725 pStreamInfo->drcPresMode = -1; /* default: presentation mode not indicated */ 726 } 727 728 /*! 729 \brief Initialization of AacDecoderChannelInfo 730 731 The function initializes the pointers to AacDecoderChannelInfo for each channel, 732 set the start values for window shape and window sequence of overlap&add to zero, 733 set the overlap buffer to zero and initializes the pointers to the window coefficients. 734 \param bsFormat is the format of the AAC bitstream 735 736 \return AACDECODER instance 737 */ 738 LINKSPEC_CPP HANDLE_AACDECODER CAacDecoder_Open(TRANSPORT_TYPE bsFormat) /*!< bitstream format (adif,adts,loas,...). */ 739 { 740 HANDLE_AACDECODER self; 741 742 self = GetAacDecoder(); 743 if (self == NULL) { 744 goto bail; 745 } 746 747 /* Assign channel mapping info arrays (doing so removes dependency of settings header in API header). */ 748 self->streamInfo.pChannelIndices = self->channelIndices; 749 self->streamInfo.pChannelType = self->channelType; 750 751 /* set default output mode */ 752 self->outputInterleaved = 1; /* interleaved */ 753 754 /* initialize anc data */ 755 CAacDecoder_AncDataInit(&self->ancData, NULL, 0); 756 757 /* initialize stream info */ 758 CStreamInfoInit(&self->streamInfo); 759 760 /* initialize error concealment common data */ 761 CConcealment_InitCommonData(&self->concealCommonData); 762 763 self->hDrcInfo = GetDrcInfo(); 764 if (self->hDrcInfo == NULL) { 765 goto bail; 766 } 767 /* Init common DRC structure */ 768 aacDecoder_drcInit( self->hDrcInfo ); 769 /* Set default frame delay */ 770 aacDecoder_drcSetParam ( 771 self->hDrcInfo, 772 DRC_BS_DELAY, 773 CConcealment_GetDelay(&self->concealCommonData) 774 ); 775 776 777 self->aacCommonData.workBufferCore1 = GetWorkBufferCore1(); 778 self->aacCommonData.workBufferCore2 = GetWorkBufferCore2(); 779 if (self->aacCommonData.workBufferCore1 == NULL 780 ||self->aacCommonData.workBufferCore2 == NULL ) 781 goto bail; 782 783 return self; 784 785 bail: 786 CAacDecoder_Close( self ); 787 788 return NULL; 789 } 790 791 /* Destroy aac decoder */ 792 LINKSPEC_CPP void CAacDecoder_Close(HANDLE_AACDECODER self) 793 { 794 int ch; 795 796 if (self == NULL) 797 return; 798 799 for (ch=0; ch<(8); ch++) { 800 if (self->pAacDecoderStaticChannelInfo[ch] != NULL) { 801 if (self->pAacDecoderStaticChannelInfo[ch]->pOverlapBuffer != NULL) { 802 FreeOverlapBuffer (&self->pAacDecoderStaticChannelInfo[ch]->pOverlapBuffer); 803 } 804 if (self->pAacDecoderStaticChannelInfo[ch] != NULL) { 805 FreeAacDecoderStaticChannelInfo (&self->pAacDecoderStaticChannelInfo[ch]); 806 } 807 } 808 if (self->pAacDecoderChannelInfo[ch] != NULL) { 809 FreeAacDecoderChannelInfo (&self->pAacDecoderChannelInfo[ch]); 810 } 811 } 812 813 self->aacChannels = 0; 814 815 if (self->hDrcInfo) { 816 FreeDrcInfo(&self->hDrcInfo); 817 } 818 819 if (self->aacCommonData.workBufferCore1 != NULL) { 820 FreeWorkBufferCore1 (&self->aacCommonData.workBufferCore1); 821 } 822 if (self->aacCommonData.workBufferCore2 != NULL) { 823 FreeWorkBufferCore2 (&self->aacCommonData.workBufferCore2); 824 } 825 826 FreeAacDecoder ( &self); 827 } 828 829 830 /*! 831 \brief Initialization of decoder instance 832 833 The function initializes the decoder. 834 835 \return error status: 0 for success, <>0 for unsupported configurations 836 */ 837 LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_Init(HANDLE_AACDECODER self, const CSAudioSpecificConfig *asc) 838 { 839 AAC_DECODER_ERROR err = AAC_DEC_OK; 840 INT ascChannels, ch, ascChanged = 0; 841 842 if (!self) 843 return AAC_DEC_INVALID_HANDLE; 844 845 // set profile and check for supported aot 846 // leave profile on default (=-1) for all other supported MPEG-4 aot's except aot=2 (=AAC-LC) 847 switch (asc->m_aot) { 848 case AOT_AAC_LC: 849 self->streamInfo.profile = 1; 850 break; 851 852 case AOT_SBR: 853 case AOT_PS: 854 case AOT_ER_AAC_LD: 855 case AOT_ER_AAC_ELD: 856 break; 857 858 default: 859 return AAC_DEC_UNSUPPORTED_AOT; 860 } 861 862 CProgramConfig_Init(&self->pce); 863 864 /* set channels */ 865 switch (asc->m_channelConfiguration) { 866 case 0: 867 #ifdef TP_PCE_ENABLE 868 /* get channels from program config (ASC) */ 869 if (CProgramConfig_IsValid(&asc->m_progrConfigElement)) { 870 ascChannels = asc->m_progrConfigElement.NumChannels; 871 if (ascChannels > 0) { 872 int el; 873 /* valid number of channels -> copy program config element (PCE) from ASC */ 874 FDKmemcpy(&self->pce, &asc->m_progrConfigElement, sizeof(CProgramConfig)); 875 /* Built element table */ 876 el = CProgramConfig_GetElementTable(&asc->m_progrConfigElement, self->elements, (8), &self->chMapIndex); 877 for (; el<(8); el++) { 878 self->elements[el] = ID_NONE; 879 } 880 } else { 881 return AAC_DEC_UNSUPPORTED_CHANNELCONFIG; 882 } 883 } else { 884 self->chMapIndex = 0; 885 if (transportDec_GetFormat(self->hInput) == TT_MP4_ADTS) { 886 /* set default max_channels for memory allocation because in implicit channel mapping mode 887 we don't know the actual number of channels until we processed at least one raw_data_block(). */ 888 ascChannels = (8); 889 } else { 890 return AAC_DEC_UNSUPPORTED_CHANNELCONFIG; 891 } 892 } 893 #else /* TP_PCE_ENABLE */ 894 return AAC_DEC_UNSUPPORTED_CHANNELCONFIG; 895 #endif /* TP_PCE_ENABLE */ 896 break; 897 case 1: case 2: case 3: case 4: case 5: case 6: 898 ascChannels = asc->m_channelConfiguration; 899 break; 900 case 11: 901 ascChannels = 7; 902 break; 903 case 7: case 12: case 14: 904 ascChannels = 8; 905 break; 906 default: 907 return AAC_DEC_UNSUPPORTED_CHANNELCONFIG; 908 } 909 910 if (ascChannels > (8)) { 911 return AAC_DEC_UNSUPPORTED_CHANNELCONFIG; 912 } 913 914 /* Initialize constant mappings for channel config 1-7 */ 915 if (asc->m_channelConfiguration > 0) { 916 int el; 917 FDKmemcpy(self->elements, elementsTab[asc->m_channelConfiguration-1], sizeof(MP4_ELEMENT_ID)*FDKmin(7,(8))); 918 for (el=7; el<(8); el++) { 919 self->elements[el] = ID_NONE; 920 } 921 for (ch=0; ch<ascChannels; ch++) { 922 self->chMapping[ch] = ch; 923 } 924 for (; ch<(8); ch++) { 925 self->chMapping[ch] = 255; 926 } 927 self->chMapIndex = asc->m_channelConfiguration; 928 } 929 #ifdef TP_PCE_ENABLE 930 else { 931 if (CProgramConfig_IsValid(&asc->m_progrConfigElement)) { 932 /* Set matrix mixdown infos if available from PCE. */ 933 pcmDmx_SetMatrixMixdownFromPce ( self->hPcmUtils, 934 asc->m_progrConfigElement.MatrixMixdownIndexPresent, 935 asc->m_progrConfigElement.MatrixMixdownIndex, 936 asc->m_progrConfigElement.PseudoSurroundEnable ); 937 } 938 } 939 #endif 940 941 self->streamInfo.channelConfig = asc->m_channelConfiguration; 942 943 if (self->streamInfo.aot != asc->m_aot) { 944 self->streamInfo.aot = asc->m_aot; 945 ascChanged = 1; 946 } 947 948 if (self->streamInfo.aacSamplesPerFrame != (INT)asc->m_samplesPerFrame) { 949 self->streamInfo.aacSamplesPerFrame = asc->m_samplesPerFrame; 950 ascChanged = 1; 951 } 952 953 self->streamInfo.bitRate = 0; 954 955 /* Set syntax flags */ 956 self->flags = 0; 957 958 self->streamInfo.extAot = asc->m_extensionAudioObjectType; 959 self->streamInfo.extSamplingRate = asc->m_extensionSamplingFrequency; 960 self->flags |= (asc->m_sbrPresentFlag) ? AC_SBR_PRESENT : 0; 961 self->flags |= (asc->m_psPresentFlag) ? AC_PS_PRESENT : 0; 962 self->sbrEnabled = 0; 963 964 /* --------- vcb11 ------------ */ 965 self->flags |= (asc->m_vcb11Flag) ? AC_ER_VCB11 : 0; 966 967 /* ---------- rvlc ------------ */ 968 self->flags |= (asc->m_rvlcFlag) ? AC_ER_RVLC : 0; 969 970 /* ----------- hcr ------------ */ 971 self->flags |= (asc->m_hcrFlag) ? AC_ER_HCR : 0; 972 973 if (asc->m_aot == AOT_ER_AAC_ELD) { 974 self->flags |= AC_ELD; 975 self->flags |= (asc->m_sc.m_eldSpecificConfig.m_sbrCrcFlag) ? AC_SBRCRC : 0; 976 self->flags |= (asc->m_sc.m_eldSpecificConfig.m_useLdQmfTimeAlign) ? AC_LD_MPS : 0; 977 } 978 self->flags |= (asc->m_aot == AOT_ER_AAC_LD) ? AC_LD : 0; 979 self->flags |= (asc->m_epConfig >= 0) ? AC_ER : 0; 980 981 982 if (asc->m_sbrPresentFlag) { 983 self->sbrEnabled = 1; 984 self->sbrEnabledPrev = 1; 985 } 986 if (asc->m_psPresentFlag) { 987 self->flags |= AC_PS_PRESENT; 988 } 989 990 if ( (asc->m_epConfig >= 0) 991 && (asc->m_channelConfiguration <= 0) ) { 992 /* we have to know the number of channels otherwise no decoding is possible */ 993 return AAC_DEC_UNSUPPORTED_ER_FORMAT; 994 } 995 996 self->streamInfo.epConfig = asc->m_epConfig; 997 /* self->hInput->asc.m_epConfig = asc->m_epConfig; */ 998 999 if (asc->m_epConfig > 1) 1000 return AAC_DEC_UNSUPPORTED_ER_FORMAT; 1001 1002 /* Check if samplerate changed. */ 1003 if (self->streamInfo.aacSampleRate != (INT)asc->m_samplingFrequency) { 1004 AAC_DECODER_ERROR error; 1005 1006 ascChanged = 1; 1007 1008 /* Update samplerate info. */ 1009 error = getSamplingRateInfo(&self->samplingRateInfo, asc->m_samplesPerFrame, asc->m_samplingFrequencyIndex, asc->m_samplingFrequency); 1010 if (error != AAC_DEC_OK) { 1011 return error; 1012 } 1013 self->streamInfo.aacSampleRate = self->samplingRateInfo.samplingRate; 1014 } 1015 1016 /* Check if amount of channels has changed. */ 1017 if (self->ascChannels != ascChannels) 1018 { 1019 ascChanged = 1; 1020 1021 /* Allocate all memory structures for each channel */ 1022 { 1023 for (ch = 0; ch < ascChannels; ch++) { 1024 CAacDecoderDynamicData *aacDecoderDynamicData = &self->aacCommonData.workBufferCore1->pAacDecoderDynamicData[ch%2]; 1025 1026 /* initialize pointer to CAacDecoderChannelInfo */ 1027 if (self->pAacDecoderChannelInfo[ch] == NULL) { 1028 self->pAacDecoderChannelInfo[ch] = GetAacDecoderChannelInfo(ch); 1029 /* This is temporary until the DynamicData is split into two or more regions! 1030 The memory could be reused after completed core decoding. */ 1031 if (self->pAacDecoderChannelInfo[ch] == NULL) { 1032 goto bail; 1033 } 1034 /* Hook shared work memory into channel data structure */ 1035 self->pAacDecoderChannelInfo[ch]->pDynData = aacDecoderDynamicData; 1036 self->pAacDecoderChannelInfo[ch]->pComData = &self->aacCommonData; 1037 } 1038 1039 /* Allocate persistent channel memory */ 1040 if (self->pAacDecoderStaticChannelInfo[ch] == NULL) { 1041 self->pAacDecoderStaticChannelInfo[ch] = GetAacDecoderStaticChannelInfo(ch); 1042 if (self->pAacDecoderStaticChannelInfo[ch] == NULL) { 1043 goto bail; 1044 } 1045 self->pAacDecoderStaticChannelInfo[ch]->pOverlapBuffer = GetOverlapBuffer(ch); /* This area size depends on the AOT */ 1046 if (self->pAacDecoderStaticChannelInfo[ch]->pOverlapBuffer == NULL) { 1047 goto bail; 1048 } 1049 self->pAacDecoderChannelInfo[ch]->pSpectralCoefficient = (SPECTRAL_PTR) &self->aacCommonData.workBufferCore2[ch*1024]; 1050 1051 } 1052 CPns_InitPns(&self->pAacDecoderChannelInfo[ch]->data.aac.PnsData, &self->aacCommonData.pnsInterChannelData, &self->aacCommonData.pnsCurrentSeed, self->aacCommonData.pnsRandomSeed); 1053 } 1054 1055 if (ascChannels > self->aacChannels) 1056 { 1057 /* Make allocated channel count persistent in decoder context. */ 1058 self->aacChannels = ascChannels; 1059 } 1060 1061 HcrInitRom(&self->aacCommonData.overlay.aac.erHcrInfo); 1062 setHcrType(&self->aacCommonData.overlay.aac.erHcrInfo, ID_SCE); 1063 } 1064 1065 /* Make amount of signalled channels persistent in decoder context. */ 1066 self->ascChannels = ascChannels; 1067 } 1068 1069 /* Update structures */ 1070 if (ascChanged) { 1071 1072 /* Things to be done for each channel, which do not involve allocating memory. 1073 Doing these things only on the channels needed for the current configuration 1074 (ascChannels) could lead to memory access violation later (error concealment). */ 1075 for (ch = 0; ch < self->aacChannels; ch++) { 1076 switch (self->streamInfo.aot) { 1077 case AOT_ER_AAC_ELD: 1078 case AOT_ER_AAC_LD: 1079 self->pAacDecoderChannelInfo[ch]->granuleLength = self->streamInfo.aacSamplesPerFrame; 1080 break; 1081 default: 1082 self->pAacDecoderChannelInfo[ch]->granuleLength = self->streamInfo.aacSamplesPerFrame / 8; 1083 break; 1084 } 1085 mdct_init( &self->pAacDecoderStaticChannelInfo[ch]->IMdct, 1086 self->pAacDecoderStaticChannelInfo[ch]->pOverlapBuffer, 1087 OverlapBufferSize ); 1088 1089 1090 /* Reset DRC control data for this channel */ 1091 aacDecoder_drcInitChannelData ( &self->pAacDecoderStaticChannelInfo[ch]->drcData ); 1092 1093 /* Reset concealment only if ASC changed. Otherwise it will be done with any config callback. 1094 E.g. every time the LATM SMC is present. */ 1095 CConcealment_InitChannelData(&self->pAacDecoderStaticChannelInfo[ch]->concealmentInfo, 1096 &self->concealCommonData, 1097 self->streamInfo.aacSamplesPerFrame ); 1098 } 1099 } 1100 1101 /* Update externally visible copy of flags */ 1102 self->streamInfo.flags = self->flags; 1103 1104 return err; 1105 1106 bail: 1107 aacDecoder_Close( self ); 1108 return AAC_DEC_OUT_OF_MEMORY; 1109 } 1110 1111 1112 LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_DecodeFrame( 1113 HANDLE_AACDECODER self, 1114 const UINT flags, 1115 INT_PCM *pTimeData, 1116 const INT timeDataSize, 1117 const INT interleaved 1118 ) 1119 { 1120 AAC_DECODER_ERROR ErrorStatus = AAC_DEC_OK; 1121 1122 CProgramConfig *pce; 1123 HANDLE_FDK_BITSTREAM bs = transportDec_GetBitstream(self->hInput, 0); 1124 1125 MP4_ELEMENT_ID type = ID_NONE; /* Current element type */ 1126 INT aacChannels=0; /* Channel counter for channels found in the bitstream */ 1127 int chOutMapIdx; /* Output channel mapping index (see comment below) */ 1128 1129 INT auStartAnchor = (INT)FDKgetValidBits(bs); /* AU start bit buffer position for AU byte alignment */ 1130 1131 self->frameOK = 1; 1132 1133 /* Any supported base layer valid AU will require more than 16 bits. */ 1134 if ( (transportDec_GetAuBitsRemaining(self->hInput, 0) < 15) && (flags & (AACDEC_CONCEAL|AACDEC_FLUSH)) == 0) { 1135 self->frameOK = 0; 1136 ErrorStatus = AAC_DEC_DECODE_FRAME_ERROR; 1137 } 1138 1139 1140 /* Reset Program Config structure */ 1141 pce = &self->pce; 1142 CProgramConfig_Reset(pce); 1143 1144 CAacDecoder_AncDataReset(&self->ancData); 1145 1146 { 1147 int ch; 1148 1149 if (self->streamInfo.channelConfig == 0) { 1150 /* Init Channel/Element mapping table */ 1151 for (ch=0; ch<(8); ch++) { 1152 self->chMapping[ch] = 255; 1153 } 1154 if (!CProgramConfig_IsValid(pce)) { 1155 int el; 1156 for (el=0; el<(8); el++) { 1157 self->elements[el] = ID_NONE; 1158 } 1159 } 1160 } 1161 } 1162 1163 /* Check sampling frequency */ 1164 switch ( self->streamInfo.aacSampleRate ) { 1165 case 16000: 1166 case 12000: 1167 case 11025: 1168 case 8000: 1169 case 7350: 1170 case 48000: 1171 case 44100: 1172 case 32000: 1173 case 24000: 1174 case 22050: 1175 break; 1176 default: 1177 if ( ! (self->flags & (AC_USAC|AC_RSVD50)) ) { 1178 return AAC_DEC_UNSUPPORTED_SAMPLINGRATE; 1179 } 1180 break; 1181 } 1182 1183 1184 if ( flags & AACDEC_CLRHIST ) 1185 { 1186 int ch; 1187 /* Clear history */ 1188 for (ch = 0; ch < self->aacChannels; ch++) { 1189 /* Reset concealment */ 1190 CConcealment_InitChannelData(&self->pAacDecoderStaticChannelInfo[ch]->concealmentInfo, 1191 &self->concealCommonData, 1192 self->streamInfo.aacSamplesPerFrame ); 1193 /* Clear overlap-add buffers to avoid clicks. */ 1194 FDKmemclear(self->pAacDecoderStaticChannelInfo[ch]->pOverlapBuffer, OverlapBufferSize*sizeof(FIXP_DBL)); 1195 } 1196 } 1197 1198 1199 1200 #ifdef TP_PCE_ENABLE 1201 int pceRead = 0; /* Flag indicating a PCE in the current raw_data_block() */ 1202 #endif 1203 1204 1205 INT hdaacDecoded = 0; 1206 MP4_ELEMENT_ID previous_element = ID_END; /* Last element ID (required for extension payload mapping */ 1207 UCHAR previous_element_index = 0; /* Canonical index of last element */ 1208 int element_count = 0; /* Element counter for elements found in the bitstream */ 1209 int el_cnt[ID_LAST] = { 0 }; /* element counter ( robustness ) */ 1210 1211 while ( (type != ID_END) && (! (flags & (AACDEC_CONCEAL | AACDEC_FLUSH))) && self->frameOK ) 1212 { 1213 int el_channels; 1214 1215 if (! (self->flags & (AC_USAC|AC_RSVD50|AC_ELD|AC_SCALABLE|AC_ER))) 1216 type = (MP4_ELEMENT_ID) FDKreadBits(bs,3); 1217 else 1218 type = self->elements[element_count]; 1219 1220 setHcrType(&self->aacCommonData.overlay.aac.erHcrInfo, type); 1221 1222 1223 if ((INT)FDKgetValidBits(bs) < 0) 1224 self->frameOK = 0; 1225 1226 switch (type) 1227 { 1228 case ID_SCE: 1229 case ID_CPE: 1230 case ID_LFE: 1231 /* 1232 Consistency check 1233 */ 1234 1235 if (type == ID_CPE) { 1236 el_channels = 2; 1237 } else { 1238 el_channels = 1; 1239 } 1240 1241 if ( (el_cnt[type] >= (self->ascChannels>>(el_channels-1))) || (aacChannels > (self->ascChannels-el_channels)) ) { 1242 ErrorStatus = AAC_DEC_DECODE_FRAME_ERROR; 1243 self->frameOK = 0; 1244 break; 1245 } 1246 1247 if ( !(self->flags & (AC_USAC|AC_RSVD50)) ) { 1248 int ch; 1249 for (ch=0; ch < el_channels; ch+=1) { 1250 CPns_ResetData(&self->pAacDecoderChannelInfo[aacChannels+ch]->data.aac.PnsData, 1251 &self->pAacDecoderChannelInfo[aacChannels+ch]->pComData->pnsInterChannelData); 1252 } 1253 } 1254 1255 if(self->frameOK) { 1256 ErrorStatus = CChannelElement_Read( bs, 1257 &self->pAacDecoderChannelInfo[aacChannels], 1258 &self->pAacDecoderStaticChannelInfo[aacChannels], 1259 self->streamInfo.aot, 1260 &self->samplingRateInfo, 1261 self->flags, 1262 self->streamInfo.aacSamplesPerFrame, 1263 el_channels, 1264 self->streamInfo.epConfig, 1265 self->hInput 1266 ); 1267 if (ErrorStatus) { 1268 self->frameOK = 0; 1269 } 1270 } 1271 1272 1273 if ( self->frameOK) { 1274 /* Lookup the element and decode it only if it belongs to the current program */ 1275 if ( CProgramConfig_LookupElement( 1276 pce, 1277 self->streamInfo.channelConfig, 1278 self->pAacDecoderChannelInfo[aacChannels]->ElementInstanceTag, 1279 aacChannels, 1280 self->chMapping, 1281 self->channelType, 1282 self->channelIndices, 1283 &previous_element_index, 1284 self->elements, 1285 type) ) 1286 { 1287 if ( !hdaacDecoded ) { 1288 CChannelElement_Decode( 1289 &self->pAacDecoderChannelInfo[aacChannels], 1290 &self->pAacDecoderStaticChannelInfo[aacChannels], 1291 &self->samplingRateInfo, 1292 self->flags, 1293 el_channels 1294 ); 1295 } 1296 aacChannels += 1; 1297 if (type == ID_CPE) { 1298 aacChannels += 1; 1299 } 1300 } 1301 else { 1302 self->frameOK = 0; 1303 } 1304 /* Create SBR element for SBR for upsampling for LFE elements, 1305 and if SBR was explicitly signaled, because the first frame(s) 1306 may not contain SBR payload (broken encoder, bit errors). */ 1307 if ( (self->flags & AC_SBR_PRESENT) || (self->sbrEnabled == 1) ) 1308 { 1309 SBR_ERROR sbrError; 1310 1311 sbrError = sbrDecoder_InitElement( 1312 self->hSbrDecoder, 1313 self->streamInfo.aacSampleRate, 1314 self->streamInfo.extSamplingRate, 1315 self->streamInfo.aacSamplesPerFrame, 1316 self->streamInfo.aot, 1317 type, 1318 previous_element_index 1319 ); 1320 if (sbrError != SBRDEC_OK) { 1321 /* Do not try to apply SBR because initializing the element failed. */ 1322 self->sbrEnabled = 0; 1323 } 1324 } 1325 } 1326 1327 el_cnt[type]++; 1328 break; 1329 1330 case ID_CCE: 1331 /* 1332 Consistency check 1333 */ 1334 if ( el_cnt[type] > self->ascChannels ) { 1335 ErrorStatus = AAC_DEC_DECODE_FRAME_ERROR; 1336 self->frameOK = 0; 1337 break; 1338 } 1339 1340 if (self->frameOK) 1341 { 1342 /* memory for spectral lines temporal on scratch */ 1343 C_ALLOC_SCRATCH_START(mdctSpec, FIXP_DBL, 1024); 1344 1345 /* create dummy channel for CCE parsing on stack */ 1346 CAacDecoderChannelInfo tmpAacDecoderChannelInfo, *pTmpAacDecoderChannelInfo; 1347 1348 FDKmemclear(mdctSpec, 1024*sizeof(FIXP_DBL)); 1349 1350 tmpAacDecoderChannelInfo.pDynData = self->aacCommonData.workBufferCore1->pAacDecoderDynamicData; 1351 tmpAacDecoderChannelInfo.pComData = &self->aacCommonData; 1352 tmpAacDecoderChannelInfo.pSpectralCoefficient = (SPECTRAL_PTR)mdctSpec; 1353 /* Assume AAC-LC */ 1354 tmpAacDecoderChannelInfo.granuleLength = self->streamInfo.aacSamplesPerFrame / 8; 1355 1356 /* Reset PNS data. */ 1357 CPns_ResetData(&tmpAacDecoderChannelInfo.data.aac.PnsData, &tmpAacDecoderChannelInfo.pComData->pnsInterChannelData); 1358 1359 pTmpAacDecoderChannelInfo = &tmpAacDecoderChannelInfo; 1360 /* do CCE parsing */ 1361 ErrorStatus = CChannelElement_Read( bs, 1362 &pTmpAacDecoderChannelInfo, 1363 NULL, 1364 self->streamInfo.aot, 1365 &self->samplingRateInfo, 1366 self->flags, 1367 self->streamInfo.aacSamplesPerFrame, 1368 1, 1369 self->streamInfo.epConfig, 1370 self->hInput 1371 ); 1372 1373 C_ALLOC_SCRATCH_END(mdctSpec, FIXP_DBL, 1024); 1374 1375 if (ErrorStatus) { 1376 self->frameOK = 0; 1377 } 1378 1379 if (self->frameOK) { 1380 /* Lookup the element and decode it only if it belongs to the current program */ 1381 if (CProgramConfig_LookupElement( 1382 pce, 1383 self->streamInfo.channelConfig, 1384 pTmpAacDecoderChannelInfo->ElementInstanceTag, 1385 0, 1386 self->chMapping, 1387 self->channelType, 1388 self->channelIndices, 1389 &previous_element_index, 1390 self->elements, 1391 type) ) 1392 { 1393 /* decoding of CCE not supported */ 1394 } 1395 else { 1396 self->frameOK = 0; 1397 } 1398 } 1399 } 1400 el_cnt[type]++; 1401 break; 1402 1403 case ID_DSE: 1404 { 1405 UCHAR element_instance_tag; 1406 1407 CDataStreamElement_Read( self, 1408 bs, 1409 &element_instance_tag, 1410 auStartAnchor ); 1411 1412 if (!CProgramConfig_LookupElement( 1413 pce, 1414 self->streamInfo.channelConfig, 1415 element_instance_tag, 1416 0, 1417 self->chMapping, 1418 self->channelType, 1419 self->channelIndices, 1420 &previous_element_index, 1421 self->elements, 1422 type) ) 1423 { 1424 /* most likely an error in bitstream occured */ 1425 //self->frameOK = 0; 1426 } 1427 } 1428 break; 1429 1430 #ifdef TP_PCE_ENABLE 1431 case ID_PCE: 1432 { 1433 int result = CProgramConfigElement_Read( 1434 bs, 1435 self->hInput, 1436 pce, 1437 self->streamInfo.channelConfig, 1438 auStartAnchor ); 1439 if ( result < 0 ) { 1440 /* Something went wrong */ 1441 ErrorStatus = AAC_DEC_PARSE_ERROR; 1442 self->frameOK = 0; 1443 } 1444 else if ( result > 1 ) { 1445 /* Built element table */ 1446 int elIdx = CProgramConfig_GetElementTable(pce, self->elements, (8), &self->chMapIndex); 1447 /* Reset the remaining tabs */ 1448 for ( ; elIdx<(8); elIdx++) { 1449 self->elements[elIdx] = ID_NONE; 1450 } 1451 /* Make new number of channel persistant */ 1452 self->ascChannels = pce->NumChannels; 1453 /* If PCE is not first element conceal this frame to avoid inconsistencies */ 1454 if ( element_count != 0 ) { 1455 self->frameOK = 0; 1456 } 1457 } 1458 pceRead = (result>=0) ? 1 : 0; 1459 } 1460 break; 1461 #endif /* TP_PCE_ENABLE */ 1462 1463 case ID_FIL: 1464 { 1465 int bitCnt = FDKreadBits(bs,4); /* bs_count */ 1466 1467 if (bitCnt == 15) 1468 { 1469 int esc_count = FDKreadBits(bs,8); /* bs_esc_count */ 1470 bitCnt = esc_count + 14; 1471 } 1472 1473 /* Convert to bits */ 1474 bitCnt <<= 3; 1475 1476 while (bitCnt > 0) { 1477 ErrorStatus = CAacDecoder_ExtPayloadParse(self, bs, &bitCnt, previous_element, previous_element_index, 1); 1478 if (ErrorStatus != AAC_DEC_OK) { 1479 self->frameOK = 0; 1480 break; 1481 } 1482 } 1483 } 1484 break; 1485 1486 case ID_EXT: 1487 { 1488 INT bitCnt = 0; 1489 1490 /* get the remaining bits of this frame */ 1491 bitCnt = transportDec_GetAuBitsRemaining(self->hInput, 0); 1492 1493 if ( (bitCnt > 0) && (self->flags & AC_SBR_PRESENT) && (self->flags & (AC_USAC|AC_RSVD50|AC_ELD)) ) 1494 { 1495 SBR_ERROR err = SBRDEC_OK; 1496 int elIdx, numChElements = el_cnt[ID_SCE] + el_cnt[ID_CPE]; 1497 1498 for (elIdx = 0; elIdx < numChElements; elIdx += 1) 1499 { 1500 err = sbrDecoder_Parse ( 1501 self->hSbrDecoder, 1502 bs, 1503 &bitCnt, 1504 -1, 1505 self->flags & AC_SBRCRC, 1506 self->elements[elIdx], 1507 elIdx, 1508 self->flags & AC_INDEP ); 1509 1510 if (err != SBRDEC_OK) { 1511 break; 1512 } 1513 } 1514 switch (err) { 1515 case SBRDEC_PARSE_ERROR: 1516 /* Can not go on parsing because we do not 1517 know the length of the SBR extension data. */ 1518 FDKpushFor(bs, bitCnt); 1519 bitCnt = 0; 1520 break; 1521 case SBRDEC_OK: 1522 self->sbrEnabled = 1; 1523 break; 1524 default: 1525 self->frameOK = 0; 1526 break; 1527 } 1528 } 1529 1530 1531 if ( ! (self->flags & (AC_USAC|AC_RSVD50|AC_DRM)) ) 1532 { 1533 while ( bitCnt > 7 ) { 1534 ErrorStatus = CAacDecoder_ExtPayloadParse(self, bs, &bitCnt, previous_element, previous_element_index, 0); 1535 if (ErrorStatus != AAC_DEC_OK) { 1536 self->frameOK = 0; 1537 ErrorStatus = AAC_DEC_PARSE_ERROR; 1538 break; 1539 } 1540 } 1541 } 1542 } 1543 break; 1544 1545 case ID_END: 1546 break; 1547 1548 default: 1549 ErrorStatus = AAC_DEC_DECODE_FRAME_ERROR; 1550 self->frameOK = 0; 1551 break; 1552 } 1553 1554 previous_element = type; 1555 element_count++; 1556 1557 } /* while ( (type != ID_END) ... ) */ 1558 1559 if ( !(flags & (AACDEC_CONCEAL|AACDEC_FLUSH)) ) 1560 { 1561 /* Byte alignment with respect to the first bit of the raw_data_block(). */ 1562 { 1563 FDKbyteAlign(bs, auStartAnchor); 1564 } 1565 1566 /* Check if all bits of the raw_data_block() have been read. */ 1567 if ( transportDec_GetAuBitsTotal(self->hInput, 0) > 0 ) { 1568 INT unreadBits = transportDec_GetAuBitsRemaining(self->hInput, 0); 1569 if ( unreadBits != 0 ) { 1570 1571 self->frameOK = 0; 1572 /* Do not overwrite current error */ 1573 if (ErrorStatus == AAC_DEC_OK && self->frameOK == 0) { 1574 ErrorStatus = AAC_DEC_PARSE_ERROR; 1575 } 1576 /* Always put the bitbuffer at the right position after the current Access Unit. */ 1577 FDKpushBiDirectional(bs, unreadBits); 1578 } 1579 } 1580 1581 /* Check the last element. The terminator (ID_END) has to be the last one (even if ER syntax is used). */ 1582 if ( self->frameOK && type != ID_END ) { 1583 /* Do not overwrite current error */ 1584 if (ErrorStatus == AAC_DEC_OK) { 1585 ErrorStatus = AAC_DEC_PARSE_ERROR; 1586 } 1587 self->frameOK = 0; 1588 } 1589 } 1590 1591 /* More AAC channels than specified by the ASC not allowed. */ 1592 if ( (aacChannels == 0 || aacChannels > self->aacChannels) && !(flags & (AACDEC_CONCEAL|AACDEC_FLUSH)) ) { 1593 { 1594 /* Do not overwrite current error */ 1595 if (ErrorStatus == AAC_DEC_OK) { 1596 ErrorStatus = AAC_DEC_DECODE_FRAME_ERROR; 1597 } 1598 self->frameOK = 0; 1599 } 1600 aacChannels = 0; 1601 } 1602 else if ( aacChannels > self->ascChannels ) { 1603 /* Do not overwrite current error */ 1604 if (ErrorStatus == AAC_DEC_OK) { 1605 ErrorStatus = AAC_DEC_UNSUPPORTED_FORMAT; 1606 } 1607 self->frameOK = 0; 1608 aacChannels = 0; 1609 } 1610 1611 if ( TRANSPORTDEC_OK != transportDec_CrcCheck(self->hInput) ) 1612 { 1613 self->frameOK=0; 1614 } 1615 1616 /* store or restore the number of channels and the corresponding info */ 1617 if ( self->frameOK && !(flags &(AACDEC_CONCEAL|AACDEC_FLUSH)) ) { 1618 self->aacChannelsPrev = aacChannels; /* store */ 1619 FDKmemcpy(self->channelTypePrev, self->channelType, (8)*sizeof(AUDIO_CHANNEL_TYPE)); /* store */ 1620 FDKmemcpy(self->channelIndicesPrev, self->channelIndices, (8)*sizeof(UCHAR)); /* store */ 1621 self->sbrEnabledPrev = self->sbrEnabled; 1622 } else { 1623 if (self->aacChannels > 0) { 1624 aacChannels = self->aacChannelsPrev; /* restore */ 1625 FDKmemcpy(self->channelType, self->channelTypePrev, (8)*sizeof(AUDIO_CHANNEL_TYPE)); /* restore */ 1626 FDKmemcpy(self->channelIndices, self->channelIndicesPrev, (8)*sizeof(UCHAR)); /* restore */ 1627 self->sbrEnabled = self->sbrEnabledPrev; 1628 } 1629 } 1630 1631 /* Update number of output channels */ 1632 self->streamInfo.aacNumChannels = aacChannels; 1633 1634 #ifdef TP_PCE_ENABLE 1635 if (pceRead == 1 && CProgramConfig_IsValid(pce)) { 1636 /* Set matrix mixdown infos if available from PCE. */ 1637 pcmDmx_SetMatrixMixdownFromPce ( self->hPcmUtils, 1638 pce->MatrixMixdownIndexPresent, 1639 pce->MatrixMixdownIndex, 1640 pce->PseudoSurroundEnable ); 1641 } 1642 #endif 1643 1644 /* If there is no valid data to transfrom into time domain, return. */ 1645 if ( ! IS_OUTPUT_VALID(ErrorStatus) ) { 1646 return ErrorStatus; 1647 } 1648 1649 /* Setup the output channel mapping. The table below shows the four possibilities: 1650 * # | chCfg | PCE | cChCfg | chOutMapIdx 1651 * ---+-------+-----+--------+------------------ 1652 * 1 | > 0 | no | - | chCfg 1653 * 2 | 0 | yes | > 0 | cChCfg 1654 * 3 | 0 | yes | 0 | aacChannels || 0 1655 * 4 | 0 | no | - | aacChannels || 0 1656 * ---+-------+-----+--------+------------------ 1657 * Where chCfg is the channel configuration index from ASC and cChCfg is a corresponding chCfg 1658 * derived from a given PCE. The variable aacChannels represents the number of channel found 1659 * during bitstream decoding. Due to the structure of the mapping table it can only be used for 1660 * mapping if its value is smaller than 7. Otherwise we use the fallback (0) which is a simple 1661 * pass-through. The possibility #4 should appear only with MPEG-2 (ADTS) streams. This is 1662 * mode is called "implicit channel mapping". 1663 */ 1664 chOutMapIdx = ((self->chMapIndex==0) && (aacChannels<7)) ? aacChannels : self->chMapIndex; 1665 1666 /* 1667 Inverse transform 1668 */ 1669 { 1670 int stride, offset, c; 1671 1672 /* Turn on/off DRC modules level normalization in digital domain depending on the limiter status. */ 1673 aacDecoder_drcSetParam( self->hDrcInfo, APPLY_NORMALIZATION, (self->limiterEnableCurr) ? 0 : 1 ); 1674 /* Extract DRC control data and map it to channels (without bitstream delay) */ 1675 aacDecoder_drcProlog ( 1676 self->hDrcInfo, 1677 bs, 1678 self->pAacDecoderStaticChannelInfo, 1679 self->pce.ElementInstanceTag, 1680 self->chMapping, 1681 aacChannels 1682 ); 1683 1684 /* "c" iterates in canonical MPEG channel order */ 1685 for (c=0; c < aacChannels; c++) 1686 { 1687 CAacDecoderChannelInfo *pAacDecoderChannelInfo; 1688 1689 /* Select correct pAacDecoderChannelInfo for current channel */ 1690 if (self->chMapping[c] >= aacChannels) { 1691 pAacDecoderChannelInfo = self->pAacDecoderChannelInfo[c]; 1692 } else { 1693 pAacDecoderChannelInfo = self->pAacDecoderChannelInfo[self->chMapping[c]]; 1694 } 1695 1696 /* Setup offset and stride for time buffer traversal. */ 1697 if (interleaved) { 1698 stride = aacChannels; 1699 offset = self->channelOutputMapping[chOutMapIdx][c]; 1700 } else { 1701 stride = 1; 1702 offset = self->channelOutputMapping[chOutMapIdx][c] * self->streamInfo.aacSamplesPerFrame; 1703 } 1704 1705 1706 if ( flags&AACDEC_FLUSH ) { 1707 /* Clear pAacDecoderChannelInfo->pSpectralCoefficient because with AACDEC_FLUSH set it contains undefined data. */ 1708 FDKmemclear(pAacDecoderChannelInfo->pSpectralCoefficient, sizeof(FIXP_DBL)*self->streamInfo.aacSamplesPerFrame); 1709 } 1710 1711 /* 1712 Conceal defective spectral data 1713 */ 1714 CConcealment_Apply(&self->pAacDecoderStaticChannelInfo[c]->concealmentInfo, 1715 pAacDecoderChannelInfo, 1716 self->pAacDecoderStaticChannelInfo[c], 1717 &self->samplingRateInfo, 1718 self->streamInfo.aacSamplesPerFrame, 1719 0, 1720 (self->frameOK && !(flags&AACDEC_CONCEAL)), 1721 self->flags 1722 ); 1723 1724 1725 if (flags & (AACDEC_INTR|AACDEC_CLRHIST)) { 1726 /* Reset DRC control data for this channel */ 1727 aacDecoder_drcInitChannelData ( &self->pAacDecoderStaticChannelInfo[c]->drcData ); 1728 } 1729 /* The DRC module demands to be called with the gain field holding the gain scale. */ 1730 self->extGain[0] = (FIXP_DBL)TDL_GAIN_SCALING; 1731 /* DRC processing */ 1732 aacDecoder_drcApply ( 1733 self->hDrcInfo, 1734 self->hSbrDecoder, 1735 pAacDecoderChannelInfo, 1736 &self->pAacDecoderStaticChannelInfo[c]->drcData, 1737 self->extGain, 1738 c, 1739 self->streamInfo.aacSamplesPerFrame, 1740 self->sbrEnabled 1741 ); 1742 1743 switch (pAacDecoderChannelInfo->renderMode) 1744 { 1745 case AACDEC_RENDER_IMDCT: 1746 CBlock_FrequencyToTime( 1747 self->pAacDecoderStaticChannelInfo[c], 1748 pAacDecoderChannelInfo, 1749 pTimeData + offset, 1750 self->streamInfo.aacSamplesPerFrame, 1751 stride, 1752 (self->frameOK && !(flags&AACDEC_CONCEAL)), 1753 self->aacCommonData.workBufferCore1->mdctOutTemp 1754 ); 1755 self->extGainDelay = self->streamInfo.aacSamplesPerFrame; 1756 break; 1757 case AACDEC_RENDER_ELDFB: 1758 CBlock_FrequencyToTimeLowDelay( 1759 self->pAacDecoderStaticChannelInfo[c], 1760 pAacDecoderChannelInfo, 1761 pTimeData + offset, 1762 self->streamInfo.aacSamplesPerFrame, 1763 stride 1764 ); 1765 self->extGainDelay = (self->streamInfo.aacSamplesPerFrame*2 - self->streamInfo.aacSamplesPerFrame/2 - 1)/2; 1766 break; 1767 default: 1768 ErrorStatus = AAC_DEC_UNKNOWN; 1769 break; 1770 } 1771 if ( flags&AACDEC_FLUSH ) { 1772 FDKmemclear(pAacDecoderChannelInfo->pSpectralCoefficient, sizeof(FIXP_DBL)*self->streamInfo.aacSamplesPerFrame); 1773 FDKmemclear(self->pAacDecoderStaticChannelInfo[c]->pOverlapBuffer, OverlapBufferSize*sizeof(FIXP_DBL)); 1774 } 1775 } 1776 1777 1778 /* Extract DRC control data and map it to channels (with bitstream delay) */ 1779 aacDecoder_drcEpilog ( 1780 self->hDrcInfo, 1781 bs, 1782 self->pAacDecoderStaticChannelInfo, 1783 self->pce.ElementInstanceTag, 1784 self->chMapping, 1785 aacChannels 1786 ); 1787 } 1788 1789 /* Add additional concealment delay */ 1790 self->streamInfo.outputDelay += CConcealment_GetDelay(&self->concealCommonData) * self->streamInfo.aacSamplesPerFrame; 1791 1792 /* Map DRC data to StreamInfo structure */ 1793 aacDecoder_drcGetInfo ( 1794 self->hDrcInfo, 1795 &self->streamInfo.drcPresMode, 1796 &self->streamInfo.drcProgRefLev 1797 ); 1798 1799 /* Reorder channel type information tables. */ 1800 { 1801 AUDIO_CHANNEL_TYPE types[(8)]; 1802 UCHAR idx[(8)]; 1803 int c; 1804 1805 FDK_ASSERT(sizeof(self->channelType) == sizeof(types)); 1806 FDK_ASSERT(sizeof(self->channelIndices) == sizeof(idx)); 1807 1808 FDKmemcpy(types, self->channelType, sizeof(types)); 1809 FDKmemcpy(idx, self->channelIndices, sizeof(idx)); 1810 1811 for (c=0; c<aacChannels; c++) { 1812 self->channelType[self->channelOutputMapping[chOutMapIdx][c]] = types[c]; 1813 self->channelIndices[self->channelOutputMapping[chOutMapIdx][c]] = idx[c]; 1814 } 1815 } 1816 1817 self->blockNumber++; 1818 1819 return ErrorStatus; 1820 } 1821 1822 /*! 1823 \brief returns the streaminfo pointer 1824 1825 The function hands back a pointer to the streaminfo structure 1826 1827 \return pointer to the struct 1828 */ 1829 LINKSPEC_CPP CStreamInfo* CAacDecoder_GetStreamInfo ( HANDLE_AACDECODER self ) 1830 { 1831 if (!self) { 1832 return NULL; 1833 } 1834 return &self->streamInfo; 1835 } 1836 1837 1838 1839 1840