xref: /aosp_15_r20/external/aac/libSBRdec/src/env_extr.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 decoder library ******************************
96*e5436536SAndroid Build Coastguard Worker 
97*e5436536SAndroid Build Coastguard Worker    Author(s):
98*e5436536SAndroid Build Coastguard Worker 
99*e5436536SAndroid Build Coastguard Worker    Description:
100*e5436536SAndroid Build Coastguard Worker 
101*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
102*e5436536SAndroid Build Coastguard Worker 
103*e5436536SAndroid Build Coastguard Worker /*!
104*e5436536SAndroid Build Coastguard Worker   \file
105*e5436536SAndroid Build Coastguard Worker   \brief  Envelope extraction prototypes
106*e5436536SAndroid Build Coastguard Worker */
107*e5436536SAndroid Build Coastguard Worker 
108*e5436536SAndroid Build Coastguard Worker #ifndef ENV_EXTR_H
109*e5436536SAndroid Build Coastguard Worker #define ENV_EXTR_H
110*e5436536SAndroid Build Coastguard Worker 
111*e5436536SAndroid Build Coastguard Worker #include "sbrdecoder.h"
112*e5436536SAndroid Build Coastguard Worker 
113*e5436536SAndroid Build Coastguard Worker #include "FDK_bitstream.h"
114*e5436536SAndroid Build Coastguard Worker #include "lpp_tran.h"
115*e5436536SAndroid Build Coastguard Worker 
116*e5436536SAndroid Build Coastguard Worker #include "psdec.h"
117*e5436536SAndroid Build Coastguard Worker #include "pvc_dec.h"
118*e5436536SAndroid Build Coastguard Worker 
119*e5436536SAndroid Build Coastguard Worker #define ENV_EXP_FRACT 0
120*e5436536SAndroid Build Coastguard Worker /*!< Shift raw envelope data to support fractional numbers.
121*e5436536SAndroid Build Coastguard Worker   Can be set to 8 instead of 0 to enhance accuracy during concealment.
122*e5436536SAndroid Build Coastguard Worker   This is not required for conformance and #requantizeEnvelopeData() will
123*e5436536SAndroid Build Coastguard Worker   become more expensive.
124*e5436536SAndroid Build Coastguard Worker */
125*e5436536SAndroid Build Coastguard Worker 
126*e5436536SAndroid Build Coastguard Worker #define EXP_BITS 6
127*e5436536SAndroid Build Coastguard Worker /*!< Size of exponent-part of a pseudo float envelope value (should be at least
128*e5436536SAndroid Build Coastguard Worker   6). The remaining bits in each word are used for the mantissa (should be at
129*e5436536SAndroid Build Coastguard Worker   least 10). This format is used in the arrays iEnvelope[] and
130*e5436536SAndroid Build Coastguard Worker   sbrNoiseFloorLevel[] in the FRAME_DATA struct which must fit in a certain part
131*e5436536SAndroid Build Coastguard Worker   of the output buffer (See buffer management in sbr_dec.cpp). Exponents and
132*e5436536SAndroid Build Coastguard Worker   mantissas could also be stored in separate arrays. Accessing the exponent or
133*e5436536SAndroid Build Coastguard Worker   the mantissa would be simplified and the masks #MASK_E resp. #MASK_M would
134*e5436536SAndroid Build Coastguard Worker   no longer be required.
135*e5436536SAndroid Build Coastguard Worker */
136*e5436536SAndroid Build Coastguard Worker 
137*e5436536SAndroid Build Coastguard Worker #define MASK_M                                                          \
138*e5436536SAndroid Build Coastguard Worker   (((1 << (FRACT_BITS - EXP_BITS)) - 1)                                 \
139*e5436536SAndroid Build Coastguard Worker    << EXP_BITS) /*!< Mask for extracting the mantissa of a pseudo float \
140*e5436536SAndroid Build Coastguard Worker                    envelope value */
141*e5436536SAndroid Build Coastguard Worker #define MASK_E                                                            \
142*e5436536SAndroid Build Coastguard Worker   ((1 << EXP_BITS) - 1) /*!< Mask for extracting the exponent of a pseudo \
143*e5436536SAndroid Build Coastguard Worker                            float envelope value */
144*e5436536SAndroid Build Coastguard Worker 
145*e5436536SAndroid Build Coastguard Worker #define SIGN_EXT \
146*e5436536SAndroid Build Coastguard Worker   (((SCHAR)-1) ^ \
147*e5436536SAndroid Build Coastguard Worker    MASK_E) /*!< a CHAR-constant with all bits above our sign-bit set */
148*e5436536SAndroid Build Coastguard Worker #define ROUNDING                                                           \
149*e5436536SAndroid Build Coastguard Worker   ((FIXP_SGL)(                                                             \
150*e5436536SAndroid Build Coastguard Worker       1 << (EXP_BITS - 1))) /*!< 0.5-offset for rounding the mantissa of a \
151*e5436536SAndroid Build Coastguard Worker                                pseudo-float envelope value */
152*e5436536SAndroid Build Coastguard Worker #define NRG_EXP_OFFSET                                                         \
153*e5436536SAndroid Build Coastguard Worker   16 /*!< Will be added to the reference energy's exponent to prevent negative \
154*e5436536SAndroid Build Coastguard Worker         numbers */
155*e5436536SAndroid Build Coastguard Worker #define NOISE_EXP_OFFSET                                                \
156*e5436536SAndroid Build Coastguard Worker   38 /*!< Will be added to the noise level exponent to prevent negative \
157*e5436536SAndroid Build Coastguard Worker         numbers */
158*e5436536SAndroid Build Coastguard Worker 
159*e5436536SAndroid Build Coastguard Worker #define ADD_HARMONICS_FLAGS_SIZE 2 /* ceil(MAX_FREQ_COEFFS/32) */
160*e5436536SAndroid Build Coastguard Worker 
161*e5436536SAndroid Build Coastguard Worker typedef enum {
162*e5436536SAndroid Build Coastguard Worker   HEADER_NOT_PRESENT,
163*e5436536SAndroid Build Coastguard Worker   HEADER_ERROR,
164*e5436536SAndroid Build Coastguard Worker   HEADER_OK,
165*e5436536SAndroid Build Coastguard Worker   HEADER_RESET
166*e5436536SAndroid Build Coastguard Worker } SBR_HEADER_STATUS;
167*e5436536SAndroid Build Coastguard Worker 
168*e5436536SAndroid Build Coastguard Worker typedef enum {
169*e5436536SAndroid Build Coastguard Worker   SBR_NOT_INITIALIZED = 0,
170*e5436536SAndroid Build Coastguard Worker   UPSAMPLING = 1,
171*e5436536SAndroid Build Coastguard Worker   SBR_HEADER = 2,
172*e5436536SAndroid Build Coastguard Worker   SBR_ACTIVE = 3
173*e5436536SAndroid Build Coastguard Worker } SBR_SYNC_STATE;
174*e5436536SAndroid Build Coastguard Worker 
175*e5436536SAndroid Build Coastguard Worker typedef enum { COUPLING_OFF = 0, COUPLING_LEVEL, COUPLING_BAL } COUPLING_MODE;
176*e5436536SAndroid Build Coastguard Worker 
177*e5436536SAndroid Build Coastguard Worker typedef struct {
178*e5436536SAndroid Build Coastguard Worker   UCHAR nSfb[2]; /*!< Number of SBR-bands for low and high freq-resolution */
179*e5436536SAndroid Build Coastguard Worker   UCHAR nNfb;    /*!< Actual number of noise bands to read from the bitstream*/
180*e5436536SAndroid Build Coastguard Worker   UCHAR numMaster;      /*!< Number of SBR-bands in v_k_master */
181*e5436536SAndroid Build Coastguard Worker   UCHAR lowSubband;     /*!< QMF-band where SBR frequency range starts */
182*e5436536SAndroid Build Coastguard Worker   UCHAR highSubband;    /*!< QMF-band where SBR frequency range ends */
183*e5436536SAndroid Build Coastguard Worker   UCHAR ov_highSubband; /*!< if headerchange applies this value holds the old
184*e5436536SAndroid Build Coastguard Worker                            highband value -> highband value of overlap area;
185*e5436536SAndroid Build Coastguard Worker                              required for overlap in usac when headerchange
186*e5436536SAndroid Build Coastguard Worker                            occurs between XVAR and VARX frame */
187*e5436536SAndroid Build Coastguard Worker   UCHAR limiterBandTable[MAX_NUM_LIMITERS + 1]; /*!< Limiter band table. */
188*e5436536SAndroid Build Coastguard Worker   UCHAR noLimiterBands;                         /*!< Number of limiter bands. */
189*e5436536SAndroid Build Coastguard Worker   UCHAR nInvfBands; /*!< Number of bands for inverse filtering */
190*e5436536SAndroid Build Coastguard Worker   UCHAR
191*e5436536SAndroid Build Coastguard Worker   *freqBandTable[2]; /*!< Pointers to freqBandTableLo and freqBandTableHi */
192*e5436536SAndroid Build Coastguard Worker   UCHAR freqBandTableLo[MAX_FREQ_COEFFS / 2 + 1];
193*e5436536SAndroid Build Coastguard Worker   /*!< Mapping of SBR bands to QMF bands for low frequency resolution */
194*e5436536SAndroid Build Coastguard Worker   UCHAR freqBandTableHi[MAX_FREQ_COEFFS + 1];
195*e5436536SAndroid Build Coastguard Worker   /*!< Mapping of SBR bands to QMF bands for high frequency resolution */
196*e5436536SAndroid Build Coastguard Worker   UCHAR freqBandTableNoise[MAX_NOISE_COEFFS + 1];
197*e5436536SAndroid Build Coastguard Worker   /*!< Mapping of SBR noise bands to QMF bands */
198*e5436536SAndroid Build Coastguard Worker   UCHAR v_k_master[MAX_FREQ_COEFFS + 1];
199*e5436536SAndroid Build Coastguard Worker   /*!< Master BandTable which freqBandTable is derived from */
200*e5436536SAndroid Build Coastguard Worker } FREQ_BAND_DATA;
201*e5436536SAndroid Build Coastguard Worker 
202*e5436536SAndroid Build Coastguard Worker typedef FREQ_BAND_DATA *HANDLE_FREQ_BAND_DATA;
203*e5436536SAndroid Build Coastguard Worker 
204*e5436536SAndroid Build Coastguard Worker #define SBRDEC_ELD_GRID 1
205*e5436536SAndroid Build Coastguard Worker #define SBRDEC_SYNTAX_SCAL 2
206*e5436536SAndroid Build Coastguard Worker #define SBRDEC_SYNTAX_USAC 4
207*e5436536SAndroid Build Coastguard Worker #define SBRDEC_SYNTAX_RSVD50 8
208*e5436536SAndroid Build Coastguard Worker #define SBRDEC_USAC_INDEP \
209*e5436536SAndroid Build Coastguard Worker   16 /* Flag indicating that USAC global independency flag is active. */
210*e5436536SAndroid Build Coastguard Worker #define SBRDEC_LOW_POWER \
211*e5436536SAndroid Build Coastguard Worker   32 /* Flag indicating that Low Power QMF mode shall be used. */
212*e5436536SAndroid Build Coastguard Worker #define SBRDEC_PS_DECODED \
213*e5436536SAndroid Build Coastguard Worker   64 /* Flag indicating that PS was decoded and rendered. */
214*e5436536SAndroid Build Coastguard Worker #define SBRDEC_QUAD_RATE                              \
215*e5436536SAndroid Build Coastguard Worker   128 /* Flag indicating that USAC SBR 4:1 is active. \
216*e5436536SAndroid Build Coastguard Worker        */
217*e5436536SAndroid Build Coastguard Worker #define SBRDEC_USAC_HARMONICSBR \
218*e5436536SAndroid Build Coastguard Worker   256 /* Flag indicating that USAC HBE tool is active. */
219*e5436536SAndroid Build Coastguard Worker #define SBRDEC_LD_MPS_QMF \
220*e5436536SAndroid Build Coastguard Worker   512 /* Flag indicating that the LD-MPS QMF shall be used. */
221*e5436536SAndroid Build Coastguard Worker #define SBRDEC_USAC_ITES \
222*e5436536SAndroid Build Coastguard Worker   1024 /* Flag indicating that USAC inter TES tool is active. */
223*e5436536SAndroid Build Coastguard Worker #define SBRDEC_SYNTAX_DRM \
224*e5436536SAndroid Build Coastguard Worker   2048 /* Flag indicating that DRM30/DRM+ reverse syntax is being used. */
225*e5436536SAndroid Build Coastguard Worker #define SBRDEC_ELD_DOWNSCALE \
226*e5436536SAndroid Build Coastguard Worker   4096 /* Flag indicating that ELD downscaled mode decoding is used */
227*e5436536SAndroid Build Coastguard Worker #define SBRDEC_DOWNSAMPLE \
228*e5436536SAndroid Build Coastguard Worker   8192 /* Flag indicating that the downsampling mode is used. */
229*e5436536SAndroid Build Coastguard Worker #define SBRDEC_FLUSH 16384 /* Flag is used to flush all elements in use. */
230*e5436536SAndroid Build Coastguard Worker #define SBRDEC_FORCE_RESET \
231*e5436536SAndroid Build Coastguard Worker   32768 /* Flag is used to force a reset of all elements in use. */
232*e5436536SAndroid Build Coastguard Worker #define SBRDEC_SKIP_QMF_ANA                                               \
233*e5436536SAndroid Build Coastguard Worker   (1 << 21) /* Flag indicating that the input data is provided in the QMF \
234*e5436536SAndroid Build Coastguard Worker                domain. */
235*e5436536SAndroid Build Coastguard Worker #define SBRDEC_SKIP_QMF_SYN                                                \
236*e5436536SAndroid Build Coastguard Worker   (1 << 22) /* Flag indicating that the output data is exported in the QMF \
237*e5436536SAndroid Build Coastguard Worker                domain. */
238*e5436536SAndroid Build Coastguard Worker 
239*e5436536SAndroid Build Coastguard Worker #define SBRDEC_HDR_STAT_RESET 1
240*e5436536SAndroid Build Coastguard Worker #define SBRDEC_HDR_STAT_UPDATE 2
241*e5436536SAndroid Build Coastguard Worker 
242*e5436536SAndroid Build Coastguard Worker typedef struct {
243*e5436536SAndroid Build Coastguard Worker   UCHAR ampResolution; /*!< Amplitude resolution of envelope values (0: 1.5dB,
244*e5436536SAndroid Build Coastguard Worker                           1: 3dB) */
245*e5436536SAndroid Build Coastguard Worker   UCHAR
246*e5436536SAndroid Build Coastguard Worker   xover_band; /*!< Start index in #v_k_master[] used for dynamic crossover
247*e5436536SAndroid Build Coastguard Worker                  frequency */
248*e5436536SAndroid Build Coastguard Worker   UCHAR sbr_preprocessing; /*!< SBR prewhitening flag. */
249*e5436536SAndroid Build Coastguard Worker   UCHAR pvc_mode;          /*!< Predictive vector coding mode */
250*e5436536SAndroid Build Coastguard Worker } SBR_HEADER_DATA_BS_INFO;
251*e5436536SAndroid Build Coastguard Worker 
252*e5436536SAndroid Build Coastguard Worker typedef struct {
253*e5436536SAndroid Build Coastguard Worker   /* Changes in these variables causes a reset of the decoder */
254*e5436536SAndroid Build Coastguard Worker   UCHAR startFreq;   /*!< Index for SBR start frequency */
255*e5436536SAndroid Build Coastguard Worker   UCHAR stopFreq;    /*!< Index for SBR highest frequency */
256*e5436536SAndroid Build Coastguard Worker   UCHAR freqScale;   /*!< 0: linear scale,  1-3 logarithmic scales */
257*e5436536SAndroid Build Coastguard Worker   UCHAR alterScale;  /*!< Flag for coarser frequency resolution */
258*e5436536SAndroid Build Coastguard Worker   UCHAR noise_bands; /*!< Noise bands per octave, read from bitstream*/
259*e5436536SAndroid Build Coastguard Worker 
260*e5436536SAndroid Build Coastguard Worker   /* don't require reset */
261*e5436536SAndroid Build Coastguard Worker   UCHAR limiterBands; /*!< Index for number of limiter bands per octave */
262*e5436536SAndroid Build Coastguard Worker   UCHAR limiterGains; /*!< Index to select gain limit */
263*e5436536SAndroid Build Coastguard Worker   UCHAR interpolFreq; /*!< Select gain calculation method (1: per QMF channel,
264*e5436536SAndroid Build Coastguard Worker                          0: per SBR band) */
265*e5436536SAndroid Build Coastguard Worker   UCHAR smoothingLength; /*!< Smoothing of gains over time (0: on  1: off) */
266*e5436536SAndroid Build Coastguard Worker 
267*e5436536SAndroid Build Coastguard Worker } SBR_HEADER_DATA_BS;
268*e5436536SAndroid Build Coastguard Worker 
269*e5436536SAndroid Build Coastguard Worker typedef struct {
270*e5436536SAndroid Build Coastguard Worker   SBR_SYNC_STATE
271*e5436536SAndroid Build Coastguard Worker   syncState; /*!< The current initialization status of the header */
272*e5436536SAndroid Build Coastguard Worker 
273*e5436536SAndroid Build Coastguard Worker   UCHAR status; /*!< Flags field used for signaling a reset right before the
274*e5436536SAndroid Build Coastguard Worker                    processing starts and an update from config (e.g. ASC). */
275*e5436536SAndroid Build Coastguard Worker   UCHAR
276*e5436536SAndroid Build Coastguard Worker   frameErrorFlag; /*!< Frame data valid flag. CAUTION: This variable will be
277*e5436536SAndroid Build Coastguard Worker                      overwritten by the flag stored in the element
278*e5436536SAndroid Build Coastguard Worker                      structure. This is necessary because of the frame
279*e5436536SAndroid Build Coastguard Worker                      delay. There it might happen that different slots use
280*e5436536SAndroid Build Coastguard Worker                      the same header. */
281*e5436536SAndroid Build Coastguard Worker   UCHAR numberTimeSlots;       /*!< AAC: 16,15 */
282*e5436536SAndroid Build Coastguard Worker   UCHAR numberOfAnalysisBands; /*!< Number of QMF analysis bands */
283*e5436536SAndroid Build Coastguard Worker   UCHAR timeStep;              /*!< Time resolution of SBR in QMF-slots */
284*e5436536SAndroid Build Coastguard Worker   UINT
285*e5436536SAndroid Build Coastguard Worker       sbrProcSmplRate; /*!< SBR processing sampling frequency (!=
286*e5436536SAndroid Build Coastguard Worker                           OutputSamplingRate)        (always: CoreSamplingRate *
287*e5436536SAndroid Build Coastguard Worker                           UpSamplingFactor; even in single rate mode) */
288*e5436536SAndroid Build Coastguard Worker 
289*e5436536SAndroid Build Coastguard Worker   SBR_HEADER_DATA_BS bs_data;      /*!< current SBR header. */
290*e5436536SAndroid Build Coastguard Worker   SBR_HEADER_DATA_BS bs_dflt;      /*!< Default sbr header. */
291*e5436536SAndroid Build Coastguard Worker   SBR_HEADER_DATA_BS_INFO bs_info; /*!< SBR info. */
292*e5436536SAndroid Build Coastguard Worker 
293*e5436536SAndroid Build Coastguard Worker   FREQ_BAND_DATA freqBandData; /*!< Pointer to struct #FREQ_BAND_DATA */
294*e5436536SAndroid Build Coastguard Worker   UCHAR pvcIDprev;
295*e5436536SAndroid Build Coastguard Worker } SBR_HEADER_DATA;
296*e5436536SAndroid Build Coastguard Worker 
297*e5436536SAndroid Build Coastguard Worker typedef SBR_HEADER_DATA *HANDLE_SBR_HEADER_DATA;
298*e5436536SAndroid Build Coastguard Worker 
299*e5436536SAndroid Build Coastguard Worker typedef struct {
300*e5436536SAndroid Build Coastguard Worker   UCHAR frameClass;                 /*!< Select grid type */
301*e5436536SAndroid Build Coastguard Worker   UCHAR nEnvelopes;                 /*!< Number of envelopes */
302*e5436536SAndroid Build Coastguard Worker   UCHAR borders[MAX_ENVELOPES + 1]; /*!< Envelope borders (in SBR-timeslots,
303*e5436536SAndroid Build Coastguard Worker                                        e.g. mp3PRO: 0..11) */
304*e5436536SAndroid Build Coastguard Worker   UCHAR freqRes[MAX_ENVELOPES];     /*!< Frequency resolution for each envelope
305*e5436536SAndroid Build Coastguard Worker                                        (0=low, 1=high) */
306*e5436536SAndroid Build Coastguard Worker   SCHAR tranEnv;                    /*!< Transient envelope, -1 if none */
307*e5436536SAndroid Build Coastguard Worker   UCHAR nNoiseEnvelopes;            /*!< Number of noise envelopes */
308*e5436536SAndroid Build Coastguard Worker   UCHAR
309*e5436536SAndroid Build Coastguard Worker   bordersNoise[MAX_NOISE_ENVELOPES + 1]; /*!< borders of noise envelopes */
310*e5436536SAndroid Build Coastguard Worker   UCHAR pvcBorders[MAX_PVC_ENVELOPES + 1];
311*e5436536SAndroid Build Coastguard Worker   UCHAR noisePosition;
312*e5436536SAndroid Build Coastguard Worker   UCHAR varLength;
313*e5436536SAndroid Build Coastguard Worker } FRAME_INFO;
314*e5436536SAndroid Build Coastguard Worker 
315*e5436536SAndroid Build Coastguard Worker typedef struct {
316*e5436536SAndroid Build Coastguard Worker   FIXP_SGL sfb_nrg_prev[MAX_FREQ_COEFFS]; /*!< Previous envelope (required for
317*e5436536SAndroid Build Coastguard Worker                                              differential-coded values) */
318*e5436536SAndroid Build Coastguard Worker   FIXP_SGL
319*e5436536SAndroid Build Coastguard Worker   prevNoiseLevel[MAX_NOISE_COEFFS]; /*!< Previous noise envelope (required
320*e5436536SAndroid Build Coastguard Worker                                        for differential-coded values) */
321*e5436536SAndroid Build Coastguard Worker   COUPLING_MODE coupling;           /*!< Stereo-mode of previous frame */
322*e5436536SAndroid Build Coastguard Worker   INVF_MODE sbr_invf_mode[MAX_INVF_BANDS]; /*!< Previous strength of filtering
323*e5436536SAndroid Build Coastguard Worker                                               in transposer */
324*e5436536SAndroid Build Coastguard Worker   UCHAR ampRes;         /*!< Previous amplitude resolution (0: 1.5dB, 1: 3dB) */
325*e5436536SAndroid Build Coastguard Worker   UCHAR stopPos;        /*!< Position in time where last envelope ended */
326*e5436536SAndroid Build Coastguard Worker   UCHAR frameErrorFlag; /*!< Previous frame status */
327*e5436536SAndroid Build Coastguard Worker   UCHAR prevSbrPitchInBins; /*!< Previous frame pitchInBins */
328*e5436536SAndroid Build Coastguard Worker   FRAME_INFO prevFrameInfo;
329*e5436536SAndroid Build Coastguard Worker } SBR_PREV_FRAME_DATA;
330*e5436536SAndroid Build Coastguard Worker 
331*e5436536SAndroid Build Coastguard Worker typedef SBR_PREV_FRAME_DATA *HANDLE_SBR_PREV_FRAME_DATA;
332*e5436536SAndroid Build Coastguard Worker 
333*e5436536SAndroid Build Coastguard Worker typedef struct {
334*e5436536SAndroid Build Coastguard Worker   int nScaleFactors; /*!< total number of scalefactors in frame */
335*e5436536SAndroid Build Coastguard Worker 
336*e5436536SAndroid Build Coastguard Worker   FRAME_INFO frameInfo;            /*!< time grid for current frame */
337*e5436536SAndroid Build Coastguard Worker   UCHAR domain_vec[MAX_ENVELOPES]; /*!< Bitfield containing direction of
338*e5436536SAndroid Build Coastguard Worker                                       delta-coding for each envelope
339*e5436536SAndroid Build Coastguard Worker                                       (0:frequency, 1:time) */
340*e5436536SAndroid Build Coastguard Worker   UCHAR domain_vec_noise
341*e5436536SAndroid Build Coastguard Worker       [MAX_NOISE_ENVELOPES]; /*!< Same as above, but for noise envelopes */
342*e5436536SAndroid Build Coastguard Worker 
343*e5436536SAndroid Build Coastguard Worker   INVF_MODE
344*e5436536SAndroid Build Coastguard Worker   sbr_invf_mode[MAX_INVF_BANDS]; /*!< Strength of filtering in transposer */
345*e5436536SAndroid Build Coastguard Worker   COUPLING_MODE coupling;        /*!< Stereo-mode */
346*e5436536SAndroid Build Coastguard Worker   int ampResolutionCurrentFrame; /*!< Amplitude resolution of envelope values
347*e5436536SAndroid Build Coastguard Worker                                     (0: 1.5dB, 1: 3dB) */
348*e5436536SAndroid Build Coastguard Worker 
349*e5436536SAndroid Build Coastguard Worker   ULONG addHarmonics[ADD_HARMONICS_FLAGS_SIZE]; /*!< Flags for synthetic sine
350*e5436536SAndroid Build Coastguard Worker                                                    addition (aligned to MSB) */
351*e5436536SAndroid Build Coastguard Worker 
352*e5436536SAndroid Build Coastguard Worker   FIXP_SGL iEnvelope[MAX_NUM_ENVELOPE_VALUES];       /*!< Envelope data */
353*e5436536SAndroid Build Coastguard Worker   FIXP_SGL sbrNoiseFloorLevel[MAX_NUM_NOISE_VALUES]; /*!< Noise envelope data */
354*e5436536SAndroid Build Coastguard Worker   UCHAR iTESactive; /*!< One flag for each envelope to enable USAC inter-TES */
355*e5436536SAndroid Build Coastguard Worker   UCHAR
356*e5436536SAndroid Build Coastguard Worker   interTempShapeMode[MAX_ENVELOPES]; /*!< USAC inter-TES:
357*e5436536SAndroid Build Coastguard Worker                                         bs_inter_temp_shape_mode[ch][env]
358*e5436536SAndroid Build Coastguard Worker                                         value */
359*e5436536SAndroid Build Coastguard Worker   UCHAR pvcID[PVC_NTIMESLOT];        /*!< One PVC ID value for each time slot */
360*e5436536SAndroid Build Coastguard Worker   UCHAR ns;
361*e5436536SAndroid Build Coastguard Worker   UCHAR sinusoidal_position;
362*e5436536SAndroid Build Coastguard Worker 
363*e5436536SAndroid Build Coastguard Worker   UCHAR sbrPatchingMode;
364*e5436536SAndroid Build Coastguard Worker   UCHAR sbrOversamplingFlag;
365*e5436536SAndroid Build Coastguard Worker   UCHAR sbrPitchInBins;
366*e5436536SAndroid Build Coastguard Worker } SBR_FRAME_DATA;
367*e5436536SAndroid Build Coastguard Worker 
368*e5436536SAndroid Build Coastguard Worker typedef SBR_FRAME_DATA *HANDLE_SBR_FRAME_DATA;
369*e5436536SAndroid Build Coastguard Worker 
370*e5436536SAndroid Build Coastguard Worker /*!
371*e5436536SAndroid Build Coastguard Worker \brief   Maps sampling frequencies to frequencies for which setup tables are
372*e5436536SAndroid Build Coastguard Worker available
373*e5436536SAndroid Build Coastguard Worker 
374*e5436536SAndroid Build Coastguard Worker Maps arbitary sampling frequency to nearest neighbors for which setup tables
375*e5436536SAndroid Build Coastguard Worker are available (e.g. 25600 -> 24000).
376*e5436536SAndroid Build Coastguard Worker Used for startFreq calculation.
377*e5436536SAndroid Build Coastguard Worker The mapping is defined in 14496-3 (4.6.18.2.6), fs(SBR), and table 4.82
378*e5436536SAndroid Build Coastguard Worker 
379*e5436536SAndroid Build Coastguard Worker \return  mapped sampling frequency
380*e5436536SAndroid Build Coastguard Worker */
381*e5436536SAndroid Build Coastguard Worker UINT sbrdec_mapToStdSampleRate(UINT fs,
382*e5436536SAndroid Build Coastguard Worker                                UINT isUsac); /*!< Output sampling frequency */
383*e5436536SAndroid Build Coastguard Worker 
384*e5436536SAndroid Build Coastguard Worker void initSbrPrevFrameData(HANDLE_SBR_PREV_FRAME_DATA h_prev_data,
385*e5436536SAndroid Build Coastguard Worker                           int timeSlots);
386*e5436536SAndroid Build Coastguard Worker 
387*e5436536SAndroid Build Coastguard Worker int sbrGetChannelElement(HANDLE_SBR_HEADER_DATA hHeaderData,
388*e5436536SAndroid Build Coastguard Worker                          HANDLE_SBR_FRAME_DATA hFrameDataLeft,
389*e5436536SAndroid Build Coastguard Worker                          HANDLE_SBR_FRAME_DATA hFrameDataRight,
390*e5436536SAndroid Build Coastguard Worker                          HANDLE_SBR_PREV_FRAME_DATA hFrameDataLeftPrev,
391*e5436536SAndroid Build Coastguard Worker                          UCHAR pvc_mode_last, HANDLE_FDK_BITSTREAM hBitBuf,
392*e5436536SAndroid Build Coastguard Worker                          HANDLE_PS_DEC hParametricStereoDec, const UINT flags,
393*e5436536SAndroid Build Coastguard Worker                          const int overlap);
394*e5436536SAndroid Build Coastguard Worker 
395*e5436536SAndroid Build Coastguard Worker SBR_HEADER_STATUS
396*e5436536SAndroid Build Coastguard Worker sbrGetHeaderData(HANDLE_SBR_HEADER_DATA headerData,
397*e5436536SAndroid Build Coastguard Worker                  HANDLE_FDK_BITSTREAM hBitBuf, const UINT flags,
398*e5436536SAndroid Build Coastguard Worker                  const int fIsSbrData, const UCHAR configMode);
399*e5436536SAndroid Build Coastguard Worker 
400*e5436536SAndroid Build Coastguard Worker /*!
401*e5436536SAndroid Build Coastguard Worker   \brief     Initialize SBR header data
402*e5436536SAndroid Build Coastguard Worker 
403*e5436536SAndroid Build Coastguard Worker   Copy default values to the header data struct and patch some entries
404*e5436536SAndroid Build Coastguard Worker   depending on the core codec.
405*e5436536SAndroid Build Coastguard Worker */
406*e5436536SAndroid Build Coastguard Worker SBR_ERROR
407*e5436536SAndroid Build Coastguard Worker initHeaderData(HANDLE_SBR_HEADER_DATA hHeaderData, const int sampleRateIn,
408*e5436536SAndroid Build Coastguard Worker                const int sampleRateOut, const INT downscaleFactor,
409*e5436536SAndroid Build Coastguard Worker                const int samplesPerFrame, const UINT flags,
410*e5436536SAndroid Build Coastguard Worker                const int setDefaultHdr);
411*e5436536SAndroid Build Coastguard Worker #endif
412*e5436536SAndroid Build Coastguard Worker 
413*e5436536SAndroid Build Coastguard Worker /* Convert headroom bits to exponent */
414*e5436536SAndroid Build Coastguard Worker #define SCALE2EXP(s) (15 - (s))
415*e5436536SAndroid Build Coastguard Worker #define EXP2SCALE(e) (15 - (e))
416