1 2 /* ----------------------------------------------------------------------------------------------------------- 3 Software License for The Fraunhofer FDK AAC Codec Library for Android 4 5 Copyright 1995 - 2012 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 /*************************** Fast MPEG AAC Audio Encoder ********************** 85 86 Initial author: M. Schug / A. Groeschel 87 contents/description: fast aac coder functions 88 89 ******************************************************************************/ 90 91 #include "aacenc.h" 92 93 #include "bitenc.h" 94 #include "interface.h" 95 #include "psy_configuration.h" 96 #include "psy_main.h" 97 #include "qc_main.h" 98 #include "bandwidth.h" 99 #include "channel_map.h" 100 #include "tns_func.h" 101 #include "aacEnc_ram.h" 102 103 #include "genericStds.h" 104 105 106 107 108 #define MIN_BUFSIZE_PER_EFF_CHAN 6144 109 110 static AAC_ENCODER_ERROR FDKaacEnc_InitCheckAncillary(INT bitRate, 111 INT framelength, 112 INT ancillaryRate, 113 INT *ancillaryBitsPerFrame, 114 INT sampleRate); 115 116 INT FDKaacEnc_LimitBitrate( 117 HANDLE_TRANSPORTENC hTpEnc, 118 INT coreSamplingRate, 119 INT frameLength, 120 INT nChannels, 121 INT nChannelsEff, 122 INT bitRate, 123 INT averageBits, 124 INT *pAverageBitsPerFrame, 125 INT bitrateMode, 126 INT nSubFrames 127 ) 128 { 129 INT transportBits, prevBitRate, averageBitsPerFrame, shift = 0, iter=0; 130 131 while ( (frameLength & ~((1<<(shift+1))-1)) == frameLength 132 && (coreSamplingRate & ~((1<<(shift+1))-1)) == coreSamplingRate ) 133 { 134 shift ++; 135 } 136 137 do { 138 prevBitRate = bitRate; 139 averageBitsPerFrame = (bitRate*(frameLength>>shift)) / (coreSamplingRate>>shift) / nSubFrames; 140 141 if (pAverageBitsPerFrame != NULL) { 142 *pAverageBitsPerFrame = averageBitsPerFrame; 143 } 144 145 if (hTpEnc != NULL) { 146 transportBits = transportEnc_GetStaticBits(hTpEnc, averageBitsPerFrame); 147 } else { 148 /* Assume some worst case */ 149 transportBits = 208; 150 } 151 152 bitRate = FDKmax(bitRate, ((((40 * nChannels) + transportBits + frameLength) * (coreSamplingRate)) / frameLength) ); 153 FDK_ASSERT(bitRate >= 0); 154 155 bitRate = FDKmin(bitRate, ((nChannelsEff * MIN_BUFSIZE_PER_EFF_CHAN)*(coreSamplingRate>>shift)) / (frameLength>>shift)) ; 156 FDK_ASSERT(bitRate >= 0); 157 158 } while (prevBitRate != bitRate && iter++ < 3) ; 159 160 return bitRate; 161 } 162 163 164 typedef struct 165 { 166 AACENC_BITRATE_MODE bitrateMode; 167 int chanBitrate[2]; /* mono/stereo settings */ 168 } CONFIG_TAB_ENTRY_VBR; 169 170 static const CONFIG_TAB_ENTRY_VBR configTabVBR[] = { 171 {AACENC_BR_MODE_CBR, { 0, 0}} , 172 {AACENC_BR_MODE_VBR_1, { 32000, 20000}} , 173 {AACENC_BR_MODE_VBR_2, { 40000, 32000}} , 174 {AACENC_BR_MODE_VBR_3, { 56000, 48000}} , 175 {AACENC_BR_MODE_VBR_4, { 72000, 64000}} , 176 {AACENC_BR_MODE_VBR_5, {112000, 96000}} 177 }; 178 179 /*----------------------------------------------------------------------------- 180 181 functionname: FDKaacEnc_GetVBRBitrate 182 description: Get VBR bitrate from vbr quality 183 input params: int vbrQuality (VBR0, VBR1, VBR2) 184 channelMode 185 returns: vbr bitrate 186 187 ------------------------------------------------------------------------------*/ 188 INT FDKaacEnc_GetVBRBitrate(INT bitrateMode, CHANNEL_MODE channelMode) 189 { 190 INT bitrate = 0; 191 INT monoStereoMode = 0; /* default mono */ 192 193 if (FDKaacEnc_GetMonoStereoMode(channelMode)==EL_MODE_STEREO) { 194 monoStereoMode = 1; 195 } 196 197 switch((AACENC_BITRATE_MODE)bitrateMode){ 198 case AACENC_BR_MODE_VBR_1: 199 case AACENC_BR_MODE_VBR_2: 200 case AACENC_BR_MODE_VBR_3: 201 case AACENC_BR_MODE_VBR_4: 202 case AACENC_BR_MODE_VBR_5: 203 bitrate = configTabVBR[bitrateMode].chanBitrate[monoStereoMode]; 204 break; 205 case AACENC_BR_MODE_INVALID: 206 case AACENC_BR_MODE_CBR: 207 case AACENC_BR_MODE_SFR: 208 case AACENC_BR_MODE_FF: 209 default: 210 bitrate = 0; 211 break; 212 } 213 214 /* convert channel bitrate to overall bitrate*/ 215 bitrate *= FDKaacEnc_GetChannelModeConfiguration(channelMode)->nChannelsEff; 216 217 return bitrate; 218 } 219 220 /** 221 * \brief Convert encoder bitreservoir value for transport library. 222 * 223 * \param bitrateMode Bitratemode used in current encoder instance. Se ::AACENC_BITRATE_MODE 224 * \param bitresTotal Encoder bitreservoir level in bits. 225 * 226 * \return Corrected bitreservoir level used in transport library. 227 */ 228 static INT FDKaacEnc_EncBitresToTpBitres( 229 const AACENC_BITRATE_MODE bitrateMode, 230 const INT bitresTotal 231 ) 232 { 233 INT transporBitreservoir = 0; 234 235 switch (bitrateMode) { 236 case AACENC_BR_MODE_CBR: 237 transporBitreservoir = bitresTotal; /* encoder bitreservoir level */ 238 break; 239 case AACENC_BR_MODE_VBR_1: 240 case AACENC_BR_MODE_VBR_2: 241 case AACENC_BR_MODE_VBR_3: 242 case AACENC_BR_MODE_VBR_4: 243 case AACENC_BR_MODE_VBR_5: 244 transporBitreservoir = FDK_INT_MAX; /* signal variable bitrate */ 245 break; 246 case AACENC_BR_MODE_FF: 247 case AACENC_BR_MODE_SFR: 248 transporBitreservoir = 0; /* super framing and fixed framing */ 249 break; /* without bitreservoir signaling */ 250 default: 251 case AACENC_BR_MODE_INVALID: 252 transporBitreservoir = 0; /* invalid configuration*/ 253 FDK_ASSERT(0); 254 } 255 256 return transporBitreservoir; 257 } 258 259 /*----------------------------------------------------------------------------- 260 261 functionname: FDKaacEnc_AacInitDefaultConfig 262 description: gives reasonable default configuration 263 returns: --- 264 265 ------------------------------------------------------------------------------*/ 266 void FDKaacEnc_AacInitDefaultConfig(AACENC_CONFIG *config) 267 { 268 /* make thepre initialization of the structs flexible */ 269 FDKmemclear(config, sizeof(AACENC_CONFIG)); 270 271 /* default ancillary */ 272 config->anc_Rate = 0; /* no ancillary data */ 273 config->ancDataBitRate = 0; /* no additional consumed bitrate */ 274 275 /* default configurations */ 276 config->bitRate = -1; /* bitrate must be set*/ 277 config->averageBits = -1; /* instead of bitrate/s we can configure bits/superframe */ 278 config->bitrateMode = 0; 279 config->bandWidth = 0; /* get bandwidth from table */ 280 config->useTns = TNS_ENABLE_MASK; /* tns enabled completly */ 281 config->usePns = 1; /* depending on channelBitrate this might be set to 0 later */ 282 config->useIS = 1; /* Intensity Stereo Configuration */ 283 config->framelength = DEFAULT_FRAMELENGTH; /* used frame size */ 284 config->syntaxFlags = 0; /* default syntax with no specialities */ 285 config->epConfig = -1; /* no ER syntax -> no additional error protection */ 286 config->nSubFrames = 1; /* default, no sub frames */ 287 config->channelOrder = CH_ORDER_MPEG; /* Use MPEG channel ordering. */ 288 config->channelMode = MODE_UNKNOWN; 289 config->minBitsPerFrame = -1; /* minum number of bits in each AU */ 290 config->maxBitsPerFrame = -1; /* minum number of bits in each AU */ 291 config->bitreservoir = -1; /* default, uninitialized value */ 292 293 /* init tabs in fixpoint_math */ 294 InitLdInt(); 295 InitInvSqrtTab(); 296 } 297 298 299 /*--------------------------------------------------------------------------- 300 301 functionname: FDKaacEnc_Open 302 description: allocate and initialize a new encoder instance 303 returns: error code 304 305 ---------------------------------------------------------------------------*/ 306 AAC_ENCODER_ERROR FDKaacEnc_Open(HANDLE_AAC_ENC *phAacEnc, 307 const INT nElements, 308 const INT nChannels, 309 const INT nSubFrames) 310 { 311 AAC_ENCODER_ERROR ErrorStatus; 312 AAC_ENC *hAacEnc = NULL; 313 UCHAR *dynamicRAM = NULL; 314 315 if (phAacEnc==NULL) { 316 return AAC_ENC_INVALID_HANDLE; 317 } 318 319 /* allocate encoder structure */ 320 hAacEnc = GetRam_aacEnc_AacEncoder(); 321 if (hAacEnc == NULL) { 322 ErrorStatus = AAC_ENC_NO_MEMORY; 323 goto bail; 324 } 325 FDKmemclear(hAacEnc, sizeof(AAC_ENC)); 326 327 hAacEnc->dynamic_RAM = GetAACdynamic_RAM(); 328 dynamicRAM = (UCHAR*)hAacEnc->dynamic_RAM; 329 330 /* allocate the Psy aud Psy Out structure */ 331 ErrorStatus = FDKaacEnc_PsyNew(&hAacEnc->psyKernel, 332 nElements, 333 nChannels 334 ,dynamicRAM 335 ); 336 if (ErrorStatus != AAC_ENC_OK) 337 goto bail; 338 339 ErrorStatus = FDKaacEnc_PsyOutNew(hAacEnc->psyOut, 340 nElements, 341 nChannels, 342 nSubFrames 343 ,dynamicRAM 344 ); 345 if (ErrorStatus != AAC_ENC_OK) 346 goto bail; 347 348 /* allocate the Q&C Out structure */ 349 ErrorStatus = FDKaacEnc_QCOutNew(hAacEnc->qcOut, 350 nElements, 351 nChannels, 352 nSubFrames 353 ,dynamicRAM 354 ); 355 if (ErrorStatus != AAC_ENC_OK) 356 goto bail; 357 358 /* allocate the Q&C kernel */ 359 ErrorStatus = FDKaacEnc_QCNew(&hAacEnc->qcKernel, 360 nElements 361 ,dynamicRAM 362 ); 363 if (ErrorStatus != AAC_ENC_OK) 364 goto bail; 365 366 hAacEnc->maxChannels = nChannels; 367 hAacEnc->maxElements = nElements; 368 hAacEnc->maxFrames = nSubFrames; 369 370 bail: 371 *phAacEnc = hAacEnc; 372 return ErrorStatus; 373 } 374 375 376 AAC_ENCODER_ERROR FDKaacEnc_Initialize(HANDLE_AAC_ENC hAacEnc, 377 AACENC_CONFIG *config, /* pre-initialized config struct */ 378 HANDLE_TRANSPORTENC hTpEnc, 379 ULONG initFlags) 380 { 381 AAC_ENCODER_ERROR ErrorStatus; 382 INT psyBitrate, tnsMask; //INT profile = 1; 383 CHANNEL_MAPPING *cm = NULL; 384 385 INT qmbfac, qbw; 386 FIXP_DBL mbfac, bw_ratio; 387 QC_INIT qcInit; 388 INT averageBitsPerFrame = 0; 389 390 if (config==NULL) 391 return AAC_ENC_INVALID_HANDLE; 392 393 /******************* sanity checks *******************/ 394 395 /* check config structure */ 396 if (config->nChannels < 1 || config->nChannels > (6)) { 397 return AAC_ENC_UNSUPPORTED_CHANNELCONFIG; 398 } 399 400 /* check sample rate */ 401 switch (config->sampleRate) 402 { 403 case 8000: 404 case 11025: 405 case 12000: 406 case 16000: 407 case 22050: 408 case 24000: 409 case 32000: 410 case 44100: 411 case 48000: 412 case 64000: 413 case 88200: 414 case 96000: 415 break; 416 default: 417 return AAC_ENC_UNSUPPORTED_SAMPLINGRATE; 418 } 419 420 /* bitrate has to be set */ 421 if (config->bitRate==-1) { 422 return AAC_ENC_UNSUPPORTED_BITRATE; 423 } 424 425 /* check bit rate */ 426 427 if (FDKaacEnc_LimitBitrate( 428 hTpEnc, 429 config->sampleRate, 430 config->framelength, 431 config->nChannels, 432 FDKaacEnc_GetChannelModeConfiguration(config->channelMode)->nChannelsEff, 433 config->bitRate, 434 config->averageBits, 435 &averageBitsPerFrame, 436 config->bitrateMode, 437 config->nSubFrames 438 ) != config->bitRate ) 439 { 440 return AAC_ENC_UNSUPPORTED_BITRATE; 441 } 442 443 if (config->syntaxFlags & AC_ER_VCB11) { 444 return AAC_ENC_UNSUPPORTED_ER_FORMAT; 445 } 446 if (config->syntaxFlags & AC_ER_HCR) { 447 return AAC_ENC_UNSUPPORTED_ER_FORMAT; 448 } 449 450 /* check frame length */ 451 switch (config->framelength) 452 { 453 case 1024: 454 if ( config->audioObjectType != AOT_AAC_LC 455 && config->audioObjectType != AOT_SBR 456 && config->audioObjectType != AOT_PS 457 && config->audioObjectType != AOT_ER_AAC_LC 458 && config->audioObjectType != AOT_AAC_SCAL ) 459 { 460 return AAC_ENC_INVALID_FRAME_LENGTH; 461 } 462 break; 463 case 512: 464 case 480: 465 if ( config->audioObjectType != AOT_ER_AAC_LD 466 && config->audioObjectType != AOT_ER_AAC_ELD ) 467 { 468 return AAC_ENC_INVALID_FRAME_LENGTH; 469 } 470 break; 471 default: 472 return AAC_ENC_INVALID_FRAME_LENGTH; 473 } 474 475 if (config->anc_Rate != 0) { 476 477 ErrorStatus = FDKaacEnc_InitCheckAncillary(config->bitRate, 478 config->framelength, 479 config->anc_Rate, 480 &hAacEnc->ancillaryBitsPerFrame, 481 config->sampleRate); 482 if (ErrorStatus != AAC_ENC_OK) 483 goto bail; 484 485 486 /* update estimated consumed bitrate */ 487 config->ancDataBitRate += ( (hAacEnc->ancillaryBitsPerFrame * config->sampleRate) / config->framelength ); 488 489 } 490 491 /* maximal allowed DSE bytes in frame */ 492 { 493 /* fixpoint calculation*/ 494 INT q_res, encBitrate, sc; 495 FIXP_DBL tmp = fDivNorm(config->framelength, config->sampleRate, &q_res); 496 encBitrate = (config->bitRate/*-config->ancDataBitRate*/)- (INT)(config->nChannels*8000); 497 sc = CountLeadingBits(encBitrate); 498 config->maxAncBytesPerAU = FDKmin( (256), FDKmax(0,(INT)(fMultDiv2(tmp, (FIXP_DBL)(encBitrate<<sc))>>(-q_res+sc-1+3))) ); 499 } 500 501 /* bind config to hAacEnc->config */ 502 hAacEnc->config = config; 503 504 /* set hAacEnc->bitrateMode */ 505 hAacEnc->bitrateMode = (AACENC_BITRATE_MODE)config->bitrateMode; 506 507 hAacEnc->encoderMode = config->channelMode; 508 509 ErrorStatus = FDKaacEnc_InitChannelMapping(hAacEnc->encoderMode, config->channelOrder, &hAacEnc->channelMapping); 510 if (ErrorStatus != AAC_ENC_OK) 511 goto bail; 512 513 cm = &hAacEnc->channelMapping; 514 515 ErrorStatus = FDKaacEnc_DetermineBandWidth(&hAacEnc->config->bandWidth, 516 config->bandWidth, 517 config->bitRate - config->ancDataBitRate, 518 hAacEnc->bitrateMode, 519 config->sampleRate, 520 config->framelength, 521 cm, 522 hAacEnc->encoderMode); 523 if (ErrorStatus != AAC_ENC_OK) 524 goto bail; 525 526 hAacEnc->bandwidth90dB = (INT)hAacEnc->config->bandWidth; 527 528 tnsMask = config->useTns ? TNS_ENABLE_MASK : 0x0; 529 psyBitrate = config->bitRate - config->ancDataBitRate; 530 531 ErrorStatus = FDKaacEnc_psyInit(hAacEnc->psyKernel, 532 hAacEnc->psyOut, 533 hAacEnc->maxFrames, 534 hAacEnc->maxChannels, 535 config->audioObjectType, 536 cm); 537 if (ErrorStatus != AAC_ENC_OK) 538 goto bail; 539 540 ErrorStatus = FDKaacEnc_psyMainInit(hAacEnc->psyKernel, 541 config->audioObjectType, 542 cm, 543 config->sampleRate, 544 config->framelength, 545 psyBitrate, 546 tnsMask, 547 hAacEnc->bandwidth90dB, 548 config->usePns, 549 config->useIS, 550 config->syntaxFlags, 551 initFlags); 552 if (ErrorStatus != AAC_ENC_OK) 553 goto bail; 554 555 ErrorStatus = FDKaacEnc_QCOutInit(hAacEnc->qcOut, hAacEnc->maxFrames, cm); 556 if (ErrorStatus != AAC_ENC_OK) 557 goto bail; 558 559 560 561 qcInit.channelMapping = &hAacEnc->channelMapping; 562 qcInit.sceCpe = 0; 563 564 { 565 int maxBitres; 566 qcInit.averageBits = (averageBitsPerFrame+7)&~7; 567 maxBitres = (MIN_BUFSIZE_PER_EFF_CHAN*cm->nChannelsEff) - qcInit.averageBits; 568 qcInit.bitRes = (config->bitreservoir!=-1) ? FDKmin(config->bitreservoir, maxBitres) : maxBitres; 569 570 qcInit.maxBits = fixMin(MIN_BUFSIZE_PER_EFF_CHAN*cm->nChannelsEff, ((averageBitsPerFrame+7)&~7)+qcInit.bitRes); 571 qcInit.maxBits = (config->maxBitsPerFrame!=-1) ? fixMin(qcInit.maxBits, config->maxBitsPerFrame) : qcInit.maxBits; 572 573 qcInit.minBits = fixMax(0, ((averageBitsPerFrame-1)&~7)-qcInit.bitRes-transportEnc_GetStaticBits(hTpEnc, ((averageBitsPerFrame+7)&~7)+qcInit.bitRes)); 574 qcInit.minBits = (config->minBitsPerFrame!=-1) ? fixMax(qcInit.minBits, config->minBitsPerFrame) : qcInit.minBits; 575 } 576 577 qcInit.nSubFrames = config->nSubFrames; 578 qcInit.padding.paddingRest = config->sampleRate; 579 580 /* Calc meanPe */ 581 bw_ratio = fDivNorm((FIXP_DBL)hAacEnc->bandwidth90dB, (FIXP_DBL)(config->sampleRate>>1), &qbw); 582 qbw = DFRACT_BITS-1-qbw; 583 /* qcInit.meanPe = 10.0f * FRAME_LEN_LONG * hAacEnc->bandwidth90dB/(config->sampleRate/2.0f); */ 584 qcInit.meanPe = fMult(bw_ratio, (FIXP_DBL)((10*config->framelength)<<16)) >> (qbw-15); 585 586 /* Calc maxBitFac */ 587 mbfac = fDivNorm((MIN_BUFSIZE_PER_EFF_CHAN-744)*cm->nChannelsEff, qcInit.averageBits/qcInit.nSubFrames, &qmbfac); 588 qmbfac = DFRACT_BITS-1-qmbfac; 589 qcInit.maxBitFac = (qmbfac > 24) ? (mbfac >> (qmbfac - 24)):(mbfac << (24 - qmbfac)); 590 591 switch(config->bitrateMode){ 592 case AACENC_BR_MODE_CBR: 593 qcInit.bitrateMode = QCDATA_BR_MODE_CBR; 594 break; 595 case AACENC_BR_MODE_VBR_1: 596 qcInit.bitrateMode = QCDATA_BR_MODE_VBR_1; 597 break; 598 case AACENC_BR_MODE_VBR_2: 599 qcInit.bitrateMode = QCDATA_BR_MODE_VBR_2; 600 break; 601 case AACENC_BR_MODE_VBR_3: 602 qcInit.bitrateMode = QCDATA_BR_MODE_VBR_3; 603 break; 604 case AACENC_BR_MODE_VBR_4: 605 qcInit.bitrateMode = QCDATA_BR_MODE_VBR_4; 606 break; 607 case AACENC_BR_MODE_VBR_5: 608 qcInit.bitrateMode = QCDATA_BR_MODE_VBR_5; 609 break; 610 case AACENC_BR_MODE_SFR: 611 qcInit.bitrateMode = QCDATA_BR_MODE_SFR; 612 break; 613 case AACENC_BR_MODE_FF: 614 qcInit.bitrateMode = QCDATA_BR_MODE_FF; 615 break; 616 default: 617 ErrorStatus = AAC_ENC_UNSUPPORTED_BITRATE_MODE; 618 goto bail; 619 } 620 621 qcInit.invQuant = (config->useRequant)?2:0; 622 623 /* maxIterations should be set to the maximum number of requantization iterations that are 624 * allowed before the crash recovery functionality is activated. This setting should be adjusted 625 * to the processing power available, i.e. to the processing power headroom in one frame that is 626 * still left after normal encoding without requantization. Please note that if activated this 627 * functionality is used most likely only in cases where the encoder is operating beyond 628 * recommended settings, i.e. the audio quality is suboptimal anyway. Activating the crash 629 * recovery does not further reduce audio quality significantly in these cases. */ 630 if ( (config->audioObjectType == AOT_ER_AAC_LD) || (config->audioObjectType == AOT_ER_AAC_ELD) ) { 631 qcInit.maxIterations = 2; 632 } 633 else 634 { 635 qcInit.maxIterations = 5; 636 } 637 638 qcInit.bitrate = config->bitRate - config->ancDataBitRate; 639 640 qcInit.staticBits = transportEnc_GetStaticBits(hTpEnc, qcInit.averageBits/qcInit.nSubFrames); 641 642 ErrorStatus = FDKaacEnc_QCInit(hAacEnc->qcKernel, &qcInit); 643 if (ErrorStatus != AAC_ENC_OK) 644 goto bail; 645 646 /* Map virtual aot's to intern aot used in bitstream writer. */ 647 switch (hAacEnc->config->audioObjectType) { 648 case AOT_MP2_AAC_LC: 649 case AOT_DABPLUS_AAC_LC: 650 hAacEnc->aot = AOT_AAC_LC; 651 break; 652 case AOT_MP2_SBR: 653 case AOT_DABPLUS_SBR: 654 hAacEnc->aot = AOT_SBR; 655 break; 656 case AOT_MP2_PS: 657 case AOT_DABPLUS_PS: 658 hAacEnc->aot = AOT_PS; 659 break; 660 default: 661 hAacEnc->aot = hAacEnc->config->audioObjectType; 662 } 663 664 /* common things */ 665 666 return AAC_ENC_OK; 667 668 bail: 669 670 return ErrorStatus; 671 } 672 673 674 /*--------------------------------------------------------------------------- 675 676 functionname: FDKaacEnc_EncodeFrame 677 description: encodes one frame 678 returns: error code 679 680 ---------------------------------------------------------------------------*/ 681 AAC_ENCODER_ERROR FDKaacEnc_EncodeFrame( HANDLE_AAC_ENC hAacEnc, /* encoder handle */ 682 HANDLE_TRANSPORTENC hTpEnc, 683 INT_PCM* RESTRICT inputBuffer, 684 INT* nOutBytes, 685 AACENC_EXT_PAYLOAD extPayload[MAX_TOTAL_EXT_PAYLOADS] 686 ) 687 { 688 AAC_ENCODER_ERROR ErrorStatus; 689 int el, n, c=0; 690 UCHAR extPayloadUsed[MAX_TOTAL_EXT_PAYLOADS]; 691 692 CHANNEL_MAPPING *cm = &hAacEnc->channelMapping; 693 694 695 696 PSY_OUT *psyOut = hAacEnc->psyOut[c]; 697 QC_OUT *qcOut = hAacEnc->qcOut[c]; 698 699 FDKmemclear(extPayloadUsed, MAX_TOTAL_EXT_PAYLOADS * sizeof(UCHAR)); 700 701 qcOut->elementExtBits = 0; /* sum up all extended bit of each element */ 702 qcOut->staticBits = 0; /* sum up side info bits of each element */ 703 qcOut->totalNoRedPe = 0; /* sum up PE */ 704 705 /* advance psychoacoustics */ 706 for (el=0; el<cm->nElements; el++) { 707 ELEMENT_INFO elInfo = cm->elInfo[el]; 708 709 if ( (elInfo.elType == ID_SCE) 710 || (elInfo.elType == ID_CPE) 711 || (elInfo.elType == ID_LFE) ) 712 { 713 int ch; 714 715 /* update pointer!*/ 716 for(ch=0;ch<elInfo.nChannelsInEl;ch++) { 717 PSY_OUT_CHANNEL *psyOutChan = psyOut->psyOutElement[el]->psyOutChannel[ch]; 718 QC_OUT_CHANNEL *qcOutChan = qcOut->qcElement[el]->qcOutChannel[ch]; 719 720 psyOutChan->mdctSpectrum = qcOutChan->mdctSpectrum; 721 psyOutChan->sfbSpreadEnergy = qcOutChan->sfbSpreadEnergy; 722 psyOutChan->sfbEnergy = qcOutChan->sfbEnergy; 723 psyOutChan->sfbEnergyLdData = qcOutChan->sfbEnergyLdData; 724 psyOutChan->sfbMinSnrLdData = qcOutChan->sfbMinSnrLdData; 725 psyOutChan->sfbThresholdLdData = qcOutChan->sfbThresholdLdData; 726 727 } 728 729 FDKaacEnc_psyMain(elInfo.nChannelsInEl, 730 hAacEnc->psyKernel->psyElement[el], 731 hAacEnc->psyKernel->psyDynamic, 732 hAacEnc->psyKernel->psyConf, 733 psyOut->psyOutElement[el], 734 inputBuffer, 735 cm->elInfo[el].ChannelIndex, 736 cm->nChannels 737 738 ); 739 740 /* FormFactor, Pe and staticBitDemand calculation */ 741 ErrorStatus = FDKaacEnc_QCMainPrepare(&elInfo, 742 hAacEnc->qcKernel->hAdjThr->adjThrStateElem[el], 743 psyOut->psyOutElement[el], 744 qcOut->qcElement[el], 745 hAacEnc->aot, 746 hAacEnc->config->syntaxFlags, 747 hAacEnc->config->epConfig); 748 749 if (ErrorStatus != AAC_ENC_OK) 750 return ErrorStatus; 751 752 /*-------------------------------------------- */ 753 754 qcOut->qcElement[el]->extBitsUsed = 0; 755 qcOut->qcElement[el]->nExtensions = 0; 756 /* reset extension payload */ 757 FDKmemclear(&qcOut->qcElement[el]->extension, (1)*sizeof(QC_OUT_EXTENSION)); 758 759 for ( n = 0; n < MAX_TOTAL_EXT_PAYLOADS; n++ ) { 760 if ( !extPayloadUsed[n] 761 && (extPayload[n].associatedChElement == el) 762 && (extPayload[n].dataSize > 0) 763 && (extPayload[n].pData != NULL) ) 764 { 765 int idx = qcOut->qcElement[el]->nExtensions++; 766 767 qcOut->qcElement[el]->extension[idx].type = extPayload[n].dataType; /* Perform a sanity check on the type? */ 768 qcOut->qcElement[el]->extension[idx].nPayloadBits = extPayload[n].dataSize; 769 qcOut->qcElement[el]->extension[idx].pPayload = extPayload[n].pData; 770 /* Now ask the bitstream encoder how many bits we need to encode the data with the current bitstream syntax: */ 771 qcOut->qcElement[el]->extBitsUsed += 772 FDKaacEnc_writeExtensionData( NULL, 773 &qcOut->qcElement[el]->extension[idx], 774 0, 0, 775 hAacEnc->config->syntaxFlags, 776 hAacEnc->aot, 777 hAacEnc->config->epConfig ); 778 extPayloadUsed[n] = 1; 779 } 780 } 781 782 /* sum up extension and static bits for all channel elements */ 783 qcOut->elementExtBits += qcOut->qcElement[el]->extBitsUsed; 784 qcOut->staticBits += qcOut->qcElement[el]->staticBitsUsed; 785 786 /* sum up pe */ 787 qcOut->totalNoRedPe += qcOut->qcElement[el]->peData.pe; 788 } 789 } 790 791 qcOut->nExtensions = 0; 792 qcOut->globalExtBits = 0; 793 794 /* reset extension payload */ 795 FDKmemclear(&qcOut->extension, (2+2)*sizeof(QC_OUT_EXTENSION)); 796 797 /* Add extension payload not assigned to an channel element 798 (Ancillary data is the only supported type up to now) */ 799 for ( n = 0; n < MAX_TOTAL_EXT_PAYLOADS; n++ ) { 800 if ( !extPayloadUsed[n] 801 && (extPayload[n].associatedChElement == -1) 802 && (extPayload[n].pData != NULL) ) 803 { 804 UINT payloadBits = 0; 805 806 if (extPayload[n].dataType == EXT_DATA_ELEMENT) { 807 if (hAacEnc->ancillaryBitsPerFrame) { 808 /* granted frame dse bitrate */ 809 payloadBits = hAacEnc->ancillaryBitsPerFrame; 810 } 811 else { 812 /* write anc data if bitrate constraint fulfilled */ 813 if ((extPayload[n].dataSize>>3) <= hAacEnc->config->maxAncBytesPerAU) { 814 payloadBits = extPayload[n].dataSize; 815 } 816 } 817 payloadBits = fixMin( extPayload[n].dataSize, payloadBits ); 818 } else { 819 payloadBits = extPayload[n].dataSize; 820 } 821 822 if (payloadBits > 0) 823 { 824 int idx = qcOut->nExtensions++; 825 826 qcOut->extension[idx].type = extPayload[n].dataType; /* Perform a sanity check on the type? */ 827 qcOut->extension[idx].nPayloadBits = payloadBits; 828 qcOut->extension[idx].pPayload = extPayload[n].pData; 829 /* Now ask the bitstream encoder how many bits we need to encode the data with the current bitstream syntax: */ 830 qcOut->globalExtBits += FDKaacEnc_writeExtensionData( NULL, 831 &qcOut->extension[idx], 832 0, 0, 833 hAacEnc->config->syntaxFlags, 834 hAacEnc->aot, 835 hAacEnc->config->epConfig ); 836 if (extPayload[n].dataType == EXT_DATA_ELEMENT) { 837 /* substract the processed bits */ 838 extPayload[n].dataSize -= payloadBits; 839 } 840 extPayloadUsed[n] = 1; 841 } 842 } 843 } 844 845 if (!(hAacEnc->config->syntaxFlags & (AC_SCALABLE|AC_ER))) { 846 qcOut->globalExtBits += EL_ID_BITS; /* add bits for ID_END */ 847 } 848 849 /* build bitstream all nSubFrames */ 850 { 851 INT totalBits = 0; /* Total AU bits */; 852 INT avgTotalBits = 0; 853 854 /*-------------------------------------------- */ 855 /* Get average total bits */ 856 /*-------------------------------------------- */ 857 { 858 /* frame wise bitrate adaption */ 859 FDKaacEnc_AdjustBitrate(hAacEnc->qcKernel, 860 cm, 861 &avgTotalBits, 862 hAacEnc->config->bitRate, 863 hAacEnc->config->sampleRate, 864 hAacEnc->config->framelength); 865 866 /* adjust super frame bitrate */ 867 avgTotalBits *= hAacEnc->config->nSubFrames; 868 } 869 870 /* Make first estimate of transport header overhead. 871 Take maximum possible frame size into account to prevent bitreservoir underrun. */ 872 hAacEnc->qcKernel->globHdrBits = transportEnc_GetStaticBits(hTpEnc, avgTotalBits + hAacEnc->qcKernel->bitResTot); 873 874 875 /*-------------------------------------------- */ 876 /*-------------------------------------------- */ 877 /*-------------------------------------------- */ 878 879 ErrorStatus = FDKaacEnc_QCMain(hAacEnc->qcKernel, 880 hAacEnc->psyOut, 881 hAacEnc->qcOut, 882 avgTotalBits, 883 cm 884 ,hAacEnc->aot, 885 hAacEnc->config->syntaxFlags, 886 hAacEnc->config->epConfig); 887 888 if (ErrorStatus != AAC_ENC_OK) 889 return ErrorStatus; 890 /*-------------------------------------------- */ 891 892 /*-------------------------------------------- */ 893 ErrorStatus = FDKaacEnc_updateFillBits(cm, 894 hAacEnc->qcKernel, 895 hAacEnc->qcKernel->elementBits, 896 hAacEnc->qcOut); 897 if (ErrorStatus != AAC_ENC_OK) 898 return ErrorStatus; 899 900 /*-------------------------------------------- */ 901 ErrorStatus = FDKaacEnc_FinalizeBitConsumption(cm, 902 hAacEnc->qcKernel, 903 qcOut, 904 qcOut->qcElement, 905 hTpEnc, 906 hAacEnc->aot, 907 hAacEnc->config->syntaxFlags, 908 hAacEnc->config->epConfig); 909 if (ErrorStatus != AAC_ENC_OK) 910 return ErrorStatus; 911 /*-------------------------------------------- */ 912 totalBits += qcOut->totalBits; 913 914 915 /*-------------------------------------------- */ 916 FDKaacEnc_updateBitres(cm, 917 hAacEnc->qcKernel, 918 hAacEnc->qcOut); 919 920 /*-------------------------------------------- */ 921 922 /* for ( all sub frames ) ... */ 923 /* write bitstream header */ 924 transportEnc_WriteAccessUnit( 925 hTpEnc, 926 totalBits, 927 FDKaacEnc_EncBitresToTpBitres(hAacEnc->bitrateMode, hAacEnc->qcKernel->bitResTot), 928 cm->nChannelsEff); 929 930 /* write bitstream */ 931 ErrorStatus = FDKaacEnc_WriteBitstream( 932 hTpEnc, 933 cm, 934 qcOut, 935 psyOut, 936 hAacEnc->qcKernel, 937 hAacEnc->aot, 938 hAacEnc->config->syntaxFlags, 939 hAacEnc->config->epConfig); 940 941 if (ErrorStatus != AAC_ENC_OK) 942 return ErrorStatus; 943 944 /* transportEnc_EndAccessUnit() is being called inside FDKaacEnc_WriteBitstream() */ 945 transportEnc_GetFrame(hTpEnc, nOutBytes); 946 947 } /* -end- if (curFrame==hAacEnc->qcKernel->nSubFrames) */ 948 949 950 /*-------------------------------------------- */ 951 return AAC_ENC_OK; 952 } 953 954 /*--------------------------------------------------------------------------- 955 956 functionname:FDKaacEnc_Close 957 description: delete encoder instance 958 returns: 959 960 ---------------------------------------------------------------------------*/ 961 962 void FDKaacEnc_Close( HANDLE_AAC_ENC* phAacEnc) /* encoder handle */ 963 { 964 if (*phAacEnc == NULL) { 965 return; 966 } 967 AAC_ENC *hAacEnc = (AAC_ENC*)*phAacEnc; 968 969 if (hAacEnc->dynamic_RAM != NULL) 970 FreeAACdynamic_RAM(&hAacEnc->dynamic_RAM); 971 972 FDKaacEnc_PsyClose(&hAacEnc->psyKernel,hAacEnc->psyOut); 973 974 FDKaacEnc_QCClose(&hAacEnc->qcKernel, hAacEnc->qcOut); 975 976 FreeRam_aacEnc_AacEncoder(phAacEnc); 977 } 978 979 980 /* The following functions are in this source file only for convenience and */ 981 /* need not be visible outside of a possible encoder library. */ 982 983 /* basic defines for ancillary data */ 984 #define MAX_ANCRATE 19200 /* ancillary rate >= 19200 isn't valid */ 985 986 /*--------------------------------------------------------------------------- 987 988 functionname: FDKaacEnc_InitCheckAncillary 989 description: initialize and check ancillary data struct 990 return: if success or NULL if error 991 992 ---------------------------------------------------------------------------*/ 993 static AAC_ENCODER_ERROR FDKaacEnc_InitCheckAncillary(INT bitRate, 994 INT framelength, 995 INT ancillaryRate, 996 INT *ancillaryBitsPerFrame, 997 INT sampleRate) 998 { 999 INT diffToByteAlign; 1000 1001 /* don't use negative ancillary rates */ 1002 if ( ancillaryRate < -1 ) 1003 return AAC_ENC_UNSUPPORTED_ANC_BITRATE; 1004 1005 /* check if ancillary rate is ok */ 1006 if ( (ancillaryRate != (-1)) && (ancillaryRate != 0) ) { 1007 /* ancRate <= 15% of bitrate && ancRate < 19200 */ 1008 if ( ( ancillaryRate >= MAX_ANCRATE ) || 1009 ( (ancillaryRate * 20) > (bitRate * 3) ) ) { 1010 return AAC_ENC_UNSUPPORTED_ANC_BITRATE; 1011 } 1012 } 1013 else if (ancillaryRate == -1) { 1014 /* if no special ancRate is requested but a ancillary file is 1015 stated, then generate a ancillary rate matching to the bitrate */ 1016 if (bitRate >= (MAX_ANCRATE * 10)) { 1017 /* ancillary rate is 19199 */ 1018 ancillaryRate = (MAX_ANCRATE - 1); 1019 } 1020 else { /* 10% of bitrate */ 1021 ancillaryRate = bitRate / 10; 1022 } 1023 } 1024 1025 /* make ancillaryBitsPerFrame byte align */ 1026 *ancillaryBitsPerFrame = (ancillaryRate * framelength ) / sampleRate; 1027 diffToByteAlign = *ancillaryBitsPerFrame % 8; 1028 *ancillaryBitsPerFrame = *ancillaryBitsPerFrame - diffToByteAlign; 1029 1030 return AAC_ENC_OK; 1031 } 1032