Codebase list fdk-aac / bd83e45
New upstream version 2.0.2 Sebastian Ramacher 2 years ago
133 changed file(s) with 8585 addition(s) and 3922 deletion(s). Raw diff Collapse all Expand all
2626 stamp-h1
2727 aac-enc
2828 compile
29
30 CMakeCache.txt
31 CMakeFiles
32 CMakeScripts
33 Testing
34 cmake_install.cmake
35 install_manifest.txt
36 compile_commands.json
37 CTestTestfile.cmake
38 CMakeSettings.json
39
40 *[Bb]uild*/
41
42 .vs/
43 .vscode/
0 // *** THIS PACKAGE HAS SPECIAL LICENSING CONDITIONS. PLEASE
1 // CONSULT THE OWNERS AND opensource-licensing@google.com BEFORE
2 // DEPENDING ON IT IN YOUR PROJECT. ***
3 package {
4 default_applicable_licenses: ["external_aac_license"],
5 }
6
7 // Added automatically by a large-scale-change that took the approach of
8 // 'apply every license found to every target'. While this makes sure we respect
9 // every license restriction, it may not be entirely correct.
10 //
11 // e.g. GPL in an MIT project might only apply to the contrib/ directory.
12 //
13 // Please consider splitting the single license below into multiple licenses,
14 // taking care not to lose any license_kind information, and overriding the
15 // default license using the 'licenses: [...]' property on targets as needed.
16 //
17 // For unused files, consider creating a 'fileGroup' with "//visibility:private"
18 // to attach the license to, and including a comment whether the files may be
19 // used in the current project.
20 // See: http://go/android-license-faq
21 license {
22 name: "external_aac_license",
23 visibility: [":__subpackages__"],
24 license_kinds: [
25 "SPDX-license-identifier-Apache-2.0",
26 "legacy_by_exception_only", // by exception only
27 ],
28 license_text: [
29 "NOTICE",
30 ],
31 }
32
033 cc_library_static {
134 name: "libFraunhoferAAC",
235 vendor_available: true,
36 host_supported: true,
337 srcs: [
438 "libAACdec/src/*.cpp",
539 "libAACenc/src/*.cpp",
2256 "-Wuninitialized",
2357 "-Wno-self-assign",
2458 "-Wno-implicit-fallthrough",
59 "-DSUPPRESS_BUILD_DATE_INFO",
2560 ],
2661 sanitize: {
27 misc_undefined:[
28 "unsigned-integer-overflow",
29 "signed-integer-overflow",
30 "bounds",
62 misc_undefined: [
63 "unsigned-integer-overflow",
64 "signed-integer-overflow",
65 "bounds",
3166 ],
3267 cfi: true,
3368 },
4984 "libSACdec/include",
5085 "libSACenc/include",
5186 ],
87
88 target: {
89 darwin: {
90 enabled: false,
91 },
92 },
93
94 apex_available: [
95 "//apex_available:platform",
96 "com.android.bluetooth.updatable",
97 "com.android.media.swcodec",
98 ],
99 min_sdk_version: "29",
52100 }
0 # # CMake project for fdk-aac
1 #
2 # ## Basic usage
3 #
4 # 1. Download and install CMake >= 3.10 (CMake >= 3.15 is recommended)
5 # 2. Clone fdk-aac repository
6 # 3. In fdk-aac directory create and go to `build` subdirectory:
7 #
8 # mkdir build
9 # cd build
10 #
11 # 4. Run cmake to configure project with desired build type (Release|Debug):
12 #
13 # cmake .. -DCMAKE_BUILD_TYPE=Release
14 #
15 # Note CMake configuration without CMAKE_BUILD_TYPE option will not set build
16 # type to some default and it is most likely is not what you want.
17 #
18 # If you want to build static (default is shared library), add BUILD_SHARED_LIBS=OFF option:
19 #
20 # # cmake .. -DBUILD_SHARED_LIBS=OFF
21 #
22 # You can combine options as well:
23 #
24 # cmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF
25 #
26 # 5. Run cmake to build project:
27 #
28 # cmake --build . -c Release
29
30 cmake_minimum_required(VERSION 3.5.1)
31
32 # Policies
33
34 ## Enables CMAKE_MSVC_RUNTIME_LIBRARY option support for CMake >= 3.15
35 ## if you want to use a MSVC multi-threaded statically-linked runtime library
36 ## If you enable it, CMake will build fdk-acc.dll without external dependencies.
37 ##
38 ## Example usage:
39 ##
40 ## cmake .. -DCMAKE_MSVC_RUNTIME_LIBRARY="MultiThreaded$<$<CONFIG:Debug>:Debug>
41 if(POLICY CMP0091)
42 cmake_policy(SET CMP0091 NEW)
43 endif()
44
45 project(fdk-aac VERSION 2.0.2)
46
47 # Includes
48
49 include(CheckFunctionExists)
50 include(CheckLibraryExists)
51 include(GNUInstallDirs)
52 include(CMakePackageConfigHelpers)
53
54 if(CMAKE_VERSION VERSION_LESS 3.11)
55 set(CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR})
56 set(CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR})
57 set(CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH})
58 endif()
59 include(CPack)
60
61 # Options
62
63 option(BUILD_SHARED_LIBS "Build shared library" ON)
64 option(BUILD_PROGRAMS "Build aac-enc utility" OFF)
65 option(FDK_AAC_INSTALL_CMAKE_CONFIG_MODULE "Install CMake package configuration file" ON)
66 option(FDK_AAC_INSTALL_PKGCONFIG_MODULE "Install pkg-config .pc file" ON)
67
68 # Checks
69
70 ## Check if math functions are in separate library (Most of Linux distros, maybe some other OSes)
71 check_function_exists(sin HAVE_DEFAULT_MATH)
72 if(NOT HAVE_DEFAULT_MATH)
73 check_library_exists(m sin "" HAVE_LIBM)
74 endif()
75
76 # Library
77
78 ## Sources
79
80 set(AACDEC_SRC
81 libAACdec/src/FDK_delay.cpp
82 libAACdec/src/aac_ram.cpp
83 libAACdec/src/aac_rom.cpp
84 libAACdec/src/aacdec_drc.cpp
85 libAACdec/src/aacdec_hcr.cpp
86 libAACdec/src/aacdec_hcr_bit.cpp
87 libAACdec/src/aacdec_hcrs.cpp
88 libAACdec/src/aacdec_pns.cpp
89 libAACdec/src/aacdec_tns.cpp
90 libAACdec/src/aacdecoder.cpp
91 libAACdec/src/aacdecoder_lib.cpp
92 libAACdec/src/block.cpp
93 libAACdec/src/channel.cpp
94 libAACdec/src/channelinfo.cpp
95 libAACdec/src/conceal.cpp
96 libAACdec/src/ldfiltbank.cpp
97 libAACdec/src/pulsedata.cpp
98 libAACdec/src/rvlc.cpp
99 libAACdec/src/rvlcbit.cpp
100 libAACdec/src/rvlcconceal.cpp
101 libAACdec/src/stereo.cpp
102 libAACdec/src/usacdec_ace_d4t64.cpp
103 libAACdec/src/usacdec_ace_ltp.cpp
104 libAACdec/src/usacdec_acelp.cpp
105 libAACdec/src/usacdec_fac.cpp
106 libAACdec/src/usacdec_lpc.cpp
107 libAACdec/src/usacdec_lpd.cpp
108 libAACdec/src/usacdec_rom.cpp
109 libAACdec/src/aac_ram.h
110 libAACdec/src/aac_rom.h
111 libAACdec/src/aacdec_drc.h
112 libAACdec/src/aacdec_drc_types.h
113 libAACdec/src/aacdec_hcr.h
114 libAACdec/src/aacdec_hcr_bit.h
115 libAACdec/src/aacdec_hcr_types.h
116 libAACdec/src/aacdec_hcrs.h
117 libAACdec/src/aacdec_pns.h
118 libAACdec/src/aacdec_tns.h
119 libAACdec/src/aacdecoder.h
120 libAACdec/src/block.h
121 libAACdec/src/channel.h
122 libAACdec/src/channelinfo.h
123 libAACdec/src/conceal.h
124 libAACdec/src/conceal_types.h
125 libAACdec/src/FDK_delay.h
126 libAACdec/src/ldfiltbank.h
127 libAACdec/src/overlapadd.h
128 libAACdec/src/pulsedata.h
129 libAACdec/src/rvlc.h
130 libAACdec/src/rvlc_info.h
131 libAACdec/src/rvlcbit.h
132 libAACdec/src/rvlcconceal.h
133 libAACdec/src/stereo.h
134 libAACdec/src/usacdec_ace_d4t64.h
135 libAACdec/src/usacdec_ace_ltp.h
136 libAACdec/src/usacdec_acelp.h
137 libAACdec/src/usacdec_const.h
138 libAACdec/src/usacdec_fac.h
139 libAACdec/src/usacdec_lpc.h
140 libAACdec/src/usacdec_lpd.h
141 libAACdec/src/usacdec_rom.h)
142
143 set(AACENC_SRC
144 libAACenc/src/aacEnc_ram.cpp
145 libAACenc/src/aacEnc_rom.cpp
146 libAACenc/src/aacenc.cpp
147 libAACenc/src/aacenc_lib.cpp
148 libAACenc/src/aacenc_pns.cpp
149 libAACenc/src/aacenc_tns.cpp
150 libAACenc/src/adj_thr.cpp
151 libAACenc/src/band_nrg.cpp
152 libAACenc/src/bandwidth.cpp
153 libAACenc/src/bit_cnt.cpp
154 libAACenc/src/bitenc.cpp
155 libAACenc/src/block_switch.cpp
156 libAACenc/src/channel_map.cpp
157 libAACenc/src/chaosmeasure.cpp
158 libAACenc/src/dyn_bits.cpp
159 libAACenc/src/grp_data.cpp
160 libAACenc/src/intensity.cpp
161 libAACenc/src/line_pe.cpp
162 libAACenc/src/metadata_compressor.cpp
163 libAACenc/src/metadata_main.cpp
164 libAACenc/src/mps_main.cpp
165 libAACenc/src/ms_stereo.cpp
166 libAACenc/src/noisedet.cpp
167 libAACenc/src/pnsparam.cpp
168 libAACenc/src/pre_echo_control.cpp
169 libAACenc/src/psy_configuration.cpp
170 libAACenc/src/psy_main.cpp
171 libAACenc/src/qc_main.cpp
172 libAACenc/src/quantize.cpp
173 libAACenc/src/sf_estim.cpp
174 libAACenc/src/spreading.cpp
175 libAACenc/src/tonality.cpp
176 libAACenc/src/transform.cpp
177 libAACenc/src/aacenc.h
178 libAACenc/src/aacenc_pns.h
179 libAACenc/src/aacEnc_ram.h
180 libAACenc/src/aacEnc_rom.h
181 libAACenc/src/aacenc_tns.h
182 libAACenc/src/adj_thr.h
183 libAACenc/src/adj_thr_data.h
184 libAACenc/src/band_nrg.h
185 libAACenc/src/bandwidth.h
186 libAACenc/src/bit_cnt.h
187 libAACenc/src/bitenc.h
188 libAACenc/src/block_switch.h
189 libAACenc/src/channel_map.h
190 libAACenc/src/chaosmeasure.h
191 libAACenc/src/dyn_bits.h
192 libAACenc/src/grp_data.h
193 libAACenc/src/intensity.h
194 libAACenc/src/interface.h
195 libAACenc/src/line_pe.h
196 libAACenc/src/metadata_compressor.h
197 libAACenc/src/metadata_main.h
198 libAACenc/src/mps_main.h
199 libAACenc/src/ms_stereo.h
200 libAACenc/src/noisedet.h
201 libAACenc/src/pns_func.h
202 libAACenc/src/pnsparam.h
203 libAACenc/src/pre_echo_control.h
204 libAACenc/src/psy_configuration.h
205 libAACenc/src/psy_const.h
206 libAACenc/src/psy_data.h
207 libAACenc/src/psy_main.h
208 libAACenc/src/qc_data.h
209 libAACenc/src/qc_main.h
210 libAACenc/src/quantize.h
211 libAACenc/src/sf_estim.h
212 libAACenc/src/spreading.h
213 libAACenc/src/tns_func.h
214 libAACenc/src/tonality.h
215 libAACenc/src/transform.h)
216
217 set(ARITHCODING_SRC
218 libArithCoding/src/ac_arith_coder.cpp)
219
220 set(DRCDEC_SRC
221 libDRCdec/src/FDK_drcDecLib.cpp
222 libDRCdec/src/drcDec_gainDecoder.cpp
223 libDRCdec/src/drcDec_reader.cpp
224 libDRCdec/src/drcDec_rom.cpp
225 libDRCdec/src/drcDec_selectionProcess.cpp
226 libDRCdec/src/drcDec_tools.cpp
227 libDRCdec/src/drcGainDec_init.cpp
228 libDRCdec/src/drcGainDec_preprocess.cpp
229 libDRCdec/src/drcGainDec_process.cpp
230 libDRCdec/src/drcDec_gainDecoder.h
231 libDRCdec/src/drcDec_reader.h
232 libDRCdec/src/drcDec_rom.h
233 libDRCdec/src/drcDec_selectionProcess.h
234 libDRCdec/src/drcDec_tools.h
235 libDRCdec/src/drcDec_types.h
236 libDRCdec/src/drcDecoder.h
237 libDRCdec/src/drcGainDec_init.h
238 libDRCdec/src/drcGainDec_preprocess.h
239 libDRCdec/src/drcGainDec_process.h)
240
241 set(FDK_SRC
242 libFDK/src/FDK_bitbuffer.cpp
243 libFDK/src/FDK_core.cpp
244 libFDK/src/FDK_crc.cpp
245 libFDK/src/FDK_decorrelate.cpp
246 libFDK/src/FDK_hybrid.cpp
247 libFDK/src/FDK_lpc.cpp
248 libFDK/src/FDK_matrixCalloc.cpp
249 libFDK/src/FDK_qmf_domain.cpp
250 libFDK/src/FDK_tools_rom.cpp
251 libFDK/src/FDK_trigFcts.cpp
252 libFDK/src/autocorr2nd.cpp
253 libFDK/src/dct.cpp
254 libFDK/src/fft.cpp
255 libFDK/src/fft_rad2.cpp
256 libFDK/src/fixpoint_math.cpp
257 libFDK/src/huff_nodes.cpp
258 libFDK/src/mdct.cpp
259 libFDK/src/nlc_dec.cpp
260 libFDK/src/qmf.cpp
261 libFDK/src/scale.cpp)
262
263 set(MPEGTPDEC_SRC
264 libMpegTPDec/src/tpdec_adif.cpp
265 libMpegTPDec/src/tpdec_adts.cpp
266 libMpegTPDec/src/tpdec_asc.cpp
267 libMpegTPDec/src/tpdec_drm.cpp
268 libMpegTPDec/src/tpdec_latm.cpp
269 libMpegTPDec/src/tpdec_lib.cpp
270 libMpegTPDec/src/tp_version.h
271 libMpegTPDec/src/tpdec_adif.h
272 libMpegTPDec/src/tpdec_adts.h
273 libMpegTPDec/src/tpdec_drm.h
274 libMpegTPDec/src/tpdec_latm.h)
275
276 set(MPEGTPENC_SRC
277 libMpegTPEnc/src/tpenc_adif.cpp
278 libMpegTPEnc/src/tpenc_adts.cpp
279 libMpegTPEnc/src/tpenc_asc.cpp
280 libMpegTPEnc/src/tpenc_latm.cpp
281 libMpegTPEnc/src/tpenc_lib.cpp
282 libMpegTPEnc/src/tp_version.h
283 libMpegTPEnc/src/tpenc_adif.h
284 libMpegTPEnc/src/tpenc_adts.h
285 libMpegTPEnc/src/tpenc_asc.h
286 libMpegTPEnc/src/tpenc_latm.h)
287
288 set(PCMUTILS_SRC
289 libPCMutils/src/limiter.cpp
290 libPCMutils/src/pcm_utils.cpp
291 libPCMutils/src/pcmdmx_lib.cpp
292 libPCMutils/src/version.h)
293
294 set(SACDEC_SRC
295 libSACdec/src/sac_bitdec.cpp
296 libSACdec/src/sac_calcM1andM2.cpp
297 libSACdec/src/sac_dec.cpp
298 libSACdec/src/sac_dec_conceal.cpp
299 libSACdec/src/sac_dec_lib.cpp
300 libSACdec/src/sac_process.cpp
301 libSACdec/src/sac_qmf.cpp
302 libSACdec/src/sac_reshapeBBEnv.cpp
303 libSACdec/src/sac_rom.cpp
304 libSACdec/src/sac_smoothing.cpp
305 libSACdec/src/sac_stp.cpp
306 libSACdec/src/sac_tsd.cpp
307 libSACdec/src/sac_bitdec.h
308 libSACdec/src/sac_calcM1andM2.h
309 libSACdec/src/sac_dec.h
310 libSACdec/src/sac_dec_conceal.h
311 libSACdec/src/sac_dec_interface.h
312 libSACdec/src/sac_dec_ssc_struct.h
313 libSACdec/src/sac_process.h
314 libSACdec/src/sac_qmf.h
315 libSACdec/src/sac_reshapeBBEnv.h
316 libSACdec/src/sac_rom.h
317 libSACdec/src/sac_smoothing.h
318 libSACdec/src/sac_stp.h
319 libSACdec/src/sac_tsd.h)
320
321 set(SACENC_SRC
322 libSACenc/src/sacenc_bitstream.cpp
323 libSACenc/src/sacenc_delay.cpp
324 libSACenc/src/sacenc_dmx_tdom_enh.cpp
325 libSACenc/src/sacenc_filter.cpp
326 libSACenc/src/sacenc_framewindowing.cpp
327 libSACenc/src/sacenc_huff_tab.cpp
328 libSACenc/src/sacenc_lib.cpp
329 libSACenc/src/sacenc_nlc_enc.cpp
330 libSACenc/src/sacenc_onsetdetect.cpp
331 libSACenc/src/sacenc_paramextract.cpp
332 libSACenc/src/sacenc_staticgain.cpp
333 libSACenc/src/sacenc_tree.cpp
334 libSACenc/src/sacenc_vectorfunctions.cpp
335 libSACenc/src/sacenc_bitstream.h
336 libSACenc/src/sacenc_const.h
337 libSACenc/src/sacenc_delay.h
338 libSACenc/src/sacenc_dmx_tdom_enh.h
339 libSACenc/src/sacenc_filter.h
340 libSACenc/src/sacenc_framewindowing.h
341 libSACenc/src/sacenc_huff_tab.h
342 libSACenc/src/sacenc_nlc_enc.h
343 libSACenc/src/sacenc_onsetdetect.h
344 libSACenc/src/sacenc_paramextract.h
345 libSACenc/src/sacenc_staticgain.h
346 libSACenc/src/sacenc_tree.h
347 libSACenc/src/sacenc_vectorfunctions.h)
348
349 set(SBRDEC_SRC
350 libSBRdec/src/HFgen_preFlat.cpp
351 libSBRdec/src/env_calc.cpp
352 libSBRdec/src/env_dec.cpp
353 libSBRdec/src/env_extr.cpp
354 libSBRdec/src/hbe.cpp
355 libSBRdec/src/huff_dec.cpp
356 libSBRdec/src/lpp_tran.cpp
357 libSBRdec/src/psbitdec.cpp
358 libSBRdec/src/psdec.cpp
359 libSBRdec/src/psdec_drm.cpp
360 libSBRdec/src/psdecrom_drm.cpp
361 libSBRdec/src/pvc_dec.cpp
362 libSBRdec/src/sbr_deb.cpp
363 libSBRdec/src/sbr_dec.cpp
364 libSBRdec/src/sbr_ram.cpp
365 libSBRdec/src/sbr_rom.cpp
366 libSBRdec/src/sbrdec_drc.cpp
367 libSBRdec/src/sbrdec_freq_sca.cpp
368 libSBRdec/src/sbrdecoder.cpp
369 libSBRdec/src/env_calc.h
370 libSBRdec/src/env_dec.h
371 libSBRdec/src/env_extr.h
372 libSBRdec/src/hbe.h
373 libSBRdec/src/HFgen_preFlat.h
374 libSBRdec/src/huff_dec.h
375 libSBRdec/src/lpp_tran.h
376 libSBRdec/src/psbitdec.h
377 libSBRdec/src/psdec.h
378 libSBRdec/src/psdec_drm.h
379 libSBRdec/src/pvc_dec.h
380 libSBRdec/src/sbr_deb.h
381 libSBRdec/src/sbr_dec.h
382 libSBRdec/src/sbr_ram.h
383 libSBRdec/src/sbr_rom.h
384 libSBRdec/src/sbrdec_drc.h
385 libSBRdec/src/sbrdec_freq_sca.h
386 libSBRdec/src/transcendent.h)
387
388 set(SBRENC_SRC
389 libSBRenc/src/bit_sbr.cpp
390 libSBRenc/src/code_env.cpp
391 libSBRenc/src/env_bit.cpp
392 libSBRenc/src/env_est.cpp
393 libSBRenc/src/fram_gen.cpp
394 libSBRenc/src/invf_est.cpp
395 libSBRenc/src/mh_det.cpp
396 libSBRenc/src/nf_est.cpp
397 libSBRenc/src/ps_bitenc.cpp
398 libSBRenc/src/ps_encode.cpp
399 libSBRenc/src/ps_main.cpp
400 libSBRenc/src/resampler.cpp
401 libSBRenc/src/sbr_encoder.cpp
402 libSBRenc/src/sbr_misc.cpp
403 libSBRenc/src/sbrenc_freq_sca.cpp
404 libSBRenc/src/sbrenc_ram.cpp
405 libSBRenc/src/sbrenc_rom.cpp
406 libSBRenc/src/ton_corr.cpp
407 libSBRenc/src/tran_det.cpp
408 libSBRenc/src/bit_sbr.h
409 libSBRenc/src/cmondata.h
410 libSBRenc/src/code_env.h
411 libSBRenc/src/env_bit.h
412 libSBRenc/src/env_est.h
413 libSBRenc/src/fram_gen.h
414 libSBRenc/src/invf_est.h
415 libSBRenc/src/mh_det.h
416 libSBRenc/src/nf_est.h
417 libSBRenc/src/ps_bitenc.h
418 libSBRenc/src/ps_const.h
419 libSBRenc/src/ps_encode.h
420 libSBRenc/src/ps_main.h
421 libSBRenc/src/resampler.h
422 libSBRenc/src/sbr.h
423 libSBRenc/src/sbr_def.h
424 libSBRenc/src/sbr_misc.h
425 libSBRenc/src/sbrenc_freq_sca.h
426 libSBRenc/src/sbrenc_ram.h
427 libSBRenc/src/sbrenc_rom.h
428 libSBRenc/src/ton_corr.h
429 libSBRenc/src/tran_det.h)
430
431 set(SYS_SRC
432 libSYS/src/genericStds.cpp
433 libSYS/src/syslib_channelMapDescr.cpp)
434
435 set(fdk_aacinclude_HEADERS
436 libSYS/include/machine_type.h
437 libSYS/include/genericStds.h
438 libSYS/include/FDK_audio.h
439 libSYS/include/syslib_channelMapDescr.h
440 libAACenc/include/aacenc_lib.h
441 libAACdec/include/aacdecoder_lib.h)
442
443 set(libfdk_aac_SOURCES
444 ${AACDEC_SRC} ${AACENC_SRC}
445 ${ARITHCODING_SRC}
446 ${DRCDEC_SRC}
447 ${MPEGTPDEC_SRC} ${MPEGTPENC_SRC}
448 ${SACDEC_SRC} ${SACENC_SRC}
449 ${SBRDEC_SRC} ${SBRENC_SRC}
450 ${PCMUTILS_SRC} ${FDK_SRC} ${SYS_SRC})
451
452 if(WIN32 AND BUILD_SHARED_LIBS)
453 set(libfdk_aac_SOURCES ${libfdk_aac_SOURCES} fdk-aac.def)
454 endif()
455
456 ## Create Library target. Actually fdk-aac is enough, but we also create
457 ## FDK-AAC::fdk-aac for consistence with config-file package.
458
459 add_library(fdk-aac ${libfdk_aac_SOURCES})
460 add_library(FDK-AAC::fdk-aac ALIAS fdk-aac)
461
462 ## Library target configuration
463
464 ### Library target includes
465 target_include_directories(fdk-aac
466 PUBLIC
467 $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
468 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/libAACdec/include>
469 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/libAACenc/include>
470 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/libSYS/include>
471 PRIVATE
472 libArithCoding/include
473 libDRCdec/include
474 libSACdec/include
475 libSACenc/include
476 libSBRdec/include
477 libSBRenc/include
478 libMpegTPDec/include
479 libMpegTPEnc/include
480 libFDK/include
481 libPCMutils/include)
482
483 ### Link math library if required
484 target_link_libraries(fdk-aac PRIVATE $<$<BOOL:${HAVE_LIBM}>:m>)
485
486 ### Set public headers and shared library version. Version info is critical for Unix-like OSes.
487 set_target_properties(fdk-aac PROPERTIES
488 PUBLIC_HEADER "${fdk_aacinclude_HEADERS}"
489 VERSION 2.0.2
490 SOVERSION 2
491 MACHO_COMPATIBILITY_VERSION 3.0.0
492 MACHO_CURRENT_VERSION 3.2.0)
493
494 ### Some compiler options from Makefile.am
495 if(MSVC)
496 target_compile_options(fdk-aac PRIVATE /EHsc)
497 else()
498 target_compile_options(fdk-aac PRIVATE -fno-exceptions -fno-rtti)
499 endif()
500
501 ### Set proper name for MinGW or Cygwin DLL
502
503 if((MINGW OR CYGWIN) AND BUILD_SHARED_LIBS)
504 set_property(TARGET fdk-aac PROPERTY RUNTIME_OUTPUT_NAME fdk-aac-2)
505 endif()
506
507 ## Library installation
508
509 ### Note we export `fdk-aac-targets` to use with config-file package.
510 install(TARGETS fdk-aac EXPORT fdk-aac-targets
511 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT BIN
512 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT DEV
513 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT DEV
514 PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/fdk-aac COMPONENT DEV)
515
516 ### Configure and install pkg-config module.
517 if(FDK_AAC_INSTALL_PKGCONFIG_MODULE)
518 set(prefix ${CMAKE_INSTALL_PREFIX})
519 set(exec_prefix "\$\{prefix\}")
520 set(libdir "\$\{exec_prefix\}/${CMAKE_INSTALL_LIBDIR}")
521 set(includedir "\$\{prefix\}/${CMAKE_INSTALL_INCLUDEDIR}")
522 set(PACKAGE_VERSION ${PROJECT_VERSION})
523 if(HAVE_LIBM)
524 if(BUILD_SHARED_LIBS)
525 set(LIBS_PRIVATE "-lm")
526 else()
527 set(LIBS_PUBLIC "-lm")
528 endif()
529 endif()
530 configure_file(fdk-aac.pc.in fdk-aac.pc @ONLY)
531 install(
532 FILES
533 ${CMAKE_CURRENT_BINARY_DIR}/fdk-aac.pc
534 DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
535 endif()
536
537 ### Configure and install config-file package. Something like pkg-config module, but for Windows.
538 if(FDK_AAC_INSTALL_CMAKE_CONFIG_MODULE)
539
540 set(CMAKE_INSTALL_PACKAGEDIR ${CMAKE_INSTALL_LIBDIR}/cmake/fdk-aac)
541
542 configure_package_config_file(fdk-aac-config.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/fdk-aac-config.cmake
543 INSTALL_DESTINATION ${CMAKE_INSTALL_PACKAGEDIR})
544
545 if(CMAKE_VERSION VERSION_LESS 3.11)
546 write_basic_package_version_file(fdk-aac-config-version.cmake COMPATIBILITY SameMajorVersion)
547 else()
548 write_basic_package_version_file(fdk-aac-config-version.cmake COMPATIBILITY SameMinorVersion)
549 endif()
550
551 install(EXPORT fdk-aac-targets
552 NAMESPACE FDK-AAC::
553 DESTINATION ${CMAKE_INSTALL_PACKAGEDIR})
554 install(
555 FILES
556 ${CMAKE_CURRENT_BINARY_DIR}/fdk-aac-config.cmake
557 ${CMAKE_CURRENT_BINARY_DIR}/fdk-aac-config-version.cmake
558 DESTINATION ${CMAKE_INSTALL_PACKAGEDIR})
559
560 endif()
561
562 # Programs
563
564 if(BUILD_PROGRAMS)
565
566 ## Program sources
567
568 set(aac_enc_SOURCES
569 aac-enc.c
570 wavreader.c
571 wavreader.h)
572
573 ## Program target
574 add_executable(aac-enc ${aac_enc_SOURCES})
575
576 ## Program target configuration
577 target_link_libraries(aac-enc PRIVATE fdk-aac)
578 target_compile_definitions(aac-enc PRIVATE $<$<BOOL:${MSVC}>:_CRT_SECURE_NO_WARNINGS>)
579 if(WIN32)
580 target_sources(aac-enc PRIVATE win32/getopt.h)
581 target_include_directories(aac-enc PRIVATE win32)
582 endif()
583
584 ## Program target installation
585 install(TARGETS aac-enc RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
586
587 endif()
0 2.0.2
1 - Minor upstream updates
2 - Lots of upstream and local fuzzing fixes
3 - Added CMake project files
4 - Removed the MSVC specific makefile
5
06 2.0.1
17 - Minor release with a number of crash/fuzz fixes, primarily for the decoder
28
0 third_party {
1 license_type: BY_EXCEPTION_ONLY
2 }
209209 libSBRdec/src/psdec_drm.cpp \
210210 libSBRdec/src/psdecrom_drm.cpp \
211211 libSBRdec/src/pvc_dec.cpp \
212 libSBRdec/src/sbr_crc.cpp \
213212 libSBRdec/src/sbr_deb.cpp \
214213 libSBRdec/src/sbr_dec.cpp \
215214 libSBRdec/src/sbr_ram.cpp \
253252 $(PCMUTILS_SRC) $(FDK_SRC) $(SYS_SRC)
254253
255254 EXTRA_DIST = \
255 $(top_srcdir)/CMakeLists.txt \
256256 $(top_srcdir)/.clang-format \
257257 $(top_srcdir)/autogen.sh \
258258 $(top_srcdir)/MODULE_LICENSE_FRAUNHOFER \
259259 $(top_srcdir)/NOTICE \
260260 $(top_srcdir)/OWNERS \
261261 $(top_srcdir)/Android.bp \
262 $(top_srcdir)/fdk-aac.def \
262263 $(top_srcdir)/fdk-aac.sym \
263 $(top_srcdir)/Makefile.vc \
264 $(top_srcdir)/fdk-aac-config.cmake.in \
264265 $(top_srcdir)/documentation/*.pdf \
266 $(top_srcdir)/fuzzer/* \
265267 $(top_srcdir)/libAACdec/src/*.h \
266268 $(top_srcdir)/libAACdec/src/arm/*.cpp \
267269 $(top_srcdir)/libAACenc/src/*.h \
291293 $(top_srcdir)/libFDK/include/x86/*.h \
292294 $(top_srcdir)/libFDK/src/arm/*.cpp \
293295 $(top_srcdir)/libFDK/src/mips/*.cpp \
296 $(top_srcdir)/METADATA \
297 $(top_srcdir)/PREUPLOAD.cfg \
294298 $(top_srcdir)/win32/*.h
295299
+0
-321
Makefile.vc less more
0 #
1 # Options:
2 # prefix=\path\to\install
3 #
4 # Compiling: nmake -f Makefile.vc
5 # Installing: nmake -f Makefile.vc prefix=\path\to\x install
6 #
7
8 # Linker and librarian commands
9 LD = link
10 AR = lib
11
12 !IFDEF HOME
13 # In case we are using a cross compiler shell.
14 MKDIR_FLAGS = -p
15 !ENDIF
16
17 AM_CPPFLAGS = \
18 -Iwin32 \
19 -IlibAACdec/include \
20 -IlibAACenc/include \
21 -IlibArithCoding/include \
22 -IlibDRCdec/include \
23 -IlibSACdec/include \
24 -IlibSACenc/include \
25 -IlibSBRdec/include \
26 -IlibSBRenc/include \
27 -IlibMpegTPDec/include \
28 -IlibMpegTPEnc/include \
29 -IlibSYS/include \
30 -IlibFDK/include \
31 -IlibPCMutils/include
32
33 AACDEC_SRC = \
34 libAACdec/src/FDK_delay.cpp \
35 libAACdec/src/aac_ram.cpp \
36 libAACdec/src/aac_rom.cpp \
37 libAACdec/src/aacdec_drc.cpp \
38 libAACdec/src/aacdec_hcr.cpp \
39 libAACdec/src/aacdec_hcr_bit.cpp \
40 libAACdec/src/aacdec_hcrs.cpp \
41 libAACdec/src/aacdec_pns.cpp \
42 libAACdec/src/aacdec_tns.cpp \
43 libAACdec/src/aacdecoder.cpp \
44 libAACdec/src/aacdecoder_lib.cpp \
45 libAACdec/src/block.cpp \
46 libAACdec/src/channel.cpp \
47 libAACdec/src/channelinfo.cpp \
48 libAACdec/src/conceal.cpp \
49 libAACdec/src/ldfiltbank.cpp \
50 libAACdec/src/pulsedata.cpp \
51 libAACdec/src/rvlc.cpp \
52 libAACdec/src/rvlcbit.cpp \
53 libAACdec/src/rvlcconceal.cpp \
54 libAACdec/src/stereo.cpp \
55 libAACdec/src/usacdec_ace_d4t64.cpp \
56 libAACdec/src/usacdec_ace_ltp.cpp \
57 libAACdec/src/usacdec_acelp.cpp \
58 libAACdec/src/usacdec_fac.cpp \
59 libAACdec/src/usacdec_lpc.cpp \
60 libAACdec/src/usacdec_lpd.cpp \
61 libAACdec/src/usacdec_rom.cpp
62
63 AACENC_SRC = \
64 libAACenc/src/aacEnc_ram.cpp \
65 libAACenc/src/aacEnc_rom.cpp \
66 libAACenc/src/aacenc.cpp \
67 libAACenc/src/aacenc_lib.cpp \
68 libAACenc/src/aacenc_pns.cpp \
69 libAACenc/src/aacenc_tns.cpp \
70 libAACenc/src/adj_thr.cpp \
71 libAACenc/src/band_nrg.cpp \
72 libAACenc/src/bandwidth.cpp \
73 libAACenc/src/bit_cnt.cpp \
74 libAACenc/src/bitenc.cpp \
75 libAACenc/src/block_switch.cpp \
76 libAACenc/src/channel_map.cpp \
77 libAACenc/src/chaosmeasure.cpp \
78 libAACenc/src/dyn_bits.cpp \
79 libAACenc/src/grp_data.cpp \
80 libAACenc/src/intensity.cpp \
81 libAACenc/src/line_pe.cpp \
82 libAACenc/src/metadata_compressor.cpp \
83 libAACenc/src/metadata_main.cpp \
84 libAACenc/src/mps_main.cpp \
85 libAACenc/src/ms_stereo.cpp \
86 libAACenc/src/noisedet.cpp \
87 libAACenc/src/pnsparam.cpp \
88 libAACenc/src/pre_echo_control.cpp \
89 libAACenc/src/psy_configuration.cpp \
90 libAACenc/src/psy_main.cpp \
91 libAACenc/src/qc_main.cpp \
92 libAACenc/src/quantize.cpp \
93 libAACenc/src/sf_estim.cpp \
94 libAACenc/src/spreading.cpp \
95 libAACenc/src/tonality.cpp \
96 libAACenc/src/transform.cpp
97
98 ARITHCODING_SRC = \
99 libArithCoding/src/ac_arith_coder.cpp
100
101 DRCDEC_SRC = \
102 libDRCdec/src/FDK_drcDecLib.cpp \
103 libDRCdec/src/drcDec_gainDecoder.cpp \
104 libDRCdec/src/drcDec_reader.cpp \
105 libDRCdec/src/drcDec_rom.cpp \
106 libDRCdec/src/drcDec_selectionProcess.cpp \
107 libDRCdec/src/drcDec_tools.cpp \
108 libDRCdec/src/drcGainDec_init.cpp \
109 libDRCdec/src/drcGainDec_preprocess.cpp \
110 libDRCdec/src/drcGainDec_process.cpp
111
112 FDK_SRC = \
113 libFDK/src/FDK_bitbuffer.cpp \
114 libFDK/src/FDK_core.cpp \
115 libFDK/src/FDK_crc.cpp \
116 libFDK/src/FDK_decorrelate.cpp \
117 libFDK/src/FDK_hybrid.cpp \
118 libFDK/src/FDK_lpc.cpp \
119 libFDK/src/FDK_matrixCalloc.cpp \
120 libFDK/src/FDK_qmf_domain.cpp \
121 libFDK/src/FDK_tools_rom.cpp \
122 libFDK/src/FDK_trigFcts.cpp \
123 libFDK/src/autocorr2nd.cpp \
124 libFDK/src/dct.cpp \
125 libFDK/src/fft.cpp \
126 libFDK/src/fft_rad2.cpp \
127 libFDK/src/fixpoint_math.cpp \
128 libFDK/src/huff_nodes.cpp \
129 libFDK/src/mdct.cpp \
130 libFDK/src/nlc_dec.cpp \
131 libFDK/src/qmf.cpp \
132 libFDK/src/scale.cpp
133
134 MPEGTPDEC_SRC = \
135 libMpegTPDec/src/tpdec_adif.cpp \
136 libMpegTPDec/src/tpdec_adts.cpp \
137 libMpegTPDec/src/tpdec_asc.cpp \
138 libMpegTPDec/src/tpdec_drm.cpp \
139 libMpegTPDec/src/tpdec_latm.cpp \
140 libMpegTPDec/src/tpdec_lib.cpp
141
142 MPEGTPENC_SRC = \
143 libMpegTPEnc/src/tpenc_adif.cpp \
144 libMpegTPEnc/src/tpenc_adts.cpp \
145 libMpegTPEnc/src/tpenc_asc.cpp \
146 libMpegTPEnc/src/tpenc_latm.cpp \
147 libMpegTPEnc/src/tpenc_lib.cpp
148
149 PCMUTILS_SRC = \
150 libPCMutils/src/limiter.cpp \
151 libPCMutils/src/pcm_utils.cpp \
152 libPCMutils/src/pcmdmx_lib.cpp
153
154 SACDEC_SRC = \
155 libSACdec/src/sac_bitdec.cpp \
156 libSACdec/src/sac_calcM1andM2.cpp \
157 libSACdec/src/sac_dec.cpp \
158 libSACdec/src/sac_dec_conceal.cpp \
159 libSACdec/src/sac_dec_lib.cpp \
160 libSACdec/src/sac_process.cpp \
161 libSACdec/src/sac_qmf.cpp \
162 libSACdec/src/sac_reshapeBBEnv.cpp \
163 libSACdec/src/sac_rom.cpp \
164 libSACdec/src/sac_smoothing.cpp \
165 libSACdec/src/sac_stp.cpp \
166 libSACdec/src/sac_tsd.cpp
167
168 SACENC_SRC = \
169 libSACenc/src/sacenc_bitstream.cpp \
170 libSACenc/src/sacenc_delay.cpp \
171 libSACenc/src/sacenc_dmx_tdom_enh.cpp \
172 libSACenc/src/sacenc_filter.cpp \
173 libSACenc/src/sacenc_framewindowing.cpp \
174 libSACenc/src/sacenc_huff_tab.cpp \
175 libSACenc/src/sacenc_lib.cpp \
176 libSACenc/src/sacenc_nlc_enc.cpp \
177 libSACenc/src/sacenc_onsetdetect.cpp \
178 libSACenc/src/sacenc_paramextract.cpp \
179 libSACenc/src/sacenc_staticgain.cpp \
180 libSACenc/src/sacenc_tree.cpp \
181 libSACenc/src/sacenc_vectorfunctions.cpp
182
183 SBRDEC_SRC = \
184 libSBRdec/src/HFgen_preFlat.cpp \
185 libSBRdec/src/env_calc.cpp \
186 libSBRdec/src/env_dec.cpp \
187 libSBRdec/src/env_extr.cpp \
188 libSBRdec/src/hbe.cpp \
189 libSBRdec/src/huff_dec.cpp \
190 libSBRdec/src/lpp_tran.cpp \
191 libSBRdec/src/psbitdec.cpp \
192 libSBRdec/src/psdec.cpp \
193 libSBRdec/src/psdec_drm.cpp \
194 libSBRdec/src/psdecrom_drm.cpp \
195 libSBRdec/src/pvc_dec.cpp \
196 libSBRdec/src/sbr_crc.cpp \
197 libSBRdec/src/sbr_deb.cpp \
198 libSBRdec/src/sbr_dec.cpp \
199 libSBRdec/src/sbr_ram.cpp \
200 libSBRdec/src/sbr_rom.cpp \
201 libSBRdec/src/sbrdec_drc.cpp \
202 libSBRdec/src/sbrdec_freq_sca.cpp \
203 libSBRdec/src/sbrdecoder.cpp
204
205 SBRENC_SRC = \
206 libSBRenc/src/bit_sbr.cpp \
207 libSBRenc/src/code_env.cpp \
208 libSBRenc/src/env_bit.cpp \
209 libSBRenc/src/env_est.cpp \
210 libSBRenc/src/fram_gen.cpp \
211 libSBRenc/src/invf_est.cpp \
212 libSBRenc/src/mh_det.cpp \
213 libSBRenc/src/nf_est.cpp \
214 libSBRenc/src/ps_bitenc.cpp \
215 libSBRenc/src/ps_encode.cpp \
216 libSBRenc/src/ps_main.cpp \
217 libSBRenc/src/resampler.cpp \
218 libSBRenc/src/sbr_encoder.cpp \
219 libSBRenc/src/sbr_misc.cpp \
220 libSBRenc/src/sbrenc_freq_sca.cpp \
221 libSBRenc/src/sbrenc_ram.cpp \
222 libSBRenc/src/sbrenc_rom.cpp \
223 libSBRenc/src/ton_corr.cpp \
224 libSBRenc/src/tran_det.cpp
225
226 SYS_SRC = \
227 libSYS/src/genericStds.cpp \
228 libSYS/src/syslib_channelMapDescr.cpp
229
230 libfdk_aac_SOURCES = \
231 $(AACDEC_SRC) $(AACENC_SRC) \
232 $(ARITHCODING_SRC) \
233 $(DRCDEC_SRC) \
234 $(MPEGTPDEC_SRC) $(MPEGTPENC_SRC) \
235 $(SACDEC_SRC) $(SACENC_SRC) \
236 $(SBRDEC_SRC) $(SBRENC_SRC) \
237 $(PCMUTILS_SRC) $(FDK_SRC) $(SYS_SRC)
238
239
240 aac_enc_SOURCES = aac-enc.c wavreader.c
241
242 prefix = \usr\local
243 prefix_win = $(prefix:/=\) # In case we are using MSYS or MinGW.
244
245 CFLAGS = /nologo /W3 /Ox /MT /EHsc /Dinline=__inline $(TARGET_FLAGS) $(AM_CPPFLAGS) $(XCFLAGS)
246 CXXFLAGS = $(CFLAGS)
247 CPPFLAGS = $(CFLAGS)
248 LDFLAGS = -nologo $(XLDFLAGS)
249 ARFLAGS = -nologo
250
251 incdir = $(prefix_win)\include\fdk-aac
252 bindir = $(prefix_win)\bin
253 libdir = $(prefix_win)\lib
254
255 INST_DIRS = $(bindir) $(incdir) $(libdir)
256
257 LIB_DEF = fdk-aac.def
258 STATIC_LIB = fdk-aac.lib
259 SHARED_LIB = fdk-aac-1.dll
260 IMP_LIB = fdk-aac.dll.lib
261
262 AAC_ENC_OBJS = $(aac_enc_SOURCES:.c=.obj)
263 FDK_OBJS = $(libfdk_aac_SOURCES:.cpp=.obj)
264
265 PROGS = aac-enc.exe
266
267
268
269 all: $(LIB_DEF) $(STATIC_LIB) $(SHARED_LIB) $(IMP_LIB) $(PROGS)
270
271 clean:
272 del /f $(LIB_DEF) $(STATIC_LIB) $(SHARED_LIB) $(IMP_LIB) $(PROGS) libfdk-aac.pc 2>NUL
273 del /f *.obj *.exp 2>NUL
274 del /f libAACdec\src\*.obj 2>NUL
275 del /f libAACenc\src\*.obj 2>NUL
276 del /f libArithCoding\src\*.obj 2>NUL
277 del /f libDRCdec\src\*.obj 2>NUL
278 del /f libFDK\src\*.obj 2>NUL
279 del /f libMpegTPDec\src\*.obj 2>NUL
280 del /f libMpegTPEnc\src\*.obj 2>NUL
281 del /f libPCMutils\src\*.obj 2>NUL
282 del /f libSACdec\src\*.obj 2>NUL
283 del /f libSACenc\src\*.obj 2>NUL
284 del /f libSBRdec\src\*.obj 2>NUL
285 del /f libSBRenc\src\*.obj 2>NUL
286 del /f libSYS\src\*.obj 2>NUL
287
288 install: $(INST_DIRS)
289 copy libAACdec\include\aacdecoder_lib.h $(incdir)
290 copy libAACenc\include\aacenc_lib.h $(incdir)
291 copy libSYS\include\FDK_audio.h $(incdir)
292 copy libSYS\include\genericStds.h $(incdir)
293 copy libSYS\include\machine_type.h $(incdir)
294 copy libSYS\include\syslib_channelMapDescr.h $(incdir)
295 copy $(STATIC_LIB) $(libdir)
296 copy $(IMP_LIB) $(libdir)
297 copy $(SHARED_LIB) $(bindir)
298 copy $(PROGS) $(bindir)
299 copy $(LIB_DEF) $(libdir)
300
301 $(INST_DIRS):
302 @mkdir $(MKDIR_FLAGS) $@
303
304 $(STATIC_LIB): $(FDK_OBJS)
305 $(AR) $(ARFLAGS) -out:$@ $(FDK_OBJS)
306
307 $(IMP_LIB): $(SHARED_LIB)
308
309 $(SHARED_LIB): $(FDK_OBJS)
310 $(LD) $(LDFLAGS) -OUT:$@ -DEF:$(LIB_DEF) -implib:$(IMP_LIB) -DLL $(FDK_OBJS)
311
312 $(PROGS): $(AAC_ENC_OBJS)
313 $(LD) $(LDFLAGS) -out:$@ $(AAC_ENC_OBJS) $(STATIC_LIB)
314
315 .cpp.obj:
316 $(CXX) $(CXXFLAGS) -c -Fo$@ $<
317
318 $(LIB_DEF):
319 @echo EXPORTS > $(LIB_DEF)
320 @type fdk-aac.sym >> $(LIB_DEF)
0 [Hook Scripts]
1 mainline_hook = ${REPO_ROOT}/frameworks/av/tools/mainline_hook_project.sh
00 dnl -*- Autoconf -*-
11 dnl Process this file with autoconf to produce a configure script.
22
3 AC_INIT([fdk-aac], [2.0.1], [http://sourceforge.net/projects/opencore-amr/])
3 AC_INIT([fdk-aac], [2.0.2], [http://sourceforge.net/projects/opencore-amr/])
44 AC_CONFIG_AUX_DIR(.)
55 AC_CONFIG_MACRO_DIR([m4])
66 AM_INIT_AUTOMAKE([tar-ustar foreign])
2525 dnl soname version to use
2626 dnl goes by ‘current[:revision[:age]]’ with the soname ending up as
2727 dnl current.age.revision
28 FDK_AAC_VERSION=2:1:0
28 FDK_AAC_VERSION=2:2:0
2929
3030 AS_IF([test x$enable_shared = xyes], [LIBS_PRIVATE=$LIBS], [LIBS_PUBLIC=$LIBS])
3131 AC_SUBST(FDK_AAC_VERSION)
0 @PACKAGE_INIT@
1
2 include(${CMAKE_CURRENT_LIST_DIR}/fdk-aac-targets.cmake)
3
4 check_required_components(FDK-AAC)
0 EXPORTS
1 aacDecoder_AncDataGet
2 aacDecoder_AncDataInit
3 aacDecoder_Close
4 aacDecoder_ConfigRaw
5 aacDecoder_DecodeFrame
6 aacDecoder_Fill
7 aacDecoder_GetFreeBytes
8 aacDecoder_GetLibInfo
9 aacDecoder_GetStreamInfo
10 aacDecoder_Open
11 aacDecoder_SetParam
12 aacEncClose
13 aacEncEncode
14 aacEncGetLibInfo
15 aacEncInfo
16 aacEncOpen
17 aacEncoder_GetParam
18 aacEncoder_SetParam
0 /******************************************************************************
1 *
2 * Copyright (C) 2020 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at:
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *
16 *****************************************************************************
17 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
18 */
19
20 package {
21 // See: http://go/android-license-faq
22 // A large-scale-change added 'default_applicable_licenses' to import
23 // all of the 'license_kinds' from "external_aac_license"
24 // to get the below license kinds:
25 // SPDX-license-identifier-Apache-2.0
26 default_applicable_licenses: ["external_aac_license"],
27 }
28
29 cc_defaults {
30 name: "aac_fuzz_defaults",
31 host_supported: true,
32
33 static_libs: [
34 "libFraunhoferAAC",
35 ],
36
37 target: {
38 darwin: {
39 enabled: false,
40 },
41 },
42
43 fuzz_config: {
44 cc: [
45 "android-media-fuzzing-reports@google.com",
46 ],
47 componentid: 155276,
48 },
49 }
50
51 cc_fuzz {
52 name: "aac_dec_fuzzer",
53
54 srcs: [
55 "aac_dec_fuzzer.cpp",
56 ],
57
58 static_libs: [
59 "liblog",
60 ],
61
62 defaults: [
63 "aac_fuzz_defaults"
64 ],
65 }
66
67 cc_fuzz {
68 name: "aac_enc_fuzzer",
69
70 srcs: [
71 "aac_enc_fuzzer.cpp",
72 ],
73
74 defaults: [
75 "aac_fuzz_defaults"
76 ],
77
78 include_dirs: [
79 "external/aac/libAACenc/"
80 ],
81 }
0 # Fuzzer for libFraunhoferAAC decoder
1
2 ## Plugin Design Considerations
3 The fuzzer plugin for aac decoder is designed based on the understanding of the
4 codec and tries to achieve the following:
5
6 ##### Maximize code coverage
7
8 This fuzzer makes use of the following config parameters:
9 1. Transport type (parameter name: `TRANSPORT_TYPE`)
10
11 | Parameter| Valid Values| Configured Value|
12 |------------- |-------------| ----- |
13 | `TRANSPORT_TYPE` | 0.`TT_UNKNOWN ` 1.`TT_MP4_RAW ` 2.`TT_MP4_ADIF ` 3.`TT_MP4_ADTS ` 4.`TT_MP4_LATM_MCP1 ` 5.`TT_MP4_LATM_MCP0 ` 6.`TT_MP4_LOAS ` 7.`TT_DRM ` | `TT_MP4_ADIF ` |
14
15 Note: Value of `TRANSPORT_TYPE` could be set to any of these values.
16 It is set to `TT_MP4_ADIF` in the fuzzer plugin.
17
18 ##### Maximize utilization of input data
19 The plugin feeds the entire input data to the codec using a loop.
20 * If the decode operation was successful, the input is advanced by an
21 offset calculated using valid bytes.
22 * If the decode operation was un-successful, the input is advanced by 1 byte
23 till it reaches a valid frame or end of stream.
24
25 This ensures that the plugin tolerates any kind of input (empty, huge,
26 malformed, etc) and doesnt `exit()` on any input and thereby increasing the
27 chance of identifying vulnerabilities.
28
29 ## Build
30
31 This describes steps to build aac_dec_fuzzer binary.
32
33 ## Android
34
35 ### Steps to build
36 Build the fuzzer
37 ```
38 $ mm -j$(nproc) aac_dec_fuzzer
39 ```
40
41 ### Steps to run
42 Create a directory CORPUS_DIR and copy some aac files to that folder.
43 Push this directory to device.
44
45 To run on device
46 ```
47 $ adb sync data
48 $ adb shell /data/fuzz/arm64/aac_dec_fuzzer/aac_dec_fuzzer CORPUS_DIR
49 ```
50 To run on host
51 ```
52 $ $ANDROID_HOST_OUT/fuzz/x86_64/aac_dec_fuzzer/aac_dec_fuzzer CORPUS_DIR
53 ```
54
55 # Fuzzer for libFraunhoferAAC encoder
56
57 ## Plugin Design Considerations
58 The fuzzer plugin for aac encoder is designed based on the understanding of the
59 codec and tries to achieve the following:
60
61 ##### Maximize code coverage
62
63 The configuration parameters are not hardcoded, but instead selected based on
64 incoming data. This ensures more code paths are reached by the fuzzer.
65
66 Following arguments are passed to aacEncoder_SetParam to set the respective AACENC_PARAM parameter:
67
68 | AACENC_PARAM param| Valid Values| Configured Value|
69 |-------------| ----- |----- |
70 |`AACENC_SBR_MODE` | `-1 ` `0 ` `1 ` `2 ` | Calculated using first byte of data |
71 |`AACENC_AOT` |`AOT_NONE ` `AOT_NULL_OBJECT ` `AOT_AAC_MAIN ` `AOT_AAC_LC ` `AOT_AAC_SSR ` `AOT_AAC_LTP ` `AOT_SBR ` `AOT_AAC_SCAL ` `AOT_TWIN_VQ ` `AOT_CELP ` `AOT_HVXC ` `AOT_RSVD_10 ` `AOT_RSVD_11 ` `AOT_TTSI ` `AOT_MAIN_SYNTH ` `AOT_WAV_TAB_SYNTH ` `AOT_GEN_MIDI ` `AOT_ALG_SYNTH_AUD_FX ` `AOT_ER_AAC_LC ` `AOT_RSVD_18 ` `AOT_ER_AAC_LTP ` `AOT_ER_AAC_SCAL ` `AOT_ER_TWIN_VQ ` `AOT_ER_BSAC ` `AOT_ER_AAC_LD ` `AOT_ER_CELP ` `AOT_ER_HVXC ` `AOT_ER_HILN ` `AOT_ER_PARA ` `AOT_RSVD_28 ` `AOT_PS ` `AOT_MPEGS ` `AOT_ESCAPE ` `AOT_MP3ONMP4_L1 ` `AOT_MP3ONMP4_L2 ` `AOT_MP3ONMP4_L3 ` `AOT_RSVD_35 ` `AOT_RSVD_36 ` `AOT_AAC_SLS ` `AOT_SLS ` `AOT_ER_AAC_ELD ` `AOT_USAC ` `AOT_SAOC ` `AOT_LD_MPEGS ` `AOT_MP2_AAC_LC ` `AOT_MP2_SBR ` `AOT_DRM_AAC ` `AOT_DRM_SBR ` `AOT_DRM_MPEG_PS ` `AOT_DRM_SURROUND ` `AOT_DRM_USAC ` | Calculated using second byte of data |
72 |`AACENC_SAMPLERATE` | `8000 ` `11025 ` `12000 ` `16000 ` `22050 ` `24000 ` `32000 ` `44100 ` `48000 ` `64000 ` `88200 ` `96000 `| Calculated using third byte of data |
73 |`AACENC_BITRATE` | In range `8000 ` to `960000 ` | Calculated using fourth, fifth and sixth byte of data |
74 |`AACENC_CHANNELMODE` | `MODE_1 ` `MODE_2 ` `MODE_1_2 ` `MODE_1_2_1 ` `MODE_1_2_2 ` `MODE_1_2_2_1 ` `MODE_1_2_2_2_1 ` `MODE_6_1 ` `MODE_7_1_BACK ` `MODE_7_1_TOP_FRONT ` `MODE_7_1_REAR_SURROUND ` `MODE_7_1_FRONT_CENTER ` `MODE_212 ` | Calculated using seventh byte of data |
75 |`AACENC_TRANSMUX` | `TT_MP4_RAW ` `TT_MP4_ADIF ` `TT_MP4_ADTS ` `TT_MP4_LATM_MCP1 ` `TT_MP4_LATM_MCP0 ` `TT_MP4_LOAS ` `TT_DRM ` | Calculated using eight byte of data |`AACENC_SBR_RATIO` |`-1 ` `0 ` `1 ` `2 ` | Calculated using ninth byte of data |
76 |`AACENC_BITRATEMODE` |`AACENC_BR_MODE_INVALID ` `AACENC_BR_MODE_CBR ` `AACENC_BR_MODE_VBR_1 ` `AACENC_BR_MODE_VBR_2 ` `AACENC_BR_MODE_VBR_3 ` `AACENC_BR_MODE_VBR_4 ` `AACENC_BR_MODE_VBR_5 ` `AACENC_BR_MODE_FF ` `AACENC_BR_MODE_SFR ` | Calculated using thirty-fourth byte of data |
77 |`AACENC_GRANULE_LENGTH` |`120 ` `128 ` `240 ` `256 ` `480 ` `512 ` `1024 ` | Calculated using thirty-fifth byte of data |
78 |`AACENC_CHANNELORDER` |`CH_ORDER_MPEG ` `CH_ORDER_WAV ` | Calculated using thirty-sixth byte of data |
79 |`AACENC_AFTERBURNER` |`0 ` `1 ` | Calculated using thirty-seventh byte of data |
80 |`AACENC_BANDWIDTH` |`0 ` `1` | Calculated using thirty-eigth byte of data |
81 |` AACENC_IDX_PEAK_BITRATE` | In range `8000 ` to `960000 ` | Calculated using thirty-ninth byte of data |
82 |` AACENC_HEADER_PERIOD` |In range `0 ` to `255 ` | Calculated using fortieth byte of data |
83 |` AACENC_SIGNALING_MODE` |`-1 ` `0 ` `1 ` `2 ` `3 ` | Calculated using forty-first byte of data |
84 |` AACENC_TPSUBFRAMES` |In range `0 ` to `255 ` | Calculated using forty-second byte of data |
85 |` AACENC_AUDIOMUXVER` |`-1 ` `0 ` `1 ` `2 ` | Calculated using forty-third byte of data |
86 |` AACENC_PROTECTION` |`0 ` `1 ` | Calculated using forty-fourth of data |
87 |`AACENC_ANCILLARY_BITRATE` |In range `0 ` to `960000 `| Calculated using forty-fifth byte of data |
88 |`AACENC_METADATA_MODE ` |`0 ` `1 ` `2 ` `3 ` | Calculated using forty-sixth byte of data |
89
90 Following values are configured to set up the meta data represented by the class variable `mMetaData ` :
91
92 | Variable name| Possible Values| Configured Value|
93 |------------- | ----- |----- |
94 | `drc_profile` | `AACENC_METADATA_DRC_NONE ` `AACENC_METADATA_DRC_FILMSTANDARD ` `AACENC_METADATA_DRC_FILMLIGHT ` `AACENC_METADATA_DRC_MUSICSTANDARD ` `AACENC_METADATA_DRC_MUSICLIGHT ` `AACENC_METADATA_DRC_SPEECH ` `AACENC_METADATA_DRC_NOT_PRESENT ` | Calculated using tenth byte of data |
95 | `comp_profile` | `AACENC_METADATA_DRC_NONE ` `AACENC_METADATA_DRC_FILMSTANDARD ` `AACENC_METADATA_DRC_FILMLIGHT ` `AACENC_METADATA_DRC_MUSICSTANDARD ` `AACENC_METADATA_DRC_MUSICLIGHT ` `AACENC_METADATA_DRC_SPEECH ` `AACENC_METADATA_DRC_NOT_PRESENT ` | Calculated using eleventh byte of data |
96 | `drc_TargetRefLevel` | In range `0 ` to `255 ` | Calculated using twelfth byte of data |
97 | `comp_TargetRefLevel` | In range `0 ` to `255 ` | Calculated using thirteenth byte of data |
98 | `prog_ref_level_present` | `0 ` `1 ` | Calculated using fourteenth byte of data |
99 | `prog_ref_level` | In range `0 ` to `255 ` | Calculated using fifteenth byte of data |
100 | `PCE_mixdown_idx_present` | `0 ` `1 ` | Calculated using sixteenth byte of data |
101 | `ETSI_DmxLvl_present` | `0 ` `1 ` | Calculated using seventeenth byte of data |
102 | `centerMixLevel` | In range `0 ` to `7 ` | Calculated using eighteenth byte of data |
103 | `surroundMixLevel` | In range `0 ` to `7 ` | Calculated using nineteenth byte of data |
104 | `dolbySurroundMode` | In range `0 ` to `2 ` | Calculated using twentieth byte of data |
105 | `drcPresentationMode` | In range `0 ` to `2 ` | Calculated using twenty-first byte of data |
106 | `extAncDataEnable` | `0 ` `1 ` | Calculated using twenty-second byte of data |
107 | `extDownmixLevelEnable` | `0 ` `1 ` | Calculated using twenty-third byte of data |
108 | `extDownmixLevel_A` | In range `0 ` to `7 ` | Calculated using twenty-fourth byte of data |
109 | `extDownmixLevel_B` | In range `0 ` to `7 ` | Calculated using twenty-fifth byte of data |
110 | `dmxGainEnable` | `0 ` `1 ` | Calculated using twenty-sixth byte of data |
111 | `dmxGain5` | In range `0 ` to `255 ` | Calculated using twenty-seventh byte of data |
112 | `dmxGain2` | In range `0 ` to `255 ` | Calculated using twenty-eighth byte of data |
113 | `lfeDmxEnable` | `0 ` `1 ` | Calculated using twenty-ninth byte of data |
114 | `lfeDmxLevel` | In range `0 ` to `15 ` | Calculated using thirtieth byte of data |
115
116 Indexes `mInBufferIdx_1`, `mInBufferIdx_2` and `mInBufferIdx_3`(in range `0 ` to `2`) are calculated using the thirty-first, thirty-second and thirty-third byte respectively.
117
118 ##### Maximize utilization of input data
119 The plugin feeds the entire input data to the codec and continues with the encoding even on a failure. This ensures that the plugin tolerates any kind of input (empty, huge, malformed, etc) and doesnt `exit()` on any input and thereby increasing the chance of identifying vulnerabilities.
120
121 ## Build
122
123 This describes steps to build aac_enc_fuzzer binary.
124
125 ## Android
126
127 ### Steps to build
128 Build the fuzzer
129 ```
130 $ mm -j$(nproc) aac_enc_fuzzer
131 ```
132
133 ### Steps to run
134 Create a directory CORPUS_DIR and copy some raw files to that folder.
135 Push this directory to device.
136
137 To run on device
138 ```
139 $ adb sync data
140 $ adb shell /data/fuzz/arm64/aac_enc_fuzzer/aac_enc_fuzzer CORPUS_DIR
141 ```
142 To run on host
143 ```
144 $ $ANDROID_HOST_OUT/fuzz/x86_64/aac_enc_fuzzer/aac_enc_fuzzer CORPUS_DIR
145 ```
146
147 ## References:
148 * http://llvm.org/docs/LibFuzzer.html
149 * https://github.com/google/oss-fuzz
0 /******************************************************************************
1 *
2 * Copyright (C) 2020 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at:
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *
16 *****************************************************************************
17 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
18 */
19
20 #include <stdint.h>
21 #include <string.h>
22 #include <algorithm>
23 #include "aacdecoder_lib.h"
24
25 constexpr uint8_t kNumberOfLayers = 1;
26 constexpr uint8_t kMaxChannelCount = 8;
27 constexpr uint32_t kMaxConfigurationSize = 1024;
28 constexpr uint32_t kMaxOutBufferSize = 2048 * kMaxChannelCount;
29
30 // Value indicating the start of AAC Header Segment
31 constexpr const char *kAacSegStartSeq = "AAC_STRT";
32 constexpr uint8_t kAacSegStartSeqLen = sizeof(kAacSegStartSeq);
33 // Value indicating the end of AAC Header Segment
34 constexpr const char *kAacSegEndSeq = "AAC_ENDS";
35 constexpr uint8_t kAacSegEndSeqLen = sizeof(kAacSegEndSeq);
36
37 // Number of bytes used to signal the length of the header
38 constexpr uint8_t kHeaderLengthBytes = 2;
39 // Minimum size of an AAC header is 2
40 // Minimum data required is
41 // strlen(AAC_STRT) + strlen(AAC_ENDS) + kHeaderLengthBytes + 2;
42 constexpr UINT kMinDataSize = kAacSegStartSeqLen + kAacSegEndSeqLen + kHeaderLengthBytes + 2;
43
44 UINT getHeaderSize(UCHAR *data, UINT size) {
45 if (size < kMinDataSize) {
46 return 0;
47 }
48
49 int32_t result = memcmp(data, kAacSegStartSeq, kAacSegStartSeqLen);
50 if (result) {
51 return 0;
52 }
53 data += kAacSegStartSeqLen;
54 size -= kAacSegStartSeqLen;
55
56 uint32_t headerLengthInBytes = (data[0] << 8 | data[1]) & 0xFFFF;
57 data += kHeaderLengthBytes;
58 size -= kHeaderLengthBytes;
59
60 if (headerLengthInBytes + kAacSegEndSeqLen > size) {
61 return 0;
62 }
63
64 data += headerLengthInBytes;
65 size -= headerLengthInBytes;
66 result = memcmp(data, kAacSegEndSeq, kAacSegEndSeqLen);
67 if (result) {
68 return 0;
69 }
70
71 return std::min(headerLengthInBytes, kMaxConfigurationSize);
72 }
73
74 class Codec {
75 public:
76 Codec() = default;
77 ~Codec() { deInitDecoder(); }
78 bool initDecoder();
79 void decodeFrames(UCHAR *data, UINT size);
80 void deInitDecoder();
81
82 private:
83 HANDLE_AACDECODER mAacDecoderHandle = nullptr;
84 AAC_DECODER_ERROR mErrorCode = AAC_DEC_OK;
85 };
86
87 bool Codec::initDecoder() {
88 mAacDecoderHandle = aacDecoder_Open(TT_MP4_ADIF, kNumberOfLayers);
89 if (!mAacDecoderHandle) {
90 return false;
91 }
92 return true;
93 }
94
95 void Codec::deInitDecoder() {
96 aacDecoder_Close(mAacDecoderHandle);
97 mAacDecoderHandle = nullptr;
98 }
99
100 void Codec::decodeFrames(UCHAR *data, UINT size) {
101 UINT headerSize = getHeaderSize(data, size);
102 if (headerSize != 0) {
103 data += kAacSegStartSeqLen + kHeaderLengthBytes;
104 size -= kAacSegStartSeqLen + kHeaderLengthBytes;
105 aacDecoder_ConfigRaw(mAacDecoderHandle, &data, &headerSize);
106 data += headerSize + kAacSegEndSeqLen;
107 size -= headerSize + kAacSegEndSeqLen;
108 }
109 while (size > 0) {
110 UINT inputSize = size;
111 UINT valid = size;
112 mErrorCode = aacDecoder_Fill(mAacDecoderHandle, &data, &inputSize, &valid);
113 if (mErrorCode != AAC_DEC_OK) {
114 ++data;
115 --size;
116 } else {
117 INT_PCM outputBuf[kMaxOutBufferSize];
118 do {
119 mErrorCode =
120 aacDecoder_DecodeFrame(mAacDecoderHandle, outputBuf, sizeof(outputBuf), 0);
121 } while (mErrorCode == AAC_DEC_OK);
122 UINT offset = inputSize - valid;
123 data += offset;
124 size = valid;
125 }
126 }
127 }
128
129 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
130 Codec *codec = new Codec();
131 if (!codec) {
132 return 0;
133 }
134 if (codec->initDecoder()) {
135 codec->decodeFrames((UCHAR *)(data), static_cast<UINT>(size));
136 }
137 delete codec;
138 return 0;
139 }
0 /******************************************************************************
1 *
2 * Copyright (C) 2020 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at:
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *
16 *****************************************************************************
17 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
18 */
19
20 #include <string>
21 #include "aacenc_lib.h"
22 #include "src/aacenc.h"
23
24 using namespace std;
25
26 // IN_AUDIO_DATA, IN_ANCILLRY_DATA and IN_METADATA_SETUP
27 constexpr size_t kMaxBuffers = 3;
28
29 constexpr size_t kMaxOutputBufferSize = 8192;
30
31 constexpr uint32_t kMinBitRate = 8000;
32 constexpr uint32_t kMaxBitRate = 960000;
33
34 constexpr int32_t kSampleRates[] = {8000, 11025, 12000, 16000, 22050, 24000,
35 32000, 44100, 48000, 64000, 88200, 96000};
36 constexpr size_t kSampleRatesSize = size(kSampleRates);
37
38 constexpr CHANNEL_MODE kChannelModes[] = {MODE_1,
39 MODE_2,
40 MODE_1_2,
41 MODE_1_2_1,
42 MODE_1_2_2,
43 MODE_1_2_2_1,
44 MODE_1_2_2_2_1,
45 MODE_6_1,
46 MODE_7_1_BACK,
47 MODE_7_1_TOP_FRONT,
48 MODE_7_1_REAR_SURROUND,
49 MODE_7_1_FRONT_CENTER,
50 MODE_212};
51 constexpr size_t kChannelModesSize = size(kChannelModes);
52
53 constexpr TRANSPORT_TYPE kIdentifiers[] = {
54 TT_MP4_RAW, TT_MP4_ADIF, TT_MP4_ADTS, TT_MP4_LATM_MCP1, TT_MP4_LATM_MCP0, TT_MP4_LOAS, TT_DRM};
55 constexpr size_t kIdentifiersSize = size(kIdentifiers);
56
57 constexpr AUDIO_OBJECT_TYPE kAudioObjectTypes[] = {AOT_NONE, AOT_NULL_OBJECT,
58 AOT_AAC_MAIN, AOT_AAC_LC,
59 AOT_AAC_SSR, AOT_AAC_LTP,
60 AOT_SBR, AOT_AAC_SCAL,
61 AOT_TWIN_VQ, AOT_CELP,
62 AOT_HVXC, AOT_RSVD_10,
63 AOT_RSVD_11, AOT_TTSI,
64 AOT_MAIN_SYNTH, AOT_WAV_TAB_SYNTH,
65 AOT_GEN_MIDI, AOT_ALG_SYNTH_AUD_FX,
66 AOT_ER_AAC_LC, AOT_RSVD_18,
67 AOT_ER_AAC_LTP, AOT_ER_AAC_SCAL,
68 AOT_ER_TWIN_VQ, AOT_ER_BSAC,
69 AOT_ER_AAC_LD, AOT_ER_CELP,
70 AOT_ER_HVXC, AOT_ER_HILN,
71 AOT_ER_PARA, AOT_RSVD_28,
72 AOT_PS, AOT_MPEGS,
73 AOT_ESCAPE, AOT_MP3ONMP4_L1,
74 AOT_MP3ONMP4_L2, AOT_MP3ONMP4_L3,
75 AOT_RSVD_35, AOT_RSVD_36,
76 AOT_AAC_SLS, AOT_SLS,
77 AOT_ER_AAC_ELD, AOT_USAC,
78 AOT_SAOC, AOT_LD_MPEGS,
79 AOT_MP2_AAC_LC, AOT_MP2_SBR,
80 AOT_DRM_AAC, AOT_DRM_SBR,
81 AOT_DRM_MPEG_PS, AOT_DRM_SURROUND,
82 AOT_DRM_USAC};
83
84 constexpr size_t kAudioObjectTypesSize = size(kAudioObjectTypes);
85
86 constexpr int32_t kSbrRatios[] = {-1, 0, 1, 2};
87 constexpr size_t kSbrRatiosSize = size(kSbrRatios);
88
89 constexpr int32_t kBitRateModes[] = {
90 AACENC_BR_MODE_INVALID, AACENC_BR_MODE_CBR, AACENC_BR_MODE_VBR_1,
91 AACENC_BR_MODE_VBR_2, AACENC_BR_MODE_VBR_3, AACENC_BR_MODE_VBR_4,
92 AACENC_BR_MODE_VBR_5, AACENC_BR_MODE_FF, AACENC_BR_MODE_SFR};
93 constexpr size_t kBitRateModesSize = size(kBitRateModes);
94
95 constexpr int32_t kGranuleLengths[] = {120, 128, 240, 256, 480, 512, 1024};
96 constexpr size_t kGranuleLengthsSize = size(kGranuleLengths);
97
98 constexpr int32_t kChannelOrder[] = {CH_ORDER_MPEG, CH_ORDER_WAV};
99 constexpr size_t kChannelOrderSize = size(kChannelOrder);
100
101 constexpr int32_t kSignalingModes[] = {-1, 0, 1, 2, 3};
102 constexpr size_t kSignalingModesSize = size(kSignalingModes);
103
104 constexpr int32_t kAudioMuxVer[] = {-1, 0, 1, 2};
105 constexpr size_t kAudioMuxVerSize = size(kAudioMuxVer);
106
107 constexpr int32_t kSbrModes[] = {-1, 0, 1, 2};
108 constexpr size_t kSbrModesSize = size(kSbrModes);
109
110 constexpr AACENC_METADATA_DRC_PROFILE kMetaDataDrcProfiles[] = {
111 AACENC_METADATA_DRC_NONE, AACENC_METADATA_DRC_FILMSTANDARD,
112 AACENC_METADATA_DRC_FILMLIGHT, AACENC_METADATA_DRC_MUSICSTANDARD,
113 AACENC_METADATA_DRC_MUSICLIGHT, AACENC_METADATA_DRC_SPEECH,
114 AACENC_METADATA_DRC_NOT_PRESENT};
115 constexpr size_t kMetaDataDrcProfilesSize = size(kMetaDataDrcProfiles);
116
117 enum {
118 IDX_SBR_MODE = 0,
119 IDX_AAC_AOT,
120 IDX_SAMPLE_RATE,
121 IDX_BIT_RATE_1,
122 IDX_BIT_RATE_2,
123 IDX_BIT_RATE_3,
124 IDX_CHANNEL,
125 IDX_IDENTIFIER,
126 IDX_SBR_RATIO,
127 IDX_METADATA_DRC_PROFILE,
128 IDX_METADATA_COMP_PROFILE,
129 IDX_METADATA_DRC_TARGET_REF_LEVEL,
130 IDX_METADATA_COMP_TARGET_REF_LEVEL,
131 IDX_METADATA_PROG_LEVEL_PRESENT,
132 IDX_METADATA_PROG_LEVEL,
133 IDX_METADATA_PCE_MIXDOWN_IDX_PRESENT,
134 IDX_METADATA_ETSI_DMXLVL_PRESENT,
135 IDX_METADATA_CENTER_MIX_LEVEL,
136 IDX_METADATA_SURROUND_MIX_LEVEL,
137 IDX_METADATA_DOLBY_SURROUND_MODE,
138 IDX_METADATA_DRC_PRESENTATION_MODE,
139 IDX_METADATA_EXT_ANC_DATA_ENABLE,
140 IDX_METADATA_EXT_DOWNMIX_LEVEL_ENABLE,
141 IDX_METADATA_EXT_DOWNMIX_LEVEL_A,
142 IDX_METADATA_EXT_DOWNMIX_LEVEL_B,
143 IDX_METADATA_DMX_GAIN_ENABLE,
144 IDX_METADATA_DMX_GAIN_5,
145 IDX_METADATA_DMX_GAIN_2,
146 IDX_METADATA_LFE_DMX_ENABLE,
147 IDX_METADATA_LFE_DMX_LEVEL,
148 IDX_IN_BUFFER_INDEX_1,
149 IDX_IN_BUFFER_INDEX_2,
150 IDX_IN_BUFFER_INDEX_3,
151 IDX_BIT_RATE_MODE,
152 IDX_GRANULE_LENGTH,
153 IDX_CHANNELORDER,
154 IDX_AFTERBURNER,
155 IDX_BANDWIDTH,
156 IDX_PEAK_BITRATE,
157 IDX_HEADER_PERIOD,
158 IDX_SIGNALING_MODE,
159 IDX_TPSUBFRAMES,
160 IDX_AUDIOMUXVER,
161 IDX_PROTECTION,
162 IDX_ANCILLARY_BITRATE,
163 IDX_METADATA_MODE,
164 IDX_LAST
165 };
166
167 template <typename type1, typename type2, typename type3>
168 auto generateNumberInRangeFromData(type1 data, type2 min, type3 max) -> decltype(max) {
169 return (data % (1 + max - min)) + min;
170 }
171
172 class Codec {
173 public:
174 ~Codec() { deInitEncoder(); }
175 bool initEncoder(uint8_t **dataPtr, size_t *sizePtr);
176 void encodeFrames(const uint8_t *data, size_t size);
177 void deInitEncoder();
178
179 private:
180 template <typename type1, typename type2, typename type3>
181 void setAACParam(type1 data, const AACENC_PARAM aacParam, type2 min, type2 max,
182 const type3 *array = nullptr);
183 void setupMetaData(uint8_t *data);
184
185 HANDLE_AACENCODER mEncoder = nullptr;
186 AACENC_MetaData mMetaData = {};
187 uint32_t mInBufferIdx_1 = 0;
188 uint32_t mInBufferIdx_2 = 0;
189 uint32_t mInBufferIdx_3 = 0;
190 };
191
192 void Codec::setupMetaData(uint8_t *data) {
193 uint32_t drcProfileIndex = generateNumberInRangeFromData(data[IDX_METADATA_DRC_PROFILE], 0,
194 kMetaDataDrcProfilesSize - 1);
195 AACENC_METADATA_DRC_PROFILE drcProfile = kMetaDataDrcProfiles[drcProfileIndex];
196 mMetaData.drc_profile = drcProfile;
197
198 uint32_t compProfileIndex = generateNumberInRangeFromData(data[IDX_METADATA_COMP_PROFILE], 0,
199 kMetaDataDrcProfilesSize - 1);
200 AACENC_METADATA_DRC_PROFILE compProfile = kMetaDataDrcProfiles[compProfileIndex];
201 mMetaData.comp_profile = compProfile;
202
203 INT drcTargetRefLevel =
204 generateNumberInRangeFromData(data[IDX_METADATA_DRC_TARGET_REF_LEVEL], 0, UINT8_MAX);
205 mMetaData.drc_TargetRefLevel = drcTargetRefLevel;
206
207 INT compTargetRefLevel =
208 generateNumberInRangeFromData(data[IDX_METADATA_COMP_TARGET_REF_LEVEL], 0, UINT8_MAX);
209 mMetaData.comp_TargetRefLevel = compTargetRefLevel;
210
211 INT isProgRefLevelPresent =
212 generateNumberInRangeFromData(data[IDX_METADATA_PROG_LEVEL_PRESENT], 0, 1);
213 mMetaData.prog_ref_level_present = isProgRefLevelPresent;
214
215 INT progRefLevel = generateNumberInRangeFromData(data[IDX_METADATA_PROG_LEVEL], 0, UINT8_MAX);
216 mMetaData.prog_ref_level = progRefLevel;
217
218 UCHAR isPCEMixdownIdxPresent =
219 generateNumberInRangeFromData(data[IDX_METADATA_PCE_MIXDOWN_IDX_PRESENT], 0, 1);
220 mMetaData.PCE_mixdown_idx_present = isPCEMixdownIdxPresent;
221
222 UCHAR isETSIDmxLvlPresent =
223 generateNumberInRangeFromData(data[IDX_METADATA_ETSI_DMXLVL_PRESENT], 0, 1);
224 mMetaData.ETSI_DmxLvl_present = isETSIDmxLvlPresent;
225
226 SCHAR centerMixLevel = generateNumberInRangeFromData(data[IDX_METADATA_CENTER_MIX_LEVEL], 0, 7);
227 mMetaData.centerMixLevel = centerMixLevel;
228
229 SCHAR surroundMixLevel =
230 generateNumberInRangeFromData(data[IDX_METADATA_SURROUND_MIX_LEVEL], 0, 7);
231 mMetaData.surroundMixLevel = surroundMixLevel;
232
233 UCHAR dolbySurroundMode =
234 generateNumberInRangeFromData(data[IDX_METADATA_DOLBY_SURROUND_MODE], 0, 2);
235 mMetaData.dolbySurroundMode = dolbySurroundMode;
236
237 UCHAR drcPresentationMode =
238 generateNumberInRangeFromData(data[IDX_METADATA_DRC_PRESENTATION_MODE], 0, 2);
239 mMetaData.drcPresentationMode = drcPresentationMode;
240
241 UCHAR extAncDataEnable =
242 generateNumberInRangeFromData(data[IDX_METADATA_EXT_ANC_DATA_ENABLE], 0, 1);
243 mMetaData.ExtMetaData.extAncDataEnable = extAncDataEnable;
244
245 UCHAR extDownmixLevelEnable =
246 generateNumberInRangeFromData(data[IDX_METADATA_EXT_DOWNMIX_LEVEL_ENABLE], 0, 1);
247 mMetaData.ExtMetaData.extDownmixLevelEnable = extDownmixLevelEnable;
248
249 UCHAR extDownmixLevel_A =
250 generateNumberInRangeFromData(data[IDX_METADATA_EXT_DOWNMIX_LEVEL_A], 0, 7);
251 mMetaData.ExtMetaData.extDownmixLevel_A = extDownmixLevel_A;
252
253 UCHAR extDownmixLevel_B =
254 generateNumberInRangeFromData(data[IDX_METADATA_EXT_DOWNMIX_LEVEL_B], 0, 7);
255 mMetaData.ExtMetaData.extDownmixLevel_B = extDownmixLevel_B;
256
257 UCHAR dmxGainEnable = generateNumberInRangeFromData(data[IDX_METADATA_DMX_GAIN_ENABLE], 0, 1);
258 mMetaData.ExtMetaData.dmxGainEnable = dmxGainEnable;
259
260 INT dmxGain5 = generateNumberInRangeFromData(data[IDX_METADATA_DMX_GAIN_5], 0, UINT8_MAX);
261 mMetaData.ExtMetaData.dmxGain5 = dmxGain5;
262
263 INT dmxGain2 = generateNumberInRangeFromData(data[IDX_METADATA_DMX_GAIN_2], 0, UINT8_MAX);
264 mMetaData.ExtMetaData.dmxGain2 = dmxGain2;
265
266 UCHAR lfeDmxEnable = generateNumberInRangeFromData(data[IDX_METADATA_LFE_DMX_ENABLE], 0, 1);
267 mMetaData.ExtMetaData.lfeDmxEnable = lfeDmxEnable;
268
269 UCHAR lfeDmxLevel = generateNumberInRangeFromData(data[IDX_METADATA_LFE_DMX_LEVEL], 0, 15);
270 mMetaData.ExtMetaData.lfeDmxLevel = lfeDmxLevel;
271 }
272
273 template <typename type1, typename type2, typename type3>
274 void Codec::setAACParam(type1 data, const AACENC_PARAM aacParam, type2 min, type2 max,
275 const type3 *array) {
276 auto value = 0;
277 if (array) {
278 uint32_t index = generateNumberInRangeFromData(data, min, max);
279 value = array[index];
280 } else {
281 value = generateNumberInRangeFromData(data, min, max);
282 }
283 aacEncoder_SetParam(mEncoder, aacParam, value);
284 (void)aacEncoder_GetParam(mEncoder, aacParam);
285 }
286
287 bool Codec::initEncoder(uint8_t **dataPtr, size_t *sizePtr) {
288 uint8_t *data = *dataPtr;
289
290 if (AACENC_OK != aacEncOpen(&mEncoder, 0, 0)) {
291 return false;
292 }
293
294 setAACParam<uint8_t, size_t, int32_t>(data[IDX_SBR_MODE], AACENC_SBR_MODE, 0, kSbrModesSize - 1,
295 kSbrModes);
296
297 setAACParam<uint8_t, size_t, int32_t>(data[IDX_SBR_RATIO], AACENC_SBR_RATIO, 0,
298 kSbrRatiosSize - 1, kSbrRatios);
299
300 setAACParam<uint8_t, size_t, AUDIO_OBJECT_TYPE>(data[IDX_AAC_AOT], AACENC_AOT, 0,
301 kAudioObjectTypesSize - 1, kAudioObjectTypes);
302
303 setAACParam<uint8_t, size_t, int32_t>(data[IDX_SAMPLE_RATE], AACENC_SAMPLERATE, 0,
304 kSampleRatesSize - 1, kSampleRates);
305
306 uint32_t tempValue =
307 (data[IDX_BIT_RATE_1] << 16) | (data[IDX_BIT_RATE_2] << 8) | data[IDX_BIT_RATE_3];
308 setAACParam<uint8_t, uint32_t, uint32_t>(tempValue, AACENC_BITRATE, kMinBitRate, kMaxBitRate);
309
310 setAACParam<uint8_t, size_t, CHANNEL_MODE>(data[IDX_CHANNEL], AACENC_CHANNELMODE, 0,
311 kChannelModesSize - 1, kChannelModes);
312
313 setAACParam<uint8_t, size_t, TRANSPORT_TYPE>(data[IDX_IDENTIFIER], AACENC_TRANSMUX, 0,
314 kIdentifiersSize - 1, kIdentifiers);
315
316 setAACParam<uint8_t, size_t, int32_t>(data[IDX_BIT_RATE_MODE], AACENC_BITRATEMODE, 0,
317 kBitRateModesSize - 1, kBitRateModes);
318
319 setAACParam<uint8_t, size_t, int32_t>(data[IDX_GRANULE_LENGTH], AACENC_GRANULE_LENGTH, 0,
320 kGranuleLengthsSize - 1, kGranuleLengths);
321
322 setAACParam<uint8_t, size_t, int32_t>(data[IDX_CHANNELORDER], AACENC_CHANNELORDER, 0,
323 kChannelOrderSize - 1, kChannelOrder);
324
325 setAACParam<uint8_t, int32_t, int32_t>(data[IDX_AFTERBURNER], AACENC_AFTERBURNER, 0, 1);
326
327 setAACParam<uint8_t, int32_t, int32_t>(data[IDX_BANDWIDTH], AACENC_BANDWIDTH, 0, 1);
328
329 setAACParam<uint8_t, uint32_t, uint32_t>(data[IDX_PEAK_BITRATE], AACENC_PEAK_BITRATE,
330 kMinBitRate, kMinBitRate);
331
332 setAACParam<uint8_t, uint32_t, uint32_t>(data[IDX_HEADER_PERIOD], AACENC_HEADER_PERIOD, 0,
333 UINT8_MAX);
334
335 setAACParam<uint8_t, size_t, int32_t>(data[IDX_SIGNALING_MODE], AACENC_SIGNALING_MODE, 0,
336 kSignalingModesSize - 1, kSignalingModes);
337
338 setAACParam<uint8_t, uint32_t, uint32_t>(data[IDX_TPSUBFRAMES], AACENC_TPSUBFRAMES, 0,
339 UINT8_MAX);
340
341 setAACParam<uint8_t, size_t, int32_t>(data[IDX_AUDIOMUXVER], AACENC_AUDIOMUXVER, 0,
342 kAudioMuxVerSize - 1, kAudioMuxVer);
343
344 setAACParam<uint8_t, uint32_t, uint32_t>(data[IDX_PROTECTION], AACENC_PROTECTION, 0, 1);
345
346 setAACParam<uint8_t, uint32_t, uint32_t>(data[IDX_ANCILLARY_BITRATE], AACENC_ANCILLARY_BITRATE,
347 0, kMaxBitRate);
348
349 setAACParam<uint8_t, uint32_t, uint32_t>(data[IDX_METADATA_MODE], AACENC_METADATA_MODE, 0, 3);
350
351 AACENC_InfoStruct encInfo;
352 aacEncInfo(mEncoder, &encInfo);
353
354 mInBufferIdx_1 = generateNumberInRangeFromData(data[IDX_IN_BUFFER_INDEX_1], 0, kMaxBuffers - 1);
355 mInBufferIdx_2 = generateNumberInRangeFromData(data[IDX_IN_BUFFER_INDEX_2], 0, kMaxBuffers - 1);
356 mInBufferIdx_3 = generateNumberInRangeFromData(data[IDX_IN_BUFFER_INDEX_3], 0, kMaxBuffers - 1);
357
358 setupMetaData(data);
359
360 // Not re-using the data which was used for configuration for encoding
361 *dataPtr += IDX_LAST;
362 *sizePtr -= IDX_LAST;
363
364 return true;
365 }
366
367 static void deleteBuffers(uint8_t **buffers, size_t size) {
368 for (size_t n = 0; n < size; ++n) {
369 delete[] buffers[n];
370 }
371 delete[] buffers;
372 }
373
374 void Codec::encodeFrames(const uint8_t *data, size_t size) {
375 uint8_t *audioData = (uint8_t *)data;
376 uint8_t *ancData = (uint8_t *)data;
377 size_t audioSize = size;
378 size_t ancSize = size;
379
380 while ((audioSize > 0) && (ancSize > 0)) {
381 AACENC_InArgs inargs;
382 memset(&inargs, 0, sizeof(inargs));
383 inargs.numInSamples = audioSize / sizeof(int16_t);
384 inargs.numAncBytes = ancSize;
385
386 void *buffers[] = {(void *)audioData, (void *)ancData, &mMetaData};
387 INT bufferIds[] = {IN_AUDIO_DATA, IN_ANCILLRY_DATA, IN_METADATA_SETUP};
388 INT bufferSizes[] = {static_cast<INT>(audioSize), static_cast<INT>(ancSize),
389 static_cast<INT>(sizeof(mMetaData))};
390 INT bufferElSizes[] = {sizeof(int16_t), sizeof(UCHAR), sizeof(AACENC_MetaData)};
391
392 void *inBuffer[kMaxBuffers] = {};
393 INT inBufferIds[kMaxBuffers] = {};
394 INT inBufferSize[kMaxBuffers] = {};
395 INT inBufferElSize[kMaxBuffers] = {};
396 for (int32_t buffer = 0; buffer < kMaxBuffers; ++buffer) {
397 uint32_t Idxs[] = {mInBufferIdx_1, mInBufferIdx_2, mInBufferIdx_3};
398 inBuffer[buffer] = buffers[Idxs[buffer]];
399 inBufferIds[buffer] = bufferIds[Idxs[buffer]];
400 inBufferSize[buffer] = bufferSizes[Idxs[buffer]];
401 inBufferElSize[buffer] = bufferElSizes[Idxs[buffer]];
402 }
403
404 AACENC_BufDesc inBufDesc;
405 inBufDesc.numBufs = kMaxBuffers;
406 inBufDesc.bufs = (void **)&inBuffer;
407 inBufDesc.bufferIdentifiers = inBufferIds;
408 inBufDesc.bufSizes = inBufferSize;
409 inBufDesc.bufElSizes = inBufferElSize;
410
411 uint8_t **outPtrRef = new uint8_t *[kMaxBuffers];
412 for (int32_t buffer = 0; buffer < kMaxBuffers; ++buffer) {
413 outPtrRef[buffer] = new uint8_t[kMaxOutputBufferSize];
414 }
415
416 void *outBuffer[kMaxBuffers];
417 INT outBufferIds[kMaxBuffers];
418 INT outBufferSize[kMaxBuffers];
419 INT outBufferElSize[kMaxBuffers];
420
421 for (int32_t buffer = 0; buffer < kMaxBuffers; ++buffer) {
422 outBuffer[buffer] = outPtrRef[buffer];
423 outBufferIds[buffer] = OUT_BITSTREAM_DATA;
424 outBufferSize[buffer] = (INT)kMaxOutputBufferSize;
425 outBufferElSize[buffer] = sizeof(UCHAR);
426 }
427
428 AACENC_BufDesc outBufDesc;
429 outBufDesc.numBufs = kMaxBuffers;
430 outBufDesc.bufs = (void **)&outBuffer;
431 outBufDesc.bufferIdentifiers = outBufferIds;
432 outBufDesc.bufSizes = outBufferSize;
433 outBufDesc.bufElSizes = outBufferElSize;
434
435 AACENC_OutArgs outargs = {};
436 aacEncEncode(mEncoder, &inBufDesc, &outBufDesc, &inargs, &outargs);
437
438 if (outargs.numOutBytes == 0) {
439 if (audioSize > 0) {
440 ++audioData;
441 --audioSize;
442 }
443 if (ancSize > 0) {
444 ++ancData;
445 --ancSize;
446 }
447 } else {
448 size_t audioConsumed = outargs.numInSamples * sizeof(int16_t);
449 audioData += audioConsumed;
450 audioSize -= audioConsumed;
451
452 size_t ancConsumed = outargs.numAncBytes;
453 ancData += ancConsumed;
454 ancSize -= ancConsumed;
455 }
456 deleteBuffers(outPtrRef, kMaxBuffers);
457
458 // break out of loop if only metadata was sent in all the input buffers
459 // as sending it multiple times in a loop is redundant.
460 if ((mInBufferIdx_1 == kMaxBuffers - 1) && (mInBufferIdx_2 == kMaxBuffers - 1) &&
461 (mInBufferIdx_3 == kMaxBuffers - 1)) {
462 break;
463 }
464 }
465 }
466
467 void Codec::deInitEncoder() { aacEncClose(&mEncoder); }
468
469 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
470 if (size < IDX_LAST) {
471 return 0;
472 }
473 Codec encoder;
474 if (encoder.initEncoder(const_cast<uint8_t **>(&data), &size)) {
475 encoder.encodeFrames(data, size);
476 }
477 return 0;
478 }
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
163163 files are provided for usage in specific C/C++ programs. The main AAC decoder
164164 library API functions are located in aacdecoder_lib.h header file.
165165
166 In binary releases the decoder core resides in statically linkable libraries,
167 for example libAACdec.a.
168
169166
170167 \section Calling_Sequence Calling Sequence
171168
173170 HE-AAC v2, or MPEG-D USAC bitstreams. In the following description, input stream
174171 read and output write function details are left out, since they may be
175172 implemented in a variety of configurations depending on the user's specific
176 requirements. The example implementation uses file-based input/output, and in
177 such case one may call mpegFileRead_Open() to open an input file and to allocate
178 memory for the required structures, and the corresponding mpegFileRead_Close()
179 to close opened files and to de-allocate associated structures.
180 mpegFileRead_Open() will attempt to detect the bitstream format and in case of
181 MPEG-4 file format or Raw Packets file format (a proprietary Fraunhofer IIS file
182 format suitable only for testing) it will read the Audio Specific Config data
183 (ASC). An unsuccessful attempt to recognize the bitstream format requires the
184 user to provide this information manually. For any other bitstream formats that
185 are usually applicable in streaming applications, the decoder itself will try to
186 synchronize and parse the given bitstream fragment using the FDK transport
187 library. Hence, for streaming applications (without file access) this step is
188 not necessary.
173 requirements.
189174
190175
191176 -# Call aacDecoder_Open() to open and retrieve a handle to a new AAC decoder
204189 working memory (a client-supplied input buffer "inBuffer" in framework). This
205190 buffer will be used to load AAC bitstream data to the decoder. Only when all
206191 data in this buffer has been processed will the decoder signal an empty buffer.
207 For file-based input, you may invoke mpegFileRead_Read() to acquire new
208 bitstream data.
209192 -# Call aacDecoder_Fill() to fill the decoder's internal bitstream input buffer
210193 with the client-supplied bitstream input buffer. Note, if the data loaded in to
211194 the internal buffer is not sufficient to decode a frame,
212195 aacDecoder_DecodeFrame() will return ::AAC_DEC_NOT_ENOUGH_BITS until a
213196 sufficient amount of data is loaded in to the internal buffer. For streaming
214197 formats (ADTS, LOAS), it is acceptable to load more than one frame to the
215 decoder. However, for RAW file format (Fraunhofer IIS proprietary format), only
216 one frame may be loaded to the decoder per aacDecoder_DecodeFrame() call. For
217 least amount of communication delay, fill and decode should be performed on a
218 frame by frame basis. \code ErrorStatus = aacDecoder_Fill(aacDecoderInfo,
219 inBuffer, bytesRead, bytesValid); \endcode
198 decoder. However, for packed based formats, only one frame may be loaded to the
199 decoder per aacDecoder_DecodeFrame() call. For least amount of communication
200 delay, fill and decode should be performed on a frame by frame basis. \code
201 ErrorStatus = aacDecoder_Fill(aacDecoderInfo, inBuffer, bytesRead,
202 bytesValid); \endcode
220203 -# Call aacDecoder_DecodeFrame(). This function decodes one frame and writes
221204 decoded PCM audio data to a client-supplied buffer. It is the client's
222205 responsibility to allocate a buffer which is large enough to hold the decoded
224207 TimeData, OUT_BUF_SIZE, flags); \endcode If the bitstream configuration (number
225208 of channels, sample rate, frame size) is not known a priori, you may call
226209 aacDecoder_GetStreamInfo() to retrieve a structure that contains this
227 information. You may use this data to initialize an audio output device. In the
228 example program, if the number of channels or the sample rate has changed since
229 program start or the previously decoded frame, the audio output device is then
230 re-initialized. If WAVE file output is chosen, a new WAVE file for each new
231 stream configuration is be created. \code p_si =
232 aacDecoder_GetStreamInfo(aacDecoderInfo); \endcode
210 information. You may use this data to initialize an audio output device. \code
211 p_si = aacDecoder_GetStreamInfo(aacDecoderInfo);
212 \endcode
233213 -# Repeat steps 5 to 7 until no data is available to decode any more, or in case
234214 of error. \code } while (bytesRead[0] > 0 || doFlush || doBsFlush ||
235215 forceContinue); \endcode
238218
239219 \image latex decode.png "Decode calling sequence" width=11cm
240220
241 \image latex change_source.png "Change data source sequence" width 5cm
221 \image latex change_source.png "Change data source sequence" width=5cm
242222
243223 \image latex conceal.png "Error concealment sequence" width=14cm
244224
295275 limited applications, the output buffer may be reused as an external input
296276 buffer prior to the subsequence aacDecoder_Fill() function call.
297277
298 The external input buffer is set in the example program and its size is defined
299 by ::IN_BUF_SIZE. You may freely choose different buffer sizes. To feed the data
300 to the decoder-internal input buffer, use the function aacDecoder_Fill(). This
301 function returns important information regarding the number of bytes in the
302 external input buffer that have not yet been copied into the internal input
303 buffer (variable bytesValid). Once the external buffer has been fully copied, it
304 can be completely re-filled again. In case you wish to refill the buffer while
305 there are unprocessed bytes (bytesValid is unequal 0), you should preserve the
306 unconsumed data. However, we recommend to refill the buffer only when bytesValid
307 returns 0.
278 To feed the data to the decoder-internal input buffer, use the
279 function aacDecoder_Fill(). This function returns important information
280 regarding the number of bytes in the external input buffer that have not yet
281 been copied into the internal input buffer (variable bytesValid). Once the
282 external buffer has been fully copied, it can be completely re-filled again. In
283 case you wish to refill the buffer while there are unprocessed bytes (bytesValid
284 is unequal 0), you should preserve the unconsumed data. However, we recommend to
285 refill the buffer only when bytesValid returns 0.
308286
309287 The bytesValid parameter is an input and output parameter to the FDK decoder. As
310288 an input, it signals how many valid bytes are available in the external buffer.
339317 In case a Program Config is included in the audio configuration, the channel
340318 mapping described within it will be adopted.
341319
342 In case of MPEG-D Surround the channel mapping will follow the same criteria
343 described in ISO/IEC 13818-7:2005(E), but adding corresponding top channels (if
344 available) to the channel types in order to avoid ambiguity. The examples below
345 explain these aspects in detail.
320 The examples below explain these aspects in detail.
346321
347322 \section OutputFormatChange Changing the audio output format
348323
458433 #include "genericStds.h"
459434
460435 #define AACDECODER_LIB_VL0 3
461 #define AACDECODER_LIB_VL1 0
436 #define AACDECODER_LIB_VL1 2
462437 #define AACDECODER_LIB_VL2 0
463438
464439 /**
693668 2. If the parameter value is greater than that of
694669 ::AAC_PCM_MAX_OUTPUT_CHANNELS both will be set to the same
695670 value. \n
696 3. This parameter does not affect MPEG Surround processing.
697 \n
698 4. This parameter will be ignored if the number of encoded
671 3. This parameter will be ignored if the number of encoded
699672 audio channels is greater than 8. */
700673 AAC_PCM_MAX_OUTPUT_CHANNELS =
701674 0x0012, /*!< Maximum number of PCM output channels. If lower than the
722695 2. If the parameter value is greater than zero but smaller
723696 than ::AAC_PCM_MIN_OUTPUT_CHANNELS both will be set to same
724697 value. \n
725 3. The operating mode of the MPEG Surround module will be
726 set accordingly. \n
727 4. Setting this parameter with any value will disable the
728 binaural processing of the MPEG Surround module
729 5. This parameter will be ignored if the number of encoded
698 3. This parameter will be ignored if the number of encoded
730699 audio channels is greater than 8. */
731700 AAC_METADATA_PROFILE =
732701 0x0020, /*!< See ::AAC_MD_PROFILE for all available values. */
745714 ::CONCEAL_INTER. only some AOTs are
746715 supported). \n */
747716 AAC_DRC_BOOST_FACTOR =
748 0x0200, /*!< Dynamic Range Control: Scaling factor for boosting gain
749 values. Defines how the boosting DRC factors (conveyed in the
750 bitstream) will be applied to the decoded signal. The valid
751 values range from 0 (don't apply boost factors) to 127 (fully
752 apply boost factors). Default value is 0. */
753 AAC_DRC_ATTENUATION_FACTOR =
754 0x0201, /*!< Dynamic Range Control: Scaling factor for attenuating gain
755 values. Same as
756 ::AAC_DRC_BOOST_FACTOR but for attenuating DRC factors. */
717 0x0200, /*!< MPEG-4 / MPEG-D Dynamic Range Control (DRC): Scaling factor
718 for boosting gain values. Defines how the boosting DRC factors
719 (conveyed in the bitstream) will be applied to the decoded
720 signal. The valid values range from 0 (don't apply boost
721 factors) to 127 (fully apply boost factors). Default value is 0
722 for MPEG-4 DRC and 127 for MPEG-D DRC. */
723 AAC_DRC_ATTENUATION_FACTOR = 0x0201, /*!< MPEG-4 / MPEG-D DRC: Scaling factor
724 for attenuating gain values. Same as
725 ::AAC_DRC_BOOST_FACTOR but for
726 attenuating DRC factors. */
757727 AAC_DRC_REFERENCE_LEVEL =
758 0x0202, /*!< Dynamic Range Control (DRC): Target reference level. Defines
759 the level below full-scale (quantized in steps of 0.25dB) to
760 which the output audio signal will be normalized to by the DRC
761 module. The parameter controls loudness normalization for both
762 MPEG-4 DRC and MPEG-D DRC. The valid values range from 40 (-10
763 dBFS) to 127 (-31.75 dBFS). Any value smaller than 0 switches
764 off loudness normalization and MPEG-4 DRC. By default, loudness
765 normalization and MPEG-4 DRC is switched off. */
728 0x0202, /*!< MPEG-4 / MPEG-D DRC: Target reference level / decoder target
729 loudness.\n Defines the level below full-scale (quantized in
730 steps of 0.25dB) to which the output audio signal will be
731 normalized to by the DRC module.\n The parameter controls
732 loudness normalization for both MPEG-4 DRC and MPEG-D DRC. The
733 valid values range from 40 (-10 dBFS) to 127 (-31.75 dBFS).\n
734 Example values:\n
735 124 (-31 dBFS) for audio/video receivers (AVR) or other
736 devices allowing audio playback with high dynamic range,\n 96
737 (-24 dBFS) for TV sets or equivalent devices (default),\n 64
738 (-16 dBFS) for mobile devices where the dynamic range of audio
739 playback is restricted.\n Any value smaller than 0 switches off
740 loudness normalization and MPEG-4 DRC. */
766741 AAC_DRC_HEAVY_COMPRESSION =
767 0x0203, /*!< Dynamic Range Control: En-/Disable DVB specific heavy
768 compression (aka RF mode). If set to 1, the decoder will apply
769 the compression values from the DVB specific ancillary data
770 field. At the same time the MPEG-4 Dynamic Range Control tool
771 will be disabled. By default, heavy compression is disabled. */
742 0x0203, /*!< MPEG-4 DRC: En-/Disable DVB specific heavy compression (aka
743 RF mode). If set to 1, the decoder will apply the compression
744 values from the DVB specific ancillary data field. At the same
745 time the MPEG-4 Dynamic Range Control tool will be disabled. By
746 default, heavy compression is disabled. */
772747 AAC_DRC_DEFAULT_PRESENTATION_MODE =
773 0x0204, /*!< Dynamic Range Control: Default presentation mode (DRC
774 parameter handling). \n Defines the handling of the DRC
775 parameters boost factor, attenuation factor and heavy
776 compression, if no presentation mode is indicated in the
777 bitstream.\n For options, see
778 ::AAC_DRC_DEFAULT_PRESENTATION_MODE_OPTIONS.\n Default:
748 0x0204, /*!< MPEG-4 DRC: Default presentation mode (DRC parameter
749 handling). \n Defines the handling of the DRC parameters boost
750 factor, attenuation factor and heavy compression, if no
751 presentation mode is indicated in the bitstream.\n For options,
752 see ::AAC_DRC_DEFAULT_PRESENTATION_MODE_OPTIONS.\n Default:
779753 ::AAC_DRC_PARAMETER_HANDLING_DISABLED */
780754 AAC_DRC_ENC_TARGET_LEVEL =
781 0x0205, /*!< Dynamic Range Control: Encoder target level for light (i.e.
782 not heavy) compression.\n If known, this declares the target
783 reference level that was assumed at the encoder for calculation
784 of limiting gains. The valid values range from 0 (full-scale)
785 to 127 (31.75 dB below full-scale). This parameter is used only
755 0x0205, /*!< MPEG-4 DRC: Encoder target level for light (i.e. not heavy)
756 compression.\n If known, this declares the target reference
757 level that was assumed at the encoder for calculation of
758 limiting gains. The valid values range from 0 (full-scale) to
759 127 (31.75 dB below full-scale). This parameter is used only
786760 with ::AAC_DRC_PARAMETER_HANDLING_ENABLED and ignored
787761 otherwise.\n Default: 127 (worst-case assumption).\n */
788 AAC_QMF_LOWPOWER = 0x0300, /*!< Quadrature Mirror Filter (QMF) Bank processing
789 mode. \n -1: Use internal default. Implies MPEG
790 Surround partially complex accordingly. \n 0:
791 Use complex QMF data mode. \n 1: Use real (low
792 power) QMF data mode. \n */
762 AAC_UNIDRC_SET_EFFECT = 0x0206, /*!< MPEG-D DRC: Request a DRC effect type for
763 selection of a DRC set.\n Supported indices
764 are:\n -1: DRC off. Completely disables
765 MPEG-D DRC.\n 0: None (default). Disables
766 MPEG-D DRC, but automatically enables DRC
767 if necessary to prevent clipping.\n 1: Late
768 night\n 2: Noisy environment\n 3: Limited
769 playback range\n 4: Low playback level\n 5:
770 Dialog enhancement\n 6: General
771 compression. Used for generally enabling
772 MPEG-D DRC without particular request.\n */
773 AAC_UNIDRC_ALBUM_MODE =
774 0x0207, /*!< MPEG-D DRC: Enable album mode. 0: Disabled (default), 1:
775 Enabled.\n Disabled album mode leads to application of gain
776 sequences for fading in and out, if provided in the
777 bitstream.\n Enabled album mode makes use of dedicated album
778 loudness information, if provided in the bitstream.\n */
779 AAC_QMF_LOWPOWER =
780 0x0300, /*!< Quadrature Mirror Filter (QMF) Bank processing mode. \n
781 -1: Use internal default. \n
782 0: Use complex QMF data mode. \n
783 1: Use real (low power) QMF data mode. \n */
793784 AAC_TPDEC_CLEAR_BUFFER =
794 0x0603, /*!< Clear internal bit stream buffer of transport layers. The
795 decoder will start decoding at new data passed after this event
796 and any previous data is discarded. */
797 AAC_UNIDRC_SET_EFFECT = 0x0903 /*!< MPEG-D DRC: Request a DRC effect type for
798 selection of a DRC set.\n Supported indices
799 are:\n -1: DRC off. Completely disables
800 MPEG-D DRC.\n 0: None (default). Disables
801 MPEG-D DRC, but automatically enables DRC if
802 necessary to prevent clipping.\n 1: Late
803 night\n 2: Noisy environment\n 3: Limited
804 playback range\n 4: Low playback level\n 5:
805 Dialog enhancement\n 6: General compression.
806 Used for generally enabling MPEG-D DRC
807 without particular request.\n */
785 0x0603 /*!< Clear internal bit stream buffer of transport layers. The
786 decoder will start decoding at new data passed after this event
787 and any previous data is discarded. */
808788
809789 } AACDEC_PARAM;
810790
885865 1770. If no level has been found in the bitstream the
886866 value is -1. */
887867 SCHAR
888 drcPresMode; /*!< DRC presentation mode. According to ETSI TS 101 154,
889 this field indicates whether light (MPEG-4 Dynamic Range
890 Control tool) or heavy compression (DVB heavy
891 compression) dynamic range control shall take priority
892 on the outputs. For details, see ETSI TS 101 154, table
893 C.33. Possible values are: \n -1: No corresponding
894 metadata found in the bitstream \n 0: DRC presentation
895 mode not indicated \n 1: DRC presentation mode 1 \n 2:
896 DRC presentation mode 2 \n 3: Reserved */
868 drcPresMode; /*!< DRC presentation mode. According to ETSI TS 101 154,
869 this field indicates whether light (MPEG-4 Dynamic Range
870 Control tool) or heavy compression (DVB heavy
871 compression) dynamic range control shall take priority
872 on the outputs. For details, see ETSI TS 101 154, table
873 C.33. Possible values are: \n -1: No corresponding
874 metadata found in the bitstream \n 0: DRC presentation
875 mode not indicated \n 1: DRC presentation mode 1 \n 2:
876 DRC presentation mode 2 \n 3: Reserved */
877 INT outputLoudness; /*!< Audio output loudness in steps of -0.25 dB. Range: 0
878 (0 dBFS) to 231 (-57.75 dBFS).\n A value of -1
879 indicates that no loudness metadata is present.\n If
880 loudness normalization is active, the value corresponds
881 to the target loudness value set with
882 ::AAC_DRC_REFERENCE_LEVEL.\n If loudness normalization
883 is not active, the output loudness value corresponds to
884 the loudness metadata given in the bitstream.\n
885 Loudness metadata can originate from MPEG-4 DRC or
886 MPEG-D DRC. */
897887
898888 } CStreamInfo;
899889
10211011 const UINT bufferSize[],
10221012 UINT *bytesValid);
10231013
1024 #define AACDEC_CONCEAL \
1025 1 /*!< Flag for aacDecoder_DecodeFrame(): Trigger the built-in error \
1026 concealment module to generate a substitute signal for one lost frame. \
1027 New input data will not be considered. */
1028 #define AACDEC_FLUSH \
1029 2 /*!< Flag for aacDecoder_DecodeFrame(): Flush all filterbanks to get all \
1030 delayed audio without having new input data. Thus new input data will \
1031 not be considered.*/
1032 #define AACDEC_INTR \
1033 4 /*!< Flag for aacDecoder_DecodeFrame(): Signal an input bit stream data \
1034 discontinuity. Resync any internals as necessary. */
1035 #define AACDEC_CLRHIST \
1036 8 /*!< Flag for aacDecoder_DecodeFrame(): Clear all signal delay lines and \
1037 history buffers. CAUTION: This can cause discontinuities in the output \
1038 signal. */
1014 /** Flag for aacDecoder_DecodeFrame(): Trigger the built-in error concealment
1015 * module to generate a substitute signal for one lost frame. New input data
1016 * will not be considered.
1017 */
1018 #define AACDEC_CONCEAL 1
1019 /** Flag for aacDecoder_DecodeFrame(): Flush all filterbanks to get all delayed
1020 * audio without having new input data. Thus new input data will not be
1021 * considered.
1022 */
1023 #define AACDEC_FLUSH 2
1024 /** Flag for aacDecoder_DecodeFrame(): Signal an input bit stream data
1025 * discontinuity. Resync any internals as necessary.
1026 */
1027 #define AACDEC_INTR 4
1028 /** Flag for aacDecoder_DecodeFrame(): Clear all signal delay lines and history
1029 * buffers. CAUTION: This can cause discontinuities in the output signal.
1030 */
1031 #define AACDEC_CLRHIST 8
10391032
10401033 /**
10411034 * \brief Decode one audio frame
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
112112
113113 if (delay > 0) {
114114 data->delay_line =
115 (INT_PCM*)FDKcalloc(num_channels * delay, sizeof(INT_PCM));
115 (PCM_DEC*)FDKcalloc(num_channels * delay, sizeof(PCM_DEC));
116116 if (data->delay_line == NULL) {
117117 return -1;
118118 }
125125 return 0;
126126 }
127127
128 void FDK_Delay_Apply(FDK_SignalDelay* data, FIXP_PCM* time_buffer,
128 void FDK_Delay_Apply(FDK_SignalDelay* data, PCM_DEC* time_buffer,
129129 const UINT frame_length, const UCHAR channel) {
130130 FDK_ASSERT(data != NULL);
131131
132132 if (data->delay > 0) {
133 C_ALLOC_SCRATCH_START(tmp, FIXP_PCM, MAX_FRAME_LENGTH)
133 C_ALLOC_SCRATCH_START(tmp, PCM_DEC, MAX_FRAME_LENGTH)
134134 FDK_ASSERT(frame_length <= MAX_FRAME_LENGTH);
135135 FDK_ASSERT(channel < data->num_channels);
136136 FDK_ASSERT(time_buffer != NULL);
137137 if (frame_length >= data->delay) {
138138 FDKmemcpy(tmp, &time_buffer[frame_length - data->delay],
139 data->delay * sizeof(FIXP_PCM));
139 data->delay * sizeof(PCM_DEC));
140140 FDKmemmove(&time_buffer[data->delay], &time_buffer[0],
141 (frame_length - data->delay) * sizeof(FIXP_PCM));
141 (frame_length - data->delay) * sizeof(PCM_DEC));
142142 FDKmemcpy(&time_buffer[0], &data->delay_line[channel * data->delay],
143 data->delay * sizeof(FIXP_PCM));
143 data->delay * sizeof(PCM_DEC));
144144 FDKmemcpy(&data->delay_line[channel * data->delay], tmp,
145 data->delay * sizeof(FIXP_PCM));
145 data->delay * sizeof(PCM_DEC));
146146 } else {
147 FDKmemcpy(tmp, &time_buffer[0], frame_length * sizeof(FIXP_PCM));
147 FDKmemcpy(tmp, &time_buffer[0], frame_length * sizeof(PCM_DEC));
148148 FDKmemcpy(&time_buffer[0], &data->delay_line[channel * data->delay],
149 frame_length * sizeof(FIXP_PCM));
149 frame_length * sizeof(PCM_DEC));
150150 FDKmemcpy(&data->delay_line[channel * data->delay],
151151 &data->delay_line[channel * data->delay + frame_length],
152 (data->delay - frame_length) * sizeof(FIXP_PCM));
152 (data->delay - frame_length) * sizeof(PCM_DEC));
153153 FDKmemcpy(&data->delay_line[channel * data->delay +
154154 (data->delay - frame_length)],
155 tmp, frame_length * sizeof(FIXP_PCM));
155 tmp, frame_length * sizeof(PCM_DEC));
156156 }
157 C_ALLOC_SCRATCH_END(tmp, FIXP_PCM, MAX_FRAME_LENGTH)
157 C_ALLOC_SCRATCH_END(tmp, PCM_DEC, MAX_FRAME_LENGTH)
158158 }
159159
160160 return;
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
108108 * Structure representing one delay element for multiple channels.
109109 */
110110 typedef struct {
111 INT_PCM* delay_line; /*!< Pointer which stores allocated delay line. */
111 PCM_DEC* delay_line; /*!< Pointer which stores allocated delay line. */
112112 USHORT delay; /*!< Delay required in samples (per channel). */
113113 UCHAR num_channels; /*!< Number of channels to delay. */
114114 } FDK_SignalDelay;
136136 *
137137 * \return void
138138 */
139 void FDK_Delay_Apply(FDK_SignalDelay* data, FIXP_PCM* time_buffer,
139 void FDK_Delay_Apply(FDK_SignalDelay* data, PCM_DEC* time_buffer,
140140 const UINT frame_length, const UCHAR channel);
141141
142142 /**
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
104104
105105 #define WORKBUFFER1_TAG 0
106106 #define WORKBUFFER2_TAG 1
107
108 #define WORKBUFFER3_TAG 4
109 #define WORKBUFFER4_TAG 5
110
111107 #define WORKBUFFER5_TAG 6
112
113108 #define WORKBUFFER6_TAG 7
114109
115110 /*! The structure AAC_DECODER_INSTANCE is the top level structure holding all
168163 C_ALLOC_MEM_OVERLAY(WorkBufferCore2, FIXP_DBL, ((8) * 1024), SECT_DATA_L2,
169164 WORKBUFFER2_TAG)
170165
171 C_ALLOC_MEM_OVERLAY(WorkBufferCore3, FIXP_DBL, WB_SECTION_SIZE, SECT_DATA_L2,
172 WORKBUFFER3_TAG)
173 C_AALLOC_MEM(WorkBufferCore4, FIXP_DBL, WB_SECTION_SIZE)
174166 C_ALLOC_MEM_OVERLAY(WorkBufferCore6, SCHAR,
175167 fMax((INT)(sizeof(FIXP_DBL) * WB_SECTION_SIZE),
176168 (INT)sizeof(CAacDecoderCommonData)),
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
135135
136136 H_ALLOC_MEM_OVERLAY(WorkBufferCore1, CWorkBufferCore1)
137137 H_ALLOC_MEM_OVERLAY(WorkBufferCore2, FIXP_DBL)
138
139 H_ALLOC_MEM_OVERLAY(WorkBufferCore3, FIXP_DBL)
140 H_ALLOC_MEM(WorkBufferCore4, FIXP_DBL)
141
142138 H_ALLOC_MEM_OVERLAY(WorkBufferCore5, PCM_DEC)
143
144139 H_ALLOC_MEM_OVERLAY(WorkBufferCore6, SCHAR)
145140
146141 #endif /* #ifndef AAC_RAM_H */
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
107107 #include "aacdec_hcr_types.h"
108108 #include "aacdec_hcrs.h"
109109
110 #define PCM_AAC LONG
110111 #define PCM_DEC FIXP_DBL
111112 #define MAXVAL_PCM_DEC MAXVAL_DBL
112113 #define MINVAL_PCM_DEC MINVAL_DBL
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
149149 }
150150
151151 /*!
152 \brief Reset DRC information
153
154 \self Handle of DRC info
155
156 \return none
157 */
158 void aacDecoder_drcReset(HANDLE_AAC_DRC self) {
159 self->applyExtGain = 0;
160 self->additionalGainPrev = AACDEC_DRC_GAIN_INIT_VALUE;
161 self->additionalGainFilterState = AACDEC_DRC_GAIN_INIT_VALUE;
162 self->additionalGainFilterState1 = AACDEC_DRC_GAIN_INIT_VALUE;
163 }
164
165 /*!
152166 \brief Initialize DRC information
153167
154168 \self Handle of DRC info
173187 pParams->usrCut = FL2FXCONST_DBL(0.0f);
174188 pParams->boost = FL2FXCONST_DBL(0.0f);
175189 pParams->usrBoost = FL2FXCONST_DBL(0.0f);
176 pParams->targetRefLevel = -1;
190 pParams->targetRefLevel = 96;
177191 pParams->expiryFrame = AACDEC_DRC_DFLT_EXPIRY_FRAMES;
178 pParams->applyDigitalNorm = OFF;
179192 pParams->applyHeavyCompression = OFF;
180193 pParams->usrApplyHeavyCompression = OFF;
181194
191204 self->progRefLevelPresent = 0;
192205 self->presMode = -1;
193206 self->uniDrcPrecedence = 0;
207
208 aacDecoder_drcReset(self);
194209 }
195210
196211 /*!
257272 return AAC_DEC_INVALID_HANDLE;
258273 }
259274 if (value < 0) {
260 self->params.applyDigitalNorm = OFF;
261275 self->params.targetRefLevel = -1;
262276 } else {
263 /* ref_level must be between 0 and MAX_REFERENCE_LEVEL, inclusive */
264 self->params.applyDigitalNorm = ON;
265277 if (self->params.targetRefLevel != (SCHAR)value) {
266278 self->params.targetRefLevel = (SCHAR)value;
267279 self->progRefLevel = (SCHAR)value; /* Always set the program reference
271283 }
272284 self->update = 1;
273285 }
274 break;
275 case APPLY_NORMALIZATION:
276 if ((value != OFF) && (value != ON)) {
277 return AAC_DEC_SET_PARAM_FAIL;
278 }
279 if (self == NULL) {
280 return AAC_DEC_INVALID_HANDLE;
281 }
282 /* Store new parameter value */
283 self->params.applyDigitalNorm = (UCHAR)value;
284286 break;
285287 case APPLY_HEAVY_COMPRESSION:
286288 if ((value != OFF) && (value != ON)) {
909911 FDK_ASSERT(0);
910912 }
911913 }
912 if (self->params.applyDigitalNorm == OFF) {
913 /* Reset normalization gain since this module must not apply it */
914 norm_mantissa = FL2FXCONST_DBL(0.5f);
915 norm_exponent = 1;
916 }
914 /* Reset normalization gain since this module must not apply it */
915 norm_mantissa = FL2FXCONST_DBL(0.5f);
916 norm_exponent = 1;
917917
918918 /* calc scale factors */
919919 for (band = 0; band < numBands; band++) {
13521352 }
13531353 }
13541354 }
1355
1356 /**
1357 * \brief Apply DRC Level Normalization.
1358 *
1359 * This function prepares/applies the gain values for the DRC Level
1360 * Normalization and returns the exponent of the time data. The following two
1361 * cases are handled:
1362 *
1363 * - Limiter enabled:
1364 * The input data must be interleaved.
1365 * One gain per sample is written to the buffer pGainPerSample.
1366 * If necessary the time data is rescaled.
1367 *
1368 * - Limiter disabled:
1369 * The input data can be interleaved or deinterleaved.
1370 * The gain values are applied to the time data.
1371 * If necessary the time data is rescaled.
1372 *
1373 * \param hDrcInfo [i/o] handle to drc data structure.
1374 * \param samplesIn [i/o] pointer to time data.
1375 * \param pGain [i ] pointer to gain to be applied to
1376 * the time data.
1377 * \param pGainPerSample [o ] pointer to the gain per sample to
1378 * be applied to the time data in the limiter.
1379 * \param gain_scale [i ] exponent to be applied to the time
1380 * data.
1381 * \param gain_delay [i ] delay[samples] with which the gains
1382 * in pGain shall be applied (gain_delay <= nSamples).
1383 * \param nSamples [i ] number of samples per frame.
1384 * \param channels [i ] number of channels.
1385 * \param stride [i ] channel stride of time data.
1386 * \param limiterEnabled [i ] 1 if limiter is enabled, otherwise
1387 * 0.
1388 *
1389 * \return exponent of time data
1390 */
1391 INT applyDrcLevelNormalization(HANDLE_AAC_DRC hDrcInfo, PCM_DEC *samplesIn,
1392 FIXP_DBL *pGain, FIXP_DBL *pGainPerSample,
1393 const INT gain_scale, const UINT gain_delay,
1394 const UINT nSamples, const UINT channels,
1395 const UINT stride, const UINT limiterEnabled) {
1396 UINT i;
1397 INT additionalGain_scaling;
1398 FIXP_DBL additionalGain;
1399
1400 FDK_ASSERT(gain_delay <= nSamples);
1401
1402 FIXP_DBL additionalGainSmoothState = hDrcInfo->additionalGainFilterState;
1403 FIXP_DBL additionalGainSmoothState1 = hDrcInfo->additionalGainFilterState1;
1404
1405 if (!gain_delay) {
1406 additionalGain = pGain[0];
1407
1408 /* Apply the additional scaling gain_scale[0] that has no delay and no
1409 * smoothing */
1410 additionalGain_scaling =
1411 fMin(gain_scale, CntLeadingZeros(additionalGain) - 1);
1412 additionalGain = scaleValue(additionalGain, additionalGain_scaling);
1413
1414 /* if it's not possible to fully apply gain_scale to additionalGain, apply
1415 * it to the input signal */
1416 additionalGain_scaling -= gain_scale;
1417
1418 if (additionalGain_scaling) {
1419 scaleValuesSaturate(samplesIn, channels * nSamples,
1420 -additionalGain_scaling);
1421 }
1422
1423 if (limiterEnabled) {
1424 FDK_ASSERT(pGainPerSample != NULL);
1425
1426 for (i = 0; i < nSamples; i++) {
1427 pGainPerSample[i] = additionalGain;
1428 }
1429 } else {
1430 for (i = 0; i < channels * nSamples; i++) {
1431 samplesIn[i] = FIXP_DBL2PCM_DEC(fMult(samplesIn[i], additionalGain));
1432 }
1433 }
1434 } else {
1435 UINT inc;
1436 FIXP_DBL additionalGainUnfiltered;
1437
1438 inc = (stride == 1) ? channels : 1;
1439
1440 for (i = 0; i < nSamples; i++) {
1441 if (i < gain_delay) {
1442 additionalGainUnfiltered = hDrcInfo->additionalGainPrev;
1443 } else {
1444 additionalGainUnfiltered = pGain[0];
1445 }
1446
1447 /* Smooth additionalGain */
1448
1449 /* [b,a] = butter(1, 0.01) */
1450 static const FIXP_SGL b[] = {FL2FXCONST_SGL(0.015466 * 2.0),
1451 FL2FXCONST_SGL(0.015466 * 2.0)};
1452 static const FIXP_SGL a[] = {(FIXP_SGL)MAXVAL_SGL,
1453 FL2FXCONST_SGL(-0.96907)};
1454
1455 additionalGain = -fMult(additionalGainSmoothState, a[1]) +
1456 fMultDiv2(additionalGainUnfiltered, b[0]) +
1457 fMultDiv2(additionalGainSmoothState1, b[1]);
1458 additionalGainSmoothState1 = additionalGainUnfiltered;
1459 additionalGainSmoothState = additionalGain;
1460
1461 /* Apply the additional scaling gain_scale[0] that has no delay and no
1462 * smoothing */
1463 additionalGain_scaling =
1464 fMin(gain_scale, CntLeadingZeros(additionalGain) - 1);
1465 additionalGain = scaleValue(additionalGain, additionalGain_scaling);
1466
1467 /* if it's not possible to fully apply gain_scale[0] to additionalGain,
1468 * apply it to the input signal */
1469 additionalGain_scaling -= gain_scale;
1470
1471 if (limiterEnabled) {
1472 FDK_ASSERT(stride == 1);
1473 FDK_ASSERT(pGainPerSample != NULL);
1474
1475 if (additionalGain_scaling) {
1476 scaleValuesSaturate(samplesIn, channels, -additionalGain_scaling);
1477 }
1478
1479 pGainPerSample[i] = additionalGain;
1480 } else {
1481 if (additionalGain_scaling) {
1482 for (UINT k = 0; k < channels; k++) {
1483 scaleValuesSaturate(&samplesIn[k * stride], 1,
1484 -additionalGain_scaling);
1485 }
1486 }
1487
1488 for (UINT k = 0; k < channels; k++) {
1489 samplesIn[k * stride] =
1490 FIXP_DBL2PCM_DEC(fMult(samplesIn[k * stride], additionalGain));
1491 }
1492 }
1493
1494 samplesIn += inc;
1495 }
1496 }
1497
1498 hDrcInfo->additionalGainPrev = pGain[0];
1499 hDrcInfo->additionalGainFilterState = additionalGainSmoothState;
1500 hDrcInfo->additionalGainFilterState1 = additionalGainSmoothState1;
1501
1502 return (AACDEC_DRC_GAIN_SCALING);
1503 }
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
108108 #include "channel.h"
109109 #include "FDK_bitstream.h"
110110
111 #define AACDEC_DRC_GAIN_SCALING (11) /* Scaling of DRC gains */
112 #define AACDEC_DRC_GAIN_INIT_VALUE \
113 (FL2FXCONST_DBL( \
114 1.0f / (1 << AACDEC_DRC_GAIN_SCALING))) /* Init value for DRC gains */
115
111116 #define AACDEC_DRC_DFLT_EXPIRY_FRAMES \
112117 (0) /* Default DRC data expiry time in AAC frames */
113118
124129 TARGET_REF_LEVEL,
125130 DRC_BS_DELAY,
126131 DRC_DATA_EXPIRY_FRAME,
127 APPLY_NORMALIZATION,
128132 APPLY_HEAVY_COMPRESSION,
129133 DEFAULT_PRESENTATION_MODE,
130134 ENCODER_TARGET_LEVEL,
135139 /**
136140 * \brief DRC module interface functions
137141 */
142 void aacDecoder_drcReset(HANDLE_AAC_DRC self);
143
138144 void aacDecoder_drcInit(HANDLE_AAC_DRC self);
139145
140146 void aacDecoder_drcInitChannelData(CDrcChannelData *pDrcChannel);
188194 void aacDecoder_drcGetInfo(HANDLE_AAC_DRC self, SCHAR *pPresMode,
189195 SCHAR *pProgRefLevel);
190196
197 /**
198 * \brief Apply DRC Level Normalization.
199 *
200 * This function prepares/applies the gain values for the DRC Level
201 * Normalization and returns the exponent of the time data. The following two
202 * cases are handled:
203 *
204 * - Limiter enabled:
205 * The input data must be interleaved.
206 * One gain per sample is written to the buffer pGainPerSample.
207 * If necessary the time data is rescaled.
208 *
209 * - Limiter disabled:
210 * The input data can be interleaved or deinterleaved.
211 * The gain values are applied to the time data.
212 * If necessary the time data is rescaled.
213 *
214 * \param hDrcInfo [i/o] handle to drc data structure.
215 * \param samplesIn [i/o] pointer to time data.
216 * \param pGain [i ] pointer to gain to be applied to
217 * the time data.
218 * \param pGainPerSample [o ] pointer to the gain per sample to
219 * be applied to the time data in the limiter.
220 * \param gain_scale [i ] exponent to be applied to the time
221 * data.
222 * \param gain_delay [i ] delay[samples] with which the gains
223 * in pGain shall be applied (gain_delay <= nSamples).
224 * \param nSamples [i ] number of samples per frame.
225 * \param channels [i ] number of channels.
226 * \param stride [i ] channel stride of time data.
227 * \param limiterEnabled [i ] 1 if limiter is enabled, otherwise
228 * 0.
229 *
230 * \return exponent of time data
231 */
232 INT applyDrcLevelNormalization(HANDLE_AAC_DRC hDrcInfo, PCM_DEC *samplesIn,
233 FIXP_DBL *pGain, FIXP_DBL *pGainPerSample,
234 const INT gain_scale, const UINT gain_delay,
235 const UINT nSamples, const UINT channels,
236 const UINT stride, const UINT limiterEnabled);
237
191238 #endif /* AACDEC_DRC_H */
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
167167
168168 UINT expiryFrame;
169169 UCHAR bsDelayEnable;
170 UCHAR applyDigitalNorm;
171170
172171 AACDEC_DRC_PARAMETER_HANDLING defaultPresentationMode;
173172 UCHAR encoderTargetLevel;
212211 uniDrcPrecedence; /* Flag for signalling that uniDrc is active and takes
213212 precedence over legacy DRC */
214213
214 UCHAR applyExtGain; /* Flag is 1 if extGain has to be applied, otherwise 0. */
215
216 FIXP_DBL additionalGainPrev; /* Gain of previous frame to be applied to the
217 time data */
218 FIXP_DBL additionalGainFilterState; /* Filter state for the gain smoothing */
219 FIXP_DBL additionalGainFilterState1; /* Filter state for the gain smoothing */
220
215221 } CDrcInfo;
216222
217223 typedef CDrcInfo *HANDLE_AAC_DRC;
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
136136 static INT DecodeEscapeSequence(HANDLE_FDK_BITSTREAM bs, const INT bsAnchor,
137137 INT quantSpecCoef, INT *pLeftStartOfSegment,
138138 SCHAR *pRemainingBitsInSegment,
139 int *pNumDecodedBits);
139 int *pNumDecodedBits, UINT *errorWord);
140140
141141 static int DecodePCW_Sign(HANDLE_FDK_BITSTREAM bs, const INT bsAnchor,
142142 UINT codebookDim, const SCHAR *pQuantVal,
11781178 bs, pHcr->decInOut.bitstreamAnchor,
11791179 pQuantizedSpectralCoefficients
11801180 [quantizedSpectralCoefficientsIdx],
1181 pLeftStartOfSegment, pRemainingBitsInSegment,
1182 &numDecodedBits);
1181 pLeftStartOfSegment, pRemainingBitsInSegment, &numDecodedBits,
1182 &pHcr->decInOut.errorLog);
11831183 }
11841184 quantizedSpectralCoefficientsIdx++;
11851185 if (quantizedSpectralCoefficientsIdx >= 1024) {
11941194 bs, pHcr->decInOut.bitstreamAnchor,
11951195 pQuantizedSpectralCoefficients
11961196 [quantizedSpectralCoefficientsIdx],
1197 pLeftStartOfSegment, pRemainingBitsInSegment,
1198 &numDecodedBits);
1197 pLeftStartOfSegment, pRemainingBitsInSegment, &numDecodedBits,
1198 &pHcr->decInOut.errorLog);
11991199 }
12001200 quantizedSpectralCoefficientsIdx++;
12011201 if (quantizedSpectralCoefficientsIdx >= 1024) {
13851385 static INT DecodeEscapeSequence(HANDLE_FDK_BITSTREAM bs, const INT bsAnchor,
13861386 INT quantSpecCoef, INT *pLeftStartOfSegment,
13871387 SCHAR *pRemainingBitsInSegment,
1388 int *pNumDecodedBits) {
1388 int *pNumDecodedBits, UINT *errorWord) {
13891389 UINT i;
13901390 INT sign;
13911391 UINT escapeOnesCounter = 0;
13991399 FROM_LEFT_TO_RIGHT);
14001400 *pRemainingBitsInSegment -= 1;
14011401 *pNumDecodedBits += 1;
1402 if (*pRemainingBitsInSegment < 0) {
1403 return Q_VALUE_INVALID;
1404 }
14021405
14031406 if (carryBit != 0) {
14041407 escapeOnesCounter += 1;
14151418 FROM_LEFT_TO_RIGHT);
14161419 *pRemainingBitsInSegment -= 1;
14171420 *pNumDecodedBits += 1;
1421 if (*pRemainingBitsInSegment < 0) {
1422 return Q_VALUE_INVALID;
1423 }
14181424
14191425 escape_word <<= 1;
14201426 escape_word = escape_word | carryBit;
14221428
14231429 sign = (quantSpecCoef >= 0) ? 1 : -1;
14241430
1425 quantSpecCoef = sign * (((INT)1 << escapeOnesCounter) + escape_word);
1426
1431 if (escapeOnesCounter < 13) {
1432 quantSpecCoef = sign * (((INT)1 << escapeOnesCounter) + escape_word);
1433 } else {
1434 *errorWord |= TOO_MANY_PCW_BODY_SIGN_ESC_BITS_DECODED;
1435 quantSpecCoef = Q_VALUE_INVALID;
1436 }
14271437 return quantSpecCoef;
14281438 }
14291439
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
13231323 /* count ones and store sum in escapePrefixUp */
13241324 if (carryBit == 1) {
13251325 escapePrefixUp += 1; /* update conter for ones */
1326 if (escapePrefixUp > 8) {
1327 pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN_ESC__ESC_PREFIX;
1328 return BODY_SIGN_ESC__ESC_PREFIX;
1329 }
13261330
13271331 /* store updated counter in sideinfo of current codeword */
13281332 pEscapeSequenceInfo[codewordOffset] &=
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2020 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
12241224 pStreamInfo->drcProgRefLev =
12251225 -1; /* set program reference level to not indicated */
12261226 pStreamInfo->drcPresMode = -1; /* default: presentation mode not indicated */
1227
1228 pStreamInfo->outputLoudness = -1; /* default: no loudness metadata present */
12271229 }
12281230
12291231 /*!
12781280 /* Set default frame delay */
12791281 aacDecoder_drcSetParam(self->hDrcInfo, DRC_BS_DELAY,
12801282 CConcealment_GetDelay(&self->concealCommonData));
1283 self->workBufferCore1 = (FIXP_DBL *)GetWorkBufferCore1();
12811284
12821285 self->workBufferCore2 = GetWorkBufferCore2();
12831286 if (self->workBufferCore2 == NULL) goto bail;
13021305 const int subStreamIndex) {
13031306 int ch;
13041307 int aacChannelOffset = 0, aacChannels = (8);
1305 int numElements = (((8)) + (8)), elementOffset = 0;
1308 int numElements = (3 * ((8) * 2) + (((8) * 2)) / 2 + 4 * (1) + 1),
1309 elementOffset = 0;
13061310
13071311 if (self == NULL) return;
13081312
14521456 FreeDrcInfo(&self->hDrcInfo);
14531457 }
14541458
1459 if (self->workBufferCore1 != NULL) {
1460 FreeWorkBufferCore1((CWorkBufferCore1 **)&self->workBufferCore1);
1461 }
1462
14551463 /* Free WorkBufferCore2 */
14561464 if (self->workBufferCore2 != NULL) {
14571465 FreeWorkBufferCore2(&self->workBufferCore2);
14881496
14891497 UCHAR downscaleFactor = self->downscaleFactor;
14901498 UCHAR downscaleFactorInBS = self->downscaleFactorInBS;
1499
1500 self->aacOutDataHeadroom = (3);
14911501
14921502 // set profile and check for supported aot
14931503 // leave profile on default (=-1) for all other supported MPEG-4 aot's except
18141824 self->useLdQmfTimeAlign =
18151825 asc->m_sc.m_eldSpecificConfig.m_useLdQmfTimeAlign;
18161826 }
1827 if (self->sbrEnabled != asc->m_sbrPresentFlag) {
1828 ascChanged = 1;
1829 }
18171830 }
18181831
18191832 self->streamInfo.extAot = asc->m_extensionAudioObjectType;
18421855 self->streamInfo.extSamplingRate =
18431856 self->streamInfo.extSamplingRate / self->downscaleFactor;
18441857 }
1858 }
1859 if ((asc->m_aot == AOT_AAC_LC) && (asc->m_sbrPresentFlag == 1) &&
1860 (asc->m_extensionSamplingFrequency > (2 * asc->m_samplingFrequency))) {
1861 return AAC_DEC_UNSUPPORTED_SAMPLINGRATE; /* Core decoder supports at most a
1862 1:2 upsampling for HE-AAC and
1863 HE-AACv2 */
18451864 }
18461865
18471866 /* --------- vcb11 ------------ */
19241943 self->samplingRateInfo[0].samplingRate / self->downscaleFactor;
19251944 self->streamInfo.aacSamplesPerFrame =
19261945 asc->m_samplesPerFrame / self->downscaleFactor;
1946 if (self->streamInfo.aacSampleRate <= 0) {
1947 return AAC_DEC_UNSUPPORTED_SAMPLINGRATE;
1948 }
19271949 }
19281950 }
19291951
23582380 goto bail;
23592381 }
23602382
2383 if (*configChanged) {
2384 if (asc->m_aot == AOT_USAC) {
2385 self->hDrcInfo->enable = 0;
2386 self->hDrcInfo->progRefLevelPresent = 0;
2387 }
2388 }
2389
23612390 if (asc->m_aot == AOT_USAC) {
23622391 pcmLimiter_SetAttack(self->hLimiter, (5));
23632392 pcmLimiter_SetThreshold(self->hLimiter, FL2FXCONST_DBL(0.89125094f));
23712400 }
23722401
23732402 LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_DecodeFrame(
2374 HANDLE_AACDECODER self, const UINT flags, FIXP_PCM *pTimeData,
2403 HANDLE_AACDECODER self, const UINT flags, PCM_DEC *pTimeData,
23752404 const INT timeDataSize, const int timeDataChannelOffset) {
23762405 AAC_DECODER_ERROR ErrorStatus = AAC_DEC_OK;
23772406
31473176 FDKmemcpy(drcChMap, self->chMapping, (8) * sizeof(UCHAR));
31483177 }
31493178
3150 /* Turn on/off DRC modules level normalization in digital domain depending
3151 * on the limiter status. */
3152 aacDecoder_drcSetParam(self->hDrcInfo, APPLY_NORMALIZATION,
3153 (self->limiterEnableCurr) ? 0 : 1);
3154
31553179 /* deactivate legacy DRC in case uniDrc is active, i.e. uniDrc payload is
31563180 * present and one of DRC or Loudness Normalization is switched on */
31573181 aacDecoder_drcSetParam(
31643188 self->hDrcInfo, bs, self->pAacDecoderStaticChannelInfo,
31653189 pce->ElementInstanceTag, drcChMap, aacChannels);
31663190 if (mapped > 0) {
3167 /* If at least one DRC thread has been mapped to a channel threre was DRC
3168 * data in the bitstream. */
3169 self->flags[streamIndex] |= AC_DRC_PRESENT;
3191 if (!(self->flags[streamIndex] & (AC_USAC | AC_RSV603DA))) {
3192 /* If at least one DRC thread has been mapped to a channel there was DRC
3193 * data in the bitstream. */
3194 self->flags[streamIndex] |= AC_DRC_PRESENT;
3195 } else {
3196 self->hDrcInfo->enable = 0;
3197 self->hDrcInfo->progRefLevelPresent = 0;
3198 ErrorStatus = AAC_DEC_UNSUPPORTED_FORMAT;
3199 }
31703200 }
31713201
31723202 /* Create a reverse mapping table */
32963326 &pAacDecoderStaticChannelInfo->drcData);
32973327 }
32983328 }
3329
32993330 /* The DRC module demands to be called with the gain field holding the
33003331 * gain scale. */
3301 self->extGain[0] = (FIXP_DBL)TDL_GAIN_SCALING;
3332 self->extGain[0] = (FIXP_DBL)AACDEC_DRC_GAIN_SCALING;
3333
33023334 /* DRC processing */
33033335 aacDecoder_drcApply(
33043336 self->hDrcInfo, self->hSbrDecoder, pAacDecoderChannelInfo,
33143346 if (self->flushStatus && (self->flushCnt > 0) &&
33153347 !(flags & AACDEC_CONCEAL)) {
33163348 FDKmemclear(pTimeData + offset,
3317 sizeof(FIXP_PCM) * self->streamInfo.aacSamplesPerFrame);
3349 sizeof(PCM_DEC) * self->streamInfo.aacSamplesPerFrame);
33183350 } else
33193351 switch (pAacDecoderChannelInfo->renderMode) {
33203352 case AACDEC_RENDER_IMDCT:
33263358 !frameOk_butConceal),
33273359 pAacDecoderChannelInfo->pComStaticData->pWorkBufferCore1
33283360 ->mdctOutTemp,
3329 self->elFlags[el], elCh);
3361 self->aacOutDataHeadroom, self->elFlags[el], elCh);
33303362
33313363 self->extGainDelay = self->streamInfo.aacSamplesPerFrame;
33323364 break;
33473379 &self->samplingRateInfo[streamIndex],
33483380 (self->frameOK && !(flags & AACDEC_CONCEAL) &&
33493381 !frameOk_butConceal),
3350 flags, self->flags[streamIndex]);
3382 self->aacOutDataHeadroom, flags, self->flags[streamIndex]);
33513383
33523384 self->extGainDelay = self->streamInfo.aacSamplesPerFrame;
33533385 break;
33593391 if (!CConceal_TDFading_Applied[c]) {
33603392 CConceal_TDFading_Applied[c] = CConcealment_TDFading(
33613393 self->streamInfo.aacSamplesPerFrame,
3362 &self->pAacDecoderStaticChannelInfo[c], pTimeData + offset, 0);
3394 &self->pAacDecoderStaticChannelInfo[c], self->aacOutDataHeadroom,
3395 pTimeData + offset, 0);
33633396 if (c + 1 < (8) && c < aacChannels - 1) {
33643397 /* update next TDNoise Seed to avoid muting in case of Parametric
33653398 * Stereo */
33813414 if ((aacChannels == 2) && bsPseudoLr) {
33823415 int i, offset2;
33833416 const FIXP_SGL invSqrt2 = FL2FXCONST_SGL(0.707106781186547f);
3384 FIXP_PCM *pTD = pTimeData;
3417 PCM_DEC *pTD = pTimeData;
33853418
33863419 offset2 = timeDataChannelOffset;
33873420
33883421 for (i = 0; i < self->streamInfo.aacSamplesPerFrame; i++) {
3389 FIXP_DBL L = FX_PCM2FX_DBL(pTD[0]);
3390 FIXP_DBL R = FX_PCM2FX_DBL(pTD[offset2]);
3422 FIXP_DBL L = PCM_DEC2FIXP_DBL(pTD[0]);
3423 FIXP_DBL R = PCM_DEC2FIXP_DBL(pTD[offset2]);
33913424 L = fMult(L, invSqrt2);
33923425 R = fMult(R, invSqrt2);
3393 #if (SAMPLE_BITS == 16)
3394 pTD[0] = FX_DBL2FX_PCM(fAddSaturate(L + R, (FIXP_DBL)0x8000));
3395 pTD[offset2] = FX_DBL2FX_PCM(fAddSaturate(L - R, (FIXP_DBL)0x8000));
3396 #else
3397 pTD[0] = FX_DBL2FX_PCM(L + R);
3398 pTD[offset2] = FX_DBL2FX_PCM(L - R);
3399 #endif
3426 pTD[0] = L + R;
3427 pTD[offset2] = L - R;
34003428 pTD++;
34013429 }
34023430 }
34073435 self->hDrcInfo, bs, self->pAacDecoderStaticChannelInfo,
34083436 pce->ElementInstanceTag, drcChMap, aacChannels);
34093437 if (mapped > 0) {
3410 /* If at least one DRC thread has been mapped to a channel threre was DRC
3411 * data in the bitstream. */
3412 self->flags[streamIndex] |= AC_DRC_PRESENT;
3438 if (!(self->flags[streamIndex] & (AC_USAC | AC_RSV603DA))) {
3439 /* If at least one DRC thread has been mapped to a channel there was DRC
3440 * data in the bitstream. */
3441 self->flags[streamIndex] |= AC_DRC_PRESENT;
3442 } else {
3443 self->hDrcInfo->enable = 0;
3444 self->hDrcInfo->progRefLevelPresent = 0;
3445 ErrorStatus = AAC_DEC_UNSUPPORTED_FORMAT;
3446 }
34133447 }
34143448 }
34153449
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
190190 INT outputInterleaved; /*!< PCM output format (interleaved/none interleaved).
191191 */
192192
193 INT aacOutDataHeadroom; /*!< Headroom of the output time signal to prevent
194 clipping */
195
193196 HANDLE_TRANSPORTDEC hInput; /*!< Transport layer handle. */
194197
195198 SamplingRateInfo
234237 CAacDecoderStaticChannelInfo
235238 *pAacDecoderStaticChannelInfo[(8)]; /*!< Persistent channel memory */
236239
240 FIXP_DBL *workBufferCore1;
237241 FIXP_DBL *workBufferCore2;
238242 PCM_DEC *pTimeData2;
239243 INT timeData2Size;
310314 UCHAR limiterEnableUser; /*!< The limiter configuration requested by the
311315 library user */
312316 UCHAR limiterEnableCurr; /*!< The current limiter configuration. */
317
313318 FIXP_DBL extGain[1]; /*!< Gain that must be applied to the output signal. */
314319 UINT extGainDelay; /*!< Delay that must be accounted for extGain. */
315
316 INT_PCM pcmOutputBuffer[(8) * (1024 * 2)];
317320
318321 HANDLE_DRC_DECODER hUniDrcDecoder;
319322 UCHAR multibandDrcPresent;
426429 \return error status
427430 */
428431 LINKSPEC_H AAC_DECODER_ERROR CAacDecoder_DecodeFrame(
429 HANDLE_AACDECODER self, const UINT flags, FIXP_PCM *pTimeData,
432 HANDLE_AACDECODER self, const UINT flags, PCM_DEC *pTimeData,
430433 const INT timeDataSize, const int timeDataChannelOffset);
431434
432435 /* Free config dependent AAC memory */
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
118118
119119 /* Decoder library info */
120120 #define AACDECODER_LIB_VL0 3
121 #define AACDECODER_LIB_VL1 0
121 #define AACDECODER_LIB_VL1 2
122122 #define AACDECODER_LIB_VL2 0
123123 #define AACDECODER_LIB_TITLE "AAC Decoder Lib"
124 #ifdef __ANDROID__
124 #ifdef SUPPRESS_BUILD_DATE_INFO
125125 #define AACDECODER_LIB_BUILD_DATE ""
126126 #define AACDECODER_LIB_BUILD_TIME ""
127127 #else
822822 case AAC_DRC_ATTENUATION_FACTOR:
823823 /* DRC compression factor (where 0 is no and 127 is max compression) */
824824 errorStatus = aacDecoder_drcSetParam(hDrcInfo, DRC_CUT_SCALE, value);
825 uniDrcErr = FDK_drcDec_SetParam(self->hUniDrcDecoder, DRC_DEC_COMPRESS,
826 value * (FL2FXCONST_DBL(0.5f / 127.0f)));
825827 break;
826828
827829 case AAC_DRC_BOOST_FACTOR:
828830 /* DRC boost factor (where 0 is no and 127 is max boost) */
829831 errorStatus = aacDecoder_drcSetParam(hDrcInfo, DRC_BOOST_SCALE, value);
832 uniDrcErr = FDK_drcDec_SetParam(self->hUniDrcDecoder, DRC_DEC_BOOST,
833 value * (FL2FXCONST_DBL(0.5f / 127.0f)));
830834 break;
831835
832836 case AAC_DRC_REFERENCE_LEVEL:
870874 uniDrcErr = FDK_drcDec_SetParam(self->hUniDrcDecoder, DRC_DEC_EFFECT_TYPE,
871875 (FIXP_DBL)value);
872876 break;
877 case AAC_UNIDRC_ALBUM_MODE:
878 uniDrcErr = FDK_drcDec_SetParam(self->hUniDrcDecoder, DRC_DEC_ALBUM_MODE,
879 (FIXP_DBL)value);
880 break;
881
873882 case AAC_TPDEC_CLEAR_BUFFER:
874883 errTp = transportDec_SetParam(hTpDec, TPDEC_PARAM_RESET, 1);
875884 self->streamInfo.numLostAccessUnits = 0;
11231132 return n;
11241133 }
11251134
1126 LINKSPEC_CPP AAC_DECODER_ERROR
1127 aacDecoder_DecodeFrame(HANDLE_AACDECODER self, INT_PCM *pTimeData_extern,
1128 const INT timeDataSize_extern, const UINT flags) {
1135 LINKSPEC_CPP AAC_DECODER_ERROR aacDecoder_DecodeFrame(HANDLE_AACDECODER self,
1136 INT_PCM *pTimeData,
1137 const INT timeDataSize,
1138 const UINT flags) {
11291139 AAC_DECODER_ERROR ErrorStatus;
11301140 INT layer;
11311141 INT nBits;
1142 INT timeData2Size;
1143 INT timeData3Size;
1144 INT timeDataHeadroom;
11321145 HANDLE_FDK_BITSTREAM hBs;
11331146 int fTpInterruption = 0; /* Transport originated interruption detection. */
11341147 int fTpConceal = 0; /* Transport originated concealment. */
1135 INT_PCM *pTimeData = NULL;
1136 INT timeDataSize = 0;
11371148 UINT accessUnit = 0;
11381149 UINT numAccessUnits = 1;
11391150 UINT numPrerollAU = 0;
1140 int fEndAuNotAdjusted = 0; /* The end of the access unit was not adjusted */
1141 int applyCrossfade = 1; /* flag indicates if flushing was possible */
1142 FIXP_PCM *pTimeDataFixpPcm; /* Signal buffer for decoding process before PCM
1143 processing */
1144 INT timeDataFixpPcmSize;
1145 PCM_DEC *pTimeDataPcmPost; /* Signal buffer for PCM post-processing */
1146 INT timeDataPcmPostSize;
1151 int fEndAuNotAdjusted = 0; /* The end of the access unit was not adjusted */
1152 int applyCrossfade = 1; /* flag indicates if flushing was possible */
1153 PCM_DEC *pTimeData2;
1154 PCM_AAC *pTimeData3;
11471155
11481156 if (self == NULL) {
11491157 return AAC_DEC_INVALID_HANDLE;
11501158 }
1151
1152 pTimeData = self->pcmOutputBuffer;
1153 timeDataSize = sizeof(self->pcmOutputBuffer) / sizeof(*self->pcmOutputBuffer);
11541159
11551160 if (flags & AACDEC_INTR) {
11561161 self->streamInfo.numLostAccessUnits = 0;
12611266 }
12621267
12631268 /* Signal bit stream interruption to other modules if required. */
1264 if (fTpInterruption || (flags & AACDEC_INTR)) {
1269 if (fTpInterruption || ((flags & AACDEC_INTR) && (accessUnit == 0))) {
12651270 aacDecoder_SignalInterruption(self);
1266 if (!(flags & AACDEC_INTR)) {
1271 if (!((flags & AACDEC_INTR) && (accessUnit == 0))) {
12671272 ErrorStatus = AAC_DEC_TRANSPORT_SYNC_ERROR;
12681273 goto bail;
12691274 }
13071312 /* Use limiter configuration as requested. */
13081313 self->limiterEnableCurr = self->limiterEnableUser;
13091314 }
1310 /* reset limiter gain on a per frame basis */
1311 self->extGain[0] = FL2FXCONST_DBL(1.0f / (float)(1 << TDL_GAIN_SCALING));
1312
1313 pTimeDataFixpPcm = pTimeData;
1314 timeDataFixpPcmSize = timeDataSize;
1315
1316 /* reset DRC level normalization gain on a per frame basis */
1317 self->extGain[0] = AACDEC_DRC_GAIN_INIT_VALUE;
1318
1319 pTimeData2 = self->pTimeData2;
1320 timeData2Size = self->timeData2Size / sizeof(PCM_DEC);
1321 pTimeData3 = (PCM_AAC *)self->pTimeData2;
1322 timeData3Size = self->timeData2Size / sizeof(PCM_AAC);
13151323
13161324 ErrorStatus = CAacDecoder_DecodeFrame(
13171325 self,
13181326 flags | (fTpConceal ? AACDEC_CONCEAL : 0) |
13191327 ((self->flushStatus && !(flags & AACDEC_CONCEAL)) ? AACDEC_FLUSH
13201328 : 0),
1321 pTimeDataFixpPcm + 0, timeDataFixpPcmSize,
1322 self->streamInfo.aacSamplesPerFrame + 0);
1329 pTimeData2 + 0, timeData2Size, self->streamInfo.aacSamplesPerFrame + 0);
1330
1331 timeDataHeadroom = self->aacOutDataHeadroom;
13231332
13241333 /* if flushing for USAC DASH IPF was not possible go on with decoding
13251334 * preroll */
13441353 }
13451354 }
13461355
1347 /* If the current pTimeDataFixpPcm does not contain a valid signal, there
1356 /* If the current pTimeData2 does not contain a valid signal, there
13481357 * nothing else we can do, so bail. */
13491358 if (!IS_OUTPUT_VALID(ErrorStatus)) {
13501359 goto bail;
13581367 self->streamInfo.numChannels = self->streamInfo.aacNumChannels;
13591368
13601369 {
1361 FDK_Delay_Apply(&self->usacResidualDelay,
1362 pTimeDataFixpPcm +
1363 1 * (self->streamInfo.aacSamplesPerFrame + 0) + 0,
1364 self->streamInfo.frameSize, 0);
1370 FDK_Delay_Apply(
1371 &self->usacResidualDelay,
1372 pTimeData2 + 1 * (self->streamInfo.aacSamplesPerFrame + 0) + 0,
1373 self->streamInfo.frameSize, 0);
13651374 }
13661375
13671376 /* Setting of internal MPS state; may be reset in CAacDecoder_SyncQmfMode
14081417 }
14091418 }
14101419
1411 self->qmfDomain.globalConf.TDinput = pTimeData;
1412
14131420 switch (FDK_QmfDomain_Configure(&self->qmfDomain)) {
14141421 default:
14151422 case QMF_DOMAIN_INIT_ERROR:
14661473 sbrDecoder_SetParam(self->hSbrDecoder, SBR_SKIP_QMF,
14671474 (self->mpsEnableCurr) ? 2 : 0);
14681475
1469 INT_PCM *input;
1470 input = (INT_PCM *)self->workBufferCore2;
1471 FDKmemcpy(input, pTimeData,
1472 sizeof(INT_PCM) * (self->streamInfo.numChannels) *
1476 PCM_AAC *input;
1477 input = (PCM_AAC *)self->workBufferCore2;
1478 FDKmemcpy(input, pTimeData3,
1479 sizeof(PCM_AAC) * (self->streamInfo.numChannels) *
14731480 (self->streamInfo.frameSize));
14741481
14751482 /* apply SBR processing */
1476 sbrError = sbrDecoder_Apply(self->hSbrDecoder, input, pTimeData,
1477 timeDataSize, &self->streamInfo.numChannels,
1478 &self->streamInfo.sampleRate,
1479 &self->mapDescr, self->chMapIndex,
1480 self->frameOK, &self->psPossible);
1483 sbrError = sbrDecoder_Apply(
1484 self->hSbrDecoder, input, pTimeData3, timeData3Size,
1485 &self->streamInfo.numChannels, &self->streamInfo.sampleRate,
1486 &self->mapDescr, self->chMapIndex, self->frameOK, &self->psPossible,
1487 self->aacOutDataHeadroom, &timeDataHeadroom);
14811488
14821489 if (sbrError == SBRDEC_OK) {
14831490 /* Update data in streaminfo structure. Assume that the SBR upsampling
15561563 if (err == 0) {
15571564 err = mpegSurroundDecoder_Apply(
15581565 (CMpegSurroundDecoder *)self->pMpegSurroundDecoder,
1559 (INT_PCM *)self->workBufferCore2, pTimeData, timeDataSize,
1566 (PCM_AAC *)self->workBufferCore2, pTimeData3, timeData3Size,
15601567 self->streamInfo.aacSamplesPerFrame, &nChannels, &frameSize,
15611568 self->streamInfo.sampleRate, self->streamInfo.aot,
1562 self->channelType, self->channelIndices, &self->mapDescr);
1569 self->channelType, self->channelIndices, &self->mapDescr,
1570 self->aacOutDataHeadroom, &timeDataHeadroom);
15631571 }
15641572
15651573 if (err == MPS_OUTPUT_BUFFER_TOO_SMALL) {
15821590 self->streamInfo.frameSize = self->mpsFrameSizeLast;
15831591 /* ... and clear output buffer so that potentially corrupted data does
15841592 * not reach the framework. */
1585 FDKmemclear(pTimeData, self->mpsOutChannelsLast *
1586 self->mpsFrameSizeLast * sizeof(INT_PCM));
1593 FDKmemclear(pTimeData3, self->mpsOutChannelsLast *
1594 self->mpsFrameSizeLast * sizeof(PCM_AAC));
15871595 /* Additionally proclaim that this frame had errors during decoding.
15881596 */
15891597 ErrorStatus = AAC_DEC_DECODE_FRAME_ERROR;
16041612 sbrDecoder_SetParam(self->hSbrDecoder, SBR_SKIP_QMF, 1);
16051613
16061614 /* apply SBR processing */
1607 sbrError = sbrDecoder_Apply(self->hSbrDecoder, pTimeData, pTimeData,
1608 timeDataSize, &self->streamInfo.numChannels,
1609 &self->streamInfo.sampleRate,
1610 &self->mapDescr, self->chMapIndex,
1611 self->frameOK, &self->psPossible);
1615 sbrError = sbrDecoder_Apply(
1616 self->hSbrDecoder, pTimeData3, pTimeData3, timeData3Size,
1617 &self->streamInfo.numChannels, &self->streamInfo.sampleRate,
1618 &self->mapDescr, self->chMapIndex, self->frameOK, &self->psPossible,
1619 self->aacOutDataHeadroom, &timeDataHeadroom);
16121620
16131621 if (sbrError == SBRDEC_OK) {
16141622 /* Update data in streaminfo structure. Assume that the SBR upsampling
16361644 }
16371645 }
16381646
1639 /* Use dedicated memory for PCM postprocessing */
1640 pTimeDataPcmPost = self->pTimeData2;
1641 timeDataPcmPostSize = self->timeData2Size;
1642
16431647 {
1644 const int size =
1645 self->streamInfo.frameSize * self->streamInfo.numChannels;
1646 FDK_ASSERT(timeDataPcmPostSize >= size);
1647 for (int i = 0; i < size; i++) {
1648 pTimeDataPcmPost[i] =
1649 (PCM_DEC)FX_PCM2PCM_DEC(pTimeData[i]) >> PCM_OUT_HEADROOM;
1648 if ((INT)PCM_OUT_HEADROOM != timeDataHeadroom) {
1649 for (int i = ((self->streamInfo.frameSize *
1650 self->streamInfo.numChannels) -
1651 1);
1652 i >= 0; i--) {
1653 pTimeData2[i] =
1654 (PCM_DEC)pTimeData3[i] >> (PCM_OUT_HEADROOM - timeDataHeadroom);
1655 }
16501656 }
16511657 }
16521658
16681674 reverseOutChannelMap[ch] = ch;
16691675 }
16701676
1677 /* Update sampleRate and frameSize. This may be necessary in case of
1678 * implicit SBR signaling */
1679 FDK_drcDec_SetParam(self->hUniDrcDecoder, DRC_DEC_SAMPLE_RATE,
1680 self->streamInfo.sampleRate);
1681 FDK_drcDec_SetParam(self->hUniDrcDecoder, DRC_DEC_FRAME_SIZE,
1682 self->streamInfo.frameSize);
1683
16711684 /* If SBR and/or MPS is active, the DRC gains are aligned to the QMF
16721685 domain signal before the QMF synthesis. Therefore the DRC gains
16731686 need to be delayed by the QMF synthesis delay. */
16941707 if ((self->streamInfo.numChannels > 1) &&
16951708 (0 || (self->sbrEnabled) || (self->mpsEnableCurr))) {
16961709 /* interleaving/deinterleaving is performed on upper part of
1697 * pTimeDataPcmPost. Check if this buffer is large enough. */
1698 if (timeDataPcmPostSize <
1699 (INT)(2 * self->streamInfo.numChannels *
1700 self->streamInfo.frameSize * sizeof(PCM_DEC))) {
1710 * pTimeData2. Check if this buffer is large enough. */
1711 if (timeData2Size < (INT)(2 * self->streamInfo.numChannels *
1712 self->streamInfo.frameSize)) {
17011713 ErrorStatus = AAC_DEC_UNKNOWN;
17021714 goto bail;
17031715 }
17041716 needsDeinterleaving = 1;
17051717 drcWorkBuffer =
1706 (FIXP_DBL *)pTimeDataPcmPost +
1718 (FIXP_DBL *)pTimeData2 +
17071719 self->streamInfo.numChannels * self->streamInfo.frameSize;
17081720 FDK_deinterleave(
1709 pTimeDataPcmPost, drcWorkBuffer, self->streamInfo.numChannels,
1721 pTimeData2, drcWorkBuffer, self->streamInfo.numChannels,
17101722 self->streamInfo.frameSize, self->streamInfo.frameSize);
17111723 } else {
1712 drcWorkBuffer = (FIXP_DBL *)pTimeDataPcmPost;
1724 drcWorkBuffer = pTimeData2;
17131725 }
17141726
17151727 /* prepare Loudness Normalisation gain */
17441756
17451757 if (needsDeinterleaving) {
17461758 FDK_interleave(
1747 drcWorkBuffer, pTimeDataPcmPost, self->streamInfo.numChannels,
1759 drcWorkBuffer, pTimeData2, self->streamInfo.numChannels,
17481760 self->streamInfo.frameSize, self->streamInfo.frameSize);
1761 }
1762 }
1763 }
1764 if (FDK_drcDec_GetParam(self->hUniDrcDecoder, DRC_DEC_IS_ACTIVE)) {
1765 /* return output loudness information for MPEG-D DRC */
1766 LONG outputLoudness =
1767 FDK_drcDec_GetParam(self->hUniDrcDecoder, DRC_DEC_OUTPUT_LOUDNESS);
1768 if (outputLoudness == DRC_DEC_LOUDNESS_NOT_PRESENT) {
1769 /* no valid MPEG-D DRC loudness value contained */
1770 self->streamInfo.outputLoudness = -1;
1771 } else {
1772 if (outputLoudness > 0) {
1773 /* positive output loudness values (very unusual) are limited to 0
1774 * dB */
1775 self->streamInfo.outputLoudness = 0;
1776 } else {
1777 self->streamInfo.outputLoudness =
1778 -(INT)outputLoudness >>
1779 22; /* negate and scale from e = 7 to e = (31-2) */
1780 }
1781 }
1782 } else {
1783 /* return output loudness information for MPEG-4 DRC */
1784 if (self->streamInfo.drcProgRefLev <
1785 0) { /* no MPEG-4 DRC loudness metadata contained */
1786 self->streamInfo.outputLoudness = -1;
1787 } else {
1788 if (self->defaultTargetLoudness <
1789 0) { /* loudness normalization is off */
1790 self->streamInfo.outputLoudness = self->streamInfo.drcProgRefLev;
1791 } else {
1792 self->streamInfo.outputLoudness = self->defaultTargetLoudness;
17491793 }
17501794 }
17511795 }
17521796
17531797 if (self->streamInfo.extAot != AOT_AAC_SLS) {
17541798 INT pcmLimiterScale = 0;
1799 INT interleaved = 0;
1800 interleaved |= (self->sbrEnabled) ? 1 : 0;
1801 interleaved |= (self->mpsEnableCurr) ? 1 : 0;
17551802 PCMDMX_ERROR dmxErr = PCMDMX_OK;
1756 if (flags & (AACDEC_INTR)) {
1803 if ((flags & AACDEC_INTR) && (accessUnit == 0)) {
17571804 /* delete data from the past (e.g. mixdown coeficients) */
17581805 pcmDmx_Reset(self->hPcmUtils, PCMDMX_RESET_BS_DATA);
17591806 }
17641811 }
17651812 }
17661813
1767 INT interleaved = 0;
1768 interleaved |= (self->sbrEnabled) ? 1 : 0;
1769 interleaved |= (self->mpsEnableCurr) ? 1 : 0;
1770
17711814 /* do PCM post processing */
1772 dmxErr = pcmDmx_ApplyFrame(
1773 self->hPcmUtils, pTimeDataPcmPost, timeDataFixpPcmSize,
1774 self->streamInfo.frameSize, &self->streamInfo.numChannels,
1775 interleaved, self->channelType, self->channelIndices,
1776 &self->mapDescr,
1777 (self->limiterEnableCurr) ? &pcmLimiterScale : NULL);
1815 dmxErr = pcmDmx_ApplyFrame(self->hPcmUtils, pTimeData2, timeData2Size,
1816 self->streamInfo.frameSize,
1817 &self->streamInfo.numChannels, interleaved,
1818 self->channelType, self->channelIndices,
1819 &self->mapDescr, &pcmLimiterScale);
17781820 if (dmxErr == PCMDMX_OUTPUT_BUFFER_TOO_SMALL) {
17791821 ErrorStatus = AAC_DEC_OUTPUT_BUFFER_TOO_SMALL;
17801822 goto bail;
17861828 ErrorStatus = AAC_DEC_DECODE_FRAME_ERROR;
17871829 }
17881830
1831 pcmLimiterScale += PCM_OUT_HEADROOM;
1832
17891833 if (flags & AACDEC_CLRHIST) {
17901834 if (!(self->flags[0] & AC_USAC)) {
1835 /* Reset DRC data */
1836 aacDecoder_drcReset(self->hDrcInfo);
17911837 /* Delete the delayed signal. */
17921838 pcmLimiter_Reset(self->hLimiter);
17931839 }
1840 }
1841
1842 /* Set applyExtGain if DRC processing is enabled and if
1843 progRefLevelPresent is present for the first time. Consequences: The
1844 headroom of the output signal can be set to AACDEC_DRC_GAIN_SCALING
1845 only for audio formats which support legacy DRC Level Normalization.
1846 For all other audio formats the headroom of the output
1847 signal is set to PCM_OUT_HEADROOM. */
1848 if (self->hDrcInfo->enable &&
1849 (self->hDrcInfo->progRefLevelPresent == 1)) {
1850 self->hDrcInfo->applyExtGain |= 1;
1851 }
1852
1853 /* Check whether time data buffer is large enough. */
1854 if (timeDataSize <
1855 (self->streamInfo.numChannels * self->streamInfo.frameSize)) {
1856 ErrorStatus = AAC_DEC_OUTPUT_BUFFER_TOO_SMALL;
1857 goto bail;
17941858 }
17951859
17961860 if (self->limiterEnableCurr) {
18011865 /* Set actual signal parameters */
18021866 pcmLimiter_SetNChannels(self->hLimiter, self->streamInfo.numChannels);
18031867 pcmLimiter_SetSampleRate(self->hLimiter, self->streamInfo.sampleRate);
1804 pcmLimiterScale += PCM_OUT_HEADROOM;
18051868
18061869 if ((self->streamInfo.numChannels == 1) || (self->sbrEnabled) ||
18071870 (self->mpsEnableCurr)) {
1808 pInterleaveBuffer = (PCM_LIM *)pTimeDataPcmPost;
1871 pInterleaveBuffer = (PCM_LIM *)pTimeData2;
18091872 } else {
1810 pInterleaveBuffer = (PCM_LIM *)pTimeData;
1873 pInterleaveBuffer = (PCM_LIM *)self->workBufferCore2;
1874
18111875 /* applyLimiter requests for interleaved data */
18121876 /* Interleave ouput buffer */
1813 FDK_interleave(pTimeDataPcmPost, pInterleaveBuffer,
1877 FDK_interleave(pTimeData2, pInterleaveBuffer,
18141878 self->streamInfo.numChannels, blockLength,
18151879 self->streamInfo.frameSize);
18161880 }
18171881
1882 FIXP_DBL *pGainPerSample = NULL;
1883
1884 if (self->hDrcInfo->enable && self->hDrcInfo->applyExtGain) {
1885 pGainPerSample = self->workBufferCore1;
1886
1887 if ((INT)GetRequiredMemWorkBufferCore1() <
1888 (INT)(self->streamInfo.frameSize * sizeof(FIXP_DBL))) {
1889 ErrorStatus = AAC_DEC_UNKNOWN;
1890 goto bail;
1891 }
1892
1893 pcmLimiterScale = applyDrcLevelNormalization(
1894 self->hDrcInfo, (PCM_DEC *)pInterleaveBuffer, self->extGain,
1895 pGainPerSample, pcmLimiterScale, self->extGainDelay,
1896 self->streamInfo.frameSize, self->streamInfo.numChannels, 1, 1);
1897 }
1898
18181899 pcmLimiter_Apply(self->hLimiter, pInterleaveBuffer, pTimeData,
1819 self->extGain, &pcmLimiterScale, 1,
1820 self->extGainDelay, self->streamInfo.frameSize);
1900 pGainPerSample, pcmLimiterScale,
1901 self->streamInfo.frameSize);
18211902
18221903 {
18231904 /* Announce the additional limiter output delay */
18241905 self->streamInfo.outputDelay += pcmLimiter_GetDelay(self->hLimiter);
18251906 }
18261907 } else {
1908 if (self->hDrcInfo->enable && self->hDrcInfo->applyExtGain) {
1909 pcmLimiterScale = applyDrcLevelNormalization(
1910 self->hDrcInfo, pTimeData2, self->extGain, NULL,
1911 pcmLimiterScale, self->extGainDelay, self->streamInfo.frameSize,
1912 self->streamInfo.numChannels,
1913 (interleaved || (self->streamInfo.numChannels == 1))
1914 ? 1
1915 : self->streamInfo.frameSize,
1916 0);
1917 }
1918
18271919 /* If numChannels = 1 we do not need interleaving. The same applies if
18281920 SBR or MPS are used, since their output is interleaved already
18291921 (resampled or not) */
18301922 if ((self->streamInfo.numChannels == 1) || (self->sbrEnabled) ||
18311923 (self->mpsEnableCurr)) {
18321924 scaleValuesSaturate(
1833 pTimeData, pTimeDataPcmPost,
1925 pTimeData, pTimeData2,
18341926 self->streamInfo.frameSize * self->streamInfo.numChannels,
1835 PCM_OUT_HEADROOM);
1927 pcmLimiterScale);
18361928
18371929 } else {
18381930 scaleValuesSaturate(
1839 (INT_PCM *)self->workBufferCore2, pTimeDataPcmPost,
1931 (INT_PCM *)self->workBufferCore2, pTimeData2,
18401932 self->streamInfo.frameSize * self->streamInfo.numChannels,
1841 PCM_OUT_HEADROOM);
1933 pcmLimiterScale);
18421934 /* Interleave ouput buffer */
18431935 FDK_interleave((INT_PCM *)self->workBufferCore2, pTimeData,
18441936 self->streamInfo.numChannels,
19342026 ErrorStatus = AAC_DEC_UNKNOWN;
19352027 }
19362028
1937 /* Check whether external output buffer is large enough. */
1938 if (timeDataSize_extern <
1939 self->streamInfo.numChannels * self->streamInfo.frameSize) {
1940 ErrorStatus = AAC_DEC_OUTPUT_BUFFER_TOO_SMALL;
1941 }
1942
1943 /* Update external output buffer. */
1944 if (IS_OUTPUT_VALID(ErrorStatus)) {
1945 FDKmemcpy(pTimeData_extern, pTimeData,
1946 self->streamInfo.numChannels * self->streamInfo.frameSize *
1947 sizeof(*pTimeData));
1948 } else {
1949 FDKmemclear(pTimeData_extern,
1950 timeDataSize_extern * sizeof(*pTimeData_extern));
2029 if (!IS_OUTPUT_VALID(ErrorStatus)) {
2030 FDKmemclear(pTimeData, timeDataSize * sizeof(*pTimeData));
19512031 }
19522032
19532033 return ErrorStatus;
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
10141014
10151015 void CBlock_FrequencyToTime(
10161016 CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo,
1017 CAacDecoderChannelInfo *pAacDecoderChannelInfo, FIXP_PCM outSamples[],
1017 CAacDecoderChannelInfo *pAacDecoderChannelInfo, PCM_DEC outSamples[],
10181018 const SHORT frameLen, const int frameOk, FIXP_DBL *pWorkBuffer1,
1019 UINT elFlags, INT elCh) {
1019 const INT aacOutDataHeadroom, UINT elFlags, INT elCh) {
10201020 int fr, fl, tl, nSpec;
10211021
10221022 #if defined(FDK_ASSERT_ENABLE)
12121212 bass_pf_1sf_delay(p2_synth, pitch, pit_gain, frameLen,
12131213 (LpdSfd + 2) * L_SUBFR + BPF_SFD * L_SUBFR,
12141214 frameLen - (LpdSfd + 4) * L_SUBFR, outSamples,
1215 aacOutDataHeadroom,
12151216 pAacDecoderStaticChannelInfo->mem_bpf);
12161217 }
12171218
12351236 ? MLT_FLAG_CURR_ALIAS_SYMMETRY
12361237 : 0);
12371238
1238 scaleValuesSaturate(outSamples, tmp, frameLen, MDCT_OUT_HEADROOM);
1239 scaleValuesSaturate(outSamples, tmp, frameLen,
1240 MDCT_OUT_HEADROOM - aacOutDataHeadroom);
12391241 }
12401242 }
12411243
12501252 #include "ldfiltbank.h"
12511253 void CBlock_FrequencyToTimeLowDelay(
12521254 CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo,
1253 CAacDecoderChannelInfo *pAacDecoderChannelInfo, FIXP_PCM outSamples[],
1255 CAacDecoderChannelInfo *pAacDecoderChannelInfo, PCM_DEC outSamples[],
12541256 const short frameLen) {
12551257 InvMdctTransformLowDelay_fdk(
12561258 SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient),
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
217217 */
218218 void CBlock_FrequencyToTime(
219219 CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo,
220 CAacDecoderChannelInfo *pAacDecoderChannelInfo, FIXP_PCM outSamples[],
220 CAacDecoderChannelInfo *pAacDecoderChannelInfo, PCM_DEC outSamples[],
221221 const SHORT frameLen, const int frameOk, FIXP_DBL *pWorkBuffer1,
222 UINT elFlags, INT elCh);
222 const INT aacOutDataHeadroom, UINT elFlags, INT elCh);
223223
224224 /**
225225 * \brief Transform double lapped MDCT (AAC-ELD) spectral data into time domain.
226226 */
227227 void CBlock_FrequencyToTimeLowDelay(
228228 CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo,
229 CAacDecoderChannelInfo *pAacDecoderChannelInfo, FIXP_PCM outSamples[],
229 CAacDecoderChannelInfo *pAacDecoderChannelInfo, PCM_DEC outSamples[],
230230 const short frameLen);
231231
232232 AAC_DECODER_ERROR CBlock_InverseQuantizeSpectralData(
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
225225
226226 /* TimeDomainFading */
227227 static void CConcealment_TDFadePcmAtt(int start, int len, FIXP_DBL fadeStart,
228 FIXP_DBL fadeStop, FIXP_PCM *pcmdata);
228 FIXP_DBL fadeStop, PCM_DEC *pcmdata);
229229 static void CConcealment_TDFadeFillFadingStations(FIXP_DBL *fadingStations,
230230 int *fadingSteps,
231231 FIXP_DBL fadeStop,
241241
242242 static int CConcealment_TDNoise_Random(ULONG *seed);
243243 static void CConcealment_TDNoise_Apply(CConcealmentInfo *const pConcealmentInfo,
244 const int len, FIXP_PCM *const pcmdata);
244 const int len,
245 const INT aacOutDataHeadroom,
246 PCM_DEC *const pcmdata);
245247
246248 static BLOCK_TYPE CConcealment_GetWinSeq(int prevWinSeq) {
247249 BLOCK_TYPE newWinSeq = BLOCK_LONG;
12271229 int sfb, line = 0;
12281230 int fac_shift;
12291231 int fac_mod;
1230 FIXP_DBL accu;
12311232
12321233 for (sfb = 0; sfb < sfbCnt; sfb++) {
12331234 fac_shift =
12351236 fac_mod = fac_shift & 3;
12361237 fac_shift = (fac_shift >> 2) + 1;
12371238 fac_shift += *pSpecScalePrv - fixMax(*pSpecScalePrv, *pSpecScaleAct);
1239 fac_shift = fMax(fMin(fac_shift, DFRACT_BITS - 1), -(DFRACT_BITS - 1));
12381240
12391241 for (; line < pSfbOffset[sfb + 1]; line++) {
1240 accu = fMult(*(spectrum + line), facMod4Table[fac_mod]);
1241 if (fac_shift < 0) {
1242 accu >>= -fac_shift;
1243 } else {
1244 accu <<= fac_shift;
1245 }
1246 *(spectrum + line) = accu;
1242 FIXP_DBL accu = fMult(*(spectrum + line), facMod4Table[fac_mod]);
1243 *(spectrum + line) = scaleValue(accu, fac_shift);
12471244 }
12481245 }
12491246 *pSpecScaleOut = fixMax(*pSpecScalePrv, *pSpecScaleAct);
16171614 }
16181615
16191616 if (packedSign & 0x1) {
1620 spec[i] = -spec[i];
1617 spec[i] = -fMax(spec[i], (FIXP_DBL)(MINVAL_DBL + 1));
16211618 }
16221619 packedSign >>= 1;
16231620
18481845
18491846 INT CConcealment_TDFading(
18501847 int len, CAacDecoderStaticChannelInfo **ppAacDecoderStaticChannelInfo,
1851 FIXP_PCM *pcmdata, FIXP_PCM *pcmdata_1) {
1848 const INT aacOutDataHeadroom, PCM_DEC *pcmdata, PCM_DEC *pcmdata_1) {
18521849 /*
18531850 Do the fading in Time domain based on concealment states and core mode
18541851 */
19611958 start += len;
19621959 }
19631960 }
1964 CConcealment_TDNoise_Apply(pConcealmentInfo, len, pcmdata);
1961 CConcealment_TDNoise_Apply(pConcealmentInfo, len, aacOutDataHeadroom,
1962 pcmdata);
19651963
19661964 /* Save end-of-frame attenuation and fading type */
19671965 pConcealmentInfo->lastFadingType = fadingType;
19731971
19741972 /* attenuate pcmdata in Time Domain Fading process */
19751973 static void CConcealment_TDFadePcmAtt(int start, int len, FIXP_DBL fadeStart,
1976 FIXP_DBL fadeStop, FIXP_PCM *pcmdata) {
1974 FIXP_DBL fadeStop, PCM_DEC *pcmdata) {
19771975 int i;
19781976 FIXP_DBL dStep;
19791977 FIXP_DBL dGain;
19801978 FIXP_DBL dGain_apply;
1981 int bitshift = (DFRACT_BITS - SAMPLE_BITS);
19821979
19831980 /* set start energy */
19841981 dGain = fadeStart;
19911988 */
19921989 dGain_apply = fMax((FIXP_DBL)0, dGain);
19931990 /* finally, attenuate samples */
1994 pcmdata[i] = (FIXP_PCM)((fMult(pcmdata[i], (dGain_apply))) >> bitshift);
1991 pcmdata[i] = FIXP_DBL2PCM_DEC(fMult(pcmdata[i], dGain_apply));
19951992 }
19961993 }
19971994
20542051 }
20552052
20562053 static void CConcealment_TDNoise_Apply(CConcealmentInfo *const pConcealmentInfo,
2057 const int len, FIXP_PCM *const pcmdata) {
2058 FIXP_PCM *states = pConcealmentInfo->TDNoiseStates;
2059 FIXP_PCM noiseVal;
2054 const int len,
2055 const INT aacOutDataHeadroom,
2056 PCM_DEC *const pcmdata) {
2057 PCM_DEC *states = pConcealmentInfo->TDNoiseStates;
2058 PCM_DEC noiseVal;
20602059 FIXP_DBL noiseValLong;
20612060 FIXP_SGL *coef = pConcealmentInfo->TDNoiseCoef;
20622061 FIXP_DBL TDNoiseAtt;
20742073 /* create filtered noise */
20752074 states[2] = states[1];
20762075 states[1] = states[0];
2077 states[0] = ((FIXP_PCM)CConcealment_TDNoise_Random(&seed));
2076 states[0] =
2077 FIXP_DBL2PCM_DEC((FIXP_DBL)CConcealment_TDNoise_Random(&seed));
20782078 noiseValLong = fMult(states[0], coef[0]) + fMult(states[1], coef[1]) +
20792079 fMult(states[2], coef[2]);
2080 noiseVal = FX_DBL2FX_PCM(fMult(noiseValLong, TDNoiseAtt));
2080 noiseVal = FIXP_DBL2PCM_DEC(fMult(noiseValLong, TDNoiseAtt) >>
2081 aacOutDataHeadroom);
20812082
20822083 /* add filtered noise - check for clipping, before */
2083 if (noiseVal > (FIXP_PCM)0 &&
2084 pcmdata[ii] > (FIXP_PCM)MAXVAL_FIXP_PCM - noiseVal) {
2085 noiseVal = noiseVal * (FIXP_PCM)-1;
2086 } else if (noiseVal < (FIXP_PCM)0 &&
2087 pcmdata[ii] < (FIXP_PCM)MINVAL_FIXP_PCM - noiseVal) {
2088 noiseVal = noiseVal * (FIXP_PCM)-1;
2084 if (noiseVal > (PCM_DEC)0 &&
2085 pcmdata[ii] > (PCM_DEC)MAXVAL_PCM_DEC - noiseVal) {
2086 noiseVal = noiseVal * (PCM_DEC)-1;
2087 } else if (noiseVal < (PCM_DEC)0 &&
2088 pcmdata[ii] < (PCM_DEC)MINVAL_PCM_DEC - noiseVal) {
2089 noiseVal = noiseVal * (PCM_DEC)-1;
20892090 }
20902091
20912092 pcmdata[ii] += noiseVal;
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
146146
147147 INT CConcealment_TDFading(
148148 int len, CAacDecoderStaticChannelInfo **ppAacDecoderStaticChannelInfo,
149 FIXP_PCM *pcmdata, FIXP_PCM *pcmdata_1);
149 const INT aacOutDataHeadroom, PCM_DEC *pcmdata, PCM_DEC *pcmdata_1);
150150
151151 #endif /* #ifndef CONCEAL_H */
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
193193 FIXP_DBL last_tcx_gain;
194194 INT last_tcx_gain_e;
195195 ULONG TDNoiseSeed;
196 FIXP_PCM TDNoiseStates[3];
196 PCM_DEC TDNoiseStates[3];
197197 FIXP_SGL TDNoiseCoef[3];
198198 FIXP_SGL TDNoiseAtt;
199199
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
111111 #if defined(__arm__)
112112 #endif
113113
114 static void multE2_DinvF_fdk(FIXP_PCM *output, FIXP_DBL *x, const FIXP_WTB *fb,
114 static void multE2_DinvF_fdk(PCM_DEC *output, FIXP_DBL *x, const FIXP_WTB *fb,
115115 FIXP_DBL *z, const int N) {
116116 int i;
117117
118 /* scale for FIXP_DBL -> INT_PCM conversion. */
119 const int scale = (DFRACT_BITS - SAMPLE_BITS) - LDFB_HEADROOM;
120 #if ((DFRACT_BITS - SAMPLE_BITS - LDFB_HEADROOM) > 0)
118 /* scale for FIXP_DBL -> PCM_DEC conversion: */
119 const int scale = (DFRACT_BITS - PCM_OUT_BITS) - LDFB_HEADROOM + (3);
120
121 #if ((DFRACT_BITS - PCM_OUT_BITS - LDFB_HEADROOM + (3) - 1) > 0)
121122 FIXP_DBL rnd_val_wts0 = (FIXP_DBL)0;
122123 FIXP_DBL rnd_val_wts1 = (FIXP_DBL)0;
124 #if ((DFRACT_BITS - PCM_OUT_BITS - LDFB_HEADROOM + (3) - WTS0 - 1) > 0)
123125 if (-WTS0 - 1 + scale)
124126 rnd_val_wts0 = (FIXP_DBL)(1 << (-WTS0 - 1 + scale - 1));
127 #endif
125128 if (-WTS1 - 1 + scale)
126129 rnd_val_wts1 = (FIXP_DBL)(1 << (-WTS1 - 1 + scale - 1));
127130 #endif
130133 FIXP_DBL z0, z2, tmp;
131134
132135 z2 = x[N / 2 + i];
133 z0 = z2 + (fMultDiv2(z[N / 2 + i], fb[2 * N + i]) >> (-WTS2 - 1));
134
135 z[N / 2 + i] = x[N / 2 - 1 - i] +
136 (fMultDiv2(z[N + i], fb[2 * N + N / 2 + i]) >> (-WTS2 - 1));
136 z0 = fAddSaturate(z2,
137 (fMultDiv2(z[N / 2 + i], fb[2 * N + i]) >> (-WTS2 - 1)));
138
139 z[N / 2 + i] = fAddSaturate(
140 x[N / 2 - 1 - i],
141 (fMultDiv2(z[N + i], fb[2 * N + N / 2 + i]) >> (-WTS2 - 1)));
137142
138143 tmp = (fMultDiv2(z[N / 2 + i], fb[N + N / 2 - 1 - i]) +
139144 fMultDiv2(z[i], fb[N + N / 2 + i]));
140145
141 #if ((DFRACT_BITS - SAMPLE_BITS - LDFB_HEADROOM) > 0)
146 #if ((DFRACT_BITS - PCM_OUT_BITS - LDFB_HEADROOM + (3) - 1) > 0)
142147 FDK_ASSERT((-WTS1 - 1 + scale) >= 0);
143148 FDK_ASSERT(tmp <= ((FIXP_DBL)0x7FFFFFFF -
144149 rnd_val_wts1)); /* rounding must not cause overflow */
145 output[(N * 3 / 4 - 1 - i)] = (FIXP_PCM)SATURATE_RIGHT_SHIFT(
150 output[(N * 3 / 4 - 1 - i)] = (PCM_DEC)SATURATE_RIGHT_SHIFT(
146151 tmp + rnd_val_wts1, -WTS1 - 1 + scale, PCM_OUT_BITS);
147152 #else
148153 FDK_ASSERT((WTS1 + 1 - scale) >= 0);
149154 output[(N * 3 / 4 - 1 - i)] =
150 (FIXP_PCM)SATURATE_LEFT_SHIFT(tmp, WTS1 + 1 - scale, PCM_OUT_BITS);
155 (PCM_DEC)SATURATE_LEFT_SHIFT(tmp, WTS1 + 1 - scale, PCM_OUT_BITS);
151156 #endif
152157
153158 z[i] = z0;
158163 FIXP_DBL z0, z2, tmp0, tmp1;
159164
160165 z2 = x[N / 2 + i];
161 z0 = z2 + (fMultDiv2(z[N / 2 + i], fb[2 * N + i]) >> (-WTS2 - 1));
162
163 z[N / 2 + i] = x[N / 2 - 1 - i] +
164 (fMultDiv2(z[N + i], fb[2 * N + N / 2 + i]) >> (-WTS2 - 1));
166 z0 = fAddSaturate(z2,
167 (fMultDiv2(z[N / 2 + i], fb[2 * N + i]) >> (-WTS2 - 1)));
168
169 z[N / 2 + i] = fAddSaturate(
170 x[N / 2 - 1 - i],
171 (fMultDiv2(z[N + i], fb[2 * N + N / 2 + i]) >> (-WTS2 - 1)));
165172
166173 tmp0 = (fMultDiv2(z[N / 2 + i], fb[N / 2 - 1 - i]) +
167174 fMultDiv2(z[i], fb[N / 2 + i]));
168175 tmp1 = (fMultDiv2(z[N / 2 + i], fb[N + N / 2 - 1 - i]) +
169176 fMultDiv2(z[i], fb[N + N / 2 + i]));
170177
171 #if ((DFRACT_BITS - SAMPLE_BITS - LDFB_HEADROOM) > 0)
178 #if ((DFRACT_BITS - PCM_OUT_BITS - LDFB_HEADROOM + (3) - 1) > 0)
172179 FDK_ASSERT((-WTS0 - 1 + scale) >= 0);
173180 FDK_ASSERT(tmp0 <= ((FIXP_DBL)0x7FFFFFFF -
174181 rnd_val_wts0)); /* rounding must not cause overflow */
175182 FDK_ASSERT(tmp1 <= ((FIXP_DBL)0x7FFFFFFF -
176183 rnd_val_wts1)); /* rounding must not cause overflow */
177 output[(i - N / 4)] = (FIXP_PCM)SATURATE_RIGHT_SHIFT(
184 output[(i - N / 4)] = (PCM_DEC)SATURATE_RIGHT_SHIFT(
178185 tmp0 + rnd_val_wts0, -WTS0 - 1 + scale, PCM_OUT_BITS);
179 output[(N * 3 / 4 - 1 - i)] = (FIXP_PCM)SATURATE_RIGHT_SHIFT(
186 output[(N * 3 / 4 - 1 - i)] = (PCM_DEC)SATURATE_RIGHT_SHIFT(
180187 tmp1 + rnd_val_wts1, -WTS1 - 1 + scale, PCM_OUT_BITS);
181188 #else
182189 FDK_ASSERT((WTS0 + 1 - scale) >= 0);
183190 output[(i - N / 4)] =
184 (FIXP_PCM)SATURATE_LEFT_SHIFT(tmp0, WTS0 + 1 - scale, PCM_OUT_BITS);
191 (PCM_DEC)SATURATE_LEFT_SHIFT(tmp0, WTS0 + 1 - scale, PCM_OUT_BITS);
185192 output[(N * 3 / 4 - 1 - i)] =
186 (FIXP_PCM)SATURATE_LEFT_SHIFT(tmp1, WTS1 + 1 - scale, PCM_OUT_BITS);
193 (PCM_DEC)SATURATE_LEFT_SHIFT(tmp1, WTS1 + 1 - scale, PCM_OUT_BITS);
187194 #endif
188195 z[i] = z0;
189196 z[N + i] = z2;
193200 for (i = 0; i < N / 4; i++) {
194201 FIXP_DBL tmp0 = fMultDiv2(z[i], fb[N / 2 + i]);
195202
196 #if ((DFRACT_BITS - SAMPLE_BITS - LDFB_HEADROOM) > 0)
203 #if ((DFRACT_BITS - PCM_OUT_BITS - LDFB_HEADROOM + (3) - 1) > 0)
197204 FDK_ASSERT((-WTS0 - 1 + scale) >= 0);
198205 FDK_ASSERT(tmp0 <= ((FIXP_DBL)0x7FFFFFFF -
199206 rnd_val_wts0)); /* rounding must not cause overflow */
200 output[(N * 3 / 4 + i)] = (FIXP_PCM)SATURATE_RIGHT_SHIFT(
207 output[(N * 3 / 4 + i)] = (PCM_DEC)SATURATE_RIGHT_SHIFT(
201208 tmp0 + rnd_val_wts0, -WTS0 - 1 + scale, PCM_OUT_BITS);
202209 #else
203210 FDK_ASSERT((WTS0 + 1 - scale) >= 0);
204211 output[(N * 3 / 4 + i)] =
205 (FIXP_PCM)SATURATE_LEFT_SHIFT(tmp0, WTS0 + 1 - scale, PCM_OUT_BITS);
212 (PCM_DEC)SATURATE_LEFT_SHIFT(tmp0, WTS0 + 1 - scale, PCM_OUT_BITS);
206213 #endif
207214 }
208215 }
209216
210217 int InvMdctTransformLowDelay_fdk(FIXP_DBL *mdctData, const int mdctData_e,
211 FIXP_PCM *output, FIXP_DBL *fs_buffer,
218 PCM_DEC *output, FIXP_DBL *fs_buffer,
212219 const int N) {
213220 const FIXP_WTB *coef;
214221 FIXP_DBL gain = (FIXP_DBL)0;
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
103103 #define LDFILTBANK_H
104104
105105 #include "common_fix.h"
106 #include "aac_rom.h"
106107
107108 int InvMdctTransformLowDelay_fdk(FIXP_DBL *mdctdata_m, const int mdctdata_e,
108 FIXP_PCM *mdctOut, FIXP_DBL *fs_buffer,
109 PCM_DEC *mdctOut, FIXP_DBL *fs_buffer,
109110 const int frameLength);
110111
111112 #endif
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
806806 for (int i = 0; i < windowLen; i++) {
807807 dmx_re_prev[i] =
808808 ((staticSpectralCoeffsL[index_offset + i] >>
809 srLeftChan) +
809 fMin(DFRACT_BITS - 1, srLeftChan + 1)) +
810810 (staticSpectralCoeffsR[index_offset + i] >>
811 srRightChan)) >>
812 1;
811 fMin(DFRACT_BITS - 1, srRightChan + 1)));
813812 }
814813 } else {
815814 for (int i = 0; i < windowLen; i++) {
816815 dmx_re_prev[i] =
817816 ((staticSpectralCoeffsL[index_offset + i] >>
818 srLeftChan) -
817 fMin(DFRACT_BITS - 1, srLeftChan + 1)) -
819818 (staticSpectralCoeffsR[index_offset + i] >>
820 srRightChan)) >>
821 1;
819 fMin(DFRACT_BITS - 1, srRightChan + 1)));
822820 }
823821 }
824822 }
853851 if (window == 0) {
854852 if (dmx_re_prev_e < frameMaxScale) {
855853 if (mainband_flag == 0) {
856 scaleValues(dmx_re_prev, store_dmx_re_prev, windowLen,
857 -(frameMaxScale - dmx_re_prev_e));
854 scaleValues(
855 dmx_re_prev, store_dmx_re_prev, windowLen,
856 -fMin(DFRACT_BITS - 1, (frameMaxScale - dmx_re_prev_e)));
858857 } else {
859 for (int i = 0; i < windowLen; i++) {
860 dmx_re_prev[i] >>= (frameMaxScale - dmx_re_prev_e);
861 }
858 scaleValues(
859 dmx_re_prev, windowLen,
860 -fMin(DFRACT_BITS - 1, (frameMaxScale - dmx_re_prev_e)));
862861 }
863862 } else {
864863 if (mainband_flag == 0) {
872871 FDK_ASSERT(pAacDecoderChannelInfo[L]->icsInfo.WindowSequence ==
873872 BLOCK_SHORT);
874873 if (specScaleL[window - 1] < frameMaxScale) {
875 for (int i = 0; i < windowLen; i++) {
876 dmx_re[windowLen * (window - 1) + i] >>=
877 (frameMaxScale - specScaleL[window - 1]);
878 }
874 scaleValues(&dmx_re[windowLen * (window - 1)], windowLen,
875 -fMin(DFRACT_BITS - 1,
876 (frameMaxScale - specScaleL[window - 1])));
879877 } else {
880878 specScaleL[window] = specScaleL[window - 1];
881879 specScaleR[window] = specScaleR[window - 1];
990988 } /* if ( pJointStereoData->complex_coef == 1 ) */
991989
992990 /* 4. upmix process */
993 INT pred_dir = cplxPredictionData->pred_dir ? -1 : 1;
991 LONG pred_dir = cplxPredictionData->pred_dir ? -1 : 1;
994992 /* 0.1 in Q-3.34 */
995993 const FIXP_DBL pointOne = 0x66666666; /* 0.8 */
996994 /* Shift value for the downmix */
10401038 the downmix. "dmx_re" and "specL" are two different pointers
10411039 pointing to separate arrays, which may or may not contain the
10421040 same data (with different scaling).
1041
1042 specL[i] = + (specL[i] + side);
1043 specR[i] = -/+ (specL[i] - side);
10431044 */
1044
1045 /* help1: alpha_re[i] * dmx_re[i] */
1046 FIXP_DBL help1 = fMultDiv2(alpha_re_tmp, *p2dmxRe++);
1047
1048 /* tmp: dmx_im[i] */
1049 FIXP_DBL tmp = (*p2dmxIm++) << shift_dmx;
1050
1051 /* help2: alpha_im[i] * dmx_im[i] */
1052 FIXP_DBL help2 = fMultDiv2(alpha_im_tmp, tmp);
1053
1054 /* help3: alpha_re[i] * dmx_re[i] + alpha_im[i] * dmx_im[i] */
1055 FIXP_DBL help3 = help1 + help2;
1056
1057 /* side (= help4) = specR[i] - (dmx_re[i] * specL[i] + alpha_im[i]
1058 * * dmx_im[i]) */
1059 FIXP_DBL help4 = *p2CoeffR - scaleValue(help3, help3_shift);
1060
1061 /* We calculate the left and right output by using the helper
1062 * function */
1063 /* specR[i] = -/+ (specL[i] - side); */
1064 *p2CoeffR =
1065 (FIXP_DBL)((LONG)(*p2CoeffL - help4) * (LONG)pred_dir);
1066 p2CoeffR++;
1067
1068 /* specL[i] = specL[i] + side; */
1069 *p2CoeffL = *p2CoeffL + help4;
1070 p2CoeffL++;
1045 FIXP_DBL side, left, right;
1046
1047 side = fMultAddDiv2(fMultDiv2(alpha_re_tmp, *p2dmxRe++),
1048 alpha_im_tmp, (*p2dmxIm++) << shift_dmx);
1049 side = ((*p2CoeffR) >> 2) -
1050 (FIXP_DBL)SATURATE_SHIFT(side, -(help3_shift - 2),
1051 DFRACT_BITS - 2);
1052
1053 left = ((*p2CoeffL) >> 2) + side;
1054 right = ((*p2CoeffL) >> 2) - side;
1055 right = (FIXP_DBL)((LONG)right * pred_dir);
1056
1057 *p2CoeffL++ = SATURATE_LEFT_SHIFT_ALT(left, 2, DFRACT_BITS);
1058 *p2CoeffR++ = SATURATE_LEFT_SHIFT_ALT(right, 2, DFRACT_BITS);
10711059 }
10721060 }
10731061
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
130130 int i;
131131
132132 for (i = 0; i < L; i++) {
133 out[i] = in[i] - fMult(PREEMPH_FAC, in[i - 1]);
133 out[i] = fAddSaturate(in[i], -fMult(PREEMPH_FAC, in[i - 1]));
134134 }
135135
136136 return;
464464 /* Note: code[L_SUBFR] and exc2[L_SUBFR] share the same memory!
465465 If exc2[i] is written, code[i] will be destroyed!
466466 */
467 #define SF (SF_CODE + SF_GAIN_C + 1 - SF_EXC)
467 #define SF_HEADROOM (1)
468 #define SF (SF_CODE + SF_GAIN_C + 1 - SF_EXC - SF_HEADROOM)
469 #define SF_GAIN_P2 (SF_GAIN_P - SF_HEADROOM)
468470
469471 int i;
470472 FIXP_DBL tmp, cpe, code_smooth_prev, code_smooth;
476478 cpe = (period_fac >> (2 - SF_PFAC)) + FL2FXCONST_DBL(0.25f);
477479
478480 /* u'(n) */
479 tmp = fMultDiv2(*exc, gain_pit) << (SF_GAIN_P + 1); /* v(0)*g_p */
480 *exc++ = tmp + (fMultDiv2(code[0], gain_code) << SF);
481 tmp = fMultDiv2(*exc, gain_pit) << (SF_GAIN_P2 + 1); /* v(0)*g_p */
482 *exc++ = (tmp + (fMultDiv2(code[0], gain_code) << SF)) << SF_HEADROOM;
481483
482484 /* u(n) */
483485 code_smooth_prev = fMultDiv2(*code++, gain_code_smoothed)
486488 code_smooth = fMultDiv2(code_i, gain_code_smoothed) << SF; /* c(1) * g_sc */
487489 tmp += code_smooth_prev; /* tmp = v(0)*g_p + c(0)*g_sc */
488490 cpe_code_smooth = fMultDiv2(cpe, code_smooth);
489 *exc2++ = tmp - cpe_code_smooth;
491 *exc2++ = (tmp - cpe_code_smooth) << SF_HEADROOM;
490492 cpe_code_smooth_prev = fMultDiv2(cpe, code_smooth_prev);
491493
492494 i = L_SUBFR - 2;
493495 do /* ARM926: 22 cycles per iteration */
494496 {
495497 /* u'(n) */
496 tmp = fMultDiv2(*exc, gain_pit) << (SF_GAIN_P + 1);
497 *exc++ = tmp + (fMultDiv2(code_i, gain_code) << SF);
498 tmp = fMultDiv2(*exc, gain_pit) << (SF_GAIN_P2 + 1);
499 *exc++ = (tmp + (fMultDiv2(code_i, gain_code) << SF)) << SF_HEADROOM;
498500 /* u(n) */
499501 tmp += code_smooth; /* += g_sc * c(i) */
500502 tmp -= cpe_code_smooth_prev;
502504 code_i = *code++;
503505 code_smooth = fMultDiv2(code_i, gain_code_smoothed) << SF;
504506 cpe_code_smooth = fMultDiv2(cpe, code_smooth);
505 *exc2++ = tmp - cpe_code_smooth; /* tmp - c_pe * g_sc * c(i+1) */
507 *exc2++ = (tmp - cpe_code_smooth)
508 << SF_HEADROOM; /* tmp - c_pe * g_sc * c(i+1) */
506509 } while (--i != 0);
507510
508511 /* u'(n) */
509 tmp = fMultDiv2(*exc, gain_pit) << (SF_GAIN_P + 1);
510 *exc = tmp + (fMultDiv2(code_i, gain_code) << SF);
512 tmp = fMultDiv2(*exc, gain_pit) << (SF_GAIN_P2 + 1);
513 *exc = (tmp + (fMultDiv2(code_i, gain_code) << SF)) << SF_HEADROOM;
511514 /* u(n) */
512515 tmp += code_smooth;
513516 tmp -= cpe_code_smooth_prev;
514 *exc2++ = tmp;
517 *exc2++ = tmp << SF_HEADROOM;
515518
516519 return;
517520 }
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
343343 /* Overlap Add */
344344 x0 = -fMult(*pOvl--, pWindow[i].v.re);
345345
346 *pOut0 += IMDCT_SCALE_DBL(x0);
346 *pOut0 = fAddSaturate(*pOut0, IMDCT_SCALE_DBL(x0));
347347 pOut0++;
348348 }
349349 } else {
353353 /* Overlap Add */
354354 x0 = fMult(*pOvl--, pWindow[i].v.re);
355355
356 *pOut0 += IMDCT_SCALE_DBL(x0);
356 *pOut0 = fAddSaturate(*pOut0, IMDCT_SCALE_DBL(x0));
357357 pOut0++;
358358 }
359359 }
361361 0) { /* this should only happen for ACELP -> TCX20 -> ACELP transition */
362362 FIXP_DBL *pOut = pOut0 - fl / 2; /* fl/2 == fac_length */
363363 for (i = 0; i < fl / 2; i++) {
364 pOut[i] += IMDCT_SCALE_DBL(hMdct->pFacZir[i]);
364 pOut[i] = fAddSaturate(pOut[i], IMDCT_SCALE_DBL(hMdct->pFacZir[i]));
365365 }
366366 hMdct->pFacZir = NULL;
367367 }
492492 /* Div2 is compensated by table scaling */
493493 x = fMultDiv2(pTmp2[i], FacWindowZir[w]);
494494 x += fMultDiv2(pTmp1[-i - 1], FacWindowSynth[w]);
495 x += pFAC_and_FAC_ZIR[i];
496 pOut1[i] = x;
497
495 pOut1[i] = fAddSaturate(x, pFAC_and_FAC_ZIR[i]);
498496 w++;
499497 }
500498 }
551549 FDK_ASSERT((pOut1 >= hMdct->overlap.time &&
552550 pOut1 < hMdct->overlap.time + hMdct->ov_size) ||
553551 (pOut1 >= output && pOut1 < output + 1024));
554 *pOut1 += IMDCT_SCALE_DBL(-x1);
552 *pOut1 = fAddSaturate(*pOut1, IMDCT_SCALE_DBL(-x1));
555553 pOut1--;
556554 }
557555
577575 FIXP_DBL x = -(*pCurr--);
578576 /* 5) (item 4) Synthesis filter Zir component, FAC ZIR (another one). */
579577 if (i < f_len) {
580 x += *pF++;
578 x = fAddSaturate(x, *pF++);
581579 }
582580
583581 FDK_ASSERT((pOut1 >= hMdct->overlap.time &&
667665 for (i = 0; i < fl / 2; i++) {
668666 FIXP_DBL x0, x1;
669667
670 cplxMult(&x1, &x0, *pCurr++, -*pOvl--, pWindow_prev[i]);
671 *pOut0 = IMDCT_SCALE_DBL(x0);
672 *pOut1 = IMDCT_SCALE_DBL(-x1);
668 cplxMultDiv2(&x1, &x0, *pCurr++, -*pOvl--, pWindow_prev[i]);
669 *pOut0 = IMDCT_SCALE_DBL_LSH1(x0);
670 *pOut1 = IMDCT_SCALE_DBL_LSH1(-x1);
673671 pOut0++;
674672 pOut1--;
675673 }
679677 for (i = 0; i < fl / 2; i++) {
680678 FIXP_DBL x0, x1;
681679
682 cplxMult(&x1, &x0, *pCurr++, -*pOvl--, pWindow_prev[i]);
683 *pOut0 = IMDCT_SCALE_DBL(x0);
684 *pOut1 = IMDCT_SCALE_DBL(x1);
680 cplxMultDiv2(&x1, &x0, *pCurr++, -*pOvl--, pWindow_prev[i]);
681 *pOut0 = IMDCT_SCALE_DBL_LSH1(x0);
682 *pOut1 = IMDCT_SCALE_DBL_LSH1(x1);
685683 pOut0++;
686684 pOut1--;
687685 }
690688 for (i = 0; i < fl / 2; i++) {
691689 FIXP_DBL x0, x1;
692690
693 cplxMult(&x1, &x0, *pCurr++, *pOvl--, pWindow_prev[i]);
694 *pOut0 = IMDCT_SCALE_DBL(x0);
695 *pOut1 = IMDCT_SCALE_DBL(x1);
691 cplxMultDiv2(&x1, &x0, *pCurr++, *pOvl--, pWindow_prev[i]);
692 *pOut0 = IMDCT_SCALE_DBL_LSH1(x0);
693 *pOut1 = IMDCT_SCALE_DBL_LSH1(x1);
696694 pOut0++;
697695 pOut1--;
698696 }
704702 FIXP_DBL *pOut = pOut0 - fl / 2;
705703 FDK_ASSERT(fl / 2 <= 128);
706704 for (i = 0; i < fl / 2; i++) {
707 pOut[i] += IMDCT_SCALE_DBL(hMdct->pFacZir[i]);
705 pOut[i] = fAddSaturate(pOut[i], IMDCT_SCALE_DBL(hMdct->pFacZir[i]));
708706 }
709707 hMdct->pFacZir = NULL;
710708 }
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
230230 void RE8_PPV(FIXP_ZF x[], SHORT y[], int r) {
231231 int i, y0[8], y1[8];
232232 FIXP_ZF x1[8], tmp;
233 FIXP_DBL e;
233 INT64 e;
234234
235235 /* find the nearest neighbor y0 of x in 2D8 */
236236 nearest_neighbor_2D8(x, y0);
244244 }
245245
246246 /* compute e0=||x-y0||^2 and e1=||x-y1||^2 */
247 e = (FIXP_DBL)0;
247 e = 0;
248248 for (i = 0; i < 8; i++) {
249249 tmp = x[i] - INT2ZF(y0[i], 0);
250 e += fPow2Div2(
250 e += (INT64)fPow2Div2(
251251 tmp << r); /* shift left to ensure that no fract part bits get lost. */
252252 tmp = x[i] - INT2ZF(y1[i], 0);
253 e -= fPow2Div2(tmp << r);
253 e -= (INT64)fPow2Div2(tmp << r);
254254 }
255255 /* select best candidate y0 or y1 to minimize distortion */
256 if (e < (FIXP_DBL)0) {
256 if (e < 0) {
257257 for (i = 0; i < 8; i++) {
258258 y[i] = y0[i];
259259 }
564564 /* add non-weighted residual LSF vector to LSF1st */
565565 for (i = 0; i < M_LP_FILTER_ORDER; i++) {
566566 w = (LONG)fMultDiv2(factor, sqrtFixp(fMult(d[i], d[i + 1])));
567 lsfq[i] = fAddSaturate(lsfq[i], FX_DBL2FX_LPC((FIXP_DBL)(w * (LONG)xq[i])));
567 lsfq[i] = fAddSaturate(lsfq[i],
568 FX_DBL2FX_LPC((FIXP_DBL)((INT64)w * (LONG)xq[i])));
568569 }
569570
570571 return;
11371138 for (i = 2; i <= n; i++) {
11381139 plsp += 2;
11391140 b = -FX_LPC2FX_DBL(*plsp);
1140 f[i] = ((fMultDiv2(b, f[i - 1]) << 1) + (f[i - 2])) << 1;
1141 f[i] = SATURATE_LEFT_SHIFT((fMultDiv2(b, f[i - 1]) + (f[i - 2] >> 1)), 2,
1142 DFRACT_BITS);
11411143 for (j = i - 1; j > 1; j--) {
1142 f[j] = f[j] + (fMultDiv2(b, f[j - 1]) << 2) + f[j - 2];
1144 f[j] = SATURATE_LEFT_SHIFT(
1145 ((f[j] >> 2) + fMultDiv2(b, f[j - 1]) + (f[j - 2] >> 2)), 2,
1146 DFRACT_BITS);
11431147 }
11441148 f[1] = f[1] + (b >> (SF_F - 1));
11451149 }
11661170 /*-----------------------------------------------------*
11671171 * Multiply F1(z) by (1+z^-1) and F2(z) by (1-z^-1) *
11681172 *-----------------------------------------------------*/
1173 scaleValues(f1, NC + 1, -2);
1174 scaleValues(f2, NC + 1, -2);
1175
11691176 for (i = NC; i > 0; i--) {
11701177 f1[i] += f1[i - 1];
11711178 f2[i] -= f2[i - 1];
11741181 FIXP_DBL aDBL[M_LP_FILTER_ORDER];
11751182
11761183 for (i = 1, k = M_LP_FILTER_ORDER - 1; i <= NC; i++, k--) {
1177 FIXP_DBL tmp1, tmp2;
1178
1179 tmp1 = f1[i] >> 1;
1180 tmp2 = f2[i] >> 1;
1181
1182 aDBL[i - 1] = (tmp1 + tmp2);
1183 aDBL[k] = (tmp1 - tmp2);
1184 aDBL[i - 1] = f1[i] + f2[i];
1185 aDBL[k] = f1[i] - f2[i];
11841186 }
11851187
11861188 int headroom_a = getScalefactor(aDBL, M_LP_FILTER_ORDER);
11891191 a[i] = FX_DBL2FX_LPC(aDBL[i] << headroom_a);
11901192 }
11911193
1192 *a_exp = 8 - headroom_a;
1193 }
1194 *a_exp = SF_F + (2 - 1) - headroom_a;
1195 }
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
121121
122122 #include "ac_arith_coder.h"
123123
124 void filtLP(const FIXP_DBL *syn, FIXP_PCM *syn_out, FIXP_DBL *noise,
125 const FIXP_SGL *filt, INT stop, int len) {
124 void filtLP(const FIXP_DBL *syn, PCM_DEC *syn_out, FIXP_DBL *noise,
125 const FIXP_SGL *filt, const INT aacOutDataHeadroom, INT stop,
126 int len) {
126127 INT i, j;
127128 FIXP_DBL tmp;
129
130 FDK_ASSERT((aacOutDataHeadroom - 1) >= -(MDCT_OUTPUT_SCALE));
128131
129132 for (i = 0; i < stop; i++) {
130133 tmp = fMultDiv2(noise[i], filt[0]); // Filt in Q-1.16
131134 for (j = 1; j <= len; j++) {
132 tmp += fMultDiv2((noise[i - j] + noise[i + j]), filt[j]);
133 }
134 syn_out[i] = (FIXP_PCM)(IMDCT_SCALE(syn[i] - tmp));
135 tmp += fMult((noise[i - j] >> 1) + (noise[i + j] >> 1), filt[j]);
136 }
137 syn_out[i] = (PCM_DEC)(
138 IMDCT_SCALE((syn[i] >> 1) - (tmp >> 1), aacOutDataHeadroom - 1));
135139 }
136140 }
137141
141145 FIXP_DBL *pit_gain,
142146 const int frame_length, /* (i) : frame length (should be 768|1024) */
143147 const INT l_frame,
144 const INT l_next, /* (i) : look ahead for symmetric filtering */
145 FIXP_PCM *synth_out, /* (o) : filtered synthesis (with delay of 1 subfr) */
148 const INT l_next, /* (i) : look ahead for symmetric filtering */
149 PCM_DEC *synth_out, /* (o) : filtered synthesis (with delay of 1 subfr) */
150 const INT aacOutDataHeadroom, /* (i) : headroom of the output time signal to
151 prevent clipping */
146152 FIXP_DBL mem_bpf[]) /* i/o : memory state [L_FILT+L_SUBFR] */
147153 {
148154 INT i, sf, i_subfr, T, T2, lg;
334340
335341 {
336342 for (i = 0; i < lg; i++) {
337 /* scaled with SF_SYNTH + gain_sf + 1 */
343 /* scaled with SF_SYNTH + gain_sf + 1; composition of scalefactor 2:
344 * one additional shift of syn values + fMult => fMultDiv2 */
338345 noise_in[i] =
339 (fMult(gainSGL, syn[i + i_subfr] - (syn[i + i_subfr - T] >> 1) -
340 (syn[i + i_subfr + T] >> 1))) >>
341 s1;
346 scaleValue(fMultDiv2(gainSGL, (syn[i + i_subfr] >> 1) -
347 (syn[i + i_subfr - T] >> 2) -
348 (syn[i + i_subfr + T] >> 2)),
349 2 - s1);
342350 }
343351
344352 for (i = lg; i < L_SUBFR; i++) {
345 /* scaled with SF_SYNTH + gain_sf + 1 */
353 /* scaled with SF_SYNTH + gain_sf + 1; composition of scalefactor 2:
354 * one additional shift of syn values + fMult => fMultDiv2 */
346355 noise_in[i] =
347 (fMult(gainSGL, syn[i + i_subfr] - syn[i + i_subfr - T])) >> s1;
356 scaleValue(fMultDiv2(gainSGL, (syn[i + i_subfr] >> 1) -
357 (syn[i + i_subfr - T] >> 1)),
358 2 - s1);
348359 }
349360 }
350361 } else {
363374
364375 {
365376 filtLP(&syn[i_subfr - L_SUBFR], &synth_out[i_subfr], noise,
366 fdk_dec_filt_lp, L_SUBFR, L_FILT);
377 fdk_dec_filt_lp, aacOutDataHeadroom, L_SUBFR, L_FILT);
367378 }
368379 }
369380
376387 /* Output scaling of the BPF memory */
377388 scaleValues(mem_bpf, (L_FILT + L_SUBFR), -1);
378389 /* Copy the rest of the signal (after the fac) */
379 scaleValuesSaturate((FIXP_PCM *)&synth_out[l_frame],
380 (FIXP_DBL *)&syn[l_frame - L_SUBFR],
381 (frame_length - l_frame), MDCT_OUT_HEADROOM);
390 scaleValuesSaturate(
391 (PCM_DEC *)&synth_out[l_frame], (FIXP_DBL *)&syn[l_frame - L_SUBFR],
392 (frame_length - l_frame), MDCT_OUT_HEADROOM - aacOutDataHeadroom);
382393 }
383394
384395 return;
15451556
15461557 AAC_DECODER_ERROR CLpd_RenderTimeSignal(
15471558 CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo,
1548 CAacDecoderChannelInfo *pAacDecoderChannelInfo, FIXP_PCM *pTimeData,
1549 INT lFrame, SamplingRateInfo *pSamplingRateInfo, UINT frameOk, UINT flags,
1550 UINT strmFlags) {
1559 CAacDecoderChannelInfo *pAacDecoderChannelInfo, PCM_DEC *pTimeData,
1560 INT lFrame, SamplingRateInfo *pSamplingRateInfo, UINT frameOk,
1561 const INT aacOutDataHeadroom, UINT flags, UINT strmFlags) {
15511562 UCHAR *mod = pAacDecoderChannelInfo->data.usac.mod;
15521563 AAC_DECODER_ERROR error = AAC_DEC_OK;
15531564 int k, i_offset;
20102021 {
20112022 bass_pf_1sf_delay(p2_synth, pitch, pit_gain, lFrame, lFrame / facFB,
20122023 mod[nbDiv - 1] ? (SynDelay - (lDiv / 2)) : SynDelay,
2013 pTimeData, pAacDecoderStaticChannelInfo->mem_bpf);
2024 pTimeData, aacOutDataHeadroom,
2025 pAacDecoderStaticChannelInfo->mem_bpf);
20142026 }
20152027 }
20162028
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
139139 * \param pTimeData pointer to output buffer
140140 * \param samplesPerFrame amount of output samples
141141 * \param pSamplingRateInfo holds the sampling rate information
142 * \param pWorkBuffer1 pointer to work buffer for temporal data
142 * \param aacOutDataHeadroom headroom of the output time signal to prevent
143 * clipping
143144 */
144145 AAC_DECODER_ERROR CLpd_RenderTimeSignal(
145146 CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo,
146 CAacDecoderChannelInfo *pAacDecoderChannelInfo, FIXP_PCM *pTimeData,
147 CAacDecoderChannelInfo *pAacDecoderChannelInfo, PCM_DEC *pTimeData,
147148 INT samplesPerFrame, SamplingRateInfo *pSamplingRateInfo, UINT frameOk,
148 UINT flags, UINT strmFlags);
149 const INT aacOutDataHeadroom, UINT flags, UINT strmFlags);
149150
150151 static inline INT CLpd_FAC_getLength(int fNotShortBlock, int fac_length_long) {
151152 if (fNotShortBlock) {
155156 }
156157 }
157158
158 void filtLP(const FIXP_DBL *syn, FIXP_PCM *syn_out, FIXP_DBL *noise,
159 const FIXP_SGL *filt, INT stop, int len);
159 void filtLP(const FIXP_DBL *syn, PCM_DEC *syn_out, FIXP_DBL *noise,
160 const FIXP_SGL *filt, const INT aacOutDataHeadroom, INT stop,
161 int len);
160162
161163 /**
162164 * \brief perform a low-frequency pitch enhancement on time domain signal
170172 * \param[in] l_frame length of filtering, must be multiple of L_SUBFR
171173 * \param[in] l_next length of allowed look ahead on syn[i], i < l_frame+l_next
172174 * \param[out] synth_out pointer to time domain output signal
175 * \param[in] headroom of the output time signal to prevent clipping
173176 * \param[in,out] mem_bpf pointer to filter memory (L_FILT+L_SUBFR)
174177 */
175178
176179 void bass_pf_1sf_delay(FIXP_DBL syn[], const INT T_sf[], FIXP_DBL *pit_gain,
177180 const int frame_length, const INT l_frame,
178 const INT l_next, FIXP_PCM *synth_out,
179 FIXP_DBL mem_bpf[]);
181 const INT l_next, PCM_DEC *synth_out,
182 const INT aacOutDataHeadroom, FIXP_DBL mem_bpf[]);
180183
181184 /**
182185 * \brief random sign generator for FD and TCX noise filling
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
147147 All API header files are located in the folder /include of the release package.
148148 All header files are provided for usage in C/C++ programs. The AAC encoder
149149 library API functions are located in aacenc_lib.h.
150
151 In binary releases the encoder core resides in statically linkable libraries
152 called for example libAACenc.a/libFDK.a (LINUX) or FDK_fastaaclib.lib (MS Visual
153 C++) for the plain AAC-LC core encoder and libSBRenc.a (LINUX) or
154 FDK_sbrEncLib.lib (MS Visual C++) for the SBR (Spectral Band Replication) and PS
155 (Parametric Stereo) modules.
156150
157151 \section CallingSequence Calling Sequence
158152
325319 \endcode
326320
327321 \section writeOutData Output Bitstream Data
328 If any AAC bitstream data is available, write it to output file or device. This
329 can be done once the following condition is true: \code if
330 (outargs.numOutBytes>0) {
331
322 If any AAC bitstream data is available, write it to output file or device as
323 follows. \code if (outargs.numOutBytes>0) { FDKfwrite(outputBuffer,
324 outargs.numOutBytes, 1, pOutFile);
332325 }
333 \endcode
334
335 If you use file I/O then for example call mpegFileWrite_Write() from the library
336 libMpegFileWrite \code mpegFileWrite_Write(hMpegFile, outputBuffer,
337 outargs.numOutBytes, aacEncoder_GetParam(hAacEncoder, AACENC_GRANULE_LENGTH));
338326 \endcode
339327
340328 \section cfgMetaData Meta Data Configuration
343331 insert meta data side info into the generated audio bitstream while encoding.
344332
345333 To work with meta data the encoder instance has to be \ref encOpen "allocated"
346 with meta data support. The meta data mode must be be configured with the
334 with meta data support. The meta data mode must be configured with the
347335 ::AACENC_METADATA_MODE parameter and aacEncoder_SetParam() function. \code
348336 aacEncoder_SetParam(hAacEncoder, AACENC_METADATA_MODE, 0-3); \endcode
349337
426414 return chMode;
427415 \endcode
428416
429 \subsection bitreservoir Bitreservoir Configuration
417 \subsection peakbitrate Peak Bitrate Configuration
430418 In AAC, the default bitreservoir configuration depends on the chosen bitrate per
431419 frame and the number of effective channels. The size can be determined as below.
432420 \f[
435423 Due to audio quality concerns it is not recommended to change the bitreservoir
436424 size to a lower value than the default setting! However, for minimizing the
437425 delay for streaming applications or for achieving a constant size of the
438 bitstream packages in each frame, it may be necessaray to change the
439 bitreservoir size. This can be done with the ::AACENC_PEAK_BITRATE parameter.
440 \code
426 bitstream packages in each frame, it may be necessaray to limit the maximum bits
427 per frame size. This can be done with the ::AACENC_PEAK_BITRATE parameter. \code
441428 aacEncoder_SetParam(hAacEncoder, AACENC_PEAK_BITRATE, value);
442429 \endcode
443 By setting ::AACENC_BITRATEMODE to fixed framing, the bitreservoir is disabled.
444 A disabled bitreservoir results in a constant size for each bitstream package.
445 Please note that especially at lower bitrates a disabled bitreservoir can
446 downgrade the audio quality considerably! The default bitreservoir configuration
447 can be achieved as follows. \code aacEncoder_SetParam(hAacEncoder,
448 AACENC_BITRESERVOIR, -1); \endcode
449430
450431 To achieve acceptable audio quality with a reduced bitreservoir size setting at
451432 least 1000 bits per audio channel is recommended. For a multichannel audio file
454435
455436
456437 \subsection vbrmode Variable Bitrate Mode
457 The encoder provides various Variable Bitrate Modes that differ in audio quality
458 and average overall bitrate. The given values are averages over time, different
459 encoder settings and strongly depend on the type of audio signal. The VBR
460 configurations can be adjusted via ::AACENC_BITRATEMODE encoder parameter.
438 The variable bitrate (VBR) mode coding adapts the bit consumption to the
439 psychoacoustic requirements of the signal. The encoder ignores the user-defined
440 bit rate and selects a suitable pre-defined configuration based on the provided
441 AOT. The VBR mode 1 is tuned for HE-AACv2, for VBR mode 2, HE-AACv1 should be
442 used. VBR modes 3-5 should be used with Low-Complexity AAC. When encoding
443 AAC-ELD, the best mode is selected automatically.
444
445 The bitrates given in the table are averages over time and different encoder
446 settings. They strongly depend on the type of audio signal. The VBR
447 configurations can be adjusted with the ::AACENC_BITRATEMODE encoder parameter.
461448 \verbatim
462 --------------------------------------------
463 VBR_MODE | Approx. Bitrate in kbps/channel
464 | AAC-LC | AAC-LD/AC_ELD
465 ----------+---------------+-----------------
466 VBR_1 | 32 - 48 | 32 - 56
467 VBR_2 | 40 - 56 | 40 - 64
468 VBR_3 | 48 - 64 | 48 - 72
469 VBR_4 | 64 - 80 | 64 - 88
470 VBR_5 | 96 - 120 | 112 - 144
449 -----------------------------------------------
450 VBR_MODE | Approx. Bitrate in kbps for stereo
451 | AAC-LC | AAC-ELD
452 ----------+---------------+--------------------
453 VBR_1 | 32 (HE-AACv2) | 48
454 VBR_2 | 72 (HE-AACv1) | 56
455 VBR_3 | 112 | 72
456 VBR_4 | 148 | 148
457 VBR_5 | 228 | 224
471458 --------------------------------------------
472459 \endverbatim
473 The bitrate ranges apply for individual audio channels. In case of multichannel
474 configurations the average bitrate might be estimated by multiplying with the
475 number of effective channels. This corresponds to all audio input channels
476 exclusively the low frequency channel. At configurations which are making use of
477 downmix modules the AAC core channels respectively downmix channels shall be
478 considered. For ::AACENC_AOT which are using SBR, the average bitrate can be
479 estimated by using the ratio of 0.5 for dualrate SBR and 0.75 for downsampled
480 SBR configurations.
481
460 Note that these figures are valid for stereo encoding only. VBR modes 2-5 will
461 yield much lower bit rates when encoding single-channel input. For
462 configurations which are making use of downmix modules the AAC core channels
463 respectively downmix channels shall be considered.
482464
483465 \subsection encQual Audio Quality Considerations
484466 The default encoder configuration is suggested to be used. Encoder tools such as
966948
967949 \subsection BEHAVIOUR_ESTIM_AVG_FRAMESIZES Estimating Average Frame Sizes
968950
969 A HE-AAC v1 or v2 audio frame contains 2048 PCM samples per channel (there is
970 also one mode with 1920 samples per channel but this is only for special
971 purposes such as DAB+ digital radio).
951 A HE-AAC v1 or v2 audio frame contains 2048 PCM samples per channel.
972952
973953 The number of HE-AAC frames \f$N\_FRAMES\f$ per second at 44.1 kHz is:
974954
10261006
10271007 #define AACENCODER_LIB_VL0 4
10281008 #define AACENCODER_LIB_VL1 0
1029 #define AACENCODER_LIB_VL2 0
1009 #define AACENCODER_LIB_VL2 1
10301010
10311011 /**
10321012 * AAC encoder error codes.
10851065 typedef struct {
10861066 UINT maxOutBufBytes; /*!< Maximum number of encoder bitstream bytes within one
10871067 frame. Size depends on maximum number of supported
1088 channels in encoder instance. For superframing (as
1089 used for example in DAB+), size has to be a multiple
1090 accordingly. */
1068 channels in encoder instance. */
10911069
10921070 UINT maxAncBytes; /*!< Maximum number of ancillary data bytes which can be
10931071 inserted into bitstream within one frame. */
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
203203 * (dynamic_RAM + P_BUF_0 + n*sizeof(QC_OUT_CHANNEL)) is sufficiently aligned,
204204 * so the cast is safe */
205205 return reinterpret_cast<QC_OUT_CHANNEL *>(reinterpret_cast<void *>(
206 dynamic_RAM + P_BUF_0 + n * sizeof(QC_OUT_CHANNEL)));
207 }
206 dynamic_RAM + P_BUF_0 + n * ALIGN_SIZE(sizeof(QC_OUT_CHANNEL))));
207 }
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
197197 +++++++++++++++++++++++++++++++++++++++++++++++++++++
198198 */
199199
200 #define BUF_SIZE_0 (ALIGN_SIZE(sizeof(QC_OUT_CHANNEL) * (8)))
200 #define BUF_SIZE_0 (ALIGN_SIZE(sizeof(QC_OUT_CHANNEL)) * (8))
201201 #define BUF_SIZE_1 \
202202 (ALIGN_SIZE(maxSize(maxSize(sizeof(PSY_DYNAMIC), \
203203 (BIT_LOOK_UP_SIZE + MERGE_GAIN_LOOK_UP_SIZE)), \
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2020 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
113113
114114 #include "genericStds.h"
115115
116 #define BITRES_MIN \
117 300 /* default threshold for using reduced/disabled bitres mode */
116118 #define BITRES_MAX_LD 4000
117119 #define BITRES_MIN_LD 500
118120 #define BITRATE_MAX_LD 70000 /* Max assumed bitrate for bitres calculation */
240242 bitrate *= FDKaacEnc_GetChannelModeConfiguration(channelMode)->nChannelsEff;
241243
242244 return bitrate;
245 }
246
247 /*-----------------------------------------------------------------------------
248
249 functionname: FDKaacEnc_AdjustVBRBitrateMode
250 description: Adjust bitrate mode to given bitrate parameter
251 input params: int vbrQuality (VBR0, VBR1, VBR2)
252 bitrate
253 channelMode
254 returns: vbr bitrate mode
255
256 ------------------------------------------------------------------------------*/
257 AACENC_BITRATE_MODE FDKaacEnc_AdjustVBRBitrateMode(
258 AACENC_BITRATE_MODE bitrateMode, INT bitrate, CHANNEL_MODE channelMode) {
259 AACENC_BITRATE_MODE newBitrateMode = bitrateMode;
260
261 if (bitrate != -1) {
262 const INT monoStereoMode =
263 (FDKaacEnc_GetMonoStereoMode(channelMode) == EL_MODE_STEREO) ? 1 : 0;
264 const INT nChannelsEff =
265 FDKaacEnc_GetChannelModeConfiguration(channelMode)->nChannelsEff;
266 newBitrateMode = AACENC_BR_MODE_INVALID;
267
268 for (int idx = (int)(sizeof(configTabVBR) / sizeof(*configTabVBR)) - 1;
269 idx >= 0; idx--) {
270 if (bitrate >=
271 configTabVBR[idx].chanBitrate[monoStereoMode] * nChannelsEff) {
272 if (configTabVBR[idx].chanBitrate[monoStereoMode] * nChannelsEff <
273 FDKaacEnc_GetVBRBitrate(bitrateMode, channelMode)) {
274 newBitrateMode = configTabVBR[idx].bitrateMode;
275 } else {
276 newBitrateMode = bitrateMode;
277 }
278 break;
279 }
280 }
281 }
282
283 return AACENC_BR_MODE_IS_VBR(newBitrateMode) ? newBitrateMode
284 : AACENC_BR_MODE_INVALID;
243285 }
244286
245287 /**
394436 FIXP_DBL mbfac, bw_ratio;
395437 QC_INIT qcInit;
396438 INT averageBitsPerFrame = 0;
397 int bitresMin = 0; /* the bitreservoir is always big for AAC-LC */
398439 const CHANNEL_MODE prevChannelMode = hAacEnc->encoderMode;
399440
400441 if (config == NULL) return AAC_ENC_INVALID_HANDLE;
549590 (config->minBitsPerFrame != -1) ? config->minBitsPerFrame : 0;
550591 qcInit.minBits = fixMin(qcInit.minBits, averageBitsPerFrame & ~7);
551592 } else {
552 INT bitreservoir = -1; /* default bitrservoir size*/
593 INT bitreservoir = -1; /* default bitreservoir size*/
553594 if (isLowDelay(config->audioObjectType)) {
554595 INT brPerChannel = config->bitRate / config->nChannels;
555596 brPerChannel = fMin(BITRATE_MAX_LD, fMax(BITRATE_MIN_LD, brPerChannel));
563604 bitreservoir = fMultI(slope, (INT)(BITRES_MAX_LD - BITRES_MIN_LD)) +
564605 BITRES_MIN_LD; /* interpolate */
565606 bitreservoir = bitreservoir & ~7; /* align to bytes */
566 bitresMin = BITRES_MIN_LD;
567607 }
568608
569609 int maxBitres;
600640 qcInit.nSubFrames = config->nSubFrames;
601641 qcInit.padding.paddingRest = config->sampleRate;
602642
603 if (qcInit.bitRes >= bitresMin * config->nChannels) {
643 if (qcInit.maxBits - qcInit.averageBits >=
644 ((qcInit.isLowDelay) ? BITRES_MIN_LD : BITRES_MIN) * config->nChannels) {
604645 qcInit.bitResMode = AACENC_BR_MODE_FULL; /* full bitreservoir */
605 } else if (qcInit.bitRes > 0) {
646 } else if (qcInit.maxBits > qcInit.averageBits) {
606647 qcInit.bitResMode = AACENC_BR_MODE_REDUCED; /* reduced bitreservoir */
607648 } else {
608649 qcInit.bitResMode = AACENC_BR_MODE_DISABLED; /* disabled bitreservoir */
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2020 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
335335
336336 /*-----------------------------------------------------------------------------
337337
338 functionname: FDKaacEnc_AdjustVBRBitrateMode
339 description: Adjust bitrate mode to given bitrate parameter
340 input params: int vbrQuality (VBR0, VBR1, VBR2)
341 bitrate
342 channelMode
343 returns: vbr bitrate mode
344
345 ------------------------------------------------------------------------------*/
346 AACENC_BITRATE_MODE FDKaacEnc_AdjustVBRBitrateMode(
347 AACENC_BITRATE_MODE bitrateMode, INT bitrate, CHANNEL_MODE channelMode);
348
349 /*-----------------------------------------------------------------------------
350
338351 functionname: FDKaacEnc_AacInitDefaultConfig
339352 description: gives reasonable default configuration
340353 returns: ---
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
109109 /* Encoder library info */
110110 #define AACENCODER_LIB_VL0 4
111111 #define AACENCODER_LIB_VL1 0
112 #define AACENCODER_LIB_VL2 0
112 #define AACENCODER_LIB_VL2 1
113113 #define AACENCODER_LIB_TITLE "AAC Encoder"
114 #ifdef __ANDROID__
114 #ifdef SUPPRESS_BUILD_DATE_INFO
115115 #define AACENCODER_LIB_BUILD_DATE ""
116116 #define AACENCODER_LIB_BUILD_TIME ""
117117 #else
445445 return sbrSignaling;
446446 }
447447
448 static inline INT getAssociatedChElement(SBR_ELEMENT_INFO *elInfoSbr,
449 CHANNEL_MAPPING *channelMapping) {
450 ELEMENT_INFO *elInfo = channelMapping->elInfo;
451 INT nElements = channelMapping->nElements;
452 INT associatedChElement = -1;
453 int i;
454
455 for (i = 0; i < nElements; i++) {
456 if (elInfoSbr->elType == elInfo[i].elType &&
457 elInfoSbr->instanceTag == elInfo[i].instanceTag) {
458 associatedChElement = i;
459 break;
460 }
461 }
462
463 return associatedChElement;
464 }
465
448466 /****************************************************************************
449467 Allocate Encoder
450468 ****************************************************************************/
10091027 case AACENC_BR_MODE_VBR_3:
10101028 case AACENC_BR_MODE_VBR_4:
10111029 case AACENC_BR_MODE_VBR_5:
1030 /* Adjust bitrate mode in case given peak bitrate is lower than expected
1031 * VBR bitrate. */
1032 if ((INT)config->userPeakBitrate != -1) {
1033 hAacConfig->bitrateMode = FDKaacEnc_AdjustVBRBitrateMode(
1034 hAacConfig->bitrateMode, config->userPeakBitrate,
1035 hAacConfig->channelMode);
1036 }
10121037 /* Get bitrate in VBR configuration */
10131038 /* In VBR mode; SBR-modul depends on bitrate, core encoder on bitrateMode.
10141039 */
17601785 hAacEncoder->inputBuffer +
17611786 (hAacEncoder->inputBufferOffset + hAacEncoder->nSamplesRead) /
17621787 hAacEncoder->aacConfig.nChannels;
1788 newSamples -=
1789 (newSamples %
1790 hAacEncoder->extParam
1791 .nChannels); /* process multiple samples of input channels */
17631792
17641793 /* Copy new input samples to internal buffer */
17651794 if (inBufDesc->bufElSizes[idx] == (INT)sizeof(INT_PCM)) {
19161945 {
19171946 hAacEncoder->extPayload[nExtensions].dataSize =
19181947 hAacEncoder->pSbrPayload->dataSize[nPayload][i];
1919 hAacEncoder->extPayload[nExtensions].associatedChElement = i;
1948 hAacEncoder->extPayload[nExtensions].associatedChElement =
1949 getAssociatedChElement(
1950 &hAacEncoder->hEnvEnc->sbrElement[i]->elInfo,
1951 &hAacEncoder->hAacEnc->channelMapping);
1952 if (hAacEncoder->extPayload[nExtensions].associatedChElement ==
1953 -1) {
1954 err = AACENC_ENCODE_ERROR;
1955 goto bail;
1956 }
19201957 }
19211958 hAacEncoder->extPayload[nExtensions].dataType =
19221959 EXT_SBR_DATA; /* Once SBR Encoder supports SBR CRC set
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
590590 if (sfbEn > avgEn) {
591591 FIXP_DBL tmpMinSnrLdData;
592592 if (psyOutChannel[ch]->lastWindowSequence == LONG_WINDOW)
593 tmpMinSnrLdData =
594 fixMax(SnrLdFac + (FIXP_DBL)(avgEnLdData - sfbEnLdData),
595 (FIXP_DBL)SnrLdMin1);
593 tmpMinSnrLdData = SnrLdFac + fixMax(avgEnLdData - sfbEnLdData,
594 SnrLdMin1 - SnrLdFac);
596595 else
597 tmpMinSnrLdData =
598 fixMax(SnrLdFac + (FIXP_DBL)(avgEnLdData - sfbEnLdData),
599 (FIXP_DBL)SnrLdMin3);
596 tmpMinSnrLdData = SnrLdFac + fixMax(avgEnLdData - sfbEnLdData,
597 SnrLdMin3 - SnrLdFac);
600598
601599 qcOutChan->sfbMinSnrLdData[sfbGrp + sfb] = fixMin(
602600 qcOutChan->sfbMinSnrLdData[sfbGrp + sfb], tmpMinSnrLdData);
13021300
13031301 if (sfbThrReducedLdData < FL2FXCONST_DBL(-0.5f))
13041302 sfbThrReducedLdData = FL2FXCONST_DBL(-1.f);
1305
1306 /* minimum of 29 dB Ratio for Thresholds */
1307 if ((sfbEnLdData + FL2FXCONST_DBL(1.0f)) >
1308 FL2FXCONST_DBL(9.6336206 / LD_DATA_SCALING)) {
1309 sfbThrReducedLdData = fixMax(
1310 sfbThrReducedLdData,
1311 sfbEnLdData - FL2FXCONST_DBL(9.6336206 / LD_DATA_SCALING));
1312 }
13131303
13141304 sfbThrReducedLdData = fixMax(MIN_LDTHRESH, sfbThrReducedLdData);
13151305
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
150150
151151 static const BANDWIDTH_TAB_VBR bandWidthTableVBR[] = {
152152 {AACENC_BR_MODE_CBR, 0, 0},
153 {AACENC_BR_MODE_VBR_1, 13050, 13050},
154 {AACENC_BR_MODE_VBR_2, 13050, 13050},
155 {AACENC_BR_MODE_VBR_3, 14260, 14260},
156 {AACENC_BR_MODE_VBR_4, 15500, 15500},
157 {AACENC_BR_MODE_VBR_5, 48000, 48000},
153 {AACENC_BR_MODE_VBR_1, 13000, 13000},
154 {AACENC_BR_MODE_VBR_2, 13000, 13000},
155 {AACENC_BR_MODE_VBR_3, 15750, 15750},
156 {AACENC_BR_MODE_VBR_4, 16500, 16500},
157 {AACENC_BR_MODE_VBR_5, 19293, 19293},
158158 {AACENC_BR_MODE_SFR, 0, 0},
159159 {AACENC_BR_MODE_FF, 0, 0}
160160
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
660660 for (sfboffs = 0; sfboffs < maxSfbPerGroup; sfboffs++) {
661661 INT sL, sR;
662662 FIXP_DBL inv_n;
663 INT mdct_spec_sf = MDCT_SPEC_SF;
663664
664665 msMask[sfb + sfboffs] = 0;
665666 if (isMask[sfb + sfboffs] == 0) {
679680 if (pnsData[1]->pnsFlag[sfb + sfboffs]) {
680681 pnsData[1]->pnsFlag[sfb + sfboffs] = 0;
681682 }
683 }
684
685 if (sfbOffset[sfb + sfboffs + 1] - sfbOffset[sfb + sfboffs] >
686 1 << mdct_spec_sf) {
687 mdct_spec_sf++; /* This is for rare cases where the number of bins in a
688 scale factor band is > 64 */
682689 }
683690
684691 inv_n = GetInvInt(
706713 j++) {
707714 d = ((mdctSpectrumLeft[j] << s0) >> 1) -
708715 ((mdctSpectrumRight[j] << s0) >> 1);
709 ed += fMultDiv2(d, d) >> (MDCT_SPEC_SF - 1);
716 ed += fMultDiv2(d, d) >> (mdct_spec_sf - 1);
710717 }
711718 msMask[sfb + sfboffs] = 1;
712719 tmp = fDivNorm(sfbEnergyLeft[sfb + sfboffs], ed, &s1);
713 s2 = (s1) + (2 * s0) - 2 - MDCT_SPEC_SF;
720 s2 = (s1) + (2 * s0) - 2 - mdct_spec_sf;
714721 if (s2 & 1) {
715722 tmp = tmp >> 1;
716723 s2 = s2 + 1;
746753 j++) {
747754 s = ((mdctSpectrumLeft[j] << s0) >> 1) +
748755 ((mdctSpectrumRight[j] << s0) >> 1);
749 es = fAddSaturate(es, fMultDiv2(s, s) >>
750 (MDCT_SPEC_SF -
751 1)); // scaled 2*(mdctScale - s0 + 1) + MDCT_SPEC_SF
756 es += fMultDiv2(s, s) >>
757 (mdct_spec_sf -
758 1); // scaled 2*(mdctScale - s0 + 1) + mdct_spec_sf
752759 }
753760 msMask[sfb + sfboffs] = 0;
754761 tmp = fDivNorm(sfbEnergyLeft[sfb + sfboffs], es, &s1);
755 s2 = (s1) + (2 * s0) - 2 - MDCT_SPEC_SF;
762 s2 = (s1) + (2 * s0) - 2 - mdct_spec_sf;
756763 if (s2 & 1) {
757764 tmp = tmp >> 1;
758765 s2 = s2 + 1;
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2020 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
120120
121121 static const TAB_VBR_QUAL_FACTOR tableVbrQualFactor[] = {
122122 {QCDATA_BR_MODE_VBR_1,
123 FL2FXCONST_DBL(0.160f)}, /* Approx. 32 - 48 (AC-LC), 32 - 56
124 (AAC-LD/ELD) kbps/channel */
123 FL2FXCONST_DBL(0.150f)}, /* Approx. 32 kbps mono AAC-LC + SBR + PS */
125124 {QCDATA_BR_MODE_VBR_2,
126 FL2FXCONST_DBL(0.148f)}, /* Approx. 40 - 56 (AC-LC), 40 - 64
127 (AAC-LD/ELD) kbps/channel */
125 FL2FXCONST_DBL(0.162f)}, /* Approx. 64 kbps stereo AAC-LC + SBR */
128126 {QCDATA_BR_MODE_VBR_3,
129 FL2FXCONST_DBL(0.135f)}, /* Approx. 48 - 64 (AC-LC), 48 - 72
130 (AAC-LD/ELD) kbps/channel */
127 FL2FXCONST_DBL(0.176f)}, /* Approx. 96 kbps stereo AAC-LC */
131128 {QCDATA_BR_MODE_VBR_4,
132 FL2FXCONST_DBL(0.111f)}, /* Approx. 64 - 80 (AC-LC), 64 - 88
133 (AAC-LD/ELD) kbps/channel */
129 FL2FXCONST_DBL(0.120f)}, /* Approx. 128 kbps stereo AAC-LC */
134130 {QCDATA_BR_MODE_VBR_5,
135 FL2FXCONST_DBL(0.070f)} /* Approx. 96 - 120 (AC-LC), 112 - 144
136 (AAC-LD/ELD) kbps/channel */
131 FL2FXCONST_DBL(0.070f)} /* Approx. 192 kbps stereo AAC-LC */
137132 };
138133
139134 static INT isConstantBitrateMode(const QCDATA_BR_MODE bitrateMode) {
377372 hQC->invQuant = init->invQuant;
378373 hQC->maxIterations = init->maxIterations;
379374
380 if (isConstantBitrateMode(hQC->bitrateMode)) {
381 /* 0: full bitreservoir, 1: reduced bitreservoir, 2: disabled bitreservoir
382 */
383 hQC->bitResMode = init->bitResMode;
384 } else {
385 hQC->bitResMode = AACENC_BR_MODE_FULL; /* full bitreservoir */
386 }
375 /* 0: full bitreservoir, 1: reduced bitreservoir, 2: disabled bitreservoir */
376 hQC->bitResMode = init->bitResMode;
387377
388378 hQC->padding.paddingRest = init->padding.paddingRest;
389379
804794 INT avgTotalDynBits = 0; /* maximal allowed dynamic bits for all frames */
805795 INT totalAvailableBits = 0;
806796 INT nSubFrames = 1;
797 const INT isCBRAdjustment = (isConstantBitrateMode(hQC->bitrateMode) ||
798 (hQC->bitResMode != AACENC_BR_MODE_FULL))
799 ? 1
800 : 0;
807801
808802 /*-------------------------------------------- */
809803 /* redistribute total bitreservoir to elements */
810 ErrorStatus = FDKaacEnc_BitResRedistribution(hQC, cm, avgTotalBits);
804 ErrorStatus = FDKaacEnc_BitResRedistribution(
805 hQC, cm, (isCBRAdjustment == 0) ? hQC->maxBitsPerFrame : avgTotalBits);
811806 if (ErrorStatus != AAC_ENC_OK) {
812807 return ErrorStatus;
813808 }
835830
836831 /*-------------------------------------------- */
837832 /*-------------------------------------------- */
838 if (isConstantBitrateMode(hQC->bitrateMode)) {
839 /* calc granted dynamic bits for sub frame and
840 distribute it to each element */
841 ErrorStatus = FDKaacEnc_prepareBitDistribution(
842 hQC, psyOut, qcOut, cm, qcElement, avgTotalBits, &totalAvailableBits,
843 &avgTotalDynBits);
844
845 if (ErrorStatus != AAC_ENC_OK) {
846 return ErrorStatus;
847 }
848 } else {
849 qcOut[0]->grantedDynBits =
850 ((hQC->maxBitsPerFrame - (hQC->globHdrBits)) & ~7) -
851 (qcOut[0]->globalExtBits + qcOut[0]->staticBits +
852 qcOut[0]->elementExtBits);
853 qcOut[0]->maxDynBits = qcOut[0]->grantedDynBits;
854
855 totalAvailableBits = hQC->maxBitsPerFrame;
856 avgTotalDynBits = 0;
833 /* calc granted dynamic bits for sub frame and
834 distribute it to each element */
835 ErrorStatus = FDKaacEnc_prepareBitDistribution(
836 hQC, psyOut, qcOut, cm, qcElement,
837 (isCBRAdjustment == 0) ? hQC->maxBitsPerFrame : avgTotalBits,
838 &totalAvailableBits, &avgTotalDynBits);
839
840 if (ErrorStatus != AAC_ENC_OK) {
841 return ErrorStatus;
857842 }
858843
859844 /* for ( all sub frames ) ... */
860845 for (c = 0; c < nSubFrames; c++) {
861846 /* for CBR and VBR mode */
862847 FDKaacEnc_AdjustThresholds(hQC->hAdjThr, qcElement[c], qcOut[c],
863 psyOut[c]->psyOutElement,
864 isConstantBitrateMode(hQC->bitrateMode), cm);
848 psyOut[c]->psyOutElement, isCBRAdjustment, cm);
865849
866850 } /* -end- sub frame counter */
867851
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
113113 extern "C" {
114114 #endif
115115
116 #define DRC_DEC_LOUDNESS_NOT_PRESENT (LONG)0x7FFFFFFE
117
116118 typedef struct s_drc_decoder* HANDLE_DRC_DECODER;
117119 typedef struct s_uni_drc_interface* HANDLE_UNI_DRC_INTERFACE;
118120 typedef struct s_selection_process_output* HANDLE_SEL_PROC_OUTPUT;
133135 DRC_DEC_EFFECT_TYPE,
134136 DRC_DEC_EFFECT_TYPE_FALLBACK_CODE,
135137 DRC_DEC_LOUDNESS_MEASUREMENT_METHOD,
138 DRC_DEC_ALBUM_MODE,
136139 /* set only system (not user) parameters */
137140 DRC_DEC_DOWNMIX_ID,
138141 DRC_DEC_TARGET_CHANNEL_COUNT_REQUESTED, /**< number of output channels
140143 choosing an appropriate
141144 downmixInstruction */
142145 DRC_DEC_BASE_CHANNEL_COUNT,
146 DRC_DEC_FRAME_SIZE,
147 DRC_DEC_SAMPLE_RATE,
143148 /* get only system parameters */
144149 DRC_DEC_IS_MULTIBAND_DRC_1,
145150 DRC_DEC_IS_MULTIBAND_DRC_2,
146151 DRC_DEC_IS_ACTIVE, /**< MPEG-D DRC payload is present and at least one of
147152 Dynamic Range Control (DRC) or Loudness Normalization
148153 (LN) is activated */
149 DRC_DEC_TARGET_CHANNEL_COUNT_SELECTED /**< number of output channels if
150 appropriate downmixInstruction exists
151 */
154 DRC_DEC_TARGET_CHANNEL_COUNT_SELECTED, /**< number of output channels if
155 appropriate downmixInstruction
156 exists */
157 DRC_DEC_OUTPUT_LOUDNESS /**< output loudness in dB, with exponent e = 7, or
158 DRC_DEC_LOUDNESS_NOT_PRESENT if no loudness is
159 contained in the bitstream */
152160 } DRC_DEC_USERPARAM;
153161
154162 typedef enum {
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
111111 #define DRCDEC_LIB_VL1 1
112112 #define DRCDEC_LIB_VL2 0
113113 #define DRCDEC_LIB_TITLE "MPEG-D DRC Decoder Lib"
114 #ifdef __ANDROID__
114 #ifdef SUPPRESS_BUILD_DATE_INFO
115115 #define DRCDEC_LIB_BUILD_DATE ""
116116 #define DRCDEC_LIB_BUILD_TIME ""
117117 #else
143143
144144 SEL_PROC_OUTPUT selProcOutput;
145145 } DRC_DECODER;
146
147 static int _getGainStatus(HANDLE_UNI_DRC_GAIN hUniDrcGain) {
148 return hUniDrcGain->status;
149 }
146150
147151 static int isResetNeeded(HANDLE_DRC_DECODER hDrcDec,
148152 const SEL_PROC_OUTPUT oldSelProcOutput) {
172176 return resetNeeded;
173177 }
174178
175 static DRC_DEC_ERROR startSelectionProcess(HANDLE_DRC_DECODER hDrcDec) {
176 DRC_ERROR dErr = DE_OK;
177 DRCDEC_SELECTION_PROCESS_RETURN sErr = DRCDEC_SELECTION_PROCESS_NO_ERROR;
179 static void startSelectionProcess(HANDLE_DRC_DECODER hDrcDec) {
178180 int uniDrcConfigHasChanged = 0;
179181 SEL_PROC_OUTPUT oldSelProcOutput = hDrcDec->selProcOutput;
180182
181 if (!hDrcDec->status) return DRC_DEC_NOT_READY;
183 if (!hDrcDec->status) return;
182184
183185 if (hDrcDec->functionalRange & DRC_DEC_SELECTION) {
184186 uniDrcConfigHasChanged = hDrcDec->uniDrcConfig.diff;
188190 */
189191 hDrcDec->selProcOutput.numSelectedDrcSets = 0;
190192
191 sErr = drcDec_SelectionProcess_Process(
193 drcDec_SelectionProcess_Process(
192194 hDrcDec->hSelectionProc, &(hDrcDec->uniDrcConfig),
193195 &(hDrcDec->loudnessInfoSet), &(hDrcDec->selProcOutput));
194 if (sErr) return DRC_DEC_OK;
195196
196197 hDrcDec->selProcInputDiff = 0;
197198 hDrcDec->uniDrcConfig.diff = 0;
201202
202203 if (hDrcDec->functionalRange & DRC_DEC_GAIN) {
203204 if (isResetNeeded(hDrcDec, oldSelProcOutput) || uniDrcConfigHasChanged) {
204 dErr =
205 drcDec_GainDecoder_Config(hDrcDec->hGainDec, &(hDrcDec->uniDrcConfig),
206 hDrcDec->selProcOutput.numSelectedDrcSets,
207 hDrcDec->selProcOutput.selectedDrcSetIds,
208 hDrcDec->selProcOutput.selectedDownmixIds);
209 if (dErr) return DRC_DEC_OK;
205 drcDec_GainDecoder_Config(hDrcDec->hGainDec, &(hDrcDec->uniDrcConfig),
206 hDrcDec->selProcOutput.numSelectedDrcSets,
207 hDrcDec->selProcOutput.selectedDrcSetIds,
208 hDrcDec->selProcOutput.selectedDownmixIds);
210209 }
211210 }
212 return DRC_DEC_OK;
213211 }
214212
215213 DRC_DEC_ERROR
341339 }
342340
343341 if (hDrcDec->functionalRange & DRC_DEC_GAIN) {
344 dErr = drcDec_GainDecoder_Init(hDrcDec->hGainDec, frameSize, sampleRate);
342 dErr = drcDec_GainDecoder_SetParam(hDrcDec->hGainDec, GAIN_DEC_FRAME_SIZE,
343 frameSize);
344 if (dErr) return DRC_DEC_NOT_OK;
345 dErr = drcDec_GainDecoder_SetParam(hDrcDec->hGainDec, GAIN_DEC_SAMPLE_RATE,
346 sampleRate);
347 if (dErr) return DRC_DEC_NOT_OK;
348 dErr = drcDec_GainDecoder_Init(hDrcDec->hGainDec);
345349 if (dErr) return DRC_DEC_NOT_OK;
346350 }
347351
382386 FDK_drcDec_SetParam(HANDLE_DRC_DECODER hDrcDec,
383387 const DRC_DEC_USERPARAM requestType,
384388 const FIXP_DBL requestValue) {
389 DRC_ERROR dErr = DE_OK;
385390 DRCDEC_SELECTION_PROCESS_RETURN sErr = DRCDEC_SELECTION_PROCESS_NO_ERROR;
386
387 if (hDrcDec == NULL) return DRC_DEC_NOT_OPENED;
388
389 if (hDrcDec->functionalRange == DRC_DEC_GAIN)
390 return DRC_DEC_NOT_OK; /* not supported for DRC_DEC_GAIN. All parameters are
391 handed over to selection process lib. */
392
393 switch (requestType) {
394 case DRC_DEC_BOOST:
395 sErr = drcDec_SelectionProcess_SetParam(hDrcDec->hSelectionProc,
396 SEL_PROC_BOOST, requestValue,
397 &(hDrcDec->selProcInputDiff));
398 if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE;
399 break;
400 case DRC_DEC_COMPRESS:
401 sErr = drcDec_SelectionProcess_SetParam(hDrcDec->hSelectionProc,
402 SEL_PROC_COMPRESS, requestValue,
403 &(hDrcDec->selProcInputDiff));
404 if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE;
405 break;
406 case DRC_DEC_LOUDNESS_NORMALIZATION_ON:
407 sErr = drcDec_SelectionProcess_SetParam(
408 hDrcDec->hSelectionProc, SEL_PROC_LOUDNESS_NORMALIZATION_ON,
409 requestValue, &(hDrcDec->selProcInputDiff));
410 if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE;
411 break;
412 case DRC_DEC_TARGET_LOUDNESS:
413 sErr = drcDec_SelectionProcess_SetParam(
414 hDrcDec->hSelectionProc, SEL_PROC_TARGET_LOUDNESS, requestValue,
415 &(hDrcDec->selProcInputDiff));
416 if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE;
417 break;
418 case DRC_DEC_EFFECT_TYPE:
419 sErr = drcDec_SelectionProcess_SetParam(
420 hDrcDec->hSelectionProc, SEL_PROC_EFFECT_TYPE, requestValue,
421 &(hDrcDec->selProcInputDiff));
422 if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE;
423 break;
424 case DRC_DEC_DOWNMIX_ID:
425 sErr = drcDec_SelectionProcess_SetParam(hDrcDec->hSelectionProc,
426 SEL_PROC_DOWNMIX_ID, requestValue,
427 &(hDrcDec->selProcInputDiff));
428 if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE;
429 break;
430 case DRC_DEC_TARGET_CHANNEL_COUNT_REQUESTED:
431 sErr = drcDec_SelectionProcess_SetParam(
432 hDrcDec->hSelectionProc, SEL_PROC_TARGET_CHANNEL_COUNT, requestValue,
433 &(hDrcDec->selProcInputDiff));
434 if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE;
435 break;
436 case DRC_DEC_BASE_CHANNEL_COUNT:
437 sErr = drcDec_SelectionProcess_SetParam(
438 hDrcDec->hSelectionProc, SEL_PROC_BASE_CHANNEL_COUNT, requestValue,
439 &(hDrcDec->selProcInputDiff));
440 if (sErr) return DRC_DEC_NOT_OK;
441 break;
442 case DRC_DEC_LOUDNESS_MEASUREMENT_METHOD:
443 sErr = drcDec_SelectionProcess_SetParam(
444 hDrcDec->hSelectionProc, SEL_PROC_LOUDNESS_MEASUREMENT_METHOD,
445 requestValue, &(hDrcDec->selProcInputDiff));
446 if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE;
447 break;
448 default:
449 return DRC_DEC_INVALID_PARAM;
450 }
391 int invalidParameter = 0;
392
393 if (hDrcDec == NULL) return DRC_DEC_NOT_OPENED;
394
395 if (hDrcDec->functionalRange & DRC_DEC_GAIN) {
396 switch (requestType) {
397 case DRC_DEC_SAMPLE_RATE:
398 dErr = drcDec_GainDecoder_SetParam(
399 hDrcDec->hGainDec, GAIN_DEC_SAMPLE_RATE, (int)requestValue);
400 if (dErr) return DRC_DEC_PARAM_OUT_OF_RANGE;
401 break;
402 case DRC_DEC_FRAME_SIZE:
403 dErr = drcDec_GainDecoder_SetParam(
404 hDrcDec->hGainDec, GAIN_DEC_FRAME_SIZE, (int)requestValue);
405 if (dErr) return DRC_DEC_PARAM_OUT_OF_RANGE;
406 break;
407 default:
408 invalidParameter |= DRC_DEC_GAIN;
409 }
410 }
411
412 if (hDrcDec->functionalRange & DRC_DEC_SELECTION) {
413 switch (requestType) {
414 case DRC_DEC_BOOST:
415 sErr = drcDec_SelectionProcess_SetParam(hDrcDec->hSelectionProc,
416 SEL_PROC_BOOST, requestValue,
417 &(hDrcDec->selProcInputDiff));
418 if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE;
419 break;
420 case DRC_DEC_COMPRESS:
421 sErr = drcDec_SelectionProcess_SetParam(hDrcDec->hSelectionProc,
422 SEL_PROC_COMPRESS, requestValue,
423 &(hDrcDec->selProcInputDiff));
424 if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE;
425 break;
426 case DRC_DEC_LOUDNESS_NORMALIZATION_ON:
427 sErr = drcDec_SelectionProcess_SetParam(
428 hDrcDec->hSelectionProc, SEL_PROC_LOUDNESS_NORMALIZATION_ON,
429 requestValue, &(hDrcDec->selProcInputDiff));
430 if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE;
431 break;
432 case DRC_DEC_TARGET_LOUDNESS:
433 sErr = drcDec_SelectionProcess_SetParam(
434 hDrcDec->hSelectionProc, SEL_PROC_TARGET_LOUDNESS, requestValue,
435 &(hDrcDec->selProcInputDiff));
436 if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE;
437 break;
438 case DRC_DEC_EFFECT_TYPE:
439 sErr = drcDec_SelectionProcess_SetParam(
440 hDrcDec->hSelectionProc, SEL_PROC_EFFECT_TYPE, requestValue,
441 &(hDrcDec->selProcInputDiff));
442 if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE;
443 break;
444 case DRC_DEC_DOWNMIX_ID:
445 sErr = drcDec_SelectionProcess_SetParam(
446 hDrcDec->hSelectionProc, SEL_PROC_DOWNMIX_ID, requestValue,
447 &(hDrcDec->selProcInputDiff));
448 if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE;
449 break;
450 case DRC_DEC_TARGET_CHANNEL_COUNT_REQUESTED:
451 sErr = drcDec_SelectionProcess_SetParam(
452 hDrcDec->hSelectionProc, SEL_PROC_TARGET_CHANNEL_COUNT,
453 requestValue, &(hDrcDec->selProcInputDiff));
454 if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE;
455 break;
456 case DRC_DEC_BASE_CHANNEL_COUNT:
457 sErr = drcDec_SelectionProcess_SetParam(
458 hDrcDec->hSelectionProc, SEL_PROC_BASE_CHANNEL_COUNT, requestValue,
459 &(hDrcDec->selProcInputDiff));
460 if (sErr) return DRC_DEC_NOT_OK;
461 break;
462 case DRC_DEC_LOUDNESS_MEASUREMENT_METHOD:
463 sErr = drcDec_SelectionProcess_SetParam(
464 hDrcDec->hSelectionProc, SEL_PROC_LOUDNESS_MEASUREMENT_METHOD,
465 requestValue, &(hDrcDec->selProcInputDiff));
466 if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE;
467 break;
468 case DRC_DEC_ALBUM_MODE:
469 sErr = drcDec_SelectionProcess_SetParam(
470 hDrcDec->hSelectionProc, SEL_PROC_ALBUM_MODE, requestValue,
471 &(hDrcDec->selProcInputDiff));
472 if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE;
473 break;
474 default:
475 invalidParameter |= DRC_DEC_SELECTION;
476 }
477 }
478
479 if (invalidParameter == hDrcDec->functionalRange)
480 return DRC_DEC_INVALID_PARAM;
451481
452482 /* All parameters need a new start of the selection process */
453483 startSelectionProcess(hDrcDec);
488518 }
489519 case DRC_DEC_TARGET_CHANNEL_COUNT_SELECTED:
490520 return (LONG)hDrcDec->selProcOutput.targetChannelCount;
521 case DRC_DEC_OUTPUT_LOUDNESS:
522 return (LONG)hDrcDec->selProcOutput.outputLoudness;
491523 default:
492524 return 0;
493525 }
702734 &(hDrcDec->uniDrcGain));
703735 if (dErr) return DRC_DEC_NOT_OK;
704736
705 hDrcDec->status = DRC_DEC_NEW_GAIN_PAYLOAD;
737 if (_getGainStatus(&(hDrcDec->uniDrcGain))) {
738 hDrcDec->status = DRC_DEC_NEW_GAIN_PAYLOAD;
739 }
706740
707741 return DRC_DEC_OK;
708742 }
720754 drcDec_GainDecoder_GetFrameSize(hDrcDec->hGainDec),
721755 drcDec_GainDecoder_GetDeltaTminDefault(hDrcDec->hGainDec),
722756 &(hDrcDec->uniDrcGain));
757
758 startSelectionProcess(hDrcDec);
723759 if (dErr) return DRC_DEC_NOT_OK;
724760
725 startSelectionProcess(hDrcDec);
726
727 hDrcDec->status = DRC_DEC_NEW_GAIN_PAYLOAD;
761 if (_getGainStatus(&(hDrcDec->uniDrcGain))) {
762 hDrcDec->status = DRC_DEC_NEW_GAIN_PAYLOAD;
763 }
728764
729765 return DRC_DEC_OK;
730766 }
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
169169 }
170170
171171 DRC_ERROR
172 drcDec_GainDecoder_Init(HANDLE_DRC_GAIN_DECODER hGainDec, const int frameSize,
173 const int sampleRate) {
172 drcDec_GainDecoder_Init(HANDLE_DRC_GAIN_DECODER hGainDec) {
174173 DRC_ERROR err = DE_OK;
175174
176 err = initGainDec(hGainDec, frameSize, sampleRate);
175 err = initGainDec(hGainDec);
177176 if (err) return err;
178177
179178 initDrcGainBuffers(hGainDec->frameSize, &hGainDec->drcGainBuffers);
180179
181180 return err;
181 }
182
183 DRC_ERROR
184 drcDec_GainDecoder_SetParam(HANDLE_DRC_GAIN_DECODER hGainDec,
185 const GAIN_DEC_PARAM paramType,
186 const int paramValue) {
187 switch (paramType) {
188 case GAIN_DEC_FRAME_SIZE:
189 if (paramValue < 0) return DE_PARAM_OUT_OF_RANGE;
190 hGainDec->frameSize = paramValue;
191 break;
192 case GAIN_DEC_SAMPLE_RATE:
193 if (paramValue < 0) return DE_PARAM_OUT_OF_RANGE;
194 hGainDec->deltaTminDefault = getDeltaTmin(paramValue);
195 break;
196 default:
197 return DE_PARAM_INVALID;
198 }
199 return DE_OK;
182200 }
183201
184202 DRC_ERROR
278296 int seq, gainSequenceCount;
279297 DRC_COEFFICIENTS_UNI_DRC* pCoef =
280298 selectDrcCoefficients(hUniDrcConfig, LOCATION_SELECTED);
281 if (pCoef == NULL) return DE_OK;
282
283 gainSequenceCount = fMin(pCoef->gainSequenceCount, (UCHAR)12);
299 if (pCoef && pCoef->gainSequenceCount) {
300 gainSequenceCount = fMin(pCoef->gainSequenceCount, (UCHAR)12);
301 } else {
302 gainSequenceCount = 1;
303 }
284304
285305 for (seq = 0; seq < gainSequenceCount; seq++) {
286306 int lastNodeIndex = 0;
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
133133 GAIN_DEC_DRC2_DRC3
134134 } GAIN_DEC_LOCATION;
135135
136 typedef enum { GAIN_DEC_FRAME_SIZE, GAIN_DEC_SAMPLE_RATE } GAIN_DEC_PARAM;
137
136138 typedef struct {
137139 FIXP_DBL gainLin; /* e = 7 */
138140 SHORT time;
194196 drcDec_GainDecoder_Open(HANDLE_DRC_GAIN_DECODER* phGainDec);
195197
196198 DRC_ERROR
197 drcDec_GainDecoder_Init(HANDLE_DRC_GAIN_DECODER hGainDec, const int frameSize,
198 const int sampleRate);
199 drcDec_GainDecoder_Init(HANDLE_DRC_GAIN_DECODER hGainDec);
200
201 DRC_ERROR
202 drcDec_GainDecoder_SetParam(HANDLE_DRC_GAIN_DECODER hGainDec,
203 const GAIN_DEC_PARAM paramType,
204 const int paramValue);
199205
200206 DRC_ERROR
201207 drcDec_GainDecoder_SetCodecDependentParameters(
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
184184 uniDrcConfigPresent = FDKreadBits(hBs, 1);
185185 if (uniDrcConfigPresent) {
186186 err = drcDec_readUniDrcConfig(hBs, hUniDrcConfig);
187 if (err) return err;
187 if (err) {
188 /* clear config, if parsing error occured */
189 FDKmemclear(hUniDrcConfig, sizeof(UNI_DRC_CONFIG));
190 hUniDrcConfig->diff = 1;
191 }
188192 }
189193 err = drcDec_readLoudnessInfoSet(hBs, hLoudnessInfoSet);
190 if (err) return err;
191 }
192
193 if (hUniDrcGain != NULL) {
194 err = drcDec_readUniDrcGain(hBs, hUniDrcConfig, frameSize, deltaTminDefault,
195 hUniDrcGain);
196 if (err) return err;
197 }
194 if (err) {
195 /* clear config, if parsing error occured */
196 FDKmemclear(hLoudnessInfoSet, sizeof(LOUDNESS_INFO_SET));
197 hLoudnessInfoSet->diff = 1;
198 }
199 }
200
201 err = drcDec_readUniDrcGain(hBs, hUniDrcConfig, frameSize, deltaTminDefault,
202 hUniDrcGain);
198203
199204 return err;
200205 }
478483 int seq, gainSequenceCount;
479484 DRC_COEFFICIENTS_UNI_DRC* pCoef =
480485 selectDrcCoefficients(hUniDrcConfig, LOCATION_SELECTED);
481 if (pCoef == NULL) return DE_OK;
482 if (hUniDrcGain == NULL) return DE_OK; /* hUniDrcGain not initialized yet */
483
484 gainSequenceCount = fMin(pCoef->gainSequenceCount, (UCHAR)12);
486 if (hUniDrcGain == NULL) return DE_NOT_OK;
487 hUniDrcGain->status = 0;
488 if (pCoef) {
489 gainSequenceCount = fMin(pCoef->gainSequenceCount, (UCHAR)12);
490 } else {
491 gainSequenceCount = 0;
492 }
485493
486494 for (seq = 0; seq < gainSequenceCount; seq++) {
487495 UCHAR index = pCoef->gainSetIndexForGainSequence[seq];
509517 if (err) return err;
510518 }
511519
520 if (err == DE_OK && gainSequenceCount > 0) {
521 hUniDrcGain->status = 1;
522 }
512523 return err;
513524 }
514525
902913 firFilterOrder;
903914 int uniqueEqSubbandGainsCount, eqSubbandGainRepresentation,
904915 eqSubbandGainCount;
905 EQ_SUBBAND_GAIN_FORMAT eqSubbandGainFormat;
916 int eqSubbandGainFormat;
906917
907918 eqDelayMaxPresent = FDKreadBits(hBs, 1);
908919 if (eqDelayMaxPresent) {
943954 uniqueEqSubbandGainsCount = FDKreadBits(hBs, 6);
944955 if (uniqueEqSubbandGainsCount > 0) {
945956 eqSubbandGainRepresentation = FDKreadBits(hBs, 1);
946 eqSubbandGainFormat = (EQ_SUBBAND_GAIN_FORMAT)FDKreadBits(hBs, 4);
957 eqSubbandGainFormat = FDKreadBits(hBs, 4);
947958 switch (eqSubbandGainFormat) {
948959 case GF_QMF32:
949960 eqSubbandGainCount = 32;
10091020 int additionalDrcSetIdPresent, additionalDrcSetIdCount;
10101021 int dependsOnEqSetPresent, eqChannelGroupCount, tdFilterCascadePresent,
10111022 subbandGainsPresent, eqTransitionDurationPresent;
1023 UCHAR eqChannelGroupForChannel[8];
10121024
10131025 FDKpushFor(hBs, 6); /* eqSetId */
10141026 FDKpushFor(hBs, 4); /* eqSetComplexityLevel */
10581070
10591071 eqChannelGroupCount = 0;
10601072 for (c = 0; c < channelCount; c++) {
1061 UCHAR eqChannelGroupForChannel[8];
10621073 int newGroup = 1;
10631074 if (c >= 8) return DE_MEMORY_ERROR;
10641075 eqChannelGroupForChannel[c] = FDKreadBits(hBs, 7);
11291140 drcCharacteristicLeftPresent = FDKreadBits(hBs, 1);
11301141 if (drcCharacteristicLeftPresent) {
11311142 pCoef->characteristicLeftCount = FDKreadBits(hBs, 4);
1132 if ((pCoef->characteristicLeftCount + 1) > 8) return DE_MEMORY_ERROR;
1143 if ((pCoef->characteristicLeftCount + 1) > 16) return DE_MEMORY_ERROR;
11331144 for (i = 0; i < pCoef->characteristicLeftCount; i++) {
11341145 err = _readCustomDrcCharacteristic(
11351146 hBs, CS_LEFT, &(pCoef->characteristicLeftFormat[i + 1]),
11401151 drcCharacteristicRightPresent = FDKreadBits(hBs, 1);
11411152 if (drcCharacteristicRightPresent) {
11421153 pCoef->characteristicRightCount = FDKreadBits(hBs, 4);
1143 if ((pCoef->characteristicRightCount + 1) > 8) return DE_MEMORY_ERROR;
1154 if ((pCoef->characteristicRightCount + 1) > 16) return DE_MEMORY_ERROR;
11441155 for (i = 0; i < pCoef->characteristicRightCount; i++) {
11451156 err = _readCustomDrcCharacteristic(
11461157 hBs, CS_RIGHT, &(pCoef->characteristicRightFormat[i + 1]),
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
101101
102102 #include "drcDec_selectionProcess.h"
103103 #include "drcDec_tools.h"
104
105 #define UNDEFINED_LOUDNESS_VALUE (FIXP_DBL) MAXVAL_DBL
106104
107105 typedef enum {
108106 DETR_NONE = 0,
554552 diff |= _compAssign(&pSelProcInput->loudnessMeasurementMethod,
555553 requestValueInt);
556554 break;
555 case SEL_PROC_ALBUM_MODE:
556 if ((requestValueInt < 0) || (requestValueInt > 1))
557 return DRCDEC_SELECTION_PROCESS_PARAM_OUT_OF_RANGE;
558 diff |= _compAssign(&pSelProcInput->albumMode, requestValueInt);
559 break;
557560 case SEL_PROC_DOWNMIX_ID:
558561 diff |=
559562 _compAssign(&pSelProcInput->targetConfigRequestType, TCRT_DOWNMIX_ID);
597600 if ((requestValue < (FIXP_DBL)0) ||
598601 (requestValue > FL2FXCONST_DBL(1.0f / (float)(1 << 1))))
599602 return DRCDEC_SELECTION_PROCESS_PARAM_OUT_OF_RANGE;
600 diff |= _compAssign(&pSelProcInput->boost, FX_DBL2FX_SGL(requestValue));
603 diff |= _compAssign(
604 &pSelProcInput->boost,
605 FX_DBL2FX_SGL(
606 requestValue +
607 (FIXP_DBL)(1 << 15))); /* convert to FIXP_SGL with rounding */
601608 break;
602609 case SEL_PROC_COMPRESS:
603610 if ((requestValue < (FIXP_DBL)0) ||
604611 (requestValue > FL2FXCONST_DBL(1.0f / (float)(1 << 1))))
605612 return DRCDEC_SELECTION_PROCESS_PARAM_OUT_OF_RANGE;
606 diff |=
607 _compAssign(&pSelProcInput->compress, FX_DBL2FX_SGL(requestValue));
613 diff |= _compAssign(
614 &pSelProcInput->compress,
615 FX_DBL2FX_SGL(
616 requestValue +
617 (FIXP_DBL)(1 << 15))); /* convert to FIXP_SGL with rounding */
608618 break;
609619 default:
610620 return DRCDEC_SELECTION_PROCESS_INVALID_PARAM;
740750 hSelProcInput->loudnessNormalizationOn = 1;
741751 hSelProcInput->targetLoudness = FL2FXCONST_DBL(-24.0f / (float)(1 << 7));
742752 hSelProcInput->loudnessDeviationMax = DEFAULT_LOUDNESS_DEVIATION_MAX;
743 hSelProcInput->loudnessMeasurementMethod = MDR_DEFAULT;
744 hSelProcInput->loudnessMeasurementSystem = MSR_DEFAULT;
753 hSelProcInput->loudnessMeasurementMethod = MDR_ANCHOR_LOUDNESS;
754 hSelProcInput->loudnessMeasurementSystem = MSR_EXPERT_PANEL;
745755 hSelProcInput->loudnessMeasurementPreProc = LPR_DEFAULT;
746756 hSelProcInput->deviceCutOffFrequency = 500;
747757 hSelProcInput->loudnessNormalizationGainDbMax =
943953 return DRCDEC_SELECTION_PROCESS_NO_ERROR;
944954 }
945955
946 /* #5: The number of DRC bands is supported. */
956 /* #5: The number of DRC bands is supported. Moreover, gainSetIndex and
957 * gainSequenceIndex are within the allowed range. */
947958 static DRCDEC_SELECTION_PROCESS_RETURN _preSelectionRequirement5(
948959 DRC_INSTRUCTIONS_UNI_DRC* pDrcInstructionUniDrc,
949960 DRC_COEFFICIENTS_UNI_DRC* pCoef, int* pMatchFound) {
950 int i;
961 int b, i;
951962
952963 *pMatchFound = 1;
964
965 if (pDrcInstructionUniDrc->drcSetId < 0) /* virtual DRC sets are okay */
966 {
967 return DRCDEC_SELECTION_PROCESS_NO_ERROR;
968 }
953969
954970 if (pCoef == NULL) /* check for parametricDRC */
955971 {
956 *pMatchFound = 1;
972 *pMatchFound = 0; /* parametricDRC not supported */
973 return DRCDEC_SELECTION_PROCESS_NO_ERROR;
974 }
975
976 if (pCoef->drcLocation !=
977 pDrcInstructionUniDrc
978 ->drcLocation) /* drcLocation must be LOCATION_SELECTED */
979 {
980 *pMatchFound = 0;
957981 return DRCDEC_SELECTION_PROCESS_NO_ERROR;
958982 }
959983
961985 int indexDrcCoeff = pDrcInstructionUniDrc->gainSetIndexForChannelGroup[i];
962986 int bandCount = 0;
963987
988 if (indexDrcCoeff >= 12) {
989 *pMatchFound = 0;
990 return DRCDEC_SELECTION_PROCESS_NO_ERROR;
991 }
992
964993 if (indexDrcCoeff > pCoef->gainSetCount - 1) /* check for parametricDRC */
965994 {
966 *pMatchFound = 1;
967 return DRCDEC_SELECTION_PROCESS_NO_ERROR;
995 continue;
968996 }
969997
970998 GAIN_SET* gainSet = &(pCoef->gainSet[indexDrcCoeff]);
9721000
9731001 if (bandCount > 4) {
9741002 *pMatchFound = 0;
1003 }
1004
1005 for (b = 0; b < bandCount; b++) {
1006 if ((gainSet->gainSequenceIndex[b] >= 12) ||
1007 (gainSet->gainSequenceIndex[b] >= pCoef->gainSequenceCount)) {
1008 *pMatchFound = 0;
1009 return DRCDEC_SELECTION_PROCESS_NO_ERROR;
1010 }
9751011 }
9761012 }
9771013
10631099 }
10641100
10651101 return retVal;
1102 }
1103
1104 static int _drcSetIsUsable(HANDLE_UNI_DRC_CONFIG hUniDrcConfig,
1105 DRC_INSTRUCTIONS_UNI_DRC* pInst) {
1106 int usable = 0;
1107 DRC_COEFFICIENTS_UNI_DRC* pCoef =
1108 selectDrcCoefficients(hUniDrcConfig, LOCATION_SELECTED);
1109
1110 /* check if ID is unique */
1111 if (selectDrcInstructions(hUniDrcConfig, pInst->drcSetId) != pInst) return 0;
1112 /* sanity check on drcInstructions */
1113 _preSelectionRequirement5(pInst, pCoef, &usable);
1114 return usable;
10661115 }
10671116
10681117 /* #8: The range of the target loudness specified for a DRC set has to include
10841133
10851134 FIXP_DBL loudnessDeviationMax =
10861135 ((FIXP_DBL)hSelProcInput->loudnessDeviationMax) << (DFRACT_BITS - 1 - 7);
1087 ;
1088
1089 if (hSelProcInput->loudnessNormalizationOn) {
1136
1137 {
10901138 retVal = _getLoudness(hLoudnessInfoSet, hSelProcInput->albumMode,
10911139 hSelProcInput->loudnessMeasurementMethod,
10921140 hSelProcInput->loudnessMeasurementSystem,
10951143 hSelProcInput->downmixIdRequested[downmixIdIndex],
10961144 &loudnessNormalizationGainDb, &loudness);
10971145 if (retVal) return (retVal);
1098 } else {
1146 }
1147
1148 if (!hSelProcInput->loudnessNormalizationOn) {
10991149 loudnessNormalizationGainDb = (FIXP_DBL)0;
1100 loudness = UNDEFINED_LOUDNESS_VALUE;
11011150 }
11021151
11031152 retVal = _getSignalPeakLevel(
20182067 pSelectionData->loudnessNormalizationGainDbAdjusted +
20192068 hSelProcInput->loudnessNormalizationGainModificationDb;
20202069 hSelProcOutput->outputPeakLevelDb = pSelectionData->outputPeakLevel;
2070 hSelProcOutput->outputLoudness = pSelectionData->outputLoudness;
20212071
20222072 hSelProcOutput->boost = boost;
20232073 hSelProcOutput->compress = compress;
20382088 int dependsOnDrcSetID = pSelectionData->pInst->dependsOnDrcSet;
20392089
20402090 for (i = 0; i < hUniDrcConfig->drcInstructionsCountInclVirtual; i++) {
2041 if (hUniDrcConfig->drcInstructionsUniDrc[i].drcSetId ==
2042 dependsOnDrcSetID) {
2091 DRC_INSTRUCTIONS_UNI_DRC* pInst =
2092 &(hUniDrcConfig->drcInstructionsUniDrc[i]);
2093 if (!_drcSetIsUsable(hUniDrcConfig, pInst)) continue;
2094
2095 if (pInst->drcSetId == dependsOnDrcSetID) {
20432096 hSelProcOutput->selectedDrcSetIds[hSelProcOutput->numSelectedDrcSets] =
20442097 hUniDrcConfig->drcInstructionsUniDrc[i].drcSetId;
20452098 hSelProcOutput->selectedDownmixIds[hSelProcOutput->numSelectedDrcSets] =
20582111 for (i = 0; i < hUniDrcConfig->drcInstructionsUniDrcCount; i++) {
20592112 DRC_INSTRUCTIONS_UNI_DRC* pInst =
20602113 &(hUniDrcConfig->drcInstructionsUniDrc[i]);
2114 if (!_drcSetIsUsable(hUniDrcConfig, pInst)) continue;
20612115
20622116 if (pInst->drcSetEffect & EB_FADE) {
20632117 if (pInst->downmixId[0] == DOWNMIX_ID_ANY_DOWNMIX) {
20852139 for (i = 0; i < hUniDrcConfig->drcInstructionsUniDrcCount; i++) {
20862140 DRC_INSTRUCTIONS_UNI_DRC* pInst =
20872141 &(hUniDrcConfig->drcInstructionsUniDrc[i]);
2142 if (!_drcSetIsUsable(hUniDrcConfig, pInst)) continue;
20882143
20892144 if (pInst->drcSetEffect & (EB_DUCK_OTHER | EB_DUCK_SELF)) {
20902145 for (j = 0; j < pInst->downmixIdCount; j++) {
21112166 for (i = 0; i < hUniDrcConfig->drcInstructionsUniDrcCount; i++) {
21122167 DRC_INSTRUCTIONS_UNI_DRC* pInst =
21132168 &(hUniDrcConfig->drcInstructionsUniDrc[i]);
2169 if (!_drcSetIsUsable(hUniDrcConfig, pInst)) continue;
21142170
21152171 if (pInst->drcSetEffect & (EB_DUCK_OTHER | EB_DUCK_SELF)) {
21162172 for (j = 0; j < pInst->downmixIdCount; j++) {
21722228 if (hSelProcOutput->activeDownmixId != 0) {
21732229 for (i = 0; i < hUniDrcConfig->downmixInstructionsCount; i++) {
21742230 DOWNMIX_INSTRUCTIONS* pDown = &(hUniDrcConfig->downmixInstructions[i]);
2231 if (pDown->targetChannelCount > 8) {
2232 continue;
2233 }
21752234
21762235 if (hSelProcOutput->activeDownmixId == pDown->downmixId) {
21772236 hSelProcOutput->targetChannelCount = pDown->targetChannelCount;
22152274 for (j = 0; j < hUniDrcConfig->drcInstructionsCountInclVirtual; j++) {
22162275 DRC_INSTRUCTIONS_UNI_DRC* pDrcInstruction =
22172276 &(hUniDrcConfig->drcInstructionsUniDrc[j]);
2277 /* check if ID is unique */
2278 if (selectDrcInstructions(hUniDrcConfig, pDrcInstruction->drcSetId) !=
2279 pDrcInstruction)
2280 continue;
2281
22182282 retVal = _drcSetPreSelectionSingleInstruction(
22192283 hSelProcInput, i, hUniDrcConfig, hLoudnessInfoSet, pDrcInstruction,
22202284 *ppCandidatesPotential, *ppCandidatesSelected, codecMode);
28242888 for (i = 0; i < hUniDrcConfig->downmixInstructionsCount; i++) {
28252889 if (hUniDrcConfig->downmixInstructions[i].downmixId == downmixId) {
28262890 if (hUniDrcConfig->downmixInstructions[i].downmixCoefficientsPresent) {
2891 if (hUniDrcConfig->downmixInstructions[i].targetChannelCount > 8)
2892 return 0;
28272893 *pIndex = i;
28282894 return 1;
28292895 }
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
110110
111111 typedef struct s_drcdec_selection_process* HANDLE_DRC_SELECTION_PROCESS;
112112
113 #define UNDEFINED_LOUDNESS_VALUE (FIXP_DBL)(MAXVAL_DBL - 1)
114
113115 typedef enum {
114116 DRCDEC_SELECTION_PROCESS_NO_ERROR = 0,
115117
145147 SEL_PROC_EFFECT_TYPE,
146148 SEL_PROC_EFFECT_TYPE_FALLBACK_CODE,
147149 SEL_PROC_LOUDNESS_MEASUREMENT_METHOD,
150 SEL_PROC_ALBUM_MODE,
148151 SEL_PROC_DOWNMIX_ID,
149152 SEL_PROC_TARGET_LAYOUT,
150153 SEL_PROC_TARGET_CHANNEL_COUNT,
129129
130130 UCHAR uniDrcGainExtPresent;
131131 UNI_DRC_GAIN_EXTENSION uniDrcGainExtension;
132
133 /* derived data */
134 UCHAR status;
132135 } UNI_DRC_GAIN, *HANDLE_UNI_DRC_GAIN;
133136
134137 /****************/
248251 UCHAR drcFrameSizePresent;
249252 USHORT drcFrameSize;
250253 UCHAR characteristicLeftCount;
251 UCHAR characteristicLeftFormat[8];
252 CUSTOM_DRC_CHAR customCharacteristicLeft[8];
254 UCHAR characteristicLeftFormat[16];
255 CUSTOM_DRC_CHAR customCharacteristicLeft[16];
253256 UCHAR characteristicRightCount;
254 UCHAR characteristicRightFormat[8];
255 CUSTOM_DRC_CHAR customCharacteristicRight[8];
257 UCHAR characteristicRightFormat[16];
258 CUSTOM_DRC_CHAR customCharacteristicRight[16];
256259 UCHAR
257260 gainSequenceCount; /* unsaturated value, i.e. as provided in bitstream */
258261 UCHAR gainSetCount; /* saturated to 12 */
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
183183 }
184184
185185 DRC_ERROR
186 initGainDec(HANDLE_DRC_GAIN_DECODER hGainDec, const int frameSize,
187 const int sampleRate) {
186 initGainDec(HANDLE_DRC_GAIN_DECODER hGainDec) {
188187 int i, j, k;
189188
190 if (frameSize < 1) {
191 return DE_NOT_OK;
192 }
193
194 hGainDec->frameSize = frameSize;
195
196 if (hGainDec->frameSize * 1000 < sampleRate) {
197 return DE_NOT_OK;
198 }
199
200 hGainDec->deltaTminDefault = getDeltaTmin(sampleRate);
201 if (hGainDec->deltaTminDefault > hGainDec->frameSize) {
202 return DE_NOT_OK;
203 }
189 /* sanity check */
190 if (hGainDec->deltaTminDefault > hGainDec->frameSize) return DE_NOT_OK;
204191
205192 for (i = 0; i < MAX_ACTIVE_DRCS; i++) {
206193 for (j = 0; j < 8; j++) {
335322 for (a = 0; a < hGainDec->nActiveDrcs; a++) {
336323 hGainDec->activeDrc[a].activeDrcOffset = accGainElementCount;
337324 accGainElementCount += hGainDec->activeDrc[a].gainElementCount;
338 }
339
340 if (accGainElementCount > 12) return DE_NOT_OK;
325 if (accGainElementCount > 12) {
326 hGainDec->nActiveDrcs = a;
327 return DE_NOT_OK;
328 }
329 }
341330
342331 return DE_OK;
343332 }
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
103103 #define DRCGAINDEC_INIT_H
104104
105105 DRC_ERROR
106 initGainDec(HANDLE_DRC_GAIN_DECODER hGainDec, const int frameSize,
107 const int sampleRate);
106 initGainDec(HANDLE_DRC_GAIN_DECODER hGainDec);
108107
109108 void initDrcGainBuffers(const int frameSize, DRC_GAIN_BUFFERS* drcGainBuffers);
110109
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
284284 &e_tmp2);
285285 invExp = fDivNorm(FL2FXCONST_DBL(1.0f / (float)(1 << 1)), exp, &e_invExp);
286286 e_invExp += 1 - 5;
287 if (tmp2 < (FIXP_DBL)0) {
288 return DE_NOT_OK;
289 }
287290 denom = fPow(tmp2, e_tmp2, invExp, e_invExp, &e_denom);
288291 *out = fDivNormSigned(tmp, denom, &e_out);
289292 e_out += 7 - e_denom;
675678 nDrcBands = pActiveDrc->bandCountForChannelGroup[g];
676679 for (b = 0; b < nDrcBands; b++) {
677680 DRC_ERROR err = DE_OK;
678 if (gainSetIndex >= 12) return DE_PARAM_OUT_OF_RANGE;
679681 GAIN_SET* pGainSet = &(pCoef->gainSet[gainSetIndex]);
680682 int seq = pGainSet->gainSequenceIndex[b];
681683 DRC_CHARACTERISTIC* pDChar = &(pGainSet->drcCharacteristic[b]);
694696 err = _prepareDrcCharacteristic(pDChar, pCoef, b, &nodeMod);
695697 if (err) return err;
696698
697 if (seq >= 12) return DE_PARAM_OUT_OF_RANGE;
698699 /* copy a node buffer and convert from dB to linear */
699700 pLnb->nNodes[lnbp] = fMin((int)hUniDrcGain->nNodes[seq], 16);
700701 for (i = 0; i < pLnb->nNodes[lnbp]; i++) {
307307 pLinearNodeBuffer[pActiveDrc->lnbIndexForChannel[c][lnbIx] + b]);
308308 else
309309 pLnbPrevious = pDummyLnb;
310 if (pLnbPrevious->nNodes[lnbIx] <= 0 || pLnbPrevious->nNodes[lnbIx] > 16)
311 return DE_NOT_OK;
312310 nodePrevious =
313311 pLnbPrevious->linearNode[lnbIx][pLnbPrevious->nNodes[lnbIx] - 1];
314312 nodePrevious.time -= hGainDec->frameSize;
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
122122 #define QMF_WB_SECTION_SIZE (1024 * 2)
123123
124124 H_ALLOC_MEM_OVERLAY(QmfWorkBufferCore1, FIXP_DBL)
125 H_ALLOC_MEM_OVERLAY(QmfWorkBufferCore2, FIXP_DBL)
126125 H_ALLOC_MEM_OVERLAY(QmfWorkBufferCore3, FIXP_DBL)
127126 H_ALLOC_MEM_OVERLAY(QmfWorkBufferCore4, FIXP_DBL)
128 H_ALLOC_MEM_OVERLAY(QmfWorkBufferCore5, FIXP_DBL)
129127 H_ALLOC_MEM_OVERLAY(QmfWorkBufferCore6, FIXP_DBL)
128 H_ALLOC_MEM_OVERLAY(QmfWorkBufferCore7, FIXP_DBL)
130129
131130 #define QMF_DOMAIN_MAX_ANALYSIS_QMF_BANDS (64)
132131 #define QMF_DOMAIN_MAX_SYNTHESIS_QMF_BANDS (QMF_MAX_SYNTHESIS_BANDS)
144143 #define QMF_DOMAIN_OV_TIMESLOTS_16 (3)
145144 #define QMF_DOMAIN_OV_TIMESLOTS_32 (6)
146145
147 H_ALLOC_MEM(AnaQmfStates, FIXP_QAS)
146 H_ALLOC_MEM(AnaQmfStates, FIXP_DBL)
148147 H_ALLOC_MEM(SynQmfStates, FIXP_QSS)
149148 H_ALLOC_MEM(QmfSlotsReal, FIXP_DBL *)
150149 H_ALLOC_MEM(QmfSlotsImag, FIXP_DBL *)
151150 H_ALLOC_MEM(QmfOverlapBuffer, FIXP_DBL)
152151
153 H_ALLOC_MEM(AnaQmfStates16, FIXP_QAS)
154 H_ALLOC_MEM(AnaQmfStates24, FIXP_QAS)
155 H_ALLOC_MEM(AnaQmfStates32, FIXP_QAS)
152 H_ALLOC_MEM(AnaQmfStates16, FIXP_DBL)
153 H_ALLOC_MEM(AnaQmfStates24, FIXP_DBL)
154 H_ALLOC_MEM(AnaQmfStates32, FIXP_DBL)
156155 H_ALLOC_MEM(QmfSlotsReal16, FIXP_DBL *)
157156 H_ALLOC_MEM(QmfSlotsReal32, FIXP_DBL *)
158157 H_ALLOC_MEM(QmfSlotsImag16, FIXP_DBL *)
159158 H_ALLOC_MEM(QmfSlotsImag32, FIXP_DBL *)
160159 H_ALLOC_MEM(QmfOverlapBuffer16, FIXP_DBL)
161160 H_ALLOC_MEM(QmfOverlapBuffer32, FIXP_DBL)
162
163 #define QDOM_PCM INT_PCM
164161
165162 /**
166163 * Structure to hold the configuration data which is global whithin a QMF domain
181178 park a channel if only one processing channel is
182179 available. */
183180 UCHAR parkChannel_requested;
184 QDOM_PCM
185 *TDinput; /*!< Pointer to time domain data used as input for the QMF
186 analysis. */
187181 FIXP_DBL *
188182 pWorkBuffer[QMF_MAX_WB_SECTIONS]; /*!< Pointerarray to volatile memory. */
189183 UINT flags; /*!< Flags to be set on all QMF analysis/synthesis filter
243237 (workBuf_nTimeSlots * workBuf_nBands * CMPLX_MOD). */
244238 USHORT workBufferOffset; /*!< Offset within work buffer. */
245239 USHORT workBufferSectSize; /*!< Size of work buffer section. */
246 FIXP_QAS *
240 FIXP_DBL *
247241 pAnaQmfStates; /*!< Pointer to QMF analysis states (persistent memory). */
248242 FIXP_DBL
249243 *pOverlapBuffer; /*!< Pointer to QMF overlap/delay memory (persistent
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
170170 * \return non-zero if (a_m*2^a_e) < (b_m*2^b_e), 0 otherwise
171171 */
172172 FDK_INLINE INT fIsLessThan(FIXP_DBL a_m, INT a_e, FIXP_DBL b_m, INT b_e) {
173 INT n;
174
175 n = fixnorm_D(a_m);
176 a_m <<= n;
177 a_e -= n;
178
179 n = fixnorm_D(b_m);
180 b_m <<= n;
181 b_e -= n;
182
183 if (a_m == (FIXP_DBL)0) a_e = b_e;
184 if (b_m == (FIXP_DBL)0) b_e = a_e;
185
173186 if (a_e > b_e) {
174187 return ((b_m >> fMin(a_e - b_e, DFRACT_BITS - 1)) > a_m);
175188 } else {
178191 }
179192
180193 FDK_INLINE INT fIsLessThan(FIXP_SGL a_m, INT a_e, FIXP_SGL b_m, INT b_e) {
194 INT n;
195
196 n = fixnorm_S(a_m);
197 a_m <<= n;
198 a_e -= n;
199
200 n = fixnorm_S(b_m);
201 b_m <<= n;
202 b_e -= n;
203
204 if (a_m == (FIXP_SGL)0) a_e = b_e;
205 if (b_m == (FIXP_SGL)0) b_e = a_e;
206
181207 if (a_e > b_e) {
182208 return ((b_m >> fMin(a_e - b_e, FRACT_BITS - 1)) > a_m);
183209 } else {
544570 m = fMultNorm(a, (FIXP_DBL)b, &m_e);
545571
546572 if (m_e < (INT)0) {
547 if (m_e > (INT)-DFRACT_BITS) {
573 if (m_e > (INT) - (DFRACT_BITS - 1)) {
548574 mi = (m >> (-m_e));
549575 if ((LONG)m & ((1 << (-m_e)) - 1)) {
550576 mi = mi + (FIXP_DBL)1;
551577 }
552578 } else {
553 mi = (FIXP_DBL)1;
554 if (m < (FIXP_DBL)0) {
555 mi = (FIXP_DBL)0;
579 if (m > (FIXP_DBL)0) {
580 mi = (FIXP_DBL)1;
581 } else {
582 if ((m_e == -(DFRACT_BITS - 1)) && (m == (FIXP_DBL)MINVAL_DBL)) {
583 mi = (FIXP_DBL)-1;
584 } else {
585 mi = (FIXP_DBL)0;
586 }
556587 }
557588 }
558589 } else {
743774
744775 /**
745776 * \brief return (base_m * 2^base_e) ^ N
746 * \param base_m mantissa of the base
777 * \param base_m mantissa of the base. Must not be negative.
747778 * \param base_e exponent of the base
748779 * \param N power to be calculated of the base
749780 * \param result_e pointer to a INT where the exponent of the result will be
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
105105 #include "common_fix.h"
106106
107107 #define MDCT_OUT_HEADROOM 2 /* Output additional headroom */
108 #define PCM_OUT_BITS SAMPLE_BITS
108
109 #define PCM_OUT_BITS DFRACT_BITS
109110 #define PCM_OUT_HEADROOM 8 /* Must have the same values as DMXH_HEADROOM */
110111
111 #define MDCT_OUTPUT_SCALE (-MDCT_OUT_HEADROOM + (DFRACT_BITS - SAMPLE_BITS))
112 #define MDCT_OUTPUT_SCALE (-MDCT_OUT_HEADROOM + (DFRACT_BITS - PCM_OUT_BITS))
112113 /* Refer to "Output word length" in ISO/IEC 14496-3:2008(E) 23.2.3.6 */
113114 #define MDCT_OUTPUT_GAIN 16
114115
115 #if (MDCT_OUTPUT_SCALE >= 0)
116 #define IMDCT_SCALE(x) SATURATE_RIGHT_SHIFT(x, MDCT_OUTPUT_SCALE, PCM_OUT_BITS)
117 #else
118 #define IMDCT_SCALE(x) SATURATE_LEFT_SHIFT(x, -MDCT_OUTPUT_SCALE, PCM_OUT_BITS)
119 #endif
116 #define IMDCT_SCALE(x, s) \
117 SATURATE_RIGHT_SHIFT((x), ((s) + MDCT_OUTPUT_SCALE), PCM_OUT_BITS)
120118 #define IMDCT_SCALE_DBL(x) (FIXP_DBL)(x)
121119 #define IMDCT_SCALE_DBL_LSH1(x) SATURATE_LEFT_SHIFT_ALT((x), 1, DFRACT_BITS)
122120
106106
107107 #if defined(__GNUC__) && defined(__mips__)
108108
109 #if defined(__mips_dsp)
109 #if defined(__mips_dsp) && !defined(__mips16)
110110 #define FUNCTION_fixabs_D
111111 #define FUNCTION_fixabs_I
112112 #define FUNCTION_fixabs_S
102102 #ifndef SCALE_MIPS_H
103103 #define SCALE_MIPS_H
104104
105 #if defined(__mips_dsp)
105 #if defined(__mips_dsp) && !defined(__mips16)
106106
107107 /*!
108108 *
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
115115
116116 #define FIXP_QAS FIXP_PCM
117117 #define QAS_BITS SAMPLE_BITS
118 #define INT_PCM_QMFIN INT_PCM
118119
119120 #define FIXP_QSS FIXP_DBL
120121 #define QSS_BITS DFRACT_BITS
200201
201202 typedef struct QMF_FILTER_BANK *HANDLE_QMF_FILTER_BANK;
202203
204 int qmfInitAnalysisFilterBank(
205 HANDLE_QMF_FILTER_BANK h_Qmf, /*!< QMF Handle */
206 FIXP_QAS *pFilterStates, /*!< Pointer to filter state buffer */
207 int noCols, /*!< Number of time slots */
208 int lsb, /*!< Number of lower bands */
209 int usb, /*!< Number of upper bands */
210 int no_channels, /*!< Number of critically sampled bands */
211 int flags); /*!< Flags */
212 #if SAMPLE_BITS == 16
213
214 int qmfInitAnalysisFilterBank(
215 HANDLE_QMF_FILTER_BANK h_Qmf, /*!< QMF Handle */
216 FIXP_DBL *pFilterStates, /*!< Pointer to filter state buffer */
217 int noCols, /*!< Number of time slots */
218 int lsb, /*!< Number of lower bands */
219 int usb, /*!< Number of upper bands */
220 int no_channels, /*!< Number of critically sampled bands */
221 int flags); /*!< Flags */
222 #endif
223
224 void qmfAnalysisFiltering(
225 HANDLE_QMF_FILTER_BANK anaQmf, /*!< Handle of Qmf Analysis Bank */
226 FIXP_DBL **qmfReal, /*!< Pointer to real subband slots */
227 FIXP_DBL **qmfImag, /*!< Pointer to imag subband slots */
228 QMF_SCALE_FACTOR *scaleFactor, /*!< Scale factors of QMF data */
229 const INT_PCM *timeIn, /*!< Time signal */
230 const int timeIn_e, /*!< Exponent of audio data */
231 const int stride, /*!< Stride factor of audio data */
232 FIXP_DBL *pWorkBuffer /*!< pointer to temporal working buffer */
233 );
234 #if SAMPLE_BITS == 16
235
203236 void qmfAnalysisFiltering(
204237 HANDLE_QMF_FILTER_BANK anaQmf, /*!< Handle of Qmf Analysis Bank */
205238 FIXP_DBL **qmfReal, /*!< Pointer to real subband slots */
210243 const int stride, /*!< Stride factor of audio data */
211244 FIXP_DBL *pWorkBuffer /*!< pointer to temporary working buffer */
212245 );
213
214 void qmfAnalysisFiltering(
215 HANDLE_QMF_FILTER_BANK anaQmf, /*!< Handle of Qmf Analysis Bank */
216 FIXP_DBL **qmfReal, /*!< Pointer to real subband slots */
217 FIXP_DBL **qmfImag, /*!< Pointer to imag subband slots */
218 QMF_SCALE_FACTOR *scaleFactor, /*!< Scale factors of QMF data */
219 const INT_PCM *timeIn, /*!< Time signal */
220 const int timeIn_e, /*!< Exponent of audio data */
221 const int stride, /*!< Stride factor of audio data */
246 #endif
247
248 void qmfAnalysisFilteringSlot(
249 HANDLE_QMF_FILTER_BANK anaQmf, /*!< Handle of Qmf Synthesis Bank */
250 FIXP_DBL *qmfReal, /*!< Low and High band, real */
251 FIXP_DBL *qmfImag, /*!< Low and High band, imag */
252 const INT_PCM *timeIn, /*!< Pointer to input */
253 const int stride, /*!< stride factor of input */
222254 FIXP_DBL *pWorkBuffer /*!< pointer to temporal working buffer */
223255 );
256 #if SAMPLE_BITS == 16
257
258 void qmfAnalysisFilteringSlot(
259 HANDLE_QMF_FILTER_BANK anaQmf, /*!< Handle of Qmf Synthesis Bank */
260 FIXP_DBL *qmfReal, /*!< Low and High band, real */
261 FIXP_DBL *qmfImag, /*!< Low and High band, imag */
262 const LONG *timeIn, /*!< Pointer to input */
263 const int stride, /*!< stride factor of input */
264 FIXP_DBL *pWorkBuffer /*!< pointer to temporary working buffer */
265 );
266 #endif
267
268 int qmfInitSynthesisFilterBank(
269 HANDLE_QMF_FILTER_BANK h_Qmf, /*!< QMF Handle */
270 FIXP_QSS *pFilterStates, /*!< Pointer to filter state buffer */
271 int noCols, /*!< Number of time slots */
272 int lsb, /*!< Number of lower bands */
273 int usb, /*!< Number of upper bands */
274 int no_channels, /*!< Number of critically sampled bands */
275 int flags); /*!< Flags */
224276
225277 void qmfSynthesisFiltering(
226278 HANDLE_QMF_FILTER_BANK synQmf, /*!< Handle of Qmf Synthesis Bank */
233285 FIXP_DBL *pWorkBuffer /*!< pointer to temporary working buffer. It must be
234286 aligned */
235287 );
236
237 int qmfInitAnalysisFilterBank(
238 HANDLE_QMF_FILTER_BANK h_Qmf, /*!< QMF Handle */
239 FIXP_QAS *pFilterStates, /*!< Pointer to filter state buffer */
240 int noCols, /*!< Number of time slots */
241 int lsb, /*!< Number of lower bands */
242 int usb, /*!< Number of upper bands */
243 int no_channels, /*!< Number of critically sampled bands */
244 int flags); /*!< Flags */
245
246 void qmfAnalysisFilteringSlot(
247 HANDLE_QMF_FILTER_BANK anaQmf, /*!< Handle of Qmf Synthesis Bank */
248 FIXP_DBL *qmfReal, /*!< Low and High band, real */
249 FIXP_DBL *qmfImag, /*!< Low and High band, imag */
250 const LONG *timeIn, /*!< Pointer to input */
251 const int stride, /*!< stride factor of input */
252 FIXP_DBL *pWorkBuffer /*!< pointer to temporary working buffer */
253 );
254
255 void qmfAnalysisFilteringSlot(
256 HANDLE_QMF_FILTER_BANK anaQmf, /*!< Handle of Qmf Synthesis Bank */
257 FIXP_DBL *qmfReal, /*!< Low and High band, real */
258 FIXP_DBL *qmfImag, /*!< Low and High band, imag */
259 const INT_PCM *timeIn, /*!< Pointer to input */
260 const int stride, /*!< stride factor of input */
261 FIXP_DBL *pWorkBuffer /*!< pointer to temporal working buffer */
262 );
263 int qmfInitSynthesisFilterBank(
264 HANDLE_QMF_FILTER_BANK h_Qmf, /*!< QMF Handle */
265 FIXP_QSS *pFilterStates, /*!< Pointer to filter state buffer */
266 int noCols, /*!< Number of time slots */
267 int lsb, /*!< Number of lower bands */
268 int usb, /*!< Number of upper bands */
269 int no_channels, /*!< Number of critically sampled bands */
270 int flags); /*!< Flags */
288 #if SAMPLE_BITS == 16
289
290 void qmfSynthesisFiltering(
291 HANDLE_QMF_FILTER_BANK synQmf, /*!< Handle of Qmf Synthesis Bank */
292 FIXP_DBL **QmfBufferReal, /*!< Pointer to real subband slots */
293 FIXP_DBL **QmfBufferImag, /*!< Pointer to imag subband slots */
294 const QMF_SCALE_FACTOR *scaleFactor, /*!< Scale factors of QMF data */
295 const int ov_len, /*!< Length of band overlap */
296 LONG *timeOut, /*!< Time signal */
297 const int timeOut_e, /*!< Target exponent for timeOut */
298 FIXP_DBL *pWorkBuffer /*!< pointer to temporary working buffer */
299 );
300 #endif
271301
272302 void qmfSynthesisFilteringSlot(HANDLE_QMF_FILTER_BANK synQmf,
273303 const FIXP_DBL *realSlot,
275305 const int scaleFactorLowBand,
276306 const int scaleFactorHighBand, INT_PCM *timeOut,
277307 const int timeOut_e, FIXP_DBL *pWorkBuffer);
308 #if SAMPLE_BITS == 16
309
310 void qmfSynthesisFilteringSlot(HANDLE_QMF_FILTER_BANK synQmf,
311 const FIXP_DBL *realSlot,
312 const FIXP_DBL *imagSlot,
313 const int scaleFactorLowBand,
314 const int scaleFactorHighBand, LONG *timeOut,
315 const int timeOut_e, FIXP_DBL *pWorkBuffer);
316 #endif
278317
279318 void qmfChangeOutScalefactor(
280319 HANDLE_QMF_FILTER_BANK synQmf, /*!< Handle of Qmf Synthesis Bank */
290329 FIXP_DBL outputGain, /*!< New gain for output data (mantissa) */
291330 int outputGainScale /*!< New gain for output data (exponent) */
292331 );
293 void qmfSynPrototypeFirSlot(
294 HANDLE_QMF_FILTER_BANK qmf,
295 FIXP_DBL *RESTRICT realSlot, /*!< Input: Pointer to real Slot */
296 FIXP_DBL *RESTRICT imagSlot, /*!< Input: Pointer to imag Slot */
297 INT_PCM *RESTRICT timeOut, /*!< Time domain data */
298 const int timeOut_e);
299332
300333 #endif /*ifndef QMF_H */
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
401401 timeOut + (i * L * stride), stride, pWorkBuffer);
402402 } /* no_col loop i */
403403 }
404
405 /*!
406 *
407 * \brief Create QMF filter bank instance
408 *
409 *
410 * \return 0 if successful
411 *
412 */
413 int qmfInitAnalysisFilterBank(
414 HANDLE_QMF_FILTER_BANK h_Qmf, /*!< Returns handle */
415 FIXP_QAS *pFilterStates, /*!< Handle to filter states */
416 int noCols, /*!< Number of timeslots per frame */
417 int lsb, /*!< lower end of QMF */
418 int usb, /*!< upper end of QMF */
419 int no_channels, /*!< Number of channels (bands) */
420 int flags) /*!< Low Power flag */
421 {
422 int err = qmfInitFilterBank(h_Qmf, pFilterStates, noCols, lsb, usb,
423 no_channels, flags, 0);
424 if (!(flags & QMF_FLAG_KEEP_STATES) && (h_Qmf->FilterStates != NULL)) {
425 FDKmemclear(h_Qmf->FilterStates,
426 (2 * QMF_NO_POLY - 1) * h_Qmf->no_channels * sizeof(FIXP_QAS));
427 }
428
429 FDK_ASSERT(h_Qmf->no_channels >= h_Qmf->lsb);
430
431 return err;
432 }
433
434 #ifndef FUNCTION_qmfAnaPrototypeFirSlot
435 /*!
436 \brief Perform Analysis Prototype Filtering on a single slot of input data.
437 */
438 static void qmfAnaPrototypeFirSlot(
439 FIXP_DBL *analysisBuffer,
440 INT no_channels, /*!< Number channels of analysis filter */
441 const FIXP_PFT *p_filter, INT p_stride, /*!< Stride of analysis filter */
442 FIXP_QAS *RESTRICT pFilterStates) {
443 INT k;
444
445 FIXP_DBL accu;
446 const FIXP_PFT *RESTRICT p_flt = p_filter;
447 FIXP_DBL *RESTRICT pData_0 = analysisBuffer + 2 * no_channels - 1;
448 FIXP_DBL *RESTRICT pData_1 = analysisBuffer;
449
450 FIXP_QAS *RESTRICT sta_0 = (FIXP_QAS *)pFilterStates;
451 FIXP_QAS *RESTRICT sta_1 =
452 (FIXP_QAS *)pFilterStates + (2 * QMF_NO_POLY * no_channels) - 1;
453 INT pfltStep = QMF_NO_POLY * (p_stride);
454 INT staStep1 = no_channels << 1;
455 INT staStep2 = (no_channels << 3) - 1; /* Rewind one less */
456
457 /* FIR filters 127..64 0..63 */
458 for (k = 0; k < no_channels; k++) {
459 accu = fMultDiv2(p_flt[0], *sta_1);
460 sta_1 -= staStep1;
461 accu += fMultDiv2(p_flt[1], *sta_1);
462 sta_1 -= staStep1;
463 accu += fMultDiv2(p_flt[2], *sta_1);
464 sta_1 -= staStep1;
465 accu += fMultDiv2(p_flt[3], *sta_1);
466 sta_1 -= staStep1;
467 accu += fMultDiv2(p_flt[4], *sta_1);
468 *pData_1++ = (accu << 1);
469 sta_1 += staStep2;
470
471 p_flt += pfltStep;
472 accu = fMultDiv2(p_flt[0], *sta_0);
473 sta_0 += staStep1;
474 accu += fMultDiv2(p_flt[1], *sta_0);
475 sta_0 += staStep1;
476 accu += fMultDiv2(p_flt[2], *sta_0);
477 sta_0 += staStep1;
478 accu += fMultDiv2(p_flt[3], *sta_0);
479 sta_0 += staStep1;
480 accu += fMultDiv2(p_flt[4], *sta_0);
481 *pData_0-- = (accu << 1);
482 sta_0 -= staStep2;
483 }
484 }
485 #endif /* !defined(FUNCTION_qmfAnaPrototypeFirSlot) */
486
487 #ifndef FUNCTION_qmfAnaPrototypeFirSlot_NonSymmetric
488 /*!
489 \brief Perform Analysis Prototype Filtering on a single slot of input data.
490 */
491 static void qmfAnaPrototypeFirSlot_NonSymmetric(
492 FIXP_DBL *analysisBuffer,
493 int no_channels, /*!< Number channels of analysis filter */
494 const FIXP_PFT *p_filter, int p_stride, /*!< Stride of analysis filter */
495 FIXP_QAS *RESTRICT pFilterStates) {
496 const FIXP_PFT *RESTRICT p_flt = p_filter;
497 int p, k;
498
499 for (k = 0; k < 2 * no_channels; k++) {
500 FIXP_DBL accu = (FIXP_DBL)0;
501
502 p_flt += QMF_NO_POLY * (p_stride - 1);
503
504 /*
505 Perform FIR-Filter
506 */
507 for (p = 0; p < QMF_NO_POLY; p++) {
508 accu += fMultDiv2(*p_flt++, pFilterStates[2 * no_channels * p]);
509 }
510 analysisBuffer[2 * no_channels - 1 - k] = (accu << 1);
511 pFilterStates++;
512 }
513 }
514 #endif /* FUNCTION_qmfAnaPrototypeFirSlot_NonSymmetric */
515
516 /*
517 * \brief Perform one QMF slot analysis of the time domain data of timeIn
518 * with specified stride and stores the real part of the subband
519 * samples in rSubband, and the imaginary part in iSubband
520 *
521 * Note: anaQmf->lsb can be greater than anaQmf->no_channels in case
522 * of implicit resampling (USAC with reduced 3/4 core frame length).
523 */
524 void qmfAnalysisFilteringSlot(
525 HANDLE_QMF_FILTER_BANK anaQmf, /*!< Handle of Qmf Synthesis Bank */
526 FIXP_DBL *qmfReal, /*!< Low and High band, real */
527 FIXP_DBL *qmfImag, /*!< Low and High band, imag */
528 const INT_PCM_QMFIN *RESTRICT timeIn, /*!< Pointer to input */
529 const int stride, /*!< stride factor of input */
530 FIXP_DBL *pWorkBuffer /*!< pointer to temporal working buffer */
531 ) {
532 int offset = anaQmf->no_channels * (QMF_NO_POLY * 2 - 1);
533 /*
534 Feed time signal into oldest anaQmf->no_channels states
535 */
536 {
537 FIXP_QAS *FilterStatesAnaTmp = ((FIXP_QAS *)anaQmf->FilterStates) + offset;
538
539 /* Feed and scale actual time in slot */
540 for (int i = anaQmf->no_channels >> 1; i != 0; i--) {
541 /* Place INT_PCM value left aligned in scaledTimeIn */
542 *FilterStatesAnaTmp++ = (FIXP_QAS)*timeIn;
543 timeIn += stride;
544 *FilterStatesAnaTmp++ = (FIXP_QAS)*timeIn;
545 timeIn += stride;
546 }
547 }
548
549 if (anaQmf->flags & QMF_FLAG_NONSYMMETRIC) {
550 qmfAnaPrototypeFirSlot_NonSymmetric(pWorkBuffer, anaQmf->no_channels,
551 anaQmf->p_filter, anaQmf->p_stride,
552 (FIXP_QAS *)anaQmf->FilterStates);
553 } else {
554 qmfAnaPrototypeFirSlot(pWorkBuffer, anaQmf->no_channels, anaQmf->p_filter,
555 anaQmf->p_stride, (FIXP_QAS *)anaQmf->FilterStates);
556 }
557
558 if (anaQmf->flags & QMF_FLAG_LP) {
559 if (anaQmf->flags & QMF_FLAG_CLDFB)
560 qmfForwardModulationLP_odd(anaQmf, pWorkBuffer, qmfReal);
561 else
562 qmfForwardModulationLP_even(anaQmf, pWorkBuffer, qmfReal);
563
564 } else {
565 qmfForwardModulationHQ(anaQmf, pWorkBuffer, qmfReal, qmfImag);
566 }
567 /*
568 Shift filter states
569
570 Should be realized with modulo addressing on a DSP instead of a true buffer
571 shift
572 */
573 FDKmemmove(anaQmf->FilterStates,
574 (FIXP_QAS *)anaQmf->FilterStates + anaQmf->no_channels,
575 offset * sizeof(FIXP_QAS));
576 }
577
578 /*!
579 *
580 * \brief Perform complex-valued subband filtering of the time domain
581 * data of timeIn and stores the real part of the subband
582 * samples in rAnalysis, and the imaginary part in iAnalysis
583 * The qmf coefficient table is symmetric. The symmetry is expoited by
584 * shrinking the coefficient table to half the size. The addressing mode
585 * takes care of the symmetries.
586 *
587 *
588 * \sa PolyphaseFiltering
589 */
590 void qmfAnalysisFiltering(
591 HANDLE_QMF_FILTER_BANK anaQmf, /*!< Handle of Qmf Analysis Bank */
592 FIXP_DBL **qmfReal, /*!< Pointer to real subband slots */
593 FIXP_DBL **qmfImag, /*!< Pointer to imag subband slots */
594 QMF_SCALE_FACTOR *scaleFactor,
595 const INT_PCM_QMFIN *timeIn, /*!< Time signal */
596 const int timeIn_e, const int stride,
597 FIXP_DBL *pWorkBuffer /*!< pointer to temporal working buffer */
598 ) {
599 int i;
600 int no_channels = anaQmf->no_channels;
601
602 scaleFactor->lb_scale =
603 -ALGORITHMIC_SCALING_IN_ANALYSIS_FILTERBANK - timeIn_e;
604 scaleFactor->lb_scale -= anaQmf->filterScale;
605
606 for (i = 0; i < anaQmf->no_col; i++) {
607 FIXP_DBL *qmfImagSlot = NULL;
608
609 if (!(anaQmf->flags & QMF_FLAG_LP)) {
610 qmfImagSlot = qmfImag[i];
611 }
612
613 qmfAnalysisFilteringSlot(anaQmf, qmfReal[i], qmfImagSlot, timeIn, stride,
614 pWorkBuffer);
615
616 timeIn += no_channels * stride;
617
618 } /* no_col loop i */
619 }
404620 #endif /* QMF_PCM_H */
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
122122 #if (SAMPLE_BITS == 16)
123123 void scaleValues(FIXP_PCM *dst, const FIXP_DBL *src, INT len, INT scalefactor);
124124 #endif
125 void scaleValues(FIXP_PCM *dst, const FIXP_SGL *src, INT len, INT scalefactor);
125 void scaleValues(FIXP_SGL *dst, const FIXP_SGL *src, INT len, INT scalefactor);
126126 void scaleCplxValues(FIXP_DBL *r_dst, FIXP_DBL *i_dst, const FIXP_DBL *r_src,
127127 const FIXP_DBL *i_src, INT len, INT scalefactor);
128128 void scaleValuesWithFactor(FIXP_DBL *vector, FIXP_DBL factor, INT len,
129129 INT scalefactor);
130130 void scaleValuesSaturate(FIXP_DBL *vector, INT len, INT scalefactor);
131 void scaleValuesSaturate(FIXP_DBL *dst, FIXP_DBL *src, INT len,
131 void scaleValuesSaturate(FIXP_DBL *dst, const FIXP_DBL *src, INT len,
132132 INT scalefactor);
133 void scaleValuesSaturate(FIXP_SGL *dst, FIXP_DBL *src, INT len,
133 void scaleValuesSaturate(FIXP_SGL *dst, const FIXP_DBL *src, INT len,
134134 INT scalefactor);
135 void scaleValuesSaturate(INT_PCM *dst, FIXP_DBL *src, INT len, INT scalefactor);
136135 void scaleValuesSaturate(FIXP_SGL *vector, INT len, INT scalefactor);
137 void scaleValuesSaturate(FIXP_SGL *dst, FIXP_SGL *src, INT len,
136 void scaleValuesSaturate(FIXP_SGL *dst, const FIXP_SGL *src, INT len,
138137 INT scalefactor);
139 void scaleValuesSaturate(INT_PCM *dst, INT_PCM *src, INT len, INT scalefactor);
140138 INT getScalefactorShort(const SHORT *vector, INT len);
141139 INT getScalefactorPCM(const INT_PCM *vector, INT len, INT stride);
142140 INT getScalefactor(const FIXP_DBL *vector, INT len);
107107 #if defined(__arm__)
108108 #include "arm/scramble_arm.h"
109109
110 #elif defined(__mips__) && defined(__mips_dsp)
110 #elif defined(__mips__) && defined(__mips_dsp) && !defined(__mips16)
111111 #include "mips/scramble_mips.h"
112112
113113 #endif
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
367367
368368 UINT bTotal = 0;
369369
370 UINT bToRead = (hBitBuf->bufBits - hBitBuf->ValidBits) >> 3;
370 UINT bToRead =
371 fMin(hBitBuf->bufBits,
372 (UINT)fMax(0, ((INT)hBitBuf->bufBits - (INT)hBitBuf->ValidBits))) >>
373 3;
371374 UINT noOfBytes =
372375 fMin(bToRead,
373376 *bytesValid); //(bToRead < *bytesValid) ? bToRead : *bytesValid ;
383386 bToRead * sizeof(UCHAR));
384387
385388 /* add noOfBits to number of valid bits in buffer */
386 hBitBuf->ValidBits += bToRead << 3;
389 hBitBuf->ValidBits = (UINT)((INT)hBitBuf->ValidBits + (INT)(bToRead << 3));
387390 bTotal += bToRead;
388391 inputBuffer += bToRead;
389392
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
103103
104104 /* FDK tools library info */
105105 #define FDK_TOOLS_LIB_VL0 3
106 #define FDK_TOOLS_LIB_VL1 0
106 #define FDK_TOOLS_LIB_VL1 1
107107 #define FDK_TOOLS_LIB_VL2 0
108108 #define FDK_TOOLS_LIB_TITLE "FDK Tools"
109 #ifdef __ANDROID__
109 #ifdef SUPPRESS_BUILD_DATE_INFO
110110 #define FDK_TOOLS_LIB_BUILD_DATE ""
111111 #define FDK_TOOLS_LIB_BUILD_TIME ""
112112 #else
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
226226 }
227227
228228 #define DUCKER_MAX_NRG_SCALE (24)
229 #define DUCKER_HEADROOM_BITS (3)
229 #define DUCKER_HEADROOM_BITS (2)
230230
231231 #define FILTER_SF (2)
232232
605605 dataImagIn += start;
606606 dataRealOut += start;
607607 dataImagOut += start;
608 #ifdef FUNCTION_DecorrFilterApplyPASS_func1
609 DecorrFilterApplyPASS_func1(i, dataRealIn, dataImagIn, dataRealOut,
610 dataImagOut, pDelayBuffer, offset);
611 #else
612608 do {
613609 FIXP_DBL delay_re, delay_im, real, imag;
614610
622618 *dataImagOut++ = delay_im;
623619 pDelayBuffer += offset;
624620 } while (--i != 0);
625 #endif
626621 }
627622 }
628623
10601055 FIXP_DBL maxVal = FL2FXCONST_DBL(-1.0f);
10611056
10621057 if (maxVal == FL2FXCONST_DBL(-1.0f)) {
1063 #ifdef FUNCTION_DuckerCalcEnergy_func2
1064 maxVal = DuckerCalcEnergy_func2(inputReal, inputImag, startHybBand,
1065 maxHybBand, maxHybridBand);
1066 #else
1067 FIXP_DBL localMaxVal = FL2FXCONST_DBL(0.0f);
1068 for (qs = startHybBand; qs <= maxHybBand; qs++) {
1069 localMaxVal |= fAbs(inputReal[qs]);
1070 localMaxVal |= fAbs(inputImag[qs]);
1071 }
1072 for (; qs <= maxHybridBand; qs++) {
1073 localMaxVal |= fAbs(inputReal[qs]);
1074 }
1075 maxVal = localMaxVal;
1076 #endif
1077 }
1078
1079 clz = fixMax(0, CntLeadingZeros(maxVal) - DUCKER_HEADROOM_BITS);
1080 clz = fixMin(clz, DUCKER_MAX_NRG_SCALE);
1058 clz = fMin(getScalefactor(&inputReal[startHybBand],
1059 fMax(0, maxHybridBand - startHybBand + 1)),
1060 getScalefactor(&inputImag[startHybBand],
1061 fMax(0, maxHybBand - startHybBand + 1)));
1062 } else {
1063 clz = CntLeadingZeros(maxVal) - 1;
1064 }
1065
1066 clz = fMin(fMax(0, clz - DUCKER_HEADROOM_BITS), DUCKER_MAX_NRG_SCALE);
10811067 *nrgScale = (SCHAR)clz << 1;
10821068
10831069 /* Initialize pb since it would stay uninitialized for the case startHybBand
10851071 pb = SpatialDecGetProcessingBand(maxHybBand, self->mapHybBands2ProcBands);
10861072 for (qs = startHybBand; qs <= maxHybBand; qs++) {
10871073 pb = SpatialDecGetProcessingBand(qs, self->mapHybBands2ProcBands);
1088 energy[pb] =
1089 fAddSaturate(energy[pb], fPow2Div2(inputReal[qs] << clz) +
1090 fPow2Div2(inputImag[qs] << clz));
1074 energy[pb] = SATURATE_LEFT_SHIFT(
1075 (energy[pb] >> 1) + (fPow2Div2(inputReal[qs] << clz) >> 1) +
1076 (fPow2Div2(inputImag[qs] << clz) >> 1),
1077 1, DFRACT_BITS);
10911078 }
10921079 pb++;
10931080
11111098 maxVal = inputMaxVal;
11121099
11131100 if (maxVal == FL2FXCONST_DBL(-1.0f)) {
1114 #ifdef FUNCTION_DuckerCalcEnergy_func2
1115 maxVal = DuckerCalcEnergy_func2(inputReal, inputImag, startHybBand,
1116 maxHybBand, maxHybridBand);
1117 #else
1118 FIXP_DBL localMaxVal = FL2FXCONST_DBL(0.0f);
1119 for (qs = startHybBand; qs <= maxHybBand; qs++) {
1120 localMaxVal |= fAbs(inputReal[qs]);
1121 localMaxVal |= fAbs(inputImag[qs]);
1122 }
1123 for (; qs <= maxHybridBand; qs++) {
1124 localMaxVal |= fAbs(inputReal[qs]);
1125 }
1126 maxVal = localMaxVal;
1127 #endif
1128 }
1129
1130 clz = fixMax(0, CntLeadingZeros(maxVal) - DUCKER_HEADROOM_BITS);
1131 clz = fixMin(clz, DUCKER_MAX_NRG_SCALE);
1101 clz = fMin(getScalefactor(&inputReal[startHybBand],
1102 fMax(0, maxHybridBand - startHybBand + 1)),
1103 getScalefactor(&inputImag[startHybBand],
1104 fMax(0, maxHybBand - startHybBand + 1)));
1105 } else {
1106 clz = CntLeadingZeros(maxVal) - 1;
1107 }
1108
1109 clz = fMin(fMax(0, clz - DUCKER_HEADROOM_BITS), DUCKER_MAX_NRG_SCALE);
11321110 *nrgScale = (SCHAR)clz << 1;
11331111
1134 #ifdef FUNCTION_DuckerCalcEnergy_func4
1135 DuckerCalcEnergy_func4(inputReal, inputImag, energy,
1136 self->mapHybBands2ProcBands, clz, startHybBand,
1137 maxHybBand, maxHybridBand);
1138 #else
11391112 for (qs = startHybBand; qs <= maxHybBand; qs++) {
11401113 int pb = SpatialDecGetProcessingBand(qs, self->mapHybBands2ProcBands);
1141 energy[pb] =
1142 fAddSaturate(energy[pb], fPow2Div2(inputReal[qs] << clz) +
1143 fPow2Div2(inputImag[qs] << clz));
1114 energy[pb] = SATURATE_LEFT_SHIFT(
1115 (energy[pb] >> 1) + (fPow2Div2(inputReal[qs] << clz) >> 1) +
1116 (fPow2Div2(inputImag[qs] << clz) >> 1),
1117 1, DFRACT_BITS);
11441118 }
11451119
11461120 for (; qs <= maxHybridBand; qs++) {
11471121 int pb = SpatialDecGetProcessingBand(qs, self->mapHybBands2ProcBands);
11481122 energy[pb] = fAddSaturate(energy[pb], fPow2Div2(inputReal[qs] << clz));
11491123 }
1150 #endif /* FUNCTION_DuckerCalcEnergy_func4 */
11511124 }
11521125
11531126 {
12941267 }
12951268 }
12961269
1297 #ifdef FUNCTION_DuckerApply_func1
1298 qs = DuckerApply_func1(qs, hybBands, qs_next, outputReal, outputImag,
1299 duckGain);
1300 #else
13011270 /* general gain*output section */
13021271 if (qs < hybBands) { /* true for about 39% */
13031272 for (; qs < qs_next; qs++) { /* runs about 2 times */
13091278 outputReal[qs] = fMultDiv2(outputReal[qs], duckGain) << 2;
13101279 }
13111280 }
1312 #endif
13131281 } /* pb */
13141282
13151283 self->headroomSmoothDirRevNrg =
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
141141 } /* How to arrange the packed values. */
142142
143143 struct FDK_HYBRID_SETUP {
144 UCHAR nrQmfBands; /*!< Number of QMF bands to be converted to hybrid. */
145 UCHAR nHybBands[3]; /*!< Number of Hybrid bands generated by nrQmfBands. */
146 SCHAR kHybrid[3]; /*!< Filter configuration of each QMF band. */
147 UCHAR protoLen; /*!< Prototype filter length. */
148 UCHAR filterDelay; /*!< Delay caused by hybrid filter. */
144 UCHAR nrQmfBands; /*!< Number of QMF bands to be converted to hybrid. */
145 UCHAR nHybBands[3]; /*!< Number of Hybrid bands generated by nrQmfBands. */
146 UCHAR synHybScale[3]; /*!< Headroom needed in hybrid synthesis filterbank. */
147 SCHAR kHybrid[3]; /*!< Filter configuration of each QMF band. */
148 UCHAR protoLen; /*!< Prototype filter length. */
149 UCHAR filterDelay; /*!< Delay caused by hybrid filter. */
149150 const INT
150151 *pReadIdxTable; /*!< Helper table to access input data ringbuffer. */
151152 };
155156 9, 10, 11, 12, 0, 1, 2, 3, 4,
156157 5, 6, 7, 8, 9, 10, 11, 12};
157158
158 static const FDK_HYBRID_SETUP setup_3_16 = {3, {8, 4, 4}, {8, 4, 4},
159 13, (13 - 1) / 2, ringbuffIdxTab};
160 static const FDK_HYBRID_SETUP setup_3_12 = {3, {8, 2, 2}, {8, 2, 2},
161 13, (13 - 1) / 2, ringbuffIdxTab};
162 static const FDK_HYBRID_SETUP setup_3_10 = {3, {6, 2, 2}, {-8, -2, 2},
163 13, (13 - 1) / 2, ringbuffIdxTab};
159 static const FDK_HYBRID_SETUP setup_3_16 = {
160 3, {8, 4, 4}, {4, 3, 3}, {8, 4, 4}, 13, (13 - 1) / 2, ringbuffIdxTab};
161 static const FDK_HYBRID_SETUP setup_3_12 = {
162 3, {8, 2, 2}, {4, 2, 2}, {8, 2, 2}, 13, (13 - 1) / 2, ringbuffIdxTab};
163 static const FDK_HYBRID_SETUP setup_3_10 = {
164 3, {6, 2, 2}, {3, 2, 2}, {-8, -2, 2}, 13, (13 - 1) / 2, ringbuffIdxTab};
164165
165166 static const FIXP_HTP HybFilterCoef8[] = {
166167 HTCP(0x10000000, 0x00000000), HTCP(0x0df26407, 0xfa391882),
476477 */
477478 for (k = 0; k < nrQmfBandsLF; k++) {
478479 const int nHybBands = hSynthesisHybFilter->pSetup->nHybBands[k];
480 const int scale = hSynthesisHybFilter->pSetup->synHybScale[k];
479481
480482 FIXP_DBL accu1 = FL2FXCONST_DBL(0.f);
481483 FIXP_DBL accu2 = FL2FXCONST_DBL(0.f);
482484
483485 /* Perform hybrid filtering. */
484486 for (n = 0; n < nHybBands; n++) {
485 accu1 += pHybridReal[hybOffset + n];
486 accu2 += pHybridImag[hybOffset + n];
487 accu1 += pHybridReal[hybOffset + n] >> scale;
488 accu2 += pHybridImag[hybOffset + n] >> scale;
487489 }
488 pQmfReal[k] = accu1;
489 pQmfImag[k] = accu2;
490 pQmfReal[k] = SATURATE_LEFT_SHIFT(accu1, scale, DFRACT_BITS);
491 pQmfImag[k] = SATURATE_LEFT_SHIFT(accu2, scale, DFRACT_BITS);
490492
491493 hybOffset += nHybBands;
492494 }
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
105105 #include "common_fix.h"
106106
107107 #define WORKBUFFER1_TAG 0
108 #define WORKBUFFER2_TAG 1
109
110108 #define WORKBUFFER3_TAG 4
111109 #define WORKBUFFER4_TAG 5
112 #define WORKBUFFER5_TAG 6
113110 #define WORKBUFFER6_TAG 7
111 #define WORKBUFFER7_TAG 8
114112
115113 C_ALLOC_MEM_OVERLAY(QmfWorkBufferCore1, FIXP_DBL, QMF_WB_SECTION_SIZE,
116114 SECT_DATA_L1, WORKBUFFER1_TAG)
117 C_ALLOC_MEM_OVERLAY(QmfWorkBufferCore2, FIXP_DBL, QMF_WB_SECTION_SIZE,
118 SECT_DATA_L2, WORKBUFFER2_TAG)
119115 C_ALLOC_MEM_OVERLAY(QmfWorkBufferCore3, FIXP_DBL, QMF_WB_SECTION_SIZE,
120116 SECT_DATA_L2, WORKBUFFER3_TAG)
121117 C_ALLOC_MEM_OVERLAY(QmfWorkBufferCore4, FIXP_DBL, QMF_WB_SECTION_SIZE,
122118 SECT_DATA_L2, WORKBUFFER4_TAG)
123 C_ALLOC_MEM_OVERLAY(QmfWorkBufferCore5, FIXP_DBL, QMF_WB_SECTION_SIZE,
124 SECT_DATA_L2, WORKBUFFER5_TAG)
125119 C_ALLOC_MEM_OVERLAY(QmfWorkBufferCore6, FIXP_DBL, QMF_WB_SECTION_SIZE,
126120 SECT_DATA_L2, WORKBUFFER6_TAG)
121 C_ALLOC_MEM_OVERLAY(QmfWorkBufferCore7, FIXP_DBL, QMF_WB_SECTION_SIZE,
122 SECT_DATA_L2, WORKBUFFER7_TAG)
127123
128124 /*! Analysis states buffer. <br>
129125 Dimension: #((8) + (1)) */
130 C_ALLOC_MEM2(AnaQmfStates, FIXP_QAS, 10 * QMF_DOMAIN_MAX_ANALYSIS_QMF_BANDS,
131 ((8) + (1)))
126 C_AALLOC_MEM2(AnaQmfStates, FIXP_DBL, 10 * QMF_DOMAIN_MAX_ANALYSIS_QMF_BANDS,
127 ((8) + (1)))
132128
133129 /*! Synthesis states buffer. <br>
134130 Dimension: #((8) + (1)) */
135 C_ALLOC_MEM2(SynQmfStates, FIXP_QSS, 9 * QMF_DOMAIN_MAX_SYNTHESIS_QMF_BANDS,
136 ((8) + (1)))
131 C_AALLOC_MEM2(SynQmfStates, FIXP_QSS, 9 * QMF_DOMAIN_MAX_SYNTHESIS_QMF_BANDS,
132 ((8) + (1)))
137133
138134 /*! Pointer to real qmf data for each time slot. <br>
139135 Dimension: #((8) + (1)) */
155151
156152 /*! Analysis states buffer. <br>
157153 Dimension: #((8) + (1)) */
158 C_ALLOC_MEM2(AnaQmfStates16, FIXP_QAS, 10 * QMF_DOMAIN_ANALYSIS_QMF_BANDS_16,
159 ((8) + (1)))
160
154 C_AALLOC_MEM2(AnaQmfStates16, FIXP_DBL, 10 * QMF_DOMAIN_ANALYSIS_QMF_BANDS_16,
155 ((8) + (1)))
161156 /*! Analysis states buffer. <br>
162157 Dimension: #((8) + (1)) */
163 C_ALLOC_MEM2(AnaQmfStates24, FIXP_QAS, 10 * QMF_DOMAIN_ANALYSIS_QMF_BANDS_24,
164 ((8) + (1)))
158 C_AALLOC_MEM2(AnaQmfStates24, FIXP_DBL, 10 * QMF_DOMAIN_ANALYSIS_QMF_BANDS_24,
159 ((8) + (1)))
165160
166161 /*! Analysis states buffer. <br>
167162 Dimension: #((8) + (1)) */
168 C_ALLOC_MEM2(AnaQmfStates32, FIXP_QAS, 10 * QMF_DOMAIN_ANALYSIS_QMF_BANDS_32,
169 ((8) + (1)))
163 C_AALLOC_MEM2(AnaQmfStates32, FIXP_DBL, 10 * QMF_DOMAIN_ANALYSIS_QMF_BANDS_32,
164 ((8) + (1)))
170165
171166 /*! Pointer to real qmf data for each time slot. <br>
172167 Dimension: #((8) + (1)) */
641636
642637 if (pQmfOutImag == NULL) {
643638 for (; b < fMin(lsb, stop_band); b++) {
644 pQmfOutReal[b] = scaleValue(real[b], lb_sf);
639 pQmfOutReal[b] = scaleValueSaturate(real[b], lb_sf);
645640 }
646641 for (; b < fMin(usb, stop_band); b++) {
647 pQmfOutReal[b] = scaleValue(real[b], hb_sf);
642 pQmfOutReal[b] = scaleValueSaturate(real[b], hb_sf);
648643 }
649644 for (; b < stop_band; b++) {
650645 pQmfOutReal[b] = (FIXP_DBL)0;
652647 } else {
653648 FDK_ASSERT(imag != NULL);
654649 for (; b < fMin(lsb, stop_band); b++) {
655 pQmfOutReal[b] = scaleValue(real[b], lb_sf);
656 pQmfOutImag[b] = scaleValue(imag[b], lb_sf);
650 pQmfOutReal[b] = scaleValueSaturate(real[b], lb_sf);
651 pQmfOutImag[b] = scaleValueSaturate(imag[b], lb_sf);
657652 }
658653 for (; b < fMin(usb, stop_band); b++) {
659 pQmfOutReal[b] = scaleValue(real[b], hb_sf);
660 pQmfOutImag[b] = scaleValue(imag[b], hb_sf);
654 pQmfOutReal[b] = scaleValueSaturate(real[b], hb_sf);
655 pQmfOutImag[b] = scaleValueSaturate(imag[b], hb_sf);
661656 }
662657 for (; b < stop_band; b++) {
663658 pQmfOutReal[b] = (FIXP_DBL)0;
949944
950945 if ((size > 4 * QMF_WB_SECTION_SIZE) && (pWorkBuffer[4] == NULL)) {
951946 /* get work buffer of size QMF_WB_SECTION_SIZE */
952 pWorkBuffer[4] = GetQmfWorkBufferCore5();
947 pWorkBuffer[4] = GetQmfWorkBufferCore7();
953948 }
954949
955950 /* 8. distribute workbuffer over processing channels */
995990 if (pWorkBuffer[1]) FreeQmfWorkBufferCore1(&pWorkBuffer[1]);
996991 if (pWorkBuffer[2]) FreeQmfWorkBufferCore3(&pWorkBuffer[2]);
997992 if (pWorkBuffer[3]) FreeQmfWorkBufferCore4(&pWorkBuffer[3]);
998 if (pWorkBuffer[4]) FreeQmfWorkBufferCore5(&pWorkBuffer[4]);
993 if (pWorkBuffer[4]) FreeQmfWorkBufferCore7(&pWorkBuffer[4]);
999994 }
1000995
1001996 void FDK_QmfDomain_FreeMem(HANDLE_FDK_QMF_DOMAIN hqd) {
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
488488 for (i = 0; i < M - 1; i += 2, pDat_0 += 2, pDat_1 -= 2) {
489489 FIXP_DBL accu1, accu2, accu3, accu4;
490490
491 accu1 = pDat_1[1];
492 accu2 = -pDat_0[0];
493 accu3 = pDat_0[1];
494 accu4 = -pDat_1[0];
491 accu1 = pDat_1[1] >> 1;
492 accu2 = -(pDat_0[0] >> 1);
493 accu3 = pDat_0[1] >> 1;
494 accu4 = -(pDat_1[0] >> 1);
495495
496496 cplxMultDiv2(&accu1, &accu2, accu1, accu2, twiddle[i]);
497497 cplxMultDiv2(&accu3, &accu4, accu4, accu3, twiddle[i + 1]);
498498
499 pDat_0[0] = accu2 >> 1;
500 pDat_0[1] = accu1 >> 1;
501 pDat_1[0] = accu4 >> 1;
502 pDat_1[1] = -(accu3 >> 1);
499 pDat_0[0] = accu2;
500 pDat_0[1] = accu1;
501 pDat_1[0] = accu4;
502 pDat_1[1] = -accu3;
503503 }
504504 if (M & 1) {
505505 FIXP_DBL accu1, accu2;
108108 #if defined(__arm__)
109109 #include "arm/fft_rad2_arm.cpp"
110110
111 #elif defined(__GNUC__) && defined(__mips__) && defined(__mips_dsp)
111 #elif defined(__GNUC__) && defined(__mips__) && defined(__mips_dsp) && !defined(__mips16)
112112 #include "mips/fft_rad2_mips.cpp"
113113
114114 #endif
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2020 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
649649 INT ans_lg2_e, baselg2_e;
650650 FIXP_DBL base_lg2, ans_lg2, result;
651651
652 if (base_m <= (FIXP_DBL)0) {
653 result = (FIXP_DBL)0;
654 *result_e = 0;
655 return result;
656 }
657
652658 /* Calc log2 of base */
653659 base_lg2 = fLog2(base_m, base_e, &baselg2_e);
654660
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
568568 */
569569 for (i = 0; i < hMdct->prev_nr; i++) {
570570 FIXP_DBL x = -(*pOvl--);
571 *pOut0 = IMDCT_SCALE_DBL(x + hMdct->pFacZir[i]);
571 *pOut0 = fAddSaturate(x, IMDCT_SCALE_DBL(hMdct->pFacZir[i]));
572572 pOut0++;
573573 }
574574 hMdct->pFacZir = NULL;
677677 FIXP_DBL *pOut = pOut0 - fl / 2;
678678 FDK_ASSERT(fl / 2 <= 128);
679679 for (i = 0; i < fl / 2; i++) {
680 pOut[i] += IMDCT_SCALE_DBL(hMdct->pFacZir[i]);
680 pOut[i] = fAddSaturate(pOut[i], IMDCT_SCALE_DBL(hMdct->pFacZir[i]));
681681 }
682682 hMdct->pFacZir = NULL;
683683 }
9999
100100 *******************************************************************************/
101101
102 #if defined(__mips_dsp)
102 #if defined(__mips_dsp) && !defined(__mips16)
103103
104104 #ifndef FUNCTION_getScalefactor_DBL
105105 #define FUNCTION_getScalefactor_DBL
567567 static ERROR_t huff_decode(HANDLE_FDK_BITSTREAM strm, SCHAR* out_data_1,
568568 SCHAR* out_data_2, DATA_TYPE data_type,
569569 DIFF_TYPE diff_type_1, DIFF_TYPE diff_type_2,
570 int num_val, CODING_SCHEME* cdg_scheme, int ldMode) {
570 int num_val, int* cdg_scheme, int ldMode) {
571571 ERROR_t err = HUFFDEC_OK;
572572 DIFF_TYPE diff_type;
573573
596596
597597 /* Coding scheme */
598598 data = FDKreadBits(strm, 1);
599 *cdg_scheme = (CODING_SCHEME)(data << PAIR_SHIFT);
599 *cdg_scheme = (data << PAIR_SHIFT);
600600
601601 if (*cdg_scheme >> PAIR_SHIFT == HUFF_2D) {
602602 if ((out_data_1 != NULL) && (out_data_2 != NULL) && (ldMode == 0)) {
603603 data = FDKreadBits(strm, 1);
604 *cdg_scheme = (CODING_SCHEME)(*cdg_scheme | data);
604 *cdg_scheme = (*cdg_scheme | data);
605605 } else {
606 *cdg_scheme = (CODING_SCHEME)(*cdg_scheme | FREQ_PAIR);
606 *cdg_scheme = (*cdg_scheme | FREQ_PAIR);
607607 }
608608 }
609609
842842 SCHAR* pDataVec[2] = {NULL, NULL};
843843
844844 DIFF_TYPE diff_type[2] = {DIFF_FREQ, DIFF_FREQ};
845 CODING_SCHEME cdg_scheme = HUFF_1D;
845 int cdg_scheme = HUFF_1D;
846846 DIRECTION direction = BACKWARDS;
847847
848848 switch (data_type) {
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
146146 /* moved to qmf_pcm.h: -> qmfSynPrototypeFirSlot_NonSymmetric */
147147 /* moved to qmf_pcm.h: -> qmfSynthesisFilteringSlot */
148148
149 #ifndef FUNCTION_qmfAnaPrototypeFirSlot
150 /*!
151 \brief Perform Analysis Prototype Filtering on a single slot of input data.
152 */
153 static void qmfAnaPrototypeFirSlot(
154 FIXP_DBL *analysisBuffer,
155 INT no_channels, /*!< Number channels of analysis filter */
156 const FIXP_PFT *p_filter, INT p_stride, /*!< Stride of analysis filter */
157 FIXP_QAS *RESTRICT pFilterStates) {
158 INT k;
159
160 FIXP_DBL accu;
161 const FIXP_PFT *RESTRICT p_flt = p_filter;
162 FIXP_DBL *RESTRICT pData_0 = analysisBuffer + 2 * no_channels - 1;
163 FIXP_DBL *RESTRICT pData_1 = analysisBuffer;
164
165 FIXP_QAS *RESTRICT sta_0 = (FIXP_QAS *)pFilterStates;
166 FIXP_QAS *RESTRICT sta_1 =
167 (FIXP_QAS *)pFilterStates + (2 * QMF_NO_POLY * no_channels) - 1;
168 INT pfltStep = QMF_NO_POLY * (p_stride);
169 INT staStep1 = no_channels << 1;
170 INT staStep2 = (no_channels << 3) - 1; /* Rewind one less */
171
172 /* FIR filters 127..64 0..63 */
173 for (k = 0; k < no_channels; k++) {
174 accu = fMultDiv2(p_flt[0], *sta_1);
175 sta_1 -= staStep1;
176 accu += fMultDiv2(p_flt[1], *sta_1);
177 sta_1 -= staStep1;
178 accu += fMultDiv2(p_flt[2], *sta_1);
179 sta_1 -= staStep1;
180 accu += fMultDiv2(p_flt[3], *sta_1);
181 sta_1 -= staStep1;
182 accu += fMultDiv2(p_flt[4], *sta_1);
183 *pData_1++ = (accu << 1);
184 sta_1 += staStep2;
185
186 p_flt += pfltStep;
187 accu = fMultDiv2(p_flt[0], *sta_0);
188 sta_0 += staStep1;
189 accu += fMultDiv2(p_flt[1], *sta_0);
190 sta_0 += staStep1;
191 accu += fMultDiv2(p_flt[2], *sta_0);
192 sta_0 += staStep1;
193 accu += fMultDiv2(p_flt[3], *sta_0);
194 sta_0 += staStep1;
195 accu += fMultDiv2(p_flt[4], *sta_0);
196 *pData_0-- = (accu << 1);
197 sta_0 -= staStep2;
198 }
199 }
200 #endif /* !defined(FUNCTION_qmfAnaPrototypeFirSlot) */
201
202 #ifndef FUNCTION_qmfAnaPrototypeFirSlot_NonSymmetric
203 /*!
204 \brief Perform Analysis Prototype Filtering on a single slot of input data.
205 */
206 static void qmfAnaPrototypeFirSlot_NonSymmetric(
207 FIXP_DBL *analysisBuffer,
208 int no_channels, /*!< Number channels of analysis filter */
209 const FIXP_PFT *p_filter, int p_stride, /*!< Stride of analysis filter */
210 FIXP_QAS *RESTRICT pFilterStates) {
211 const FIXP_PFT *RESTRICT p_flt = p_filter;
212 int p, k;
213
214 for (k = 0; k < 2 * no_channels; k++) {
215 FIXP_DBL accu = (FIXP_DBL)0;
216
217 p_flt += QMF_NO_POLY * (p_stride - 1);
218
219 /*
220 Perform FIR-Filter
221 */
222 for (p = 0; p < QMF_NO_POLY; p++) {
223 accu += fMultDiv2(*p_flt++, pFilterStates[2 * no_channels * p]);
224 }
225 analysisBuffer[2 * no_channels - 1 - k] = (accu << 1);
226 pFilterStates++;
227 }
228 }
229 #endif /* FUNCTION_qmfAnaPrototypeFirSlot_NonSymmetric */
230
231149 /*!
232150 *
233151 * \brief Perform real-valued forward modulation of the time domain
243161 int i;
244162 int L = anaQmf->no_channels;
245163 int M = L >> 1;
246 int scale;
164 int scale = 0;
247165 FIXP_DBL accu;
248166
249167 const FIXP_DBL *timeInTmp1 = (FIXP_DBL *)&timeIn[3 * M];
380298 }
381299 #endif /* FUNCTION_qmfForwardModulationHQ */
382300
383 /*
384 * \brief Perform one QMF slot analysis of the time domain data of timeIn
385 * with specified stride and stores the real part of the subband
386 * samples in rSubband, and the imaginary part in iSubband
387 *
388 * Note: anaQmf->lsb can be greater than anaQmf->no_channels in case
389 * of implicit resampling (USAC with reduced 3/4 core frame length).
390 */
391 #if (SAMPLE_BITS != DFRACT_BITS) && (QAS_BITS == DFRACT_BITS)
392 void qmfAnalysisFilteringSlot(
393 HANDLE_QMF_FILTER_BANK anaQmf, /*!< Handle of Qmf Synthesis Bank */
394 FIXP_DBL *qmfReal, /*!< Low and High band, real */
395 FIXP_DBL *qmfImag, /*!< Low and High band, imag */
396 const LONG *RESTRICT timeIn, /*!< Pointer to input */
397 const int stride, /*!< stride factor of input */
398 FIXP_DBL *pWorkBuffer /*!< pointer to temporal working buffer */
399 ) {
400 int offset = anaQmf->no_channels * (QMF_NO_POLY * 2 - 1);
401 /*
402 Feed time signal into oldest anaQmf->no_channels states
403 */
404 {
405 FIXP_DBL *FilterStatesAnaTmp = ((FIXP_DBL *)anaQmf->FilterStates) + offset;
406
407 /* Feed and scale actual time in slot */
408 for (int i = anaQmf->no_channels >> 1; i != 0; i--) {
409 /* Place INT_PCM value left aligned in scaledTimeIn */
410
411 *FilterStatesAnaTmp++ = (FIXP_QAS)*timeIn;
412 timeIn += stride;
413 *FilterStatesAnaTmp++ = (FIXP_QAS)*timeIn;
414 timeIn += stride;
415 }
416 }
417
418 if (anaQmf->flags & QMF_FLAG_NONSYMMETRIC) {
419 qmfAnaPrototypeFirSlot_NonSymmetric(pWorkBuffer, anaQmf->no_channels,
420 anaQmf->p_filter, anaQmf->p_stride,
421 (FIXP_QAS *)anaQmf->FilterStates);
422 } else {
423 qmfAnaPrototypeFirSlot(pWorkBuffer, anaQmf->no_channels, anaQmf->p_filter,
424 anaQmf->p_stride, (FIXP_QAS *)anaQmf->FilterStates);
425 }
426
427 if (anaQmf->flags & QMF_FLAG_LP) {
428 if (anaQmf->flags & QMF_FLAG_CLDFB)
429 qmfForwardModulationLP_odd(anaQmf, pWorkBuffer, qmfReal);
430 else
431 qmfForwardModulationLP_even(anaQmf, pWorkBuffer, qmfReal);
432
433 } else {
434 qmfForwardModulationHQ(anaQmf, pWorkBuffer, qmfReal, qmfImag);
435 }
436 /*
437 Shift filter states
438
439 Should be realized with modulo adressing on a DSP instead of a true buffer
440 shift
441 */
442 FDKmemmove(anaQmf->FilterStates,
443 (FIXP_QAS *)anaQmf->FilterStates + anaQmf->no_channels,
444 offset * sizeof(FIXP_QAS));
445 }
446 #endif
447
448 void qmfAnalysisFilteringSlot(
449 HANDLE_QMF_FILTER_BANK anaQmf, /*!< Handle of Qmf Synthesis Bank */
450 FIXP_DBL *qmfReal, /*!< Low and High band, real */
451 FIXP_DBL *qmfImag, /*!< Low and High band, imag */
452 const INT_PCM *RESTRICT timeIn, /*!< Pointer to input */
453 const int stride, /*!< stride factor of input */
454 FIXP_DBL *pWorkBuffer /*!< pointer to temporal working buffer */
455 ) {
456 int offset = anaQmf->no_channels * (QMF_NO_POLY * 2 - 1);
457 /*
458 Feed time signal into oldest anaQmf->no_channels states
459 */
460 {
461 FIXP_QAS *FilterStatesAnaTmp = ((FIXP_QAS *)anaQmf->FilterStates) + offset;
462
463 /* Feed and scale actual time in slot */
464 for (int i = anaQmf->no_channels >> 1; i != 0; i--) {
465 /* Place INT_PCM value left aligned in scaledTimeIn */
466 #if (QAS_BITS == SAMPLE_BITS)
467 *FilterStatesAnaTmp++ = (FIXP_QAS)*timeIn;
468 timeIn += stride;
469 *FilterStatesAnaTmp++ = (FIXP_QAS)*timeIn;
470 timeIn += stride;
471 #elif (QAS_BITS > SAMPLE_BITS)
472 *FilterStatesAnaTmp++ = ((FIXP_QAS)*timeIn) << (QAS_BITS - SAMPLE_BITS);
473 timeIn += stride;
474 *FilterStatesAnaTmp++ = ((FIXP_QAS)*timeIn) << (QAS_BITS - SAMPLE_BITS);
475 timeIn += stride;
476 #else
477 *FilterStatesAnaTmp++ = (FIXP_QAS)((*timeIn) >> (SAMPLE_BITS - QAS_BITS));
478 timeIn += stride;
479 *FilterStatesAnaTmp++ = (FIXP_QAS)((*timeIn) >> (SAMPLE_BITS - QAS_BITS));
480 timeIn += stride;
481 #endif
482 }
483 }
484
485 if (anaQmf->flags & QMF_FLAG_NONSYMMETRIC) {
486 qmfAnaPrototypeFirSlot_NonSymmetric(pWorkBuffer, anaQmf->no_channels,
487 anaQmf->p_filter, anaQmf->p_stride,
488 (FIXP_QAS *)anaQmf->FilterStates);
489 } else {
490 qmfAnaPrototypeFirSlot(pWorkBuffer, anaQmf->no_channels, anaQmf->p_filter,
491 anaQmf->p_stride, (FIXP_QAS *)anaQmf->FilterStates);
492 }
493
494 if (anaQmf->flags & QMF_FLAG_LP) {
495 if (anaQmf->flags & QMF_FLAG_CLDFB)
496 qmfForwardModulationLP_odd(anaQmf, pWorkBuffer, qmfReal);
497 else
498 qmfForwardModulationLP_even(anaQmf, pWorkBuffer, qmfReal);
499
500 } else {
501 qmfForwardModulationHQ(anaQmf, pWorkBuffer, qmfReal, qmfImag);
502 }
503 /*
504 Shift filter states
505
506 Should be realized with modulo adressing on a DSP instead of a true buffer
507 shift
508 */
509 FDKmemmove(anaQmf->FilterStates,
510 (FIXP_QAS *)anaQmf->FilterStates + anaQmf->no_channels,
511 offset * sizeof(FIXP_QAS));
512 }
513
514 /*!
515 *
516 * \brief Perform complex-valued subband filtering of the time domain
517 * data of timeIn and stores the real part of the subband
518 * samples in rAnalysis, and the imaginary part in iAnalysis
519 * The qmf coefficient table is symmetric. The symmetry is expoited by
520 * shrinking the coefficient table to half the size. The addressing mode
521 * takes care of the symmetries.
522 *
523 *
524 * \sa PolyphaseFiltering
525 */
526 #if (SAMPLE_BITS != DFRACT_BITS) && (QAS_BITS == DFRACT_BITS)
527 void qmfAnalysisFiltering(
528 HANDLE_QMF_FILTER_BANK anaQmf, /*!< Handle of Qmf Analysis Bank */
529 FIXP_DBL **qmfReal, /*!< Pointer to real subband slots */
530 FIXP_DBL **qmfImag, /*!< Pointer to imag subband slots */
531 QMF_SCALE_FACTOR *scaleFactor, const LONG *timeIn, /*!< Time signal */
532 const int timeIn_e, const int stride,
533 FIXP_DBL *pWorkBuffer /*!< pointer to temporal working buffer */
534 ) {
535 int i;
536 int no_channels = anaQmf->no_channels;
537
538 scaleFactor->lb_scale =
539 -ALGORITHMIC_SCALING_IN_ANALYSIS_FILTERBANK - timeIn_e;
540 scaleFactor->lb_scale -= anaQmf->filterScale;
541
542 for (i = 0; i < anaQmf->no_col; i++) {
543 FIXP_DBL *qmfImagSlot = NULL;
544
545 if (!(anaQmf->flags & QMF_FLAG_LP)) {
546 qmfImagSlot = qmfImag[i];
547 }
548
549 qmfAnalysisFilteringSlot(anaQmf, qmfReal[i], qmfImagSlot, timeIn, stride,
550 pWorkBuffer);
551
552 timeIn += no_channels * stride;
553
554 } /* no_col loop i */
555 }
556 #endif
557
558 void qmfAnalysisFiltering(
559 HANDLE_QMF_FILTER_BANK anaQmf, /*!< Handle of Qmf Analysis Bank */
560 FIXP_DBL **qmfReal, /*!< Pointer to real subband slots */
561 FIXP_DBL **qmfImag, /*!< Pointer to imag subband slots */
562 QMF_SCALE_FACTOR *scaleFactor, const INT_PCM *timeIn, /*!< Time signal */
563 const int timeIn_e, const int stride,
564 FIXP_DBL *pWorkBuffer /*!< pointer to temporal working buffer */
565 ) {
566 int i;
567 int no_channels = anaQmf->no_channels;
568
569 scaleFactor->lb_scale =
570 -ALGORITHMIC_SCALING_IN_ANALYSIS_FILTERBANK - timeIn_e;
571 scaleFactor->lb_scale -= anaQmf->filterScale;
572
573 for (i = 0; i < anaQmf->no_col; i++) {
574 FIXP_DBL *qmfImagSlot = NULL;
575
576 if (!(anaQmf->flags & QMF_FLAG_LP)) {
577 qmfImagSlot = qmfImag[i];
578 }
579
580 qmfAnalysisFilteringSlot(anaQmf, qmfReal[i], qmfImagSlot, timeIn, stride,
581 pWorkBuffer);
582
583 timeIn += no_channels * stride;
584
585 } /* no_col loop i */
586 }
587
588301 /*!
589302 *
590303 * \brief Perform low power inverse modulation of the subband
602315 int i;
603316 int L = synQmf->no_channels;
604317 int M = L >> 1;
605 int scale;
318 int scale = 0;
606319 FIXP_DBL tmp;
607320 FIXP_DBL *RESTRICT tReal = pTimeOut;
608321 FIXP_DBL *RESTRICT tImag = pTimeOut + L;
609322
610323 /* Move input to output vector with offset */
611 scaleValues(&tReal[0], &qmfReal[0], synQmf->lsb, (int)scaleFactorLowBand);
612 scaleValues(&tReal[0 + synQmf->lsb], &qmfReal[0 + synQmf->lsb],
613 synQmf->usb - synQmf->lsb, (int)scaleFactorHighBand);
324 scaleValuesSaturate(&tReal[0], &qmfReal[0], synQmf->lsb, scaleFactorLowBand);
325 scaleValuesSaturate(&tReal[0 + synQmf->lsb], &qmfReal[0 + synQmf->lsb],
326 synQmf->usb - synQmf->lsb, scaleFactorHighBand);
614327 FDKmemclear(&tReal[0 + synQmf->usb], (L - synQmf->usb) * sizeof(FIXP_DBL));
615328
616329 /* Dct type-2 transform */
661374 int shift = 0;
662375
663376 /* Move input to output vector with offset */
664 scaleValues(pTimeOut + M, qmfReal, synQmf->lsb, scaleFactorLowBand);
665 scaleValues(pTimeOut + M + synQmf->lsb, qmfReal + synQmf->lsb,
666 synQmf->usb - synQmf->lsb, scaleFactorHighBand);
377 scaleValuesSaturate(pTimeOut + M, qmfReal, synQmf->lsb, scaleFactorLowBand);
378 scaleValuesSaturate(pTimeOut + M + synQmf->lsb, qmfReal + synQmf->lsb,
379 synQmf->usb - synQmf->lsb, scaleFactorHighBand);
667380 FDKmemclear(pTimeOut + M + synQmf->usb, (L - synQmf->usb) * sizeof(FIXP_DBL));
668381
669382 dct_IV(pTimeOut + M, L, &shift);
697410 FIXP_DBL *RESTRICT tImag = pWorkBuffer + L;
698411
699412 if (synQmf->flags & QMF_FLAG_CLDFB) {
700 for (i = 0; i < synQmf->lsb; i++) {
701 cplxMult(&tImag[i], &tReal[i], scaleValue(qmfImag[i], scaleFactorLowBand),
702 scaleValue(qmfReal[i], scaleFactorLowBand), synQmf->t_cos[i],
703 synQmf->t_sin[i]);
704 }
705 for (; i < synQmf->usb; i++) {
706 cplxMult(&tImag[i], &tReal[i],
707 scaleValue(qmfImag[i], scaleFactorHighBand),
708 scaleValue(qmfReal[i], scaleFactorHighBand), synQmf->t_cos[i],
709 synQmf->t_sin[i]);
710 }
413 for (i = 0; i < synQmf->usb; i++) {
414 cplxMultDiv2(&tImag[i], &tReal[i], qmfImag[i], qmfReal[i],
415 synQmf->t_cos[i], synQmf->t_sin[i]);
416 }
417 scaleValuesSaturate(&tReal[0], synQmf->lsb, scaleFactorLowBand + 1);
418 scaleValuesSaturate(&tReal[0 + synQmf->lsb], synQmf->usb - synQmf->lsb,
419 scaleFactorHighBand + 1);
420 scaleValuesSaturate(&tImag[0], synQmf->lsb, scaleFactorLowBand + 1);
421 scaleValuesSaturate(&tImag[0 + synQmf->lsb], synQmf->usb - synQmf->lsb,
422 scaleFactorHighBand + 1);
711423 }
712424
713425 if ((synQmf->flags & QMF_FLAG_CLDFB) == 0) {
714 scaleValues(&tReal[0], &qmfReal[0], synQmf->lsb, (int)scaleFactorLowBand);
715 scaleValues(&tReal[0 + synQmf->lsb], &qmfReal[0 + synQmf->lsb],
716 synQmf->usb - synQmf->lsb, (int)scaleFactorHighBand);
717 scaleValues(&tImag[0], &qmfImag[0], synQmf->lsb, (int)scaleFactorLowBand);
718 scaleValues(&tImag[0 + synQmf->lsb], &qmfImag[0 + synQmf->lsb],
719 synQmf->usb - synQmf->lsb, (int)scaleFactorHighBand);
426 scaleValuesSaturate(&tReal[0], &qmfReal[0], synQmf->lsb,
427 scaleFactorLowBand);
428 scaleValuesSaturate(&tReal[0 + synQmf->lsb], &qmfReal[0 + synQmf->lsb],
429 synQmf->usb - synQmf->lsb, scaleFactorHighBand);
430 scaleValuesSaturate(&tImag[0], &qmfImag[0], synQmf->lsb,
431 scaleFactorLowBand);
432 scaleValuesSaturate(&tImag[0 + synQmf->lsb], &qmfImag[0 + synQmf->lsb],
433 synQmf->usb - synQmf->lsb, scaleFactorHighBand);
720434 }
721435
722436 FDKmemclear(&tReal[synQmf->usb],
1003717 * \return 0 if succesful
1004718 *
1005719 */
1006 int qmfInitAnalysisFilterBank(
1007 HANDLE_QMF_FILTER_BANK h_Qmf, /*!< Returns handle */
1008 FIXP_QAS *pFilterStates, /*!< Handle to filter states */
1009 int noCols, /*!< Number of timeslots per frame */
1010 int lsb, /*!< lower end of QMF */
1011 int usb, /*!< upper end of QMF */
1012 int no_channels, /*!< Number of channels (bands) */
1013 int flags) /*!< Low Power flag */
1014 {
1015 int err = qmfInitFilterBank(h_Qmf, pFilterStates, noCols, lsb, usb,
1016 no_channels, flags, 0);
1017 if (!(flags & QMF_FLAG_KEEP_STATES) && (h_Qmf->FilterStates != NULL)) {
1018 FDKmemclear(h_Qmf->FilterStates,
1019 (2 * QMF_NO_POLY - 1) * h_Qmf->no_channels * sizeof(FIXP_QAS));
1020 }
1021
1022 FDK_ASSERT(h_Qmf->no_channels >= h_Qmf->lsb);
1023
1024 return err;
1025 }
1026
1027 /*!
1028 *
1029 * \brief Create QMF filter bank instance
1030 *
1031 *
1032 * \return 0 if succesful
1033 *
1034 */
1035720 int qmfInitSynthesisFilterBank(
1036721 HANDLE_QMF_FILTER_BANK h_Qmf, /*!< Returns handle */
1037722 FIXP_QSS *pFilterStates, /*!< Handle to filter states */
1127812 synQmf->outGain_e = outputGainScale;
1128813 }
1129814
1130 /* When QMF_16IN_32OUT is set, synthesis functions for 16 and 32 bit parallel
1131 * output is compiled */
1132815 #define INT_PCM_QMFOUT INT_PCM
1133816 #define SAMPLE_BITS_QMFOUT SAMPLE_BITS
1134817 #include "qmf_pcm.h"
818 #if SAMPLE_BITS == 16
819 /* also create a 32 bit output version */
820 #undef INT_PCM_QMFOUT
821 #undef SAMPLE_BITS_QMFOUT
822 #undef QMF_PCM_H
823 #undef FIXP_QAS
824 #undef QAS_BITS
825 #undef INT_PCM_QMFIN
826 #define INT_PCM_QMFOUT LONG
827 #define SAMPLE_BITS_QMFOUT 32
828 #define FIXP_QAS FIXP_DBL
829 #define QAS_BITS 32
830 #define INT_PCM_QMFIN LONG
831 #include "qmf_pcm.h"
832 #endif
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
249249 */
250250 #define FUNCTION_scaleValuesSaturate_DBL_DBL
251251 SCALE_INLINE
252 void scaleValuesSaturate(FIXP_DBL *dst, /*!< Output */
253 FIXP_DBL *src, /*!< Input */
254 INT len, /*!< Length */
255 INT scalefactor /*!< Scalefactor */
252 void scaleValuesSaturate(FIXP_DBL *dst, /*!< Output */
253 const FIXP_DBL *src, /*!< Input */
254 INT len, /*!< Length */
255 INT scalefactor /*!< Scalefactor */
256256 ) {
257257 INT i;
258258
284284 */
285285 #define FUNCTION_scaleValuesSaturate_SGL_DBL
286286 SCALE_INLINE
287 void scaleValuesSaturate(FIXP_SGL *dst, /*!< Output */
288 FIXP_DBL *src, /*!< Input */
289 INT len, /*!< Length */
290 INT scalefactor) /*!< Scalefactor */
287 void scaleValuesSaturate(FIXP_SGL *dst, /*!< Output */
288 const FIXP_DBL *src, /*!< Input */
289 INT len, /*!< Length */
290 INT scalefactor) /*!< Scalefactor */
291291 {
292292 INT i;
293293 scalefactor = fixmax_I(fixmin_I(scalefactor, (INT)DFRACT_BITS - 1),
344344 */
345345 #define FUNCTION_scaleValuesSaturate_SGL_SGL
346346 SCALE_INLINE
347 void scaleValuesSaturate(FIXP_SGL *dst, /*!< Output */
348 FIXP_SGL *src, /*!< Input */
349 INT len, /*!< Length */
350 INT scalefactor /*!< Scalefactor */
347 void scaleValuesSaturate(FIXP_SGL *dst, /*!< Output */
348 const FIXP_SGL *src, /*!< Input */
349 INT len, /*!< Length */
350 INT scalefactor /*!< Scalefactor */
351351 ) {
352352 INT i;
353353
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2020 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
212212 goto bail;
213213 }
214214
215 FDKcrcReset(&pAdts->crcInfo);
215216 if (!bs.protection_absent) {
216 FDKcrcReset(&pAdts->crcInfo);
217217 FDKpushBack(hBs, 56); /* complete fixed and variable header! */
218218 crcReg = FDKcrcStartReg(&pAdts->crcInfo, hBs, 0);
219219 FDKpushFor(hBs, 56);
313313 if (bs.channel_config == 0) {
314314 int pceBits = 0;
315315 UINT alignAnchor = FDKgetValidBits(hBs);
316 CProgramConfig tmpPce;
316317
317318 if (FDKreadBits(hBs, 3) == ID_PCE) {
318319 /* Got luck! Parse the PCE */
319320 crcReg = adtsRead_CrcStartReg(pAdts, hBs, 0);
320321
321 CProgramConfig_Read(&pAsc->m_progrConfigElement, hBs, alignAnchor);
322 CProgramConfig_Init(&tmpPce);
323 CProgramConfig_Read(&tmpPce, hBs, alignAnchor);
324
325 if (CProgramConfig_IsValid(&tmpPce)) {
326 if (CProgramConfig_IsValid(&oldPce)) {
327 /* Compare the new and the old PCE (tags ignored) */
328 switch (CProgramConfig_Compare(&tmpPce, &oldPce)) {
329 case 0: /* Nothing to do because PCE matches the old one exactly. */
330 case 1: /* Channel configuration not changed. Just new metadata. */
331 FDKmemcpy(&pAsc->m_progrConfigElement, &tmpPce,
332 sizeof(CProgramConfig));
333 break;
334 case 2: /* The number of channels are identical but not the config
335 */
336 case -1: /* The channel configuration is completely different */
337 default:
338 FDKmemcpy(&pAsc->m_progrConfigElement, &oldPce,
339 sizeof(CProgramConfig));
340 FDKpushBack(hBs, adtsHeaderLength);
341 return TRANSPORTDEC_PARSE_ERROR;
342 }
343 } else {
344 FDKmemcpy(&pAsc->m_progrConfigElement, &tmpPce,
345 sizeof(CProgramConfig));
346 }
347 } else {
348 if (CProgramConfig_IsValid(&oldPce)) {
349 FDKmemcpy(&pAsc->m_progrConfigElement, &oldPce,
350 sizeof(CProgramConfig));
351 } else {
352 FDKpushBack(hBs, adtsHeaderLength);
353 return TRANSPORTDEC_PARSE_ERROR;
354 }
355 }
322356
323357 adtsRead_CrcEndReg(pAdts, hBs, crcReg);
324 pceBits = alignAnchor - FDKgetValidBits(hBs);
358 pceBits = (INT)alignAnchor - (INT)FDKgetValidBits(hBs);
359 adtsHeaderLength += pceBits;
360
361 if (pceBits > (INT)alignAnchor) {
362 goto bail;
363 }
364
325365 /* store the number of PCE bits */
326366 bs.num_pce_bits = pceBits;
327367 } else {
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
13241324 CSTpCallBacks *cb) {
13251325 TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK;
13261326 CSEldSpecificConfig *esc = &asc->m_sc.m_eldSpecificConfig;
1327 ASC_ELD_EXT_TYPE eldExtType;
1327 UINT eldExtType;
13281328 int eldExtLen, len, cnt, ldSbrLen = 0, eldExtLenSum, numSbrHeader = 0,
1329 sbrIndex;
1329 sbrIndex, eldExtCnt = 0;
13301330
13311331 unsigned char downscale_fill_nibble;
13321332
13931393 eldExtLenSum = FDKgetValidBits(hBs);
13941394 esc->m_downscaledSamplingFrequency = asc->m_samplingFrequency;
13951395 /* parse ExtTypeConfigData */
1396 while (
1397 ((eldExtType = (ASC_ELD_EXT_TYPE)FDKreadBits(hBs, 4)) != ELDEXT_TERM) &&
1398 ((INT)FDKgetValidBits(hBs) >= 0)) {
1396 while (((eldExtType = FDKreadBits(hBs, 4)) != ELDEXT_TERM) &&
1397 ((INT)FDKgetValidBits(hBs) >= 0) && (eldExtCnt++ < 15)) {
13991398 eldExtLen = len = FDKreadBits(hBs, 4);
14001399 if (len == 0xf) {
14011400 len = FDKreadBits(hBs, 8);
14391438 UCHAR tmpDownscaleFreqIdx;
14401439 esc->m_downscaledSamplingFrequency =
14411440 getSampleRate(hBs, &tmpDownscaleFreqIdx, 4);
1442 if (esc->m_downscaledSamplingFrequency == 0) {
1441 if (esc->m_downscaledSamplingFrequency == 0 ||
1442 esc->m_downscaledSamplingFrequency > 96000) {
14431443 return TRANSPORTDEC_PARSE_ERROR;
14441444 }
14451445 downscale_fill_nibble = FDKreadBits(hBs, 4);
14521452 }
14531453 break;
14541454 }
1455 }
1456 if (eldExtType != ELDEXT_TERM) {
1457 return TRANSPORTDEC_PARSE_ERROR;
14551458 }
14561459
14571460 if ((INT)FDKgetValidBits(hBs) < 0) {
15451548 const AUDIO_OBJECT_TYPE aot) {
15461549 TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK;
15471550
1548 USAC_EXT_ELEMENT_TYPE usacExtElementType =
1549 (USAC_EXT_ELEMENT_TYPE)escapedValue(hBs, 4, 8, 16);
1551 int usacExtElementType = escapedValue(hBs, 4, 8, 16);
15501552
15511553 /* recurve extension elements which are invalid for USAC */
15521554 if (aot == AOT_USAC) {
15631565 }
15641566 }
15651567
1566 extElement->usacExtElementType = usacExtElementType;
1568 extElement->usacExtElementType = (USAC_EXT_ELEMENT_TYPE)usacExtElementType;
15671569 int usacExtElementConfigLength = escapedValue(hBs, 4, 8, 16);
15681570 extElement->usacExtElementConfigLength = (USHORT)usacExtElementConfigLength;
15691571 INT bsAnchor;
16271629 TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK;
16281630
16291631 int numConfigExtensions;
1630 CONFIG_EXT_ID usacConfigExtType;
1632 int usacConfigExtType;
16311633 int usacConfigExtLength;
16321634
16331635 numConfigExtensions = (int)escapedValue(hBs, 2, 4, 8) + 1;
16341636 for (int confExtIdx = 0; confExtIdx < numConfigExtensions; confExtIdx++) {
16351637 INT nbits;
16361638 int loudnessInfoSetConfigExtensionPosition = FDKgetValidBits(hBs);
1637 usacConfigExtType = (CONFIG_EXT_ID)escapedValue(hBs, 4, 8, 16);
1639 usacConfigExtType = escapedValue(hBs, 4, 8, 16);
16381640 usacConfigExtLength = (int)escapedValue(hBs, 4, 8, 16);
16391641
16401642 /* Start bit position of config extension */
19471949 INT nbits = (INT)FDKgetValidBits(hBs);
19481950
19491951 usacSamplingFrequency = getSampleRate(hBs, &asc->m_samplingFrequencyIndex, 5);
1952 if (usacSamplingFrequency == 0 || usacSamplingFrequency > 96000) {
1953 return TRANSPORTDEC_PARSE_ERROR;
1954 }
19501955 asc->m_samplingFrequency = (UINT)usacSamplingFrequency;
19511956
19521957 coreSbrFrameLengthIndex = FDKreadBits(hBs, 3);
20262031 self->m_extensionSamplingFrequency = getSampleRate(
20272032 bs, &self->m_extensionSamplingFrequencyIndex, 4);
20282033
2029 if ((INT)self->m_extensionSamplingFrequency <= 0) {
2034 if (self->m_extensionSamplingFrequency == 0 ||
2035 self->m_extensionSamplingFrequency > 96000) {
20302036 return TRANSPORTDEC_PARSE_ERROR;
20312037 }
20322038 }
21382144
21392145 self->m_channelConfiguration = FDKreadBits(bs, 4);
21402146
2147 /* MPEG-04 standard ISO/IEC 14496-3: channelConfiguration == 0 is reserved
2148 in er_raw_data_block (table 4.19) and er_raw_data_block_eld (table 4.75)
2149 MPEG-04 conformance ISO/IEC 14496-4: channelConfiguration == 0 is not
2150 permitted for AOT_ER_AAC_LC, AOT_ER_AAC_LTP, AOT_ER_AAC_LD,
2151 AOT_ER_AAC_SCAL (chapter 6.6.4.1.2.1.1) */
2152 if ((self->m_channelConfiguration == 0) &&
2153 ((self->m_aot == AOT_ER_AAC_LC) || (self->m_aot == AOT_ER_AAC_LTP) ||
2154 (self->m_aot == AOT_ER_AAC_LD) || (self->m_aot == AOT_ER_AAC_SCAL) ||
2155 (self->m_aot == AOT_ER_AAC_ELD))) {
2156 return TRANSPORTDEC_UNSUPPORTED_FORMAT;
2157 }
2158 /* MPEG-04 conformance ISO/IEC 14496-4: channelConfiguration > 2 is not
2159 * permitted for AOT_AAC_SCAL and AOT_ER_AAC_SCAL (chapter 6.6.4.1.2.1.1) */
2160 if ((self->m_channelConfiguration > 2) &&
2161 ((self->m_aot == AOT_AAC_SCAL) || (self->m_aot == AOT_ER_AAC_SCAL))) {
2162 return TRANSPORTDEC_UNSUPPORTED_FORMAT;
2163 }
2164
21412165 /* SBR extension ( explicit non-backwards compatible mode ) */
21422166 self->m_sbrPresentFlag = 0;
21432167 self->m_psPresentFlag = 0;
21522176
21532177 self->m_extensionSamplingFrequency =
21542178 getSampleRate(bs, &self->m_extensionSamplingFrequencyIndex, 4);
2179 if (self->m_extensionSamplingFrequency == 0 ||
2180 self->m_extensionSamplingFrequency > 96000) {
2181 return TRANSPORTDEC_PARSE_ERROR;
2182 }
21552183 self->m_aot = getAOT(bs);
21562184
21572185 switch (self->m_aot) {
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
366366 }
367367 if (pLatmDemux->m_AudioMuxVersion == 1) {
368368 FDK_BITSTREAM tmpBs;
369 UINT ascLen = 0;
369 INT ascLen = 0;
370370 ascLen = CLatmDemux_GetValue(bs);
371371 /* The ascLen could be wrong, so check if validBits<=bufBits*/
372 if (ascLen > FDKgetValidBits(bs)) {
372 if (ascLen < 0 || ascLen > (INT)FDKgetValidBits(bs)) {
373373 ErrorStatus = TRANSPORTDEC_PARSE_ERROR;
374374 goto bail;
375375 }
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
273273 UCHAR configChanged = 0;
274274 UCHAR configMode = AC_CM_DET_CFG_CHANGE;
275275
276 UCHAR tmpConf[1024];
276 UCHAR tmpConf[1024] = {0};
277277 if (length > 1024) {
278278 return TRANSPORTDEC_UNSUPPORTED_FORMAT;
279279 }
481481
482482 for (int i = 0; i < 2; i++) {
483483 if (i > 0) {
484 FDKpushBack(hBs, newConfigLength * 8 - FDKgetValidBits(hBs));
484 FDKpushBack(hBs,
485 (INT)newConfigLength * 8 - (INT)FDKgetValidBits(hBs));
485486 configMode = AC_CM_ALLOC_MEM;
486487 }
487488 /* config transport decoder */
662663 if (*pBytesValid == 0) {
663664 /* nothing to do */
664665 return TRANSPORTDEC_OK;
665 }
666
667 if (hTp->numberOfRawDataBlocks <= 0) {
666 } else {
667 const int bytesValid = *pBytesValid;
668668 FDKfeedBuffer(hBs, pBuffer, bufferSize, pBytesValid);
669
670 if (hTp->numberOfRawDataBlocks > 0) {
671 hTp->globalFramePos += (bytesValid - *pBytesValid) * 8;
672 hTp->accessUnitAnchor[layer] = FDKgetValidBits(hBs);
673 }
669674 }
670675 }
671676
923928 }
924929 }
925930 }
931 /* if an error is detected terminate config parsing to avoid that an
932 * invalid config is accepted in the second pass */
933 if (err != TRANSPORTDEC_OK) {
934 break;
935 }
926936 }
927937 } else {
928938 /* Reset CRC because the next bits are the beginning of a
975985 CLatmDemux_GetNrOfSubFrames(&hTp->parser.latm);
976986 if (hTp->transportFmt == TT_MP4_LOAS) {
977987 syncLayerFrameBits -= startPos - (INT)FDKgetValidBits(hBs) - (13);
988 if (syncLayerFrameBits <= 0) {
989 err = TRANSPORTDEC_SYNC_ERROR;
990 }
978991 }
979992 }
980993 } else {
11501163 &rawDataBlockLength, &fTraverseMoreFrames,
11511164 &syncLayerFrameBits, &fConfigFound,
11521165 &headerBits);
1166 if (headerBits > bitsAvail) {
1167 err = (headerBits < (INT)hBs->hBitBuf.bufBits)
1168 ? TRANSPORTDEC_NOT_ENOUGH_BITS
1169 : TRANSPORTDEC_SYNC_ERROR;
1170 }
11531171 if (TPDEC_IS_FATAL_ERROR(err)) {
11541172 /* Rewind - TPDEC_SYNCSKIP, in order to look for a synch one bit ahead
11551173 * next time. Ensure that the bit amount lands at a multiple of
11801198 }
11811199
11821200 if (err == TRANSPORTDEC_NOT_ENOUGH_BITS) {
1183 /* Enforce reading of new data */
1184 hTp->numberOfRawDataBlocks = 0;
11851201 break;
11861202 }
11871203
12621278 if (!(hTp->flags & (TPDEC_LOST_FRAMES_PENDING | TPDEC_IGNORE_BUFFERFULLNESS |
12631279 TPDEC_SYNCOK)) &&
12641280 err == TRANSPORTDEC_OK) {
1265 err = additionalHoldOffNeeded(hTp, transportDec_GetBufferFullness(hTp),
1266 FDKgetValidBits(hBs) - syncLayerFrameBits);
1281 err =
1282 additionalHoldOffNeeded(hTp, transportDec_GetBufferFullness(hTp),
1283 (INT)FDKgetValidBits(hBs) - syncLayerFrameBits);
12671284 if (err == TRANSPORTDEC_NOT_ENOUGH_BITS) {
12681285 hTp->holdOffFrames++;
12691286 }
12721289 /* Rewind for retry because of not enough bits */
12731290 if (err == TRANSPORTDEC_NOT_ENOUGH_BITS) {
12741291 FDKpushBack(hBs, headerBits);
1292 hTp->numberOfRawDataBlocks = numRawDataBlocksPrevious;
12751293 headerBits = 0;
1294 rawDataBlockLength = rawDataBlockLengthPrevious;
12761295 } else {
12771296 /* reset hold off frame counter */
12781297 hTp->holdOffFrames = 0;
14591478
14601479 for (i = 0; i < 2; i++) {
14611480 if (i > 0) {
1462 FDKpushBack(hBs, bsStart - FDKgetValidBits(hBs));
1481 FDKpushBack(hBs, bsStart - (INT)FDKgetValidBits(hBs));
14631482 configMode = AC_CM_ALLOC_MEM;
14641483 }
14651484
17491768 info += i;
17501769
17511770 info->module_id = FDK_TPDEC;
1752 #ifdef __ANDROID__
1771 #ifdef SUPPRESS_BUILD_DATE_INFO
17531772 info->build_date = "";
17541773 info->build_time = "";
17551774 #else
646646 info->module_id = FDK_TPENC;
647647 info->version = LIB_VERSION(TP_LIB_VL0, TP_LIB_VL1, TP_LIB_VL2);
648648 LIB_VERSION_STRING(info);
649 #ifdef __ANDROID__
649 #ifdef SUPPRESS_BUILD_DATE_INFO
650650 info->build_date = "";
651651 info->build_time = "";
652652 #else
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
107107
108108 #define TDL_ATTACK_DEFAULT_MS (15) /* default attack time in ms */
109109 #define TDL_RELEASE_DEFAULT_MS (50) /* default release time in ms */
110
111 #define TDL_GAIN_SCALING (15) /* scaling of gain value. */
112110
113111 #ifdef __cplusplus
114112 extern "C" {
127125 unsigned int maxBufIdx, delayBufIdx;
128126 FIXP_DBL smoothState0;
129127 FIXP_DBL minGain;
130
131 FIXP_DBL additionalGainPrev;
132 FIXP_DBL additionalGainFilterState;
133 FIXP_DBL additionalGainFilterState1;
128 INT scaling;
134129 };
135130
136131 typedef enum {
254249
255250 /******************************************************************************
256251 * pcmLimiter_Apply *
257 * limiter: limiter handle *
258 * pGain : pointer to gains to be applied to the signal before limiting, *
259 * which are downscaled by TDL_GAIN_SCALING bit. *
260 * These gains are delayed by gain_delay, and smoothed. *
261 * Smoothing is done by a butterworth lowpass filter with a cutoff *
262 * frequency which is fixed with respect to the sampling rate. *
263 * It is a substitute for the smoothing due to windowing and *
264 * overlap/add, if a gain is applied in frequency domain. *
265 * gain_scale: pointer to scaling exponents to be applied to the signal before *
266 * limiting, without delay and without smoothing *
267 * gain_size: number of elements in pGain, currently restricted to 1 *
268 * gain_delay: delay [samples] with which the gains in pGain shall be applied *
269 * gain_delay <= nSamples *
270 * samples: input/output buffer containing interleaved samples *
271 * precision of output will be DFRACT_BITS-TDL_GAIN_SCALING bits *
272 * nSamples: number of samples per channel *
252 * limiter: limiter handle *
253 * samplesIn: pointer to input buffer containing interleaved samples *
254 * samplesOut: pointer to output buffer containing interleaved samples *
255 * pGainPerSample: pointer to gains for each sample *
256 * scaling: scaling of output samples *
257 * nSamples: number of samples per channel *
273258 * returns: error code *
274259 ******************************************************************************/
275260 TDLIMITER_ERROR pcmLimiter_Apply(TDLimiterPtr limiter, PCM_LIM* samplesIn,
276 INT_PCM* samplesOut, FIXP_DBL* pGain,
277 const INT* gain_scale, const UINT gain_size,
278 const UINT gain_delay, const UINT nSamples);
261 INT_PCM* samplesOut, FIXP_DBL* pGainPerSample,
262 const INT scaling, const UINT nSamples);
279263
280264 #endif /* #ifndef LIMITER_H */
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
151151 limiter->attack = attack;
152152 limiter->attackConst = attackConst;
153153 limiter->releaseConst = releaseConst;
154 limiter->threshold = threshold >> TDL_GAIN_SCALING;
154 limiter->threshold = threshold;
155155 limiter->channels = maxChannels;
156156 limiter->maxChannels = maxChannels;
157157 limiter->sampleRate = maxSampleRate;
164164
165165 /* apply limiter */
166166 TDLIMITER_ERROR pcmLimiter_Apply(TDLimiterPtr limiter, PCM_LIM* samplesIn,
167 INT_PCM* samplesOut, FIXP_DBL* RESTRICT pGain,
168 const INT* RESTRICT gain_scale,
169 const UINT gain_size, const UINT gain_delay,
170 const UINT nSamples) {
167 INT_PCM* samplesOut, FIXP_DBL* pGainPerSample,
168 const INT scaling, const UINT nSamples) {
171169 unsigned int i, j;
172 FIXP_DBL tmp1;
173170 FIXP_DBL tmp2;
174 FIXP_DBL tmp, old, gain, additionalGain = 0, additionalGainUnfiltered;
171 FIXP_DBL tmp, old, gain, additionalGain = 0;
175172 FIXP_DBL minGain = FL2FXCONST_DBL(1.0f / (1 << 1));
176
177 FDK_ASSERT(gain_size == 1);
178 FDK_ASSERT(gain_delay <= nSamples);
173 UINT additionalGainAvailable = 1;
179174
180175 if (limiter == NULL) return TDLIMIT_INVALID_HANDLE;
181176
184179 unsigned int attack = limiter->attack;
185180 FIXP_DBL attackConst = limiter->attackConst;
186181 FIXP_DBL releaseConst = limiter->releaseConst;
187 FIXP_DBL threshold = limiter->threshold;
182 FIXP_DBL threshold = limiter->threshold >> scaling;
188183
189184 FIXP_DBL max = limiter->max;
190185 FIXP_DBL* maxBuf = limiter->maxBuf;
194189 unsigned int delayBufIdx = limiter->delayBufIdx;
195190
196191 FIXP_DBL smoothState0 = limiter->smoothState0;
197 FIXP_DBL additionalGainSmoothState = limiter->additionalGainFilterState;
198 FIXP_DBL additionalGainSmoothState1 = limiter->additionalGainFilterState1;
199
200 if (!gain_delay) {
201 additionalGain = pGain[0];
202 if (gain_scale[0] > 0) {
203 additionalGain <<= gain_scale[0];
204 } else {
205 additionalGain >>= -gain_scale[0];
206 }
192
193 if (limiter->scaling != scaling) {
194 scaleValuesSaturate(delayBuf, attack * channels,
195 limiter->scaling - scaling);
196 scaleValuesSaturate(maxBuf, attack + 1, limiter->scaling - scaling);
197 max = scaleValueSaturate(max, limiter->scaling - scaling);
198 limiter->scaling = scaling;
207199 }
208200
201 if (pGainPerSample == NULL) {
202 additionalGainAvailable = 0;
203 }
204
209205 for (i = 0; i < nSamples; i++) {
210 if (gain_delay) {
211 if (i < gain_delay) {
212 additionalGainUnfiltered = limiter->additionalGainPrev;
213 } else {
214 additionalGainUnfiltered = pGain[0];
215 }
216
217 /* Smooth additionalGain */
218 /* [b,a] = butter(1, 0.01) */
219 static const FIXP_SGL b[] = {FL2FXCONST_SGL(0.015466 * 2.0),
220 FL2FXCONST_SGL(0.015466 * 2.0)};
221 static const FIXP_SGL a[] = {(FIXP_SGL)MAXVAL_SGL,
222 FL2FXCONST_SGL(-0.96907)};
223 additionalGain = -fMult(additionalGainSmoothState, a[1]) +
224 fMultDiv2(additionalGainUnfiltered, b[0]) +
225 fMultDiv2(additionalGainSmoothState1, b[1]);
226 additionalGainSmoothState1 = additionalGainUnfiltered;
227 additionalGainSmoothState = additionalGain;
228
229 /* Apply the additional scaling that has no delay and no smoothing */
230 if (gain_scale[0] > 0) {
231 additionalGain <<= gain_scale[0];
232 } else {
233 additionalGain >>= -gain_scale[0];
234 }
235 }
236206 /* get maximum absolute sample value of all channels, including the
237207 * additional gain. */
238 tmp1 = (FIXP_DBL)0;
208 tmp = (FIXP_DBL)0;
239209 for (j = 0; j < channels; j++) {
240210 tmp2 = PCM_LIM2FIXP_DBL(samplesIn[j]);
241 tmp2 = fAbs(tmp2);
242 tmp2 = FIXP_DBL(INT(tmp2) ^ INT((tmp2 >> (SAMPLE_BITS_LIM - 1))));
243 tmp1 = fMax(tmp1, tmp2);
244 }
245 tmp = fMult(tmp1, additionalGain);
211 tmp2 =
212 (tmp2 == (FIXP_DBL)MINVAL_DBL) ? (FIXP_DBL)MAXVAL_DBL : fAbs(tmp2);
213 tmp = fMax(tmp, tmp2);
214 }
215
216 if (additionalGainAvailable) {
217 additionalGain = pGainPerSample[i];
218 tmp = fMult(tmp, additionalGain);
219 }
246220
247221 /* set threshold as lower border to save calculations in running maximum
248222 * algorithm */
313287 /* lookahead delay, apply gain */
314288 for (j = 0; j < channels; j++) {
315289 tmp = p_delayBuf[j];
316 p_delayBuf[j] = fMult((FIXP_PCM_LIM)samplesIn[j], additionalGain);
290
291 if (additionalGainAvailable) {
292 p_delayBuf[j] = fMult((FIXP_PCM_LIM)samplesIn[j], additionalGain);
293 } else {
294 p_delayBuf[j] = PCM_LIM2FIXP_DBL(samplesIn[j]);
295 }
317296
318297 /* Apply gain to delayed signal */
319298 tmp = fMultDiv2(tmp, gain);
320
299 #if (SAMPLE_BITS == DFRACT_BITS)
300 samplesOut[j] = (INT_PCM)FX_DBL2FX_PCM(
301 (FIXP_DBL)SATURATE_LEFT_SHIFT(tmp, scaling + 1, DFRACT_BITS));
302 #else
321303 samplesOut[j] = (INT_PCM)FX_DBL2FX_PCM((FIXP_DBL)SATURATE_LEFT_SHIFT(
322 tmp, TDL_GAIN_SCALING + 1, DFRACT_BITS));
304 tmp + ((FIXP_DBL)0x8000 >> (scaling + 1)), scaling + 1,
305 DFRACT_BITS));
306 #endif
323307 }
324308 gain >>= 1;
325309 } else {
326310 /* lookahead delay, apply gain=1.0f */
327311 for (j = 0; j < channels; j++) {
328312 tmp = p_delayBuf[j];
329 p_delayBuf[j] = fMult((FIXP_PCM_LIM)samplesIn[j], additionalGain);
313 if (additionalGainAvailable) {
314 p_delayBuf[j] = fMult((FIXP_PCM_LIM)samplesIn[j], additionalGain);
315 } else {
316 p_delayBuf[j] = PCM_LIM2FIXP_DBL(samplesIn[j]);
317 }
318
319 #if (SAMPLE_BITS == DFRACT_BITS)
320 samplesOut[j] = (INT_PCM)FX_DBL2FX_PCM(
321 (FIXP_DBL)SATURATE_LEFT_SHIFT(tmp, scaling, DFRACT_BITS));
322 #else
330323 samplesOut[j] = (INT_PCM)FX_DBL2FX_PCM((FIXP_DBL)SATURATE_LEFT_SHIFT(
331 tmp, TDL_GAIN_SCALING, DFRACT_BITS));
324 tmp + ((FIXP_DBL)0x8000 >> scaling), scaling, DFRACT_BITS));
325 #endif
332326 }
333327 }
334328
353347 limiter->delayBufIdx = delayBufIdx;
354348
355349 limiter->smoothState0 = smoothState0;
356 limiter->additionalGainFilterState = additionalGainSmoothState;
357 limiter->additionalGainFilterState1 = additionalGainSmoothState1;
358350
359351 limiter->minGain = minGain;
360
361 limiter->additionalGainPrev = pGain[0];
362352
363353 return TDLIMIT_OK;
364354 }
369359 FIXP_DBL threshold) {
370360 if (limiter == NULL) return TDLIMIT_INVALID_HANDLE;
371361
372 limiter->threshold = threshold >> TDL_GAIN_SCALING;
362 limiter->threshold = threshold;
373363
374364 return TDLIMIT_OK;
375365 }
383373 limiter->cor = FL2FXCONST_DBL(1.0f / (1 << 1));
384374 limiter->smoothState0 = FL2FXCONST_DBL(1.0f / (1 << 1));
385375 limiter->minGain = FL2FXCONST_DBL(1.0f / (1 << 1));
386
387 limiter->additionalGainPrev =
388 FL2FXCONST_DBL(1.0f / (1 << TDL_GAIN_SCALING));
389 limiter->additionalGainFilterState =
390 FL2FXCONST_DBL(1.0f / (1 << TDL_GAIN_SCALING));
391 limiter->additionalGainFilterState1 =
392 FL2FXCONST_DBL(1.0f / (1 << TDL_GAIN_SCALING));
376 limiter->scaling = 0;
393377
394378 FDKmemset(limiter->maxBuf, 0, (limiter->attack + 1) * sizeof(FIXP_DBL));
395379 FDKmemset(limiter->delayBuf, 0,
584584
585585 if (channelIndices[ch] >= numCh[channelType[ch] >> 4][chGrp])
586586 return PCMDMX_INVALID_CH_CONFIG;
587
588587 spkrPos[ch] = getSpeakerPos(channelType[ch], channelIndices[ch],
589588 numCh[channelType[ch] >> 4][chGrp]);
590589
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
104104
105105 /* library info */
106106 #define PCMUTIL_LIB_VL0 3
107 #define PCMUTIL_LIB_VL1 0
107 #define PCMUTIL_LIB_VL1 1
108108 #define PCMUTIL_LIB_VL2 0
109109 #define PCMUTIL_LIB_TITLE "PCM Utility Lib"
110 #ifdef __ANDROID__
110 #ifdef SUPPRESS_BUILD_DATE_INFO
111111 #define PCMUTIL_LIB_BUILD_DATE ""
112112 #define PCMUTIL_LIB_BUILD_TIME ""
113113 #else
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
251251 scenario. Default parameter value is 3 frames. */
252252 } SACDEC_PARAM;
253253
254 #define PCM_MPS INT_PCM
254 #define PCM_MPS LONG
255255
256256 /**
257257 * \brief MPEG Surround decoder handle.
400400 * for each output audio channel is stored into.
401401 * \param mapDescr Channep map descriptor for output channel mapping
402402 * to be used (From MPEG PCE ordering to whatever is required).
403 * \param inDataHeadroom Headroom of SAC input time signal to prevent
404 * clipping.
405 * \param outDataHeadroom Pointer to headroom of SAC output time signal to
406 * prevent clipping.
403407 *
404408 * \return Error code.
405409 */
406410 int mpegSurroundDecoder_Apply(CMpegSurroundDecoder *pMpegSurroundDecoder,
407 INT_PCM *input, PCM_MPS *pTimeData,
411 PCM_MPS *input, PCM_MPS *pTimeData,
408412 const int timeDataSize, int timeDataFrameSize,
409413 int *nChannels, int *frameSize, int sampleRate,
410414 AUDIO_OBJECT_TYPE coreCodec,
411415 AUDIO_CHANNEL_TYPE channelType[],
412416 UCHAR channelIndices[],
413 const FDK_channelMapDescr *const mapDescr);
417 const FDK_channelMapDescr *const mapDescr,
418 const INT inDataHeadroom, INT *outDataHeadroom);
414419
415420 /**
416421 * \brief Deallocate a MPEG Surround decoder instance.
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
447447 int bsFreqRes, b3DaudioMode = 0;
448448 int numHeaderBits;
449449 int cfgStartPos, bitsAvailable;
450 int treeConfig;
450451
451452 FDKmemclear(pSpatialSpecificConfig, sizeof(SPATIAL_SPECIFIC_CONFIG));
452453
487488 pSpatialSpecificConfig->freqRes =
488489 (SPATIALDEC_FREQ_RES)freqResTable_LD[bsFreqRes];
489490
490 pSpatialSpecificConfig->treeConfig =
491 (SPATIALDEC_TREE_CONFIG)FDKreadBits(bitstream, 4);
492
493 if (pSpatialSpecificConfig->treeConfig != SPATIALDEC_MODE_RSVD7) {
491 treeConfig = FDKreadBits(bitstream, 4);
492
493 if (treeConfig != SPATIALDEC_MODE_RSVD7) {
494494 err = MPS_UNSUPPORTED_CONFIG;
495495 goto bail;
496496 }
497 pSpatialSpecificConfig->treeConfig = (SPATIALDEC_TREE_CONFIG) treeConfig;
497498
498499 {
499500 pSpatialSpecificConfig->nOttBoxes =
14561457 FIXP_DBL (*pOttVsTotDb1)[MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS],
14571458 FIXP_DBL (*pOttVsTotDb2)[MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS]) {
14581459 int aParamSlots[MAX_PARAMETER_SETS];
1459 int aInterpolate[MAX_PARAMETER_SETS];
1460 int aInterpolate[MAX_PARAMETER_SETS] = {0};
14601461
14611462 int dataSets;
14621463 int aMap[MAX_PARAMETER_BANDS + 1];
15531554 /* Interpolate */
15541555 i1 = 0;
15551556 for (i = 0; i < numParameterSets; i++) {
1556 int xi, i2, x1, x2;
1557
15581557 if (aInterpolate[i] != 1) {
15591558 i1 = i;
1560 }
1561 i2 = i;
1562 while (aInterpolate[i2] == 1) {
1563 i2++;
1564 }
1565 x1 = paramSlot[i1];
1566 xi = paramSlot[i];
1567 x2 = paramSlot[i2];
1568
1569 if (aInterpolate[i] == 1) {
1559 } else {
1560 int xi, i2, x1, x2;
1561
1562 for (i2 = i; i2 < numParameterSets; i2++) {
1563 if (aInterpolate[i2] != 1) break;
1564 }
15701565 if (i2 >= numParameterSets) return MPS_WRONG_PARAMETERSETS;
1566
1567 x1 = paramSlot[i1];
1568 xi = paramSlot[i];
1569 x2 = paramSlot[i2];
1570
15711571 for (band = startBand; band < stopBand; band++) {
15721572 int yi, y1, y2;
15731573 y1 = outputIdxData[xttIdx][i1][band];
15861586 for (ps = 0; ps < numParameterSets; ps++) {
15871587 if (quantMode && (paramType == t_CLD)) {
15881588 if (pOttVsTotDbIn == 0) return MPS_WRONG_OTT;
1589 if ((pOttVsTotDb1 == 0) && (ottVsTotDbMode == ottVsTotDb1Activ))
1589 if ((pOttVsTotDb1 == 0) && (ottVsTotDbMode & ottVsTotDb1Activ))
15901590 return MPS_WRONG_OTT;
1591 if ((pOttVsTotDb2 == 0) && (ottVsTotDbMode == ottVsTotDb2Activ))
1591 if ((pOttVsTotDb2 == 0) && (ottVsTotDbMode & ottVsTotDb2Activ))
15921592 return MPS_WRONG_OTT;
15931593
15941594 for (pb = startBand; pb < stopBand; pb++) {
16101610 } /* for( i = 0 ; i < numParameterSets; i++ ) */
16111611
16121612 if (extendFrame) {
1613 if (paramType == t_IPD) {
1614 llData->bsQuantCoarseXXX[numParameterSets] =
1615 llData->bsQuantCoarseXXX[numParameterSets - 1];
1616 }
16131617 for (band = startBand; band < stopBand; band++) {
16141618 outputDataIdx[xttIdx][numParameterSets][band] =
16151619 outputDataIdx[xttIdx][numParameterSets - 1][band];
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
473473 FL2FXCONST_DBL(0.888178419700125),
474474 };
475475
476 static FIXP_DBL dequantIPD_CLD_ICC_splitAngle__FDK_Function(INT ipdIdx,
477 INT cldIdx,
478 INT iccIdx) {
479 FIXP_DBL cld;
480 SpatialDequantGetCLD2Values(cldIdx, &cld);
481
482 /*const FIXP_DBL one_m = (FIXP_DBL)MAXVAL_DBL;
483 const int one_e = 0;*/
484 const FIXP_DBL one_m = FL2FXCONST_DBL(0.5f);
485 const int one_e = 1;
486 /* iidLin = sqrt(cld); */
487 FIXP_DBL iidLin_m = sqrt_CLD_m[cldIdx];
488 int iidLin_e = sqrt_CLD_e[cldIdx];
489 /* iidLin2 = cld; */
490 FIXP_DBL iidLin2_m = CLD_m[cldIdx];
491 int iidLin2_e = sqrt_CLD_e[cldIdx] << 1;
492 /* iidLin21 = iidLin2 + 1.0f; */
493 int iidLin21_e;
494 FIXP_DBL iidLin21_m =
495 fAddNorm(iidLin2_m, iidLin2_e, one_m, one_e, &iidLin21_e);
496 /* iidIcc2 = iidLin * icc * 2.0f; */
497 FIXP_CFG icc = dequantICC__FDK[iccIdx];
498 FIXP_DBL temp1_m, temp1c_m;
499 int temp1_e, temp1c_e;
500 temp1_m = fMult(iidLin_m, icc);
501 temp1_e = iidLin_e + 1;
502
503 FIXP_DBL cosIpd, sinIpd;
504 cosIpd = COS_IPD(ipdIdx);
505 sinIpd = SIN_IPD(ipdIdx);
506
507 temp1c_m = fMult(temp1_m, cosIpd);
508 temp1c_e = temp1_e; //+cosIpd_e;
509
510 int temp2_e, temp3_e, inv_temp3_e, ratio_e;
511 FIXP_DBL temp2_m =
512 fAddNorm(iidLin21_m, iidLin21_e, temp1c_m, temp1c_e, &temp2_e);
513 FIXP_DBL temp3_m =
514 fAddNorm(iidLin21_m, iidLin21_e, temp1_m, temp1_e, &temp3_e);
515 /* calculate 1/temp3 needed later */
516 inv_temp3_e = temp3_e;
517 FIXP_DBL inv_temp3_m = invFixp(temp3_m, &inv_temp3_e);
518 FIXP_DBL ratio_m =
519 fAddNorm(fMult(inv_temp3_m, temp2_m), (inv_temp3_e + temp2_e),
520 FL2FXCONST_DBL(1e-9f), 0, &ratio_e);
521
522 int weight2_e, tempb_atan2_e;
523 FIXP_DBL weight2_m =
524 fPow(ratio_m, ratio_e, FL2FXCONST_DBL(0.5f), -1, &weight2_e);
525 /* atan2(w2*sinIpd, w1*iidLin + w2*cosIpd) = atan2(w2*sinIpd, (2 - w2)*iidLin
526 * + w2*cosIpd) = atan2(w2*sinIpd, 2*iidLin + w2*(cosIpd - iidLin)); */
527 /* tmpa_atan2 = w2*sinIpd; tmpb_atan2 = 2*iidLin + w2*(cosIpd - iidLin); */
528 FIXP_DBL tempb_atan2_m = iidLin_m;
529 tempb_atan2_e = iidLin_e + 1;
530 int add_tmp1_e = 0;
531 FIXP_DBL add_tmp1_m = fAddNorm(cosIpd, 0, -iidLin_m, iidLin_e, &add_tmp1_e);
532 FIXP_DBL add_tmp2_m = fMult(add_tmp1_m, weight2_m);
533 int add_tmp2_e = add_tmp1_e + weight2_e;
534 tempb_atan2_m = fAddNorm(tempb_atan2_m, tempb_atan2_e, add_tmp2_m, add_tmp2_e,
535 &tempb_atan2_e);
536
537 FIXP_DBL tempa_atan2_m = fMult(weight2_m, sinIpd);
538 int tempa_atan2_e = weight2_e; // + sinIpd_e;
539
540 if (tempa_atan2_e > tempb_atan2_e) {
541 tempb_atan2_m = (tempb_atan2_m >> (tempa_atan2_e - tempb_atan2_e));
542 tempb_atan2_e = tempa_atan2_e;
543 } else if (tempb_atan2_e > tempa_atan2_e) {
544 tempa_atan2_m = (tempa_atan2_m >> (tempb_atan2_e - tempa_atan2_e));
545 }
546
547 return fixp_atan2(tempa_atan2_m, tempb_atan2_m);
548 }
549
550476 static void calculateOpd(spatialDec* self, INT ottBoxIndx, INT parameterSetIndx,
551477 FIXP_DBL opd[MAX_PARAMETER_BANDS]) {
552478 INT band;
562488 SpatialDequantGetCLD2Values(idxCld, &cld);
563489
564490 /* ipd(idxIpd==8) == PI */
565 if ((cld == FL2FXCONST_DBL(0.0f)) && (idxIpd == 8)) {
491 if (((cld == FL2FXCONST_DBL(0.0f)) && (idxIpd == 8)) || (idxIpd == 0)) {
566492 opd[2 * band] = FL2FXCONST_DBL(0.0f);
567493 } else {
568 opd[2 * band] = (dequantIPD_CLD_ICC_splitAngle__FDK_Function(
569 idxIpd, idxCld, idxIcc) >>
570 (IPD_SCALE - AT2O_SF));
494 FDK_ASSERT(idxIpd > 0);
495 opd[2 * band] =
496 dequantIPD_CLD_ICC_splitAngle__FDK[idxIpd - 1][idxCld][idxIcc];
571497 }
572498 opd[2 * band + 1] = opd[2 * band] - ipd;
573499 }
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
116116 /* Scaling of spectral data after applying M2 matrix, but only for binaural
117117 upmix type Scaling is compensated later in synthesis qmf filterbank */
118118 #define SCALE_DATA_APPLY_M2 (1)
119 /* Applying M2 parameter in combination with phase coding needs 2 bits headroom
120 * because up to a maximum of 4 spectral values can be added for USAC */
121 #define SCALE_DATA_APPLY_M2_PC (2)
119122
120123 SACDEC_ERROR initM1andM2(spatialDec* self, int initStatesFlag,
121124 int configChanged);
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
199199
200200 /* parameter smoothing tool set to off */
201201 bsFrame->bsSmoothMode[0] = 0;
202 initParameterSmoothing(self);
202203
203204 /* reset residual data */
204205 {
764765
765766 /* output scaling */
766767 for (nCh = 0; nCh < self->numOutputChannelsAT; nCh++) {
767 int outputScale = 0, outputGain_e = 0, scale = 0;
768 int outputScale = 0, outputGain_e = 0, scale = -(8) + (1);
768769 FIXP_DBL outputGain_m = getChGain(self, nCh, &outputGain_e);
769770
770771 if (!isTwoChMode(self->upmixType) && !bypassMode) {
773774 synthesis qmf */
774775 }
775776
776 scale = outputScale;
777 scale += outputScale;
777778
778779 qmfChangeOutScalefactor(&self->pQmfDomain->QmfDomainOut[nCh].fb, scale);
779780 qmfChangeOutGain(&self->pQmfDomain->QmfDomainOut[nCh].fb, outputGain_m,
12211222 !(self->stereoConfigIndex == 3)) {
12221223 for (i = 0; i < self->qmfBands; i++) {
12231224 self_qmfResidualReal__FDK_0_0[i] =
1224 fMult(self_qmfResidualReal__FDK_0_0[i] << 1,
1225 fMult(scaleValueSaturate(self_qmfResidualReal__FDK_0_0[i],
1226 1 + self->sacInDataHeadroom - (1)),
12251227 self->clipProtectGain__FDK);
12261228 self_qmfResidualImag__FDK_0_0[i] =
1227 fMult(self_qmfResidualImag__FDK_0_0[i] << 1,
1229 fMult(scaleValueSaturate(self_qmfResidualImag__FDK_0_0[i],
1230 1 + self->sacInDataHeadroom - (1)),
12281231 self->clipProtectGain__FDK);
12291232 }
12301233 } else {
12311234 for (i = 0; i < self->qmfBands; i++) {
1232 self_qmfResidualReal__FDK_0_0[i] = fMult(
1233 self_qmfResidualReal__FDK_0_0[i], self->clipProtectGain__FDK);
1234 self_qmfResidualImag__FDK_0_0[i] = fMult(
1235 self_qmfResidualImag__FDK_0_0[i], self->clipProtectGain__FDK);
1235 self_qmfResidualReal__FDK_0_0[i] =
1236 fMult(scaleValueSaturate(self_qmfResidualReal__FDK_0_0[i],
1237 self->sacInDataHeadroom - (1)),
1238 self->clipProtectGain__FDK);
1239 self_qmfResidualImag__FDK_0_0[i] =
1240 fMult(scaleValueSaturate(self_qmfResidualImag__FDK_0_0[i],
1241 self->sacInDataHeadroom - (1)),
1242 self->clipProtectGain__FDK);
12361243 }
12371244 }
12381245 }
13151322 if ((self->tempShapeConfig == 1) && (!isTwoChMode(self->upmixType))) {
13161323 for (ch = 0; ch < self->numOutputChannels; ch++) {
13171324 for (hyb = 0; hyb < self->tp_hybBandBorder; hyb++) {
1318 self->hybOutputRealDry__FDK[ch][hyb] +=
1319 self->hybOutputRealWet__FDK[ch][hyb];
1320 self->hybOutputImagDry__FDK[ch][hyb] +=
1321 self->hybOutputImagWet__FDK[ch][hyb];
1325 self->hybOutputRealDry__FDK[ch][hyb] =
1326 fAddSaturate(self->hybOutputRealDry__FDK[ch][hyb],
1327 self->hybOutputRealWet__FDK[ch][hyb]);
1328 self->hybOutputImagDry__FDK[ch][hyb] =
1329 fAddSaturate(self->hybOutputImagDry__FDK[ch][hyb],
1330 self->hybOutputImagWet__FDK[ch][hyb]);
13221331 } /* loop hyb */
13231332 } /* loop ch */
13241333 err = subbandTPApply(
13391348 FIXP_DBL *RESTRICT pRealWet = self->hybOutputRealWet__FDK[ch];
13401349 FIXP_DBL *RESTRICT pImagWet = self->hybOutputImagWet__FDK[ch];
13411350 for (hyb = 0; hyb < nHybBands; hyb++) {
1342 pRealDry[hyb] += pRealWet[hyb];
1343 pImagDry[hyb] += pImagWet[hyb];
1351 pRealDry[hyb] = fAddSaturate(pRealDry[hyb], pRealWet[hyb]);
1352 pImagDry[hyb] = fAddSaturate(pImagDry[hyb], pImagWet[hyb]);
13441353 } /* loop hyb */
13451354 for (; hyb < self->hybridBands; hyb++) {
1346 pRealDry[hyb] += pRealWet[hyb];
1355 pRealDry[hyb] = fAddSaturate(pRealDry[hyb], pRealWet[hyb]);
13471356 } /* loop hyb */
13481357 } /* loop ch */
13491358 } /* ( self->tempShapeConfig == 1 ) || ( self->tempShapeConfig == 2 ) */
14121421 FDK_ASSERT(self != NULL);
14131422 FDK_ASSERT(pControlFlags != NULL);
14141423 FDK_ASSERT(pcmOutBuf != NULL);
1424 FDK_ASSERT(self->sacInDataHeadroom >= (1));
14151425
14161426 self->errInt = err; /* Init internal error */
14171427
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
522522 new frame after SSC change (aka
523523 decodeAfterConfigHasChangedFlag). */
524524 SpatialDecConcealmentInfo concealInfo;
525
526 INT sacInDataHeadroom; /* Headroom of the SAC input time signal to prevent
527 clipping */
525528 };
526529
527530 #define SACDEC_SYNTAX_MPS 1
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
248248
249249 } MEM_REQUIREMENTS;
250250
251 #define PCM_MPS INT_PCM
252 #define PCM_MPSF FIXP_PCM
253
254 #define FIXP_DBL2PCM_MPS(x) ((INT_PCM)FX_DBL2FX_PCM(x))
251 #define PCM_MPS LONG
252 #define PCM_MPSF FIXP_DBL
253
254 #define FIXP_DBL2PCM_MPS(x) ((LONG)(x))
255255
256256 /* exposed functions (library interface) */
257257
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
15061506 }
15071507
15081508 int mpegSurroundDecoder_Apply(CMpegSurroundDecoder *pMpegSurroundDecoder,
1509 INT_PCM *input, PCM_MPS *pTimeData,
1509 PCM_MPS *input, PCM_MPS *pTimeData,
15101510 const int timeDataSize, int timeDataFrameSize,
15111511 int *nChannels, int *frameSize, int sampleRate,
15121512 AUDIO_OBJECT_TYPE coreCodec,
15131513 AUDIO_CHANNEL_TYPE channelType[],
15141514 UCHAR channelIndices[],
1515 const FDK_channelMapDescr *const mapDescr) {
1515 const FDK_channelMapDescr *const mapDescr,
1516 const INT inDataHeadroom, INT *outDataHeadroom) {
15161517 SACDEC_ERROR err = MPS_OK;
15171518 PCM_MPS *pTimeOut = pTimeData;
1519 PCM_MPS *TDinput = NULL;
15181520 UINT initControlFlags = 0, controlFlags = 0;
15191521 int timeDataRequiredSize = 0;
15201522 int newData;
15321534 if ((*nChannels <= 0) || (*nChannels > 2)) {
15331535 return MPS_NOTOK;
15341536 }
1537
1538 pMpegSurroundDecoder->pSpatialDec->sacInDataHeadroom = inDataHeadroom;
1539 *outDataHeadroom = (INT)(8);
15351540
15361541 pMpegSurroundDecoder->pSpatialDec->pConfigCurrent =
15371542 &pMpegSurroundDecoder
16811686 (timeDataFrameSize *
16821687 pMpegSurroundDecoder->pQmfDomain->globalConf.nBandsSynthesis) /
16831688 pMpegSurroundDecoder->pQmfDomain->globalConf.nBandsAnalysis;
1684 pMpegSurroundDecoder->pQmfDomain->globalConf.TDinput =
1685 pTimeData + timeDataFrameSizeOut - timeDataFrameSize;
1689 TDinput = pTimeData + timeDataFrameSizeOut - timeDataFrameSize;
16861690 for (int i = *nChannels - 1; i >= 0; i--) {
16871691 FDKmemmove(pTimeData + (i + 1) * timeDataFrameSizeOut - timeDataFrameSize,
16881692 pTimeData + timeDataFrameSize * i,
16931697 } else {
16941698 if (pMpegSurroundDecoder->mpegSurroundUseTimeInterface) {
16951699 FDKmemcpy(input, pTimeData,
1696 sizeof(INT_PCM) * (*nChannels) * (*frameSize));
1697 pMpegSurroundDecoder->pQmfDomain->globalConf.TDinput = input;
1700 sizeof(PCM_MPS) * (*nChannels) * (*frameSize));
1701 TDinput = input;
16981702 }
16991703 }
17001704
17061710 &pMpegSurroundDecoder->bsFrames[pMpegSurroundDecoder->bsFrameDecode],
17071711 pMpegSurroundDecoder->mpegSurroundUseTimeInterface ? INPUTMODE_TIME
17081712 : INPUTMODE_QMF_SBR,
1709 pMpegSurroundDecoder->pQmfDomain->globalConf.TDinput, NULL, NULL,
1710 pTimeOut, *frameSize, &controlFlags, *nChannels, mapDescr);
1713 TDinput, NULL, NULL, pTimeOut, *frameSize, &controlFlags, *nChannels,
1714 mapDescr);
17111715 *nChannels = pMpegSurroundDecoder->pSpatialDec->numOutputChannelsAT;
17121716
17131717 if (err !=
17801784 }
17811785
17821786 #define SACDEC_VL0 2
1783 #define SACDEC_VL1 0
1787 #define SACDEC_VL1 1
17841788 #define SACDEC_VL2 0
17851789
17861790 int mpegSurroundDecoder_GetLibInfo(LIB_INFO *info) {
17991803 info += i;
18001804
18011805 info->module_id = FDK_MPSDEC;
1802 #ifdef __ANDROID__
1806 #ifdef SUPPRESS_BUILD_DATE_INFO
18031807 info->build_date = "";
18041808 info->build_time = "";
18051809 #else
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
111111
112112 #include "FDK_trigFcts.h"
113113 #include "FDK_decorrelate.h"
114
115 #define SAC_DEC_APPLY_M2_SCALE(spec, s) ((spec) >> (-(s)))
114116
115117 /**
116118 * \brief Linear interpolation between two parameter values.
184186 if (!isTwoChMode(self->upmixType) && !bypassMode) {
185187 int i;
186188 for (i = 0; i < self->qmfBands; i++) {
187 qmfReal[ch][i] = fMult(qmfReal[ch][i], self->clipProtectGain__FDK);
188 qmfImag[ch][i] = fMult(qmfImag[ch][i], self->clipProtectGain__FDK);
189 qmfReal[ch][i] = fMult(
190 scaleValueSaturate(qmfReal[ch][i], self->sacInDataHeadroom - (1)),
191 self->clipProtectGain__FDK);
192 qmfImag[ch][i] = fMult(
193 scaleValueSaturate(qmfImag[ch][i], self->sacInDataHeadroom - (1)),
194 self->clipProtectGain__FDK);
189195 }
190196 }
191197 }
213219
214220 /* Write Input data to pQmfRealAnalysis. */
215221 if (self->bShareDelayWithSBR) {
216 FDK_QmfDomain_GetSlot(
217 &self->pQmfDomain->QmfDomainIn[ch], ts + HYBRID_FILTER_DELAY, 0,
218 MAX_QMF_BANDS_TO_HYBRID, pQmfRealAnalysis, pQmfImagAnalysis, 15);
222 FDK_QmfDomain_GetSlot(&self->pQmfDomain->QmfDomainIn[ch],
223 ts + HYBRID_FILTER_DELAY, 0,
224 MAX_QMF_BANDS_TO_HYBRID, pQmfRealAnalysis,
225 pQmfImagAnalysis, 15 + (1));
219226 FDK_QmfDomain_GetSlot(&self->pQmfDomain->QmfDomainIn[ch], ts,
220227 MAX_QMF_BANDS_TO_HYBRID, self->qmfBands,
221 pQmfRealAnalysis, pQmfImagAnalysis, 15);
228 pQmfRealAnalysis, pQmfImagAnalysis, 15 + (1));
222229 } else {
223230 FDK_QmfDomain_GetSlot(&self->pQmfDomain->QmfDomainIn[ch], ts, 0,
224231 self->qmfBands, pQmfRealAnalysis,
225 pQmfImagAnalysis, 15);
232 pQmfImagAnalysis, 15 + (1));
226233 }
227234 if (ts == self->pQmfDomain->globalConf.nQmfTimeSlots - 1) {
228235 /* Is currently also needed in case we dont have any overlap. We need to
498505 for (pb = 0, qs = 3; pb < 2; pb++) {
499506 INT s;
500507 FIXP_DBL maxVal;
501 FIXP_SGL mReal1;
502 FIXP_SGL mReal0, mImag0;
508 FIXP_DBL mReal1;
509 FIXP_DBL mReal0, mImag0;
503510 FIXP_DBL iReal0, iImag0, iReal1;
504511
505512 iReal0 = interpolateParameter(alpha, MReal0[pb], MRealPrev0[pb]);
512519 s = fMax(CntLeadingZeros(maxVal) - 1, 0);
513520 s = fMin(s, scale_param_m2);
514521
515 mReal0 = FX_DBL2FX_SGL(iReal0 << s);
516 mImag0 = FX_DBL2FX_SGL(iImag0 << s);
517 mReal1 = FX_DBL2FX_SGL(iReal1 << s);
522 mReal0 = iReal0 << s;
523 mImag0 = iImag0 << s;
524 mReal1 = iReal1 << s;
518525
519526 s = scale_param_m2 - s;
520527
633640 }
634641
635642 if (self->phaseCoding == 3) {
636 /* + SCALE_DATA_APPLY_M2 to compensate for Div2 below ?! */
637 scale_param_m2 = SCALE_PARAM_M2_212_PRED + SCALE_DATA_APPLY_M2;
643 scale_param_m2 = -(SCALE_DATA_APPLY_M2_PC - 1);
638644 }
639645
640646 for (row = 0; row < self->numM2rows; row++) {
685691 } else { /* isBinauralMode(self->upmixType) */
686692
687693 for (qs = 0; qs < complexHybBands; qs++) {
688 pHybOutRealDry[qs] += fMultDiv2(pWReal[qs], pKernel[qs])
689 << (scale_param_m2);
690 pHybOutImagDry[qs] += fMultDiv2(pWImag[qs], pKernel[qs])
691 << (scale_param_m2);
694 pHybOutRealDry[qs] += SAC_DEC_APPLY_M2_SCALE(
695 fMultDiv2(pWReal[qs], pKernel[qs]), scale_param_m2);
696 pHybOutImagDry[qs] += SAC_DEC_APPLY_M2_SCALE(
697 fMultDiv2(pWImag[qs], pKernel[qs]), scale_param_m2);
692698 }
693699
694700 M2ParamToKernelMult(pKernel, self->M2Imag__FDK[row][col],
696702 self->kernels_width, alpha, complexParBands);
697703
698704 /* direct signals sign is -1 for qs = 0,2 */
699 pHybOutRealDry[0] += fMultDiv2(pWImag[0], pKernel[0])
700 << (scale_param_m2);
701 pHybOutImagDry[0] -= fMultDiv2(pWReal[0], pKernel[0])
702 << (scale_param_m2);
703
704 pHybOutRealDry[2] += fMultDiv2(pWImag[2], pKernel[2])
705 << (scale_param_m2);
706 pHybOutImagDry[2] -= fMultDiv2(pWReal[2], pKernel[2])
707 << (scale_param_m2);
705 pHybOutRealDry[0] += SAC_DEC_APPLY_M2_SCALE(
706 fMultDiv2(pWImag[0], pKernel[0]), scale_param_m2);
707 pHybOutImagDry[0] -= SAC_DEC_APPLY_M2_SCALE(
708 fMultDiv2(pWReal[0], pKernel[0]), scale_param_m2);
709
710 pHybOutRealDry[2] += SAC_DEC_APPLY_M2_SCALE(
711 fMultDiv2(pWImag[2], pKernel[2]), scale_param_m2);
712 pHybOutImagDry[2] -= SAC_DEC_APPLY_M2_SCALE(
713 fMultDiv2(pWReal[2], pKernel[2]), scale_param_m2);
708714
709715 /* direct signals sign is +1 for qs = 1,3,4,5,...,complexHybBands */
710 pHybOutRealDry[1] -= fMultDiv2(pWImag[1], pKernel[1])
711 << (scale_param_m2);
712 pHybOutImagDry[1] += fMultDiv2(pWReal[1], pKernel[1])
713 << (scale_param_m2);
716 pHybOutRealDry[1] -= SAC_DEC_APPLY_M2_SCALE(
717 fMultDiv2(pWImag[1], pKernel[1]), scale_param_m2);
718 pHybOutImagDry[1] += SAC_DEC_APPLY_M2_SCALE(
719 fMultDiv2(pWReal[1], pKernel[1]), scale_param_m2);
714720
715721 for (qs = 3; qs < complexHybBands; qs++) {
716 pHybOutRealDry[qs] -= fMultDiv2(pWImag[qs], pKernel[qs])
717 << (scale_param_m2);
718 pHybOutImagDry[qs] += fMultDiv2(pWReal[qs], pKernel[qs])
719 << (scale_param_m2);
722 pHybOutRealDry[qs] -= SAC_DEC_APPLY_M2_SCALE(
723 fMultDiv2(pWImag[qs], pKernel[qs]), scale_param_m2);
724 pHybOutImagDry[qs] += SAC_DEC_APPLY_M2_SCALE(
725 fMultDiv2(pWReal[qs], pKernel[qs]), scale_param_m2);
720726 }
721727 } /* self->upmixType */
722728 } /* if (activParamBands) */
769775 FIXP_DBL *RESTRICT pHybOutImag;
770776
771777 for (qs = 0; qs < resHybIndex; qs++) {
772 pHybOutRealDry[qs] += fMultDiv2(pWReal[qs], pKernel[qs])
773 << (scale_param_m2);
774 pHybOutImagDry[qs] += fMultDiv2(pWImag[qs], pKernel[qs])
775 << (scale_param_m2);
778 pHybOutRealDry[qs] += SAC_DEC_APPLY_M2_SCALE(
779 fMultDiv2(pWReal[qs], pKernel[qs]), scale_param_m2);
780 pHybOutImagDry[qs] += SAC_DEC_APPLY_M2_SCALE(
781 fMultDiv2(pWImag[qs], pKernel[qs]), scale_param_m2);
776782 }
777783 /* decor signals */
778784 for (; qs < complexHybBands; qs++) {
779 pHybOutRealWet[qs] += fMultDiv2(pWReal[qs], pKernel[qs])
780 << (scale_param_m2);
781 pHybOutImagWet[qs] += fMultDiv2(pWImag[qs], pKernel[qs])
782 << (scale_param_m2);
785 pHybOutRealWet[qs] += SAC_DEC_APPLY_M2_SCALE(
786 fMultDiv2(pWReal[qs], pKernel[qs]), scale_param_m2);
787 pHybOutImagWet[qs] += SAC_DEC_APPLY_M2_SCALE(
788 fMultDiv2(pWImag[qs], pKernel[qs]), scale_param_m2);
783789 }
784790
785791 M2ParamToKernelMult(pKernel, self->M2Imag__FDK[row][col],
789795 /* direct signals sign is -1 for qs = 0,2 */
790796 /* direct signals sign is +1 for qs = 1,3.. */
791797 if (toolsDisabled) {
792 pHybOutRealDry[0] += fMultDiv2(pWImag[0], pKernel[0])
793 << (scale_param_m2);
794 pHybOutImagDry[0] -= fMultDiv2(pWReal[0], pKernel[0])
795 << (scale_param_m2);
796
797 pHybOutRealDry[1] -= fMultDiv2(pWImag[1], pKernel[1])
798 << (scale_param_m2);
799 pHybOutImagDry[1] += fMultDiv2(pWReal[1], pKernel[1])
800 << (scale_param_m2);
801
802 pHybOutRealDry[2] += fMultDiv2(pWImag[2], pKernel[2])
803 << (scale_param_m2);
804 pHybOutImagDry[2] -= fMultDiv2(pWReal[2], pKernel[2])
805 << (scale_param_m2);
798 pHybOutRealDry[0] += SAC_DEC_APPLY_M2_SCALE(
799 fMultDiv2(pWImag[0], pKernel[0]), scale_param_m2);
800 pHybOutImagDry[0] -= SAC_DEC_APPLY_M2_SCALE(
801 fMultDiv2(pWReal[0], pKernel[0]), scale_param_m2);
802
803 pHybOutRealDry[1] -= SAC_DEC_APPLY_M2_SCALE(
804 fMultDiv2(pWImag[1], pKernel[1]), scale_param_m2);
805 pHybOutImagDry[1] += SAC_DEC_APPLY_M2_SCALE(
806 fMultDiv2(pWReal[1], pKernel[1]), scale_param_m2);
807
808 pHybOutRealDry[2] += SAC_DEC_APPLY_M2_SCALE(
809 fMultDiv2(pWImag[2], pKernel[2]), scale_param_m2);
810 pHybOutImagDry[2] -= SAC_DEC_APPLY_M2_SCALE(
811 fMultDiv2(pWReal[2], pKernel[2]), scale_param_m2);
806812 } else {
807813 pHybOutReal = &pHybOutRealDry[0];
808814 pHybOutImag = &pHybOutImagDry[0];
810816 pHybOutReal = &pHybOutRealWet[0];
811817 pHybOutImag = &pHybOutImagWet[0];
812818 }
813 pHybOutReal[0] += fMultDiv2(pWImag[0], pKernel[0])
814 << (scale_param_m2);
815 pHybOutImag[0] -= fMultDiv2(pWReal[0], pKernel[0])
816 << (scale_param_m2);
819 pHybOutReal[0] += SAC_DEC_APPLY_M2_SCALE(
820 fMultDiv2(pWImag[0], pKernel[0]), scale_param_m2);
821 pHybOutImag[0] -= SAC_DEC_APPLY_M2_SCALE(
822 fMultDiv2(pWReal[0], pKernel[0]), scale_param_m2);
817823
818824 if (1 == resHybIndex) {
819825 pHybOutReal = &pHybOutRealWet[0];
820826 pHybOutImag = &pHybOutImagWet[0];
821827 }
822 pHybOutReal[1] -= fMultDiv2(pWImag[1], pKernel[1])
823 << (scale_param_m2);
824 pHybOutImag[1] += fMultDiv2(pWReal[1], pKernel[1])
825 << (scale_param_m2);
828 pHybOutReal[1] -= SAC_DEC_APPLY_M2_SCALE(
829 fMultDiv2(pWImag[1], pKernel[1]), scale_param_m2);
830 pHybOutImag[1] += SAC_DEC_APPLY_M2_SCALE(
831 fMultDiv2(pWReal[1], pKernel[1]), scale_param_m2);
826832
827833 if (2 == resHybIndex) {
828834 pHybOutReal = &pHybOutRealWet[0];
829835 pHybOutImag = &pHybOutImagWet[0];
830836 }
831 pHybOutReal[2] += fMultDiv2(pWImag[2], pKernel[2])
832 << (scale_param_m2);
833 pHybOutImag[2] -= fMultDiv2(pWReal[2], pKernel[2])
834 << (scale_param_m2);
837 pHybOutReal[2] += SAC_DEC_APPLY_M2_SCALE(
838 fMultDiv2(pWImag[2], pKernel[2]), scale_param_m2);
839 pHybOutImag[2] -= SAC_DEC_APPLY_M2_SCALE(
840 fMultDiv2(pWReal[2], pKernel[2]), scale_param_m2);
835841 }
836842
837843 for (qs = 3; qs < resHybIndex; qs++) {
838 pHybOutRealDry[qs] -= fMultDiv2(pWImag[qs], pKernel[qs])
839 << (scale_param_m2);
840 pHybOutImagDry[qs] += fMultDiv2(pWReal[qs], pKernel[qs])
841 << (scale_param_m2);
844 pHybOutRealDry[qs] -= SAC_DEC_APPLY_M2_SCALE(
845 fMultDiv2(pWImag[qs], pKernel[qs]), scale_param_m2);
846 pHybOutImagDry[qs] += SAC_DEC_APPLY_M2_SCALE(
847 fMultDiv2(pWReal[qs], pKernel[qs]), scale_param_m2);
842848 }
843849 /* decor signals */
844850 for (; qs < complexHybBands; qs++) {
845 pHybOutRealWet[qs] -= fMultDiv2(pWImag[qs], pKernel[qs])
846 << (scale_param_m2);
847 pHybOutImagWet[qs] += fMultDiv2(pWReal[qs], pKernel[qs])
848 << (scale_param_m2);
851 pHybOutRealWet[qs] -= SAC_DEC_APPLY_M2_SCALE(
852 fMultDiv2(pWImag[qs], pKernel[qs]), scale_param_m2);
853 pHybOutImagWet[qs] += SAC_DEC_APPLY_M2_SCALE(
854 fMultDiv2(pWReal[qs], pKernel[qs]), scale_param_m2);
849855 }
850856 } /* self->upmixType */
851857 } /* if (activParamBands) { */
852858 } /* self->numVChannels */
859
860 if (self->phaseCoding == 3) {
861 scaleValuesSaturate(pHybOutRealDry, complexHybBands,
862 SCALE_PARAM_M2_212_PRED + SCALE_DATA_APPLY_M2_PC);
863 scaleValuesSaturate(pHybOutImagDry, complexHybBands,
864 SCALE_PARAM_M2_212_PRED + SCALE_DATA_APPLY_M2_PC);
865
866 if (!toolsDisabled) {
867 scaleValuesSaturate(pHybOutRealWet, complexHybBands,
868 SCALE_PARAM_M2_212_PRED + SCALE_DATA_APPLY_M2_PC);
869 scaleValuesSaturate(pHybOutImagWet, complexHybBands,
870 SCALE_PARAM_M2_212_PRED + SCALE_DATA_APPLY_M2_PC);
871 }
872 }
853873 }
854874
855875 C_ALLOC_SCRATCH_END(pKernel, FIXP_SGL, MAX_HYBRID_BANDS);
918938 self->pQmfDomain->QmfDomainIn[outCh].scaling.lb_scale -=
919939 self->clipProtectGainSF__FDK;
920940
941 self->pQmfDomain->QmfDomainIn[outCh].scaling.lb_scale -= (1);
921942 } else {
922943 /* Call the QMF synthesis for dry. */
923944 err = CalculateSpaceSynthesisQmf(&self->pQmfDomain->QmfDomainOut[outCh],
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
109109
110110 SACDEC_ERROR CalculateSpaceSynthesisQmf(
111111 const HANDLE_FDK_QMF_DOMAIN_OUT hQmfDomainOutCh, const FIXP_DBL *Sr,
112 const FIXP_DBL *Si, const INT stride, INT_PCM *timeSig) {
112 const FIXP_DBL *Si, const INT stride, PCM_MPS *timeSig) {
113113 SACDEC_ERROR err = MPS_OK;
114114
115115 if (hQmfDomainOutCh == NULL) {
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
123123 */
124124 SACDEC_ERROR CalculateSpaceSynthesisQmf(
125125 const HANDLE_FDK_QMF_DOMAIN_OUT hQmfDomainOutCh, const FIXP_DBL *Sr,
126 const FIXP_DBL *Si, const INT stride, INT_PCM *timeSig);
126 const FIXP_DBL *Si, const INT stride, PCM_MPS *timeSig);
127127
128128 /**
129129 * \brief Convert audio input data to qmf representation.
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
161161 FIXP_DBL nrg;
162162
163163 /* qs = 12, 13, 14 */
164 slotNrg[0] = ((fPow2Div2((*pReal++) << maxValSF) +
165 fPow2Div2((*pImag++) << maxValSF)) >>
166 (SF_FACTOR_SLOT - 1));
167 slotNrg[1] = ((fPow2Div2((*pReal++) << maxValSF) +
168 fPow2Div2((*pImag++) << maxValSF)) >>
169 (SF_FACTOR_SLOT - 1));
170 slotNrg[2] = ((fPow2Div2((*pReal++) << maxValSF) +
171 fPow2Div2((*pImag++) << maxValSF)) >>
172 (SF_FACTOR_SLOT - 1));
164 slotNrg[0] = ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
165 (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
166 slotNrg[1] = ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
167 (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
168 slotNrg[2] = ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
169 (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
173170 /* qs = 15 */
174 slotNrg[3] = ((fPow2Div2((*pReal++) << maxValSF) +
175 fPow2Div2((*pImag++) << maxValSF)) >>
176 (SF_FACTOR_SLOT - 1));
171 slotNrg[3] = ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
172 (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
177173 /* qs = 16, 17 */
178 nrg = ((fPow2Div2((*pReal++) << maxValSF) +
179 fPow2Div2((*pImag++) << maxValSF)) >>
180 (SF_FACTOR_SLOT - 1));
181 slotNrg[4] = nrg + ((fPow2Div2((*pReal++) << maxValSF) +
182 fPow2Div2((*pImag++) << maxValSF)) >>
183 (SF_FACTOR_SLOT - 1));
174 nrg = ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
175 (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
176 slotNrg[4] =
177 nrg + ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
178 (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
184179 /* qs = 18, 19, 20 */
185 nrg = ((fPow2Div2((*pReal++) << maxValSF) +
186 fPow2Div2((*pImag++) << maxValSF)) >>
187 (SF_FACTOR_SLOT - 1));
188 nrg += ((fPow2Div2((*pReal++) << maxValSF) +
189 fPow2Div2((*pImag++) << maxValSF)) >>
190 (SF_FACTOR_SLOT - 1));
191 slotNrg[5] = nrg + ((fPow2Div2((*pReal++) << maxValSF) +
192 fPow2Div2((*pImag++) << maxValSF)) >>
193 (SF_FACTOR_SLOT - 1));
180 nrg = ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
181 (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
182 nrg += ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
183 (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
184 slotNrg[5] =
185 nrg + ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
186 (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
194187 /* qs = 21, 22 */
195 nrg = ((fPow2Div2((*pReal++) << maxValSF) +
196 fPow2Div2((*pImag++) << maxValSF)) >>
197 (SF_FACTOR_SLOT - 1));
198 slotNrg[6] = nrg + ((fPow2Div2((*pReal++) << maxValSF) +
199 fPow2Div2((*pImag++) << maxValSF)) >>
200 (SF_FACTOR_SLOT - 1));
188 nrg = ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
189 (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
190 slotNrg[6] =
191 nrg + ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
192 (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
201193 /* qs = 23, 24 */
202194 if (hybBands > 23) {
203 slotNrg[6] += ((fPow2Div2((*pReal++) << maxValSF) +
204 fPow2Div2((*pImag++) << maxValSF)) >>
205 (SF_FACTOR_SLOT - 1));
206 slotNrg[6] += ((fPow2Div2((*pReal++) << maxValSF) +
207 fPow2Div2((*pImag++) << maxValSF)) >>
208 (SF_FACTOR_SLOT - 1));
195 slotNrg[6] += ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
196 (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
197 slotNrg[6] += ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
198 (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
209199 /* qs = 25, 26, 29, 28, 29 */
210 nrg = ((fPow2Div2((*pReal++) << maxValSF) +
211 fPow2Div2((*pImag++) << maxValSF)) >>
212 (SF_FACTOR_SLOT - 1));
213 nrg += ((fPow2Div2((*pReal++) << maxValSF) +
214 fPow2Div2((*pImag++) << maxValSF)) >>
215 (SF_FACTOR_SLOT - 1));
216 nrg += ((fPow2Div2((*pReal++) << maxValSF) +
217 fPow2Div2((*pImag++) << maxValSF)) >>
218 (SF_FACTOR_SLOT - 1));
219 nrg += ((fPow2Div2((*pReal++) << maxValSF) +
220 fPow2Div2((*pImag++) << maxValSF)) >>
221 (SF_FACTOR_SLOT - 1));
222 slotNrg[7] = nrg + ((fPow2Div2((*pReal++) << maxValSF) +
223 fPow2Div2((*pImag++) << maxValSF)) >>
224 (SF_FACTOR_SLOT - 1));
200 nrg = ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
201 (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
202 nrg += ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
203 (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
204 nrg += ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
205 (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
206 nrg += ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
207 (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
208 slotNrg[7] =
209 nrg + ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
210 (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
225211 /* qs = 30 ... min(41,hybBands-1) */
226 nrg = ((fPow2Div2((*pReal++) << maxValSF) +
227 fPow2Div2((*pImag++) << maxValSF)) >>
228 (SF_FACTOR_SLOT - 1));
212 nrg = ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
213 (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
229214 for (qs = 31; qs < hybBands; qs++) {
230 nrg += ((fPow2Div2((*pReal++) << maxValSF) +
231 fPow2Div2((*pImag++) << maxValSF)) >>
232 (SF_FACTOR_SLOT - 1));
215 nrg += ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
216 (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
233217 }
234218 slotNrg[8] = nrg;
235219 } else {
238222 }
239223 }
240224
241 static inline INT getMaxValDmx(FIXP_DBL *RESTRICT pReal,
242 FIXP_DBL *RESTRICT pImag, INT cplxBands,
243 INT hybBands) {
244 INT qs, clz;
245 FIXP_DBL maxVal = FL2FXCONST_DBL(0.0f);
225 static inline void combineDryWet(FIXP_DBL *RESTRICT pReal,
226 FIXP_DBL *RESTRICT pImag,
227 FIXP_DBL *RESTRICT pHybOutputRealDry,
228 FIXP_DBL *RESTRICT pHybOutputImagDry,
229 FIXP_DBL *RESTRICT pHybOutputRealWet,
230 FIXP_DBL *RESTRICT pHybOutputImagWet,
231 INT cplxBands, INT hybBands) {
232 INT qs;
246233
247234 for (qs = 12; qs < cplxBands; qs++) {
248 maxVal |= fAbs(pReal[qs]);
249 maxVal |= fAbs(pImag[qs]);
235 pReal[qs] = (pHybOutputRealDry[qs] >> 1) + (pHybOutputRealWet[qs] >> 1);
236 pImag[qs] = (pHybOutputImagDry[qs] >> 1) + (pHybOutputImagWet[qs] >> 1);
250237 }
251238 for (; qs < hybBands; qs++) {
252 maxVal |= fAbs(pReal[qs]);
253 }
254
255 clz = fixMax(0, CntLeadingZeros(maxVal) - 1);
256
257 return (clz);
258 }
259
260 static inline INT getMaxValDryWet(FIXP_DBL *RESTRICT pReal,
261 FIXP_DBL *RESTRICT pImag,
262 FIXP_DBL *RESTRICT pHybOutputRealDry,
263 FIXP_DBL *RESTRICT pHybOutputImagDry,
264 FIXP_DBL *RESTRICT pHybOutputRealWet,
265 FIXP_DBL *RESTRICT pHybOutputImagWet,
266 INT cplxBands, INT hybBands) {
267 INT qs, clz;
268 FIXP_DBL maxVal = FL2FXCONST_DBL(0.0f);
269
270 for (qs = 12; qs < cplxBands; qs++) {
271 pReal[qs] = pHybOutputRealDry[qs] + pHybOutputRealWet[qs];
272 maxVal |= fAbs(pReal[qs]);
273 pImag[qs] = pHybOutputImagDry[qs] + pHybOutputImagWet[qs];
274 maxVal |= fAbs(pImag[qs]);
275 }
276 for (; qs < hybBands; qs++) {
277 pReal[qs] = pHybOutputRealDry[qs] + pHybOutputRealWet[qs];
278 maxVal |= fAbs(pReal[qs]);
279 }
280
281 clz = fixMax(0, CntLeadingZeros(maxVal) - 1);
282
283 return (clz);
239 pReal[qs] = (pHybOutputRealDry[qs] >> 1) + (pHybOutputRealWet[qs] >> 1);
240 }
284241 }
285242
286243 static inline void slotAmp(FIXP_DBL *RESTRICT slotAmp_dry,
295252
296253 dry = wet = FL2FXCONST_DBL(0.0f);
297254 for (qs = 0; qs < cplxBands; qs++) {
298 dry = fAddSaturate(dry, fPow2Div2(pHybOutputRealDry[qs]) +
299 fPow2Div2(pHybOutputImagDry[qs]));
300 wet = fAddSaturate(wet, fPow2Div2(pHybOutputRealWet[qs]) +
301 fPow2Div2(pHybOutputImagWet[qs]));
255 dry = fAddSaturate(dry, fPow2Div2(pHybOutputRealDry[qs] << (1)) +
256 fPow2Div2(pHybOutputImagDry[qs] << (1)));
257 wet = fAddSaturate(wet, fPow2Div2(pHybOutputRealWet[qs] << (1)) +
258 fPow2Div2(pHybOutputImagWet[qs] << (1)));
302259 }
303260 for (; qs < hybBands; qs++) {
304 dry = fAddSaturate(dry, fPow2Div2(pHybOutputRealDry[qs]));
305 wet = fAddSaturate(wet, fPow2Div2(pHybOutputRealWet[qs]));
306 }
307 *slotAmp_dry = dry;
308 *slotAmp_wet = wet;
261 dry = fAddSaturate(dry, fPow2Div2(pHybOutputRealDry[qs] << (1)));
262 wet = fAddSaturate(wet, fPow2Div2(pHybOutputRealWet[qs] << (1)));
263 }
264 *slotAmp_dry = dry >> (2 * (1));
265 *slotAmp_wet = wet >> (2 * (1));
309266 }
310267
311268 #if defined(__aarch64__)
326283 }
327284 } else {
328285 for (qs = 0; qs < cplxBands; qs++) {
329 pHybOutputRealDry[qs] = fMultDiv2(pHybOutputRealDry[qs], dryFac) << scale;
330 pHybOutputImagDry[qs] = fMultDiv2(pHybOutputImagDry[qs], dryFac) << scale;
286 pHybOutputRealDry[qs] = SATURATE_LEFT_SHIFT(
287 fMultDiv2(pHybOutputRealDry[qs], dryFac), scale, DFRACT_BITS);
288 pHybOutputImagDry[qs] = SATURATE_LEFT_SHIFT(
289 fMultDiv2(pHybOutputImagDry[qs], dryFac), scale, DFRACT_BITS);
331290 }
332291 for (; qs < hybBands; qs++) {
333 pHybOutputRealDry[qs] = fMultDiv2(pHybOutputRealDry[qs], dryFac) << scale;
292 pHybOutputRealDry[qs] = SATURATE_LEFT_SHIFT(
293 fMultDiv2(pHybOutputRealDry[qs], dryFac), scale, DFRACT_BITS);
334294 }
335295 }
336296 }
366326
367327 INT shapeActiv = 1;
368328 INT hybBands = fixMin(42, self->hybridBands);
369 INT staticScale = self->staticDecScale;
329 INT staticScale = self->staticDecScale + (1);
370330 INT cplxBands;
371331 cplxBands = fixMin(42, self->hybridBands);
372332
385345 prevChOffs = ch;
386346 pReal = pScratchBuffer;
387347 pImag = pScratchBuffer + 42;
388 clz = getMaxValDryWet(
389 pReal, pImag, self->hybOutputRealDry__FDK[ch],
390 self->hybOutputImagDry__FDK[ch], self->hybOutputRealWet__FDK[ch],
391 self->hybOutputImagWet__FDK[ch], cplxBands, hybBands);
348 combineDryWet(pReal, pImag, self->hybOutputRealDry__FDK[ch],
349 self->hybOutputImagDry__FDK[ch],
350 self->hybOutputRealWet__FDK[ch],
351 self->hybOutputImagWet__FDK[ch], cplxBands, hybBands);
352 clz = fMin(getScalefactor(&pReal[12], fMax(0, hybBands - 12)),
353 getScalefactor(&pImag[12], fMax(0, cplxBands - 12)));
392354 } else {
393355 prevChOffs = ch + self->numOutputChannels;
394356 pReal = self->hybInputReal__FDK[ch];
395357 pImag = self->hybInputImag__FDK[ch];
396 clz = getMaxValDmx(pReal, pImag, cplxBands, hybBands);
358 clz = fMin(getScalefactor(&pReal[12], fMax(0, hybBands - 12)),
359 getScalefactor(&pImag[12], fMax(0, cplxBands - 12)));
397360 }
398361
399362 partNrg = partNrgPrev = pBBEnvState->partNrgPrev__FDK[prevChOffs];
410373 SF_FACTOR_SLOT */
411374 }
412375
413 slotNrgSF = 2 * (staticScale - clz) + SF_FACTOR_SLOT;
414 frameNrgSF = 2 * (staticScale - clz) + SF_FACTOR_SLOT;
376 slotNrgSF = 2 * (staticScale - clz + ((inp == INP_DRY_WET) ? 1 : 0)) +
377 SF_FACTOR_SLOT;
378 frameNrgSF = 2 * (staticScale - clz + ((inp == INP_DRY_WET) ? 1 : 0)) +
379 SF_FACTOR_SLOT;
415380
416381 partNrgSF = fixMax(slotNrgSF - SF_ALPHA1 + 1,
417382 pPartNrgPrevSF[0] - pPartNrgPrev2SF[0] + 1);
651616 fixMax(3, fixMax(dryFacSF, slotAmpSF)); /* scale is at least with 3
652617 bits to avoid overflows
653618 when calculating dryFac */
654 dryFac = dryFac >> (scale - dryFacSF);
655 slotAmp_ratio = slotAmp_ratio >> (scale - slotAmpSF);
619 dryFac = dryFac >> fixMin(scale - dryFacSF, DFRACT_BITS - 1);
620 slotAmp_ratio =
621 slotAmp_ratio >> fixMin(scale - slotAmpSF, DFRACT_BITS - 1);
656622
657623 /* limit dryFac */
658624 dryFac = fixMax(
659625 FL2FXCONST_DBL(0.25f) >> (INT)fixMin(2 * scale, DFRACT_BITS - 1),
660 fMult(dryFac, slotAmp_ratio) - (slotAmp_ratio >> scale) +
661 (dryFac >> scale));
626 fMult(dryFac, slotAmp_ratio) -
627 (slotAmp_ratio >> fixMin(scale, DFRACT_BITS - 1)) +
628 (dryFac >> fixMin(scale, DFRACT_BITS - 1)));
662629 dryFac = fixMin(
663630 FL2FXCONST_DBL(0.50f) >> (INT)fixMin(2 * scale - 3, DFRACT_BITS - 1),
664631 dryFac); /* reduce shift bits by 3, because upper
672639
673640 /* shaping */
674641 shapeBBEnv(&self->hybOutputRealDry__FDK[ch][6],
675 &self->hybOutputImagDry__FDK[ch][6], dryFac, scale, cplxBands,
676 hybBands);
642 &self->hybOutputImagDry__FDK[ch][6], dryFac,
643 fixMin(scale, DFRACT_BITS - 1), cplxBands, hybBands);
677644 }
678645 }
679646 }
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
162162 SCALE_IPD(4.71238898038469f), SCALE_IPD(5.105088062f),
163163 SCALE_IPD(5.49778714378214f), SCALE_IPD(5.890486225f)};
164164
165 #define SCALE_SPLIT_ANGLE(a) (FL2FXCONST_CFG(a / (float)(1 << IPD_SCALE)))
165 #define SCALE_SPLIT_ANGLE(a) (FL2FXCONST_DBL(a / (float)(1 << IPD_SCALE)))
166166 /*
167167 Generate table dequantIPD_CLD_ICC_splitAngle__FDK[16][31][8]:
168168
199199 atan2(w2 * sinIpd, w1 * iidLin + w2 * cosIpd);
200200 }
201201 */
202 const FIXP_DBL dequantIPD_CLD_ICC_splitAngle__FDK[15][31][8] = {
203 {
204 {SCALE_SPLIT_ANGLE(0.39269909262657),
205 SCALE_SPLIT_ANGLE(0.39269909262657),
206 SCALE_SPLIT_ANGLE(0.39269909262657),
207 SCALE_SPLIT_ANGLE(0.39269909262657),
208 SCALE_SPLIT_ANGLE(0.39269909262657),
209 SCALE_SPLIT_ANGLE(0.39269909262657),
210 SCALE_SPLIT_ANGLE(0.39269909262657),
211 SCALE_SPLIT_ANGLE(0.39269909262657)},
212 {SCALE_SPLIT_ANGLE(0.39055734872818),
213 SCALE_SPLIT_ANGLE(0.39055740833282),
214 SCALE_SPLIT_ANGLE(0.39055749773979),
215 SCALE_SPLIT_ANGLE(0.39055770635605),
216 SCALE_SPLIT_ANGLE(0.39055791497231),
217 SCALE_SPLIT_ANGLE(0.39055824279785),
218 SCALE_SPLIT_ANGLE(0.39055877923965),
219 SCALE_SPLIT_ANGLE(0.39055916666985)},
220 {SCALE_SPLIT_ANGLE(0.38890451192856),
221 SCALE_SPLIT_ANGLE(0.38890469074249),
222 SCALE_SPLIT_ANGLE(0.38890495896339),
223 SCALE_SPLIT_ANGLE(0.38890564441681),
224 SCALE_SPLIT_ANGLE(0.38890630006790),
225 SCALE_SPLIT_ANGLE(0.38890734314919),
226 SCALE_SPLIT_ANGLE(0.38890904188156),
227 SCALE_SPLIT_ANGLE(0.38891020417213)},
228 {SCALE_SPLIT_ANGLE(0.38599541783333),
229 SCALE_SPLIT_ANGLE(0.38599592447281),
230 SCALE_SPLIT_ANGLE(0.38599672913551),
231 SCALE_SPLIT_ANGLE(0.38599878549576),
232 SCALE_SPLIT_ANGLE(0.38600078225136),
233 SCALE_SPLIT_ANGLE(0.38600403070450),
234 SCALE_SPLIT_ANGLE(0.38600939512253),
235 SCALE_SPLIT_ANGLE(0.38601315021515)},
236 {SCALE_SPLIT_ANGLE(0.38091576099396),
237 SCALE_SPLIT_ANGLE(0.38091731071472),
238 SCALE_SPLIT_ANGLE(0.38091966509819),
239 SCALE_SPLIT_ANGLE(0.38092571496964),
240 SCALE_SPLIT_ANGLE(0.38093179464340),
241 SCALE_SPLIT_ANGLE(0.38094165921211),
242 SCALE_SPLIT_ANGLE(0.38095843791962),
243 SCALE_SPLIT_ANGLE(0.38097056746483)},
244 {SCALE_SPLIT_ANGLE(0.37216997146606),
245 SCALE_SPLIT_ANGLE(0.37217426300049),
246 SCALE_SPLIT_ANGLE(0.37218090891838),
247 SCALE_SPLIT_ANGLE(0.37219807505608),
248 SCALE_SPLIT_ANGLE(0.37221556901932),
249 SCALE_SPLIT_ANGLE(0.37224492430687),
250 SCALE_SPLIT_ANGLE(0.37229704856873),
251 SCALE_SPLIT_ANGLE(0.37233674526215)},
252 {SCALE_SPLIT_ANGLE(0.36424967646599),
253 SCALE_SPLIT_ANGLE(0.36425727605820),
254 SCALE_SPLIT_ANGLE(0.36426907777786),
255 SCALE_SPLIT_ANGLE(0.36430004239082),
256 SCALE_SPLIT_ANGLE(0.36433213949203),
257 SCALE_SPLIT_ANGLE(0.36438730359077),
258 SCALE_SPLIT_ANGLE(0.36448970437050),
259 SCALE_SPLIT_ANGLE(0.36457163095474)},
260 {SCALE_SPLIT_ANGLE(0.35356888175011),
261 SCALE_SPLIT_ANGLE(0.35358175635338),
262 SCALE_SPLIT_ANGLE(0.35360190272331),
263 SCALE_SPLIT_ANGLE(0.35365560650826),
264 SCALE_SPLIT_ANGLE(0.35371258854866),
265 SCALE_SPLIT_ANGLE(0.35381385684013),
266 SCALE_SPLIT_ANGLE(0.35401365160942),
267 SCALE_SPLIT_ANGLE(0.35418578982353)},
268 {SCALE_SPLIT_ANGLE(0.33942583203316),
269 SCALE_SPLIT_ANGLE(0.33944645524025),
270 SCALE_SPLIT_ANGLE(0.33947896957397),
271 SCALE_SPLIT_ANGLE(0.33956742286682),
272 SCALE_SPLIT_ANGLE(0.33966416120529),
273 SCALE_SPLIT_ANGLE(0.33984372019768),
274 SCALE_SPLIT_ANGLE(0.34023007750511),
275 SCALE_SPLIT_ANGLE(0.34060221910477)},
276 {SCALE_SPLIT_ANGLE(0.32115450501442),
277 SCALE_SPLIT_ANGLE(0.32118520140648),
278 SCALE_SPLIT_ANGLE(0.32123416662216),
279 SCALE_SPLIT_ANGLE(0.32137048244476),
280 SCALE_SPLIT_ANGLE(0.32152509689331),
281 SCALE_SPLIT_ANGLE(0.32182863354683),
282 SCALE_SPLIT_ANGLE(0.32256561517715),
283 SCALE_SPLIT_ANGLE(0.32340893149376)},
284 {SCALE_SPLIT_ANGLE(0.29830521345139),
285 SCALE_SPLIT_ANGLE(0.29834723472595),
286 SCALE_SPLIT_ANGLE(0.29841500520706),
287 SCALE_SPLIT_ANGLE(0.29860860109329),
288 SCALE_SPLIT_ANGLE(0.29883742332458),
289 SCALE_SPLIT_ANGLE(0.29931786656380),
290 SCALE_SPLIT_ANGLE(0.30069106817245),
291 SCALE_SPLIT_ANGLE(0.30275771021843)},
292 {SCALE_SPLIT_ANGLE(0.28050789237022),
293 SCALE_SPLIT_ANGLE(0.28055712580681),
294 SCALE_SPLIT_ANGLE(0.28063708543777),
295 SCALE_SPLIT_ANGLE(0.28086942434311),
296 SCALE_SPLIT_ANGLE(0.28115189075470),
297 SCALE_SPLIT_ANGLE(0.28177404403687),
298 SCALE_SPLIT_ANGLE(0.28380545973778),
299 SCALE_SPLIT_ANGLE(0.28782638907433)},
300 {SCALE_SPLIT_ANGLE(0.26083287596703),
301 SCALE_SPLIT_ANGLE(0.26088824868202),
302 SCALE_SPLIT_ANGLE(0.26097872853279),
303 SCALE_SPLIT_ANGLE(0.26124578714371),
304 SCALE_SPLIT_ANGLE(0.26157897710800),
305 SCALE_SPLIT_ANGLE(0.26234793663025),
306 SCALE_SPLIT_ANGLE(0.26525345444679),
307 SCALE_SPLIT_ANGLE(0.27373576164246)},
308 {SCALE_SPLIT_ANGLE(0.23960022628307),
309 SCALE_SPLIT_ANGLE(0.23966011404991),
310 SCALE_SPLIT_ANGLE(0.23975846171379),
311 SCALE_SPLIT_ANGLE(0.24005253612995),
312 SCALE_SPLIT_ANGLE(0.24042735993862),
313 SCALE_SPLIT_ANGLE(0.24132782220840),
314 SCALE_SPLIT_ANGLE(0.24525125324726),
315 SCALE_SPLIT_ANGLE(0.26534587144852)},
316 {SCALE_SPLIT_ANGLE(0.21727463603020),
317 SCALE_SPLIT_ANGLE(0.21733720600605),
318 SCALE_SPLIT_ANGLE(0.21744030714035),
319 SCALE_SPLIT_ANGLE(0.21775111556053),
320 SCALE_SPLIT_ANGLE(0.21815299987793),
321 SCALE_SPLIT_ANGLE(0.21914559602737),
322 SCALE_SPLIT_ANGLE(0.22397418320179),
323 SCALE_SPLIT_ANGLE(0.27997341752052)},
324 {SCALE_SPLIT_ANGLE(0.19442924857140),
325 SCALE_SPLIT_ANGLE(0.19449260830879),
326 SCALE_SPLIT_ANGLE(0.19459712505341),
327 SCALE_SPLIT_ANGLE(0.19491320848465),
328 SCALE_SPLIT_ANGLE(0.19532410800457),
329 SCALE_SPLIT_ANGLE(0.19634956121445),
330 SCALE_SPLIT_ANGLE(0.20156545937061),
331 SCALE_SPLIT_ANGLE(0.33650875091553)},
332 {SCALE_SPLIT_ANGLE(0.17168679833412),
333 SCALE_SPLIT_ANGLE(0.17174908518791),
334 SCALE_SPLIT_ANGLE(0.17185173928738),
335 SCALE_SPLIT_ANGLE(0.17216140031815),
336 SCALE_SPLIT_ANGLE(0.17256212234497),
337 SCALE_SPLIT_ANGLE(0.17355351150036),
338 SCALE_SPLIT_ANGLE(0.17841057479382),
339 SCALE_SPLIT_ANGLE(0.23922468721867)},
340 {SCALE_SPLIT_ANGLE(0.14965108036995),
341 SCALE_SPLIT_ANGLE(0.14971046149731),
342 SCALE_SPLIT_ANGLE(0.14980803430080),
343 SCALE_SPLIT_ANGLE(0.15010002255440),
344 SCALE_SPLIT_ANGLE(0.15047283470631),
345 SCALE_SPLIT_ANGLE(0.15137128531933),
346 SCALE_SPLIT_ANGLE(0.15533345937729),
347 SCALE_SPLIT_ANGLE(0.17691856622696)},
348 {SCALE_SPLIT_ANGLE(0.12884500622749),
349 SCALE_SPLIT_ANGLE(0.12889973819256),
350 SCALE_SPLIT_ANGLE(0.12898921966553),
351 SCALE_SPLIT_ANGLE(0.12925371527672),
352 SCALE_SPLIT_ANGLE(0.12958450615406),
353 SCALE_SPLIT_ANGLE(0.13035117089748),
354 SCALE_SPLIT_ANGLE(0.13329000771046),
355 SCALE_SPLIT_ANGLE(0.14226883649826)},
356 {SCALE_SPLIT_ANGLE(0.10966771841049),
357 SCALE_SPLIT_ANGLE(0.10971628874540),
358 SCALE_SPLIT_ANGLE(0.10979522019625),
359 SCALE_SPLIT_ANGLE(0.11002497375011),
360 SCALE_SPLIT_ANGLE(0.11030506342649),
361 SCALE_SPLIT_ANGLE(0.11092507839203),
362 SCALE_SPLIT_ANGLE(0.11297956109047),
363 SCALE_SPLIT_ANGLE(0.11718676239252)},
364 {SCALE_SPLIT_ANGLE(0.09237616509199),
365 SCALE_SPLIT_ANGLE(0.09241759032011),
366 SCALE_SPLIT_ANGLE(0.09248441457748),
367 SCALE_SPLIT_ANGLE(0.09267570823431),
368 SCALE_SPLIT_ANGLE(0.09290253371000),
369 SCALE_SPLIT_ANGLE(0.09338124841452),
370 SCALE_SPLIT_ANGLE(0.09476862102747),
371 SCALE_SPLIT_ANGLE(0.09691140055656)},
372 {SCALE_SPLIT_ANGLE(0.07020132243633),
373 SCALE_SPLIT_ANGLE(0.07023159414530),
374 SCALE_SPLIT_ANGLE(0.07027988880873),
375 SCALE_SPLIT_ANGLE(0.07041462510824),
376 SCALE_SPLIT_ANGLE(0.07056795060635),
377 SCALE_SPLIT_ANGLE(0.07087047398090),
378 SCALE_SPLIT_ANGLE(0.07161350548267),
379 SCALE_SPLIT_ANGLE(0.07247893512249)},
380 {SCALE_SPLIT_ANGLE(0.05244029685855),
381 SCALE_SPLIT_ANGLE(0.05246063694358),
382 SCALE_SPLIT_ANGLE(0.05249277502298),
383 SCALE_SPLIT_ANGLE(0.05258031934500),
384 SCALE_SPLIT_ANGLE(0.05267634987831),
385 SCALE_SPLIT_ANGLE(0.05285539478064),
386 SCALE_SPLIT_ANGLE(0.05324416980147),
387 SCALE_SPLIT_ANGLE(0.05362326279283)},
388 {SCALE_SPLIT_ANGLE(0.03864165768027),
389 SCALE_SPLIT_ANGLE(0.03865439072251),
390 SCALE_SPLIT_ANGLE(0.03867433592677),
391 SCALE_SPLIT_ANGLE(0.03872758522630),
392 SCALE_SPLIT_ANGLE(0.03878424316645),
393 SCALE_SPLIT_ANGLE(0.03888526186347),
394 SCALE_SPLIT_ANGLE(0.03908598423004),
395 SCALE_SPLIT_ANGLE(0.03926040604711)},
396 {SCALE_SPLIT_ANGLE(0.02817477472126),
397 SCALE_SPLIT_ANGLE(0.02818230912089),
398 SCALE_SPLIT_ANGLE(0.02819401398301),
399 SCALE_SPLIT_ANGLE(0.02822477556765),
400 SCALE_SPLIT_ANGLE(0.02825673110783),
401 SCALE_SPLIT_ANGLE(0.02831180393696),
402 SCALE_SPLIT_ANGLE(0.02841453813016),
403 SCALE_SPLIT_ANGLE(0.02849725075066)},
404 {SCALE_SPLIT_ANGLE(0.02037953026593),
405 SCALE_SPLIT_ANGLE(0.02038379199803),
406 SCALE_SPLIT_ANGLE(0.02039037831128),
407 SCALE_SPLIT_ANGLE(0.02040746994317),
408 SCALE_SPLIT_ANGLE(0.02042490243912),
409 SCALE_SPLIT_ANGLE(0.02045420184731),
410 SCALE_SPLIT_ANGLE(0.02050646767020),
411 SCALE_SPLIT_ANGLE(0.02054644003510)},
412 {SCALE_SPLIT_ANGLE(0.01173160225153),
413 SCALE_SPLIT_ANGLE(0.01173313986510),
414 SCALE_SPLIT_ANGLE(0.01173550263047),
415 SCALE_SPLIT_ANGLE(0.01174154505134),
416 SCALE_SPLIT_ANGLE(0.01174758374691),
417 SCALE_SPLIT_ANGLE(0.01175745483488),
418 SCALE_SPLIT_ANGLE(0.01177425310016),
419 SCALE_SPLIT_ANGLE(0.01178644131869)},
420 {SCALE_SPLIT_ANGLE(0.00668647512794),
421 SCALE_SPLIT_ANGLE(0.00668699946254),
422 SCALE_SPLIT_ANGLE(0.00668780272827),
423 SCALE_SPLIT_ANGLE(0.00668983906507),
424 SCALE_SPLIT_ANGLE(0.00669185025617),
425 SCALE_SPLIT_ANGLE(0.00669508520514),
426 SCALE_SPLIT_ANGLE(0.00670044543222),
427 SCALE_SPLIT_ANGLE(0.00670422753319)},
428 {SCALE_SPLIT_ANGLE(0.00378898042254),
429 SCALE_SPLIT_ANGLE(0.00378915388137),
430 SCALE_SPLIT_ANGLE(0.00378941884264),
431 SCALE_SPLIT_ANGLE(0.00379008660093),
432 SCALE_SPLIT_ANGLE(0.00379074062221),
433 SCALE_SPLIT_ANGLE(0.00379178463481),
434 SCALE_SPLIT_ANGLE(0.00379348872229),
435 SCALE_SPLIT_ANGLE(0.00379467196763)},
436 {SCALE_SPLIT_ANGLE(0.00213995971717),
437 SCALE_SPLIT_ANGLE(0.00214001606219),
438 SCALE_SPLIT_ANGLE(0.00214010174386),
439 SCALE_SPLIT_ANGLE(0.00214031711221),
440 SCALE_SPLIT_ANGLE(0.00214052735828),
441 SCALE_SPLIT_ANGLE(0.00214086147025),
442 SCALE_SPLIT_ANGLE(0.00214140163735),
443 SCALE_SPLIT_ANGLE(0.00214177416638)},
444 {SCALE_SPLIT_ANGLE(0.00000001210151),
445 SCALE_SPLIT_ANGLE(0.00000001210151),
446 SCALE_SPLIT_ANGLE(0.00000001210151),
447 SCALE_SPLIT_ANGLE(0.00000001210151),
448 SCALE_SPLIT_ANGLE(0.00000001210151),
449 SCALE_SPLIT_ANGLE(0.00000001210151),
450 SCALE_SPLIT_ANGLE(0.00000001210151),
451 SCALE_SPLIT_ANGLE(0.00000001210151)},
452 },
453 {
454 {SCALE_SPLIT_ANGLE(0.78539812564850),
455 SCALE_SPLIT_ANGLE(0.78539812564850),
456 SCALE_SPLIT_ANGLE(0.78539812564850),
457 SCALE_SPLIT_ANGLE(0.78539812564850),
458 SCALE_SPLIT_ANGLE(0.78539812564850),
459 SCALE_SPLIT_ANGLE(0.78539812564850),
460 SCALE_SPLIT_ANGLE(0.78539812564850),
461 SCALE_SPLIT_ANGLE(0.78539812564850)},
462 {SCALE_SPLIT_ANGLE(0.78143113851547),
463 SCALE_SPLIT_ANGLE(0.78143155574799),
464 SCALE_SPLIT_ANGLE(0.78143215179443),
465 SCALE_SPLIT_ANGLE(0.78143370151520),
466 SCALE_SPLIT_ANGLE(0.78143519163132),
467 SCALE_SPLIT_ANGLE(0.78143757581711),
468 SCALE_SPLIT_ANGLE(0.78144145011902),
469 SCALE_SPLIT_ANGLE(0.78144407272339)},
470 {SCALE_SPLIT_ANGLE(0.77835679054260),
471 SCALE_SPLIT_ANGLE(0.77835804224014),
472 SCALE_SPLIT_ANGLE(0.77835988998413),
473 SCALE_SPLIT_ANGLE(0.77836471796036),
474 SCALE_SPLIT_ANGLE(0.77836942672729),
475 SCALE_SPLIT_ANGLE(0.77837687730789),
476 SCALE_SPLIT_ANGLE(0.77838897705078),
477 SCALE_SPLIT_ANGLE(0.77839738130569)},
478 {SCALE_SPLIT_ANGLE(0.77291858196259),
479 SCALE_SPLIT_ANGLE(0.77292239665985),
480 SCALE_SPLIT_ANGLE(0.77292817831039),
481 SCALE_SPLIT_ANGLE(0.77294290065765),
482 SCALE_SPLIT_ANGLE(0.77295738458633),
483 SCALE_SPLIT_ANGLE(0.77298063039780),
484 SCALE_SPLIT_ANGLE(0.77301889657974),
485 SCALE_SPLIT_ANGLE(0.77304571866989)},
486 {SCALE_SPLIT_ANGLE(0.76334190368652),
487 SCALE_SPLIT_ANGLE(0.76335322856903),
488 SCALE_SPLIT_ANGLE(0.76337057352066),
489 SCALE_SPLIT_ANGLE(0.76341474056244),
490 SCALE_SPLIT_ANGLE(0.76345866918564),
491 SCALE_SPLIT_ANGLE(0.76353001594543),
492 SCALE_SPLIT_ANGLE(0.76365023851395),
493 SCALE_SPLIT_ANGLE(0.76373648643494)},
494 {SCALE_SPLIT_ANGLE(0.74662178754807),
495 SCALE_SPLIT_ANGLE(0.74665385484695),
496 SCALE_SPLIT_ANGLE(0.74670320749283),
497 SCALE_SPLIT_ANGLE(0.74683058261871),
498 SCALE_SPLIT_ANGLE(0.74695950746536),
499 SCALE_SPLIT_ANGLE(0.74717390537262),
500 SCALE_SPLIT_ANGLE(0.74754953384399),
501 SCALE_SPLIT_ANGLE(0.74783092737198)},
502 {SCALE_SPLIT_ANGLE(0.73124057054520),
503 SCALE_SPLIT_ANGLE(0.73129826784134),
504 SCALE_SPLIT_ANGLE(0.73138761520386),
505 SCALE_SPLIT_ANGLE(0.73162078857422),
506 SCALE_SPLIT_ANGLE(0.73186045885086),
507 SCALE_SPLIT_ANGLE(0.73226773738861),
508 SCALE_SPLIT_ANGLE(0.73300832509995),
509 SCALE_SPLIT_ANGLE(0.73358738422394)},
510 {SCALE_SPLIT_ANGLE(0.71016556024551),
511 SCALE_SPLIT_ANGLE(0.71026545763016),
512 SCALE_SPLIT_ANGLE(0.71042120456696),
513 SCALE_SPLIT_ANGLE(0.71083343029022),
514 SCALE_SPLIT_ANGLE(0.71126621961594),
515 SCALE_SPLIT_ANGLE(0.71202337741852),
516 SCALE_SPLIT_ANGLE(0.71347540616989),
517 SCALE_SPLIT_ANGLE(0.71468448638916)},
518 {SCALE_SPLIT_ANGLE(0.68173062801361),
519 SCALE_SPLIT_ANGLE(0.68189471960068),
520 SCALE_SPLIT_ANGLE(0.68215268850327),
521 SCALE_SPLIT_ANGLE(0.68284785747528),
522 SCALE_SPLIT_ANGLE(0.68359774351120),
523 SCALE_SPLIT_ANGLE(0.68496215343475),
524 SCALE_SPLIT_ANGLE(0.68778359889984),
525 SCALE_SPLIT_ANGLE(0.69036644697189)},
526 {SCALE_SPLIT_ANGLE(0.64424294233322),
527 SCALE_SPLIT_ANGLE(0.64449471235275),
528 SCALE_SPLIT_ANGLE(0.64489430189133),
529 SCALE_SPLIT_ANGLE(0.64599478244781),
530 SCALE_SPLIT_ANGLE(0.64722269773483),
531 SCALE_SPLIT_ANGLE(0.64957273006439),
532 SCALE_SPLIT_ANGLE(0.65497380495071),
533 SCALE_SPLIT_ANGLE(0.66069257259369)},
534 {SCALE_SPLIT_ANGLE(0.59645885229111),
535 SCALE_SPLIT_ANGLE(0.59681373834610),
536 SCALE_SPLIT_ANGLE(0.59738290309906),
537 SCALE_SPLIT_ANGLE(0.59898978471756),
538 SCALE_SPLIT_ANGLE(0.60085380077362),
539 SCALE_SPLIT_ANGLE(0.60464859008789),
540 SCALE_SPLIT_ANGLE(0.61471658945084),
541 SCALE_SPLIT_ANGLE(0.62811440229416)},
542 {SCALE_SPLIT_ANGLE(0.55878311395645),
543 SCALE_SPLIT_ANGLE(0.55920600891113),
544 SCALE_SPLIT_ANGLE(0.55988913774490),
545 SCALE_SPLIT_ANGLE(0.56185030937195),
546 SCALE_SPLIT_ANGLE(0.56418746709824),
547 SCALE_SPLIT_ANGLE(0.56916546821594),
548 SCALE_SPLIT_ANGLE(0.58402228355408),
549 SCALE_SPLIT_ANGLE(0.60877442359924)},
550 {SCALE_SPLIT_ANGLE(0.51690864562988),
551 SCALE_SPLIT_ANGLE(0.51739054918289),
552 SCALE_SPLIT_ANGLE(0.51817405223846),
553 SCALE_SPLIT_ANGLE(0.52045875787735),
554 SCALE_SPLIT_ANGLE(0.52325224876404),
555 SCALE_SPLIT_ANGLE(0.52947413921356),
556 SCALE_SPLIT_ANGLE(0.55062562227249),
557 SCALE_SPLIT_ANGLE(0.59875661134720)},
558 {SCALE_SPLIT_ANGLE(0.47171193361282),
559 SCALE_SPLIT_ANGLE(0.47223743796349),
560 SCALE_SPLIT_ANGLE(0.47309640049934),
561 SCALE_SPLIT_ANGLE(0.47563400864601),
562 SCALE_SPLIT_ANGLE(0.47880488634109),
563 SCALE_SPLIT_ANGLE(0.48615166544914),
564 SCALE_SPLIT_ANGLE(0.51456981897354),
565 SCALE_SPLIT_ANGLE(0.61478358507156)},
566 {SCALE_SPLIT_ANGLE(0.42445337772369),
567 SCALE_SPLIT_ANGLE(0.42500329017639),
568 SCALE_SPLIT_ANGLE(0.42590543627739),
569 SCALE_SPLIT_ANGLE(0.42859473824501),
570 SCALE_SPLIT_ANGLE(0.43200695514679),
571 SCALE_SPLIT_ANGLE(0.44014197587967),
572 SCALE_SPLIT_ANGLE(0.47505444288254),
573 SCALE_SPLIT_ANGLE(0.70435541868210)},
574 {SCALE_SPLIT_ANGLE(0.37662339210510),
575 SCALE_SPLIT_ANGLE(0.37717753648758),
576 SCALE_SPLIT_ANGLE(0.37808802723885),
577 SCALE_SPLIT_ANGLE(0.38081303238869),
578 SCALE_SPLIT_ANGLE(0.38429373502731),
579 SCALE_SPLIT_ANGLE(0.39269909262657),
580 SCALE_SPLIT_ANGLE(0.43061128258705),
581 SCALE_SPLIT_ANGLE(0.89949643611908)},
582 {SCALE_SPLIT_ANGLE(0.32972764968872),
583 SCALE_SPLIT_ANGLE(0.33026659488678),
584 SCALE_SPLIT_ANGLE(0.33115157485008),
585 SCALE_SPLIT_ANGLE(0.33379590511322),
586 SCALE_SPLIT_ANGLE(0.33716440200806),
587 SCALE_SPLIT_ANGLE(0.34525617957115),
588 SCALE_SPLIT_ANGLE(0.38098797202110),
589 SCALE_SPLIT_ANGLE(0.66312330961227)},
590 {SCALE_SPLIT_ANGLE(0.28508263826370),
591 SCALE_SPLIT_ANGLE(0.28558859229088),
592 SCALE_SPLIT_ANGLE(0.28641715645790),
593 SCALE_SPLIT_ANGLE(0.28887593746185),
594 SCALE_SPLIT_ANGLE(0.29197177290916),
595 SCALE_SPLIT_ANGLE(0.29924646019936),
596 SCALE_SPLIT_ANGLE(0.32879719138145),
597 SCALE_SPLIT_ANGLE(0.45467028021812)},
598 {SCALE_SPLIT_ANGLE(0.24368345737457),
599 SCALE_SPLIT_ANGLE(0.24414120614529),
600 SCALE_SPLIT_ANGLE(0.24488738179207),
601 SCALE_SPLIT_ANGLE(0.24707712233067),
602 SCALE_SPLIT_ANGLE(0.24978286027908),
603 SCALE_SPLIT_ANGLE(0.25592401623726),
604 SCALE_SPLIT_ANGLE(0.27806487679482),
605 SCALE_SPLIT_ANGLE(0.33706206083298)},
606 {SCALE_SPLIT_ANGLE(0.20616286993027),
607 SCALE_SPLIT_ANGLE(0.20656119287014),
608 SCALE_SPLIT_ANGLE(0.20720668137074),
609 SCALE_SPLIT_ANGLE(0.20907410979271),
610 SCALE_SPLIT_ANGLE(0.21132774651051),
611 SCALE_SPLIT_ANGLE(0.21623271703720),
612 SCALE_SPLIT_ANGLE(0.23177997767925),
613 SCALE_SPLIT_ANGLE(0.26115790009499)},
614 {SCALE_SPLIT_ANGLE(0.17282110452652),
615 SCALE_SPLIT_ANGLE(0.17315416038036),
616 SCALE_SPLIT_ANGLE(0.17369024455547),
617 SCALE_SPLIT_ANGLE(0.17521673440933),
618 SCALE_SPLIT_ANGLE(0.17701178789139),
619 SCALE_SPLIT_ANGLE(0.18074953556061),
620 SCALE_SPLIT_ANGLE(0.19124270975590),
621 SCALE_SPLIT_ANGLE(0.20666223764420)},
622 {SCALE_SPLIT_ANGLE(0.13066084682941),
623 SCALE_SPLIT_ANGLE(0.13089758157730),
624 SCALE_SPLIT_ANGLE(0.13127475976944),
625 SCALE_SPLIT_ANGLE(0.13232271373272),
626 SCALE_SPLIT_ANGLE(0.13350808620453),
627 SCALE_SPLIT_ANGLE(0.13582544028759),
628 SCALE_SPLIT_ANGLE(0.14140741527081),
629 SCALE_SPLIT_ANGLE(0.14774028956890)},
630 {SCALE_SPLIT_ANGLE(0.09729286283255),
631 SCALE_SPLIT_ANGLE(0.09744835644960),
632 SCALE_SPLIT_ANGLE(0.09769364446402),
633 SCALE_SPLIT_ANGLE(0.09835994243622),
634 SCALE_SPLIT_ANGLE(0.09908767789602),
635 SCALE_SPLIT_ANGLE(0.10043603181839),
636 SCALE_SPLIT_ANGLE(0.10332850366831),
637 SCALE_SPLIT_ANGLE(0.10610697418451)},
638 {SCALE_SPLIT_ANGLE(0.07155895978212),
639 SCALE_SPLIT_ANGLE(0.07165451347828),
640 SCALE_SPLIT_ANGLE(0.07180397957563),
641 SCALE_SPLIT_ANGLE(0.07220225036144),
642 SCALE_SPLIT_ANGLE(0.07262472063303),
643 SCALE_SPLIT_ANGLE(0.07337479293346),
644 SCALE_SPLIT_ANGLE(0.07485356926918),
645 SCALE_SPLIT_ANGLE(0.07612708956003)},
646 {SCALE_SPLIT_ANGLE(0.05212157219648),
647 SCALE_SPLIT_ANGLE(0.05217727646232),
648 SCALE_SPLIT_ANGLE(0.05226379260421),
649 SCALE_SPLIT_ANGLE(0.05249078199267),
650 SCALE_SPLIT_ANGLE(0.05272606015205),
651 SCALE_SPLIT_ANGLE(0.05313042178750),
652 SCALE_SPLIT_ANGLE(0.05388085916638),
653 SCALE_SPLIT_ANGLE(0.05448162183166)},
654 {SCALE_SPLIT_ANGLE(0.03767965734005),
655 SCALE_SPLIT_ANGLE(0.03771083429456),
656 SCALE_SPLIT_ANGLE(0.03775899112225),
657 SCALE_SPLIT_ANGLE(0.03788382932544),
658 SCALE_SPLIT_ANGLE(0.03801096230745),
659 SCALE_SPLIT_ANGLE(0.03822423517704),
660 SCALE_SPLIT_ANGLE(0.03860339149833),
661 SCALE_SPLIT_ANGLE(0.03889226913452)},
662 {SCALE_SPLIT_ANGLE(0.02168158628047),
663 SCALE_SPLIT_ANGLE(0.02169270813465),
664 SCALE_SPLIT_ANGLE(0.02170977368951),
665 SCALE_SPLIT_ANGLE(0.02175341546535),
666 SCALE_SPLIT_ANGLE(0.02179697528481),
667 SCALE_SPLIT_ANGLE(0.02186812832952),
668 SCALE_SPLIT_ANGLE(0.02198898419738),
669 SCALE_SPLIT_ANGLE(0.02207652665675)},
670 {SCALE_SPLIT_ANGLE(0.01235581003129),
671 SCALE_SPLIT_ANGLE(0.01235957816243),
672 SCALE_SPLIT_ANGLE(0.01236534118652),
673 SCALE_SPLIT_ANGLE(0.01237995270640),
674 SCALE_SPLIT_ANGLE(0.01239436585456),
675 SCALE_SPLIT_ANGLE(0.01241754554212),
676 SCALE_SPLIT_ANGLE(0.01245592255145),
677 SCALE_SPLIT_ANGLE(0.01248296815902)},
678 {SCALE_SPLIT_ANGLE(0.00700127054006),
679 SCALE_SPLIT_ANGLE(0.00700251059607),
680 SCALE_SPLIT_ANGLE(0.00700440211222),
681 SCALE_SPLIT_ANGLE(0.00700917327777),
682 SCALE_SPLIT_ANGLE(0.00701385037974),
683 SCALE_SPLIT_ANGLE(0.00702130328864),
684 SCALE_SPLIT_ANGLE(0.00703346775845),
685 SCALE_SPLIT_ANGLE(0.00704190973192)},
686 {SCALE_SPLIT_ANGLE(0.00395415630192),
687 SCALE_SPLIT_ANGLE(0.00395455770195),
688 SCALE_SPLIT_ANGLE(0.00395516818389),
689 SCALE_SPLIT_ANGLE(0.00395670533180),
690 SCALE_SPLIT_ANGLE(0.00395820522681),
691 SCALE_SPLIT_ANGLE(0.00396058429033),
692 SCALE_SPLIT_ANGLE(0.00396443530917),
693 SCALE_SPLIT_ANGLE(0.00396708538756)},
694 {SCALE_SPLIT_ANGLE(0.00000002236068),
695 SCALE_SPLIT_ANGLE(0.00000002236068),
696 SCALE_SPLIT_ANGLE(0.00000002236068),
697 SCALE_SPLIT_ANGLE(0.00000002236068),
698 SCALE_SPLIT_ANGLE(0.00000002236068),
699 SCALE_SPLIT_ANGLE(0.00000002236068),
700 SCALE_SPLIT_ANGLE(0.00000002236068),
701 SCALE_SPLIT_ANGLE(0.00000002236068)},
702 },
703 {
704 {SCALE_SPLIT_ANGLE(1.17809724807739),
705 SCALE_SPLIT_ANGLE(1.17809724807739),
706 SCALE_SPLIT_ANGLE(1.17809724807739),
707 SCALE_SPLIT_ANGLE(1.17809724807739),
708 SCALE_SPLIT_ANGLE(1.17809724807739),
709 SCALE_SPLIT_ANGLE(1.17809724807739),
710 SCALE_SPLIT_ANGLE(1.17809724807739),
711 SCALE_SPLIT_ANGLE(1.17809724807739)},
712 {SCALE_SPLIT_ANGLE(1.17289519309998),
713 SCALE_SPLIT_ANGLE(1.17289638519287),
714 SCALE_SPLIT_ANGLE(1.17289805412292),
715 SCALE_SPLIT_ANGLE(1.17290234565735),
716 SCALE_SPLIT_ANGLE(1.17290651798248),
717 SCALE_SPLIT_ANGLE(1.17291307449341),
718 SCALE_SPLIT_ANGLE(1.17292368412018),
719 SCALE_SPLIT_ANGLE(1.17293095588684)},
720 {SCALE_SPLIT_ANGLE(1.16883802413940),
721 SCALE_SPLIT_ANGLE(1.16884148120880),
722 SCALE_SPLIT_ANGLE(1.16884684562683),
723 SCALE_SPLIT_ANGLE(1.16886019706726),
724 SCALE_SPLIT_ANGLE(1.16887319087982),
725 SCALE_SPLIT_ANGLE(1.16889393329620),
726 SCALE_SPLIT_ANGLE(1.16892755031586),
727 SCALE_SPLIT_ANGLE(1.16895067691803)},
728 {SCALE_SPLIT_ANGLE(1.16160655021667),
729 SCALE_SPLIT_ANGLE(1.16161727905273),
730 SCALE_SPLIT_ANGLE(1.16163372993469),
731 SCALE_SPLIT_ANGLE(1.16167509555817),
732 SCALE_SPLIT_ANGLE(1.16171574592590),
733 SCALE_SPLIT_ANGLE(1.16178059577942),
734 SCALE_SPLIT_ANGLE(1.16188669204712),
735 SCALE_SPLIT_ANGLE(1.16196048259735)},
736 {SCALE_SPLIT_ANGLE(1.14870405197144),
737 SCALE_SPLIT_ANGLE(1.14873659610748),
738 SCALE_SPLIT_ANGLE(1.14878630638123),
739 SCALE_SPLIT_ANGLE(1.14891266822815),
740 SCALE_SPLIT_ANGLE(1.14903748035431),
741 SCALE_SPLIT_ANGLE(1.14923894405365),
742 SCALE_SPLIT_ANGLE(1.14957404136658),
743 SCALE_SPLIT_ANGLE(1.14981138706207)},
744 {SCALE_SPLIT_ANGLE(1.12567496299744),
745 SCALE_SPLIT_ANGLE(1.12576997280121),
746 SCALE_SPLIT_ANGLE(1.12591612339020),
747 SCALE_SPLIT_ANGLE(1.12629067897797),
748 SCALE_SPLIT_ANGLE(1.12666594982147),
749 SCALE_SPLIT_ANGLE(1.12728190422058),
750 SCALE_SPLIT_ANGLE(1.12833762168884),
751 SCALE_SPLIT_ANGLE(1.12910997867584)},
752 {SCALE_SPLIT_ANGLE(1.10394382476807),
753 SCALE_SPLIT_ANGLE(1.10412001609802),
754 SCALE_SPLIT_ANGLE(1.10439181327820),
755 SCALE_SPLIT_ANGLE(1.10509443283081),
756 SCALE_SPLIT_ANGLE(1.10580694675446),
757 SCALE_SPLIT_ANGLE(1.10699594020844),
758 SCALE_SPLIT_ANGLE(1.10909199714661),
759 SCALE_SPLIT_ANGLE(1.11067581176758)},
760 {SCALE_SPLIT_ANGLE(1.07335853576660),
761 SCALE_SPLIT_ANGLE(1.07367515563965),
762 SCALE_SPLIT_ANGLE(1.07416594028473),
763 SCALE_SPLIT_ANGLE(1.07544887065887),
764 SCALE_SPLIT_ANGLE(1.07677161693573),
765 SCALE_SPLIT_ANGLE(1.07902932167053),
766 SCALE_SPLIT_ANGLE(1.08317446708679),
767 SCALE_SPLIT_ANGLE(1.08645892143250)},
768 {SCALE_SPLIT_ANGLE(1.03070926666260),
769 SCALE_SPLIT_ANGLE(1.03125381469727),
770 SCALE_SPLIT_ANGLE(1.03210365772247),
771 SCALE_SPLIT_ANGLE(1.03435742855072),
772 SCALE_SPLIT_ANGLE(1.03673219680786),
773 SCALE_SPLIT_ANGLE(1.04091238975525),
774 SCALE_SPLIT_ANGLE(1.04904520511627),
775 SCALE_SPLIT_ANGLE(1.05597066879272)},
776 {SCALE_SPLIT_ANGLE(0.97233027219772),
777 SCALE_SPLIT_ANGLE(0.97321176528931),
778 SCALE_SPLIT_ANGLE(0.97459858655930),
779 SCALE_SPLIT_ANGLE(0.97834444046021),
780 SCALE_SPLIT_ANGLE(0.98240250349045),
781 SCALE_SPLIT_ANGLE(0.98984360694885),
782 SCALE_SPLIT_ANGLE(1.00556409358978),
783 SCALE_SPLIT_ANGLE(1.02053046226501)},
784 {SCALE_SPLIT_ANGLE(0.89506644010544),
785 SCALE_SPLIT_ANGLE(0.89638090133667),
786 SCALE_SPLIT_ANGLE(0.89846849441528),
787 SCALE_SPLIT_ANGLE(0.90423041582108),
788 SCALE_SPLIT_ANGLE(0.91068577766418),
789 SCALE_SPLIT_ANGLE(0.92315071821213),
790 SCALE_SPLIT_ANGLE(0.95268243551254),
791 SCALE_SPLIT_ANGLE(0.98626506328583)},
792 {SCALE_SPLIT_ANGLE(0.83257329463959),
793 SCALE_SPLIT_ANGLE(0.83419400453568),
794 SCALE_SPLIT_ANGLE(0.83678525686264),
795 SCALE_SPLIT_ANGLE(0.84404885768890),
796 SCALE_SPLIT_ANGLE(0.85238879919052),
797 SCALE_SPLIT_ANGLE(0.86914122104645),
798 SCALE_SPLIT_ANGLE(0.91285765171051),
799 SCALE_SPLIT_ANGLE(0.97222852706909)},
800 {SCALE_SPLIT_ANGLE(0.76227337121964),
801 SCALE_SPLIT_ANGLE(0.76417022943497),
802 SCALE_SPLIT_ANGLE(0.76722234487534),
803 SCALE_SPLIT_ANGLE(0.77590966224670),
804 SCALE_SPLIT_ANGLE(0.78613227605820),
805 SCALE_SPLIT_ANGLE(0.80752640962601),
806 SCALE_SPLIT_ANGLE(0.86987829208374),
807 SCALE_SPLIT_ANGLE(0.97863066196442)},
808 {SCALE_SPLIT_ANGLE(0.68631619215012),
809 SCALE_SPLIT_ANGLE(0.68841683864594),
810 SCALE_SPLIT_ANGLE(0.69181632995605),
811 SCALE_SPLIT_ANGLE(0.70162522792816),
812 SCALE_SPLIT_ANGLE(0.71342813968658),
813 SCALE_SPLIT_ANGLE(0.73910331726074),
814 SCALE_SPLIT_ANGLE(0.82307606935501),
815 SCALE_SPLIT_ANGLE(1.03223013877869)},
816 {SCALE_SPLIT_ANGLE(0.60781323909760),
817 SCALE_SPLIT_ANGLE(0.61001545190811),
818 SCALE_SPLIT_ANGLE(0.61359488964081),
819 SCALE_SPLIT_ANGLE(0.62403196096420),
820 SCALE_SPLIT_ANGLE(0.63681113719940),
821 SCALE_SPLIT_ANGLE(0.66548818349838),
822 SCALE_SPLIT_ANGLE(0.76931142807007),
823 SCALE_SPLIT_ANGLE(1.19638144969940)},
824 {SCALE_SPLIT_ANGLE(0.53021633625031),
825 SCALE_SPLIT_ANGLE(0.53240889310837),
826 SCALE_SPLIT_ANGLE(0.53598147630692),
827 SCALE_SPLIT_ANGLE(0.54646170139313),
828 SCALE_SPLIT_ANGLE(0.55942362546921),
829 SCALE_SPLIT_ANGLE(0.58904862403870),
830 SCALE_SPLIT_ANGLE(0.70326197147369),
831 SCALE_SPLIT_ANGLE(1.46822571754456)},
832 {SCALE_SPLIT_ANGLE(0.45655798912048),
833 SCALE_SPLIT_ANGLE(0.45864027738571),
834 SCALE_SPLIT_ANGLE(0.46203431487083),
835 SCALE_SPLIT_ANGLE(0.47199890017509),
836 SCALE_SPLIT_ANGLE(0.48433950543404),
837 SCALE_SPLIT_ANGLE(0.51260900497437),
838 SCALE_SPLIT_ANGLE(0.62212866544724),
839 SCALE_SPLIT_ANGLE(1.20720028877258)},
840 {SCALE_SPLIT_ANGLE(0.38893291354179),
841 SCALE_SPLIT_ANGLE(0.39082619547844),
842 SCALE_SPLIT_ANGLE(0.39390671253204),
843 SCALE_SPLIT_ANGLE(0.40291145443916),
844 SCALE_SPLIT_ANGLE(0.41398161649704),
845 SCALE_SPLIT_ANGLE(0.43899387121201),
846 SCALE_SPLIT_ANGLE(0.53091615438461),
847 SCALE_SPLIT_ANGLE(0.85221332311630)},
848 {SCALE_SPLIT_ANGLE(0.32840186357498),
849 SCALE_SPLIT_ANGLE(0.33005380630493),
850 SCALE_SPLIT_ANGLE(0.33273181319237),
851 SCALE_SPLIT_ANGLE(0.34049156308174),
852 SCALE_SPLIT_ANGLE(0.34989202022552),
853 SCALE_SPLIT_ANGLE(0.37057083845139),
854 SCALE_SPLIT_ANGLE(0.43990376591682),
855 SCALE_SPLIT_ANGLE(0.60593068599701)},
856 {SCALE_SPLIT_ANGLE(0.27521029114723),
857 SCALE_SPLIT_ANGLE(0.27659532427788),
858 SCALE_SPLIT_ANGLE(0.27882957458496),
859 SCALE_SPLIT_ANGLE(0.28522574901581),
860 SCALE_SPLIT_ANGLE(0.29282194375992),
861 SCALE_SPLIT_ANGLE(0.30895602703094),
862 SCALE_SPLIT_ANGLE(0.35752716660500),
863 SCALE_SPLIT_ANGLE(0.44366976618767)},
864 {SCALE_SPLIT_ANGLE(0.22909799218178),
865 SCALE_SPLIT_ANGLE(0.23021572828293),
866 SCALE_SPLIT_ANGLE(0.23200811445713),
867 SCALE_SPLIT_ANGLE(0.23706816136837),
868 SCALE_SPLIT_ANGLE(0.24294251203537),
869 SCALE_SPLIT_ANGLE(0.25494652986526),
870 SCALE_SPLIT_ANGLE(0.28743273019791),
871 SCALE_SPLIT_ANGLE(0.33326253294945)},
872 {SCALE_SPLIT_ANGLE(0.17204397916794),
873 SCALE_SPLIT_ANGLE(0.17280195653439),
874 SCALE_SPLIT_ANGLE(0.17400608956814),
875 SCALE_SPLIT_ANGLE(0.17733128368855),
876 SCALE_SPLIT_ANGLE(0.18105845153332),
877 SCALE_SPLIT_ANGLE(0.18825364112854),
878 SCALE_SPLIT_ANGLE(0.20519739389420),
879 SCALE_SPLIT_ANGLE(0.22397252917290)},
880 {SCALE_SPLIT_ANGLE(0.12763081490994),
881 SCALE_SPLIT_ANGLE(0.12810991704464),
882 SCALE_SPLIT_ANGLE(0.12886413931847),
883 SCALE_SPLIT_ANGLE(0.13090407848358),
884 SCALE_SPLIT_ANGLE(0.13311788439751),
885 SCALE_SPLIT_ANGLE(0.13718488812447),
886 SCALE_SPLIT_ANGLE(0.14578336477280),
887 SCALE_SPLIT_ANGLE(0.15392093360424)},
888 {SCALE_SPLIT_ANGLE(0.09368771314621),
889 SCALE_SPLIT_ANGLE(0.09397350251675),
890 SCALE_SPLIT_ANGLE(0.09441984444857),
891 SCALE_SPLIT_ANGLE(0.09560553729534),
892 SCALE_SPLIT_ANGLE(0.09685769677162),
893 SCALE_SPLIT_ANGLE(0.09906788915396),
894 SCALE_SPLIT_ANGLE(0.10338338464499),
895 SCALE_SPLIT_ANGLE(0.10706327855587)},
896 {SCALE_SPLIT_ANGLE(0.06817039847374),
897 SCALE_SPLIT_ANGLE(0.06833326816559),
898 SCALE_SPLIT_ANGLE(0.06858598440886),
899 SCALE_SPLIT_ANGLE(0.06924756616354),
900 SCALE_SPLIT_ANGLE(0.06993119418621),
901 SCALE_SPLIT_ANGLE(0.07110133767128),
902 SCALE_SPLIT_ANGLE(0.07325870543718),
903 SCALE_SPLIT_ANGLE(0.07497421652079)},
904 {SCALE_SPLIT_ANGLE(0.04925633221865),
905 SCALE_SPLIT_ANGLE(0.04934597760439),
906 SCALE_SPLIT_ANGLE(0.04948436096311),
907 SCALE_SPLIT_ANGLE(0.04984252527356),
908 SCALE_SPLIT_ANGLE(0.05020647495985),
909 SCALE_SPLIT_ANGLE(0.05081529542804),
910 SCALE_SPLIT_ANGLE(0.05189275369048),
911 SCALE_SPLIT_ANGLE(0.05270983651280)},
912 {SCALE_SPLIT_ANGLE(0.02833298407495),
913 SCALE_SPLIT_ANGLE(0.02836437709630),
914 SCALE_SPLIT_ANGLE(0.02841254509985),
915 SCALE_SPLIT_ANGLE(0.02853557839990),
916 SCALE_SPLIT_ANGLE(0.02865825034678),
917 SCALE_SPLIT_ANGLE(0.02885829657316),
918 SCALE_SPLIT_ANGLE(0.02919724024832),
919 SCALE_SPLIT_ANGLE(0.02944211289287)},
920 {SCALE_SPLIT_ANGLE(0.01614447496831),
921 SCALE_SPLIT_ANGLE(0.01615499891341),
922 SCALE_SPLIT_ANGLE(0.01617109030485),
923 SCALE_SPLIT_ANGLE(0.01621186546981),
924 SCALE_SPLIT_ANGLE(0.01625206694007),
925 SCALE_SPLIT_ANGLE(0.01631666347384),
926 SCALE_SPLIT_ANGLE(0.01642346009612),
927 SCALE_SPLIT_ANGLE(0.01649860665202)},
928 {SCALE_SPLIT_ANGLE(0.00914775021374),
929 SCALE_SPLIT_ANGLE(0.00915119145066),
930 SCALE_SPLIT_ANGLE(0.00915644038469),
931 SCALE_SPLIT_ANGLE(0.00916968286037),
932 SCALE_SPLIT_ANGLE(0.00918265152723),
933 SCALE_SPLIT_ANGLE(0.00920331478119),
934 SCALE_SPLIT_ANGLE(0.00923701003194),
935 SCALE_SPLIT_ANGLE(0.00926037877798)},
936 {SCALE_SPLIT_ANGLE(0.00516638066620),
937 SCALE_SPLIT_ANGLE(0.00516748987138),
938 SCALE_SPLIT_ANGLE(0.00516917929053),
939 SCALE_SPLIT_ANGLE(0.00517342984676),
940 SCALE_SPLIT_ANGLE(0.00517757656053),
941 SCALE_SPLIT_ANGLE(0.00518415356055),
942 SCALE_SPLIT_ANGLE(0.00519479578361),
943 SCALE_SPLIT_ANGLE(0.00520211551338)},
944 {SCALE_SPLIT_ANGLE(0.00000002921564),
945 SCALE_SPLIT_ANGLE(0.00000002921564),
946 SCALE_SPLIT_ANGLE(0.00000002921564),
947 SCALE_SPLIT_ANGLE(0.00000002921564),
948 SCALE_SPLIT_ANGLE(0.00000002921564),
949 SCALE_SPLIT_ANGLE(0.00000002921564),
950 SCALE_SPLIT_ANGLE(0.00000002921564),
951 SCALE_SPLIT_ANGLE(0.00000002921564)},
952 },
953 {
954 {SCALE_SPLIT_ANGLE(1.57079637050629),
955 SCALE_SPLIT_ANGLE(1.57079637050629),
956 SCALE_SPLIT_ANGLE(1.57079637050629),
957 SCALE_SPLIT_ANGLE(1.57079637050629),
958 SCALE_SPLIT_ANGLE(1.57079637050629),
959 SCALE_SPLIT_ANGLE(1.57079637050629),
960 SCALE_SPLIT_ANGLE(1.57079637050629),
961 SCALE_SPLIT_ANGLE(1.57079637050629)},
962 {SCALE_SPLIT_ANGLE(1.56514155864716),
963 SCALE_SPLIT_ANGLE(1.56514346599579),
964 SCALE_SPLIT_ANGLE(1.56514656543732),
965 SCALE_SPLIT_ANGLE(1.56515407562256),
966 SCALE_SPLIT_ANGLE(1.56516146659851),
967 SCALE_SPLIT_ANGLE(1.56517302989960),
968 SCALE_SPLIT_ANGLE(1.56519174575806),
969 SCALE_SPLIT_ANGLE(1.56520450115204)},
970 {SCALE_SPLIT_ANGLE(1.56069743633270),
971 SCALE_SPLIT_ANGLE(1.56070363521576),
972 SCALE_SPLIT_ANGLE(1.56071317195892),
973 SCALE_SPLIT_ANGLE(1.56073689460754),
974 SCALE_SPLIT_ANGLE(1.56076002120972),
975 SCALE_SPLIT_ANGLE(1.56079673767090),
976 SCALE_SPLIT_ANGLE(1.56085586547852),
977 SCALE_SPLIT_ANGLE(1.56089639663696)},
978 {SCALE_SPLIT_ANGLE(1.55270349979401),
979 SCALE_SPLIT_ANGLE(1.55272293090820),
980 SCALE_SPLIT_ANGLE(1.55275249481201),
981 SCALE_SPLIT_ANGLE(1.55282700061798),
982 SCALE_SPLIT_ANGLE(1.55289983749390),
983 SCALE_SPLIT_ANGLE(1.55301547050476),
984 SCALE_SPLIT_ANGLE(1.55320310592651),
985 SCALE_SPLIT_ANGLE(1.55333256721497)},
986 {SCALE_SPLIT_ANGLE(1.53820896148682),
987 SCALE_SPLIT_ANGLE(1.53826904296875),
988 SCALE_SPLIT_ANGLE(1.53836083412170),
989 SCALE_SPLIT_ANGLE(1.53859281539917),
990 SCALE_SPLIT_ANGLE(1.53882038593292),
991 SCALE_SPLIT_ANGLE(1.53918409347534),
992 SCALE_SPLIT_ANGLE(1.53978037834167),
993 SCALE_SPLIT_ANGLE(1.54019629955292)},
994 {SCALE_SPLIT_ANGLE(1.51160359382629),
995 SCALE_SPLIT_ANGLE(1.51178681850433),
996 SCALE_SPLIT_ANGLE(1.51206707954407),
997 SCALE_SPLIT_ANGLE(1.51277923583984),
998 SCALE_SPLIT_ANGLE(1.51348364353180),
999 SCALE_SPLIT_ANGLE(1.51462137699127),
1000 SCALE_SPLIT_ANGLE(1.51652014255524),
1001 SCALE_SPLIT_ANGLE(1.51787149906158)},
1002 {SCALE_SPLIT_ANGLE(1.48564028739929),
1003 SCALE_SPLIT_ANGLE(1.48599278926849),
1004 SCALE_SPLIT_ANGLE(1.48653328418732),
1005 SCALE_SPLIT_ANGLE(1.48791313171387),
1006 SCALE_SPLIT_ANGLE(1.48928797245026),
1007 SCALE_SPLIT_ANGLE(1.49152994155884),
1008 SCALE_SPLIT_ANGLE(1.49533641338348),
1009 SCALE_SPLIT_ANGLE(1.49810016155243)},
1010 {SCALE_SPLIT_ANGLE(1.44770443439484),
1011 SCALE_SPLIT_ANGLE(1.44837117195129),
1012 SCALE_SPLIT_ANGLE(1.44939684867859),
1013 SCALE_SPLIT_ANGLE(1.45203149318695),
1014 SCALE_SPLIT_ANGLE(1.45468175411224),
1015 SCALE_SPLIT_ANGLE(1.45906186103821),
1016 SCALE_SPLIT_ANGLE(1.46668362617493),
1017 SCALE_SPLIT_ANGLE(1.47238755226135)},
1018 {SCALE_SPLIT_ANGLE(1.39214622974396),
1019 SCALE_SPLIT_ANGLE(1.39337480068207),
1020 SCALE_SPLIT_ANGLE(1.39527153968811),
1021 SCALE_SPLIT_ANGLE(1.40018463134766),
1022 SCALE_SPLIT_ANGLE(1.40518975257874),
1023 SCALE_SPLIT_ANGLE(1.41361439228058),
1024 SCALE_SPLIT_ANGLE(1.42880713939667),
1025 SCALE_SPLIT_ANGLE(1.44072246551514)},
1026 {SCALE_SPLIT_ANGLE(1.31133699417114),
1027 SCALE_SPLIT_ANGLE(1.31350564956665),
1028 SCALE_SPLIT_ANGLE(1.31686961650848),
1029 SCALE_SPLIT_ANGLE(1.32567906379700),
1030 SCALE_SPLIT_ANGLE(1.33480501174927),
1031 SCALE_SPLIT_ANGLE(1.35055577754974),
1032 SCALE_SPLIT_ANGLE(1.38048458099365),
1033 SCALE_SPLIT_ANGLE(1.40579915046692)},
1034 {SCALE_SPLIT_ANGLE(1.19695901870728),
1035 SCALE_SPLIT_ANGLE(1.20052528381348),
1036 SCALE_SPLIT_ANGLE(1.20609176158905),
1037 SCALE_SPLIT_ANGLE(1.22087836265564),
1038 SCALE_SPLIT_ANGLE(1.23654139041901),
1039 SCALE_SPLIT_ANGLE(1.26451897621155),
1040 SCALE_SPLIT_ANGLE(1.32194638252258),
1041 SCALE_SPLIT_ANGLE(1.37709856033325)},
1042 {SCALE_SPLIT_ANGLE(1.09969496726990),
1043 SCALE_SPLIT_ANGLE(1.10437381267548),
1044 SCALE_SPLIT_ANGLE(1.11171460151672),
1045 SCALE_SPLIT_ANGLE(1.13144767284393),
1046 SCALE_SPLIT_ANGLE(1.15274536609650),
1047 SCALE_SPLIT_ANGLE(1.19192278385162),
1048 SCALE_SPLIT_ANGLE(1.27820122241974),
1049 SCALE_SPLIT_ANGLE(1.37287366390228)},
1050 {SCALE_SPLIT_ANGLE(0.98739641904831),
1051 SCALE_SPLIT_ANGLE(0.99314504861832),
1052 SCALE_SPLIT_ANGLE(1.00221848487854),
1053 SCALE_SPLIT_ANGLE(1.02694928646088),
1054 SCALE_SPLIT_ANGLE(1.05423069000244),
1055 SCALE_SPLIT_ANGLE(1.10619938373566),
1056 SCALE_SPLIT_ANGLE(1.23116791248322),
1057 SCALE_SPLIT_ANGLE(1.39771795272827)},
1058 {SCALE_SPLIT_ANGLE(0.86566168069839),
1059 SCALE_SPLIT_ANGLE(0.87219274044037),
1060 SCALE_SPLIT_ANGLE(0.88256764411926),
1061 SCALE_SPLIT_ANGLE(0.91127204895020),
1062 SCALE_SPLIT_ANGLE(0.94370108842850),
1063 SCALE_SPLIT_ANGLE(1.00792455673218),
1064 SCALE_SPLIT_ANGLE(1.17914211750031),
1065 SCALE_SPLIT_ANGLE(1.48121190071106)},
1066 {SCALE_SPLIT_ANGLE(0.74293035268784),
1067 SCALE_SPLIT_ANGLE(0.74975663423538),
1068 SCALE_SPLIT_ANGLE(0.76066619157791),
1069 SCALE_SPLIT_ANGLE(0.79128372669220),
1070 SCALE_SPLIT_ANGLE(0.82667875289917),
1071 SCALE_SPLIT_ANGLE(0.89952337741852),
1072 SCALE_SPLIT_ANGLE(1.11571300029755),
1073 SCALE_SPLIT_ANGLE(1.67431199550629)},
1074 {SCALE_SPLIT_ANGLE(0.62761706113815),
1075 SCALE_SPLIT_ANGLE(0.63421267271042),
1076 SCALE_SPLIT_ANGLE(0.64480352401733),
1077 SCALE_SPLIT_ANGLE(0.67486244440079),
1078 SCALE_SPLIT_ANGLE(0.71025311946869),
1079 SCALE_SPLIT_ANGLE(0.78539818525314),
1080 SCALE_SPLIT_ANGLE(1.02937340736389),
1081 SCALE_SPLIT_ANGLE(1.92301487922668)},
1082 {SCALE_SPLIT_ANGLE(0.52522456645966),
1083 SCALE_SPLIT_ANGLE(0.53118568658829),
1084 SCALE_SPLIT_ANGLE(0.54078328609467),
1085 SCALE_SPLIT_ANGLE(0.56819748878479),
1086 SCALE_SPLIT_ANGLE(0.60080903768539),
1087 SCALE_SPLIT_ANGLE(0.67127299308777),
1088 SCALE_SPLIT_ANGLE(0.91114157438278),
1089 SCALE_SPLIT_ANGLE(1.73398244380951)},
1090 {SCALE_SPLIT_ANGLE(0.43751955032349),
1091 SCALE_SPLIT_ANGLE(0.44262495636940),
1092 SCALE_SPLIT_ANGLE(0.45084837079048),
1093 SCALE_SPLIT_ANGLE(0.47435709834099),
1094 SCALE_SPLIT_ANGLE(0.50235128402710),
1095 SCALE_SPLIT_ANGLE(0.56287181377411),
1096 SCALE_SPLIT_ANGLE(0.76705121994019),
1097 SCALE_SPLIT_ANGLE(1.34888231754303)},
1098 {SCALE_SPLIT_ANGLE(0.36364197731018),
1099 SCALE_SPLIT_ANGLE(0.36782836914063),
1100 SCALE_SPLIT_ANGLE(0.37456014752388),
1101 SCALE_SPLIT_ANGLE(0.39372295141220),
1102 SCALE_SPLIT_ANGLE(0.41636970639229),
1103 SCALE_SPLIT_ANGLE(0.46459695696831),
1104 SCALE_SPLIT_ANGLE(0.61803084611893),
1105 SCALE_SPLIT_ANGLE(0.96275907754898)},
1106 {SCALE_SPLIT_ANGLE(0.30166232585907),
1107 SCALE_SPLIT_ANGLE(0.30497136712074),
1108 SCALE_SPLIT_ANGLE(0.31027451157570),
1109 SCALE_SPLIT_ANGLE(0.32524627447128),
1110 SCALE_SPLIT_ANGLE(0.34269109368324),
1111 SCALE_SPLIT_ANGLE(0.37887358665466),
1112 SCALE_SPLIT_ANGLE(0.48432540893555),
1113 SCALE_SPLIT_ANGLE(0.66878592967987)},
1114 {SCALE_SPLIT_ANGLE(0.24960109591484),
1115 SCALE_SPLIT_ANGLE(0.25213342905045),
1116 SCALE_SPLIT_ANGLE(0.25617361068726),
1117 SCALE_SPLIT_ANGLE(0.26745575666428),
1118 SCALE_SPLIT_ANGLE(0.28036275506020),
1119 SCALE_SPLIT_ANGLE(0.30627736449242),
1120 SCALE_SPLIT_ANGLE(0.37490701675415),
1121 SCALE_SPLIT_ANGLE(0.47145301103592)},
1122 {SCALE_SPLIT_ANGLE(0.18661488592625),
1123 SCALE_SPLIT_ANGLE(0.18822197616100),
1124 SCALE_SPLIT_ANGLE(0.19076596200466),
1125 SCALE_SPLIT_ANGLE(0.19773863255978),
1126 SCALE_SPLIT_ANGLE(0.20547652244568),
1127 SCALE_SPLIT_ANGLE(0.22024063766003),
1128 SCALE_SPLIT_ANGLE(0.25452125072479),
1129 SCALE_SPLIT_ANGLE(0.29236793518066)},
1130 {SCALE_SPLIT_ANGLE(0.13821771740913),
1131 SCALE_SPLIT_ANGLE(0.13918289542198),
1132 SCALE_SPLIT_ANGLE(0.14069861173630),
1133 SCALE_SPLIT_ANGLE(0.14477686583996),
1134 SCALE_SPLIT_ANGLE(0.14917233586311),
1135 SCALE_SPLIT_ANGLE(0.15718193352222),
1136 SCALE_SPLIT_ANGLE(0.17394064366817),
1137 SCALE_SPLIT_ANGLE(0.18971265852451)},
1138 {SCALE_SPLIT_ANGLE(0.10140904784203),
1139 SCALE_SPLIT_ANGLE(0.10196315497160),
1140 SCALE_SPLIT_ANGLE(0.10282710194588),
1141 SCALE_SPLIT_ANGLE(0.10511382669210),
1142 SCALE_SPLIT_ANGLE(0.10751703381538),
1143 SCALE_SPLIT_ANGLE(0.11173453181982),
1144 SCALE_SPLIT_ANGLE(0.11990433931351),
1145 SCALE_SPLIT_ANGLE(0.12683042883873)},
1146 {SCALE_SPLIT_ANGLE(0.07378087192774),
1147 SCALE_SPLIT_ANGLE(0.07408788800240),
1148 SCALE_SPLIT_ANGLE(0.07456368207932),
1149 SCALE_SPLIT_ANGLE(0.07580613344908),
1150 SCALE_SPLIT_ANGLE(0.07708553224802),
1151 SCALE_SPLIT_ANGLE(0.07926639169455),
1152 SCALE_SPLIT_ANGLE(0.08326309919357),
1153 SCALE_SPLIT_ANGLE(0.08642497658730)},
1154 {SCALE_SPLIT_ANGLE(0.05331044271588),
1155 SCALE_SPLIT_ANGLE(0.05347600579262),
1156 SCALE_SPLIT_ANGLE(0.05373133346438),
1157 SCALE_SPLIT_ANGLE(0.05439101532102),
1158 SCALE_SPLIT_ANGLE(0.05505970120430),
1159 SCALE_SPLIT_ANGLE(0.05617496743798),
1160 SCALE_SPLIT_ANGLE(0.05813983827829),
1161 SCALE_SPLIT_ANGLE(0.05962376296520)},
1162 {SCALE_SPLIT_ANGLE(0.03066622652113),
1163 SCALE_SPLIT_ANGLE(0.03072291985154),
1164 SCALE_SPLIT_ANGLE(0.03080986253917),
1165 SCALE_SPLIT_ANGLE(0.03103173524141),
1166 SCALE_SPLIT_ANGLE(0.03125262632966),
1167 SCALE_SPLIT_ANGLE(0.03161224350333),
1168 SCALE_SPLIT_ANGLE(0.03221991285682),
1169 SCALE_SPLIT_ANGLE(0.03265778720379)},
1170 {SCALE_SPLIT_ANGLE(0.01747439615428),
1171 SCALE_SPLIT_ANGLE(0.01749316416681),
1172 SCALE_SPLIT_ANGLE(0.01752184517682),
1173 SCALE_SPLIT_ANGLE(0.01759449020028),
1174 SCALE_SPLIT_ANGLE(0.01766604930162),
1175 SCALE_SPLIT_ANGLE(0.01778092049062),
1176 SCALE_SPLIT_ANGLE(0.01797054335475),
1177 SCALE_SPLIT_ANGLE(0.01810375973582)},
1178 {SCALE_SPLIT_ANGLE(0.00990140344948),
1179 SCALE_SPLIT_ANGLE(0.00990749336779),
1180 SCALE_SPLIT_ANGLE(0.00991678331047),
1181 SCALE_SPLIT_ANGLE(0.00994021166116),
1182 SCALE_SPLIT_ANGLE(0.00996314454824),
1183 SCALE_SPLIT_ANGLE(0.00999966636300),
1184 SCALE_SPLIT_ANGLE(0.01005917042494),
1185 SCALE_SPLIT_ANGLE(0.01010039448738)},
1186 {SCALE_SPLIT_ANGLE(0.00559204118326),
1187 SCALE_SPLIT_ANGLE(0.00559399509802),
1188 SCALE_SPLIT_ANGLE(0.00559697346762),
1189 SCALE_SPLIT_ANGLE(0.00560446362942),
1190 SCALE_SPLIT_ANGLE(0.00561177125201),
1191 SCALE_SPLIT_ANGLE(0.00562335411087),
1192 SCALE_SPLIT_ANGLE(0.00564208766446),
1193 SCALE_SPLIT_ANGLE(0.00565496599302)},
1194 {SCALE_SPLIT_ANGLE(0.00000003162278),
1195 SCALE_SPLIT_ANGLE(0.00000003162278),
1196 SCALE_SPLIT_ANGLE(0.00000003162278),
1197 SCALE_SPLIT_ANGLE(0.00000003162278),
1198 SCALE_SPLIT_ANGLE(0.00000003162278),
1199 SCALE_SPLIT_ANGLE(0.00000003162278),
1200 SCALE_SPLIT_ANGLE(0.00000003162278),
1201 SCALE_SPLIT_ANGLE(0.00000003162278)},
1202 },
1203 {
1204 {SCALE_SPLIT_ANGLE(1.96349537372589),
1205 SCALE_SPLIT_ANGLE(1.96349537372589),
1206 SCALE_SPLIT_ANGLE(1.96349537372589),
1207 SCALE_SPLIT_ANGLE(1.96349537372589),
1208 SCALE_SPLIT_ANGLE(1.96349537372589),
1209 SCALE_SPLIT_ANGLE(1.96349537372589),
1210 SCALE_SPLIT_ANGLE(1.96349537372589),
1211 SCALE_SPLIT_ANGLE(1.96349537372589)},
1212 {SCALE_SPLIT_ANGLE(1.95824837684631),
1213 SCALE_SPLIT_ANGLE(1.95825088024139),
1214 SCALE_SPLIT_ANGLE(1.95825481414795),
1215 SCALE_SPLIT_ANGLE(1.95826447010040),
1216 SCALE_SPLIT_ANGLE(1.95827388763428),
1217 SCALE_SPLIT_ANGLE(1.95828890800476),
1218 SCALE_SPLIT_ANGLE(1.95831274986267),
1219 SCALE_SPLIT_ANGLE(1.95832908153534)},
1220 {SCALE_SPLIT_ANGLE(1.95409297943115),
1221 SCALE_SPLIT_ANGLE(1.95410108566284),
1222 SCALE_SPLIT_ANGLE(1.95411336421967),
1223 SCALE_SPLIT_ANGLE(1.95414412021637),
1224 SCALE_SPLIT_ANGLE(1.95417404174805),
1225 SCALE_SPLIT_ANGLE(1.95422136783600),
1226 SCALE_SPLIT_ANGLE(1.95429730415344),
1227 SCALE_SPLIT_ANGLE(1.95434916019440)},
1228 {SCALE_SPLIT_ANGLE(1.94654774665833),
1229 SCALE_SPLIT_ANGLE(1.94657325744629),
1230 SCALE_SPLIT_ANGLE(1.94661211967468),
1231 SCALE_SPLIT_ANGLE(1.94670987129211),
1232 SCALE_SPLIT_ANGLE(1.94680488109589),
1233 SCALE_SPLIT_ANGLE(1.94695508480072),
1234 SCALE_SPLIT_ANGLE(1.94719684123993),
1235 SCALE_SPLIT_ANGLE(1.94736230373383)},
1236 {SCALE_SPLIT_ANGLE(1.93263375759125),
1237 SCALE_SPLIT_ANGLE(1.93271493911743),
1238 SCALE_SPLIT_ANGLE(1.93283843994141),
1239 SCALE_SPLIT_ANGLE(1.93314898014069),
1240 SCALE_SPLIT_ANGLE(1.93345153331757),
1241 SCALE_SPLIT_ANGLE(1.93393051624298),
1242 SCALE_SPLIT_ANGLE(1.93470382690430),
1243 SCALE_SPLIT_ANGLE(1.93523514270782)},
1244 {SCALE_SPLIT_ANGLE(1.90630435943604),
1245 SCALE_SPLIT_ANGLE(1.90656292438507),
1246 SCALE_SPLIT_ANGLE(1.90695691108704),
1247 SCALE_SPLIT_ANGLE(1.90794765949249),
1248 SCALE_SPLIT_ANGLE(1.90891444683075),
1249 SCALE_SPLIT_ANGLE(1.91044902801514),
1250 SCALE_SPLIT_ANGLE(1.91294109821320),
1251 SCALE_SPLIT_ANGLE(1.91466653347015)},
1252 {SCALE_SPLIT_ANGLE(1.87960743904114),
1253 SCALE_SPLIT_ANGLE(1.88012742996216),
1254 SCALE_SPLIT_ANGLE(1.88091933727264),
1255 SCALE_SPLIT_ANGLE(1.88291192054749),
1256 SCALE_SPLIT_ANGLE(1.88485777378082),
1257 SCALE_SPLIT_ANGLE(1.88795232772827),
1258 SCALE_SPLIT_ANGLE(1.89300394058228),
1259 SCALE_SPLIT_ANGLE(1.89652991294861)},
1260 {SCALE_SPLIT_ANGLE(1.83877396583557),
1261 SCALE_SPLIT_ANGLE(1.83982229232788),
1262 SCALE_SPLIT_ANGLE(1.84141862392426),
1263 SCALE_SPLIT_ANGLE(1.84543347358704),
1264 SCALE_SPLIT_ANGLE(1.84935534000397),
1265 SCALE_SPLIT_ANGLE(1.85560429096222),
1266 SCALE_SPLIT_ANGLE(1.86587727069855),
1267 SCALE_SPLIT_ANGLE(1.87314081192017)},
1268 {SCALE_SPLIT_ANGLE(1.77493417263031),
1269 SCALE_SPLIT_ANGLE(1.77705264091492),
1270 SCALE_SPLIT_ANGLE(1.78027474880219),
1271 SCALE_SPLIT_ANGLE(1.78836548328400),
1272 SCALE_SPLIT_ANGLE(1.79626095294952),
1273 SCALE_SPLIT_ANGLE(1.80886054039001),
1274 SCALE_SPLIT_ANGLE(1.82978034019470),
1275 SCALE_SPLIT_ANGLE(1.84489548206329)},
1276 {SCALE_SPLIT_ANGLE(1.67321813106537),
1277 SCALE_SPLIT_ANGLE(1.67747652530670),
1278 SCALE_SPLIT_ANGLE(1.68394017219543),
1279 SCALE_SPLIT_ANGLE(1.70011746883392),
1280 SCALE_SPLIT_ANGLE(1.71586501598358),
1281 SCALE_SPLIT_ANGLE(1.74102878570557),
1282 SCALE_SPLIT_ANGLE(1.78345441818237),
1283 SCALE_SPLIT_ANGLE(1.81531298160553)},
1284 {SCALE_SPLIT_ANGLE(1.51132118701935),
1285 SCALE_SPLIT_ANGLE(1.51959395408630),
1286 SCALE_SPLIT_ANGLE(1.53212559223175),
1287 SCALE_SPLIT_ANGLE(1.56339788436890),
1288 SCALE_SPLIT_ANGLE(1.59380054473877),
1289 SCALE_SPLIT_ANGLE(1.64260375499725),
1290 SCALE_SPLIT_ANGLE(1.72719120979309),
1291 SCALE_SPLIT_ANGLE(1.79549276828766)},
1292 {SCALE_SPLIT_ANGLE(1.35904061794281),
1293 SCALE_SPLIT_ANGLE(1.37121617794037),
1294 SCALE_SPLIT_ANGLE(1.38967239856720),
1295 SCALE_SPLIT_ANGLE(1.43583393096924),
1296 SCALE_SPLIT_ANGLE(1.48093688488007),
1297 SCALE_SPLIT_ANGLE(1.55410325527191),
1298 SCALE_SPLIT_ANGLE(1.68521773815155),
1299 SCALE_SPLIT_ANGLE(1.80024886131287)},
1300 {SCALE_SPLIT_ANGLE(1.17258906364441),
1301 SCALE_SPLIT_ANGLE(1.18893885612488),
1302 SCALE_SPLIT_ANGLE(1.21383893489838),
1303 SCALE_SPLIT_ANGLE(1.27678310871124),
1304 SCALE_SPLIT_ANGLE(1.33930420875549),
1305 SCALE_SPLIT_ANGLE(1.44322526454926),
1306 SCALE_SPLIT_ANGLE(1.64006817340851),
1307 SCALE_SPLIT_ANGLE(1.83627605438232)},
1308 {SCALE_SPLIT_ANGLE(0.96933782100677),
1309 SCALE_SPLIT_ANGLE(0.98854482173920),
1310 SCALE_SPLIT_ANGLE(1.01807177066803),
1311 SCALE_SPLIT_ANGLE(1.09429967403412),
1312 SCALE_SPLIT_ANGLE(1.17245352268219),
1313 SCALE_SPLIT_ANGLE(1.30826878547668),
1314 SCALE_SPLIT_ANGLE(1.58911180496216),
1315 SCALE_SPLIT_ANGLE(1.92719435691834)},
1316 {SCALE_SPLIT_ANGLE(0.77729862928391),
1317 SCALE_SPLIT_ANGLE(0.79675698280334),
1318 SCALE_SPLIT_ANGLE(0.82701611518860),
1319 SCALE_SPLIT_ANGLE(0.90724968910217),
1320 SCALE_SPLIT_ANGLE(0.99302649497986),
1321 SCALE_SPLIT_ANGLE(1.15163993835449),
1322 SCALE_SPLIT_ANGLE(1.52265202999115),
1323 SCALE_SPLIT_ANGLE(2.09869623184204)},
1324 {SCALE_SPLIT_ANGLE(0.61765128374100),
1325 SCALE_SPLIT_ANGLE(0.63503885269165),
1326 SCALE_SPLIT_ANGLE(0.66235077381134),
1327 SCALE_SPLIT_ANGLE(0.73653638362885),
1328 SCALE_SPLIT_ANGLE(0.81904613971710),
1329 SCALE_SPLIT_ANGLE(0.98174768686295),
1330 SCALE_SPLIT_ANGLE(1.42110538482666),
1331 SCALE_SPLIT_ANGLE(2.28386068344116)},
1332 {SCALE_SPLIT_ANGLE(0.49486333131790),
1333 SCALE_SPLIT_ANGLE(0.50909578800201),
1334 SCALE_SPLIT_ANGLE(0.53160983324051),
1335 SCALE_SPLIT_ANGLE(0.59379214048386),
1336 SCALE_SPLIT_ANGLE(0.66487491130829),
1337 SCALE_SPLIT_ANGLE(0.81185549497604),
1338 SCALE_SPLIT_ANGLE(1.26233386993408),
1339 SCALE_SPLIT_ANGLE(2.16925764083862)},
1340 {SCALE_SPLIT_ANGLE(0.40230560302734),
1341 SCALE_SPLIT_ANGLE(0.41332274675369),
1342 SCALE_SPLIT_ANGLE(0.43082228302956),
1343 SCALE_SPLIT_ANGLE(0.47957953810692),
1344 SCALE_SPLIT_ANGLE(0.53603589534760),
1345 SCALE_SPLIT_ANGLE(0.65522658824921),
1346 SCALE_SPLIT_ANGLE(1.04503858089447),
1347 SCALE_SPLIT_ANGLE(1.87041807174683)},
1348 {SCALE_SPLIT_ANGLE(0.33104607462883),
1349 SCALE_SPLIT_ANGLE(0.33927726745605),
1350 SCALE_SPLIT_ANGLE(0.35237133502960),
1351 SCALE_SPLIT_ANGLE(0.38892474770546),
1352 SCALE_SPLIT_ANGLE(0.43126159906387),
1353 SCALE_SPLIT_ANGLE(0.52027010917664),
1354 SCALE_SPLIT_ANGLE(0.80654186010361),
1355 SCALE_SPLIT_ANGLE(1.41960310935974)},
1356 {SCALE_SPLIT_ANGLE(0.27415537834167),
1357 SCALE_SPLIT_ANGLE(0.28015670180321),
1358 SCALE_SPLIT_ANGLE(0.28969678282738),
1359 SCALE_SPLIT_ANGLE(0.31623730063438),
1360 SCALE_SPLIT_ANGLE(0.34670370817184),
1361 SCALE_SPLIT_ANGLE(0.40939208865166),
1362 SCALE_SPLIT_ANGLE(0.59604310989380),
1363 SCALE_SPLIT_ANGLE(0.94309806823730)},
1364 {SCALE_SPLIT_ANGLE(0.22730343043804),
1365 SCALE_SPLIT_ANGLE(0.23159568011761),
1366 SCALE_SPLIT_ANGLE(0.23840220272541),
1367 SCALE_SPLIT_ANGLE(0.25720024108887),
1368 SCALE_SPLIT_ANGLE(0.27846288681030),
1369 SCALE_SPLIT_ANGLE(0.32089167833328),
1370 SCALE_SPLIT_ANGLE(0.43515858054161),
1371 SCALE_SPLIT_ANGLE(0.60621982812881)},
1372 {SCALE_SPLIT_ANGLE(0.17074465751648),
1373 SCALE_SPLIT_ANGLE(0.17326098680496),
1374 SCALE_SPLIT_ANGLE(0.17722852528095),
1375 SCALE_SPLIT_ANGLE(0.18802370131016),
1376 SCALE_SPLIT_ANGLE(0.19990929961205),
1377 SCALE_SPLIT_ANGLE(0.22246663272381),
1378 SCALE_SPLIT_ANGLE(0.27514943480492),
1379 SCALE_SPLIT_ANGLE(0.33505329489708)},
1380 {SCALE_SPLIT_ANGLE(0.12695817649364),
1381 SCALE_SPLIT_ANGLE(0.12838459014893),
1382 SCALE_SPLIT_ANGLE(0.13061878085136),
1383 SCALE_SPLIT_ANGLE(0.13660037517548),
1384 SCALE_SPLIT_ANGLE(0.14301040768623),
1385 SCALE_SPLIT_ANGLE(0.15463486313820),
1386 SCALE_SPLIT_ANGLE(0.17893929779530),
1387 SCALE_SPLIT_ANGLE(0.20203559100628)},
1388 {SCALE_SPLIT_ANGLE(0.09338590502739),
1389 SCALE_SPLIT_ANGLE(0.09417138993740),
1390 SCALE_SPLIT_ANGLE(0.09539390355349),
1391 SCALE_SPLIT_ANGLE(0.09861853718758),
1392 SCALE_SPLIT_ANGLE(0.10199318081141),
1393 SCALE_SPLIT_ANGLE(0.10789106786251),
1394 SCALE_SPLIT_ANGLE(0.11927830427885),
1395 SCALE_SPLIT_ANGLE(0.12894381582737)},
1396 {SCALE_SPLIT_ANGLE(0.06804535537958),
1397 SCALE_SPLIT_ANGLE(0.06846775114536),
1398 SCALE_SPLIT_ANGLE(0.06912153959274),
1399 SCALE_SPLIT_ANGLE(0.07082461565733),
1400 SCALE_SPLIT_ANGLE(0.07257289439440),
1401 SCALE_SPLIT_ANGLE(0.07554303854704),
1402 SCALE_SPLIT_ANGLE(0.08096561580896),
1403 SCALE_SPLIT_ANGLE(0.08524779230356)},
1404 {SCALE_SPLIT_ANGLE(0.04920704290271),
1405 SCALE_SPLIT_ANGLE(0.04942999407649),
1406 SCALE_SPLIT_ANGLE(0.04977354034781),
1407 SCALE_SPLIT_ANGLE(0.05065960064530),
1408 SCALE_SPLIT_ANGLE(0.05155571550131),
1409 SCALE_SPLIT_ANGLE(0.05304637551308),
1410 SCALE_SPLIT_ANGLE(0.05566369369626),
1411 SCALE_SPLIT_ANGLE(0.05763531476259)},
1412 {SCALE_SPLIT_ANGLE(0.02832321822643),
1413 SCALE_SPLIT_ANGLE(0.02839783765376),
1414 SCALE_SPLIT_ANGLE(0.02851220779121),
1415 SCALE_SPLIT_ANGLE(0.02880378998816),
1416 SCALE_SPLIT_ANGLE(0.02909369394183),
1417 SCALE_SPLIT_ANGLE(0.02956490404904),
1418 SCALE_SPLIT_ANGLE(0.03035926818848),
1419 SCALE_SPLIT_ANGLE(0.03093044832349)},
1420 {SCALE_SPLIT_ANGLE(0.01614263281226),
1421 SCALE_SPLIT_ANGLE(0.01616701297462),
1422 SCALE_SPLIT_ANGLE(0.01620426215231),
1423 SCALE_SPLIT_ANGLE(0.01629856042564),
1424 SCALE_SPLIT_ANGLE(0.01639137230814),
1425 SCALE_SPLIT_ANGLE(0.01654022186995),
1426 SCALE_SPLIT_ANGLE(0.01678557507694),
1427 SCALE_SPLIT_ANGLE(0.01695770025253)},
1428 {SCALE_SPLIT_ANGLE(0.00914741214365),
1429 SCALE_SPLIT_ANGLE(0.00915526598692),
1430 SCALE_SPLIT_ANGLE(0.00916724558920),
1431 SCALE_SPLIT_ANGLE(0.00919744372368),
1432 SCALE_SPLIT_ANGLE(0.00922699086368),
1433 SCALE_SPLIT_ANGLE(0.00927402079105),
1434 SCALE_SPLIT_ANGLE(0.00935057550669),
1435 SCALE_SPLIT_ANGLE(0.00940357148647)},
1436 {SCALE_SPLIT_ANGLE(0.00516631966457),
1437 SCALE_SPLIT_ANGLE(0.00516883004457),
1438 SCALE_SPLIT_ANGLE(0.00517265405506),
1439 SCALE_SPLIT_ANGLE(0.00518227089196),
1440 SCALE_SPLIT_ANGLE(0.00519165024161),
1441 SCALE_SPLIT_ANGLE(0.00520651414990),
1442 SCALE_SPLIT_ANGLE(0.00523054087535),
1443 SCALE_SPLIT_ANGLE(0.00524705136195)},
1444 {SCALE_SPLIT_ANGLE(0.00000002921564),
1445 SCALE_SPLIT_ANGLE(0.00000002921564),
1446 SCALE_SPLIT_ANGLE(0.00000002921564),
1447 SCALE_SPLIT_ANGLE(0.00000002921564),
1448 SCALE_SPLIT_ANGLE(0.00000002921564),
1449 SCALE_SPLIT_ANGLE(0.00000002921564),
1450 SCALE_SPLIT_ANGLE(0.00000002921564),
1451 SCALE_SPLIT_ANGLE(0.00000002921564)},
1452 },
1453 {
1454 {SCALE_SPLIT_ANGLE(2.35619449615479),
1455 SCALE_SPLIT_ANGLE(2.35619449615479),
1456 SCALE_SPLIT_ANGLE(2.35619449615479),
1457 SCALE_SPLIT_ANGLE(2.35619449615479),
1458 SCALE_SPLIT_ANGLE(2.35619449615479),
1459 SCALE_SPLIT_ANGLE(2.35619449615479),
1460 SCALE_SPLIT_ANGLE(2.35619449615479),
1461 SCALE_SPLIT_ANGLE(2.35619449615479)},
1462 {SCALE_SPLIT_ANGLE(2.35216379165649),
1463 SCALE_SPLIT_ANGLE(2.35216617584229),
1464 SCALE_SPLIT_ANGLE(2.35216999053955),
1465 SCALE_SPLIT_ANGLE(2.35217905044556),
1466 SCALE_SPLIT_ANGLE(2.35218811035156),
1467 SCALE_SPLIT_ANGLE(2.35220217704773),
1468 SCALE_SPLIT_ANGLE(2.35222482681274),
1469 SCALE_SPLIT_ANGLE(2.35224032402039)},
1470 {SCALE_SPLIT_ANGLE(2.34895062446594),
1471 SCALE_SPLIT_ANGLE(2.34895825386047),
1472 SCALE_SPLIT_ANGLE(2.34897017478943),
1473 SCALE_SPLIT_ANGLE(2.34899950027466),
1474 SCALE_SPLIT_ANGLE(2.34902811050415),
1475 SCALE_SPLIT_ANGLE(2.34907317161560),
1476 SCALE_SPLIT_ANGLE(2.34914517402649),
1477 SCALE_SPLIT_ANGLE(2.34919428825378)},
1478 {SCALE_SPLIT_ANGLE(2.34306812286377),
1479 SCALE_SPLIT_ANGLE(2.34309291839600),
1480 SCALE_SPLIT_ANGLE(2.34313082695007),
1481 SCALE_SPLIT_ANGLE(2.34322524070740),
1482 SCALE_SPLIT_ANGLE(2.34331679344177),
1483 SCALE_SPLIT_ANGLE(2.34346079826355),
1484 SCALE_SPLIT_ANGLE(2.34369087219238),
1485 SCALE_SPLIT_ANGLE(2.34384727478027)},
1486 {SCALE_SPLIT_ANGLE(2.33205723762512),
1487 SCALE_SPLIT_ANGLE(2.33213782310486),
1488 SCALE_SPLIT_ANGLE(2.33226013183594),
1489 SCALE_SPLIT_ANGLE(2.33256578445435),
1490 SCALE_SPLIT_ANGLE(2.33286166191101),
1491 SCALE_SPLIT_ANGLE(2.33332633972168),
1492 SCALE_SPLIT_ANGLE(2.33406686782837),
1493 SCALE_SPLIT_ANGLE(2.33456921577454)},
1494 {SCALE_SPLIT_ANGLE(2.31062912940979),
1495 SCALE_SPLIT_ANGLE(2.31089663505554),
1496 SCALE_SPLIT_ANGLE(2.31130218505859),
1497 SCALE_SPLIT_ANGLE(2.31231284141541),
1498 SCALE_SPLIT_ANGLE(2.31328654289246),
1499 SCALE_SPLIT_ANGLE(2.31480789184570),
1500 SCALE_SPLIT_ANGLE(2.31722092628479),
1501 SCALE_SPLIT_ANGLE(2.31885290145874)},
1502 {SCALE_SPLIT_ANGLE(2.28808355331421),
1503 SCALE_SPLIT_ANGLE(2.28864479064941),
1504 SCALE_SPLIT_ANGLE(2.28949403762817),
1505 SCALE_SPLIT_ANGLE(2.29160070419312),
1506 SCALE_SPLIT_ANGLE(2.29361891746521),
1507 SCALE_SPLIT_ANGLE(2.29675459861755),
1508 SCALE_SPLIT_ANGLE(2.30169844627380),
1509 SCALE_SPLIT_ANGLE(2.30503511428833)},
1510 {SCALE_SPLIT_ANGLE(2.25191521644592),
1511 SCALE_SPLIT_ANGLE(2.25312566757202),
1512 SCALE_SPLIT_ANGLE(2.25494909286499),
1513 SCALE_SPLIT_ANGLE(2.25943517684937),
1514 SCALE_SPLIT_ANGLE(2.26368880271912),
1515 SCALE_SPLIT_ANGLE(2.27023100852966),
1516 SCALE_SPLIT_ANGLE(2.28044486045837),
1517 SCALE_SPLIT_ANGLE(2.28732299804688)},
1518 {SCALE_SPLIT_ANGLE(2.19093585014343),
1519 SCALE_SPLIT_ANGLE(2.19366121292114),
1520 SCALE_SPLIT_ANGLE(2.19773292541504),
1521 SCALE_SPLIT_ANGLE(2.20759749412537),
1522 SCALE_SPLIT_ANGLE(2.21677780151367),
1523 SCALE_SPLIT_ANGLE(2.23064494132996),
1524 SCALE_SPLIT_ANGLE(2.25193929672241),
1525 SCALE_SPLIT_ANGLE(2.26625943183899)},
1526 {SCALE_SPLIT_ANGLE(2.08102917671204),
1527 SCALE_SPLIT_ANGLE(2.08757281303406),
1528 SCALE_SPLIT_ANGLE(2.09720706939697),
1529 SCALE_SPLIT_ANGLE(2.11991167068481),
1530 SCALE_SPLIT_ANGLE(2.14035654067993),
1531 SCALE_SPLIT_ANGLE(2.17029213905334),
1532 SCALE_SPLIT_ANGLE(2.21503138542175),
1533 SCALE_SPLIT_ANGLE(2.24518108367920)},
1534 {SCALE_SPLIT_ANGLE(1.86738610267639),
1535 SCALE_SPLIT_ANGLE(1.88426077365875),
1536 SCALE_SPLIT_ANGLE(1.90853273868561),
1537 SCALE_SPLIT_ANGLE(1.96333324909210),
1538 SCALE_SPLIT_ANGLE(2.01024460792542),
1539 SCALE_SPLIT_ANGLE(2.07577633857727),
1540 SCALE_SPLIT_ANGLE(2.16986608505249),
1541 SCALE_SPLIT_ANGLE(2.23406052589417)},
1542 {SCALE_SPLIT_ANGLE(1.61812174320221),
1543 SCALE_SPLIT_ANGLE(1.64943754673004),
1544 SCALE_SPLIT_ANGLE(1.69389235973358),
1545 SCALE_SPLIT_ANGLE(1.79176020622253),
1546 SCALE_SPLIT_ANGLE(1.87292492389679),
1547 SCALE_SPLIT_ANGLE(1.98277986049652),
1548 SCALE_SPLIT_ANGLE(2.13605809211731),
1549 SCALE_SPLIT_ANGLE(2.24282979965210)},
1550 {SCALE_SPLIT_ANGLE(1.26556181907654),
1551 SCALE_SPLIT_ANGLE(1.31512010097504),
1552 SCALE_SPLIT_ANGLE(1.38608694076538),
1553 SCALE_SPLIT_ANGLE(1.54419934749603),
1554 SCALE_SPLIT_ANGLE(1.67621040344238),
1555 SCALE_SPLIT_ANGLE(1.85417342185974),
1556 SCALE_SPLIT_ANGLE(2.09956336021423),
1557 SCALE_SPLIT_ANGLE(2.27729439735413)},
1558 {SCALE_SPLIT_ANGLE(0.88984864950180),
1559 SCALE_SPLIT_ANGLE(0.94673132896423),
1560 SCALE_SPLIT_ANGLE(1.03102219104767),
1561 SCALE_SPLIT_ANGLE(1.23219704627991),
1562 SCALE_SPLIT_ANGLE(1.41468584537506),
1563 SCALE_SPLIT_ANGLE(1.67807435989380),
1564 SCALE_SPLIT_ANGLE(2.05749273300171),
1565 SCALE_SPLIT_ANGLE(2.35138511657715)},
1566 {SCALE_SPLIT_ANGLE(0.60630625486374),
1567 SCALE_SPLIT_ANGLE(0.65551131963730),
1568 SCALE_SPLIT_ANGLE(0.73032128810883),
1569 SCALE_SPLIT_ANGLE(0.92225730419159),
1570 SCALE_SPLIT_ANGLE(1.11866605281830),
1571 SCALE_SPLIT_ANGLE(1.44806647300720),
1572 SCALE_SPLIT_ANGLE(1.99872636795044),
1573 SCALE_SPLIT_ANGLE(2.47302055358887)},
1574 {SCALE_SPLIT_ANGLE(0.43393731117249),
1575 SCALE_SPLIT_ANGLE(0.47099208831787),
1576 SCALE_SPLIT_ANGLE(0.52780759334564),
1577 SCALE_SPLIT_ANGLE(0.67895972728729),
1578 SCALE_SPLIT_ANGLE(0.84712409973145),
1579 SCALE_SPLIT_ANGLE(1.17809724807739),
1580 SCALE_SPLIT_ANGLE(1.89703977108002),
1581 SCALE_SPLIT_ANGLE(2.59155654907227)},
1582 {SCALE_SPLIT_ANGLE(0.33522719144821),
1583 SCALE_SPLIT_ANGLE(0.36133098602295),
1584 SCALE_SPLIT_ANGLE(0.40159517526627),
1585 SCALE_SPLIT_ANGLE(0.51039946079254),
1586 SCALE_SPLIT_ANGLE(0.63590413331985),
1587 SCALE_SPLIT_ANGLE(0.90812796354294),
1588 SCALE_SPLIT_ANGLE(1.70793557167053),
1589 SCALE_SPLIT_ANGLE(2.52852439880371)},
1590 {SCALE_SPLIT_ANGLE(0.27478924393654),
1591 SCALE_SPLIT_ANGLE(0.29251149296761),
1592 SCALE_SPLIT_ANGLE(0.32007756829262),
1593 SCALE_SPLIT_ANGLE(0.39531299471855),
1594 SCALE_SPLIT_ANGLE(0.48291319608688),
1595 SCALE_SPLIT_ANGLE(0.67812001705170),
1596 SCALE_SPLIT_ANGLE(1.39007341861725),
1597 SCALE_SPLIT_ANGLE(2.34402561187744)},
1598 {SCALE_SPLIT_ANGLE(0.23185738921165),
1599 SCALE_SPLIT_ANGLE(0.24370795488358),
1600 SCALE_SPLIT_ANGLE(0.26227980852127),
1601 SCALE_SPLIT_ANGLE(0.31327381730080),
1602 SCALE_SPLIT_ANGLE(0.37241828441620),
1603 SCALE_SPLIT_ANGLE(0.50202107429504),
1604 SCALE_SPLIT_ANGLE(0.99085599184036),
1605 SCALE_SPLIT_ANGLE(1.96553468704224)},
1606 {SCALE_SPLIT_ANGLE(0.19698308408260),
1607 SCALE_SPLIT_ANGLE(0.20488271117210),
1608 SCALE_SPLIT_ANGLE(0.21731524169445),
1609 SCALE_SPLIT_ANGLE(0.25148212909698),
1610 SCALE_SPLIT_ANGLE(0.29065516591072),
1611 SCALE_SPLIT_ANGLE(0.37341466546059),
1612 SCALE_SPLIT_ANGLE(0.65295964479446),
1613 SCALE_SPLIT_ANGLE(1.28865826129913)},
1614 {SCALE_SPLIT_ANGLE(0.16667704284191),
1615 SCALE_SPLIT_ANGLE(0.17194211483002),
1616 SCALE_SPLIT_ANGLE(0.18023577332497),
1617 SCALE_SPLIT_ANGLE(0.20293866097927),
1618 SCALE_SPLIT_ANGLE(0.22855134308338),
1619 SCALE_SPLIT_ANGLE(0.28041818737984),
1620 SCALE_SPLIT_ANGLE(0.43142420053482),
1621 SCALE_SPLIT_ANGLE(0.70030152797699)},
1622 {SCALE_SPLIT_ANGLE(0.12773877382278),
1623 SCALE_SPLIT_ANGLE(0.13059370219707),
1624 SCALE_SPLIT_ANGLE(0.13507819175720),
1625 SCALE_SPLIT_ANGLE(0.14721076190472),
1626 SCALE_SPLIT_ANGLE(0.16052412986755),
1627 SCALE_SPLIT_ANGLE(0.18590225279331),
1628 SCALE_SPLIT_ANGLE(0.24703904986382),
1629 SCALE_SPLIT_ANGLE(0.32153329253197)},
1630 {SCALE_SPLIT_ANGLE(0.09603263437748),
1631 SCALE_SPLIT_ANGLE(0.09756572544575),
1632 SCALE_SPLIT_ANGLE(0.09996145218611),
1633 SCALE_SPLIT_ANGLE(0.10635073482990),
1634 SCALE_SPLIT_ANGLE(0.11317526549101),
1635 SCALE_SPLIT_ANGLE(0.12554961442947),
1636 SCALE_SPLIT_ANGLE(0.15168419480324),
1637 SCALE_SPLIT_ANGLE(0.17713627219200)},
1638 {SCALE_SPLIT_ANGLE(0.07104731351137),
1639 SCALE_SPLIT_ANGLE(0.07186015695333),
1640 SCALE_SPLIT_ANGLE(0.07312334328890),
1641 SCALE_SPLIT_ANGLE(0.07644616067410),
1642 SCALE_SPLIT_ANGLE(0.07991369813681),
1643 SCALE_SPLIT_ANGLE(0.08596338331699),
1644 SCALE_SPLIT_ANGLE(0.09766443818808),
1645 SCALE_SPLIT_ANGLE(0.10767273604870)},
1646 {SCALE_SPLIT_ANGLE(0.05192205682397),
1647 SCALE_SPLIT_ANGLE(0.05234766751528),
1648 SCALE_SPLIT_ANGLE(0.05300576984882),
1649 SCALE_SPLIT_ANGLE(0.05471667647362),
1650 SCALE_SPLIT_ANGLE(0.05646898597479),
1651 SCALE_SPLIT_ANGLE(0.05943991243839),
1652 SCALE_SPLIT_ANGLE(0.06485754251480),
1653 SCALE_SPLIT_ANGLE(0.06914159655571)},
1654 {SCALE_SPLIT_ANGLE(0.03760399296880),
1655 SCALE_SPLIT_ANGLE(0.03782445564866),
1656 SCALE_SPLIT_ANGLE(0.03816393017769),
1657 SCALE_SPLIT_ANGLE(0.03903824463487),
1658 SCALE_SPLIT_ANGLE(0.03992090374231),
1659 SCALE_SPLIT_ANGLE(0.04138650372624),
1660 SCALE_SPLIT_ANGLE(0.04395476728678),
1661 SCALE_SPLIT_ANGLE(0.04588782787323)},
1662 {SCALE_SPLIT_ANGLE(0.02166714705527),
1663 SCALE_SPLIT_ANGLE(0.02173948101699),
1664 SCALE_SPLIT_ANGLE(0.02185030654073),
1665 SCALE_SPLIT_ANGLE(0.02213260531425),
1666 SCALE_SPLIT_ANGLE(0.02241298183799),
1667 SCALE_SPLIT_ANGLE(0.02286812849343),
1668 SCALE_SPLIT_ANGLE(0.02363408915699),
1669 SCALE_SPLIT_ANGLE(0.02418405190110)},
1670 {SCALE_SPLIT_ANGLE(0.01235313806683),
1671 SCALE_SPLIT_ANGLE(0.01237650960684),
1672 SCALE_SPLIT_ANGLE(0.01241220813245),
1673 SCALE_SPLIT_ANGLE(0.01250253710896),
1674 SCALE_SPLIT_ANGLE(0.01259138900787),
1675 SCALE_SPLIT_ANGLE(0.01273377332836),
1676 SCALE_SPLIT_ANGLE(0.01296819839627),
1677 SCALE_SPLIT_ANGLE(0.01313247997314)},
1678 {SCALE_SPLIT_ANGLE(0.00700078532100),
1679 SCALE_SPLIT_ANGLE(0.00700826756656),
1680 SCALE_SPLIT_ANGLE(0.00701967673376),
1681 SCALE_SPLIT_ANGLE(0.00704843224958),
1682 SCALE_SPLIT_ANGLE(0.00707655772567),
1683 SCALE_SPLIT_ANGLE(0.00712130358443),
1684 SCALE_SPLIT_ANGLE(0.00719408970326),
1685 SCALE_SPLIT_ANGLE(0.00724443979561)},
1686 {SCALE_SPLIT_ANGLE(0.00395406875759),
1687 SCALE_SPLIT_ANGLE(0.00395645201206),
1688 SCALE_SPLIT_ANGLE(0.00396008137614),
1689 SCALE_SPLIT_ANGLE(0.00396920880303),
1690 SCALE_SPLIT_ANGLE(0.00397810759023),
1691 SCALE_SPLIT_ANGLE(0.00399220688269),
1692 SCALE_SPLIT_ANGLE(0.00401498842984),
1693 SCALE_SPLIT_ANGLE(0.00403063697740)},
1694 {SCALE_SPLIT_ANGLE(0.00000002236068),
1695 SCALE_SPLIT_ANGLE(0.00000002236068),
1696 SCALE_SPLIT_ANGLE(0.00000002236068),
1697 SCALE_SPLIT_ANGLE(0.00000002236068),
1698 SCALE_SPLIT_ANGLE(0.00000002236068),
1699 SCALE_SPLIT_ANGLE(0.00000002236068),
1700 SCALE_SPLIT_ANGLE(0.00000002236068),
1701 SCALE_SPLIT_ANGLE(0.00000002236068)},
1702 },
1703 {
1704 {SCALE_SPLIT_ANGLE(2.74889349937439),
1705 SCALE_SPLIT_ANGLE(2.74889349937439),
1706 SCALE_SPLIT_ANGLE(2.74889349937439),
1707 SCALE_SPLIT_ANGLE(2.74889349937439),
1708 SCALE_SPLIT_ANGLE(2.74889349937439),
1709 SCALE_SPLIT_ANGLE(2.74889349937439),
1710 SCALE_SPLIT_ANGLE(2.74889349937439),
1711 SCALE_SPLIT_ANGLE(2.74889349937439)},
1712 {SCALE_SPLIT_ANGLE(2.74670672416687),
1713 SCALE_SPLIT_ANGLE(2.74670815467834),
1714 SCALE_SPLIT_ANGLE(2.74671053886414),
1715 SCALE_SPLIT_ANGLE(2.74671602249146),
1716 SCALE_SPLIT_ANGLE(2.74672174453735),
1717 SCALE_SPLIT_ANGLE(2.74673032760620),
1718 SCALE_SPLIT_ANGLE(2.74674415588379),
1719 SCALE_SPLIT_ANGLE(2.74675345420837)},
1720 {SCALE_SPLIT_ANGLE(2.74495577812195),
1721 SCALE_SPLIT_ANGLE(2.74496054649353),
1722 SCALE_SPLIT_ANGLE(2.74496769905090),
1723 SCALE_SPLIT_ANGLE(2.74498581886292),
1724 SCALE_SPLIT_ANGLE(2.74500346183777),
1725 SCALE_SPLIT_ANGLE(2.74503111839294),
1726 SCALE_SPLIT_ANGLE(2.74507498741150),
1727 SCALE_SPLIT_ANGLE(2.74510502815247)},
1728 {SCALE_SPLIT_ANGLE(2.74173212051392),
1729 SCALE_SPLIT_ANGLE(2.74174761772156),
1730 SCALE_SPLIT_ANGLE(2.74177098274231),
1731 SCALE_SPLIT_ANGLE(2.74182939529419),
1732 SCALE_SPLIT_ANGLE(2.74188613891602),
1733 SCALE_SPLIT_ANGLE(2.74197483062744),
1734 SCALE_SPLIT_ANGLE(2.74211573600769),
1735 SCALE_SPLIT_ANGLE(2.74221110343933)},
1736 {SCALE_SPLIT_ANGLE(2.73563575744629),
1737 SCALE_SPLIT_ANGLE(2.73568630218506),
1738 SCALE_SPLIT_ANGLE(2.73576331138611),
1739 SCALE_SPLIT_ANGLE(2.73595523834229),
1740 SCALE_SPLIT_ANGLE(2.73614001274109),
1741 SCALE_SPLIT_ANGLE(2.73642849922180),
1742 SCALE_SPLIT_ANGLE(2.73688435554504),
1743 SCALE_SPLIT_ANGLE(2.73719072341919)},
1744 {SCALE_SPLIT_ANGLE(2.72353148460388),
1745 SCALE_SPLIT_ANGLE(2.72370529174805),
1746 SCALE_SPLIT_ANGLE(2.72396802902222),
1747 SCALE_SPLIT_ANGLE(2.72461819648743),
1748 SCALE_SPLIT_ANGLE(2.72523880004883),
1749 SCALE_SPLIT_ANGLE(2.72619819641113),
1750 SCALE_SPLIT_ANGLE(2.72769498825073),
1751 SCALE_SPLIT_ANGLE(2.72869181632996)},
1752 {SCALE_SPLIT_ANGLE(2.71044087409973),
1753 SCALE_SPLIT_ANGLE(2.71081781387329),
1754 SCALE_SPLIT_ANGLE(2.71138477325439),
1755 SCALE_SPLIT_ANGLE(2.71277689933777),
1756 SCALE_SPLIT_ANGLE(2.71409153938293),
1757 SCALE_SPLIT_ANGLE(2.71610021591187),
1758 SCALE_SPLIT_ANGLE(2.71919155120850),
1759 SCALE_SPLIT_ANGLE(2.72123122215271)},
1760 {SCALE_SPLIT_ANGLE(2.68862843513489),
1761 SCALE_SPLIT_ANGLE(2.68948626518250),
1762 SCALE_SPLIT_ANGLE(2.69076681137085),
1763 SCALE_SPLIT_ANGLE(2.69386243820190),
1764 SCALE_SPLIT_ANGLE(2.69673037528992),
1765 SCALE_SPLIT_ANGLE(2.70102667808533),
1766 SCALE_SPLIT_ANGLE(2.70749115943909),
1767 SCALE_SPLIT_ANGLE(2.71170210838318)},
1768 {SCALE_SPLIT_ANGLE(2.64932370185852),
1769 SCALE_SPLIT_ANGLE(2.65145039558411),
1770 SCALE_SPLIT_ANGLE(2.65457701683044),
1771 SCALE_SPLIT_ANGLE(2.66191530227661),
1772 SCALE_SPLIT_ANGLE(2.66847491264343),
1773 SCALE_SPLIT_ANGLE(2.67795729637146),
1774 SCALE_SPLIT_ANGLE(2.69169545173645),
1775 SCALE_SPLIT_ANGLE(2.70048093795776)},
1776 {SCALE_SPLIT_ANGLE(2.56864428520203),
1777 SCALE_SPLIT_ANGLE(2.57483482360840),
1778 SCALE_SPLIT_ANGLE(2.58364057540894),
1779 SCALE_SPLIT_ANGLE(2.60311055183411),
1780 SCALE_SPLIT_ANGLE(2.61933612823486),
1781 SCALE_SPLIT_ANGLE(2.64129805564880),
1782 SCALE_SPLIT_ANGLE(2.67107844352722),
1783 SCALE_SPLIT_ANGLE(2.68960857391357)},
1784 {SCALE_SPLIT_ANGLE(2.35773015022278),
1785 SCALE_SPLIT_ANGLE(2.38251185417175),
1786 SCALE_SPLIT_ANGLE(2.41520094871521),
1787 SCALE_SPLIT_ANGLE(2.47876882553101),
1788 SCALE_SPLIT_ANGLE(2.52468156814575),
1789 SCALE_SPLIT_ANGLE(2.57956743240356),
1790 SCALE_SPLIT_ANGLE(2.64563941955566),
1791 SCALE_SPLIT_ANGLE(2.68501615524292)},
1792 {SCALE_SPLIT_ANGLE(1.95455360412598),
1793 SCALE_SPLIT_ANGLE(2.03550028800964),
1794 SCALE_SPLIT_ANGLE(2.13431143760681),
1795 SCALE_SPLIT_ANGLE(2.30167627334595),
1796 SCALE_SPLIT_ANGLE(2.40472936630249),
1797 SCALE_SPLIT_ANGLE(2.51241874694824),
1798 SCALE_SPLIT_ANGLE(2.62649774551392),
1799 SCALE_SPLIT_ANGLE(2.69151234626770)},
1800 {SCALE_SPLIT_ANGLE(1.08639848232269),
1801 SCALE_SPLIT_ANGLE(1.25607907772064),
1802 SCALE_SPLIT_ANGLE(1.49360668659210),
1803 SCALE_SPLIT_ANGLE(1.93062829971313),
1804 SCALE_SPLIT_ANGLE(2.18087863922119),
1805 SCALE_SPLIT_ANGLE(2.40583086013794),
1806 SCALE_SPLIT_ANGLE(2.60574340820313),
1807 SCALE_SPLIT_ANGLE(2.71224212646484)},
1808 {SCALE_SPLIT_ANGLE(0.46298864483833),
1809 SCALE_SPLIT_ANGLE(0.57069420814514),
1810 SCALE_SPLIT_ANGLE(0.74941867589951),
1811 SCALE_SPLIT_ANGLE(1.27059137821198),
1812 SCALE_SPLIT_ANGLE(1.74987781047821),
1813 SCALE_SPLIT_ANGLE(2.22410750389099),
1814 SCALE_SPLIT_ANGLE(2.58140015602112),
1815 SCALE_SPLIT_ANGLE(2.75301027297974)},
1816 {SCALE_SPLIT_ANGLE(0.23063218593597),
1817 SCALE_SPLIT_ANGLE(0.29689303040504),
1818 SCALE_SPLIT_ANGLE(0.39820966124535),
1819 SCALE_SPLIT_ANGLE(0.70773023366928),
1820 SCALE_SPLIT_ANGLE(1.13546586036682),
1821 SCALE_SPLIT_ANGLE(1.89722001552582),
1822 SCALE_SPLIT_ANGLE(2.54544758796692),
1823 SCALE_SPLIT_ANGLE(2.81490159034729)},
1824 {SCALE_SPLIT_ANGLE(0.14590546488762),
1825 SCALE_SPLIT_ANGLE(0.19153353571892),
1826 SCALE_SPLIT_ANGLE(0.25519019365311),
1827 SCALE_SPLIT_ANGLE(0.43163710832596),
1828 SCALE_SPLIT_ANGLE(0.67776858806610),
1829 SCALE_SPLIT_ANGLE(1.37444674968719),
1830 SCALE_SPLIT_ANGLE(2.47591257095337),
1831 SCALE_SPLIT_ANGLE(2.87223863601685)},
1832 {SCALE_SPLIT_ANGLE(0.12191537022591),
1833 SCALE_SPLIT_ANGLE(0.15053890645504),
1834 SCALE_SPLIT_ANGLE(0.19072309136391),
1835 SCALE_SPLIT_ANGLE(0.29725375771523),
1836 SCALE_SPLIT_ANGLE(0.43550044298172),
1837 SCALE_SPLIT_ANGLE(0.85167354345322),
1838 SCALE_SPLIT_ANGLE(2.31663155555725),
1839 SCALE_SPLIT_ANGLE(2.84442567825317)},
1840 {SCALE_SPLIT_ANGLE(0.11467454582453),
1841 SCALE_SPLIT_ANGLE(0.13146138191223),
1842 SCALE_SPLIT_ANGLE(0.15621000528336),
1843 SCALE_SPLIT_ANGLE(0.22212918102741),
1844 SCALE_SPLIT_ANGLE(0.30330246686935),
1845 SCALE_SPLIT_ANGLE(0.52478593587875),
1846 SCALE_SPLIT_ANGLE(1.91173267364502),
1847 SCALE_SPLIT_ANGLE(2.75908088684082)},
1848 {SCALE_SPLIT_ANGLE(0.10720870643854),
1849 SCALE_SPLIT_ANGLE(0.11720535159111),
1850 SCALE_SPLIT_ANGLE(0.13246683776379),
1851 SCALE_SPLIT_ANGLE(0.17369449138641),
1852 SCALE_SPLIT_ANGLE(0.22279064357281),
1853 SCALE_SPLIT_ANGLE(0.34306266903877),
1854 SCALE_SPLIT_ANGLE(1.11311781406403),
1855 SCALE_SPLIT_ANGLE(2.55312228202820)},
1856 {SCALE_SPLIT_ANGLE(0.09705757349730),
1857 SCALE_SPLIT_ANGLE(0.10320189595222),
1858 SCALE_SPLIT_ANGLE(0.11274837702513),
1859 SCALE_SPLIT_ANGLE(0.13873106241226),
1860 SCALE_SPLIT_ANGLE(0.16888953745365),
1861 SCALE_SPLIT_ANGLE(0.23647473752499),
1862 SCALE_SPLIT_ANGLE(0.53898406028748),
1863 SCALE_SPLIT_ANGLE(1.80699026584625)},
1864 {SCALE_SPLIT_ANGLE(0.08528346568346),
1865 SCALE_SPLIT_ANGLE(0.08915080130100),
1866 SCALE_SPLIT_ANGLE(0.09520188719034),
1867 SCALE_SPLIT_ANGLE(0.11166745424271),
1868 SCALE_SPLIT_ANGLE(0.13034184277058),
1869 SCALE_SPLIT_ANGLE(0.16932605206966),
1870 SCALE_SPLIT_ANGLE(0.29887470602989),
1871 SCALE_SPLIT_ANGLE(0.63077676296234)},
1872 {SCALE_SPLIT_ANGLE(0.06733843684196),
1873 SCALE_SPLIT_ANGLE(0.06931617110968),
1874 SCALE_SPLIT_ANGLE(0.07241340726614),
1875 SCALE_SPLIT_ANGLE(0.08076417446136),
1876 SCALE_SPLIT_ANGLE(0.08993341028690),
1877 SCALE_SPLIT_ANGLE(0.10759533941746),
1878 SCALE_SPLIT_ANGLE(0.15204638242722),
1879 SCALE_SPLIT_ANGLE(0.21143139898777)},
1880 {SCALE_SPLIT_ANGLE(0.05132640898228),
1881 SCALE_SPLIT_ANGLE(0.05234802886844),
1882 SCALE_SPLIT_ANGLE(0.05394187942147),
1883 SCALE_SPLIT_ANGLE(0.05818277224898),
1884 SCALE_SPLIT_ANGLE(0.06270807981491),
1885 SCALE_SPLIT_ANGLE(0.07093632966280),
1886 SCALE_SPLIT_ANGLE(0.08856786042452),
1887 SCALE_SPLIT_ANGLE(0.10623694956303)},
1888 {SCALE_SPLIT_ANGLE(0.03821930661798),
1889 SCALE_SPLIT_ANGLE(0.03874678537250),
1890 SCALE_SPLIT_ANGLE(0.03956566005945),
1891 SCALE_SPLIT_ANGLE(0.04171610623598),
1892 SCALE_SPLIT_ANGLE(0.04395710676908),
1893 SCALE_SPLIT_ANGLE(0.04786692932248),
1894 SCALE_SPLIT_ANGLE(0.05546034500003),
1895 SCALE_SPLIT_ANGLE(0.06201593577862)},
1896 {SCALE_SPLIT_ANGLE(0.02801758050919),
1897 SCALE_SPLIT_ANGLE(0.02828873321414),
1898 SCALE_SPLIT_ANGLE(0.02870770171285),
1899 SCALE_SPLIT_ANGLE(0.02979558333755),
1900 SCALE_SPLIT_ANGLE(0.03090834617615),
1901 SCALE_SPLIT_ANGLE(0.03279331326485),
1902 SCALE_SPLIT_ANGLE(0.03623208031058),
1903 SCALE_SPLIT_ANGLE(0.03895835205913)},
1904 {SCALE_SPLIT_ANGLE(0.02032180689275),
1905 SCALE_SPLIT_ANGLE(0.02046046219766),
1906 SCALE_SPLIT_ANGLE(0.02067386545241),
1907 SCALE_SPLIT_ANGLE(0.02122297696769),
1908 SCALE_SPLIT_ANGLE(0.02177673391998),
1909 SCALE_SPLIT_ANGLE(0.02269527874887),
1910 SCALE_SPLIT_ANGLE(0.02430364489555),
1911 SCALE_SPLIT_ANGLE(0.02551441825926)},
1912 {SCALE_SPLIT_ANGLE(0.01172095164657),
1913 SCALE_SPLIT_ANGLE(0.01176583208144),
1914 SCALE_SPLIT_ANGLE(0.01183457672596),
1915 SCALE_SPLIT_ANGLE(0.01200959738344),
1916 SCALE_SPLIT_ANGLE(0.01218330394477),
1917 SCALE_SPLIT_ANGLE(0.01246506255120),
1918 SCALE_SPLIT_ANGLE(0.01293875463307),
1919 SCALE_SPLIT_ANGLE(0.01327861472964)},
1920 {SCALE_SPLIT_ANGLE(0.00668454170227),
1921 SCALE_SPLIT_ANGLE(0.00669893343002),
1922 SCALE_SPLIT_ANGLE(0.00672091403976),
1923 SCALE_SPLIT_ANGLE(0.00677651492879),
1924 SCALE_SPLIT_ANGLE(0.00683118170127),
1925 SCALE_SPLIT_ANGLE(0.00691874232143),
1926 SCALE_SPLIT_ANGLE(0.00706279883161),
1927 SCALE_SPLIT_ANGLE(0.00716368528083)},
1928 {SCALE_SPLIT_ANGLE(0.00378863257356),
1929 SCALE_SPLIT_ANGLE(0.00379322143272),
1930 SCALE_SPLIT_ANGLE(0.00380021659657),
1931 SCALE_SPLIT_ANGLE(0.00381784536876),
1932 SCALE_SPLIT_ANGLE(0.00383508414961),
1933 SCALE_SPLIT_ANGLE(0.00386250065640),
1934 SCALE_SPLIT_ANGLE(0.00390707794577),
1935 SCALE_SPLIT_ANGLE(0.00393790053204)},
1936 {SCALE_SPLIT_ANGLE(0.00213989755139),
1937 SCALE_SPLIT_ANGLE(0.00214135553688),
1938 SCALE_SPLIT_ANGLE(0.00214357557707),
1939 SCALE_SPLIT_ANGLE(0.00214915862307),
1940 SCALE_SPLIT_ANGLE(0.00215460127220),
1941 SCALE_SPLIT_ANGLE(0.00216322275810),
1942 SCALE_SPLIT_ANGLE(0.00217714952305),
1943 SCALE_SPLIT_ANGLE(0.00218671280891)},
1944 {SCALE_SPLIT_ANGLE(0.00000001210151),
1945 SCALE_SPLIT_ANGLE(0.00000001210151),
1946 SCALE_SPLIT_ANGLE(0.00000001210151),
1947 SCALE_SPLIT_ANGLE(0.00000001210152),
1948 SCALE_SPLIT_ANGLE(0.00000001210152),
1949 SCALE_SPLIT_ANGLE(0.00000001210152),
1950 SCALE_SPLIT_ANGLE(0.00000001210152),
1951 SCALE_SPLIT_ANGLE(0.00000001210152)},
1952 },
1953 {
1954 {SCALE_SPLIT_ANGLE(-3.14159250259399),
1955 SCALE_SPLIT_ANGLE(-3.14159250259399),
1956 SCALE_SPLIT_ANGLE(-3.14159250259399),
1957 SCALE_SPLIT_ANGLE(-3.14159250259399),
1958 SCALE_SPLIT_ANGLE(-3.14159250259399),
1959 SCALE_SPLIT_ANGLE(-3.14159250259399),
1960 SCALE_SPLIT_ANGLE(-3.14159250259399),
1961 SCALE_SPLIT_ANGLE(-3.14159250259399)},
1962 {SCALE_SPLIT_ANGLE(-3.14159250259399),
1963 SCALE_SPLIT_ANGLE(-3.14159250259399),
1964 SCALE_SPLIT_ANGLE(-3.14159250259399),
1965 SCALE_SPLIT_ANGLE(-3.14159250259399),
1966 SCALE_SPLIT_ANGLE(-3.14159250259399),
1967 SCALE_SPLIT_ANGLE(-3.14159250259399),
1968 SCALE_SPLIT_ANGLE(-3.14159250259399),
1969 SCALE_SPLIT_ANGLE(-3.14159250259399)},
1970 {SCALE_SPLIT_ANGLE(-3.14159250259399),
1971 SCALE_SPLIT_ANGLE(-3.14159250259399),
1972 SCALE_SPLIT_ANGLE(-3.14159250259399),
1973 SCALE_SPLIT_ANGLE(-3.14159250259399),
1974 SCALE_SPLIT_ANGLE(-3.14159250259399),
1975 SCALE_SPLIT_ANGLE(-3.14159250259399),
1976 SCALE_SPLIT_ANGLE(-3.14159250259399),
1977 SCALE_SPLIT_ANGLE(-3.14159250259399)},
1978 {SCALE_SPLIT_ANGLE(-3.14159250259399),
1979 SCALE_SPLIT_ANGLE(-3.14159250259399),
1980 SCALE_SPLIT_ANGLE(-3.14159250259399),
1981 SCALE_SPLIT_ANGLE(-3.14159250259399),
1982 SCALE_SPLIT_ANGLE(-3.14159250259399),
1983 SCALE_SPLIT_ANGLE(-3.14159250259399),
1984 SCALE_SPLIT_ANGLE(-3.14159250259399),
1985 SCALE_SPLIT_ANGLE(-3.14159250259399)},
1986 {SCALE_SPLIT_ANGLE(-3.14159250259399),
1987 SCALE_SPLIT_ANGLE(-3.14159250259399),
1988 SCALE_SPLIT_ANGLE(-3.14159250259399),
1989 SCALE_SPLIT_ANGLE(-3.14159250259399),
1990 SCALE_SPLIT_ANGLE(-3.14159250259399),
1991 SCALE_SPLIT_ANGLE(-3.14159250259399),
1992 SCALE_SPLIT_ANGLE(-3.14159250259399),
1993 SCALE_SPLIT_ANGLE(-3.14159250259399)},
1994 {SCALE_SPLIT_ANGLE(-3.14159250259399),
1995 SCALE_SPLIT_ANGLE(-3.14159250259399),
1996 SCALE_SPLIT_ANGLE(-3.14159250259399),
1997 SCALE_SPLIT_ANGLE(-3.14159250259399),
1998 SCALE_SPLIT_ANGLE(-3.14159250259399),
1999 SCALE_SPLIT_ANGLE(-3.14159250259399),
2000 SCALE_SPLIT_ANGLE(-3.14159250259399),
2001 SCALE_SPLIT_ANGLE(-3.14159250259399)},
2002 {SCALE_SPLIT_ANGLE(-3.14159250259399),
2003 SCALE_SPLIT_ANGLE(-3.14159250259399),
2004 SCALE_SPLIT_ANGLE(-3.14159250259399),
2005 SCALE_SPLIT_ANGLE(-3.14159250259399),
2006 SCALE_SPLIT_ANGLE(-3.14159250259399),
2007 SCALE_SPLIT_ANGLE(-3.14159250259399),
2008 SCALE_SPLIT_ANGLE(-3.14159250259399),
2009 SCALE_SPLIT_ANGLE(-3.14159250259399)},
2010 {SCALE_SPLIT_ANGLE(-3.14159250259399),
2011 SCALE_SPLIT_ANGLE(-3.14159250259399),
2012 SCALE_SPLIT_ANGLE(-3.14159250259399),
2013 SCALE_SPLIT_ANGLE(-3.14159250259399),
2014 SCALE_SPLIT_ANGLE(-3.14159250259399),
2015 SCALE_SPLIT_ANGLE(-3.14159250259399),
2016 SCALE_SPLIT_ANGLE(-3.14159250259399),
2017 SCALE_SPLIT_ANGLE(-3.14159250259399)},
2018 {SCALE_SPLIT_ANGLE(-3.14159250259399),
2019 SCALE_SPLIT_ANGLE(-3.14159250259399),
2020 SCALE_SPLIT_ANGLE(-3.14159250259399),
2021 SCALE_SPLIT_ANGLE(-3.14159250259399),
2022 SCALE_SPLIT_ANGLE(-3.14159250259399),
2023 SCALE_SPLIT_ANGLE(-3.14159250259399),
2024 SCALE_SPLIT_ANGLE(-3.14159250259399),
2025 SCALE_SPLIT_ANGLE(-3.14159250259399)},
2026 {SCALE_SPLIT_ANGLE(-3.14159250259399),
2027 SCALE_SPLIT_ANGLE(-3.14159250259399),
2028 SCALE_SPLIT_ANGLE(-3.14159250259399),
2029 SCALE_SPLIT_ANGLE(-3.14159250259399),
2030 SCALE_SPLIT_ANGLE(-3.14159250259399),
2031 SCALE_SPLIT_ANGLE(-3.14159250259399),
2032 SCALE_SPLIT_ANGLE(-3.14159250259399),
2033 SCALE_SPLIT_ANGLE(-3.14159250259399)},
2034 {SCALE_SPLIT_ANGLE(-3.14159250259399),
2035 SCALE_SPLIT_ANGLE(-3.14159250259399),
2036 SCALE_SPLIT_ANGLE(-3.14159250259399),
2037 SCALE_SPLIT_ANGLE(-3.14159250259399),
2038 SCALE_SPLIT_ANGLE(-3.14159250259399),
2039 SCALE_SPLIT_ANGLE(-3.14159250259399),
2040 SCALE_SPLIT_ANGLE(-3.14159250259399),
2041 SCALE_SPLIT_ANGLE(-3.14159250259399)},
2042 {SCALE_SPLIT_ANGLE(-3.14159226417542),
2043 SCALE_SPLIT_ANGLE(-3.14159226417542),
2044 SCALE_SPLIT_ANGLE(-3.14159226417542),
2045 SCALE_SPLIT_ANGLE(-3.14159250259399),
2046 SCALE_SPLIT_ANGLE(-3.14159250259399),
2047 SCALE_SPLIT_ANGLE(-3.14159250259399),
2048 SCALE_SPLIT_ANGLE(-3.14159250259399),
2049 SCALE_SPLIT_ANGLE(-3.14159250259399)},
2050 {SCALE_SPLIT_ANGLE(-0.00000036774148),
2051 SCALE_SPLIT_ANGLE(-0.00000066993488),
2052 SCALE_SPLIT_ANGLE(-0.00001151842844),
2053 SCALE_SPLIT_ANGLE(-3.14159226417542),
2054 SCALE_SPLIT_ANGLE(-3.14159250259399),
2055 SCALE_SPLIT_ANGLE(-3.14159250259399),
2056 SCALE_SPLIT_ANGLE(-3.14159250259399),
2057 SCALE_SPLIT_ANGLE(-3.14159250259399)},
2058 {SCALE_SPLIT_ANGLE(-0.00000008554968),
2059 SCALE_SPLIT_ANGLE(-0.00000012210570),
2060 SCALE_SPLIT_ANGLE(-0.00000019699247),
2061 SCALE_SPLIT_ANGLE(-0.00000110842382),
2062 SCALE_SPLIT_ANGLE(-3.14159202575684),
2063 SCALE_SPLIT_ANGLE(-3.14159250259399),
2064 SCALE_SPLIT_ANGLE(-3.14159250259399),
2065 SCALE_SPLIT_ANGLE(-3.14159250259399)},
2066 {SCALE_SPLIT_ANGLE(-0.00000003016602),
2067 SCALE_SPLIT_ANGLE(-0.00000005321843),
2068 SCALE_SPLIT_ANGLE(-0.00000008440014),
2069 SCALE_SPLIT_ANGLE(-0.00000020468090),
2070 SCALE_SPLIT_ANGLE(-0.00000071846705),
2071 SCALE_SPLIT_ANGLE(-3.14159226417542),
2072 SCALE_SPLIT_ANGLE(-3.14159250259399),
2073 SCALE_SPLIT_ANGLE(-3.14159250259399)},
2074 {SCALE_SPLIT_ANGLE(-0.00000000024720),
2075 SCALE_SPLIT_ANGLE(-0.00000003226497),
2076 SCALE_SPLIT_ANGLE(-0.00000005171609),
2077 SCALE_SPLIT_ANGLE(-0.00000010526998),
2078 SCALE_SPLIT_ANGLE(-0.00000020551137),
2079 SCALE_SPLIT_ANGLE(-1.57079637050629),
2080 SCALE_SPLIT_ANGLE(-3.14159250259399),
2081 SCALE_SPLIT_ANGLE(-3.14159250259399)},
2082 {SCALE_SPLIT_ANGLE(-0.00000001688349),
2083 SCALE_SPLIT_ANGLE(-0.00000002741881),
2084 SCALE_SPLIT_ANGLE(-0.00000003926384),
2085 SCALE_SPLIT_ANGLE(-0.00000006928260),
2086 SCALE_SPLIT_ANGLE(-0.00000011240582),
2087 SCALE_SPLIT_ANGLE(-0.00000033763689),
2088 SCALE_SPLIT_ANGLE(-3.14159250259399),
2089 SCALE_SPLIT_ANGLE(-3.14159250259399)},
2090 {SCALE_SPLIT_ANGLE(-0.00000002143362),
2091 SCALE_SPLIT_ANGLE(-0.00000002640935),
2092 SCALE_SPLIT_ANGLE(-0.00000003328325),
2093 SCALE_SPLIT_ANGLE(-0.00000005112437),
2094 SCALE_SPLIT_ANGLE(-0.00000007399619),
2095 SCALE_SPLIT_ANGLE(-0.00000014946792),
2096 SCALE_SPLIT_ANGLE(-3.14159226417542),
2097 SCALE_SPLIT_ANGLE(-3.14159250259399)},
2098 {SCALE_SPLIT_ANGLE(-0.00000002225921),
2099 SCALE_SPLIT_ANGLE(-0.00000002497380),
2100 SCALE_SPLIT_ANGLE(-0.00000002903169),
2101 SCALE_SPLIT_ANGLE(-0.00000003987020),
2102 SCALE_SPLIT_ANGLE(-0.00000005300816),
2103 SCALE_SPLIT_ANGLE(-0.00000008783893),
2104 SCALE_SPLIT_ANGLE(-0.00000093762065),
2105 SCALE_SPLIT_ANGLE(-3.14159250259399)},
2106 {SCALE_SPLIT_ANGLE(-0.00000002109218),
2107 SCALE_SPLIT_ANGLE(-0.00000002269230),
2108 SCALE_SPLIT_ANGLE(-0.00000002515904),
2109 SCALE_SPLIT_ANGLE(-0.00000003183984),
2110 SCALE_SPLIT_ANGLE(-0.00000003965878),
2111 SCALE_SPLIT_ANGLE(-0.00000005782364),
2112 SCALE_SPLIT_ANGLE(-0.00000016152633),
2113 SCALE_SPLIT_ANGLE(-3.14159226417542)},
2114 {SCALE_SPLIT_ANGLE(-0.00000001895314),
2115 SCALE_SPLIT_ANGLE(-0.00000001993623),
2116 SCALE_SPLIT_ANGLE(-0.00000002146927),
2117 SCALE_SPLIT_ANGLE(-0.00000002563087),
2118 SCALE_SPLIT_ANGLE(-0.00000003036888),
2119 SCALE_SPLIT_ANGLE(-0.00000004043087),
2120 SCALE_SPLIT_ANGLE(-0.00000007667983),
2121 SCALE_SPLIT_ANGLE(-0.00000021028936)},
2122 {SCALE_SPLIT_ANGLE(-0.00000001519980),
2123 SCALE_SPLIT_ANGLE(-0.00000001569144),
2124 SCALE_SPLIT_ANGLE(-0.00000001646043),
2125 SCALE_SPLIT_ANGLE(-0.00000001853141),
2126 SCALE_SPLIT_ANGLE(-0.00000002080756),
2127 SCALE_SPLIT_ANGLE(-0.00000002521688),
2128 SCALE_SPLIT_ANGLE(-0.00000003656274),
2129 SCALE_SPLIT_ANGLE(-0.00000005247700)},
2130 {SCALE_SPLIT_ANGLE(-0.00000001166148),
2131 SCALE_SPLIT_ANGLE(-0.00000001191188),
2132 SCALE_SPLIT_ANGLE(-0.00000001230229),
2133 SCALE_SPLIT_ANGLE(-0.00000001334031),
2134 SCALE_SPLIT_ANGLE(-0.00000001444787),
2135 SCALE_SPLIT_ANGLE(-0.00000001646512),
2136 SCALE_SPLIT_ANGLE(-0.00000002081803),
2137 SCALE_SPLIT_ANGLE(-0.00000002523831)},
2138 {SCALE_SPLIT_ANGLE(-0.00000000870876),
2139 SCALE_SPLIT_ANGLE(-0.00000000883681),
2140 SCALE_SPLIT_ANGLE(-0.00000000903554),
2141 SCALE_SPLIT_ANGLE(-0.00000000955712),
2142 SCALE_SPLIT_ANGLE(-0.00000001010047),
2143 SCALE_SPLIT_ANGLE(-0.00000001104868),
2144 SCALE_SPLIT_ANGLE(-0.00000001289412),
2145 SCALE_SPLIT_ANGLE(-0.00000001449405)},
2146 {SCALE_SPLIT_ANGLE(-0.00000000639270),
2147 SCALE_SPLIT_ANGLE(-0.00000000645810),
2148 SCALE_SPLIT_ANGLE(-0.00000000655912),
2149 SCALE_SPLIT_ANGLE(-0.00000000682132),
2150 SCALE_SPLIT_ANGLE(-0.00000000708940),
2151 SCALE_SPLIT_ANGLE(-0.00000000754343),
2152 SCALE_SPLIT_ANGLE(-0.00000000837207),
2153 SCALE_SPLIT_ANGLE(-0.00000000902983)},
2154 {SCALE_SPLIT_ANGLE(-0.00000000463970),
2155 SCALE_SPLIT_ANGLE(-0.00000000467299),
2156 SCALE_SPLIT_ANGLE(-0.00000000472421),
2157 SCALE_SPLIT_ANGLE(-0.00000000485598),
2158 SCALE_SPLIT_ANGLE(-0.00000000498881),
2159 SCALE_SPLIT_ANGLE(-0.00000000520907),
2160 SCALE_SPLIT_ANGLE(-0.00000000559469),
2161 SCALE_SPLIT_ANGLE(-0.00000000588504)},
2162 {SCALE_SPLIT_ANGLE(-0.00000000267713),
2163 SCALE_SPLIT_ANGLE(-0.00000000268785),
2164 SCALE_SPLIT_ANGLE(-0.00000000270428),
2165 SCALE_SPLIT_ANGLE(-0.00000000274608),
2166 SCALE_SPLIT_ANGLE(-0.00000000278756),
2167 SCALE_SPLIT_ANGLE(-0.00000000285483),
2168 SCALE_SPLIT_ANGLE(-0.00000000296788),
2169 SCALE_SPLIT_ANGLE(-0.00000000304897)},
2170 {SCALE_SPLIT_ANGLE(-0.00000000152698),
2171 SCALE_SPLIT_ANGLE(-0.00000000153041),
2172 SCALE_SPLIT_ANGLE(-0.00000000153564),
2173 SCALE_SPLIT_ANGLE(-0.00000000154889),
2174 SCALE_SPLIT_ANGLE(-0.00000000156191),
2175 SCALE_SPLIT_ANGLE(-0.00000000158277),
2176 SCALE_SPLIT_ANGLE(-0.00000000161707),
2177 SCALE_SPLIT_ANGLE(-0.00000000164109)},
2178 {SCALE_SPLIT_ANGLE(-0.00000000086549),
2179 SCALE_SPLIT_ANGLE(-0.00000000086658),
2180 SCALE_SPLIT_ANGLE(-0.00000000086824),
2181 SCALE_SPLIT_ANGLE(-0.00000000087244),
2182 SCALE_SPLIT_ANGLE(-0.00000000087654),
2183 SCALE_SPLIT_ANGLE(-0.00000000088306),
2184 SCALE_SPLIT_ANGLE(-0.00000000089366),
2185 SCALE_SPLIT_ANGLE(-0.00000000090099)},
2186 {SCALE_SPLIT_ANGLE(-0.00000000048885),
2187 SCALE_SPLIT_ANGLE(-0.00000000048920),
2188 SCALE_SPLIT_ANGLE(-0.00000000048972),
2189 SCALE_SPLIT_ANGLE(-0.00000000049105),
2190 SCALE_SPLIT_ANGLE(-0.00000000049235),
2191 SCALE_SPLIT_ANGLE(-0.00000000049439),
2192 SCALE_SPLIT_ANGLE(-0.00000000049770),
2193 SCALE_SPLIT_ANGLE(-0.00000000049998)},
2194 {SCALE_SPLIT_ANGLE(-0.00000000000000),
2195 SCALE_SPLIT_ANGLE(-0.00000000000000),
2196 SCALE_SPLIT_ANGLE(-0.00000000000000),
2197 SCALE_SPLIT_ANGLE(-0.00000000000000),
2198 SCALE_SPLIT_ANGLE(-0.00000000000000),
2199 SCALE_SPLIT_ANGLE(-0.00000000000000),
2200 SCALE_SPLIT_ANGLE(-0.00000000000000),
2201 SCALE_SPLIT_ANGLE(-0.00000000000000)},
2202 },
2203 {
2204 {SCALE_SPLIT_ANGLE(-2.74889349937439),
2205 SCALE_SPLIT_ANGLE(-2.74889349937439),
2206 SCALE_SPLIT_ANGLE(-2.74889349937439),
2207 SCALE_SPLIT_ANGLE(-2.74889349937439),
2208 SCALE_SPLIT_ANGLE(-2.74889349937439),
2209 SCALE_SPLIT_ANGLE(-2.74889349937439),
2210 SCALE_SPLIT_ANGLE(-2.74889349937439),
2211 SCALE_SPLIT_ANGLE(-2.74889349937439)},
2212 {SCALE_SPLIT_ANGLE(-2.74670672416687),
2213 SCALE_SPLIT_ANGLE(-2.74670815467834),
2214 SCALE_SPLIT_ANGLE(-2.74671053886414),
2215 SCALE_SPLIT_ANGLE(-2.74671626091003),
2216 SCALE_SPLIT_ANGLE(-2.74672174453735),
2217 SCALE_SPLIT_ANGLE(-2.74673032760620),
2218 SCALE_SPLIT_ANGLE(-2.74674415588379),
2219 SCALE_SPLIT_ANGLE(-2.74675369262695)},
2220 {SCALE_SPLIT_ANGLE(-2.74495577812195),
2221 SCALE_SPLIT_ANGLE(-2.74496054649353),
2222 SCALE_SPLIT_ANGLE(-2.74496769905090),
2223 SCALE_SPLIT_ANGLE(-2.74498581886292),
2224 SCALE_SPLIT_ANGLE(-2.74500346183777),
2225 SCALE_SPLIT_ANGLE(-2.74503111839294),
2226 SCALE_SPLIT_ANGLE(-2.74507522583008),
2227 SCALE_SPLIT_ANGLE(-2.74510502815247)},
2228 {SCALE_SPLIT_ANGLE(-2.74173235893250),
2229 SCALE_SPLIT_ANGLE(-2.74174761772156),
2230 SCALE_SPLIT_ANGLE(-2.74177098274231),
2231 SCALE_SPLIT_ANGLE(-2.74182963371277),
2232 SCALE_SPLIT_ANGLE(-2.74188613891602),
2233 SCALE_SPLIT_ANGLE(-2.74197483062744),
2234 SCALE_SPLIT_ANGLE(-2.74211597442627),
2235 SCALE_SPLIT_ANGLE(-2.74221134185791)},
2236 {SCALE_SPLIT_ANGLE(-2.73563575744629),
2237 SCALE_SPLIT_ANGLE(-2.73568654060364),
2238 SCALE_SPLIT_ANGLE(-2.73576331138611),
2239 SCALE_SPLIT_ANGLE(-2.73595523834229),
2240 SCALE_SPLIT_ANGLE(-2.73614001274109),
2241 SCALE_SPLIT_ANGLE(-2.73642849922180),
2242 SCALE_SPLIT_ANGLE(-2.73688435554504),
2243 SCALE_SPLIT_ANGLE(-2.73719096183777)},
2244 {SCALE_SPLIT_ANGLE(-2.72353172302246),
2245 SCALE_SPLIT_ANGLE(-2.72370529174805),
2246 SCALE_SPLIT_ANGLE(-2.72396802902222),
2247 SCALE_SPLIT_ANGLE(-2.72461819648743),
2248 SCALE_SPLIT_ANGLE(-2.72523903846741),
2249 SCALE_SPLIT_ANGLE(-2.72619819641113),
2250 SCALE_SPLIT_ANGLE(-2.72769522666931),
2251 SCALE_SPLIT_ANGLE(-2.72869181632996)},
2252 {SCALE_SPLIT_ANGLE(-2.71044111251831),
2253 SCALE_SPLIT_ANGLE(-2.71081781387329),
2254 SCALE_SPLIT_ANGLE(-2.71138477325439),
2255 SCALE_SPLIT_ANGLE(-2.71277689933777),
2256 SCALE_SPLIT_ANGLE(-2.71409153938293),
2257 SCALE_SPLIT_ANGLE(-2.71610021591187),
2258 SCALE_SPLIT_ANGLE(-2.71919155120850),
2259 SCALE_SPLIT_ANGLE(-2.72123122215271)},
2260 {SCALE_SPLIT_ANGLE(-2.68862843513489),
2261 SCALE_SPLIT_ANGLE(-2.68948626518250),
2262 SCALE_SPLIT_ANGLE(-2.69076681137085),
2263 SCALE_SPLIT_ANGLE(-2.69386243820190),
2264 SCALE_SPLIT_ANGLE(-2.69673061370850),
2265 SCALE_SPLIT_ANGLE(-2.70102667808533),
2266 SCALE_SPLIT_ANGLE(-2.70749115943909),
2267 SCALE_SPLIT_ANGLE(-2.71170234680176)},
2268 {SCALE_SPLIT_ANGLE(-2.64932370185852),
2269 SCALE_SPLIT_ANGLE(-2.65145063400269),
2270 SCALE_SPLIT_ANGLE(-2.65457701683044),
2271 SCALE_SPLIT_ANGLE(-2.66191530227661),
2272 SCALE_SPLIT_ANGLE(-2.66847491264343),
2273 SCALE_SPLIT_ANGLE(-2.67795729637146),
2274 SCALE_SPLIT_ANGLE(-2.69169569015503),
2275 SCALE_SPLIT_ANGLE(-2.70048117637634)},
2276 {SCALE_SPLIT_ANGLE(-2.56864428520203),
2277 SCALE_SPLIT_ANGLE(-2.57483482360840),
2278 SCALE_SPLIT_ANGLE(-2.58364057540894),
2279 SCALE_SPLIT_ANGLE(-2.60311055183411),
2280 SCALE_SPLIT_ANGLE(-2.61933612823486),
2281 SCALE_SPLIT_ANGLE(-2.64129829406738),
2282 SCALE_SPLIT_ANGLE(-2.67107868194580),
2283 SCALE_SPLIT_ANGLE(-2.68960881233215)},
2284 {SCALE_SPLIT_ANGLE(-2.35773015022278),
2285 SCALE_SPLIT_ANGLE(-2.38251185417175),
2286 SCALE_SPLIT_ANGLE(-2.41520094871521),
2287 SCALE_SPLIT_ANGLE(-2.47876906394959),
2288 SCALE_SPLIT_ANGLE(-2.52468156814575),
2289 SCALE_SPLIT_ANGLE(-2.57956743240356),
2290 SCALE_SPLIT_ANGLE(-2.64563965797424),
2291 SCALE_SPLIT_ANGLE(-2.68501615524292)},
2292 {SCALE_SPLIT_ANGLE(-1.95455360412598),
2293 SCALE_SPLIT_ANGLE(-2.03550028800964),
2294 SCALE_SPLIT_ANGLE(-2.13431143760681),
2295 SCALE_SPLIT_ANGLE(-2.30167627334595),
2296 SCALE_SPLIT_ANGLE(-2.40472936630249),
2297 SCALE_SPLIT_ANGLE(-2.51241874694824),
2298 SCALE_SPLIT_ANGLE(-2.62649774551392),
2299 SCALE_SPLIT_ANGLE(-2.69151234626770)},
2300 {SCALE_SPLIT_ANGLE(-1.08639836311340),
2301 SCALE_SPLIT_ANGLE(-1.25607907772064),
2302 SCALE_SPLIT_ANGLE(-1.49360668659210),
2303 SCALE_SPLIT_ANGLE(-1.93062829971313),
2304 SCALE_SPLIT_ANGLE(-2.18087887763977),
2305 SCALE_SPLIT_ANGLE(-2.40583086013794),
2306 SCALE_SPLIT_ANGLE(-2.60574340820313),
2307 SCALE_SPLIT_ANGLE(-2.71224212646484)},
2308 {SCALE_SPLIT_ANGLE(-0.46298858523369),
2309 SCALE_SPLIT_ANGLE(-0.57069414854050),
2310 SCALE_SPLIT_ANGLE(-0.74941855669022),
2311 SCALE_SPLIT_ANGLE(-1.27059125900269),
2312 SCALE_SPLIT_ANGLE(-1.74987781047821),
2313 SCALE_SPLIT_ANGLE(-2.22410750389099),
2314 SCALE_SPLIT_ANGLE(-2.58140015602112),
2315 SCALE_SPLIT_ANGLE(-2.75301027297974)},
2316 {SCALE_SPLIT_ANGLE(-0.23063215613365),
2317 SCALE_SPLIT_ANGLE(-0.29689297080040),
2318 SCALE_SPLIT_ANGLE(-0.39820960164070),
2319 SCALE_SPLIT_ANGLE(-0.70773017406464),
2320 SCALE_SPLIT_ANGLE(-1.13546574115753),
2321 SCALE_SPLIT_ANGLE(-1.89722001552582),
2322 SCALE_SPLIT_ANGLE(-2.54544782638550),
2323 SCALE_SPLIT_ANGLE(-2.81490182876587)},
2324 {SCALE_SPLIT_ANGLE(-0.14590544998646),
2325 SCALE_SPLIT_ANGLE(-0.19153350591660),
2326 SCALE_SPLIT_ANGLE(-0.25519016385078),
2327 SCALE_SPLIT_ANGLE(-0.43163704872131),
2328 SCALE_SPLIT_ANGLE(-0.67776852846146),
2329 SCALE_SPLIT_ANGLE(-1.37444674968719),
2330 SCALE_SPLIT_ANGLE(-2.47591280937195),
2331 SCALE_SPLIT_ANGLE(-2.87223863601685)},
2332 {SCALE_SPLIT_ANGLE(-0.12191534787416),
2333 SCALE_SPLIT_ANGLE(-0.15053887665272),
2334 SCALE_SPLIT_ANGLE(-0.19072306156158),
2335 SCALE_SPLIT_ANGLE(-0.29725372791290),
2336 SCALE_SPLIT_ANGLE(-0.43550038337708),
2337 SCALE_SPLIT_ANGLE(-0.85167348384857),
2338 SCALE_SPLIT_ANGLE(-2.31663155555725),
2339 SCALE_SPLIT_ANGLE(-2.84442567825317)},
2340 {SCALE_SPLIT_ANGLE(-0.11467452347279),
2341 SCALE_SPLIT_ANGLE(-0.13146135210991),
2342 SCALE_SPLIT_ANGLE(-0.15620997548103),
2343 SCALE_SPLIT_ANGLE(-0.22212913632393),
2344 SCALE_SPLIT_ANGLE(-0.30330240726471),
2345 SCALE_SPLIT_ANGLE(-0.52478587627411),
2346 SCALE_SPLIT_ANGLE(-1.91173267364502),
2347 SCALE_SPLIT_ANGLE(-2.75908088684082)},
2348 {SCALE_SPLIT_ANGLE(-0.10720869153738),
2349 SCALE_SPLIT_ANGLE(-0.11720532923937),
2350 SCALE_SPLIT_ANGLE(-0.13246680796146),
2351 SCALE_SPLIT_ANGLE(-0.17369446158409),
2352 SCALE_SPLIT_ANGLE(-0.22279061377048),
2353 SCALE_SPLIT_ANGLE(-0.34306260943413),
2354 SCALE_SPLIT_ANGLE(-1.11311769485474),
2355 SCALE_SPLIT_ANGLE(-2.55312228202820)},
2356 {SCALE_SPLIT_ANGLE(-0.09705755859613),
2357 SCALE_SPLIT_ANGLE(-0.10320188105106),
2358 SCALE_SPLIT_ANGLE(-0.11274836212397),
2359 SCALE_SPLIT_ANGLE(-0.13873104751110),
2360 SCALE_SPLIT_ANGLE(-0.16888950765133),
2361 SCALE_SPLIT_ANGLE(-0.23647469282150),
2362 SCALE_SPLIT_ANGLE(-0.53898400068283),
2363 SCALE_SPLIT_ANGLE(-1.80699026584625)},
2364 {SCALE_SPLIT_ANGLE(-0.08528345078230),
2365 SCALE_SPLIT_ANGLE(-0.08915078639984),
2366 SCALE_SPLIT_ANGLE(-0.09520187228918),
2367 SCALE_SPLIT_ANGLE(-0.11166743934155),
2368 SCALE_SPLIT_ANGLE(-0.13034182786942),
2369 SCALE_SPLIT_ANGLE(-0.16932602226734),
2370 SCALE_SPLIT_ANGLE(-0.29887464642525),
2371 SCALE_SPLIT_ANGLE(-0.63077670335770)},
2372 {SCALE_SPLIT_ANGLE(-0.06733842939138),
2373 SCALE_SPLIT_ANGLE(-0.06931615620852),
2374 SCALE_SPLIT_ANGLE(-0.07241339236498),
2375 SCALE_SPLIT_ANGLE(-0.08076415956020),
2376 SCALE_SPLIT_ANGLE(-0.08993339538574),
2377 SCALE_SPLIT_ANGLE(-0.10759532451630),
2378 SCALE_SPLIT_ANGLE(-0.15204635262489),
2379 SCALE_SPLIT_ANGLE(-0.21143136918545)},
2380 {SCALE_SPLIT_ANGLE(-0.05132640153170),
2381 SCALE_SPLIT_ANGLE(-0.05234802141786),
2382 SCALE_SPLIT_ANGLE(-0.05394186824560),
2383 SCALE_SPLIT_ANGLE(-0.05818276479840),
2384 SCALE_SPLIT_ANGLE(-0.06270807236433),
2385 SCALE_SPLIT_ANGLE(-0.07093632221222),
2386 SCALE_SPLIT_ANGLE(-0.08856784552336),
2387 SCALE_SPLIT_ANGLE(-0.10623692721128)},
2388 {SCALE_SPLIT_ANGLE(-0.03821930289268),
2389 SCALE_SPLIT_ANGLE(-0.03874678164721),
2390 SCALE_SPLIT_ANGLE(-0.03956565260887),
2391 SCALE_SPLIT_ANGLE(-0.04171609878540),
2392 SCALE_SPLIT_ANGLE(-0.04395709931850),
2393 SCALE_SPLIT_ANGLE(-0.04786692187190),
2394 SCALE_SPLIT_ANGLE(-0.05546033382416),
2395 SCALE_SPLIT_ANGLE(-0.06201592460275)},
2396 {SCALE_SPLIT_ANGLE(-0.02801757678390),
2397 SCALE_SPLIT_ANGLE(-0.02828872948885),
2398 SCALE_SPLIT_ANGLE(-0.02870769798756),
2399 SCALE_SPLIT_ANGLE(-0.02979557774961),
2400 SCALE_SPLIT_ANGLE(-0.03090834245086),
2401 SCALE_SPLIT_ANGLE(-0.03279330953956),
2402 SCALE_SPLIT_ANGLE(-0.03623207286000),
2403 SCALE_SPLIT_ANGLE(-0.03895834833384)},
2404 {SCALE_SPLIT_ANGLE(-0.02032180316746),
2405 SCALE_SPLIT_ANGLE(-0.02046045847237),
2406 SCALE_SPLIT_ANGLE(-0.02067386172712),
2407 SCALE_SPLIT_ANGLE(-0.02122297324240),
2408 SCALE_SPLIT_ANGLE(-0.02177673205733),
2409 SCALE_SPLIT_ANGLE(-0.02269527502358),
2410 SCALE_SPLIT_ANGLE(-0.02430364117026),
2411 SCALE_SPLIT_ANGLE(-0.02551441267133)},
2412 {SCALE_SPLIT_ANGLE(-0.01172094978392),
2413 SCALE_SPLIT_ANGLE(-0.01176583021879),
2414 SCALE_SPLIT_ANGLE(-0.01183457486331),
2415 SCALE_SPLIT_ANGLE(-0.01200959552079),
2416 SCALE_SPLIT_ANGLE(-0.01218330208212),
2417 SCALE_SPLIT_ANGLE(-0.01246506068856),
2418 SCALE_SPLIT_ANGLE(-0.01293875277042),
2419 SCALE_SPLIT_ANGLE(-0.01327861286700)},
2420 {SCALE_SPLIT_ANGLE(-0.00668454030529),
2421 SCALE_SPLIT_ANGLE(-0.00669893249869),
2422 SCALE_SPLIT_ANGLE(-0.00672091310844),
2423 SCALE_SPLIT_ANGLE(-0.00677651399747),
2424 SCALE_SPLIT_ANGLE(-0.00683118030429),
2425 SCALE_SPLIT_ANGLE(-0.00691874139011),
2426 SCALE_SPLIT_ANGLE(-0.00706279790029),
2427 SCALE_SPLIT_ANGLE(-0.00716368434951)},
2428 {SCALE_SPLIT_ANGLE(-0.00378863210790),
2429 SCALE_SPLIT_ANGLE(-0.00379322096705),
2430 SCALE_SPLIT_ANGLE(-0.00380021613091),
2431 SCALE_SPLIT_ANGLE(-0.00381784490310),
2432 SCALE_SPLIT_ANGLE(-0.00383508345112),
2433 SCALE_SPLIT_ANGLE(-0.00386250019073),
2434 SCALE_SPLIT_ANGLE(-0.00390707701445),
2435 SCALE_SPLIT_ANGLE(-0.00393790006638)},
2436 {SCALE_SPLIT_ANGLE(-0.00213989731856),
2437 SCALE_SPLIT_ANGLE(-0.00214135507122),
2438 SCALE_SPLIT_ANGLE(-0.00214357534423),
2439 SCALE_SPLIT_ANGLE(-0.00214915839024),
2440 SCALE_SPLIT_ANGLE(-0.00215460080653),
2441 SCALE_SPLIT_ANGLE(-0.00216322229244),
2442 SCALE_SPLIT_ANGLE(-0.00217714929022),
2443 SCALE_SPLIT_ANGLE(-0.00218671257608)},
2444 {SCALE_SPLIT_ANGLE(-0.00000001210151),
2445 SCALE_SPLIT_ANGLE(-0.00000001210151),
2446 SCALE_SPLIT_ANGLE(-0.00000001210151),
2447 SCALE_SPLIT_ANGLE(-0.00000001210151),
2448 SCALE_SPLIT_ANGLE(-0.00000001210151),
2449 SCALE_SPLIT_ANGLE(-0.00000001210151),
2450 SCALE_SPLIT_ANGLE(-0.00000001210151),
2451 SCALE_SPLIT_ANGLE(-0.00000001210151)},
2452 },
2453 {
2454 {SCALE_SPLIT_ANGLE(-2.35619449615479),
2455 SCALE_SPLIT_ANGLE(-2.35619449615479),
2456 SCALE_SPLIT_ANGLE(-2.35619449615479),
2457 SCALE_SPLIT_ANGLE(-2.35619449615479),
2458 SCALE_SPLIT_ANGLE(-2.35619449615479),
2459 SCALE_SPLIT_ANGLE(-2.35619449615479),
2460 SCALE_SPLIT_ANGLE(-2.35619449615479),
2461 SCALE_SPLIT_ANGLE(-2.35619449615479)},
2462 {SCALE_SPLIT_ANGLE(-2.35216379165649),
2463 SCALE_SPLIT_ANGLE(-2.35216617584229),
2464 SCALE_SPLIT_ANGLE(-2.35216999053955),
2465 SCALE_SPLIT_ANGLE(-2.35217928886414),
2466 SCALE_SPLIT_ANGLE(-2.35218811035156),
2467 SCALE_SPLIT_ANGLE(-2.35220241546631),
2468 SCALE_SPLIT_ANGLE(-2.35222506523132),
2469 SCALE_SPLIT_ANGLE(-2.35224032402039)},
2470 {SCALE_SPLIT_ANGLE(-2.34895062446594),
2471 SCALE_SPLIT_ANGLE(-2.34895849227905),
2472 SCALE_SPLIT_ANGLE(-2.34897017478943),
2473 SCALE_SPLIT_ANGLE(-2.34899973869324),
2474 SCALE_SPLIT_ANGLE(-2.34902834892273),
2475 SCALE_SPLIT_ANGLE(-2.34907317161560),
2476 SCALE_SPLIT_ANGLE(-2.34914541244507),
2477 SCALE_SPLIT_ANGLE(-2.34919428825378)},
2478 {SCALE_SPLIT_ANGLE(-2.34306836128235),
2479 SCALE_SPLIT_ANGLE(-2.34309315681458),
2480 SCALE_SPLIT_ANGLE(-2.34313082695007),
2481 SCALE_SPLIT_ANGLE(-2.34322524070740),
2482 SCALE_SPLIT_ANGLE(-2.34331679344177),
2483 SCALE_SPLIT_ANGLE(-2.34346079826355),
2484 SCALE_SPLIT_ANGLE(-2.34369087219238),
2485 SCALE_SPLIT_ANGLE(-2.34384727478027)},
2486 {SCALE_SPLIT_ANGLE(-2.33205747604370),
2487 SCALE_SPLIT_ANGLE(-2.33213782310486),
2488 SCALE_SPLIT_ANGLE(-2.33226013183594),
2489 SCALE_SPLIT_ANGLE(-2.33256602287292),
2490 SCALE_SPLIT_ANGLE(-2.33286190032959),
2491 SCALE_SPLIT_ANGLE(-2.33332633972168),
2492 SCALE_SPLIT_ANGLE(-2.33406710624695),
2493 SCALE_SPLIT_ANGLE(-2.33456921577454)},
2494 {SCALE_SPLIT_ANGLE(-2.31062936782837),
2495 SCALE_SPLIT_ANGLE(-2.31089687347412),
2496 SCALE_SPLIT_ANGLE(-2.31130218505859),
2497 SCALE_SPLIT_ANGLE(-2.31231284141541),
2498 SCALE_SPLIT_ANGLE(-2.31328654289246),
2499 SCALE_SPLIT_ANGLE(-2.31480813026428),
2500 SCALE_SPLIT_ANGLE(-2.31722092628479),
2501 SCALE_SPLIT_ANGLE(-2.31885290145874)},
2502 {SCALE_SPLIT_ANGLE(-2.28808355331421),
2503 SCALE_SPLIT_ANGLE(-2.28864479064941),
2504 SCALE_SPLIT_ANGLE(-2.28949403762817),
2505 SCALE_SPLIT_ANGLE(-2.29160070419312),
2506 SCALE_SPLIT_ANGLE(-2.29361891746521),
2507 SCALE_SPLIT_ANGLE(-2.29675459861755),
2508 SCALE_SPLIT_ANGLE(-2.30169844627380),
2509 SCALE_SPLIT_ANGLE(-2.30503511428833)},
2510 {SCALE_SPLIT_ANGLE(-2.25191521644592),
2511 SCALE_SPLIT_ANGLE(-2.25312590599060),
2512 SCALE_SPLIT_ANGLE(-2.25494933128357),
2513 SCALE_SPLIT_ANGLE(-2.25943517684937),
2514 SCALE_SPLIT_ANGLE(-2.26368904113770),
2515 SCALE_SPLIT_ANGLE(-2.27023124694824),
2516 SCALE_SPLIT_ANGLE(-2.28044486045837),
2517 SCALE_SPLIT_ANGLE(-2.28732323646545)},
2518 {SCALE_SPLIT_ANGLE(-2.19093608856201),
2519 SCALE_SPLIT_ANGLE(-2.19366121292114),
2520 SCALE_SPLIT_ANGLE(-2.19773292541504),
2521 SCALE_SPLIT_ANGLE(-2.20759749412537),
2522 SCALE_SPLIT_ANGLE(-2.21677803993225),
2523 SCALE_SPLIT_ANGLE(-2.23064494132996),
2524 SCALE_SPLIT_ANGLE(-2.25193929672241),
2525 SCALE_SPLIT_ANGLE(-2.26625943183899)},
2526 {SCALE_SPLIT_ANGLE(-2.08102917671204),
2527 SCALE_SPLIT_ANGLE(-2.08757305145264),
2528 SCALE_SPLIT_ANGLE(-2.09720730781555),
2529 SCALE_SPLIT_ANGLE(-2.11991167068481),
2530 SCALE_SPLIT_ANGLE(-2.14035677909851),
2531 SCALE_SPLIT_ANGLE(-2.17029237747192),
2532 SCALE_SPLIT_ANGLE(-2.21503162384033),
2533 SCALE_SPLIT_ANGLE(-2.24518132209778)},
2534 {SCALE_SPLIT_ANGLE(-1.86738622188568),
2535 SCALE_SPLIT_ANGLE(-1.88426077365875),
2536 SCALE_SPLIT_ANGLE(-1.90853285789490),
2537 SCALE_SPLIT_ANGLE(-1.96333336830139),
2538 SCALE_SPLIT_ANGLE(-2.01024460792542),
2539 SCALE_SPLIT_ANGLE(-2.07577633857727),
2540 SCALE_SPLIT_ANGLE(-2.16986608505249),
2541 SCALE_SPLIT_ANGLE(-2.23406052589417)},
2542 {SCALE_SPLIT_ANGLE(-1.61812186241150),
2543 SCALE_SPLIT_ANGLE(-1.64943766593933),
2544 SCALE_SPLIT_ANGLE(-1.69389247894287),
2545 SCALE_SPLIT_ANGLE(-1.79176032543182),
2546 SCALE_SPLIT_ANGLE(-1.87292504310608),
2547 SCALE_SPLIT_ANGLE(-1.98277997970581),
2548 SCALE_SPLIT_ANGLE(-2.13605833053589),
2549 SCALE_SPLIT_ANGLE(-2.24282979965210)},
2550 {SCALE_SPLIT_ANGLE(-1.26556181907654),
2551 SCALE_SPLIT_ANGLE(-1.31512010097504),
2552 SCALE_SPLIT_ANGLE(-1.38608694076538),
2553 SCALE_SPLIT_ANGLE(-1.54419946670532),
2554 SCALE_SPLIT_ANGLE(-1.67621028423309),
2555 SCALE_SPLIT_ANGLE(-1.85417354106903),
2556 SCALE_SPLIT_ANGLE(-2.09956336021423),
2557 SCALE_SPLIT_ANGLE(-2.27729439735413)},
2558 {SCALE_SPLIT_ANGLE(-0.88984858989716),
2559 SCALE_SPLIT_ANGLE(-0.94673115015030),
2560 SCALE_SPLIT_ANGLE(-1.03102219104767),
2561 SCALE_SPLIT_ANGLE(-1.23219704627991),
2562 SCALE_SPLIT_ANGLE(-1.41468596458435),
2563 SCALE_SPLIT_ANGLE(-1.67807447910309),
2564 SCALE_SPLIT_ANGLE(-2.05749273300171),
2565 SCALE_SPLIT_ANGLE(-2.35138511657715)},
2566 {SCALE_SPLIT_ANGLE(-0.60630625486374),
2567 SCALE_SPLIT_ANGLE(-0.65551131963730),
2568 SCALE_SPLIT_ANGLE(-0.73032110929489),
2569 SCALE_SPLIT_ANGLE(-0.92225730419159),
2570 SCALE_SPLIT_ANGLE(-1.11866605281830),
2571 SCALE_SPLIT_ANGLE(-1.44806659221649),
2572 SCALE_SPLIT_ANGLE(-1.99872648715973),
2573 SCALE_SPLIT_ANGLE(-2.47302079200745)},
2574 {SCALE_SPLIT_ANGLE(-0.43393719196320),
2575 SCALE_SPLIT_ANGLE(-0.47099208831787),
2576 SCALE_SPLIT_ANGLE(-0.52780753374100),
2577 SCALE_SPLIT_ANGLE(-0.67895972728729),
2578 SCALE_SPLIT_ANGLE(-0.84712409973145),
2579 SCALE_SPLIT_ANGLE(-1.17809724807739),
2580 SCALE_SPLIT_ANGLE(-1.89703977108002),
2581 SCALE_SPLIT_ANGLE(-2.59155678749084)},
2582 {SCALE_SPLIT_ANGLE(-0.33522716164589),
2583 SCALE_SPLIT_ANGLE(-0.36133098602295),
2584 SCALE_SPLIT_ANGLE(-0.40159514546394),
2585 SCALE_SPLIT_ANGLE(-0.51039946079254),
2586 SCALE_SPLIT_ANGLE(-0.63590413331985),
2587 SCALE_SPLIT_ANGLE(-0.90812796354294),
2588 SCALE_SPLIT_ANGLE(-1.70793569087982),
2589 SCALE_SPLIT_ANGLE(-2.52852439880371)},
2590 {SCALE_SPLIT_ANGLE(-0.27478921413422),
2591 SCALE_SPLIT_ANGLE(-0.29251146316528),
2592 SCALE_SPLIT_ANGLE(-0.32007753849030),
2593 SCALE_SPLIT_ANGLE(-0.39531296491623),
2594 SCALE_SPLIT_ANGLE(-0.48291319608688),
2595 SCALE_SPLIT_ANGLE(-0.67812001705170),
2596 SCALE_SPLIT_ANGLE(-1.39007341861725),
2597 SCALE_SPLIT_ANGLE(-2.34402585029602)},
2598 {SCALE_SPLIT_ANGLE(-0.23185737431049),
2599 SCALE_SPLIT_ANGLE(-0.24370788037777),
2600 SCALE_SPLIT_ANGLE(-0.26227977871895),
2601 SCALE_SPLIT_ANGLE(-0.31327378749847),
2602 SCALE_SPLIT_ANGLE(-0.37241828441620),
2603 SCALE_SPLIT_ANGLE(-0.50202107429504),
2604 SCALE_SPLIT_ANGLE(-0.99085599184036),
2605 SCALE_SPLIT_ANGLE(-1.96553480625153)},
2606 {SCALE_SPLIT_ANGLE(-0.19698302447796),
2607 SCALE_SPLIT_ANGLE(-0.20488265156746),
2608 SCALE_SPLIT_ANGLE(-0.21731522679329),
2609 SCALE_SPLIT_ANGLE(-0.25148209929466),
2610 SCALE_SPLIT_ANGLE(-0.29065513610840),
2611 SCALE_SPLIT_ANGLE(-0.37341463565826),
2612 SCALE_SPLIT_ANGLE(-0.65295964479446),
2613 SCALE_SPLIT_ANGLE(-1.28865838050842)},
2614 {SCALE_SPLIT_ANGLE(-0.16667704284191),
2615 SCALE_SPLIT_ANGLE(-0.17194209992886),
2616 SCALE_SPLIT_ANGLE(-0.18023575842381),
2617 SCALE_SPLIT_ANGLE(-0.20293866097927),
2618 SCALE_SPLIT_ANGLE(-0.22855132818222),
2619 SCALE_SPLIT_ANGLE(-0.28041815757751),
2620 SCALE_SPLIT_ANGLE(-0.43142417073250),
2621 SCALE_SPLIT_ANGLE(-0.70030152797699)},
2622 {SCALE_SPLIT_ANGLE(-0.12773875892162),
2623 SCALE_SPLIT_ANGLE(-0.13059368729591),
2624 SCALE_SPLIT_ANGLE(-0.13507817685604),
2625 SCALE_SPLIT_ANGLE(-0.14721076190472),
2626 SCALE_SPLIT_ANGLE(-0.16052411496639),
2627 SCALE_SPLIT_ANGLE(-0.18590225279331),
2628 SCALE_SPLIT_ANGLE(-0.24703903496265),
2629 SCALE_SPLIT_ANGLE(-0.32153329253197)},
2630 {SCALE_SPLIT_ANGLE(-0.09603262692690),
2631 SCALE_SPLIT_ANGLE(-0.09756571799517),
2632 SCALE_SPLIT_ANGLE(-0.09996144473553),
2633 SCALE_SPLIT_ANGLE(-0.10635072737932),
2634 SCALE_SPLIT_ANGLE(-0.11317525804043),
2635 SCALE_SPLIT_ANGLE(-0.12554959952831),
2636 SCALE_SPLIT_ANGLE(-0.15168417990208),
2637 SCALE_SPLIT_ANGLE(-0.17713625729084)},
2638 {SCALE_SPLIT_ANGLE(-0.07104730606079),
2639 SCALE_SPLIT_ANGLE(-0.07186015695333),
2640 SCALE_SPLIT_ANGLE(-0.07312334328890),
2641 SCALE_SPLIT_ANGLE(-0.07644615322351),
2642 SCALE_SPLIT_ANGLE(-0.07991369068623),
2643 SCALE_SPLIT_ANGLE(-0.08596337586641),
2644 SCALE_SPLIT_ANGLE(-0.09766443073750),
2645 SCALE_SPLIT_ANGLE(-0.10767272859812)},
2646 {SCALE_SPLIT_ANGLE(-0.05192205309868),
2647 SCALE_SPLIT_ANGLE(-0.05234766378999),
2648 SCALE_SPLIT_ANGLE(-0.05300575867295),
2649 SCALE_SPLIT_ANGLE(-0.05471667274833),
2650 SCALE_SPLIT_ANGLE(-0.05646898224950),
2651 SCALE_SPLIT_ANGLE(-0.05943990871310),
2652 SCALE_SPLIT_ANGLE(-0.06485753506422),
2653 SCALE_SPLIT_ANGLE(-0.06914159655571)},
2654 {SCALE_SPLIT_ANGLE(-0.03760398924351),
2655 SCALE_SPLIT_ANGLE(-0.03782445192337),
2656 SCALE_SPLIT_ANGLE(-0.03816392645240),
2657 SCALE_SPLIT_ANGLE(-0.03903824090958),
2658 SCALE_SPLIT_ANGLE(-0.03992090001702),
2659 SCALE_SPLIT_ANGLE(-0.04138650000095),
2660 SCALE_SPLIT_ANGLE(-0.04395476356149),
2661 SCALE_SPLIT_ANGLE(-0.04588782414794)},
2662 {SCALE_SPLIT_ANGLE(-0.02166714519262),
2663 SCALE_SPLIT_ANGLE(-0.02173947915435),
2664 SCALE_SPLIT_ANGLE(-0.02185030654073),
2665 SCALE_SPLIT_ANGLE(-0.02213260345161),
2666 SCALE_SPLIT_ANGLE(-0.02241297997534),
2667 SCALE_SPLIT_ANGLE(-0.02286812663078),
2668 SCALE_SPLIT_ANGLE(-0.02363408729434),
2669 SCALE_SPLIT_ANGLE(-0.02418405003846)},
2670 {SCALE_SPLIT_ANGLE(-0.01235313713551),
2671 SCALE_SPLIT_ANGLE(-0.01237650867552),
2672 SCALE_SPLIT_ANGLE(-0.01241220720112),
2673 SCALE_SPLIT_ANGLE(-0.01250253617764),
2674 SCALE_SPLIT_ANGLE(-0.01259138714522),
2675 SCALE_SPLIT_ANGLE(-0.01273377239704),
2676 SCALE_SPLIT_ANGLE(-0.01296819653362),
2677 SCALE_SPLIT_ANGLE(-0.01313247904181)},
2678 {SCALE_SPLIT_ANGLE(-0.00700078438967),
2679 SCALE_SPLIT_ANGLE(-0.00700826710090),
2680 SCALE_SPLIT_ANGLE(-0.00701967626810),
2681 SCALE_SPLIT_ANGLE(-0.00704843178391),
2682 SCALE_SPLIT_ANGLE(-0.00707655726001),
2683 SCALE_SPLIT_ANGLE(-0.00712130265310),
2684 SCALE_SPLIT_ANGLE(-0.00719408923760),
2685 SCALE_SPLIT_ANGLE(-0.00724443932995)},
2686 {SCALE_SPLIT_ANGLE(-0.00395406875759),
2687 SCALE_SPLIT_ANGLE(-0.00395645154640),
2688 SCALE_SPLIT_ANGLE(-0.00396008091047),
2689 SCALE_SPLIT_ANGLE(-0.00396920833737),
2690 SCALE_SPLIT_ANGLE(-0.00397810759023),
2691 SCALE_SPLIT_ANGLE(-0.00399220641702),
2692 SCALE_SPLIT_ANGLE(-0.00401498842984),
2693 SCALE_SPLIT_ANGLE(-0.00403063651174)},
2694 {SCALE_SPLIT_ANGLE(-0.00000002236068),
2695 SCALE_SPLIT_ANGLE(-0.00000002236068),
2696 SCALE_SPLIT_ANGLE(-0.00000002236068),
2697 SCALE_SPLIT_ANGLE(-0.00000002236068),
2698 SCALE_SPLIT_ANGLE(-0.00000002236068),
2699 SCALE_SPLIT_ANGLE(-0.00000002236068),
2700 SCALE_SPLIT_ANGLE(-0.00000002236068),
2701 SCALE_SPLIT_ANGLE(-0.00000002236068)},
2702 },
2703 {
2704 {SCALE_SPLIT_ANGLE(-1.96349549293518),
2705 SCALE_SPLIT_ANGLE(-1.96349549293518),
2706 SCALE_SPLIT_ANGLE(-1.96349549293518),
2707 SCALE_SPLIT_ANGLE(-1.96349549293518),
2708 SCALE_SPLIT_ANGLE(-1.96349549293518),
2709 SCALE_SPLIT_ANGLE(-1.96349549293518),
2710 SCALE_SPLIT_ANGLE(-1.96349549293518),
2711 SCALE_SPLIT_ANGLE(-1.96349549293518)},
2712 {SCALE_SPLIT_ANGLE(-1.95824849605560),
2713 SCALE_SPLIT_ANGLE(-1.95825111865997),
2714 SCALE_SPLIT_ANGLE(-1.95825493335724),
2715 SCALE_SPLIT_ANGLE(-1.95826470851898),
2716 SCALE_SPLIT_ANGLE(-1.95827412605286),
2717 SCALE_SPLIT_ANGLE(-1.95828902721405),
2718 SCALE_SPLIT_ANGLE(-1.95831298828125),
2719 SCALE_SPLIT_ANGLE(-1.95832931995392)},
2720 {SCALE_SPLIT_ANGLE(-1.95409321784973),
2721 SCALE_SPLIT_ANGLE(-1.95410120487213),
2722 SCALE_SPLIT_ANGLE(-1.95411348342896),
2723 SCALE_SPLIT_ANGLE(-1.95414435863495),
2724 SCALE_SPLIT_ANGLE(-1.95417428016663),
2725 SCALE_SPLIT_ANGLE(-1.95422148704529),
2726 SCALE_SPLIT_ANGLE(-1.95429742336273),
2727 SCALE_SPLIT_ANGLE(-1.95434927940369)},
2728 {SCALE_SPLIT_ANGLE(-1.94654786586761),
2729 SCALE_SPLIT_ANGLE(-1.94657349586487),
2730 SCALE_SPLIT_ANGLE(-1.94661235809326),
2731 SCALE_SPLIT_ANGLE(-1.94671010971069),
2732 SCALE_SPLIT_ANGLE(-1.94680511951447),
2733 SCALE_SPLIT_ANGLE(-1.94695532321930),
2734 SCALE_SPLIT_ANGLE(-1.94719707965851),
2735 SCALE_SPLIT_ANGLE(-1.94736242294312)},
2736 {SCALE_SPLIT_ANGLE(-1.93263387680054),
2737 SCALE_SPLIT_ANGLE(-1.93271505832672),
2738 SCALE_SPLIT_ANGLE(-1.93283867835999),
2739 SCALE_SPLIT_ANGLE(-1.93314921855927),
2740 SCALE_SPLIT_ANGLE(-1.93345177173615),
2741 SCALE_SPLIT_ANGLE(-1.93393063545227),
2742 SCALE_SPLIT_ANGLE(-1.93470406532288),
2743 SCALE_SPLIT_ANGLE(-1.93523526191711)},
2744 {SCALE_SPLIT_ANGLE(-1.90630447864532),
2745 SCALE_SPLIT_ANGLE(-1.90656316280365),
2746 SCALE_SPLIT_ANGLE(-1.90695703029633),
2747 SCALE_SPLIT_ANGLE(-1.90794789791107),
2748 SCALE_SPLIT_ANGLE(-1.90891468524933),
2749 SCALE_SPLIT_ANGLE(-1.91044914722443),
2750 SCALE_SPLIT_ANGLE(-1.91294133663177),
2751 SCALE_SPLIT_ANGLE(-1.91466677188873)},
2752 {SCALE_SPLIT_ANGLE(-1.87960767745972),
2753 SCALE_SPLIT_ANGLE(-1.88012754917145),
2754 SCALE_SPLIT_ANGLE(-1.88091945648193),
2755 SCALE_SPLIT_ANGLE(-1.88291203975677),
2756 SCALE_SPLIT_ANGLE(-1.88485789299011),
2757 SCALE_SPLIT_ANGLE(-1.88795256614685),
2758 SCALE_SPLIT_ANGLE(-1.89300417900085),
2759 SCALE_SPLIT_ANGLE(-1.89653015136719)},
2760 {SCALE_SPLIT_ANGLE(-1.83877408504486),
2761 SCALE_SPLIT_ANGLE(-1.83982253074646),
2762 SCALE_SPLIT_ANGLE(-1.84141874313354),
2763 SCALE_SPLIT_ANGLE(-1.84543371200562),
2764 SCALE_SPLIT_ANGLE(-1.84935557842255),
2765 SCALE_SPLIT_ANGLE(-1.85560452938080),
2766 SCALE_SPLIT_ANGLE(-1.86587750911713),
2767 SCALE_SPLIT_ANGLE(-1.87314093112946)},
2768 {SCALE_SPLIT_ANGLE(-1.77493441104889),
2769 SCALE_SPLIT_ANGLE(-1.77705287933350),
2770 SCALE_SPLIT_ANGLE(-1.78027486801147),
2771 SCALE_SPLIT_ANGLE(-1.78836560249329),
2772 SCALE_SPLIT_ANGLE(-1.79626119136810),
2773 SCALE_SPLIT_ANGLE(-1.80886065959930),
2774 SCALE_SPLIT_ANGLE(-1.82978057861328),
2775 SCALE_SPLIT_ANGLE(-1.84489572048187)},
2776 {SCALE_SPLIT_ANGLE(-1.67321836948395),
2777 SCALE_SPLIT_ANGLE(-1.67747676372528),
2778 SCALE_SPLIT_ANGLE(-1.68394041061401),
2779 SCALE_SPLIT_ANGLE(-1.70011758804321),
2780 SCALE_SPLIT_ANGLE(-1.71586525440216),
2781 SCALE_SPLIT_ANGLE(-1.74102890491486),
2782 SCALE_SPLIT_ANGLE(-1.78345453739166),
2783 SCALE_SPLIT_ANGLE(-1.81531310081482)},
2784 {SCALE_SPLIT_ANGLE(-1.51132130622864),
2785 SCALE_SPLIT_ANGLE(-1.51959407329559),
2786 SCALE_SPLIT_ANGLE(-1.53212583065033),
2787 SCALE_SPLIT_ANGLE(-1.56339812278748),
2788 SCALE_SPLIT_ANGLE(-1.59380078315735),
2789 SCALE_SPLIT_ANGLE(-1.64260387420654),
2790 SCALE_SPLIT_ANGLE(-1.72719144821167),
2791 SCALE_SPLIT_ANGLE(-1.79549288749695)},
2792 {SCALE_SPLIT_ANGLE(-1.35904073715210),
2793 SCALE_SPLIT_ANGLE(-1.37121629714966),
2794 SCALE_SPLIT_ANGLE(-1.38967263698578),
2795 SCALE_SPLIT_ANGLE(-1.43583405017853),
2796 SCALE_SPLIT_ANGLE(-1.48093712329865),
2797 SCALE_SPLIT_ANGLE(-1.55410349369049),
2798 SCALE_SPLIT_ANGLE(-1.68521809577942),
2799 SCALE_SPLIT_ANGLE(-1.80024909973145)},
2800 {SCALE_SPLIT_ANGLE(-1.17258918285370),
2801 SCALE_SPLIT_ANGLE(-1.18893885612488),
2802 SCALE_SPLIT_ANGLE(-1.21383893489838),
2803 SCALE_SPLIT_ANGLE(-1.27678334712982),
2804 SCALE_SPLIT_ANGLE(-1.33930444717407),
2805 SCALE_SPLIT_ANGLE(-1.44322550296783),
2806 SCALE_SPLIT_ANGLE(-1.64006841182709),
2807 SCALE_SPLIT_ANGLE(-1.83627629280090)},
2808 {SCALE_SPLIT_ANGLE(-0.96933782100677),
2809 SCALE_SPLIT_ANGLE(-0.98854482173920),
2810 SCALE_SPLIT_ANGLE(-1.01807177066803),
2811 SCALE_SPLIT_ANGLE(-1.09429979324341),
2812 SCALE_SPLIT_ANGLE(-1.17245376110077),
2813 SCALE_SPLIT_ANGLE(-1.30826890468597),
2814 SCALE_SPLIT_ANGLE(-1.58911192417145),
2815 SCALE_SPLIT_ANGLE(-1.92719459533691)},
2816 {SCALE_SPLIT_ANGLE(-0.77729856967926),
2817 SCALE_SPLIT_ANGLE(-0.79675692319870),
2818 SCALE_SPLIT_ANGLE(-0.82701623439789),
2819 SCALE_SPLIT_ANGLE(-0.90724974870682),
2820 SCALE_SPLIT_ANGLE(-0.99302661418915),
2821 SCALE_SPLIT_ANGLE(-1.15164005756378),
2822 SCALE_SPLIT_ANGLE(-1.52265238761902),
2823 SCALE_SPLIT_ANGLE(-2.09869647026062)},
2824 {SCALE_SPLIT_ANGLE(-0.61765122413635),
2825 SCALE_SPLIT_ANGLE(-0.63503879308701),
2826 SCALE_SPLIT_ANGLE(-0.66235071420670),
2827 SCALE_SPLIT_ANGLE(-0.73653644323349),
2828 SCALE_SPLIT_ANGLE(-0.81904625892639),
2829 SCALE_SPLIT_ANGLE(-0.98174780607224),
2830 SCALE_SPLIT_ANGLE(-1.42110574245453),
2831 SCALE_SPLIT_ANGLE(-2.28386068344116)},
2832 {SCALE_SPLIT_ANGLE(-0.49486327171326),
2833 SCALE_SPLIT_ANGLE(-0.50909572839737),
2834 SCALE_SPLIT_ANGLE(-0.53160977363586),
2835 SCALE_SPLIT_ANGLE(-0.59379214048386),
2836 SCALE_SPLIT_ANGLE(-0.66487479209900),
2837 SCALE_SPLIT_ANGLE(-0.81185555458069),
2838 SCALE_SPLIT_ANGLE(-1.26233398914337),
2839 SCALE_SPLIT_ANGLE(-2.16925764083862)},
2840 {SCALE_SPLIT_ANGLE(-0.40230554342270),
2841 SCALE_SPLIT_ANGLE(-0.41332268714905),
2842 SCALE_SPLIT_ANGLE(-0.43082219362259),
2843 SCALE_SPLIT_ANGLE(-0.47957947850227),
2844 SCALE_SPLIT_ANGLE(-0.53603595495224),
2845 SCALE_SPLIT_ANGLE(-0.65522664785385),
2846 SCALE_SPLIT_ANGLE(-1.04503870010376),
2847 SCALE_SPLIT_ANGLE(-1.87041819095612)},
2848 {SCALE_SPLIT_ANGLE(-0.33104604482651),
2849 SCALE_SPLIT_ANGLE(-0.33927723765373),
2850 SCALE_SPLIT_ANGLE(-0.35237133502960),
2851 SCALE_SPLIT_ANGLE(-0.38892474770546),
2852 SCALE_SPLIT_ANGLE(-0.43126162886620),
2853 SCALE_SPLIT_ANGLE(-0.52027010917664),
2854 SCALE_SPLIT_ANGLE(-0.80654197931290),
2855 SCALE_SPLIT_ANGLE(-1.41960346698761)},
2856 {SCALE_SPLIT_ANGLE(-0.27415531873703),
2857 SCALE_SPLIT_ANGLE(-0.28015667200089),
2858 SCALE_SPLIT_ANGLE(-0.28969678282738),
2859 SCALE_SPLIT_ANGLE(-0.31623727083206),
2860 SCALE_SPLIT_ANGLE(-0.34670370817184),
2861 SCALE_SPLIT_ANGLE(-0.40939208865166),
2862 SCALE_SPLIT_ANGLE(-0.59604328870773),
2863 SCALE_SPLIT_ANGLE(-0.94309812784195)},
2864 {SCALE_SPLIT_ANGLE(-0.22730343043804),
2865 SCALE_SPLIT_ANGLE(-0.23159568011761),
2866 SCALE_SPLIT_ANGLE(-0.23840220272541),
2867 SCALE_SPLIT_ANGLE(-0.25720024108887),
2868 SCALE_SPLIT_ANGLE(-0.27846288681030),
2869 SCALE_SPLIT_ANGLE(-0.32089167833328),
2870 SCALE_SPLIT_ANGLE(-0.43515858054161),
2871 SCALE_SPLIT_ANGLE(-0.60622000694275)},
2872 {SCALE_SPLIT_ANGLE(-0.17074464261532),
2873 SCALE_SPLIT_ANGLE(-0.17326098680496),
2874 SCALE_SPLIT_ANGLE(-0.17722851037979),
2875 SCALE_SPLIT_ANGLE(-0.18802368640900),
2876 SCALE_SPLIT_ANGLE(-0.19990929961205),
2877 SCALE_SPLIT_ANGLE(-0.22246663272381),
2878 SCALE_SPLIT_ANGLE(-0.27514943480492),
2879 SCALE_SPLIT_ANGLE(-0.33505329489708)},
2880 {SCALE_SPLIT_ANGLE(-0.12695816159248),
2881 SCALE_SPLIT_ANGLE(-0.12838459014893),
2882 SCALE_SPLIT_ANGLE(-0.13061878085136),
2883 SCALE_SPLIT_ANGLE(-0.13660037517548),
2884 SCALE_SPLIT_ANGLE(-0.14301039278507),
2885 SCALE_SPLIT_ANGLE(-0.15463486313820),
2886 SCALE_SPLIT_ANGLE(-0.17893928289413),
2887 SCALE_SPLIT_ANGLE(-0.20203559100628)},
2888 {SCALE_SPLIT_ANGLE(-0.09338590502739),
2889 SCALE_SPLIT_ANGLE(-0.09417138248682),
2890 SCALE_SPLIT_ANGLE(-0.09539389610291),
2891 SCALE_SPLIT_ANGLE(-0.09861853718758),
2892 SCALE_SPLIT_ANGLE(-0.10199318081141),
2893 SCALE_SPLIT_ANGLE(-0.10789106041193),
2894 SCALE_SPLIT_ANGLE(-0.11927829682827),
2895 SCALE_SPLIT_ANGLE(-0.12894384562969)},
2896 {SCALE_SPLIT_ANGLE(-0.06804534792900),
2897 SCALE_SPLIT_ANGLE(-0.06846774369478),
2898 SCALE_SPLIT_ANGLE(-0.06912153959274),
2899 SCALE_SPLIT_ANGLE(-0.07082460820675),
2900 SCALE_SPLIT_ANGLE(-0.07257289439440),
2901 SCALE_SPLIT_ANGLE(-0.07554303109646),
2902 SCALE_SPLIT_ANGLE(-0.08096560835838),
2903 SCALE_SPLIT_ANGLE(-0.08524779230356)},
2904 {SCALE_SPLIT_ANGLE(-0.04920703917742),
2905 SCALE_SPLIT_ANGLE(-0.04942998290062),
2906 SCALE_SPLIT_ANGLE(-0.04977353662252),
2907 SCALE_SPLIT_ANGLE(-0.05065960064530),
2908 SCALE_SPLIT_ANGLE(-0.05155571177602),
2909 SCALE_SPLIT_ANGLE(-0.05304637178779),
2910 SCALE_SPLIT_ANGLE(-0.05566369369626),
2911 SCALE_SPLIT_ANGLE(-0.05763531103730)},
2912 {SCALE_SPLIT_ANGLE(-0.02832321636379),
2913 SCALE_SPLIT_ANGLE(-0.02839783579111),
2914 SCALE_SPLIT_ANGLE(-0.02851220592856),
2915 SCALE_SPLIT_ANGLE(-0.02880378812551),
2916 SCALE_SPLIT_ANGLE(-0.02909369207919),
2917 SCALE_SPLIT_ANGLE(-0.02956490218639),
2918 SCALE_SPLIT_ANGLE(-0.03035926632583),
2919 SCALE_SPLIT_ANGLE(-0.03093044646084)},
2920 {SCALE_SPLIT_ANGLE(-0.01614263094962),
2921 SCALE_SPLIT_ANGLE(-0.01616701111197),
2922 SCALE_SPLIT_ANGLE(-0.01620426028967),
2923 SCALE_SPLIT_ANGLE(-0.01629855856299),
2924 SCALE_SPLIT_ANGLE(-0.01639137044549),
2925 SCALE_SPLIT_ANGLE(-0.01654022000730),
2926 SCALE_SPLIT_ANGLE(-0.01678557321429),
2927 SCALE_SPLIT_ANGLE(-0.01695770025253)},
2928 {SCALE_SPLIT_ANGLE(-0.00914741121233),
2929 SCALE_SPLIT_ANGLE(-0.00915526598692),
2930 SCALE_SPLIT_ANGLE(-0.00916724465787),
2931 SCALE_SPLIT_ANGLE(-0.00919744279236),
2932 SCALE_SPLIT_ANGLE(-0.00922699086368),
2933 SCALE_SPLIT_ANGLE(-0.00927401985973),
2934 SCALE_SPLIT_ANGLE(-0.00935057457536),
2935 SCALE_SPLIT_ANGLE(-0.00940357148647)},
2936 {SCALE_SPLIT_ANGLE(-0.00516631966457),
2937 SCALE_SPLIT_ANGLE(-0.00516883004457),
2938 SCALE_SPLIT_ANGLE(-0.00517265358940),
2939 SCALE_SPLIT_ANGLE(-0.00518227042630),
2940 SCALE_SPLIT_ANGLE(-0.00519164977595),
2941 SCALE_SPLIT_ANGLE(-0.00520651368424),
2942 SCALE_SPLIT_ANGLE(-0.00523054040968),
2943 SCALE_SPLIT_ANGLE(-0.00524705089629)},
2944 {SCALE_SPLIT_ANGLE(-0.00000002921564),
2945 SCALE_SPLIT_ANGLE(-0.00000002921564),
2946 SCALE_SPLIT_ANGLE(-0.00000002921564),
2947 SCALE_SPLIT_ANGLE(-0.00000002921564),
2948 SCALE_SPLIT_ANGLE(-0.00000002921564),
2949 SCALE_SPLIT_ANGLE(-0.00000002921564),
2950 SCALE_SPLIT_ANGLE(-0.00000002921564),
2951 SCALE_SPLIT_ANGLE(-0.00000002921564)},
2952 },
2953 {
2954 {SCALE_SPLIT_ANGLE(-1.57079625129700),
2955 SCALE_SPLIT_ANGLE(-1.57079625129700),
2956 SCALE_SPLIT_ANGLE(-1.57079625129700),
2957 SCALE_SPLIT_ANGLE(-1.57079625129700),
2958 SCALE_SPLIT_ANGLE(-1.57079625129700),
2959 SCALE_SPLIT_ANGLE(-1.57079625129700),
2960 SCALE_SPLIT_ANGLE(-1.57079625129700),
2961 SCALE_SPLIT_ANGLE(-1.57079625129700)},
2962 {SCALE_SPLIT_ANGLE(-1.56514143943787),
2963 SCALE_SPLIT_ANGLE(-1.56514346599579),
2964 SCALE_SPLIT_ANGLE(-1.56514644622803),
2965 SCALE_SPLIT_ANGLE(-1.56515395641327),
2966 SCALE_SPLIT_ANGLE(-1.56516134738922),
2967 SCALE_SPLIT_ANGLE(-1.56517291069031),
2968 SCALE_SPLIT_ANGLE(-1.56519162654877),
2969 SCALE_SPLIT_ANGLE(-1.56520438194275)},
2970 {SCALE_SPLIT_ANGLE(-1.56069743633270),
2971 SCALE_SPLIT_ANGLE(-1.56070363521576),
2972 SCALE_SPLIT_ANGLE(-1.56071305274963),
2973 SCALE_SPLIT_ANGLE(-1.56073689460754),
2974 SCALE_SPLIT_ANGLE(-1.56076002120972),
2975 SCALE_SPLIT_ANGLE(-1.56079661846161),
2976 SCALE_SPLIT_ANGLE(-1.56085574626923),
2977 SCALE_SPLIT_ANGLE(-1.56089639663696)},
2978 {SCALE_SPLIT_ANGLE(-1.55270349979401),
2979 SCALE_SPLIT_ANGLE(-1.55272293090820),
2980 SCALE_SPLIT_ANGLE(-1.55275249481201),
2981 SCALE_SPLIT_ANGLE(-1.55282700061798),
2982 SCALE_SPLIT_ANGLE(-1.55289971828461),
2983 SCALE_SPLIT_ANGLE(-1.55301535129547),
2984 SCALE_SPLIT_ANGLE(-1.55320298671722),
2985 SCALE_SPLIT_ANGLE(-1.55333244800568)},
2986 {SCALE_SPLIT_ANGLE(-1.53820896148682),
2987 SCALE_SPLIT_ANGLE(-1.53826904296875),
2988 SCALE_SPLIT_ANGLE(-1.53836083412170),
2989 SCALE_SPLIT_ANGLE(-1.53859269618988),
2990 SCALE_SPLIT_ANGLE(-1.53882038593292),
2991 SCALE_SPLIT_ANGLE(-1.53918409347534),
2992 SCALE_SPLIT_ANGLE(-1.53978025913239),
2993 SCALE_SPLIT_ANGLE(-1.54019618034363)},
2994 {SCALE_SPLIT_ANGLE(-1.51160359382629),
2995 SCALE_SPLIT_ANGLE(-1.51178681850433),
2996 SCALE_SPLIT_ANGLE(-1.51206707954407),
2997 SCALE_SPLIT_ANGLE(-1.51277911663055),
2998 SCALE_SPLIT_ANGLE(-1.51348364353180),
2999 SCALE_SPLIT_ANGLE(-1.51462137699127),
3000 SCALE_SPLIT_ANGLE(-1.51652014255524),
3001 SCALE_SPLIT_ANGLE(-1.51787149906158)},
3002 {SCALE_SPLIT_ANGLE(-1.48564028739929),
3003 SCALE_SPLIT_ANGLE(-1.48599267005920),
3004 SCALE_SPLIT_ANGLE(-1.48653328418732),
3005 SCALE_SPLIT_ANGLE(-1.48791313171387),
3006 SCALE_SPLIT_ANGLE(-1.48928785324097),
3007 SCALE_SPLIT_ANGLE(-1.49152994155884),
3008 SCALE_SPLIT_ANGLE(-1.49533629417419),
3009 SCALE_SPLIT_ANGLE(-1.49810016155243)},
3010 {SCALE_SPLIT_ANGLE(-1.44770431518555),
3011 SCALE_SPLIT_ANGLE(-1.44837117195129),
3012 SCALE_SPLIT_ANGLE(-1.44939672946930),
3013 SCALE_SPLIT_ANGLE(-1.45203149318695),
3014 SCALE_SPLIT_ANGLE(-1.45468175411224),
3015 SCALE_SPLIT_ANGLE(-1.45906174182892),
3016 SCALE_SPLIT_ANGLE(-1.46668362617493),
3017 SCALE_SPLIT_ANGLE(-1.47238755226135)},
3018 {SCALE_SPLIT_ANGLE(-1.39214622974396),
3019 SCALE_SPLIT_ANGLE(-1.39337480068207),
3020 SCALE_SPLIT_ANGLE(-1.39527142047882),
3021 SCALE_SPLIT_ANGLE(-1.40018463134766),
3022 SCALE_SPLIT_ANGLE(-1.40518975257874),
3023 SCALE_SPLIT_ANGLE(-1.41361439228058),
3024 SCALE_SPLIT_ANGLE(-1.42880713939667),
3025 SCALE_SPLIT_ANGLE(-1.44072234630585)},
3026 {SCALE_SPLIT_ANGLE(-1.31133687496185),
3027 SCALE_SPLIT_ANGLE(-1.31350564956665),
3028 SCALE_SPLIT_ANGLE(-1.31686961650848),
3029 SCALE_SPLIT_ANGLE(-1.32567894458771),
3030 SCALE_SPLIT_ANGLE(-1.33480489253998),
3031 SCALE_SPLIT_ANGLE(-1.35055565834045),
3032 SCALE_SPLIT_ANGLE(-1.38048458099365),
3033 SCALE_SPLIT_ANGLE(-1.40579903125763)},
3034 {SCALE_SPLIT_ANGLE(-1.19695889949799),
3035 SCALE_SPLIT_ANGLE(-1.20052516460419),
3036 SCALE_SPLIT_ANGLE(-1.20609176158905),
3037 SCALE_SPLIT_ANGLE(-1.22087824344635),
3038 SCALE_SPLIT_ANGLE(-1.23654139041901),
3039 SCALE_SPLIT_ANGLE(-1.26451897621155),
3040 SCALE_SPLIT_ANGLE(-1.32194638252258),
3041 SCALE_SPLIT_ANGLE(-1.37709844112396)},
3042 {SCALE_SPLIT_ANGLE(-1.09969496726990),
3043 SCALE_SPLIT_ANGLE(-1.10437369346619),
3044 SCALE_SPLIT_ANGLE(-1.11171460151672),
3045 SCALE_SPLIT_ANGLE(-1.13144767284393),
3046 SCALE_SPLIT_ANGLE(-1.15274536609650),
3047 SCALE_SPLIT_ANGLE(-1.19192278385162),
3048 SCALE_SPLIT_ANGLE(-1.27820122241974),
3049 SCALE_SPLIT_ANGLE(-1.37287354469299)},
3050 {SCALE_SPLIT_ANGLE(-0.98739635944366),
3051 SCALE_SPLIT_ANGLE(-0.99314498901367),
3052 SCALE_SPLIT_ANGLE(-1.00221848487854),
3053 SCALE_SPLIT_ANGLE(-1.02694928646088),
3054 SCALE_SPLIT_ANGLE(-1.05423069000244),
3055 SCALE_SPLIT_ANGLE(-1.10619938373566),
3056 SCALE_SPLIT_ANGLE(-1.23116791248322),
3057 SCALE_SPLIT_ANGLE(-1.39771783351898)},
3058 {SCALE_SPLIT_ANGLE(-0.86566168069839),
3059 SCALE_SPLIT_ANGLE(-0.87219274044037),
3060 SCALE_SPLIT_ANGLE(-0.88256770372391),
3061 SCALE_SPLIT_ANGLE(-0.91127198934555),
3062 SCALE_SPLIT_ANGLE(-0.94370102882385),
3063 SCALE_SPLIT_ANGLE(-1.00792455673218),
3064 SCALE_SPLIT_ANGLE(-1.17914199829102),
3065 SCALE_SPLIT_ANGLE(-1.48121190071106)},
3066 {SCALE_SPLIT_ANGLE(-0.74293029308319),
3067 SCALE_SPLIT_ANGLE(-0.74975663423538),
3068 SCALE_SPLIT_ANGLE(-0.76066619157791),
3069 SCALE_SPLIT_ANGLE(-0.79128366708755),
3070 SCALE_SPLIT_ANGLE(-0.82667875289917),
3071 SCALE_SPLIT_ANGLE(-0.89952337741852),
3072 SCALE_SPLIT_ANGLE(-1.11571288108826),
3073 SCALE_SPLIT_ANGLE(-1.67431199550629)},
3074 {SCALE_SPLIT_ANGLE(-0.62761706113815),
3075 SCALE_SPLIT_ANGLE(-0.63421267271042),
3076 SCALE_SPLIT_ANGLE(-0.64480352401733),
3077 SCALE_SPLIT_ANGLE(-0.67486244440079),
3078 SCALE_SPLIT_ANGLE(-0.71025305986404),
3079 SCALE_SPLIT_ANGLE(-0.78539818525314),
3080 SCALE_SPLIT_ANGLE(-1.02937340736389),
3081 SCALE_SPLIT_ANGLE(-1.92301476001740)},
3082 {SCALE_SPLIT_ANGLE(-0.52522456645966),
3083 SCALE_SPLIT_ANGLE(-0.53118568658829),
3084 SCALE_SPLIT_ANGLE(-0.54078328609467),
3085 SCALE_SPLIT_ANGLE(-0.56819742918015),
3086 SCALE_SPLIT_ANGLE(-0.60080897808075),
3087 SCALE_SPLIT_ANGLE(-0.67127293348312),
3088 SCALE_SPLIT_ANGLE(-0.91114157438278),
3089 SCALE_SPLIT_ANGLE(-1.73398244380951)},
3090 {SCALE_SPLIT_ANGLE(-0.43751952052116),
3091 SCALE_SPLIT_ANGLE(-0.44262495636940),
3092 SCALE_SPLIT_ANGLE(-0.45084837079048),
3093 SCALE_SPLIT_ANGLE(-0.47435706853867),
3094 SCALE_SPLIT_ANGLE(-0.50235128402710),
3095 SCALE_SPLIT_ANGLE(-0.56287175416946),
3096 SCALE_SPLIT_ANGLE(-0.76705116033554),
3097 SCALE_SPLIT_ANGLE(-1.34888231754303)},
3098 {SCALE_SPLIT_ANGLE(-0.36364197731018),
3099 SCALE_SPLIT_ANGLE(-0.36782836914063),
3100 SCALE_SPLIT_ANGLE(-0.37456014752388),
3101 SCALE_SPLIT_ANGLE(-0.39372298121452),
3102 SCALE_SPLIT_ANGLE(-0.41636970639229),
3103 SCALE_SPLIT_ANGLE(-0.46459695696831),
3104 SCALE_SPLIT_ANGLE(-0.61803078651428),
3105 SCALE_SPLIT_ANGLE(-0.96275907754898)},
3106 {SCALE_SPLIT_ANGLE(-0.30166232585907),
3107 SCALE_SPLIT_ANGLE(-0.30497136712074),
3108 SCALE_SPLIT_ANGLE(-0.31027451157570),
3109 SCALE_SPLIT_ANGLE(-0.32524627447128),
3110 SCALE_SPLIT_ANGLE(-0.34269106388092),
3111 SCALE_SPLIT_ANGLE(-0.37887355685234),
3112 SCALE_SPLIT_ANGLE(-0.48432540893555),
3113 SCALE_SPLIT_ANGLE(-0.66878592967987)},
3114 {SCALE_SPLIT_ANGLE(-0.24960109591484),
3115 SCALE_SPLIT_ANGLE(-0.25213342905045),
3116 SCALE_SPLIT_ANGLE(-0.25617361068726),
3117 SCALE_SPLIT_ANGLE(-0.26745575666428),
3118 SCALE_SPLIT_ANGLE(-0.28036275506020),
3119 SCALE_SPLIT_ANGLE(-0.30627736449242),
3120 SCALE_SPLIT_ANGLE(-0.37490698695183),
3121 SCALE_SPLIT_ANGLE(-0.47145301103592)},
3122 {SCALE_SPLIT_ANGLE(-0.18661488592625),
3123 SCALE_SPLIT_ANGLE(-0.18822199106216),
3124 SCALE_SPLIT_ANGLE(-0.19076594710350),
3125 SCALE_SPLIT_ANGLE(-0.19773861765862),
3126 SCALE_SPLIT_ANGLE(-0.20547652244568),
3127 SCALE_SPLIT_ANGLE(-0.22024063766003),
3128 SCALE_SPLIT_ANGLE(-0.25452125072479),
3129 SCALE_SPLIT_ANGLE(-0.29236793518066)},
3130 {SCALE_SPLIT_ANGLE(-0.13821771740913),
3131 SCALE_SPLIT_ANGLE(-0.13918289542198),
3132 SCALE_SPLIT_ANGLE(-0.14069861173630),
3133 SCALE_SPLIT_ANGLE(-0.14477686583996),
3134 SCALE_SPLIT_ANGLE(-0.14917232096195),
3135 SCALE_SPLIT_ANGLE(-0.15718193352222),
3136 SCALE_SPLIT_ANGLE(-0.17394064366817),
3137 SCALE_SPLIT_ANGLE(-0.18971265852451)},
3138 {SCALE_SPLIT_ANGLE(-0.10140904784203),
3139 SCALE_SPLIT_ANGLE(-0.10196315497160),
3140 SCALE_SPLIT_ANGLE(-0.10282710194588),
3141 SCALE_SPLIT_ANGLE(-0.10511382669210),
3142 SCALE_SPLIT_ANGLE(-0.10751703381538),
3143 SCALE_SPLIT_ANGLE(-0.11173453181982),
3144 SCALE_SPLIT_ANGLE(-0.11990433931351),
3145 SCALE_SPLIT_ANGLE(-0.12683042883873)},
3146 {SCALE_SPLIT_ANGLE(-0.07378087192774),
3147 SCALE_SPLIT_ANGLE(-0.07408788800240),
3148 SCALE_SPLIT_ANGLE(-0.07456368207932),
3149 SCALE_SPLIT_ANGLE(-0.07580613344908),
3150 SCALE_SPLIT_ANGLE(-0.07708552479744),
3151 SCALE_SPLIT_ANGLE(-0.07926639169455),
3152 SCALE_SPLIT_ANGLE(-0.08326309919357),
3153 SCALE_SPLIT_ANGLE(-0.08642497658730)},
3154 {SCALE_SPLIT_ANGLE(-0.05331044271588),
3155 SCALE_SPLIT_ANGLE(-0.05347600579262),
3156 SCALE_SPLIT_ANGLE(-0.05373133346438),
3157 SCALE_SPLIT_ANGLE(-0.05439101532102),
3158 SCALE_SPLIT_ANGLE(-0.05505971238017),
3159 SCALE_SPLIT_ANGLE(-0.05617496743798),
3160 SCALE_SPLIT_ANGLE(-0.05813983827829),
3161 SCALE_SPLIT_ANGLE(-0.05962376296520)},
3162 {SCALE_SPLIT_ANGLE(-0.03066622652113),
3163 SCALE_SPLIT_ANGLE(-0.03072291985154),
3164 SCALE_SPLIT_ANGLE(-0.03080986253917),
3165 SCALE_SPLIT_ANGLE(-0.03103173524141),
3166 SCALE_SPLIT_ANGLE(-0.03125262632966),
3167 SCALE_SPLIT_ANGLE(-0.03161224350333),
3168 SCALE_SPLIT_ANGLE(-0.03221990913153),
3169 SCALE_SPLIT_ANGLE(-0.03265778720379)},
3170 {SCALE_SPLIT_ANGLE(-0.01747439615428),
3171 SCALE_SPLIT_ANGLE(-0.01749316416681),
3172 SCALE_SPLIT_ANGLE(-0.01752184517682),
3173 SCALE_SPLIT_ANGLE(-0.01759449020028),
3174 SCALE_SPLIT_ANGLE(-0.01766604930162),
3175 SCALE_SPLIT_ANGLE(-0.01778092049062),
3176 SCALE_SPLIT_ANGLE(-0.01797054335475),
3177 SCALE_SPLIT_ANGLE(-0.01810375973582)},
3178 {SCALE_SPLIT_ANGLE(-0.00990140344948),
3179 SCALE_SPLIT_ANGLE(-0.00990749336779),
3180 SCALE_SPLIT_ANGLE(-0.00991678331047),
3181 SCALE_SPLIT_ANGLE(-0.00994021166116),
3182 SCALE_SPLIT_ANGLE(-0.00996314454824),
3183 SCALE_SPLIT_ANGLE(-0.00999966636300),
3184 SCALE_SPLIT_ANGLE(-0.01005917042494),
3185 SCALE_SPLIT_ANGLE(-0.01010039448738)},
3186 {SCALE_SPLIT_ANGLE(-0.00559204118326),
3187 SCALE_SPLIT_ANGLE(-0.00559399509802),
3188 SCALE_SPLIT_ANGLE(-0.00559697346762),
3189 SCALE_SPLIT_ANGLE(-0.00560446362942),
3190 SCALE_SPLIT_ANGLE(-0.00561177125201),
3191 SCALE_SPLIT_ANGLE(-0.00562335411087),
3192 SCALE_SPLIT_ANGLE(-0.00564208766446),
3193 SCALE_SPLIT_ANGLE(-0.00565496599302)},
3194 {SCALE_SPLIT_ANGLE(-0.00000003162278),
3195 SCALE_SPLIT_ANGLE(-0.00000003162278),
3196 SCALE_SPLIT_ANGLE(-0.00000003162278),
3197 SCALE_SPLIT_ANGLE(-0.00000003162278),
3198 SCALE_SPLIT_ANGLE(-0.00000003162278),
3199 SCALE_SPLIT_ANGLE(-0.00000003162278),
3200 SCALE_SPLIT_ANGLE(-0.00000003162278),
3201 SCALE_SPLIT_ANGLE(-0.00000003162278)},
3202 },
3203 {
3204 {SCALE_SPLIT_ANGLE(-1.17809700965881),
3205 SCALE_SPLIT_ANGLE(-1.17809700965881),
3206 SCALE_SPLIT_ANGLE(-1.17809700965881),
3207 SCALE_SPLIT_ANGLE(-1.17809700965881),
3208 SCALE_SPLIT_ANGLE(-1.17809700965881),
3209 SCALE_SPLIT_ANGLE(-1.17809700965881),
3210 SCALE_SPLIT_ANGLE(-1.17809700965881),
3211 SCALE_SPLIT_ANGLE(-1.17809700965881)},
3212 {SCALE_SPLIT_ANGLE(-1.17289507389069),
3213 SCALE_SPLIT_ANGLE(-1.17289614677429),
3214 SCALE_SPLIT_ANGLE(-1.17289793491364),
3215 SCALE_SPLIT_ANGLE(-1.17290210723877),
3216 SCALE_SPLIT_ANGLE(-1.17290627956390),
3217 SCALE_SPLIT_ANGLE(-1.17291295528412),
3218 SCALE_SPLIT_ANGLE(-1.17292356491089),
3219 SCALE_SPLIT_ANGLE(-1.17293083667755)},
3220 {SCALE_SPLIT_ANGLE(-1.16883778572083),
3221 SCALE_SPLIT_ANGLE(-1.16884136199951),
3222 SCALE_SPLIT_ANGLE(-1.16884660720825),
3223 SCALE_SPLIT_ANGLE(-1.16885995864868),
3224 SCALE_SPLIT_ANGLE(-1.16887307167053),
3225 SCALE_SPLIT_ANGLE(-1.16889369487762),
3226 SCALE_SPLIT_ANGLE(-1.16892731189728),
3227 SCALE_SPLIT_ANGLE(-1.16895043849945)},
3228 {SCALE_SPLIT_ANGLE(-1.16160643100739),
3229 SCALE_SPLIT_ANGLE(-1.16161715984344),
3230 SCALE_SPLIT_ANGLE(-1.16163349151611),
3231 SCALE_SPLIT_ANGLE(-1.16167497634888),
3232 SCALE_SPLIT_ANGLE(-1.16171550750732),
3233 SCALE_SPLIT_ANGLE(-1.16178035736084),
3234 SCALE_SPLIT_ANGLE(-1.16188645362854),
3235 SCALE_SPLIT_ANGLE(-1.16196036338806)},
3236 {SCALE_SPLIT_ANGLE(-1.14870381355286),
3237 SCALE_SPLIT_ANGLE(-1.14873635768890),
3238 SCALE_SPLIT_ANGLE(-1.14878606796265),
3239 SCALE_SPLIT_ANGLE(-1.14891242980957),
3240 SCALE_SPLIT_ANGLE(-1.14903736114502),
3241 SCALE_SPLIT_ANGLE(-1.14923870563507),
3242 SCALE_SPLIT_ANGLE(-1.14957380294800),
3243 SCALE_SPLIT_ANGLE(-1.14981114864349)},
3244 {SCALE_SPLIT_ANGLE(-1.12567472457886),
3245 SCALE_SPLIT_ANGLE(-1.12576985359192),
3246 SCALE_SPLIT_ANGLE(-1.12591588497162),
3247 SCALE_SPLIT_ANGLE(-1.12629044055939),
3248 SCALE_SPLIT_ANGLE(-1.12666571140289),
3249 SCALE_SPLIT_ANGLE(-1.12728178501129),
3250 SCALE_SPLIT_ANGLE(-1.12833738327026),
3251 SCALE_SPLIT_ANGLE(-1.12910985946655)},
3252 {SCALE_SPLIT_ANGLE(-1.10394370555878),
3253 SCALE_SPLIT_ANGLE(-1.10411989688873),
3254 SCALE_SPLIT_ANGLE(-1.10439169406891),
3255 SCALE_SPLIT_ANGLE(-1.10509419441223),
3256 SCALE_SPLIT_ANGLE(-1.10580670833588),
3257 SCALE_SPLIT_ANGLE(-1.10699570178986),
3258 SCALE_SPLIT_ANGLE(-1.10909187793732),
3259 SCALE_SPLIT_ANGLE(-1.11067557334900)},
3260 {SCALE_SPLIT_ANGLE(-1.07335841655731),
3261 SCALE_SPLIT_ANGLE(-1.07367491722107),
3262 SCALE_SPLIT_ANGLE(-1.07416582107544),
3263 SCALE_SPLIT_ANGLE(-1.07544875144959),
3264 SCALE_SPLIT_ANGLE(-1.07677149772644),
3265 SCALE_SPLIT_ANGLE(-1.07902920246124),
3266 SCALE_SPLIT_ANGLE(-1.08317422866821),
3267 SCALE_SPLIT_ANGLE(-1.08645880222321)},
3268 {SCALE_SPLIT_ANGLE(-1.03070914745331),
3269 SCALE_SPLIT_ANGLE(-1.03125369548798),
3270 SCALE_SPLIT_ANGLE(-1.03210353851318),
3271 SCALE_SPLIT_ANGLE(-1.03435730934143),
3272 SCALE_SPLIT_ANGLE(-1.03673195838928),
3273 SCALE_SPLIT_ANGLE(-1.04091215133667),
3274 SCALE_SPLIT_ANGLE(-1.04904508590698),
3275 SCALE_SPLIT_ANGLE(-1.05597043037415)},
3276 {SCALE_SPLIT_ANGLE(-0.97233015298843),
3277 SCALE_SPLIT_ANGLE(-0.97321158647537),
3278 SCALE_SPLIT_ANGLE(-0.97459846735001),
3279 SCALE_SPLIT_ANGLE(-0.97834426164627),
3280 SCALE_SPLIT_ANGLE(-0.98240232467651),
3281 SCALE_SPLIT_ANGLE(-0.98984342813492),
3282 SCALE_SPLIT_ANGLE(-1.00556397438049),
3283 SCALE_SPLIT_ANGLE(-1.02053022384644)},
3284 {SCALE_SPLIT_ANGLE(-0.89506632089615),
3285 SCALE_SPLIT_ANGLE(-0.89638078212738),
3286 SCALE_SPLIT_ANGLE(-0.89846837520599),
3287 SCALE_SPLIT_ANGLE(-0.90423023700714),
3288 SCALE_SPLIT_ANGLE(-0.91068559885025),
3289 SCALE_SPLIT_ANGLE(-0.92315053939819),
3290 SCALE_SPLIT_ANGLE(-0.95268231630325),
3291 SCALE_SPLIT_ANGLE(-0.98626488447189)},
3292 {SCALE_SPLIT_ANGLE(-0.83257317543030),
3293 SCALE_SPLIT_ANGLE(-0.83419388532639),
3294 SCALE_SPLIT_ANGLE(-0.83678513765335),
3295 SCALE_SPLIT_ANGLE(-0.84404873847961),
3296 SCALE_SPLIT_ANGLE(-0.85238862037659),
3297 SCALE_SPLIT_ANGLE(-0.86914104223251),
3298 SCALE_SPLIT_ANGLE(-0.91285753250122),
3299 SCALE_SPLIT_ANGLE(-0.97222834825516)},
3300 {SCALE_SPLIT_ANGLE(-0.76227325201035),
3301 SCALE_SPLIT_ANGLE(-0.76417011022568),
3302 SCALE_SPLIT_ANGLE(-0.76722222566605),
3303 SCALE_SPLIT_ANGLE(-0.77590954303741),
3304 SCALE_SPLIT_ANGLE(-0.78613209724426),
3305 SCALE_SPLIT_ANGLE(-0.80752629041672),
3306 SCALE_SPLIT_ANGLE(-0.86987817287445),
3307 SCALE_SPLIT_ANGLE(-0.97863042354584)},
3308 {SCALE_SPLIT_ANGLE(-0.68631613254547),
3309 SCALE_SPLIT_ANGLE(-0.68841677904129),
3310 SCALE_SPLIT_ANGLE(-0.69181627035141),
3311 SCALE_SPLIT_ANGLE(-0.70162516832352),
3312 SCALE_SPLIT_ANGLE(-0.71342802047729),
3313 SCALE_SPLIT_ANGLE(-0.73910319805145),
3314 SCALE_SPLIT_ANGLE(-0.82307589054108),
3315 SCALE_SPLIT_ANGLE(-1.03222990036011)},
3316 {SCALE_SPLIT_ANGLE(-0.60781323909760),
3317 SCALE_SPLIT_ANGLE(-0.61001539230347),
3318 SCALE_SPLIT_ANGLE(-0.61359477043152),
3319 SCALE_SPLIT_ANGLE(-0.62403184175491),
3320 SCALE_SPLIT_ANGLE(-0.63681107759476),
3321 SCALE_SPLIT_ANGLE(-0.66548812389374),
3322 SCALE_SPLIT_ANGLE(-0.76931124925613),
3323 SCALE_SPLIT_ANGLE(-1.19638121128082)},
3324 {SCALE_SPLIT_ANGLE(-0.53021627664566),
3325 SCALE_SPLIT_ANGLE(-0.53240883350372),
3326 SCALE_SPLIT_ANGLE(-0.53598141670227),
3327 SCALE_SPLIT_ANGLE(-0.54646164178848),
3328 SCALE_SPLIT_ANGLE(-0.55942356586456),
3329 SCALE_SPLIT_ANGLE(-0.58904850482941),
3330 SCALE_SPLIT_ANGLE(-0.70326185226440),
3331 SCALE_SPLIT_ANGLE(-1.46822547912598)},
3332 {SCALE_SPLIT_ANGLE(-0.45655792951584),
3333 SCALE_SPLIT_ANGLE(-0.45864021778107),
3334 SCALE_SPLIT_ANGLE(-0.46203425526619),
3335 SCALE_SPLIT_ANGLE(-0.47199884057045),
3336 SCALE_SPLIT_ANGLE(-0.48433950543404),
3337 SCALE_SPLIT_ANGLE(-0.51260894536972),
3338 SCALE_SPLIT_ANGLE(-0.62212854623795),
3339 SCALE_SPLIT_ANGLE(-1.20720005035400)},
3340 {SCALE_SPLIT_ANGLE(-0.38893285393715),
3341 SCALE_SPLIT_ANGLE(-0.39082619547844),
3342 SCALE_SPLIT_ANGLE(-0.39390665292740),
3343 SCALE_SPLIT_ANGLE(-0.40291139483452),
3344 SCALE_SPLIT_ANGLE(-0.41398155689240),
3345 SCALE_SPLIT_ANGLE(-0.43899381160736),
3346 SCALE_SPLIT_ANGLE(-0.53091597557068),
3347 SCALE_SPLIT_ANGLE(-0.85221308469772)},
3348 {SCALE_SPLIT_ANGLE(-0.32840180397034),
3349 SCALE_SPLIT_ANGLE(-0.33005377650261),
3350 SCALE_SPLIT_ANGLE(-0.33273178339005),
3351 SCALE_SPLIT_ANGLE(-0.34049153327942),
3352 SCALE_SPLIT_ANGLE(-0.34989196062088),
3353 SCALE_SPLIT_ANGLE(-0.37057077884674),
3354 SCALE_SPLIT_ANGLE(-0.43990370631218),
3355 SCALE_SPLIT_ANGLE(-0.60593050718307)},
3356 {SCALE_SPLIT_ANGLE(-0.27521026134491),
3357 SCALE_SPLIT_ANGLE(-0.27659529447556),
3358 SCALE_SPLIT_ANGLE(-0.27882954478264),
3359 SCALE_SPLIT_ANGLE(-0.28522571921349),
3360 SCALE_SPLIT_ANGLE(-0.29282191395760),
3361 SCALE_SPLIT_ANGLE(-0.30895599722862),
3362 SCALE_SPLIT_ANGLE(-0.35752710700035),
3363 SCALE_SPLIT_ANGLE(-0.44366964697838)},
3364 {SCALE_SPLIT_ANGLE(-0.22909800708294),
3365 SCALE_SPLIT_ANGLE(-0.23021571338177),
3366 SCALE_SPLIT_ANGLE(-0.23200808465481),
3367 SCALE_SPLIT_ANGLE(-0.23706813156605),
3368 SCALE_SPLIT_ANGLE(-0.24294249713421),
3369 SCALE_SPLIT_ANGLE(-0.25494650006294),
3370 SCALE_SPLIT_ANGLE(-0.28743270039558),
3371 SCALE_SPLIT_ANGLE(-0.33326250314713)},
3372 {SCALE_SPLIT_ANGLE(-0.17204396426678),
3373 SCALE_SPLIT_ANGLE(-0.17280194163322),
3374 SCALE_SPLIT_ANGLE(-0.17400610446930),
3375 SCALE_SPLIT_ANGLE(-0.17733126878738),
3376 SCALE_SPLIT_ANGLE(-0.18105843663216),
3377 SCALE_SPLIT_ANGLE(-0.18825362622738),
3378 SCALE_SPLIT_ANGLE(-0.20519737899303),
3379 SCALE_SPLIT_ANGLE(-0.22397245466709)},
3380 {SCALE_SPLIT_ANGLE(-0.12763081490994),
3381 SCALE_SPLIT_ANGLE(-0.12810991704464),
3382 SCALE_SPLIT_ANGLE(-0.12886415421963),
3383 SCALE_SPLIT_ANGLE(-0.13090406358242),
3384 SCALE_SPLIT_ANGLE(-0.13311786949635),
3385 SCALE_SPLIT_ANGLE(-0.13718487322330),
3386 SCALE_SPLIT_ANGLE(-0.14578334987164),
3387 SCALE_SPLIT_ANGLE(-0.15392091870308)},
3388 {SCALE_SPLIT_ANGLE(-0.09368772059679),
3389 SCALE_SPLIT_ANGLE(-0.09397349506617),
3390 SCALE_SPLIT_ANGLE(-0.09441984444857),
3391 SCALE_SPLIT_ANGLE(-0.09560552984476),
3392 SCALE_SPLIT_ANGLE(-0.09685768932104),
3393 SCALE_SPLIT_ANGLE(-0.09906788170338),
3394 SCALE_SPLIT_ANGLE(-0.10338337719440),
3395 SCALE_SPLIT_ANGLE(-0.10706327110529)},
3396 {SCALE_SPLIT_ANGLE(-0.06817039847374),
3397 SCALE_SPLIT_ANGLE(-0.06833326816559),
3398 SCALE_SPLIT_ANGLE(-0.06858597695827),
3399 SCALE_SPLIT_ANGLE(-0.06924756616354),
3400 SCALE_SPLIT_ANGLE(-0.06993118673563),
3401 SCALE_SPLIT_ANGLE(-0.07110133022070),
3402 SCALE_SPLIT_ANGLE(-0.07325870543718),
3403 SCALE_SPLIT_ANGLE(-0.07497420907021)},
3404 {SCALE_SPLIT_ANGLE(-0.04925632849336),
3405 SCALE_SPLIT_ANGLE(-0.04934597387910),
3406 SCALE_SPLIT_ANGLE(-0.04948435723782),
3407 SCALE_SPLIT_ANGLE(-0.04984252154827),
3408 SCALE_SPLIT_ANGLE(-0.05020647123456),
3409 SCALE_SPLIT_ANGLE(-0.05081529170275),
3410 SCALE_SPLIT_ANGLE(-0.05189274996519),
3411 SCALE_SPLIT_ANGLE(-0.05270983278751)},
3412 {SCALE_SPLIT_ANGLE(-0.02833298221231),
3413 SCALE_SPLIT_ANGLE(-0.02836437523365),
3414 SCALE_SPLIT_ANGLE(-0.02841254323721),
3415 SCALE_SPLIT_ANGLE(-0.02853557653725),
3416 SCALE_SPLIT_ANGLE(-0.02865824848413),
3417 SCALE_SPLIT_ANGLE(-0.02885829471052),
3418 SCALE_SPLIT_ANGLE(-0.02919723838568),
3419 SCALE_SPLIT_ANGLE(-0.02944211103022)},
3420 {SCALE_SPLIT_ANGLE(-0.01614447496831),
3421 SCALE_SPLIT_ANGLE(-0.01615499891341),
3422 SCALE_SPLIT_ANGLE(-0.01617108844221),
3423 SCALE_SPLIT_ANGLE(-0.01621186546981),
3424 SCALE_SPLIT_ANGLE(-0.01625206507742),
3425 SCALE_SPLIT_ANGLE(-0.01631666161120),
3426 SCALE_SPLIT_ANGLE(-0.01642346009612),
3427 SCALE_SPLIT_ANGLE(-0.01649860478938)},
3428 {SCALE_SPLIT_ANGLE(-0.00914774928242),
3429 SCALE_SPLIT_ANGLE(-0.00915119051933),
3430 SCALE_SPLIT_ANGLE(-0.00915643945336),
3431 SCALE_SPLIT_ANGLE(-0.00916968192905),
3432 SCALE_SPLIT_ANGLE(-0.00918265059590),
3433 SCALE_SPLIT_ANGLE(-0.00920331384987),
3434 SCALE_SPLIT_ANGLE(-0.00923701003194),
3435 SCALE_SPLIT_ANGLE(-0.00926037784666)},
3436 {SCALE_SPLIT_ANGLE(-0.00516638066620),
3437 SCALE_SPLIT_ANGLE(-0.00516748940572),
3438 SCALE_SPLIT_ANGLE(-0.00516917882487),
3439 SCALE_SPLIT_ANGLE(-0.00517342938110),
3440 SCALE_SPLIT_ANGLE(-0.00517757609487),
3441 SCALE_SPLIT_ANGLE(-0.00518415309489),
3442 SCALE_SPLIT_ANGLE(-0.00519479531795),
3443 SCALE_SPLIT_ANGLE(-0.00520211551338)},
3444 {SCALE_SPLIT_ANGLE(-0.00000002921563),
3445 SCALE_SPLIT_ANGLE(-0.00000002921563),
3446 SCALE_SPLIT_ANGLE(-0.00000002921563),
3447 SCALE_SPLIT_ANGLE(-0.00000002921563),
3448 SCALE_SPLIT_ANGLE(-0.00000002921563),
3449 SCALE_SPLIT_ANGLE(-0.00000002921563),
3450 SCALE_SPLIT_ANGLE(-0.00000002921563),
3451 SCALE_SPLIT_ANGLE(-0.00000002921563)},
3452 },
3453 {
3454 {SCALE_SPLIT_ANGLE(-0.78539830446243),
3455 SCALE_SPLIT_ANGLE(-0.78539830446243),
3456 SCALE_SPLIT_ANGLE(-0.78539830446243),
3457 SCALE_SPLIT_ANGLE(-0.78539830446243),
3458 SCALE_SPLIT_ANGLE(-0.78539830446243),
3459 SCALE_SPLIT_ANGLE(-0.78539830446243),
3460 SCALE_SPLIT_ANGLE(-0.78539830446243),
3461 SCALE_SPLIT_ANGLE(-0.78539830446243)},
3462 {SCALE_SPLIT_ANGLE(-0.78143131732941),
3463 SCALE_SPLIT_ANGLE(-0.78143173456192),
3464 SCALE_SPLIT_ANGLE(-0.78143233060837),
3465 SCALE_SPLIT_ANGLE(-0.78143388032913),
3466 SCALE_SPLIT_ANGLE(-0.78143537044525),
3467 SCALE_SPLIT_ANGLE(-0.78143775463104),
3468 SCALE_SPLIT_ANGLE(-0.78144156932831),
3469 SCALE_SPLIT_ANGLE(-0.78144425153732)},
3470 {SCALE_SPLIT_ANGLE(-0.77835690975189),
3471 SCALE_SPLIT_ANGLE(-0.77835816144943),
3472 SCALE_SPLIT_ANGLE(-0.77836006879807),
3473 SCALE_SPLIT_ANGLE(-0.77836489677429),
3474 SCALE_SPLIT_ANGLE(-0.77836954593658),
3475 SCALE_SPLIT_ANGLE(-0.77837705612183),
3476 SCALE_SPLIT_ANGLE(-0.77838915586472),
3477 SCALE_SPLIT_ANGLE(-0.77839756011963)},
3478 {SCALE_SPLIT_ANGLE(-0.77291876077652),
3479 SCALE_SPLIT_ANGLE(-0.77292257547379),
3480 SCALE_SPLIT_ANGLE(-0.77292835712433),
3481 SCALE_SPLIT_ANGLE(-0.77294307947159),
3482 SCALE_SPLIT_ANGLE(-0.77295756340027),
3483 SCALE_SPLIT_ANGLE(-0.77298080921173),
3484 SCALE_SPLIT_ANGLE(-0.77301901578903),
3485 SCALE_SPLIT_ANGLE(-0.77304589748383)},
3486 {SCALE_SPLIT_ANGLE(-0.76334208250046),
3487 SCALE_SPLIT_ANGLE(-0.76335340738297),
3488 SCALE_SPLIT_ANGLE(-0.76337069272995),
3489 SCALE_SPLIT_ANGLE(-0.76341491937637),
3490 SCALE_SPLIT_ANGLE(-0.76345884799957),
3491 SCALE_SPLIT_ANGLE(-0.76353019475937),
3492 SCALE_SPLIT_ANGLE(-0.76365041732788),
3493 SCALE_SPLIT_ANGLE(-0.76373666524887)},
3494 {SCALE_SPLIT_ANGLE(-0.74662196636200),
3495 SCALE_SPLIT_ANGLE(-0.74665397405624),
3496 SCALE_SPLIT_ANGLE(-0.74670332670212),
3497 SCALE_SPLIT_ANGLE(-0.74683076143265),
3498 SCALE_SPLIT_ANGLE(-0.74695968627930),
3499 SCALE_SPLIT_ANGLE(-0.74717408418655),
3500 SCALE_SPLIT_ANGLE(-0.74754965305328),
3501 SCALE_SPLIT_ANGLE(-0.74783110618591)},
3502 {SCALE_SPLIT_ANGLE(-0.73124068975449),
3503 SCALE_SPLIT_ANGLE(-0.73129838705063),
3504 SCALE_SPLIT_ANGLE(-0.73138779401779),
3505 SCALE_SPLIT_ANGLE(-0.73162090778351),
3506 SCALE_SPLIT_ANGLE(-0.73186063766479),
3507 SCALE_SPLIT_ANGLE(-0.73226791620255),
3508 SCALE_SPLIT_ANGLE(-0.73300850391388),
3509 SCALE_SPLIT_ANGLE(-0.73358756303787)},
3510 {SCALE_SPLIT_ANGLE(-0.71016567945480),
3511 SCALE_SPLIT_ANGLE(-0.71026563644409),
3512 SCALE_SPLIT_ANGLE(-0.71042138338089),
3513 SCALE_SPLIT_ANGLE(-0.71083360910416),
3514 SCALE_SPLIT_ANGLE(-0.71126639842987),
3515 SCALE_SPLIT_ANGLE(-0.71202349662781),
3516 SCALE_SPLIT_ANGLE(-0.71347558498383),
3517 SCALE_SPLIT_ANGLE(-0.71468466520309)},
3518 {SCALE_SPLIT_ANGLE(-0.68173074722290),
3519 SCALE_SPLIT_ANGLE(-0.68189489841461),
3520 SCALE_SPLIT_ANGLE(-0.68215286731720),
3521 SCALE_SPLIT_ANGLE(-0.68284797668457),
3522 SCALE_SPLIT_ANGLE(-0.68359792232513),
3523 SCALE_SPLIT_ANGLE(-0.68496227264404),
3524 SCALE_SPLIT_ANGLE(-0.68778377771378),
3525 SCALE_SPLIT_ANGLE(-0.69036662578583)},
3526 {SCALE_SPLIT_ANGLE(-0.64424312114716),
3527 SCALE_SPLIT_ANGLE(-0.64449483156204),
3528 SCALE_SPLIT_ANGLE(-0.64489442110062),
3529 SCALE_SPLIT_ANGLE(-0.64599496126175),
3530 SCALE_SPLIT_ANGLE(-0.64722281694412),
3531 SCALE_SPLIT_ANGLE(-0.64957284927368),
3532 SCALE_SPLIT_ANGLE(-0.65497392416000),
3533 SCALE_SPLIT_ANGLE(-0.66069275140762)},
3534 {SCALE_SPLIT_ANGLE(-0.59645897150040),
3535 SCALE_SPLIT_ANGLE(-0.59681385755539),
3536 SCALE_SPLIT_ANGLE(-0.59738302230835),
3537 SCALE_SPLIT_ANGLE(-0.59898990392685),
3538 SCALE_SPLIT_ANGLE(-0.60085391998291),
3539 SCALE_SPLIT_ANGLE(-0.60464876890182),
3540 SCALE_SPLIT_ANGLE(-0.61471670866013),
3541 SCALE_SPLIT_ANGLE(-0.62811452150345)},
3542 {SCALE_SPLIT_ANGLE(-0.55878317356110),
3543 SCALE_SPLIT_ANGLE(-0.55920612812042),
3544 SCALE_SPLIT_ANGLE(-0.55988919734955),
3545 SCALE_SPLIT_ANGLE(-0.56185036897659),
3546 SCALE_SPLIT_ANGLE(-0.56418758630753),
3547 SCALE_SPLIT_ANGLE(-0.56916558742523),
3548 SCALE_SPLIT_ANGLE(-0.58402240276337),
3549 SCALE_SPLIT_ANGLE(-0.60877454280853)},
3550 {SCALE_SPLIT_ANGLE(-0.51690876483917),
3551 SCALE_SPLIT_ANGLE(-0.51739066839218),
3552 SCALE_SPLIT_ANGLE(-0.51817417144775),
3553 SCALE_SPLIT_ANGLE(-0.52045887708664),
3554 SCALE_SPLIT_ANGLE(-0.52325236797333),
3555 SCALE_SPLIT_ANGLE(-0.52947425842285),
3556 SCALE_SPLIT_ANGLE(-0.55062580108643),
3557 SCALE_SPLIT_ANGLE(-0.59875679016113)},
3558 {SCALE_SPLIT_ANGLE(-0.47171202301979),
3559 SCALE_SPLIT_ANGLE(-0.47223755717278),
3560 SCALE_SPLIT_ANGLE(-0.47309651970863),
3561 SCALE_SPLIT_ANGLE(-0.47563409805298),
3562 SCALE_SPLIT_ANGLE(-0.47880497574806),
3563 SCALE_SPLIT_ANGLE(-0.48615178465843),
3564 SCALE_SPLIT_ANGLE(-0.51456993818283),
3565 SCALE_SPLIT_ANGLE(-0.61478376388550)},
3566 {SCALE_SPLIT_ANGLE(-0.42445346713066),
3567 SCALE_SPLIT_ANGLE(-0.42500337958336),
3568 SCALE_SPLIT_ANGLE(-0.42590552568436),
3569 SCALE_SPLIT_ANGLE(-0.42859482765198),
3570 SCALE_SPLIT_ANGLE(-0.43200704455376),
3571 SCALE_SPLIT_ANGLE(-0.44014206528664),
3572 SCALE_SPLIT_ANGLE(-0.47505456209183),
3573 SCALE_SPLIT_ANGLE(-0.70435559749603)},
3574 {SCALE_SPLIT_ANGLE(-0.37662348151207),
3575 SCALE_SPLIT_ANGLE(-0.37717759609222),
3576 SCALE_SPLIT_ANGLE(-0.37808811664581),
3577 SCALE_SPLIT_ANGLE(-0.38081312179565),
3578 SCALE_SPLIT_ANGLE(-0.38429382443428),
3579 SCALE_SPLIT_ANGLE(-0.39269915223122),
3580 SCALE_SPLIT_ANGLE(-0.43061137199402),
3581 SCALE_SPLIT_ANGLE(-0.89949661493301)},
3582 {SCALE_SPLIT_ANGLE(-0.32972770929337),
3583 SCALE_SPLIT_ANGLE(-0.33026665449142),
3584 SCALE_SPLIT_ANGLE(-0.33115166425705),
3585 SCALE_SPLIT_ANGLE(-0.33379596471786),
3586 SCALE_SPLIT_ANGLE(-0.33716449141502),
3587 SCALE_SPLIT_ANGLE(-0.34525626897812),
3588 SCALE_SPLIT_ANGLE(-0.38098806142807),
3589 SCALE_SPLIT_ANGLE(-0.66312354803085)},
3590 {SCALE_SPLIT_ANGLE(-0.28508266806602),
3591 SCALE_SPLIT_ANGLE(-0.28558865189552),
3592 SCALE_SPLIT_ANGLE(-0.28641721606255),
3593 SCALE_SPLIT_ANGLE(-0.28887599706650),
3594 SCALE_SPLIT_ANGLE(-0.29197183251381),
3595 SCALE_SPLIT_ANGLE(-0.29924651980400),
3596 SCALE_SPLIT_ANGLE(-0.32879725098610),
3597 SCALE_SPLIT_ANGLE(-0.45467042922974)},
3598 {SCALE_SPLIT_ANGLE(-0.24368351697922),
3599 SCALE_SPLIT_ANGLE(-0.24414126574993),
3600 SCALE_SPLIT_ANGLE(-0.24488742649555),
3601 SCALE_SPLIT_ANGLE(-0.24707718193531),
3602 SCALE_SPLIT_ANGLE(-0.24978290498257),
3603 SCALE_SPLIT_ANGLE(-0.25592407584190),
3604 SCALE_SPLIT_ANGLE(-0.27806493639946),
3605 SCALE_SPLIT_ANGLE(-0.33706212043762)},
3606 {SCALE_SPLIT_ANGLE(-0.20616291463375),
3607 SCALE_SPLIT_ANGLE(-0.20656123757362),
3608 SCALE_SPLIT_ANGLE(-0.20720669627190),
3609 SCALE_SPLIT_ANGLE(-0.20907410979271),
3610 SCALE_SPLIT_ANGLE(-0.21132779121399),
3611 SCALE_SPLIT_ANGLE(-0.21623276174068),
3612 SCALE_SPLIT_ANGLE(-0.23178002238274),
3613 SCALE_SPLIT_ANGLE(-0.26115795969963)},
3614 {SCALE_SPLIT_ANGLE(-0.17282113432884),
3615 SCALE_SPLIT_ANGLE(-0.17315419018269),
3616 SCALE_SPLIT_ANGLE(-0.17369027435780),
3617 SCALE_SPLIT_ANGLE(-0.17521676421165),
3618 SCALE_SPLIT_ANGLE(-0.17701183259487),
3619 SCALE_SPLIT_ANGLE(-0.18074958026409),
3620 SCALE_SPLIT_ANGLE(-0.19124273955822),
3621 SCALE_SPLIT_ANGLE(-0.20666226744652)},
3622 {SCALE_SPLIT_ANGLE(-0.13066087663174),
3623 SCALE_SPLIT_ANGLE(-0.13089761137962),
3624 SCALE_SPLIT_ANGLE(-0.13127478957176),
3625 SCALE_SPLIT_ANGLE(-0.13232274353504),
3626 SCALE_SPLIT_ANGLE(-0.13350811600685),
3627 SCALE_SPLIT_ANGLE(-0.13582547008991),
3628 SCALE_SPLIT_ANGLE(-0.14140743017197),
3629 SCALE_SPLIT_ANGLE(-0.14774034917355)},
3630 {SCALE_SPLIT_ANGLE(-0.09729288518429),
3631 SCALE_SPLIT_ANGLE(-0.09744837880135),
3632 SCALE_SPLIT_ANGLE(-0.09769365936518),
3633 SCALE_SPLIT_ANGLE(-0.09835996478796),
3634 SCALE_SPLIT_ANGLE(-0.09908770024776),
3635 SCALE_SPLIT_ANGLE(-0.10043605417013),
3636 SCALE_SPLIT_ANGLE(-0.10332851856947),
3637 SCALE_SPLIT_ANGLE(-0.10610698908567)},
3638 {SCALE_SPLIT_ANGLE(-0.07155896723270),
3639 SCALE_SPLIT_ANGLE(-0.07165452837944),
3640 SCALE_SPLIT_ANGLE(-0.07180399447680),
3641 SCALE_SPLIT_ANGLE(-0.07220225781202),
3642 SCALE_SPLIT_ANGLE(-0.07262473553419),
3643 SCALE_SPLIT_ANGLE(-0.07337480783463),
3644 SCALE_SPLIT_ANGLE(-0.07485358417034),
3645 SCALE_SPLIT_ANGLE(-0.07612710446119)},
3646 {SCALE_SPLIT_ANGLE(-0.05212157964706),
3647 SCALE_SPLIT_ANGLE(-0.05217728391290),
3648 SCALE_SPLIT_ANGLE(-0.05226380378008),
3649 SCALE_SPLIT_ANGLE(-0.05249079316854),
3650 SCALE_SPLIT_ANGLE(-0.05272606760263),
3651 SCALE_SPLIT_ANGLE(-0.05313043296337),
3652 SCALE_SPLIT_ANGLE(-0.05388086661696),
3653 SCALE_SPLIT_ANGLE(-0.05448163300753)},
3654 {SCALE_SPLIT_ANGLE(-0.03767966106534),
3655 SCALE_SPLIT_ANGLE(-0.03771083801985),
3656 SCALE_SPLIT_ANGLE(-0.03775899857283),
3657 SCALE_SPLIT_ANGLE(-0.03788383677602),
3658 SCALE_SPLIT_ANGLE(-0.03801096975803),
3659 SCALE_SPLIT_ANGLE(-0.03822424262762),
3660 SCALE_SPLIT_ANGLE(-0.03860339894891),
3661 SCALE_SPLIT_ANGLE(-0.03889227285981)},
3662 {SCALE_SPLIT_ANGLE(-0.02168159000576),
3663 SCALE_SPLIT_ANGLE(-0.02169271185994),
3664 SCALE_SPLIT_ANGLE(-0.02170977741480),
3665 SCALE_SPLIT_ANGLE(-0.02175341919065),
3666 SCALE_SPLIT_ANGLE(-0.02179697901011),
3667 SCALE_SPLIT_ANGLE(-0.02186813205481),
3668 SCALE_SPLIT_ANGLE(-0.02198898792267),
3669 SCALE_SPLIT_ANGLE(-0.02207653038204)},
3670 {SCALE_SPLIT_ANGLE(-0.01235581189394),
3671 SCALE_SPLIT_ANGLE(-0.01235958002508),
3672 SCALE_SPLIT_ANGLE(-0.01236534304917),
3673 SCALE_SPLIT_ANGLE(-0.01237995456904),
3674 SCALE_SPLIT_ANGLE(-0.01239436771721),
3675 SCALE_SPLIT_ANGLE(-0.01241754833609),
3676 SCALE_SPLIT_ANGLE(-0.01245592441410),
3677 SCALE_SPLIT_ANGLE(-0.01248297002167)},
3678 {SCALE_SPLIT_ANGLE(-0.00700127193704),
3679 SCALE_SPLIT_ANGLE(-0.00700251199305),
3680 SCALE_SPLIT_ANGLE(-0.00700440304354),
3681 SCALE_SPLIT_ANGLE(-0.00700917467475),
3682 SCALE_SPLIT_ANGLE(-0.00701385131106),
3683 SCALE_SPLIT_ANGLE(-0.00702130468562),
3684 SCALE_SPLIT_ANGLE(-0.00703346915543),
3685 SCALE_SPLIT_ANGLE(-0.00704191112891)},
3686 {SCALE_SPLIT_ANGLE(-0.00395415676758),
3687 SCALE_SPLIT_ANGLE(-0.00395455863327),
3688 SCALE_SPLIT_ANGLE(-0.00395516911522),
3689 SCALE_SPLIT_ANGLE(-0.00395670579746),
3690 SCALE_SPLIT_ANGLE(-0.00395820569247),
3691 SCALE_SPLIT_ANGLE(-0.00396058475599),
3692 SCALE_SPLIT_ANGLE(-0.00396443624049),
3693 SCALE_SPLIT_ANGLE(-0.00396708631888)},
3694 {SCALE_SPLIT_ANGLE(-0.00000002236068),
3695 SCALE_SPLIT_ANGLE(-0.00000002236068),
3696 SCALE_SPLIT_ANGLE(-0.00000002236068),
3697 SCALE_SPLIT_ANGLE(-0.00000002236068),
3698 SCALE_SPLIT_ANGLE(-0.00000002236068),
3699 SCALE_SPLIT_ANGLE(-0.00000002236068),
3700 SCALE_SPLIT_ANGLE(-0.00000002236068),
3701 SCALE_SPLIT_ANGLE(-0.00000002236068)},
3702 },
3703 {
3704 {SCALE_SPLIT_ANGLE(-0.39269906282425),
3705 SCALE_SPLIT_ANGLE(-0.39269906282425),
3706 SCALE_SPLIT_ANGLE(-0.39269906282425),
3707 SCALE_SPLIT_ANGLE(-0.39269906282425),
3708 SCALE_SPLIT_ANGLE(-0.39269906282425),
3709 SCALE_SPLIT_ANGLE(-0.39269906282425),
3710 SCALE_SPLIT_ANGLE(-0.39269906282425),
3711 SCALE_SPLIT_ANGLE(-0.39269906282425)},
3712 {SCALE_SPLIT_ANGLE(-0.39055728912354),
3713 SCALE_SPLIT_ANGLE(-0.39055734872818),
3714 SCALE_SPLIT_ANGLE(-0.39055743813515),
3715 SCALE_SPLIT_ANGLE(-0.39055764675140),
3716 SCALE_SPLIT_ANGLE(-0.39055785536766),
3717 SCALE_SPLIT_ANGLE(-0.39055821299553),
3718 SCALE_SPLIT_ANGLE(-0.39055874943733),
3719 SCALE_SPLIT_ANGLE(-0.39055910706520)},
3720 {SCALE_SPLIT_ANGLE(-0.38890448212624),
3721 SCALE_SPLIT_ANGLE(-0.38890466094017),
3722 SCALE_SPLIT_ANGLE(-0.38890489935875),
3723 SCALE_SPLIT_ANGLE(-0.38890558481216),
3724 SCALE_SPLIT_ANGLE(-0.38890624046326),
3725 SCALE_SPLIT_ANGLE(-0.38890728354454),
3726 SCALE_SPLIT_ANGLE(-0.38890898227692),
3727 SCALE_SPLIT_ANGLE(-0.38891017436981)},
3728 {SCALE_SPLIT_ANGLE(-0.38599535822868),
3729 SCALE_SPLIT_ANGLE(-0.38599589467049),
3730 SCALE_SPLIT_ANGLE(-0.38599669933319),
3731 SCALE_SPLIT_ANGLE(-0.38599872589111),
3732 SCALE_SPLIT_ANGLE(-0.38600075244904),
3733 SCALE_SPLIT_ANGLE(-0.38600397109985),
3734 SCALE_SPLIT_ANGLE(-0.38600933551788),
3735 SCALE_SPLIT_ANGLE(-0.38601312041283)},
3736 {SCALE_SPLIT_ANGLE(-0.38091570138931),
3737 SCALE_SPLIT_ANGLE(-0.38091725111008),
3738 SCALE_SPLIT_ANGLE(-0.38091960549355),
3739 SCALE_SPLIT_ANGLE(-0.38092568516731),
3740 SCALE_SPLIT_ANGLE(-0.38093173503876),
3741 SCALE_SPLIT_ANGLE(-0.38094159960747),
3742 SCALE_SPLIT_ANGLE(-0.38095837831497),
3743 SCALE_SPLIT_ANGLE(-0.38097053766251)},
3744 {SCALE_SPLIT_ANGLE(-0.37216994166374),
3745 SCALE_SPLIT_ANGLE(-0.37217423319817),
3746 SCALE_SPLIT_ANGLE(-0.37218084931374),
3747 SCALE_SPLIT_ANGLE(-0.37219804525375),
3748 SCALE_SPLIT_ANGLE(-0.37221553921700),
3749 SCALE_SPLIT_ANGLE(-0.37224486470222),
3750 SCALE_SPLIT_ANGLE(-0.37229701876640),
3751 SCALE_SPLIT_ANGLE(-0.37233671545982)},
3752 {SCALE_SPLIT_ANGLE(-0.36424961686134),
3753 SCALE_SPLIT_ANGLE(-0.36425721645355),
3754 SCALE_SPLIT_ANGLE(-0.36426901817322),
3755 SCALE_SPLIT_ANGLE(-0.36429998278618),
3756 SCALE_SPLIT_ANGLE(-0.36433207988739),
3757 SCALE_SPLIT_ANGLE(-0.36438727378845),
3758 SCALE_SPLIT_ANGLE(-0.36448964476585),
3759 SCALE_SPLIT_ANGLE(-0.36457160115242)},
3760 {SCALE_SPLIT_ANGLE(-0.35356882214546),
3761 SCALE_SPLIT_ANGLE(-0.35358169674873),
3762 SCALE_SPLIT_ANGLE(-0.35360184311867),
3763 SCALE_SPLIT_ANGLE(-0.35365554690361),
3764 SCALE_SPLIT_ANGLE(-0.35371255874634),
3765 SCALE_SPLIT_ANGLE(-0.35381379723549),
3766 SCALE_SPLIT_ANGLE(-0.35401359200478),
3767 SCALE_SPLIT_ANGLE(-0.35418573021889)},
3768 {SCALE_SPLIT_ANGLE(-0.33942580223083),
3769 SCALE_SPLIT_ANGLE(-0.33944639563560),
3770 SCALE_SPLIT_ANGLE(-0.33947893977165),
3771 SCALE_SPLIT_ANGLE(-0.33956736326218),
3772 SCALE_SPLIT_ANGLE(-0.33966410160065),
3773 SCALE_SPLIT_ANGLE(-0.33984366059303),
3774 SCALE_SPLIT_ANGLE(-0.34023004770279),
3775 SCALE_SPLIT_ANGLE(-0.34060218930244)},
3776 {SCALE_SPLIT_ANGLE(-0.32115444540977),
3777 SCALE_SPLIT_ANGLE(-0.32118517160416),
3778 SCALE_SPLIT_ANGLE(-0.32123413681984),
3779 SCALE_SPLIT_ANGLE(-0.32137045264244),
3780 SCALE_SPLIT_ANGLE(-0.32152506709099),
3781 SCALE_SPLIT_ANGLE(-0.32182860374451),
3782 SCALE_SPLIT_ANGLE(-0.32256555557251),
3783 SCALE_SPLIT_ANGLE(-0.32340887188911)},
3784 {SCALE_SPLIT_ANGLE(-0.29830518364906),
3785 SCALE_SPLIT_ANGLE(-0.29834720492363),
3786 SCALE_SPLIT_ANGLE(-0.29841497540474),
3787 SCALE_SPLIT_ANGLE(-0.29860857129097),
3788 SCALE_SPLIT_ANGLE(-0.29883739352226),
3789 SCALE_SPLIT_ANGLE(-0.29931783676147),
3790 SCALE_SPLIT_ANGLE(-0.30069103837013),
3791 SCALE_SPLIT_ANGLE(-0.30275768041611)},
3792 {SCALE_SPLIT_ANGLE(-0.28050783276558),
3793 SCALE_SPLIT_ANGLE(-0.28055709600449),
3794 SCALE_SPLIT_ANGLE(-0.28063705563545),
3795 SCALE_SPLIT_ANGLE(-0.28086939454079),
3796 SCALE_SPLIT_ANGLE(-0.28115186095238),
3797 SCALE_SPLIT_ANGLE(-0.28177401423454),
3798 SCALE_SPLIT_ANGLE(-0.28380542993546),
3799 SCALE_SPLIT_ANGLE(-0.28782635927200)},
3800 {SCALE_SPLIT_ANGLE(-0.26083284616470),
3801 SCALE_SPLIT_ANGLE(-0.26088821887970),
3802 SCALE_SPLIT_ANGLE(-0.26097869873047),
3803 SCALE_SPLIT_ANGLE(-0.26124575734138),
3804 SCALE_SPLIT_ANGLE(-0.26157894730568),
3805 SCALE_SPLIT_ANGLE(-0.26234790682793),
3806 SCALE_SPLIT_ANGLE(-0.26525342464447),
3807 SCALE_SPLIT_ANGLE(-0.27373573184013)},
3808 {SCALE_SPLIT_ANGLE(-0.23960019648075),
3809 SCALE_SPLIT_ANGLE(-0.23966008424759),
3810 SCALE_SPLIT_ANGLE(-0.23975844681263),
3811 SCALE_SPLIT_ANGLE(-0.24005250632763),
3812 SCALE_SPLIT_ANGLE(-0.24042734503746),
3813 SCALE_SPLIT_ANGLE(-0.24132779240608),
3814 SCALE_SPLIT_ANGLE(-0.24525122344494),
3815 SCALE_SPLIT_ANGLE(-0.26534584164619)},
3816 {SCALE_SPLIT_ANGLE(-0.21727462112904),
3817 SCALE_SPLIT_ANGLE(-0.21733717620373),
3818 SCALE_SPLIT_ANGLE(-0.21744027733803),
3819 SCALE_SPLIT_ANGLE(-0.21775110065937),
3820 SCALE_SPLIT_ANGLE(-0.21815298497677),
3821 SCALE_SPLIT_ANGLE(-0.21914556622505),
3822 SCALE_SPLIT_ANGLE(-0.22397416830063),
3823 SCALE_SPLIT_ANGLE(-0.27997338771820)},
3824 {SCALE_SPLIT_ANGLE(-0.19442924857140),
3825 SCALE_SPLIT_ANGLE(-0.19449259340763),
3826 SCALE_SPLIT_ANGLE(-0.19459711015224),
3827 SCALE_SPLIT_ANGLE(-0.19491319358349),
3828 SCALE_SPLIT_ANGLE(-0.19532407820225),
3829 SCALE_SPLIT_ANGLE(-0.19634953141212),
3830 SCALE_SPLIT_ANGLE(-0.20156541466713),
3831 SCALE_SPLIT_ANGLE(-0.33650863170624)},
3832 {SCALE_SPLIT_ANGLE(-0.17168678343296),
3833 SCALE_SPLIT_ANGLE(-0.17174907028675),
3834 SCALE_SPLIT_ANGLE(-0.17185172438622),
3835 SCALE_SPLIT_ANGLE(-0.17216137051582),
3836 SCALE_SPLIT_ANGLE(-0.17256210744381),
3837 SCALE_SPLIT_ANGLE(-0.17355349659920),
3838 SCALE_SPLIT_ANGLE(-0.17841055989265),
3839 SCALE_SPLIT_ANGLE(-0.23922458291054)},
3840 {SCALE_SPLIT_ANGLE(-0.14965106546879),
3841 SCALE_SPLIT_ANGLE(-0.14971044659615),
3842 SCALE_SPLIT_ANGLE(-0.14980801939964),
3843 SCALE_SPLIT_ANGLE(-0.15010000765324),
3844 SCALE_SPLIT_ANGLE(-0.15047281980515),
3845 SCALE_SPLIT_ANGLE(-0.15137127041817),
3846 SCALE_SPLIT_ANGLE(-0.15533344447613),
3847 SCALE_SPLIT_ANGLE(-0.17691853642464)},
3848 {SCALE_SPLIT_ANGLE(-0.12884500622749),
3849 SCALE_SPLIT_ANGLE(-0.12889972329140),
3850 SCALE_SPLIT_ANGLE(-0.12898920476437),
3851 SCALE_SPLIT_ANGLE(-0.12925371527672),
3852 SCALE_SPLIT_ANGLE(-0.12958449125290),
3853 SCALE_SPLIT_ANGLE(-0.13035115599632),
3854 SCALE_SPLIT_ANGLE(-0.13329000771046),
3855 SCALE_SPLIT_ANGLE(-0.14226882159710)},
3856 {SCALE_SPLIT_ANGLE(-0.10966771095991),
3857 SCALE_SPLIT_ANGLE(-0.10971628129482),
3858 SCALE_SPLIT_ANGLE(-0.10979521274567),
3859 SCALE_SPLIT_ANGLE(-0.11002496629953),
3860 SCALE_SPLIT_ANGLE(-0.11030505597591),
3861 SCALE_SPLIT_ANGLE(-0.11092507094145),
3862 SCALE_SPLIT_ANGLE(-0.11297955363989),
3863 SCALE_SPLIT_ANGLE(-0.11718675494194)},
3864 {SCALE_SPLIT_ANGLE(-0.09237615764141),
3865 SCALE_SPLIT_ANGLE(-0.09241757541895),
3866 SCALE_SPLIT_ANGLE(-0.09248440712690),
3867 SCALE_SPLIT_ANGLE(-0.09267570078373),
3868 SCALE_SPLIT_ANGLE(-0.09290252625942),
3869 SCALE_SPLIT_ANGLE(-0.09338124096394),
3870 SCALE_SPLIT_ANGLE(-0.09476861357689),
3871 SCALE_SPLIT_ANGLE(-0.09691139310598)},
3872 {SCALE_SPLIT_ANGLE(-0.07020132243633),
3873 SCALE_SPLIT_ANGLE(-0.07023159414530),
3874 SCALE_SPLIT_ANGLE(-0.07027988135815),
3875 SCALE_SPLIT_ANGLE(-0.07041461765766),
3876 SCALE_SPLIT_ANGLE(-0.07056794315577),
3877 SCALE_SPLIT_ANGLE(-0.07087046653032),
3878 SCALE_SPLIT_ANGLE(-0.07161350548267),
3879 SCALE_SPLIT_ANGLE(-0.07247892767191)},
3880 {SCALE_SPLIT_ANGLE(-0.05244029313326),
3881 SCALE_SPLIT_ANGLE(-0.05246063694358),
3882 SCALE_SPLIT_ANGLE(-0.05249277129769),
3883 SCALE_SPLIT_ANGLE(-0.05258031189442),
3884 SCALE_SPLIT_ANGLE(-0.05267634615302),
3885 SCALE_SPLIT_ANGLE(-0.05285539105535),
3886 SCALE_SPLIT_ANGLE(-0.05324416607618),
3887 SCALE_SPLIT_ANGLE(-0.05362325906754)},
3888 {SCALE_SPLIT_ANGLE(-0.03864165395498),
3889 SCALE_SPLIT_ANGLE(-0.03865438699722),
3890 SCALE_SPLIT_ANGLE(-0.03867433220148),
3891 SCALE_SPLIT_ANGLE(-0.03872758150101),
3892 SCALE_SPLIT_ANGLE(-0.03878423944116),
3893 SCALE_SPLIT_ANGLE(-0.03888526186347),
3894 SCALE_SPLIT_ANGLE(-0.03908598423004),
3895 SCALE_SPLIT_ANGLE(-0.03926040232182)},
3896 {SCALE_SPLIT_ANGLE(-0.02817477099597),
3897 SCALE_SPLIT_ANGLE(-0.02818230539560),
3898 SCALE_SPLIT_ANGLE(-0.02819401212037),
3899 SCALE_SPLIT_ANGLE(-0.02822477370501),
3900 SCALE_SPLIT_ANGLE(-0.02825672924519),
3901 SCALE_SPLIT_ANGLE(-0.02831180207431),
3902 SCALE_SPLIT_ANGLE(-0.02841453626752),
3903 SCALE_SPLIT_ANGLE(-0.02849724888802)},
3904 {SCALE_SPLIT_ANGLE(-0.02037952840328),
3905 SCALE_SPLIT_ANGLE(-0.02038379199803),
3906 SCALE_SPLIT_ANGLE(-0.02039037644863),
3907 SCALE_SPLIT_ANGLE(-0.02040746808052),
3908 SCALE_SPLIT_ANGLE(-0.02042490057647),
3909 SCALE_SPLIT_ANGLE(-0.02045419998467),
3910 SCALE_SPLIT_ANGLE(-0.02050646580756),
3911 SCALE_SPLIT_ANGLE(-0.02054643817246)},
3912 {SCALE_SPLIT_ANGLE(-0.01173160132021),
3913 SCALE_SPLIT_ANGLE(-0.01173313893378),
3914 SCALE_SPLIT_ANGLE(-0.01173550169915),
3915 SCALE_SPLIT_ANGLE(-0.01174154412001),
3916 SCALE_SPLIT_ANGLE(-0.01174758281559),
3917 SCALE_SPLIT_ANGLE(-0.01175745390356),
3918 SCALE_SPLIT_ANGLE(-0.01177425216883),
3919 SCALE_SPLIT_ANGLE(-0.01178644038737)},
3920 {SCALE_SPLIT_ANGLE(-0.00668647419661),
3921 SCALE_SPLIT_ANGLE(-0.00668699899688),
3922 SCALE_SPLIT_ANGLE(-0.00668780226260),
3923 SCALE_SPLIT_ANGLE(-0.00668983859941),
3924 SCALE_SPLIT_ANGLE(-0.00669184979051),
3925 SCALE_SPLIT_ANGLE(-0.00669508427382),
3926 SCALE_SPLIT_ANGLE(-0.00670044496655),
3927 SCALE_SPLIT_ANGLE(-0.00670422706753)},
3928 {SCALE_SPLIT_ANGLE(-0.00378898018971),
3929 SCALE_SPLIT_ANGLE(-0.00378915364854),
3930 SCALE_SPLIT_ANGLE(-0.00378941860981),
3931 SCALE_SPLIT_ANGLE(-0.00379008613527),
3932 SCALE_SPLIT_ANGLE(-0.00379074038938),
3933 SCALE_SPLIT_ANGLE(-0.00379178440198),
3934 SCALE_SPLIT_ANGLE(-0.00379348848946),
3935 SCALE_SPLIT_ANGLE(-0.00379467150196)},
3936 {SCALE_SPLIT_ANGLE(-0.00213995948434),
3937 SCALE_SPLIT_ANGLE(-0.00214001582935),
3938 SCALE_SPLIT_ANGLE(-0.00214010151103),
3939 SCALE_SPLIT_ANGLE(-0.00214031687938),
3940 SCALE_SPLIT_ANGLE(-0.00214052735828),
3941 SCALE_SPLIT_ANGLE(-0.00214086123742),
3942 SCALE_SPLIT_ANGLE(-0.00214140163735),
3943 SCALE_SPLIT_ANGLE(-0.00214177393354)},
3944 {SCALE_SPLIT_ANGLE(-0.00000001210151),
3945 SCALE_SPLIT_ANGLE(-0.00000001210151),
3946 SCALE_SPLIT_ANGLE(-0.00000001210151),
3947 SCALE_SPLIT_ANGLE(-0.00000001210151),
3948 SCALE_SPLIT_ANGLE(-0.00000001210151),
3949 SCALE_SPLIT_ANGLE(-0.00000001210151),
3950 SCALE_SPLIT_ANGLE(-0.00000001210151),
3951 SCALE_SPLIT_ANGLE(-0.00000001210151)},
3952 },
3953 };
2023954
2033955 #define SCALE_CLD(a) (FL2FXCONST_CFG(a))
2043956
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
110110 #include "machine_type.h"
111111
112112 /* Global ROM table data type: */
113 #ifndef ARCH_PREFER_MULT_32x32
114 #define FIXP_CFG FIXP_SGL
115 #define FX_CFG2FX_DBL FX_SGL2FX_DBL
116 #define FX_CFG2FX_SGL
117 #define CFG(a) (FX_DBL2FXCONST_SGL(a))
118 #define FL2FXCONST_CFG FL2FXCONST_SGL
119 #define FX_DBL2FX_CFG(x) FX_DBL2FX_SGL((FIXP_DBL)(x))
120 #else
121113 #define FIXP_CFG FIXP_DBL
122114 #define FX_CFG2FX_DBL
123115 #define FX_CFG2FX_SGL FX_DBL2FX_SGL
124116 #define CFG(a) FIXP_DBL(a)
125117 #define FL2FXCONST_CFG FL2FXCONST_DBL
126118 #define FX_DBL2FX_CFG(x) ((FIXP_DBL)(x))
127 #endif
128119
129120 /* others */
130121 #define SCALE_INV_ICC (2)
132123
133124 #define QCC_SCALE 1
134125 #define M1M2_DATA FIXP_DBL
135 #ifndef ARCH_PREFER_MULT_32x32
136 #define M1M2_CDATA FIXP_SGL
137 #define M1M2_CDATA2FX_DBL(a) FX_SGL2FX_DBL(a)
138 #define FX_DBL2M1M2_CDATA(a) FX_DBL2FX_SGL(a)
139 #else
140126 #define M1M2_CDATA FIXP_DBL
141127 #define M1M2_CDATA2FX_DBL(a) (a)
142128 #define FX_DBL2M1M2_CDATA(a) (a)
143 #endif
144129
145130 #define CLIP_PROTECT_GAIN_0(x) FL2FXCONST_CFG(((x) / (float)(1 << 0)))
146131 #define CLIP_PROTECT_GAIN_1(x) FL2FXCONST_CFG(((x) / (float)(1 << 1)))
147132 #define CLIP_PROTECT_GAIN_2(x) FL2FXCONST_CFG(((x) / (float)(1 << 2)))
148133
149 #define SF_CLD_C1C2 (8)
134 #define SF_CLD_C1C2 (9)
150135
151136 extern const FIXP_CFG dequantCPC__FDK[];
152137 extern const FIXP_CFG dequantICC__FDK[8];
159144 (FL2FXCONST_DBL(3.1415926535897932f / (float)(1 << (IPD_SCALE - 1))))
160145
161146 extern const FIXP_CFG dequantIPD__FDK[16];
147 extern const FIXP_DBL dequantIPD_CLD_ICC_splitAngle__FDK[15][31][8];
162148
163149 extern const FIXP_CFG H11_nc[31][8];
164150 extern const FIXP_CFG H12_nc[31][8];
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
105105 #include "FDK_matrixCalloc.h"
106106 #include "sac_rom.h"
107107
108 #define SF_FREQ_DOMAIN_HEADROOM (2 * (1))
109
108110 #define BP_GF_START 6
109111 #define BP_GF_SIZE 25
110112 #define HP_SIZE 9
113115 #define SF_WET 5
114116 #define SF_DRY \
115117 3 /* SF_DRY == 2 would produce good conformance test results as well */
118 #define SF_DRY_NRG \
119 (4 - 1) /* 8.495f = sum(BP_GF__FDK[i]) \
120 i=0,..,(sizeof(BP_GF__FDK)/sizeof(FIXP_CFG)-1) => energy \
121 calculation needs 4 bits headroom, headroom can be reduced by 1 \
122 bit due to fPow2Div2() usage */
123 #define SF_WET_NRG \
124 (4 - 1) /* 8.495f = sum(BP_GF__FDK[i]) \
125 i=0,..,(sizeof(BP_GF__FDK)/sizeof(FIXP_CFG)-1) => energy \
126 calculation needs 4 bits headroom, headroom can be reduced by 1 \
127 bit due to fPow2Div2() usage */
116128 #define SF_PRODUCT_BP_GF 13
117129 #define SF_PRODUCT_BP_GF_GF 26
118130 #define SF_SCALE 2
171183 STP_SCALE_LIMIT_LO_LD64 = LD64(STP_SCALE_LIMIT_LO*STP_SCALE_LIMIT_LO)
172184 */
173185
174 #define DRY_ENER_WEIGHT(DryEner) DryEner = DryEner >> dry_scale_dmx
175
176 #define WET_ENER_WEIGHT(WetEner) WetEner = WetEner << wet_scale_dmx
177
178 #define DRY_ENER_SUM_REAL(DryEner, dmxReal, n) \
179 DryEner += \
180 fMultDiv2(fPow2Div2(dmxReal << SF_DRY), pBP[n]) >> ((2 * SF_DRY) - 2)
181
182 #define DRY_ENER_SUM_CPLX(DryEner, dmxReal, dmxImag, n) \
183 DryEner += fMultDiv2( \
184 fPow2Div2(dmxReal << SF_DRY) + fPow2Div2(dmxImag << SF_DRY), pBP[n])
185
186186 #define CALC_WET_SCALE(dryIdx, wetIdx) \
187187 if ((DryEnerLD64[dryIdx] - STP_SCALE_LIMIT_HI_LD64) > WetEnerLD64[wetIdx]) { \
188188 scale[wetIdx] = STP_SCALE_LIMIT_HI; \
205205 int update_old_ener;
206206 };
207207
208 inline void combineSignalReal(FIXP_DBL *hybOutputRealDry,
209 FIXP_DBL *hybOutputRealWet, int bands) {
210 int n;
211
212 for (n = bands - 1; n >= 0; n--) {
213 *hybOutputRealDry = *hybOutputRealDry + *hybOutputRealWet;
214 hybOutputRealDry++, hybOutputRealWet++;
215 }
216 }
217
218 inline void combineSignalRealScale1(FIXP_DBL *hybOutputRealDry,
219 FIXP_DBL *hybOutputRealWet, FIXP_DBL scaleX,
220 int bands) {
221 int n;
222
223 for (n = bands - 1; n >= 0; n--) {
224 *hybOutputRealDry =
225 *hybOutputRealDry +
226 (fMultDiv2(*hybOutputRealWet, scaleX) << (SF_SCALE + 1));
227 hybOutputRealDry++, hybOutputRealWet++;
228 }
229 }
230
231208 inline void combineSignalCplx(FIXP_DBL *hybOutputRealDry,
232209 FIXP_DBL *hybOutputImagDry,
233210 FIXP_DBL *hybOutputRealWet,
235212 int n;
236213
237214 for (n = bands - 1; n >= 0; n--) {
238 *hybOutputRealDry = *hybOutputRealDry + *hybOutputRealWet;
239 *hybOutputImagDry = *hybOutputImagDry + *hybOutputImagWet;
215 *hybOutputRealDry = fAddSaturate(*hybOutputRealDry, *hybOutputRealWet);
216 *hybOutputImagDry = fAddSaturate(*hybOutputImagDry, *hybOutputImagWet);
240217 hybOutputRealDry++, hybOutputRealWet++;
241218 hybOutputImagDry++, hybOutputImagWet++;
242219 }
252229 FIXP_DBL scaleY;
253230 for (n = bands - 1; n >= 0; n--) {
254231 scaleY = fMultDiv2(scaleX, *pBP);
255 *hybOutputRealDry =
256 *hybOutputRealDry +
257 (fMultDiv2(*hybOutputRealWet, scaleY) << (SF_SCALE + 2));
258 *hybOutputImagDry =
259 *hybOutputImagDry +
260 (fMultDiv2(*hybOutputImagWet, scaleY) << (SF_SCALE + 2));
232 *hybOutputRealDry = SATURATE_LEFT_SHIFT(
233 (*hybOutputRealDry >> 1) +
234 (fMultDiv2(*hybOutputRealWet, scaleY) << (SF_SCALE + 1)),
235 1, DFRACT_BITS);
236 *hybOutputImagDry = SATURATE_LEFT_SHIFT(
237 (*hybOutputImagDry >> 1) +
238 (fMultDiv2(*hybOutputImagWet, scaleY) << (SF_SCALE + 1)),
239 1, DFRACT_BITS);
261240 hybOutputRealDry++, hybOutputRealWet++;
262241 hybOutputImagDry++, hybOutputImagWet++;
263242 pBP++;
304283
305284 for (ch = 0; ch < MAX_OUTPUT_CHANNELS; ch++) {
306285 self->prev_tp_scale[ch] = FL2FXCONST_DBL(1.0f / (1 << SF_SCALE));
307 self->oldWetEnerLD64[ch] =
308 FL2FXCONST_DBL(0.34375f); /* 32768.0*32768.0/2^(44-26-10) */
286 self->oldWetEnerLD64[ch] = FL2FXCONST_DBL(0.0);
309287 }
310288 for (ch = 0; ch < MAX_INPUT_CHANNELS; ch++) {
311 self->oldDryEnerLD64[ch] =
312 FL2FXCONST_DBL(0.1875f); /* 32768.0*32768.0/2^(44-26) */
289 self->oldDryEnerLD64[ch] = FL2FXCONST_DBL(0.0);
313290 }
314291
315292 self->BP = BP__FDK;
363340 {
364341 cplxBands = BP_GF_SIZE;
365342 cplxHybBands = self->hybridBands;
366 dry_scale_dmx = (2 * SF_DRY) - 2;
343 if (self->treeConfig == TREE_212) {
344 dry_scale_dmx = 2; /* 2 bits to compensate fMultDiv2() and fPow2Div2()
345 used in energy calculation */
346 } else {
347 dry_scale_dmx = (2 * SF_DRY) - 2;
348 }
367349 wet_scale_dmx = 2;
368350 }
369351
389371 CalcLdData(hStpDec->runDryEner[ch] + ABS_THR__FDK);
390372 }
391373 for (ch = 0; ch < self->numOutputChannels; ch++) {
392 hStpDec->oldWetEnerLD64[ch] =
393 CalcLdData(hStpDec->runWetEner[ch] + ABS_THR2__FDK);
374 if (self->treeConfig == TREE_212)
375 hStpDec->oldWetEnerLD64[ch] =
376 CalcLdData(hStpDec->runWetEner[ch] + ABS_THR__FDK);
377 else
378 hStpDec->oldWetEnerLD64[ch] =
379 CalcLdData(hStpDec->runWetEner[ch] + ABS_THR2__FDK);
394380 }
395381 } else {
396382 hStpDec->update_old_ener++;
410396 pBP = hStpDec->BP_GF - BP_GF_START;
411397 switch (self->treeConfig) {
412398 case TREE_212:
399 INT sMin, sNorm, sReal, sImag;
400
401 sReal = fMin(getScalefactor(&qmfOutputRealDry[i_LF][BP_GF_START],
402 cplxBands - BP_GF_START),
403 getScalefactor(&qmfOutputRealDry[i_RF][BP_GF_START],
404 cplxBands - BP_GF_START));
405 sImag = fMin(getScalefactor(&qmfOutputImagDry[i_LF][BP_GF_START],
406 cplxBands - BP_GF_START),
407 getScalefactor(&qmfOutputImagDry[i_RF][BP_GF_START],
408 cplxBands - BP_GF_START));
409 sMin = fMin(sReal, sImag) - 1;
410
413411 for (n = BP_GF_START; n < cplxBands; n++) {
414 dmxReal0 = qmfOutputRealDry[i_LF][n] + qmfOutputRealDry[i_RF][n];
415 dmxImag0 = qmfOutputImagDry[i_LF][n] + qmfOutputImagDry[i_RF][n];
416 DRY_ENER_SUM_CPLX(DryEner0, dmxReal0, dmxImag0, n);
412 dmxReal0 = scaleValue(qmfOutputRealDry[i_LF][n], sMin) +
413 scaleValue(qmfOutputRealDry[i_RF][n], sMin);
414 dmxImag0 = scaleValue(qmfOutputImagDry[i_LF][n], sMin) +
415 scaleValue(qmfOutputImagDry[i_RF][n], sMin);
416
417 DryEner0 += (fMultDiv2(fPow2Div2(dmxReal0), pBP[n]) +
418 fMultDiv2(fPow2Div2(dmxImag0), pBP[n])) >>
419 SF_DRY_NRG;
417420 }
418 DRY_ENER_WEIGHT(DryEner0);
421
422 sNorm = SF_FREQ_DOMAIN_HEADROOM + SF_DRY_NRG + dry_scale_dmx -
423 (2 * sMin) + nrgScale;
424 DryEner0 = scaleValueSaturate(
425 DryEner0, fMax(fMin(sNorm, DFRACT_BITS - 1), -(DFRACT_BITS - 1)));
419426 break;
420427 default:;
421428 }
423430
424431 /* normalise the 'direct' signals */
425432 for (ch = 0; ch < self->numInputChannels; ch++) {
426 DryEner[ch] = DryEner[ch] << (nrgScale);
433 if (self->treeConfig != TREE_212) DryEner[ch] = DryEner[ch] << nrgScale;
427434 hStpDec->runDryEner[ch] =
428435 fMult(STP_LPF_COEFF1__FDK, hStpDec->runDryEner[ch]) +
429436 fMult(ONE_MINUS_STP_LPF_COEFF1__FDK, DryEner[ch]);
435442 DryEnerLD64[ch] = FL2FXCONST_DBL(-0.484375f);
436443 }
437444 }
438 if (self->treeConfig == TREE_212) {
439 for (; ch < MAX_INPUT_CHANNELS; ch++) {
440 DryEnerLD64[ch] = FL2FXCONST_DBL(-0.484375f);
441 }
445 for (; ch < MAX_INPUT_CHANNELS; ch++) {
446 DryEnerLD64[ch] = FL2FXCONST_DBL(-0.484375f);
442447 }
443448
444449 /* normalise the 'diffuse' signals */
449454 }
450455
451456 WetEnerX = FL2FXCONST_DBL(0.0f);
452 for (n = BP_GF_START; n < cplxBands; n++) {
453 tmp = fPow2Div2(qmfOutputRealWet[ch][n] << SF_WET);
454 tmp += fPow2Div2(qmfOutputImagWet[ch][n] << SF_WET);
455 WetEnerX += fMultDiv2(tmp, pBP[n]);
456 }
457 WET_ENER_WEIGHT(WetEnerX);
458
459 WetEnerX = WetEnerX << (nrgScale);
457
458 if (self->treeConfig == TREE_212) {
459 INT sMin, sNorm;
460
461 sMin = fMin(getScalefactor(&qmfOutputRealWet[ch][BP_GF_START],
462 cplxBands - BP_GF_START),
463 getScalefactor(&qmfOutputImagWet[ch][BP_GF_START],
464 cplxBands - BP_GF_START));
465
466 for (n = BP_GF_START; n < cplxBands; n++) {
467 WetEnerX +=
468 (fMultDiv2(fPow2Div2(scaleValue(qmfOutputRealWet[ch][n], sMin)),
469 pBP[n]) +
470 fMultDiv2(fPow2Div2(scaleValue(qmfOutputImagWet[ch][n], sMin)),
471 pBP[n])) >>
472 SF_WET_NRG;
473 }
474 sNorm = SF_FREQ_DOMAIN_HEADROOM + SF_WET_NRG + wet_scale_dmx -
475 (2 * sMin) + nrgScale;
476 WetEnerX = scaleValueSaturate(
477 WetEnerX, fMax(fMin(sNorm, DFRACT_BITS - 1), -(DFRACT_BITS - 1)));
478 } else
479 FDK_ASSERT(self->treeConfig == TREE_212);
480
460481 hStpDec->runWetEner[ch] =
461482 fMult(STP_LPF_COEFF1__FDK, hStpDec->runWetEner[ch]) +
462483 fMult(ONE_MINUS_STP_LPF_COEFF1__FDK, WetEnerX);
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
122122
123123 RAM_ALIGN
124124 LNK_SECTION_CONSTDATA
125 static const FIXP_STP phiTsd[8] = {
126 STCP(0x7fffffff, 0x00000000), STCP(0x5a82799a, 0x5a82799a),
127 STCP(0x00000000, 0x7fffffff), STCP(0xa57d8666, 0x5a82799a),
128 STCP(0x80000000, 0x00000000), STCP(0xa57d8666, 0xa57d8666),
129 STCP(0x00000000, 0x80000000), STCP(0x5a82799a, 0xa57d8666),
130 };
125 static const FIXP_DPK phiTsd[8] = {
126 {{(FIXP_DBL)0x7fffffff, (FIXP_DBL)0x00000000}},
127 {{(FIXP_DBL)0x5a82799a, (FIXP_DBL)0x5a82799a}},
128 {{(FIXP_DBL)0x00000000, (FIXP_DBL)0x7fffffff}},
129 {{(FIXP_DBL)0xa57d8666, (FIXP_DBL)0x5a82799a}},
130 {{(FIXP_DBL)0x80000000, (FIXP_DBL)0x00000000}},
131 {{(FIXP_DBL)0xa57d8666, (FIXP_DBL)0xa57d8666}},
132 {{(FIXP_DBL)0x00000000, (FIXP_DBL)0x80000000}},
133 {{(FIXP_DBL)0x5a82799a, (FIXP_DBL)0xa57d8666}}};
131134
132135 /*** Static Functions ***/
133136 static void longmult1(USHORT a[], USHORT b, USHORT d[], int len) {
332335
333336 if (isTrSlot(pTsdData, ts)) {
334337 int k;
335 const FIXP_STP *phi = &phiTsd[pTsdData->bsTsdTrPhaseData[ts]];
338 const FIXP_DPK *phi = &phiTsd[pTsdData->bsTsdTrPhaseData[ts]];
336339 FDK_ASSERT((pTsdData->bsTsdTrPhaseData[ts] >= 0) &&
337340 (pTsdData->bsTsdTrPhaseData[ts] < 8));
338341
339342 /* d = d_nonTr + v_direct * exp(j * bsTsdTrPhaseData[ts]/4 * pi ) */
340343 for (k = TSD_START_BAND; k < numHybridBands; k++) {
341344 FIXP_DBL tempReal, tempImag;
342 cplxMult(&tempReal, &tempImag, pVdirectReal[k], pVdirectImag[k], *phi);
343 pDnonTrReal[k] += tempReal;
344 pDnonTrImag[k] += tempImag;
345 cplxMultDiv2(&tempReal, &tempImag, pVdirectReal[k], pVdirectImag[k],
346 *phi);
347 pDnonTrReal[k] = SATURATE_LEFT_SHIFT(
348 (pDnonTrReal[k] >> 2) + (tempReal >> 1), 2, DFRACT_BITS);
349 pDnonTrImag[k] = SATURATE_LEFT_SHIFT(
350 (pDnonTrImag[k] >> 2) + (tempImag >> 1), 2, DFRACT_BITS);
345351 }
346352 }
347353
129129 #define SACENC_LIB_VL1 0
130130 #define SACENC_LIB_VL2 0
131131 #define SACENC_LIB_TITLE "MPEG Surround Encoder"
132 #ifdef __ANDROID__
132 #ifdef SUPPRESS_BUILD_DATE_INFO
133133 #define SACENC_LIB_BUILD_DATE ""
134134 #define SACENC_LIB_BUILD_TIME ""
135135 #else
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
360360 * error (0: core decoder found errors, 1: no errors).
361361 * \param psDecoded Pointer to a buffer holding a flag. Input: PS is
362362 * possible, Output: PS has been rendered.
363 * \param inDataHeadroom Headroom of the SBR input time signal to prevent
364 * clipping.
365 * \param outDataHeadroom Pointer to headroom of the SBR output time signal to
366 * prevent clipping.
363367 *
364368 * \return Error code.
365369 */
366 SBR_ERROR sbrDecoder_Apply(HANDLE_SBRDECODER self, INT_PCM *input,
367 INT_PCM *timeData, const int timeDataSize,
368 int *numChannels, int *sampleRate,
370 SBR_ERROR sbrDecoder_Apply(HANDLE_SBRDECODER self, LONG *input, LONG *timeData,
371 const int timeDataSize, int *numChannels,
372 int *sampleRate,
369373 const FDK_channelMapDescr *const mapDescr,
370374 const int mapIdx, const int coreDecodedOk,
371 UCHAR *psDecoded);
375 UCHAR *psDecoded, const INT inDataHeadroom,
376 INT *outDataHeadroom);
372377
373378 /**
374379 * \brief Close SBR decoder instance and free memory.
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
896896 for (i = startSample; i < stopSample; i++) {
897897 maxVal |=
898898 (FIXP_DBL)((LONG)(sourceBufferReal[i][loBand]) ^
899 ((LONG)sourceBufferReal[i][loBand] >> (SAMPLE_BITS - 1)));
899 ((LONG)sourceBufferReal[i][loBand] >> (DFRACT_BITS - 1)));
900900 maxVal |=
901901 (FIXP_DBL)((LONG)(sourceBufferImag[i][loBand]) ^
902 ((LONG)sourceBufferImag[i][loBand] >> (SAMPLE_BITS - 1)));
902 ((LONG)sourceBufferImag[i][loBand] >> (DFRACT_BITS - 1)));
903903 }
904904
905905 if (maxVal != FL2FX_DBL(0.0f)) {
906 reserve = fixMax(0, CntLeadingZeros(maxVal) - 2);
906 reserve = CntLeadingZeros(maxVal) - 2;
907907 }
908908
909909 nrg_ov = nrg = (FIXP_DBL)0;
910910 if (scale_nrg_ov > -31) {
911911 for (i = startSample; i < overlap; i++) {
912 nrg_ov += (fPow2Div2(sourceBufferReal[i][loBand] << reserve) +
913 fPow2Div2(sourceBufferImag[i][loBand] << reserve)) >>
914 sum_scale_ov;
912 nrg_ov +=
913 (fPow2Div2(scaleValue(sourceBufferReal[i][loBand], reserve)) +
914 fPow2Div2(scaleValue(sourceBufferImag[i][loBand], reserve))) >>
915 sum_scale_ov;
915916 }
916917 } else {
917918 scale_nrg_ov = 0;
918919 }
919920 if (scale_nrg > -31) {
920921 for (i = overlap; i < stopSample; i++) {
921 nrg += (fPow2Div2(sourceBufferReal[i][loBand] << reserve) +
922 fPow2Div2(sourceBufferImag[i][loBand] << reserve)) >>
922 nrg += (fPow2Div2(scaleValue(sourceBufferReal[i][loBand], reserve)) +
923 fPow2Div2(scaleValue(sourceBufferImag[i][loBand], reserve))) >>
923924 sum_scale;
924925 }
925926 } else {
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
149149 #include "sbr_rom.h"
150150
151151 #include "genericStds.h" /* need FDKpow() for debug outputs */
152
153 #define MAX_SFB_NRG_HEADROOM (1)
154 #define MAX_VAL_NRG_HEADROOM ((((FIXP_DBL)MAXVAL_DBL) >> MAX_SFB_NRG_HEADROOM))
152155
153156 typedef struct {
154157 FIXP_DBL nrgRef[MAX_FREQ_COEFFS];
492495 }
493496 }
494497
495 #define INTER_TES_SF_CHANGE 3
498 #define INTER_TES_SF_CHANGE 4
496499
497500 typedef struct {
498501 FIXP_DBL subsample_power_low[(((1024) / (32) * (4) / 2) + (3 * (4)))];
698701 gain_sf[i] += gamma_sf + 1; /* +1 because of fMultDiv2() */
699702
700703 /* set gain to at least 0.2f */
701 FIXP_DBL point_two = FL2FXCONST_DBL(0.8f); /* scaled up by 2 */
702 int point_two_sf = -2;
703
704 FIXP_DBL tmp = gain[i];
705 if (point_two_sf < gain_sf[i]) {
706 point_two >>= gain_sf[i] - point_two_sf;
707 } else {
708 tmp >>= point_two_sf - gain_sf[i];
709 }
710
711704 /* limit and calculate gain[i]^2 too */
712705 FIXP_DBL gain_pow2;
713706 int gain_pow2_sf;
714 if (tmp < point_two) {
707
708 if (fIsLessThan(gain[i], gain_sf[i], FL2FXCONST_DBL(0.2f), 0)) {
715709 gain[i] = FL2FXCONST_DBL(0.8f);
716710 gain_sf[i] = -2;
717711 gain_pow2 = FL2FXCONST_DBL(0.64f);
738732 fMin(DFRACT_BITS - 1, new_summand_sf - total_power_high_after_sf);
739733 total_power_high_after_sf = new_summand_sf;
740734 } else if (new_summand_sf < total_power_high_after_sf) {
741 subsample_power_high[i] >>= total_power_high_after_sf - new_summand_sf;
735 subsample_power_high[i] >>=
736 fMin(DFRACT_BITS - 1, total_power_high_after_sf - new_summand_sf);
742737 }
743738 total_power_high_after += subsample_power_high[i] >> preShift2;
744739 }
984979 */
985980 if (!useLP)
986981 adj_e = h_sbr_cal_env->filtBufferNoise_e -
987 getScalefactor(h_sbr_cal_env->filtBufferNoise, noSubbands);
982 getScalefactor(h_sbr_cal_env->filtBufferNoise, noSubbands) +
983 (INT)MAX_SFB_NRG_HEADROOM;
988984
989985 /*
990986 Scan for maximum reference energy to be able
10041000 - Smoothing can smear high gains of the previous envelope into the
10051001 current
10061002 */
1007 maxSfbNrg_e += 6;
1003 maxSfbNrg_e += (6 + MAX_SFB_NRG_HEADROOM);
10081004
10091005 adj_e = maxSfbNrg_e;
10101006 // final_e should not exist for PVC fixfix framing
10301026 - Smoothing can smear high gains of the previous envelope into the
10311027 current
10321028 */
1033 maxSfbNrg_e += 6;
1029 maxSfbNrg_e += (6 + MAX_SFB_NRG_HEADROOM);
10341030
10351031 if (borders[i] < hHeaderData->numberTimeSlots)
10361032 /* This envelope affects timeslots that belong to the output frame */
14761472
14771473 for (k = 0; k < noSubbands; k++) {
14781474 int sc = scale_change - pNrgs->nrgGain_e[k] + (sc_change - 1);
1479 pNrgs->nrgGain[k] >>= sc;
1475 pNrgs->nrgGain[k] >>= fixMin(sc, DFRACT_BITS - 1);
14801476 pNrgs->nrgGain_e[k] += sc;
14811477 }
14821478
14841480 for (k = 0; k < noSubbands; k++) {
14851481 int sc =
14861482 scale_change - h_sbr_cal_env->filtBuffer_e[k] + (sc_change - 1);
1487 h_sbr_cal_env->filtBuffer[k] >>= sc;
1483 h_sbr_cal_env->filtBuffer[k] >>= fixMin(sc, DFRACT_BITS - 1);
14881484 }
14891485 }
14901486
15751571 FDK_ASSERT(!iTES_enable); /* not supported */
15761572 if (flags & SBRDEC_ELD_GRID) {
15771573 /* FDKmemset(analysBufferReal[j], 0, 64 * sizeof(FIXP_DBL)); */
1578 adjustTimeSlot_EldGrid(&analysBufferReal[j][lowSubband], pNrgs,
1579 &h_sbr_cal_env->harmIndex, lowSubband,
1580 noSubbands,
1581 fMin(scale_change, DFRACT_BITS - 1),
1582 noNoiseFlag, &h_sbr_cal_env->phaseIndex,
1583 EXP2SCALE(adj_e) - sbrScaleFactor->lb_scale);
1574 adjustTimeSlot_EldGrid(
1575 &analysBufferReal[j][lowSubband], pNrgs,
1576 &h_sbr_cal_env->harmIndex, lowSubband, noSubbands,
1577 fMin(scale_change, DFRACT_BITS - 1), noNoiseFlag,
1578 &h_sbr_cal_env->phaseIndex,
1579 fMax(EXP2SCALE(adj_e) - sbrScaleFactor->lb_scale,
1580 -(DFRACT_BITS - 1)));
15841581 } else {
15851582 adjustTimeSlotLC(&analysBufferReal[j][lowSubband], pNrgs,
15861583 &h_sbr_cal_env->harmIndex, lowSubband, noSubbands,
18291826 diff = (int)(nrgGain_e[band] - filtBuffer_e[band]);
18301827 if (diff > 0) {
18311828 filtBuffer[band] >>=
1832 diff; /* Compensate for the scale change by shifting the mantissa. */
1829 fMin(diff, DFRACT_BITS - 1); /* Compensate for the scale change by
1830 shifting the mantissa. */
18331831 filtBuffer_e[band] += diff; /* New gain is bigger, use its exponent */
18341832 } else if (diff < 0) {
18351833 /* The buffered gains seem to be larger, but maybe there
18491847 filtBuffer_e[band] -= reserve; /* Compensate in the exponent: */
18501848
18511849 /* For the remaining difference, change the new gain value */
1852 diff = fixMin(-(reserve + diff), DFRACT_BITS - 1);
1853 nrgGain[band] >>= diff;
1850 diff = -(reserve + diff);
1851 nrgGain[band] >>= fMin(diff, DFRACT_BITS - 1);
18541852 nrgGain_e[band] += diff;
18551853 }
18561854 }
23242322 }
23252323
23262324 /* gain = nrgRef / B */
2327 FDK_divide_MantExp(nrgRef, nrgRef_e, b, b_e, ptrNrgGain, ptrNrgGain_e);
2325 INT result_exp = 0;
2326 *ptrNrgGain = fDivNorm(nrgRef, b, &result_exp);
2327 *ptrNrgGain_e = (SCHAR)result_exp + (nrgRef_e - b_e);
2328
2329 /* There could be a one bit diffs. This is important to compensate,
2330 because later in the code values are compared by exponent only. */
2331 int headroom = CountLeadingBits(*ptrNrgGain);
2332 *ptrNrgGain <<= headroom;
2333 *ptrNrgGain_e -= headroom;
23282334 }
23292335 }
23302336
24142420 const FIXP_DBL *p_harmonicPhaseX = &harmonicPhaseX[harmIndex][0];
24152421 const INT *p_harmonicPhase = &harmonicPhase[harmIndex][0];
24162422
2423 const FIXP_DBL max_val = MAX_VAL_NRG_HEADROOM >> scale_change;
2424 const FIXP_DBL min_val = -max_val;
2425
24172426 *(ptrReal - 1) = fAddSaturate(
24182427 *(ptrReal - 1),
24192428 SATURATE_SHIFT(fMultDiv2(p_harmonicPhaseX[lowSubband & 1], pSineLevel[0]),
24262435 FIXP_DBL sineLevel_curr = *pSineLevel++;
24272436 phaseIndex = (phaseIndex + 1) & (SBR_NF_NO_RANDOM_VAL - 1);
24282437
2429 signalReal = fMultDiv2(*ptrReal, *pGain++) << ((int)scale_change);
2438 signalReal = fMax(fMin(fMultDiv2(*ptrReal, *pGain++), max_val), min_val)
2439 << scale_change;
24302440 sbNoise = *pNoiseLevel++;
24312441 if (((INT)sineLevel_curr | noNoiseFlag) == 0) {
24322442 signalReal +=
2433 (fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[phaseIndex][0], sbNoise)
2434 << 4);
2443 fMult(FDK_sbrDecoder_sbr_randomPhase[phaseIndex][0], sbNoise);
24352444 }
24362445 signalReal += sineLevel_curr * p_harmonicPhase[0];
24372446 signalReal =
24612470 FIXP_DBL sineLevel_curr = *pSineLevel++;
24622471 phaseIndex = (phaseIndex + 1) & (SBR_NF_NO_RANDOM_VAL - 1);
24632472
2464 signalReal = fMultDiv2(*ptrReal, *pGain++) << ((int)scale_change);
2473 signalReal = fMax(fMin(fMultDiv2(*ptrReal, *pGain++), max_val), min_val)
2474 << scale_change;
24652475 sbNoise = *pNoiseLevel++;
24662476 if (((INT)sineLevel_curr | noNoiseFlag) == 0) {
24672477 signalReal +=
2468 (fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[phaseIndex][0], sbNoise)
2469 << 4);
2478 fMult(FDK_sbrDecoder_sbr_randomPhase[phaseIndex][0], sbNoise);
24702479 }
24712480 signalReal += sineLevel_curr * p_harmonicPhase[0];
24722481 *ptrReal++ = signalReal;
25022511 FIXP_DBL signalReal, sineLevel, sineLevelNext, sineLevelPrev;
25032512 int tone_count = 0;
25042513 int sineSign = 1;
2514 const FIXP_DBL max_val = MAX_VAL_NRG_HEADROOM >> scale_change;
2515 const FIXP_DBL min_val = -max_val;
25052516
25062517 #define C1 ((FIXP_SGL)FL2FXCONST_SGL(2.f * 0.00815f))
25072518 #define C1_CLDFB ((FIXP_SGL)FL2FXCONST_SGL(2.f * 0.16773f))
25172528 of the signal and should be carried out with full accuracy
25182529 (supplying #FRACT_BITS valid bits).
25192530 */
2520 signalReal = fMultDiv2(*ptrReal, *pGain++) << ((int)scale_change);
2531 signalReal = fMax(fMin(fMultDiv2(*ptrReal, *pGain++), max_val), min_val)
2532 << scale_change;
25212533 sineLevel = *pSineLevel++;
25222534 sineLevelNext = (noSubbands > 1) ? pSineLevel[0] : FL2FXCONST_DBL(0.0f);
25232535
25262538 else if (!noNoiseFlag)
25272539 /* Add noisefloor to the amplified signal */
25282540 signalReal +=
2529 (fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], pNoiseLevel[0])
2530 << 4);
2541 fMult(FDK_sbrDecoder_sbr_randomPhase[index][0], pNoiseLevel[0]);
25312542
25322543 {
25332544 if (!(harmIndex & 0x1)) {
25462557
25472558 /* save switch and compare operations and reduce to XOR statement */
25482559 if (((harmIndex >> 1) & 0x1) ^ freqInvFlag) {
2549 *(ptrReal - 1) += tmp1;
2560 *(ptrReal - 1) = fAddSaturate(*(ptrReal - 1), tmp1);
25502561 signalReal -= tmp2;
25512562 } else {
2552 *(ptrReal - 1) -= tmp1;
2563 *(ptrReal - 1) = fAddSaturate(*(ptrReal - 1), -tmp1);
25532564 signalReal += tmp2;
25542565 }
25552566 *ptrReal++ = signalReal;
25742585 !noNoiseFlag) {
25752586 /* Add noisefloor to the amplified signal */
25762587 index &= (SBR_NF_NO_RANDOM_VAL - 1);
2577 signalReal += (fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0],
2578 pNoiseLevel[0])
2579 << 4);
2588 signalReal +=
2589 fMult(FDK_sbrDecoder_sbr_randomPhase[index][0], pNoiseLevel[0]);
25802590 }
25812591
25822592 /* The next multiplication constitutes the actual envelope adjustment of
25832593 * the signal. */
2584 signalReal += fMultDiv2(*ptrReal, *pGain++) << ((int)scale_change);
2594 signalReal +=
2595 fMax(fMin(fMultDiv2(*ptrReal, *pGain++), max_val), min_val)
2596 << scale_change;
25852597
25862598 pNoiseLevel++;
25872599 *ptrReal++ = signalReal;
25942606 index++;
25952607 /* The next multiplication constitutes the actual envelope adjustment of
25962608 * the signal. */
2597 signalReal = fMultDiv2(*ptrReal, *pGain++) << ((int)scale_change);
2609 signalReal = fMax(fMin(fMultDiv2(*ptrReal, *pGain++), max_val), min_val)
2610 << scale_change;
25982611
25992612 if (*pSineLevel++ != FL2FXCONST_DBL(0.0f))
26002613 tone_count++;
26012614 else if (!noNoiseFlag) {
26022615 /* Add noisefloor to the amplified signal */
26032616 index &= (SBR_NF_NO_RANDOM_VAL - 1);
2604 signalReal += (fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0],
2605 pNoiseLevel[0])
2606 << 4);
2617 signalReal +=
2618 fMult(FDK_sbrDecoder_sbr_randomPhase[index][0], pNoiseLevel[0]);
26072619 }
26082620
26092621 pNoiseLevel++;
26232635 index++;
26242636 /* The next multiplication constitutes the actual envelope adjustment of the
26252637 * signal. */
2626 signalReal = fMultDiv2(*ptrReal, *pGain) << ((int)scale_change);
2638 signalReal = fMax(fMin(fMultDiv2(*ptrReal, *pGain), max_val), min_val)
2639 << scale_change;
26272640 sineLevelPrev = fMultDiv2(pSineLevel[-1], FL2FX_SGL(0.0163f));
26282641 sineLevel = pSineLevel[0];
26292642
26322645 else if (!noNoiseFlag) {
26332646 /* Add noisefloor to the amplified signal */
26342647 index &= (SBR_NF_NO_RANDOM_VAL - 1);
2635 signalReal =
2636 signalReal +
2637 (fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], pNoiseLevel[0])
2638 << 4);
2648 signalReal = signalReal + fMult(FDK_sbrDecoder_sbr_randomPhase[index][0],
2649 pNoiseLevel[0]);
26392650 }
26402651
26412652 if (!(harmIndex & 0x1)) {
26942705 /*FL2FXCONST_SGL(1.0f) */ (FIXP_SGL)MAXVAL_SGL - smooth_ratio;
26952706 int index = *ptrPhaseIndex;
26962707 int shift;
2708 FIXP_DBL max_val_noise = 0, min_val_noise = 0;
2709 const FIXP_DBL max_val = MAX_VAL_NRG_HEADROOM >> scale_change;
2710 const FIXP_DBL min_val = -max_val;
26972711
26982712 *ptrPhaseIndex = (index + noSubbands) & (SBR_NF_NO_RANDOM_VAL - 1);
26992713
27032717 shift = fixMin(DFRACT_BITS - 1, -filtBufferNoiseShift);
27042718 } else {
27052719 shift = fixMin(DFRACT_BITS - 1, filtBufferNoiseShift);
2720 max_val_noise = MAX_VAL_NRG_HEADROOM >> shift;
2721 min_val_noise = -max_val_noise;
27062722 }
27072723
27082724 if (smooth_ratio > FL2FXCONST_SGL(0.0f)) {
27182734 smoothedNoise = (fMultDiv2(smooth_ratio, filtBufferNoise[k]) >> shift) +
27192735 fMult(direct_ratio, noiseLevel[k]);
27202736 } else {
2721 smoothedNoise = (fMultDiv2(smooth_ratio, filtBufferNoise[k]) << shift) +
2722 fMult(direct_ratio, noiseLevel[k]);
2737 smoothedNoise = fMultDiv2(smooth_ratio, filtBufferNoise[k]);
2738 smoothedNoise =
2739 (fMax(fMin(smoothedNoise, max_val_noise), min_val_noise) << shift) +
2740 fMult(direct_ratio, noiseLevel[k]);
27232741 }
27242742
27252743 /*
27272745 of the signal and should be carried out with full accuracy
27282746 (supplying #DFRACT_BITS valid bits).
27292747 */
2730 signalReal = fMultDiv2(*ptrReal, smoothedGain) << ((int)scale_change);
2731 signalImag = fMultDiv2(*ptrImag, smoothedGain) << ((int)scale_change);
2748 signalReal =
2749 fMax(fMin(fMultDiv2(*ptrReal, smoothedGain), max_val), min_val)
2750 << scale_change;
2751 signalImag =
2752 fMax(fMin(fMultDiv2(*ptrImag, smoothedGain), max_val), min_val)
2753 << scale_change;
27322754
27332755 index++;
27342756
27402762 /* Add noisefloor to the amplified signal */
27412763 index &= (SBR_NF_NO_RANDOM_VAL - 1);
27422764 noiseReal =
2743 fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], smoothedNoise)
2744 << 4;
2765 fMult(FDK_sbrDecoder_sbr_randomPhase[index][0], smoothedNoise);
27452766 noiseImag =
2746 fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][1], smoothedNoise)
2747 << 4;
2767 fMult(FDK_sbrDecoder_sbr_randomPhase[index][1], smoothedNoise);
27482768 *ptrReal++ = (signalReal + noiseReal);
27492769 *ptrImag++ = (signalImag + noiseImag);
27502770 }
27522772 } else {
27532773 for (k = 0; k < noSubbands; k++) {
27542774 smoothedGain = gain[k];
2755 signalReal = fMultDiv2(*ptrReal, smoothedGain) << scale_change;
2756 signalImag = fMultDiv2(*ptrImag, smoothedGain) << scale_change;
2775 signalReal =
2776 fMax(fMin(fMultDiv2(*ptrReal, smoothedGain), max_val), min_val)
2777 << scale_change;
2778 signalImag =
2779 fMax(fMin(fMultDiv2(*ptrImag, smoothedGain), max_val), min_val)
2780 << scale_change;
27572781
27582782 index++;
27592783
27622786 smoothedNoise = noiseLevel[k];
27632787 index &= (SBR_NF_NO_RANDOM_VAL - 1);
27642788 noiseReal =
2765 fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], smoothedNoise);
2789 fMult(FDK_sbrDecoder_sbr_randomPhase[index][0], smoothedNoise);
27662790 noiseImag =
2767 fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][1], smoothedNoise);
2768
2769 /* FDK_sbrDecoder_sbr_randomPhase is downscaled by 2^3 */
2770 signalReal += noiseReal << 4;
2771 signalImag += noiseImag << 4;
2791 fMult(FDK_sbrDecoder_sbr_randomPhase[index][1], smoothedNoise);
2792
2793 signalReal += noiseReal;
2794 signalImag += noiseImag;
27722795 }
27732796 *ptrReal++ = signalReal;
27742797 *ptrImag++ = signalImag;
28602883 int freqInvFlag = (lowSubband & 1);
28612884 FIXP_DBL sineLevel;
28622885 int shift;
2886 FIXP_DBL max_val_noise = 0, min_val_noise = 0;
2887 const FIXP_DBL max_val = MAX_VAL_NRG_HEADROOM >> scale_change;
2888 const FIXP_DBL min_val = -max_val;
28632889
28642890 *ptrPhaseIndex = (index + noSubbands) & (SBR_NF_NO_RANDOM_VAL - 1);
28652891 *ptrHarmIndex = (harmIndex + 1) & 3;
28752901
28762902 filtBufferNoiseShift +=
28772903 1; /* due to later use of fMultDiv2 instead of fMult */
2878 if (filtBufferNoiseShift < 0)
2904 if (filtBufferNoiseShift < 0) {
28792905 shift = fixMin(DFRACT_BITS - 1, -filtBufferNoiseShift);
2880 else
2906 } else {
28812907 shift = fixMin(DFRACT_BITS - 1, filtBufferNoiseShift);
2908 max_val_noise = MAX_VAL_NRG_HEADROOM >> shift;
2909 min_val_noise = -max_val_noise;
2910 }
28822911
28832912 if (smooth_ratio > FL2FXCONST_SGL(0.0f)) {
28842913 for (k = 0; k < noSubbands; k++) {
28942923 smoothedNoise = (fMultDiv2(smooth_ratio, filtBufferNoise[k]) >> shift) +
28952924 fMult(direct_ratio, noiseLevel[k]);
28962925 } else {
2897 smoothedNoise = (fMultDiv2(smooth_ratio, filtBufferNoise[k]) << shift) +
2898 fMult(direct_ratio, noiseLevel[k]);
2926 smoothedNoise = fMultDiv2(smooth_ratio, filtBufferNoise[k]);
2927 smoothedNoise =
2928 (fMax(fMin(smoothedNoise, max_val_noise), min_val_noise) << shift) +
2929 fMult(direct_ratio, noiseLevel[k]);
28992930 }
29002931
29012932 /*
29032934 of the signal and should be carried out with full accuracy
29042935 (supplying #DFRACT_BITS valid bits).
29052936 */
2906 signalReal = fMultDiv2(*ptrReal, smoothedGain) << ((int)scale_change);
2907 signalImag = fMultDiv2(*ptrImag, smoothedGain) << ((int)scale_change);
2937 signalReal =
2938 fMax(fMin(fMultDiv2(*ptrReal, smoothedGain), max_val), min_val)
2939 << scale_change;
2940 signalImag =
2941 fMax(fMin(fMultDiv2(*ptrImag, smoothedGain), max_val), min_val)
2942 << scale_change;
29082943
29092944 index++;
29102945
29432978 } else {
29442979 /* Add noisefloor to the amplified signal */
29452980 index &= (SBR_NF_NO_RANDOM_VAL - 1);
2946 /* FDK_sbrDecoder_sbr_randomPhase is downscaled by 2^3 */
29472981 noiseReal =
2948 fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], smoothedNoise)
2949 << 4;
2982 fMult(FDK_sbrDecoder_sbr_randomPhase[index][0], smoothedNoise);
29502983 noiseImag =
2951 fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][1], smoothedNoise)
2952 << 4;
2984 fMult(FDK_sbrDecoder_sbr_randomPhase[index][1], smoothedNoise);
29532985 *ptrReal++ = (signalReal + noiseReal);
29542986 *ptrImag++ = (signalImag + noiseImag);
29552987 }
29602992 } else {
29612993 for (k = 0; k < noSubbands; k++) {
29622994 smoothedGain = gain[k];
2963 signalReal = fMultDiv2(*ptrReal, smoothedGain) << scale_change;
2964 signalImag = fMultDiv2(*ptrImag, smoothedGain) << scale_change;
2995 signalReal =
2996 fMax(fMin(fMultDiv2(*ptrReal, smoothedGain), max_val), min_val)
2997 << scale_change;
2998 signalImag =
2999 fMax(fMin(fMultDiv2(*ptrImag, smoothedGain), max_val), min_val)
3000 << scale_change;
29653001
29663002 index++;
29673003
29913027 /* Add noisefloor to the amplified signal */
29923028 smoothedNoise = noiseLevel[k];
29933029 index &= (SBR_NF_NO_RANDOM_VAL - 1);
2994 noiseReal = fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0],
2995 smoothedNoise);
2996 noiseImag = fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][1],
2997 smoothedNoise);
2998
2999 /* FDK_sbrDecoder_sbr_randomPhase is downscaled by 2^3 */
3000 signalReal += noiseReal << 4;
3001 signalImag += noiseImag << 4;
3030 noiseReal =
3031 fMult(FDK_sbrDecoder_sbr_randomPhase[index][0], smoothedNoise);
3032 noiseImag =
3033 fMult(FDK_sbrDecoder_sbr_randomPhase[index][1], smoothedNoise);
3034
3035 signalReal += noiseReal;
3036 signalImag += noiseImag;
30023037 }
30033038 }
30043039 *ptrReal++ = signalReal;
31463181 return SBRDEC_UNSUPPORTED_CONFIG;
31473182 }
31483183
3184 /* Restrict maximum value of limiter band table */
3185 if (workLimiterBandTable[tempNoLim] > highSubband) {
3186 return SBRDEC_UNSUPPORTED_CONFIG;
3187 }
3188
31493189 /* Copy limiterbands from working buffer into final destination */
31503190 for (k = 0; k <= nBands; k++) {
31513191 limiterBandTable[k] = workLimiterBandTable[k];
11501150 int numberTimeSlots, const UINT flags) {
11511151 int nEnv, i, tranIdx;
11521152 const int *pTable;
1153
1154 if (tranPosInternal >= numberTimeSlots) {
1155 return 0;
1156 }
11531157
11541158 switch (numberTimeSlots) {
11551159 case 8:
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
956956 hQmfTran->qmfOutBufSize = 2 * (hQmfTran->noCols / 2 + QMF_WIN_LEN - 1);
957957
958958 hQmfTran->inBuf_F =
959 (INT_PCM*)FDKcalloc(QMF_SYNTH_CHANNELS + 20 + 1, sizeof(INT_PCM));
959 (LONG*)FDKcalloc(QMF_SYNTH_CHANNELS + 20 + 1, sizeof(LONG));
960960 /* buffered time signal needs to be delayed by synthesis_size; max
961961 * synthesis_size = 20; */
962962 if (hQmfTran->inBuf_F == NULL) {
13381338 g_r_m = fMultDiv2(tmp_r, factor_m) << shift;
13391339 g_i_m = fMultDiv2(tmp_i, factor_m) << shift;
13401340 g_e = scale_factor_hbe - (g_e + factor_e + gammaCenter_e + add);
1341 fMax((INT)0, g_e);
1341 g_e = fMax((INT)0, g_e);
13421342 *qmfHBEBufReal_F += g_r_m >> g_e;
13431343 *qmfHBEBufImag_F += g_i_m >> g_e;
13441344 }
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
131131 } KEEP_STATES_SYNCED_MODE;
132132
133133 struct hbeTransposer {
134 FIXP_DBL anaQmfStates[HBE_QMF_FILTER_STATE_ANA_SIZE];
135 FIXP_QSS synQmfStates[HBE_QMF_FILTER_STATE_SYN_SIZE];
136
134137 int xOverQmf[MAX_NUM_PATCHES_HBE];
135138
136139 int maxStretch;
143146 int stopBand;
144147 int bSbr41;
145148
146 INT_PCM *inBuf_F;
149 LONG *inBuf_F;
147150 FIXP_DBL **qmfInBufReal_F;
148151 FIXP_DBL **qmfInBufImag_F;
149152
154157
155158 FIXP_DBL const *synthesisQmfPreModCos_F;
156159 FIXP_DBL const *synthesisQmfPreModSin_F;
157
158 FIXP_QAS anaQmfStates[HBE_QMF_FILTER_STATE_ANA_SIZE];
159 FIXP_QSS synQmfStates[HBE_QMF_FILTER_STATE_SYN_SIZE];
160160
161161 FIXP_DBL **qmfHBEBufReal_F;
162162 FIXP_DBL **qmfHBEBufImag_F;
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
445445 pSettings->nCols) +
446446 lowBandShift);
447447 }
448 dynamicScale = fixMax(
449 0, dynamicScale - 1); /* one additional bit headroom to prevent -1.0 */
448
449 if (dynamicScale == 0) {
450 /* In this special case the available headroom bits as well as
451 ovLowBandShift and lowBandShift are zero. The spectrum is limited to
452 prevent -1.0, so negative values for dynamicScale can be avoided. */
453 for (i = 0; i < (LPC_ORDER + pSettings->overlap + pSettings->nCols);
454 i++) {
455 lowBandReal[i] = fixMax(lowBandReal[i], (FIXP_DBL)0x80000001);
456 }
457 if (!useLP) {
458 for (i = 0; i < (LPC_ORDER + pSettings->overlap + pSettings->nCols);
459 i++) {
460 lowBandImag[i] = fixMax(lowBandImag[i], (FIXP_DBL)0x80000001);
461 }
462 }
463 } else {
464 dynamicScale =
465 fixMax(0, dynamicScale -
466 1); /* one additional bit headroom to prevent -1.0 */
467 }
450468
451469 /*
452470 Scale temporal QMF buffer.
9951013 pSettings->nCols) +
9961014 lowBandShift);
9971015
998 dynamicScale = fixMax(
999 0, dynamicScale - 1); /* one additional bit headroom to prevent -1.0 */
1016 dynamicScale =
1017 dynamicScale - 1; /* one additional bit headroom to prevent -1.0 */
10001018
10011019 /*
10021020 Scale temporal QMF buffer.
11751193 } else { /* bw <= 0 */
11761194
11771195 int descale = fixMin(DFRACT_BITS - 1, (LPC_SCALE_FACTOR + dynamicScale));
1196 dynamicScale +=
1197 1; /* prevent negativ scale factor due to 'one additional bit
1198 headroom' */
11781199
11791200 for (i = startSample; i < stopSample; i++) {
11801201 FIXP_DBL accu1, accu2;
11911212 dynamicScale;
11921213
11931214 qmfBufferReal[i][loBand] =
1194 (lowBandReal[LPC_ORDER + i] >> descale) + (accu1 << 1);
1215 (lowBandReal[LPC_ORDER + i] >> descale) + (accu1 << (1 + 1));
11951216 qmfBufferImag[i][loBand] =
1196 (lowBandImag[LPC_ORDER + i] >> descale) + (accu2 << 1);
1217 (lowBandImag[LPC_ORDER + i] >> descale) + (accu2 << (1 + 1));
11971218 }
11981219 } /* bw <= 0 */
11991220
324324 int env, int usb) {
325325 INT group = 0;
326326 INT bin = 0;
327 INT noIidSteps, noFactors;
327 INT noIidSteps;
328328
329329 FIXP_SGL invL;
330330 FIXP_DBL ScaleL, ScaleR;
331 FIXP_DBL Alpha, Beta, AlphasValue;
331 FIXP_DBL Alpha, Beta;
332332 FIXP_DBL h11r, h12r, h21r, h22r;
333333
334334 const FIXP_DBL *PScaleFactors;
336336 if (h_ps_d->bsData[h_ps_d->processSlot].mpeg.bFineIidQ) {
337337 PScaleFactors = ScaleFactorsFine; /* values are shiftet right by one */
338338 noIidSteps = NO_IID_STEPS_FINE;
339 noFactors = NO_IID_LEVELS_FINE;
340339 } else {
341340 PScaleFactors = ScaleFactors; /* values are shiftet right by one */
342341 noIidSteps = NO_IID_STEPS;
343 noFactors = NO_IID_LEVELS;
344342 }
345343
346344 /* dequantize and decode */
359357
360358 /* ScaleR and ScaleL are scaled by 1 shift right */
361359
362 ScaleL = ScaleR = 0;
363 if (noIidSteps + h_ps_d->specificTo.mpeg.pCoef->aaIidIndexMapped[env][bin] >= 0 && noIidSteps + h_ps_d->specificTo.mpeg.pCoef->aaIidIndexMapped[env][bin] < noFactors)
364 ScaleR = PScaleFactors[noIidSteps + h_ps_d->specificTo.mpeg.pCoef
365 ->aaIidIndexMapped[env][bin]];
366 if (noIidSteps - h_ps_d->specificTo.mpeg.pCoef->aaIidIndexMapped[env][bin] >= 0 && noIidSteps - h_ps_d->specificTo.mpeg.pCoef->aaIidIndexMapped[env][bin] < noFactors)
367 ScaleL = PScaleFactors[noIidSteps - h_ps_d->specificTo.mpeg.pCoef
368 ->aaIidIndexMapped[env][bin]];
369
370 AlphasValue = 0;
371 if (h_ps_d->specificTo.mpeg.pCoef->aaIccIndexMapped[env][bin] >= 0)
372 AlphasValue = Alphas[h_ps_d->specificTo.mpeg.pCoef->aaIccIndexMapped[env][bin]];
360 ScaleR = PScaleFactors[noIidSteps + h_ps_d->specificTo.mpeg.pCoef
361 ->aaIidIndexMapped[env][bin]];
362 ScaleL = PScaleFactors[noIidSteps - h_ps_d->specificTo.mpeg.pCoef
363 ->aaIidIndexMapped[env][bin]];
364
373365 Beta = fMult(
374 fMult(AlphasValue,
366 fMult(Alphas[h_ps_d->specificTo.mpeg.pCoef->aaIccIndexMapped[env][bin]],
375367 (ScaleR - ScaleL)),
376368 FIXP_SQRT05);
377369 Alpha =
378 AlphasValue >> 1;
370 Alphas[h_ps_d->specificTo.mpeg.pCoef->aaIccIndexMapped[env][bin]] >> 1;
379371
380372 /* Alpha and Beta are now both scaled by 2 shifts right */
381373
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
533533 for (ksg = ksg_start; ksg < PVC_NBLOW; ksg++) {
534534 for (band = sg_borders[ksg]; band < sg_borders[ksg + 1]; band++) {
535535 /* The division by 8 == (RATE*lbw) is required algorithmically */
536 E[ksg] += (fPow2Div2(qmfR[band]) + fPow2Div2(qmfI[band])) >> 2;
536 E[ksg] +=
537 ((fPow2Div2(qmfR[band]) >> 1) + (fPow2Div2(qmfI[band]) >> 1)) >> 3;
537538 }
538539 }
539540 }
541542 if (E[ksg] > (FIXP_DBL)0) {
542543 /* 10/log2(10) = 0.752574989159953 * 2^2 */
543544 int exp_log;
544 FIXP_DBL nrg = CalcLog2(E[ksg], 2 * qmfExponent, &exp_log);
545 FIXP_DBL nrg = CalcLog2(E[ksg], 2 * qmfExponent + 2, &exp_log);
545546 nrg = fMult(nrg, FL2FXCONST_SGL(LOG10FAC));
546547 nrg = scaleValue(nrg, exp_log - PVC_ESG_EXP + 2);
547548 pEsg[ksg] = fMax(nrg, FL2FXCONST_DBL(-10.0 / (1 << PVC_ESG_EXP)));
602603 E_high_exp[ksg] = 0;
603604
604605 /* residual part */
605 accu = ((LONG)(SCHAR)*pTab2++) << (DFRACT_BITS - 8 - PVC_ESG_EXP +
606 accu = ((LONG)(SCHAR)*pTab2++) << (DFRACT_BITS - 8 - PVC_ESG_EXP - 2 +
606607 pPvcDynamicData->pScalingCoef[3]);
607608
608609 /* linear combination of lower grouped energies part */
609610 for (kb = 0; kb < PVC_NBLOW; kb++) {
610611 predCoeff = (FIXP_SGL)(
611612 (SHORT)(SCHAR)pTab1[kb * pPvcDynamicData->nbHigh + ksg] << 8);
612 predCoeff_exp = pPvcDynamicData->pScalingCoef[kb] +
613 1; /* +1 to compensate for Div2 */
614 accu += fMultDiv2(E[kb], predCoeff) << predCoeff_exp;
613 predCoeff_exp = -(pPvcDynamicData->pScalingCoef[kb] + 1 -
614 2); /* +1 to compensate for Div2; -2 for accu */
615 accu += fMultDiv2(E[kb], predCoeff) >> predCoeff_exp;
615616 }
616617 /* convert back to linear domain */
617618 accu = fMult(accu, FL2FXCONST_SGL(LOG10FAC_INV));
618 accu = f2Pow(
619 accu, PVC_ESG_EXP - 1,
620 &predCoeff_exp); /* -1 compensates for exponent of LOG10FAC_INV */
619 accu = f2Pow(accu, PVC_ESG_EXP - 1 + 2,
620 &predCoeff_exp); /* -1 compensates for exponent of
621 LOG10FAC_INV; +2 for accu */
621622 predictedEsgSlot[ksg] = accu;
622623 E_high_exp[ksg] = predCoeff_exp;
623624 if (predCoeff_exp > E_high_exp_max) {
627628
628629 /* rescale output vector according to largest exponent */
629630 for (ksg = 0; ksg < pPvcDynamicData->nbHigh; ksg++) {
630 int scale = E_high_exp[ksg] - E_high_exp_max;
631 predictedEsgSlot[ksg] = scaleValue(predictedEsgSlot[ksg], scale);
631 int scale = fMin(E_high_exp_max - E_high_exp[ksg], DFRACT_BITS - 1);
632 predictedEsgSlot[ksg] = predictedEsgSlot[ksg] >> scale;
632633 }
633634 *predictedEsg_exp = E_high_exp_max;
634635 }
+0
-192
libSBRdec/src/sbr_crc.cpp less more
0 /* -----------------------------------------------------------------------------
1 Software License for The Fraunhofer FDK AAC Codec Library for Android
2
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
4 Forschung e.V. All rights reserved.
5
6 1. INTRODUCTION
7 The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
8 that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
9 scheme for digital audio. This FDK AAC Codec software is intended to be used on
10 a wide variety of Android devices.
11
12 AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
13 general perceptual audio codecs. AAC-ELD is considered the best-performing
14 full-bandwidth communications codec by independent studies and is widely
15 deployed. AAC has been standardized by ISO and IEC as part of the MPEG
16 specifications.
17
18 Patent licenses for necessary patent claims for the FDK AAC Codec (including
19 those of Fraunhofer) may be obtained through Via Licensing
20 (www.vialicensing.com) or through the respective patent owners individually for
21 the purpose of encoding or decoding bit streams in products that are compliant
22 with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
23 Android devices already license these patent claims through Via Licensing or
24 directly from the patent owners, and therefore FDK AAC Codec software may
25 already be covered under those patent licenses when it is used for those
26 licensed purposes only.
27
28 Commercially-licensed AAC software libraries, including floating-point versions
29 with enhanced sound quality, are also available from Fraunhofer. Users are
30 encouraged to check the Fraunhofer website for additional applications
31 information and documentation.
32
33 2. COPYRIGHT LICENSE
34
35 Redistribution and use in source and binary forms, with or without modification,
36 are permitted without payment of copyright license fees provided that you
37 satisfy the following conditions:
38
39 You must retain the complete text of this software license in redistributions of
40 the FDK AAC Codec or your modifications thereto in source code form.
41
42 You must retain the complete text of this software license in the documentation
43 and/or other materials provided with redistributions of the FDK AAC Codec or
44 your modifications thereto in binary form. You must make available free of
45 charge copies of the complete source code of the FDK AAC Codec and your
46 modifications thereto to recipients of copies in binary form.
47
48 The name of Fraunhofer may not be used to endorse or promote products derived
49 from this library without prior written permission.
50
51 You may not charge copyright license fees for anyone to use, copy or distribute
52 the FDK AAC Codec software or your modifications thereto.
53
54 Your modified versions of the FDK AAC Codec must carry prominent notices stating
55 that you changed the software and the date of any change. For modified versions
56 of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
57 must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
58 AAC Codec Library for Android."
59
60 3. NO PATENT LICENSE
61
62 NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
63 limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
64 Fraunhofer provides no warranty of patent non-infringement with respect to this
65 software.
66
67 You may use this FDK AAC Codec software or modifications thereto only for
68 purposes that are authorized by appropriate patent licenses.
69
70 4. DISCLAIMER
71
72 This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
73 holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
74 including but not limited to the implied warranties of merchantability and
75 fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
76 CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
77 or consequential damages, including but not limited to procurement of substitute
78 goods or services; loss of use, data, or profits, or business interruption,
79 however caused and on any theory of liability, whether in contract, strict
80 liability, or tort (including negligence), arising in any way out of the use of
81 this software, even if advised of the possibility of such damage.
82
83 5. CONTACT INFORMATION
84
85 Fraunhofer Institute for Integrated Circuits IIS
86 Attention: Audio and Multimedia Departments - FDK AAC LL
87 Am Wolfsmantel 33
88 91058 Erlangen, Germany
89
90 www.iis.fraunhofer.de/amm
91 amm-info@iis.fraunhofer.de
92 ----------------------------------------------------------------------------- */
93
94 /**************************** SBR decoder library ******************************
95
96 Author(s):
97
98 Description:
99
100 *******************************************************************************/
101
102 /*!
103 \file
104 \brief CRC check coutines
105 */
106
107 #include "sbr_crc.h"
108
109 #include "FDK_bitstream.h"
110 #include "transcendent.h"
111
112 #define MAXCRCSTEP 16
113 #define MAXCRCSTEP_LD 4
114
115 /*!
116 \brief crc calculation
117 */
118 static ULONG calcCRC(HANDLE_CRC hCrcBuf, ULONG bValue, int nBits) {
119 int i;
120 ULONG bMask = (1UL << (nBits - 1));
121
122 for (i = 0; i < nBits; i++, bMask >>= 1) {
123 USHORT flag = (hCrcBuf->crcState & hCrcBuf->crcMask) ? 1 : 0;
124 USHORT flag1 = (bMask & bValue) ? 1 : 0;
125
126 flag ^= flag1;
127 hCrcBuf->crcState <<= 1;
128 if (flag) hCrcBuf->crcState ^= hCrcBuf->crcPoly;
129 }
130
131 return (hCrcBuf->crcState);
132 }
133
134 /*!
135 \brief crc
136 */
137 static int getCrc(HANDLE_FDK_BITSTREAM hBs, ULONG NrBits) {
138 int i;
139 CRC_BUFFER CrcBuf;
140
141 CrcBuf.crcState = SBR_CRC_START;
142 CrcBuf.crcPoly = SBR_CRC_POLY;
143 CrcBuf.crcMask = SBR_CRC_MASK;
144
145 int CrcStep = NrBits >> MAXCRCSTEP_LD;
146
147 int CrcNrBitsRest = (NrBits - CrcStep * MAXCRCSTEP);
148 ULONG bValue;
149
150 for (i = 0; i < CrcStep; i++) {
151 bValue = FDKreadBits(hBs, MAXCRCSTEP);
152 calcCRC(&CrcBuf, bValue, MAXCRCSTEP);
153 }
154
155 bValue = FDKreadBits(hBs, CrcNrBitsRest);
156 calcCRC(&CrcBuf, bValue, CrcNrBitsRest);
157
158 return (CrcBuf.crcState & SBR_CRC_RANGE);
159 }
160
161 /*!
162 \brief crc interface
163 \return 1: CRC OK, 0: CRC check failure
164 */
165 int SbrCrcCheck(HANDLE_FDK_BITSTREAM hBs, /*!< handle to bit-buffer */
166 LONG NrBits) /*!< max. CRC length */
167 {
168 int crcResult = 1;
169 ULONG NrCrcBits;
170 ULONG crcCheckResult;
171 LONG NrBitsAvailable;
172 ULONG crcCheckSum;
173
174 crcCheckSum = FDKreadBits(hBs, 10);
175
176 NrBitsAvailable = FDKgetValidBits(hBs);
177 if (NrBitsAvailable <= 0) {
178 return 0;
179 }
180
181 NrCrcBits = fixMin((INT)NrBits, (INT)NrBitsAvailable);
182
183 crcCheckResult = getCrc(hBs, NrCrcBits);
184 FDKpushBack(hBs, (NrBitsAvailable - FDKgetValidBits(hBs)));
185
186 if (crcCheckResult != crcCheckSum) {
187 crcResult = 0;
188 }
189
190 return (crcResult);
191 }
+0
-138
libSBRdec/src/sbr_crc.h less more
0 /* -----------------------------------------------------------------------------
1 Software License for The Fraunhofer FDK AAC Codec Library for Android
2
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
4 Forschung e.V. All rights reserved.
5
6 1. INTRODUCTION
7 The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
8 that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
9 scheme for digital audio. This FDK AAC Codec software is intended to be used on
10 a wide variety of Android devices.
11
12 AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
13 general perceptual audio codecs. AAC-ELD is considered the best-performing
14 full-bandwidth communications codec by independent studies and is widely
15 deployed. AAC has been standardized by ISO and IEC as part of the MPEG
16 specifications.
17
18 Patent licenses for necessary patent claims for the FDK AAC Codec (including
19 those of Fraunhofer) may be obtained through Via Licensing
20 (www.vialicensing.com) or through the respective patent owners individually for
21 the purpose of encoding or decoding bit streams in products that are compliant
22 with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
23 Android devices already license these patent claims through Via Licensing or
24 directly from the patent owners, and therefore FDK AAC Codec software may
25 already be covered under those patent licenses when it is used for those
26 licensed purposes only.
27
28 Commercially-licensed AAC software libraries, including floating-point versions
29 with enhanced sound quality, are also available from Fraunhofer. Users are
30 encouraged to check the Fraunhofer website for additional applications
31 information and documentation.
32
33 2. COPYRIGHT LICENSE
34
35 Redistribution and use in source and binary forms, with or without modification,
36 are permitted without payment of copyright license fees provided that you
37 satisfy the following conditions:
38
39 You must retain the complete text of this software license in redistributions of
40 the FDK AAC Codec or your modifications thereto in source code form.
41
42 You must retain the complete text of this software license in the documentation
43 and/or other materials provided with redistributions of the FDK AAC Codec or
44 your modifications thereto in binary form. You must make available free of
45 charge copies of the complete source code of the FDK AAC Codec and your
46 modifications thereto to recipients of copies in binary form.
47
48 The name of Fraunhofer may not be used to endorse or promote products derived
49 from this library without prior written permission.
50
51 You may not charge copyright license fees for anyone to use, copy or distribute
52 the FDK AAC Codec software or your modifications thereto.
53
54 Your modified versions of the FDK AAC Codec must carry prominent notices stating
55 that you changed the software and the date of any change. For modified versions
56 of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
57 must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
58 AAC Codec Library for Android."
59
60 3. NO PATENT LICENSE
61
62 NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
63 limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
64 Fraunhofer provides no warranty of patent non-infringement with respect to this
65 software.
66
67 You may use this FDK AAC Codec software or modifications thereto only for
68 purposes that are authorized by appropriate patent licenses.
69
70 4. DISCLAIMER
71
72 This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
73 holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
74 including but not limited to the implied warranties of merchantability and
75 fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
76 CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
77 or consequential damages, including but not limited to procurement of substitute
78 goods or services; loss of use, data, or profits, or business interruption,
79 however caused and on any theory of liability, whether in contract, strict
80 liability, or tort (including negligence), arising in any way out of the use of
81 this software, even if advised of the possibility of such damage.
82
83 5. CONTACT INFORMATION
84
85 Fraunhofer Institute for Integrated Circuits IIS
86 Attention: Audio and Multimedia Departments - FDK AAC LL
87 Am Wolfsmantel 33
88 91058 Erlangen, Germany
89
90 www.iis.fraunhofer.de/amm
91 amm-info@iis.fraunhofer.de
92 ----------------------------------------------------------------------------- */
93
94 /**************************** SBR decoder library ******************************
95
96 Author(s):
97
98 Description:
99
100 *******************************************************************************/
101
102 /*!
103 \file
104 \brief CRC checking routines
105 */
106 #ifndef SBR_CRC_H
107 #define SBR_CRC_H
108
109 #include "sbrdecoder.h"
110
111 #include "FDK_bitstream.h"
112
113 /* some useful crc polynoms:
114
115 crc5: x^5+x^4+x^2+x^1+1
116 crc6: x^6+x^5+x^3+x^2+x+1
117 crc7: x^7+x^6+x^2+1
118 crc8: x^8+x^2+x+x+1
119 */
120
121 /* default SBR CRC */ /* G(x) = x^10 + x^9 + x^5 + x^4 + x + 1 */
122 #define SBR_CRC_POLY 0x0233
123 #define SBR_CRC_MASK 0x0200
124 #define SBR_CRC_START 0x0000
125 #define SBR_CRC_RANGE 0x03FF
126
127 typedef struct {
128 USHORT crcState;
129 USHORT crcMask;
130 USHORT crcPoly;
131 } CRC_BUFFER;
132
133 typedef CRC_BUFFER *HANDLE_CRC;
134
135 int SbrCrcCheck(HANDLE_FDK_BITSTREAM hBitBuf, LONG NrCrcBits);
136
137 #endif
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
258258
259259 void sbr_dec(
260260 HANDLE_SBR_DEC hSbrDec, /*!< handle to Decoder channel */
261 INT_PCM *timeIn, /*!< pointer to input time signal */
262 INT_PCM *timeOut, /*!< pointer to output time signal */
261 LONG *timeIn, /*!< pointer to input time signal */
262 LONG *timeOut, /*!< pointer to output time signal */
263263 HANDLE_SBR_DEC hSbrDecRight, /*!< handle to Decoder channel right */
264 INT_PCM *timeOutRight, /*!< pointer to output time signal */
264 LONG *timeOutRight, /*!< pointer to output time signal */
265265 const int strideOut, /*!< Time data traversal strideOut */
266266 HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */
267267 HANDLE_SBR_FRAME_DATA hFrameData, /*!< Control data of current frame */
268268 HANDLE_SBR_PREV_FRAME_DATA
269269 hPrevFrameData, /*!< Some control data of last frame */
270270 const int applyProcessing, /*!< Flag for SBR operation */
271 HANDLE_PS_DEC h_ps_d, const UINT flags, const int codecFrameSize) {
271 HANDLE_PS_DEC h_ps_d, const UINT flags, const int codecFrameSize,
272 const INT sbrInDataHeadroom) {
272273 int i, slot, reserve;
273274 int saveLbScale;
274275 int lastSlotOffs;
277278 /* temporary pointer / variable for QMF;
278279 required as we want to use temporary buffer
279280 creating one frame delay for HBE in LP mode */
280 INT_PCM *pTimeInQmf = timeIn;
281 LONG *pTimeInQmf = timeIn;
281282
282283 /* Number of QMF timeslots in the overlap buffer: */
283284 int ov_len = hSbrDec->LppTrans.pSettings->overlap;
340341 } else {
341342 C_AALLOC_SCRATCH_START(qmfTemp, FIXP_DBL, 2 * (64));
342343 qmfAnalysisFiltering(&hSbrDec->qmfDomainInCh->fb, pReal, pImag,
343 &hSbrDec->qmfDomainInCh->scaling, pTimeInQmf, 0, 1,
344 qmfTemp);
344 &hSbrDec->qmfDomainInCh->scaling, pTimeInQmf,
345 0 + sbrInDataHeadroom, 1, qmfTemp);
345346
346347 C_AALLOC_SCRATCH_END(qmfTemp, FIXP_DBL, 2 * (64));
347348 }
657658
658659 if (!(flags & SBRDEC_PS_DECODED)) {
659660 if (!(flags & SBRDEC_SKIP_QMF_SYN)) {
660 int outScalefactor = 0;
661 int outScalefactor = -(8);
661662
662663 if (h_ps_d != NULL) {
663664 h_ps_d->procFrameBased = 1; /* we here do frame based processing */
742743 */
743744 FDK_ASSERT(hSbrDec->qmfDomainInCh->pGlobalConf->nBandsSynthesis <=
744745 QMF_MAX_SYNTHESIS_BANDS);
746 qmfChangeOutScalefactor(synQmfRight, -(8));
745747 FDKmemcpy(synQmfRight->FilterStates, synQmf->FilterStates,
746748 9 * hSbrDec->qmfDomainInCh->pGlobalConf->nBandsSynthesis *
747749 sizeof(FIXP_QSS));
813815 : scaleFactorLowBand_no_ov,
814816 scaleFactorHighBand, synQmf->lsb, synQmf->usb);
815817
816 outScalefactorL = outScalefactorR = 1; /* psDiffScale! (MPEG-PS) */
818 outScalefactorL = outScalefactorR =
819 1 + sbrInDataHeadroom; /* psDiffScale! (MPEG-PS) */
817820 }
818821
819822 sbrDecoder_drcApplySlot(/* right channel */
830833 outScalefactorL += maxShift;
831834
832835 if (!(flags & SBRDEC_SKIP_QMF_SYN)) {
836 qmfChangeOutScalefactor(synQmf, -(8));
837 qmfChangeOutScalefactor(synQmfRight, -(8));
838
833839 qmfSynthesisFilteringSlot(
834840 synQmfRight, rQmfReal, /* QMF real buffer */
835841 rQmfImag, /* QMF imag buffer */
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
175175
176176 void sbr_dec(
177177 HANDLE_SBR_DEC hSbrDec, /*!< handle to Decoder channel */
178 INT_PCM *timeIn, /*!< pointer to input time signal */
179 INT_PCM *timeOut, /*!< pointer to output time signal */
178 LONG *timeIn, /*!< pointer to input time signal */
179 LONG *timeOut, /*!< pointer to output time signal */
180180 HANDLE_SBR_DEC hSbrDecRight, /*!< handle to Decoder channel right */
181 INT_PCM *timeOutRight, /*!< pointer to output time signal */
181 LONG *timeOutRight, /*!< pointer to output time signal */
182182 INT strideOut, /*!< Time data traversal strideOut */
183183 HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */
184184 HANDLE_SBR_FRAME_DATA hFrameData, /*!< Control data of current frame */
185185 HANDLE_SBR_PREV_FRAME_DATA
186186 hPrevFrameData, /*!< Some control data of last frame */
187187 const int applyProcessing, /*!< Flag for SBR operation */
188 HANDLE_PS_DEC h_ps_d, const UINT flags, const int codecFrameSize);
188 HANDLE_PS_DEC h_ps_d, const UINT flags, const int codecFrameSize,
189 const INT sbrInDataHeadroom);
189190
190191 SBR_ERROR
191192 createSbrDec(SBR_CHANNEL *hSbrChannel, HANDLE_SBR_HEADER_DATA hHeaderData,
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
108108
109109 #include "sbr_ram.h"
110110
111 #define WORKBUFFER1_TAG 2
112 #define WORKBUFFER2_TAG 3
113
114111 /*!
115112 \name StaticSbrData
116113
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
169169 flushed consecutively. */
170170
171171 UINT flags;
172
173 INT sbrInDataHeadroom; /* Headroom of the SBR input time signal to prevent
174 clipping */
172175 };
173176
174177 H_ALLOC_MEM(Ram_SbrDecElement, SBR_DECODER_ELEMENT)
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
240240 random numbers.
241241 */
242242 const FIXP_SGL FDK_sbrDecoder_sbr_randomPhase[SBR_NF_NO_RANDOM_VAL][2] = {
243 {FL2FXCONST_SGL(-0.99948153278296f / 8.0),
244 FL2FXCONST_SGL(-0.59483417516607f / 8.0)},
245 {FL2FXCONST_SGL(0.97113454393991f / 8.0),
246 FL2FXCONST_SGL(-0.67528515225647f / 8.0)},
247 {FL2FXCONST_SGL(0.14130051758487f / 8.0),
248 FL2FXCONST_SGL(-0.95090983575689f / 8.0)},
249 {FL2FXCONST_SGL(-0.47005496701697f / 8.0),
250 FL2FXCONST_SGL(-0.37340549728647f / 8.0)},
251 {FL2FXCONST_SGL(0.80705063769351f / 8.0),
252 FL2FXCONST_SGL(0.29653668284408f / 8.0)},
253 {FL2FXCONST_SGL(-0.38981478896926f / 8.0),
254 FL2FXCONST_SGL(0.89572605717087f / 8.0)},
255 {FL2FXCONST_SGL(-0.01053049862020f / 8.0),
256 FL2FXCONST_SGL(-0.66959058036166f / 8.0)},
257 {FL2FXCONST_SGL(-0.91266367957293f / 8.0),
258 FL2FXCONST_SGL(-0.11522938140034f / 8.0)},
259 {FL2FXCONST_SGL(0.54840422910309f / 8.0),
260 FL2FXCONST_SGL(0.75221367176302f / 8.0)},
261 {FL2FXCONST_SGL(0.40009252867955f / 8.0),
262 FL2FXCONST_SGL(-0.98929400334421f / 8.0)},
263 {FL2FXCONST_SGL(-0.99867974711855f / 8.0),
264 FL2FXCONST_SGL(-0.88147068645358f / 8.0)},
265 {FL2FXCONST_SGL(-0.95531076805040f / 8.0),
266 FL2FXCONST_SGL(0.90908757154593f / 8.0)},
267 {FL2FXCONST_SGL(-0.45725933317144f / 8.0),
268 FL2FXCONST_SGL(-0.56716323646760f / 8.0)},
269 {FL2FXCONST_SGL(-0.72929675029275f / 8.0),
270 FL2FXCONST_SGL(-0.98008272727324f / 8.0)},
271 {FL2FXCONST_SGL(0.75622801399036f / 8.0),
272 FL2FXCONST_SGL(0.20950329995549f / 8.0)},
273 {FL2FXCONST_SGL(0.07069442601050f / 8.0),
274 FL2FXCONST_SGL(-0.78247898470706f / 8.0)},
275 {FL2FXCONST_SGL(0.74496252926055f / 8.0),
276 FL2FXCONST_SGL(-0.91169004445807f / 8.0)},
277 {FL2FXCONST_SGL(-0.96440182703856f / 8.0),
278 FL2FXCONST_SGL(-0.94739918296622f / 8.0)},
279 {FL2FXCONST_SGL(0.30424629369539f / 8.0),
280 FL2FXCONST_SGL(-0.49438267012479f / 8.0)},
281 {FL2FXCONST_SGL(0.66565033746925f / 8.0),
282 FL2FXCONST_SGL(0.64652935542491f / 8.0)},
283 {FL2FXCONST_SGL(0.91697008020594f / 8.0),
284 FL2FXCONST_SGL(0.17514097332009f / 8.0)},
285 {FL2FXCONST_SGL(-0.70774918760427f / 8.0),
286 FL2FXCONST_SGL(0.52548653416543f / 8.0)},
287 {FL2FXCONST_SGL(-0.70051415345560f / 8.0),
288 FL2FXCONST_SGL(-0.45340028808763f / 8.0)},
289 {FL2FXCONST_SGL(-0.99496513054797f / 8.0),
290 FL2FXCONST_SGL(-0.90071908066973f / 8.0)},
291 {FL2FXCONST_SGL(0.98164490790123f / 8.0),
292 FL2FXCONST_SGL(-0.77463155528697f / 8.0)},
293 {FL2FXCONST_SGL(-0.54671580548181f / 8.0),
294 FL2FXCONST_SGL(-0.02570928536004f / 8.0)},
295 {FL2FXCONST_SGL(-0.01689629065389f / 8.0),
296 FL2FXCONST_SGL(0.00287506445732f / 8.0)},
297 {FL2FXCONST_SGL(-0.86110349531986f / 8.0),
298 FL2FXCONST_SGL(0.42548583726477f / 8.0)},
299 {FL2FXCONST_SGL(-0.98892980586032f / 8.0),
300 FL2FXCONST_SGL(-0.87881132267556f / 8.0)},
301 {FL2FXCONST_SGL(0.51756627678691f / 8.0),
302 FL2FXCONST_SGL(0.66926784710139f / 8.0)},
303 {FL2FXCONST_SGL(-0.99635026409640f / 8.0),
304 FL2FXCONST_SGL(-0.58107730574765f / 8.0)},
305 {FL2FXCONST_SGL(-0.99969370862163f / 8.0),
306 FL2FXCONST_SGL(0.98369989360250f / 8.0)},
307 {FL2FXCONST_SGL(0.55266258627194f / 8.0),
308 FL2FXCONST_SGL(0.59449057465591f / 8.0)},
309 {FL2FXCONST_SGL(0.34581177741673f / 8.0),
310 FL2FXCONST_SGL(0.94879421061866f / 8.0)},
311 {FL2FXCONST_SGL(0.62664209577999f / 8.0),
312 FL2FXCONST_SGL(-0.74402970906471f / 8.0)},
313 {FL2FXCONST_SGL(-0.77149701404973f / 8.0),
314 FL2FXCONST_SGL(-0.33883658042801f / 8.0)},
315 {FL2FXCONST_SGL(-0.91592244254432f / 8.0),
316 FL2FXCONST_SGL(0.03687901376713f / 8.0)},
317 {FL2FXCONST_SGL(-0.76285492357887f / 8.0),
318 FL2FXCONST_SGL(-0.91371867919124f / 8.0)},
319 {FL2FXCONST_SGL(0.79788337195331f / 8.0),
320 FL2FXCONST_SGL(-0.93180971199849f / 8.0)},
321 {FL2FXCONST_SGL(0.54473080610200f / 8.0),
322 FL2FXCONST_SGL(-0.11919206037186f / 8.0)},
323 {FL2FXCONST_SGL(-0.85639281671058f / 8.0),
324 FL2FXCONST_SGL(0.42429854760451f / 8.0)},
325 {FL2FXCONST_SGL(-0.92882402971423f / 8.0),
326 FL2FXCONST_SGL(0.27871809078609f / 8.0)},
327 {FL2FXCONST_SGL(-0.11708371046774f / 8.0),
328 FL2FXCONST_SGL(-0.99800843444966f / 8.0)},
329 {FL2FXCONST_SGL(0.21356749817493f / 8.0),
330 FL2FXCONST_SGL(-0.90716295627033f / 8.0)},
331 {FL2FXCONST_SGL(-0.76191692573909f / 8.0),
332 FL2FXCONST_SGL(0.99768118356265f / 8.0)},
333 {FL2FXCONST_SGL(0.98111043100884f / 8.0),
334 FL2FXCONST_SGL(-0.95854459734407f / 8.0)},
335 {FL2FXCONST_SGL(-0.85913269895572f / 8.0),
336 FL2FXCONST_SGL(0.95766566168880f / 8.0)},
337 {FL2FXCONST_SGL(-0.93307242253692f / 8.0),
338 FL2FXCONST_SGL(0.49431757696466f / 8.0)},
339 {FL2FXCONST_SGL(0.30485754879632f / 8.0),
340 FL2FXCONST_SGL(-0.70540034357529f / 8.0)},
341 {FL2FXCONST_SGL(0.85289650925190f / 8.0),
342 FL2FXCONST_SGL(0.46766131791044f / 8.0)},
343 {FL2FXCONST_SGL(0.91328082618125f / 8.0),
344 FL2FXCONST_SGL(-0.99839597361769f / 8.0)},
345 {FL2FXCONST_SGL(-0.05890199924154f / 8.0),
346 FL2FXCONST_SGL(0.70741827819497f / 8.0)},
347 {FL2FXCONST_SGL(0.28398686150148f / 8.0),
348 FL2FXCONST_SGL(0.34633555702188f / 8.0)},
349 {FL2FXCONST_SGL(0.95258164539612f / 8.0),
350 FL2FXCONST_SGL(-0.54893416026939f / 8.0)},
351 {FL2FXCONST_SGL(-0.78566324168507f / 8.0),
352 FL2FXCONST_SGL(-0.75568541079691f / 8.0)},
353 {FL2FXCONST_SGL(-0.95789495447877f / 8.0),
354 FL2FXCONST_SGL(-0.20423194696966f / 8.0)},
355 {FL2FXCONST_SGL(0.82411158711197f / 8.0),
356 FL2FXCONST_SGL(0.96654618432562f / 8.0)},
357 {FL2FXCONST_SGL(-0.65185446735885f / 8.0),
358 FL2FXCONST_SGL(-0.88734990773289f / 8.0)},
359 {FL2FXCONST_SGL(-0.93643603134666f / 8.0),
360 FL2FXCONST_SGL(0.99870790442385f / 8.0)},
361 {FL2FXCONST_SGL(0.91427159529618f / 8.0),
362 FL2FXCONST_SGL(-0.98290505544444f / 8.0)},
363 {FL2FXCONST_SGL(-0.70395684036886f / 8.0),
364 FL2FXCONST_SGL(0.58796798221039f / 8.0)},
365 {FL2FXCONST_SGL(0.00563771969365f / 8.0),
366 FL2FXCONST_SGL(0.61768196727244f / 8.0)},
367 {FL2FXCONST_SGL(0.89065051931895f / 8.0),
368 FL2FXCONST_SGL(0.52783352697585f / 8.0)},
369 {FL2FXCONST_SGL(-0.68683707712762f / 8.0),
370 FL2FXCONST_SGL(0.80806944710339f / 8.0)},
371 {FL2FXCONST_SGL(0.72165342518718f / 8.0),
372 FL2FXCONST_SGL(-0.69259857349564f / 8.0)},
373 {FL2FXCONST_SGL(-0.62928247730667f / 8.0),
374 FL2FXCONST_SGL(0.13627037407335f / 8.0)},
375 {FL2FXCONST_SGL(0.29938434065514f / 8.0),
376 FL2FXCONST_SGL(-0.46051329682246f / 8.0)},
377 {FL2FXCONST_SGL(-0.91781958879280f / 8.0),
378 FL2FXCONST_SGL(-0.74012716684186f / 8.0)},
379 {FL2FXCONST_SGL(0.99298717043688f / 8.0),
380 FL2FXCONST_SGL(0.40816610075661f / 8.0)},
381 {FL2FXCONST_SGL(0.82368298622748f / 8.0),
382 FL2FXCONST_SGL(-0.74036047190173f / 8.0)},
383 {FL2FXCONST_SGL(-0.98512833386833f / 8.0),
384 FL2FXCONST_SGL(-0.99972330709594f / 8.0)},
385 {FL2FXCONST_SGL(-0.95915368242257f / 8.0),
386 FL2FXCONST_SGL(-0.99237800466040f / 8.0)},
387 {FL2FXCONST_SGL(-0.21411126572790f / 8.0),
388 FL2FXCONST_SGL(-0.93424819052545f / 8.0)},
389 {FL2FXCONST_SGL(-0.68821476106884f / 8.0),
390 FL2FXCONST_SGL(-0.26892306315457f / 8.0)},
391 {FL2FXCONST_SGL(0.91851997982317f / 8.0),
392 FL2FXCONST_SGL(0.09358228901785f / 8.0)},
393 {FL2FXCONST_SGL(-0.96062769559127f / 8.0),
394 FL2FXCONST_SGL(0.36099095133739f / 8.0)},
395 {FL2FXCONST_SGL(0.51646184922287f / 8.0),
396 FL2FXCONST_SGL(-0.71373332873917f / 8.0)},
397 {FL2FXCONST_SGL(0.61130721139669f / 8.0),
398 FL2FXCONST_SGL(0.46950141175917f / 8.0)},
399 {FL2FXCONST_SGL(0.47336129371299f / 8.0),
400 FL2FXCONST_SGL(-0.27333178296162f / 8.0)},
401 {FL2FXCONST_SGL(0.90998308703519f / 8.0),
402 FL2FXCONST_SGL(0.96715662938132f / 8.0)},
403 {FL2FXCONST_SGL(0.44844799194357f / 8.0),
404 FL2FXCONST_SGL(0.99211574628306f / 8.0)},
405 {FL2FXCONST_SGL(0.66614891079092f / 8.0),
406 FL2FXCONST_SGL(0.96590176169121f / 8.0)},
407 {FL2FXCONST_SGL(0.74922239129237f / 8.0),
408 FL2FXCONST_SGL(-0.89879858826087f / 8.0)},
409 {FL2FXCONST_SGL(-0.99571588506485f / 8.0),
410 FL2FXCONST_SGL(0.52785521494349f / 8.0)},
411 {FL2FXCONST_SGL(0.97401082477563f / 8.0),
412 FL2FXCONST_SGL(-0.16855870075190f / 8.0)},
413 {FL2FXCONST_SGL(0.72683747733879f / 8.0),
414 FL2FXCONST_SGL(-0.48060774432251f / 8.0)},
415 {FL2FXCONST_SGL(0.95432193457128f / 8.0),
416 FL2FXCONST_SGL(0.68849603408441f / 8.0)},
417 {FL2FXCONST_SGL(-0.72962208425191f / 8.0),
418 FL2FXCONST_SGL(-0.76608443420917f / 8.0)},
419 {FL2FXCONST_SGL(-0.85359479233537f / 8.0),
420 FL2FXCONST_SGL(0.88738125901579f / 8.0)},
421 {FL2FXCONST_SGL(-0.81412430338535f / 8.0),
422 FL2FXCONST_SGL(-0.97480768049637f / 8.0)},
423 {FL2FXCONST_SGL(-0.87930772356786f / 8.0),
424 FL2FXCONST_SGL(0.74748307690436f / 8.0)},
425 {FL2FXCONST_SGL(-0.71573331064977f / 8.0),
426 FL2FXCONST_SGL(-0.98570608178923f / 8.0)},
427 {FL2FXCONST_SGL(0.83524300028228f / 8.0),
428 FL2FXCONST_SGL(0.83702537075163f / 8.0)},
429 {FL2FXCONST_SGL(-0.48086065601423f / 8.0),
430 FL2FXCONST_SGL(-0.98848504923531f / 8.0)},
431 {FL2FXCONST_SGL(0.97139128574778f / 8.0),
432 FL2FXCONST_SGL(0.80093621198236f / 8.0)},
433 {FL2FXCONST_SGL(0.51992825347895f / 8.0),
434 FL2FXCONST_SGL(0.80247631400510f / 8.0)},
435 {FL2FXCONST_SGL(-0.00848591195325f / 8.0),
436 FL2FXCONST_SGL(-0.76670128000486f / 8.0)},
437 {FL2FXCONST_SGL(-0.70294374303036f / 8.0),
438 FL2FXCONST_SGL(0.55359910445577f / 8.0)},
439 {FL2FXCONST_SGL(-0.95894428168140f / 8.0),
440 FL2FXCONST_SGL(-0.43265504344783f / 8.0)},
441 {FL2FXCONST_SGL(0.97079252950321f / 8.0),
442 FL2FXCONST_SGL(0.09325857238682f / 8.0)},
443 {FL2FXCONST_SGL(-0.92404293670797f / 8.0),
444 FL2FXCONST_SGL(0.85507704027855f / 8.0)},
445 {FL2FXCONST_SGL(-0.69506469500450f / 8.0),
446 FL2FXCONST_SGL(0.98633412625459f / 8.0)},
447 {FL2FXCONST_SGL(0.26559203620024f / 8.0),
448 FL2FXCONST_SGL(0.73314307966524f / 8.0)},
449 {FL2FXCONST_SGL(0.28038443336943f / 8.0),
450 FL2FXCONST_SGL(0.14537913654427f / 8.0)},
451 {FL2FXCONST_SGL(-0.74138124825523f / 8.0),
452 FL2FXCONST_SGL(0.99310339807762f / 8.0)},
453 {FL2FXCONST_SGL(-0.01752795995444f / 8.0),
454 FL2FXCONST_SGL(-0.82616635284178f / 8.0)},
455 {FL2FXCONST_SGL(-0.55126773094930f / 8.0),
456 FL2FXCONST_SGL(-0.98898543862153f / 8.0)},
457 {FL2FXCONST_SGL(0.97960898850996f / 8.0),
458 FL2FXCONST_SGL(-0.94021446752851f / 8.0)},
459 {FL2FXCONST_SGL(-0.99196309146936f / 8.0),
460 FL2FXCONST_SGL(0.67019017358456f / 8.0)},
461 {FL2FXCONST_SGL(-0.67684928085260f / 8.0),
462 FL2FXCONST_SGL(0.12631491649378f / 8.0)},
463 {FL2FXCONST_SGL(0.09140039465500f / 8.0),
464 FL2FXCONST_SGL(-0.20537731453108f / 8.0)},
465 {FL2FXCONST_SGL(-0.71658965751996f / 8.0),
466 FL2FXCONST_SGL(-0.97788200391224f / 8.0)},
467 {FL2FXCONST_SGL(0.81014640078925f / 8.0),
468 FL2FXCONST_SGL(0.53722648362443f / 8.0)},
469 {FL2FXCONST_SGL(0.40616991671205f / 8.0),
470 FL2FXCONST_SGL(-0.26469008598449f / 8.0)},
471 {FL2FXCONST_SGL(-0.67680188682972f / 8.0),
472 FL2FXCONST_SGL(0.94502052337695f / 8.0)},
473 {FL2FXCONST_SGL(0.86849774348749f / 8.0),
474 FL2FXCONST_SGL(-0.18333598647899f / 8.0)},
475 {FL2FXCONST_SGL(-0.99500381284851f / 8.0),
476 FL2FXCONST_SGL(-0.02634122068550f / 8.0)},
477 {FL2FXCONST_SGL(0.84329189340667f / 8.0),
478 FL2FXCONST_SGL(0.10406957462213f / 8.0)},
479 {FL2FXCONST_SGL(-0.09215968531446f / 8.0),
480 FL2FXCONST_SGL(0.69540012101253f / 8.0)},
481 {FL2FXCONST_SGL(0.99956173327206f / 8.0),
482 FL2FXCONST_SGL(-0.12358542001404f / 8.0)},
483 {FL2FXCONST_SGL(-0.79732779473535f / 8.0),
484 FL2FXCONST_SGL(-0.91582524736159f / 8.0)},
485 {FL2FXCONST_SGL(0.96349973642406f / 8.0),
486 FL2FXCONST_SGL(0.96640458041000f / 8.0)},
487 {FL2FXCONST_SGL(-0.79942778496547f / 8.0),
488 FL2FXCONST_SGL(0.64323902822857f / 8.0)},
489 {FL2FXCONST_SGL(-0.11566039853896f / 8.0),
490 FL2FXCONST_SGL(0.28587846253726f / 8.0)},
491 {FL2FXCONST_SGL(-0.39922954514662f / 8.0),
492 FL2FXCONST_SGL(0.94129601616966f / 8.0)},
493 {FL2FXCONST_SGL(0.99089197565987f / 8.0),
494 FL2FXCONST_SGL(-0.92062625581587f / 8.0)},
495 {FL2FXCONST_SGL(0.28631285179909f / 8.0),
496 FL2FXCONST_SGL(-0.91035047143603f / 8.0)},
497 {FL2FXCONST_SGL(-0.83302725605608f / 8.0),
498 FL2FXCONST_SGL(-0.67330410892084f / 8.0)},
499 {FL2FXCONST_SGL(0.95404443402072f / 8.0),
500 FL2FXCONST_SGL(0.49162765398743f / 8.0)},
501 {FL2FXCONST_SGL(-0.06449863579434f / 8.0),
502 FL2FXCONST_SGL(0.03250560813135f / 8.0)},
503 {FL2FXCONST_SGL(-0.99575054486311f / 8.0),
504 FL2FXCONST_SGL(0.42389784469507f / 8.0)},
505 {FL2FXCONST_SGL(-0.65501142790847f / 8.0),
506 FL2FXCONST_SGL(0.82546114655624f / 8.0)},
507 {FL2FXCONST_SGL(-0.81254441908887f / 8.0),
508 FL2FXCONST_SGL(-0.51627234660629f / 8.0)},
509 {FL2FXCONST_SGL(-0.99646369485481f / 8.0),
510 FL2FXCONST_SGL(0.84490533520752f / 8.0)},
511 {FL2FXCONST_SGL(0.00287840603348f / 8.0),
512 FL2FXCONST_SGL(0.64768261158166f / 8.0)},
513 {FL2FXCONST_SGL(0.70176989408455f / 8.0),
514 FL2FXCONST_SGL(-0.20453028573322f / 8.0)},
515 {FL2FXCONST_SGL(0.96361882270190f / 8.0),
516 FL2FXCONST_SGL(0.40706967140989f / 8.0)},
517 {FL2FXCONST_SGL(-0.68883758192426f / 8.0),
518 FL2FXCONST_SGL(0.91338958840772f / 8.0)},
519 {FL2FXCONST_SGL(-0.34875585502238f / 8.0),
520 FL2FXCONST_SGL(0.71472290693300f / 8.0)},
521 {FL2FXCONST_SGL(0.91980081243087f / 8.0),
522 FL2FXCONST_SGL(0.66507455644919f / 8.0)},
523 {FL2FXCONST_SGL(-0.99009048343881f / 8.0),
524 FL2FXCONST_SGL(0.85868021604848f / 8.0)},
525 {FL2FXCONST_SGL(0.68865791458395f / 8.0),
526 FL2FXCONST_SGL(0.55660316809678f / 8.0)},
527 {FL2FXCONST_SGL(-0.99484402129368f / 8.0),
528 FL2FXCONST_SGL(-0.20052559254934f / 8.0)},
529 {FL2FXCONST_SGL(0.94214511408023f / 8.0),
530 FL2FXCONST_SGL(-0.99696425367461f / 8.0)},
531 {FL2FXCONST_SGL(-0.67414626793544f / 8.0),
532 FL2FXCONST_SGL(0.49548221180078f / 8.0)},
533 {FL2FXCONST_SGL(-0.47339353684664f / 8.0),
534 FL2FXCONST_SGL(-0.85904328834047f / 8.0)},
535 {FL2FXCONST_SGL(0.14323651387360f / 8.0),
536 FL2FXCONST_SGL(-0.94145598222488f / 8.0)},
537 {FL2FXCONST_SGL(-0.29268293575672f / 8.0),
538 FL2FXCONST_SGL(0.05759224927952f / 8.0)},
539 {FL2FXCONST_SGL(0.43793861458754f / 8.0),
540 FL2FXCONST_SGL(-0.78904969892724f / 8.0)},
541 {FL2FXCONST_SGL(-0.36345126374441f / 8.0),
542 FL2FXCONST_SGL(0.64874435357162f / 8.0)},
543 {FL2FXCONST_SGL(-0.08750604656825f / 8.0),
544 FL2FXCONST_SGL(0.97686944362527f / 8.0)},
545 {FL2FXCONST_SGL(-0.96495267812511f / 8.0),
546 FL2FXCONST_SGL(-0.53960305946511f / 8.0)},
547 {FL2FXCONST_SGL(0.55526940659947f / 8.0),
548 FL2FXCONST_SGL(0.78891523734774f / 8.0)},
549 {FL2FXCONST_SGL(0.73538215752630f / 8.0),
550 FL2FXCONST_SGL(0.96452072373404f / 8.0)},
551 {FL2FXCONST_SGL(-0.30889773919437f / 8.0),
552 FL2FXCONST_SGL(-0.80664389776860f / 8.0)},
553 {FL2FXCONST_SGL(0.03574995626194f / 8.0),
554 FL2FXCONST_SGL(-0.97325616900959f / 8.0)},
555 {FL2FXCONST_SGL(0.98720684660488f / 8.0),
556 FL2FXCONST_SGL(0.48409133691962f / 8.0)},
557 {FL2FXCONST_SGL(-0.81689296271203f / 8.0),
558 FL2FXCONST_SGL(-0.90827703628298f / 8.0)},
559 {FL2FXCONST_SGL(0.67866860118215f / 8.0),
560 FL2FXCONST_SGL(0.81284503870856f / 8.0)},
561 {FL2FXCONST_SGL(-0.15808569732583f / 8.0),
562 FL2FXCONST_SGL(0.85279555024382f / 8.0)},
563 {FL2FXCONST_SGL(0.80723395114371f / 8.0),
564 FL2FXCONST_SGL(-0.24717418514605f / 8.0)},
565 {FL2FXCONST_SGL(0.47788757329038f / 8.0),
566 FL2FXCONST_SGL(-0.46333147839295f / 8.0)},
567 {FL2FXCONST_SGL(0.96367554763201f / 8.0),
568 FL2FXCONST_SGL(0.38486749303242f / 8.0)},
569 {FL2FXCONST_SGL(-0.99143875716818f / 8.0),
570 FL2FXCONST_SGL(-0.24945277239809f / 8.0)},
571 {FL2FXCONST_SGL(0.83081876925833f / 8.0),
572 FL2FXCONST_SGL(-0.94780851414763f / 8.0)},
573 {FL2FXCONST_SGL(-0.58753191905341f / 8.0),
574 FL2FXCONST_SGL(0.01290772389163f / 8.0)},
575 {FL2FXCONST_SGL(0.95538108220960f / 8.0),
576 FL2FXCONST_SGL(-0.85557052096538f / 8.0)},
577 {FL2FXCONST_SGL(-0.96490920476211f / 8.0),
578 FL2FXCONST_SGL(-0.64020970923102f / 8.0)},
579 {FL2FXCONST_SGL(-0.97327101028521f / 8.0),
580 FL2FXCONST_SGL(0.12378128133110f / 8.0)},
581 {FL2FXCONST_SGL(0.91400366022124f / 8.0),
582 FL2FXCONST_SGL(0.57972471346930f / 8.0)},
583 {FL2FXCONST_SGL(-0.99925837363824f / 8.0),
584 FL2FXCONST_SGL(0.71084847864067f / 8.0)},
585 {FL2FXCONST_SGL(-0.86875903507313f / 8.0),
586 FL2FXCONST_SGL(-0.20291699203564f / 8.0)},
587 {FL2FXCONST_SGL(-0.26240034795124f / 8.0),
588 FL2FXCONST_SGL(-0.68264554369108f / 8.0)},
589 {FL2FXCONST_SGL(-0.24664412953388f / 8.0),
590 FL2FXCONST_SGL(-0.87642273115183f / 8.0)},
591 {FL2FXCONST_SGL(0.02416275806869f / 8.0),
592 FL2FXCONST_SGL(0.27192914288905f / 8.0)},
593 {FL2FXCONST_SGL(0.82068619590515f / 8.0),
594 FL2FXCONST_SGL(-0.85087787994476f / 8.0)},
595 {FL2FXCONST_SGL(0.88547373760759f / 8.0),
596 FL2FXCONST_SGL(-0.89636802901469f / 8.0)},
597 {FL2FXCONST_SGL(-0.18173078152226f / 8.0),
598 FL2FXCONST_SGL(-0.26152145156800f / 8.0)},
599 {FL2FXCONST_SGL(0.09355476558534f / 8.0),
600 FL2FXCONST_SGL(0.54845123045604f / 8.0)},
601 {FL2FXCONST_SGL(-0.54668414224090f / 8.0),
602 FL2FXCONST_SGL(0.95980774020221f / 8.0)},
603 {FL2FXCONST_SGL(0.37050990604091f / 8.0),
604 FL2FXCONST_SGL(-0.59910140383171f / 8.0)},
605 {FL2FXCONST_SGL(-0.70373594262891f / 8.0),
606 FL2FXCONST_SGL(0.91227665827081f / 8.0)},
607 {FL2FXCONST_SGL(-0.34600785879594f / 8.0),
608 FL2FXCONST_SGL(-0.99441426144200f / 8.0)},
609 {FL2FXCONST_SGL(-0.68774481731008f / 8.0),
610 FL2FXCONST_SGL(-0.30238837956299f / 8.0)},
611 {FL2FXCONST_SGL(-0.26843291251234f / 8.0),
612 FL2FXCONST_SGL(0.83115668004362f / 8.0)},
613 {FL2FXCONST_SGL(0.49072334613242f / 8.0),
614 FL2FXCONST_SGL(-0.45359708737775f / 8.0)},
615 {FL2FXCONST_SGL(0.38975993093975f / 8.0),
616 FL2FXCONST_SGL(0.95515358099121f / 8.0)},
617 {FL2FXCONST_SGL(-0.97757125224150f / 8.0),
618 FL2FXCONST_SGL(0.05305894580606f / 8.0)},
619 {FL2FXCONST_SGL(-0.17325552859616f / 8.0),
620 FL2FXCONST_SGL(-0.92770672250494f / 8.0)},
621 {FL2FXCONST_SGL(0.99948035025744f / 8.0),
622 FL2FXCONST_SGL(0.58285545563426f / 8.0)},
623 {FL2FXCONST_SGL(-0.64946246527458f / 8.0),
624 FL2FXCONST_SGL(0.68645507104960f / 8.0)},
625 {FL2FXCONST_SGL(-0.12016920576437f / 8.0),
626 FL2FXCONST_SGL(-0.57147322153312f / 8.0)},
627 {FL2FXCONST_SGL(-0.58947456517751f / 8.0),
628 FL2FXCONST_SGL(-0.34847132454388f / 8.0)},
629 {FL2FXCONST_SGL(-0.41815140454465f / 8.0),
630 FL2FXCONST_SGL(0.16276422358861f / 8.0)},
631 {FL2FXCONST_SGL(0.99885650204884f / 8.0),
632 FL2FXCONST_SGL(0.11136095490444f / 8.0)},
633 {FL2FXCONST_SGL(-0.56649614128386f / 8.0),
634 FL2FXCONST_SGL(-0.90494866361587f / 8.0)},
635 {FL2FXCONST_SGL(0.94138021032330f / 8.0),
636 FL2FXCONST_SGL(0.35281916733018f / 8.0)},
637 {FL2FXCONST_SGL(-0.75725076534641f / 8.0),
638 FL2FXCONST_SGL(0.53650549640587f / 8.0)},
639 {FL2FXCONST_SGL(0.20541973692630f / 8.0),
640 FL2FXCONST_SGL(-0.94435144369918f / 8.0)},
641 {FL2FXCONST_SGL(0.99980371023351f / 8.0),
642 FL2FXCONST_SGL(0.79835913565599f / 8.0)},
643 {FL2FXCONST_SGL(0.29078277605775f / 8.0),
644 FL2FXCONST_SGL(0.35393777921520f / 8.0)},
645 {FL2FXCONST_SGL(-0.62858772103030f / 8.0),
646 FL2FXCONST_SGL(0.38765693387102f / 8.0)},
647 {FL2FXCONST_SGL(0.43440904467688f / 8.0),
648 FL2FXCONST_SGL(-0.98546330463232f / 8.0)},
649 {FL2FXCONST_SGL(-0.98298583762390f / 8.0),
650 FL2FXCONST_SGL(0.21021524625209f / 8.0)},
651 {FL2FXCONST_SGL(0.19513029146934f / 8.0),
652 FL2FXCONST_SGL(-0.94239832251867f / 8.0)},
653 {FL2FXCONST_SGL(-0.95476662400101f / 8.0),
654 FL2FXCONST_SGL(0.98364554179143f / 8.0)},
655 {FL2FXCONST_SGL(0.93379635304810f / 8.0),
656 FL2FXCONST_SGL(-0.70881994583682f / 8.0)},
657 {FL2FXCONST_SGL(-0.85235410573336f / 8.0),
658 FL2FXCONST_SGL(-0.08342347966410f / 8.0)},
659 {FL2FXCONST_SGL(-0.86425093011245f / 8.0),
660 FL2FXCONST_SGL(-0.45795025029466f / 8.0)},
661 {FL2FXCONST_SGL(0.38879779059045f / 8.0),
662 FL2FXCONST_SGL(0.97274429344593f / 8.0)},
663 {FL2FXCONST_SGL(0.92045124735495f / 8.0),
664 FL2FXCONST_SGL(-0.62433652524220f / 8.0)},
665 {FL2FXCONST_SGL(0.89162532251878f / 8.0),
666 FL2FXCONST_SGL(0.54950955570563f / 8.0)},
667 {FL2FXCONST_SGL(-0.36834336949252f / 8.0),
668 FL2FXCONST_SGL(0.96458298020975f / 8.0)},
669 {FL2FXCONST_SGL(0.93891760988045f / 8.0),
670 FL2FXCONST_SGL(-0.89968353740388f / 8.0)},
671 {FL2FXCONST_SGL(0.99267657565094f / 8.0),
672 FL2FXCONST_SGL(-0.03757034316958f / 8.0)},
673 {FL2FXCONST_SGL(-0.94063471614176f / 8.0),
674 FL2FXCONST_SGL(0.41332338538963f / 8.0)},
675 {FL2FXCONST_SGL(0.99740224117019f / 8.0),
676 FL2FXCONST_SGL(-0.16830494996370f / 8.0)},
677 {FL2FXCONST_SGL(-0.35899413170555f / 8.0),
678 FL2FXCONST_SGL(-0.46633226649613f / 8.0)},
679 {FL2FXCONST_SGL(0.05237237274947f / 8.0),
680 FL2FXCONST_SGL(-0.25640361602661f / 8.0)},
681 {FL2FXCONST_SGL(0.36703583957424f / 8.0),
682 FL2FXCONST_SGL(-0.38653265641875f / 8.0)},
683 {FL2FXCONST_SGL(0.91653180367913f / 8.0),
684 FL2FXCONST_SGL(-0.30587628726597f / 8.0)},
685 {FL2FXCONST_SGL(0.69000803499316f / 8.0),
686 FL2FXCONST_SGL(0.90952171386132f / 8.0)},
687 {FL2FXCONST_SGL(-0.38658751133527f / 8.0),
688 FL2FXCONST_SGL(0.99501571208985f / 8.0)},
689 {FL2FXCONST_SGL(-0.29250814029851f / 8.0),
690 FL2FXCONST_SGL(0.37444994344615f / 8.0)},
691 {FL2FXCONST_SGL(-0.60182204677608f / 8.0),
692 FL2FXCONST_SGL(0.86779651036123f / 8.0)},
693 {FL2FXCONST_SGL(-0.97418588163217f / 8.0),
694 FL2FXCONST_SGL(0.96468523666475f / 8.0)},
695 {FL2FXCONST_SGL(0.88461574003963f / 8.0),
696 FL2FXCONST_SGL(0.57508405276414f / 8.0)},
697 {FL2FXCONST_SGL(0.05198933055162f / 8.0),
698 FL2FXCONST_SGL(0.21269661669964f / 8.0)},
699 {FL2FXCONST_SGL(-0.53499621979720f / 8.0),
700 FL2FXCONST_SGL(0.97241553731237f / 8.0)},
701 {FL2FXCONST_SGL(-0.49429560226497f / 8.0),
702 FL2FXCONST_SGL(0.98183865291903f / 8.0)},
703 {FL2FXCONST_SGL(-0.98935142339139f / 8.0),
704 FL2FXCONST_SGL(-0.40249159006933f / 8.0)},
705 {FL2FXCONST_SGL(-0.98081380091130f / 8.0),
706 FL2FXCONST_SGL(-0.72856895534041f / 8.0)},
707 {FL2FXCONST_SGL(-0.27338148835532f / 8.0),
708 FL2FXCONST_SGL(0.99950922447209f / 8.0)},
709 {FL2FXCONST_SGL(0.06310802338302f / 8.0),
710 FL2FXCONST_SGL(-0.54539587529618f / 8.0)},
711 {FL2FXCONST_SGL(-0.20461677199539f / 8.0),
712 FL2FXCONST_SGL(-0.14209977628489f / 8.0)},
713 {FL2FXCONST_SGL(0.66223843141647f / 8.0),
714 FL2FXCONST_SGL(0.72528579940326f / 8.0)},
715 {FL2FXCONST_SGL(-0.84764345483665f / 8.0),
716 FL2FXCONST_SGL(0.02372316801261f / 8.0)},
717 {FL2FXCONST_SGL(-0.89039863483811f / 8.0),
718 FL2FXCONST_SGL(0.88866581484602f / 8.0)},
719 {FL2FXCONST_SGL(0.95903308477986f / 8.0),
720 FL2FXCONST_SGL(0.76744927173873f / 8.0)},
721 {FL2FXCONST_SGL(0.73504123909879f / 8.0),
722 FL2FXCONST_SGL(-0.03747203173192f / 8.0)},
723 {FL2FXCONST_SGL(-0.31744434966056f / 8.0),
724 FL2FXCONST_SGL(-0.36834111883652f / 8.0)},
725 {FL2FXCONST_SGL(-0.34110827591623f / 8.0),
726 FL2FXCONST_SGL(0.40211222807691f / 8.0)},
727 {FL2FXCONST_SGL(0.47803883714199f / 8.0),
728 FL2FXCONST_SGL(-0.39423219786288f / 8.0)},
729 {FL2FXCONST_SGL(0.98299195879514f / 8.0),
730 FL2FXCONST_SGL(0.01989791390047f / 8.0)},
731 {FL2FXCONST_SGL(-0.30963073129751f / 8.0),
732 FL2FXCONST_SGL(-0.18076720599336f / 8.0)},
733 {FL2FXCONST_SGL(0.99992588229018f / 8.0),
734 FL2FXCONST_SGL(-0.26281872094289f / 8.0)},
735 {FL2FXCONST_SGL(-0.93149731080767f / 8.0),
736 FL2FXCONST_SGL(-0.98313162570490f / 8.0)},
737 {FL2FXCONST_SGL(0.99923472302773f / 8.0),
738 FL2FXCONST_SGL(-0.80142993767554f / 8.0)},
739 {FL2FXCONST_SGL(-0.26024169633417f / 8.0),
740 FL2FXCONST_SGL(-0.75999759855752f / 8.0)},
741 {FL2FXCONST_SGL(-0.35712514743563f / 8.0),
742 FL2FXCONST_SGL(0.19298963768574f / 8.0)},
743 {FL2FXCONST_SGL(-0.99899084509530f / 8.0),
744 FL2FXCONST_SGL(0.74645156992493f / 8.0)},
745 {FL2FXCONST_SGL(0.86557171579452f / 8.0),
746 FL2FXCONST_SGL(0.55593866696299f / 8.0)},
747 {FL2FXCONST_SGL(0.33408042438752f / 8.0),
748 FL2FXCONST_SGL(0.86185953874709f / 8.0)},
749 {FL2FXCONST_SGL(0.99010736374716f / 8.0),
750 FL2FXCONST_SGL(0.04602397576623f / 8.0)},
751 {FL2FXCONST_SGL(-0.66694269691195f / 8.0),
752 FL2FXCONST_SGL(-0.91643611810148f / 8.0)},
753 {FL2FXCONST_SGL(0.64016792079480f / 8.0),
754 FL2FXCONST_SGL(0.15649530836856f / 8.0)},
755 {FL2FXCONST_SGL(0.99570534804836f / 8.0),
756 FL2FXCONST_SGL(0.45844586038111f / 8.0)},
757 {FL2FXCONST_SGL(-0.63431466947340f / 8.0),
758 FL2FXCONST_SGL(0.21079116459234f / 8.0)},
759 {FL2FXCONST_SGL(-0.07706847005931f / 8.0),
760 FL2FXCONST_SGL(-0.89581437101329f / 8.0)},
761 {FL2FXCONST_SGL(0.98590090577724f / 8.0),
762 FL2FXCONST_SGL(0.88241721133981f / 8.0)},
763 {FL2FXCONST_SGL(0.80099335254678f / 8.0),
764 FL2FXCONST_SGL(-0.36851896710853f / 8.0)},
765 {FL2FXCONST_SGL(0.78368131392666f / 8.0),
766 FL2FXCONST_SGL(0.45506999802597f / 8.0)},
767 {FL2FXCONST_SGL(0.08707806671691f / 8.0),
768 FL2FXCONST_SGL(0.80938994918745f / 8.0)},
769 {FL2FXCONST_SGL(-0.86811883080712f / 8.0),
770 FL2FXCONST_SGL(0.39347308654705f / 8.0)},
771 {FL2FXCONST_SGL(-0.39466529740375f / 8.0),
772 FL2FXCONST_SGL(-0.66809432114456f / 8.0)},
773 {FL2FXCONST_SGL(0.97875325649683f / 8.0),
774 FL2FXCONST_SGL(-0.72467840967746f / 8.0)},
775 {FL2FXCONST_SGL(-0.95038560288864f / 8.0),
776 FL2FXCONST_SGL(0.89563219587625f / 8.0)},
777 {FL2FXCONST_SGL(0.17005239424212f / 8.0),
778 FL2FXCONST_SGL(0.54683053962658f / 8.0)},
779 {FL2FXCONST_SGL(-0.76910792026848f / 8.0),
780 FL2FXCONST_SGL(-0.96226617549298f / 8.0)},
781 {FL2FXCONST_SGL(0.99743281016846f / 8.0),
782 FL2FXCONST_SGL(0.42697157037567f / 8.0)},
783 {FL2FXCONST_SGL(0.95437383549973f / 8.0),
784 FL2FXCONST_SGL(0.97002324109952f / 8.0)},
785 {FL2FXCONST_SGL(0.99578905365569f / 8.0),
786 FL2FXCONST_SGL(-0.54106826257356f / 8.0)},
787 {FL2FXCONST_SGL(0.28058259829990f / 8.0),
788 FL2FXCONST_SGL(-0.85361420634036f / 8.0)},
789 {FL2FXCONST_SGL(0.85256524470573f / 8.0),
790 FL2FXCONST_SGL(-0.64567607735589f / 8.0)},
791 {FL2FXCONST_SGL(-0.50608540105128f / 8.0),
792 FL2FXCONST_SGL(-0.65846015480300f / 8.0)},
793 {FL2FXCONST_SGL(-0.97210735183243f / 8.0),
794 FL2FXCONST_SGL(-0.23095213067791f / 8.0)},
795 {FL2FXCONST_SGL(0.95424048234441f / 8.0),
796 FL2FXCONST_SGL(-0.99240147091219f / 8.0)},
797 {FL2FXCONST_SGL(-0.96926570524023f / 8.0),
798 FL2FXCONST_SGL(0.73775654896574f / 8.0)},
799 {FL2FXCONST_SGL(0.30872163214726f / 8.0),
800 FL2FXCONST_SGL(0.41514960556126f / 8.0)},
801 {FL2FXCONST_SGL(-0.24523839572639f / 8.0),
802 FL2FXCONST_SGL(0.63206633394807f / 8.0)},
803 {FL2FXCONST_SGL(-0.33813265086024f / 8.0),
804 FL2FXCONST_SGL(-0.38661779441897f / 8.0)},
805 {FL2FXCONST_SGL(-0.05826828420146f / 8.0),
806 FL2FXCONST_SGL(-0.06940774188029f / 8.0)},
807 {FL2FXCONST_SGL(-0.22898461455054f / 8.0),
808 FL2FXCONST_SGL(0.97054853316316f / 8.0)},
809 {FL2FXCONST_SGL(-0.18509915019881f / 8.0),
810 FL2FXCONST_SGL(0.47565762892084f / 8.0)},
811 {FL2FXCONST_SGL(-0.10488238045009f / 8.0),
812 FL2FXCONST_SGL(-0.87769947402394f / 8.0)},
813 {FL2FXCONST_SGL(-0.71886586182037f / 8.0),
814 FL2FXCONST_SGL(0.78030982480538f / 8.0)},
815 {FL2FXCONST_SGL(0.99793873738654f / 8.0),
816 FL2FXCONST_SGL(0.90041310491497f / 8.0)},
817 {FL2FXCONST_SGL(0.57563307626120f / 8.0),
818 FL2FXCONST_SGL(-0.91034337352097f / 8.0)},
819 {FL2FXCONST_SGL(0.28909646383717f / 8.0),
820 FL2FXCONST_SGL(0.96307783970534f / 8.0)},
821 {FL2FXCONST_SGL(0.42188998312520f / 8.0),
822 FL2FXCONST_SGL(0.48148651230437f / 8.0)},
823 {FL2FXCONST_SGL(0.93335049681047f / 8.0),
824 FL2FXCONST_SGL(-0.43537023883588f / 8.0)},
825 {FL2FXCONST_SGL(-0.97087374418267f / 8.0),
826 FL2FXCONST_SGL(0.86636445711364f / 8.0)},
827 {FL2FXCONST_SGL(0.36722871286923f / 8.0),
828 FL2FXCONST_SGL(0.65291654172961f / 8.0)},
829 {FL2FXCONST_SGL(-0.81093025665696f / 8.0),
830 FL2FXCONST_SGL(0.08778370229363f / 8.0)},
831 {FL2FXCONST_SGL(-0.26240603062237f / 8.0),
832 FL2FXCONST_SGL(-0.92774095379098f / 8.0)},
833 {FL2FXCONST_SGL(0.83996497984604f / 8.0),
834 FL2FXCONST_SGL(0.55839849139647f / 8.0)},
835 {FL2FXCONST_SGL(-0.99909615720225f / 8.0),
836 FL2FXCONST_SGL(-0.96024605713970f / 8.0)},
837 {FL2FXCONST_SGL(0.74649464155061f / 8.0),
838 FL2FXCONST_SGL(0.12144893606462f / 8.0)},
839 {FL2FXCONST_SGL(-0.74774595569805f / 8.0),
840 FL2FXCONST_SGL(-0.26898062008959f / 8.0)},
841 {FL2FXCONST_SGL(0.95781667469567f / 8.0),
842 FL2FXCONST_SGL(-0.79047927052628f / 8.0)},
843 {FL2FXCONST_SGL(0.95472308713099f / 8.0),
844 FL2FXCONST_SGL(-0.08588776019550f / 8.0)},
845 {FL2FXCONST_SGL(0.48708332746299f / 8.0),
846 FL2FXCONST_SGL(0.99999041579432f / 8.0)},
847 {FL2FXCONST_SGL(0.46332038247497f / 8.0),
848 FL2FXCONST_SGL(0.10964126185063f / 8.0)},
849 {FL2FXCONST_SGL(-0.76497004940162f / 8.0),
850 FL2FXCONST_SGL(0.89210929242238f / 8.0)},
851 {FL2FXCONST_SGL(0.57397389364339f / 8.0),
852 FL2FXCONST_SGL(0.35289703373760f / 8.0)},
853 {FL2FXCONST_SGL(0.75374316974495f / 8.0),
854 FL2FXCONST_SGL(0.96705214651335f / 8.0)},
855 {FL2FXCONST_SGL(-0.59174397685714f / 8.0),
856 FL2FXCONST_SGL(-0.89405370422752f / 8.0)},
857 {FL2FXCONST_SGL(0.75087906691890f / 8.0),
858 FL2FXCONST_SGL(-0.29612672982396f / 8.0)},
859 {FL2FXCONST_SGL(-0.98607857336230f / 8.0),
860 FL2FXCONST_SGL(0.25034911730023f / 8.0)},
861 {FL2FXCONST_SGL(-0.40761056640505f / 8.0),
862 FL2FXCONST_SGL(-0.90045573444695f / 8.0)},
863 {FL2FXCONST_SGL(0.66929266740477f / 8.0),
864 FL2FXCONST_SGL(0.98629493401748f / 8.0)},
865 {FL2FXCONST_SGL(-0.97463695257310f / 8.0),
866 FL2FXCONST_SGL(-0.00190223301301f / 8.0)},
867 {FL2FXCONST_SGL(0.90145509409859f / 8.0),
868 FL2FXCONST_SGL(0.99781390365446f / 8.0)},
869 {FL2FXCONST_SGL(-0.87259289048043f / 8.0),
870 FL2FXCONST_SGL(0.99233587353666f / 8.0)},
871 {FL2FXCONST_SGL(-0.91529461447692f / 8.0),
872 FL2FXCONST_SGL(-0.15698707534206f / 8.0)},
873 {FL2FXCONST_SGL(-0.03305738840705f / 8.0),
874 FL2FXCONST_SGL(-0.37205262859764f / 8.0)},
875 {FL2FXCONST_SGL(0.07223051368337f / 8.0),
876 FL2FXCONST_SGL(-0.88805001733626f / 8.0)},
877 {FL2FXCONST_SGL(0.99498012188353f / 8.0),
878 FL2FXCONST_SGL(0.97094358113387f / 8.0)},
879 {FL2FXCONST_SGL(-0.74904939500519f / 8.0),
880 FL2FXCONST_SGL(0.99985483641521f / 8.0)},
881 {FL2FXCONST_SGL(0.04585228574211f / 8.0),
882 FL2FXCONST_SGL(0.99812337444082f / 8.0)},
883 {FL2FXCONST_SGL(-0.89054954257993f / 8.0),
884 FL2FXCONST_SGL(-0.31791913188064f / 8.0)},
885 {FL2FXCONST_SGL(-0.83782144651251f / 8.0),
886 FL2FXCONST_SGL(0.97637632547466f / 8.0)},
887 {FL2FXCONST_SGL(0.33454804933804f / 8.0),
888 FL2FXCONST_SGL(-0.86231516800408f / 8.0)},
889 {FL2FXCONST_SGL(-0.99707579362824f / 8.0),
890 FL2FXCONST_SGL(0.93237990079441f / 8.0)},
891 {FL2FXCONST_SGL(-0.22827527843994f / 8.0),
892 FL2FXCONST_SGL(0.18874759397997f / 8.0)},
893 {FL2FXCONST_SGL(0.67248046289143f / 8.0),
894 FL2FXCONST_SGL(-0.03646211390569f / 8.0)},
895 {FL2FXCONST_SGL(-0.05146538187944f / 8.0),
896 FL2FXCONST_SGL(-0.92599700120679f / 8.0)},
897 {FL2FXCONST_SGL(0.99947295749905f / 8.0),
898 FL2FXCONST_SGL(0.93625229707912f / 8.0)},
899 {FL2FXCONST_SGL(0.66951124390363f / 8.0),
900 FL2FXCONST_SGL(0.98905825623893f / 8.0)},
901 {FL2FXCONST_SGL(-0.99602956559179f / 8.0),
902 FL2FXCONST_SGL(-0.44654715757688f / 8.0)},
903 {FL2FXCONST_SGL(0.82104905483590f / 8.0),
904 FL2FXCONST_SGL(0.99540741724928f / 8.0)},
905 {FL2FXCONST_SGL(0.99186510988782f / 8.0),
906 FL2FXCONST_SGL(0.72023001312947f / 8.0)},
907 {FL2FXCONST_SGL(-0.65284592392918f / 8.0),
908 FL2FXCONST_SGL(0.52186723253637f / 8.0)},
909 {FL2FXCONST_SGL(0.93885443798188f / 8.0),
910 FL2FXCONST_SGL(-0.74895312615259f / 8.0)},
911 {FL2FXCONST_SGL(0.96735248738388f / 8.0),
912 FL2FXCONST_SGL(0.90891816978629f / 8.0)},
913 {FL2FXCONST_SGL(-0.22225968841114f / 8.0),
914 FL2FXCONST_SGL(0.57124029781228f / 8.0)},
915 {FL2FXCONST_SGL(-0.44132783753414f / 8.0),
916 FL2FXCONST_SGL(-0.92688840659280f / 8.0)},
917 {FL2FXCONST_SGL(-0.85694974219574f / 8.0),
918 FL2FXCONST_SGL(0.88844532719844f / 8.0)},
919 {FL2FXCONST_SGL(0.91783042091762f / 8.0),
920 FL2FXCONST_SGL(-0.46356892383970f / 8.0)},
921 {FL2FXCONST_SGL(0.72556974415690f / 8.0),
922 FL2FXCONST_SGL(-0.99899555770747f / 8.0)},
923 {FL2FXCONST_SGL(-0.99711581834508f / 8.0),
924 FL2FXCONST_SGL(0.58211560180426f / 8.0)},
925 {FL2FXCONST_SGL(0.77638976371966f / 8.0),
926 FL2FXCONST_SGL(0.94321834873819f / 8.0)},
927 {FL2FXCONST_SGL(0.07717324253925f / 8.0),
928 FL2FXCONST_SGL(0.58638399856595f / 8.0)},
929 {FL2FXCONST_SGL(-0.56049829194163f / 8.0),
930 FL2FXCONST_SGL(0.82522301569036f / 8.0)},
931 {FL2FXCONST_SGL(0.98398893639988f / 8.0),
932 FL2FXCONST_SGL(0.39467440420569f / 8.0)},
933 {FL2FXCONST_SGL(0.47546946844938f / 8.0),
934 FL2FXCONST_SGL(0.68613044836811f / 8.0)},
935 {FL2FXCONST_SGL(0.65675089314631f / 8.0),
936 FL2FXCONST_SGL(0.18331637134880f / 8.0)},
937 {FL2FXCONST_SGL(0.03273375457980f / 8.0),
938 FL2FXCONST_SGL(-0.74933109564108f / 8.0)},
939 {FL2FXCONST_SGL(-0.38684144784738f / 8.0),
940 FL2FXCONST_SGL(0.51337349030406f / 8.0)},
941 {FL2FXCONST_SGL(-0.97346267944545f / 8.0),
942 FL2FXCONST_SGL(-0.96549364384098f / 8.0)},
943 {FL2FXCONST_SGL(-0.53282156061942f / 8.0),
944 FL2FXCONST_SGL(-0.91423265091354f / 8.0)},
945 {FL2FXCONST_SGL(0.99817310731176f / 8.0),
946 FL2FXCONST_SGL(0.61133572482148f / 8.0)},
947 {FL2FXCONST_SGL(-0.50254500772635f / 8.0),
948 FL2FXCONST_SGL(-0.88829338134294f / 8.0)},
949 {FL2FXCONST_SGL(0.01995873238855f / 8.0),
950 FL2FXCONST_SGL(0.85223515096765f / 8.0)},
951 {FL2FXCONST_SGL(0.99930381973804f / 8.0),
952 FL2FXCONST_SGL(0.94578896296649f / 8.0)},
953 {FL2FXCONST_SGL(0.82907767600783f / 8.0),
954 FL2FXCONST_SGL(-0.06323442598128f / 8.0)},
955 {FL2FXCONST_SGL(-0.58660709669728f / 8.0),
956 FL2FXCONST_SGL(0.96840773806582f / 8.0)},
957 {FL2FXCONST_SGL(-0.17573736667267f / 8.0),
958 FL2FXCONST_SGL(-0.48166920859485f / 8.0)},
959 {FL2FXCONST_SGL(0.83434292401346f / 8.0),
960 FL2FXCONST_SGL(-0.13023450646997f / 8.0)},
961 {FL2FXCONST_SGL(0.05946491307025f / 8.0),
962 FL2FXCONST_SGL(0.20511047074866f / 8.0)},
963 {FL2FXCONST_SGL(0.81505484574602f / 8.0),
964 FL2FXCONST_SGL(-0.94685947861369f / 8.0)},
965 {FL2FXCONST_SGL(-0.44976380954860f / 8.0),
966 FL2FXCONST_SGL(0.40894572671545f / 8.0)},
967 {FL2FXCONST_SGL(-0.89746474625671f / 8.0),
968 FL2FXCONST_SGL(0.99846578838537f / 8.0)},
969 {FL2FXCONST_SGL(0.39677256130792f / 8.0),
970 FL2FXCONST_SGL(-0.74854668609359f / 8.0)},
971 {FL2FXCONST_SGL(-0.07588948563079f / 8.0),
972 FL2FXCONST_SGL(0.74096214084170f / 8.0)},
973 {FL2FXCONST_SGL(0.76343198951445f / 8.0),
974 FL2FXCONST_SGL(0.41746629422634f / 8.0)},
975 {FL2FXCONST_SGL(-0.74490104699626f / 8.0),
976 FL2FXCONST_SGL(0.94725911744610f / 8.0)},
977 {FL2FXCONST_SGL(0.64880119792759f / 8.0),
978 FL2FXCONST_SGL(0.41336660830571f / 8.0)},
979 {FL2FXCONST_SGL(0.62319537462542f / 8.0),
980 FL2FXCONST_SGL(-0.93098313552599f / 8.0)},
981 {FL2FXCONST_SGL(0.42215817594807f / 8.0),
982 FL2FXCONST_SGL(-0.07712787385208f / 8.0)},
983 {FL2FXCONST_SGL(0.02704554141885f / 8.0),
984 FL2FXCONST_SGL(-0.05417518053666f / 8.0)},
985 {FL2FXCONST_SGL(0.80001773566818f / 8.0),
986 FL2FXCONST_SGL(0.91542195141039f / 8.0)},
987 {FL2FXCONST_SGL(-0.79351832348816f / 8.0),
988 FL2FXCONST_SGL(-0.36208897989136f / 8.0)},
989 {FL2FXCONST_SGL(0.63872359151636f / 8.0),
990 FL2FXCONST_SGL(0.08128252493444f / 8.0)},
991 {FL2FXCONST_SGL(0.52890520960295f / 8.0),
992 FL2FXCONST_SGL(0.60048872455592f / 8.0)},
993 {FL2FXCONST_SGL(0.74238552914587f / 8.0),
994 FL2FXCONST_SGL(0.04491915291044f / 8.0)},
995 {FL2FXCONST_SGL(0.99096131449250f / 8.0),
996 FL2FXCONST_SGL(-0.19451182854402f / 8.0)},
997 {FL2FXCONST_SGL(-0.80412329643109f / 8.0),
998 FL2FXCONST_SGL(-0.88513818199457f / 8.0)},
999 {FL2FXCONST_SGL(-0.64612616129736f / 8.0),
1000 FL2FXCONST_SGL(0.72198674804544f / 8.0)},
1001 {FL2FXCONST_SGL(0.11657770663191f / 8.0),
1002 FL2FXCONST_SGL(-0.83662833815041f / 8.0)},
1003 {FL2FXCONST_SGL(-0.95053182488101f / 8.0),
1004 FL2FXCONST_SGL(-0.96939905138082f / 8.0)},
1005 {FL2FXCONST_SGL(-0.62228872928622f / 8.0),
1006 FL2FXCONST_SGL(0.82767262846661f / 8.0)},
1007 {FL2FXCONST_SGL(0.03004475787316f / 8.0),
1008 FL2FXCONST_SGL(-0.99738896333384f / 8.0)},
1009 {FL2FXCONST_SGL(-0.97987214341034f / 8.0),
1010 FL2FXCONST_SGL(0.36526129686425f / 8.0)},
1011 {FL2FXCONST_SGL(-0.99986980746200f / 8.0),
1012 FL2FXCONST_SGL(-0.36021610299715f / 8.0)},
1013 {FL2FXCONST_SGL(0.89110648599879f / 8.0),
1014 FL2FXCONST_SGL(-0.97894250343044f / 8.0)},
1015 {FL2FXCONST_SGL(0.10407960510582f / 8.0),
1016 FL2FXCONST_SGL(0.77357793811619f / 8.0)},
1017 {FL2FXCONST_SGL(0.95964737821728f / 8.0),
1018 FL2FXCONST_SGL(-0.35435818285502f / 8.0)},
1019 {FL2FXCONST_SGL(0.50843233159162f / 8.0),
1020 FL2FXCONST_SGL(0.96107691266205f / 8.0)},
1021 {FL2FXCONST_SGL(0.17006334670615f / 8.0),
1022 FL2FXCONST_SGL(-0.76854025314829f / 8.0)},
1023 {FL2FXCONST_SGL(0.25872675063360f / 8.0),
1024 FL2FXCONST_SGL(0.99893303933816f / 8.0)},
1025 {FL2FXCONST_SGL(-0.01115998681937f / 8.0),
1026 FL2FXCONST_SGL(0.98496019742444f / 8.0)},
1027 {FL2FXCONST_SGL(-0.79598702973261f / 8.0),
1028 FL2FXCONST_SGL(0.97138411318894f / 8.0)},
1029 {FL2FXCONST_SGL(-0.99264708948101f / 8.0),
1030 FL2FXCONST_SGL(-0.99542822402536f / 8.0)},
1031 {FL2FXCONST_SGL(-0.99829663752818f / 8.0),
1032 FL2FXCONST_SGL(0.01877138824311f / 8.0)},
1033 {FL2FXCONST_SGL(-0.70801016548184f / 8.0),
1034 FL2FXCONST_SGL(0.33680685948117f / 8.0)},
1035 {FL2FXCONST_SGL(-0.70467057786826f / 8.0),
1036 FL2FXCONST_SGL(0.93272777501857f / 8.0)},
1037 {FL2FXCONST_SGL(0.99846021905254f / 8.0),
1038 FL2FXCONST_SGL(-0.98725746254433f / 8.0)},
1039 {FL2FXCONST_SGL(-0.63364968534650f / 8.0),
1040 FL2FXCONST_SGL(-0.16473594423746f / 8.0)},
1041 {FL2FXCONST_SGL(-0.16258217500792f / 8.0),
1042 FL2FXCONST_SGL(-0.95939125400802f / 8.0)},
1043 {FL2FXCONST_SGL(-0.43645594360633f / 8.0),
1044 FL2FXCONST_SGL(-0.94805030113284f / 8.0)},
1045 {FL2FXCONST_SGL(-0.99848471702976f / 8.0),
1046 FL2FXCONST_SGL(0.96245166923809f / 8.0)},
1047 {FL2FXCONST_SGL(-0.16796458968998f / 8.0),
1048 FL2FXCONST_SGL(-0.98987511890470f / 8.0)},
1049 {FL2FXCONST_SGL(-0.87979225745213f / 8.0),
1050 FL2FXCONST_SGL(-0.71725725041680f / 8.0)},
1051 {FL2FXCONST_SGL(0.44183099021786f / 8.0),
1052 FL2FXCONST_SGL(-0.93568974498761f / 8.0)},
1053 {FL2FXCONST_SGL(0.93310180125532f / 8.0),
1054 FL2FXCONST_SGL(-0.99913308068246f / 8.0)},
1055 {FL2FXCONST_SGL(-0.93941931782002f / 8.0),
1056 FL2FXCONST_SGL(-0.56409379640356f / 8.0)},
1057 {FL2FXCONST_SGL(-0.88590003188677f / 8.0),
1058 FL2FXCONST_SGL(0.47624600491382f / 8.0)},
1059 {FL2FXCONST_SGL(0.99971463703691f / 8.0),
1060 FL2FXCONST_SGL(-0.83889954253462f / 8.0)},
1061 {FL2FXCONST_SGL(-0.75376385639978f / 8.0),
1062 FL2FXCONST_SGL(0.00814643438625f / 8.0)},
1063 {FL2FXCONST_SGL(0.93887685615875f / 8.0),
1064 FL2FXCONST_SGL(-0.11284528204636f / 8.0)},
1065 {FL2FXCONST_SGL(0.85126435782309f / 8.0),
1066 FL2FXCONST_SGL(0.52349251543547f / 8.0)},
1067 {FL2FXCONST_SGL(0.39701421446381f / 8.0),
1068 FL2FXCONST_SGL(0.81779634174316f / 8.0)},
1069 {FL2FXCONST_SGL(-0.37024464187437f / 8.0),
1070 FL2FXCONST_SGL(-0.87071656222959f / 8.0)},
1071 {FL2FXCONST_SGL(-0.36024828242896f / 8.0),
1072 FL2FXCONST_SGL(0.34655735648287f / 8.0)},
1073 {FL2FXCONST_SGL(-0.93388812549209f / 8.0),
1074 FL2FXCONST_SGL(-0.84476541096429f / 8.0)},
1075 {FL2FXCONST_SGL(-0.65298804552119f / 8.0),
1076 FL2FXCONST_SGL(-0.18439575450921f / 8.0)},
1077 {FL2FXCONST_SGL(0.11960319006843f / 8.0),
1078 FL2FXCONST_SGL(0.99899346780168f / 8.0)},
1079 {FL2FXCONST_SGL(0.94292565553160f / 8.0),
1080 FL2FXCONST_SGL(0.83163906518293f / 8.0)},
1081 {FL2FXCONST_SGL(0.75081145286948f / 8.0),
1082 FL2FXCONST_SGL(-0.35533223142265f / 8.0)},
1083 {FL2FXCONST_SGL(0.56721979748394f / 8.0),
1084 FL2FXCONST_SGL(-0.24076836414499f / 8.0)},
1085 {FL2FXCONST_SGL(0.46857766746029f / 8.0),
1086 FL2FXCONST_SGL(-0.30140233457198f / 8.0)},
1087 {FL2FXCONST_SGL(0.97312313923635f / 8.0),
1088 FL2FXCONST_SGL(-0.99548191630031f / 8.0)},
1089 {FL2FXCONST_SGL(-0.38299976567017f / 8.0),
1090 FL2FXCONST_SGL(0.98516909715427f / 8.0)},
1091 {FL2FXCONST_SGL(0.41025800019463f / 8.0),
1092 FL2FXCONST_SGL(0.02116736935734f / 8.0)},
1093 {FL2FXCONST_SGL(0.09638062008048f / 8.0),
1094 FL2FXCONST_SGL(0.04411984381457f / 8.0)},
1095 {FL2FXCONST_SGL(-0.85283249275397f / 8.0),
1096 FL2FXCONST_SGL(0.91475563922421f / 8.0)},
1097 {FL2FXCONST_SGL(0.88866808958124f / 8.0),
1098 FL2FXCONST_SGL(-0.99735267083226f / 8.0)},
1099 {FL2FXCONST_SGL(-0.48202429536989f / 8.0),
1100 FL2FXCONST_SGL(-0.96805608884164f / 8.0)},
1101 {FL2FXCONST_SGL(0.27572582416567f / 8.0),
1102 FL2FXCONST_SGL(0.58634753335832f / 8.0)},
1103 {FL2FXCONST_SGL(-0.65889129659168f / 8.0),
1104 FL2FXCONST_SGL(0.58835634138583f / 8.0)},
1105 {FL2FXCONST_SGL(0.98838086953732f / 8.0),
1106 FL2FXCONST_SGL(0.99994349600236f / 8.0)},
1107 {FL2FXCONST_SGL(-0.20651349620689f / 8.0),
1108 FL2FXCONST_SGL(0.54593044066355f / 8.0)},
1109 {FL2FXCONST_SGL(-0.62126416356920f / 8.0),
1110 FL2FXCONST_SGL(-0.59893681700392f / 8.0)},
1111 {FL2FXCONST_SGL(0.20320105410437f / 8.0),
1112 FL2FXCONST_SGL(-0.86879180355289f / 8.0)},
1113 {FL2FXCONST_SGL(-0.97790548600584f / 8.0),
1114 FL2FXCONST_SGL(0.96290806999242f / 8.0)},
1115 {FL2FXCONST_SGL(0.11112534735126f / 8.0),
1116 FL2FXCONST_SGL(0.21484763313301f / 8.0)},
1117 {FL2FXCONST_SGL(-0.41368337314182f / 8.0),
1118 FL2FXCONST_SGL(0.28216837680365f / 8.0)},
1119 {FL2FXCONST_SGL(0.24133038992960f / 8.0),
1120 FL2FXCONST_SGL(0.51294362630238f / 8.0)},
1121 {FL2FXCONST_SGL(-0.66393410674885f / 8.0),
1122 FL2FXCONST_SGL(-0.08249679629081f / 8.0)},
1123 {FL2FXCONST_SGL(-0.53697829178752f / 8.0),
1124 FL2FXCONST_SGL(-0.97649903936228f / 8.0)},
1125 {FL2FXCONST_SGL(-0.97224737889348f / 8.0),
1126 FL2FXCONST_SGL(0.22081333579837f / 8.0)},
1127 {FL2FXCONST_SGL(0.87392477144549f / 8.0),
1128 FL2FXCONST_SGL(-0.12796173740361f / 8.0)},
1129 {FL2FXCONST_SGL(0.19050361015753f / 8.0),
1130 FL2FXCONST_SGL(0.01602615387195f / 8.0)},
1131 {FL2FXCONST_SGL(-0.46353441212724f / 8.0),
1132 FL2FXCONST_SGL(-0.95249041539006f / 8.0)},
1133 {FL2FXCONST_SGL(-0.07064096339021f / 8.0),
1134 FL2FXCONST_SGL(-0.94479803205886f / 8.0)},
1135 {FL2FXCONST_SGL(-0.92444085484466f / 8.0),
1136 FL2FXCONST_SGL(-0.10457590187436f / 8.0)},
1137 {FL2FXCONST_SGL(-0.83822593578728f / 8.0),
1138 FL2FXCONST_SGL(-0.01695043208885f / 8.0)},
1139 {FL2FXCONST_SGL(0.75214681811150f / 8.0),
1140 FL2FXCONST_SGL(-0.99955681042665f / 8.0)},
1141 {FL2FXCONST_SGL(-0.42102998829339f / 8.0),
1142 FL2FXCONST_SGL(0.99720941999394f / 8.0)},
1143 {FL2FXCONST_SGL(-0.72094786237696f / 8.0),
1144 FL2FXCONST_SGL(-0.35008961934255f / 8.0)},
1145 {FL2FXCONST_SGL(0.78843311019251f / 8.0),
1146 FL2FXCONST_SGL(0.52851398958271f / 8.0)},
1147 {FL2FXCONST_SGL(0.97394027897442f / 8.0),
1148 FL2FXCONST_SGL(-0.26695944086561f / 8.0)},
1149 {FL2FXCONST_SGL(0.99206463477946f / 8.0),
1150 FL2FXCONST_SGL(-0.57010120849429f / 8.0)},
1151 {FL2FXCONST_SGL(0.76789609461795f / 8.0),
1152 FL2FXCONST_SGL(-0.76519356730966f / 8.0)},
1153 {FL2FXCONST_SGL(-0.82002421836409f / 8.0),
1154 FL2FXCONST_SGL(-0.73530179553767f / 8.0)},
1155 {FL2FXCONST_SGL(0.81924990025724f / 8.0),
1156 FL2FXCONST_SGL(0.99698425250579f / 8.0)},
1157 {FL2FXCONST_SGL(-0.26719850873357f / 8.0),
1158 FL2FXCONST_SGL(0.68903369776193f / 8.0)},
1159 {FL2FXCONST_SGL(-0.43311260380975f / 8.0),
1160 FL2FXCONST_SGL(0.85321815947490f / 8.0)},
1161 {FL2FXCONST_SGL(0.99194979673836f / 8.0),
1162 FL2FXCONST_SGL(0.91876249766422f / 8.0)},
1163 {FL2FXCONST_SGL(-0.80692001248487f / 8.0),
1164 FL2FXCONST_SGL(-0.32627540663214f / 8.0)},
1165 {FL2FXCONST_SGL(0.43080003649976f / 8.0),
1166 FL2FXCONST_SGL(-0.21919095636638f / 8.0)},
1167 {FL2FXCONST_SGL(0.67709491937357f / 8.0),
1168 FL2FXCONST_SGL(-0.95478075822906f / 8.0)},
1169 {FL2FXCONST_SGL(0.56151770568316f / 8.0),
1170 FL2FXCONST_SGL(-0.70693811747778f / 8.0)},
1171 {FL2FXCONST_SGL(0.10831862810749f / 8.0),
1172 FL2FXCONST_SGL(-0.08628837174592f / 8.0)},
1173 {FL2FXCONST_SGL(0.91229417540436f / 8.0),
1174 FL2FXCONST_SGL(-0.65987351408410f / 8.0)},
1175 {FL2FXCONST_SGL(-0.48972893932274f / 8.0),
1176 FL2FXCONST_SGL(0.56289246362686f / 8.0)},
1177 {FL2FXCONST_SGL(-0.89033658689697f / 8.0),
1178 FL2FXCONST_SGL(-0.71656563987082f / 8.0)},
1179 {FL2FXCONST_SGL(0.65269447475094f / 8.0),
1180 FL2FXCONST_SGL(0.65916004833932f / 8.0)},
1181 {FL2FXCONST_SGL(0.67439478141121f / 8.0),
1182 FL2FXCONST_SGL(-0.81684380846796f / 8.0)},
1183 {FL2FXCONST_SGL(-0.47770832416973f / 8.0),
1184 FL2FXCONST_SGL(-0.16789556203025f / 8.0)},
1185 {FL2FXCONST_SGL(-0.99715979260878f / 8.0),
1186 FL2FXCONST_SGL(-0.93565784007648f / 8.0)},
1187 {FL2FXCONST_SGL(-0.90889593602546f / 8.0),
1188 FL2FXCONST_SGL(0.62034397054380f / 8.0)},
1189 {FL2FXCONST_SGL(-0.06618622548177f / 8.0),
1190 FL2FXCONST_SGL(-0.23812217221359f / 8.0)},
1191 {FL2FXCONST_SGL(0.99430266919728f / 8.0),
1192 FL2FXCONST_SGL(0.18812555317553f / 8.0)},
1193 {FL2FXCONST_SGL(0.97686402381843f / 8.0),
1194 FL2FXCONST_SGL(-0.28664534366620f / 8.0)},
1195 {FL2FXCONST_SGL(0.94813650221268f / 8.0),
1196 FL2FXCONST_SGL(-0.97506640027128f / 8.0)},
1197 {FL2FXCONST_SGL(-0.95434497492853f / 8.0),
1198 FL2FXCONST_SGL(-0.79607978501983f / 8.0)},
1199 {FL2FXCONST_SGL(-0.49104783137150f / 8.0),
1200 FL2FXCONST_SGL(0.32895214359663f / 8.0)},
1201 {FL2FXCONST_SGL(0.99881175120751f / 8.0),
1202 FL2FXCONST_SGL(0.88993983831354f / 8.0)},
1203 {FL2FXCONST_SGL(0.50449166760303f / 8.0),
1204 FL2FXCONST_SGL(-0.85995072408434f / 8.0)},
1205 {FL2FXCONST_SGL(0.47162891065108f / 8.0),
1206 FL2FXCONST_SGL(-0.18680204049569f / 8.0)},
1207 {FL2FXCONST_SGL(-0.62081581361840f / 8.0),
1208 FL2FXCONST_SGL(0.75000676218956f / 8.0)},
1209 {FL2FXCONST_SGL(-0.43867015250812f / 8.0),
1210 FL2FXCONST_SGL(0.99998069244322f / 8.0)},
1211 {FL2FXCONST_SGL(0.98630563232075f / 8.0),
1212 FL2FXCONST_SGL(-0.53578899600662f / 8.0)},
1213 {FL2FXCONST_SGL(-0.61510362277374f / 8.0),
1214 FL2FXCONST_SGL(-0.89515019899997f / 8.0)},
1215 {FL2FXCONST_SGL(-0.03841517601843f / 8.0),
1216 FL2FXCONST_SGL(-0.69888815681179f / 8.0)},
1217 {FL2FXCONST_SGL(-0.30102157304644f / 8.0),
1218 FL2FXCONST_SGL(-0.07667808922205f / 8.0)},
1219 {FL2FXCONST_SGL(0.41881284182683f / 8.0),
1220 FL2FXCONST_SGL(0.02188098922282f / 8.0)},
1221 {FL2FXCONST_SGL(-0.86135454941237f / 8.0),
1222 FL2FXCONST_SGL(0.98947480909359f / 8.0)},
1223 {FL2FXCONST_SGL(0.67226861393788f / 8.0),
1224 FL2FXCONST_SGL(-0.13494389011014f / 8.0)},
1225 {FL2FXCONST_SGL(-0.70737398842068f / 8.0),
1226 FL2FXCONST_SGL(-0.76547349325992f / 8.0)},
1227 {FL2FXCONST_SGL(0.94044946687963f / 8.0),
1228 FL2FXCONST_SGL(0.09026201157416f / 8.0)},
1229 {FL2FXCONST_SGL(-0.82386352534327f / 8.0),
1230 FL2FXCONST_SGL(0.08924768823676f / 8.0)},
1231 {FL2FXCONST_SGL(-0.32070666698656f / 8.0),
1232 FL2FXCONST_SGL(0.50143421908753f / 8.0)},
1233 {FL2FXCONST_SGL(0.57593163224487f / 8.0),
1234 FL2FXCONST_SGL(-0.98966422921509f / 8.0)},
1235 {FL2FXCONST_SGL(-0.36326018419965f / 8.0),
1236 FL2FXCONST_SGL(0.07440243123228f / 8.0)},
1237 {FL2FXCONST_SGL(0.99979044674350f / 8.0),
1238 FL2FXCONST_SGL(-0.14130287347405f / 8.0)},
1239 {FL2FXCONST_SGL(-0.92366023326932f / 8.0),
1240 FL2FXCONST_SGL(-0.97979298068180f / 8.0)},
1241 {FL2FXCONST_SGL(-0.44607178518598f / 8.0),
1242 FL2FXCONST_SGL(-0.54233252016394f / 8.0)},
1243 {FL2FXCONST_SGL(0.44226800932956f / 8.0),
1244 FL2FXCONST_SGL(0.71326756742752f / 8.0)},
1245 {FL2FXCONST_SGL(0.03671907158312f / 8.0),
1246 FL2FXCONST_SGL(0.63606389366675f / 8.0)},
1247 {FL2FXCONST_SGL(0.52175424682195f / 8.0),
1248 FL2FXCONST_SGL(-0.85396826735705f / 8.0)},
1249 {FL2FXCONST_SGL(-0.94701139690956f / 8.0),
1250 FL2FXCONST_SGL(-0.01826348194255f / 8.0)},
1251 {FL2FXCONST_SGL(-0.98759606946049f / 8.0),
1252 FL2FXCONST_SGL(0.82288714303073f / 8.0)},
1253 {FL2FXCONST_SGL(0.87434794743625f / 8.0),
1254 FL2FXCONST_SGL(0.89399495655433f / 8.0)},
1255 {FL2FXCONST_SGL(-0.93412041758744f / 8.0),
1256 FL2FXCONST_SGL(0.41374052024363f / 8.0)},
1257 {FL2FXCONST_SGL(0.96063943315511f / 8.0),
1258 FL2FXCONST_SGL(0.93116709541280f / 8.0)},
1259 {FL2FXCONST_SGL(0.97534253457837f / 8.0),
1260 FL2FXCONST_SGL(0.86150930812689f / 8.0)},
1261 {FL2FXCONST_SGL(0.99642466504163f / 8.0),
1262 FL2FXCONST_SGL(0.70190043427512f / 8.0)},
1263 {FL2FXCONST_SGL(-0.94705089665984f / 8.0),
1264 FL2FXCONST_SGL(-0.29580042814306f / 8.0)},
1265 {FL2FXCONST_SGL(0.91599807087376f / 8.0),
1266 FL2FXCONST_SGL(-0.98147830385781f / 8.0)}};
243 {FL2FXCONST_SGL(-0.99948153278296f), FL2FXCONST_SGL(-0.59483417516607f)},
244 {FL2FXCONST_SGL(0.97113454393991f), FL2FXCONST_SGL(-0.67528515225647f)},
245 {FL2FXCONST_SGL(0.14130051758487f), FL2FXCONST_SGL(-0.95090983575689f)},
246 {FL2FXCONST_SGL(-0.47005496701697f), FL2FXCONST_SGL(-0.37340549728647f)},
247 {FL2FXCONST_SGL(0.80705063769351f), FL2FXCONST_SGL(0.29653668284408f)},
248 {FL2FXCONST_SGL(-0.38981478896926f), FL2FXCONST_SGL(0.89572605717087f)},
249 {FL2FXCONST_SGL(-0.01053049862020f), FL2FXCONST_SGL(-0.66959058036166f)},
250 {FL2FXCONST_SGL(-0.91266367957293f), FL2FXCONST_SGL(-0.11522938140034f)},
251 {FL2FXCONST_SGL(0.54840422910309f), FL2FXCONST_SGL(0.75221367176302f)},
252 {FL2FXCONST_SGL(0.40009252867955f), FL2FXCONST_SGL(-0.98929400334421f)},
253 {FL2FXCONST_SGL(-0.99867974711855f), FL2FXCONST_SGL(-0.88147068645358f)},
254 {FL2FXCONST_SGL(-0.95531076805040f), FL2FXCONST_SGL(0.90908757154593f)},
255 {FL2FXCONST_SGL(-0.45725933317144f), FL2FXCONST_SGL(-0.56716323646760f)},
256 {FL2FXCONST_SGL(-0.72929675029275f), FL2FXCONST_SGL(-0.98008272727324f)},
257 {FL2FXCONST_SGL(0.75622801399036f), FL2FXCONST_SGL(0.20950329995549f)},
258 {FL2FXCONST_SGL(0.07069442601050f), FL2FXCONST_SGL(-0.78247898470706f)},
259 {FL2FXCONST_SGL(0.74496252926055f), FL2FXCONST_SGL(-0.91169004445807f)},
260 {FL2FXCONST_SGL(-0.96440182703856f), FL2FXCONST_SGL(-0.94739918296622f)},
261 {FL2FXCONST_SGL(0.30424629369539f), FL2FXCONST_SGL(-0.49438267012479f)},
262 {FL2FXCONST_SGL(0.66565033746925f), FL2FXCONST_SGL(0.64652935542491f)},
263 {FL2FXCONST_SGL(0.91697008020594f), FL2FXCONST_SGL(0.17514097332009f)},
264 {FL2FXCONST_SGL(-0.70774918760427f), FL2FXCONST_SGL(0.52548653416543f)},
265 {FL2FXCONST_SGL(-0.70051415345560f), FL2FXCONST_SGL(-0.45340028808763f)},
266 {FL2FXCONST_SGL(-0.99496513054797f), FL2FXCONST_SGL(-0.90071908066973f)},
267 {FL2FXCONST_SGL(0.98164490790123f), FL2FXCONST_SGL(-0.77463155528697f)},
268 {FL2FXCONST_SGL(-0.54671580548181f), FL2FXCONST_SGL(-0.02570928536004f)},
269 {FL2FXCONST_SGL(-0.01689629065389f), FL2FXCONST_SGL(0.00287506445732f)},
270 {FL2FXCONST_SGL(-0.86110349531986f), FL2FXCONST_SGL(0.42548583726477f)},
271 {FL2FXCONST_SGL(-0.98892980586032f), FL2FXCONST_SGL(-0.87881132267556f)},
272 {FL2FXCONST_SGL(0.51756627678691f), FL2FXCONST_SGL(0.66926784710139f)},
273 {FL2FXCONST_SGL(-0.99635026409640f), FL2FXCONST_SGL(-0.58107730574765f)},
274 {FL2FXCONST_SGL(-0.99969370862163f), FL2FXCONST_SGL(0.98369989360250f)},
275 {FL2FXCONST_SGL(0.55266258627194f), FL2FXCONST_SGL(0.59449057465591f)},
276 {FL2FXCONST_SGL(0.34581177741673f), FL2FXCONST_SGL(0.94879421061866f)},
277 {FL2FXCONST_SGL(0.62664209577999f), FL2FXCONST_SGL(-0.74402970906471f)},
278 {FL2FXCONST_SGL(-0.77149701404973f), FL2FXCONST_SGL(-0.33883658042801f)},
279 {FL2FXCONST_SGL(-0.91592244254432f), FL2FXCONST_SGL(0.03687901376713f)},
280 {FL2FXCONST_SGL(-0.76285492357887f), FL2FXCONST_SGL(-0.91371867919124f)},
281 {FL2FXCONST_SGL(0.79788337195331f), FL2FXCONST_SGL(-0.93180971199849f)},
282 {FL2FXCONST_SGL(0.54473080610200f), FL2FXCONST_SGL(-0.11919206037186f)},
283 {FL2FXCONST_SGL(-0.85639281671058f), FL2FXCONST_SGL(0.42429854760451f)},
284 {FL2FXCONST_SGL(-0.92882402971423f), FL2FXCONST_SGL(0.27871809078609f)},
285 {FL2FXCONST_SGL(-0.11708371046774f), FL2FXCONST_SGL(-0.99800843444966f)},
286 {FL2FXCONST_SGL(0.21356749817493f), FL2FXCONST_SGL(-0.90716295627033f)},
287 {FL2FXCONST_SGL(-0.76191692573909f), FL2FXCONST_SGL(0.99768118356265f)},
288 {FL2FXCONST_SGL(0.98111043100884f), FL2FXCONST_SGL(-0.95854459734407f)},
289 {FL2FXCONST_SGL(-0.85913269895572f), FL2FXCONST_SGL(0.95766566168880f)},
290 {FL2FXCONST_SGL(-0.93307242253692f), FL2FXCONST_SGL(0.49431757696466f)},
291 {FL2FXCONST_SGL(0.30485754879632f), FL2FXCONST_SGL(-0.70540034357529f)},
292 {FL2FXCONST_SGL(0.85289650925190f), FL2FXCONST_SGL(0.46766131791044f)},
293 {FL2FXCONST_SGL(0.91328082618125f), FL2FXCONST_SGL(-0.99839597361769f)},
294 {FL2FXCONST_SGL(-0.05890199924154f), FL2FXCONST_SGL(0.70741827819497f)},
295 {FL2FXCONST_SGL(0.28398686150148f), FL2FXCONST_SGL(0.34633555702188f)},
296 {FL2FXCONST_SGL(0.95258164539612f), FL2FXCONST_SGL(-0.54893416026939f)},
297 {FL2FXCONST_SGL(-0.78566324168507f), FL2FXCONST_SGL(-0.75568541079691f)},
298 {FL2FXCONST_SGL(-0.95789495447877f), FL2FXCONST_SGL(-0.20423194696966f)},
299 {FL2FXCONST_SGL(0.82411158711197f), FL2FXCONST_SGL(0.96654618432562f)},
300 {FL2FXCONST_SGL(-0.65185446735885f), FL2FXCONST_SGL(-0.88734990773289f)},
301 {FL2FXCONST_SGL(-0.93643603134666f), FL2FXCONST_SGL(0.99870790442385f)},
302 {FL2FXCONST_SGL(0.91427159529618f), FL2FXCONST_SGL(-0.98290505544444f)},
303 {FL2FXCONST_SGL(-0.70395684036886f), FL2FXCONST_SGL(0.58796798221039f)},
304 {FL2FXCONST_SGL(0.00563771969365f), FL2FXCONST_SGL(0.61768196727244f)},
305 {FL2FXCONST_SGL(0.89065051931895f), FL2FXCONST_SGL(0.52783352697585f)},
306 {FL2FXCONST_SGL(-0.68683707712762f), FL2FXCONST_SGL(0.80806944710339f)},
307 {FL2FXCONST_SGL(0.72165342518718f), FL2FXCONST_SGL(-0.69259857349564f)},
308 {FL2FXCONST_SGL(-0.62928247730667f), FL2FXCONST_SGL(0.13627037407335f)},
309 {FL2FXCONST_SGL(0.29938434065514f), FL2FXCONST_SGL(-0.46051329682246f)},
310 {FL2FXCONST_SGL(-0.91781958879280f), FL2FXCONST_SGL(-0.74012716684186f)},
311 {FL2FXCONST_SGL(0.99298717043688f), FL2FXCONST_SGL(0.40816610075661f)},
312 {FL2FXCONST_SGL(0.82368298622748f), FL2FXCONST_SGL(-0.74036047190173f)},
313 {FL2FXCONST_SGL(-0.98512833386833f), FL2FXCONST_SGL(-0.99972330709594f)},
314 {FL2FXCONST_SGL(-0.95915368242257f), FL2FXCONST_SGL(-0.99237800466040f)},
315 {FL2FXCONST_SGL(-0.21411126572790f), FL2FXCONST_SGL(-0.93424819052545f)},
316 {FL2FXCONST_SGL(-0.68821476106884f), FL2FXCONST_SGL(-0.26892306315457f)},
317 {FL2FXCONST_SGL(0.91851997982317f), FL2FXCONST_SGL(0.09358228901785f)},
318 {FL2FXCONST_SGL(-0.96062769559127f), FL2FXCONST_SGL(0.36099095133739f)},
319 {FL2FXCONST_SGL(0.51646184922287f), FL2FXCONST_SGL(-0.71373332873917f)},
320 {FL2FXCONST_SGL(0.61130721139669f), FL2FXCONST_SGL(0.46950141175917f)},
321 {FL2FXCONST_SGL(0.47336129371299f), FL2FXCONST_SGL(-0.27333178296162f)},
322 {FL2FXCONST_SGL(0.90998308703519f), FL2FXCONST_SGL(0.96715662938132f)},
323 {FL2FXCONST_SGL(0.44844799194357f), FL2FXCONST_SGL(0.99211574628306f)},
324 {FL2FXCONST_SGL(0.66614891079092f), FL2FXCONST_SGL(0.96590176169121f)},
325 {FL2FXCONST_SGL(0.74922239129237f), FL2FXCONST_SGL(-0.89879858826087f)},
326 {FL2FXCONST_SGL(-0.99571588506485f), FL2FXCONST_SGL(0.52785521494349f)},
327 {FL2FXCONST_SGL(0.97401082477563f), FL2FXCONST_SGL(-0.16855870075190f)},
328 {FL2FXCONST_SGL(0.72683747733879f), FL2FXCONST_SGL(-0.48060774432251f)},
329 {FL2FXCONST_SGL(0.95432193457128f), FL2FXCONST_SGL(0.68849603408441f)},
330 {FL2FXCONST_SGL(-0.72962208425191f), FL2FXCONST_SGL(-0.76608443420917f)},
331 {FL2FXCONST_SGL(-0.85359479233537f), FL2FXCONST_SGL(0.88738125901579f)},
332 {FL2FXCONST_SGL(-0.81412430338535f), FL2FXCONST_SGL(-0.97480768049637f)},
333 {FL2FXCONST_SGL(-0.87930772356786f), FL2FXCONST_SGL(0.74748307690436f)},
334 {FL2FXCONST_SGL(-0.71573331064977f), FL2FXCONST_SGL(-0.98570608178923f)},
335 {FL2FXCONST_SGL(0.83524300028228f), FL2FXCONST_SGL(0.83702537075163f)},
336 {FL2FXCONST_SGL(-0.48086065601423f), FL2FXCONST_SGL(-0.98848504923531f)},
337 {FL2FXCONST_SGL(0.97139128574778f), FL2FXCONST_SGL(0.80093621198236f)},
338 {FL2FXCONST_SGL(0.51992825347895f), FL2FXCONST_SGL(0.80247631400510f)},
339 {FL2FXCONST_SGL(-0.00848591195325f), FL2FXCONST_SGL(-0.76670128000486f)},
340 {FL2FXCONST_SGL(-0.70294374303036f), FL2FXCONST_SGL(0.55359910445577f)},
341 {FL2FXCONST_SGL(-0.95894428168140f), FL2FXCONST_SGL(-0.43265504344783f)},
342 {FL2FXCONST_SGL(0.97079252950321f), FL2FXCONST_SGL(0.09325857238682f)},
343 {FL2FXCONST_SGL(-0.92404293670797f), FL2FXCONST_SGL(0.85507704027855f)},
344 {FL2FXCONST_SGL(-0.69506469500450f), FL2FXCONST_SGL(0.98633412625459f)},
345 {FL2FXCONST_SGL(0.26559203620024f), FL2FXCONST_SGL(0.73314307966524f)},
346 {FL2FXCONST_SGL(0.28038443336943f), FL2FXCONST_SGL(0.14537913654427f)},
347 {FL2FXCONST_SGL(-0.74138124825523f), FL2FXCONST_SGL(0.99310339807762f)},
348 {FL2FXCONST_SGL(-0.01752795995444f), FL2FXCONST_SGL(-0.82616635284178f)},
349 {FL2FXCONST_SGL(-0.55126773094930f), FL2FXCONST_SGL(-0.98898543862153f)},
350 {FL2FXCONST_SGL(0.97960898850996f), FL2FXCONST_SGL(-0.94021446752851f)},
351 {FL2FXCONST_SGL(-0.99196309146936f), FL2FXCONST_SGL(0.67019017358456f)},
352 {FL2FXCONST_SGL(-0.67684928085260f), FL2FXCONST_SGL(0.12631491649378f)},
353 {FL2FXCONST_SGL(0.09140039465500f), FL2FXCONST_SGL(-0.20537731453108f)},
354 {FL2FXCONST_SGL(-0.71658965751996f), FL2FXCONST_SGL(-0.97788200391224f)},
355 {FL2FXCONST_SGL(0.81014640078925f), FL2FXCONST_SGL(0.53722648362443f)},
356 {FL2FXCONST_SGL(0.40616991671205f), FL2FXCONST_SGL(-0.26469008598449f)},
357 {FL2FXCONST_SGL(-0.67680188682972f), FL2FXCONST_SGL(0.94502052337695f)},
358 {FL2FXCONST_SGL(0.86849774348749f), FL2FXCONST_SGL(-0.18333598647899f)},
359 {FL2FXCONST_SGL(-0.99500381284851f), FL2FXCONST_SGL(-0.02634122068550f)},
360 {FL2FXCONST_SGL(0.84329189340667f), FL2FXCONST_SGL(0.10406957462213f)},
361 {FL2FXCONST_SGL(-0.09215968531446f), FL2FXCONST_SGL(0.69540012101253f)},
362 {FL2FXCONST_SGL(0.99956173327206f), FL2FXCONST_SGL(-0.12358542001404f)},
363 {FL2FXCONST_SGL(-0.79732779473535f), FL2FXCONST_SGL(-0.91582524736159f)},
364 {FL2FXCONST_SGL(0.96349973642406f), FL2FXCONST_SGL(0.96640458041000f)},
365 {FL2FXCONST_SGL(-0.79942778496547f), FL2FXCONST_SGL(0.64323902822857f)},
366 {FL2FXCONST_SGL(-0.11566039853896f), FL2FXCONST_SGL(0.28587846253726f)},
367 {FL2FXCONST_SGL(-0.39922954514662f), FL2FXCONST_SGL(0.94129601616966f)},
368 {FL2FXCONST_SGL(0.99089197565987f), FL2FXCONST_SGL(-0.92062625581587f)},
369 {FL2FXCONST_SGL(0.28631285179909f), FL2FXCONST_SGL(-0.91035047143603f)},
370 {FL2FXCONST_SGL(-0.83302725605608f), FL2FXCONST_SGL(-0.67330410892084f)},
371 {FL2FXCONST_SGL(0.95404443402072f), FL2FXCONST_SGL(0.49162765398743f)},
372 {FL2FXCONST_SGL(-0.06449863579434f), FL2FXCONST_SGL(0.03250560813135f)},
373 {FL2FXCONST_SGL(-0.99575054486311f), FL2FXCONST_SGL(0.42389784469507f)},
374 {FL2FXCONST_SGL(-0.65501142790847f), FL2FXCONST_SGL(0.82546114655624f)},
375 {FL2FXCONST_SGL(-0.81254441908887f), FL2FXCONST_SGL(-0.51627234660629f)},
376 {FL2FXCONST_SGL(-0.99646369485481f), FL2FXCONST_SGL(0.84490533520752f)},
377 {FL2FXCONST_SGL(0.00287840603348f), FL2FXCONST_SGL(0.64768261158166f)},
378 {FL2FXCONST_SGL(0.70176989408455f), FL2FXCONST_SGL(-0.20453028573322f)},
379 {FL2FXCONST_SGL(0.96361882270190f), FL2FXCONST_SGL(0.40706967140989f)},
380 {FL2FXCONST_SGL(-0.68883758192426f), FL2FXCONST_SGL(0.91338958840772f)},
381 {FL2FXCONST_SGL(-0.34875585502238f), FL2FXCONST_SGL(0.71472290693300f)},
382 {FL2FXCONST_SGL(0.91980081243087f), FL2FXCONST_SGL(0.66507455644919f)},
383 {FL2FXCONST_SGL(-0.99009048343881f), FL2FXCONST_SGL(0.85868021604848f)},
384 {FL2FXCONST_SGL(0.68865791458395f), FL2FXCONST_SGL(0.55660316809678f)},
385 {FL2FXCONST_SGL(-0.99484402129368f), FL2FXCONST_SGL(-0.20052559254934f)},
386 {FL2FXCONST_SGL(0.94214511408023f), FL2FXCONST_SGL(-0.99696425367461f)},
387 {FL2FXCONST_SGL(-0.67414626793544f), FL2FXCONST_SGL(0.49548221180078f)},
388 {FL2FXCONST_SGL(-0.47339353684664f), FL2FXCONST_SGL(-0.85904328834047f)},
389 {FL2FXCONST_SGL(0.14323651387360f), FL2FXCONST_SGL(-0.94145598222488f)},
390 {FL2FXCONST_SGL(-0.29268293575672f), FL2FXCONST_SGL(0.05759224927952f)},
391 {FL2FXCONST_SGL(0.43793861458754f), FL2FXCONST_SGL(-0.78904969892724f)},
392 {FL2FXCONST_SGL(-0.36345126374441f), FL2FXCONST_SGL(0.64874435357162f)},
393 {FL2FXCONST_SGL(-0.08750604656825f), FL2FXCONST_SGL(0.97686944362527f)},
394 {FL2FXCONST_SGL(-0.96495267812511f), FL2FXCONST_SGL(-0.53960305946511f)},
395 {FL2FXCONST_SGL(0.55526940659947f), FL2FXCONST_SGL(0.78891523734774f)},
396 {FL2FXCONST_SGL(0.73538215752630f), FL2FXCONST_SGL(0.96452072373404f)},
397 {FL2FXCONST_SGL(-0.30889773919437f), FL2FXCONST_SGL(-0.80664389776860f)},
398 {FL2FXCONST_SGL(0.03574995626194f), FL2FXCONST_SGL(-0.97325616900959f)},
399 {FL2FXCONST_SGL(0.98720684660488f), FL2FXCONST_SGL(0.48409133691962f)},
400 {FL2FXCONST_SGL(-0.81689296271203f), FL2FXCONST_SGL(-0.90827703628298f)},
401 {FL2FXCONST_SGL(0.67866860118215f), FL2FXCONST_SGL(0.81284503870856f)},
402 {FL2FXCONST_SGL(-0.15808569732583f), FL2FXCONST_SGL(0.85279555024382f)},
403 {FL2FXCONST_SGL(0.80723395114371f), FL2FXCONST_SGL(-0.24717418514605f)},
404 {FL2FXCONST_SGL(0.47788757329038f), FL2FXCONST_SGL(-0.46333147839295f)},
405 {FL2FXCONST_SGL(0.96367554763201f), FL2FXCONST_SGL(0.38486749303242f)},
406 {FL2FXCONST_SGL(-0.99143875716818f), FL2FXCONST_SGL(-0.24945277239809f)},
407 {FL2FXCONST_SGL(0.83081876925833f), FL2FXCONST_SGL(-0.94780851414763f)},
408 {FL2FXCONST_SGL(-0.58753191905341f), FL2FXCONST_SGL(0.01290772389163f)},
409 {FL2FXCONST_SGL(0.95538108220960f), FL2FXCONST_SGL(-0.85557052096538f)},
410 {FL2FXCONST_SGL(-0.96490920476211f), FL2FXCONST_SGL(-0.64020970923102f)},
411 {FL2FXCONST_SGL(-0.97327101028521f), FL2FXCONST_SGL(0.12378128133110f)},
412 {FL2FXCONST_SGL(0.91400366022124f), FL2FXCONST_SGL(0.57972471346930f)},
413 {FL2FXCONST_SGL(-0.99925837363824f), FL2FXCONST_SGL(0.71084847864067f)},
414 {FL2FXCONST_SGL(-0.86875903507313f), FL2FXCONST_SGL(-0.20291699203564f)},
415 {FL2FXCONST_SGL(-0.26240034795124f), FL2FXCONST_SGL(-0.68264554369108f)},
416 {FL2FXCONST_SGL(-0.24664412953388f), FL2FXCONST_SGL(-0.87642273115183f)},
417 {FL2FXCONST_SGL(0.02416275806869f), FL2FXCONST_SGL(0.27192914288905f)},
418 {FL2FXCONST_SGL(0.82068619590515f), FL2FXCONST_SGL(-0.85087787994476f)},
419 {FL2FXCONST_SGL(0.88547373760759f), FL2FXCONST_SGL(-0.89636802901469f)},
420 {FL2FXCONST_SGL(-0.18173078152226f), FL2FXCONST_SGL(-0.26152145156800f)},
421 {FL2FXCONST_SGL(0.09355476558534f), FL2FXCONST_SGL(0.54845123045604f)},
422 {FL2FXCONST_SGL(-0.54668414224090f), FL2FXCONST_SGL(0.95980774020221f)},
423 {FL2FXCONST_SGL(0.37050990604091f), FL2FXCONST_SGL(-0.59910140383171f)},
424 {FL2FXCONST_SGL(-0.70373594262891f), FL2FXCONST_SGL(0.91227665827081f)},
425 {FL2FXCONST_SGL(-0.34600785879594f), FL2FXCONST_SGL(-0.99441426144200f)},
426 {FL2FXCONST_SGL(-0.68774481731008f), FL2FXCONST_SGL(-0.30238837956299f)},
427 {FL2FXCONST_SGL(-0.26843291251234f), FL2FXCONST_SGL(0.83115668004362f)},
428 {FL2FXCONST_SGL(0.49072334613242f), FL2FXCONST_SGL(-0.45359708737775f)},
429 {FL2FXCONST_SGL(0.38975993093975f), FL2FXCONST_SGL(0.95515358099121f)},
430 {FL2FXCONST_SGL(-0.97757125224150f), FL2FXCONST_SGL(0.05305894580606f)},
431 {FL2FXCONST_SGL(-0.17325552859616f), FL2FXCONST_SGL(-0.92770672250494f)},
432 {FL2FXCONST_SGL(0.99948035025744f), FL2FXCONST_SGL(0.58285545563426f)},
433 {FL2FXCONST_SGL(-0.64946246527458f), FL2FXCONST_SGL(0.68645507104960f)},
434 {FL2FXCONST_SGL(-0.12016920576437f), FL2FXCONST_SGL(-0.57147322153312f)},
435 {FL2FXCONST_SGL(-0.58947456517751f), FL2FXCONST_SGL(-0.34847132454388f)},
436 {FL2FXCONST_SGL(-0.41815140454465f), FL2FXCONST_SGL(0.16276422358861f)},
437 {FL2FXCONST_SGL(0.99885650204884f), FL2FXCONST_SGL(0.11136095490444f)},
438 {FL2FXCONST_SGL(-0.56649614128386f), FL2FXCONST_SGL(-0.90494866361587f)},
439 {FL2FXCONST_SGL(0.94138021032330f), FL2FXCONST_SGL(0.35281916733018f)},
440 {FL2FXCONST_SGL(-0.75725076534641f), FL2FXCONST_SGL(0.53650549640587f)},
441 {FL2FXCONST_SGL(0.20541973692630f), FL2FXCONST_SGL(-0.94435144369918f)},
442 {FL2FXCONST_SGL(0.99980371023351f), FL2FXCONST_SGL(0.79835913565599f)},
443 {FL2FXCONST_SGL(0.29078277605775f), FL2FXCONST_SGL(0.35393777921520f)},
444 {FL2FXCONST_SGL(-0.62858772103030f), FL2FXCONST_SGL(0.38765693387102f)},
445 {FL2FXCONST_SGL(0.43440904467688f), FL2FXCONST_SGL(-0.98546330463232f)},
446 {FL2FXCONST_SGL(-0.98298583762390f), FL2FXCONST_SGL(0.21021524625209f)},
447 {FL2FXCONST_SGL(0.19513029146934f), FL2FXCONST_SGL(-0.94239832251867f)},
448 {FL2FXCONST_SGL(-0.95476662400101f), FL2FXCONST_SGL(0.98364554179143f)},
449 {FL2FXCONST_SGL(0.93379635304810f), FL2FXCONST_SGL(-0.70881994583682f)},
450 {FL2FXCONST_SGL(-0.85235410573336f), FL2FXCONST_SGL(-0.08342347966410f)},
451 {FL2FXCONST_SGL(-0.86425093011245f), FL2FXCONST_SGL(-0.45795025029466f)},
452 {FL2FXCONST_SGL(0.38879779059045f), FL2FXCONST_SGL(0.97274429344593f)},
453 {FL2FXCONST_SGL(0.92045124735495f), FL2FXCONST_SGL(-0.62433652524220f)},
454 {FL2FXCONST_SGL(0.89162532251878f), FL2FXCONST_SGL(0.54950955570563f)},
455 {FL2FXCONST_SGL(-0.36834336949252f), FL2FXCONST_SGL(0.96458298020975f)},
456 {FL2FXCONST_SGL(0.93891760988045f), FL2FXCONST_SGL(-0.89968353740388f)},
457 {FL2FXCONST_SGL(0.99267657565094f), FL2FXCONST_SGL(-0.03757034316958f)},
458 {FL2FXCONST_SGL(-0.94063471614176f), FL2FXCONST_SGL(0.41332338538963f)},
459 {FL2FXCONST_SGL(0.99740224117019f), FL2FXCONST_SGL(-0.16830494996370f)},
460 {FL2FXCONST_SGL(-0.35899413170555f), FL2FXCONST_SGL(-0.46633226649613f)},
461 {FL2FXCONST_SGL(0.05237237274947f), FL2FXCONST_SGL(-0.25640361602661f)},
462 {FL2FXCONST_SGL(0.36703583957424f), FL2FXCONST_SGL(-0.38653265641875f)},
463 {FL2FXCONST_SGL(0.91653180367913f), FL2FXCONST_SGL(-0.30587628726597f)},
464 {FL2FXCONST_SGL(0.69000803499316f), FL2FXCONST_SGL(0.90952171386132f)},
465 {FL2FXCONST_SGL(-0.38658751133527f), FL2FXCONST_SGL(0.99501571208985f)},
466 {FL2FXCONST_SGL(-0.29250814029851f), FL2FXCONST_SGL(0.37444994344615f)},
467 {FL2FXCONST_SGL(-0.60182204677608f), FL2FXCONST_SGL(0.86779651036123f)},
468 {FL2FXCONST_SGL(-0.97418588163217f), FL2FXCONST_SGL(0.96468523666475f)},
469 {FL2FXCONST_SGL(0.88461574003963f), FL2FXCONST_SGL(0.57508405276414f)},
470 {FL2FXCONST_SGL(0.05198933055162f), FL2FXCONST_SGL(0.21269661669964f)},
471 {FL2FXCONST_SGL(-0.53499621979720f), FL2FXCONST_SGL(0.97241553731237f)},
472 {FL2FXCONST_SGL(-0.49429560226497f), FL2FXCONST_SGL(0.98183865291903f)},
473 {FL2FXCONST_SGL(-0.98935142339139f), FL2FXCONST_SGL(-0.40249159006933f)},
474 {FL2FXCONST_SGL(-0.98081380091130f), FL2FXCONST_SGL(-0.72856895534041f)},
475 {FL2FXCONST_SGL(-0.27338148835532f), FL2FXCONST_SGL(0.99950922447209f)},
476 {FL2FXCONST_SGL(0.06310802338302f), FL2FXCONST_SGL(-0.54539587529618f)},
477 {FL2FXCONST_SGL(-0.20461677199539f), FL2FXCONST_SGL(-0.14209977628489f)},
478 {FL2FXCONST_SGL(0.66223843141647f), FL2FXCONST_SGL(0.72528579940326f)},
479 {FL2FXCONST_SGL(-0.84764345483665f), FL2FXCONST_SGL(0.02372316801261f)},
480 {FL2FXCONST_SGL(-0.89039863483811f), FL2FXCONST_SGL(0.88866581484602f)},
481 {FL2FXCONST_SGL(0.95903308477986f), FL2FXCONST_SGL(0.76744927173873f)},
482 {FL2FXCONST_SGL(0.73504123909879f), FL2FXCONST_SGL(-0.03747203173192f)},
483 {FL2FXCONST_SGL(-0.31744434966056f), FL2FXCONST_SGL(-0.36834111883652f)},
484 {FL2FXCONST_SGL(-0.34110827591623f), FL2FXCONST_SGL(0.40211222807691f)},
485 {FL2FXCONST_SGL(0.47803883714199f), FL2FXCONST_SGL(-0.39423219786288f)},
486 {FL2FXCONST_SGL(0.98299195879514f), FL2FXCONST_SGL(0.01989791390047f)},
487 {FL2FXCONST_SGL(-0.30963073129751f), FL2FXCONST_SGL(-0.18076720599336f)},
488 {FL2FXCONST_SGL(0.99992588229018f), FL2FXCONST_SGL(-0.26281872094289f)},
489 {FL2FXCONST_SGL(-0.93149731080767f), FL2FXCONST_SGL(-0.98313162570490f)},
490 {FL2FXCONST_SGL(0.99923472302773f), FL2FXCONST_SGL(-0.80142993767554f)},
491 {FL2FXCONST_SGL(-0.26024169633417f), FL2FXCONST_SGL(-0.75999759855752f)},
492 {FL2FXCONST_SGL(-0.35712514743563f), FL2FXCONST_SGL(0.19298963768574f)},
493 {FL2FXCONST_SGL(-0.99899084509530f), FL2FXCONST_SGL(0.74645156992493f)},
494 {FL2FXCONST_SGL(0.86557171579452f), FL2FXCONST_SGL(0.55593866696299f)},
495 {FL2FXCONST_SGL(0.33408042438752f), FL2FXCONST_SGL(0.86185953874709f)},
496 {FL2FXCONST_SGL(0.99010736374716f), FL2FXCONST_SGL(0.04602397576623f)},
497 {FL2FXCONST_SGL(-0.66694269691195f), FL2FXCONST_SGL(-0.91643611810148f)},
498 {FL2FXCONST_SGL(0.64016792079480f), FL2FXCONST_SGL(0.15649530836856f)},
499 {FL2FXCONST_SGL(0.99570534804836f), FL2FXCONST_SGL(0.45844586038111f)},
500 {FL2FXCONST_SGL(-0.63431466947340f), FL2FXCONST_SGL(0.21079116459234f)},
501 {FL2FXCONST_SGL(-0.07706847005931f), FL2FXCONST_SGL(-0.89581437101329f)},
502 {FL2FXCONST_SGL(0.98590090577724f), FL2FXCONST_SGL(0.88241721133981f)},
503 {FL2FXCONST_SGL(0.80099335254678f), FL2FXCONST_SGL(-0.36851896710853f)},
504 {FL2FXCONST_SGL(0.78368131392666f), FL2FXCONST_SGL(0.45506999802597f)},
505 {FL2FXCONST_SGL(0.08707806671691f), FL2FXCONST_SGL(0.80938994918745f)},
506 {FL2FXCONST_SGL(-0.86811883080712f), FL2FXCONST_SGL(0.39347308654705f)},
507 {FL2FXCONST_SGL(-0.39466529740375f), FL2FXCONST_SGL(-0.66809432114456f)},
508 {FL2FXCONST_SGL(0.97875325649683f), FL2FXCONST_SGL(-0.72467840967746f)},
509 {FL2FXCONST_SGL(-0.95038560288864f), FL2FXCONST_SGL(0.89563219587625f)},
510 {FL2FXCONST_SGL(0.17005239424212f), FL2FXCONST_SGL(0.54683053962658f)},
511 {FL2FXCONST_SGL(-0.76910792026848f), FL2FXCONST_SGL(-0.96226617549298f)},
512 {FL2FXCONST_SGL(0.99743281016846f), FL2FXCONST_SGL(0.42697157037567f)},
513 {FL2FXCONST_SGL(0.95437383549973f), FL2FXCONST_SGL(0.97002324109952f)},
514 {FL2FXCONST_SGL(0.99578905365569f), FL2FXCONST_SGL(-0.54106826257356f)},
515 {FL2FXCONST_SGL(0.28058259829990f), FL2FXCONST_SGL(-0.85361420634036f)},
516 {FL2FXCONST_SGL(0.85256524470573f), FL2FXCONST_SGL(-0.64567607735589f)},
517 {FL2FXCONST_SGL(-0.50608540105128f), FL2FXCONST_SGL(-0.65846015480300f)},
518 {FL2FXCONST_SGL(-0.97210735183243f), FL2FXCONST_SGL(-0.23095213067791f)},
519 {FL2FXCONST_SGL(0.95424048234441f), FL2FXCONST_SGL(-0.99240147091219f)},
520 {FL2FXCONST_SGL(-0.96926570524023f), FL2FXCONST_SGL(0.73775654896574f)},
521 {FL2FXCONST_SGL(0.30872163214726f), FL2FXCONST_SGL(0.41514960556126f)},
522 {FL2FXCONST_SGL(-0.24523839572639f), FL2FXCONST_SGL(0.63206633394807f)},
523 {FL2FXCONST_SGL(-0.33813265086024f), FL2FXCONST_SGL(-0.38661779441897f)},
524 {FL2FXCONST_SGL(-0.05826828420146f), FL2FXCONST_SGL(-0.06940774188029f)},
525 {FL2FXCONST_SGL(-0.22898461455054f), FL2FXCONST_SGL(0.97054853316316f)},
526 {FL2FXCONST_SGL(-0.18509915019881f), FL2FXCONST_SGL(0.47565762892084f)},
527 {FL2FXCONST_SGL(-0.10488238045009f), FL2FXCONST_SGL(-0.87769947402394f)},
528 {FL2FXCONST_SGL(-0.71886586182037f), FL2FXCONST_SGL(0.78030982480538f)},
529 {FL2FXCONST_SGL(0.99793873738654f), FL2FXCONST_SGL(0.90041310491497f)},
530 {FL2FXCONST_SGL(0.57563307626120f), FL2FXCONST_SGL(-0.91034337352097f)},
531 {FL2FXCONST_SGL(0.28909646383717f), FL2FXCONST_SGL(0.96307783970534f)},
532 {FL2FXCONST_SGL(0.42188998312520f), FL2FXCONST_SGL(0.48148651230437f)},
533 {FL2FXCONST_SGL(0.93335049681047f), FL2FXCONST_SGL(-0.43537023883588f)},
534 {FL2FXCONST_SGL(-0.97087374418267f), FL2FXCONST_SGL(0.86636445711364f)},
535 {FL2FXCONST_SGL(0.36722871286923f), FL2FXCONST_SGL(0.65291654172961f)},
536 {FL2FXCONST_SGL(-0.81093025665696f), FL2FXCONST_SGL(0.08778370229363f)},
537 {FL2FXCONST_SGL(-0.26240603062237f), FL2FXCONST_SGL(-0.92774095379098f)},
538 {FL2FXCONST_SGL(0.83996497984604f), FL2FXCONST_SGL(0.55839849139647f)},
539 {FL2FXCONST_SGL(-0.99909615720225f), FL2FXCONST_SGL(-0.96024605713970f)},
540 {FL2FXCONST_SGL(0.74649464155061f), FL2FXCONST_SGL(0.12144893606462f)},
541 {FL2FXCONST_SGL(-0.74774595569805f), FL2FXCONST_SGL(-0.26898062008959f)},
542 {FL2FXCONST_SGL(0.95781667469567f), FL2FXCONST_SGL(-0.79047927052628f)},
543 {FL2FXCONST_SGL(0.95472308713099f), FL2FXCONST_SGL(-0.08588776019550f)},
544 {FL2FXCONST_SGL(0.48708332746299f), MAXVAL_SGL},
545 {FL2FXCONST_SGL(0.46332038247497f), FL2FXCONST_SGL(0.10964126185063f)},
546 {FL2FXCONST_SGL(-0.76497004940162f), FL2FXCONST_SGL(0.89210929242238f)},
547 {FL2FXCONST_SGL(0.57397389364339f), FL2FXCONST_SGL(0.35289703373760f)},
548 {FL2FXCONST_SGL(0.75374316974495f), FL2FXCONST_SGL(0.96705214651335f)},
549 {FL2FXCONST_SGL(-0.59174397685714f), FL2FXCONST_SGL(-0.89405370422752f)},
550 {FL2FXCONST_SGL(0.75087906691890f), FL2FXCONST_SGL(-0.29612672982396f)},
551 {FL2FXCONST_SGL(-0.98607857336230f), FL2FXCONST_SGL(0.25034911730023f)},
552 {FL2FXCONST_SGL(-0.40761056640505f), FL2FXCONST_SGL(-0.90045573444695f)},
553 {FL2FXCONST_SGL(0.66929266740477f), FL2FXCONST_SGL(0.98629493401748f)},
554 {FL2FXCONST_SGL(-0.97463695257310f), FL2FXCONST_SGL(-0.00190223301301f)},
555 {FL2FXCONST_SGL(0.90145509409859f), FL2FXCONST_SGL(0.99781390365446f)},
556 {FL2FXCONST_SGL(-0.87259289048043f), FL2FXCONST_SGL(0.99233587353666f)},
557 {FL2FXCONST_SGL(-0.91529461447692f), FL2FXCONST_SGL(-0.15698707534206f)},
558 {FL2FXCONST_SGL(-0.03305738840705f), FL2FXCONST_SGL(-0.37205262859764f)},
559 {FL2FXCONST_SGL(0.07223051368337f), FL2FXCONST_SGL(-0.88805001733626f)},
560 {FL2FXCONST_SGL(0.99498012188353f), FL2FXCONST_SGL(0.97094358113387f)},
561 {FL2FXCONST_SGL(-0.74904939500519f), FL2FXCONST_SGL(0.99985483641521f)},
562 {FL2FXCONST_SGL(0.04585228574211f), FL2FXCONST_SGL(0.99812337444082f)},
563 {FL2FXCONST_SGL(-0.89054954257993f), FL2FXCONST_SGL(-0.31791913188064f)},
564 {FL2FXCONST_SGL(-0.83782144651251f), FL2FXCONST_SGL(0.97637632547466f)},
565 {FL2FXCONST_SGL(0.33454804933804f), FL2FXCONST_SGL(-0.86231516800408f)},
566 {FL2FXCONST_SGL(-0.99707579362824f), FL2FXCONST_SGL(0.93237990079441f)},
567 {FL2FXCONST_SGL(-0.22827527843994f), FL2FXCONST_SGL(0.18874759397997f)},
568 {FL2FXCONST_SGL(0.67248046289143f), FL2FXCONST_SGL(-0.03646211390569f)},
569 {FL2FXCONST_SGL(-0.05146538187944f), FL2FXCONST_SGL(-0.92599700120679f)},
570 {FL2FXCONST_SGL(0.99947295749905f), FL2FXCONST_SGL(0.93625229707912f)},
571 {FL2FXCONST_SGL(0.66951124390363f), FL2FXCONST_SGL(0.98905825623893f)},
572 {FL2FXCONST_SGL(-0.99602956559179f), FL2FXCONST_SGL(-0.44654715757688f)},
573 {FL2FXCONST_SGL(0.82104905483590f), FL2FXCONST_SGL(0.99540741724928f)},
574 {FL2FXCONST_SGL(0.99186510988782f), FL2FXCONST_SGL(0.72023001312947f)},
575 {FL2FXCONST_SGL(-0.65284592392918f), FL2FXCONST_SGL(0.52186723253637f)},
576 {FL2FXCONST_SGL(0.93885443798188f), FL2FXCONST_SGL(-0.74895312615259f)},
577 {FL2FXCONST_SGL(0.96735248738388f), FL2FXCONST_SGL(0.90891816978629f)},
578 {FL2FXCONST_SGL(-0.22225968841114f), FL2FXCONST_SGL(0.57124029781228f)},
579 {FL2FXCONST_SGL(-0.44132783753414f), FL2FXCONST_SGL(-0.92688840659280f)},
580 {FL2FXCONST_SGL(-0.85694974219574f), FL2FXCONST_SGL(0.88844532719844f)},
581 {FL2FXCONST_SGL(0.91783042091762f), FL2FXCONST_SGL(-0.46356892383970f)},
582 {FL2FXCONST_SGL(0.72556974415690f), FL2FXCONST_SGL(-0.99899555770747f)},
583 {FL2FXCONST_SGL(-0.99711581834508f), FL2FXCONST_SGL(0.58211560180426f)},
584 {FL2FXCONST_SGL(0.77638976371966f), FL2FXCONST_SGL(0.94321834873819f)},
585 {FL2FXCONST_SGL(0.07717324253925f), FL2FXCONST_SGL(0.58638399856595f)},
586 {FL2FXCONST_SGL(-0.56049829194163f), FL2FXCONST_SGL(0.82522301569036f)},
587 {FL2FXCONST_SGL(0.98398893639988f), FL2FXCONST_SGL(0.39467440420569f)},
588 {FL2FXCONST_SGL(0.47546946844938f), FL2FXCONST_SGL(0.68613044836811f)},
589 {FL2FXCONST_SGL(0.65675089314631f), FL2FXCONST_SGL(0.18331637134880f)},
590 {FL2FXCONST_SGL(0.03273375457980f), FL2FXCONST_SGL(-0.74933109564108f)},
591 {FL2FXCONST_SGL(-0.38684144784738f), FL2FXCONST_SGL(0.51337349030406f)},
592 {FL2FXCONST_SGL(-0.97346267944545f), FL2FXCONST_SGL(-0.96549364384098f)},
593 {FL2FXCONST_SGL(-0.53282156061942f), FL2FXCONST_SGL(-0.91423265091354f)},
594 {FL2FXCONST_SGL(0.99817310731176f), FL2FXCONST_SGL(0.61133572482148f)},
595 {FL2FXCONST_SGL(-0.50254500772635f), FL2FXCONST_SGL(-0.88829338134294f)},
596 {FL2FXCONST_SGL(0.01995873238855f), FL2FXCONST_SGL(0.85223515096765f)},
597 {FL2FXCONST_SGL(0.99930381973804f), FL2FXCONST_SGL(0.94578896296649f)},
598 {FL2FXCONST_SGL(0.82907767600783f), FL2FXCONST_SGL(-0.06323442598128f)},
599 {FL2FXCONST_SGL(-0.58660709669728f), FL2FXCONST_SGL(0.96840773806582f)},
600 {FL2FXCONST_SGL(-0.17573736667267f), FL2FXCONST_SGL(-0.48166920859485f)},
601 {FL2FXCONST_SGL(0.83434292401346f), FL2FXCONST_SGL(-0.13023450646997f)},
602 {FL2FXCONST_SGL(0.05946491307025f), FL2FXCONST_SGL(0.20511047074866f)},
603 {FL2FXCONST_SGL(0.81505484574602f), FL2FXCONST_SGL(-0.94685947861369f)},
604 {FL2FXCONST_SGL(-0.44976380954860f), FL2FXCONST_SGL(0.40894572671545f)},
605 {FL2FXCONST_SGL(-0.89746474625671f), FL2FXCONST_SGL(0.99846578838537f)},
606 {FL2FXCONST_SGL(0.39677256130792f), FL2FXCONST_SGL(-0.74854668609359f)},
607 {FL2FXCONST_SGL(-0.07588948563079f), FL2FXCONST_SGL(0.74096214084170f)},
608 {FL2FXCONST_SGL(0.76343198951445f), FL2FXCONST_SGL(0.41746629422634f)},
609 {FL2FXCONST_SGL(-0.74490104699626f), FL2FXCONST_SGL(0.94725911744610f)},
610 {FL2FXCONST_SGL(0.64880119792759f), FL2FXCONST_SGL(0.41336660830571f)},
611 {FL2FXCONST_SGL(0.62319537462542f), FL2FXCONST_SGL(-0.93098313552599f)},
612 {FL2FXCONST_SGL(0.42215817594807f), FL2FXCONST_SGL(-0.07712787385208f)},
613 {FL2FXCONST_SGL(0.02704554141885f), FL2FXCONST_SGL(-0.05417518053666f)},
614 {FL2FXCONST_SGL(0.80001773566818f), FL2FXCONST_SGL(0.91542195141039f)},
615 {FL2FXCONST_SGL(-0.79351832348816f), FL2FXCONST_SGL(-0.36208897989136f)},
616 {FL2FXCONST_SGL(0.63872359151636f), FL2FXCONST_SGL(0.08128252493444f)},
617 {FL2FXCONST_SGL(0.52890520960295f), FL2FXCONST_SGL(0.60048872455592f)},
618 {FL2FXCONST_SGL(0.74238552914587f), FL2FXCONST_SGL(0.04491915291044f)},
619 {FL2FXCONST_SGL(0.99096131449250f), FL2FXCONST_SGL(-0.19451182854402f)},
620 {FL2FXCONST_SGL(-0.80412329643109f), FL2FXCONST_SGL(-0.88513818199457f)},
621 {FL2FXCONST_SGL(-0.64612616129736f), FL2FXCONST_SGL(0.72198674804544f)},
622 {FL2FXCONST_SGL(0.11657770663191f), FL2FXCONST_SGL(-0.83662833815041f)},
623 {FL2FXCONST_SGL(-0.95053182488101f), FL2FXCONST_SGL(-0.96939905138082f)},
624 {FL2FXCONST_SGL(-0.62228872928622f), FL2FXCONST_SGL(0.82767262846661f)},
625 {FL2FXCONST_SGL(0.03004475787316f), FL2FXCONST_SGL(-0.99738896333384f)},
626 {FL2FXCONST_SGL(-0.97987214341034f), FL2FXCONST_SGL(0.36526129686425f)},
627 {FL2FXCONST_SGL(-0.99986980746200f), FL2FXCONST_SGL(-0.36021610299715f)},
628 {FL2FXCONST_SGL(0.89110648599879f), FL2FXCONST_SGL(-0.97894250343044f)},
629 {FL2FXCONST_SGL(0.10407960510582f), FL2FXCONST_SGL(0.77357793811619f)},
630 {FL2FXCONST_SGL(0.95964737821728f), FL2FXCONST_SGL(-0.35435818285502f)},
631 {FL2FXCONST_SGL(0.50843233159162f), FL2FXCONST_SGL(0.96107691266205f)},
632 {FL2FXCONST_SGL(0.17006334670615f), FL2FXCONST_SGL(-0.76854025314829f)},
633 {FL2FXCONST_SGL(0.25872675063360f), FL2FXCONST_SGL(0.99893303933816f)},
634 {FL2FXCONST_SGL(-0.01115998681937f), FL2FXCONST_SGL(0.98496019742444f)},
635 {FL2FXCONST_SGL(-0.79598702973261f), FL2FXCONST_SGL(0.97138411318894f)},
636 {FL2FXCONST_SGL(-0.99264708948101f), FL2FXCONST_SGL(-0.99542822402536f)},
637 {FL2FXCONST_SGL(-0.99829663752818f), FL2FXCONST_SGL(0.01877138824311f)},
638 {FL2FXCONST_SGL(-0.70801016548184f), FL2FXCONST_SGL(0.33680685948117f)},
639 {FL2FXCONST_SGL(-0.70467057786826f), FL2FXCONST_SGL(0.93272777501857f)},
640 {FL2FXCONST_SGL(0.99846021905254f), FL2FXCONST_SGL(-0.98725746254433f)},
641 {FL2FXCONST_SGL(-0.63364968534650f), FL2FXCONST_SGL(-0.16473594423746f)},
642 {FL2FXCONST_SGL(-0.16258217500792f), FL2FXCONST_SGL(-0.95939125400802f)},
643 {FL2FXCONST_SGL(-0.43645594360633f), FL2FXCONST_SGL(-0.94805030113284f)},
644 {FL2FXCONST_SGL(-0.99848471702976f), FL2FXCONST_SGL(0.96245166923809f)},
645 {FL2FXCONST_SGL(-0.16796458968998f), FL2FXCONST_SGL(-0.98987511890470f)},
646 {FL2FXCONST_SGL(-0.87979225745213f), FL2FXCONST_SGL(-0.71725725041680f)},
647 {FL2FXCONST_SGL(0.44183099021786f), FL2FXCONST_SGL(-0.93568974498761f)},
648 {FL2FXCONST_SGL(0.93310180125532f), FL2FXCONST_SGL(-0.99913308068246f)},
649 {FL2FXCONST_SGL(-0.93941931782002f), FL2FXCONST_SGL(-0.56409379640356f)},
650 {FL2FXCONST_SGL(-0.88590003188677f), FL2FXCONST_SGL(0.47624600491382f)},
651 {FL2FXCONST_SGL(0.99971463703691f), FL2FXCONST_SGL(-0.83889954253462f)},
652 {FL2FXCONST_SGL(-0.75376385639978f), FL2FXCONST_SGL(0.00814643438625f)},
653 {FL2FXCONST_SGL(0.93887685615875f), FL2FXCONST_SGL(-0.11284528204636f)},
654 {FL2FXCONST_SGL(0.85126435782309f), FL2FXCONST_SGL(0.52349251543547f)},
655 {FL2FXCONST_SGL(0.39701421446381f), FL2FXCONST_SGL(0.81779634174316f)},
656 {FL2FXCONST_SGL(-0.37024464187437f), FL2FXCONST_SGL(-0.87071656222959f)},
657 {FL2FXCONST_SGL(-0.36024828242896f), FL2FXCONST_SGL(0.34655735648287f)},
658 {FL2FXCONST_SGL(-0.93388812549209f), FL2FXCONST_SGL(-0.84476541096429f)},
659 {FL2FXCONST_SGL(-0.65298804552119f), FL2FXCONST_SGL(-0.18439575450921f)},
660 {FL2FXCONST_SGL(0.11960319006843f), FL2FXCONST_SGL(0.99899346780168f)},
661 {FL2FXCONST_SGL(0.94292565553160f), FL2FXCONST_SGL(0.83163906518293f)},
662 {FL2FXCONST_SGL(0.75081145286948f), FL2FXCONST_SGL(-0.35533223142265f)},
663 {FL2FXCONST_SGL(0.56721979748394f), FL2FXCONST_SGL(-0.24076836414499f)},
664 {FL2FXCONST_SGL(0.46857766746029f), FL2FXCONST_SGL(-0.30140233457198f)},
665 {FL2FXCONST_SGL(0.97312313923635f), FL2FXCONST_SGL(-0.99548191630031f)},
666 {FL2FXCONST_SGL(-0.38299976567017f), FL2FXCONST_SGL(0.98516909715427f)},
667 {FL2FXCONST_SGL(0.41025800019463f), FL2FXCONST_SGL(0.02116736935734f)},
668 {FL2FXCONST_SGL(0.09638062008048f), FL2FXCONST_SGL(0.04411984381457f)},
669 {FL2FXCONST_SGL(-0.85283249275397f), FL2FXCONST_SGL(0.91475563922421f)},
670 {FL2FXCONST_SGL(0.88866808958124f), FL2FXCONST_SGL(-0.99735267083226f)},
671 {FL2FXCONST_SGL(-0.48202429536989f), FL2FXCONST_SGL(-0.96805608884164f)},
672 {FL2FXCONST_SGL(0.27572582416567f), FL2FXCONST_SGL(0.58634753335832f)},
673 {FL2FXCONST_SGL(-0.65889129659168f), FL2FXCONST_SGL(0.58835634138583f)},
674 {FL2FXCONST_SGL(0.98838086953732f), FL2FXCONST_SGL(0.99994349600236f)},
675 {FL2FXCONST_SGL(-0.20651349620689f), FL2FXCONST_SGL(0.54593044066355f)},
676 {FL2FXCONST_SGL(-0.62126416356920f), FL2FXCONST_SGL(-0.59893681700392f)},
677 {FL2FXCONST_SGL(0.20320105410437f), FL2FXCONST_SGL(-0.86879180355289f)},
678 {FL2FXCONST_SGL(-0.97790548600584f), FL2FXCONST_SGL(0.96290806999242f)},
679 {FL2FXCONST_SGL(0.11112534735126f), FL2FXCONST_SGL(0.21484763313301f)},
680 {FL2FXCONST_SGL(-0.41368337314182f), FL2FXCONST_SGL(0.28216837680365f)},
681 {FL2FXCONST_SGL(0.24133038992960f), FL2FXCONST_SGL(0.51294362630238f)},
682 {FL2FXCONST_SGL(-0.66393410674885f), FL2FXCONST_SGL(-0.08249679629081f)},
683 {FL2FXCONST_SGL(-0.53697829178752f), FL2FXCONST_SGL(-0.97649903936228f)},
684 {FL2FXCONST_SGL(-0.97224737889348f), FL2FXCONST_SGL(0.22081333579837f)},
685 {FL2FXCONST_SGL(0.87392477144549f), FL2FXCONST_SGL(-0.12796173740361f)},
686 {FL2FXCONST_SGL(0.19050361015753f), FL2FXCONST_SGL(0.01602615387195f)},
687 {FL2FXCONST_SGL(-0.46353441212724f), FL2FXCONST_SGL(-0.95249041539006f)},
688 {FL2FXCONST_SGL(-0.07064096339021f), FL2FXCONST_SGL(-0.94479803205886f)},
689 {FL2FXCONST_SGL(-0.92444085484466f), FL2FXCONST_SGL(-0.10457590187436f)},
690 {FL2FXCONST_SGL(-0.83822593578728f), FL2FXCONST_SGL(-0.01695043208885f)},
691 {FL2FXCONST_SGL(0.75214681811150f), FL2FXCONST_SGL(-0.99955681042665f)},
692 {FL2FXCONST_SGL(-0.42102998829339f), FL2FXCONST_SGL(0.99720941999394f)},
693 {FL2FXCONST_SGL(-0.72094786237696f), FL2FXCONST_SGL(-0.35008961934255f)},
694 {FL2FXCONST_SGL(0.78843311019251f), FL2FXCONST_SGL(0.52851398958271f)},
695 {FL2FXCONST_SGL(0.97394027897442f), FL2FXCONST_SGL(-0.26695944086561f)},
696 {FL2FXCONST_SGL(0.99206463477946f), FL2FXCONST_SGL(-0.57010120849429f)},
697 {FL2FXCONST_SGL(0.76789609461795f), FL2FXCONST_SGL(-0.76519356730966f)},
698 {FL2FXCONST_SGL(-0.82002421836409f), FL2FXCONST_SGL(-0.73530179553767f)},
699 {FL2FXCONST_SGL(0.81924990025724f), FL2FXCONST_SGL(0.99698425250579f)},
700 {FL2FXCONST_SGL(-0.26719850873357f), FL2FXCONST_SGL(0.68903369776193f)},
701 {FL2FXCONST_SGL(-0.43311260380975f), FL2FXCONST_SGL(0.85321815947490f)},
702 {FL2FXCONST_SGL(0.99194979673836f), FL2FXCONST_SGL(0.91876249766422f)},
703 {FL2FXCONST_SGL(-0.80692001248487f), FL2FXCONST_SGL(-0.32627540663214f)},
704 {FL2FXCONST_SGL(0.43080003649976f), FL2FXCONST_SGL(-0.21919095636638f)},
705 {FL2FXCONST_SGL(0.67709491937357f), FL2FXCONST_SGL(-0.95478075822906f)},
706 {FL2FXCONST_SGL(0.56151770568316f), FL2FXCONST_SGL(-0.70693811747778f)},
707 {FL2FXCONST_SGL(0.10831862810749f), FL2FXCONST_SGL(-0.08628837174592f)},
708 {FL2FXCONST_SGL(0.91229417540436f), FL2FXCONST_SGL(-0.65987351408410f)},
709 {FL2FXCONST_SGL(-0.48972893932274f), FL2FXCONST_SGL(0.56289246362686f)},
710 {FL2FXCONST_SGL(-0.89033658689697f), FL2FXCONST_SGL(-0.71656563987082f)},
711 {FL2FXCONST_SGL(0.65269447475094f), FL2FXCONST_SGL(0.65916004833932f)},
712 {FL2FXCONST_SGL(0.67439478141121f), FL2FXCONST_SGL(-0.81684380846796f)},
713 {FL2FXCONST_SGL(-0.47770832416973f), FL2FXCONST_SGL(-0.16789556203025f)},
714 {FL2FXCONST_SGL(-0.99715979260878f), FL2FXCONST_SGL(-0.93565784007648f)},
715 {FL2FXCONST_SGL(-0.90889593602546f), FL2FXCONST_SGL(0.62034397054380f)},
716 {FL2FXCONST_SGL(-0.06618622548177f), FL2FXCONST_SGL(-0.23812217221359f)},
717 {FL2FXCONST_SGL(0.99430266919728f), FL2FXCONST_SGL(0.18812555317553f)},
718 {FL2FXCONST_SGL(0.97686402381843f), FL2FXCONST_SGL(-0.28664534366620f)},
719 {FL2FXCONST_SGL(0.94813650221268f), FL2FXCONST_SGL(-0.97506640027128f)},
720 {FL2FXCONST_SGL(-0.95434497492853f), FL2FXCONST_SGL(-0.79607978501983f)},
721 {FL2FXCONST_SGL(-0.49104783137150f), FL2FXCONST_SGL(0.32895214359663f)},
722 {FL2FXCONST_SGL(0.99881175120751f), FL2FXCONST_SGL(0.88993983831354f)},
723 {FL2FXCONST_SGL(0.50449166760303f), FL2FXCONST_SGL(-0.85995072408434f)},
724 {FL2FXCONST_SGL(0.47162891065108f), FL2FXCONST_SGL(-0.18680204049569f)},
725 {FL2FXCONST_SGL(-0.62081581361840f), FL2FXCONST_SGL(0.75000676218956f)},
726 {FL2FXCONST_SGL(-0.43867015250812f), FL2FXCONST_SGL(0.99998069244322f)},
727 {FL2FXCONST_SGL(0.98630563232075f), FL2FXCONST_SGL(-0.53578899600662f)},
728 {FL2FXCONST_SGL(-0.61510362277374f), FL2FXCONST_SGL(-0.89515019899997f)},
729 {FL2FXCONST_SGL(-0.03841517601843f), FL2FXCONST_SGL(-0.69888815681179f)},
730 {FL2FXCONST_SGL(-0.30102157304644f), FL2FXCONST_SGL(-0.07667808922205f)},
731 {FL2FXCONST_SGL(0.41881284182683f), FL2FXCONST_SGL(0.02188098922282f)},
732 {FL2FXCONST_SGL(-0.86135454941237f), FL2FXCONST_SGL(0.98947480909359f)},
733 {FL2FXCONST_SGL(0.67226861393788f), FL2FXCONST_SGL(-0.13494389011014f)},
734 {FL2FXCONST_SGL(-0.70737398842068f), FL2FXCONST_SGL(-0.76547349325992f)},
735 {FL2FXCONST_SGL(0.94044946687963f), FL2FXCONST_SGL(0.09026201157416f)},
736 {FL2FXCONST_SGL(-0.82386352534327f), FL2FXCONST_SGL(0.08924768823676f)},
737 {FL2FXCONST_SGL(-0.32070666698656f), FL2FXCONST_SGL(0.50143421908753f)},
738 {FL2FXCONST_SGL(0.57593163224487f), FL2FXCONST_SGL(-0.98966422921509f)},
739 {FL2FXCONST_SGL(-0.36326018419965f), FL2FXCONST_SGL(0.07440243123228f)},
740 {FL2FXCONST_SGL(0.99979044674350f), FL2FXCONST_SGL(-0.14130287347405f)},
741 {FL2FXCONST_SGL(-0.92366023326932f), FL2FXCONST_SGL(-0.97979298068180f)},
742 {FL2FXCONST_SGL(-0.44607178518598f), FL2FXCONST_SGL(-0.54233252016394f)},
743 {FL2FXCONST_SGL(0.44226800932956f), FL2FXCONST_SGL(0.71326756742752f)},
744 {FL2FXCONST_SGL(0.03671907158312f), FL2FXCONST_SGL(0.63606389366675f)},
745 {FL2FXCONST_SGL(0.52175424682195f), FL2FXCONST_SGL(-0.85396826735705f)},
746 {FL2FXCONST_SGL(-0.94701139690956f), FL2FXCONST_SGL(-0.01826348194255f)},
747 {FL2FXCONST_SGL(-0.98759606946049f), FL2FXCONST_SGL(0.82288714303073f)},
748 {FL2FXCONST_SGL(0.87434794743625f), FL2FXCONST_SGL(0.89399495655433f)},
749 {FL2FXCONST_SGL(-0.93412041758744f), FL2FXCONST_SGL(0.41374052024363f)},
750 {FL2FXCONST_SGL(0.96063943315511f), FL2FXCONST_SGL(0.93116709541280f)},
751 {FL2FXCONST_SGL(0.97534253457837f), FL2FXCONST_SGL(0.86150930812689f)},
752 {FL2FXCONST_SGL(0.99642466504163f), FL2FXCONST_SGL(0.70190043427512f)},
753 {FL2FXCONST_SGL(-0.94705089665984f), FL2FXCONST_SGL(-0.29580042814306f)},
754 {FL2FXCONST_SGL(0.91599807087376f), FL2FXCONST_SGL(-0.98147830385781f)}};
1267755 //@}
1268756
1269757 /*
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
228228 stopMin = (((2 * 10000 * num) / fs) + 1) >> 1;
229229 }
230230 }
231
232 stopMin = fMin(stopMin, 64);
231233
232234 /*
233235 Choose a stop band between k1 and 64 depending on stopFreq (0..13),
522524 step = FL2FXCONST_DBL(0.0f);
523525 }
524526 }
525 return FX_DBL2FX_SGL(bandfactor << 1);
527 return (bandfactor >= FL2FXCONST_DBL(0.5)) ? (FIXP_SGL)MAXVAL_SGL
528 : FX_DBL2FX_SGL(bandfactor << 1);
526529 }
527530
528531 /*!
00 /* -----------------------------------------------------------------------------
11 Software License for The Fraunhofer FDK AAC Codec Library for Android
22
3 © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
3 © Copyright 1995 - 2020 Fraunhofer-Gesellschaft zur Förderung der angewandten
44 Forschung e.V. All rights reserved.
55
66 1. INTRODUCTION
142142 #include "env_extr.h"
143143 #include "sbr_dec.h"
144144 #include "env_dec.h"
145 #include "sbr_crc.h"
145 #include "FDK_crc.h"
146146 #include "sbr_ram.h"
147147 #include "sbr_rom.h"
148148 #include "lpp_tran.h"
149149 #include "transcendent.h"
150150
151 #include "FDK_crc.h"
152
153151 #include "sbrdec_drc.h"
154152
155153 #include "psbitdec.h"
156154
157155 /* Decoder library info */
158156 #define SBRDECODER_LIB_VL0 3
159 #define SBRDECODER_LIB_VL1 0
157 #define SBRDECODER_LIB_VL1 1
160158 #define SBRDECODER_LIB_VL2 0
161159 #define SBRDECODER_LIB_TITLE "SBR Decoder"
162 #ifdef __ANDROID__
160 #ifdef SUPPRESS_BUILD_DATE_INFO
163161 #define SBRDECODER_LIB_BUILD_DATE ""
164162 #define SBRDECODER_LIB_BUILD_TIME ""
165163 #else
618616 self->numSbrChannels -= self->pSbrElement[elementIndex]->nChannels;
619617 }
620618
621 /* Save element ID for sanity checks and to have a fallback for concealment.
622 */
623 self->pSbrElement[elementIndex]->elementID = elementID;
624
625619 /* Determine amount of channels for this element */
626620 switch (elementID) {
627621 case ID_NONE:
654648 }
655649
656650 /* Sanity check to avoid memory leaks */
657 if (elChannels < self->pSbrElement[elementIndex]->nChannels) {
651 if (elChannels < self->pSbrElement[elementIndex]->nChannels ||
652 (self->numSbrChannels + elChannels) > (8) + (1)) {
658653 self->numSbrChannels += self->pSbrElement[elementIndex]->nChannels;
659654 sbrError = SBRDEC_PARSE_ERROR;
660655 goto bail;
661656 }
662657
658 /* Save element ID for sanity checks and to have a fallback for concealment.
659 */
660 self->pSbrElement[elementIndex]->elementID = elementID;
663661 self->pSbrElement[elementIndex]->nChannels = elChannels;
664662
665663 for (ch = 0; ch < elChannels; ch++) {
870868 if (sbrError == SBRDEC_OK) {
871869 hSbrHeader->syncState = SBR_HEADER;
872870 hSbrHeader->status |= SBRDEC_HDR_STAT_UPDATE;
871 } else {
872 hSbrHeader->syncState = SBR_NOT_INITIALIZED;
873 hSbrHeader->status = HEADER_ERROR;
873874 }
874 /* else {
875 Since we already have overwritten the old SBR header the only way out
876 is UPSAMPLING! This will be prepared in the next step.
877 } */
878875 }
879876 }
880877 }
11341131 SBR_HEADER_STATUS headerStatus = HEADER_NOT_PRESENT;
11351132
11361133 INT startPos = FDKgetValidBits(hBs);
1137 INT CRCLen = 0;
1134 FDK_CRCINFO crcInfo;
1135 INT crcReg = 0;
1136 USHORT sbrCrc = 0;
1137 UINT crcPoly;
1138 UINT crcStartValue = 0;
1139 UINT crcLen;
1140
11381141 HANDLE_FDK_BITSTREAM hBsOriginal = hBs;
11391142 FDK_BITSTREAM bsBwd;
11401143
1141 FDK_CRCINFO crcInfo;
1142 INT crcReg = 0;
1143 USHORT drmSbrCrc = 0;
11441144 const int fGlobalIndependencyFlag = acFlags & AC_INDEP;
11451145 const int bs_pvc = acElFlags[elementIndex] & AC_EL_USAC_PVC;
11461146 const int bs_interTes = acElFlags[elementIndex] & AC_EL_USAC_ITES;
11471147 int stereo;
11481148 int fDoDecodeSbrData = 1;
1149 int alignBits = 0;
11491150
11501151 int lastSlot, lastHdrSlot = 0, thisHdrSlot = 0;
11511152
12771278 if (fDoDecodeSbrData) {
12781279 if (crcFlag) {
12791280 switch (self->coreCodec) {
1280 case AOT_ER_AAC_ELD:
1281 FDKpushFor(hBs, 10);
1282 /* check sbrcrc later: we don't know the payload length now */
1283 break;
12841281 case AOT_DRM_AAC:
12851282 case AOT_DRM_SURROUND:
1286 drmSbrCrc = (USHORT)FDKreadBits(hBs, 8);
1287 /* Setup CRC decoder */
1288 FDKcrcInit(&crcInfo, 0x001d, 0xFFFF, 8);
1289 /* Start CRC region */
1290 crcReg = FDKcrcStartReg(&crcInfo, hBs, 0);
1283 crcPoly = 0x001d;
1284 crcLen = 8;
1285 crcStartValue = 0x000000ff;
12911286 break;
12921287 default:
1293 CRCLen = bsPayLen - 10; /* change: 0 => i */
1294 if (CRCLen < 0) {
1295 fDoDecodeSbrData = 0;
1296 } else {
1297 fDoDecodeSbrData = SbrCrcCheck(hBs, CRCLen);
1298 }
1288 crcPoly = 0x0633;
1289 crcLen = 10;
1290 crcStartValue = 0x00000000;
12991291 break;
13001292 }
1293 sbrCrc = (USHORT)FDKreadBits(hBs, crcLen);
1294 /* Setup CRC decoder */
1295 FDKcrcInit(&crcInfo, crcPoly, crcStartValue, crcLen);
1296 /* Start CRC region */
1297 crcReg = FDKcrcStartReg(&crcInfo, hBs, 0);
13011298 }
13021299 } /* if (fDoDecodeSbrData) */
13031300
14501447 valBits = (INT)FDKgetValidBits(hBs);
14511448 }
14521449
1453 if (crcFlag) {
1454 switch (self->coreCodec) {
1455 case AOT_ER_AAC_ELD: {
1456 /* late crc check for eld */
1457 INT payloadbits =
1458 (INT)startPos - (INT)FDKgetValidBits(hBs) - startPos;
1459 INT crcLen = payloadbits - 10;
1460 FDKpushBack(hBs, payloadbits);
1461 fDoDecodeSbrData = SbrCrcCheck(hBs, crcLen);
1462 FDKpushFor(hBs, crcLen);
1463 } break;
1464 case AOT_DRM_AAC:
1465 case AOT_DRM_SURROUND:
1466 /* End CRC region */
1467 FDKcrcEndReg(&crcInfo, hBs, crcReg);
1468 /* Check CRC */
1469 if ((FDKcrcGetCRC(&crcInfo) ^ 0xFF) != drmSbrCrc) {
1470 fDoDecodeSbrData = 0;
1471 if (headerStatus != HEADER_NOT_PRESENT) {
1472 headerStatus = HEADER_ERROR;
1473 hSbrHeader->syncState = SBR_NOT_INITIALIZED;
1474 }
1475 }
1476 break;
1477 default:
1478 break;
1479 }
1480 }
1481
14821450 /* sanity check of remaining bits */
14831451 if (valBits < 0) {
14841452 fDoDecodeSbrData = 0;
14891457 case AOT_AAC_LC: {
14901458 /* This sanity check is only meaningful with General Audio
14911459 * bitstreams */
1492 int alignBits = valBits & 0x7;
1460 alignBits = valBits & 0x7;
14931461
14941462 if (valBits > alignBits) {
14951463 fDoDecodeSbrData = 0;
15061474 not parse the frame data. Return an error so that the caller can react
15071475 respectively. */
15081476 errorStatus = SBRDEC_PARSE_ERROR;
1477 }
1478
1479 if (crcFlag && (hSbrHeader->syncState >= SBR_HEADER) && fDoDecodeSbrData) {
1480 FDKpushFor(hBs, alignBits);
1481 FDKcrcEndReg(&crcInfo, hBs, crcReg); /* End CRC region */
1482 FDKpushBack(hBs, alignBits);
1483 /* Check CRC */
1484 if ((FDKcrcGetCRC(&crcInfo) ^ crcStartValue) != sbrCrc) {
1485 fDoDecodeSbrData = 0;
1486 if (headerStatus != HEADER_NOT_PRESENT) {
1487 headerStatus = HEADER_ERROR;
1488 hSbrHeader->syncState = SBR_NOT_INITIALIZED;
1489 }
1490 }
15091491 }
15101492
15111493 if (!fDoDecodeSbrData) {
15871569 * \return SBRDEC_OK if successfull, else error code
15881570 */
15891571 static SBR_ERROR sbrDecoder_DecodeElement(
1590 HANDLE_SBRDECODER self, QDOM_PCM *input, INT_PCM *timeData,
1591 const int timeDataSize, const FDK_channelMapDescr *const mapDescr,
1592 const int mapIdx, int channelIndex, const int elementIndex,
1593 const int numInChannels, int *numOutChannels, const int psPossible) {
1572 HANDLE_SBRDECODER self, LONG *input, LONG *timeData, const int timeDataSize,
1573 const FDK_channelMapDescr *const mapDescr, const int mapIdx,
1574 int channelIndex, const int elementIndex, const int numInChannels,
1575 int *numOutChannels, const int psPossible) {
15941576 SBR_DECODER_ELEMENT *hSbrElement = self->pSbrElement[elementIndex];
15951577 HANDLE_SBR_CHANNEL *pSbrChannel =
15961578 self->pSbrElement[elementIndex]->pSbrChannel;
17601742 timeData + offset1, strideOut, hSbrHeader, hFrameDataLeft,
17611743 &pSbrChannel[0]->prevFrameData,
17621744 (hSbrHeader->syncState == SBR_ACTIVE), h_ps_d, self->flags,
1763 codecFrameSize);
1745 codecFrameSize, self->sbrInDataHeadroom);
17641746
17651747 if (stereo) {
17661748 /* Process right channel */
17681750 timeData + offset1, NULL, NULL, strideOut, hSbrHeader,
17691751 hFrameDataRight, &pSbrChannel[1]->prevFrameData,
17701752 (hSbrHeader->syncState == SBR_ACTIVE), NULL, self->flags,
1771 codecFrameSize);
1753 codecFrameSize, self->sbrInDataHeadroom);
17721754 }
17731755
17741756 C_ALLOC_SCRATCH_END(pPsScratch, struct PS_DEC_COEFFICIENTS, 1)
17881770 int copyFrameSize =
17891771 codecFrameSize * self->pQmfDomain->QmfDomainOut->fb.no_channels;
17901772 copyFrameSize /= self->pQmfDomain->QmfDomainIn->fb.no_channels;
1791 INT_PCM *ptr;
1773 LONG *ptr;
17921774 INT i;
17931775 FDK_ASSERT(strideOut == 2);
17941776
17951777 ptr = timeData;
17961778 for (i = copyFrameSize >> 1; i--;) {
1797 INT_PCM tmp; /* This temporal variable is required because some
1798 compilers can't do *ptr++ = *ptr++ correctly. */
1779 LONG tmp; /* This temporal variable is required because some compilers
1780 can't do *ptr++ = *ptr++ correctly. */
17991781 tmp = *ptr++;
18001782 *ptr++ = tmp;
18011783 tmp = *ptr++;
18081790 return errorStatus;
18091791 }
18101792
1811 SBR_ERROR sbrDecoder_Apply(HANDLE_SBRDECODER self, INT_PCM *input,
1812 INT_PCM *timeData, const int timeDataSize,
1813 int *numChannels, int *sampleRate,
1793 SBR_ERROR sbrDecoder_Apply(HANDLE_SBRDECODER self, LONG *input, LONG *timeData,
1794 const int timeDataSize, int *numChannels,
1795 int *sampleRate,
18141796 const FDK_channelMapDescr *const mapDescr,
18151797 const int mapIdx, const int coreDecodedOk,
1816 UCHAR *psDecoded) {
1798 UCHAR *psDecoded, const INT inDataHeadroom,
1799 INT *outDataHeadroom) {
18171800 SBR_ERROR errorStatus = SBRDEC_OK;
18181801
18191802 int psPossible;
18491832 if (self->numSbrElements != 1 || self->pSbrElement[0]->elementID != ID_SCE) {
18501833 psPossible = 0;
18511834 }
1835
1836 self->sbrInDataHeadroom = inDataHeadroom;
1837 *outDataHeadroom = (INT)(8);
18521838
18531839 /* Make sure that even if no SBR data was found/parsed *psDecoded is returned
18541840 * 1 if psPossible was 0. */
25592559 info->version =
25602560 LIB_VERSION(SBRENCODER_LIB_VL0, SBRENCODER_LIB_VL1, SBRENCODER_LIB_VL2);
25612561 LIB_VERSION_STRING(info);
2562 #ifdef __ANDROID__
2562 #ifdef SUPPRESS_BUILD_DATE_INFO
25632563 info->build_date = "";
25642564 info->build_time = "";
25652565 #else