1
2/* -----------------------------------------------------------------------------------------------------------
3Software License for The Fraunhofer FDK AAC Codec Library for Android
4
5� Copyright  1995 - 2013 Fraunhofer-Gesellschaft zur F�rderung der angewandten Forschung e.V.
6  All rights reserved.
7
8 1.    INTRODUCTION
9The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements
10the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio.
11This FDK AAC Codec software is intended to be used on a wide variety of Android devices.
12
13AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual
14audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by
15independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part
16of the MPEG specifications.
17
18Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer)
19may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners
20individually for the purpose of encoding or decoding bit streams in products that are compliant with
21the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license
22these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec
23software may already be covered under those patent licenses when it is used for those licensed purposes only.
24
25Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality,
26are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional
27applications information and documentation.
28
292.    COPYRIGHT LICENSE
30
31Redistribution and use in source and binary forms, with or without modification, are permitted without
32payment of copyright license fees provided that you satisfy the following conditions:
33
34You must retain the complete text of this software license in redistributions of the FDK AAC Codec or
35your modifications thereto in source code form.
36
37You must retain the complete text of this software license in the documentation and/or other materials
38provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form.
39You must make available free of charge copies of the complete source code of the FDK AAC Codec and your
40modifications thereto to recipients of copies in binary form.
41
42The name of Fraunhofer may not be used to endorse or promote products derived from this library without
43prior written permission.
44
45You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec
46software or your modifications thereto.
47
48Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software
49and the date of any change. For modified versions of the FDK AAC Codec, the term
50"Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term
51"Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android."
52
533.    NO PATENT LICENSE
54
55NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer,
56ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with
57respect to this software.
58
59You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized
60by appropriate patent licenses.
61
624.    DISCLAIMER
63
64This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors
65"AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties
66of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
67CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages,
68including but not limited to procurement of substitute goods or services; loss of use, data, or profits,
69or business interruption, however caused and on any theory of liability, whether in contract, strict
70liability, or tort (including negligence), arising in any way out of the use of this software, even if
71advised of the possibility of such damage.
72
735.    CONTACT INFORMATION
74
75Fraunhofer Institute for Integrated Circuits IIS
76Attention: Audio and Multimedia Departments - FDK AAC LL
77Am Wolfsmantel 33
7891058 Erlangen, Germany
79
80www.iis.fraunhofer.de/amm
81amm-info@iis.fraunhofer.de
82----------------------------------------------------------------------------------------------------------- */
83
84/**************************** MPEG-4 HE-AAC Encoder *************************
85
86  Initial author:       M. Lohwasser
87  contents/description: FDK HE-AAC Encoder interface library functions
88
89****************************************************************************/
90
91#include "aacenc_lib.h"
92#include "FDK_audio.h"
93#include "aacenc.h"
94
95#include "aacEnc_ram.h"
96#include "FDK_core.h" /* FDK_tools versioning info */
97
98/* Encoder library info */
99#define AACENCODER_LIB_VL0 3
100#define AACENCODER_LIB_VL1 4
101#define AACENCODER_LIB_VL2 12
102#define AACENCODER_LIB_TITLE "AAC Encoder"
103#define AACENCODER_LIB_BUILD_DATE __DATE__
104#define AACENCODER_LIB_BUILD_TIME __TIME__
105
106
107#include "sbr_encoder.h"
108#include "../src/sbr_ram.h"
109#include "channel_map.h"
110
111#include "psy_const.h"
112#include "bitenc.h"
113
114#include "tpenc_lib.h"
115
116#include "metadata_main.h"
117
118#define SBL(fl)            (fl/8)                 /*!< Short block length (hardcoded to 8 short blocks per long block) */
119#define BSLA(fl)           (4*SBL(fl)+SBL(fl)/2)  /*!< AAC block switching look-ahead */
120#define DELAY_AAC(fl)      (fl+BSLA(fl))          /*!< MDCT + blockswitching */
121#define DELAY_AACELD(fl)   ((fl)/2)               /*!< ELD FB delay (no framing delay included) */
122
123#define INPUTBUFFER_SIZE (1537+100+2048)
124
125#define DEFAULT_HEADER_PERIOD_REPETITION_RATE  10 /*!< Default header repetition rate used in transport library and for SBR header. */
126
127////////////////////////////////////////////////////////////////////////////////////
128/**
129 * Flags to characterize encoder modules to be supported in present instance.
130 */
131enum {
132    ENC_MODE_FLAG_AAC  = 0x0001,
133    ENC_MODE_FLAG_SBR  = 0x0002,
134    ENC_MODE_FLAG_PS   = 0x0004,
135    ENC_MODE_FLAG_SAC  = 0x0008,
136    ENC_MODE_FLAG_META = 0x0010
137};
138
139////////////////////////////////////////////////////////////////////////////////////
140typedef struct {
141    AUDIO_OBJECT_TYPE userAOT;               /*!< Audio Object Type.             */
142    UINT              userSamplerate;        /*!< Sampling frequency.            */
143    UINT              nChannels;             /*!< will be set via channelMode.   */
144    CHANNEL_MODE      userChannelMode;
145    UINT              userBitrate;
146    UINT              userBitrateMode;
147    UINT              userBandwidth;
148    UINT              userAfterburner;
149    UINT              userFramelength;
150    UINT              userAncDataRate;
151
152    UCHAR             userTns;               /*!< Use TNS coding. */
153    UCHAR             userPns;               /*!< Use PNS coding. */
154    UCHAR             userIntensity;         /*!< Use Intensity coding. */
155
156    TRANSPORT_TYPE    userTpType;            /*!< Transport type */
157    UCHAR             userTpSignaling;       /*!< Extension AOT signaling mode. */
158    UCHAR             userTpNsubFrames;      /*!< Number of sub frames in a transport frame for LOAS/LATM or ADTS (default 1). */
159    UCHAR             userTpAmxv;            /*!< AudioMuxVersion to be used for LATM (default 0). */
160    UCHAR             userTpProtection;
161    UCHAR             userTpHeaderPeriod;    /*!< Parameter used to configure LATM/LOAS SMC rate. Moreover this parameters is
162                                                  used to configure repetition rate of PCE in raw_data_block. */
163
164    UCHAR             userErTools;           /*!< Use VCB11, HCR and/or RVLC ER tool. */
165    UINT              userPceAdditions;      /*!< Configure additional bits in PCE. */
166
167    UCHAR             userMetaDataMode;      /*!< Meta data library configuration. */
168
169    UCHAR             userSbrEnabled;        /*!< Enable SBR for ELD. */
170    UINT              userSbrRatio;          /*!< SBR sampling rate ratio. Dual- or single-rate. */
171
172} USER_PARAM;
173
174////////////////////////////////////////////////////////////////////////////////////
175
176/****************************************************************************
177                           Structure Definitions
178****************************************************************************/
179
180typedef struct  AACENC_CONFIG     *HANDLE_AACENC_CONFIG;
181
182
183struct AACENCODER
184{
185    USER_PARAM               extParam;
186    CODER_CONFIG             coderConfig;
187
188    /* AAC */
189    AACENC_CONFIG            aacConfig;
190    HANDLE_AAC_ENC           hAacEnc;
191
192    /* SBR */
193    HANDLE_SBR_ENCODER       hEnvEnc;
194
195    /* Meta Data */
196    HANDLE_FDK_METADATA_ENCODER  hMetadataEnc;
197    INT                          metaDataAllowed; /* Signal whether chosen configuration allows metadata. Necessary for delay
198                                                     compensation. Metadata mode is a separate parameter. */
199
200    /* Transport */
201    HANDLE_TRANSPORTENC      hTpEnc;
202
203    /* Output */
204    UCHAR                   *outBuffer;         /* Internal bitstream buffer */
205    INT                      outBufferInBytes;   /* Size of internal bitstream buffer*/
206
207    /* Input */
208    INT_PCM                 *inputBuffer;        /* Internal input buffer. Input source for AAC encoder */
209    INT                      inputBufferOffset;  /* Where to write new input samples. */
210
211    INT                      nSamplesToRead;    /* number of input samples neeeded for encoding one frame */
212    INT                      nSamplesRead;      /* number of input samples already in input buffer */
213    INT                      nZerosAppended;    /* appended zeros at end of file*/
214    INT                      nDelay;            /* encoder delay */
215
216    AACENC_EXT_PAYLOAD       extPayload [MAX_TOTAL_EXT_PAYLOADS];
217    /* Extension payload */
218    UCHAR                    extPayloadData [(1)][(8)][MAX_PAYLOAD_SIZE];
219    UINT                     extPayloadSize [(1)][(8)]; /* payload sizes in bits */
220
221    ULONG                    InitFlags;         /* internal status to treggier re-initialization */
222
223
224   /* Memory allocation info. */
225   INT                       nMaxAacElements;
226   INT                       nMaxAacChannels;
227   INT                       nMaxSbrElements;
228   INT                       nMaxSbrChannels;
229   UINT                      nMaxSubFrames;
230
231   UINT                      encoder_modis;
232
233   /* Capability flags */
234   UINT                      CAPF_tpEnc;
235
236} ;
237
238typedef struct
239{
240    ULONG               samplingRate;   /*!< Encoder output sampling rate. */
241    ULONG               bitrateRange;   /*!< Lower bitrate range for config entry. */
242
243    UCHAR               lowDelaySbr;    /*!< 0: ELD sbr off,
244                                             1: ELD sbr on */
245
246    UCHAR               downsampledSbr; /*!< 0: ELD with dualrate sbr,
247                                             1: ELD with downsampled sbr */
248
249} ELD_SBR_CONFIGURATOR;
250
251/**
252 * \brief  This table defines ELD/SBR default configurations.
253 */
254static const ELD_SBR_CONFIGURATOR eldSbrAutoConfigTab[] =
255{
256  { 48000,     0, 1, 0 },
257  { 48000, 64001, 0, 0 },
258
259  { 44100,     0, 1, 0 },
260  { 44100, 64001, 0, 0 },
261
262  { 32000,     0, 1, 0 },
263  { 32000, 28000, 1, 1 },
264  { 32000, 56000, 0, 0 },
265
266  { 24000,     0, 1, 1 },
267  { 24000, 40000, 0, 0 },
268
269  { 16000,     0, 1, 1 },
270  { 16000, 28000, 0, 0 }
271
272};
273
274/*
275 * \brief  Configure SBR for ELD configuration.
276 *
277 * This function finds default SBR configuration for ELD based on sampling rate and channel bitrate.
278 * Outputparameters are SBR on/off, and SBR ratio.
279 *
280 * \param samplingRate          Audio signal sampling rate.
281 * \param channelMode           Channel configuration to be used.
282 * \param totalBitrate          Overall bitrate.
283 * \param eldSbr                Pointer to eldSbr parameter, filled on return.
284 * \param eldSbrRatio           Pointer to eldSbrRatio parameter, filled on return.
285 *
286 * \return - AACENC_OK, all fine.
287 *         - AACENC_INVALID_CONFIG, on failure.
288 */
289static AACENC_ERROR eldSbrConfigurator(
290        const ULONG                      samplingRate,
291        const CHANNEL_MODE               channelMode,
292        const ULONG                      totalBitrate,
293        UINT * const                     eldSbr,
294        UINT * const                     eldSbrRatio
295        )
296{
297    AACENC_ERROR err = AACENC_OK;
298    int i, cfgIdx = -1;
299    const ULONG channelBitrate = totalBitrate / FDKaacEnc_GetChannelModeConfiguration(channelMode)->nChannelsEff;
300
301    for (i=0; i<(sizeof(eldSbrAutoConfigTab)/sizeof(ELD_SBR_CONFIGURATOR)); i++) {
302      if ( (samplingRate <= eldSbrAutoConfigTab[i].samplingRate)
303        && (channelBitrate >= eldSbrAutoConfigTab[i].bitrateRange) )
304      {
305        cfgIdx = i;
306      }
307    }
308
309    if (cfgIdx != -1) {
310      *eldSbr      = (eldSbrAutoConfigTab[cfgIdx].lowDelaySbr==0) ? 0 : 1;
311      *eldSbrRatio = (eldSbrAutoConfigTab[cfgIdx].downsampledSbr==0) ? 2 : 1;
312    }
313    else {
314      err = AACENC_INVALID_CONFIG; /* no default configuration for eld-sbr available. */
315    }
316
317    return err;
318}
319
320static inline INT isSbrActive(const HANDLE_AACENC_CONFIG hAacConfig)
321{
322    INT sbrUsed = 0;
323
324    if ( (hAacConfig->audioObjectType==AOT_SBR)         || (hAacConfig->audioObjectType==AOT_PS)
325      || (hAacConfig->audioObjectType==AOT_MP2_SBR)     || (hAacConfig->audioObjectType==AOT_MP2_PS)
326      || (hAacConfig->audioObjectType==AOT_DABPLUS_SBR) || (hAacConfig->audioObjectType==AOT_DABPLUS_PS)
327      || (hAacConfig->audioObjectType==AOT_DRM_SBR)     || (hAacConfig->audioObjectType==AOT_DRM_MPEG_PS) )
328    {
329        sbrUsed = 1;
330    }
331    if (hAacConfig->audioObjectType == AOT_ER_AAC_ELD && (hAacConfig->syntaxFlags & AC_SBR_PRESENT))
332    {
333        sbrUsed = 1;
334    }
335
336    return ( sbrUsed );
337}
338
339static inline INT isPsActive(const AUDIO_OBJECT_TYPE audioObjectType)
340{
341    INT psUsed = 0;
342
343    if ( (audioObjectType==AOT_PS)
344      || (audioObjectType==AOT_MP2_PS)
345      || (audioObjectType==AOT_DABPLUS_PS)
346      || (audioObjectType==AOT_DRM_MPEG_PS) )
347    {
348        psUsed = 1;
349    }
350
351    return ( psUsed );
352}
353
354static SBR_PS_SIGNALING getSbrSignalingMode(
355        const AUDIO_OBJECT_TYPE          audioObjectType,
356        const TRANSPORT_TYPE             transportType,
357        const UCHAR                      transportSignaling,
358        const UINT                       sbrRatio
359        )
360
361{
362  SBR_PS_SIGNALING sbrSignaling;
363
364  if (transportType==TT_UNKNOWN || sbrRatio==0) {
365    sbrSignaling = SIG_UNKNOWN; /* Needed parameters have not been set */
366    return sbrSignaling;
367  } else {
368    sbrSignaling = SIG_IMPLICIT; /* default: implicit signaling */
369  }
370
371  if ((audioObjectType==AOT_AAC_LC)     || (audioObjectType==AOT_SBR)     || (audioObjectType==AOT_PS)    ||
372      (audioObjectType==AOT_MP2_AAC_LC) || (audioObjectType==AOT_MP2_SBR) || (audioObjectType==AOT_MP2_PS) ) {
373    switch (transportType) {
374      case TT_MP4_ADIF:
375      case TT_MP4_ADTS:
376        sbrSignaling = SIG_IMPLICIT; /* For MPEG-2 transport types, only implicit signaling is possible */
377        break;
378
379      case TT_MP4_RAW:
380      case TT_MP4_LATM_MCP1:
381      case TT_MP4_LATM_MCP0:
382      case TT_MP4_LOAS:
383      default:
384        if ( transportSignaling==0xFF ) {
385          /* Defaults */
386          if ( sbrRatio==1 ) {
387            sbrSignaling = SIG_EXPLICIT_HIERARCHICAL; /* For downsampled SBR, explicit signaling is mandatory */
388          } else {
389            sbrSignaling = SIG_IMPLICIT; /* For dual-rate SBR, implicit signaling is default */
390          }
391        } else {
392          /* User set parameters */
393          /* Attention: Backward compatible explicit signaling does only work with AMV1 for LATM/LOAS */
394          sbrSignaling = (SBR_PS_SIGNALING)transportSignaling;
395        }
396        break;
397    }
398  }
399
400  return sbrSignaling;
401}
402
403/****************************************************************************
404                               Allocate Encoder
405****************************************************************************/
406
407H_ALLOC_MEM (_AacEncoder, AACENCODER)
408C_ALLOC_MEM (_AacEncoder, AACENCODER, 1)
409
410
411
412
413/*
414 * Map Encoder specific config structures to CODER_CONFIG.
415 */
416static void FDKaacEnc_MapConfig(
417        CODER_CONFIG *const              cc,
418        const USER_PARAM *const          extCfg,
419        const SBR_PS_SIGNALING           sbrSignaling,
420        const HANDLE_AACENC_CONFIG       hAacConfig
421        )
422{
423  AUDIO_OBJECT_TYPE transport_AOT = AOT_NULL_OBJECT;
424  FDKmemclear(cc, sizeof(CODER_CONFIG));
425
426  cc->flags = 0;
427
428  /* Map virtual aot to transport aot. */
429  switch (hAacConfig->audioObjectType) {
430    case AOT_MP2_AAC_LC:
431      transport_AOT = AOT_AAC_LC;
432      break;
433    case AOT_MP2_SBR:
434      transport_AOT = AOT_SBR;
435      cc->flags |= CC_SBR;
436     break;
437    case AOT_MP2_PS:
438      transport_AOT = AOT_PS;
439      cc->flags |= CC_SBR;
440      break;
441    default:
442      transport_AOT = hAacConfig->audioObjectType;
443  }
444
445  if (hAacConfig->audioObjectType == AOT_ER_AAC_ELD) {
446    cc->flags |= (hAacConfig->syntaxFlags & AC_SBR_PRESENT) ? CC_SBR : 0;
447  }
448
449  /* transport type is usually AAC-LC. */
450  if ( (transport_AOT == AOT_SBR) || (transport_AOT == AOT_PS) ) {
451    cc->aot           = AOT_AAC_LC;
452  }
453  else {
454    cc->aot           = transport_AOT;
455  }
456
457  /* Configure extension aot. */
458  if (sbrSignaling==SIG_IMPLICIT) {
459    cc->extAOT = AOT_NULL_OBJECT;  /* implicit */
460  }
461  else {
462    if ( (sbrSignaling==SIG_EXPLICIT_BW_COMPATIBLE) && ( (transport_AOT==AOT_SBR) || (transport_AOT==AOT_PS) ) ) {
463      cc->extAOT = AOT_SBR;        /* explicit backward compatible */
464    }
465    else {
466      cc->extAOT = transport_AOT;  /* explicit hierarchical */
467    }
468  }
469
470  if ( (transport_AOT==AOT_SBR) || (transport_AOT==AOT_PS) ) {
471    cc->sbrPresent=1;
472    if (transport_AOT==AOT_PS) {
473      cc->psPresent=1;
474    }
475  }
476  cc->sbrSignaling    = sbrSignaling;
477
478  cc->extSamplingRate = extCfg->userSamplerate;
479  cc->bitRate         = hAacConfig->bitRate;
480  cc->noChannels      = hAacConfig->nChannels;
481  cc->flags          |= CC_IS_BASELAYER;
482  cc->channelMode     = hAacConfig->channelMode;
483
484  cc->nSubFrames = (hAacConfig->nSubFrames > 1 && extCfg->userTpNsubFrames == 1)
485                 ? hAacConfig->nSubFrames
486                 : extCfg->userTpNsubFrames;
487
488  cc->flags          |= (extCfg->userTpProtection) ? CC_PROTECTION : 0;
489
490  if (extCfg->userTpHeaderPeriod!=0xFF) {
491    cc->headerPeriod    = extCfg->userTpHeaderPeriod;
492  }
493  else { /* auto-mode */
494    switch (extCfg->userTpType) {
495      case TT_MP4_ADTS:
496      case TT_MP4_LOAS:
497      case TT_MP4_LATM_MCP1:
498        cc->headerPeriod = DEFAULT_HEADER_PERIOD_REPETITION_RATE;
499        break;
500      default:
501        cc->headerPeriod = 0;
502    }
503  }
504
505  cc->samplesPerFrame = hAacConfig->framelength;
506  cc->samplingRate    = hAacConfig->sampleRate;
507
508  /* Mpeg-4 signaling for transport library. */
509  switch ( hAacConfig->audioObjectType ) {
510    case AOT_MP2_AAC_LC:
511    case AOT_MP2_SBR:
512    case AOT_MP2_PS:
513      cc->flags &= ~CC_MPEG_ID; /* Required for ADTS. */
514      cc->extAOT = AOT_NULL_OBJECT;
515      break;
516    default:
517      cc->flags |= CC_MPEG_ID;
518  }
519
520  /* ER-tools signaling. */
521  cc->flags     |= (hAacConfig->syntaxFlags & AC_ER_VCB11) ? CC_VCB11 : 0;
522  cc->flags     |= (hAacConfig->syntaxFlags & AC_ER_HCR)   ? CC_HCR : 0;
523  cc->flags     |= (hAacConfig->syntaxFlags & AC_ER_RVLC)  ? CC_RVLC : 0;
524
525  /* Matrix mixdown coefficient configuration. */
526  if ( (extCfg->userPceAdditions&0x1) && (hAacConfig->epConfig==-1)
527      && ((cc->channelMode==MODE_1_2_2)||(cc->channelMode==MODE_1_2_2_1)) )
528  {
529    cc->matrixMixdownA       = ((extCfg->userPceAdditions>>1)&0x3)+1;
530    cc->flags |= (extCfg->userPceAdditions>>3)&0x1 ? CC_PSEUDO_SURROUND : 0;
531  }
532  else {
533    cc->matrixMixdownA = 0;
534  }
535}
536
537/*
538 * Examine buffer descriptor regarding choosen identifier.
539 *
540 * \param pBufDesc              Pointer to buffer descriptor
541 * \param identifier            Buffer identifier to look for.
542
543 * \return - Buffer descriptor index.
544 *         -1, if there is no entry available.
545 */
546static INT getBufDescIdx(
547        const AACENC_BufDesc         *pBufDesc,
548        const AACENC_BufferIdentifier identifier
549)
550{
551    INT i, idx = -1;
552
553    for (i=0; i<pBufDesc->numBufs; i++) {
554      if ( (AACENC_BufferIdentifier)pBufDesc->bufferIdentifiers[i] == identifier ) {
555        idx = i;
556        break;
557      }
558    }
559    return idx;
560}
561
562
563/****************************************************************************
564                          Function Declarations
565****************************************************************************/
566
567AAC_ENCODER_ERROR aacEncDefaultConfig(HANDLE_AACENC_CONFIG hAacConfig,
568                                      USER_PARAM *config)
569{
570    /* make reasonable default settings */
571    FDKaacEnc_AacInitDefaultConfig (hAacConfig);
572
573    /* clear configuration structure and copy default settings */
574    FDKmemclear(config, sizeof(USER_PARAM));
575
576    /* copy encoder configuration settings */
577    config->nChannels       = hAacConfig->nChannels;
578    config->userAOT = hAacConfig->audioObjectType = AOT_AAC_LC;
579    config->userSamplerate  = hAacConfig->sampleRate;
580    config->userChannelMode = hAacConfig->channelMode;
581    config->userBitrate     = hAacConfig->bitRate;
582    config->userBitrateMode = hAacConfig->bitrateMode;
583    config->userBandwidth   = hAacConfig->bandWidth;
584    config->userTns         = hAacConfig->useTns;
585    config->userPns         = hAacConfig->usePns;
586    config->userIntensity   = hAacConfig->useIS;
587    config->userAfterburner = hAacConfig->useRequant;
588    config->userFramelength = (UINT)-1;
589
590    if (hAacConfig->syntaxFlags & AC_ER_VCB11) {
591      config->userErTools  |= 0x01;
592    }
593    if (hAacConfig->syntaxFlags & AC_ER_HCR) {
594      config->userErTools  |= 0x02;
595    }
596
597    /* initialize transport parameters */
598    config->userTpType         = TT_UNKNOWN;
599    config->userTpAmxv         = 0;
600    config->userTpSignaling    = 0xFF;    /* choose signaling automatically */
601    config->userTpNsubFrames   = 1;
602    config->userTpProtection   = 0;    /* not crc protected*/
603    config->userTpHeaderPeriod = 0xFF; /* header period in auto mode */
604    config->userPceAdditions   = 0;    /* no matrix mixdown coefficient */
605    config->userMetaDataMode   = 0;    /* do not embed any meta data info */
606
607    config->userAncDataRate    = 0;
608
609    /* SBR rate is set to 0 here, which means it should be set automatically
610       in FDKaacEnc_AdjustEncSettings() if the user did not set a rate
611       expilicitely. */
612    config->userSbrRatio = 0;
613
614    /* SBR enable set to -1 means to inquire ELD audio configurator for reasonable configuration. */
615    config->userSbrEnabled     = -1;
616
617    return AAC_ENC_OK;
618}
619
620static
621void aacEncDistributeSbrBits(CHANNEL_MAPPING *channelMapping, SBR_ELEMENT_INFO *sbrElInfo, INT bitRate)
622{
623  INT codebits = bitRate;
624  int el;
625
626  /* Copy Element info */
627  for (el=0; el<channelMapping->nElements; el++) {
628      sbrElInfo[el].ChannelIndex[0] = channelMapping->elInfo[el].ChannelIndex[0];
629      sbrElInfo[el].ChannelIndex[1] = channelMapping->elInfo[el].ChannelIndex[1];
630      sbrElInfo[el].elType          = channelMapping->elInfo[el].elType;
631      sbrElInfo[el].bitRate         = (INT)(fMultNorm(channelMapping->elInfo[el].relativeBits, (FIXP_DBL)bitRate));
632      sbrElInfo[el].instanceTag     = channelMapping->elInfo[el].instanceTag;
633      sbrElInfo[el].nChannelsInEl   = channelMapping->elInfo[el].nChannelsInEl;
634
635      codebits -= sbrElInfo[el].bitRate;
636  }
637  sbrElInfo[0].bitRate += codebits;
638}
639
640
641static
642INT aacEncoder_LimitBitrate(
643        const HANDLE_TRANSPORTENC hTpEnc,
644        const INT samplingRate,
645        const INT frameLength,
646        const INT nChannels,
647        const CHANNEL_MODE channelMode,
648        INT bitRate,
649        const INT nSubFrames,
650        const INT sbrActive,
651        const INT sbrDownSampleRate,
652        const AUDIO_OBJECT_TYPE aot
653        )
654{
655  INT coreSamplingRate;
656  CHANNEL_MAPPING cm;
657
658  FDKaacEnc_InitChannelMapping(channelMode, CH_ORDER_MPEG, &cm);
659
660  if (sbrActive) {
661    coreSamplingRate = samplingRate >>  (sbrEncoder_IsSingleRatePossible(aot) ? (sbrDownSampleRate-1):1);
662  } else {
663    coreSamplingRate = samplingRate;
664  }
665
666  /* Consider bandwidth channel bit rate limit (see bandwidth.cpp: GetBandwidthEntry()) */
667  if (aot == AOT_ER_AAC_LD || aot == AOT_ER_AAC_ELD) {
668    bitRate = FDKmin(360000*nChannels, bitRate);
669    bitRate = FDKmax(8000*nChannels, bitRate);
670  }
671
672  if (aot == AOT_AAC_LC || aot == AOT_SBR || aot == AOT_PS)  {
673    bitRate = FDKmin(576000*nChannels, bitRate);
674    /*bitRate = FDKmax(0*nChannels, bitRate);*/
675  }
676
677
678  /* Limit bit rate in respect to the core coder */
679  bitRate = FDKaacEnc_LimitBitrate(
680          hTpEnc,
681          coreSamplingRate,
682          frameLength,
683          nChannels,
684          cm.nChannelsEff,
685          bitRate,
686          -1,
687          NULL,
688          -1,
689          nSubFrames
690          );
691
692  /* Limit bit rate in respect to available SBR modes if active */
693  if (sbrActive)
694  {
695    int numIterations = 0;
696    INT initialBitrate, adjustedBitrate;
697    initialBitrate = adjustedBitrate = bitRate;
698
699    /* Find total bitrate which provides valid configuration for each SBR element. */
700    do {
701      int e;
702      SBR_ELEMENT_INFO sbrElInfo[(8)];
703      FDK_ASSERT(cm.nElements <= (8));
704
705      initialBitrate = adjustedBitrate;
706
707      /* Get bit rate for each SBR element */
708      aacEncDistributeSbrBits(&cm, sbrElInfo, initialBitrate);
709
710      for (e=0; e<cm.nElements; e++)
711      {
712        INT sbrElementBitRateIn, sbrBitRateOut;
713
714        if (cm.elInfo[e].elType != ID_SCE && cm.elInfo[e].elType != ID_CPE) {
715          continue;
716        }
717        sbrElementBitRateIn = sbrElInfo[e].bitRate;
718        sbrBitRateOut = sbrEncoder_LimitBitRate(sbrElementBitRateIn , cm.elInfo[e].nChannelsInEl, coreSamplingRate, aot);
719        if (sbrBitRateOut == 0) {
720          return 0;
721        }
722
723        /* If bitrates don't match, distribution and limiting needs to be determined again.
724           Abort element loop and restart with adapted bitrate. */
725        if (sbrElementBitRateIn != sbrBitRateOut) {
726
727          if (sbrElementBitRateIn < sbrBitRateOut) {
728            adjustedBitrate = fMax(initialBitrate, (INT)fDivNorm((FIXP_DBL)(sbrBitRateOut+8), cm.elInfo[e].relativeBits));
729            break;
730          }
731
732          if (sbrElementBitRateIn > sbrBitRateOut) {
733            adjustedBitrate = fMin(initialBitrate, (INT)fDivNorm((FIXP_DBL)(sbrBitRateOut-8), cm.elInfo[e].relativeBits));
734            break;
735          }
736
737        } /* sbrElementBitRateIn != sbrBitRateOut */
738
739      } /* elements */
740
741      numIterations++; /* restrict iteration to worst case of num elements */
742
743    } while ( (initialBitrate!=adjustedBitrate) && (numIterations<=cm.nElements) );
744
745    /* Unequal bitrates mean that no reasonable bitrate configuration found. */
746    bitRate = (initialBitrate==adjustedBitrate) ? adjustedBitrate : 0;
747  }
748
749  FDK_ASSERT(bitRate > 0);
750
751  return bitRate;
752}
753
754/*
755 * \brief Consistency check of given USER_PARAM struct and
756 *   copy back configuration from public struct into internal
757 *   encoder configuration struct.
758 *
759 * \hAacEncoder Internal encoder config which is to be updated
760 * \param config User provided config (public struct)
761 * \return �returns always AAC_ENC_OK
762 */
763static
764AACENC_ERROR FDKaacEnc_AdjustEncSettings(HANDLE_AACENCODER hAacEncoder,
765                                         USER_PARAM *config)
766{
767    AACENC_ERROR err = AACENC_OK;
768
769    /* Get struct pointers. */
770    HANDLE_AACENC_CONFIG    hAacConfig = &hAacEncoder->aacConfig;
771
772    hAacConfig->nChannels       = config->nChannels;
773
774    /* Encoder settings update. */
775    hAacConfig->sampleRate      = config->userSamplerate;
776    hAacConfig->useTns          = config->userTns;
777    hAacConfig->usePns          = config->userPns;
778    hAacConfig->useIS           = config->userIntensity;
779    hAacConfig->bitRate         = config->userBitrate;
780    hAacConfig->channelMode     = config->userChannelMode;
781    hAacConfig->bitrateMode     = config->userBitrateMode;
782    hAacConfig->bandWidth       = config->userBandwidth;
783    hAacConfig->useRequant      = config->userAfterburner;
784
785    hAacConfig->audioObjectType = config->userAOT;
786    hAacConfig->anc_Rate        = config->userAncDataRate;
787    hAacConfig->syntaxFlags     = 0;
788    hAacConfig->epConfig        = -1;
789
790    /* Adapt internal AOT when necessary. */
791    switch ( hAacConfig->audioObjectType ) {
792      case AOT_MP2_AAC_LC:
793      case AOT_MP2_SBR:
794      case AOT_MP2_PS:
795          hAacConfig->usePns = 0;
796      case AOT_AAC_LC:
797      case AOT_SBR:
798      case AOT_PS:
799          config->userTpType = (config->userTpType!=TT_UNKNOWN) ? config->userTpType : TT_MP4_ADTS;
800          hAacConfig->framelength = (config->userFramelength!=(UINT)-1) ? config->userFramelength : 1024;
801          if (hAacConfig->framelength != 1024) {
802            return AACENC_INVALID_CONFIG;
803          }
804          break;
805      case AOT_ER_AAC_LD:
806          hAacConfig->epConfig = 0;
807          hAacConfig->syntaxFlags |= AC_ER|AC_LD;
808          hAacConfig->syntaxFlags |= ((config->userErTools & 0x1) ? AC_ER_VCB11 : 0);
809          hAacConfig->syntaxFlags |= ((config->userErTools & 0x2) ? AC_ER_HCR : 0);
810          hAacConfig->syntaxFlags |= ((config->userErTools & 0x4) ? AC_ER_RVLC : 0);
811          config->userTpType = (config->userTpType!=TT_UNKNOWN) ? config->userTpType : TT_MP4_LOAS;
812          hAacConfig->framelength = (config->userFramelength!=(UINT)-1) ? config->userFramelength : 512;
813          if (hAacConfig->framelength != 512 && hAacConfig->framelength != 480) {
814            return AACENC_INVALID_CONFIG;
815          }
816          break;
817      case AOT_ER_AAC_ELD:
818          hAacConfig->epConfig = 0;
819          hAacConfig->syntaxFlags |= AC_ER|AC_ELD;
820          hAacConfig->syntaxFlags |= ((config->userErTools & 0x1) ? AC_ER_VCB11 : 0);
821          hAacConfig->syntaxFlags |= ((config->userErTools & 0x2) ? AC_ER_HCR : 0);
822          hAacConfig->syntaxFlags |= ((config->userErTools & 0x4) ? AC_ER_RVLC : 0);
823          hAacConfig->syntaxFlags |= ((config->userSbrEnabled==1)  ? AC_SBR_PRESENT : 0);
824          config->userTpType = (config->userTpType!=TT_UNKNOWN) ? config->userTpType : TT_MP4_LOAS;
825          hAacConfig->framelength = (config->userFramelength!=(UINT)-1) ? config->userFramelength : 512;
826          if (hAacConfig->framelength != 512 && hAacConfig->framelength != 480) {
827            return AACENC_INVALID_CONFIG;
828          }
829          break;
830      default:
831          break;
832    }
833
834    switch ( hAacConfig->audioObjectType ) {
835      case AOT_ER_AAC_LD:
836      case AOT_ER_AAC_ELD:
837        if (config->userBitrateMode==8) {
838          hAacConfig->bitrateMode = 0;
839        }
840        if (config->userBitrateMode==0) {
841          hAacConfig->bitreservoir = 100*config->nChannels; /* default, reduced bitreservoir */
842        }
843        if (hAacConfig->bitrateMode!=0) {
844          return AACENC_INVALID_CONFIG;
845        }
846        break;
847      default:
848        break;
849    }
850
851    hAacConfig->bitRate = config->userBitrate;
852
853    /* get bitrate in VBR configuration */
854    if ( (hAacConfig->bitrateMode>=1) && (hAacConfig->bitrateMode<=5) ) {
855        /* In VBR mode; SBR-modul depends on bitrate, core encoder on bitrateMode. */
856        hAacConfig->bitRate = FDKaacEnc_GetVBRBitrate(hAacConfig->bitrateMode, hAacConfig->channelMode);
857    }
858
859
860
861    /* Set default bitrate if no external bitrate declared. */
862    if ( (hAacConfig->bitrateMode==0) && (config->userBitrate==(UINT)-1) ) {
863        INT bitrate = FDKaacEnc_GetChannelModeConfiguration(hAacConfig->channelMode)->nChannelsEff * hAacConfig->sampleRate;
864
865        if ( isPsActive(hAacConfig->audioObjectType) ) {
866          hAacConfig->bitRate = (bitrate>>1);                  /* 0.5 bit per sample */
867        }
868        else if ( isSbrActive(hAacConfig) )
869        {
870          if ( (config->userSbrRatio==2) || ((config->userSbrRatio==0)&&(hAacConfig->audioObjectType!=AOT_ER_AAC_ELD)) ) {
871            hAacConfig->bitRate = (bitrate + (bitrate>>2))>>1; /* 0.625 bits per sample */
872          }
873          if ( (config->userSbrRatio==1) || ((config->userSbrRatio==0)&&(hAacConfig->audioObjectType==AOT_ER_AAC_ELD)) ) {
874            hAacConfig->bitRate = (bitrate + (bitrate>>3));    /* 1.125 bits per sample */
875          }
876        } else
877        {
878                hAacConfig->bitRate = bitrate + (bitrate>>1);        /* 1.5 bits per sample */
879        }
880    }
881
882    /* Initialize SBR parameters */
883    if ( (hAacConfig->audioObjectType==AOT_ER_AAC_ELD)
884      && (config->userSbrEnabled == (UCHAR)-1) && (config->userSbrRatio==0) )
885    {
886      UINT eldSbr = 0;
887      UINT eldSbrRatio = 0;
888
889      if ( AACENC_OK!=(err=eldSbrConfigurator(
890            hAacConfig->sampleRate,
891            hAacConfig->channelMode,
892            hAacConfig->bitRate,
893           &eldSbr,
894           &eldSbrRatio)) )
895      {
896        return err;
897      }
898
899      hAacConfig->syntaxFlags |= ((eldSbr) ? AC_SBR_PRESENT : 0);
900      hAacConfig->sbrRatio = eldSbrRatio;
901    }
902    else
903    if ( (config->userSbrRatio==0) && (isSbrActive(hAacConfig)) ) {
904      /* Automatic SBR ratio configuration
905       * - downsampled SBR for ELD
906       * - otherwise always dualrate SBR
907       */
908        hAacConfig->sbrRatio = (hAacConfig->audioObjectType==AOT_ER_AAC_ELD) ? 1 : 2;
909    }
910    else {
911      /* SBR ratio has been set by the user, so use it. */
912      hAacConfig->sbrRatio = config->userSbrRatio;
913    }
914
915    {
916      UCHAR tpSignaling=getSbrSignalingMode(hAacConfig->audioObjectType, config->userTpType, config->userTpSignaling, hAacConfig->sbrRatio);
917
918      if ( (hAacConfig->audioObjectType==AOT_AAC_LC || hAacConfig->audioObjectType==AOT_SBR || hAacConfig->audioObjectType==AOT_PS) &&
919           (config->userTpType==TT_MP4_LATM_MCP1 || config->userTpType==TT_MP4_LATM_MCP0 || config->userTpType==TT_MP4_LOAS) &&
920           (tpSignaling==1) && (config->userTpAmxv==0) ) {
921             /* For backward compatible explicit signaling, AMV1 has to be active */
922             return AACENC_INVALID_CONFIG;
923      }
924
925      if ( (hAacConfig->audioObjectType==AOT_AAC_LC || hAacConfig->audioObjectType==AOT_SBR || hAacConfig->audioObjectType==AOT_PS) &&
926           (tpSignaling==0) && (hAacConfig->sbrRatio==1)) {
927             /* Downsampled SBR has to be signaled explicitely (for transmission of SBR sampling fequency) */
928             return AACENC_INVALID_CONFIG;
929      }
930    }
931
932
933
934    /* We need the frame length to call aacEncoder_LimitBitrate() */
935    hAacConfig->bitRate = aacEncoder_LimitBitrate(
936              NULL,
937              hAacConfig->sampleRate,
938              hAacConfig->framelength,
939              hAacConfig->nChannels,
940              hAacConfig->channelMode,
941              hAacConfig->bitRate,
942              hAacConfig->nSubFrames,
943              isSbrActive(hAacConfig),
944              hAacConfig->sbrRatio,
945              hAacConfig->audioObjectType
946              );
947
948    /* Configure PNS */
949    if ( ((hAacConfig->bitrateMode>=1) && (hAacConfig->bitrateMode<=5)) /* VBR without PNS. */
950        || (hAacConfig->useTns == 0) )                                  /* TNS required. */
951    {
952        hAacConfig->usePns = 0;
953    }
954
955    if (hAacConfig->epConfig >= 0) {
956        hAacConfig->syntaxFlags |= AC_ER;
957         if (((INT)hAacConfig->channelMode < 1) || ((INT)hAacConfig->channelMode > 7)) {
958           return AACENC_INVALID_CONFIG;        /* Cannel config 0 not supported. */
959         }
960    }
961
962    if ( FDKaacEnc_DetermineEncoderMode(&hAacConfig->channelMode, hAacConfig->nChannels) != AAC_ENC_OK) {
963        return AACENC_INVALID_CONFIG;        /* nChannels doesn't match chMode, this is just a check-up */
964    }
965
966    if ( (hAacConfig->nChannels > hAacEncoder->nMaxAacChannels)
967      || ( (FDKaacEnc_GetChannelModeConfiguration(hAacConfig->channelMode)->nChannelsEff > hAacEncoder->nMaxSbrChannels) &&
968            isSbrActive(hAacConfig) )
969         )
970    {
971        return AACENC_INVALID_CONFIG;      /* not enough channels allocated */
972    }
973
974    /* Meta data restriction. */
975    switch (hAacConfig->audioObjectType)
976    {
977      /* Allow metadata support */
978      case AOT_AAC_LC:
979      case AOT_SBR:
980      case AOT_PS:
981        hAacEncoder->metaDataAllowed = 1;
982        if (((INT)hAacConfig->channelMode < 1) || ((INT)hAacConfig->channelMode > 7)) {
983          config->userMetaDataMode = 0;
984        }
985        break;
986      /* Prohibit metadata support */
987      default:
988        hAacEncoder->metaDataAllowed = 0;
989    }
990
991    return err;
992}
993
994static
995INT aacenc_SbrCallback(
996        void *                  self,
997        HANDLE_FDK_BITSTREAM    hBs,
998        const INT sampleRateIn,
999        const INT sampleRateOut,
1000        const INT samplesPerFrame,
1001        const AUDIO_OBJECT_TYPE coreCodec,
1002        const MP4_ELEMENT_ID    elementID,
1003        const INT               elementIndex
1004        )
1005{
1006  HANDLE_AACENCODER hAacEncoder = (HANDLE_AACENCODER)self;
1007
1008  sbrEncoder_GetHeader(hAacEncoder->hEnvEnc, hBs, elementIndex, 0);
1009
1010  return 0;
1011}
1012
1013static AACENC_ERROR aacEncInit(HANDLE_AACENCODER  hAacEncoder,
1014                               ULONG              InitFlags,
1015                               USER_PARAM        *config)
1016{
1017    AACENC_ERROR err = AACENC_OK;
1018
1019    INT aacBufferOffset = 0;
1020    HANDLE_SBR_ENCODER     *hSbrEncoder = &hAacEncoder->hEnvEnc;
1021    HANDLE_AACENC_CONFIG    hAacConfig  = &hAacEncoder->aacConfig;
1022
1023    hAacEncoder->nZerosAppended = 0;          /* count appended zeros */
1024
1025    INT frameLength = hAacConfig->framelength;
1026
1027    if ( (InitFlags & AACENC_INIT_CONFIG) )
1028    {
1029        CHANNEL_MODE prevChMode = hAacConfig->channelMode;
1030
1031        /* Verify settings and update: config -> heAacEncoder */
1032        if ( (err=FDKaacEnc_AdjustEncSettings(hAacEncoder, config)) != AACENC_OK ) {
1033            return err;
1034        }
1035        frameLength = hAacConfig->framelength; /* adapt temporal framelength */
1036
1037        /* Seamless channel reconfiguration in sbr not fully implemented */
1038        if ( (prevChMode!=hAacConfig->channelMode) && isSbrActive(hAacConfig) ) {
1039            InitFlags |= AACENC_INIT_STATES;
1040        }
1041    }
1042
1043    /* Clear input buffer */
1044    if ( (InitFlags == AACENC_INIT_ALL) ) {
1045        FDKmemclear(hAacEncoder->inputBuffer, sizeof(INT_PCM)*hAacEncoder->nMaxAacChannels*INPUTBUFFER_SIZE);
1046    }
1047
1048    if ( (InitFlags & AACENC_INIT_CONFIG) )
1049    {
1050        aacBufferOffset = 0;
1051        if (hAacConfig->audioObjectType == AOT_ER_AAC_ELD) {
1052            hAacEncoder->nDelay = DELAY_AACELD(hAacConfig->framelength);
1053        } else
1054        {
1055            hAacEncoder->nDelay = DELAY_AAC(hAacConfig->framelength); /* AAC encoder delay */
1056        }
1057        hAacConfig->ancDataBitRate = 0;
1058    }
1059
1060    if ( isSbrActive(hAacConfig) &&
1061        ((InitFlags & AACENC_INIT_CONFIG) || (InitFlags & AACENC_INIT_STATES)) )
1062    {
1063        INT sbrError;
1064        SBR_ELEMENT_INFO sbrElInfo[(8)];
1065        CHANNEL_MAPPING channelMapping;
1066
1067        if ( FDKaacEnc_InitChannelMapping(hAacConfig->channelMode,
1068                                          hAacConfig->channelOrder,
1069                                         &channelMapping) != AAC_ENC_OK )
1070        {
1071            return AACENC_INIT_ERROR;
1072        }
1073
1074        /* Check return value and if the SBR encoder can handle enough elements */
1075        if (channelMapping.nElements > (8)) {
1076            return AACENC_INIT_ERROR;
1077        }
1078
1079        aacEncDistributeSbrBits(&channelMapping, sbrElInfo, hAacConfig->bitRate);
1080
1081        UINT initFlag = 0;
1082        initFlag += (InitFlags & AACENC_INIT_STATES) ? 1 : 0;
1083
1084        /* Let the SBR encoder take a look at the configuration and change if required. */
1085        sbrError = sbrEncoder_Init(
1086                                *hSbrEncoder,
1087                                 sbrElInfo,
1088                                 channelMapping.nElements,
1089                                 hAacEncoder->inputBuffer,
1090                                &hAacConfig->bandWidth,
1091                                &aacBufferOffset,
1092                                &hAacConfig->nChannels,
1093                                &hAacConfig->sampleRate,
1094                                &hAacConfig->sbrRatio,
1095                                &frameLength,
1096                                 hAacConfig->audioObjectType,
1097                                &hAacEncoder->nDelay,
1098                                 (hAacConfig->audioObjectType == AOT_ER_AAC_ELD) ? 1 : TRANS_FAC,
1099                                 (config->userTpHeaderPeriod!=0xFF) ? config->userTpHeaderPeriod : DEFAULT_HEADER_PERIOD_REPETITION_RATE,
1100                                 initFlag
1101                                );
1102
1103        /* Suppress AOT reconfiguration and check error status. */
1104        if (sbrError) {
1105            return AACENC_INIT_SBR_ERROR;
1106        }
1107
1108        if (hAacConfig->nChannels == 1) {
1109            hAacConfig->channelMode = MODE_1;
1110        }
1111
1112        /* Never use PNS if SBR is active */
1113        if ( hAacConfig->usePns ) {
1114           hAacConfig->usePns = 0;
1115        }
1116
1117        /* estimated bitrate consumed by SBR or PS */
1118        hAacConfig->ancDataBitRate = sbrEncoder_GetEstimateBitrate(*hSbrEncoder) ;
1119
1120    } /* sbr initialization */
1121
1122
1123    /*
1124     * Initialize Transport - Module.
1125     */
1126    if ( (InitFlags & AACENC_INIT_TRANSPORT) )
1127    {
1128        UINT flags = 0;
1129
1130        FDKaacEnc_MapConfig(
1131                &hAacEncoder->coderConfig,
1132                config,
1133                getSbrSignalingMode(hAacConfig->audioObjectType, config->userTpType, config->userTpSignaling, hAacConfig->sbrRatio),
1134                hAacConfig);
1135
1136        /* create flags for transport encoder */
1137        if (config->userTpAmxv == 1) {
1138            flags |= TP_FLAG_LATM_AMV;
1139        }
1140        /* Clear output buffer */
1141        FDKmemclear(hAacEncoder->outBuffer, hAacEncoder->outBufferInBytes*sizeof(UCHAR));
1142
1143        /* Initialize Bitstream encoder */
1144        if ( transportEnc_Init(hAacEncoder->hTpEnc, hAacEncoder->outBuffer, hAacEncoder->outBufferInBytes, config->userTpType, &hAacEncoder->coderConfig, flags) != 0) {
1145            return AACENC_INIT_TP_ERROR;
1146        }
1147
1148    } /* transport initialization */
1149
1150    /*
1151     * Initialize AAC - Core.
1152     */
1153    if ( (InitFlags & AACENC_INIT_CONFIG) ||
1154         (InitFlags & AACENC_INIT_STATES) )
1155    {
1156        AAC_ENCODER_ERROR err;
1157        err = FDKaacEnc_Initialize(hAacEncoder->hAacEnc,
1158                                   hAacConfig,
1159                                   hAacEncoder->hTpEnc,
1160                                   (InitFlags & AACENC_INIT_STATES) ? 1 : 0);
1161
1162        if (err != AAC_ENC_OK) {
1163            return AACENC_INIT_AAC_ERROR;
1164        }
1165
1166    } /* aac initialization */
1167
1168    /*
1169     * Initialize Meta Data - Encoder.
1170     */
1171    if ( hAacEncoder->hMetadataEnc && (hAacEncoder->metaDataAllowed!=0) &&
1172        ((InitFlags & AACENC_INIT_CONFIG) ||(InitFlags & AACENC_INIT_STATES)) )
1173    {
1174        INT inputDataDelay = DELAY_AAC(hAacConfig->framelength);
1175
1176        if ( isSbrActive(hAacConfig) && hSbrEncoder!=NULL) {
1177          inputDataDelay = hAacConfig->sbrRatio*inputDataDelay + sbrEncoder_GetInputDataDelay(*hSbrEncoder);
1178        }
1179
1180        if ( FDK_MetadataEnc_Init(hAacEncoder->hMetadataEnc,
1181                                 ((InitFlags&AACENC_INIT_STATES) ? 1 : 0),
1182                                  config->userMetaDataMode,
1183                                  inputDataDelay,
1184                                  frameLength,
1185                                  config->userSamplerate,
1186                                  config->nChannels,
1187                                  config->userChannelMode,
1188                                  hAacConfig->channelOrder) != 0)
1189        {
1190            return AACENC_INIT_META_ERROR;
1191        }
1192
1193        hAacEncoder->nDelay += FDK_MetadataEnc_GetDelay(hAacEncoder->hMetadataEnc);
1194    }
1195
1196    /*
1197     * Update pointer to working buffer.
1198     */
1199    if ( (InitFlags & AACENC_INIT_CONFIG) )
1200    {
1201        hAacEncoder->inputBufferOffset = aacBufferOffset;
1202
1203        hAacEncoder->nSamplesToRead = frameLength * config->nChannels;
1204
1205        /* Make nDelay comparison compatible with config->nSamplesRead */
1206        hAacEncoder->nDelay *= config->nChannels;
1207
1208    } /* parameter changed */
1209
1210    return AACENC_OK;
1211}
1212
1213
1214AACENC_ERROR aacEncOpen(
1215        HANDLE_AACENCODER        *phAacEncoder,
1216        const UINT                encModules,
1217        const UINT                maxChannels
1218        )
1219{
1220    AACENC_ERROR err = AACENC_OK;
1221    HANDLE_AACENCODER  hAacEncoder = NULL;
1222
1223    if (phAacEncoder == NULL) {
1224        err = AACENC_INVALID_HANDLE;
1225        goto bail;
1226    }
1227
1228    /* allocate memory */
1229    hAacEncoder = Get_AacEncoder();
1230
1231    if (hAacEncoder == NULL) {
1232        err = AACENC_MEMORY_ERROR;
1233        goto bail;
1234    }
1235
1236    FDKmemclear(hAacEncoder, sizeof(AACENCODER));
1237
1238    /* Specify encoder modules to be allocated. */
1239    if (encModules==0) {
1240        hAacEncoder->encoder_modis = ENC_MODE_FLAG_AAC;
1241        hAacEncoder->encoder_modis |= ENC_MODE_FLAG_SBR;
1242        hAacEncoder->encoder_modis |= ENC_MODE_FLAG_PS;
1243        hAacEncoder->encoder_modis |= ENC_MODE_FLAG_META;
1244    }
1245    else {
1246       /* consider SAC and PS module */
1247        hAacEncoder->encoder_modis = encModules;
1248    }
1249
1250    /* Determine max channel configuration. */
1251    if (maxChannels==0) {
1252        hAacEncoder->nMaxAacChannels = (8);
1253        hAacEncoder->nMaxSbrChannels = (8);
1254    }
1255    else {
1256        hAacEncoder->nMaxAacChannels = (maxChannels&0x00FF);
1257        if ( (hAacEncoder->encoder_modis&ENC_MODE_FLAG_SBR) ) {
1258            hAacEncoder->nMaxSbrChannels = (maxChannels&0xFF00) ? (maxChannels>>8) : hAacEncoder->nMaxAacChannels;
1259        }
1260
1261        if ( (hAacEncoder->nMaxAacChannels>(8)) || (hAacEncoder->nMaxSbrChannels>(8)) ) {
1262            err = AACENC_INVALID_CONFIG;
1263            goto bail;
1264        }
1265    } /* maxChannels==0 */
1266
1267    /* Max number of elements could be tuned any more. */
1268    hAacEncoder->nMaxAacElements = fixMin((8), hAacEncoder->nMaxAacChannels);
1269    hAacEncoder->nMaxSbrElements = fixMin((8), hAacEncoder->nMaxSbrChannels);
1270    hAacEncoder->nMaxSubFrames = (1);
1271
1272
1273    /* In case of memory overlay, allocate memory out of libraries */
1274
1275    hAacEncoder->inputBuffer = (INT_PCM*)FDKcalloc(hAacEncoder->nMaxAacChannels*INPUTBUFFER_SIZE, sizeof(INT_PCM));
1276
1277    /* Open SBR Encoder */
1278    if (hAacEncoder->encoder_modis&ENC_MODE_FLAG_SBR) {
1279        if ( sbrEncoder_Open(&hAacEncoder->hEnvEnc,
1280                              hAacEncoder->nMaxSbrElements,
1281                              hAacEncoder->nMaxSbrChannels,
1282                             (hAacEncoder->encoder_modis&ENC_MODE_FLAG_PS) ? 1 : 0 ) )
1283        {
1284          err = AACENC_MEMORY_ERROR;
1285          goto bail;
1286        }
1287    } /* (encoder_modis&ENC_MODE_FLAG_SBR) */
1288
1289
1290    /* Open Aac Encoder */
1291    if ( FDKaacEnc_Open(&hAacEncoder->hAacEnc,
1292                         hAacEncoder->nMaxAacElements,
1293                         hAacEncoder->nMaxAacChannels,
1294                         (1)) != AAC_ENC_OK )
1295    {
1296        err = AACENC_MEMORY_ERROR;
1297        goto bail;
1298    }
1299
1300    { /* Get bitstream outputbuffer size */
1301      UINT ld_M;
1302      for (ld_M=1; (UINT)(1<<ld_M) < (hAacEncoder->nMaxSubFrames*hAacEncoder->nMaxAacChannels*6144)>>3; ld_M++) ;
1303      hAacEncoder->outBufferInBytes = (1<<ld_M);  /* buffer has to be 2^n */
1304    }
1305    hAacEncoder->outBuffer = GetRam_bsOutbuffer();
1306    if (OUTPUTBUFFER_SIZE < hAacEncoder->outBufferInBytes ) {
1307      err = AACENC_MEMORY_ERROR;
1308      goto bail;
1309    }
1310
1311    /* Open Meta Data Encoder */
1312    if (hAacEncoder->encoder_modis&ENC_MODE_FLAG_META) {
1313      if ( FDK_MetadataEnc_Open(&hAacEncoder->hMetadataEnc) )
1314      {
1315        err = AACENC_MEMORY_ERROR;
1316        goto bail;
1317      }
1318    } /* (encoder_modis&ENC_MODE_FLAG_META) */
1319
1320    /* Open Transport Encoder */
1321    if ( transportEnc_Open(&hAacEncoder->hTpEnc) != 0 )
1322    {
1323        err = AACENC_MEMORY_ERROR;
1324        goto bail;
1325    }
1326    else {
1327        C_ALLOC_SCRATCH_START(pLibInfo, LIB_INFO, FDK_MODULE_LAST);
1328
1329        FDKinitLibInfo( pLibInfo);
1330        transportEnc_GetLibInfo( pLibInfo );
1331
1332        /* Get capabilty flag for transport encoder. */
1333        hAacEncoder->CAPF_tpEnc = FDKlibInfo_getCapabilities( pLibInfo, FDK_TPENC);
1334
1335        C_ALLOC_SCRATCH_END(pLibInfo, LIB_INFO, FDK_MODULE_LAST);
1336    }
1337    if ( transportEnc_RegisterSbrCallback(hAacEncoder->hTpEnc, aacenc_SbrCallback, hAacEncoder) != 0 ) {
1338      err = AACENC_INIT_TP_ERROR;
1339      goto bail;
1340    }
1341
1342    /* Initialize encoder instance with default parameters. */
1343    aacEncDefaultConfig(&hAacEncoder->aacConfig, &hAacEncoder->extParam);
1344
1345    /* Initialize headerPeriod in coderConfig for aacEncoder_GetParam(). */
1346    hAacEncoder->coderConfig.headerPeriod = hAacEncoder->extParam.userTpHeaderPeriod;
1347
1348    /* All encoder modules have to be initialized */
1349    hAacEncoder->InitFlags = AACENC_INIT_ALL;
1350
1351    /* Return encoder instance */
1352    *phAacEncoder = hAacEncoder;
1353
1354    return err;
1355
1356bail:
1357    aacEncClose(&hAacEncoder);
1358
1359    return err;
1360}
1361
1362
1363
1364AACENC_ERROR aacEncClose(HANDLE_AACENCODER *phAacEncoder)
1365{
1366    AACENC_ERROR err = AACENC_OK;
1367
1368    if (phAacEncoder == NULL) {
1369        err = AACENC_INVALID_HANDLE;
1370        goto bail;
1371    }
1372
1373    if (*phAacEncoder != NULL) {
1374        HANDLE_AACENCODER hAacEncoder = *phAacEncoder;
1375
1376
1377       if (hAacEncoder->inputBuffer!=NULL) {
1378           FDKfree(hAacEncoder->inputBuffer);
1379           hAacEncoder->inputBuffer = NULL;
1380       }
1381
1382       if (hAacEncoder->outBuffer) {
1383         FreeRam_bsOutbuffer(&hAacEncoder->outBuffer);
1384       }
1385
1386        if (hAacEncoder->hEnvEnc) {
1387            sbrEncoder_Close (&hAacEncoder->hEnvEnc);
1388        }
1389        if (hAacEncoder->hAacEnc) {
1390            FDKaacEnc_Close (&hAacEncoder->hAacEnc);
1391        }
1392
1393        transportEnc_Close(&hAacEncoder->hTpEnc);
1394
1395        if (hAacEncoder->hMetadataEnc) {
1396            FDK_MetadataEnc_Close (&hAacEncoder->hMetadataEnc);
1397        }
1398
1399        Free_AacEncoder(phAacEncoder);
1400    }
1401
1402bail:
1403    return err;
1404}
1405
1406AACENC_ERROR aacEncEncode(
1407        const HANDLE_AACENCODER   hAacEncoder,
1408        const AACENC_BufDesc     *inBufDesc,
1409        const AACENC_BufDesc     *outBufDesc,
1410        const AACENC_InArgs      *inargs,
1411        AACENC_OutArgs           *outargs
1412        )
1413{
1414    AACENC_ERROR err = AACENC_OK;
1415    INT i, nBsBytes = 0;
1416    INT  outBytes[(1)];
1417    int  nExtensions = 0;
1418    int  ancDataExtIdx = -1;
1419
1420    /* deal with valid encoder handle */
1421    if (hAacEncoder==NULL) {
1422        err = AACENC_INVALID_HANDLE;
1423        goto bail;
1424    }
1425
1426
1427    /*
1428     * Adjust user settings and trigger reinitialization.
1429     */
1430    if (hAacEncoder->InitFlags!=0) {
1431
1432        err = aacEncInit(hAacEncoder,
1433                         hAacEncoder->InitFlags,
1434                        &hAacEncoder->extParam);
1435
1436        if (err!=AACENC_OK) {
1437            /* keep init flags alive! */
1438            goto bail;
1439        }
1440        hAacEncoder->InitFlags = AACENC_INIT_NONE;
1441    }
1442
1443    if (outargs!=NULL) {
1444        FDKmemclear(outargs, sizeof(AACENC_OutArgs));
1445    }
1446
1447    if (outBufDesc!=NULL) {
1448      for (i=0; i<outBufDesc->numBufs; i++) {
1449        if (outBufDesc->bufs[i]!=NULL) {
1450          FDKmemclear(outBufDesc->bufs[i], outBufDesc->bufSizes[i]);
1451        }
1452      }
1453    }
1454
1455    /*
1456     * If only encoder handle given, independent (re)initialization can be triggered.
1457     */
1458    if ( (hAacEncoder!=NULL) & (inBufDesc==NULL) && (outBufDesc==NULL) && (inargs==NULL) && (outargs==NULL) ) {
1459        goto bail;
1460    }
1461
1462    /* reset buffer wich signals number of valid bytes in output bitstream buffer */
1463    FDKmemclear(outBytes, hAacEncoder->aacConfig.nSubFrames*sizeof(INT));
1464
1465    /*
1466     * Manage incoming audio samples.
1467     */
1468    if ( (inargs->numInSamples > 0) && (getBufDescIdx(inBufDesc,IN_AUDIO_DATA) != -1) )
1469    {
1470        /* Fetch data until nSamplesToRead reached */
1471        INT idx = getBufDescIdx(inBufDesc,IN_AUDIO_DATA);
1472        INT newSamples = fixMax(0,fixMin(inargs->numInSamples, hAacEncoder->nSamplesToRead-hAacEncoder->nSamplesRead));
1473        INT_PCM *pIn = hAacEncoder->inputBuffer+hAacEncoder->inputBufferOffset+hAacEncoder->nSamplesRead;
1474
1475        /* Copy new input samples to internal buffer */
1476        if (inBufDesc->bufElSizes[idx]==(INT)sizeof(INT_PCM)) {
1477            FDKmemcpy(pIn, (INT_PCM*)inBufDesc->bufs[idx], newSamples*sizeof(INT_PCM));  /* Fast copy. */
1478        }
1479        else if (inBufDesc->bufElSizes[idx]>(INT)sizeof(INT_PCM)) {
1480            for (i=0; i<newSamples; i++) {
1481                pIn[i] = (INT_PCM)(((LONG*)inBufDesc->bufs[idx])[i]>>16);                /* Convert 32 to 16 bit. */
1482            }
1483        }
1484        else {
1485            for (i=0; i<newSamples; i++) {
1486                pIn[i] = ((INT_PCM)(((SHORT*)inBufDesc->bufs[idx])[i]))<<16;             /* Convert 16 to 32 bit. */
1487            }
1488        }
1489        hAacEncoder->nSamplesRead += newSamples;
1490
1491        /* Number of fetched input buffer samples. */
1492        outargs->numInSamples = newSamples;
1493    }
1494
1495    /* input buffer completely filled ? */
1496    if (hAacEncoder->nSamplesRead < hAacEncoder->nSamplesToRead)
1497    {
1498        /* - eof reached and flushing enabled, or
1499           - return to main and wait for further incoming audio samples */
1500        if (inargs->numInSamples==-1)
1501        {
1502            if ( (hAacEncoder->nZerosAppended < hAacEncoder->nDelay)
1503                )
1504            {
1505              int nZeros = hAacEncoder->nSamplesToRead - hAacEncoder->nSamplesRead;
1506
1507              FDK_ASSERT(nZeros >= 0);
1508
1509              /* clear out until end-of-buffer */
1510              if (nZeros) {
1511                FDKmemclear(hAacEncoder->inputBuffer+hAacEncoder->inputBufferOffset+hAacEncoder->nSamplesRead, sizeof(INT_PCM)*nZeros );
1512                hAacEncoder->nZerosAppended += nZeros;
1513                hAacEncoder->nSamplesRead = hAacEncoder->nSamplesToRead;
1514              }
1515            }
1516            else { /* flushing completed */
1517              err = AACENC_ENCODE_EOF; /* eof reached */
1518              goto bail;
1519            }
1520        }
1521        else { /* inargs->numInSamples!= -1 */
1522            goto bail; /* not enough samples in input buffer and no flushing enabled */
1523        }
1524    }
1525
1526    /* init payload */
1527    FDKmemclear(hAacEncoder->extPayload, sizeof(AACENC_EXT_PAYLOAD) * MAX_TOTAL_EXT_PAYLOADS);
1528    for (i = 0; i < MAX_TOTAL_EXT_PAYLOADS; i++) {
1529      hAacEncoder->extPayload[i].associatedChElement = -1;
1530    }
1531    FDKmemclear(hAacEncoder->extPayloadData, sizeof(hAacEncoder->extPayloadData));
1532    FDKmemclear(hAacEncoder->extPayloadSize, sizeof(hAacEncoder->extPayloadSize));
1533
1534
1535    /*
1536     * Calculate Meta Data info.
1537     */
1538    if ( (hAacEncoder->hMetadataEnc!=NULL) && (hAacEncoder->metaDataAllowed!=0) ) {
1539
1540        const AACENC_MetaData *pMetaData = NULL;
1541        AACENC_EXT_PAYLOAD *pMetaDataExtPayload = NULL;
1542        UINT nMetaDataExtensions = 0;
1543        INT  matrix_mixdown_idx = 0;
1544
1545        /* New meta data info available ? */
1546        if ( getBufDescIdx(inBufDesc,IN_METADATA_SETUP) != -1 ) {
1547          pMetaData = (AACENC_MetaData*)inBufDesc->bufs[getBufDescIdx(inBufDesc,IN_METADATA_SETUP)];
1548        }
1549
1550        FDK_MetadataEnc_Process(hAacEncoder->hMetadataEnc,
1551                                hAacEncoder->inputBuffer+hAacEncoder->inputBufferOffset,
1552                                hAacEncoder->nSamplesRead,
1553                                pMetaData,
1554                               &pMetaDataExtPayload,
1555                               &nMetaDataExtensions,
1556                               &matrix_mixdown_idx
1557                                );
1558
1559        for (i=0; i<(INT)nMetaDataExtensions; i++) {  /* Get meta data extension payload. */
1560            hAacEncoder->extPayload[nExtensions++] = pMetaDataExtPayload[i];
1561        }
1562
1563        if ( (matrix_mixdown_idx!=-1)
1564          && ((hAacEncoder->extParam.userChannelMode==MODE_1_2_2)||(hAacEncoder->extParam.userChannelMode==MODE_1_2_2_1)) )
1565        {
1566          /* Set matrix mixdown coefficient. */
1567          UINT pceValue = (UINT)( (1<<3) | ((matrix_mixdown_idx&0x3)<<1) | 1 );
1568          if (hAacEncoder->extParam.userPceAdditions != pceValue) {
1569            hAacEncoder->extParam.userPceAdditions = pceValue;
1570            hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT;
1571          }
1572        }
1573    }
1574
1575
1576    if ( isSbrActive(&hAacEncoder->aacConfig) ) {
1577
1578        INT nPayload = 0;
1579
1580        /*
1581         * Encode SBR data.
1582         */
1583        if (sbrEncoder_EncodeFrame(hAacEncoder->hEnvEnc,
1584                                   hAacEncoder->inputBuffer,
1585                                   hAacEncoder->extParam.nChannels,
1586                                   hAacEncoder->extPayloadSize[nPayload],
1587                                   hAacEncoder->extPayloadData[nPayload]
1588#if defined(EVAL_PACKAGE_SILENCE) || defined(EVAL_PACKAGE_SBR_SILENCE)
1589                                  ,hAacEncoder->hAacEnc->clearOutput
1590#endif
1591                                  ))
1592        {
1593            err = AACENC_ENCODE_ERROR;
1594            goto bail;
1595        }
1596        else {
1597            /* Add SBR extension payload */
1598            for (i = 0; i < (8); i++) {
1599                if (hAacEncoder->extPayloadSize[nPayload][i] > 0) {
1600                    hAacEncoder->extPayload[nExtensions].pData    = hAacEncoder->extPayloadData[nPayload][i];
1601                    {
1602                      hAacEncoder->extPayload[nExtensions].dataSize = hAacEncoder->extPayloadSize[nPayload][i];
1603                      hAacEncoder->extPayload[nExtensions].associatedChElement = i;
1604                    }
1605                    hAacEncoder->extPayload[nExtensions].dataType = EXT_SBR_DATA;  /* Once SBR Encoder supports SBR CRC set EXT_SBR_DATA_CRC */
1606                    nExtensions++;                                                 /* or EXT_SBR_DATA according to configuration. */
1607                    FDK_ASSERT(nExtensions<=MAX_TOTAL_EXT_PAYLOADS);
1608                }
1609            }
1610            nPayload++;
1611        }
1612    } /* sbrEnabled */
1613
1614    if ( (inargs->numAncBytes > 0) && ( getBufDescIdx(inBufDesc,IN_ANCILLRY_DATA)!=-1 ) ) {
1615        INT idx = getBufDescIdx(inBufDesc,IN_ANCILLRY_DATA);
1616        hAacEncoder->extPayload[nExtensions].dataSize = inargs->numAncBytes * 8;
1617        hAacEncoder->extPayload[nExtensions].pData    = (UCHAR*)inBufDesc->bufs[idx];
1618        hAacEncoder->extPayload[nExtensions].dataType = EXT_DATA_ELEMENT;
1619        hAacEncoder->extPayload[nExtensions].associatedChElement = -1;
1620        ancDataExtIdx = nExtensions; /* store index */
1621        nExtensions++;
1622    }
1623
1624    /*
1625     * Encode AAC - Core.
1626     */
1627    if ( FDKaacEnc_EncodeFrame( hAacEncoder->hAacEnc,
1628                                hAacEncoder->hTpEnc,
1629                                hAacEncoder->inputBuffer,
1630                                outBytes,
1631                                hAacEncoder->extPayload
1632                                ) != AAC_ENC_OK )
1633    {
1634        err = AACENC_ENCODE_ERROR;
1635        goto bail;
1636    }
1637
1638    if (ancDataExtIdx >= 0) {
1639      outargs->numAncBytes = inargs->numAncBytes - (hAacEncoder->extPayload[ancDataExtIdx].dataSize>>3);
1640    }
1641
1642    /* samples exhausted */
1643    hAacEncoder->nSamplesRead -= hAacEncoder->nSamplesToRead;
1644
1645    /*
1646     * Delay balancing buffer handling
1647     */
1648    if (isSbrActive(&hAacEncoder->aacConfig)) {
1649        sbrEncoder_UpdateBuffers(hAacEncoder->hEnvEnc, hAacEncoder->inputBuffer);
1650    }
1651
1652    /*
1653     * Make bitstream public
1654     */
1655    if (outBufDesc->numBufs>=1) {
1656
1657        INT bsIdx = getBufDescIdx(outBufDesc,OUT_BITSTREAM_DATA);
1658        INT auIdx = getBufDescIdx(outBufDesc,OUT_AU_SIZES);
1659
1660        for (i=0,nBsBytes=0; i<hAacEncoder->aacConfig.nSubFrames; i++) {
1661          nBsBytes += outBytes[i];
1662
1663          if (auIdx!=-1) {
1664           ((INT*)outBufDesc->bufs[auIdx])[i] = outBytes[i];
1665          }
1666        }
1667
1668        if ( (bsIdx!=-1) && (outBufDesc->bufSizes[bsIdx]>=nBsBytes) ) {
1669          FDKmemcpy(outBufDesc->bufs[bsIdx], hAacEncoder->outBuffer, sizeof(UCHAR)*nBsBytes);
1670          outargs->numOutBytes = nBsBytes;
1671        }
1672        else {
1673          /* output buffer too small, can't write valid bitstream */
1674          err = AACENC_ENCODE_ERROR;
1675          goto bail;
1676        }
1677    }
1678
1679bail:
1680    if (err == AACENC_ENCODE_ERROR) {
1681        /* All encoder modules have to be initialized */
1682        hAacEncoder->InitFlags = AACENC_INIT_ALL;
1683    }
1684
1685    return err;
1686}
1687
1688static
1689AAC_ENCODER_ERROR aacEncGetConf(HANDLE_AACENCODER  hAacEncoder,
1690                                UINT              *size,
1691                                UCHAR             *confBuffer)
1692{
1693    FDK_BITSTREAM tmpConf;
1694    UINT confType;
1695    UCHAR buf[64];
1696    int err;
1697
1698    /* Init bit buffer */
1699    FDKinitBitStream(&tmpConf, buf, 64, 0, BS_WRITER);
1700
1701    /* write conf in tmp buffer */
1702    err = transportEnc_GetConf(hAacEncoder->hTpEnc, &hAacEncoder->coderConfig, &tmpConf, &confType);
1703
1704    /* copy data to outbuffer: length in bytes */
1705    FDKbyteAlign(&tmpConf, 0);
1706
1707    /* Check buffer size */
1708    if (FDKgetValidBits(&tmpConf) > ((*size)<<3))
1709      return AAC_ENC_UNKNOWN;
1710
1711    FDKfetchBuffer(&tmpConf, confBuffer, size);
1712
1713    if (err != 0)
1714      return AAC_ENC_UNKNOWN;
1715    else
1716      return AAC_ENC_OK;
1717}
1718
1719
1720AACENC_ERROR aacEncGetLibInfo(LIB_INFO *info)
1721{
1722  int i = 0;
1723
1724  if (info == NULL) {
1725    return AACENC_INVALID_HANDLE;
1726  }
1727
1728  FDK_toolsGetLibInfo( info );
1729  transportEnc_GetLibInfo( info );
1730
1731  sbrEncoder_GetLibInfo( info );
1732
1733  /* search for next free tab */
1734  for (i = 0; i < FDK_MODULE_LAST; i++) {
1735    if (info[i].module_id == FDK_NONE) break;
1736  }
1737  if (i == FDK_MODULE_LAST) {
1738    return AACENC_INIT_ERROR;
1739  }
1740
1741  info[i].module_id = FDK_AACENC;
1742  info[i].build_date = (char*)AACENCODER_LIB_BUILD_DATE;
1743  info[i].build_time = (char*)AACENCODER_LIB_BUILD_TIME;
1744  info[i].title = (char*)AACENCODER_LIB_TITLE;
1745  info[i].version = LIB_VERSION(AACENCODER_LIB_VL0, AACENCODER_LIB_VL1, AACENCODER_LIB_VL2);;
1746  LIB_VERSION_STRING(&info[i]);
1747
1748  /* Capability flags */
1749  info[i].flags = 0
1750    | CAPF_AAC_1024 | CAPF_AAC_LC
1751    | CAPF_AAC_512
1752    | CAPF_AAC_480
1753    | CAPF_AAC_DRC
1754      ;
1755  /* End of flags */
1756
1757  return AACENC_OK;
1758}
1759
1760AACENC_ERROR aacEncoder_SetParam(
1761        const HANDLE_AACENCODER   hAacEncoder,
1762        const AACENC_PARAM        param,
1763        const UINT                value
1764        )
1765{
1766    AACENC_ERROR err = AACENC_OK;
1767    USER_PARAM *settings = &hAacEncoder->extParam;
1768
1769    /* check encoder handle */
1770    if (hAacEncoder == NULL) {
1771        err = AACENC_INVALID_HANDLE;
1772        goto bail;
1773    }
1774
1775    /* apply param value */
1776    switch (param)
1777    {
1778    case AACENC_AOT:
1779        if (settings->userAOT != (AUDIO_OBJECT_TYPE)value) {
1780            /* check if AOT matches the allocated modules */
1781            switch ( value ) {
1782              case AOT_PS:
1783              case AOT_MP2_PS:
1784                if (!(hAacEncoder->encoder_modis & (ENC_MODE_FLAG_PS))) {
1785                  err = AACENC_INVALID_CONFIG;
1786                  goto bail;
1787                }
1788              case AOT_SBR:
1789              case AOT_MP2_SBR:
1790                if (!(hAacEncoder->encoder_modis & (ENC_MODE_FLAG_SBR))) {
1791                  err = AACENC_INVALID_CONFIG;
1792                  goto bail;
1793                }
1794              case AOT_AAC_LC:
1795              case AOT_MP2_AAC_LC:
1796              case AOT_ER_AAC_LD:
1797              case AOT_ER_AAC_ELD:
1798                if (!(hAacEncoder->encoder_modis & (ENC_MODE_FLAG_AAC))) {
1799                  err = AACENC_INVALID_CONFIG;
1800                  goto bail;
1801                }
1802                break;
1803              default:
1804                err = AACENC_INVALID_CONFIG;
1805                goto bail;
1806            }/* switch value */
1807            settings->userAOT = (AUDIO_OBJECT_TYPE)value;
1808            hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_STATES | AACENC_INIT_TRANSPORT;
1809        }
1810        break;
1811    case AACENC_BITRATE:
1812        if (settings->userBitrate != value) {
1813            settings->userBitrate = value;
1814            hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_TRANSPORT;
1815        }
1816        break;
1817    case AACENC_BITRATEMODE:
1818        if (settings->userBitrateMode != value) {
1819            switch ( value ) {
1820              case 0:
1821              case 8:
1822                settings->userBitrateMode = value;
1823                hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_TRANSPORT;
1824                break;
1825              default:
1826                err = AACENC_INVALID_CONFIG;
1827                break;
1828            } /* switch value */
1829        }
1830        break;
1831    case AACENC_SAMPLERATE:
1832        if (settings->userSamplerate != value) {
1833            if ( !( (value==8000) || (value==11025) || (value==12000) || (value==16000) || (value==22050) || (value==24000) ||
1834                   (value==32000) || (value==44100) || (value==48000) || (value==64000) || (value==88200) || (value==96000) ) )
1835            {
1836                err = AACENC_INVALID_CONFIG;
1837                break;
1838            }
1839            settings->userSamplerate = value;
1840            hAacEncoder->nSamplesRead = 0; /* reset internal inputbuffer */
1841            hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_STATES | AACENC_INIT_TRANSPORT;
1842        }
1843        break;
1844    case AACENC_CHANNELMODE:
1845        if (settings->userChannelMode != (CHANNEL_MODE)value) {
1846            const CHANNEL_MODE_CONFIG_TAB* pConfig = FDKaacEnc_GetChannelModeConfiguration((CHANNEL_MODE)value);
1847            if (pConfig==NULL) {
1848                err = AACENC_INVALID_CONFIG;
1849                break;
1850            }
1851            if ( (pConfig->nElements > hAacEncoder->nMaxAacElements)
1852              || (pConfig->nChannelsEff > hAacEncoder->nMaxAacChannels)
1853              || !(((value>=1) && (value<=7))||((value>=33) && (value<=34)))
1854                )
1855            {
1856                err = AACENC_INVALID_CONFIG;
1857                break;
1858            }
1859
1860            settings->userChannelMode = (CHANNEL_MODE)value;
1861            settings->nChannels = pConfig->nChannels;
1862            hAacEncoder->nSamplesRead = 0; /* reset internal inputbuffer */
1863            hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_TRANSPORT;
1864        }
1865        break;
1866    case AACENC_BANDWIDTH:
1867        if (settings->userBandwidth != value) {
1868          settings->userBandwidth = value;
1869          hAacEncoder->InitFlags |= AACENC_INIT_CONFIG;
1870        }
1871        break;
1872    case AACENC_CHANNELORDER:
1873        if (hAacEncoder->aacConfig.channelOrder != (CHANNEL_ORDER)value) {
1874            if (! ((value==0) || (value==1)) ) {
1875                err = AACENC_INVALID_CONFIG;
1876                break;
1877            }
1878            hAacEncoder->aacConfig.channelOrder = (CHANNEL_ORDER)value;
1879            hAacEncoder->nSamplesRead = 0; /* reset internal inputbuffer */
1880            hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_STATES | AACENC_INIT_TRANSPORT;
1881        }
1882        break;
1883    case AACENC_AFTERBURNER:
1884        if (settings->userAfterburner != value) {
1885            if (! ((value==0) || (value==1)) ) {
1886                err = AACENC_INVALID_CONFIG;
1887                break;
1888            }
1889            settings->userAfterburner = value;
1890            hAacEncoder->InitFlags |= AACENC_INIT_CONFIG;
1891        }
1892        break;
1893    case AACENC_GRANULE_LENGTH:
1894        if (settings->userFramelength != value) {
1895          switch (value) {
1896            case 1024:
1897            case 512:
1898            case 480:
1899              settings->userFramelength = value;
1900              hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_TRANSPORT;
1901              break;
1902            default:
1903              err = AACENC_INVALID_CONFIG;
1904              break;
1905          }
1906        }
1907        break;
1908    case AACENC_SBR_RATIO:
1909        if (settings->userSbrRatio != value) {
1910            if (! ((value==0) || (value==1) || (value==2)) ) {
1911              err = AACENC_INVALID_CONFIG;
1912              break;
1913            }
1914            settings->userSbrRatio = value;
1915            hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_STATES | AACENC_INIT_TRANSPORT;
1916        }
1917        break;
1918    case AACENC_SBR_MODE:
1919        if (settings->userSbrEnabled != value) {
1920            settings->userSbrEnabled = value;
1921            hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_STATES | AACENC_INIT_TRANSPORT;
1922        }
1923        break;
1924    case AACENC_TRANSMUX:
1925        if (settings->userTpType != (TRANSPORT_TYPE)value) {
1926
1927            TRANSPORT_TYPE  type  = (TRANSPORT_TYPE)value;
1928            UINT            flags = hAacEncoder->CAPF_tpEnc;
1929
1930            if ( !( ((type==TT_MP4_ADIF)      &&  (flags&CAPF_ADIF))
1931                 || ((type==TT_MP4_ADTS)      &&  (flags&CAPF_ADTS))
1932                 || ((type==TT_MP4_LATM_MCP0) && ((flags&CAPF_LATM) && (flags&CAPF_RAWPACKETS)))
1933                 || ((type==TT_MP4_LATM_MCP1) && ((flags&CAPF_LATM) && (flags&CAPF_RAWPACKETS)))
1934                 || ((type==TT_MP4_LOAS)      &&  (flags&CAPF_LOAS))
1935                 || ((type==TT_MP4_RAW)       &&  (flags&CAPF_RAWPACKETS))
1936                ) )
1937            {
1938                err = AACENC_INVALID_CONFIG;
1939                break;
1940            }
1941            settings->userTpType = (TRANSPORT_TYPE)value;
1942            hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT;
1943        }
1944        break;
1945    case AACENC_SIGNALING_MODE:
1946        if (settings->userTpSignaling != value) {
1947            if ( !((value==0) || (value==1) || (value==2)) ) {
1948                err = AACENC_INVALID_CONFIG;
1949                break;
1950            }
1951            settings->userTpSignaling = value;
1952            hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT;
1953        }
1954        break;
1955    case AACENC_PROTECTION:
1956        if (settings->userTpProtection != value) {
1957            if ( !((value==0) || (value==1)) ) {
1958                err = AACENC_INVALID_CONFIG;
1959                break;
1960            }
1961            settings->userTpProtection = value;
1962            hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT;
1963        }
1964        break;
1965    case AACENC_HEADER_PERIOD:
1966        if (settings->userTpHeaderPeriod != value) {
1967            settings->userTpHeaderPeriod = value;
1968            hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT;
1969        }
1970        break;
1971    case AACENC_TPSUBFRAMES:
1972        if (settings->userTpNsubFrames != value) {
1973            if (! ( (value>=1) && (value<=4) ) ) {
1974                err = AACENC_INVALID_CONFIG;
1975                break;
1976            }
1977            settings->userTpNsubFrames = value;
1978            hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT;
1979        }
1980        break;
1981    case AACENC_ANCILLARY_BITRATE:
1982        if (settings->userAncDataRate != value) {
1983            settings->userAncDataRate = value;
1984        }
1985        break;
1986    case AACENC_CONTROL_STATE:
1987        if (hAacEncoder->InitFlags != value) {
1988            if (value&AACENC_RESET_INBUFFER) {
1989                hAacEncoder->nSamplesRead = 0;
1990            }
1991            hAacEncoder->InitFlags = value;
1992        }
1993        break;
1994    case AACENC_METADATA_MODE:
1995        if ((UINT)settings->userMetaDataMode != value) {
1996            if ( !((value>=0) && (value<=2)) ) {
1997                err = AACENC_INVALID_CONFIG;
1998                break;
1999            }
2000            settings->userMetaDataMode = value;
2001            hAacEncoder->InitFlags |= AACENC_INIT_CONFIG;
2002        }
2003        break;
2004    default:
2005      err = AACENC_UNSUPPORTED_PARAMETER;
2006      break;
2007    }  /* switch(param) */
2008
2009bail:
2010    return err;
2011}
2012
2013UINT aacEncoder_GetParam(
2014        const HANDLE_AACENCODER   hAacEncoder,
2015        const AACENC_PARAM        param
2016        )
2017{
2018    UINT value = 0;
2019    USER_PARAM *settings = &hAacEncoder->extParam;
2020
2021    /* check encoder handle */
2022    if (hAacEncoder == NULL) {
2023        goto bail;
2024    }
2025
2026    /* apply param value */
2027    switch (param)
2028    {
2029    case AACENC_AOT:
2030        value = (UINT)hAacEncoder->aacConfig.audioObjectType;
2031        break;
2032    case AACENC_BITRATE:
2033        value = (UINT)((hAacEncoder->aacConfig.bitrateMode==AACENC_BR_MODE_CBR) ? hAacEncoder->aacConfig.bitRate : -1);
2034        break;
2035    case AACENC_BITRATEMODE:
2036        value = (UINT)hAacEncoder->aacConfig.bitrateMode;
2037        break;
2038    case AACENC_SAMPLERATE:
2039        value = (UINT)hAacEncoder->coderConfig.extSamplingRate;
2040        break;
2041    case AACENC_CHANNELMODE:
2042        value = (UINT)hAacEncoder->aacConfig.channelMode;
2043        break;
2044    case AACENC_BANDWIDTH:
2045        value = (UINT)hAacEncoder->aacConfig.bandWidth;
2046        break;
2047    case AACENC_CHANNELORDER:
2048        value = (UINT)hAacEncoder->aacConfig.channelOrder;
2049        break;
2050    case AACENC_AFTERBURNER:
2051        value = (UINT)hAacEncoder->aacConfig.useRequant;
2052        break;
2053    case AACENC_GRANULE_LENGTH:
2054        value = (UINT)hAacEncoder->aacConfig.framelength;
2055       break;
2056    case AACENC_SBR_RATIO:
2057        value = isSbrActive(&hAacEncoder->aacConfig) ? hAacEncoder->aacConfig.sbrRatio : 0;
2058        break;
2059    case AACENC_SBR_MODE:
2060        value = (UINT) (hAacEncoder->aacConfig.syntaxFlags & AC_SBR_PRESENT) ? 1 : 0;
2061        break;
2062    case AACENC_TRANSMUX:
2063        value = (UINT)settings->userTpType;
2064        break;
2065    case AACENC_SIGNALING_MODE:
2066        value = (UINT)getSbrSignalingMode(hAacEncoder->aacConfig.audioObjectType, settings->userTpType, settings->userTpSignaling, hAacEncoder->aacConfig.sbrRatio);
2067        break;
2068    case AACENC_PROTECTION:
2069        value = (UINT)settings->userTpProtection;
2070        break;
2071    case AACENC_HEADER_PERIOD:
2072        value = (UINT)hAacEncoder->coderConfig.headerPeriod;
2073        break;
2074    case AACENC_TPSUBFRAMES:
2075        value = (UINT)settings->userTpNsubFrames;
2076        break;
2077    case AACENC_ANCILLARY_BITRATE:
2078        value = (UINT)hAacEncoder->aacConfig.anc_Rate;
2079        break;
2080    case AACENC_CONTROL_STATE:
2081        value = (UINT)hAacEncoder->InitFlags;
2082        break;
2083    case AACENC_METADATA_MODE:
2084        value = (hAacEncoder->metaDataAllowed==0) ? 0 : (UINT)settings->userMetaDataMode;
2085        break;
2086    default:
2087      //err = MPS_INVALID_PARAMETER;
2088      break;
2089    }  /* switch(param) */
2090
2091bail:
2092    return value;
2093}
2094
2095AACENC_ERROR aacEncInfo(
2096        const HANDLE_AACENCODER   hAacEncoder,
2097        AACENC_InfoStruct        *pInfo
2098        )
2099{
2100    AACENC_ERROR err = AACENC_OK;
2101
2102    FDKmemclear(pInfo, sizeof(AACENC_InfoStruct));
2103    pInfo->confSize = 64; /* pre-initialize */
2104
2105    pInfo->maxOutBufBytes    = ((hAacEncoder->nMaxAacChannels*6144)+7)>>3;
2106    pInfo->maxAncBytes       = hAacEncoder->aacConfig.maxAncBytesPerAU;
2107    pInfo->inBufFillLevel    = hAacEncoder->nSamplesRead/hAacEncoder->extParam.nChannels;
2108    pInfo->inputChannels     = hAacEncoder->extParam.nChannels;
2109    pInfo->frameLength       = hAacEncoder->nSamplesToRead/hAacEncoder->extParam.nChannels;
2110    pInfo->encoderDelay      = hAacEncoder->nDelay/hAacEncoder->extParam.nChannels;
2111
2112    /* Get encoder configuration */
2113    if ( aacEncGetConf(hAacEncoder, &pInfo->confSize, &pInfo->confBuf[0]) != AAC_ENC_OK) {
2114        err = AACENC_INIT_ERROR;
2115        goto bail;
2116    }
2117bail:
2118    return err;
2119}
2120
2121