Coverage Report

Created: 2025-07-01 06:21

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