From 381d69840ad3af2259f0b7ef49236f9ee9c76b76 Mon Sep 17 00:00:00 2001 From: Jean-Michel Trivi Date: Sun, 9 Sep 2012 11:48:51 -0700 Subject: Bug fixes in AAC decoder, AAC encoder, FDK library Latest code drop from Fraunhofer: * AAC-Decoder - Expanded AAC-LD/ELD decoder TNS max band tables to avoid wrong data access for sampling rates <22kHz and >48kHz. Modified file(s): libAACdec\src\aacdec_tns.cpp libAACdec\src\aac_rom.h libAACdec\src\aac_rom.cpp - Fixed ELD synthesis QMF filterbank scaling for downsampled SBR. Modified file(s): libFDK\src\qmf.cpp * AAC-Encoder - Fixed bit rate limiting for lower limit as introduced in the Delivery 2012-05-11. Modified file(s): libAACenc\include\aacenc_lib.h libAACenc\src\aacenc.h libAACenc\src\aacenc.cpp libSBRenc\src\sbr_rom.h libSBRenc\src\sbr_rom.cpp - Allow negative prediction gain as meaning that there is no coding gain. Make use of scaleValueSaturate in gauss window calculation. Modified file(s): libAACenc\src\aacenc_tns.cpp - Added energy saturation to prevent overflow in short blocks. Modified file(s): libAACenc\src\grp_data.cpp - Perform scalefactor adaption in case quantized lines are out of valid range. Modified file(s): libAACenc\src\quantize.cpp - Interrupt quantization loop when no spectral data is available. Adjustments in bitreservoir adaption. Modified file(s): libAACenc\src\qc_main.cpp - Indroduced dynamic scaling in none missing harmonic energy lowering compensation. Modified file(s): libSBRenc\src\env_est.cpp * FDK-Library - Fixed saturation for negative values in scaleValueSaturate. Modified file(s): libFDK\include\scale.h Change-Id: If830ea65caef6b5554281e4b7a77a8b2e08825ce --- libFDK/include/common_fix.h | 2 -- libFDK/include/mips/cplx_mul.h | 28 ++++++++++++++++++++++++---- libFDK/include/mips/fixmul_mips.h | 8 +++++++- libFDK/include/scale.h | 10 +++++++++- 4 files changed, 40 insertions(+), 8 deletions(-) (limited to 'libFDK/include') diff --git a/libFDK/include/common_fix.h b/libFDK/include/common_fix.h index 83d4ba3..a39548e 100644 --- a/libFDK/include/common_fix.h +++ b/libFDK/include/common_fix.h @@ -225,7 +225,6 @@ FDK_INLINE FIXP_DBL fAbs(FIXP_DBL x) FDK_INLINE FIXP_SGL fAbs(FIXP_SGL x) { return fixabs_S(x); } - /* workaround for TI C6x compiler but not for TI ARM9E compiler */ #if (!defined(__TI_COMPILER_VERSION__) || defined(__TI_TMS470_V5__)) && !defined(__x86_64__) FDK_INLINE INT fAbs(INT x) @@ -336,7 +335,6 @@ FDK_INLINE FIXP_SGL fMin(FIXP_SGL a, FIXP_SGL b) FDK_INLINE FIXP_SGL fMax(FIXP_SGL a, FIXP_SGL b) { return fixmax_S(a,b); } - /* workaround for TI C6x compiler but not for TI ARM9E */ #if ((!defined(__TI_COMPILER_VERSION__) || defined(__TI_TMS470_V5__)) && !defined(__x86_64__)) || (FIX_FRACT == 1) FDK_INLINE INT fMax(INT a, INT b) diff --git a/libFDK/include/mips/cplx_mul.h b/libFDK/include/mips/cplx_mul.h index 4e8f26f..e0781dd 100644 --- a/libFDK/include/mips/cplx_mul.h +++ b/libFDK/include/mips/cplx_mul.h @@ -108,9 +108,20 @@ inline void cplxMultDiv2( FIXP_DBL *c_Re, FIXP_DBL b_Im) { INT result; - result = (((long long)a_Re * b_Re) - ((long long) a_Im * b_Im)) >> 32; + + __asm__ ("mult %[a_Re], %[b_Re];\n" + "msub %[a_Im], %[b_Im];\n" + : "=hi"(result) + : [a_Re]"r"(a_Re), [b_Re]"r"(b_Re), [a_Im]"r"(a_Im), [b_Im]"r"(b_Im) + : "lo"); + *c_Re = result; - result = (((long long)a_Re * b_Im) - ((long long) a_Im * b_Re)) >> 32; + + __asm__ ("mult %[a_Re], %[b_Im];\n" + "madd %[a_Im], %[b_Re];\n" + : "=hi"(result) + : [a_Re]"r"(a_Re), [b_Im]"r"(b_Im), [a_Im]"r"(a_Im), [b_Re]"r"(b_Re) + : "lo"); *c_Im = result; } #endif @@ -124,9 +135,18 @@ inline void cplxMult( FIXP_DBL *c_Re, FIXP_DBL b_Im) { INT result; - result = (((long long)a_Re * b_Re) - ((long long) a_Im * b_Im)) >> 32; + __asm__ ("mult %[a_Re], %[b_Re];\n" + "msub %[a_Im], %[b_Im];\n" + : "=hi"(result) + : [a_Re]"r"(a_Re), [b_Re]"r"(b_Re), [a_Im]"r"(a_Im), [b_Im]"r"(b_Im) + : "lo"); *c_Re = result<<1; - result = (((long long)a_Re * b_Im) - ((long long) a_Im * b_Re)) >> 32; + + __asm__ ("mult %[a_Re], %[b_Im];\n" + "madd %[a_Im], %[b_Re];\n" + : "=hi"(result) + : [a_Re]"r"(a_Re), [b_Im]"r"(b_Im), [a_Im]"r"(a_Im), [b_Re]"r"(b_Re) + : "lo"); *c_Im = result<<1; } #endif diff --git a/libFDK/include/mips/fixmul_mips.h b/libFDK/include/mips/fixmul_mips.h index 0e7af0d..4fb72f7 100644 --- a/libFDK/include/mips/fixmul_mips.h +++ b/libFDK/include/mips/fixmul_mips.h @@ -100,8 +100,14 @@ amm-info@iis.fraunhofer.de inline INT fixmuldiv2_DD (const INT a, const INT b) { + INT result ; - return ((long long) a * b) >> 32; + asm ("mult %1,%2;\n" + : "=hi" (result) + : "d" (a), "r" (b) + : "lo"); + + return result ; } #endif /* (__GNUC__) && defined(__mips__) */ diff --git a/libFDK/include/scale.h b/libFDK/include/scale.h index fcb6c48..d60ed2c 100644 --- a/libFDK/include/scale.h +++ b/libFDK/include/scale.h @@ -148,12 +148,20 @@ FIXP_DBL scaleValueSaturate( { if(scalefactor > 0) { if (fNorm(value) < scalefactor && value != (FIXP_DBL)0) { - return (FIXP_DBL)MAXVAL_DBL; + if (value > (FIXP_DBL)0) { + return (FIXP_DBL)MAXVAL_DBL; + } else { + return (FIXP_DBL)MINVAL_DBL; + } } else { return (value< scalefactor) { + return (FIXP_DBL)0; + } else { return (value>>(-scalefactor)); + } } } #endif -- cgit v1.2.3 From 1043598349977d71cf19cc9db0d09d3c0cbfb2f9 Mon Sep 17 00:00:00 2001 From: Keun young Park Date: Tue, 11 Sep 2012 17:28:46 -0700 Subject: fix mips build by reverting files back - MIPS still needs the work-around Change-Id: If68b2028bd2779ada79020bb333ec8817abe9429 --- libFDK/include/mips/cplx_mul.h | 28 ++++------------------------ libFDK/include/mips/fixmul_mips.h | 8 +------- 2 files changed, 5 insertions(+), 31 deletions(-) (limited to 'libFDK/include') diff --git a/libFDK/include/mips/cplx_mul.h b/libFDK/include/mips/cplx_mul.h index e0781dd..4e8f26f 100644 --- a/libFDK/include/mips/cplx_mul.h +++ b/libFDK/include/mips/cplx_mul.h @@ -108,20 +108,9 @@ inline void cplxMultDiv2( FIXP_DBL *c_Re, FIXP_DBL b_Im) { INT result; - - __asm__ ("mult %[a_Re], %[b_Re];\n" - "msub %[a_Im], %[b_Im];\n" - : "=hi"(result) - : [a_Re]"r"(a_Re), [b_Re]"r"(b_Re), [a_Im]"r"(a_Im), [b_Im]"r"(b_Im) - : "lo"); - + result = (((long long)a_Re * b_Re) - ((long long) a_Im * b_Im)) >> 32; *c_Re = result; - - __asm__ ("mult %[a_Re], %[b_Im];\n" - "madd %[a_Im], %[b_Re];\n" - : "=hi"(result) - : [a_Re]"r"(a_Re), [b_Im]"r"(b_Im), [a_Im]"r"(a_Im), [b_Re]"r"(b_Re) - : "lo"); + result = (((long long)a_Re * b_Im) - ((long long) a_Im * b_Re)) >> 32; *c_Im = result; } #endif @@ -135,18 +124,9 @@ inline void cplxMult( FIXP_DBL *c_Re, FIXP_DBL b_Im) { INT result; - __asm__ ("mult %[a_Re], %[b_Re];\n" - "msub %[a_Im], %[b_Im];\n" - : "=hi"(result) - : [a_Re]"r"(a_Re), [b_Re]"r"(b_Re), [a_Im]"r"(a_Im), [b_Im]"r"(b_Im) - : "lo"); + result = (((long long)a_Re * b_Re) - ((long long) a_Im * b_Im)) >> 32; *c_Re = result<<1; - - __asm__ ("mult %[a_Re], %[b_Im];\n" - "madd %[a_Im], %[b_Re];\n" - : "=hi"(result) - : [a_Re]"r"(a_Re), [b_Im]"r"(b_Im), [a_Im]"r"(a_Im), [b_Re]"r"(b_Re) - : "lo"); + result = (((long long)a_Re * b_Im) - ((long long) a_Im * b_Re)) >> 32; *c_Im = result<<1; } #endif diff --git a/libFDK/include/mips/fixmul_mips.h b/libFDK/include/mips/fixmul_mips.h index 4fb72f7..0e7af0d 100644 --- a/libFDK/include/mips/fixmul_mips.h +++ b/libFDK/include/mips/fixmul_mips.h @@ -100,14 +100,8 @@ amm-info@iis.fraunhofer.de inline INT fixmuldiv2_DD (const INT a, const INT b) { - INT result ; - asm ("mult %1,%2;\n" - : "=hi" (result) - : "d" (a), "r" (b) - : "lo"); - - return result ; + return ((long long) a * b) >> 32; } #endif /* (__GNUC__) && defined(__mips__) */ -- cgit v1.2.3 From 6ab36997af5d5acda4f21d33031f4e45c85f96b7 Mon Sep 17 00:00:00 2001 From: Jean-Michel Trivi Date: Tue, 2 Oct 2012 10:16:04 -0700 Subject: Bug 7170947 Update AAC codec From Fraunhofer: * AAC Decoder - Stick to the written MPEG standard instead of the MPEG reference software in terms of reference level normalization. Always set the program reference level equal to the target level. This disables level normalization using a default level for streams without embedded metadata. Modified file(s): libAACdec\src\aacdec_drc.cpp - Fix downmix channel assignment when using a WAV output channel ordering. Modified file(s): libPCMutils\src\pcmutils_lib.cpp - Retain signal accuracy and prevent LSB alteration when no level correction needs to be done. Modified file(s): libAACdec\src\aacdec_drc.h libAACdec\src\aacdec_drc.cpp libSBRdec\src\sbrdecoder.cpp libSBRdec\src\sbr_dec.cpp libSBRdec\src\sbrdec_drc.cpp - Align metadata processing with reference implementation. Modified file(s): libAACdec\src\aacdec_drc.h libAACdec\src\aacdecoder.cpp * AAC-Encoder - Prevent potential overflow in energy calculation after TNS processing. Modified file(s): libAACenc\src\band_nrg.cpp - Added saturation for number of relevant lines which are used in pe calculation. Modified file(s): libAACenc\src\line_pe.cpp - Removed obsolete files. Deleded file(s): libAACenc\src\tns_param.h libAACenc\src\tns_param.cpp * FDK-Library - Added x86 Count Leading Zeros intrinsic. Modified file(s): libFDK\include\clz.h Added file(s): libFDK\include\x86\clz_x86.h - Fixed compilation for MIPS GCC-4.4 and higher. Modified file(s): libFDK\include\mips\cplx_mul.h libFDK\include\mips\fixmul_mips.h Change-Id: I4be65f07f88d412224c7fddc3f054e8f451176cc --- documentation/aacDecoder.pdf | 2434 ++++++++++++++++++------------------- documentation/aacEncoder.pdf | 12 +- libAACdec/src/aacdec_drc.cpp | 38 +- libAACdec/src/aacdec_drc.h | 5 +- libAACdec/src/aacdecoder.cpp | 15 +- libAACdec/src/aacdecoder_lib.cpp | 2 +- libAACenc/src/aacenc_lib.cpp | 2 +- libAACenc/src/band_nrg.cpp | 14 +- libAACenc/src/line_pe.cpp | 2 + libAACenc/src/tns_param.cpp | 93 -- libAACenc/src/tns_param.h | 96 -- libFDK/include/FDK_archdef.h | 1 - libFDK/include/clz.h | 3 + libFDK/include/mips/cplx_mul.h | 39 +- libFDK/include/mips/fixmul_mips.h | 7 +- libFDK/include/x86/clz_x86.h | 154 +++ libFDK/src/FDK_core.cpp | 2 +- libPCMutils/src/pcmutils_lib.cpp | 13 +- libSBRdec/src/sbr_dec.cpp | 18 +- libSBRdec/src/sbrdec_drc.cpp | 37 +- libSBRdec/src/sbrdec_drc.h | 1 + libSBRdec/src/sbrdecoder.cpp | 19 +- 22 files changed, 1530 insertions(+), 1477 deletions(-) delete mode 100644 libAACenc/src/tns_param.cpp delete mode 100644 libAACenc/src/tns_param.h create mode 100644 libFDK/include/x86/clz_x86.h (limited to 'libFDK/include') diff --git a/documentation/aacDecoder.pdf b/documentation/aacDecoder.pdf index 0d42e79..a8cee17 100644 --- a/documentation/aacDecoder.pdf +++ b/documentation/aacDecoder.pdf @@ -586,15 +586,15 @@ endobj << /S /GoTo /D [390 0 R /Fit ] >> endobj 394 0 obj << -/Length 954 +/Length 956 /Filter /FlateDecode >> stream -xڅV[6~fj, MߜlgI5yЂ0jArXg{tۉΘsUGcw ?_ (QpJb]%Q/Y$s+҉(B渜ثG;&إ]^9,Vo H7kDݔ)Et?m`3Y:Ym?c-?>ZȣwR5/(0OY3j%1`,/t$8ݒx<&O'\A!mC ^I%OO0eEAy' \{/rXOJpYYr\_ɾuwcy?Q?{{U/}tIˢCpF, z([Հs(#hG-63>V-(\Ǐs0JKZ~7)}텙)Qa2Om.W.[cN?V9)h -1% - -X߯JQ& PuLs+QgF(HbjU=&wU`PP^< Ӫ1HeD.^&`rǒ3n]&q b sj5LsO+}jZOVS1mq78>< +u[RFK_S<,W;5 z`89 {]_KWX[0?1mn-%dF܉j -D֖\\w4N\̙j*.\h\KΤ 8lhh9f%=Ww{jQ:u~'Vv>,vÉ^ ==k Ѫ Oڰal\nq[]اHu^vc)ds;!ׁI&7oE +xڅVKs6WHT\KIq;i["Z`AЊx5ψ}|(8(xBMI$΃*گYe8+Ҋr3̒jfo$o7î +jgq- +mI~AYq‡~Kw|5'G5Sџ%8Q`Qf$1`4+yW;;<"Of\B>(ֳp׏:%y7'rϏpJ~x] !L9ywaBoDcΡ,^Wޡ߫B}飝m\E曕y[D+PĨ|8S9 mI'qbk<,EJP\շq=mT^~*J!/rzq9Q1c\ȁU U)ziGxTK x͝h*iW|tT-3sBy$VN^GH)#BsElP +/uiÚhlշEE^2ŸmraitI32j7EQzùTA{#{7yx2Hz})U65[{'1٘d.ZGҹ$< #RFzKWš#b@ݛAێ6 {8d{,4=zLFWo>o-xFt8!Lbm6YOwߙ˽9s@܅k#+5pɈ0Ӛ"c M[۞}.nZOMءZR9myҖ'TI3]ra`hb +}kL9o]Vil\+YzlW~qcx|afq^||pX[G4 endstream endobj 390 0 obj << @@ -8995,8 +8995,8 @@ endobj >> endobj 1403 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.10)/Keywords() -/CreationDate (D:20120817135834+02'00') -/ModDate (D:20120817135834+02'00') +/CreationDate (D:20120927161848+02'00') +/ModDate (D:20120927161848+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-1.40.10-2.2 (TeX Live 2009/Debian) kpathsea version 5.0.0) >> endobj @@ -9004,1413 +9004,1413 @@ xref 0 1404 0000000000 65535 f 0000000015 00000 n -0000183151 00000 n -0000506332 00000 n +0000183153 00000 n +0000506334 00000 n 0000000060 00000 n 0000000146 00000 n -0000183320 00000 n -0000506262 00000 n +0000183322 00000 n +0000506264 00000 n 0000000193 00000 n 0000000244 00000 n -0000183437 00000 n -0000506191 00000 n +0000183439 00000 n +0000506193 00000 n 0000000291 00000 n 0000000391 00000 n -0000187368 00000 n -0000506066 00000 n +0000187370 00000 n +0000506068 00000 n 0000000437 00000 n 0000000532 00000 n -0000187538 00000 n -0000505992 00000 n +0000187540 00000 n +0000505994 00000 n 0000000580 00000 n 0000000685 00000 n -0000187655 00000 n -0000505905 00000 n +0000187657 00000 n +0000505907 00000 n 0000000733 00000 n 0000000843 00000 n -0000193760 00000 n -0000505831 00000 n +0000193762 00000 n +0000505833 00000 n 0000000891 00000 n 0000000986 00000 n -0000222466 00000 n -0000505705 00000 n +0000222468 00000 n +0000505707 00000 n 0000001032 00000 n 0000001165 00000 n -0000222636 00000 n -0000505631 00000 n +0000222638 00000 n +0000505633 00000 n 0000001213 00000 n 0000001434 00000 n -0000222754 00000 n -0000505544 00000 n +0000222756 00000 n +0000505546 00000 n 0000001482 00000 n 0000001681 00000 n -0000222872 00000 n -0000505433 00000 n +0000222874 00000 n +0000505435 00000 n 0000001729 00000 n 0000001882 00000 n -0000228898 00000 n -0000505359 00000 n +0000228900 00000 n +0000505361 00000 n 0000001935 00000 n 0000001992 00000 n -0000229016 00000 n -0000505272 00000 n +0000229018 00000 n +0000505274 00000 n 0000002045 00000 n 0000002135 00000 n -0000231745 00000 n -0000505198 00000 n +0000231747 00000 n +0000505200 00000 n 0000002188 00000 n 0000002324 00000 n -0000234296 00000 n -0000505072 00000 n +0000234298 00000 n +0000505074 00000 n 0000002370 00000 n 0000002490 00000 n -0000234471 00000 n -0000504974 00000 n +0000234473 00000 n +0000504976 00000 n 0000002538 00000 n 0000002610 00000 n -0000234584 00000 n -0000504900 00000 n +0000234586 00000 n +0000504902 00000 n 0000002663 00000 n 0000002788 00000 n -0000234697 00000 n -0000504826 00000 n +0000234699 00000 n +0000504828 00000 n 0000002841 00000 n 0000002961 00000 n -0000237268 00000 n -0000504700 00000 n +0000237270 00000 n +0000504702 00000 n 0000003007 00000 n 0000003092 00000 n -0000237324 00000 n -0000504639 00000 n +0000237326 00000 n +0000504641 00000 n 0000003140 00000 n 0000003220 00000 n -0000239489 00000 n -0000504513 00000 n +0000239491 00000 n +0000504515 00000 n 0000003266 00000 n 0000003346 00000 n -0000239545 00000 n -0000504452 00000 n +0000239547 00000 n +0000504454 00000 n 0000003394 00000 n 0000003469 00000 n -0000245205 00000 n -0000504325 00000 n +0000245207 00000 n +0000504327 00000 n 0000003515 00000 n 0000003640 00000 n -0000245318 00000 n -0000504226 00000 n +0000245320 00000 n +0000504228 00000 n 0000003688 00000 n 0000003861 00000 n -0000245431 00000 n -0000504150 00000 n +0000245433 00000 n +0000504152 00000 n 0000003914 00000 n 0000004045 00000 n -0000246768 00000 n -0000504033 00000 n +0000246770 00000 n +0000504035 00000 n 0000004099 00000 n 0000004258 00000 n -0000246882 00000 n -0000503954 00000 n +0000246884 00000 n +0000503956 00000 n 0000004317 00000 n 0000004410 00000 n -0000247001 00000 n -0000503861 00000 n +0000247003 00000 n +0000503863 00000 n 0000004469 00000 n 0000004587 00000 n -0000247120 00000 n -0000503768 00000 n +0000247122 00000 n +0000503770 00000 n 0000004646 00000 n 0000004689 00000 n -0000247239 00000 n -0000503675 00000 n +0000247241 00000 n +0000503677 00000 n 0000004748 00000 n 0000004811 00000 n -0000247358 00000 n -0000503582 00000 n +0000247360 00000 n +0000503584 00000 n 0000004870 00000 n 0000004963 00000 n -0000247477 00000 n -0000503489 00000 n +0000247479 00000 n +0000503491 00000 n 0000005022 00000 n 0000005090 00000 n -0000247596 00000 n -0000503396 00000 n +0000247598 00000 n +0000503398 00000 n 0000005149 00000 n 0000005207 00000 n -0000247715 00000 n -0000503303 00000 n +0000247717 00000 n +0000503305 00000 n 0000005266 00000 n 0000005369 00000 n -0000247834 00000 n -0000503210 00000 n +0000247836 00000 n +0000503212 00000 n 0000005428 00000 n 0000005481 00000 n -0000247953 00000 n -0000503117 00000 n +0000247955 00000 n +0000503119 00000 n 0000005541 00000 n 0000005614 00000 n -0000249694 00000 n -0000503024 00000 n +0000249696 00000 n +0000503026 00000 n 0000005674 00000 n 0000005787 00000 n -0000249808 00000 n -0000502931 00000 n +0000249810 00000 n +0000502933 00000 n 0000005847 00000 n 0000005930 00000 n -0000249927 00000 n -0000502838 00000 n +0000249929 00000 n +0000502840 00000 n 0000005990 00000 n 0000006073 00000 n -0000250041 00000 n -0000502745 00000 n +0000250043 00000 n +0000502747 00000 n 0000006133 00000 n 0000006251 00000 n -0000250155 00000 n -0000502652 00000 n +0000250157 00000 n +0000502654 00000 n 0000006311 00000 n 0000006434 00000 n -0000250268 00000 n -0000502559 00000 n +0000250270 00000 n +0000502561 00000 n 0000006494 00000 n 0000006587 00000 n -0000250387 00000 n -0000502466 00000 n +0000250389 00000 n +0000502468 00000 n 0000006647 00000 n 0000006750 00000 n -0000250506 00000 n -0000502373 00000 n +0000250508 00000 n +0000502375 00000 n 0000006810 00000 n 0000006898 00000 n -0000250625 00000 n -0000502280 00000 n +0000250627 00000 n +0000502282 00000 n 0000006958 00000 n 0000007021 00000 n -0000251706 00000 n -0000502201 00000 n +0000251708 00000 n +0000502203 00000 n 0000007081 00000 n 0000007159 00000 n -0000256951 00000 n -0000502083 00000 n +0000256953 00000 n +0000502085 00000 n 0000007206 00000 n 0000007327 00000 n -0000257065 00000 n -0000501965 00000 n +0000257067 00000 n +0000501967 00000 n 0000007376 00000 n 0000007568 00000 n -0000289845 00000 n -0000501886 00000 n +0000289847 00000 n +0000501888 00000 n 0000007622 00000 n 0000007753 00000 n -0000289902 00000 n -0000501754 00000 n +0000289904 00000 n +0000501756 00000 n 0000007807 00000 n 0000007938 00000 n -0000290016 00000 n -0000501675 00000 n +0000290018 00000 n +0000501677 00000 n 0000007997 00000 n 0000008098 00000 n -0000290133 00000 n -0000501582 00000 n +0000290135 00000 n +0000501584 00000 n 0000008157 00000 n 0000008258 00000 n -0000290252 00000 n -0000501489 00000 n +0000290254 00000 n +0000501491 00000 n 0000008317 00000 n 0000008408 00000 n -0000290365 00000 n -0000501396 00000 n +0000290367 00000 n +0000501398 00000 n 0000008467 00000 n 0000008553 00000 n -0000290483 00000 n -0000501303 00000 n +0000290485 00000 n +0000501305 00000 n 0000008612 00000 n 0000008721 00000 n -0000293226 00000 n -0000501210 00000 n +0000293228 00000 n +0000501212 00000 n 0000008780 00000 n 0000008879 00000 n -0000293345 00000 n -0000501131 00000 n +0000293347 00000 n +0000501133 00000 n 0000008938 00000 n 0000009047 00000 n -0000293402 00000 n -0000500999 00000 n +0000293404 00000 n +0000501001 00000 n 0000009101 00000 n 0000009237 00000 n -0000293516 00000 n -0000500934 00000 n +0000293518 00000 n +0000500936 00000 n 0000009296 00000 n 0000009412 00000 n -0000293573 00000 n -0000500802 00000 n +0000293575 00000 n +0000500804 00000 n 0000009466 00000 n 0000009650 00000 n -0000293687 00000 n -0000500723 00000 n +0000293689 00000 n +0000500725 00000 n 0000009709 00000 n 0000009828 00000 n -0000298544 00000 n -0000500644 00000 n +0000298546 00000 n +0000500646 00000 n 0000009887 00000 n 0000009978 00000 n -0000302537 00000 n -0000500525 00000 n +0000302539 00000 n +0000500527 00000 n 0000010032 00000 n 0000010173 00000 n -0000302651 00000 n -0000500446 00000 n +0000302653 00000 n +0000500448 00000 n 0000010232 00000 n 0000010368 00000 n -0000304424 00000 n -0000500353 00000 n +0000304426 00000 n +0000500355 00000 n 0000010427 00000 n 0000010568 00000 n -0000304538 00000 n -0000500260 00000 n +0000304540 00000 n +0000500262 00000 n 0000010627 00000 n 0000010738 00000 n -0000304651 00000 n -0000500167 00000 n +0000304653 00000 n +0000500169 00000 n 0000010797 00000 n 0000010928 00000 n -0000307030 00000 n -0000500074 00000 n +0000307032 00000 n +0000500076 00000 n 0000010987 00000 n 0000011128 00000 n -0000307144 00000 n -0000499981 00000 n +0000307146 00000 n +0000499983 00000 n 0000011187 00000 n 0000011293 00000 n -0000309114 00000 n -0000499888 00000 n +0000309116 00000 n +0000499890 00000 n 0000011352 00000 n 0000011498 00000 n -0000309227 00000 n -0000499795 00000 n +0000309229 00000 n +0000499797 00000 n 0000011557 00000 n 0000011693 00000 n -0000309340 00000 n -0000499702 00000 n +0000309342 00000 n +0000499704 00000 n 0000011752 00000 n 0000011903 00000 n -0000310994 00000 n -0000499609 00000 n +0000310996 00000 n +0000499611 00000 n 0000011963 00000 n 0000012069 00000 n -0000311110 00000 n -0000499530 00000 n +0000311112 00000 n +0000499532 00000 n 0000012129 00000 n 0000012255 00000 n -0000311225 00000 n -0000499412 00000 n +0000311227 00000 n +0000499414 00000 n 0000012304 00000 n 0000012453 00000 n -0000321806 00000 n -0000499333 00000 n +0000321808 00000 n +0000499335 00000 n 0000012507 00000 n 0000012638 00000 n -0000323786 00000 n -0000499201 00000 n +0000323788 00000 n +0000499203 00000 n 0000012692 00000 n 0000012823 00000 n -0000323903 00000 n -0000499122 00000 n +0000323905 00000 n +0000499124 00000 n 0000012882 00000 n 0000012976 00000 n -0000324019 00000 n -0000499029 00000 n +0000324021 00000 n +0000499031 00000 n 0000013035 00000 n 0000013134 00000 n -0000324133 00000 n -0000498936 00000 n +0000324135 00000 n +0000498938 00000 n 0000013193 00000 n 0000013282 00000 n -0000324248 00000 n -0000498843 00000 n +0000324250 00000 n +0000498845 00000 n 0000013341 00000 n 0000013445 00000 n -0000324365 00000 n -0000498750 00000 n +0000324367 00000 n +0000498752 00000 n 0000013504 00000 n 0000013590 00000 n -0000324482 00000 n -0000498671 00000 n +0000324484 00000 n +0000498673 00000 n 0000013649 00000 n 0000013743 00000 n -0000324540 00000 n -0000498539 00000 n +0000324542 00000 n +0000498541 00000 n 0000013797 00000 n 0000013938 00000 n -0000324656 00000 n -0000498474 00000 n +0000324658 00000 n +0000498476 00000 n 0000013997 00000 n 0000014045 00000 n -0000325729 00000 n -0000498355 00000 n +0000325731 00000 n +0000498357 00000 n 0000014099 00000 n 0000014240 00000 n -0000325845 00000 n -0000498276 00000 n +0000325847 00000 n +0000498278 00000 n 0000014299 00000 n 0000014372 00000 n -0000325961 00000 n -0000498183 00000 n +0000325963 00000 n +0000498185 00000 n 0000014431 00000 n 0000014514 00000 n -0000326077 00000 n -0000498090 00000 n +0000326079 00000 n +0000498092 00000 n 0000014573 00000 n 0000014621 00000 n -0000326194 00000 n -0000497997 00000 n +0000326196 00000 n +0000497999 00000 n 0000014680 00000 n 0000014751 00000 n -0000326311 00000 n -0000497904 00000 n +0000326313 00000 n +0000497906 00000 n 0000014810 00000 n 0000014878 00000 n -0000326427 00000 n -0000497811 00000 n +0000326429 00000 n +0000497813 00000 n 0000014937 00000 n 0000015015 00000 n -0000326544 00000 n -0000497718 00000 n +0000326546 00000 n +0000497720 00000 n 0000015074 00000 n 0000015142 00000 n -0000326661 00000 n -0000497625 00000 n +0000326663 00000 n +0000497627 00000 n 0000015201 00000 n 0000015292 00000 n -0000326777 00000 n -0000497532 00000 n +0000326779 00000 n +0000497534 00000 n 0000015351 00000 n 0000015444 00000 n -0000327613 00000 n -0000497439 00000 n +0000327615 00000 n +0000497441 00000 n 0000015504 00000 n 0000015602 00000 n -0000327730 00000 n -0000497360 00000 n +0000327732 00000 n +0000497362 00000 n 0000015662 00000 n 0000015730 00000 n -0000016817 00000 n -0000016951 00000 n -0000160274 00000 n -0000160402 00000 n +0000016819 00000 n +0000016953 00000 n +0000160276 00000 n +0000160404 00000 n 0000015782 00000 n -0000160345 00000 n -0000495352 00000 n -0000495708 00000 n -0000496064 00000 n -0000128677 00000 n -0000160742 00000 n -0000160623 00000 n -0000160523 00000 n -0000162004 00000 n -0000162155 00000 n -0000162309 00000 n -0000162461 00000 n -0000162611 00000 n -0000162764 00000 n -0000162918 00000 n -0000163072 00000 n -0000163223 00000 n -0000163377 00000 n -0000163531 00000 n -0000163685 00000 n -0000163844 00000 n -0000164003 00000 n -0000164162 00000 n -0000164313 00000 n -0000164467 00000 n -0000164626 00000 n -0000164785 00000 n -0000164936 00000 n -0000165089 00000 n -0000165240 00000 n -0000165394 00000 n -0000165544 00000 n -0000167322 00000 n -0000165754 00000 n -0000161681 00000 n -0000160783 00000 n -0000165697 00000 n -0000167481 00000 n -0000167640 00000 n -0000167800 00000 n -0000167964 00000 n -0000168127 00000 n -0000168291 00000 n -0000168455 00000 n -0000168618 00000 n -0000168781 00000 n -0000168945 00000 n -0000169109 00000 n -0000169273 00000 n -0000169438 00000 n -0000169603 00000 n -0000169768 00000 n -0000169933 00000 n -0000170097 00000 n -0000170262 00000 n -0000170426 00000 n -0000170591 00000 n -0000170755 00000 n -0000170920 00000 n -0000171071 00000 n -0000171225 00000 n -0000171384 00000 n -0000171543 00000 n -0000171707 00000 n -0000171870 00000 n -0000172034 00000 n -0000172198 00000 n -0000172362 00000 n -0000172526 00000 n -0000172690 00000 n -0000172849 00000 n -0000173012 00000 n -0000174770 00000 n -0000173170 00000 n -0000166903 00000 n -0000165839 00000 n -0000174934 00000 n -0000175098 00000 n -0000175257 00000 n -0000175421 00000 n -0000175585 00000 n -0000175749 00000 n -0000175913 00000 n -0000176076 00000 n -0000176240 00000 n -0000176403 00000 n -0000176566 00000 n -0000176730 00000 n -0000176894 00000 n -0000177059 00000 n -0000177213 00000 n -0000177371 00000 n -0000177529 00000 n -0000177693 00000 n -0000177857 00000 n -0000178021 00000 n -0000178185 00000 n -0000178349 00000 n -0000178513 00000 n -0000178672 00000 n -0000178836 00000 n -0000178995 00000 n -0000179159 00000 n -0000179322 00000 n -0000179486 00000 n -0000179649 00000 n -0000179811 00000 n -0000179975 00000 n -0000180138 00000 n -0000180302 00000 n -0000180466 00000 n -0000181154 00000 n -0000180630 00000 n -0000174351 00000 n -0000173255 00000 n -0000181319 00000 n -0000181015 00000 n -0000180715 00000 n -0000183493 00000 n -0000182976 00000 n -0000181404 00000 n -0000183095 00000 n -0000183206 00000 n -0000183263 00000 n -0000183375 00000 n -0000496182 00000 n -0000183980 00000 n -0000183805 00000 n -0000183578 00000 n -0000183924 00000 n -0000186261 00000 n -0000186421 00000 n -0000186573 00000 n -0000186732 00000 n -0000186926 00000 n -0000187119 00000 n -0000190724 00000 n -0000190876 00000 n -0000191071 00000 n -0000191524 00000 n -0000187882 00000 n -0000186082 00000 n -0000184052 00000 n -0000187312 00000 n -0000187424 00000 n -0000187481 00000 n -0000187594 00000 n -0000187711 00000 n -0000495178 00000 n -0000187768 00000 n -0000187825 00000 n -0000257008 00000 n -0000311168 00000 n -0000234352 00000 n -0000309397 00000 n -0000304594 00000 n -0000306974 00000 n -0000191718 00000 n -0000191913 00000 n -0000192108 00000 n -0000192302 00000 n -0000192453 00000 n -0000192648 00000 n -0000192798 00000 n -0000193168 00000 n -0000195150 00000 n -0000193816 00000 n -0000190466 00000 n -0000187980 00000 n -0000193363 00000 n -0000193419 00000 n -0000191298 00000 n -0000193476 00000 n -0000193532 00000 n -0000193589 00000 n -0000193646 00000 n -0000193703 00000 n -0000192984 00000 n -0000294054 00000 n -0000307087 00000 n -0000309284 00000 n -0000304481 00000 n -0000324077 00000 n -0000218031 00000 n -0000195016 00000 n -0000193914 00000 n -0000217913 00000 n -0000217969 00000 n -0000495034 00000 n -0000494600 00000 n -0000494745 00000 n -0000494889 00000 n -0000208039 00000 n -0000218608 00000 n -0000218433 00000 n -0000218203 00000 n -0000218552 00000 n -0000220670 00000 n -0000220829 00000 n -0000221214 00000 n -0000221442 00000 n -0000221669 00000 n -0000221864 00000 n -0000222057 00000 n -0000222216 00000 n -0000224943 00000 n -0000225170 00000 n -0000225624 00000 n -0000222989 00000 n -0000220467 00000 n -0000218680 00000 n -0000222410 00000 n -0000222522 00000 n -0000222579 00000 n -0000221022 00000 n -0000222692 00000 n -0000222810 00000 n -0000222928 00000 n -0000496300 00000 n -0000245261 00000 n -0000249865 00000 n -0000298601 00000 n -0000301983 00000 n -0000311052 00000 n -0000225784 00000 n -0000225977 00000 n -0000226170 00000 n -0000226361 00000 n -0000226587 00000 n -0000226779 00000 n -0000227007 00000 n -0000227461 00000 n -0000227619 00000 n -0000227811 00000 n -0000228004 00000 n -0000228196 00000 n -0000228423 00000 n -0000228651 00000 n -0000230269 00000 n -0000230497 00000 n -0000230952 00000 n -0000229133 00000 n -0000224660 00000 n -0000223074 00000 n -0000228842 00000 n -0000225397 00000 n -0000228954 00000 n -0000227235 00000 n -0000229072 00000 n -0000250444 00000 n -0000250325 00000 n -0000247891 00000 n -0000231112 00000 n -0000231305 00000 n -0000231498 00000 n -0000231801 00000 n -0000230082 00000 n -0000229231 00000 n -0000231689 00000 n -0000230725 00000 n -0000232307 00000 n -0000232132 00000 n -0000231899 00000 n -0000232251 00000 n -0000233751 00000 n -0000233903 00000 n -0000234088 00000 n -0000234753 00000 n -0000233596 00000 n -0000232379 00000 n -0000234240 00000 n -0000234409 00000 n -0000234527 00000 n -0000234640 00000 n -0000324598 00000 n -0000236184 00000 n -0000236009 00000 n -0000234851 00000 n -0000236128 00000 n -0000236898 00000 n -0000237058 00000 n -0000237380 00000 n -0000236751 00000 n -0000236269 00000 n -0000237212 00000 n -0000496418 00000 n -0000237868 00000 n -0000237693 00000 n -0000237465 00000 n -0000237812 00000 n -0000238648 00000 n -0000238809 00000 n -0000238963 00000 n -0000239114 00000 n -0000239279 00000 n -0000239601 00000 n -0000238477 00000 n -0000237940 00000 n -0000239433 00000 n -0000240086 00000 n -0000239911 00000 n -0000239686 00000 n -0000240030 00000 n -0000241277 00000 n -0000241471 00000 n -0000241665 00000 n -0000241859 00000 n -0000242052 00000 n -0000242246 00000 n -0000242439 00000 n -0000242633 00000 n -0000242827 00000 n -0000243021 00000 n -0000243215 00000 n -0000243409 00000 n -0000243603 00000 n -0000243796 00000 n -0000243990 00000 n -0000244184 00000 n -0000244376 00000 n -0000244568 00000 n -0000244762 00000 n -0000244956 00000 n -0000245487 00000 n -0000240986 00000 n -0000240158 00000 n -0000245149 00000 n -0000245374 00000 n -0000250682 00000 n -0000246825 00000 n -0000250563 00000 n -0000247058 00000 n -0000247296 00000 n -0000247177 00000 n -0000246939 00000 n -0000247534 00000 n -0000247653 00000 n -0000247772 00000 n -0000247415 00000 n -0000249984 00000 n -0000250211 00000 n -0000249751 00000 n -0000250098 00000 n -0000249637 00000 n -0000248010 00000 n -0000246593 00000 n -0000245611 00000 n -0000246712 00000 n -0000249387 00000 n -0000250743 00000 n -0000249248 00000 n -0000248095 00000 n -0000249581 00000 n -0000496536 00000 n -0000251492 00000 n -0000251763 00000 n -0000251353 00000 n -0000250854 00000 n -0000251650 00000 n -0000252433 00000 n -0000256828 00000 n -0000258677 00000 n -0000262114 00000 n -0000257122 00000 n -0000252299 00000 n -0000251850 00000 n -0000256895 00000 n -0000253343 00000 n -0000253473 00000 n -0000253613 00000 n -0000253900 00000 n -0000254305 00000 n -0000254509 00000 n -0000254530 00000 n -0000256806 00000 n -0000262181 00000 n -0000262341 00000 n -0000262535 00000 n -0000262729 00000 n -0000262924 00000 n -0000263119 00000 n -0000263313 00000 n -0000263508 00000 n -0000263703 00000 n -0000263898 00000 n -0000264093 00000 n -0000264320 00000 n -0000264547 00000 n -0000264774 00000 n -0000264997 00000 n -0000265222 00000 n -0000267279 00000 n -0000267506 00000 n -0000265732 00000 n -0000258403 00000 n -0000257248 00000 n -0000265448 00000 n -0000265504 00000 n -0000495884 00000 n -0000265561 00000 n -0000265618 00000 n -0000265675 00000 n -0000259340 00000 n -0000259470 00000 n -0000259610 00000 n -0000259861 00000 n -0000260225 00000 n -0000260429 00000 n -0000260450 00000 n -0000262092 00000 n -0000290540 00000 n -0000290422 00000 n -0000293283 00000 n -0000290073 00000 n -0000290190 00000 n -0000290309 00000 n -0000289959 00000 n -0000293459 00000 n -0000293630 00000 n -0000293744 00000 n -0000293806 00000 n -0000293868 00000 n -0000293930 00000 n -0000293992 00000 n -0000267733 00000 n -0000267956 00000 n -0000268183 00000 n -0000268410 00000 n -0000268636 00000 n -0000268863 00000 n -0000269090 00000 n -0000269317 00000 n -0000269544 00000 n -0000269771 00000 n -0000269998 00000 n -0000270225 00000 n -0000270452 00000 n -0000270679 00000 n -0000270906 00000 n -0000271133 00000 n -0000271359 00000 n -0000271584 00000 n -0000271811 00000 n -0000272038 00000 n -0000272265 00000 n -0000272492 00000 n -0000272718 00000 n -0000272945 00000 n -0000273172 00000 n -0000273398 00000 n -0000273625 00000 n -0000273851 00000 n -0000274078 00000 n -0000274305 00000 n -0000274531 00000 n -0000274758 00000 n -0000274983 00000 n -0000275176 00000 n -0000275403 00000 n -0000275630 00000 n -0000275856 00000 n -0000278659 00000 n -0000278886 00000 n -0000279113 00000 n -0000276138 00000 n -0000266836 00000 n -0000265884 00000 n -0000276082 00000 n -0000294116 00000 n -0000294178 00000 n -0000294240 00000 n -0000294302 00000 n -0000294364 00000 n -0000294426 00000 n -0000294488 00000 n -0000294550 00000 n -0000294611 00000 n -0000294673 00000 n -0000294735 00000 n -0000294797 00000 n -0000297125 00000 n -0000297187 00000 n -0000297249 00000 n -0000297311 00000 n -0000297372 00000 n -0000297434 00000 n -0000297496 00000 n -0000297558 00000 n -0000297620 00000 n -0000297682 00000 n -0000297744 00000 n -0000297806 00000 n -0000297868 00000 n -0000297930 00000 n -0000297992 00000 n -0000298054 00000 n -0000298116 00000 n -0000298178 00000 n -0000298240 00000 n -0000298302 00000 n -0000298364 00000 n -0000298426 00000 n -0000298487 00000 n -0000301859 00000 n -0000301921 00000 n -0000279340 00000 n -0000279566 00000 n -0000279793 00000 n -0000280020 00000 n -0000280247 00000 n -0000280474 00000 n -0000280668 00000 n -0000280863 00000 n -0000281056 00000 n -0000281251 00000 n -0000281446 00000 n -0000281639 00000 n -0000281834 00000 n -0000282028 00000 n -0000282415 00000 n -0000282608 00000 n -0000282803 00000 n -0000282998 00000 n -0000283387 00000 n -0000283582 00000 n -0000283777 00000 n -0000283972 00000 n -0000284167 00000 n -0000284360 00000 n -0000284546 00000 n -0000284737 00000 n -0000284928 00000 n -0000285120 00000 n -0000285315 00000 n -0000285510 00000 n -0000287718 00000 n -0000287913 00000 n -0000286011 00000 n -0000278240 00000 n -0000276236 00000 n -0000285898 00000 n -0000285954 00000 n -0000282223 00000 n -0000283193 00000 n -0000285705 00000 n -0000302045 00000 n -0000302103 00000 n -0000302165 00000 n -0000302227 00000 n -0000302289 00000 n -0000302351 00000 n -0000302413 00000 n -0000302475 00000 n -0000304367 00000 n -0000302594 00000 n -0000309057 00000 n -0000326019 00000 n -0000288108 00000 n -0000288268 00000 n -0000288461 00000 n -0000288656 00000 n -0000288815 00000 n -0000289010 00000 n -0000289205 00000 n -0000289400 00000 n -0000289595 00000 n -0000290596 00000 n -0000287499 00000 n -0000286122 00000 n -0000289789 00000 n -0000495528 00000 n -0000496654 00000 n -0000309171 00000 n -0000292781 00000 n -0000294859 00000 n -0000292634 00000 n -0000290733 00000 n -0000293170 00000 n -0000292976 00000 n -0000298663 00000 n -0000296950 00000 n -0000294983 00000 n -0000297069 00000 n -0000302708 00000 n -0000301684 00000 n -0000298761 00000 n -0000301803 00000 n -0000304708 00000 n -0000304192 00000 n -0000302819 00000 n -0000304311 00000 n -0000307201 00000 n -0000306799 00000 n -0000304819 00000 n -0000306918 00000 n -0000308682 00000 n -0000308841 00000 n -0000309453 00000 n -0000308535 00000 n -0000307312 00000 n -0000309001 00000 n -0000496772 00000 n -0000310770 00000 n -0000312778 00000 n -0000317978 00000 n -0000311283 00000 n -0000310628 00000 n -0000309565 00000 n -0000310936 00000 n -0000318045 00000 n -0000318232 00000 n -0000318419 00000 n -0000318606 00000 n -0000318793 00000 n -0000318980 00000 n -0000319167 00000 n -0000319354 00000 n -0000319541 00000 n -0000319728 00000 n -0000319914 00000 n -0000320101 00000 n -0000320287 00000 n -0000320473 00000 n -0000320659 00000 n -0000320846 00000 n -0000321032 00000 n -0000321218 00000 n -0000321405 00000 n -0000321864 00000 n -0000312458 00000 n -0000311395 00000 n -0000321571 00000 n -0000321629 00000 n -0000321688 00000 n -0000321747 00000 n -0000314214 00000 n -0000314345 00000 n -0000314488 00000 n -0000314793 00000 n -0000315216 00000 n -0000315422 00000 n -0000315444 00000 n -0000317955 00000 n -0000323961 00000 n -0000324306 00000 n -0000324423 00000 n -0000323844 00000 n -0000324189 00000 n -0000326719 00000 n -0000327554 00000 n -0000325902 00000 n -0000326485 00000 n -0000326602 00000 n -0000327671 00000 n -0000325787 00000 n -0000326135 00000 n -0000326252 00000 n -0000326368 00000 n -0000323532 00000 n -0000324714 00000 n -0000323389 00000 n -0000321991 00000 n -0000323728 00000 n -0000326835 00000 n -0000325549 00000 n -0000324826 00000 n -0000325671 00000 n -0000327788 00000 n -0000327374 00000 n -0000326934 00000 n -0000327496 00000 n -0000329258 00000 n -0000329409 00000 n -0000329559 00000 n -0000329710 00000 n -0000329861 00000 n -0000330012 00000 n -0000330163 00000 n -0000330314 00000 n -0000330465 00000 n -0000330615 00000 n -0000330766 00000 n -0000330917 00000 n -0000331068 00000 n -0000331219 00000 n -0000331370 00000 n -0000331520 00000 n -0000331671 00000 n -0000331822 00000 n -0000331973 00000 n -0000332124 00000 n -0000332275 00000 n -0000332426 00000 n -0000332576 00000 n -0000332727 00000 n -0000332878 00000 n -0000333029 00000 n -0000333180 00000 n -0000333331 00000 n -0000333482 00000 n -0000333633 00000 n -0000333784 00000 n -0000333935 00000 n -0000334086 00000 n -0000334237 00000 n -0000334388 00000 n -0000334539 00000 n -0000334689 00000 n -0000334840 00000 n -0000334991 00000 n -0000335142 00000 n -0000335292 00000 n -0000335443 00000 n -0000335594 00000 n -0000337900 00000 n -0000335803 00000 n -0000328736 00000 n -0000327874 00000 n -0000335745 00000 n -0000496895 00000 n -0000338051 00000 n -0000338202 00000 n -0000338353 00000 n -0000338503 00000 n -0000338653 00000 n -0000338804 00000 n -0000338955 00000 n -0000339106 00000 n -0000339257 00000 n -0000339408 00000 n -0000339559 00000 n -0000339710 00000 n -0000339861 00000 n -0000340012 00000 n -0000340163 00000 n -0000340314 00000 n -0000340465 00000 n -0000340616 00000 n -0000340766 00000 n -0000340917 00000 n -0000341067 00000 n -0000341217 00000 n -0000341367 00000 n -0000341518 00000 n -0000341669 00000 n -0000341819 00000 n -0000341970 00000 n -0000342121 00000 n -0000342272 00000 n -0000342422 00000 n -0000342573 00000 n -0000342723 00000 n -0000342874 00000 n -0000343024 00000 n -0000343175 00000 n -0000343326 00000 n -0000343476 00000 n -0000343626 00000 n -0000343777 00000 n -0000343928 00000 n -0000344079 00000 n -0000344230 00000 n -0000344380 00000 n -0000344531 00000 n -0000344680 00000 n -0000344831 00000 n -0000344982 00000 n -0000345132 00000 n -0000345283 00000 n -0000345433 00000 n -0000345584 00000 n -0000345735 00000 n -0000345886 00000 n -0000346036 00000 n -0000346187 00000 n -0000346338 00000 n -0000346489 00000 n -0000346640 00000 n -0000346791 00000 n -0000346942 00000 n -0000347093 00000 n -0000347244 00000 n -0000347395 00000 n -0000347545 00000 n -0000347696 00000 n -0000347847 00000 n -0000347998 00000 n -0000348149 00000 n -0000348299 00000 n -0000348449 00000 n -0000348599 00000 n -0000348750 00000 n -0000348958 00000 n -0000337108 00000 n -0000335889 00000 n -0000348900 00000 n -0000350847 00000 n -0000350997 00000 n -0000351148 00000 n -0000351299 00000 n -0000351450 00000 n -0000351601 00000 n -0000351752 00000 n -0000351903 00000 n -0000352054 00000 n -0000352204 00000 n -0000352354 00000 n -0000352505 00000 n -0000352655 00000 n -0000352804 00000 n -0000352952 00000 n -0000353102 00000 n -0000353253 00000 n -0000353404 00000 n -0000353555 00000 n -0000353706 00000 n -0000353856 00000 n -0000354006 00000 n -0000354157 00000 n -0000354306 00000 n -0000354456 00000 n -0000354607 00000 n -0000354758 00000 n -0000354909 00000 n -0000355060 00000 n -0000355211 00000 n -0000355362 00000 n -0000355513 00000 n -0000355663 00000 n -0000355814 00000 n -0000355965 00000 n -0000356116 00000 n -0000356265 00000 n -0000356415 00000 n -0000356566 00000 n -0000356717 00000 n -0000356867 00000 n -0000357017 00000 n -0000357168 00000 n -0000357319 00000 n -0000357469 00000 n -0000357620 00000 n -0000357770 00000 n -0000357920 00000 n -0000358070 00000 n -0000358220 00000 n -0000358370 00000 n -0000358521 00000 n -0000358672 00000 n -0000358823 00000 n -0000358974 00000 n -0000359125 00000 n -0000359276 00000 n -0000359426 00000 n -0000359577 00000 n -0000359728 00000 n -0000359879 00000 n -0000360030 00000 n -0000360181 00000 n -0000360331 00000 n -0000360481 00000 n -0000360632 00000 n -0000360783 00000 n -0000360934 00000 n -0000361085 00000 n -0000361236 00000 n -0000361387 00000 n -0000361538 00000 n -0000362987 00000 n -0000361747 00000 n -0000350064 00000 n -0000349044 00000 n -0000361689 00000 n -0000363138 00000 n -0000363289 00000 n -0000363440 00000 n -0000363591 00000 n -0000363742 00000 n -0000363893 00000 n -0000364044 00000 n -0000364195 00000 n -0000364345 00000 n -0000364495 00000 n -0000364646 00000 n -0000364797 00000 n -0000364948 00000 n -0000365099 00000 n -0000365249 00000 n -0000365400 00000 n -0000365550 00000 n -0000365701 00000 n -0000365850 00000 n -0000365999 00000 n -0000366149 00000 n -0000366300 00000 n -0000366451 00000 n -0000366602 00000 n -0000366753 00000 n -0000366904 00000 n -0000367054 00000 n -0000367205 00000 n -0000367355 00000 n -0000367506 00000 n -0000367657 00000 n -0000367807 00000 n -0000367958 00000 n -0000368108 00000 n -0000368258 00000 n -0000368409 00000 n -0000368618 00000 n -0000362519 00000 n -0000361833 00000 n -0000368560 00000 n -0000494131 00000 n -0000368704 00000 n -0000369176 00000 n -0000369652 00000 n -0000370253 00000 n -0000370337 00000 n -0000370535 00000 n -0000370561 00000 n -0000370949 00000 n -0000371828 00000 n -0000372318 00000 n -0000383003 00000 n -0000383268 00000 n -0000392651 00000 n -0000392921 00000 n -0000400115 00000 n -0000400354 00000 n -0000407383 00000 n -0000407615 00000 n -0000425931 00000 n -0000426477 00000 n -0000444500 00000 n -0000445041 00000 n -0000459123 00000 n -0000459499 00000 n -0000479378 00000 n -0000479969 00000 n -0000493739 00000 n -0000497002 00000 n -0000497122 00000 n -0000497211 00000 n -0000497284 00000 n -0000506441 00000 n -0000506676 00000 n -0000506870 00000 n -0000507059 00000 n -0000507369 00000 n -0000507786 00000 n -0000508317 00000 n -0000508947 00000 n -0000509742 00000 n -0000510438 00000 n -0000510969 00000 n -0000511698 00000 n -0000512493 00000 n -0000513288 00000 n -0000514083 00000 n -0000514878 00000 n -0000515673 00000 n -0000516318 00000 n -0000516498 00000 n -0000516787 00000 n -0000517252 00000 n -0000517716 00000 n -0000518070 00000 n -0000518241 00000 n -0000518411 00000 n -0000518582 00000 n -0000518753 00000 n -0000518930 00000 n -0000519098 00000 n -0000519283 00000 n -0000519480 00000 n -0000519677 00000 n -0000519875 00000 n -0000520284 00000 n -0000520807 00000 n -0000521330 00000 n -0000521746 00000 n -0000521985 00000 n -0000522228 00000 n -0000522500 00000 n -0000522791 00000 n -0000523077 00000 n -0000523360 00000 n -0000523643 00000 n -0000523928 00000 n -0000524211 00000 n -0000524494 00000 n -0000524779 00000 n -0000525062 00000 n -0000525185 00000 n -0000525355 00000 n -0000525594 00000 n -0000525790 00000 n -0000525908 00000 n -0000526028 00000 n -0000526157 00000 n -0000526296 00000 n -0000526440 00000 n -0000526539 00000 n -0000526673 00000 n -0000526785 00000 n -0000526888 00000 n -0000526928 00000 n -0000527109 00000 n +0000160347 00000 n +0000495354 00000 n +0000495710 00000 n +0000496066 00000 n +0000128679 00000 n +0000160744 00000 n +0000160625 00000 n +0000160525 00000 n +0000162006 00000 n +0000162157 00000 n +0000162311 00000 n +0000162463 00000 n +0000162613 00000 n +0000162766 00000 n +0000162920 00000 n +0000163074 00000 n +0000163225 00000 n +0000163379 00000 n +0000163533 00000 n +0000163687 00000 n +0000163846 00000 n +0000164005 00000 n +0000164164 00000 n +0000164315 00000 n +0000164469 00000 n +0000164628 00000 n +0000164787 00000 n +0000164938 00000 n +0000165091 00000 n +0000165242 00000 n +0000165396 00000 n +0000165546 00000 n +0000167324 00000 n +0000165756 00000 n +0000161683 00000 n +0000160785 00000 n +0000165699 00000 n +0000167483 00000 n +0000167642 00000 n +0000167802 00000 n +0000167966 00000 n +0000168129 00000 n +0000168293 00000 n +0000168457 00000 n +0000168620 00000 n +0000168783 00000 n +0000168947 00000 n +0000169111 00000 n +0000169275 00000 n +0000169440 00000 n +0000169605 00000 n +0000169770 00000 n +0000169935 00000 n +0000170099 00000 n +0000170264 00000 n +0000170428 00000 n +0000170593 00000 n +0000170757 00000 n +0000170922 00000 n +0000171073 00000 n +0000171227 00000 n +0000171386 00000 n +0000171545 00000 n +0000171709 00000 n +0000171872 00000 n +0000172036 00000 n +0000172200 00000 n +0000172364 00000 n +0000172528 00000 n +0000172692 00000 n +0000172851 00000 n +0000173014 00000 n +0000174772 00000 n +0000173172 00000 n +0000166905 00000 n +0000165841 00000 n +0000174936 00000 n +0000175100 00000 n +0000175259 00000 n +0000175423 00000 n +0000175587 00000 n +0000175751 00000 n +0000175915 00000 n +0000176078 00000 n +0000176242 00000 n +0000176405 00000 n +0000176568 00000 n +0000176732 00000 n +0000176896 00000 n +0000177061 00000 n +0000177215 00000 n +0000177373 00000 n +0000177531 00000 n +0000177695 00000 n +0000177859 00000 n +0000178023 00000 n +0000178187 00000 n +0000178351 00000 n +0000178515 00000 n +0000178674 00000 n +0000178838 00000 n +0000178997 00000 n +0000179161 00000 n +0000179324 00000 n +0000179488 00000 n +0000179651 00000 n +0000179813 00000 n +0000179977 00000 n +0000180140 00000 n +0000180304 00000 n +0000180468 00000 n +0000181156 00000 n +0000180632 00000 n +0000174353 00000 n +0000173257 00000 n +0000181321 00000 n +0000181017 00000 n +0000180717 00000 n +0000183495 00000 n +0000182978 00000 n +0000181406 00000 n +0000183097 00000 n +0000183208 00000 n +0000183265 00000 n +0000183377 00000 n +0000496184 00000 n +0000183982 00000 n +0000183807 00000 n +0000183580 00000 n +0000183926 00000 n +0000186263 00000 n +0000186423 00000 n +0000186575 00000 n +0000186734 00000 n +0000186928 00000 n +0000187121 00000 n +0000190726 00000 n +0000190878 00000 n +0000191073 00000 n +0000191526 00000 n +0000187884 00000 n +0000186084 00000 n +0000184054 00000 n +0000187314 00000 n +0000187426 00000 n +0000187483 00000 n +0000187596 00000 n +0000187713 00000 n +0000495180 00000 n +0000187770 00000 n +0000187827 00000 n +0000257010 00000 n +0000311170 00000 n +0000234354 00000 n +0000309399 00000 n +0000304596 00000 n +0000306976 00000 n +0000191720 00000 n +0000191915 00000 n +0000192110 00000 n +0000192304 00000 n +0000192455 00000 n +0000192650 00000 n +0000192800 00000 n +0000193170 00000 n +0000195152 00000 n +0000193818 00000 n +0000190468 00000 n +0000187982 00000 n +0000193365 00000 n +0000193421 00000 n +0000191300 00000 n +0000193478 00000 n +0000193534 00000 n +0000193591 00000 n +0000193648 00000 n +0000193705 00000 n +0000192986 00000 n +0000294056 00000 n +0000307089 00000 n +0000309286 00000 n +0000304483 00000 n +0000324079 00000 n +0000218033 00000 n +0000195018 00000 n +0000193916 00000 n +0000217915 00000 n +0000217971 00000 n +0000495036 00000 n +0000494602 00000 n +0000494747 00000 n +0000494891 00000 n +0000208041 00000 n +0000218610 00000 n +0000218435 00000 n +0000218205 00000 n +0000218554 00000 n +0000220672 00000 n +0000220831 00000 n +0000221216 00000 n +0000221444 00000 n +0000221671 00000 n +0000221866 00000 n +0000222059 00000 n +0000222218 00000 n +0000224945 00000 n +0000225172 00000 n +0000225626 00000 n +0000222991 00000 n +0000220469 00000 n +0000218682 00000 n +0000222412 00000 n +0000222524 00000 n +0000222581 00000 n +0000221024 00000 n +0000222694 00000 n +0000222812 00000 n +0000222930 00000 n +0000496302 00000 n +0000245263 00000 n +0000249867 00000 n +0000298603 00000 n +0000301985 00000 n +0000311054 00000 n +0000225786 00000 n +0000225979 00000 n +0000226172 00000 n +0000226363 00000 n +0000226589 00000 n +0000226781 00000 n +0000227009 00000 n +0000227463 00000 n +0000227621 00000 n +0000227813 00000 n +0000228006 00000 n +0000228198 00000 n +0000228425 00000 n +0000228653 00000 n +0000230271 00000 n +0000230499 00000 n +0000230954 00000 n +0000229135 00000 n +0000224662 00000 n +0000223076 00000 n +0000228844 00000 n +0000225399 00000 n +0000228956 00000 n +0000227237 00000 n +0000229074 00000 n +0000250446 00000 n +0000250327 00000 n +0000247893 00000 n +0000231114 00000 n +0000231307 00000 n +0000231500 00000 n +0000231803 00000 n +0000230084 00000 n +0000229233 00000 n +0000231691 00000 n +0000230727 00000 n +0000232309 00000 n +0000232134 00000 n +0000231901 00000 n +0000232253 00000 n +0000233753 00000 n +0000233905 00000 n +0000234090 00000 n +0000234755 00000 n +0000233598 00000 n +0000232381 00000 n +0000234242 00000 n +0000234411 00000 n +0000234529 00000 n +0000234642 00000 n +0000324600 00000 n +0000236186 00000 n +0000236011 00000 n +0000234853 00000 n +0000236130 00000 n +0000236900 00000 n +0000237060 00000 n +0000237382 00000 n +0000236753 00000 n +0000236271 00000 n +0000237214 00000 n +0000496420 00000 n +0000237870 00000 n +0000237695 00000 n +0000237467 00000 n +0000237814 00000 n +0000238650 00000 n +0000238811 00000 n +0000238965 00000 n +0000239116 00000 n +0000239281 00000 n +0000239603 00000 n +0000238479 00000 n +0000237942 00000 n +0000239435 00000 n +0000240088 00000 n +0000239913 00000 n +0000239688 00000 n +0000240032 00000 n +0000241279 00000 n +0000241473 00000 n +0000241667 00000 n +0000241861 00000 n +0000242054 00000 n +0000242248 00000 n +0000242441 00000 n +0000242635 00000 n +0000242829 00000 n +0000243023 00000 n +0000243217 00000 n +0000243411 00000 n +0000243605 00000 n +0000243798 00000 n +0000243992 00000 n +0000244186 00000 n +0000244378 00000 n +0000244570 00000 n +0000244764 00000 n +0000244958 00000 n +0000245489 00000 n +0000240988 00000 n +0000240160 00000 n +0000245151 00000 n +0000245376 00000 n +0000250684 00000 n +0000246827 00000 n +0000250565 00000 n +0000247060 00000 n +0000247298 00000 n +0000247179 00000 n +0000246941 00000 n +0000247536 00000 n +0000247655 00000 n +0000247774 00000 n +0000247417 00000 n +0000249986 00000 n +0000250213 00000 n +0000249753 00000 n +0000250100 00000 n +0000249639 00000 n +0000248012 00000 n +0000246595 00000 n +0000245613 00000 n +0000246714 00000 n +0000249389 00000 n +0000250745 00000 n +0000249250 00000 n +0000248097 00000 n +0000249583 00000 n +0000496538 00000 n +0000251494 00000 n +0000251765 00000 n +0000251355 00000 n +0000250856 00000 n +0000251652 00000 n +0000252435 00000 n +0000256830 00000 n +0000258679 00000 n +0000262116 00000 n +0000257124 00000 n +0000252301 00000 n +0000251852 00000 n +0000256897 00000 n +0000253345 00000 n +0000253475 00000 n +0000253615 00000 n +0000253902 00000 n +0000254307 00000 n +0000254511 00000 n +0000254532 00000 n +0000256808 00000 n +0000262183 00000 n +0000262343 00000 n +0000262537 00000 n +0000262731 00000 n +0000262926 00000 n +0000263121 00000 n +0000263315 00000 n +0000263510 00000 n +0000263705 00000 n +0000263900 00000 n +0000264095 00000 n +0000264322 00000 n +0000264549 00000 n +0000264776 00000 n +0000264999 00000 n +0000265224 00000 n +0000267281 00000 n +0000267508 00000 n +0000265734 00000 n +0000258405 00000 n +0000257250 00000 n +0000265450 00000 n +0000265506 00000 n +0000495886 00000 n +0000265563 00000 n +0000265620 00000 n +0000265677 00000 n +0000259342 00000 n +0000259472 00000 n +0000259612 00000 n +0000259863 00000 n +0000260227 00000 n +0000260431 00000 n +0000260452 00000 n +0000262094 00000 n +0000290542 00000 n +0000290424 00000 n +0000293285 00000 n +0000290075 00000 n +0000290192 00000 n +0000290311 00000 n +0000289961 00000 n +0000293461 00000 n +0000293632 00000 n +0000293746 00000 n +0000293808 00000 n +0000293870 00000 n +0000293932 00000 n +0000293994 00000 n +0000267735 00000 n +0000267958 00000 n +0000268185 00000 n +0000268412 00000 n +0000268638 00000 n +0000268865 00000 n +0000269092 00000 n +0000269319 00000 n +0000269546 00000 n +0000269773 00000 n +0000270000 00000 n +0000270227 00000 n +0000270454 00000 n +0000270681 00000 n +0000270908 00000 n +0000271135 00000 n +0000271361 00000 n +0000271586 00000 n +0000271813 00000 n +0000272040 00000 n +0000272267 00000 n +0000272494 00000 n +0000272720 00000 n +0000272947 00000 n +0000273174 00000 n +0000273400 00000 n +0000273627 00000 n +0000273853 00000 n +0000274080 00000 n +0000274307 00000 n +0000274533 00000 n +0000274760 00000 n +0000274985 00000 n +0000275178 00000 n +0000275405 00000 n +0000275632 00000 n +0000275858 00000 n +0000278661 00000 n +0000278888 00000 n +0000279115 00000 n +0000276140 00000 n +0000266838 00000 n +0000265886 00000 n +0000276084 00000 n +0000294118 00000 n +0000294180 00000 n +0000294242 00000 n +0000294304 00000 n +0000294366 00000 n +0000294428 00000 n +0000294490 00000 n +0000294552 00000 n +0000294613 00000 n +0000294675 00000 n +0000294737 00000 n +0000294799 00000 n +0000297127 00000 n +0000297189 00000 n +0000297251 00000 n +0000297313 00000 n +0000297374 00000 n +0000297436 00000 n +0000297498 00000 n +0000297560 00000 n +0000297622 00000 n +0000297684 00000 n +0000297746 00000 n +0000297808 00000 n +0000297870 00000 n +0000297932 00000 n +0000297994 00000 n +0000298056 00000 n +0000298118 00000 n +0000298180 00000 n +0000298242 00000 n +0000298304 00000 n +0000298366 00000 n +0000298428 00000 n +0000298489 00000 n +0000301861 00000 n +0000301923 00000 n +0000279342 00000 n +0000279568 00000 n +0000279795 00000 n +0000280022 00000 n +0000280249 00000 n +0000280476 00000 n +0000280670 00000 n +0000280865 00000 n +0000281058 00000 n +0000281253 00000 n +0000281448 00000 n +0000281641 00000 n +0000281836 00000 n +0000282030 00000 n +0000282417 00000 n +0000282610 00000 n +0000282805 00000 n +0000283000 00000 n +0000283389 00000 n +0000283584 00000 n +0000283779 00000 n +0000283974 00000 n +0000284169 00000 n +0000284362 00000 n +0000284548 00000 n +0000284739 00000 n +0000284930 00000 n +0000285122 00000 n +0000285317 00000 n +0000285512 00000 n +0000287720 00000 n +0000287915 00000 n +0000286013 00000 n +0000278242 00000 n +0000276238 00000 n +0000285900 00000 n +0000285956 00000 n +0000282225 00000 n +0000283195 00000 n +0000285707 00000 n +0000302047 00000 n +0000302105 00000 n +0000302167 00000 n +0000302229 00000 n +0000302291 00000 n +0000302353 00000 n +0000302415 00000 n +0000302477 00000 n +0000304369 00000 n +0000302596 00000 n +0000309059 00000 n +0000326021 00000 n +0000288110 00000 n +0000288270 00000 n +0000288463 00000 n +0000288658 00000 n +0000288817 00000 n +0000289012 00000 n +0000289207 00000 n +0000289402 00000 n +0000289597 00000 n +0000290598 00000 n +0000287501 00000 n +0000286124 00000 n +0000289791 00000 n +0000495530 00000 n +0000496656 00000 n +0000309173 00000 n +0000292783 00000 n +0000294861 00000 n +0000292636 00000 n +0000290735 00000 n +0000293172 00000 n +0000292978 00000 n +0000298665 00000 n +0000296952 00000 n +0000294985 00000 n +0000297071 00000 n +0000302710 00000 n +0000301686 00000 n +0000298763 00000 n +0000301805 00000 n +0000304710 00000 n +0000304194 00000 n +0000302821 00000 n +0000304313 00000 n +0000307203 00000 n +0000306801 00000 n +0000304821 00000 n +0000306920 00000 n +0000308684 00000 n +0000308843 00000 n +0000309455 00000 n +0000308537 00000 n +0000307314 00000 n +0000309003 00000 n +0000496774 00000 n +0000310772 00000 n +0000312780 00000 n +0000317980 00000 n +0000311285 00000 n +0000310630 00000 n +0000309567 00000 n +0000310938 00000 n +0000318047 00000 n +0000318234 00000 n +0000318421 00000 n +0000318608 00000 n +0000318795 00000 n +0000318982 00000 n +0000319169 00000 n +0000319356 00000 n +0000319543 00000 n +0000319730 00000 n +0000319916 00000 n +0000320103 00000 n +0000320289 00000 n +0000320475 00000 n +0000320661 00000 n +0000320848 00000 n +0000321034 00000 n +0000321220 00000 n +0000321407 00000 n +0000321866 00000 n +0000312460 00000 n +0000311397 00000 n +0000321573 00000 n +0000321631 00000 n +0000321690 00000 n +0000321749 00000 n +0000314216 00000 n +0000314347 00000 n +0000314490 00000 n +0000314795 00000 n +0000315218 00000 n +0000315424 00000 n +0000315446 00000 n +0000317957 00000 n +0000323963 00000 n +0000324308 00000 n +0000324425 00000 n +0000323846 00000 n +0000324191 00000 n +0000326721 00000 n +0000327556 00000 n +0000325904 00000 n +0000326487 00000 n +0000326604 00000 n +0000327673 00000 n +0000325789 00000 n +0000326137 00000 n +0000326254 00000 n +0000326370 00000 n +0000323534 00000 n +0000324716 00000 n +0000323391 00000 n +0000321993 00000 n +0000323730 00000 n +0000326837 00000 n +0000325551 00000 n +0000324828 00000 n +0000325673 00000 n +0000327790 00000 n +0000327376 00000 n +0000326936 00000 n +0000327498 00000 n +0000329260 00000 n +0000329411 00000 n +0000329561 00000 n +0000329712 00000 n +0000329863 00000 n +0000330014 00000 n +0000330165 00000 n +0000330316 00000 n +0000330467 00000 n +0000330617 00000 n +0000330768 00000 n +0000330919 00000 n +0000331070 00000 n +0000331221 00000 n +0000331372 00000 n +0000331522 00000 n +0000331673 00000 n +0000331824 00000 n +0000331975 00000 n +0000332126 00000 n +0000332277 00000 n +0000332428 00000 n +0000332578 00000 n +0000332729 00000 n +0000332880 00000 n +0000333031 00000 n +0000333182 00000 n +0000333333 00000 n +0000333484 00000 n +0000333635 00000 n +0000333786 00000 n +0000333937 00000 n +0000334088 00000 n +0000334239 00000 n +0000334390 00000 n +0000334541 00000 n +0000334691 00000 n +0000334842 00000 n +0000334993 00000 n +0000335144 00000 n +0000335294 00000 n +0000335445 00000 n +0000335596 00000 n +0000337902 00000 n +0000335805 00000 n +0000328738 00000 n +0000327876 00000 n +0000335747 00000 n +0000496897 00000 n +0000338053 00000 n +0000338204 00000 n +0000338355 00000 n +0000338505 00000 n +0000338655 00000 n +0000338806 00000 n +0000338957 00000 n +0000339108 00000 n +0000339259 00000 n +0000339410 00000 n +0000339561 00000 n +0000339712 00000 n +0000339863 00000 n +0000340014 00000 n +0000340165 00000 n +0000340316 00000 n +0000340467 00000 n +0000340618 00000 n +0000340768 00000 n +0000340919 00000 n +0000341069 00000 n +0000341219 00000 n +0000341369 00000 n +0000341520 00000 n +0000341671 00000 n +0000341821 00000 n +0000341972 00000 n +0000342123 00000 n +0000342274 00000 n +0000342424 00000 n +0000342575 00000 n +0000342725 00000 n +0000342876 00000 n +0000343026 00000 n +0000343177 00000 n +0000343328 00000 n +0000343478 00000 n +0000343628 00000 n +0000343779 00000 n +0000343930 00000 n +0000344081 00000 n +0000344232 00000 n +0000344382 00000 n +0000344533 00000 n +0000344682 00000 n +0000344833 00000 n +0000344984 00000 n +0000345134 00000 n +0000345285 00000 n +0000345435 00000 n +0000345586 00000 n +0000345737 00000 n +0000345888 00000 n +0000346038 00000 n +0000346189 00000 n +0000346340 00000 n +0000346491 00000 n +0000346642 00000 n +0000346793 00000 n +0000346944 00000 n +0000347095 00000 n +0000347246 00000 n +0000347397 00000 n +0000347547 00000 n +0000347698 00000 n +0000347849 00000 n +0000348000 00000 n +0000348151 00000 n +0000348301 00000 n +0000348451 00000 n +0000348601 00000 n +0000348752 00000 n +0000348960 00000 n +0000337110 00000 n +0000335891 00000 n +0000348902 00000 n +0000350849 00000 n +0000350999 00000 n +0000351150 00000 n +0000351301 00000 n +0000351452 00000 n +0000351603 00000 n +0000351754 00000 n +0000351905 00000 n +0000352056 00000 n +0000352206 00000 n +0000352356 00000 n +0000352507 00000 n +0000352657 00000 n +0000352806 00000 n +0000352954 00000 n +0000353104 00000 n +0000353255 00000 n +0000353406 00000 n +0000353557 00000 n +0000353708 00000 n +0000353858 00000 n +0000354008 00000 n +0000354159 00000 n +0000354308 00000 n +0000354458 00000 n +0000354609 00000 n +0000354760 00000 n +0000354911 00000 n +0000355062 00000 n +0000355213 00000 n +0000355364 00000 n +0000355515 00000 n +0000355665 00000 n +0000355816 00000 n +0000355967 00000 n +0000356118 00000 n +0000356267 00000 n +0000356417 00000 n +0000356568 00000 n +0000356719 00000 n +0000356869 00000 n +0000357019 00000 n +0000357170 00000 n +0000357321 00000 n +0000357471 00000 n +0000357622 00000 n +0000357772 00000 n +0000357922 00000 n +0000358072 00000 n +0000358222 00000 n +0000358372 00000 n +0000358523 00000 n +0000358674 00000 n +0000358825 00000 n +0000358976 00000 n +0000359127 00000 n +0000359278 00000 n +0000359428 00000 n +0000359579 00000 n +0000359730 00000 n +0000359881 00000 n +0000360032 00000 n +0000360183 00000 n +0000360333 00000 n +0000360483 00000 n +0000360634 00000 n +0000360785 00000 n +0000360936 00000 n +0000361087 00000 n +0000361238 00000 n +0000361389 00000 n +0000361540 00000 n +0000362989 00000 n +0000361749 00000 n +0000350066 00000 n +0000349046 00000 n +0000361691 00000 n +0000363140 00000 n +0000363291 00000 n +0000363442 00000 n +0000363593 00000 n +0000363744 00000 n +0000363895 00000 n +0000364046 00000 n +0000364197 00000 n +0000364347 00000 n +0000364497 00000 n +0000364648 00000 n +0000364799 00000 n +0000364950 00000 n +0000365101 00000 n +0000365251 00000 n +0000365402 00000 n +0000365552 00000 n +0000365703 00000 n +0000365852 00000 n +0000366001 00000 n +0000366151 00000 n +0000366302 00000 n +0000366453 00000 n +0000366604 00000 n +0000366755 00000 n +0000366906 00000 n +0000367056 00000 n +0000367207 00000 n +0000367357 00000 n +0000367508 00000 n +0000367659 00000 n +0000367809 00000 n +0000367960 00000 n +0000368110 00000 n +0000368260 00000 n +0000368411 00000 n +0000368620 00000 n +0000362521 00000 n +0000361835 00000 n +0000368562 00000 n +0000494133 00000 n +0000368706 00000 n +0000369178 00000 n +0000369654 00000 n +0000370255 00000 n +0000370339 00000 n +0000370537 00000 n +0000370563 00000 n +0000370951 00000 n +0000371830 00000 n +0000372320 00000 n +0000383005 00000 n +0000383270 00000 n +0000392653 00000 n +0000392923 00000 n +0000400117 00000 n +0000400356 00000 n +0000407385 00000 n +0000407617 00000 n +0000425933 00000 n +0000426479 00000 n +0000444502 00000 n +0000445043 00000 n +0000459125 00000 n +0000459501 00000 n +0000479380 00000 n +0000479971 00000 n +0000493741 00000 n +0000497004 00000 n +0000497124 00000 n +0000497213 00000 n +0000497286 00000 n +0000506443 00000 n +0000506678 00000 n +0000506872 00000 n +0000507061 00000 n +0000507371 00000 n +0000507788 00000 n +0000508319 00000 n +0000508949 00000 n +0000509744 00000 n +0000510440 00000 n +0000510971 00000 n +0000511700 00000 n +0000512495 00000 n +0000513290 00000 n +0000514085 00000 n +0000514880 00000 n +0000515675 00000 n +0000516320 00000 n +0000516500 00000 n +0000516789 00000 n +0000517254 00000 n +0000517718 00000 n +0000518072 00000 n +0000518243 00000 n +0000518413 00000 n +0000518584 00000 n +0000518755 00000 n +0000518932 00000 n +0000519100 00000 n +0000519285 00000 n +0000519482 00000 n +0000519679 00000 n +0000519877 00000 n +0000520286 00000 n +0000520809 00000 n +0000521332 00000 n +0000521748 00000 n +0000521987 00000 n +0000522230 00000 n +0000522502 00000 n +0000522793 00000 n +0000523079 00000 n +0000523362 00000 n +0000523645 00000 n +0000523930 00000 n +0000524213 00000 n +0000524496 00000 n +0000524781 00000 n +0000525064 00000 n +0000525187 00000 n +0000525357 00000 n +0000525596 00000 n +0000525792 00000 n +0000525910 00000 n +0000526030 00000 n +0000526159 00000 n +0000526298 00000 n +0000526442 00000 n +0000526541 00000 n +0000526675 00000 n +0000526787 00000 n +0000526890 00000 n +0000526930 00000 n +0000527111 00000 n trailer << /Size 1404 /Root 1402 0 R /Info 1403 0 R -/ID [ ] >> +/ID [ ] >> startxref -527436 +527438 %%EOF diff --git a/documentation/aacEncoder.pdf b/documentation/aacEncoder.pdf index 2af41ae..84100eb 100644 --- a/documentation/aacEncoder.pdf +++ b/documentation/aacEncoder.pdf @@ -632,7 +632,11 @@ endobj /Filter /FlateDecode >> stream -x}UM6 W(ͬi,7wIvķDYl%Rud;q;@@GGW?qDGۢD%ɣ_g4uW11#<$zR7]?WwF4CŮ ѱJdK_c&+^'kxT 嗏僬Tug@SxL@L!Yf[j0/PI/c2`:eI~A%4GOH-ÜMܫ!OԮucZ .+v +BV~;M3\Gvn@KD[lj|f2~L'-6+>W-$O\ I2/!qfN.&aemUW1|CBd)1IUDp-*>FHcjUM=&8ɫ4ބ@_il2(/ʤCpK/q 3;ZpMcܐCF$Yp:1CtS?jUO JA[{?yf5k]'1ȷNad>[/V3-p!Qӳ8tL.enhG7{`8d w )5\1f 2~Xkkp67ntFJazD5 [k+XkXOFtY+;3W`bµ ;WfəӚM;w&4MIQhYgm0nrOŝ2R}jޖd{Qief9]v1p݋qtص߳q5Z^ ~α 7ky>KMDK2+@?q{ pR~:McHAI17h_(? +x}UM6Wp1m2Ljd|KrA% !;i}riunI(8(AMI$&A^q7oP2hB9fI9w/}ɚ5Sc0IQnv1d4˱ACR%?}>|b +i2uO2$ld?t,JH('ÜNUl~nƸ8o݉v"[<~ؕ9ۑ}\yIHpD+01_Ĩ[5UYq4sתę o򺐔$#82yB\WQqAY~[ +zn\.u1c\ َ}~JGzcQ/\~*q/K`$-ҐnZVSτ^;N?YZ/%![9y!5XY!f( N|Zద:idmznΩqiમ)mIHsr#4/K N>zcȗՐnTiΝHVR 4;ػi'iEkS׌W:|Ԑodc\Nf2 $<̟bk7•FzOQLD=6m9@q|35 +@Sx:Wpld@Zb}JTxFtx5 [k#bmXOwY˽;3W`b @2*̴p MW=Z۴̪SqC+`9YWJYNY L|-+f```xsl cZb{q;g p/T'.bxg]ҿ2s+pω>W6h֟^QoͿ_])t endstream endobj 418 0 obj << @@ -8985,8 +8989,8 @@ endobj >> endobj 1416 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.10)/Keywords() -/CreationDate (D:20120817142105+02'00') -/ModDate (D:20120817142105+02'00') +/CreationDate (D:20120927164403+02'00') +/ModDate (D:20120927164403+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-1.40.10-2.2 (TeX Live 2009/Debian) kpathsea version 5.0.0) >> endobj @@ -10413,7 +10417,7 @@ trailer << /Size 1417 /Root 1415 0 R /Info 1416 0 R -/ID [<09BA174B99D03051E2360592CE4C1DF3> <09BA174B99D03051E2360592CE4C1DF3>] >> +/ID [<6568D5E6D3D414DEC0C8E7A6930872CF> <6568D5E6D3D414DEC0C8E7A6930872CF>] >> startxref 508901 %%EOF diff --git a/libAACdec/src/aacdec_drc.cpp b/libAACdec/src/aacdec_drc.cpp index c660b83..ebc6975 100644 --- a/libAACdec/src/aacdec_drc.cpp +++ b/libAACdec/src/aacdec_drc.cpp @@ -220,8 +220,9 @@ AAC_DECODER_ERROR aacDecoder_drcSetParam ( else { /* ref_level must be between 0 and MAX_REFERENCE_LEVEL, inclusive */ self->digitalNorm = 1; - self->progRefLevel = AACDEC_DRC_DEFAULT_REF_LEVEL; self->params.targetRefLevel = value; + self->progRefLevel = (SCHAR)value; /* Set the program reference level equal to the target + level according to 4.5.2.7.3 of ISO/IEC 14496-3. */ } break; case APPLY_HEAVY_COMPRESSION: @@ -783,6 +784,7 @@ void aacDecoder_drcApply ( { int band, top, bin, numBands; int bottom = 0; + int modifyBins = 0; FIXP_DBL max_mantissa; INT max_exponent; @@ -937,6 +939,12 @@ void aacDecoder_drcApply ( if (fact_exponent[band] < max_exponent) { fact_mantissa[band] >>= max_exponent - fact_exponent[band]; } + if (fact_mantissa[band] != FL2FXCONST_DBL(0.5f)) { + modifyBins = 1; + } + } + if (max_exponent != 1) { + modifyBins = 1; } } @@ -948,23 +956,28 @@ void aacDecoder_drcApply ( { bottom = 0; - for (band = 0; band < numBands; band++) + if (!modifyBins) { + /* We don't have to modify the spectral bins because the fractional part of all factors is 0.5. + In order to keep accurancy we don't apply the factor but decrease the exponent instead. */ + max_exponent -= 1; + } else { - top = fixMin((int)( (pDrcChData->bandTop[band]+1)<<2 ), aacFrameSize); /* ... * DRC_BAND_MULT; */ + for (band = 0; band < numBands; band++) + { + top = fixMin((int)( (pDrcChData->bandTop[band]+1)<<2 ), aacFrameSize); /* ... * DRC_BAND_MULT; */ - for (bin = bottom; bin < top; bin++) { - pSpectralCoefficient[bin] = fMult(pSpectralCoefficient[bin], fact_mantissa[band]); - } + for (bin = bottom; bin < top; bin++) { + pSpectralCoefficient[bin] = fMult(pSpectralCoefficient[bin], fact_mantissa[band]); + } - bottom = top; + bottom = top; + } } /* above topmost DRC band gain factor is 1 */ if (max_exponent > 0) { - FIXP_DBL fact = FL2FXCONST_DBL(0.5f) >> (max_exponent - 1); - - for (bin = top; bin < aacFrameSize; bin++) { - pSpectralCoefficient[bin] = fMult(pSpectralCoefficient[bin], fact); + for (bin = bottom; bin < aacFrameSize; bin+=1) { + pSpectralCoefficient[bin] >>= max_exponent; } } @@ -980,12 +993,13 @@ void aacDecoder_drcApply ( } else { HANDLE_SBRDECODER hSbrDecoder = (HANDLE_SBRDECODER)pSbrDec; + UINT numBands = pDrcChData->numBands; /* feed factors into SBR decoder for application in QMF domain. */ sbrDecoder_drcFeedChannel ( hSbrDecoder, ch, - pDrcChData->numBands, + numBands, fact_mantissa, max_exponent, pDrcChData->drcInterpolationScheme, diff --git a/libAACdec/src/aacdec_drc.h b/libAACdec/src/aacdec_drc.h index 07e7eff..9c90e32 100644 --- a/libAACdec/src/aacdec_drc.h +++ b/libAACdec/src/aacdec_drc.h @@ -99,10 +99,7 @@ amm-info@iis.fraunhofer.de #include "FDK_bitstream.h" #define AACDEC_DRC_DEFAULT_REF_LEVEL ( 108 ) /* -27 dB below full scale (typical for movies) */ -#define AACDEC_DRC_DFLT_EXPIRY_FRAMES ( 40 ) /* Default DRC data expiry time in AAC frames */ -#define MAX_SBR_SYN_CHAN ( 64 ) -#define MAX_SBR_COLS ( 32 ) - +#define AACDEC_DRC_DFLT_EXPIRY_FRAMES ( 50 ) /* Default DRC data expiry time in AAC frames */ /** * \brief DRC module setting parameters diff --git a/libAACdec/src/aacdecoder.cpp b/libAACdec/src/aacdecoder.cpp index 2843e9f..8d3c18d 100644 --- a/libAACdec/src/aacdecoder.cpp +++ b/libAACdec/src/aacdecoder.cpp @@ -865,6 +865,17 @@ LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_Init(HANDLE_AACDECODER self, const CS self->chMapping[ch] = 255; } } + #ifdef TP_PCE_ENABLE + else { + if (CProgramConfig_IsValid(&asc->m_progrConfigElement)) { + /* Set matrix mixdown infos if available from PCE. */ + pcmDmx_SetMatrixMixdownFromPce ( self->hPcmUtils, + asc->m_progrConfigElement.MatrixMixdownIndexPresent, + asc->m_progrConfigElement.MatrixMixdownIndex, + asc->m_progrConfigElement.PseudoSurroundEnable ); + } + } + #endif self->streamInfo.channelConfig = asc->m_channelConfiguration; @@ -1565,7 +1576,7 @@ LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_DecodeFrame( self->streamInfo.numChannels = aacChannels; #ifdef TP_PCE_ENABLE - if (pceRead == 1 || CProgramConfig_IsValid(pce)) { + if (pceRead == 1 && CProgramConfig_IsValid(pce)) { /* Set matrix mixdown infos if available from PCE. */ pcmDmx_SetMatrixMixdownFromPce ( self->hPcmUtils, pce->MatrixMixdownIndexPresent, @@ -1673,7 +1684,7 @@ LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_DecodeFrame( break; } if ( flags&AACDEC_FLUSH ) { - FDKmemclear(pAacDecoderChannelInfo->pSpectralCoefficient, sizeof(FIXP_DBL)*self->streamInfo.aacSamplesPerFrame); + FDKmemclear(pAacDecoderChannelInfo->pSpectralCoefficient, sizeof(FIXP_DBL)*self->streamInfo.aacSamplesPerFrame); FDKmemclear(self->pAacDecoderStaticChannelInfo[c]->pOverlapBuffer, OverlapBufferSize*sizeof(FIXP_DBL)); } } diff --git a/libAACdec/src/aacdecoder_lib.cpp b/libAACdec/src/aacdecoder_lib.cpp index 87f9ab0..a3db39e 100644 --- a/libAACdec/src/aacdecoder_lib.cpp +++ b/libAACdec/src/aacdecoder_lib.cpp @@ -110,7 +110,7 @@ amm-info@iis.fraunhofer.de /* Decoder library info */ #define AACDECODER_LIB_VL0 2 #define AACDECODER_LIB_VL1 4 -#define AACDECODER_LIB_VL2 5 +#define AACDECODER_LIB_VL2 7 #define AACDECODER_LIB_TITLE "AAC Decoder Lib" #define AACDECODER_LIB_BUILD_DATE __DATE__ #define AACDECODER_LIB_BUILD_TIME __TIME__ diff --git a/libAACenc/src/aacenc_lib.cpp b/libAACenc/src/aacenc_lib.cpp index a245358..07cfddc 100644 --- a/libAACenc/src/aacenc_lib.cpp +++ b/libAACenc/src/aacenc_lib.cpp @@ -98,7 +98,7 @@ amm-info@iis.fraunhofer.de /* Encoder library info */ #define AACENCODER_LIB_VL0 3 #define AACENCODER_LIB_VL1 3 -#define AACENCODER_LIB_VL2 2 +#define AACENCODER_LIB_VL2 3 #define AACENCODER_LIB_TITLE "AAC Encoder" #define AACENCODER_LIB_BUILD_DATE __DATE__ #define AACENCODER_LIB_BUILD_TIME __TIME__ diff --git a/libAACenc/src/band_nrg.cpp b/libAACenc/src/band_nrg.cpp index 458aa9c..0e46b45 100644 --- a/libAACenc/src/band_nrg.cpp +++ b/libAACenc/src/band_nrg.cpp @@ -260,21 +260,21 @@ FDKaacEnc_CalcBandEnergyOptimShort(const FIXP_DBL *RESTRICT mdctSpectrum, for(i=0; i 7/2 = 4 (spc*spc) */ + int leadingBits = sfbMaxScaleSpec[i]-3; /* max sfbWidth = 36 ; 2^6=64 => 6/2 = 3 (spc*spc) */ FIXP_DBL tmp = FL2FXCONST_DBL(0.0); for (j=bandOffset[i];j 7/2 = 4 (spc*spc) */ - scale = fixMin(scale,(DFRACT_BITS-1)); - bandEnergy[i] >>= scale; + INT scale = (2*(sfbMaxScaleSpec[i]-3))-1; /* max sfbWidth = 36 ; 2^6=64 => 6/2 = 3 (spc*spc) */ + scale = fixMax(fixMin(scale,(DFRACT_BITS-1)),-(DFRACT_BITS-1)); + bandEnergy[i] = scaleValueSaturate(bandEnergy[i], -scale); } } @@ -343,7 +343,7 @@ void FDKaacEnc_CalcBandNrgMSOpt(const FIXP_DBL *RESTRICT mdctSpectrumLeft, { /* using the minimal scaling of left and right channel can cause very small energies; check ldNrg before subtract scaling multiplication: fract*INT we don't need fMult */ - + int minus = scale*FL2FXCONST_DBL(1.0/64); if (bandEnergyMidLdData[i] != FL2FXCONST_DBL(-1.0f)) diff --git a/libAACenc/src/line_pe.cpp b/libAACenc/src/line_pe.cpp index ed5ee7f..7014bcb 100644 --- a/libAACenc/src/line_pe.cpp +++ b/libAACenc/src/line_pe.cpp @@ -122,6 +122,8 @@ void FDKaacEnc_prepareSfbPe(PE_CHANNEL_DATA *peChanData, avgFormFactorLdData = ((-sfbEnergyLdData[sfbGrp+sfb]>>1) + (CalcLdInt(sfbWidth)>>1))>>1; peChanData->sfbNLines[sfbGrp+sfb] = (INT)CalcInvLdData( (sfbFormFactorLdData[sfbGrp+sfb] + formFacScaling) + avgFormFactorLdData); + /* Make sure sfbNLines is never greater than sfbWidth due to unaccuracies (e.g. sfbEnergyLdData[sfbGrp+sfb] = 0x80000000) */ + peChanData->sfbNLines[sfbGrp+sfb] = fMin(sfbWidth, peChanData->sfbNLines[sfbGrp+sfb]); } else { peChanData->sfbNLines[sfbGrp+sfb] = 0; diff --git a/libAACenc/src/tns_param.cpp b/libAACenc/src/tns_param.cpp deleted file mode 100644 index 3c04c51..0000000 --- a/libAACenc/src/tns_param.cpp +++ /dev/null @@ -1,93 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - - Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Frderung der angewandten Forschung e.V. - All rights reserved. - - 1. INTRODUCTION -The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements -the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. -This FDK AAC Codec software is intended to be used on a wide variety of Android devices. - -AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual -audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by -independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part -of the MPEG specifications. - -Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) -may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners -individually for the purpose of encoding or decoding bit streams in products that are compliant with -the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license -these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec -software may already be covered under those patent licenses when it is used for those licensed purposes only. - -Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, -are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional -applications information and documentation. - -2. COPYRIGHT LICENSE - -Redistribution and use in source and binary forms, with or without modification, are permitted without -payment of copyright license fees provided that you satisfy the following conditions: - -You must retain the complete text of this software license in redistributions of the FDK AAC Codec or -your modifications thereto in source code form. - -You must retain the complete text of this software license in the documentation and/or other materials -provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. -You must make available free of charge copies of the complete source code of the FDK AAC Codec and your -modifications thereto to recipients of copies in binary form. - -The name of Fraunhofer may not be used to endorse or promote products derived from this library without -prior written permission. - -You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec -software or your modifications thereto. - -Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software -and the date of any change. For modified versions of the FDK AAC Codec, the term -"Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term -"Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." - -3. NO PATENT LICENSE - -NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, -ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with -respect to this software. - -You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized -by appropriate patent licenses. - -4. DISCLAIMER - -This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors -"AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties -of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR -CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, -including but not limited to procurement of substitute goods or services; loss of use, data, or profits, -or business interruption, however caused and on any theory of liability, whether in contract, strict -liability, or tort (including negligence), arising in any way out of the use of this software, even if -advised of the possibility of such damage. - -5. CONTACT INFORMATION - -Fraunhofer Institute for Integrated Circuits IIS -Attention: Audio and Multimedia Departments - FDK AAC LL -Am Wolfsmantel 33 -91058 Erlangen, Germany - -www.iis.fraunhofer.de/amm -amm-info@iis.fraunhofer.de ------------------------------------------------------------------------------------------------------------ */ - -/******************************** MPEG Audio Encoder ************************** - - Initial author: M.Werner - contents/description: TNS parameters - -******************************************************************************/ - -#include "tns_param.h" - - diff --git a/libAACenc/src/tns_param.h b/libAACenc/src/tns_param.h deleted file mode 100644 index b191b5c..0000000 --- a/libAACenc/src/tns_param.h +++ /dev/null @@ -1,96 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - - Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Frderung der angewandten Forschung e.V. - All rights reserved. - - 1. INTRODUCTION -The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements -the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. -This FDK AAC Codec software is intended to be used on a wide variety of Android devices. - -AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual -audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by -independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part -of the MPEG specifications. - -Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) -may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners -individually for the purpose of encoding or decoding bit streams in products that are compliant with -the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license -these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec -software may already be covered under those patent licenses when it is used for those licensed purposes only. - -Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, -are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional -applications information and documentation. - -2. COPYRIGHT LICENSE - -Redistribution and use in source and binary forms, with or without modification, are permitted without -payment of copyright license fees provided that you satisfy the following conditions: - -You must retain the complete text of this software license in redistributions of the FDK AAC Codec or -your modifications thereto in source code form. - -You must retain the complete text of this software license in the documentation and/or other materials -provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. -You must make available free of charge copies of the complete source code of the FDK AAC Codec and your -modifications thereto to recipients of copies in binary form. - -The name of Fraunhofer may not be used to endorse or promote products derived from this library without -prior written permission. - -You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec -software or your modifications thereto. - -Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software -and the date of any change. For modified versions of the FDK AAC Codec, the term -"Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term -"Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." - -3. NO PATENT LICENSE - -NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, -ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with -respect to this software. - -You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized -by appropriate patent licenses. - -4. DISCLAIMER - -This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors -"AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties -of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR -CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, -including but not limited to procurement of substitute goods or services; loss of use, data, or profits, -or business interruption, however caused and on any theory of liability, whether in contract, strict -liability, or tort (including negligence), arising in any way out of the use of this software, even if -advised of the possibility of such damage. - -5. CONTACT INFORMATION - -Fraunhofer Institute for Integrated Circuits IIS -Attention: Audio and Multimedia Departments - FDK AAC LL -Am Wolfsmantel 33 -91058 Erlangen, Germany - -www.iis.fraunhofer.de/amm -amm-info@iis.fraunhofer.de ------------------------------------------------------------------------------------------------------------ */ - -/******************************** MPEG Audio Encoder ************************** - - Initial author: Alex Goeschel - contents/description: Temporal noise shaping - -******************************************************************************/ - -#ifndef _TNS_PARAM_H -#define _TNS_PARAM_H - - - -#endif /* _TNS_PARAM_H */ diff --git a/libFDK/include/FDK_archdef.h b/libFDK/include/FDK_archdef.h index 22ec0ed..a963f55 100644 --- a/libFDK/include/FDK_archdef.h +++ b/libFDK/include/FDK_archdef.h @@ -155,7 +155,6 @@ amm-info@iis.fraunhofer.de #endif - /* Define preferred Multiplication type */ #if defined(FDK_HIGH_PERFORMANCE) && !defined(FDK_HIGH_QUALITY) /* FDK_HIGH_PERFORMANCE */ diff --git a/libFDK/include/clz.h b/libFDK/include/clz.h index 90cdb2b..38c5073 100644 --- a/libFDK/include/clz.h +++ b/libFDK/include/clz.h @@ -100,6 +100,9 @@ amm-info@iis.fraunhofer.de #elif defined(__mips__) /* cppp replaced: elif */ #include "mips/clz_mips.h" +#elif defined(__x86__) /* cppp replaced: elif */ +#include "x86/clz_x86.h" + #endif /* all cores */ diff --git a/libFDK/include/mips/cplx_mul.h b/libFDK/include/mips/cplx_mul.h index 4e8f26f..fb777ce 100644 --- a/libFDK/include/mips/cplx_mul.h +++ b/libFDK/include/mips/cplx_mul.h @@ -107,10 +107,23 @@ inline void cplxMultDiv2( FIXP_DBL *c_Re, FIXP_DBL b_Re, FIXP_DBL b_Im) { - INT result; - result = (((long long)a_Re * b_Re) - ((long long) a_Im * b_Im)) >> 32; + INT result; + + __asm__ ("mult %[a_Re], %[b_Re];\n" + "msub %[a_Im], %[b_Im];\n" + "mfhi %[result];\n" + : [result]"=r"(result) + : [a_Re]"d"(a_Re), [b_Re]"d"(b_Re), [a_Im]"d"(a_Im), [b_Im]"d"(b_Im) + : "lo"); + *c_Re = result; - result = (((long long)a_Re * b_Im) - ((long long) a_Im * b_Re)) >> 32; + + __asm__ ("mult %[a_Re], %[b_Im];\n" + "madd %[a_Im], %[b_Re];\n" + "mfhi %[result];\n" + : [result]"=r"(result) + : [a_Re]"r"(a_Re), [b_Im]"r"(b_Im), [a_Im]"r"(a_Im), [b_Re]"r"(b_Re) + : "lo"); *c_Im = result; } #endif @@ -123,10 +136,24 @@ inline void cplxMult( FIXP_DBL *c_Re, FIXP_DBL b_Re, FIXP_DBL b_Im) { - INT result; - result = (((long long)a_Re * b_Re) - ((long long) a_Im * b_Im)) >> 32; + INT result; + + __asm__ ("mult %[a_Re], %[b_Re];\n" + "msub %[a_Im], %[b_Im];\n" + "mfhi %[result];\n" + //"extr_w %[result], 31;\n" + : [result]"=r"(result) + : [a_Re]"r"(a_Re), [b_Re]"r"(b_Re), [a_Im]"r"(a_Im), [b_Im]"r"(b_Im) + : "lo"); *c_Re = result<<1; - result = (((long long)a_Re * b_Im) - ((long long) a_Im * b_Re)) >> 32; + + __asm__ ("mult %[a_Re], %[b_Im];\n" + "madd %[a_Im], %[b_Re];\n" + "mfhi %[result];\n" + //"extr_w %[result], 31;\n" + : [result]"=r"(result) + : [a_Re]"r"(a_Re), [b_Im]"r"(b_Im), [a_Im]"r"(a_Im), [b_Re]"r"(b_Re) + : "lo"); *c_Im = result<<1; } #endif diff --git a/libFDK/include/mips/fixmul_mips.h b/libFDK/include/mips/fixmul_mips.h index 0e7af0d..62d059e 100644 --- a/libFDK/include/mips/fixmul_mips.h +++ b/libFDK/include/mips/fixmul_mips.h @@ -100,11 +100,14 @@ amm-info@iis.fraunhofer.de inline INT fixmuldiv2_DD (const INT a, const INT b) { - - return ((long long) a * b) >> 32; + INT result ; + result = ((long long)a * b)>>32; + return result ; } #endif /* (__GNUC__) && defined(__mips__) */ #endif /* __mips__ */ +#define FUNCTION_fixmulBitExact_DD +#define fixmulBitExact_DD fixmul_DD diff --git a/libFDK/include/x86/clz_x86.h b/libFDK/include/x86/clz_x86.h new file mode 100644 index 0000000..db7970d --- /dev/null +++ b/libFDK/include/x86/clz_x86.h @@ -0,0 +1,154 @@ + +/* ----------------------------------------------------------------------------------------------------------- +Software License for The Fraunhofer FDK AAC Codec Library for Android + + Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Frderung der angewandten Forschung e.V. + All rights reserved. + + 1. INTRODUCTION +The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements +the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. +This FDK AAC Codec software is intended to be used on a wide variety of Android devices. + +AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual +audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by +independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part +of the MPEG specifications. + +Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) +may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners +individually for the purpose of encoding or decoding bit streams in products that are compliant with +the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license +these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec +software may already be covered under those patent licenses when it is used for those licensed purposes only. + +Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, +are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional +applications information and documentation. + +2. COPYRIGHT LICENSE + +Redistribution and use in source and binary forms, with or without modification, are permitted without +payment of copyright license fees provided that you satisfy the following conditions: + +You must retain the complete text of this software license in redistributions of the FDK AAC Codec or +your modifications thereto in source code form. + +You must retain the complete text of this software license in the documentation and/or other materials +provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. +You must make available free of charge copies of the complete source code of the FDK AAC Codec and your +modifications thereto to recipients of copies in binary form. + +The name of Fraunhofer may not be used to endorse or promote products derived from this library without +prior written permission. + +You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec +software or your modifications thereto. + +Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software +and the date of any change. For modified versions of the FDK AAC Codec, the term +"Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term +"Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." + +3. NO PATENT LICENSE + +NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, +ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with +respect to this software. + +You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized +by appropriate patent licenses. + +4. DISCLAIMER + +This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors +"AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties +of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, +including but not limited to procurement of substitute goods or services; loss of use, data, or profits, +or business interruption, however caused and on any theory of liability, whether in contract, strict +liability, or tort (including negligence), arising in any way out of the use of this software, even if +advised of the possibility of such damage. + +5. CONTACT INFORMATION + +Fraunhofer Institute for Integrated Circuits IIS +Attention: Audio and Multimedia Departments - FDK AAC LL +Am Wolfsmantel 33 +91058 Erlangen, Germany + +www.iis.fraunhofer.de/amm +amm-info@iis.fraunhofer.de +----------------------------------------------------------------------------------------------------------- */ + +/*************************** Fraunhofer IIS FDK Tools ********************** + + Author(s): + Description: fixed point intrinsics + +******************************************************************************/ + +#if defined(__GNUC__) && (defined(__x86__) || defined(__x86_64__)) + + #define FUNCTION_fixnormz_D + #define FUNCTION_fixnorm_D + + inline INT fixnormz_D(LONG value) + { + INT result; + + if (value != 0) { + result = __builtin_clz(value); + } else { + result = 32; + } + return result; + } + + inline INT fixnorm_D(LONG value) + { + INT result; + if (value == 0) { + return 0; + } + if (value < 0) { + value = ~value; + } + result = fixnormz_D(value); + return result - 1; + } + + +#elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64)) + +#include + + #define FUNCTION_fixnormz_D + #define FUNCTION_fixnorm_D + + inline INT fixnormz_D(LONG value) + { + unsigned long result = 0; + unsigned char err; + err = _BitScanReverse(&result, value); + if (err) { + return 31 - result; + } else { + return 32; + } + } + + inline INT fixnorm_D(LONG value) + { + INT result; + if (value == 0) { + return 0; + } + if (value < 0) { + value = ~value; + } + result = fixnormz_D(value); + return result - 1; + } + +#endif /* toolchain */ diff --git a/libFDK/src/FDK_core.cpp b/libFDK/src/FDK_core.cpp index 98a051f..8a07aa9 100644 --- a/libFDK/src/FDK_core.cpp +++ b/libFDK/src/FDK_core.cpp @@ -93,7 +93,7 @@ amm-info@iis.fraunhofer.de /* FDK tools library info */ #define FDK_TOOLS_LIB_VL0 2 #define FDK_TOOLS_LIB_VL1 2 -#define FDK_TOOLS_LIB_VL2 7 +#define FDK_TOOLS_LIB_VL2 8 #define FDK_TOOLS_LIB_TITLE "FDK Tools" #define FDK_TOOLS_LIB_BUILD_DATE __DATE__ #define FDK_TOOLS_LIB_BUILD_TIME __TIME__ diff --git a/libPCMutils/src/pcmutils_lib.cpp b/libPCMutils/src/pcmutils_lib.cpp index 4272548..e0a9817 100644 --- a/libPCMutils/src/pcmutils_lib.cpp +++ b/libPCMutils/src/pcmutils_lib.cpp @@ -96,7 +96,7 @@ amm-info@iis.fraunhofer.de /* Decoder library info */ #define PCMDMX_LIB_VL0 2 -#define PCMDMX_LIB_VL1 2 +#define PCMDMX_LIB_VL1 3 #define PCMDMX_LIB_VL2 1 #define PCMDMX_LIB_TITLE "PCM Downmix Lib" #define PCMDMX_LIB_BUILD_DATE __DATE__ @@ -107,7 +107,7 @@ amm-info@iis.fraunhofer.de #define PCM_DMX_MAX_CHANNELS ( 8 ) #define PCM_DMX_MAX_CHANNEL_GROUPS ( 4 ) #define PCM_DMX_MAX_CHANNELS_PER_GROUP ( 3 ) /* The maximum over all groups */ -#define PCMDMX_DFLT_EXPIRY_FRAME ( 40 ) /* At least 400ms (FL 960 @ 96kHz) */ +#define PCMDMX_DFLT_EXPIRY_FRAME ( 50 ) /* At least 500ms (FL 960 @ 96kHz) */ /* Fixed and unique channel group indices. * The last group index has to be smaller than PCM_DMX_MAX_CHANNEL_GROUPS. */ @@ -264,7 +264,6 @@ C_ALLOC_MEM_STATIC(PcmDmxInstance, struct PCM_DMX_INSTANCE, 1) * @param [in] The total number of channels of the given configuration. * @param [in] Array holding the corresponding channel types for each channel. * @param [in] Array holding the corresponding channel type indices for each channel. - * @param [in] Array containing the channel mapping to be used (From MPEG PCE ordering to whatever is required). * @param [out] Array where the buffer offsets for each channel are stored into. * @returns Returns the packed channel mode. **/ @@ -273,7 +272,6 @@ PCM_DMX_CHANNEL_MODE getChannelMode ( const INT numChannels, /* in */ const AUDIO_CHANNEL_TYPE channelType[], /* in */ const UCHAR channelIndices[], /* in */ - const UCHAR channelMapping[PCM_DMX_MAX_CHANNELS], /* in */ UCHAR offsetTable[PCM_DMX_MAX_CHANNELS] /* out */ ) { @@ -284,12 +282,12 @@ PCM_DMX_CHANNEL_MODE getChannelMode ( FDK_ASSERT(channelType != NULL); FDK_ASSERT(channelIndices != NULL); - FDK_ASSERT(channelMapping != NULL); FDK_ASSERT(offsetTable != NULL); /* For details see ISO/IEC 13818-7:2005(E), 8.5.3 Channel configuration */ FDKmemclear(numChInGrp, PCM_DMX_MAX_CHANNEL_GROUPS*sizeof(UCHAR)); FDKmemset(offsetTable, 255, PCM_DMX_MAX_CHANNELS*sizeof(UCHAR)); + FDKmemset(chIdx, 255, PCM_DMX_MAX_CHANNEL_GROUPS*PCM_DMX_MAX_CHANNELS_PER_GROUP*sizeof(UCHAR)); /* Categorize channels */ for (ch = 0; ch < numChannels; ch += 1) { @@ -335,7 +333,7 @@ PCM_DMX_CHANNEL_MODE getChannelMode ( if (numChInGrp[CH_GROUP_FRONT] & 0x1) { /* Odd number of front channels -> we have a center channel. In MPEG-4 the center has the index 0. */ - offsetTable[CENTER_FRONT_CHANNEL] = channelMapping[chIdx[CH_GROUP_FRONT][0]]; + offsetTable[CENTER_FRONT_CHANNEL] = chIdx[CH_GROUP_FRONT][0]; } for (grpIdx = 0; grpIdx < PCM_DMX_MAX_CHANNEL_GROUPS; grpIdx += 1) { @@ -367,7 +365,7 @@ PCM_DMX_CHANNEL_MODE getChannelMode ( for ( ; ch < numChInGrp[grpIdx]; ch += 1) { if (ch < maxChannels) { - offsetTable[chMapPos] = channelMapping[chIdx[grpIdx][ch]]; + offsetTable[chMapPos] = chIdx[grpIdx][ch]; chMapPos += 1; } else { err = -1; @@ -814,7 +812,6 @@ PCMDMX_ERROR pcmDmx_ApplyFrame ( numInChannels, channelType, channelIndices, - channelMapping[numInChannels], inOffsetTable ); if (inChMode == CH_MODE_UNDEFINED) { diff --git a/libSBRdec/src/sbr_dec.cpp b/libSBRdec/src/sbr_dec.cpp index 5a8b320..bd3cd10 100644 --- a/libSBRdec/src/sbr_dec.cpp +++ b/libSBRdec/src/sbr_dec.cpp @@ -585,14 +585,16 @@ sbr_dec ( HANDLE_SBR_DEC hSbrDec, /*!< handle to Decoder channel */ int maxShift = 0; - if (hSbrDec->sbrDrcChannel.prevFact_exp > maxShift) { - maxShift = hSbrDec->sbrDrcChannel.prevFact_exp; - } - if (hSbrDec->sbrDrcChannel.currFact_exp > maxShift) { - maxShift = hSbrDec->sbrDrcChannel.currFact_exp; - } - if (hSbrDec->sbrDrcChannel.nextFact_exp > maxShift) { - maxShift = hSbrDec->sbrDrcChannel.nextFact_exp; + if (hSbrDec->sbrDrcChannel.enable != 0) { + if (hSbrDec->sbrDrcChannel.prevFact_exp > maxShift) { + maxShift = hSbrDec->sbrDrcChannel.prevFact_exp; + } + if (hSbrDec->sbrDrcChannel.currFact_exp > maxShift) { + maxShift = hSbrDec->sbrDrcChannel.currFact_exp; + } + if (hSbrDec->sbrDrcChannel.nextFact_exp > maxShift) { + maxShift = hSbrDec->sbrDrcChannel.nextFact_exp; + } } /* copy DRC data to right channel (with PS both channels use the same DRC gains) */ diff --git a/libSBRdec/src/sbrdec_drc.cpp b/libSBRdec/src/sbrdec_drc.cpp index ce5247a..7497b66 100644 --- a/libSBRdec/src/sbrdec_drc.cpp +++ b/libSBRdec/src/sbrdec_drc.cpp @@ -115,17 +115,17 @@ void sbrDecoder_drcInitChannel ( } for (band = 0; band < (64); band++) { - hDrcData->prevFact_mag[band] = (FIXP_DBL)MAXVAL_DBL /*FL2FXCONST_DBL(1.0f)*/; + hDrcData->prevFact_mag[band] = FL2FXCONST_DBL(0.5f); } for (band = 0; band < SBRDEC_MAX_DRC_BANDS; band++) { - hDrcData->currFact_mag[band] = (FIXP_DBL)MAXVAL_DBL /*FL2FXCONST_DBL(1.0f)*/; - hDrcData->nextFact_mag[band] = (FIXP_DBL)MAXVAL_DBL /*FL2FXCONST_DBL(1.0f)*/; + hDrcData->currFact_mag[band] = FL2FXCONST_DBL(0.5f); + hDrcData->nextFact_mag[band] = FL2FXCONST_DBL(0.5f); } - hDrcData->prevFact_exp = 0; - hDrcData->currFact_exp = 0; - hDrcData->nextFact_exp = 0; + hDrcData->prevFact_exp = 1; + hDrcData->currFact_exp = 1; + hDrcData->nextFact_exp = 1; hDrcData->numBandsCurr = 0; hDrcData->numBandsNext = 0; @@ -238,7 +238,7 @@ void sbrDecoder_drcApplySlot ( } else { if (j >= offset[hDrcData->drcInterpolationSchemeCurr - 1]) { - alphaValue = FL2FXCONST_DBL(1.0f); + alphaValue = (FIXP_DBL)MAXVAL_DBL; } } } @@ -262,7 +262,7 @@ void sbrDecoder_drcApplySlot ( } else { if (j >= offset[hDrcData->drcInterpolationSchemeNext - 1]) { - alphaValue = FL2FXCONST_DBL(1.0f); + alphaValue = (FIXP_DBL)MAXVAL_DBL; } } @@ -301,7 +301,7 @@ void sbrDecoder_drcApplySlot ( } else { if (j >= offset[hDrcData->drcInterpolationSchemeNext - 1]) { - alphaValue = FL2FXCONST_DBL(1.0f); + alphaValue = (FIXP_DBL)MAXVAL_DBL; } } } @@ -322,7 +322,7 @@ void sbrDecoder_drcApplySlot ( for (band = 0; band < (int)numBands; band++) { int bottomQmf, topQmf; - FIXP_DBL drcFact_mag = FL2FXCONST_DBL(1.0f); + FIXP_DBL drcFact_mag = (FIXP_DBL)MAXVAL_DBL; topMdct = (bandTop[band]+1) << 2; @@ -361,7 +361,13 @@ void sbrDecoder_drcApplySlot ( } /* interpolate */ - drcFact_mag = fMult(alphaValue, drcFact2_mag) + fMult((FL2FXCONST_DBL(1.0f) - alphaValue), drcFact1_mag); + if (alphaValue == (FIXP_DBL)0) { + drcFact_mag = drcFact1_mag; + } else if (alphaValue == (FIXP_DBL)MAXVAL_DBL) { + drcFact_mag = drcFact2_mag; + } else { + drcFact_mag = fMult(alphaValue, drcFact2_mag) + fMult(((FIXP_DBL)MAXVAL_DBL - alphaValue), drcFact1_mag); + } /* apply scaling */ qmfRealSlot[bin] = fMult(qmfRealSlot[bin], drcFact_mag); @@ -481,6 +487,15 @@ void sbrDecoder_drcApply ( int col; int maxShift = 0; + if (hDrcData == NULL) { + return; + } + if ( (hDrcData->enable == 0) + || ((hDrcData->numBandsCurr == 0) && (hDrcData->numBandsNext == 0)) + ) { + return; /* Avoid changing the scaleFactor even though the processing is disabled. */ + } + /* get max scale factor */ if (hDrcData->prevFact_exp > maxShift) { maxShift = hDrcData->prevFact_exp; diff --git a/libSBRdec/src/sbrdec_drc.h b/libSBRdec/src/sbrdec_drc.h index 2577e89..14deff7 100644 --- a/libSBRdec/src/sbrdec_drc.h +++ b/libSBRdec/src/sbrdec_drc.h @@ -94,6 +94,7 @@ amm-info@iis.fraunhofer.de #include "sbrdecoder.h" + #define SBRDEC_MAX_DRC_CHANNELS (6) #define SBRDEC_MAX_DRC_BANDS ( 16 ) diff --git a/libSBRdec/src/sbrdecoder.cpp b/libSBRdec/src/sbrdecoder.cpp index a40e5ba..192bdd2 100644 --- a/libSBRdec/src/sbrdecoder.cpp +++ b/libSBRdec/src/sbrdecoder.cpp @@ -137,7 +137,7 @@ amm-info@iis.fraunhofer.de /* Decoder library info */ #define SBRDECODER_LIB_VL0 2 #define SBRDECODER_LIB_VL1 1 -#define SBRDECODER_LIB_VL2 2 +#define SBRDECODER_LIB_VL2 3 #define SBRDECODER_LIB_TITLE "SBR Decoder" #define SBRDECODER_LIB_BUILD_DATE __DATE__ #define SBRDECODER_LIB_BUILD_TIME __TIME__ @@ -533,7 +533,7 @@ SBR_ERROR sbrDecoder_InitElement ( FDKmemclear(self->pSbrElement[elementIndex]->frameErrorFlag, ((1)+1)*sizeof(UCHAR)); /* Initialize this instance */ - sbrError = sbrDecoder_ResetElement( + sbrError = sbrDecoder_ResetElement( self, sampleRateIn, sampleRateOut, @@ -577,7 +577,7 @@ SBR_ERROR sbrDecoder_HeaderUpdate( ) { SBR_ERROR errorStatus = SBRDEC_OK; - + /* change of control data, reset decoder */ @@ -818,6 +818,7 @@ SBR_ERROR sbrDecoder_drcFeedChannel ( HANDLE_SBRDECODER self, USHORT *pBandTop ) { SBRDEC_DRC_CHANNEL *pSbrDrcChannelData = NULL; + int band, isValidData = 0; if (self == NULL) { return SBRDEC_NOT_INITIALIZED; @@ -826,10 +827,21 @@ SBR_ERROR sbrDecoder_drcFeedChannel ( HANDLE_SBRDECODER self, return SBRDEC_SET_PARAM_FAIL; } + /* Search for gain values different to 1.0f */ + for (band = 0; band < numBands; band += 1) { + if ( !((pNextFact_mag[band] == FL2FXCONST_DBL(0.5)) && (nextFact_exp == 1)) + && !((pNextFact_mag[band] == (FIXP_DBL)MAXVAL_DBL) && (nextFact_exp == 0)) ) { + isValidData = 1; + break; + } + } + /* Find the right SBR channel */ pSbrDrcChannelData = sbrDecoder_drcGetChannel( self, ch ); if ( pSbrDrcChannelData != NULL ) { + if ( pSbrDrcChannelData->enable || isValidData ) + { /* Activate processing only with real and valid data */ int i; pSbrDrcChannelData->enable = 1; @@ -844,6 +856,7 @@ SBR_ERROR sbrDecoder_drcFeedChannel ( HANDLE_SBRDECODER self, pSbrDrcChannelData->nextFact_mag[i] = pNextFact_mag[i]; } } + } return SBRDEC_OK; } -- cgit v1.2.3