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 encoder library ****************************** 96 97 Author(s): M. Lohwasser 98 99 Description: FDK HE-AAC Encoder interface library functions 100 101 *******************************************************************************/ 102 103 #include "aacenc_lib.h" 104 #include "FDK_audio.h" 105 #include "aacenc.h" 106 107 #include "aacEnc_ram.h" 108 #include "FDK_core.h" /* FDK_tools versioning info */ 109 110 /* Encoder library info */ 111 #define AACENCODER_LIB_VL0 4 112 #define AACENCODER_LIB_VL1 0 113 #define AACENCODER_LIB_VL2 0 114 #define AACENCODER_LIB_TITLE "AAC Encoder" 115 #ifdef __ANDROID__ 116 #define AACENCODER_LIB_BUILD_DATE "" 117 #define AACENCODER_LIB_BUILD_TIME "" 118 #else 119 #define AACENCODER_LIB_BUILD_DATE __DATE__ 120 #define AACENCODER_LIB_BUILD_TIME __TIME__ 121 #endif 122 123 #include "pcm_utils.h" 124 125 #include "sbr_encoder.h" 126 #include "../src/sbrenc_ram.h" 127 #include "channel_map.h" 128 129 #include "psy_const.h" 130 #include "bitenc.h" 131 132 #include "tpenc_lib.h" 133 134 #include "metadata_main.h" 135 #include "mps_main.h" 136 #include "sacenc_lib.h" 137 138 #define SBL(fl) \ 139 (fl / \ 140 8) /*!< Short block length (hardcoded to 8 short blocks per long block) */ 141 #define BSLA(fl) \ 142 (4 * SBL(fl) + SBL(fl) / 2) /*!< AAC block switching look-ahead */ 143 #define DELAY_AAC(fl) (fl + BSLA(fl)) /*!< MDCT + blockswitching */ 144 #define DELAY_AACLD(fl) (fl) /*!< MDCT delay (no framing delay included) */ 145 #define DELAY_AACELD(fl) \ 146 ((fl) / 2) /*!< ELD FB delay (no framing delay included) */ 147 148 #define MAX_DS_DELAY (100) /*!< Maximum downsampler delay in SBR. */ 149 #define INPUTBUFFER_SIZE \ 150 (2 * (1024) + MAX_DS_DELAY + 1537) /*!< Audio input samples + downsampler \ 151 delay + sbr/aac delay compensation */ 152 153 #define DEFAULT_HEADER_PERIOD_REPETITION_RATE \ 154 10 /*!< Default header repetition rate used in transport library and for SBR \ 155 header. */ 156 157 //////////////////////////////////////////////////////////////////////////////////// 158 /** 159 * Flags to characterize encoder modules to be supported in present instance. 160 */ 161 enum { 162 ENC_MODE_FLAG_AAC = 0x0001, 163 ENC_MODE_FLAG_SBR = 0x0002, 164 ENC_MODE_FLAG_PS = 0x0004, 165 ENC_MODE_FLAG_SAC = 0x0008, 166 ENC_MODE_FLAG_META = 0x0010 167 }; 168 169 //////////////////////////////////////////////////////////////////////////////////// 170 typedef struct { 171 AUDIO_OBJECT_TYPE userAOT; /*!< Audio Object Type. */ 172 UINT userSamplerate; /*!< Sampling frequency. */ 173 UINT nChannels; /*!< will be set via channelMode. */ 174 CHANNEL_MODE userChannelMode; 175 UINT userBitrate; 176 UINT userBitrateMode; 177 UINT userBandwidth; 178 UINT userAfterburner; 179 UINT userFramelength; 180 UINT userAncDataRate; 181 UINT userPeakBitrate; 182 183 UCHAR userTns; /*!< Use TNS coding. */ 184 UCHAR userPns; /*!< Use PNS coding. */ 185 UCHAR userIntensity; /*!< Use Intensity coding. */ 186 187 TRANSPORT_TYPE userTpType; /*!< Transport type */ 188 UCHAR userTpSignaling; /*!< Extension AOT signaling mode. */ 189 UCHAR userTpNsubFrames; /*!< Number of sub frames in a transport frame for 190 LOAS/LATM or ADTS (default 1). */ 191 UCHAR userTpAmxv; /*!< AudioMuxVersion to be used for LATM (default 0). */ 192 UCHAR userTpProtection; 193 UCHAR userTpHeaderPeriod; /*!< Parameter used to configure LATM/LOAS SMC rate. 194 Moreover this parameters is used to configure 195 repetition rate of PCE in raw_data_block. */ 196 197 UCHAR userErTools; /*!< Use VCB11, HCR and/or RVLC ER tool. */ 198 UINT userPceAdditions; /*!< Configure additional bits in PCE. */ 199 200 UCHAR userMetaDataMode; /*!< Meta data library configuration. */ 201 202 UCHAR userSbrEnabled; /*!< Enable SBR for ELD. */ 203 UINT userSbrRatio; /*!< SBR sampling rate ratio. Dual- or single-rate. */ 204 205 UINT userDownscaleFactor; 206 207 } USER_PARAM; 208 209 /** 210 * SBR extenxion payload struct provides buffers to be filled in SBR encoder 211 * library. 212 */ 213 typedef struct { 214 UCHAR data[(1)][(8)][MAX_PAYLOAD_SIZE]; /*!< extension payload data buffer */ 215 UINT dataSize[(1)][(8)]; /*!< extension payload data size in bits */ 216 } SBRENC_EXT_PAYLOAD; 217 218 //////////////////////////////////////////////////////////////////////////////////// 219 220 /**************************************************************************** 221 Structure Definitions 222 ****************************************************************************/ 223 224 typedef struct AACENC_CONFIG *HANDLE_AACENC_CONFIG; 225 226 struct AACENCODER { 227 USER_PARAM extParam; 228 CODER_CONFIG coderConfig; 229 230 /* AAC */ 231 AACENC_CONFIG aacConfig; 232 HANDLE_AAC_ENC hAacEnc; 233 234 /* SBR */ 235 HANDLE_SBR_ENCODER hEnvEnc; /* SBR encoder */ 236 SBRENC_EXT_PAYLOAD *pSbrPayload; /* SBR extension payload */ 237 238 /* Meta Data */ 239 HANDLE_FDK_METADATA_ENCODER hMetadataEnc; 240 INT metaDataAllowed; /* Signal whether chosen configuration allows metadata. 241 Necessary for delay compensation. Metadata mode is a 242 separate parameter. */ 243 244 HANDLE_MPS_ENCODER hMpsEnc; 245 246 /* Transport */ 247 HANDLE_TRANSPORTENC hTpEnc; 248 249 INT_PCM 250 *inputBuffer; /* Internal input buffer. Input source for AAC encoder */ 251 UCHAR *outBuffer; /* Internal bitstream buffer */ 252 253 INT inputBufferSize; /* Size of internal input buffer */ 254 INT inputBufferSizePerChannel; /* Size of internal input buffer per channel */ 255 INT outBufferInBytes; /* Size of internal bitstream buffer*/ 256 257 INT inputBufferOffset; /* Where to write new input samples. */ 258 259 INT nSamplesToRead; /* number of input samples neeeded for encoding one frame 260 */ 261 INT nSamplesRead; /* number of input samples already in input buffer */ 262 INT nZerosAppended; /* appended zeros at end of file*/ 263 INT nDelay; /* codec delay */ 264 INT nDelayCore; /* codec delay, w/o the SBR decoder delay */ 265 266 AACENC_EXT_PAYLOAD extPayload[MAX_TOTAL_EXT_PAYLOADS]; 267 268 ULONG InitFlags; /* internal status to treggier re-initialization */ 269 270 /* Memory allocation info. */ 271 INT nMaxAacElements; 272 INT nMaxAacChannels; 273 INT nMaxSbrElements; 274 INT nMaxSbrChannels; 275 276 UINT encoder_modis; 277 278 /* Capability flags */ 279 UINT CAPF_tpEnc; 280 }; 281 282 typedef struct { 283 /* input */ 284 ULONG nChannels; /*!< Number of audio channels. */ 285 ULONG samplingRate; /*!< Encoder output sampling rate. */ 286 ULONG bitrateRange; /*!< Lower bitrate range for config entry. */ 287 288 /* output*/ 289 UCHAR sbrMode; /*!< 0: ELD sbr off, 290 1: ELD with downsampled sbr, 291 2: ELD with dualrate sbr. */ 292 CHANNEL_MODE chMode; /*!< Channel mode. */ 293 294 } ELD_SBR_CONFIGURATOR; 295 296 /** 297 * \brief This table defines ELD/SBR default configurations. 298 */ 299 static const ELD_SBR_CONFIGURATOR eldSbrAutoConfigTab[] = { 300 {1, 48000, 0, 2, MODE_1}, {1, 48000, 64000, 0, MODE_1}, 301 302 {1, 44100, 0, 2, MODE_1}, {1, 44100, 64000, 0, MODE_1}, 303 304 {1, 32000, 0, 2, MODE_1}, {1, 32000, 28000, 1, MODE_1}, 305 {1, 32000, 56000, 0, MODE_1}, 306 307 {1, 24000, 0, 1, MODE_1}, {1, 24000, 40000, 0, MODE_1}, 308 309 {1, 16000, 0, 1, MODE_1}, {1, 16000, 28000, 0, MODE_1}, 310 311 {1, 15999, 0, 0, MODE_1}, 312 313 {2, 48000, 0, 2, MODE_2}, {2, 48000, 44000, 2, MODE_2}, 314 {2, 48000, 128000, 0, MODE_2}, 315 316 {2, 44100, 0, 2, MODE_2}, {2, 44100, 44000, 2, MODE_2}, 317 {2, 44100, 128000, 0, MODE_2}, 318 319 {2, 32000, 0, 2, MODE_2}, {2, 32000, 32000, 2, MODE_2}, 320 {2, 32000, 68000, 1, MODE_2}, {2, 32000, 96000, 0, MODE_2}, 321 322 {2, 24000, 0, 1, MODE_2}, {2, 24000, 48000, 1, MODE_2}, 323 {2, 24000, 80000, 0, MODE_2}, 324 325 {2, 16000, 0, 1, MODE_2}, {2, 16000, 32000, 1, MODE_2}, 326 {2, 16000, 64000, 0, MODE_2}, 327 328 {2, 15999, 0, 0, MODE_2} 329 330 }; 331 332 /* 333 * \brief Configure SBR for ELD configuration. 334 * 335 * This function finds default SBR configuration for ELD based on number of 336 * channels, sampling rate and bitrate. 337 * 338 * \param nChannels Number of audio channels. 339 * \param samplingRate Audio signal sampling rate. 340 * \param bitrate Encoder bitrate. 341 * 342 * \return - pointer to eld sbr configuration. 343 * - NULL, on failure. 344 */ 345 static const ELD_SBR_CONFIGURATOR *eldSbrConfigurator(const ULONG nChannels, 346 const ULONG samplingRate, 347 const ULONG bitrate) { 348 int i; 349 const ELD_SBR_CONFIGURATOR *pSetup = NULL; 350 351 for (i = 0; 352 i < (int)(sizeof(eldSbrAutoConfigTab) / sizeof(ELD_SBR_CONFIGURATOR)); 353 i++) { 354 if ((nChannels == eldSbrAutoConfigTab[i].nChannels) && 355 (samplingRate <= eldSbrAutoConfigTab[i].samplingRate) && 356 (bitrate >= eldSbrAutoConfigTab[i].bitrateRange)) { 357 pSetup = &eldSbrAutoConfigTab[i]; 358 } 359 } 360 361 return pSetup; 362 } 363 364 static inline INT isSbrActive(const HANDLE_AACENC_CONFIG hAacConfig) { 365 INT sbrUsed = 0; 366 367 /* Note: Even if implicit signalling was selected, The AOT itself here is not 368 * AOT_AAC_LC */ 369 if ((hAacConfig->audioObjectType == AOT_SBR) || 370 (hAacConfig->audioObjectType == AOT_PS) || 371 (hAacConfig->audioObjectType == AOT_MP2_SBR)) { 372 sbrUsed = 1; 373 } 374 if (hAacConfig->audioObjectType == AOT_ER_AAC_ELD && 375 (hAacConfig->syntaxFlags & AC_SBR_PRESENT)) { 376 sbrUsed = 1; 377 } 378 379 return (sbrUsed); 380 } 381 382 static inline INT isPsActive(const AUDIO_OBJECT_TYPE audioObjectType) { 383 INT psUsed = 0; 384 385 if (audioObjectType == AOT_PS) { 386 psUsed = 1; 387 } 388 389 return (psUsed); 390 } 391 392 static CHANNEL_MODE GetCoreChannelMode( 393 const CHANNEL_MODE channelMode, const AUDIO_OBJECT_TYPE audioObjectType) { 394 CHANNEL_MODE mappedChannelMode = channelMode; 395 if ((isPsActive(audioObjectType) && (channelMode == MODE_2)) || 396 (channelMode == MODE_212)) { 397 mappedChannelMode = MODE_1; 398 } 399 return mappedChannelMode; 400 } 401 402 static SBR_PS_SIGNALING getSbrSignalingMode( 403 const AUDIO_OBJECT_TYPE audioObjectType, const TRANSPORT_TYPE transportType, 404 const UCHAR transportSignaling, const UINT sbrRatio) 405 406 { 407 SBR_PS_SIGNALING sbrSignaling; 408 409 if (transportType == TT_UNKNOWN || sbrRatio == 0) { 410 sbrSignaling = SIG_UNKNOWN; /* Needed parameters have not been set */ 411 return sbrSignaling; 412 } else { 413 sbrSignaling = 414 SIG_EXPLICIT_HIERARCHICAL; /* default: explicit hierarchical signaling 415 */ 416 } 417 418 if ((audioObjectType == AOT_AAC_LC) || (audioObjectType == AOT_SBR) || 419 (audioObjectType == AOT_PS) || (audioObjectType == AOT_MP2_AAC_LC) || 420 (audioObjectType == AOT_MP2_SBR)) { 421 switch (transportType) { 422 case TT_MP4_ADIF: 423 case TT_MP4_ADTS: 424 sbrSignaling = SIG_IMPLICIT; /* For MPEG-2 transport types, only 425 implicit signaling is possible */ 426 break; 427 428 case TT_MP4_RAW: 429 case TT_MP4_LATM_MCP1: 430 case TT_MP4_LATM_MCP0: 431 case TT_MP4_LOAS: 432 default: 433 if (transportSignaling == 0xFF) { 434 /* Defaults */ 435 sbrSignaling = SIG_EXPLICIT_HIERARCHICAL; 436 } else { 437 /* User set parameters */ 438 /* Attention: Backward compatible explicit signaling does only work 439 * with AMV1 for LATM/LOAS */ 440 sbrSignaling = (SBR_PS_SIGNALING)transportSignaling; 441 } 442 break; 443 } 444 } 445 446 return sbrSignaling; 447 } 448 449 /**************************************************************************** 450 Allocate Encoder 451 ****************************************************************************/ 452 453 H_ALLOC_MEM(_AacEncoder, AACENCODER) 454 C_ALLOC_MEM(_AacEncoder, struct AACENCODER, 1) 455 456 /* 457 * Map Encoder specific config structures to CODER_CONFIG. 458 */ 459 static void FDKaacEnc_MapConfig(CODER_CONFIG *const cc, 460 const USER_PARAM *const extCfg, 461 const SBR_PS_SIGNALING sbrSignaling, 462 const HANDLE_AACENC_CONFIG hAacConfig) { 463 AUDIO_OBJECT_TYPE transport_AOT = AOT_NULL_OBJECT; 464 FDKmemclear(cc, sizeof(CODER_CONFIG)); 465 466 cc->flags = 0; 467 468 cc->samplesPerFrame = hAacConfig->framelength; 469 cc->samplingRate = hAacConfig->sampleRate; 470 cc->extSamplingRate = extCfg->userSamplerate; 471 472 /* Map virtual aot to transport aot. */ 473 switch (hAacConfig->audioObjectType) { 474 case AOT_MP2_AAC_LC: 475 transport_AOT = AOT_AAC_LC; 476 break; 477 case AOT_MP2_SBR: 478 transport_AOT = AOT_SBR; 479 cc->flags |= CC_SBR; 480 break; 481 default: 482 transport_AOT = hAacConfig->audioObjectType; 483 } 484 485 if (hAacConfig->audioObjectType == AOT_ER_AAC_ELD) { 486 cc->flags |= (hAacConfig->syntaxFlags & AC_SBR_PRESENT) ? CC_SBR : 0; 487 cc->flags |= (hAacConfig->syntaxFlags & AC_LD_MPS) ? CC_SAC : 0; 488 } 489 490 /* transport type is usually AAC-LC. */ 491 if ((transport_AOT == AOT_SBR) || (transport_AOT == AOT_PS)) { 492 cc->aot = AOT_AAC_LC; 493 } else { 494 cc->aot = transport_AOT; 495 } 496 497 /* Configure extension aot. */ 498 if (sbrSignaling == SIG_IMPLICIT) { 499 cc->extAOT = AOT_NULL_OBJECT; /* implicit */ 500 } else { 501 if ((sbrSignaling == SIG_EXPLICIT_BW_COMPATIBLE) && 502 ((transport_AOT == AOT_SBR) || (transport_AOT == AOT_PS))) { 503 cc->extAOT = AOT_SBR; /* explicit backward compatible */ 504 } else { 505 cc->extAOT = transport_AOT; /* explicit hierarchical */ 506 } 507 } 508 509 if ((transport_AOT == AOT_SBR) || (transport_AOT == AOT_PS)) { 510 cc->sbrPresent = 1; 511 if (transport_AOT == AOT_PS) { 512 cc->psPresent = 1; 513 } 514 } 515 cc->sbrSignaling = sbrSignaling; 516 517 if (hAacConfig->downscaleFactor > 1) { 518 cc->downscaleSamplingRate = cc->samplingRate; 519 cc->samplingRate *= hAacConfig->downscaleFactor; 520 cc->extSamplingRate *= hAacConfig->downscaleFactor; 521 } 522 523 cc->bitRate = hAacConfig->bitRate; 524 cc->noChannels = hAacConfig->nChannels; 525 cc->flags |= CC_IS_BASELAYER; 526 cc->channelMode = hAacConfig->channelMode; 527 528 cc->nSubFrames = (hAacConfig->nSubFrames > 1 && extCfg->userTpNsubFrames == 1) 529 ? hAacConfig->nSubFrames 530 : extCfg->userTpNsubFrames; 531 532 cc->flags |= (extCfg->userTpProtection) ? CC_PROTECTION : 0; 533 534 if (extCfg->userTpHeaderPeriod != 0xFF) { 535 cc->headerPeriod = extCfg->userTpHeaderPeriod; 536 } else { /* auto-mode */ 537 switch (extCfg->userTpType) { 538 case TT_MP4_ADTS: 539 case TT_MP4_LOAS: 540 case TT_MP4_LATM_MCP1: 541 cc->headerPeriod = DEFAULT_HEADER_PERIOD_REPETITION_RATE; 542 break; 543 default: 544 cc->headerPeriod = 0; 545 } 546 } 547 548 /* Mpeg-4 signaling for transport library. */ 549 switch (hAacConfig->audioObjectType) { 550 case AOT_MP2_AAC_LC: 551 case AOT_MP2_SBR: 552 cc->flags &= ~CC_MPEG_ID; /* Required for ADTS. */ 553 cc->extAOT = AOT_NULL_OBJECT; 554 break; 555 default: 556 cc->flags |= CC_MPEG_ID; 557 } 558 559 /* ER-tools signaling. */ 560 cc->flags |= (hAacConfig->syntaxFlags & AC_ER_VCB11) ? CC_VCB11 : 0; 561 cc->flags |= (hAacConfig->syntaxFlags & AC_ER_HCR) ? CC_HCR : 0; 562 cc->flags |= (hAacConfig->syntaxFlags & AC_ER_RVLC) ? CC_RVLC : 0; 563 564 /* Matrix mixdown coefficient configuration. */ 565 if ((extCfg->userPceAdditions & 0x1) && (hAacConfig->epConfig == -1) && 566 ((cc->channelMode == MODE_1_2_2) || (cc->channelMode == MODE_1_2_2_1))) { 567 cc->matrixMixdownA = ((extCfg->userPceAdditions >> 1) & 0x3) + 1; 568 cc->flags |= (extCfg->userPceAdditions >> 3) & 0x1 ? CC_PSEUDO_SURROUND : 0; 569 } else { 570 cc->matrixMixdownA = 0; 571 } 572 573 cc->channelConfigZero = 0; 574 } 575 576 /* 577 * Validate prefilled pointers within buffer descriptor. 578 * 579 * \param pBufDesc Pointer to buffer descriptor 580 581 * \return - AACENC_OK, all fine. 582 * - AACENC_INVALID_HANDLE, on missing pointer initializiation. 583 * - AACENC_UNSUPPORTED_PARAMETER, on incorrect buffer descriptor 584 initialization. 585 */ 586 static AACENC_ERROR validateBufDesc(const AACENC_BufDesc *pBufDesc) { 587 AACENC_ERROR err = AACENC_OK; 588 589 if (pBufDesc != NULL) { 590 int i; 591 if ((pBufDesc->bufferIdentifiers == NULL) || (pBufDesc->bufSizes == NULL) || 592 (pBufDesc->bufElSizes == NULL) || (pBufDesc->bufs == NULL)) { 593 err = AACENC_UNSUPPORTED_PARAMETER; 594 goto bail; 595 } 596 for (i = 0; i < pBufDesc->numBufs; i++) { 597 if (pBufDesc->bufs[i] == NULL) { 598 err = AACENC_UNSUPPORTED_PARAMETER; 599 goto bail; 600 } 601 } 602 } else { 603 err = AACENC_INVALID_HANDLE; 604 } 605 bail: 606 return err; 607 } 608 609 /* 610 * Examine buffer descriptor regarding choosen identifier. 611 * 612 * \param pBufDesc Pointer to buffer descriptor 613 * \param identifier Buffer identifier to look for. 614 615 * \return - Buffer descriptor index. 616 * -1, if there is no entry available. 617 */ 618 static INT getBufDescIdx(const AACENC_BufDesc *pBufDesc, 619 const AACENC_BufferIdentifier identifier) { 620 INT i, idx = -1; 621 622 if (pBufDesc != NULL) { 623 for (i = 0; i < pBufDesc->numBufs; i++) { 624 if ((AACENC_BufferIdentifier)pBufDesc->bufferIdentifiers[i] == 625 identifier) { 626 idx = i; 627 break; 628 } 629 } 630 } 631 return idx; 632 } 633 634 /**************************************************************************** 635 Function Declarations 636 ****************************************************************************/ 637 638 AAC_ENCODER_ERROR aacEncDefaultConfig(HANDLE_AACENC_CONFIG hAacConfig, 639 USER_PARAM *config) { 640 /* make reasonable default settings */ 641 FDKaacEnc_AacInitDefaultConfig(hAacConfig); 642 643 /* clear configuration structure and copy default settings */ 644 FDKmemclear(config, sizeof(USER_PARAM)); 645 646 /* copy encoder configuration settings */ 647 config->nChannels = hAacConfig->nChannels; 648 config->userAOT = hAacConfig->audioObjectType = AOT_AAC_LC; 649 config->userSamplerate = hAacConfig->sampleRate; 650 config->userChannelMode = hAacConfig->channelMode; 651 config->userBitrate = hAacConfig->bitRate; 652 config->userBitrateMode = hAacConfig->bitrateMode; 653 config->userPeakBitrate = (UINT)-1; 654 config->userBandwidth = hAacConfig->bandWidth; 655 config->userTns = hAacConfig->useTns; 656 config->userPns = hAacConfig->usePns; 657 config->userIntensity = hAacConfig->useIS; 658 config->userAfterburner = hAacConfig->useRequant; 659 config->userFramelength = (UINT)-1; 660 661 config->userDownscaleFactor = 1; 662 663 /* initialize transport parameters */ 664 config->userTpType = TT_UNKNOWN; 665 config->userTpAmxv = 0; 666 config->userTpSignaling = 0xFF; /* choose signaling automatically */ 667 config->userTpNsubFrames = 1; 668 config->userTpProtection = 0; /* not crc protected*/ 669 config->userTpHeaderPeriod = 0xFF; /* header period in auto mode */ 670 config->userPceAdditions = 0; /* no matrix mixdown coefficient */ 671 config->userMetaDataMode = 0; /* do not embed any meta data info */ 672 673 config->userAncDataRate = 0; 674 675 /* SBR rate is set to 0 here, which means it should be set automatically 676 in FDKaacEnc_AdjustEncSettings() if the user did not set a rate 677 expilicitely. */ 678 config->userSbrRatio = 0; 679 680 /* SBR enable set to -1 means to inquire ELD audio configurator for reasonable 681 * configuration. */ 682 config->userSbrEnabled = (UCHAR)-1; 683 684 return AAC_ENC_OK; 685 } 686 687 static void aacEncDistributeSbrBits(CHANNEL_MAPPING *channelMapping, 688 SBR_ELEMENT_INFO *sbrElInfo, INT bitRate) { 689 INT codebits = bitRate; 690 int el; 691 692 /* Copy Element info */ 693 for (el = 0; el < channelMapping->nElements; el++) { 694 sbrElInfo[el].ChannelIndex[0] = channelMapping->elInfo[el].ChannelIndex[0]; 695 sbrElInfo[el].ChannelIndex[1] = channelMapping->elInfo[el].ChannelIndex[1]; 696 sbrElInfo[el].elType = channelMapping->elInfo[el].elType; 697 sbrElInfo[el].bitRate = 698 fMultIfloor(channelMapping->elInfo[el].relativeBits, bitRate); 699 sbrElInfo[el].instanceTag = channelMapping->elInfo[el].instanceTag; 700 sbrElInfo[el].nChannelsInEl = channelMapping->elInfo[el].nChannelsInEl; 701 sbrElInfo[el].fParametricStereo = 0; 702 sbrElInfo[el].fDualMono = 0; 703 704 codebits -= sbrElInfo[el].bitRate; 705 } 706 sbrElInfo[0].bitRate += codebits; 707 } 708 709 static INT aacEncoder_LimitBitrate(const HANDLE_TRANSPORTENC hTpEnc, 710 const INT samplingRate, 711 const INT frameLength, const INT nChannels, 712 const CHANNEL_MODE channelMode, INT bitRate, 713 const INT nSubFrames, const INT sbrActive, 714 const INT sbrDownSampleRate, 715 const UINT syntaxFlags, 716 const AUDIO_OBJECT_TYPE aot) { 717 INT coreSamplingRate; 718 CHANNEL_MAPPING cm; 719 720 FDKaacEnc_InitChannelMapping(channelMode, CH_ORDER_MPEG, &cm); 721 722 if (sbrActive) { 723 coreSamplingRate = 724 samplingRate >> 725 (sbrEncoder_IsSingleRatePossible(aot) ? (sbrDownSampleRate - 1) : 1); 726 } else { 727 coreSamplingRate = samplingRate; 728 } 729 730 /* Limit bit rate in respect to the core coder */ 731 bitRate = FDKaacEnc_LimitBitrate(hTpEnc, aot, coreSamplingRate, frameLength, 732 nChannels, cm.nChannelsEff, bitRate, -1, 733 NULL, AACENC_BR_MODE_INVALID, nSubFrames); 734 735 /* Limit bit rate in respect to available SBR modes if active */ 736 if (sbrActive) { 737 int numIterations = 0; 738 INT initialBitrate, adjustedBitrate; 739 adjustedBitrate = bitRate; 740 741 /* Find total bitrate which provides valid configuration for each SBR 742 * element. */ 743 do { 744 int e; 745 SBR_ELEMENT_INFO sbrElInfo[((8))]; 746 FDK_ASSERT(cm.nElements <= ((8))); 747 748 initialBitrate = adjustedBitrate; 749 750 /* Get bit rate for each SBR element */ 751 aacEncDistributeSbrBits(&cm, sbrElInfo, initialBitrate); 752 753 for (e = 0; e < cm.nElements; e++) { 754 INT sbrElementBitRateIn, sbrBitRateOut; 755 756 if (cm.elInfo[e].elType != ID_SCE && cm.elInfo[e].elType != ID_CPE) { 757 continue; 758 } 759 sbrElementBitRateIn = sbrElInfo[e].bitRate; 760 761 sbrBitRateOut = sbrEncoder_LimitBitRate(sbrElementBitRateIn, 762 cm.elInfo[e].nChannelsInEl, 763 coreSamplingRate, aot); 764 765 if (sbrBitRateOut == 0) { 766 return 0; 767 } 768 769 /* If bitrates don't match, distribution and limiting needs to be 770 determined again. Abort element loop and restart with adapted 771 bitrate. */ 772 if (sbrElementBitRateIn != sbrBitRateOut) { 773 if (sbrElementBitRateIn < sbrBitRateOut) { 774 adjustedBitrate = fMax(initialBitrate, 775 (INT)fDivNorm((FIXP_DBL)(sbrBitRateOut + 8), 776 cm.elInfo[e].relativeBits)); 777 break; 778 } 779 780 if (sbrElementBitRateIn > sbrBitRateOut) { 781 adjustedBitrate = fMin(initialBitrate, 782 (INT)fDivNorm((FIXP_DBL)(sbrBitRateOut - 8), 783 cm.elInfo[e].relativeBits)); 784 break; 785 } 786 787 } /* sbrElementBitRateIn != sbrBitRateOut */ 788 789 } /* elements */ 790 791 numIterations++; /* restrict iteration to worst case of num elements */ 792 793 } while ((initialBitrate != adjustedBitrate) && 794 (numIterations <= cm.nElements)); 795 796 /* Unequal bitrates mean that no reasonable bitrate configuration found. */ 797 bitRate = (initialBitrate == adjustedBitrate) ? adjustedBitrate : 0; 798 } 799 800 /* Limit bit rate in respect to available MPS modes if active */ 801 if ((aot == AOT_ER_AAC_ELD) && (syntaxFlags & AC_LD_MPS) && 802 (channelMode == MODE_1)) { 803 bitRate = FDK_MpegsEnc_GetClosestBitRate( 804 aot, MODE_212, samplingRate, (sbrActive) ? sbrDownSampleRate : 0, 805 bitRate); 806 } 807 808 return bitRate; 809 } 810 811 /* 812 * \brief Get CBR bitrate 813 * 814 * \hAacConfig Internal encoder config 815 * \return Bitrate 816 */ 817 static INT FDKaacEnc_GetCBRBitrate(const HANDLE_AACENC_CONFIG hAacConfig, 818 const INT userSbrRatio) { 819 INT bitrate = FDKaacEnc_GetChannelModeConfiguration(hAacConfig->channelMode) 820 ->nChannelsEff * 821 hAacConfig->sampleRate; 822 823 if (isPsActive(hAacConfig->audioObjectType)) { 824 bitrate = 1 * bitrate; /* 0.5 bit per sample */ 825 } else if (isSbrActive(hAacConfig)) { 826 if ((userSbrRatio == 2) || 827 ((userSbrRatio == 0) && 828 (hAacConfig->audioObjectType != AOT_ER_AAC_ELD))) { 829 bitrate = (bitrate + (bitrate >> 2)) >> 1; /* 0.625 bits per sample */ 830 } 831 if ((userSbrRatio == 1) || 832 ((userSbrRatio == 0) && 833 (hAacConfig->audioObjectType == AOT_ER_AAC_ELD))) { 834 bitrate = (bitrate + (bitrate >> 3)); /* 1.125 bits per sample */ 835 } 836 } else { 837 bitrate = bitrate + (bitrate >> 1); /* 1.5 bits per sample */ 838 } 839 840 return bitrate; 841 } 842 843 /* 844 * \brief Consistency check of given USER_PARAM struct and 845 * copy back configuration from public struct into internal 846 * encoder configuration struct. 847 * 848 * \hAacEncoder Internal encoder config which is to be updated 849 * \param config User provided config (public struct) 850 * \return returns always AAC_ENC_OK 851 */ 852 static AACENC_ERROR FDKaacEnc_AdjustEncSettings(HANDLE_AACENCODER hAacEncoder, 853 USER_PARAM *config) { 854 AACENC_ERROR err = AACENC_OK; 855 856 /* Get struct pointers. */ 857 HANDLE_AACENC_CONFIG hAacConfig = &hAacEncoder->aacConfig; 858 859 /* Encoder settings update. */ 860 hAacConfig->sampleRate = config->userSamplerate; 861 if (config->userDownscaleFactor > 1) { 862 hAacConfig->useTns = 0; 863 hAacConfig->usePns = 0; 864 hAacConfig->useIS = 0; 865 } else { 866 hAacConfig->useTns = config->userTns; 867 hAacConfig->usePns = config->userPns; 868 hAacConfig->useIS = config->userIntensity; 869 } 870 871 hAacConfig->audioObjectType = config->userAOT; 872 hAacConfig->channelMode = 873 GetCoreChannelMode(config->userChannelMode, hAacConfig->audioObjectType); 874 hAacConfig->nChannels = 875 FDKaacEnc_GetChannelModeConfiguration(hAacConfig->channelMode)->nChannels; 876 hAacConfig->bitrateMode = (AACENC_BITRATE_MODE)config->userBitrateMode; 877 hAacConfig->bandWidth = config->userBandwidth; 878 hAacConfig->useRequant = config->userAfterburner; 879 880 hAacConfig->anc_Rate = config->userAncDataRate; 881 hAacConfig->syntaxFlags = 0; 882 hAacConfig->epConfig = -1; 883 884 if (hAacConfig->audioObjectType != AOT_ER_AAC_ELD && 885 config->userDownscaleFactor > 1) { 886 return AACENC_INVALID_CONFIG; /* downscaling only allowed for AOT_ER_AAC_ELD 887 */ 888 } 889 if (config->userDownscaleFactor > 1 && config->userSbrEnabled == 1) { 890 return AACENC_INVALID_CONFIG; /* downscaling only allowed for AOT_ER_AAC_ELD 891 w/o SBR */ 892 } 893 if (config->userDownscaleFactor > 1 && config->userChannelMode == 128) { 894 return AACENC_INVALID_CONFIG; /* disallow downscaling for AAC-ELDv2 */ 895 } 896 897 if (config->userTpType == TT_MP4_LATM_MCP1 || 898 config->userTpType == TT_MP4_LATM_MCP0 || 899 config->userTpType == TT_MP4_LOAS) { 900 hAacConfig->audioMuxVersion = config->userTpAmxv; 901 } else { 902 hAacConfig->audioMuxVersion = -1; 903 } 904 905 /* Adapt internal AOT when necessary. */ 906 switch (config->userAOT) { 907 case AOT_MP2_AAC_LC: 908 case AOT_MP2_SBR: 909 hAacConfig->usePns = 0; 910 case AOT_AAC_LC: 911 case AOT_SBR: 912 case AOT_PS: 913 config->userTpType = 914 (config->userTpType != TT_UNKNOWN) ? config->userTpType : TT_MP4_ADTS; 915 hAacConfig->framelength = (config->userFramelength != (UINT)-1) 916 ? config->userFramelength 917 : 1024; 918 if (hAacConfig->framelength != 1024 && hAacConfig->framelength != 960) { 919 return AACENC_INVALID_CONFIG; 920 } 921 break; 922 case AOT_ER_AAC_LD: 923 hAacConfig->epConfig = 0; 924 hAacConfig->syntaxFlags |= AC_ER | AC_LD; 925 hAacConfig->syntaxFlags |= 926 ((config->userErTools & 0x1) ? AC_ER_VCB11 : 0); 927 hAacConfig->syntaxFlags |= ((config->userErTools & 0x2) ? AC_ER_HCR : 0); 928 hAacConfig->syntaxFlags |= ((config->userErTools & 0x4) ? AC_ER_RVLC : 0); 929 config->userTpType = 930 (config->userTpType != TT_UNKNOWN) ? config->userTpType : TT_MP4_LOAS; 931 hAacConfig->framelength = 932 (config->userFramelength != (UINT)-1) ? config->userFramelength : 512; 933 if (hAacConfig->framelength != 512 && hAacConfig->framelength != 480) { 934 return AACENC_INVALID_CONFIG; 935 } 936 break; 937 case AOT_ER_AAC_ELD: 938 hAacConfig->epConfig = 0; 939 hAacConfig->syntaxFlags |= AC_ER | AC_ELD; 940 hAacConfig->syntaxFlags |= 941 ((config->userErTools & 0x1) ? AC_ER_VCB11 : 0); 942 hAacConfig->syntaxFlags |= ((config->userErTools & 0x2) ? AC_ER_HCR : 0); 943 hAacConfig->syntaxFlags |= ((config->userErTools & 0x4) ? AC_ER_RVLC : 0); 944 hAacConfig->syntaxFlags |= 945 ((config->userSbrEnabled == 1) ? AC_SBR_PRESENT : 0); 946 hAacConfig->syntaxFlags |= 947 ((config->userChannelMode == MODE_212) ? AC_LD_MPS : 0); 948 config->userTpType = 949 (config->userTpType != TT_UNKNOWN) ? config->userTpType : TT_MP4_LOAS; 950 hAacConfig->framelength = 951 (config->userFramelength != (UINT)-1) ? config->userFramelength : 512; 952 953 hAacConfig->downscaleFactor = config->userDownscaleFactor; 954 955 switch (config->userDownscaleFactor) { 956 case 1: 957 break; 958 case 2: 959 case 4: 960 hAacConfig->syntaxFlags |= AC_ELD_DOWNSCALE; 961 break; 962 default: 963 return AACENC_INVALID_CONFIG; 964 } 965 966 if (hAacConfig->framelength != 512 && hAacConfig->framelength != 480 && 967 hAacConfig->framelength != 256 && hAacConfig->framelength != 240 && 968 hAacConfig->framelength != 128 && hAacConfig->framelength != 120) { 969 return AACENC_INVALID_CONFIG; 970 } 971 break; 972 default: 973 break; 974 } 975 976 /* Initialize SBR parameters */ 977 if ((config->userSbrRatio == 0) && (isSbrActive(hAacConfig))) { 978 /* Automatic SBR ratio configuration 979 * - downsampled SBR for ELD 980 * - otherwise always dualrate SBR 981 */ 982 if (hAacConfig->audioObjectType == AOT_ER_AAC_ELD) { 983 hAacConfig->sbrRatio = ((hAacConfig->syntaxFlags & AC_LD_MPS) && 984 (hAacConfig->sampleRate >= 27713)) 985 ? 2 986 : 1; 987 } else { 988 hAacConfig->sbrRatio = 2; 989 } 990 } else { 991 /* SBR ratio has been set by the user, so use it. */ 992 hAacConfig->sbrRatio = isSbrActive(hAacConfig) ? config->userSbrRatio : 0; 993 } 994 995 /* Set default bitrate */ 996 hAacConfig->bitRate = config->userBitrate; 997 998 switch (hAacConfig->bitrateMode) { 999 case AACENC_BR_MODE_CBR: 1000 /* Set default bitrate if no external bitrate declared. */ 1001 if (config->userBitrate == (UINT)-1) { 1002 hAacConfig->bitRate = 1003 FDKaacEnc_GetCBRBitrate(hAacConfig, config->userSbrRatio); 1004 } 1005 hAacConfig->averageBits = -1; 1006 break; 1007 case AACENC_BR_MODE_VBR_1: 1008 case AACENC_BR_MODE_VBR_2: 1009 case AACENC_BR_MODE_VBR_3: 1010 case AACENC_BR_MODE_VBR_4: 1011 case AACENC_BR_MODE_VBR_5: 1012 /* Get bitrate in VBR configuration */ 1013 /* In VBR mode; SBR-modul depends on bitrate, core encoder on bitrateMode. 1014 */ 1015 hAacConfig->bitRate = FDKaacEnc_GetVBRBitrate(hAacConfig->bitrateMode, 1016 hAacConfig->channelMode); 1017 break; 1018 default: 1019 return AACENC_INVALID_CONFIG; 1020 } 1021 1022 /* set bitreservoir size */ 1023 switch (hAacConfig->bitrateMode) { 1024 case AACENC_BR_MODE_VBR_1: 1025 case AACENC_BR_MODE_VBR_2: 1026 case AACENC_BR_MODE_VBR_3: 1027 case AACENC_BR_MODE_VBR_4: 1028 case AACENC_BR_MODE_VBR_5: 1029 case AACENC_BR_MODE_CBR: 1030 if ((INT)config->userPeakBitrate != -1) { 1031 hAacConfig->maxBitsPerFrame = 1032 (FDKaacEnc_CalcBitsPerFrame( 1033 fMax(hAacConfig->bitRate, (INT)config->userPeakBitrate), 1034 hAacConfig->framelength, hAacConfig->sampleRate) + 1035 7) & 1036 ~7; 1037 } else { 1038 hAacConfig->maxBitsPerFrame = -1; 1039 } 1040 if (hAacConfig->audioMuxVersion == 2) { 1041 hAacConfig->minBitsPerFrame = 1042 fMin(32 * 8, FDKaacEnc_CalcBitsPerFrame(hAacConfig->bitRate, 1043 hAacConfig->framelength, 1044 hAacConfig->sampleRate)) & 1045 ~7; 1046 } 1047 break; 1048 default: 1049 return AACENC_INVALID_CONFIG; 1050 } 1051 1052 /* Max bits per frame limitation depending on transport format. */ 1053 if ((config->userTpNsubFrames > 1)) { 1054 int maxFrameLength = 8 * hAacEncoder->outBufferInBytes; 1055 switch (config->userTpType) { 1056 case TT_MP4_LOAS: 1057 maxFrameLength = 1058 fMin(maxFrameLength, 8 * (1 << 13)) / config->userTpNsubFrames; 1059 break; 1060 case TT_MP4_ADTS: 1061 maxFrameLength = fMin(maxFrameLength, 8 * ((1 << 13) - 1)) / 1062 config->userTpNsubFrames; 1063 break; 1064 default: 1065 maxFrameLength = -1; 1066 } 1067 if (maxFrameLength != -1) { 1068 if (hAacConfig->maxBitsPerFrame > maxFrameLength) { 1069 return AACENC_INVALID_CONFIG; 1070 } else if (hAacConfig->maxBitsPerFrame == -1) { 1071 hAacConfig->maxBitsPerFrame = maxFrameLength; 1072 } 1073 } 1074 } 1075 1076 if ((hAacConfig->audioObjectType == AOT_ER_AAC_ELD) && 1077 !(hAacConfig->syntaxFlags & AC_ELD_DOWNSCALE) && 1078 (config->userSbrEnabled == (UCHAR)-1) && (config->userSbrRatio == 0) && 1079 ((hAacConfig->syntaxFlags & AC_LD_MPS) == 0)) { 1080 const ELD_SBR_CONFIGURATOR *pConfig = NULL; 1081 1082 if (NULL != 1083 (pConfig = eldSbrConfigurator( 1084 FDKaacEnc_GetChannelModeConfiguration(hAacConfig->channelMode) 1085 ->nChannels, 1086 hAacConfig->sampleRate, hAacConfig->bitRate))) { 1087 hAacConfig->syntaxFlags |= (pConfig->sbrMode == 0) ? 0 : AC_SBR_PRESENT; 1088 hAacConfig->syntaxFlags |= (pConfig->chMode == MODE_212) ? AC_LD_MPS : 0; 1089 hAacConfig->channelMode = 1090 GetCoreChannelMode(pConfig->chMode, hAacConfig->audioObjectType); 1091 hAacConfig->nChannels = 1092 FDKaacEnc_GetChannelModeConfiguration(hAacConfig->channelMode) 1093 ->nChannels; 1094 hAacConfig->sbrRatio = 1095 (pConfig->sbrMode == 0) ? 0 : (pConfig->sbrMode == 1) ? 1 : 2; 1096 } 1097 } 1098 1099 { 1100 UCHAR tpSignaling = 1101 getSbrSignalingMode(hAacConfig->audioObjectType, config->userTpType, 1102 config->userTpSignaling, hAacConfig->sbrRatio); 1103 1104 if ((hAacConfig->audioObjectType == AOT_AAC_LC || 1105 hAacConfig->audioObjectType == AOT_SBR || 1106 hAacConfig->audioObjectType == AOT_PS) && 1107 (config->userTpType == TT_MP4_LATM_MCP1 || 1108 config->userTpType == TT_MP4_LATM_MCP0 || 1109 config->userTpType == TT_MP4_LOAS) && 1110 (tpSignaling == 1) && (config->userTpAmxv == 0)) { 1111 /* For backward compatible explicit signaling, AMV1 has to be active */ 1112 return AACENC_INVALID_CONFIG; 1113 } 1114 1115 if ((hAacConfig->audioObjectType == AOT_AAC_LC || 1116 hAacConfig->audioObjectType == AOT_SBR || 1117 hAacConfig->audioObjectType == AOT_PS) && 1118 (tpSignaling == 0) && (hAacConfig->sbrRatio == 1)) { 1119 /* Downsampled SBR has to be signaled explicitely (for transmission of SBR 1120 * sampling fequency) */ 1121 return AACENC_INVALID_CONFIG; 1122 } 1123 } 1124 1125 switch (hAacConfig->bitrateMode) { 1126 case AACENC_BR_MODE_CBR: 1127 case AACENC_BR_MODE_VBR_1: 1128 case AACENC_BR_MODE_VBR_2: 1129 case AACENC_BR_MODE_VBR_3: 1130 case AACENC_BR_MODE_VBR_4: 1131 case AACENC_BR_MODE_VBR_5: 1132 /* We need the frame length to call aacEncoder_LimitBitrate() */ 1133 if (0 >= (hAacConfig->bitRate = aacEncoder_LimitBitrate( 1134 NULL, hAacConfig->sampleRate, hAacConfig->framelength, 1135 hAacConfig->nChannels, hAacConfig->channelMode, 1136 hAacConfig->bitRate, hAacConfig->nSubFrames, 1137 isSbrActive(hAacConfig), hAacConfig->sbrRatio, 1138 hAacConfig->syntaxFlags, hAacConfig->audioObjectType))) { 1139 return AACENC_INVALID_CONFIG; 1140 } 1141 break; 1142 default: 1143 break; 1144 } 1145 1146 /* Configure PNS */ 1147 if (AACENC_BR_MODE_IS_VBR(hAacConfig->bitrateMode) /* VBR without PNS. */ 1148 || (hAacConfig->useTns == 0)) /* TNS required. */ 1149 { 1150 hAacConfig->usePns = 0; 1151 } 1152 1153 if (hAacConfig->epConfig >= 0) { 1154 hAacConfig->syntaxFlags |= AC_ER; 1155 if (((INT)hAacConfig->channelMode < 1) || 1156 ((INT)hAacConfig->channelMode > 14)) { 1157 return AACENC_INVALID_CONFIG; /* Channel config 0 not supported. */ 1158 } 1159 } 1160 1161 if ((hAacConfig->syntaxFlags & AC_LD_MPS) == 0) { 1162 if (FDKaacEnc_DetermineEncoderMode(&hAacConfig->channelMode, 1163 hAacConfig->nChannels) != AAC_ENC_OK) { 1164 return AACENC_INVALID_CONFIG; /* nChannels doesn't match chMode, this is 1165 just a check-up */ 1166 } 1167 } 1168 1169 if ((hAacConfig->nChannels > hAacEncoder->nMaxAacChannels) || 1170 ((FDKaacEnc_GetChannelModeConfiguration(hAacConfig->channelMode) 1171 ->nChannelsEff > hAacEncoder->nMaxSbrChannels) && 1172 isSbrActive(hAacConfig))) { 1173 return AACENC_INVALID_CONFIG; /* not enough channels allocated */ 1174 } 1175 1176 /* Meta data restriction. */ 1177 switch (hAacConfig->audioObjectType) { 1178 /* Allow metadata support */ 1179 case AOT_AAC_LC: 1180 case AOT_SBR: 1181 case AOT_PS: 1182 case AOT_MP2_AAC_LC: 1183 case AOT_MP2_SBR: 1184 hAacEncoder->metaDataAllowed = 1; 1185 if (!((((INT)hAacConfig->channelMode >= 1) && 1186 ((INT)hAacConfig->channelMode <= 14)) || 1187 (MODE_7_1_REAR_SURROUND == hAacConfig->channelMode) || 1188 (MODE_7_1_FRONT_CENTER == hAacConfig->channelMode))) { 1189 config->userMetaDataMode = 0; 1190 } 1191 break; 1192 /* Prohibit metadata support */ 1193 default: 1194 hAacEncoder->metaDataAllowed = 0; 1195 } 1196 1197 return err; 1198 } 1199 1200 static INT aacenc_SbrCallback(void *self, HANDLE_FDK_BITSTREAM hBs, 1201 const INT sampleRateIn, const INT sampleRateOut, 1202 const INT samplesPerFrame, 1203 const AUDIO_OBJECT_TYPE coreCodec, 1204 const MP4_ELEMENT_ID elementID, 1205 const INT elementIndex, const UCHAR harmonicSbr, 1206 const UCHAR stereoConfigIndex, 1207 const UCHAR configMode, UCHAR *configChanged, 1208 const INT downscaleFactor) { 1209 HANDLE_AACENCODER hAacEncoder = (HANDLE_AACENCODER)self; 1210 1211 sbrEncoder_GetHeader(hAacEncoder->hEnvEnc, hBs, elementIndex, 0); 1212 1213 return 0; 1214 } 1215 1216 INT aacenc_SscCallback(void *self, HANDLE_FDK_BITSTREAM hBs, 1217 const AUDIO_OBJECT_TYPE coreCodec, 1218 const INT samplingRate, const INT stereoConfigIndex, 1219 const INT coreSbrFrameLengthIndex, const INT configBytes, 1220 const UCHAR configMode, UCHAR *configChanged) { 1221 HANDLE_AACENCODER hAacEncoder = (HANDLE_AACENCODER)self; 1222 1223 return (FDK_MpegsEnc_WriteSpatialSpecificConfig(hAacEncoder->hMpsEnc, hBs)); 1224 } 1225 1226 static AACENC_ERROR aacEncInit(HANDLE_AACENCODER hAacEncoder, ULONG InitFlags, 1227 USER_PARAM *config) { 1228 AACENC_ERROR err = AACENC_OK; 1229 1230 INT aacBufferOffset = 0; 1231 HANDLE_SBR_ENCODER *hSbrEncoder = &hAacEncoder->hEnvEnc; 1232 HANDLE_AACENC_CONFIG hAacConfig = &hAacEncoder->aacConfig; 1233 1234 hAacEncoder->nZerosAppended = 0; /* count appended zeros */ 1235 1236 INT frameLength = hAacConfig->framelength; 1237 1238 if ((InitFlags & AACENC_INIT_CONFIG)) { 1239 CHANNEL_MODE prevChMode = hAacConfig->channelMode; 1240 1241 /* Verify settings and update: config -> heAacEncoder */ 1242 if ((err = FDKaacEnc_AdjustEncSettings(hAacEncoder, config)) != AACENC_OK) { 1243 return err; 1244 } 1245 frameLength = hAacConfig->framelength; /* adapt temporal framelength */ 1246 1247 /* Seamless channel reconfiguration in sbr not fully implemented */ 1248 if ((prevChMode != hAacConfig->channelMode) && isSbrActive(hAacConfig)) { 1249 InitFlags |= AACENC_INIT_STATES; 1250 } 1251 } 1252 1253 /* Clear input buffer */ 1254 if (InitFlags == AACENC_INIT_ALL) { 1255 FDKmemclear(hAacEncoder->inputBuffer, 1256 sizeof(INT_PCM) * hAacEncoder->inputBufferSize); 1257 } 1258 1259 if ((InitFlags & AACENC_INIT_CONFIG)) { 1260 aacBufferOffset = 0; 1261 switch (hAacConfig->audioObjectType) { 1262 case AOT_ER_AAC_LD: 1263 hAacEncoder->nDelay = DELAY_AACLD(hAacConfig->framelength); 1264 break; 1265 case AOT_ER_AAC_ELD: 1266 hAacEncoder->nDelay = DELAY_AACELD(hAacConfig->framelength); 1267 break; 1268 default: 1269 hAacEncoder->nDelay = 1270 DELAY_AAC(hAacConfig->framelength); /* AAC encoder delay */ 1271 } 1272 1273 hAacConfig->ancDataBitRate = 0; 1274 } 1275 1276 if ((NULL != hAacEncoder->hEnvEnc) && isSbrActive(hAacConfig) && 1277 ((InitFlags & AACENC_INIT_CONFIG) || (InitFlags & AACENC_INIT_STATES))) { 1278 INT sbrError; 1279 UINT initFlag = 0; 1280 SBR_ELEMENT_INFO sbrElInfo[(8)]; 1281 CHANNEL_MAPPING channelMapping; 1282 CHANNEL_MODE channelMode = isPsActive(hAacConfig->audioObjectType) 1283 ? config->userChannelMode 1284 : hAacConfig->channelMode; 1285 INT numChannels = isPsActive(hAacConfig->audioObjectType) 1286 ? config->nChannels 1287 : hAacConfig->nChannels; 1288 1289 if (FDKaacEnc_InitChannelMapping(channelMode, hAacConfig->channelOrder, 1290 &channelMapping) != AAC_ENC_OK) { 1291 return AACENC_INIT_ERROR; 1292 } 1293 1294 /* Check return value and if the SBR encoder can handle enough elements */ 1295 if (channelMapping.nElements > (8)) { 1296 return AACENC_INIT_ERROR; 1297 } 1298 1299 aacEncDistributeSbrBits(&channelMapping, sbrElInfo, hAacConfig->bitRate); 1300 1301 initFlag += (InitFlags & AACENC_INIT_STATES) ? 1 : 0; 1302 1303 /* Let the SBR encoder take a look at the configuration and change if 1304 * required. */ 1305 sbrError = sbrEncoder_Init( 1306 *hSbrEncoder, sbrElInfo, channelMapping.nElements, 1307 hAacEncoder->inputBuffer, hAacEncoder->inputBufferSizePerChannel, 1308 &hAacConfig->bandWidth, &aacBufferOffset, &numChannels, 1309 hAacConfig->syntaxFlags, &hAacConfig->sampleRate, &hAacConfig->sbrRatio, 1310 &frameLength, hAacConfig->audioObjectType, &hAacEncoder->nDelay, 1311 (hAacConfig->audioObjectType == AOT_ER_AAC_ELD) ? 1 : TRANS_FAC, 1312 (config->userTpHeaderPeriod != 0xFF) 1313 ? config->userTpHeaderPeriod 1314 : DEFAULT_HEADER_PERIOD_REPETITION_RATE, 1315 initFlag); 1316 1317 /* Suppress AOT reconfiguration and check error status. */ 1318 if ((sbrError) || (numChannels != hAacConfig->nChannels)) { 1319 return AACENC_INIT_SBR_ERROR; 1320 } 1321 1322 if (numChannels == 1) { 1323 hAacConfig->channelMode = MODE_1; 1324 } 1325 1326 /* Never use PNS if SBR is active */ 1327 if (hAacConfig->usePns) { 1328 hAacConfig->usePns = 0; 1329 } 1330 1331 /* estimated bitrate consumed by SBR or PS */ 1332 hAacConfig->ancDataBitRate = sbrEncoder_GetEstimateBitrate(*hSbrEncoder); 1333 1334 } /* sbr initialization */ 1335 1336 if ((hAacEncoder->hMpsEnc != NULL) && (hAacConfig->syntaxFlags & AC_LD_MPS)) { 1337 int coreCoderDelay = DELAY_AACELD(hAacConfig->framelength); 1338 1339 if (isSbrActive(hAacConfig)) { 1340 coreCoderDelay = hAacConfig->sbrRatio * coreCoderDelay + 1341 sbrEncoder_GetInputDataDelay(*hSbrEncoder); 1342 } 1343 1344 if (MPS_ENCODER_OK != 1345 FDK_MpegsEnc_Init(hAacEncoder->hMpsEnc, hAacConfig->audioObjectType, 1346 config->userSamplerate, hAacConfig->bitRate, 1347 isSbrActive(hAacConfig) ? hAacConfig->sbrRatio : 0, 1348 frameLength, /* for dual rate sbr this value is 1349 already multiplied by 2 */ 1350 hAacEncoder->inputBufferSizePerChannel, 1351 coreCoderDelay)) { 1352 return AACENC_INIT_MPS_ERROR; 1353 } 1354 } 1355 hAacEncoder->nDelay = 1356 fMax(FDK_MpegsEnc_GetDelay(hAacEncoder->hMpsEnc), hAacEncoder->nDelay); 1357 1358 /* 1359 * Initialize Transport - Module. 1360 */ 1361 if ((InitFlags & AACENC_INIT_TRANSPORT)) { 1362 UINT flags = 0; 1363 1364 FDKaacEnc_MapConfig( 1365 &hAacEncoder->coderConfig, config, 1366 getSbrSignalingMode(hAacConfig->audioObjectType, config->userTpType, 1367 config->userTpSignaling, hAacConfig->sbrRatio), 1368 hAacConfig); 1369 1370 /* create flags for transport encoder */ 1371 if (config->userTpAmxv != 0) { 1372 flags |= TP_FLAG_LATM_AMV; 1373 } 1374 /* Clear output buffer */ 1375 FDKmemclear(hAacEncoder->outBuffer, 1376 hAacEncoder->outBufferInBytes * sizeof(UCHAR)); 1377 1378 /* Initialize Bitstream encoder */ 1379 if (transportEnc_Init(hAacEncoder->hTpEnc, hAacEncoder->outBuffer, 1380 hAacEncoder->outBufferInBytes, config->userTpType, 1381 &hAacEncoder->coderConfig, flags) != 0) { 1382 return AACENC_INIT_TP_ERROR; 1383 } 1384 1385 } /* transport initialization */ 1386 1387 /* 1388 * Initialize AAC - Core. 1389 */ 1390 if ((InitFlags & AACENC_INIT_CONFIG) || (InitFlags & AACENC_INIT_STATES)) { 1391 if (FDKaacEnc_Initialize( 1392 hAacEncoder->hAacEnc, hAacConfig, hAacEncoder->hTpEnc, 1393 (InitFlags & AACENC_INIT_STATES) ? 1 : 0) != AAC_ENC_OK) { 1394 return AACENC_INIT_AAC_ERROR; 1395 } 1396 1397 } /* aac initialization */ 1398 1399 /* 1400 * Initialize Meta Data - Encoder. 1401 */ 1402 if (hAacEncoder->hMetadataEnc && (hAacEncoder->metaDataAllowed != 0) && 1403 ((InitFlags & AACENC_INIT_CONFIG) || (InitFlags & AACENC_INIT_STATES))) { 1404 INT inputDataDelay = DELAY_AAC(hAacConfig->framelength); 1405 1406 if (isSbrActive(hAacConfig) && hSbrEncoder != NULL) { 1407 inputDataDelay = hAacConfig->sbrRatio * inputDataDelay + 1408 sbrEncoder_GetInputDataDelay(*hSbrEncoder); 1409 } 1410 1411 if (FDK_MetadataEnc_Init(hAacEncoder->hMetadataEnc, 1412 ((InitFlags & AACENC_INIT_STATES) ? 1 : 0), 1413 config->userMetaDataMode, inputDataDelay, 1414 frameLength, config->userSamplerate, 1415 config->nChannels, config->userChannelMode, 1416 hAacConfig->channelOrder) != 0) { 1417 return AACENC_INIT_META_ERROR; 1418 } 1419 1420 hAacEncoder->nDelay += FDK_MetadataEnc_GetDelay(hAacEncoder->hMetadataEnc); 1421 } 1422 1423 /* Get custom delay, i.e. the codec delay w/o the decoder's SBR- or MPS delay 1424 */ 1425 if ((hAacEncoder->hMpsEnc != NULL) && (hAacConfig->syntaxFlags & AC_LD_MPS)) { 1426 hAacEncoder->nDelayCore = 1427 hAacEncoder->nDelay - 1428 fMax(0, FDK_MpegsEnc_GetDecDelay(hAacEncoder->hMpsEnc)); 1429 } else if (isSbrActive(hAacConfig) && hSbrEncoder != NULL) { 1430 hAacEncoder->nDelayCore = 1431 hAacEncoder->nDelay - 1432 fMax(0, sbrEncoder_GetSbrDecDelay(hAacEncoder->hEnvEnc)); 1433 } else { 1434 hAacEncoder->nDelayCore = hAacEncoder->nDelay; 1435 } 1436 1437 /* 1438 * Update pointer to working buffer. 1439 */ 1440 if ((InitFlags & AACENC_INIT_CONFIG)) { 1441 hAacEncoder->inputBufferOffset = aacBufferOffset; 1442 1443 hAacEncoder->nSamplesToRead = frameLength * config->nChannels; 1444 1445 } /* parameter changed */ 1446 1447 return AACENC_OK; 1448 } 1449 1450 AACENC_ERROR aacEncOpen(HANDLE_AACENCODER *phAacEncoder, const UINT encModules, 1451 const UINT maxChannels) { 1452 AACENC_ERROR err = AACENC_OK; 1453 HANDLE_AACENCODER hAacEncoder = NULL; 1454 1455 if (phAacEncoder == NULL) { 1456 err = AACENC_INVALID_HANDLE; 1457 goto bail; 1458 } 1459 1460 /* allocate memory */ 1461 hAacEncoder = Get_AacEncoder(); 1462 1463 if (hAacEncoder == NULL) { 1464 err = AACENC_MEMORY_ERROR; 1465 goto bail; 1466 } 1467 1468 FDKmemclear(hAacEncoder, sizeof(AACENCODER)); 1469 1470 /* Specify encoder modules to be allocated. */ 1471 if (encModules == 0) { 1472 C_ALLOC_SCRATCH_START(_pLibInfo, LIB_INFO, FDK_MODULE_LAST) 1473 LIB_INFO(*pLibInfo) 1474 [FDK_MODULE_LAST] = (LIB_INFO(*)[FDK_MODULE_LAST])_pLibInfo; 1475 FDKinitLibInfo(*pLibInfo); 1476 aacEncGetLibInfo(*pLibInfo); 1477 1478 hAacEncoder->encoder_modis = ENC_MODE_FLAG_AAC; 1479 if (FDKlibInfo_getCapabilities(*pLibInfo, FDK_SBRENC) & CAPF_SBR_HQ) { 1480 hAacEncoder->encoder_modis |= ENC_MODE_FLAG_SBR; 1481 } 1482 if (FDKlibInfo_getCapabilities(*pLibInfo, FDK_SBRENC) & CAPF_SBR_PS_MPEG) { 1483 hAacEncoder->encoder_modis |= ENC_MODE_FLAG_PS; 1484 } 1485 if (FDKlibInfo_getCapabilities(*pLibInfo, FDK_AACENC) & CAPF_AAC_DRC) { 1486 hAacEncoder->encoder_modis |= ENC_MODE_FLAG_META; 1487 } 1488 hAacEncoder->encoder_modis |= ENC_MODE_FLAG_SAC; 1489 1490 C_ALLOC_SCRATCH_END(_pLibInfo, LIB_INFO, FDK_MODULE_LAST) 1491 } else { 1492 hAacEncoder->encoder_modis = encModules; 1493 } 1494 1495 /* Determine max channel configuration. */ 1496 if (maxChannels == 0) { 1497 hAacEncoder->nMaxAacChannels = (8); 1498 hAacEncoder->nMaxSbrChannels = (8); 1499 } else { 1500 hAacEncoder->nMaxAacChannels = (maxChannels & 0x00FF); 1501 if ((hAacEncoder->encoder_modis & ENC_MODE_FLAG_SBR)) { 1502 hAacEncoder->nMaxSbrChannels = (maxChannels & 0xFF00) 1503 ? (maxChannels >> 8) 1504 : hAacEncoder->nMaxAacChannels; 1505 } 1506 1507 if ((hAacEncoder->nMaxAacChannels > (8)) || 1508 (hAacEncoder->nMaxSbrChannels > (8))) { 1509 err = AACENC_INVALID_CONFIG; 1510 goto bail; 1511 } 1512 } /* maxChannels==0 */ 1513 1514 /* Max number of elements could be tuned any more. */ 1515 hAacEncoder->nMaxAacElements = fixMin(((8)), hAacEncoder->nMaxAacChannels); 1516 hAacEncoder->nMaxSbrElements = fixMin((8), hAacEncoder->nMaxSbrChannels); 1517 1518 /* In case of memory overlay, allocate memory out of libraries */ 1519 1520 if (hAacEncoder->encoder_modis & (ENC_MODE_FLAG_SBR | ENC_MODE_FLAG_PS)) 1521 hAacEncoder->inputBufferSizePerChannel = INPUTBUFFER_SIZE; 1522 else 1523 hAacEncoder->inputBufferSizePerChannel = (1024); 1524 1525 hAacEncoder->inputBufferSize = 1526 hAacEncoder->nMaxAacChannels * hAacEncoder->inputBufferSizePerChannel; 1527 1528 if (NULL == (hAacEncoder->inputBuffer = (INT_PCM *)FDKcalloc( 1529 hAacEncoder->inputBufferSize, sizeof(INT_PCM)))) { 1530 err = AACENC_MEMORY_ERROR; 1531 goto bail; 1532 } 1533 1534 /* Open SBR Encoder */ 1535 if (hAacEncoder->encoder_modis & ENC_MODE_FLAG_SBR) { 1536 if (sbrEncoder_Open( 1537 &hAacEncoder->hEnvEnc, hAacEncoder->nMaxSbrElements, 1538 hAacEncoder->nMaxSbrChannels, 1539 (hAacEncoder->encoder_modis & ENC_MODE_FLAG_PS) ? 1 : 0)) { 1540 err = AACENC_MEMORY_ERROR; 1541 goto bail; 1542 } 1543 1544 if (NULL == (hAacEncoder->pSbrPayload = (SBRENC_EXT_PAYLOAD *)FDKcalloc( 1545 1, sizeof(SBRENC_EXT_PAYLOAD)))) { 1546 err = AACENC_MEMORY_ERROR; 1547 goto bail; 1548 } 1549 } /* (encoder_modis&ENC_MODE_FLAG_SBR) */ 1550 1551 /* Open Aac Encoder */ 1552 if (FDKaacEnc_Open(&hAacEncoder->hAacEnc, hAacEncoder->nMaxAacElements, 1553 hAacEncoder->nMaxAacChannels, (1)) != AAC_ENC_OK) { 1554 err = AACENC_MEMORY_ERROR; 1555 goto bail; 1556 } 1557 1558 /* Bitstream output buffer */ 1559 hAacEncoder->outBufferInBytes = 1560 1 << (DFRACT_BITS - CntLeadingZeros(fixMax( 1561 1, ((1) * hAacEncoder->nMaxAacChannels * 6144) >> 1562 3))); /* buffer has to be 2^n */ 1563 if (NULL == (hAacEncoder->outBuffer = (UCHAR *)FDKcalloc( 1564 hAacEncoder->outBufferInBytes, sizeof(UCHAR)))) { 1565 err = AACENC_MEMORY_ERROR; 1566 goto bail; 1567 } 1568 1569 /* Open Meta Data Encoder */ 1570 if (hAacEncoder->encoder_modis & ENC_MODE_FLAG_META) { 1571 if (FDK_MetadataEnc_Open(&hAacEncoder->hMetadataEnc, 1572 (UINT)hAacEncoder->nMaxAacChannels)) { 1573 err = AACENC_MEMORY_ERROR; 1574 goto bail; 1575 } 1576 } /* (encoder_modis&ENC_MODE_FLAG_META) */ 1577 1578 /* Open MPEG Surround Encoder */ 1579 if (hAacEncoder->encoder_modis & ENC_MODE_FLAG_SAC) { 1580 if (MPS_ENCODER_OK != FDK_MpegsEnc_Open(&hAacEncoder->hMpsEnc)) { 1581 err = AACENC_MEMORY_ERROR; 1582 goto bail; 1583 } 1584 } /* (hAacEncoder->encoder_modis&ENC_MODE_FLAG_SAC) */ 1585 1586 /* Open Transport Encoder */ 1587 if (transportEnc_Open(&hAacEncoder->hTpEnc) != 0) { 1588 err = AACENC_MEMORY_ERROR; 1589 goto bail; 1590 } else { 1591 C_ALLOC_SCRATCH_START(_pLibInfo, LIB_INFO, FDK_MODULE_LAST) 1592 1593 LIB_INFO(*pLibInfo) 1594 [FDK_MODULE_LAST] = (LIB_INFO(*)[FDK_MODULE_LAST])_pLibInfo; 1595 1596 FDKinitLibInfo(*pLibInfo); 1597 transportEnc_GetLibInfo(*pLibInfo); 1598 1599 /* Get capabilty flag for transport encoder. */ 1600 hAacEncoder->CAPF_tpEnc = FDKlibInfo_getCapabilities(*pLibInfo, FDK_TPENC); 1601 1602 C_ALLOC_SCRATCH_END(_pLibInfo, LIB_INFO, FDK_MODULE_LAST) 1603 } 1604 if (transportEnc_RegisterSbrCallback(hAacEncoder->hTpEnc, aacenc_SbrCallback, 1605 hAacEncoder) != 0) { 1606 err = AACENC_INIT_TP_ERROR; 1607 goto bail; 1608 } 1609 if (transportEnc_RegisterSscCallback(hAacEncoder->hTpEnc, aacenc_SscCallback, 1610 hAacEncoder) != 0) { 1611 err = AACENC_INIT_TP_ERROR; 1612 goto bail; 1613 } 1614 1615 /* Initialize encoder instance with default parameters. */ 1616 aacEncDefaultConfig(&hAacEncoder->aacConfig, &hAacEncoder->extParam); 1617 1618 /* Initialize headerPeriod in coderConfig for aacEncoder_GetParam(). */ 1619 hAacEncoder->coderConfig.headerPeriod = 1620 hAacEncoder->extParam.userTpHeaderPeriod; 1621 1622 /* All encoder modules have to be initialized */ 1623 hAacEncoder->InitFlags = AACENC_INIT_ALL; 1624 1625 /* Return encoder instance */ 1626 *phAacEncoder = hAacEncoder; 1627 1628 return err; 1629 1630 bail: 1631 aacEncClose(&hAacEncoder); 1632 1633 return err; 1634 } 1635 1636 AACENC_ERROR aacEncClose(HANDLE_AACENCODER *phAacEncoder) { 1637 AACENC_ERROR err = AACENC_OK; 1638 1639 if (phAacEncoder == NULL) { 1640 err = AACENC_INVALID_HANDLE; 1641 goto bail; 1642 } 1643 1644 if (*phAacEncoder != NULL) { 1645 HANDLE_AACENCODER hAacEncoder = *phAacEncoder; 1646 1647 if (hAacEncoder->inputBuffer != NULL) { 1648 FDKfree(hAacEncoder->inputBuffer); 1649 hAacEncoder->inputBuffer = NULL; 1650 } 1651 if (hAacEncoder->outBuffer != NULL) { 1652 FDKfree(hAacEncoder->outBuffer); 1653 hAacEncoder->outBuffer = NULL; 1654 } 1655 1656 if (hAacEncoder->hEnvEnc) { 1657 sbrEncoder_Close(&hAacEncoder->hEnvEnc); 1658 } 1659 if (hAacEncoder->pSbrPayload != NULL) { 1660 FDKfree(hAacEncoder->pSbrPayload); 1661 hAacEncoder->pSbrPayload = NULL; 1662 } 1663 if (hAacEncoder->hAacEnc) { 1664 FDKaacEnc_Close(&hAacEncoder->hAacEnc); 1665 } 1666 1667 transportEnc_Close(&hAacEncoder->hTpEnc); 1668 1669 if (hAacEncoder->hMetadataEnc) { 1670 FDK_MetadataEnc_Close(&hAacEncoder->hMetadataEnc); 1671 } 1672 if (hAacEncoder->hMpsEnc) { 1673 FDK_MpegsEnc_Close(&hAacEncoder->hMpsEnc); 1674 } 1675 1676 Free_AacEncoder(phAacEncoder); 1677 } 1678 1679 bail: 1680 return err; 1681 } 1682 1683 AACENC_ERROR aacEncEncode(const HANDLE_AACENCODER hAacEncoder, 1684 const AACENC_BufDesc *inBufDesc, 1685 const AACENC_BufDesc *outBufDesc, 1686 const AACENC_InArgs *inargs, 1687 AACENC_OutArgs *outargs) { 1688 AACENC_ERROR err = AACENC_OK; 1689 INT i, nBsBytes = 0; 1690 INT outBytes[(1)]; 1691 int nExtensions = 0; 1692 int ancDataExtIdx = -1; 1693 1694 /* deal with valid encoder handle */ 1695 if (hAacEncoder == NULL) { 1696 err = AACENC_INVALID_HANDLE; 1697 goto bail; 1698 } 1699 1700 /* 1701 * Adjust user settings and trigger reinitialization. 1702 */ 1703 if (hAacEncoder->InitFlags != 0) { 1704 err = 1705 aacEncInit(hAacEncoder, hAacEncoder->InitFlags, &hAacEncoder->extParam); 1706 1707 if (err != AACENC_OK) { 1708 /* keep init flags alive! */ 1709 goto bail; 1710 } 1711 hAacEncoder->InitFlags = AACENC_INIT_NONE; 1712 } 1713 1714 if (outargs != NULL) { 1715 FDKmemclear(outargs, sizeof(AACENC_OutArgs)); 1716 } 1717 1718 if (outBufDesc != NULL) { 1719 for (i = 0; i < outBufDesc->numBufs; i++) { 1720 if (outBufDesc->bufs[i] != NULL) { 1721 FDKmemclear(outBufDesc->bufs[i], outBufDesc->bufSizes[i]); 1722 } 1723 } 1724 } 1725 1726 /* 1727 * If only encoder handle given, independent (re)initialization can be 1728 * triggered. 1729 */ 1730 if ((inBufDesc == NULL) && (outBufDesc == NULL) && (inargs == NULL) && 1731 (outargs == NULL)) { 1732 goto bail; 1733 } 1734 1735 /* check if buffer descriptors are filled out properly. */ 1736 if ((AACENC_OK != validateBufDesc(inBufDesc)) || 1737 (AACENC_OK != validateBufDesc(outBufDesc)) || (inargs == NULL) || 1738 (outargs == NULL)) { 1739 err = AACENC_UNSUPPORTED_PARAMETER; 1740 goto bail; 1741 } 1742 1743 /* reset buffer wich signals number of valid bytes in output bitstream buffer 1744 */ 1745 FDKmemclear(outBytes, hAacEncoder->aacConfig.nSubFrames * sizeof(INT)); 1746 1747 /* 1748 * Manage incoming audio samples. 1749 */ 1750 if ((inBufDesc != NULL) && (inargs->numInSamples > 0) && 1751 (getBufDescIdx(inBufDesc, IN_AUDIO_DATA) != -1)) { 1752 /* Fetch data until nSamplesToRead reached */ 1753 INT idx = getBufDescIdx(inBufDesc, IN_AUDIO_DATA); 1754 INT newSamples = 1755 fixMax(0, fixMin(inargs->numInSamples, hAacEncoder->nSamplesToRead - 1756 hAacEncoder->nSamplesRead)); 1757 INT_PCM *pIn = 1758 hAacEncoder->inputBuffer + 1759 (hAacEncoder->inputBufferOffset + hAacEncoder->nSamplesRead) / 1760 hAacEncoder->aacConfig.nChannels; 1761 1762 /* Copy new input samples to internal buffer */ 1763 if (inBufDesc->bufElSizes[idx] == (INT)sizeof(INT_PCM)) { 1764 FDK_deinterleave((INT_PCM *)inBufDesc->bufs[idx], pIn, 1765 hAacEncoder->extParam.nChannels, 1766 newSamples / hAacEncoder->extParam.nChannels, 1767 hAacEncoder->inputBufferSizePerChannel); 1768 } else if (inBufDesc->bufElSizes[idx] > (INT)sizeof(INT_PCM)) { 1769 FDK_deinterleave((LONG *)inBufDesc->bufs[idx], pIn, 1770 hAacEncoder->extParam.nChannels, 1771 newSamples / hAacEncoder->extParam.nChannels, 1772 hAacEncoder->inputBufferSizePerChannel); 1773 } else { 1774 FDK_deinterleave((SHORT *)inBufDesc->bufs[idx], pIn, 1775 hAacEncoder->extParam.nChannels, 1776 newSamples / hAacEncoder->extParam.nChannels, 1777 hAacEncoder->inputBufferSizePerChannel); 1778 } 1779 hAacEncoder->nSamplesRead += newSamples; 1780 1781 /* Number of fetched input buffer samples. */ 1782 outargs->numInSamples = newSamples; 1783 } 1784 1785 /* input buffer completely filled ? */ 1786 if (hAacEncoder->nSamplesRead < hAacEncoder->nSamplesToRead) { 1787 /* - eof reached and flushing enabled, or 1788 - return to main and wait for further incoming audio samples */ 1789 if (inargs->numInSamples == -1) { 1790 if ((hAacEncoder->nZerosAppended < hAacEncoder->nDelay)) { 1791 int nZeros = (hAacEncoder->nSamplesToRead - hAacEncoder->nSamplesRead) / 1792 hAacEncoder->extParam.nChannels; 1793 1794 FDK_ASSERT(nZeros >= 0); 1795 1796 /* clear out until end-of-buffer */ 1797 if (nZeros) { 1798 for (i = 0; i < (int)hAacEncoder->extParam.nChannels; i++) { 1799 FDKmemclear(hAacEncoder->inputBuffer + 1800 i * hAacEncoder->inputBufferSizePerChannel + 1801 (hAacEncoder->inputBufferOffset + 1802 hAacEncoder->nSamplesRead) / 1803 hAacEncoder->extParam.nChannels, 1804 sizeof(INT_PCM) * nZeros); 1805 } 1806 hAacEncoder->nZerosAppended += nZeros; 1807 hAacEncoder->nSamplesRead = hAacEncoder->nSamplesToRead; 1808 } 1809 } else { /* flushing completed */ 1810 err = AACENC_ENCODE_EOF; /* eof reached */ 1811 goto bail; 1812 } 1813 } else { /* inargs->numInSamples!= -1 */ 1814 goto bail; /* not enough samples in input buffer and no flushing enabled 1815 */ 1816 } 1817 } 1818 1819 /* init payload */ 1820 FDKmemclear(hAacEncoder->extPayload, 1821 sizeof(AACENC_EXT_PAYLOAD) * MAX_TOTAL_EXT_PAYLOADS); 1822 for (i = 0; i < MAX_TOTAL_EXT_PAYLOADS; i++) { 1823 hAacEncoder->extPayload[i].associatedChElement = -1; 1824 } 1825 if (hAacEncoder->pSbrPayload != NULL) { 1826 FDKmemclear(hAacEncoder->pSbrPayload, sizeof(*hAacEncoder->pSbrPayload)); 1827 } 1828 1829 /* 1830 * Calculate Meta Data info. 1831 */ 1832 if ((hAacEncoder->hMetadataEnc != NULL) && 1833 (hAacEncoder->metaDataAllowed != 0)) { 1834 const AACENC_MetaData *pMetaData = NULL; 1835 AACENC_EXT_PAYLOAD *pMetaDataExtPayload = NULL; 1836 UINT nMetaDataExtensions = 0; 1837 INT matrix_mixdown_idx = 0; 1838 1839 /* New meta data info available ? */ 1840 if (getBufDescIdx(inBufDesc, IN_METADATA_SETUP) != -1) { 1841 pMetaData = 1842 (AACENC_MetaData *) 1843 inBufDesc->bufs[getBufDescIdx(inBufDesc, IN_METADATA_SETUP)]; 1844 } 1845 1846 FDK_MetadataEnc_Process( 1847 hAacEncoder->hMetadataEnc, 1848 hAacEncoder->inputBuffer + hAacEncoder->inputBufferOffset / 1849 hAacEncoder->coderConfig.noChannels, 1850 hAacEncoder->inputBufferSizePerChannel, hAacEncoder->nSamplesRead, 1851 pMetaData, &pMetaDataExtPayload, &nMetaDataExtensions, 1852 &matrix_mixdown_idx); 1853 1854 for (i = 0; i < (INT)nMetaDataExtensions; 1855 i++) { /* Get meta data extension payload. */ 1856 hAacEncoder->extPayload[nExtensions++] = pMetaDataExtPayload[i]; 1857 } 1858 1859 if ((matrix_mixdown_idx != -1) && 1860 ((hAacEncoder->extParam.userChannelMode == MODE_1_2_2) || 1861 (hAacEncoder->extParam.userChannelMode == MODE_1_2_2_1))) { 1862 /* Set matrix mixdown coefficient. */ 1863 UINT pceValue = (UINT)((0 << 3) | ((matrix_mixdown_idx & 0x3) << 1) | 1); 1864 if (hAacEncoder->extParam.userPceAdditions != pceValue) { 1865 hAacEncoder->extParam.userPceAdditions = pceValue; 1866 hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT; 1867 } 1868 } 1869 } 1870 1871 /* 1872 * Encode MPS data. 1873 */ 1874 if ((hAacEncoder->hMpsEnc != NULL) && 1875 (hAacEncoder->aacConfig.syntaxFlags & AC_LD_MPS)) { 1876 AACENC_EXT_PAYLOAD mpsExtensionPayload; 1877 FDKmemclear(&mpsExtensionPayload, sizeof(AACENC_EXT_PAYLOAD)); 1878 1879 if (MPS_ENCODER_OK != 1880 FDK_MpegsEnc_Process( 1881 hAacEncoder->hMpsEnc, 1882 hAacEncoder->inputBuffer + hAacEncoder->inputBufferOffset / 1883 hAacEncoder->coderConfig.noChannels, 1884 hAacEncoder->nSamplesRead, &mpsExtensionPayload)) { 1885 err = AACENC_ENCODE_ERROR; 1886 goto bail; 1887 } 1888 1889 if ((mpsExtensionPayload.pData != NULL) && 1890 ((mpsExtensionPayload.dataSize != 0))) { 1891 hAacEncoder->extPayload[nExtensions++] = mpsExtensionPayload; 1892 } 1893 } 1894 1895 if ((NULL != hAacEncoder->hEnvEnc) && (NULL != hAacEncoder->pSbrPayload) && 1896 isSbrActive(&hAacEncoder->aacConfig)) { 1897 INT nPayload = 0; 1898 1899 /* 1900 * Encode SBR data. 1901 */ 1902 if (sbrEncoder_EncodeFrame(hAacEncoder->hEnvEnc, hAacEncoder->inputBuffer, 1903 hAacEncoder->inputBufferSizePerChannel, 1904 hAacEncoder->pSbrPayload->dataSize[nPayload], 1905 hAacEncoder->pSbrPayload->data[nPayload])) { 1906 err = AACENC_ENCODE_ERROR; 1907 goto bail; 1908 } else { 1909 /* Add SBR extension payload */ 1910 for (i = 0; i < (8); i++) { 1911 if (hAacEncoder->pSbrPayload->dataSize[nPayload][i] > 0) { 1912 hAacEncoder->extPayload[nExtensions].pData = 1913 hAacEncoder->pSbrPayload->data[nPayload][i]; 1914 { 1915 hAacEncoder->extPayload[nExtensions].dataSize = 1916 hAacEncoder->pSbrPayload->dataSize[nPayload][i]; 1917 hAacEncoder->extPayload[nExtensions].associatedChElement = i; 1918 } 1919 hAacEncoder->extPayload[nExtensions].dataType = 1920 EXT_SBR_DATA; /* Once SBR Encoder supports SBR CRC set 1921 EXT_SBR_DATA_CRC */ 1922 nExtensions++; /* or EXT_SBR_DATA according to configuration. */ 1923 FDK_ASSERT(nExtensions <= MAX_TOTAL_EXT_PAYLOADS); 1924 } 1925 } 1926 nPayload++; 1927 } 1928 } /* sbrEnabled */ 1929 1930 if ((inargs->numAncBytes > 0) && 1931 (getBufDescIdx(inBufDesc, IN_ANCILLRY_DATA) != -1)) { 1932 INT idx = getBufDescIdx(inBufDesc, IN_ANCILLRY_DATA); 1933 hAacEncoder->extPayload[nExtensions].dataSize = inargs->numAncBytes * 8; 1934 hAacEncoder->extPayload[nExtensions].pData = (UCHAR *)inBufDesc->bufs[idx]; 1935 hAacEncoder->extPayload[nExtensions].dataType = EXT_DATA_ELEMENT; 1936 hAacEncoder->extPayload[nExtensions].associatedChElement = -1; 1937 ancDataExtIdx = nExtensions; /* store index */ 1938 nExtensions++; 1939 } 1940 1941 /* 1942 * Encode AAC - Core. 1943 */ 1944 if (FDKaacEnc_EncodeFrame(hAacEncoder->hAacEnc, hAacEncoder->hTpEnc, 1945 hAacEncoder->inputBuffer, 1946 hAacEncoder->inputBufferSizePerChannel, outBytes, 1947 hAacEncoder->extPayload) != AAC_ENC_OK) { 1948 err = AACENC_ENCODE_ERROR; 1949 goto bail; 1950 } 1951 1952 if (ancDataExtIdx >= 0) { 1953 outargs->numAncBytes = 1954 inargs->numAncBytes - 1955 (hAacEncoder->extPayload[ancDataExtIdx].dataSize >> 3); 1956 } 1957 1958 /* samples exhausted */ 1959 hAacEncoder->nSamplesRead -= hAacEncoder->nSamplesToRead; 1960 1961 /* 1962 * Delay balancing buffer handling 1963 */ 1964 if (isSbrActive(&hAacEncoder->aacConfig)) { 1965 sbrEncoder_UpdateBuffers(hAacEncoder->hEnvEnc, hAacEncoder->inputBuffer, 1966 hAacEncoder->inputBufferSizePerChannel); 1967 } 1968 1969 /* 1970 * Make bitstream public 1971 */ 1972 if ((outBufDesc != NULL) && (outBufDesc->numBufs >= 1)) { 1973 INT bsIdx = getBufDescIdx(outBufDesc, OUT_BITSTREAM_DATA); 1974 INT auIdx = getBufDescIdx(outBufDesc, OUT_AU_SIZES); 1975 1976 for (i = 0, nBsBytes = 0; i < hAacEncoder->aacConfig.nSubFrames; i++) { 1977 nBsBytes += outBytes[i]; 1978 1979 if (auIdx != -1) { 1980 ((INT *)outBufDesc->bufs[auIdx])[i] = outBytes[i]; 1981 } 1982 } 1983 1984 if ((bsIdx != -1) && (outBufDesc->bufSizes[bsIdx] >= nBsBytes)) { 1985 FDKmemcpy(outBufDesc->bufs[bsIdx], hAacEncoder->outBuffer, 1986 sizeof(UCHAR) * nBsBytes); 1987 outargs->numOutBytes = nBsBytes; 1988 outargs->bitResState = 1989 FDKaacEnc_GetBitReservoirState(hAacEncoder->hAacEnc); 1990 } else { 1991 /* output buffer too small, can't write valid bitstream */ 1992 err = AACENC_ENCODE_ERROR; 1993 goto bail; 1994 } 1995 } 1996 1997 bail: 1998 if (err == AACENC_ENCODE_ERROR) { 1999 /* All encoder modules have to be initialized */ 2000 hAacEncoder->InitFlags = AACENC_INIT_ALL; 2001 } 2002 2003 return err; 2004 } 2005 2006 static AAC_ENCODER_ERROR aacEncGetConf(HANDLE_AACENCODER hAacEncoder, 2007 UINT *size, UCHAR *confBuffer) { 2008 FDK_BITSTREAM tmpConf; 2009 UINT confType; 2010 UCHAR buf[64]; 2011 int err; 2012 2013 /* Init bit buffer */ 2014 FDKinitBitStream(&tmpConf, buf, 64, 0, BS_WRITER); 2015 2016 /* write conf in tmp buffer */ 2017 err = transportEnc_GetConf(hAacEncoder->hTpEnc, &hAacEncoder->coderConfig, 2018 &tmpConf, &confType); 2019 2020 /* copy data to outbuffer: length in bytes */ 2021 FDKbyteAlign(&tmpConf, 0); 2022 2023 /* Check buffer size */ 2024 if (FDKgetValidBits(&tmpConf) > ((*size) << 3)) return AAC_ENC_UNKNOWN; 2025 2026 FDKfetchBuffer(&tmpConf, confBuffer, size); 2027 2028 if (err != 0) 2029 return AAC_ENC_UNKNOWN; 2030 else 2031 return AAC_ENC_OK; 2032 } 2033 2034 AACENC_ERROR aacEncGetLibInfo(LIB_INFO *info) { 2035 int i = 0; 2036 2037 if (info == NULL) { 2038 return AACENC_INVALID_HANDLE; 2039 } 2040 2041 FDK_toolsGetLibInfo(info); 2042 transportEnc_GetLibInfo(info); 2043 sbrEncoder_GetLibInfo(info); 2044 FDK_MpegsEnc_GetLibInfo(info); 2045 2046 /* search for next free tab */ 2047 for (i = 0; i < FDK_MODULE_LAST; i++) { 2048 if (info[i].module_id == FDK_NONE) break; 2049 } 2050 if (i == FDK_MODULE_LAST) { 2051 return AACENC_INIT_ERROR; 2052 } 2053 2054 info[i].module_id = FDK_AACENC; 2055 info[i].build_date = AACENCODER_LIB_BUILD_DATE; 2056 info[i].build_time = AACENCODER_LIB_BUILD_TIME; 2057 info[i].title = AACENCODER_LIB_TITLE; 2058 info[i].version = 2059 LIB_VERSION(AACENCODER_LIB_VL0, AACENCODER_LIB_VL1, AACENCODER_LIB_VL2); 2060 ; 2061 LIB_VERSION_STRING(&info[i]); 2062 2063 /* Capability flags */ 2064 info[i].flags = 0 | CAPF_AAC_1024 | CAPF_AAC_LC | CAPF_AAC_512 | 2065 CAPF_AAC_480 | CAPF_AAC_DRC | CAPF_AAC_ELD_DOWNSCALE; 2066 /* End of flags */ 2067 2068 return AACENC_OK; 2069 } 2070 2071 AACENC_ERROR aacEncoder_SetParam(const HANDLE_AACENCODER hAacEncoder, 2072 const AACENC_PARAM param, const UINT value) { 2073 AACENC_ERROR err = AACENC_OK; 2074 USER_PARAM *settings = &hAacEncoder->extParam; 2075 2076 /* check encoder handle */ 2077 if (hAacEncoder == NULL) { 2078 err = AACENC_INVALID_HANDLE; 2079 goto bail; 2080 } 2081 2082 /* apply param value */ 2083 switch (param) { 2084 case AACENC_AOT: 2085 if (settings->userAOT != (AUDIO_OBJECT_TYPE)value) { 2086 /* check if AOT matches the allocated modules */ 2087 switch (value) { 2088 case AOT_PS: 2089 if (!(hAacEncoder->encoder_modis & (ENC_MODE_FLAG_PS))) { 2090 err = AACENC_INVALID_CONFIG; 2091 goto bail; 2092 } 2093 case AOT_SBR: 2094 case AOT_MP2_SBR: 2095 if (!(hAacEncoder->encoder_modis & (ENC_MODE_FLAG_SBR))) { 2096 err = AACENC_INVALID_CONFIG; 2097 goto bail; 2098 } 2099 case AOT_AAC_LC: 2100 case AOT_MP2_AAC_LC: 2101 case AOT_ER_AAC_LD: 2102 case AOT_ER_AAC_ELD: 2103 if (!(hAacEncoder->encoder_modis & (ENC_MODE_FLAG_AAC))) { 2104 err = AACENC_INVALID_CONFIG; 2105 goto bail; 2106 } 2107 break; 2108 default: 2109 err = AACENC_INVALID_CONFIG; 2110 goto bail; 2111 } /* switch value */ 2112 settings->userAOT = (AUDIO_OBJECT_TYPE)value; 2113 hAacEncoder->InitFlags |= 2114 AACENC_INIT_CONFIG | AACENC_INIT_STATES | AACENC_INIT_TRANSPORT; 2115 } 2116 break; 2117 case AACENC_BITRATE: 2118 if (settings->userBitrate != value) { 2119 settings->userBitrate = value; 2120 hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_TRANSPORT; 2121 } 2122 break; 2123 case AACENC_BITRATEMODE: 2124 if (settings->userBitrateMode != value) { 2125 switch (value) { 2126 case 0: 2127 case 1: 2128 case 2: 2129 case 3: 2130 case 4: 2131 case 5: 2132 settings->userBitrateMode = value; 2133 hAacEncoder->InitFlags |= 2134 AACENC_INIT_CONFIG | AACENC_INIT_TRANSPORT; 2135 break; 2136 default: 2137 err = AACENC_INVALID_CONFIG; 2138 break; 2139 } /* switch value */ 2140 } 2141 break; 2142 case AACENC_SAMPLERATE: 2143 if (settings->userSamplerate != value) { 2144 if (!((value == 8000) || (value == 11025) || (value == 12000) || 2145 (value == 16000) || (value == 22050) || (value == 24000) || 2146 (value == 32000) || (value == 44100) || (value == 48000) || 2147 (value == 64000) || (value == 88200) || (value == 96000))) { 2148 err = AACENC_INVALID_CONFIG; 2149 break; 2150 } 2151 settings->userSamplerate = value; 2152 hAacEncoder->nSamplesRead = 0; /* reset internal inputbuffer */ 2153 hAacEncoder->InitFlags |= 2154 AACENC_INIT_CONFIG | AACENC_INIT_STATES | AACENC_INIT_TRANSPORT; 2155 } 2156 break; 2157 case AACENC_CHANNELMODE: 2158 if (settings->userChannelMode != (CHANNEL_MODE)value) { 2159 if (((CHANNEL_MODE)value == MODE_212) && 2160 (NULL != hAacEncoder->hMpsEnc)) { 2161 settings->userChannelMode = (CHANNEL_MODE)value; 2162 settings->nChannels = 2; 2163 } else { 2164 const CHANNEL_MODE_CONFIG_TAB *pConfig = 2165 FDKaacEnc_GetChannelModeConfiguration((CHANNEL_MODE)value); 2166 if (pConfig == NULL) { 2167 err = AACENC_INVALID_CONFIG; 2168 break; 2169 } 2170 if ((pConfig->nElements > hAacEncoder->nMaxAacElements) || 2171 (pConfig->nChannelsEff > hAacEncoder->nMaxAacChannels)) { 2172 err = AACENC_INVALID_CONFIG; 2173 break; 2174 } 2175 2176 settings->userChannelMode = (CHANNEL_MODE)value; 2177 settings->nChannels = pConfig->nChannels; 2178 } 2179 hAacEncoder->nSamplesRead = 0; /* reset internal inputbuffer */ 2180 hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_TRANSPORT; 2181 if (!((value >= 1) && (value <= 6))) { 2182 hAacEncoder->InitFlags |= AACENC_INIT_STATES; 2183 } 2184 } 2185 break; 2186 case AACENC_BANDWIDTH: 2187 if (settings->userBandwidth != value) { 2188 settings->userBandwidth = value; 2189 hAacEncoder->InitFlags |= AACENC_INIT_CONFIG; 2190 } 2191 break; 2192 case AACENC_CHANNELORDER: 2193 if (hAacEncoder->aacConfig.channelOrder != (CHANNEL_ORDER)value) { 2194 if (!((value == 0) || (value == 1))) { 2195 err = AACENC_INVALID_CONFIG; 2196 break; 2197 } 2198 hAacEncoder->aacConfig.channelOrder = (CHANNEL_ORDER)value; 2199 hAacEncoder->nSamplesRead = 0; /* reset internal inputbuffer */ 2200 hAacEncoder->InitFlags |= 2201 AACENC_INIT_CONFIG | AACENC_INIT_STATES | AACENC_INIT_TRANSPORT; 2202 } 2203 break; 2204 case AACENC_AFTERBURNER: 2205 if (settings->userAfterburner != value) { 2206 if (!((value == 0) || (value == 1))) { 2207 err = AACENC_INVALID_CONFIG; 2208 break; 2209 } 2210 settings->userAfterburner = value; 2211 hAacEncoder->InitFlags |= AACENC_INIT_CONFIG; 2212 } 2213 break; 2214 case AACENC_GRANULE_LENGTH: 2215 if (settings->userFramelength != value) { 2216 switch (value) { 2217 case 1024: 2218 case 512: 2219 case 480: 2220 case 256: 2221 case 240: 2222 case 128: 2223 case 120: 2224 if ((value << 1) == 480 || (value << 1) == 512) { 2225 settings->userDownscaleFactor = 2; 2226 } else if ((value << 2) == 480 || (value << 2) == 512) { 2227 settings->userDownscaleFactor = 4; 2228 } 2229 settings->userFramelength = value; 2230 hAacEncoder->InitFlags |= 2231 AACENC_INIT_CONFIG | AACENC_INIT_TRANSPORT; 2232 break; 2233 default: 2234 err = AACENC_INVALID_CONFIG; 2235 break; 2236 } 2237 } 2238 break; 2239 case AACENC_SBR_RATIO: 2240 if (settings->userSbrRatio != value) { 2241 if (!((value == 0) || (value == 1) || (value == 2))) { 2242 err = AACENC_INVALID_CONFIG; 2243 break; 2244 } 2245 settings->userSbrRatio = value; 2246 hAacEncoder->InitFlags |= 2247 AACENC_INIT_CONFIG | AACENC_INIT_STATES | AACENC_INIT_TRANSPORT; 2248 } 2249 break; 2250 case AACENC_SBR_MODE: 2251 if ((settings->userSbrEnabled != value) && 2252 (NULL != hAacEncoder->hEnvEnc)) { 2253 settings->userSbrEnabled = value; 2254 hAacEncoder->InitFlags |= 2255 AACENC_INIT_CONFIG | AACENC_INIT_STATES | AACENC_INIT_TRANSPORT; 2256 } 2257 break; 2258 case AACENC_TRANSMUX: 2259 if (settings->userTpType != (TRANSPORT_TYPE)value) { 2260 TRANSPORT_TYPE type = (TRANSPORT_TYPE)value; 2261 UINT flags = hAacEncoder->CAPF_tpEnc; 2262 2263 if (!(((type == TT_MP4_ADIF) && (flags & CAPF_ADIF)) || 2264 ((type == TT_MP4_ADTS) && (flags & CAPF_ADTS)) || 2265 ((type == TT_MP4_LATM_MCP0) && 2266 ((flags & CAPF_LATM) && (flags & CAPF_RAWPACKETS))) || 2267 ((type == TT_MP4_LATM_MCP1) && 2268 ((flags & CAPF_LATM) && (flags & CAPF_RAWPACKETS))) || 2269 ((type == TT_MP4_LOAS) && (flags & CAPF_LOAS)) || 2270 ((type == TT_MP4_RAW) && (flags & CAPF_RAWPACKETS)))) { 2271 err = AACENC_INVALID_CONFIG; 2272 break; 2273 } 2274 settings->userTpType = (TRANSPORT_TYPE)value; 2275 hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT; 2276 } 2277 break; 2278 case AACENC_SIGNALING_MODE: 2279 if (settings->userTpSignaling != value) { 2280 if (!((value == 0) || (value == 1) || (value == 2))) { 2281 err = AACENC_INVALID_CONFIG; 2282 break; 2283 } 2284 settings->userTpSignaling = value; 2285 hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT; 2286 } 2287 break; 2288 case AACENC_PROTECTION: 2289 if (settings->userTpProtection != value) { 2290 if (!((value == 0) || (value == 1))) { 2291 err = AACENC_INVALID_CONFIG; 2292 break; 2293 } 2294 settings->userTpProtection = value; 2295 hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT; 2296 } 2297 break; 2298 case AACENC_HEADER_PERIOD: 2299 if (settings->userTpHeaderPeriod != value) { 2300 if (!(((INT)value >= 0) && (value <= 255))) { 2301 err = AACENC_INVALID_CONFIG; 2302 break; 2303 } 2304 settings->userTpHeaderPeriod = value; 2305 hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT; 2306 } 2307 break; 2308 case AACENC_AUDIOMUXVER: 2309 if (settings->userTpAmxv != value) { 2310 if (!((value == 0) || (value == 1) || (value == 2))) { 2311 err = AACENC_INVALID_CONFIG; 2312 break; 2313 } 2314 settings->userTpAmxv = value; 2315 hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT; 2316 } 2317 break; 2318 case AACENC_TPSUBFRAMES: 2319 if (settings->userTpNsubFrames != value) { 2320 if (!((value >= 1) && (value <= 4))) { 2321 err = AACENC_INVALID_CONFIG; 2322 break; 2323 } 2324 settings->userTpNsubFrames = value; 2325 hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT; 2326 } 2327 break; 2328 case AACENC_ANCILLARY_BITRATE: 2329 if (settings->userAncDataRate != value) { 2330 settings->userAncDataRate = value; 2331 } 2332 break; 2333 case AACENC_CONTROL_STATE: 2334 if (hAacEncoder->InitFlags != value) { 2335 if (value & AACENC_RESET_INBUFFER) { 2336 hAacEncoder->nSamplesRead = 0; 2337 } 2338 hAacEncoder->InitFlags = value; 2339 } 2340 break; 2341 case AACENC_METADATA_MODE: 2342 if ((UINT)settings->userMetaDataMode != value) { 2343 if (!(((INT)value >= 0) && ((INT)value <= 3))) { 2344 err = AACENC_INVALID_CONFIG; 2345 break; 2346 } 2347 settings->userMetaDataMode = value; 2348 hAacEncoder->InitFlags |= AACENC_INIT_CONFIG; 2349 } 2350 break; 2351 case AACENC_PEAK_BITRATE: 2352 if (settings->userPeakBitrate != value) { 2353 settings->userPeakBitrate = value; 2354 hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_TRANSPORT; 2355 } 2356 break; 2357 default: 2358 err = AACENC_UNSUPPORTED_PARAMETER; 2359 break; 2360 } /* switch(param) */ 2361 2362 bail: 2363 return err; 2364 } 2365 2366 UINT aacEncoder_GetParam(const HANDLE_AACENCODER hAacEncoder, 2367 const AACENC_PARAM param) { 2368 UINT value = 0; 2369 USER_PARAM *settings = &hAacEncoder->extParam; 2370 2371 /* check encoder handle */ 2372 if (hAacEncoder == NULL) { 2373 goto bail; 2374 } 2375 2376 /* apply param value */ 2377 switch (param) { 2378 case AACENC_AOT: 2379 value = (UINT)hAacEncoder->aacConfig.audioObjectType; 2380 break; 2381 case AACENC_BITRATE: 2382 switch (hAacEncoder->aacConfig.bitrateMode) { 2383 case AACENC_BR_MODE_CBR: 2384 value = (UINT)hAacEncoder->aacConfig.bitRate; 2385 break; 2386 default: 2387 value = (UINT)-1; 2388 } 2389 break; 2390 case AACENC_BITRATEMODE: 2391 value = (UINT)((hAacEncoder->aacConfig.bitrateMode != AACENC_BR_MODE_FF) 2392 ? hAacEncoder->aacConfig.bitrateMode 2393 : AACENC_BR_MODE_CBR); 2394 break; 2395 case AACENC_SAMPLERATE: 2396 value = (UINT)hAacEncoder->coderConfig.extSamplingRate; 2397 break; 2398 case AACENC_CHANNELMODE: 2399 if ((MODE_1 == hAacEncoder->aacConfig.channelMode) && 2400 (hAacEncoder->aacConfig.syntaxFlags & AC_LD_MPS)) { 2401 value = MODE_212; 2402 } else { 2403 value = (UINT)hAacEncoder->aacConfig.channelMode; 2404 } 2405 break; 2406 case AACENC_BANDWIDTH: 2407 value = (UINT)hAacEncoder->aacConfig.bandWidth; 2408 break; 2409 case AACENC_CHANNELORDER: 2410 value = (UINT)hAacEncoder->aacConfig.channelOrder; 2411 break; 2412 case AACENC_AFTERBURNER: 2413 value = (UINT)hAacEncoder->aacConfig.useRequant; 2414 break; 2415 case AACENC_GRANULE_LENGTH: 2416 value = (UINT)hAacEncoder->aacConfig.framelength; 2417 break; 2418 case AACENC_SBR_RATIO: 2419 value = isSbrActive(&hAacEncoder->aacConfig) 2420 ? hAacEncoder->aacConfig.sbrRatio 2421 : 0; 2422 break; 2423 case AACENC_SBR_MODE: 2424 value = 2425 (UINT)(hAacEncoder->aacConfig.syntaxFlags & AC_SBR_PRESENT) ? 1 : 0; 2426 break; 2427 case AACENC_TRANSMUX: 2428 value = (UINT)settings->userTpType; 2429 break; 2430 case AACENC_SIGNALING_MODE: 2431 value = (UINT)getSbrSignalingMode( 2432 hAacEncoder->aacConfig.audioObjectType, settings->userTpType, 2433 settings->userTpSignaling, hAacEncoder->aacConfig.sbrRatio); 2434 break; 2435 case AACENC_PROTECTION: 2436 value = (UINT)settings->userTpProtection; 2437 break; 2438 case AACENC_HEADER_PERIOD: 2439 value = (UINT)hAacEncoder->coderConfig.headerPeriod; 2440 break; 2441 case AACENC_AUDIOMUXVER: 2442 value = (UINT)hAacEncoder->aacConfig.audioMuxVersion; 2443 break; 2444 case AACENC_TPSUBFRAMES: 2445 value = (UINT)settings->userTpNsubFrames; 2446 break; 2447 case AACENC_ANCILLARY_BITRATE: 2448 value = (UINT)hAacEncoder->aacConfig.anc_Rate; 2449 break; 2450 case AACENC_CONTROL_STATE: 2451 value = (UINT)hAacEncoder->InitFlags; 2452 break; 2453 case AACENC_METADATA_MODE: 2454 value = (hAacEncoder->metaDataAllowed == 0) 2455 ? 0 2456 : (UINT)settings->userMetaDataMode; 2457 break; 2458 case AACENC_PEAK_BITRATE: 2459 value = (UINT)-1; /* peak bitrate parameter is meaningless */ 2460 if (((INT)hAacEncoder->extParam.userPeakBitrate != -1)) { 2461 value = 2462 (UINT)(fMax((INT)hAacEncoder->extParam.userPeakBitrate, 2463 hAacEncoder->aacConfig 2464 .bitRate)); /* peak bitrate parameter is in use */ 2465 } 2466 break; 2467 2468 default: 2469 // err = MPS_INVALID_PARAMETER; 2470 break; 2471 } /* switch(param) */ 2472 2473 bail: 2474 return value; 2475 } 2476 2477 AACENC_ERROR aacEncInfo(const HANDLE_AACENCODER hAacEncoder, 2478 AACENC_InfoStruct *pInfo) { 2479 AACENC_ERROR err = AACENC_OK; 2480 2481 FDKmemclear(pInfo, sizeof(AACENC_InfoStruct)); 2482 pInfo->confSize = 64; /* pre-initialize */ 2483 2484 pInfo->maxOutBufBytes = ((hAacEncoder->nMaxAacChannels * 6144) + 7) >> 3; 2485 pInfo->maxAncBytes = hAacEncoder->aacConfig.maxAncBytesPerAU; 2486 pInfo->inBufFillLevel = 2487 hAacEncoder->nSamplesRead / hAacEncoder->extParam.nChannels; 2488 pInfo->inputChannels = hAacEncoder->extParam.nChannels; 2489 pInfo->frameLength = 2490 hAacEncoder->nSamplesToRead / hAacEncoder->extParam.nChannels; 2491 pInfo->nDelay = hAacEncoder->nDelay; 2492 pInfo->nDelayCore = hAacEncoder->nDelayCore; 2493 2494 /* Get encoder configuration */ 2495 if (aacEncGetConf(hAacEncoder, &pInfo->confSize, &pInfo->confBuf[0]) != 2496 AAC_ENC_OK) { 2497 err = AACENC_INIT_ERROR; 2498 goto bail; 2499 } 2500 bail: 2501 return err; 2502 } 2503