1 /* -----------------------------------------------------------------------------
2 Software License for The Fraunhofer FDK AAC Codec Library for Android
3 
4 © Copyright  1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
5 Forschung e.V. All rights reserved.
6 
7  1.    INTRODUCTION
8 The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
9 that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
10 scheme for digital audio. This FDK AAC Codec software is intended to be used on
11 a wide variety of Android devices.
12 
13 AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
14 general perceptual audio codecs. AAC-ELD is considered the best-performing
15 full-bandwidth communications codec by independent studies and is widely
16 deployed. AAC has been standardized by ISO and IEC as part of the MPEG
17 specifications.
18 
19 Patent licenses for necessary patent claims for the FDK AAC Codec (including
20 those of Fraunhofer) may be obtained through Via Licensing
21 (www.vialicensing.com) or through the respective patent owners individually for
22 the purpose of encoding or decoding bit streams in products that are compliant
23 with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
24 Android devices already license these patent claims through Via Licensing or
25 directly from the patent owners, and therefore FDK AAC Codec software may
26 already be covered under those patent licenses when it is used for those
27 licensed purposes only.
28 
29 Commercially-licensed AAC software libraries, including floating-point versions
30 with enhanced sound quality, are also available from Fraunhofer. Users are
31 encouraged to check the Fraunhofer website for additional applications
32 information and documentation.
33 
34 2.    COPYRIGHT LICENSE
35 
36 Redistribution and use in source and binary forms, with or without modification,
37 are permitted without payment of copyright license fees provided that you
38 satisfy the following conditions:
39 
40 You must retain the complete text of this software license in redistributions of
41 the FDK AAC Codec or your modifications thereto in source code form.
42 
43 You must retain the complete text of this software license in the documentation
44 and/or other materials provided with redistributions of the FDK AAC Codec or
45 your modifications thereto in binary form. You must make available free of
46 charge copies of the complete source code of the FDK AAC Codec and your
47 modifications thereto to recipients of copies in binary form.
48 
49 The name of Fraunhofer may not be used to endorse or promote products derived
50 from this library without prior written permission.
51 
52 You may not charge copyright license fees for anyone to use, copy or distribute
53 the FDK AAC Codec software or your modifications thereto.
54 
55 Your modified versions of the FDK AAC Codec must carry prominent notices stating
56 that you changed the software and the date of any change. For modified versions
57 of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
58 must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
59 AAC Codec Library for Android."
60 
61 3.    NO PATENT LICENSE
62 
63 NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
64 limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
65 Fraunhofer provides no warranty of patent non-infringement with respect to this
66 software.
67 
68 You may use this FDK AAC Codec software or modifications thereto only for
69 purposes that are authorized by appropriate patent licenses.
70 
71 4.    DISCLAIMER
72 
73 This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
74 holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
75 including but not limited to the implied warranties of merchantability and
76 fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
77 CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
78 or consequential damages, including but not limited to procurement of substitute
79 goods or services; loss of use, data, or profits, or business interruption,
80 however caused and on any theory of liability, whether in contract, strict
81 liability, or tort (including negligence), arising in any way out of the use of
82 this software, even if advised of the possibility of such damage.
83 
84 5.    CONTACT INFORMATION
85 
86 Fraunhofer Institute for Integrated Circuits IIS
87 Attention: Audio and Multimedia Departments - FDK AAC LL
88 Am Wolfsmantel 33
89 91058 Erlangen, Germany
90 
91 www.iis.fraunhofer.de/amm
92 amm-info@iis.fraunhofer.de
93 ----------------------------------------------------------------------------- */
94 
95 /**************************** SBR encoder library ******************************
96 
97    Author(s):
98 
99    Description:
100 
101 *******************************************************************************/
102 
103 /*!
104   \file
105   \brief  General tonality correction detector module.
106 */
107 #ifndef TON_CORR_H
108 #define TON_CORR_H
109 
110 #include "sbr_encoder.h"
111 #include "mh_det.h"
112 #include "nf_est.h"
113 #include "invf_est.h"
114 
115 #define MAX_NUM_PATCHES 6
116 #define SCALE_NRGVEC 4
117 
118 /** parameter set for one single patch */
119 typedef struct {
120   INT sourceStartBand; /*!< first band in lowbands where to take the samples
121                           from */
122   INT sourceStopBand;  /*!< first band in lowbands which is not included in the
123                           patch anymore */
124   INT guardStartBand;  /*!< first band in highbands to be filled with zeros in
125                           order to  reduce interferences between patches */
126   INT targetStartBand; /*!< first band in highbands to be filled with whitened
127                           lowband signal */
128   INT targetBandOffs;  /*!< difference between 'startTargetBand' and
129                           'startSourceBand' */
130   INT numBandsInPatch; /*!< number of consecutive bands in this one patch */
131 } PATCH_PARAM;
132 
133 typedef struct {
134   INT switchInverseFilt; /*!< Flag to enable dynamic adaption of invf. detection
135                           */
136   INT noQmfChannels;
137   INT bufferLength;      /*!< Length of the r and i buffers. */
138   INT stepSize;          /*!< Stride for the lpc estimate. */
139   INT numberOfEstimates; /*!< The total number of estiamtes, available in the
140                             quotaMatrix.*/
141   UINT numberOfEstimatesPerFrame; /*!< The number of estimates per frame
142                                      available in the quotaMatrix.*/
143   INT lpcLength[2]; /*!< Segment length used for second order LPC analysis.*/
144   INT nextSample;   /*!< Where to start the LPC analysis of the current frame.*/
145   INT move; /*!< How many estimates to move in the quotaMatrix, when buffering.
146              */
147   INT frameStartIndex; /*!< The start index for the current frame in the r and i
148                           buffers. */
149   INT startIndexMatrix;       /*!< The start index for the current frame in the
150                                  quotaMatrix. */
151   INT frameStartIndexInvfEst; /*!< The start index of the inverse filtering, not
152                                  the same as the others, dependent on what
153                                  decoder is used (buffer opt, or no buffer opt).
154                                */
155   INT prevTransientFlag;  /*!< The transisent flag (from the transient detector)
156                              for the previous frame. */
157   INT transientNextFrame; /*!< Flag to indicate that the transient will show up
158                              in the next frame. */
159   INT transientPosOffset; /*!< An offset value to match the transient pos as
160                              calculated by the transient detector with the
161                              actual position in the frame.*/
162 
163   INT* signMatrix[MAX_NO_OF_ESTIMATES]; /*!< Matrix holding the sign of each
164                                            channe, i.e. indicating in what part
165                                            of a QMF channel a possible sine is.
166                                          */
167 
168   FIXP_DBL* quotaMatrix[MAX_NO_OF_ESTIMATES]; /*!< Matrix holding the quota
169                                                  values for all estimates, all
170                                                  channels. */
171 
172   FIXP_DBL nrgVector[MAX_NO_OF_ESTIMATES]; /*!< Vector holding the averaged
173                                               energies for every QMF band. */
174   FIXP_DBL nrgVectorFreq[64]; /*!< Vector holding the averaged energies for
175                                  every QMF channel */
176 
177   SCHAR indexVector[64]; /*!< Index vector poINTing to the correct lowband
178                             channel, when indexing a highband channel, -1
179                             represents a guard band */
180   PATCH_PARAM
181   patchParam[MAX_NUM_PATCHES]; /*!< new parameter set for patching */
182   INT guard;                   /*!< number of guardbands between every patch */
183   INT shiftStartSb; /*!< lowest subband of source range to be included in the
184                        patches */
185   INT noOfPatches;  /*!< number of patches */
186 
187   SBR_MISSING_HARMONICS_DETECTOR
188   sbrMissingHarmonicsDetector; /*!< SBR_MISSING_HARMONICS_DETECTOR struct.
189                                 */
190   SBR_NOISE_FLOOR_ESTIMATE
191   sbrNoiseFloorEstimate;       /*!< SBR_NOISE_FLOOR_ESTIMATE struct. */
192   SBR_INV_FILT_EST sbrInvFilt; /*!< SBR_INV_FILT_EST struct. */
193 } SBR_TON_CORR_EST;
194 
195 typedef SBR_TON_CORR_EST* HANDLE_SBR_TON_CORR_EST;
196 
197 void FDKsbrEnc_TonCorrParamExtr(
198     HANDLE_SBR_TON_CORR_EST hTonCorr, /*!< Handle to SBR_TON_CORR struct. */
199     INVF_MODE* infVec, /*!< Vector where the inverse filtering levels will be
200                           stored. */
201     FIXP_DBL* noiseLevels, /*!< Vector where the noise levels will be stored. */
202     INT* missingHarmonicFlag, /*!< Flag set to one or zero, dependent on if any
203                                  strong sines are missing.*/
204     UCHAR* missingHarmonicsIndex, /*!< Vector indicating where sines are
205                                      missing. */
206     UCHAR* envelopeCompensation,  /*!< Vector to store compensation values for
207                                      the energies in. */
208     const SBR_FRAME_INFO* frameInfo, /*!< Frame info struct, contains the time
209                                         and frequency grid of the current
210                                         frame.*/
211     UCHAR* transientInfo,            /*!< Transient info.*/
212     UCHAR* freqBandTable,            /*!< Frequency band tables for high-res.*/
213     INT nSfb,           /*!< Number of scalefactor bands for high-res. */
214     XPOS_MODE xposType, /*!< Type of transposer used in the decoder.*/
215     UINT sbrSyntaxFlags);
216 
217 INT FDKsbrEnc_CreateTonCorrParamExtr(
218     HANDLE_SBR_TON_CORR_EST
219         hTonCorr, /*!< Pointer to handle to SBR_TON_CORR struct. */
220     INT chan);    /*!< Channel index, needed for mem allocation */
221 
222 INT FDKsbrEnc_InitTonCorrParamExtr(
223     INT frameSize, /*!< Current SBR frame size. */
224     HANDLE_SBR_TON_CORR_EST
225         hTonCorr, /*!< Pointer to handle to SBR_TON_CORR struct. */
226     HANDLE_SBR_CONFIG_DATA
227         sbrCfg,           /*!< Pointer to SBR configuration parameters. */
228     INT timeSlots,        /*!< Number of time-slots per frame */
229     INT xposCtrl,         /*!< Different patch modes. */
230     INT ana_max_level,    /*!< Maximum level of the adaptive noise. */
231     INT noiseBands,       /*!< Number of noise bands per octave. */
232     INT noiseFloorOffset, /*!< Noise floor offset. */
233     UINT useSpeechConfig  /*!< Speech or music tuning. */
234 );
235 
236 void FDKsbrEnc_DeleteTonCorrParamExtr(
237     HANDLE_SBR_TON_CORR_EST hTonCorr); /*!< Handle to SBR_TON_CORR struct. */
238 
239 void FDKsbrEnc_CalculateTonalityQuotas(
240     HANDLE_SBR_TON_CORR_EST hTonCorr, FIXP_DBL** sourceBufferReal,
241     FIXP_DBL** sourceBufferImag, INT usb,
242     INT qmfScale /*!< sclefactor of QMF subsamples */
243 );
244 
245 INT FDKsbrEnc_ResetTonCorrParamExtr(
246     HANDLE_SBR_TON_CORR_EST hTonCorr, /*!< Handle to SBR_TON_CORR struct. */
247     INT xposctrl,                     /*!< Different patch modes. */
248     INT highBandStartSb,              /*!< Start band of the SBR range. */
249     UCHAR* v_k_master, /*!< Master frequency table from which all other table
250                           are derived.*/
251     INT numMaster,     /*!< Number of elements in the master table. */
252     INT fs,            /*!< Sampling frequency (of the SBR part). */
253     UCHAR**
254         freqBandTable, /*!< Frequency band table for low-res and high-res. */
255     INT* nSfb,         /*!< Number of frequency bands (hig-res and low-res). */
256     INT noQmfChannels  /*!< Number of QMF channels. */
257 );
258 #endif
259