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