xref: /aosp_15_r20/external/aac/libSBRenc/include/sbr_encoder.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 - 2018 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 /**************************** SBR encoder library ******************************
96*e5436536SAndroid Build Coastguard Worker 
97*e5436536SAndroid Build Coastguard Worker    Author(s):
98*e5436536SAndroid Build Coastguard Worker 
99*e5436536SAndroid Build Coastguard Worker    Description: SBR encoder top level processing prototype
100*e5436536SAndroid Build Coastguard Worker 
101*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
102*e5436536SAndroid Build Coastguard Worker 
103*e5436536SAndroid Build Coastguard Worker #ifndef SBR_ENCODER_H
104*e5436536SAndroid Build Coastguard Worker #define SBR_ENCODER_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 "FDK_bitstream.h"
110*e5436536SAndroid Build Coastguard Worker 
111*e5436536SAndroid Build Coastguard Worker /* core coder helpers */
112*e5436536SAndroid Build Coastguard Worker #define MAX_TRANS_FAC 8
113*e5436536SAndroid Build Coastguard Worker #define MAX_CODEC_FRAME_RATIO 2
114*e5436536SAndroid Build Coastguard Worker #define MAX_PAYLOAD_SIZE 256
115*e5436536SAndroid Build Coastguard Worker 
116*e5436536SAndroid Build Coastguard Worker typedef enum codecType {
117*e5436536SAndroid Build Coastguard Worker   CODEC_AAC = 0,
118*e5436536SAndroid Build Coastguard Worker   CODEC_AACLD = 1,
119*e5436536SAndroid Build Coastguard Worker   CODEC_UNSPECIFIED = 99
120*e5436536SAndroid Build Coastguard Worker } CODEC_TYPE;
121*e5436536SAndroid Build Coastguard Worker 
122*e5436536SAndroid Build Coastguard Worker typedef struct {
123*e5436536SAndroid Build Coastguard Worker   INT bitRate;
124*e5436536SAndroid Build Coastguard Worker   INT nChannels;
125*e5436536SAndroid Build Coastguard Worker   INT sampleFreq;
126*e5436536SAndroid Build Coastguard Worker   INT transFac;
127*e5436536SAndroid Build Coastguard Worker   INT standardBitrate;
128*e5436536SAndroid Build Coastguard Worker } CODEC_PARAM;
129*e5436536SAndroid Build Coastguard Worker 
130*e5436536SAndroid Build Coastguard Worker typedef enum {
131*e5436536SAndroid Build Coastguard Worker   SBR_MONO,
132*e5436536SAndroid Build Coastguard Worker   SBR_LEFT_RIGHT,
133*e5436536SAndroid Build Coastguard Worker   SBR_COUPLING,
134*e5436536SAndroid Build Coastguard Worker   SBR_SWITCH_LRC
135*e5436536SAndroid Build Coastguard Worker } SBR_STEREO_MODE;
136*e5436536SAndroid Build Coastguard Worker 
137*e5436536SAndroid Build Coastguard Worker /* bitstream syntax flags */
138*e5436536SAndroid Build Coastguard Worker enum {
139*e5436536SAndroid Build Coastguard Worker   SBR_SYNTAX_LOW_DELAY = 0x0001,
140*e5436536SAndroid Build Coastguard Worker   SBR_SYNTAX_SCALABLE = 0x0002,
141*e5436536SAndroid Build Coastguard Worker   SBR_SYNTAX_CRC = 0x0004,
142*e5436536SAndroid Build Coastguard Worker   SBR_SYNTAX_DRM_CRC = 0x0008,
143*e5436536SAndroid Build Coastguard Worker   SBR_SYNTAX_ELD_REDUCED_DELAY = 0x0010
144*e5436536SAndroid Build Coastguard Worker };
145*e5436536SAndroid Build Coastguard Worker 
146*e5436536SAndroid Build Coastguard Worker typedef enum { FREQ_RES_LOW = 0, FREQ_RES_HIGH } FREQ_RES;
147*e5436536SAndroid Build Coastguard Worker 
148*e5436536SAndroid Build Coastguard Worker typedef struct {
149*e5436536SAndroid Build Coastguard Worker   CODEC_TYPE coreCoder; /*!< LC or ELD */
150*e5436536SAndroid Build Coastguard Worker   UINT bitrateFrom;     /*!< inclusive */
151*e5436536SAndroid Build Coastguard Worker   UINT bitrateTo;       /*!< exclusive */
152*e5436536SAndroid Build Coastguard Worker 
153*e5436536SAndroid Build Coastguard Worker   UINT sampleRate;   /*!<   */
154*e5436536SAndroid Build Coastguard Worker   UCHAR numChannels; /*!<   */
155*e5436536SAndroid Build Coastguard Worker 
156*e5436536SAndroid Build Coastguard Worker   UCHAR startFreq;       /*!< bs_start_freq */
157*e5436536SAndroid Build Coastguard Worker   UCHAR startFreqSpeech; /*!< bs_start_freq for speech config flag */
158*e5436536SAndroid Build Coastguard Worker   UCHAR stopFreq;        /*!< bs_stop_freq */
159*e5436536SAndroid Build Coastguard Worker   UCHAR stopFreqSpeech;  /*!< bs_stop_freq for speech config flag */
160*e5436536SAndroid Build Coastguard Worker 
161*e5436536SAndroid Build Coastguard Worker   UCHAR numNoiseBands;        /*!<   */
162*e5436536SAndroid Build Coastguard Worker   UCHAR noiseFloorOffset;     /*!<   */
163*e5436536SAndroid Build Coastguard Worker   SCHAR noiseMaxLevel;        /*!<   */
164*e5436536SAndroid Build Coastguard Worker   SBR_STEREO_MODE stereoMode; /*!<   */
165*e5436536SAndroid Build Coastguard Worker   UCHAR freqScale;            /*!<   */
166*e5436536SAndroid Build Coastguard Worker } sbrTuningTable_t;
167*e5436536SAndroid Build Coastguard Worker 
168*e5436536SAndroid Build Coastguard Worker typedef struct sbrConfiguration {
169*e5436536SAndroid Build Coastguard Worker   /*
170*e5436536SAndroid Build Coastguard Worker      core coder dependent configurations
171*e5436536SAndroid Build Coastguard Worker   */
172*e5436536SAndroid Build Coastguard Worker   CODEC_PARAM
173*e5436536SAndroid Build Coastguard Worker   codecSettings; /*!< Core coder settings. To be set from core coder. */
174*e5436536SAndroid Build Coastguard Worker   INT SendHeaderDataTime; /*!< SBR header send update frequency in ms. */
175*e5436536SAndroid Build Coastguard Worker   INT useWaveCoding;      /*!< Flag: usage of wavecoding tool. */
176*e5436536SAndroid Build Coastguard Worker   INT crcSbr;             /*!< Flag: usage of SBR-CRC. */
177*e5436536SAndroid Build Coastguard Worker   INT dynBwSupported;     /*!< Flag: support for dynamic bandwidth in this
178*e5436536SAndroid Build Coastguard Worker                              combination. */
179*e5436536SAndroid Build Coastguard Worker   INT parametricCoding;   /*!< Flag: usage of parametric coding tool. */
180*e5436536SAndroid Build Coastguard Worker   INT downSampleFactor; /*!< Sampling rate relation between the SBR and the core
181*e5436536SAndroid Build Coastguard Worker                            encoder. */
182*e5436536SAndroid Build Coastguard Worker   FREQ_RES freq_res_fixfix[2]; /*!< Frequency resolution of envelopes in frame
183*e5436536SAndroid Build Coastguard Worker                                   class FIXFIX, for non-split case and split
184*e5436536SAndroid Build Coastguard Worker                                   case */
185*e5436536SAndroid Build Coastguard Worker   UCHAR fResTransIsLow; /*!< Frequency resolution of envelopes in transient
186*e5436536SAndroid Build Coastguard Worker                            frames: low (0) or variable (1) */
187*e5436536SAndroid Build Coastguard Worker 
188*e5436536SAndroid Build Coastguard Worker   /*
189*e5436536SAndroid Build Coastguard Worker      core coder dependent tuning parameters
190*e5436536SAndroid Build Coastguard Worker   */
191*e5436536SAndroid Build Coastguard Worker   INT tran_thr;         /*!< SBR transient detector threshold (* 100). */
192*e5436536SAndroid Build Coastguard Worker   INT noiseFloorOffset; /*!< Noise floor offset.      */
193*e5436536SAndroid Build Coastguard Worker   UINT useSpeechConfig; /*!< Flag: adapt tuning parameters according to speech.
194*e5436536SAndroid Build Coastguard Worker                          */
195*e5436536SAndroid Build Coastguard Worker 
196*e5436536SAndroid Build Coastguard Worker   /*
197*e5436536SAndroid Build Coastguard Worker      core coder independent configurations
198*e5436536SAndroid Build Coastguard Worker   */
199*e5436536SAndroid Build Coastguard Worker   INT sbrFrameSize; /*!< SBR frame size in samples. Will be calculated from core
200*e5436536SAndroid Build Coastguard Worker                        coder settings. */
201*e5436536SAndroid Build Coastguard Worker   INT sbr_data_extra; /*!< Flag usage of data extra. */
202*e5436536SAndroid Build Coastguard Worker   INT amp_res;        /*!< Amplitude resolution. */
203*e5436536SAndroid Build Coastguard Worker   INT ana_max_level;  /*!< Noise insertion maximum level. */
204*e5436536SAndroid Build Coastguard Worker   INT tran_fc;        /*!< Transient detector start frequency. */
205*e5436536SAndroid Build Coastguard Worker   INT tran_det_mode;  /*!< Transient detector mode. */
206*e5436536SAndroid Build Coastguard Worker   INT spread;         /*!< Flag: usage of SBR spread. */
207*e5436536SAndroid Build Coastguard Worker   INT stat;           /*!< Flag: usage of static framing. */
208*e5436536SAndroid Build Coastguard Worker   INT e;              /*!< Number of envelopes when static framing is chosen. */
209*e5436536SAndroid Build Coastguard Worker   SBR_STEREO_MODE stereoMode; /*!< SBR stereo mode. */
210*e5436536SAndroid Build Coastguard Worker   INT deltaTAcrossFrames;     /*!< Flag: allow time-delta coding. */
211*e5436536SAndroid Build Coastguard Worker   FIXP_DBL dF_edge_1stEnv; /*!< Extra fraction delta-F coding is allowed to be
212*e5436536SAndroid Build Coastguard Worker                               more expensive. */
213*e5436536SAndroid Build Coastguard Worker   FIXP_DBL dF_edge_incr;   /*!< Increment dF_edge_1stEnv this much if dT-coding
214*e5436536SAndroid Build Coastguard Worker                               was used this frame. */
215*e5436536SAndroid Build Coastguard Worker   INT sbr_invf_mode;       /*!< Inverse filtering mode. */
216*e5436536SAndroid Build Coastguard Worker   INT sbr_xpos_mode;       /*!< Transposer mode. */
217*e5436536SAndroid Build Coastguard Worker   INT sbr_xpos_ctrl;       /*!< Transposer control. */
218*e5436536SAndroid Build Coastguard Worker   INT sbr_xpos_level;      /*!< Transposer 3rd order level. */
219*e5436536SAndroid Build Coastguard Worker   INT startFreq;           /*!< The start frequency table index. */
220*e5436536SAndroid Build Coastguard Worker   INT stopFreq;            /*!< The stop frequency table index. */
221*e5436536SAndroid Build Coastguard Worker   INT useSaPan;            /*!< Flag: usage of SAPAN stereo. */
222*e5436536SAndroid Build Coastguard Worker   INT dynBwEnabled;        /*!< Flag: usage of dynamic bandwidth. */
223*e5436536SAndroid Build Coastguard Worker   INT bParametricStereo;   /*!< Flag: usage of parametric stereo coding tool. */
224*e5436536SAndroid Build Coastguard Worker 
225*e5436536SAndroid Build Coastguard Worker   /*
226*e5436536SAndroid Build Coastguard Worker      header_extra1 configuration
227*e5436536SAndroid Build Coastguard Worker   */
228*e5436536SAndroid Build Coastguard Worker   UCHAR freqScale;     /*!< Frequency grouping. */
229*e5436536SAndroid Build Coastguard Worker   INT alterScale;      /*!< Scale resolution. */
230*e5436536SAndroid Build Coastguard Worker   INT sbr_noise_bands; /*!< Number of noise bands. */
231*e5436536SAndroid Build Coastguard Worker 
232*e5436536SAndroid Build Coastguard Worker   /*
233*e5436536SAndroid Build Coastguard Worker      header_extra2 configuration
234*e5436536SAndroid Build Coastguard Worker   */
235*e5436536SAndroid Build Coastguard Worker   INT sbr_limiter_bands;    /*!< Number of limiter bands. */
236*e5436536SAndroid Build Coastguard Worker   INT sbr_limiter_gains;    /*!< Gain of limiter. */
237*e5436536SAndroid Build Coastguard Worker   INT sbr_interpol_freq;    /*!< Flag: use interpolation in freq. direction. */
238*e5436536SAndroid Build Coastguard Worker   INT sbr_smoothing_length; /*!< Flag: choose length 4 or 0 (=on, off). */
239*e5436536SAndroid Build Coastguard Worker   UCHAR init_amp_res_FF;
240*e5436536SAndroid Build Coastguard Worker   FIXP_DBL threshold_AmpRes_FF_m;
241*e5436536SAndroid Build Coastguard Worker   SCHAR threshold_AmpRes_FF_e;
242*e5436536SAndroid Build Coastguard Worker } sbrConfiguration, *sbrConfigurationPtr;
243*e5436536SAndroid Build Coastguard Worker 
244*e5436536SAndroid Build Coastguard Worker typedef struct SBR_CONFIG_DATA {
245*e5436536SAndroid Build Coastguard Worker   UINT sbrSyntaxFlags; /**< SBR syntax flags derived from AOT. */
246*e5436536SAndroid Build Coastguard Worker   INT nChannels;       /**< Number of channels.  */
247*e5436536SAndroid Build Coastguard Worker 
248*e5436536SAndroid Build Coastguard Worker   INT nSfb[2]; /**< Number of SBR scalefactor bands for LO_RES and HI_RES (?) */
249*e5436536SAndroid Build Coastguard Worker   INT num_Master; /**< Number of elements in v_k_master. */
250*e5436536SAndroid Build Coastguard Worker   INT sampleFreq; /**< SBR sampling frequency. */
251*e5436536SAndroid Build Coastguard Worker   INT frameSize;
252*e5436536SAndroid Build Coastguard Worker   INT xOverFreq;    /**< The SBR start frequency. */
253*e5436536SAndroid Build Coastguard Worker   INT dynXOverFreq; /**< Used crossover frequency when dynamic bandwidth is
254*e5436536SAndroid Build Coastguard Worker                        enabled. */
255*e5436536SAndroid Build Coastguard Worker 
256*e5436536SAndroid Build Coastguard Worker   INT noQmfBands; /**< Number of QMF frequency bands. */
257*e5436536SAndroid Build Coastguard Worker   INT noQmfSlots; /**< Number of QMF slots. */
258*e5436536SAndroid Build Coastguard Worker 
259*e5436536SAndroid Build Coastguard Worker   UCHAR *freqBandTable[2]; /**< Frequency table for low and hires, only
260*e5436536SAndroid Build Coastguard Worker                               MAX_FREQ_COEFFS/2 +1 coeffs actually needed for
261*e5436536SAndroid Build Coastguard Worker                               lowres. */
262*e5436536SAndroid Build Coastguard Worker   UCHAR
263*e5436536SAndroid Build Coastguard Worker   *v_k_master; /**< Master BandTable where freqBandTable is derived from. */
264*e5436536SAndroid Build Coastguard Worker 
265*e5436536SAndroid Build Coastguard Worker   SBR_STEREO_MODE stereoMode;
266*e5436536SAndroid Build Coastguard Worker   INT noEnvChannels; /**< Number of envelope channels. */
267*e5436536SAndroid Build Coastguard Worker 
268*e5436536SAndroid Build Coastguard Worker   INT useWaveCoding; /**< Flag indicates whether to use wave coding at all. */
269*e5436536SAndroid Build Coastguard Worker   INT useParametricCoding; /**< Flag indicates whether to use para coding at
270*e5436536SAndroid Build Coastguard Worker                               all.      */
271*e5436536SAndroid Build Coastguard Worker   INT xposCtrlSwitch;    /**< Flag indicates whether to switch xpos ctrl on the
272*e5436536SAndroid Build Coastguard Worker                             fly. */
273*e5436536SAndroid Build Coastguard Worker   INT switchTransposers; /**< Flag indicates whether to switch xpos on the fly .
274*e5436536SAndroid Build Coastguard Worker                           */
275*e5436536SAndroid Build Coastguard Worker   UCHAR initAmpResFF;
276*e5436536SAndroid Build Coastguard Worker   FIXP_DBL thresholdAmpResFF_m;
277*e5436536SAndroid Build Coastguard Worker   SCHAR thresholdAmpResFF_e;
278*e5436536SAndroid Build Coastguard Worker } SBR_CONFIG_DATA, *HANDLE_SBR_CONFIG_DATA;
279*e5436536SAndroid Build Coastguard Worker 
280*e5436536SAndroid Build Coastguard Worker typedef struct {
281*e5436536SAndroid Build Coastguard Worker   MP4_ELEMENT_ID elType;
282*e5436536SAndroid Build Coastguard Worker   INT bitRate;
283*e5436536SAndroid Build Coastguard Worker   int instanceTag;
284*e5436536SAndroid Build Coastguard Worker   UCHAR fParametricStereo;
285*e5436536SAndroid Build Coastguard Worker   UCHAR fDualMono; /**< This flags allows to disable coupling in sbr channel
286*e5436536SAndroid Build Coastguard Worker                       pair element */
287*e5436536SAndroid Build Coastguard Worker   UCHAR nChannelsInEl;
288*e5436536SAndroid Build Coastguard Worker   UCHAR ChannelIndex[2];
289*e5436536SAndroid Build Coastguard Worker } SBR_ELEMENT_INFO;
290*e5436536SAndroid Build Coastguard Worker 
291*e5436536SAndroid Build Coastguard Worker #ifdef __cplusplus
292*e5436536SAndroid Build Coastguard Worker extern "C" {
293*e5436536SAndroid Build Coastguard Worker #endif
294*e5436536SAndroid Build Coastguard Worker 
295*e5436536SAndroid Build Coastguard Worker typedef struct SBR_ENCODER *HANDLE_SBR_ENCODER;
296*e5436536SAndroid Build Coastguard Worker 
297*e5436536SAndroid Build Coastguard Worker /**
298*e5436536SAndroid Build Coastguard Worker  * \brief  Get the max required input buffer size including delay balancing
299*e5436536SAndroid Build Coastguard Worker  * space for N audio channels.
300*e5436536SAndroid Build Coastguard Worker  * \param noChannels  Number of audio channels.
301*e5436536SAndroid Build Coastguard Worker  * \return            Max required input buffer size in bytes.
302*e5436536SAndroid Build Coastguard Worker  */
303*e5436536SAndroid Build Coastguard Worker INT sbrEncoder_GetInBufferSize(int noChannels);
304*e5436536SAndroid Build Coastguard Worker 
305*e5436536SAndroid Build Coastguard Worker INT sbrEncoder_Open(HANDLE_SBR_ENCODER *phSbrEncoder, INT nElements,
306*e5436536SAndroid Build Coastguard Worker                     INT nChannels, INT supportPS);
307*e5436536SAndroid Build Coastguard Worker 
308*e5436536SAndroid Build Coastguard Worker /**
309*e5436536SAndroid Build Coastguard Worker  * \brief                 Get closest working bitrate to specified desired
310*e5436536SAndroid Build Coastguard Worker  *                        bitrate for a single SBR element.
311*e5436536SAndroid Build Coastguard Worker  * \param bitRate         The desired target bit rate
312*e5436536SAndroid Build Coastguard Worker  * \param numChannels     The amount of audio channels
313*e5436536SAndroid Build Coastguard Worker  * \param coreSampleRate  The sample rate of the core coder
314*e5436536SAndroid Build Coastguard Worker  * \param aot             The current Audio Object Type
315*e5436536SAndroid Build Coastguard Worker  * \return                Closest working bit rate to bitRate value
316*e5436536SAndroid Build Coastguard Worker  */
317*e5436536SAndroid Build Coastguard Worker UINT sbrEncoder_LimitBitRate(UINT bitRate, UINT numChannels,
318*e5436536SAndroid Build Coastguard Worker                              UINT coreSampleRate, AUDIO_OBJECT_TYPE aot);
319*e5436536SAndroid Build Coastguard Worker 
320*e5436536SAndroid Build Coastguard Worker /**
321*e5436536SAndroid Build Coastguard Worker  * \brief                Check whether downsampled SBR single rate is possible
322*e5436536SAndroid Build Coastguard Worker  *                       with given audio object type.
323*e5436536SAndroid Build Coastguard Worker  * \param aot            The Audio object type.
324*e5436536SAndroid Build Coastguard Worker  * \return               0 when downsampled SBR is not possible,
325*e5436536SAndroid Build Coastguard Worker  *                       1 when downsampled SBR is possible.
326*e5436536SAndroid Build Coastguard Worker  */
327*e5436536SAndroid Build Coastguard Worker UINT sbrEncoder_IsSingleRatePossible(AUDIO_OBJECT_TYPE aot);
328*e5436536SAndroid Build Coastguard Worker 
329*e5436536SAndroid Build Coastguard Worker /**
330*e5436536SAndroid Build Coastguard Worker  * \brief                  Initialize SBR Encoder instance.
331*e5436536SAndroid Build Coastguard Worker  * \param phSbrEncoder     Pointer to a SBR Encoder instance.
332*e5436536SAndroid Build Coastguard Worker  * \param elInfo           Structure that describes the element/channel
333*e5436536SAndroid Build Coastguard Worker  * arrangement.
334*e5436536SAndroid Build Coastguard Worker  * \param noElements       Amount of elements described in elInfo.
335*e5436536SAndroid Build Coastguard Worker  * \param inputBuffer      Pointer to the encoder audio buffer
336*e5436536SAndroid Build Coastguard Worker  * \param inputBufferBufSize    Buffer offset of one channel (frameSize + delay)
337*e5436536SAndroid Build Coastguard Worker  * \param bandwidth        Returns the core audio encoder bandwidth (output)
338*e5436536SAndroid Build Coastguard Worker  * \param bufferOffset     Returns the offset for the audio input data in order
339*e5436536SAndroid Build Coastguard Worker  * to do delay balancing.
340*e5436536SAndroid Build Coastguard Worker  * \param numChannels      Input: Encoder input channels. output: core encoder
341*e5436536SAndroid Build Coastguard Worker  * channels.
342*e5436536SAndroid Build Coastguard Worker  * \param sampleRate       Input: Encoder samplerate. output core encoder
343*e5436536SAndroid Build Coastguard Worker  * samplerate.
344*e5436536SAndroid Build Coastguard Worker  * \param downSampleFactor Input: Relation between SBR and core coder sampling
345*e5436536SAndroid Build Coastguard Worker  * rate;
346*e5436536SAndroid Build Coastguard Worker  * \param frameLength      Input: Encoder frameLength. output core encoder
347*e5436536SAndroid Build Coastguard Worker  * frameLength.
348*e5436536SAndroid Build Coastguard Worker  * \param aot              Input: AOT..
349*e5436536SAndroid Build Coastguard Worker  * \param delay            Input: core encoder delay. Output: total delay
350*e5436536SAndroid Build Coastguard Worker  * because of SBR.
351*e5436536SAndroid Build Coastguard Worker  * \param transformFactor  The core encoder transform factor (blockswitching).
352*e5436536SAndroid Build Coastguard Worker  * \param headerPeriod     Repetition rate of the SBR header:
353*e5436536SAndroid Build Coastguard Worker  *                           - (-1) means intern configuration.
354*e5436536SAndroid Build Coastguard Worker  *                           - (1-10) corresponds to header repetition rate in
355*e5436536SAndroid Build Coastguard Worker  * frames.
356*e5436536SAndroid Build Coastguard Worker  * \return                 0 on success, and non-zero if failed.
357*e5436536SAndroid Build Coastguard Worker  */
358*e5436536SAndroid Build Coastguard Worker INT sbrEncoder_Init(HANDLE_SBR_ENCODER hSbrEncoder,
359*e5436536SAndroid Build Coastguard Worker                     SBR_ELEMENT_INFO elInfo[(8)], int noElements,
360*e5436536SAndroid Build Coastguard Worker                     INT_PCM *inputBuffer, UINT inputBufferBufSize,
361*e5436536SAndroid Build Coastguard Worker                     INT *coreBandwidth, INT *inputBufferOffset,
362*e5436536SAndroid Build Coastguard Worker                     INT *numChannels, const UINT syntaxFlags, INT *sampleRate,
363*e5436536SAndroid Build Coastguard Worker                     UINT *downSampleFactor, INT *frameLength,
364*e5436536SAndroid Build Coastguard Worker                     AUDIO_OBJECT_TYPE aot, int *delay, int transformFactor,
365*e5436536SAndroid Build Coastguard Worker                     const int headerPeriod, ULONG statesInitFlag);
366*e5436536SAndroid Build Coastguard Worker 
367*e5436536SAndroid Build Coastguard Worker /**
368*e5436536SAndroid Build Coastguard Worker  * \brief             Do delay line buffers housekeeping. To be called after
369*e5436536SAndroid Build Coastguard Worker  * each encoded audio frame.
370*e5436536SAndroid Build Coastguard Worker  * \param hEnvEnc     SBR Encoder handle.
371*e5436536SAndroid Build Coastguard Worker  * \param timeBuffer  Pointer to the encoder audio buffer.
372*e5436536SAndroid Build Coastguard Worker  * \param timeBufferBufSIze buffer size for one channel
373*e5436536SAndroid Build Coastguard Worker  * \return            0 on success, and non-zero if failed.
374*e5436536SAndroid Build Coastguard Worker  */
375*e5436536SAndroid Build Coastguard Worker INT sbrEncoder_UpdateBuffers(HANDLE_SBR_ENCODER hEnvEnc, INT_PCM *timeBuffer,
376*e5436536SAndroid Build Coastguard Worker                              UINT timeBufferBufSIze);
377*e5436536SAndroid Build Coastguard Worker 
378*e5436536SAndroid Build Coastguard Worker /**
379*e5436536SAndroid Build Coastguard Worker  * \brief               Close SBR encoder instance.
380*e5436536SAndroid Build Coastguard Worker  * \param phEbrEncoder  Handle of SBR encoder instance to be closed.
381*e5436536SAndroid Build Coastguard Worker  * \return              void
382*e5436536SAndroid Build Coastguard Worker  */
383*e5436536SAndroid Build Coastguard Worker void sbrEncoder_Close(HANDLE_SBR_ENCODER *phEbrEncoder);
384*e5436536SAndroid Build Coastguard Worker 
385*e5436536SAndroid Build Coastguard Worker /**
386*e5436536SAndroid Build Coastguard Worker  * \brief               Encode SBR data of one complete audio frame.
387*e5436536SAndroid Build Coastguard Worker  * \param hEnvEncoder   Handle of SBR encoder instance.
388*e5436536SAndroid Build Coastguard Worker  * \param samples       Time samples, not interleaved.
389*e5436536SAndroid Build Coastguard Worker  * \param timeInStride  Channel offset of samples buffer.
390*e5436536SAndroid Build Coastguard Worker  * \param sbrDataBits   Size of SBR payload in bits.
391*e5436536SAndroid Build Coastguard Worker  * \param sbrData       SBR payload.
392*e5436536SAndroid Build Coastguard Worker  * \return              0 on success, and non-zero if failed.
393*e5436536SAndroid Build Coastguard Worker  */
394*e5436536SAndroid Build Coastguard Worker INT sbrEncoder_EncodeFrame(HANDLE_SBR_ENCODER hEnvEncoder, INT_PCM *samples,
395*e5436536SAndroid Build Coastguard Worker                            UINT samplesBufSize, UINT sbrDataBits[(8)],
396*e5436536SAndroid Build Coastguard Worker                            UCHAR sbrData[(8)][MAX_PAYLOAD_SIZE]);
397*e5436536SAndroid Build Coastguard Worker 
398*e5436536SAndroid Build Coastguard Worker /**
399*e5436536SAndroid Build Coastguard Worker  * \brief               Write SBR headers of one SBR element.
400*e5436536SAndroid Build Coastguard Worker  * \param sbrEncoder    Handle of the SBR encoder instance.
401*e5436536SAndroid Build Coastguard Worker  * \param hBs           Handle of bit stream handle to write SBR header to.
402*e5436536SAndroid Build Coastguard Worker  * \param element_index Index of the SBR element which header should be written.
403*e5436536SAndroid Build Coastguard Worker  * \param fSendHeaders  Flag indicating that the SBR encoder should send more
404*e5436536SAndroid Build Coastguard Worker  * headers in the SBR payload or not.
405*e5436536SAndroid Build Coastguard Worker  * \return              void
406*e5436536SAndroid Build Coastguard Worker  */
407*e5436536SAndroid Build Coastguard Worker void sbrEncoder_GetHeader(HANDLE_SBR_ENCODER sbrEncoder,
408*e5436536SAndroid Build Coastguard Worker                           HANDLE_FDK_BITSTREAM hBs, INT element_index,
409*e5436536SAndroid Build Coastguard Worker                           int fSendHeaders);
410*e5436536SAndroid Build Coastguard Worker 
411*e5436536SAndroid Build Coastguard Worker /**
412*e5436536SAndroid Build Coastguard Worker  * \brief              Request to write SBR header.
413*e5436536SAndroid Build Coastguard Worker  * \param hSbrEncoder  SBR encoder handle.
414*e5436536SAndroid Build Coastguard Worker  * \return             0 on success, and non-zero if failed.
415*e5436536SAndroid Build Coastguard Worker  */
416*e5436536SAndroid Build Coastguard Worker INT sbrEncoder_SendHeader(HANDLE_SBR_ENCODER hSbrEncoder);
417*e5436536SAndroid Build Coastguard Worker 
418*e5436536SAndroid Build Coastguard Worker /**
419*e5436536SAndroid Build Coastguard Worker  * \brief              Request if last sbr payload contains an SBR header.
420*e5436536SAndroid Build Coastguard Worker  * \param hSbrEncoder  SBR encoder handle.
421*e5436536SAndroid Build Coastguard Worker  * \return             1 contains sbr header, 0 without sbr header.
422*e5436536SAndroid Build Coastguard Worker  */
423*e5436536SAndroid Build Coastguard Worker INT sbrEncoder_ContainsHeader(HANDLE_SBR_ENCODER hSbrEncoder);
424*e5436536SAndroid Build Coastguard Worker 
425*e5436536SAndroid Build Coastguard Worker /**
426*e5436536SAndroid Build Coastguard Worker  * \brief              SBR header delay in frames.
427*e5436536SAndroid Build Coastguard Worker  * \param hSbrEncoder  SBR encoder handle.
428*e5436536SAndroid Build Coastguard Worker  * \return             Delay in frames, -1 on failure.
429*e5436536SAndroid Build Coastguard Worker  */
430*e5436536SAndroid Build Coastguard Worker INT sbrEncoder_GetHeaderDelay(HANDLE_SBR_ENCODER hSbrEncoder);
431*e5436536SAndroid Build Coastguard Worker 
432*e5436536SAndroid Build Coastguard Worker /**
433*e5436536SAndroid Build Coastguard Worker  * \brief              Bitstrem delay in SBR frames.
434*e5436536SAndroid Build Coastguard Worker  * \param hSbrEncoder  SBR encoder handle.
435*e5436536SAndroid Build Coastguard Worker  * \return             Delay in frames, -1 on failure.
436*e5436536SAndroid Build Coastguard Worker  */
437*e5436536SAndroid Build Coastguard Worker INT sbrEncoder_GetBsDelay(HANDLE_SBR_ENCODER hSbrEncoder);
438*e5436536SAndroid Build Coastguard Worker 
439*e5436536SAndroid Build Coastguard Worker /**
440*e5436536SAndroid Build Coastguard Worker  * \brief              Prepare SBR payload for SAP.
441*e5436536SAndroid Build Coastguard Worker  * \param hSbrEncoder  SBR encoder handle.
442*e5436536SAndroid Build Coastguard Worker  * \return             0 on success, and non-zero if failed.
443*e5436536SAndroid Build Coastguard Worker  */
444*e5436536SAndroid Build Coastguard Worker INT sbrEncoder_SAPPrepare(HANDLE_SBR_ENCODER hSbrEncoder);
445*e5436536SAndroid Build Coastguard Worker 
446*e5436536SAndroid Build Coastguard Worker /**
447*e5436536SAndroid Build Coastguard Worker  * \brief              SBR encoder bitrate estimation.
448*e5436536SAndroid Build Coastguard Worker  * \param hSbrEncoder  SBR encoder handle.
449*e5436536SAndroid Build Coastguard Worker  * \return             Estimated bitrate.
450*e5436536SAndroid Build Coastguard Worker  */
451*e5436536SAndroid Build Coastguard Worker INT sbrEncoder_GetEstimateBitrate(HANDLE_SBR_ENCODER hSbrEncoder);
452*e5436536SAndroid Build Coastguard Worker 
453*e5436536SAndroid Build Coastguard Worker /**
454*e5436536SAndroid Build Coastguard Worker  * \brief              Delay between input data and downsampled output data.
455*e5436536SAndroid Build Coastguard Worker  * \param hSbrEncoder  SBR encoder handle.
456*e5436536SAndroid Build Coastguard Worker  * \return             Delay.
457*e5436536SAndroid Build Coastguard Worker  */
458*e5436536SAndroid Build Coastguard Worker INT sbrEncoder_GetInputDataDelay(HANDLE_SBR_ENCODER hSbrEncoder);
459*e5436536SAndroid Build Coastguard Worker 
460*e5436536SAndroid Build Coastguard Worker /**
461*e5436536SAndroid Build Coastguard Worker  * \brief              Delay caused by the SBR decoder.
462*e5436536SAndroid Build Coastguard Worker  * \param hSbrEncoder  SBR encoder handle.
463*e5436536SAndroid Build Coastguard Worker  * \return             Delay.
464*e5436536SAndroid Build Coastguard Worker  */
465*e5436536SAndroid Build Coastguard Worker INT sbrEncoder_GetSbrDecDelay(HANDLE_SBR_ENCODER hSbrEncoder);
466*e5436536SAndroid Build Coastguard Worker 
467*e5436536SAndroid Build Coastguard Worker /**
468*e5436536SAndroid Build Coastguard Worker  * \brief       Get decoder library version info.
469*e5436536SAndroid Build Coastguard Worker  * \param info  Pointer to an allocated LIB_INFO struct, where library info is
470*e5436536SAndroid Build Coastguard Worker  * written to.
471*e5436536SAndroid Build Coastguard Worker  * \return      0 on sucess.
472*e5436536SAndroid Build Coastguard Worker  */
473*e5436536SAndroid Build Coastguard Worker INT sbrEncoder_GetLibInfo(LIB_INFO *info);
474*e5436536SAndroid Build Coastguard Worker 
475*e5436536SAndroid Build Coastguard Worker void sbrPrintRAM(void);
476*e5436536SAndroid Build Coastguard Worker 
477*e5436536SAndroid Build Coastguard Worker void sbrPrintROM(void);
478*e5436536SAndroid Build Coastguard Worker 
479*e5436536SAndroid Build Coastguard Worker #ifdef __cplusplus
480*e5436536SAndroid Build Coastguard Worker }
481*e5436536SAndroid Build Coastguard Worker #endif
482*e5436536SAndroid Build Coastguard Worker 
483*e5436536SAndroid Build Coastguard Worker #endif /* ifndef __SBR_MAIN_H */
484