xref: /aosp_15_r20/external/aac/libAACenc/src/aacenc.h (revision e54365361535b070c2db7374cec45c159c7d0e7a)
1*e5436536SAndroid Build Coastguard Worker /* -----------------------------------------------------------------------------
2*e5436536SAndroid Build Coastguard Worker Software License for The Fraunhofer FDK AAC Codec Library for Android
3*e5436536SAndroid Build Coastguard Worker 
4*e5436536SAndroid Build Coastguard Worker © Copyright  1995 - 2020 Fraunhofer-Gesellschaft zur Förderung der angewandten
5*e5436536SAndroid Build Coastguard Worker Forschung e.V. All rights reserved.
6*e5436536SAndroid Build Coastguard Worker 
7*e5436536SAndroid Build Coastguard Worker  1.    INTRODUCTION
8*e5436536SAndroid Build Coastguard Worker The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
9*e5436536SAndroid Build Coastguard Worker that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
10*e5436536SAndroid Build Coastguard Worker scheme for digital audio. This FDK AAC Codec software is intended to be used on
11*e5436536SAndroid Build Coastguard Worker a wide variety of Android devices.
12*e5436536SAndroid Build Coastguard Worker 
13*e5436536SAndroid Build Coastguard Worker AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
14*e5436536SAndroid Build Coastguard Worker general perceptual audio codecs. AAC-ELD is considered the best-performing
15*e5436536SAndroid Build Coastguard Worker full-bandwidth communications codec by independent studies and is widely
16*e5436536SAndroid Build Coastguard Worker deployed. AAC has been standardized by ISO and IEC as part of the MPEG
17*e5436536SAndroid Build Coastguard Worker specifications.
18*e5436536SAndroid Build Coastguard Worker 
19*e5436536SAndroid Build Coastguard Worker Patent licenses for necessary patent claims for the FDK AAC Codec (including
20*e5436536SAndroid Build Coastguard Worker those of Fraunhofer) may be obtained through Via Licensing
21*e5436536SAndroid Build Coastguard Worker (www.vialicensing.com) or through the respective patent owners individually for
22*e5436536SAndroid Build Coastguard Worker the purpose of encoding or decoding bit streams in products that are compliant
23*e5436536SAndroid Build Coastguard Worker with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
24*e5436536SAndroid Build Coastguard Worker Android devices already license these patent claims through Via Licensing or
25*e5436536SAndroid Build Coastguard Worker directly from the patent owners, and therefore FDK AAC Codec software may
26*e5436536SAndroid Build Coastguard Worker already be covered under those patent licenses when it is used for those
27*e5436536SAndroid Build Coastguard Worker licensed purposes only.
28*e5436536SAndroid Build Coastguard Worker 
29*e5436536SAndroid Build Coastguard Worker Commercially-licensed AAC software libraries, including floating-point versions
30*e5436536SAndroid Build Coastguard Worker with enhanced sound quality, are also available from Fraunhofer. Users are
31*e5436536SAndroid Build Coastguard Worker encouraged to check the Fraunhofer website for additional applications
32*e5436536SAndroid Build Coastguard Worker information and documentation.
33*e5436536SAndroid Build Coastguard Worker 
34*e5436536SAndroid Build Coastguard Worker 2.    COPYRIGHT LICENSE
35*e5436536SAndroid Build Coastguard Worker 
36*e5436536SAndroid Build Coastguard Worker Redistribution and use in source and binary forms, with or without modification,
37*e5436536SAndroid Build Coastguard Worker are permitted without payment of copyright license fees provided that you
38*e5436536SAndroid Build Coastguard Worker satisfy the following conditions:
39*e5436536SAndroid Build Coastguard Worker 
40*e5436536SAndroid Build Coastguard Worker You must retain the complete text of this software license in redistributions of
41*e5436536SAndroid Build Coastguard Worker the FDK AAC Codec or your modifications thereto in source code form.
42*e5436536SAndroid Build Coastguard Worker 
43*e5436536SAndroid Build Coastguard Worker You must retain the complete text of this software license in the documentation
44*e5436536SAndroid Build Coastguard Worker and/or other materials provided with redistributions of the FDK AAC Codec or
45*e5436536SAndroid Build Coastguard Worker your modifications thereto in binary form. You must make available free of
46*e5436536SAndroid Build Coastguard Worker charge copies of the complete source code of the FDK AAC Codec and your
47*e5436536SAndroid Build Coastguard Worker modifications thereto to recipients of copies in binary form.
48*e5436536SAndroid Build Coastguard Worker 
49*e5436536SAndroid Build Coastguard Worker The name of Fraunhofer may not be used to endorse or promote products derived
50*e5436536SAndroid Build Coastguard Worker from this library without prior written permission.
51*e5436536SAndroid Build Coastguard Worker 
52*e5436536SAndroid Build Coastguard Worker You may not charge copyright license fees for anyone to use, copy or distribute
53*e5436536SAndroid Build Coastguard Worker the FDK AAC Codec software or your modifications thereto.
54*e5436536SAndroid Build Coastguard Worker 
55*e5436536SAndroid Build Coastguard Worker Your modified versions of the FDK AAC Codec must carry prominent notices stating
56*e5436536SAndroid Build Coastguard Worker that you changed the software and the date of any change. For modified versions
57*e5436536SAndroid Build Coastguard Worker of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
58*e5436536SAndroid Build Coastguard Worker must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
59*e5436536SAndroid Build Coastguard Worker AAC Codec Library for Android."
60*e5436536SAndroid Build Coastguard Worker 
61*e5436536SAndroid Build Coastguard Worker 3.    NO PATENT LICENSE
62*e5436536SAndroid Build Coastguard Worker 
63*e5436536SAndroid Build Coastguard Worker NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
64*e5436536SAndroid Build Coastguard Worker limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
65*e5436536SAndroid Build Coastguard Worker Fraunhofer provides no warranty of patent non-infringement with respect to this
66*e5436536SAndroid Build Coastguard Worker software.
67*e5436536SAndroid Build Coastguard Worker 
68*e5436536SAndroid Build Coastguard Worker You may use this FDK AAC Codec software or modifications thereto only for
69*e5436536SAndroid Build Coastguard Worker purposes that are authorized by appropriate patent licenses.
70*e5436536SAndroid Build Coastguard Worker 
71*e5436536SAndroid Build Coastguard Worker 4.    DISCLAIMER
72*e5436536SAndroid Build Coastguard Worker 
73*e5436536SAndroid Build Coastguard Worker This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
74*e5436536SAndroid Build Coastguard Worker holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
75*e5436536SAndroid Build Coastguard Worker including but not limited to the implied warranties of merchantability and
76*e5436536SAndroid Build Coastguard Worker fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
77*e5436536SAndroid Build Coastguard Worker CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
78*e5436536SAndroid Build Coastguard Worker or consequential damages, including but not limited to procurement of substitute
79*e5436536SAndroid Build Coastguard Worker goods or services; loss of use, data, or profits, or business interruption,
80*e5436536SAndroid Build Coastguard Worker however caused and on any theory of liability, whether in contract, strict
81*e5436536SAndroid Build Coastguard Worker liability, or tort (including negligence), arising in any way out of the use of
82*e5436536SAndroid Build Coastguard Worker this software, even if advised of the possibility of such damage.
83*e5436536SAndroid Build Coastguard Worker 
84*e5436536SAndroid Build Coastguard Worker 5.    CONTACT INFORMATION
85*e5436536SAndroid Build Coastguard Worker 
86*e5436536SAndroid Build Coastguard Worker Fraunhofer Institute for Integrated Circuits IIS
87*e5436536SAndroid Build Coastguard Worker Attention: Audio and Multimedia Departments - FDK AAC LL
88*e5436536SAndroid Build Coastguard Worker Am Wolfsmantel 33
89*e5436536SAndroid Build Coastguard Worker 91058 Erlangen, Germany
90*e5436536SAndroid Build Coastguard Worker 
91*e5436536SAndroid Build Coastguard Worker www.iis.fraunhofer.de/amm
92*e5436536SAndroid Build Coastguard Worker [email protected]
93*e5436536SAndroid Build Coastguard Worker ----------------------------------------------------------------------------- */
94*e5436536SAndroid Build Coastguard Worker 
95*e5436536SAndroid Build Coastguard Worker /**************************** AAC encoder library ******************************
96*e5436536SAndroid Build Coastguard Worker 
97*e5436536SAndroid Build Coastguard Worker    Author(s):   M. Schug / A. Groeschel
98*e5436536SAndroid Build Coastguard Worker 
99*e5436536SAndroid Build Coastguard Worker    Description: fast aac coder interface library functions
100*e5436536SAndroid Build Coastguard Worker 
101*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
102*e5436536SAndroid Build Coastguard Worker 
103*e5436536SAndroid Build Coastguard Worker #ifndef AACENC_H
104*e5436536SAndroid Build Coastguard Worker #define AACENC_H
105*e5436536SAndroid Build Coastguard Worker 
106*e5436536SAndroid Build Coastguard Worker #include "common_fix.h"
107*e5436536SAndroid Build Coastguard Worker #include "FDK_audio.h"
108*e5436536SAndroid Build Coastguard Worker 
109*e5436536SAndroid Build Coastguard Worker #include "tpenc_lib.h"
110*e5436536SAndroid Build Coastguard Worker 
111*e5436536SAndroid Build Coastguard Worker #include "sbr_encoder.h"
112*e5436536SAndroid Build Coastguard Worker 
113*e5436536SAndroid Build Coastguard Worker #define MIN_BUFSIZE_PER_EFF_CHAN 6144
114*e5436536SAndroid Build Coastguard Worker 
115*e5436536SAndroid Build Coastguard Worker #ifdef __cplusplus
116*e5436536SAndroid Build Coastguard Worker extern "C" {
117*e5436536SAndroid Build Coastguard Worker #endif
118*e5436536SAndroid Build Coastguard Worker 
119*e5436536SAndroid Build Coastguard Worker /*
120*e5436536SAndroid Build Coastguard Worker  * AAC-LC error codes.
121*e5436536SAndroid Build Coastguard Worker  */
122*e5436536SAndroid Build Coastguard Worker typedef enum {
123*e5436536SAndroid Build Coastguard Worker   AAC_ENC_OK = 0x0000, /*!< All fine. */
124*e5436536SAndroid Build Coastguard Worker 
125*e5436536SAndroid Build Coastguard Worker   AAC_ENC_UNKNOWN = 0x0002, /*!< Error condition is of unknown reason, or from
126*e5436536SAndroid Build Coastguard Worker                                another module.              */
127*e5436536SAndroid Build Coastguard Worker 
128*e5436536SAndroid Build Coastguard Worker   /* initialization errors */
129*e5436536SAndroid Build Coastguard Worker   aac_enc_init_error_start = 0x2000,
130*e5436536SAndroid Build Coastguard Worker   AAC_ENC_INVALID_HANDLE = 0x2020, /*!< The handle passed to the function call
131*e5436536SAndroid Build Coastguard Worker                                       was invalid (probably NULL).        */
132*e5436536SAndroid Build Coastguard Worker   AAC_ENC_INVALID_FRAME_LENGTH =
133*e5436536SAndroid Build Coastguard Worker       0x2080, /*!< Invalid frame length (must be 1024 or 960). */
134*e5436536SAndroid Build Coastguard Worker   AAC_ENC_INVALID_N_CHANNELS =
135*e5436536SAndroid Build Coastguard Worker       0x20e0, /*!< Invalid amount of audio input channels. */
136*e5436536SAndroid Build Coastguard Worker   AAC_ENC_INVALID_SFB_TABLE = 0x2140, /*!< Internal encoder error. */
137*e5436536SAndroid Build Coastguard Worker 
138*e5436536SAndroid Build Coastguard Worker   AAC_ENC_UNSUPPORTED_AOT =
139*e5436536SAndroid Build Coastguard Worker       0x3000, /*!< The Audio Object Type (AOT) is not supported. */
140*e5436536SAndroid Build Coastguard Worker   AAC_ENC_UNSUPPORTED_FILTERBANK =
141*e5436536SAndroid Build Coastguard Worker       0x3010, /*!< Filterbank type is not supported. */
142*e5436536SAndroid Build Coastguard Worker   AAC_ENC_UNSUPPORTED_BITRATE =
143*e5436536SAndroid Build Coastguard Worker       0x3020, /*!< The chosen bitrate is not supported. */
144*e5436536SAndroid Build Coastguard Worker   AAC_ENC_UNSUPPORTED_BITRATE_MODE =
145*e5436536SAndroid Build Coastguard Worker       0x3028, /*!< Unsupported bit rate mode (CBR or VBR). */
146*e5436536SAndroid Build Coastguard Worker   AAC_ENC_UNSUPPORTED_ANC_BITRATE =
147*e5436536SAndroid Build Coastguard Worker       0x3040, /*!< Unsupported ancillay bitrate. */
148*e5436536SAndroid Build Coastguard Worker   AAC_ENC_UNSUPPORTED_ANC_MODE = 0x3060,
149*e5436536SAndroid Build Coastguard Worker   AAC_ENC_UNSUPPORTED_TRANSPORT_TYPE =
150*e5436536SAndroid Build Coastguard Worker       0x3080, /*!< The bitstream format is not supported. */
151*e5436536SAndroid Build Coastguard Worker   AAC_ENC_UNSUPPORTED_ER_FORMAT =
152*e5436536SAndroid Build Coastguard Worker       0x30a0, /*!< The error resilience tool format is not supported. */
153*e5436536SAndroid Build Coastguard Worker   AAC_ENC_UNSUPPORTED_EPCONFIG =
154*e5436536SAndroid Build Coastguard Worker       0x30c0, /*!< The error protection format is not supported. */
155*e5436536SAndroid Build Coastguard Worker   AAC_ENC_UNSUPPORTED_CHANNELCONFIG =
156*e5436536SAndroid Build Coastguard Worker       0x30e0, /*!< The channel configuration (either number or arrangement) is
157*e5436536SAndroid Build Coastguard Worker                  not supported. */
158*e5436536SAndroid Build Coastguard Worker   AAC_ENC_UNSUPPORTED_SAMPLINGRATE =
159*e5436536SAndroid Build Coastguard Worker       0x3100, /*!< Sample rate of audio input is not supported. */
160*e5436536SAndroid Build Coastguard Worker   AAC_ENC_NO_MEMORY = 0x3120,               /*!< Could not allocate memory. */
161*e5436536SAndroid Build Coastguard Worker   AAC_ENC_PE_INIT_TABLE_NOT_FOUND = 0x3140, /*!< Internal encoder error.    */
162*e5436536SAndroid Build Coastguard Worker 
163*e5436536SAndroid Build Coastguard Worker   aac_enc_init_error_end,
164*e5436536SAndroid Build Coastguard Worker 
165*e5436536SAndroid Build Coastguard Worker   /* encode errors */
166*e5436536SAndroid Build Coastguard Worker   aac_enc_error_start = 0x4000,
167*e5436536SAndroid Build Coastguard Worker   AAC_ENC_QUANT_ERROR = 0x4020, /*!< Too many bits used in quantization. */
168*e5436536SAndroid Build Coastguard Worker   AAC_ENC_WRITTEN_BITS_ERROR =
169*e5436536SAndroid Build Coastguard Worker       0x4040, /*!< Unexpected number of written bits, differs to
170*e5436536SAndroid Build Coastguard Worker                    calculated number of bits.                      */
171*e5436536SAndroid Build Coastguard Worker   AAC_ENC_PNS_TABLE_ERROR = 0x4060,      /*!< PNS level out of range.      */
172*e5436536SAndroid Build Coastguard Worker   AAC_ENC_GLOBAL_GAIN_TOO_HIGH = 0x4080, /*!< Internal quantizer error. */
173*e5436536SAndroid Build Coastguard Worker   AAC_ENC_BITRES_TOO_LOW = 0x40a0, /*!< Too few  bits in bit reservoir.       */
174*e5436536SAndroid Build Coastguard Worker   AAC_ENC_BITRES_TOO_HIGH = 0x40a1, /*!< Too many bits in bit reservoir.      */
175*e5436536SAndroid Build Coastguard Worker   AAC_ENC_INVALID_CHANNEL_BITRATE = 0x4100,
176*e5436536SAndroid Build Coastguard Worker   AAC_ENC_INVALID_ELEMENTINFO_TYPE = 0x4120, /*!< Internal encoder error. */
177*e5436536SAndroid Build Coastguard Worker 
178*e5436536SAndroid Build Coastguard Worker   AAC_ENC_WRITE_SCAL_ERROR = 0x41e0, /*!< Error writing scalefacData. */
179*e5436536SAndroid Build Coastguard Worker   AAC_ENC_WRITE_SEC_ERROR = 0x4200,  /*!< Error writing sectionData.  */
180*e5436536SAndroid Build Coastguard Worker   AAC_ENC_WRITE_SPEC_ERROR = 0x4220, /*!< Error writing spectralData. */
181*e5436536SAndroid Build Coastguard Worker   aac_enc_error_end
182*e5436536SAndroid Build Coastguard Worker 
183*e5436536SAndroid Build Coastguard Worker } AAC_ENCODER_ERROR;
184*e5436536SAndroid Build Coastguard Worker /*-------------------------- defines --------------------------------------*/
185*e5436536SAndroid Build Coastguard Worker 
186*e5436536SAndroid Build Coastguard Worker #define ANC_DATA_BUFFERSIZE 1024 /* ancBuffer size */
187*e5436536SAndroid Build Coastguard Worker 
188*e5436536SAndroid Build Coastguard Worker #define MAX_TOTAL_EXT_PAYLOADS ((((8)) * (1)) + (2 + 2))
189*e5436536SAndroid Build Coastguard Worker 
190*e5436536SAndroid Build Coastguard Worker typedef enum {
191*e5436536SAndroid Build Coastguard Worker   AACENC_BR_MODE_INVALID = -1, /*!< Invalid bitrate mode. */
192*e5436536SAndroid Build Coastguard Worker   AACENC_BR_MODE_CBR = 0,      /*!< Constant bitrate mode.      */
193*e5436536SAndroid Build Coastguard Worker   AACENC_BR_MODE_VBR_1 = 1, /*!< Variable bitrate mode, very low bitrate.    */
194*e5436536SAndroid Build Coastguard Worker   AACENC_BR_MODE_VBR_2 = 2, /*!< Variable bitrate mode, low bitrate.    */
195*e5436536SAndroid Build Coastguard Worker   AACENC_BR_MODE_VBR_3 = 3, /*!< Variable bitrate mode, medium bitrate.    */
196*e5436536SAndroid Build Coastguard Worker   AACENC_BR_MODE_VBR_4 = 4, /*!< Variable bitrate mode, high bitrate.    */
197*e5436536SAndroid Build Coastguard Worker   AACENC_BR_MODE_VBR_5 = 5, /*!< Variable bitrate mode, very high bitrate.    */
198*e5436536SAndroid Build Coastguard Worker   AACENC_BR_MODE_FF = 6,    /*!< Fixed frame mode.       */
199*e5436536SAndroid Build Coastguard Worker   AACENC_BR_MODE_SFR = 7    /*!< Superframe mode.       */
200*e5436536SAndroid Build Coastguard Worker 
201*e5436536SAndroid Build Coastguard Worker } AACENC_BITRATE_MODE;
202*e5436536SAndroid Build Coastguard Worker 
203*e5436536SAndroid Build Coastguard Worker #define AACENC_BR_MODE_IS_VBR(brMode) ((brMode >= 1) && (brMode <= 5))
204*e5436536SAndroid Build Coastguard Worker 
205*e5436536SAndroid Build Coastguard Worker typedef enum {
206*e5436536SAndroid Build Coastguard Worker 
207*e5436536SAndroid Build Coastguard Worker   CH_ORDER_MPEG =
208*e5436536SAndroid Build Coastguard Worker       0, /*!< MPEG channel ordering (e. g. 5.1: C, L, R, SL, SR, LFE)       */
209*e5436536SAndroid Build Coastguard Worker   CH_ORDER_WAV /*!< WAV fileformat channel ordering (e. g. 5.1: L, R, C, LFE,
210*e5436536SAndroid Build Coastguard Worker                   SL, SR) */
211*e5436536SAndroid Build Coastguard Worker 
212*e5436536SAndroid Build Coastguard Worker } CHANNEL_ORDER;
213*e5436536SAndroid Build Coastguard Worker 
214*e5436536SAndroid Build Coastguard Worker /*-------------------- structure definitions ------------------------------*/
215*e5436536SAndroid Build Coastguard Worker 
216*e5436536SAndroid Build Coastguard Worker struct AACENC_CONFIG {
217*e5436536SAndroid Build Coastguard Worker   INT sampleRate;     /* encoder sample rate */
218*e5436536SAndroid Build Coastguard Worker   INT bitRate;        /* encoder bit rate in bits/sec */
219*e5436536SAndroid Build Coastguard Worker   INT ancDataBitRate; /* additional bits consumed by anc data or sbr have to be
220*e5436536SAndroid Build Coastguard Worker                          consiedered while configuration */
221*e5436536SAndroid Build Coastguard Worker 
222*e5436536SAndroid Build Coastguard Worker   INT nSubFrames; /* number of frames in super frame (not ADTS/LATM subframes !)
223*e5436536SAndroid Build Coastguard Worker                    */
224*e5436536SAndroid Build Coastguard Worker   AUDIO_OBJECT_TYPE audioObjectType; /* Audio Object Type  */
225*e5436536SAndroid Build Coastguard Worker 
226*e5436536SAndroid Build Coastguard Worker   INT averageBits;                 /* encoder bit rate in bits/superframe */
227*e5436536SAndroid Build Coastguard Worker   AACENC_BITRATE_MODE bitrateMode; /* encoder bitrate mode (CBR/VBR) */
228*e5436536SAndroid Build Coastguard Worker   INT nChannels;                   /* number of channels to process */
229*e5436536SAndroid Build Coastguard Worker   CHANNEL_ORDER channelOrder;      /* input Channel ordering scheme. */
230*e5436536SAndroid Build Coastguard Worker   INT bandWidth;                   /* targeted audio bandwidth in Hz */
231*e5436536SAndroid Build Coastguard Worker   CHANNEL_MODE channelMode;        /* encoder channel mode configuration */
232*e5436536SAndroid Build Coastguard Worker   INT framelength;                 /* used frame size */
233*e5436536SAndroid Build Coastguard Worker 
234*e5436536SAndroid Build Coastguard Worker   UINT syntaxFlags; /* bitstreams syntax configuration */
235*e5436536SAndroid Build Coastguard Worker   SCHAR epConfig;   /* error protection configuration */
236*e5436536SAndroid Build Coastguard Worker 
237*e5436536SAndroid Build Coastguard Worker   INT anc_Rate; /* ancillary rate, 0 (disabled), -1 (default) else desired rate
238*e5436536SAndroid Build Coastguard Worker                  */
239*e5436536SAndroid Build Coastguard Worker   UINT maxAncBytesPerAU;
240*e5436536SAndroid Build Coastguard Worker   INT minBitsPerFrame; /* minimum number of bits in AU */
241*e5436536SAndroid Build Coastguard Worker   INT maxBitsPerFrame; /* maximum number of bits in AU */
242*e5436536SAndroid Build Coastguard Worker 
243*e5436536SAndroid Build Coastguard Worker   INT audioMuxVersion; /* audio mux version in loas/latm transport format */
244*e5436536SAndroid Build Coastguard Worker 
245*e5436536SAndroid Build Coastguard Worker   UINT sbrRatio; /* sbr sampling rate ratio: dual- or single-rate */
246*e5436536SAndroid Build Coastguard Worker 
247*e5436536SAndroid Build Coastguard Worker   UCHAR useTns; /* flag: use temporal noise shaping */
248*e5436536SAndroid Build Coastguard Worker   UCHAR usePns; /* flag: use perceptual noise substitution */
249*e5436536SAndroid Build Coastguard Worker   UCHAR useIS;  /* flag: use intensity coding */
250*e5436536SAndroid Build Coastguard Worker   UCHAR useMS;  /* flag: use ms stereo tool */
251*e5436536SAndroid Build Coastguard Worker 
252*e5436536SAndroid Build Coastguard Worker   UCHAR useRequant; /* flag: use afterburner */
253*e5436536SAndroid Build Coastguard Worker 
254*e5436536SAndroid Build Coastguard Worker   UINT downscaleFactor;
255*e5436536SAndroid Build Coastguard Worker };
256*e5436536SAndroid Build Coastguard Worker 
257*e5436536SAndroid Build Coastguard Worker typedef struct {
258*e5436536SAndroid Build Coastguard Worker   UCHAR *pData;              /* pointer to extension payload data */
259*e5436536SAndroid Build Coastguard Worker   UINT dataSize;             /* extension payload data size in bits */
260*e5436536SAndroid Build Coastguard Worker   EXT_PAYLOAD_TYPE dataType; /* extension payload data type */
261*e5436536SAndroid Build Coastguard Worker   INT associatedChElement; /* number of the channel element the data is assigned
262*e5436536SAndroid Build Coastguard Worker                               to */
263*e5436536SAndroid Build Coastguard Worker } AACENC_EXT_PAYLOAD;
264*e5436536SAndroid Build Coastguard Worker 
265*e5436536SAndroid Build Coastguard Worker typedef struct AAC_ENC *HANDLE_AAC_ENC;
266*e5436536SAndroid Build Coastguard Worker 
267*e5436536SAndroid Build Coastguard Worker /**
268*e5436536SAndroid Build Coastguard Worker  * \brief Calculate framesize in bits for given bit rate, frame length and
269*e5436536SAndroid Build Coastguard Worker  * sampling rate.
270*e5436536SAndroid Build Coastguard Worker  *
271*e5436536SAndroid Build Coastguard Worker  * \param bitRate               Ttarget bitrate in bits per second.
272*e5436536SAndroid Build Coastguard Worker  * \param frameLength           Number of audio samples in one frame.
273*e5436536SAndroid Build Coastguard Worker  * \param samplingRate          Sampling rate in Hz.
274*e5436536SAndroid Build Coastguard Worker  *
275*e5436536SAndroid Build Coastguard Worker  * \return                      Framesize in bits per frame.
276*e5436536SAndroid Build Coastguard Worker  */
277*e5436536SAndroid Build Coastguard Worker INT FDKaacEnc_CalcBitsPerFrame(const INT bitRate, const INT frameLength,
278*e5436536SAndroid Build Coastguard Worker                                const INT samplingRate);
279*e5436536SAndroid Build Coastguard Worker 
280*e5436536SAndroid Build Coastguard Worker /**
281*e5436536SAndroid Build Coastguard Worker  * \brief Calculate bitrate in bits per second for given framesize, frame length
282*e5436536SAndroid Build Coastguard Worker  * and sampling rate.
283*e5436536SAndroid Build Coastguard Worker  *
284*e5436536SAndroid Build Coastguard Worker  * \param bitsPerFrame          Framesize in bits per frame
285*e5436536SAndroid Build Coastguard Worker  * \param frameLength           Number of audio samples in one frame.
286*e5436536SAndroid Build Coastguard Worker  * \param samplingRate          Sampling rate in Hz.
287*e5436536SAndroid Build Coastguard Worker  *
288*e5436536SAndroid Build Coastguard Worker  * \return                      Bitrate in bits per second.
289*e5436536SAndroid Build Coastguard Worker  */
290*e5436536SAndroid Build Coastguard Worker INT FDKaacEnc_CalcBitrate(const INT bitsPerFrame, const INT frameLength,
291*e5436536SAndroid Build Coastguard Worker                           const INT samplingRate);
292*e5436536SAndroid Build Coastguard Worker 
293*e5436536SAndroid Build Coastguard Worker /**
294*e5436536SAndroid Build Coastguard Worker  * \brief Limit given bit rate to a valid value
295*e5436536SAndroid Build Coastguard Worker  * \param hTpEnc transport encoder handle
296*e5436536SAndroid Build Coastguard Worker  * \param aot audio object type
297*e5436536SAndroid Build Coastguard Worker  * \param coreSamplingRate the sample rate to be used for the AAC encoder
298*e5436536SAndroid Build Coastguard Worker  * \param frameLength the frameLength to be used for the AAC encoder
299*e5436536SAndroid Build Coastguard Worker  * \param nChannels number of total channels
300*e5436536SAndroid Build Coastguard Worker  * \param nChannelsEff number of effective channels
301*e5436536SAndroid Build Coastguard Worker  * \param bitRate the initial bit rate value for which the closest valid bit
302*e5436536SAndroid Build Coastguard Worker  * rate value is searched for
303*e5436536SAndroid Build Coastguard Worker  * \param averageBits average bits per frame for fixed framing. Set to -1 if not
304*e5436536SAndroid Build Coastguard Worker  * available.
305*e5436536SAndroid Build Coastguard Worker  * \param optional pointer where the current bits per frame are stored into.
306*e5436536SAndroid Build Coastguard Worker  * \param bitrateMode the current bit rate mode
307*e5436536SAndroid Build Coastguard Worker  * \param nSubFrames number of sub frames for super framing (not transport
308*e5436536SAndroid Build Coastguard Worker  * frames).
309*e5436536SAndroid Build Coastguard Worker  * \return a valid bit rate value as close as possible or identical to bitRate
310*e5436536SAndroid Build Coastguard Worker  */
311*e5436536SAndroid Build Coastguard Worker INT FDKaacEnc_LimitBitrate(HANDLE_TRANSPORTENC hTpEnc, AUDIO_OBJECT_TYPE aot,
312*e5436536SAndroid Build Coastguard Worker                            INT coreSamplingRate, INT frameLength, INT nChannels,
313*e5436536SAndroid Build Coastguard Worker                            INT nChannelsEff, INT bitRate, INT averageBits,
314*e5436536SAndroid Build Coastguard Worker                            INT *pAverageBitsPerFrame,
315*e5436536SAndroid Build Coastguard Worker                            AACENC_BITRATE_MODE bitrateMode, INT nSubFrames);
316*e5436536SAndroid Build Coastguard Worker 
317*e5436536SAndroid Build Coastguard Worker /**
318*e5436536SAndroid Build Coastguard Worker  * \brief Get current state of the bit reservoir
319*e5436536SAndroid Build Coastguard Worker  * \param hAacEncoder encoder handle
320*e5436536SAndroid Build Coastguard Worker  * \return bit reservoir state in bits
321*e5436536SAndroid Build Coastguard Worker  */
322*e5436536SAndroid Build Coastguard Worker INT FDKaacEnc_GetBitReservoirState(const HANDLE_AAC_ENC hAacEncoder);
323*e5436536SAndroid Build Coastguard Worker 
324*e5436536SAndroid Build Coastguard Worker /*-----------------------------------------------------------------------------
325*e5436536SAndroid Build Coastguard Worker 
326*e5436536SAndroid Build Coastguard Worker     functionname: FDKaacEnc_GetVBRBitrate
327*e5436536SAndroid Build Coastguard Worker     description:  Get VBR bitrate from vbr quality
328*e5436536SAndroid Build Coastguard Worker     input params: int vbrQuality (VBR0, VBR1, VBR2)
329*e5436536SAndroid Build Coastguard Worker                   channelMode
330*e5436536SAndroid Build Coastguard Worker     returns:      vbr bitrate
331*e5436536SAndroid Build Coastguard Worker 
332*e5436536SAndroid Build Coastguard Worker ------------------------------------------------------------------------------*/
333*e5436536SAndroid Build Coastguard Worker INT FDKaacEnc_GetVBRBitrate(AACENC_BITRATE_MODE bitrateMode,
334*e5436536SAndroid Build Coastguard Worker                             CHANNEL_MODE channelMode);
335*e5436536SAndroid Build Coastguard Worker 
336*e5436536SAndroid Build Coastguard Worker /*-----------------------------------------------------------------------------
337*e5436536SAndroid Build Coastguard Worker 
338*e5436536SAndroid Build Coastguard Worker     functionname: FDKaacEnc_AdjustVBRBitrateMode
339*e5436536SAndroid Build Coastguard Worker     description:  Adjust bitrate mode to given bitrate parameter
340*e5436536SAndroid Build Coastguard Worker     input params: int vbrQuality (VBR0, VBR1, VBR2)
341*e5436536SAndroid Build Coastguard Worker                   bitrate
342*e5436536SAndroid Build Coastguard Worker                   channelMode
343*e5436536SAndroid Build Coastguard Worker     returns:      vbr bitrate mode
344*e5436536SAndroid Build Coastguard Worker 
345*e5436536SAndroid Build Coastguard Worker  ------------------------------------------------------------------------------*/
346*e5436536SAndroid Build Coastguard Worker AACENC_BITRATE_MODE FDKaacEnc_AdjustVBRBitrateMode(
347*e5436536SAndroid Build Coastguard Worker     AACENC_BITRATE_MODE bitrateMode, INT bitrate, CHANNEL_MODE channelMode);
348*e5436536SAndroid Build Coastguard Worker 
349*e5436536SAndroid Build Coastguard Worker /*-----------------------------------------------------------------------------
350*e5436536SAndroid Build Coastguard Worker 
351*e5436536SAndroid Build Coastguard Worker      functionname: FDKaacEnc_AacInitDefaultConfig
352*e5436536SAndroid Build Coastguard Worker      description:  gives reasonable default configuration
353*e5436536SAndroid Build Coastguard Worker      returns:      ---
354*e5436536SAndroid Build Coastguard Worker 
355*e5436536SAndroid Build Coastguard Worker  ------------------------------------------------------------------------------*/
356*e5436536SAndroid Build Coastguard Worker void FDKaacEnc_AacInitDefaultConfig(AACENC_CONFIG *config);
357*e5436536SAndroid Build Coastguard Worker 
358*e5436536SAndroid Build Coastguard Worker /*---------------------------------------------------------------------------
359*e5436536SAndroid Build Coastguard Worker 
360*e5436536SAndroid Build Coastguard Worker     functionname:FDKaacEnc_Open
361*e5436536SAndroid Build Coastguard Worker     description: allocate and initialize a new encoder instance
362*e5436536SAndroid Build Coastguard Worker     returns:     0 if success
363*e5436536SAndroid Build Coastguard Worker 
364*e5436536SAndroid Build Coastguard Worker   ---------------------------------------------------------------------------*/
365*e5436536SAndroid Build Coastguard Worker AAC_ENCODER_ERROR FDKaacEnc_Open(
366*e5436536SAndroid Build Coastguard Worker     HANDLE_AAC_ENC
367*e5436536SAndroid Build Coastguard Worker         *phAacEnc, /* pointer to an encoder handle, initialized on return */
368*e5436536SAndroid Build Coastguard Worker     const INT nElements, /* number of maximal elements in instance to support */
369*e5436536SAndroid Build Coastguard Worker     const INT nChannels, /* number of maximal channels in instance to support */
370*e5436536SAndroid Build Coastguard Worker     const INT nSubFrames); /* support superframing in instance */
371*e5436536SAndroid Build Coastguard Worker 
372*e5436536SAndroid Build Coastguard Worker AAC_ENCODER_ERROR FDKaacEnc_Initialize(
373*e5436536SAndroid Build Coastguard Worker     HANDLE_AAC_ENC
374*e5436536SAndroid Build Coastguard Worker         hAacEncoder, /* pointer to an encoder handle, initialized on return */
375*e5436536SAndroid Build Coastguard Worker     AACENC_CONFIG *config, /* pre-initialized config struct */
376*e5436536SAndroid Build Coastguard Worker     HANDLE_TRANSPORTENC hTpEnc, ULONG initFlags);
377*e5436536SAndroid Build Coastguard Worker 
378*e5436536SAndroid Build Coastguard Worker /*---------------------------------------------------------------------------
379*e5436536SAndroid Build Coastguard Worker 
380*e5436536SAndroid Build Coastguard Worker     functionname: FDKaacEnc_EncodeFrame
381*e5436536SAndroid Build Coastguard Worker     description:  encode one frame
382*e5436536SAndroid Build Coastguard Worker     returns:      0 if success
383*e5436536SAndroid Build Coastguard Worker 
384*e5436536SAndroid Build Coastguard Worker   ---------------------------------------------------------------------------*/
385*e5436536SAndroid Build Coastguard Worker 
386*e5436536SAndroid Build Coastguard Worker AAC_ENCODER_ERROR FDKaacEnc_EncodeFrame(
387*e5436536SAndroid Build Coastguard Worker     HANDLE_AAC_ENC hAacEnc, /* encoder handle */
388*e5436536SAndroid Build Coastguard Worker     HANDLE_TRANSPORTENC hTpEnc, INT_PCM *inputBuffer,
389*e5436536SAndroid Build Coastguard Worker     const UINT inputBufferBufSize, INT *numOutBytes,
390*e5436536SAndroid Build Coastguard Worker     AACENC_EXT_PAYLOAD extPayload[MAX_TOTAL_EXT_PAYLOADS]);
391*e5436536SAndroid Build Coastguard Worker 
392*e5436536SAndroid Build Coastguard Worker /*---------------------------------------------------------------------------
393*e5436536SAndroid Build Coastguard Worker 
394*e5436536SAndroid Build Coastguard Worker     functionname:FDKaacEnc_Close
395*e5436536SAndroid Build Coastguard Worker     description: delete encoder instance
396*e5436536SAndroid Build Coastguard Worker     returns:
397*e5436536SAndroid Build Coastguard Worker 
398*e5436536SAndroid Build Coastguard Worker   ---------------------------------------------------------------------------*/
399*e5436536SAndroid Build Coastguard Worker 
400*e5436536SAndroid Build Coastguard Worker void FDKaacEnc_Close(HANDLE_AAC_ENC *phAacEnc); /* encoder handle */
401*e5436536SAndroid Build Coastguard Worker 
402*e5436536SAndroid Build Coastguard Worker #ifdef __cplusplus
403*e5436536SAndroid Build Coastguard Worker }
404*e5436536SAndroid Build Coastguard Worker #endif
405*e5436536SAndroid Build Coastguard Worker 
406*e5436536SAndroid Build Coastguard Worker #endif /* AACENC_H */
407