1 /* ----------------------------------------------------------------------------- 2 Software License for The Fraunhofer FDK AAC Codec Library for Android 3 4 Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Frderung der angewandten 5 Forschung e.V. All rights reserved. 6 7 1. INTRODUCTION 8 The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software 9 that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding 10 scheme for digital audio. This FDK AAC Codec software is intended to be used on 11 a wide variety of Android devices. 12 13 AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient 14 general perceptual audio codecs. AAC-ELD is considered the best-performing 15 full-bandwidth communications codec by independent studies and is widely 16 deployed. AAC has been standardized by ISO and IEC as part of the MPEG 17 specifications. 18 19 Patent licenses for necessary patent claims for the FDK AAC Codec (including 20 those of Fraunhofer) may be obtained through Via Licensing 21 (www.vialicensing.com) or through the respective patent owners individually for 22 the purpose of encoding or decoding bit streams in products that are compliant 23 with the ISO/IEC MPEG audio standards. Please note that most manufacturers of 24 Android devices already license these patent claims through Via Licensing or 25 directly from the patent owners, and therefore FDK AAC Codec software may 26 already be covered under those patent licenses when it is used for those 27 licensed purposes only. 28 29 Commercially-licensed AAC software libraries, including floating-point versions 30 with enhanced sound quality, are also available from Fraunhofer. Users are 31 encouraged to check the Fraunhofer website for additional applications 32 information and documentation. 33 34 2. COPYRIGHT LICENSE 35 36 Redistribution and use in source and binary forms, with or without modification, 37 are permitted without payment of copyright license fees provided that you 38 satisfy the following conditions: 39 40 You must retain the complete text of this software license in redistributions of 41 the FDK AAC Codec or your modifications thereto in source code form. 42 43 You must retain the complete text of this software license in the documentation 44 and/or other materials provided with redistributions of the FDK AAC Codec or 45 your modifications thereto in binary form. You must make available free of 46 charge copies of the complete source code of the FDK AAC Codec and your 47 modifications thereto to recipients of copies in binary form. 48 49 The name of Fraunhofer may not be used to endorse or promote products derived 50 from this library without prior written permission. 51 52 You may not charge copyright license fees for anyone to use, copy or distribute 53 the FDK AAC Codec software or your modifications thereto. 54 55 Your modified versions of the FDK AAC Codec must carry prominent notices stating 56 that you changed the software and the date of any change. For modified versions 57 of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" 58 must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK 59 AAC Codec Library for Android." 60 61 3. NO PATENT LICENSE 62 63 NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without 64 limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. 65 Fraunhofer provides no warranty of patent non-infringement with respect to this 66 software. 67 68 You may use this FDK AAC Codec software or modifications thereto only for 69 purposes that are authorized by appropriate patent licenses. 70 71 4. DISCLAIMER 72 73 This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright 74 holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, 75 including but not limited to the implied warranties of merchantability and 76 fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 77 CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, 78 or consequential damages, including but not limited to procurement of substitute 79 goods or services; loss of use, data, or profits, or business interruption, 80 however caused and on any theory of liability, whether in contract, strict 81 liability, or tort (including negligence), arising in any way out of the use of 82 this software, even if advised of the possibility of such damage. 83 84 5. CONTACT INFORMATION 85 86 Fraunhofer Institute for Integrated Circuits IIS 87 Attention: Audio and Multimedia Departments - FDK AAC LL 88 Am Wolfsmantel 33 89 91058 Erlangen, Germany 90 91 www.iis.fraunhofer.de/amm 92 amm-info (at) iis.fraunhofer.de 93 ----------------------------------------------------------------------------- */ 94 95 /**************************** AAC decoder library ****************************** 96 97 Author(s): Josef Hoepfl 98 99 Description: individual channel stream info 100 101 *******************************************************************************/ 102 103 #ifndef CHANNELINFO_H 104 #define CHANNELINFO_H 105 106 #include "common_fix.h" 107 108 #include "aac_rom.h" 109 #include "aacdecoder_lib.h" 110 #include "FDK_bitstream.h" 111 #include "overlapadd.h" 112 113 #include "mdct.h" 114 #include "stereo.h" 115 #include "pulsedata.h" 116 #include "aacdec_tns.h" 117 118 #include "aacdec_pns.h" 119 120 #include "aacdec_hcr_types.h" 121 #include "rvlc_info.h" 122 123 #include "usacdec_acelp.h" 124 #include "usacdec_const.h" 125 #include "usacdec_rom.h" 126 127 #include "ac_arith_coder.h" 128 129 #include "conceal_types.h" 130 131 #include "aacdec_drc_types.h" 132 133 #define WB_SECTION_SIZE (1024 * 2) 134 135 #define DRM_BS_BUFFER_SIZE \ 136 (512) /* size of the dynamic buffer which is used to reverse the bits of \ 137 the DRM SBR payload */ 138 139 /* Output rendering mode */ 140 typedef enum { 141 AACDEC_RENDER_INVALID = 0, 142 AACDEC_RENDER_IMDCT, 143 AACDEC_RENDER_ELDFB, 144 AACDEC_RENDER_LPD, 145 AACDEC_RENDER_INTIMDCT 146 } AACDEC_RENDER_MODE; 147 148 enum { MAX_QUANTIZED_VALUE = 8191 }; 149 150 typedef enum { FD_LONG, FD_SHORT, LPD } USAC_COREMODE; 151 152 typedef struct { 153 const SHORT *ScaleFactorBands_Long; 154 const SHORT *ScaleFactorBands_Short; 155 UCHAR NumberOfScaleFactorBands_Long; 156 UCHAR NumberOfScaleFactorBands_Short; 157 UINT samplingRateIndex; 158 UINT samplingRate; 159 } SamplingRateInfo; 160 161 typedef struct { 162 UCHAR CommonWindow; 163 UCHAR GlobalGain; 164 165 } CRawDataInfo; 166 167 typedef struct { 168 UCHAR WindowGroupLength[8]; 169 UCHAR WindowGroups; 170 UCHAR Valid; 171 172 UCHAR WindowShape; /* 0: sine window, 1: KBD, 2: low overlap */ 173 BLOCK_TYPE WindowSequence; /* mdct.h; 0: long, 1: start, 2: short, 3: stop */ 174 UCHAR MaxSfBands; 175 UCHAR max_sfb_ste; 176 UCHAR ScaleFactorGrouping; 177 178 UCHAR TotalSfBands; 179 180 } CIcsInfo; 181 182 enum { 183 ZERO_HCB = 0, 184 ESCBOOK = 11, 185 NSPECBOOKS = ESCBOOK + 1, 186 BOOKSCL = NSPECBOOKS, 187 NOISE_HCB = 13, 188 INTENSITY_HCB2 = 14, 189 INTENSITY_HCB = 15, 190 LAST_HCB 191 }; 192 193 /* This struct holds the persistent data shared by both channels of a CPE. 194 It needs to be allocated for each CPE. */ 195 typedef struct { 196 CJointStereoPersistentData jointStereoPersistentData; 197 } CpePersistentData; 198 199 /* 200 * This struct must be allocated one for every channel and must be persistent. 201 */ 202 typedef struct { 203 FIXP_DBL *pOverlapBuffer; 204 mdct_t IMdct; 205 206 CArcoData *hArCo; 207 208 INT pnsCurrentSeed; 209 210 /* LPD memory */ 211 FIXP_DBL old_synth[PIT_MAX_MAX - L_SUBFR]; 212 INT old_T_pf[SYN_SFD]; 213 FIXP_DBL old_gain_pf[SYN_SFD]; 214 FIXP_DBL mem_bpf[L_FILT + L_SUBFR]; 215 UCHAR 216 old_bpf_control_info; /* (1: enable, 0: disable) bpf for past superframe 217 */ 218 219 USAC_COREMODE last_core_mode; /* core mode used by the decoder in previous 220 frame. (not signalled by the bitstream, see 221 CAacDecoderChannelInfo::core_mode_last !! ) 222 */ 223 UCHAR last_lpd_mode; /* LPD mode used by the decoder in last LPD subframe 224 (not signalled by the bitstream, see 225 CAacDecoderChannelInfo::lpd_mode_last !! ) */ 226 UCHAR last_last_lpd_mode; /* LPD mode used in second last LPD subframe 227 (not signalled by the bitstream) */ 228 UCHAR last_lpc_lost; /* Flag indicating that the previous LPC is lost */ 229 230 FIXP_LPC 231 lpc4_lsf[M_LP_FILTER_ORDER]; /* Last LPC4 coefficients in LSF domain. */ 232 FIXP_LPC lsf_adaptive_mean[M_LP_FILTER_ORDER]; /* Adaptive mean of LPC 233 coefficients in LSF domain 234 for concealment. */ 235 FIXP_LPC lp_coeff_old[2][M_LP_FILTER_ORDER]; /* Last LPC coefficients in LP 236 domain. lp_coeff_old[0] is lpc4 (coeffs for 237 right folding point of last tcx frame), 238 lp_coeff_old[1] are coeffs for left folding 239 point of last tcx frame */ 240 INT lp_coeff_old_exp[2]; 241 242 FIXP_SGL 243 oldStability; /* LPC coeff stability value from last frame (required for 244 TCX concealment). */ 245 UINT numLostLpdFrames; /* Number of consecutive lost subframes. */ 246 247 /* TCX memory */ 248 FIXP_DBL last_tcx_gain; 249 INT last_tcx_gain_e; 250 FIXP_DBL last_alfd_gains[32]; /* Scaled by one bit. */ 251 SHORT last_tcx_pitch; 252 UCHAR last_tcx_noise_factor; 253 254 /* ACELP memory */ 255 CAcelpStaticMem acelp; 256 257 ULONG nfRandomSeed; /* seed value for USAC noise filling random generator */ 258 259 CDrcChannelData drcData; 260 CConcealmentInfo concealmentInfo; 261 262 CpePersistentData *pCpeStaticData; 263 264 } CAacDecoderStaticChannelInfo; 265 266 /* 267 * This union must be allocated for every element (up to 2 channels). 268 */ 269 typedef struct { 270 /* Common bit stream data */ 271 SHORT aScaleFactor[( 272 8 * 16)]; /* Spectral scale factors for each sfb in each window. */ 273 SHORT aSfbScale[(8 * 16)]; /* could be free after ApplyTools() */ 274 UCHAR 275 aCodeBook[(8 * 16)]; /* section data: codebook for each window and sfb. */ 276 UCHAR band_is_noise[(8 * 16)]; 277 CTnsData TnsData; 278 CRawDataInfo RawDataInfo; 279 280 shouldBeUnion { 281 struct { 282 CPulseData PulseData; 283 SHORT aNumLineInSec4Hcr[MAX_SFB_HCR]; /* needed once for all channels 284 except for Drm syntax */ 285 UCHAR 286 aCodeBooks4Hcr[MAX_SFB_HCR]; /* needed once for all channels except for 287 Drm syntax. Same as "aCodeBook" ? */ 288 SHORT lenOfReorderedSpectralData; 289 SCHAR lenOfLongestCodeword; 290 SCHAR numberSection; 291 SCHAR rvlcCurrentScaleFactorOK; 292 SCHAR rvlcIntensityUsed; 293 } aac; 294 struct { 295 UCHAR fd_noise_level_and_offset; 296 UCHAR tns_active; 297 UCHAR tns_on_lr; 298 UCHAR tcx_noise_factor[4]; 299 UCHAR tcx_global_gain[4]; 300 } usac; 301 } 302 specificTo; 303 304 } CAacDecoderDynamicData; 305 306 typedef shouldBeUnion { 307 UCHAR DrmBsBuffer[DRM_BS_BUFFER_SIZE]; 308 309 /* Common signal data, can be used once the bit stream data from above is not 310 * used anymore. */ 311 FIXP_DBL mdctOutTemp[1024]; 312 313 FIXP_DBL synth_buf[(PIT_MAX_MAX + SYN_DELAY + L_FRAME_PLUS)]; 314 315 FIXP_DBL workBuffer[WB_SECTION_SIZE]; 316 } 317 CWorkBufferCore1; 318 319 /* Common data referenced by all channels */ 320 typedef struct { 321 CAacDecoderDynamicData pAacDecoderDynamicData[2]; 322 323 CPnsInterChannelData pnsInterChannelData; 324 INT pnsRandomSeed[(8 * 16)]; 325 326 CJointStereoData jointStereoData; /* One for one element */ 327 328 shouldBeUnion { 329 struct { 330 CErHcrInfo erHcrInfo; 331 CErRvlcInfo erRvlcInfo; 332 SHORT aRvlcScfEsc[RVLC_MAX_SFB]; /* needed once for all channels */ 333 SHORT aRvlcScfFwd[RVLC_MAX_SFB]; /* needed once for all channels */ 334 SHORT aRvlcScfBwd[RVLC_MAX_SFB]; /* needed once for all channels */ 335 } aac; 336 } 337 overlay; 338 339 } CAacDecoderCommonData; 340 341 typedef struct { 342 CWorkBufferCore1 *pWorkBufferCore1; 343 CCplxPredictionData *cplxPredictionData; 344 } CAacDecoderCommonStaticData; 345 346 /* 347 * This struct must be allocated one for every channel of every element and must 348 * be persistent. Among its members, the following memory areas can be 349 * overwritten under the given conditions: 350 * - pSpectralCoefficient The memory pointed to can be overwritten after time 351 * signal rendering. 352 * - data can be overwritten after time signal rendering. 353 * - pDynData memory pointed to can be overwritten after each 354 * CChannelElement_Decode() call. 355 * - pComData->overlay memory pointed to can be overwritten after each 356 * CChannelElement_Decode() call.. 357 */ 358 typedef struct { 359 shouldBeUnion { 360 struct { 361 FIXP_DBL fac_data0[LFAC]; 362 SCHAR fac_data_e[4]; 363 FIXP_DBL 364 *fac_data[4]; /* Pointers to unused parts of pSpectralCoefficient */ 365 366 UCHAR core_mode; /* current core mode */ 367 USAC_COREMODE 368 core_mode_last; /* previous core mode, signalled in the bitstream 369 (not done by the decoder, see 370 CAacDecoderStaticChannelInfo::last_core_mode !!)*/ 371 UCHAR lpd_mode_last; /* previous LPD mode, signalled in the bitstream 372 (not done by the decoder, see 373 CAacDecoderStaticChannelInfo::last_core_mode !!)*/ 374 UCHAR mod[4]; 375 UCHAR bpf_control_info; /* (1: enable, 0: disable) bpf for current 376 superframe */ 377 378 FIXP_LPC lsp_coeff[5][M_LP_FILTER_ORDER]; /* linear prediction 379 coefficients in LSP domain */ 380 FIXP_LPC 381 lp_coeff[5][M_LP_FILTER_ORDER]; /* linear prediction coefficients in 382 LP domain */ 383 INT lp_coeff_exp[5]; 384 FIXP_LPC lsf_adaptive_mean_cand 385 [M_LP_FILTER_ORDER]; /* concealment: is copied to 386 CAacDecoderStaticChannelInfo->lsf_adaptive_mean once frame is 387 assumed to be correct*/ 388 FIXP_SGL aStability[4]; /* LPC coeff stability values required for ACELP 389 and TCX (concealment) */ 390 391 CAcelpChannelData acelp[4]; 392 393 FIXP_DBL tcx_gain[4]; 394 SCHAR tcx_gain_e[4]; 395 } usac; 396 397 struct { 398 CPnsData PnsData; /* Not required for USAC */ 399 } aac; 400 } 401 data; 402 403 SPECTRAL_PTR pSpectralCoefficient; /* Spectral coefficients of each window */ 404 SHORT specScale[8]; /* Scale shift values of each spectrum window */ 405 CIcsInfo icsInfo; 406 INT granuleLength; /* Size of smallest spectrum piece */ 407 UCHAR ElementInstanceTag; 408 409 AACDEC_RENDER_MODE renderMode; /* Output signal rendering mode */ 410 411 CAacDecoderDynamicData * 412 pDynData; /* Data required for one element and discarded after decoding */ 413 CAacDecoderCommonData 414 *pComData; /* Data required for one channel at a time during decode */ 415 CAacDecoderCommonStaticData *pComStaticData; /* Persistent data required for 416 one channel at a time during 417 decode */ 418 419 int currAliasingSymmetry; /* required for RSVD60 MCT */ 420 421 } CAacDecoderChannelInfo; 422 423 /* channelinfo.cpp */ 424 425 AAC_DECODER_ERROR getSamplingRateInfo(SamplingRateInfo *t, UINT samplesPerFrame, 426 UINT samplingRateIndex, 427 UINT samplingRate); 428 429 /** 430 * \brief Read max SFB from bit stream and assign TotalSfBands according 431 * to the window sequence and sample rate. 432 * \param hBs bit stream handle as data source 433 * \param pIcsInfo IcsInfo structure to read the window sequence and store 434 * MaxSfBands and TotalSfBands 435 * \param pSamplingRateInfo read only 436 */ 437 AAC_DECODER_ERROR IcsReadMaxSfb(HANDLE_FDK_BITSTREAM hBs, CIcsInfo *pIcsInfo, 438 const SamplingRateInfo *pSamplingRateInfo); 439 440 AAC_DECODER_ERROR IcsRead(HANDLE_FDK_BITSTREAM bs, CIcsInfo *pIcsInfo, 441 const SamplingRateInfo *SamplingRateInfoTable, 442 const UINT flags); 443 444 /* stereo.cpp, only called from this file */ 445 446 /*! 447 \brief Applies MS stereo. 448 449 The function applies MS stereo. 450 451 \param pAacDecoderChannelInfo aac channel info. 452 \param pScaleFactorBandOffsets pointer to scalefactor band offsets. 453 \param pWindowGroupLength pointer to window group length array. 454 \param windowGroups number of window groups. 455 \param scaleFactorBandsTransmittedL number of transmitted scalefactor bands in 456 left channel. \param scaleFactorBandsTransmittedR number of transmitted 457 scalefactor bands in right channel. May differ from 458 scaleFactorBandsTransmittedL only for USAC. \return none 459 */ 460 void CJointStereo_ApplyMS( 461 CAacDecoderChannelInfo *pAacDecoderChannelInfo[2], 462 CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[2], 463 FIXP_DBL *spectrumL, FIXP_DBL *spectrumR, SHORT *SFBleftScale, 464 SHORT *SFBrightScale, SHORT *specScaleL, SHORT *specScaleR, 465 const SHORT *pScaleFactorBandOffsets, const UCHAR *pWindowGroupLength, 466 const int windowGroups, const int max_sfb_ste_outside, 467 const int scaleFactorBandsTransmittedL, 468 const int scaleFactorBandsTransmittedR, FIXP_DBL *store_dmx_re_prev, 469 SHORT *store_dmx_re_prev_e, const int mainband_flag); 470 471 /*! 472 \brief Applies intensity stereo 473 474 The function applies intensity stereo. 475 476 \param pAacDecoderChannelInfo aac channel info. 477 \param pScaleFactorBandOffsets pointer to scalefactor band offsets. 478 \param pWindowGroupLength pointer to window group length array. 479 \param windowGroups number of window groups. 480 \param scaleFactorBandsTransmitted number of transmitted scalefactor bands. 481 \return none 482 */ 483 void CJointStereo_ApplyIS(CAacDecoderChannelInfo *pAacDecoderChannelInfo[2], 484 const short *pScaleFactorBandOffsets, 485 const UCHAR *pWindowGroupLength, 486 const int windowGroups, 487 const int scaleFactorBandsTransmitted); 488 489 /* aacdec_pns.cpp */ 490 int CPns_IsPnsUsed(const CPnsData *pPnsData, const int group, const int band); 491 492 void CPns_SetCorrelation(CPnsData *pPnsData, const int group, const int band, 493 const int outofphase); 494 495 /****************** inline functions ******************/ 496 497 inline UCHAR IsValid(const CIcsInfo *pIcsInfo) { return pIcsInfo->Valid; } 498 499 inline UCHAR IsLongBlock(const CIcsInfo *pIcsInfo) { 500 return (pIcsInfo->WindowSequence != BLOCK_SHORT); 501 } 502 503 inline UCHAR GetWindowShape(const CIcsInfo *pIcsInfo) { 504 return pIcsInfo->WindowShape; 505 } 506 507 inline BLOCK_TYPE GetWindowSequence(const CIcsInfo *pIcsInfo) { 508 return pIcsInfo->WindowSequence; 509 } 510 511 inline const SHORT *GetScaleFactorBandOffsets( 512 const CIcsInfo *pIcsInfo, const SamplingRateInfo *samplingRateInfo) { 513 if (IsLongBlock(pIcsInfo)) { 514 return samplingRateInfo->ScaleFactorBands_Long; 515 } else { 516 return samplingRateInfo->ScaleFactorBands_Short; 517 } 518 } 519 520 inline UCHAR GetNumberOfScaleFactorBands( 521 const CIcsInfo *pIcsInfo, const SamplingRateInfo *samplingRateInfo) { 522 if (IsLongBlock(pIcsInfo)) { 523 return samplingRateInfo->NumberOfScaleFactorBands_Long; 524 } else { 525 return samplingRateInfo->NumberOfScaleFactorBands_Short; 526 } 527 } 528 529 inline int GetWindowsPerFrame(const CIcsInfo *pIcsInfo) { 530 return (pIcsInfo->WindowSequence == BLOCK_SHORT) ? 8 : 1; 531 } 532 533 inline UCHAR GetWindowGroups(const CIcsInfo *pIcsInfo) { 534 return pIcsInfo->WindowGroups; 535 } 536 537 inline UCHAR GetWindowGroupLength(const CIcsInfo *pIcsInfo, const INT index) { 538 return pIcsInfo->WindowGroupLength[index]; 539 } 540 541 inline const UCHAR *GetWindowGroupLengthTable(const CIcsInfo *pIcsInfo) { 542 return pIcsInfo->WindowGroupLength; 543 } 544 545 inline UCHAR GetScaleFactorBandsTransmitted(const CIcsInfo *pIcsInfo) { 546 return pIcsInfo->MaxSfBands; 547 } 548 549 inline UCHAR GetScaleMaxFactorBandsTransmitted(const CIcsInfo *pIcsInfo0, 550 const CIcsInfo *pIcsInfo1) { 551 return fMax(pIcsInfo0->MaxSfBands, pIcsInfo1->MaxSfBands); 552 } 553 554 inline UCHAR GetScaleFactorBandsTotal(const CIcsInfo *pIcsInfo) { 555 return pIcsInfo->TotalSfBands; 556 } 557 558 /* Note: This function applies to AAC-LC only ! */ 559 inline UCHAR GetMaximumTnsBands(const CIcsInfo *pIcsInfo, 560 const int samplingRateIndex) { 561 return tns_max_bands_tbl[samplingRateIndex][!IsLongBlock(pIcsInfo)]; 562 } 563 564 #endif /* #ifndef CHANNELINFO_H */ 565