1 2/* ----------------------------------------------------------------------------------------------------------- 3Software License for The Fraunhofer FDK AAC Codec Library for Android 4 5� Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur F�rderung der angewandten Forschung e.V. 6 All rights reserved. 7 8 1. INTRODUCTION 9The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements 10the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. 11This FDK AAC Codec software is intended to be used on a wide variety of Android devices. 12 13AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual 14audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by 15independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part 16of the MPEG specifications. 17 18Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) 19may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners 20individually for the purpose of encoding or decoding bit streams in products that are compliant with 21the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license 22these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec 23software may already be covered under those patent licenses when it is used for those licensed purposes only. 24 25Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, 26are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional 27applications information and documentation. 28 292. COPYRIGHT LICENSE 30 31Redistribution and use in source and binary forms, with or without modification, are permitted without 32payment of copyright license fees provided that you satisfy the following conditions: 33 34You must retain the complete text of this software license in redistributions of the FDK AAC Codec or 35your modifications thereto in source code form. 36 37You must retain the complete text of this software license in the documentation and/or other materials 38provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. 39You must make available free of charge copies of the complete source code of the FDK AAC Codec and your 40modifications thereto to recipients of copies in binary form. 41 42The name of Fraunhofer may not be used to endorse or promote products derived from this library without 43prior written permission. 44 45You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec 46software or your modifications thereto. 47 48Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software 49and 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 533. NO PATENT LICENSE 54 55NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, 56ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with 57respect to this software. 58 59You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized 60by appropriate patent licenses. 61 624. DISCLAIMER 63 64This 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 66of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 67CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, 68including but not limited to procurement of substitute goods or services; loss of use, data, or profits, 69or business interruption, however caused and on any theory of liability, whether in contract, strict 70liability, or tort (including negligence), arising in any way out of the use of this software, even if 71advised of the possibility of such damage. 72 735. CONTACT INFORMATION 74 75Fraunhofer Institute for Integrated Circuits IIS 76Attention: Audio and Multimedia Departments - FDK AAC LL 77Am Wolfsmantel 33 7891058 Erlangen, Germany 79 80www.iis.fraunhofer.de/amm 81amm-info@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 110static AAC_ENCODER_ERROR FDKaacEnc_InitCheckAncillary(INT bitRate, 111 INT framelength, 112 INT ancillaryRate, 113 INT *ancillaryBitsPerFrame, 114 INT sampleRate); 115 116INT 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) * (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 164typedef struct 165{ 166 AACENC_BITRATE_MODE bitrateMode; 167 int chanBitrate[2]; /* mono/stereo settings */ 168} CONFIG_TAB_ENTRY_VBR; 169 170static 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 ------------------------------------------------------------------------------*/ 188INT 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 */ 228static 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 ------------------------------------------------------------------------------*/ 266void 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 = -1; /* Framesize not configured */ 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 ---------------------------------------------------------------------------*/ 306AAC_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 370bail: 371 *phAacEnc = hAacEnc; 372 return ErrorStatus; 373} 374 375 376AAC_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 > (8)) { 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_ER_AAC_LD 455 || config->audioObjectType == AOT_ER_AAC_ELD ) 456 { 457 return AAC_ENC_INVALID_FRAME_LENGTH; 458 } 459 break; 460 case 512: 461 case 480: 462 if ( config->audioObjectType != AOT_ER_AAC_LD 463 && config->audioObjectType != AOT_ER_AAC_ELD ) 464 { 465 return AAC_ENC_INVALID_FRAME_LENGTH; 466 } 467 break; 468 default: 469 return AAC_ENC_INVALID_FRAME_LENGTH; 470 } 471 472 if (config->anc_Rate != 0) { 473 474 ErrorStatus = FDKaacEnc_InitCheckAncillary(config->bitRate, 475 config->framelength, 476 config->anc_Rate, 477 &hAacEnc->ancillaryBitsPerFrame, 478 config->sampleRate); 479 if (ErrorStatus != AAC_ENC_OK) 480 goto bail; 481 482 483 /* update estimated consumed bitrate */ 484 config->ancDataBitRate += ( (hAacEnc->ancillaryBitsPerFrame * config->sampleRate) / config->framelength ); 485 486 } 487 488 /* maximal allowed DSE bytes in frame */ 489 { 490 /* fixpoint calculation*/ 491 INT q_res, encBitrate, sc; 492 FIXP_DBL tmp = fDivNorm(config->framelength, config->sampleRate, &q_res); 493 encBitrate = (config->bitRate/*-config->ancDataBitRate*/)- (INT)(config->nChannels*8000); 494 sc = CountLeadingBits(encBitrate); 495 config->maxAncBytesPerAU = FDKmin( (256), FDKmax(0,(INT)(fMultDiv2(tmp, (FIXP_DBL)(encBitrate<<sc))>>(-q_res+sc-1+3))) ); 496 } 497 498 /* bind config to hAacEnc->config */ 499 hAacEnc->config = config; 500 501 /* set hAacEnc->bitrateMode */ 502 hAacEnc->bitrateMode = (AACENC_BITRATE_MODE)config->bitrateMode; 503 504 hAacEnc->encoderMode = config->channelMode; 505 506 ErrorStatus = FDKaacEnc_InitChannelMapping(hAacEnc->encoderMode, config->channelOrder, &hAacEnc->channelMapping); 507 if (ErrorStatus != AAC_ENC_OK) 508 goto bail; 509 510 cm = &hAacEnc->channelMapping; 511 512 ErrorStatus = FDKaacEnc_DetermineBandWidth(&hAacEnc->config->bandWidth, 513 config->bandWidth, 514 config->bitRate - config->ancDataBitRate, 515 hAacEnc->bitrateMode, 516 config->sampleRate, 517 config->framelength, 518 cm, 519 hAacEnc->encoderMode); 520 if (ErrorStatus != AAC_ENC_OK) 521 goto bail; 522 523 hAacEnc->bandwidth90dB = (INT)hAacEnc->config->bandWidth; 524 525 tnsMask = config->useTns ? TNS_ENABLE_MASK : 0x0; 526 psyBitrate = config->bitRate - config->ancDataBitRate; 527 528 ErrorStatus = FDKaacEnc_psyInit(hAacEnc->psyKernel, 529 hAacEnc->psyOut, 530 hAacEnc->maxFrames, 531 hAacEnc->maxChannels, 532 config->audioObjectType, 533 cm); 534 if (ErrorStatus != AAC_ENC_OK) 535 goto bail; 536 537 ErrorStatus = FDKaacEnc_psyMainInit(hAacEnc->psyKernel, 538 config->audioObjectType, 539 cm, 540 config->sampleRate, 541 config->framelength, 542 psyBitrate, 543 tnsMask, 544 hAacEnc->bandwidth90dB, 545 config->usePns, 546 config->useIS, 547 config->syntaxFlags, 548 initFlags); 549 if (ErrorStatus != AAC_ENC_OK) 550 goto bail; 551 552 ErrorStatus = FDKaacEnc_QCOutInit(hAacEnc->qcOut, hAacEnc->maxFrames, cm); 553 if (ErrorStatus != AAC_ENC_OK) 554 goto bail; 555 556 557 558 qcInit.channelMapping = &hAacEnc->channelMapping; 559 qcInit.sceCpe = 0; 560 561 if ((config->bitrateMode>=1) && (config->bitrateMode<=5)) { 562 qcInit.averageBits = (averageBitsPerFrame+7)&~7; 563 qcInit.bitRes = MIN_BUFSIZE_PER_EFF_CHAN*cm->nChannelsEff; 564 qcInit.maxBits = MIN_BUFSIZE_PER_EFF_CHAN*cm->nChannelsEff; 565 qcInit.minBits = 0; 566 } 567 else 568 { 569 int maxBitres; 570 qcInit.averageBits = (averageBitsPerFrame+7)&~7; 571 maxBitres = (MIN_BUFSIZE_PER_EFF_CHAN*cm->nChannelsEff) - qcInit.averageBits; 572 qcInit.bitRes = (config->bitreservoir!=-1) ? FDKmin(config->bitreservoir, maxBitres) : maxBitres; 573 574 qcInit.maxBits = fixMin(MIN_BUFSIZE_PER_EFF_CHAN*cm->nChannelsEff, ((averageBitsPerFrame+7)&~7)+qcInit.bitRes); 575 qcInit.maxBits = (config->maxBitsPerFrame!=-1) ? fixMin(qcInit.maxBits, config->maxBitsPerFrame) : qcInit.maxBits; 576 577 qcInit.minBits = fixMax(0, ((averageBitsPerFrame-1)&~7)-qcInit.bitRes-transportEnc_GetStaticBits(hTpEnc, ((averageBitsPerFrame+7)&~7)+qcInit.bitRes)); 578 qcInit.minBits = (config->minBitsPerFrame!=-1) ? fixMax(qcInit.minBits, config->minBitsPerFrame) : qcInit.minBits; 579 } 580 581 qcInit.sampleRate = config->sampleRate; 582 qcInit.advancedBitsToPe = isLowDelay(config->audioObjectType) ? 1 : 0 ; 583 qcInit.nSubFrames = config->nSubFrames; 584 qcInit.padding.paddingRest = config->sampleRate; 585 586 /* Calc meanPe */ 587 bw_ratio = fDivNorm((FIXP_DBL)hAacEnc->bandwidth90dB, (FIXP_DBL)(config->sampleRate>>1), &qbw); 588 qbw = DFRACT_BITS-1-qbw; 589 /* qcInit.meanPe = 10.0f * FRAME_LEN_LONG * hAacEnc->bandwidth90dB/(config->sampleRate/2.0f); */ 590 qcInit.meanPe = fMult(bw_ratio, (FIXP_DBL)((10*config->framelength)<<16)) >> (qbw-15); 591 592 /* Calc maxBitFac */ 593 mbfac = fDivNorm((MIN_BUFSIZE_PER_EFF_CHAN-744)*cm->nChannelsEff, qcInit.averageBits/qcInit.nSubFrames, &qmbfac); 594 qmbfac = DFRACT_BITS-1-qmbfac; 595 qcInit.maxBitFac = (qmbfac > 24) ? (mbfac >> (qmbfac - 24)):(mbfac << (24 - qmbfac)); 596 597 switch(config->bitrateMode){ 598 case AACENC_BR_MODE_CBR: 599 qcInit.bitrateMode = QCDATA_BR_MODE_CBR; 600 break; 601 case AACENC_BR_MODE_VBR_1: 602 qcInit.bitrateMode = QCDATA_BR_MODE_VBR_1; 603 break; 604 case AACENC_BR_MODE_VBR_2: 605 qcInit.bitrateMode = QCDATA_BR_MODE_VBR_2; 606 break; 607 case AACENC_BR_MODE_VBR_3: 608 qcInit.bitrateMode = QCDATA_BR_MODE_VBR_3; 609 break; 610 case AACENC_BR_MODE_VBR_4: 611 qcInit.bitrateMode = QCDATA_BR_MODE_VBR_4; 612 break; 613 case AACENC_BR_MODE_VBR_5: 614 qcInit.bitrateMode = QCDATA_BR_MODE_VBR_5; 615 break; 616 case AACENC_BR_MODE_SFR: 617 qcInit.bitrateMode = QCDATA_BR_MODE_SFR; 618 break; 619 case AACENC_BR_MODE_FF: 620 qcInit.bitrateMode = QCDATA_BR_MODE_FF; 621 break; 622 default: 623 ErrorStatus = AAC_ENC_UNSUPPORTED_BITRATE_MODE; 624 goto bail; 625 } 626 627 qcInit.invQuant = (config->useRequant)?2:0; 628 629 /* maxIterations should be set to the maximum number of requantization iterations that are 630 * allowed before the crash recovery functionality is activated. This setting should be adjusted 631 * to the processing power available, i.e. to the processing power headroom in one frame that is 632 * still left after normal encoding without requantization. Please note that if activated this 633 * functionality is used most likely only in cases where the encoder is operating beyond 634 * recommended settings, i.e. the audio quality is suboptimal anyway. Activating the crash 635 * recovery does not further reduce audio quality significantly in these cases. */ 636 if ( (config->audioObjectType == AOT_ER_AAC_LD) || (config->audioObjectType == AOT_ER_AAC_ELD) ) { 637 qcInit.maxIterations = 2; 638 } 639 else 640 { 641 qcInit.maxIterations = 5; 642 } 643 644 qcInit.bitrate = config->bitRate - config->ancDataBitRate; 645 646 qcInit.staticBits = transportEnc_GetStaticBits(hTpEnc, qcInit.averageBits/qcInit.nSubFrames); 647 648 ErrorStatus = FDKaacEnc_QCInit(hAacEnc->qcKernel, &qcInit); 649 if (ErrorStatus != AAC_ENC_OK) 650 goto bail; 651 652 /* Map virtual aot's to intern aot used in bitstream writer. */ 653 switch (hAacEnc->config->audioObjectType) { 654 case AOT_MP2_AAC_LC: 655 case AOT_DABPLUS_AAC_LC: 656 hAacEnc->aot = AOT_AAC_LC; 657 break; 658 case AOT_MP2_SBR: 659 case AOT_DABPLUS_SBR: 660 hAacEnc->aot = AOT_SBR; 661 break; 662 case AOT_MP2_PS: 663 case AOT_DABPLUS_PS: 664 hAacEnc->aot = AOT_PS; 665 break; 666 default: 667 hAacEnc->aot = hAacEnc->config->audioObjectType; 668 } 669 670 /* common things */ 671 672 return AAC_ENC_OK; 673 674bail: 675 676 return ErrorStatus; 677} 678 679 680/*--------------------------------------------------------------------------- 681 682 functionname: FDKaacEnc_EncodeFrame 683 description: encodes one frame 684 returns: error code 685 686 ---------------------------------------------------------------------------*/ 687AAC_ENCODER_ERROR FDKaacEnc_EncodeFrame( HANDLE_AAC_ENC hAacEnc, /* encoder handle */ 688 HANDLE_TRANSPORTENC hTpEnc, 689 INT_PCM* RESTRICT inputBuffer, 690 INT* nOutBytes, 691 AACENC_EXT_PAYLOAD extPayload[MAX_TOTAL_EXT_PAYLOADS] 692 ) 693{ 694 AAC_ENCODER_ERROR ErrorStatus; 695 int el, n, c=0; 696 UCHAR extPayloadUsed[MAX_TOTAL_EXT_PAYLOADS]; 697 698 CHANNEL_MAPPING *cm = &hAacEnc->channelMapping; 699 700 701 702 PSY_OUT *psyOut = hAacEnc->psyOut[c]; 703 QC_OUT *qcOut = hAacEnc->qcOut[c]; 704 705 FDKmemclear(extPayloadUsed, MAX_TOTAL_EXT_PAYLOADS * sizeof(UCHAR)); 706 707 qcOut->elementExtBits = 0; /* sum up all extended bit of each element */ 708 qcOut->staticBits = 0; /* sum up side info bits of each element */ 709 qcOut->totalNoRedPe = 0; /* sum up PE */ 710 711 /* advance psychoacoustics */ 712 for (el=0; el<cm->nElements; el++) { 713 ELEMENT_INFO elInfo = cm->elInfo[el]; 714 715 if ( (elInfo.elType == ID_SCE) 716 || (elInfo.elType == ID_CPE) 717 || (elInfo.elType == ID_LFE) ) 718 { 719 int ch; 720 721 /* update pointer!*/ 722 for(ch=0;ch<elInfo.nChannelsInEl;ch++) { 723 PSY_OUT_CHANNEL *psyOutChan = psyOut->psyOutElement[el]->psyOutChannel[ch]; 724 QC_OUT_CHANNEL *qcOutChan = qcOut->qcElement[el]->qcOutChannel[ch]; 725 726 psyOutChan->mdctSpectrum = qcOutChan->mdctSpectrum; 727 psyOutChan->sfbSpreadEnergy = qcOutChan->sfbSpreadEnergy; 728 psyOutChan->sfbEnergy = qcOutChan->sfbEnergy; 729 psyOutChan->sfbEnergyLdData = qcOutChan->sfbEnergyLdData; 730 psyOutChan->sfbMinSnrLdData = qcOutChan->sfbMinSnrLdData; 731 psyOutChan->sfbThresholdLdData = qcOutChan->sfbThresholdLdData; 732 733 } 734 735 FDKaacEnc_psyMain(elInfo.nChannelsInEl, 736 hAacEnc->psyKernel->psyElement[el], 737 hAacEnc->psyKernel->psyDynamic, 738 hAacEnc->psyKernel->psyConf, 739 psyOut->psyOutElement[el], 740 inputBuffer, 741 cm->elInfo[el].ChannelIndex, 742 cm->nChannels 743 744 ); 745 746 /* FormFactor, Pe and staticBitDemand calculation */ 747 ErrorStatus = FDKaacEnc_QCMainPrepare(&elInfo, 748 hAacEnc->qcKernel->hAdjThr->adjThrStateElem[el], 749 psyOut->psyOutElement[el], 750 qcOut->qcElement[el], 751 hAacEnc->aot, 752 hAacEnc->config->syntaxFlags, 753 hAacEnc->config->epConfig); 754 755 if (ErrorStatus != AAC_ENC_OK) 756 return ErrorStatus; 757 758 /*-------------------------------------------- */ 759 760 qcOut->qcElement[el]->extBitsUsed = 0; 761 qcOut->qcElement[el]->nExtensions = 0; 762 /* reset extension payload */ 763 FDKmemclear(&qcOut->qcElement[el]->extension, (1)*sizeof(QC_OUT_EXTENSION)); 764 765 for ( n = 0; n < MAX_TOTAL_EXT_PAYLOADS; n++ ) { 766 if ( !extPayloadUsed[n] 767 && (extPayload[n].associatedChElement == el) 768 && (extPayload[n].dataSize > 0) 769 && (extPayload[n].pData != NULL) ) 770 { 771 int idx = qcOut->qcElement[el]->nExtensions++; 772 773 qcOut->qcElement[el]->extension[idx].type = extPayload[n].dataType; /* Perform a sanity check on the type? */ 774 qcOut->qcElement[el]->extension[idx].nPayloadBits = extPayload[n].dataSize; 775 qcOut->qcElement[el]->extension[idx].pPayload = extPayload[n].pData; 776 /* Now ask the bitstream encoder how many bits we need to encode the data with the current bitstream syntax: */ 777 qcOut->qcElement[el]->extBitsUsed += 778 FDKaacEnc_writeExtensionData( NULL, 779 &qcOut->qcElement[el]->extension[idx], 780 0, 0, 781 hAacEnc->config->syntaxFlags, 782 hAacEnc->aot, 783 hAacEnc->config->epConfig ); 784 extPayloadUsed[n] = 1; 785 } 786 } 787 788 /* sum up extension and static bits for all channel elements */ 789 qcOut->elementExtBits += qcOut->qcElement[el]->extBitsUsed; 790 qcOut->staticBits += qcOut->qcElement[el]->staticBitsUsed; 791 792 /* sum up pe */ 793 qcOut->totalNoRedPe += qcOut->qcElement[el]->peData.pe; 794 } 795 } 796 797 qcOut->nExtensions = 0; 798 qcOut->globalExtBits = 0; 799 800 /* reset extension payload */ 801 FDKmemclear(&qcOut->extension, (2+2)*sizeof(QC_OUT_EXTENSION)); 802 803 /* Add extension payload not assigned to an channel element 804 (Ancillary data is the only supported type up to now) */ 805 for ( n = 0; n < MAX_TOTAL_EXT_PAYLOADS; n++ ) { 806 if ( !extPayloadUsed[n] 807 && (extPayload[n].associatedChElement == -1) 808 && (extPayload[n].pData != NULL) ) 809 { 810 UINT payloadBits = 0; 811 812 if (extPayload[n].dataType == EXT_DATA_ELEMENT) { 813 if (hAacEnc->ancillaryBitsPerFrame) { 814 /* granted frame dse bitrate */ 815 payloadBits = hAacEnc->ancillaryBitsPerFrame; 816 } 817 else { 818 /* write anc data if bitrate constraint fulfilled */ 819 if ((extPayload[n].dataSize>>3) <= hAacEnc->config->maxAncBytesPerAU) { 820 payloadBits = extPayload[n].dataSize; 821 } 822 } 823 payloadBits = fixMin( extPayload[n].dataSize, payloadBits ); 824 } else { 825 payloadBits = extPayload[n].dataSize; 826 } 827 828 if (payloadBits > 0) 829 { 830 int idx = qcOut->nExtensions++; 831 832 qcOut->extension[idx].type = extPayload[n].dataType; /* Perform a sanity check on the type? */ 833 qcOut->extension[idx].nPayloadBits = payloadBits; 834 qcOut->extension[idx].pPayload = extPayload[n].pData; 835 /* Now ask the bitstream encoder how many bits we need to encode the data with the current bitstream syntax: */ 836 qcOut->globalExtBits += FDKaacEnc_writeExtensionData( NULL, 837 &qcOut->extension[idx], 838 0, 0, 839 hAacEnc->config->syntaxFlags, 840 hAacEnc->aot, 841 hAacEnc->config->epConfig ); 842 if (extPayload[n].dataType == EXT_DATA_ELEMENT) { 843 /* substract the processed bits */ 844 extPayload[n].dataSize -= payloadBits; 845 } 846 extPayloadUsed[n] = 1; 847 } 848 } 849 } 850 851 if (!(hAacEnc->config->syntaxFlags & (AC_SCALABLE|AC_ER))) { 852 qcOut->globalExtBits += EL_ID_BITS; /* add bits for ID_END */ 853 } 854 855 /* build bitstream all nSubFrames */ 856 { 857 INT totalBits = 0; /* Total AU bits */; 858 INT avgTotalBits = 0; 859 860 /*-------------------------------------------- */ 861 /* Get average total bits */ 862 /*-------------------------------------------- */ 863 { 864 /* frame wise bitrate adaption */ 865 FDKaacEnc_AdjustBitrate(hAacEnc->qcKernel, 866 cm, 867 &avgTotalBits, 868 hAacEnc->config->bitRate, 869 hAacEnc->config->sampleRate, 870 hAacEnc->config->framelength); 871 872 /* adjust super frame bitrate */ 873 avgTotalBits *= hAacEnc->config->nSubFrames; 874 } 875 876 /* Make first estimate of transport header overhead. 877 Take maximum possible frame size into account to prevent bitreservoir underrun. */ 878 hAacEnc->qcKernel->globHdrBits = transportEnc_GetStaticBits(hTpEnc, avgTotalBits + hAacEnc->qcKernel->bitResTot); 879 880 881 /*-------------------------------------------- */ 882 /*-------------------------------------------- */ 883 /*-------------------------------------------- */ 884 885 ErrorStatus = FDKaacEnc_QCMain(hAacEnc->qcKernel, 886 hAacEnc->psyOut, 887 hAacEnc->qcOut, 888 avgTotalBits, 889 cm 890 ,hAacEnc->aot, 891 hAacEnc->config->syntaxFlags, 892 hAacEnc->config->epConfig); 893 894 if (ErrorStatus != AAC_ENC_OK) 895 return ErrorStatus; 896 /*-------------------------------------------- */ 897 898 /*-------------------------------------------- */ 899 ErrorStatus = FDKaacEnc_updateFillBits(cm, 900 hAacEnc->qcKernel, 901 hAacEnc->qcKernel->elementBits, 902 hAacEnc->qcOut); 903 if (ErrorStatus != AAC_ENC_OK) 904 return ErrorStatus; 905 906 /*-------------------------------------------- */ 907 ErrorStatus = FDKaacEnc_FinalizeBitConsumption(cm, 908 hAacEnc->qcKernel, 909 qcOut, 910 qcOut->qcElement, 911 hTpEnc, 912 hAacEnc->aot, 913 hAacEnc->config->syntaxFlags, 914 hAacEnc->config->epConfig); 915 if (ErrorStatus != AAC_ENC_OK) 916 return ErrorStatus; 917 /*-------------------------------------------- */ 918 totalBits += qcOut->totalBits; 919 920 921 /*-------------------------------------------- */ 922 FDKaacEnc_updateBitres(cm, 923 hAacEnc->qcKernel, 924 hAacEnc->qcOut); 925 926 /*-------------------------------------------- */ 927 928 /* for ( all sub frames ) ... */ 929 /* write bitstream header */ 930 transportEnc_WriteAccessUnit( 931 hTpEnc, 932 totalBits, 933 FDKaacEnc_EncBitresToTpBitres(hAacEnc->bitrateMode, hAacEnc->qcKernel->bitResTot), 934 cm->nChannelsEff); 935 936 /* write bitstream */ 937 ErrorStatus = FDKaacEnc_WriteBitstream( 938 hTpEnc, 939 cm, 940 qcOut, 941 psyOut, 942 hAacEnc->qcKernel, 943 hAacEnc->aot, 944 hAacEnc->config->syntaxFlags, 945 hAacEnc->config->epConfig); 946 947 if (ErrorStatus != AAC_ENC_OK) 948 return ErrorStatus; 949 950 /* transportEnc_EndAccessUnit() is being called inside FDKaacEnc_WriteBitstream() */ 951 transportEnc_GetFrame(hTpEnc, nOutBytes); 952 953 } /* -end- if (curFrame==hAacEnc->qcKernel->nSubFrames) */ 954 955 956 /*-------------------------------------------- */ 957 return AAC_ENC_OK; 958} 959 960/*--------------------------------------------------------------------------- 961 962 functionname:FDKaacEnc_Close 963 description: delete encoder instance 964 returns: 965 966 ---------------------------------------------------------------------------*/ 967 968void FDKaacEnc_Close( HANDLE_AAC_ENC* phAacEnc) /* encoder handle */ 969{ 970 if (*phAacEnc == NULL) { 971 return; 972 } 973 AAC_ENC *hAacEnc = (AAC_ENC*)*phAacEnc; 974 975 if (hAacEnc->dynamic_RAM != NULL) 976 FreeAACdynamic_RAM(&hAacEnc->dynamic_RAM); 977 978 FDKaacEnc_PsyClose(&hAacEnc->psyKernel,hAacEnc->psyOut); 979 980 FDKaacEnc_QCClose(&hAacEnc->qcKernel, hAacEnc->qcOut); 981 982 FreeRam_aacEnc_AacEncoder(phAacEnc); 983} 984 985 986/* The following functions are in this source file only for convenience and */ 987/* need not be visible outside of a possible encoder library. */ 988 989/* basic defines for ancillary data */ 990#define MAX_ANCRATE 19200 /* ancillary rate >= 19200 isn't valid */ 991 992/*--------------------------------------------------------------------------- 993 994 functionname: FDKaacEnc_InitCheckAncillary 995 description: initialize and check ancillary data struct 996 return: if success or NULL if error 997 998 ---------------------------------------------------------------------------*/ 999static AAC_ENCODER_ERROR FDKaacEnc_InitCheckAncillary(INT bitRate, 1000 INT framelength, 1001 INT ancillaryRate, 1002 INT *ancillaryBitsPerFrame, 1003 INT sampleRate) 1004{ 1005 INT diffToByteAlign; 1006 1007 /* don't use negative ancillary rates */ 1008 if ( ancillaryRate < -1 ) 1009 return AAC_ENC_UNSUPPORTED_ANC_BITRATE; 1010 1011 /* check if ancillary rate is ok */ 1012 if ( (ancillaryRate != (-1)) && (ancillaryRate != 0) ) { 1013 /* ancRate <= 15% of bitrate && ancRate < 19200 */ 1014 if ( ( ancillaryRate >= MAX_ANCRATE ) || 1015 ( (ancillaryRate * 20) > (bitRate * 3) ) ) { 1016 return AAC_ENC_UNSUPPORTED_ANC_BITRATE; 1017 } 1018 } 1019 else if (ancillaryRate == -1) { 1020 /* if no special ancRate is requested but a ancillary file is 1021 stated, then generate a ancillary rate matching to the bitrate */ 1022 if (bitRate >= (MAX_ANCRATE * 10)) { 1023 /* ancillary rate is 19199 */ 1024 ancillaryRate = (MAX_ANCRATE - 1); 1025 } 1026 else { /* 10% of bitrate */ 1027 ancillaryRate = bitRate / 10; 1028 } 1029 } 1030 1031 /* make ancillaryBitsPerFrame byte align */ 1032 *ancillaryBitsPerFrame = (ancillaryRate * framelength ) / sampleRate; 1033 diffToByteAlign = *ancillaryBitsPerFrame % 8; 1034 *ancillaryBitsPerFrame = *ancillaryBitsPerFrame - diffToByteAlign; 1035 1036 return AAC_ENC_OK; 1037} 1038