• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* -----------------------------------------------------------------------------
2 Software License for The Fraunhofer FDK AAC Codec Library for Android
3 
4 © Copyright  1995 - 2020 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. Schug / A. Groeschel
98 
99    Description: fast aac coder interface library functions
100 
101 *******************************************************************************/
102 
103 #ifndef AACENC_H
104 #define AACENC_H
105 
106 #include "common_fix.h"
107 #include "FDK_audio.h"
108 
109 #include "tpenc_lib.h"
110 
111 #include "sbr_encoder.h"
112 
113 #define MIN_BUFSIZE_PER_EFF_CHAN 6144
114 
115 #ifdef __cplusplus
116 extern "C" {
117 #endif
118 
119 /*
120  * AAC-LC error codes.
121  */
122 typedef enum {
123   AAC_ENC_OK = 0x0000, /*!< All fine. */
124 
125   AAC_ENC_UNKNOWN = 0x0002, /*!< Error condition is of unknown reason, or from
126                                another module.              */
127 
128   /* initialization errors */
129   aac_enc_init_error_start = 0x2000,
130   AAC_ENC_INVALID_HANDLE = 0x2020, /*!< The handle passed to the function call
131                                       was invalid (probably NULL).        */
132   AAC_ENC_INVALID_FRAME_LENGTH =
133       0x2080, /*!< Invalid frame length (must be 1024 or 960). */
134   AAC_ENC_INVALID_N_CHANNELS =
135       0x20e0, /*!< Invalid amount of audio input channels. */
136   AAC_ENC_INVALID_SFB_TABLE = 0x2140, /*!< Internal encoder error. */
137 
138   AAC_ENC_UNSUPPORTED_AOT =
139       0x3000, /*!< The Audio Object Type (AOT) is not supported. */
140   AAC_ENC_UNSUPPORTED_FILTERBANK =
141       0x3010, /*!< Filterbank type is not supported. */
142   AAC_ENC_UNSUPPORTED_BITRATE =
143       0x3020, /*!< The chosen bitrate is not supported. */
144   AAC_ENC_UNSUPPORTED_BITRATE_MODE =
145       0x3028, /*!< Unsupported bit rate mode (CBR or VBR). */
146   AAC_ENC_UNSUPPORTED_ANC_BITRATE =
147       0x3040, /*!< Unsupported ancillay bitrate. */
148   AAC_ENC_UNSUPPORTED_ANC_MODE = 0x3060,
149   AAC_ENC_UNSUPPORTED_TRANSPORT_TYPE =
150       0x3080, /*!< The bitstream format is not supported. */
151   AAC_ENC_UNSUPPORTED_ER_FORMAT =
152       0x30a0, /*!< The error resilience tool format is not supported. */
153   AAC_ENC_UNSUPPORTED_EPCONFIG =
154       0x30c0, /*!< The error protection format is not supported. */
155   AAC_ENC_UNSUPPORTED_CHANNELCONFIG =
156       0x30e0, /*!< The channel configuration (either number or arrangement) is
157                  not supported. */
158   AAC_ENC_UNSUPPORTED_SAMPLINGRATE =
159       0x3100, /*!< Sample rate of audio input is not supported. */
160   AAC_ENC_NO_MEMORY = 0x3120,               /*!< Could not allocate memory. */
161   AAC_ENC_PE_INIT_TABLE_NOT_FOUND = 0x3140, /*!< Internal encoder error.    */
162 
163   aac_enc_init_error_end,
164 
165   /* encode errors */
166   aac_enc_error_start = 0x4000,
167   AAC_ENC_QUANT_ERROR = 0x4020, /*!< Too many bits used in quantization. */
168   AAC_ENC_WRITTEN_BITS_ERROR =
169       0x4040, /*!< Unexpected number of written bits, differs to
170                    calculated number of bits.                      */
171   AAC_ENC_PNS_TABLE_ERROR = 0x4060,      /*!< PNS level out of range.      */
172   AAC_ENC_GLOBAL_GAIN_TOO_HIGH = 0x4080, /*!< Internal quantizer error. */
173   AAC_ENC_BITRES_TOO_LOW = 0x40a0, /*!< Too few  bits in bit reservoir.       */
174   AAC_ENC_BITRES_TOO_HIGH = 0x40a1, /*!< Too many bits in bit reservoir.      */
175   AAC_ENC_INVALID_CHANNEL_BITRATE = 0x4100,
176   AAC_ENC_INVALID_ELEMENTINFO_TYPE = 0x4120, /*!< Internal encoder error. */
177 
178   AAC_ENC_WRITE_SCAL_ERROR = 0x41e0, /*!< Error writing scalefacData. */
179   AAC_ENC_WRITE_SEC_ERROR = 0x4200,  /*!< Error writing sectionData.  */
180   AAC_ENC_WRITE_SPEC_ERROR = 0x4220, /*!< Error writing spectralData. */
181   aac_enc_error_end
182 
183 } AAC_ENCODER_ERROR;
184 /*-------------------------- defines --------------------------------------*/
185 
186 #define ANC_DATA_BUFFERSIZE 1024 /* ancBuffer size */
187 
188 #define MAX_TOTAL_EXT_PAYLOADS ((((8)) * (1)) + (2 + 2))
189 
190 typedef enum {
191   AACENC_BR_MODE_INVALID = -1, /*!< Invalid bitrate mode. */
192   AACENC_BR_MODE_CBR = 0,      /*!< Constant bitrate mode.      */
193   AACENC_BR_MODE_VBR_1 = 1, /*!< Variable bitrate mode, very low bitrate.    */
194   AACENC_BR_MODE_VBR_2 = 2, /*!< Variable bitrate mode, low bitrate.    */
195   AACENC_BR_MODE_VBR_3 = 3, /*!< Variable bitrate mode, medium bitrate.    */
196   AACENC_BR_MODE_VBR_4 = 4, /*!< Variable bitrate mode, high bitrate.    */
197   AACENC_BR_MODE_VBR_5 = 5, /*!< Variable bitrate mode, very high bitrate.    */
198   AACENC_BR_MODE_FF = 6,    /*!< Fixed frame mode.       */
199   AACENC_BR_MODE_SFR = 7    /*!< Superframe mode.       */
200 
201 } AACENC_BITRATE_MODE;
202 
203 #define AACENC_BR_MODE_IS_VBR(brMode) ((brMode >= 1) && (brMode <= 5))
204 
205 typedef enum {
206 
207   CH_ORDER_MPEG =
208       0, /*!< MPEG channel ordering (e. g. 5.1: C, L, R, SL, SR, LFE)       */
209   CH_ORDER_WAV /*!< WAV fileformat channel ordering (e. g. 5.1: L, R, C, LFE,
210                   SL, SR) */
211 
212 } CHANNEL_ORDER;
213 
214 /*-------------------- structure definitions ------------------------------*/
215 
216 struct AACENC_CONFIG {
217   INT sampleRate;     /* encoder sample rate */
218   INT bitRate;        /* encoder bit rate in bits/sec */
219   INT ancDataBitRate; /* additional bits consumed by anc data or sbr have to be
220                          consiedered while configuration */
221 
222   INT nSubFrames; /* number of frames in super frame (not ADTS/LATM subframes !)
223                    */
224   AUDIO_OBJECT_TYPE audioObjectType; /* Audio Object Type  */
225 
226   INT averageBits;                 /* encoder bit rate in bits/superframe */
227   AACENC_BITRATE_MODE bitrateMode; /* encoder bitrate mode (CBR/VBR) */
228   INT nChannels;                   /* number of channels to process */
229   CHANNEL_ORDER channelOrder;      /* input Channel ordering scheme. */
230   INT bandWidth;                   /* targeted audio bandwidth in Hz */
231   CHANNEL_MODE channelMode;        /* encoder channel mode configuration */
232   INT framelength;                 /* used frame size */
233 
234   UINT syntaxFlags; /* bitstreams syntax configuration */
235   SCHAR epConfig;   /* error protection configuration */
236 
237   INT anc_Rate; /* ancillary rate, 0 (disabled), -1 (default) else desired rate
238                  */
239   UINT maxAncBytesPerAU;
240   INT minBitsPerFrame; /* minimum number of bits in AU */
241   INT maxBitsPerFrame; /* maximum number of bits in AU */
242 
243   INT audioMuxVersion; /* audio mux version in loas/latm transport format */
244 
245   UINT sbrRatio; /* sbr sampling rate ratio: dual- or single-rate */
246 
247   UCHAR useTns; /* flag: use temporal noise shaping */
248   UCHAR usePns; /* flag: use perceptual noise substitution */
249   UCHAR useIS;  /* flag: use intensity coding */
250   UCHAR useMS;  /* flag: use ms stereo tool */
251 
252   UCHAR useRequant; /* flag: use afterburner */
253 
254   UINT downscaleFactor;
255 };
256 
257 typedef struct {
258   UCHAR *pData;              /* pointer to extension payload data */
259   UINT dataSize;             /* extension payload data size in bits */
260   EXT_PAYLOAD_TYPE dataType; /* extension payload data type */
261   INT associatedChElement; /* number of the channel element the data is assigned
262                               to */
263 } AACENC_EXT_PAYLOAD;
264 
265 typedef struct AAC_ENC *HANDLE_AAC_ENC;
266 
267 /**
268  * \brief Calculate framesize in bits for given bit rate, frame length and
269  * sampling rate.
270  *
271  * \param bitRate               Ttarget bitrate in bits per second.
272  * \param frameLength           Number of audio samples in one frame.
273  * \param samplingRate          Sampling rate in Hz.
274  *
275  * \return                      Framesize in bits per frame.
276  */
277 INT FDKaacEnc_CalcBitsPerFrame(const INT bitRate, const INT frameLength,
278                                const INT samplingRate);
279 
280 /**
281  * \brief Calculate bitrate in bits per second for given framesize, frame length
282  * and sampling rate.
283  *
284  * \param bitsPerFrame          Framesize in bits per frame
285  * \param frameLength           Number of audio samples in one frame.
286  * \param samplingRate          Sampling rate in Hz.
287  *
288  * \return                      Bitrate in bits per second.
289  */
290 INT FDKaacEnc_CalcBitrate(const INT bitsPerFrame, const INT frameLength,
291                           const INT samplingRate);
292 
293 /**
294  * \brief Limit given bit rate to a valid value
295  * \param hTpEnc transport encoder handle
296  * \param aot audio object type
297  * \param coreSamplingRate the sample rate to be used for the AAC encoder
298  * \param frameLength the frameLength to be used for the AAC encoder
299  * \param nChannels number of total channels
300  * \param nChannelsEff number of effective channels
301  * \param bitRate the initial bit rate value for which the closest valid bit
302  * rate value is searched for
303  * \param averageBits average bits per frame for fixed framing. Set to -1 if not
304  * available.
305  * \param optional pointer where the current bits per frame are stored into.
306  * \param bitrateMode the current bit rate mode
307  * \param nSubFrames number of sub frames for super framing (not transport
308  * frames).
309  * \return a valid bit rate value as close as possible or identical to bitRate
310  */
311 INT FDKaacEnc_LimitBitrate(HANDLE_TRANSPORTENC hTpEnc, AUDIO_OBJECT_TYPE aot,
312                            INT coreSamplingRate, INT frameLength, INT nChannels,
313                            INT nChannelsEff, INT bitRate, INT averageBits,
314                            INT *pAverageBitsPerFrame,
315                            AACENC_BITRATE_MODE bitrateMode, INT nSubFrames);
316 
317 /**
318  * \brief Get current state of the bit reservoir
319  * \param hAacEncoder encoder handle
320  * \return bit reservoir state in bits
321  */
322 INT FDKaacEnc_GetBitReservoirState(const HANDLE_AAC_ENC hAacEncoder);
323 
324 /*-----------------------------------------------------------------------------
325 
326     functionname: FDKaacEnc_GetVBRBitrate
327     description:  Get VBR bitrate from vbr quality
328     input params: int vbrQuality (VBR0, VBR1, VBR2)
329                   channelMode
330     returns:      vbr bitrate
331 
332 ------------------------------------------------------------------------------*/
333 INT FDKaacEnc_GetVBRBitrate(AACENC_BITRATE_MODE bitrateMode,
334                             CHANNEL_MODE channelMode);
335 
336 /*-----------------------------------------------------------------------------
337 
338     functionname: FDKaacEnc_AdjustVBRBitrateMode
339     description:  Adjust bitrate mode to given bitrate parameter
340     input params: int vbrQuality (VBR0, VBR1, VBR2)
341                   bitrate
342                   channelMode
343     returns:      vbr bitrate mode
344 
345  ------------------------------------------------------------------------------*/
346 AACENC_BITRATE_MODE FDKaacEnc_AdjustVBRBitrateMode(
347     AACENC_BITRATE_MODE bitrateMode, INT bitrate, CHANNEL_MODE channelMode);
348 
349 /*-----------------------------------------------------------------------------
350 
351      functionname: FDKaacEnc_AacInitDefaultConfig
352      description:  gives reasonable default configuration
353      returns:      ---
354 
355  ------------------------------------------------------------------------------*/
356 void FDKaacEnc_AacInitDefaultConfig(AACENC_CONFIG *config);
357 
358 /*---------------------------------------------------------------------------
359 
360     functionname:FDKaacEnc_Open
361     description: allocate and initialize a new encoder instance
362     returns:     0 if success
363 
364   ---------------------------------------------------------------------------*/
365 AAC_ENCODER_ERROR FDKaacEnc_Open(
366     HANDLE_AAC_ENC
367         *phAacEnc, /* pointer to an encoder handle, initialized on return */
368     const INT nElements, /* number of maximal elements in instance to support */
369     const INT nChannels, /* number of maximal channels in instance to support */
370     const INT nSubFrames); /* support superframing in instance */
371 
372 AAC_ENCODER_ERROR FDKaacEnc_Initialize(
373     HANDLE_AAC_ENC
374         hAacEncoder, /* pointer to an encoder handle, initialized on return */
375     AACENC_CONFIG *config, /* pre-initialized config struct */
376     HANDLE_TRANSPORTENC hTpEnc, ULONG initFlags);
377 
378 /*---------------------------------------------------------------------------
379 
380     functionname: FDKaacEnc_EncodeFrame
381     description:  encode one frame
382     returns:      0 if success
383 
384   ---------------------------------------------------------------------------*/
385 
386 AAC_ENCODER_ERROR FDKaacEnc_EncodeFrame(
387     HANDLE_AAC_ENC hAacEnc, /* encoder handle */
388     HANDLE_TRANSPORTENC hTpEnc, INT_PCM *inputBuffer,
389     const UINT inputBufferBufSize, INT *numOutBytes,
390     AACENC_EXT_PAYLOAD extPayload[MAX_TOTAL_EXT_PAYLOADS]);
391 
392 /*---------------------------------------------------------------------------
393 
394     functionname:FDKaacEnc_Close
395     description: delete encoder instance
396     returns:
397 
398   ---------------------------------------------------------------------------*/
399 
400 void FDKaacEnc_Close(HANDLE_AAC_ENC *phAacEnc); /* encoder handle */
401 
402 #ifdef __cplusplus
403 }
404 #endif
405 
406 #endif /* AACENC_H */
407