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 /**************************** AAC encoder library ******************************
96*e5436536SAndroid Build Coastguard Worker
97*e5436536SAndroid Build Coastguard Worker Author(s): M.Lohwasser
98*e5436536SAndroid Build Coastguard Worker
99*e5436536SAndroid Build Coastguard Worker Description: PNS parameters depending on bitrate and bandwidth
100*e5436536SAndroid Build Coastguard Worker
101*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
102*e5436536SAndroid Build Coastguard Worker
103*e5436536SAndroid Build Coastguard Worker #include "pnsparam.h"
104*e5436536SAndroid Build Coastguard Worker
105*e5436536SAndroid Build Coastguard Worker #include "psy_configuration.h"
106*e5436536SAndroid Build Coastguard Worker
107*e5436536SAndroid Build Coastguard Worker typedef struct {
108*e5436536SAndroid Build Coastguard Worker SHORT startFreq;
109*e5436536SAndroid Build Coastguard Worker /* Parameters for detection */
110*e5436536SAndroid Build Coastguard Worker FIXP_SGL refPower;
111*e5436536SAndroid Build Coastguard Worker FIXP_SGL refTonality;
112*e5436536SAndroid Build Coastguard Worker SHORT tnsGainThreshold; /* scaled by TNS_PREDGAIN_SCALE (=1000) */
113*e5436536SAndroid Build Coastguard Worker SHORT tnsPNSGainThreshold; /* scaled by TNS_PREDGAIN_SCALE (=1000) */
114*e5436536SAndroid Build Coastguard Worker FIXP_SGL gapFillThr;
115*e5436536SAndroid Build Coastguard Worker SHORT minSfbWidth;
116*e5436536SAndroid Build Coastguard Worker USHORT detectionAlgorithmFlags;
117*e5436536SAndroid Build Coastguard Worker } PNS_INFO_TAB;
118*e5436536SAndroid Build Coastguard Worker
119*e5436536SAndroid Build Coastguard Worker typedef struct {
120*e5436536SAndroid Build Coastguard Worker ULONG brFrom;
121*e5436536SAndroid Build Coastguard Worker ULONG brTo;
122*e5436536SAndroid Build Coastguard Worker UCHAR S16000;
123*e5436536SAndroid Build Coastguard Worker UCHAR S22050;
124*e5436536SAndroid Build Coastguard Worker UCHAR S24000;
125*e5436536SAndroid Build Coastguard Worker UCHAR S32000;
126*e5436536SAndroid Build Coastguard Worker UCHAR S44100;
127*e5436536SAndroid Build Coastguard Worker UCHAR S48000;
128*e5436536SAndroid Build Coastguard Worker } AUTO_PNS_TAB;
129*e5436536SAndroid Build Coastguard Worker
130*e5436536SAndroid Build Coastguard Worker static const AUTO_PNS_TAB levelTable_mono[] = {
131*e5436536SAndroid Build Coastguard Worker {
132*e5436536SAndroid Build Coastguard Worker 0,
133*e5436536SAndroid Build Coastguard Worker 11999,
134*e5436536SAndroid Build Coastguard Worker 0,
135*e5436536SAndroid Build Coastguard Worker 1,
136*e5436536SAndroid Build Coastguard Worker 1,
137*e5436536SAndroid Build Coastguard Worker 1,
138*e5436536SAndroid Build Coastguard Worker 1,
139*e5436536SAndroid Build Coastguard Worker 1,
140*e5436536SAndroid Build Coastguard Worker },
141*e5436536SAndroid Build Coastguard Worker {
142*e5436536SAndroid Build Coastguard Worker 12000,
143*e5436536SAndroid Build Coastguard Worker 19999,
144*e5436536SAndroid Build Coastguard Worker 0,
145*e5436536SAndroid Build Coastguard Worker 1,
146*e5436536SAndroid Build Coastguard Worker 1,
147*e5436536SAndroid Build Coastguard Worker 1,
148*e5436536SAndroid Build Coastguard Worker 1,
149*e5436536SAndroid Build Coastguard Worker 1,
150*e5436536SAndroid Build Coastguard Worker },
151*e5436536SAndroid Build Coastguard Worker {
152*e5436536SAndroid Build Coastguard Worker 20000,
153*e5436536SAndroid Build Coastguard Worker 28999,
154*e5436536SAndroid Build Coastguard Worker 0,
155*e5436536SAndroid Build Coastguard Worker 2,
156*e5436536SAndroid Build Coastguard Worker 1,
157*e5436536SAndroid Build Coastguard Worker 1,
158*e5436536SAndroid Build Coastguard Worker 1,
159*e5436536SAndroid Build Coastguard Worker 1,
160*e5436536SAndroid Build Coastguard Worker },
161*e5436536SAndroid Build Coastguard Worker {
162*e5436536SAndroid Build Coastguard Worker 29000,
163*e5436536SAndroid Build Coastguard Worker 40999,
164*e5436536SAndroid Build Coastguard Worker 0,
165*e5436536SAndroid Build Coastguard Worker 4,
166*e5436536SAndroid Build Coastguard Worker 4,
167*e5436536SAndroid Build Coastguard Worker 4,
168*e5436536SAndroid Build Coastguard Worker 2,
169*e5436536SAndroid Build Coastguard Worker 2,
170*e5436536SAndroid Build Coastguard Worker },
171*e5436536SAndroid Build Coastguard Worker {
172*e5436536SAndroid Build Coastguard Worker 41000,
173*e5436536SAndroid Build Coastguard Worker 55999,
174*e5436536SAndroid Build Coastguard Worker 0,
175*e5436536SAndroid Build Coastguard Worker 9,
176*e5436536SAndroid Build Coastguard Worker 9,
177*e5436536SAndroid Build Coastguard Worker 7,
178*e5436536SAndroid Build Coastguard Worker 7,
179*e5436536SAndroid Build Coastguard Worker 7,
180*e5436536SAndroid Build Coastguard Worker },
181*e5436536SAndroid Build Coastguard Worker {
182*e5436536SAndroid Build Coastguard Worker 56000,
183*e5436536SAndroid Build Coastguard Worker 61999,
184*e5436536SAndroid Build Coastguard Worker 0,
185*e5436536SAndroid Build Coastguard Worker 0,
186*e5436536SAndroid Build Coastguard Worker 0,
187*e5436536SAndroid Build Coastguard Worker 0,
188*e5436536SAndroid Build Coastguard Worker 9,
189*e5436536SAndroid Build Coastguard Worker 9,
190*e5436536SAndroid Build Coastguard Worker },
191*e5436536SAndroid Build Coastguard Worker {
192*e5436536SAndroid Build Coastguard Worker 62000,
193*e5436536SAndroid Build Coastguard Worker 75999,
194*e5436536SAndroid Build Coastguard Worker 0,
195*e5436536SAndroid Build Coastguard Worker 0,
196*e5436536SAndroid Build Coastguard Worker 0,
197*e5436536SAndroid Build Coastguard Worker 0,
198*e5436536SAndroid Build Coastguard Worker 0,
199*e5436536SAndroid Build Coastguard Worker 0,
200*e5436536SAndroid Build Coastguard Worker },
201*e5436536SAndroid Build Coastguard Worker {
202*e5436536SAndroid Build Coastguard Worker 76000,
203*e5436536SAndroid Build Coastguard Worker 92999,
204*e5436536SAndroid Build Coastguard Worker 0,
205*e5436536SAndroid Build Coastguard Worker 0,
206*e5436536SAndroid Build Coastguard Worker 0,
207*e5436536SAndroid Build Coastguard Worker 0,
208*e5436536SAndroid Build Coastguard Worker 0,
209*e5436536SAndroid Build Coastguard Worker 0,
210*e5436536SAndroid Build Coastguard Worker },
211*e5436536SAndroid Build Coastguard Worker {
212*e5436536SAndroid Build Coastguard Worker 93000,
213*e5436536SAndroid Build Coastguard Worker 999999,
214*e5436536SAndroid Build Coastguard Worker 0,
215*e5436536SAndroid Build Coastguard Worker 0,
216*e5436536SAndroid Build Coastguard Worker 0,
217*e5436536SAndroid Build Coastguard Worker 0,
218*e5436536SAndroid Build Coastguard Worker 0,
219*e5436536SAndroid Build Coastguard Worker 0,
220*e5436536SAndroid Build Coastguard Worker },
221*e5436536SAndroid Build Coastguard Worker };
222*e5436536SAndroid Build Coastguard Worker
223*e5436536SAndroid Build Coastguard Worker static const AUTO_PNS_TAB levelTable_stereo[] = {
224*e5436536SAndroid Build Coastguard Worker {
225*e5436536SAndroid Build Coastguard Worker 0,
226*e5436536SAndroid Build Coastguard Worker 11999,
227*e5436536SAndroid Build Coastguard Worker 0,
228*e5436536SAndroid Build Coastguard Worker 1,
229*e5436536SAndroid Build Coastguard Worker 1,
230*e5436536SAndroid Build Coastguard Worker 1,
231*e5436536SAndroid Build Coastguard Worker 1,
232*e5436536SAndroid Build Coastguard Worker 1,
233*e5436536SAndroid Build Coastguard Worker },
234*e5436536SAndroid Build Coastguard Worker {
235*e5436536SAndroid Build Coastguard Worker 12000,
236*e5436536SAndroid Build Coastguard Worker 19999,
237*e5436536SAndroid Build Coastguard Worker 0,
238*e5436536SAndroid Build Coastguard Worker 3,
239*e5436536SAndroid Build Coastguard Worker 1,
240*e5436536SAndroid Build Coastguard Worker 1,
241*e5436536SAndroid Build Coastguard Worker 1,
242*e5436536SAndroid Build Coastguard Worker 1,
243*e5436536SAndroid Build Coastguard Worker },
244*e5436536SAndroid Build Coastguard Worker {
245*e5436536SAndroid Build Coastguard Worker 20000,
246*e5436536SAndroid Build Coastguard Worker 28999,
247*e5436536SAndroid Build Coastguard Worker 0,
248*e5436536SAndroid Build Coastguard Worker 3,
249*e5436536SAndroid Build Coastguard Worker 3,
250*e5436536SAndroid Build Coastguard Worker 3,
251*e5436536SAndroid Build Coastguard Worker 2,
252*e5436536SAndroid Build Coastguard Worker 2,
253*e5436536SAndroid Build Coastguard Worker },
254*e5436536SAndroid Build Coastguard Worker {
255*e5436536SAndroid Build Coastguard Worker 29000,
256*e5436536SAndroid Build Coastguard Worker 40999,
257*e5436536SAndroid Build Coastguard Worker 0,
258*e5436536SAndroid Build Coastguard Worker 7,
259*e5436536SAndroid Build Coastguard Worker 6,
260*e5436536SAndroid Build Coastguard Worker 6,
261*e5436536SAndroid Build Coastguard Worker 5,
262*e5436536SAndroid Build Coastguard Worker 5,
263*e5436536SAndroid Build Coastguard Worker },
264*e5436536SAndroid Build Coastguard Worker {
265*e5436536SAndroid Build Coastguard Worker 41000,
266*e5436536SAndroid Build Coastguard Worker 55999,
267*e5436536SAndroid Build Coastguard Worker 0,
268*e5436536SAndroid Build Coastguard Worker 9,
269*e5436536SAndroid Build Coastguard Worker 9,
270*e5436536SAndroid Build Coastguard Worker 7,
271*e5436536SAndroid Build Coastguard Worker 7,
272*e5436536SAndroid Build Coastguard Worker 7,
273*e5436536SAndroid Build Coastguard Worker },
274*e5436536SAndroid Build Coastguard Worker {
275*e5436536SAndroid Build Coastguard Worker 56000,
276*e5436536SAndroid Build Coastguard Worker 79999,
277*e5436536SAndroid Build Coastguard Worker 0,
278*e5436536SAndroid Build Coastguard Worker 0,
279*e5436536SAndroid Build Coastguard Worker 0,
280*e5436536SAndroid Build Coastguard Worker 0,
281*e5436536SAndroid Build Coastguard Worker 0,
282*e5436536SAndroid Build Coastguard Worker 0,
283*e5436536SAndroid Build Coastguard Worker },
284*e5436536SAndroid Build Coastguard Worker {
285*e5436536SAndroid Build Coastguard Worker 80000,
286*e5436536SAndroid Build Coastguard Worker 99999,
287*e5436536SAndroid Build Coastguard Worker 0,
288*e5436536SAndroid Build Coastguard Worker 0,
289*e5436536SAndroid Build Coastguard Worker 0,
290*e5436536SAndroid Build Coastguard Worker 0,
291*e5436536SAndroid Build Coastguard Worker 0,
292*e5436536SAndroid Build Coastguard Worker 0,
293*e5436536SAndroid Build Coastguard Worker },
294*e5436536SAndroid Build Coastguard Worker {
295*e5436536SAndroid Build Coastguard Worker 100000,
296*e5436536SAndroid Build Coastguard Worker 999999,
297*e5436536SAndroid Build Coastguard Worker 0,
298*e5436536SAndroid Build Coastguard Worker 0,
299*e5436536SAndroid Build Coastguard Worker 0,
300*e5436536SAndroid Build Coastguard Worker 0,
301*e5436536SAndroid Build Coastguard Worker 0,
302*e5436536SAndroid Build Coastguard Worker 0,
303*e5436536SAndroid Build Coastguard Worker },
304*e5436536SAndroid Build Coastguard Worker };
305*e5436536SAndroid Build Coastguard Worker
306*e5436536SAndroid Build Coastguard Worker static const PNS_INFO_TAB pnsInfoTab[] = {
307*e5436536SAndroid Build Coastguard Worker /*0 pns off */
308*e5436536SAndroid Build Coastguard Worker /*1*/ {4000, FL2FXCONST_SGL(0.04), FL2FXCONST_SGL(0.06), 1150, 1200,
309*e5436536SAndroid Build Coastguard Worker FL2FXCONST_SGL(0.02), 8,
310*e5436536SAndroid Build Coastguard Worker USE_POWER_DISTRIBUTION | USE_PSYCH_TONALITY | USE_TNS_GAIN_THR |
311*e5436536SAndroid Build Coastguard Worker USE_TNS_PNS /*| JUST_LONG_WINDOW*/},
312*e5436536SAndroid Build Coastguard Worker /*2*/
313*e5436536SAndroid Build Coastguard Worker {4000, FL2FXCONST_SGL(0.04), FL2FXCONST_SGL(0.07), 1130, 1300,
314*e5436536SAndroid Build Coastguard Worker FL2FXCONST_SGL(0.05), 8,
315*e5436536SAndroid Build Coastguard Worker USE_POWER_DISTRIBUTION | USE_PSYCH_TONALITY | USE_TNS_GAIN_THR |
316*e5436536SAndroid Build Coastguard Worker USE_TNS_PNS /*| JUST_LONG_WINDOW*/},
317*e5436536SAndroid Build Coastguard Worker /*3*/
318*e5436536SAndroid Build Coastguard Worker {4100, FL2FXCONST_SGL(0.04), FL2FXCONST_SGL(0.07), 1100, 1400,
319*e5436536SAndroid Build Coastguard Worker FL2FXCONST_SGL(0.10), 8,
320*e5436536SAndroid Build Coastguard Worker USE_POWER_DISTRIBUTION | USE_PSYCH_TONALITY | USE_TNS_GAIN_THR |
321*e5436536SAndroid Build Coastguard Worker USE_TNS_PNS /*| JUST_LONG_WINDOW*/},
322*e5436536SAndroid Build Coastguard Worker /*4*/
323*e5436536SAndroid Build Coastguard Worker {4100, FL2FXCONST_SGL(0.03), FL2FXCONST_SGL(0.10), 1100, 1400,
324*e5436536SAndroid Build Coastguard Worker FL2FXCONST_SGL(0.15), 8,
325*e5436536SAndroid Build Coastguard Worker USE_POWER_DISTRIBUTION | USE_PSYCH_TONALITY | USE_TNS_GAIN_THR |
326*e5436536SAndroid Build Coastguard Worker USE_TNS_PNS /*| JUST_LONG_WINDOW*/},
327*e5436536SAndroid Build Coastguard Worker /*5*/
328*e5436536SAndroid Build Coastguard Worker {4300, FL2FXCONST_SGL(0.03), FL2FXCONST_SGL(0.10), 1100, 1400,
329*e5436536SAndroid Build Coastguard Worker FL2FXCONST_SGL(0.15), 8,
330*e5436536SAndroid Build Coastguard Worker USE_POWER_DISTRIBUTION | USE_PSYCH_TONALITY | USE_TNS_GAIN_THR |
331*e5436536SAndroid Build Coastguard Worker USE_TNS_PNS | JUST_LONG_WINDOW},
332*e5436536SAndroid Build Coastguard Worker /*6*/
333*e5436536SAndroid Build Coastguard Worker {5000, FL2FXCONST_SGL(0.03), FL2FXCONST_SGL(0.10), 1100, 1400,
334*e5436536SAndroid Build Coastguard Worker FL2FXCONST_SGL(0.25), 8,
335*e5436536SAndroid Build Coastguard Worker USE_POWER_DISTRIBUTION | USE_PSYCH_TONALITY | USE_TNS_GAIN_THR |
336*e5436536SAndroid Build Coastguard Worker USE_TNS_PNS | JUST_LONG_WINDOW},
337*e5436536SAndroid Build Coastguard Worker /*7*/
338*e5436536SAndroid Build Coastguard Worker {5500, FL2FXCONST_SGL(0.03), FL2FXCONST_SGL(0.12), 1100, 1400,
339*e5436536SAndroid Build Coastguard Worker FL2FXCONST_SGL(0.35), 8,
340*e5436536SAndroid Build Coastguard Worker USE_POWER_DISTRIBUTION | USE_PSYCH_TONALITY | USE_TNS_GAIN_THR |
341*e5436536SAndroid Build Coastguard Worker USE_TNS_PNS | JUST_LONG_WINDOW},
342*e5436536SAndroid Build Coastguard Worker /*8*/
343*e5436536SAndroid Build Coastguard Worker {6000, FL2FXCONST_SGL(0.03), FL2FXCONST_SGL(0.12), 1080, 1400,
344*e5436536SAndroid Build Coastguard Worker FL2FXCONST_SGL(0.40), 8,
345*e5436536SAndroid Build Coastguard Worker USE_POWER_DISTRIBUTION | USE_PSYCH_TONALITY | USE_TNS_GAIN_THR |
346*e5436536SAndroid Build Coastguard Worker USE_TNS_PNS | JUST_LONG_WINDOW},
347*e5436536SAndroid Build Coastguard Worker /*9*/
348*e5436536SAndroid Build Coastguard Worker {6000, FL2FXCONST_SGL(0.03), FL2FXCONST_SGL(0.14), 1070, 1400,
349*e5436536SAndroid Build Coastguard Worker FL2FXCONST_SGL(0.45), 8,
350*e5436536SAndroid Build Coastguard Worker USE_POWER_DISTRIBUTION | USE_PSYCH_TONALITY | USE_TNS_GAIN_THR |
351*e5436536SAndroid Build Coastguard Worker USE_TNS_PNS | JUST_LONG_WINDOW},
352*e5436536SAndroid Build Coastguard Worker };
353*e5436536SAndroid Build Coastguard Worker
354*e5436536SAndroid Build Coastguard Worker static const AUTO_PNS_TAB levelTable_lowComplexity[] = {
355*e5436536SAndroid Build Coastguard Worker {
356*e5436536SAndroid Build Coastguard Worker 0,
357*e5436536SAndroid Build Coastguard Worker 27999,
358*e5436536SAndroid Build Coastguard Worker 0,
359*e5436536SAndroid Build Coastguard Worker 0,
360*e5436536SAndroid Build Coastguard Worker 0,
361*e5436536SAndroid Build Coastguard Worker 0,
362*e5436536SAndroid Build Coastguard Worker 0,
363*e5436536SAndroid Build Coastguard Worker 0,
364*e5436536SAndroid Build Coastguard Worker },
365*e5436536SAndroid Build Coastguard Worker {
366*e5436536SAndroid Build Coastguard Worker 28000,
367*e5436536SAndroid Build Coastguard Worker 31999,
368*e5436536SAndroid Build Coastguard Worker 0,
369*e5436536SAndroid Build Coastguard Worker 2,
370*e5436536SAndroid Build Coastguard Worker 2,
371*e5436536SAndroid Build Coastguard Worker 2,
372*e5436536SAndroid Build Coastguard Worker 2,
373*e5436536SAndroid Build Coastguard Worker 2,
374*e5436536SAndroid Build Coastguard Worker },
375*e5436536SAndroid Build Coastguard Worker {
376*e5436536SAndroid Build Coastguard Worker 32000,
377*e5436536SAndroid Build Coastguard Worker 47999,
378*e5436536SAndroid Build Coastguard Worker 0,
379*e5436536SAndroid Build Coastguard Worker 3,
380*e5436536SAndroid Build Coastguard Worker 3,
381*e5436536SAndroid Build Coastguard Worker 3,
382*e5436536SAndroid Build Coastguard Worker 3,
383*e5436536SAndroid Build Coastguard Worker 3,
384*e5436536SAndroid Build Coastguard Worker },
385*e5436536SAndroid Build Coastguard Worker {
386*e5436536SAndroid Build Coastguard Worker 48000,
387*e5436536SAndroid Build Coastguard Worker 48000,
388*e5436536SAndroid Build Coastguard Worker 0,
389*e5436536SAndroid Build Coastguard Worker 4,
390*e5436536SAndroid Build Coastguard Worker 4,
391*e5436536SAndroid Build Coastguard Worker 4,
392*e5436536SAndroid Build Coastguard Worker 4,
393*e5436536SAndroid Build Coastguard Worker 4,
394*e5436536SAndroid Build Coastguard Worker },
395*e5436536SAndroid Build Coastguard Worker {
396*e5436536SAndroid Build Coastguard Worker 48001,
397*e5436536SAndroid Build Coastguard Worker 999999,
398*e5436536SAndroid Build Coastguard Worker 0,
399*e5436536SAndroid Build Coastguard Worker 0,
400*e5436536SAndroid Build Coastguard Worker 0,
401*e5436536SAndroid Build Coastguard Worker 0,
402*e5436536SAndroid Build Coastguard Worker 0,
403*e5436536SAndroid Build Coastguard Worker 0,
404*e5436536SAndroid Build Coastguard Worker },
405*e5436536SAndroid Build Coastguard Worker };
406*e5436536SAndroid Build Coastguard Worker /* conversion of old LC tuning tables to new (LD enc) structure (only entries
407*e5436536SAndroid Build Coastguard Worker * which are actually used were converted) */
408*e5436536SAndroid Build Coastguard Worker static const PNS_INFO_TAB pnsInfoTab_lowComplexity[] = {
409*e5436536SAndroid Build Coastguard Worker /*0 pns off */
410*e5436536SAndroid Build Coastguard Worker /* DEFAULT parameter set */
411*e5436536SAndroid Build Coastguard Worker /*1*/ {4100, FL2FXCONST_SGL(0.03), FL2FXCONST_SGL(0.16), 1100, 1400,
412*e5436536SAndroid Build Coastguard Worker FL2FXCONST_SGL(0.5), 16,
413*e5436536SAndroid Build Coastguard Worker USE_POWER_DISTRIBUTION | USE_PSYCH_TONALITY | USE_TNS_GAIN_THR |
414*e5436536SAndroid Build Coastguard Worker USE_TNS_PNS | JUST_LONG_WINDOW},
415*e5436536SAndroid Build Coastguard Worker /*2*/
416*e5436536SAndroid Build Coastguard Worker {4100, FL2FXCONST_SGL(0.05), FL2FXCONST_SGL(0.10), 1410, 1400,
417*e5436536SAndroid Build Coastguard Worker FL2FXCONST_SGL(0.5), 16,
418*e5436536SAndroid Build Coastguard Worker USE_POWER_DISTRIBUTION | USE_PSYCH_TONALITY | USE_TNS_GAIN_THR |
419*e5436536SAndroid Build Coastguard Worker USE_TNS_PNS | JUST_LONG_WINDOW},
420*e5436536SAndroid Build Coastguard Worker /*3*/
421*e5436536SAndroid Build Coastguard Worker {4100, FL2FXCONST_SGL(0.05), FL2FXCONST_SGL(0.10), 1100, 1400,
422*e5436536SAndroid Build Coastguard Worker FL2FXCONST_SGL(0.5), 16,
423*e5436536SAndroid Build Coastguard Worker USE_POWER_DISTRIBUTION | USE_PSYCH_TONALITY | USE_TNS_GAIN_THR |
424*e5436536SAndroid Build Coastguard Worker USE_TNS_PNS | JUST_LONG_WINDOW},
425*e5436536SAndroid Build Coastguard Worker /* LOWSUBST -> PNS is used less often than with DEFAULT parameter set (for
426*e5436536SAndroid Build Coastguard Worker br: 48000 - 79999) */
427*e5436536SAndroid Build Coastguard Worker /*4*/
428*e5436536SAndroid Build Coastguard Worker {4100, FL2FXCONST_SGL(0.20), FL2FXCONST_SGL(0.10), 1410, 1400,
429*e5436536SAndroid Build Coastguard Worker FL2FXCONST_SGL(0.5), 16,
430*e5436536SAndroid Build Coastguard Worker USE_POWER_DISTRIBUTION | USE_PSYCH_TONALITY | USE_TNS_GAIN_THR |
431*e5436536SAndroid Build Coastguard Worker USE_TNS_PNS | JUST_LONG_WINDOW},
432*e5436536SAndroid Build Coastguard Worker };
433*e5436536SAndroid Build Coastguard Worker
434*e5436536SAndroid Build Coastguard Worker /****************************************************************************
435*e5436536SAndroid Build Coastguard Worker function to look up used pns level
436*e5436536SAndroid Build Coastguard Worker ****************************************************************************/
FDKaacEnc_lookUpPnsUse(int bitRate,int sampleRate,int numChan,const int isLC)437*e5436536SAndroid Build Coastguard Worker int FDKaacEnc_lookUpPnsUse(int bitRate, int sampleRate, int numChan,
438*e5436536SAndroid Build Coastguard Worker const int isLC) {
439*e5436536SAndroid Build Coastguard Worker int hUsePns = 0, size, i;
440*e5436536SAndroid Build Coastguard Worker const AUTO_PNS_TAB *levelTable;
441*e5436536SAndroid Build Coastguard Worker
442*e5436536SAndroid Build Coastguard Worker if (isLC) {
443*e5436536SAndroid Build Coastguard Worker levelTable = &levelTable_lowComplexity[0];
444*e5436536SAndroid Build Coastguard Worker size = sizeof(levelTable_lowComplexity);
445*e5436536SAndroid Build Coastguard Worker } else { /* (E)LD */
446*e5436536SAndroid Build Coastguard Worker levelTable = (numChan > 1) ? &levelTable_stereo[0] : &levelTable_mono[0];
447*e5436536SAndroid Build Coastguard Worker size = (numChan > 1) ? sizeof(levelTable_stereo) : sizeof(levelTable_mono);
448*e5436536SAndroid Build Coastguard Worker }
449*e5436536SAndroid Build Coastguard Worker
450*e5436536SAndroid Build Coastguard Worker for (i = 0; i < (int)(size / sizeof(AUTO_PNS_TAB)); i++) {
451*e5436536SAndroid Build Coastguard Worker if (((ULONG)bitRate >= levelTable[i].brFrom) &&
452*e5436536SAndroid Build Coastguard Worker ((ULONG)bitRate <= levelTable[i].brTo))
453*e5436536SAndroid Build Coastguard Worker break;
454*e5436536SAndroid Build Coastguard Worker }
455*e5436536SAndroid Build Coastguard Worker
456*e5436536SAndroid Build Coastguard Worker /* sanity check */
457*e5436536SAndroid Build Coastguard Worker if ((int)(sizeof(pnsInfoTab) / sizeof(PNS_INFO_TAB)) < i) {
458*e5436536SAndroid Build Coastguard Worker return (PNS_TABLE_ERROR);
459*e5436536SAndroid Build Coastguard Worker }
460*e5436536SAndroid Build Coastguard Worker
461*e5436536SAndroid Build Coastguard Worker switch (sampleRate) {
462*e5436536SAndroid Build Coastguard Worker case 16000:
463*e5436536SAndroid Build Coastguard Worker hUsePns = levelTable[i].S16000;
464*e5436536SAndroid Build Coastguard Worker break;
465*e5436536SAndroid Build Coastguard Worker case 22050:
466*e5436536SAndroid Build Coastguard Worker hUsePns = levelTable[i].S22050;
467*e5436536SAndroid Build Coastguard Worker break;
468*e5436536SAndroid Build Coastguard Worker case 24000:
469*e5436536SAndroid Build Coastguard Worker hUsePns = levelTable[i].S24000;
470*e5436536SAndroid Build Coastguard Worker break;
471*e5436536SAndroid Build Coastguard Worker case 32000:
472*e5436536SAndroid Build Coastguard Worker hUsePns = levelTable[i].S32000;
473*e5436536SAndroid Build Coastguard Worker break;
474*e5436536SAndroid Build Coastguard Worker case 44100:
475*e5436536SAndroid Build Coastguard Worker hUsePns = levelTable[i].S44100;
476*e5436536SAndroid Build Coastguard Worker break;
477*e5436536SAndroid Build Coastguard Worker case 48000:
478*e5436536SAndroid Build Coastguard Worker hUsePns = levelTable[i].S48000;
479*e5436536SAndroid Build Coastguard Worker break;
480*e5436536SAndroid Build Coastguard Worker default:
481*e5436536SAndroid Build Coastguard Worker if (isLC) {
482*e5436536SAndroid Build Coastguard Worker hUsePns = levelTable[i].S48000;
483*e5436536SAndroid Build Coastguard Worker }
484*e5436536SAndroid Build Coastguard Worker break;
485*e5436536SAndroid Build Coastguard Worker }
486*e5436536SAndroid Build Coastguard Worker
487*e5436536SAndroid Build Coastguard Worker return (hUsePns);
488*e5436536SAndroid Build Coastguard Worker }
489*e5436536SAndroid Build Coastguard Worker
490*e5436536SAndroid Build Coastguard Worker /*****************************************************************************
491*e5436536SAndroid Build Coastguard Worker
492*e5436536SAndroid Build Coastguard Worker functionname: FDKaacEnc_GetPnsParam
493*e5436536SAndroid Build Coastguard Worker description: Gets PNS parameters depending on bitrate and bandwidth or
494*e5436536SAndroid Build Coastguard Worker bitsPerLine
495*e5436536SAndroid Build Coastguard Worker returns: error status
496*e5436536SAndroid Build Coastguard Worker input: Noiseparams struct, bitrate, sampling rate,
497*e5436536SAndroid Build Coastguard Worker number of sfb's, pointer to sfb offset
498*e5436536SAndroid Build Coastguard Worker output: PNS parameters
499*e5436536SAndroid Build Coastguard Worker
500*e5436536SAndroid Build Coastguard Worker *****************************************************************************/
FDKaacEnc_GetPnsParam(NOISEPARAMS * np,INT bitRate,INT sampleRate,INT sfbCnt,const INT * sfbOffset,INT * usePns,INT numChan,const INT isLC)501*e5436536SAndroid Build Coastguard Worker AAC_ENCODER_ERROR FDKaacEnc_GetPnsParam(NOISEPARAMS *np, INT bitRate,
502*e5436536SAndroid Build Coastguard Worker INT sampleRate, INT sfbCnt,
503*e5436536SAndroid Build Coastguard Worker const INT *sfbOffset, INT *usePns,
504*e5436536SAndroid Build Coastguard Worker INT numChan, const INT isLC) {
505*e5436536SAndroid Build Coastguard Worker int i, hUsePns;
506*e5436536SAndroid Build Coastguard Worker const PNS_INFO_TAB *pnsInfo;
507*e5436536SAndroid Build Coastguard Worker
508*e5436536SAndroid Build Coastguard Worker if (*usePns <= 0) return AAC_ENC_OK;
509*e5436536SAndroid Build Coastguard Worker
510*e5436536SAndroid Build Coastguard Worker if (isLC) {
511*e5436536SAndroid Build Coastguard Worker np->detectionAlgorithmFlags = IS_LOW_COMPLEXITY;
512*e5436536SAndroid Build Coastguard Worker
513*e5436536SAndroid Build Coastguard Worker pnsInfo = pnsInfoTab_lowComplexity;
514*e5436536SAndroid Build Coastguard Worker
515*e5436536SAndroid Build Coastguard Worker /* new pns params */
516*e5436536SAndroid Build Coastguard Worker hUsePns = FDKaacEnc_lookUpPnsUse(bitRate, sampleRate, numChan, isLC);
517*e5436536SAndroid Build Coastguard Worker if (hUsePns == 0) {
518*e5436536SAndroid Build Coastguard Worker *usePns = 0;
519*e5436536SAndroid Build Coastguard Worker return AAC_ENC_OK;
520*e5436536SAndroid Build Coastguard Worker }
521*e5436536SAndroid Build Coastguard Worker
522*e5436536SAndroid Build Coastguard Worker if (hUsePns == PNS_TABLE_ERROR) {
523*e5436536SAndroid Build Coastguard Worker return AAC_ENC_PNS_TABLE_ERROR;
524*e5436536SAndroid Build Coastguard Worker }
525*e5436536SAndroid Build Coastguard Worker
526*e5436536SAndroid Build Coastguard Worker /* select correct row of tuning table */
527*e5436536SAndroid Build Coastguard Worker pnsInfo += hUsePns - 1;
528*e5436536SAndroid Build Coastguard Worker
529*e5436536SAndroid Build Coastguard Worker } else {
530*e5436536SAndroid Build Coastguard Worker np->detectionAlgorithmFlags = 0;
531*e5436536SAndroid Build Coastguard Worker pnsInfo = pnsInfoTab;
532*e5436536SAndroid Build Coastguard Worker
533*e5436536SAndroid Build Coastguard Worker /* new pns params */
534*e5436536SAndroid Build Coastguard Worker hUsePns = FDKaacEnc_lookUpPnsUse(bitRate, sampleRate, numChan, isLC);
535*e5436536SAndroid Build Coastguard Worker if (hUsePns == 0) {
536*e5436536SAndroid Build Coastguard Worker *usePns = 0;
537*e5436536SAndroid Build Coastguard Worker return AAC_ENC_OK;
538*e5436536SAndroid Build Coastguard Worker }
539*e5436536SAndroid Build Coastguard Worker if (hUsePns == PNS_TABLE_ERROR) return AAC_ENC_PNS_TABLE_ERROR;
540*e5436536SAndroid Build Coastguard Worker
541*e5436536SAndroid Build Coastguard Worker /* select correct row of tuning table */
542*e5436536SAndroid Build Coastguard Worker pnsInfo += hUsePns - 1;
543*e5436536SAndroid Build Coastguard Worker }
544*e5436536SAndroid Build Coastguard Worker
545*e5436536SAndroid Build Coastguard Worker np->startSfb = FDKaacEnc_FreqToBandWidthRounding(
546*e5436536SAndroid Build Coastguard Worker pnsInfo->startFreq, sampleRate, sfbCnt, sfbOffset);
547*e5436536SAndroid Build Coastguard Worker
548*e5436536SAndroid Build Coastguard Worker np->detectionAlgorithmFlags |= pnsInfo->detectionAlgorithmFlags;
549*e5436536SAndroid Build Coastguard Worker
550*e5436536SAndroid Build Coastguard Worker np->refPower = FX_SGL2FX_DBL(pnsInfo->refPower);
551*e5436536SAndroid Build Coastguard Worker np->refTonality = FX_SGL2FX_DBL(pnsInfo->refTonality);
552*e5436536SAndroid Build Coastguard Worker np->tnsGainThreshold = pnsInfo->tnsGainThreshold;
553*e5436536SAndroid Build Coastguard Worker np->tnsPNSGainThreshold = pnsInfo->tnsPNSGainThreshold;
554*e5436536SAndroid Build Coastguard Worker np->minSfbWidth = pnsInfo->minSfbWidth;
555*e5436536SAndroid Build Coastguard Worker
556*e5436536SAndroid Build Coastguard Worker np->gapFillThr =
557*e5436536SAndroid Build Coastguard Worker pnsInfo->gapFillThr; /* for LC it is always FL2FXCONST_SGL(0.5) */
558*e5436536SAndroid Build Coastguard Worker
559*e5436536SAndroid Build Coastguard Worker /* assuming a constant dB/Hz slope in the signal's PSD curve,
560*e5436536SAndroid Build Coastguard Worker the detection threshold needs to be corrected for the width of the band */
561*e5436536SAndroid Build Coastguard Worker
562*e5436536SAndroid Build Coastguard Worker for (i = 0; i < (sfbCnt - 1); i++) {
563*e5436536SAndroid Build Coastguard Worker INT qtmp, sfbWidth;
564*e5436536SAndroid Build Coastguard Worker FIXP_DBL tmp;
565*e5436536SAndroid Build Coastguard Worker
566*e5436536SAndroid Build Coastguard Worker sfbWidth = sfbOffset[i + 1] - sfbOffset[i];
567*e5436536SAndroid Build Coastguard Worker
568*e5436536SAndroid Build Coastguard Worker tmp = fPow(np->refPower, 0, sfbWidth, DFRACT_BITS - 1 - 5, &qtmp);
569*e5436536SAndroid Build Coastguard Worker np->powDistPSDcurve[i] = (FIXP_SGL)((LONG)(scaleValue(tmp, qtmp) >> 16));
570*e5436536SAndroid Build Coastguard Worker }
571*e5436536SAndroid Build Coastguard Worker np->powDistPSDcurve[sfbCnt] = np->powDistPSDcurve[sfbCnt - 1];
572*e5436536SAndroid Build Coastguard Worker
573*e5436536SAndroid Build Coastguard Worker return AAC_ENC_OK;
574*e5436536SAndroid Build Coastguard Worker }
575