From 316f6159b003f9e53ad4e1e0fa1fdbd2f52e83a6 Mon Sep 17 00:00:00 2001 From: zhaolewei <739043667@qq.com> Date: Thu, 6 Sep 2018 10:53:02 +0800 Subject: [PATCH] test --- app/build.gradle | 4 +- recorderlib/build.gradle | 1 - recorderlib/libs/arm64-v8a/libmp3lame.so | Bin 235352 -> 0 bytes recorderlib/libs/armeabi-v7a/libmp3lame.so | Bin 169492 -> 0 bytes recorderlib/libs/mips/libmp3lame.so | Bin 279956 -> 0 bytes recorderlib/libs/mips64/libmp3lame.so | Bin 273256 -> 0 bytes recorderlib/libs/x86/libmp3lame.so | Bin 255444 -> 0 bytes recorderlib/libs/x86_64/libmp3lame.so | Bin 252000 -> 0 bytes recorderlib/src/main/jni/Android.mk | 32 - recorderlib/src/main/jni/Application.mk | 4 - recorderlib/src/main/jni/Mp3Encoder.c | 58 - recorderlib/src/main/jni/Mp3Encoder.h | 28 - .../main/jni/lame-3.100_libmp3lame/VbrTag.c | 1082 ------- .../main/jni/lame-3.100_libmp3lame/VbrTag.h | 79 - .../jni/lame-3.100_libmp3lame/bitstream.c | 1111 ------- .../jni/lame-3.100_libmp3lame/bitstream.h | 40 - .../main/jni/lame-3.100_libmp3lame/encoder.c | 574 ---- .../main/jni/lame-3.100_libmp3lame/encoder.h | 156 - .../src/main/jni/lame-3.100_libmp3lame/fft.c | 338 --- .../src/main/jni/lame-3.100_libmp3lame/fft.h | 35 - .../jni/lame-3.100_libmp3lame/gain_analysis.c | 476 --- .../jni/lame-3.100_libmp3lame/gain_analysis.h | 109 - .../main/jni/lame-3.100_libmp3lame/id3tag.c | 1926 ------------ .../main/jni/lame-3.100_libmp3lame/id3tag.h | 64 - .../main/jni/lame-3.100_libmp3lame/l3side.h | 95 - .../jni/lame-3.100_libmp3lame/lame-analysis.h | 96 - .../src/main/jni/lame-3.100_libmp3lame/lame.c | 2665 ----------------- .../src/main/jni/lame-3.100_libmp3lame/lame.h | 1342 --------- .../lame-3.100_libmp3lame/lame_global_flags.h | 184 -- .../jni/lame-3.100_libmp3lame/lameerror.h | 26 - .../main/jni/lame-3.100_libmp3lame/machine.h | 189 -- .../lame-3.100_libmp3lame/mpglib_interface.c | 477 --- .../main/jni/lame-3.100_libmp3lame/newmdct.c | 1039 ------- .../main/jni/lame-3.100_libmp3lame/newmdct.h | 27 - .../main/jni/lame-3.100_libmp3lame/presets.c | 404 --- .../main/jni/lame-3.100_libmp3lame/psymodel.c | 2167 -------------- .../main/jni/lame-3.100_libmp3lame/psymodel.h | 64 - .../main/jni/lame-3.100_libmp3lame/quantize.c | 2050 ------------- .../main/jni/lame-3.100_libmp3lame/quantize.h | 38 - .../jni/lame-3.100_libmp3lame/quantize_pvt.c | 1074 ------- .../jni/lame-3.100_libmp3lame/quantize_pvt.h | 128 - .../jni/lame-3.100_libmp3lame/reservoir.c | 293 -- .../jni/lame-3.100_libmp3lame/reservoir.h | 31 - .../main/jni/lame-3.100_libmp3lame/set_get.c | 2346 --------------- .../main/jni/lame-3.100_libmp3lame/set_get.h | 75 - .../main/jni/lame-3.100_libmp3lame/tables.c | 564 ---- .../main/jni/lame-3.100_libmp3lame/tables.h | 95 - .../main/jni/lame-3.100_libmp3lame/takehiro.c | 1375 --------- .../src/main/jni/lame-3.100_libmp3lame/util.c | 1018 ------- .../src/main/jni/lame-3.100_libmp3lame/util.h | 616 ---- .../jni/lame-3.100_libmp3lame/vbrquantize.c | 1580 ---------- .../jni/lame-3.100_libmp3lame/vbrquantize.h | 28 - .../main/jni/lame-3.100_libmp3lame/version.c | 254 -- .../main/jni/lame-3.100_libmp3lame/version.h | 68 - 54 files changed, 2 insertions(+), 26523 deletions(-) delete mode 100644 recorderlib/libs/arm64-v8a/libmp3lame.so delete mode 100644 recorderlib/libs/armeabi-v7a/libmp3lame.so delete mode 100644 recorderlib/libs/mips/libmp3lame.so delete mode 100644 recorderlib/libs/mips64/libmp3lame.so delete mode 100644 recorderlib/libs/x86/libmp3lame.so delete mode 100644 recorderlib/libs/x86_64/libmp3lame.so delete mode 100644 recorderlib/src/main/jni/Android.mk delete mode 100644 recorderlib/src/main/jni/Application.mk delete mode 100644 recorderlib/src/main/jni/Mp3Encoder.c delete mode 100644 recorderlib/src/main/jni/Mp3Encoder.h delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/VbrTag.c delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/VbrTag.h delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/bitstream.c delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/bitstream.h delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/encoder.c delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/encoder.h delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/fft.c delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/fft.h delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/gain_analysis.c delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/gain_analysis.h delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/id3tag.c delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/id3tag.h delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/l3side.h delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/lame-analysis.h delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/lame.c delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/lame.h delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/lame_global_flags.h delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/lameerror.h delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/machine.h delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/mpglib_interface.c delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/newmdct.c delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/newmdct.h delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/presets.c delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/psymodel.c delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/psymodel.h delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/quantize.c delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/quantize.h delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/quantize_pvt.c delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/quantize_pvt.h delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/reservoir.c delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/reservoir.h delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/set_get.c delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/set_get.h delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/tables.c delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/tables.h delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/takehiro.c delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/util.c delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/util.h delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/vbrquantize.c delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/vbrquantize.h delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/version.c delete mode 100644 recorderlib/src/main/jni/lame-3.100_libmp3lame/version.h diff --git a/app/build.gradle b/app/build.gradle index 1f8e65a..2a54be0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,7 +21,7 @@ android { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:26.1.0' - androidTestCompile('com.android.support:support-annotations:26.1.0') { + androidTestImplementation('com.android.support:support-annotations:26.1.0') { force = true } testImplementation 'junit:junit:4.12' @@ -33,5 +33,5 @@ dependencies { annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' } implementation 'com.blankj:utilcode:1.18.0' - compile project(path: ':recorderlib') + implementation project(path: ':recorderlib') } diff --git a/recorderlib/build.gradle b/recorderlib/build.gradle index aa46700..706b1a5 100644 --- a/recorderlib/build.gradle +++ b/recorderlib/build.gradle @@ -21,7 +21,6 @@ android { } } sourceSets.main { - jni.srcDirs = []//disable automatic ndk-build call jniLibs.srcDirs = ['libs'] } } diff --git a/recorderlib/libs/arm64-v8a/libmp3lame.so b/recorderlib/libs/arm64-v8a/libmp3lame.so deleted file mode 100644 index 3444c5df15089c9510380621fac2506b63a19d00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 235352 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℘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
+lRXk5vqSGeUvuO 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 JY+FA||0gF>z6JmQ diff --git a/recorderlib/libs/armeabi-v7a/libmp3lame.so b/recorderlib/libs/armeabi-v7a/libmp3lame.so deleted file mode 100644 index 7b38ac8f98d0877197703a6997ec1f585188ec47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 169492 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

18MKLo$T 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 Cell7B diff --git a/recorderlib/libs/mips64/libmp3lame.so b/recorderlib/libs/mips64/libmp3lame.so deleted file mode 100644 index f49cc3b4e976690f882ffe6206f9955573b9d586..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 273256 zcmeEv3w&Hvo&WF7Oq1yYn6@c|_e?U=P9Fnlo02I;n6xFPQZTe2L0L1?Owt6BW=K*< zU64t67$AgLszzlsDG#e#OL!<*MNCRxKDX|wRJJw&3KSRD=&}%{cK+YrJ-<7Tlk@@W zYd`-EoSysp-E+_Ro!|Mr&g0(Pe%Xprn_-akvy+n;3f-kJA-S=|>oBjf9n=$|AWfnW zolR$vohZh4Vm4J!&vWH@D|ZUaZA_5s@v`BUP&0m3P9|0A-z>iIy1GxVE4r+_;xxWV zwD(M_Pbz2fOghbnL9dpV3;kAZ(aFznDwFbh?!`U+Svi;GALpFPq#t_T&4uu@a_hPB zS6iZd{i83c{^_}QviTTUx%J#tcuq)E1&;HtOYX0f_KwC+nkWS&x43$o>c`x+_zB6% zve{%XQOc^%@T*5+L{E-+m=Q50Empa4%ZyVlkx2ZvRTgbo&5fxqy<8$;+-^Oix0_xr zJ6Q-9?~}gUDe-%&8hZgHtZTi#^mcC_A(8U2?IsfTr>r_eLlmgdcPY^Zt6WB|l}ntK zqVM)&(RX{Q+@-E#(U%&JL?Zj>T?<~ok;wR1#*s_0?{Tz@7ET0rBQUxuWIyz0kljQk_q#-fKWcfF1;9MiB=BZM? z;-l(9s-bex;OTPTq6hqe2~6|Wvs00KkRHOd6L|z_ z4bmheKhnpMew;?$ZMa^J^b4flA_b8?kMujFok)c!??$>G*VZ`w7p`|9E#`a3t>35R z;vM9y@a)$=B{J!n@HC0Qn~OV-!9j; zAm1z3oP8DPAQF$$V@Qu9^&mZu^kKBazaOZK$^hRfxK{+n*+!(-kp2Vd6G*d=eulIK z>2@Rzv6_+d??t3NMWSSNE3mxe)r(wp9ScY z{8r@uiS#jnIXeTX1nC*1uOJ=m*Nz*%M*0^dFWUJ6@_cD83;A7u4^xb_QtgXBL!{#~SLND~ED zA^B-|rUln?koO}WK$?u}xyW}QeG=FIgS;2%i%8cZ{RrthNc{V<%4ikJ@$X%vUm{)4 z0Ddna-DzGC{X6pimg|2-UM|;1%i5&QquoCi{?`A+v!|irIy@gks@CdhPJ?F)0oMwy zQF6OR*j0l6hqPx`;`*aVGg0=MG`#hw2N(4kejacwz}Nj_WhkK*3(eixv?YAL^33SWjCK8~(HYC^h1?&FfqlWQlgD{*}} z@_^u6TmZkN0$1VMhjfO(e9!uw4crO$Y`X99OB(t5$gk=G*G<(W%x zJs;OMB30u0Dx}3o=L4RLbPCcVfFD3wgLFG!>*vCCD}XN{`EZ>hH-b{88gL!bS%A-$ zdr`^XLOuiOR|2n-XTr$8$vEV9Ao~o`Aj9~50Jv#LXX3gP`ISfs^Um0R{sE{OL0^sB zhO!^fid_I)8*sCbS0McX*AFATfpjTg{+*8eAJrv&1lPraXH=fxKPb3WfG?EmY`M1* zc{Xs1kpB_sUcqy=3@HcqZbtr($Q|*@MuRli05&4Ta$VJ7|&1RY#{c(=k^ zOLax76?3-23k3~*~A64yIa&m*%?TWV@WeTn@@)zcz)uZ)*d8?R|1Co!=P^-}%| zGVVc5?>-@Xc1r!0{2!Ehw){f1YxTEQ#<%v%3UBe}Ey4RW`}{?*&wYm!1AZp-TqF8Y zCU({8?+e0*&`&e_`w`Kjf$u83RlZs5L%H~Ci=J{*uFyGIAC+e5--Mrg`!ef!L-6h= zGx5Iy*(@hr!>Wc`WgO>9d8f#;Mb9UWBF|x=KPLXyD&HsL*eCYNqQ772C(XXKN&R}9 z^DC*pO!UR7zZusC)FkzUzK~hZLK*iS!CQ2mD|qLZRCx>krtqgn;s;CLmrJ|3J2K0kV#&E? zZ?6=+4okdh@%htIey_;0)$UG9zkaUjFPHvuc+CARe?=hr)iI zTk|{T2|oTuRo>!rzVNwkr=rv1Ŵ-pL9dH(SA)r}TG}7sK%jng3!fLipVNOlCcQ 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�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%0D(9BZ8Evg{U7 z%-pWuh?eO*jFC}9m3b{{AikIuOr;uyB-tw}c=5Qx&Zf2knm&8$d55^ULw)a($ z-aIGJre%Z*bvCp1+v)m+$%!Jh@G~TBEmGgvRiwUkvPkVZ z#%TXSGINpodMXYFEaSjV)zi4;%P-KiR-Mx|o-AV|TTqI+*;M4&AykVf51OUjHxWmy z{%hYs<(h4GMd8(+mZ<6VgMG_PRqaAIA#+a)thlNX9M8fMy}MEyV!@!8KwP)s_P?ga z)cRc5*6bjuZaiD4ZbDYumXX}#(YN~K_A}wuCbvZx z^&yR;&2IDPC1y9*-8Cn)neDs6Pn+2$!HuG;Qxr_KaC=$;w_-!teGEnW87Ax&@x5c7 zhiJl3k26!x3Na39#gYk}cisX|ee&6_Gl0cbc_J-=mp=qxYm*)bt?)rCwY0 z31+o=FWlG~vLpqoQ^zSBt^6KMGmlkGuB(K6&kf9SieZqn8!ddXZw9uQ%`m*InGkVn z;J?d7Aja9Qw3Hxfvdf&LcwX_PjWt1ZEH%4&s^ZMKa{`y3aj9K)3FYF_a_?*dE1H6) zMHy~TwqDolFb>TTU6aV_7tIVqAFCiV0C4-3SYf)BAu~v z-yBV|+ptHjgd@X&T`f2;G=8~Js z3eO4GH=)SI9q(~V%&zmiL+W-{{S(IVxm~z+Z;yq`(sc>GzRK^4UumoTz;#}I0qz-1 zv#gwIs?V@rO4o#_uAxOR%It+@8w;Bk_*OD^%wuu&Y4*!%f;UW`ngNTIM_=*FF0Bd9 zoHTv%vWYc8kO{6z(5aadTzAw2*$S@w&fihf1ZQX5JbT$SHNhK^*fqT-m^FP;rfW(~ zaL&|OnXc&BOM1I+I?TwxwC~Y6bWQc%W_8~iYpNQ8JNv1f=QI9WYOM-4WaonFPx;j6?z}NP3P)r)OU%gl3JqT2vCAo|jmdD*|cGWVp z>YvmrcGwNa?-06!2Da;4m|Ww%HQWdRTi>GfZhCyg%ey96EKyEa$Bbe zyPEYBw>(_8ZAT$Evls7(R4+||v_m5vsSAo=7U~-ByB z=WsPv>aNeXcsdlW3la8Ab3EN8p{_& z&(w;BJC4O~MfPyps7a^5j@MYgTH6fYSg;`!v^|gxPWhh^t4!a5-~ zq!Y00q)ylkoiN2xZ}|e9@ON1@RG2|8XcxckdX{=Y{FuE|4j3=6ab}pXo%ATkT9G;fipJ%-Y~Xfw(x z45&EI6eI>`(tFBF+F(F5uS70NG>}%H8 zUOL5>yHZ|W020>N^Kh_FHt{eZ@L%ASsu%`g>vH{g!1xsq)v05}2E$QoDY#O_95N?x zv_MP66GUupGabyOZ~3Os$j+QQlfo9L&>|s%zWmICI#B8PzeIbi2}XU1_Go8&_+-sQd(elUFKmxD=J#k1rt94vv$RNGsy!xV zOwiiHclb-R2e!X>M-ArN-B65}H!8i`#FQI!m0)qp?R(sP`<=!g*N^JdwwmMC@8CwQ zia%;b3(}n9S;50LeXo9nSkrJJvO+E$v8KK`%X1KFl8ccKKGhk;CcjvbNdu)Te3zXT zX2HqsD}Ut3*uVog>Bpd_Xo@v7<9fHSYWT_qk8n`V z#pb-Pk&S|eOl#-r7h1ySo`zEyv8b9O4gmu@4(a(>wA8w&%j1l#XnKX`ZN1i`&)}*9 zg5`Ka8XMjZ=l&a?s`1&?1-n2_xWK!McCp$AycuPl|>;JO$KJZah*P{PS zGQa?%XOO7TrZU#iCX&YunzqRWZNQj-jSy=JK~ZT-DO##jCxC4X31<@KaB>hU^-r(A z>bc2^270^NeOWt?wea>Wp=&SGk^7&-W{=4?x zYp=cc+H0@9c4!!w*eVBK=ieDwRq3ycx7Y2P*skxeuqzEns_|0-j4h}n(bPg?OE-pqo8Kj$$N^9Ag>T6P=`hL*ea)OLFnLyZ1Rf8StoYns(Sjj5Asf!dtbGXrOPb z`p|xtZem$hH@+f!B7~_sEocf9aE<`>{^oQFphMw(F+8`_eiB~h>Bhm zM{C<5uOL(+`^FrmH4YXQY~tkZS#@&Pvw-<4#NiWLzNk=QM3TnNX+kz4CFs{&IGvQ^ zgR_l|i#eHNsre;|IERBe6FaQ_1=i68$*y304@ZF~otaxR3N?|Mk9KD6CdfQCa%qjR zahF}p$-@$X6B8R|fd$r~1<9n&z0>&#xsRA9&*yA;MH8!&^AqwCFw$tb6EE##qY@4K z>dx=Ii#Y-SL8~hrYQ%4rz&s30dn82iX&gpQ_t*VZHVV%5!?r*=1EoE8$r(uR<&vHi z$k>QZ)q>Kh+MxBCoQ*Wgh7Vc_THVQ%h{Ph|2;;agu_*c#=A?@R+aFRV5j;DAv$nvQ z4it2%$62Y6S3U<=9LgPFfpK2P?ApYI-o5hZEQLJ?fJV5v};XYH6i=R@g6m1`{cmk)vI!E47mb%ZL^k zKB0{9b%Fvmzl4&L+e=g}4e?)qsK^JsAqH*TsKLXi)b+EK+K|jIL-%(Vb5g5zAF=aI z#e9ev#`ihRg{R!2%O8{)5Au6W@6Y4xOKs`6(y;%dELqlzW!h+TS9&qn6OY!CYNC=J zcXK9Z->0T6mWF4=w?f#j$1&u!4j=h*?Nzclli5b?-DzntNQ}fnRw$Y}IE%K6fQPo( zE7Y!~J$9z7L3_QJPSBBKuMiGi*sHDdoiBD4Nd!{r2`^cfy+SdGXi9l;_j_@j4B-3= zNT0j32xra(OAE|_3zkOBlNT%mi`j}aFfpL2~hoC4f&lRQTrcVenW}{Pk=`|>2-<)h?43KC-Q{bk7 zfu$FqfIuw%?xklbo$2a7poRShWhOs54GaXGrkyCB;R;wUI4FWzlcTBIX@qsiJJX0= zo<48Lb@k3585+z)O0O_|&bYd&CUxvR&?<|$+OP_OiJvU-TZJVvpWQD_76bzDDbXZi zZY;1@ypIcB6eEvIzXVH`ViZ%G$-qxld`I_`Q(u&8ulQK9u%-()v1v3v-sHpAu138@ zPWWO$eUw-CKkVwTxh%);#Lfyk-!_c$z2>rr-(H+&G%F!m&Yit?55j2r6K)h1wly8c zfu2G~(QC1D6^Mwx?!x9hPR&_o809_W?|YtL^nA_}=ym5yMBlk2_;!f+?CQL}i=UPD z_GOzLA(GR`94Wajr0xyr}h0! zOJ-TSVEMr#MdTA`Hbi(It_(`CXXME;wiLBUyF%3C^C(8EAH+r(8@DMPrMmERBVHp( zSXH>y+9w99^Jsp)c}y;w=SXW23g_PWWrdj7IZogj`p6XBDJNi*?lxME(DBv@>d}+g zINT`zNCPKwIb1bODej<((CJj8im<2Y_?zT>N^}uAXvoaOSm#E6-42?Ylg*u^-rt-7 zTx!B3mRs!WB-PUnySHV#yv{;CS|2zvNE~>0obHL`-4HNB+eNfw5sCfJd3`2<@{)^TW z`N6-qnj-I`?$L+3$G>Qek-m2%(*e{yE}?d2XAu3Vy#BghLsf;PP?pjB|FJ6e?&L=y zX)pDlS=``!(+Qntc6`bDqmw5MlPYC4?gnWbH?jsBM`f{o?xN~Fu+)1{P(`mRQpRRh z!K*^dPM{Vt5=EdKr?}SG$h@aGRG^O=(#D^>9F)qx>b77W%H7M)=RzxXa?Nf1b-#Dp zP$Ub50FF)n^x%Mg=q$+RgdQJBcYG*SKZqzjK4e=U<72uWA9ERabh1-E+TR%%?Q`ai z7E?+2h)QH=)K$5|LR1XwS%CjXCoob52fVHfKM#CYA{zwcB);#rUb1#vW5k8|Gmi)F zx(j0hjON}S$-FK@Oa@qgvOS3-_>CCSUWg> zcr!gpt}&h&jzX8#!8z=I!FsdzKcOn?O##`vMLByn%4fGIC%LFM;!QH(m=sh;lw~!}k6u~I)hIeH)IM4o=G+)|icdF^ZWQvk$lUhn zkwh+|nb~rn_d0$Ac;Br+EmGDMq6Ixp-t|B(af++0muNxZe~&<-5P6Z*9wI4;m7Cj6 zojpDJc*T0v*m#~x9o`hP&3Zw|Ld~FLRkX2N@P!qgJgcksT93fRm>mT$XcTc5DV&}{ z+~@s$#GOnNcL{YDu+l?CMswD2aCQ|x>7LgPdzQC;hg?O|=2EE2I^iB|IaR)}b<|nR zI)2Dp&b+=hX;>q8c5cc2tV`5fzVo8?Olk5#AX84nT&P|+SwjW7Uj7Tg{ zYb2q=WSdhFkW*%8SOKaSwW>0hs2IJfa%7?+w5oEHGvmxe#Tn-E9KUtaXcpN6qc6vv z5tcRN3RX3yk$ihr$k=$9H(>One$v%k?Mz&CX5#w>^WmVYE>5UDwSQq3$%1G%4@#F z?Cbjx*u|ke`$)W8Y~0 zv2?`_j!GFh>~Gclr`ZorU2t2Xa&+Q{A*I}-z^B1qrf>U3 z`;*EO#^bhrw`|ZW-PR|MBxa6C+%a5l+bf49dvg;r-PW58VV@EI2XZV$5LDU~tk#V-%H7(|Gv$=i=coi$DW8SOkm}1(LPLJbLx9B!Usb z115gxhYt46Fyd!I)uJ+MHc0Nn!m9N?Ed$0|2#xp%A$-E!1#vu&f4;Rp7F7$Pq~}VQ zIbOOabS^5#W<)xr2llb6FU<1TC0Ot%YA8KPX8$f3^S%En^L{Bcr@Hj8(UQOkB(N$8l`4bTHA-Nsp%ZWCsL5p%z9D4+ zUbn|s@t(9?+GNDv5T`8kUb|+{jc&WH!l~P(L@hFnz#e=BO}Ibpk9`U9$aQjpr7s!g zZIY+P7%h{=&5{WuxCl6<{a}XMkuWs=-U(b4w`a+QY^Fdy9uYFWGv9hiaDAb$9{6R@ z8RnY;zv|r4rNSrS-z8Eof$q zMRkVj4$vyHpvg?j>KJpCh(v^|kYh}Hg_4Q18}X#{0OJ0x5mTzCUj?2fTg6d&LHNJo z)WmW%LFQVAo$~C!XD@!8m7{!S*XUJQq75}Qvog37BPxw&vZium^w$Mlune7OR69$v z%@dJ3Bi3s&FwdiJB2Fl`bmv`nI#uJcVcT!BUbQ;AOIb-4l~)sDNbq8)Pc+Q;QY5%1N_MyTK(4_mJm^!WG6WaBI! zYrW*;faWmd!3Ot^GT8DvxHGW4QuuSj>{9&sHrbm(Ka)r#Jz+F26#o1tB3==+{SraT zQ2o~-_A<~{{r;OsFux<`BdiHs(j!kPDI-!7QLoYZyXJvmJZxe#|4%}Yv)<;r&G+rp z2Q0%u0V;9dw`p_0 z5-oS@5OOl^nus59?@)ZhUP$Tw>g!TXf=Ai+Js+-|QTHw&)g90sx)OFE>f!V=?#D%x z@KxIXM}1y1sIr?Yy3VmPo9+oW(%iewYm<*sHN<4M7x+!#OCIK zksz#YJ2Mx`omn+gI;Un;njP5?g?+C`X`z9DuU&~_16wYj0Bg4hdSfGuXU4?$)SU^j z1rj+Wm8B=^di%ys!RgeL_-7QHtlP`6g1;}z-*1Pa_I)DA)%la;-y``Ueewf85h!)@ zPsQn!m%90@N+tg>kYqQCu=iP2{w|UEO8y{6iD!b_KqB;wiqgYUei=@u>Kp!R3Jz0# z{Wm24Q4zSCKjvWHiAB$aO2d+8;7L)GsGgOIOi|>Z3Xveu2ROJ1f@gcf6`INNBrZ}y z${Rjd-?39mdnoUmibP|a1q;WyNwfU5<5rqvov&}_P=J@!32 z;T}EKLf%R@g0rcGjl^?Av$;&+Ov#0pFa0|6U#9jA^0a5F*s{wAxK5~@Gmf87CmA_a1Sk)Byn_g%^EGvjaP0-h%szzDf3I7Ws*wi6^QRPFVA3dx!9K;VLGE6My9^$Wy}@dMDZPNJRaGk z3+s`>k`uQV?Pil~b@%<(kp9WI?|;{8GTy_S1ascttjuKrHv30#{3N@SxY>=4oPXcI zesC}IwxZWvsmrCbV_hu|(Xjm_v_jEmnFxH=q0}^XrduVfcZUQF$@U3I_p*JgvvGWT zD3v35B%oKeqeJs_XXJU&ElSnmQ0foE$R=SNg$*fZZAPBGZXUQ+sorlSkA(G2(A6)~ z@muBltnwU6eLPqTT)tGfz)RDPwMClktXyzXP<6x7YvsJcLlcNVk|HI2Q%d@!l=Qry zC#XXUB=px3`a20_(Ur7gCG>X^`jAuEe+63XzNK@Bw+>myQwvDbw?a~bCQ1Dc?cXXF zJ4N|+KqAO45id$aheR+7sR-N>@w7zzSt7nhgl;%7zTQjlo_0Mfv-VoMyb&>TUlwPh zokC~RuK+Mq2!RVd2v$=UOBlQ^{{dUbAL5@VVSG#ZUNMD|HwkWyDtXf?AQ53VK`vhi zZj<20n3;|~G+F0ACSMAYEPuo8RD5jq2aFauk2Oz*j25*7qxfyaHxl$CisxC5%WJ_5 zStMs_FWCs1D?u)#mk7epM*Q;m1Y&rmU7d=lLb|=Eg(?d3CMr1T1ur648i}h{LnBAh+uChHVUaGm0Gj6Gn;Ea^M)RPh+)o$k4MPcd*3F#lGJLgB8v>-dP z1vx|s@JEIwQ7v*C>35S@d|yR=N9&YPnp#tg(s24`Oi0#U0BC7;w%2Tc>XxT^Cg~#P z==_q5^C4`GWadBL%P+Vguf{>@-`u?aL+340dHK!EYs8Pa7&=#{DpaWoe{_UG=EN^w zJOpAkX%u$ia@$R+e0j|44k0hM;P)w5fuT2~59gSno5Tv$4ef)yvrngqU%t!(pgKm{ ztKilT3EtraHx3EjMsV**sv^D6i3b$ttCI6w)SjEJu*VZ+gF7kdLjM!Daf{m(UU@jylhEb6Y0WL<7uze{3|fLu|P7+=d_X zm{(P_zT6HNc8w7r?=rsf)@+Q%%{3sIaE+0}ZIH|Eix zxneMEUaBaR z9G)-u7i&luW}+!`_Tj2g#%;tmR73dbg5thaH$`Z zC^A%#HB=3e5=josc?^UXam|-ruf-A?sj6{d$C8v#OszUf86S@}f)9#QJt>ng7Us%T zxwrub)(I(6A*u(WWh#VTrB85^h8`eIz6!}zn8c|{p~{p>m8)Vi`N~2HioW`FcM_y- z08wEVd0~>?4cqF4QC~0YIl_AP>OQ2I0liYD=+=Q056rLODkN{A z&ilBRS36FVH>0Y{+`Nl*-d}rp#o^9$y1b00eC+0_(s>^9@`yv{G2&xbRw1|?=B$s5 zOZlg=8jw&CDw9Gdgen()y2JHL#~`yv`*Go?Tip0uY3dk?miguk@dT77P#4A{E4;8{ zsc{6VoDe{*E`@iIaAWC>aL&AO^S%*o)!i6Iqzr1A59v0lmQZWA=ERVS`p;3LK-$s_ zbm#&o&_z*fl4^_U{l6Bw6hUcT7aj7#B)v-!4ruHZ^+uJoTv{@UAbS516-e)kV@NM( zYF5Rp2BhS9moIsQDW;Zj*KwL&D#+`Q-O@-vp`OEL}h07*!eCky$@oO6(cFO1Lz4u2@r} zi z+nk=}fd<*Qs16}P2FSZU4MXJ#G(rH*N z*6e^pvs?pywZdz~&Q%D$0fjP;KsHZAsqkiMMmE7@A;r+stsW+|BNLN#noubu%~O*v z1{}s>z189lZ%xGR>OoaN4CF63z-=pY$X*pSFM+Rup$r$>9sBwMqsE*J+w2y?uH-E$ z_J>EJ>!}#V?&7Xvjv0k9(ct>96XMbjg^Bsex!nZ7D++QN-zKNWt1MWPalZImPgQ3ToR;4%0=s%D;T#PE;;H$rc!_G7PIk)3~wYo<{q$U7b=c9e1Eb2 zny%$ucmQI}$tskwQ0uH*uK`7zm2K1rkPDra@|-oU#Y#OMya@H;k2)KoN^}v!!0d)- z*(gFq{ffnhRVhd!UR_bNF^^x(dJZ-om(Y&0;ducE!fz9pbE^k7MB72JTzQ?HdKN3I z=JOGAYYx@Qs=I?{{_-DDt%6n-GW1r}_tDaDXcZPxvC(SGd5MyA;M}B`+8h&Dg}utA zV`a#T>UN6csYbY(aNs_>RrMvZDaw^Q%R*J|QuS?BZkS1=&=yl@t3_WPV=48@w5s4- ztYQiiD)4f^dQcH74Gj-Alx`CpK6!IH$5~nR7uGL$GW(lkEs-j$*E7n^Oo6o>)I*I2 zV3nl)G(iy$lGcGN)F_y19tTMPkGl@0uQI%?+vd{KHpezbIfIo=Qa7+#w=I(X_r^_l zB&&hUJ`^YFyY#azEPXffr}*>N?J0U?g<*LKl_`qQ?Oc2S|HsrB%hlVNkh(x$mzHYilz5*o3}U2 zle%L9<58i4@9=!WGCRIjhO5+1NTPI`@o4*3h~-K{XyWT>2zKCCjkFCNb$Pmu38kKP zNS?s2N&}BJWLtqpuPS|^ejjbiEi=1?TUSysQ&t*}iM`@-&+SA$U^pd@o2LKj87 zRrH8i?v3Ya@l|PGJo*@|lz{Z$U&u^RpD|P5ZFRl7NsIRp*W0eW>s+rae8g^cy^VMU zaE({)JQT;xx%kkY1nWZobl)18ba6HxVS30T56{s)Bh#6TGLe3(FuoCq18baFtd5g_ zfv3*?Ztal%^NV(H?yX0JIGonu#X>O%@w@ayD_QN<;jJ=xL1uJESyz1cZe}p~Ym;f9 zpgXxg%V}*D2_e$_>f3zRrM~-BHQ*c#L@r5&a8DzJxN`>{l;s!FMiX8qF(yD;M$2!2 zM|EmxLz%gGcrkUtreniId*#9^zpp1{?)O9VwNC38i8{r8vK4=@n-Mm3(wO>>rG-xX zWuZE{IoA%Ymm^xP<@;{!RD*-Y+`2=E+G!2RRO=VRXi>6!ELj5UX(>;A%XOI`57~S$ z&fnQ{(q1{AS`fo!)4)RCNFN7>G;8w(G%IyG!dO})HCI)P`(Fl20)hCvX{Qx@4p(sY4IrEUFoWWby)p|aGc#%o~CjQ!Rw8+;aYIpxFmr_m{e zP^hoZeUZ<@k>Jc6kV`Hytq7`&d*$98ASP@4NHeqQM4`dMwLCfGb&As(ZKF##f%=cA z;)3$P+Yv=UVj(LRt^fCfXpRmNWKpU;ps))>dCjIMTga@8qHD9`qaw7HPE$GoeMN%^ zk>Z{B@XVs+y7UhylmdkUrL+o?F&;7C*lHs%gYO_llvyHjr!0axVC(k@=dg36xwR2= z_+rChi28=Fkuw6B1oJd=WY1hy+FgIPdiqFJqD+UEcHc8{(%QJpn9JYSoR+X=)w8j1 z@f$r3OFJpnSS@DNxe!J1OfT!AkC6%oA~2ZP%^v$*6P;(Qe*A<&H}$6B(TRJ&mEuRB zWSQ7C4(Np_b51Kz)kAPaOiaat=vhO`@U2H>wB6dFM%p6*0ivg!?5l&f?h-lz2_bu} zzYu5h9+slXPUv!$tYAZgqB*=aj|c9$m}(+Df#^e^G~9a_n9!r=y_lv`F6EVo%Fri6 zQycMZB&Qc9qbytEgdURnG4{PVqe7yoa%|F~;ku&=CQ{haCgx(;PGPL7b zYY6P!)vtMzf2OIa3uDML@?upWL^%#&T${k z9p+aD&1L!iI)jm?__$|uxaZxdz3wdF@?f3yPs_}vrUKD32u^8IYcZ7wmL95aAv1it zjN;j;7PlNW;7ZFzHdYz;g;$PaySCvHl4hRY%e>0)mr%C8Gd8Omc|m)PY|-p2Hc?`i z+HR6X_3=R68RnJ^>;o~ZIsx{8E7u97<}BCo(fefk<;W8TRfyo{Mst|rutgZ0mHOL7 zGS5Y1H03`%8Q#U*+#+itcXEXrhv;iMhrCCuo=mwm1SJHT%C1m5h!+{(ZrQ(RM?ZWx z-NDkKItM}tx5@FBv*wK@Y}wH%gQObM?3TQ{(Kz4Zks^%#TsGnKIR(H}tMw{mZ(beL z+pVw@7{QDpI};^yYF%VZ;Ns5+W-rv7)EPcWT4-WW*4x_xvq@c6ow`IdQ`U8A&I>k} zFV%vK0@_V!(o7*~cUUr|%S}C!QinV9djBVg=I~CZ)uDC64SS8?KV1_&B-rZHrn%ja z7YPH2%z+}t53p9toh;`Uf*uw{Cnt=OVx80~^Z@XCsL5U;!cJb;nEg7rUt_R{CKY4c z$yssAZh4K!C!$Z0k#mo^?;ADm8WUbNYCa&}UzX(1hCkeOL0?tofFR~=AkJ4UeCN&! zoT}meiqd2C8~ZL+$#mISs+_*FoKR6_X57e3C^F}lh_v>AL!_hf3d9b%*BGV>$$Av!jlfqmC^HllfR#{ekvCFiSMBK9SvpGQMv4JT81_bggYVJA_wk| z!Wia76WhJnU5QNwHD5JdFr!4As^=GhIl3%Y2~4VlM_wjY?q{c3FAzL>(h?&d4y0~! zh7}UT2Q99=q$N{cq60m7iLCQ_vfITJRc_C$5&?*hCZIQls0VT_p`9WCDdL;UH^|I} z%$7=pGbxzZARwaDJ6|LUJeLwy0w%^oJ7XdFnPP~;U)B_HOv@mw!>NNJc0(vIdlq%b zK{^yn{eeVKH1BMy;%gxxF7<iuN2fFftp1TOdfA_?DH)&i|*?tR8i z6WGIB0#0aq^1w)Eb4bKM{w@kxs0wMlK(^&w@e5Abj$1p}kSk#s{ou4-phga2WNWVz z+NkHV9JNb-?p#F{OdAWUXU(S4(0(+%Ho;9_uk#(;~izk)0)*JU; zL@&7WCjfKFv-o_K$DUcOBvh4E&VzzRk91T6nD8bEsVg3lhY)};Td{`Qbmj^?b{V5X zje^elH-+b$Dcipws0>wTo)3b1hMb^&@$A&YZn11u6tgF*fYJPKw8In0D_R`fDh{(} z$NGk8;T8MC9rv6)h~r7+YwH_^O)cF~|JTwT+~S>ih|GDuhKb;7_20nPU{d9>Yg+3I zI^^oCvHFihPcJ>Rys!6VT-Kr9|Ha3hC>?VT)&@Y*__GB`f!hXB6IH!Ksbe`L&UlYS z+q>fZAohKV8|A#9{Yln4B#qvAL5W)L#N-o{T|-m3q*krwg^FcXizm`Y`2aQCS94Xj z5F71MQS=Et$0I|#bPTs#?1rl3f$V~Adsa2Ggs6_>8c!U5_^6f^LvzLx6^n0e_w5ME z=62DM7U6>ZG4{ll$}DOwVj*E~(Jqk>Q_-Uh^j;n92-O5*OWNwh78gh^-e7_duP3U2ahUM@D86s@1%sS9UK&AyXbHJ6#v>!3HjA>yD_d>_jQN4(*@ z2aO5)tfNc5$q^Ulqw*Tu%`l*aC(M#8o<2Z8#kEiP*BM8fk0@Il#&ijli(@m7Ng>(N ziplr!h9Hu%`cPNkz5(nUY?UAXiK)Y65J8)P`b5(SKjIxh6*b7OzrZv6b!%XgkBEnl zo{%^zu&J{2mHIy`J4=OA%ywC8LV9sQfSn`DPHt(^XoZNCC7Dg?P{e5dSDGq)P(6%7 zt`^+ORQkgd*soP*)Mf4-$etSwa#+s}h^|M%f<_}?v z+;IogMVz2eK;TK^iK$gXz*|b&P=QX31+0Fox5A!UZFU7qJL@~7ioXp|FmJHza8|jK ze6f8^m0Zf|hwK9^EJ9P|QRJ+5G``3d4c+#+9=g^DAM!Ps)LxgnkSor>Nm`*l^^^>< z*;gQ1RHQ%B73Rjqc>cdH(EhN%Sb(&mVc+Ba*zm4w>7)h5@3&>)9np1F!1D*RKj`^~ zYkx@l@Aw!f2Z3@>2Z!Bcoi3Oh&+mfC_53cFJQqwqW(Ig+;!P^mhal#T6#ftJ1HSLC z$XH(Df2Ujl@9H<2(d&?*7AR#;b`nX<;+`2e*gTbFA)9I7Dp~9z-CoWYuJCB_S5j1) z{P?@%P~okqoF)J!SJomqPvIqrnrO74tn`(J$rFz_bE9*?Z$kkiCLo<43x^$e8X{sQ zk(5^8Y2h{c1O{XrsDRm_TVH_XVpcF#?^PTybmTO-XNW~klY1-~bu8hDC-U0rKM4=a zC>}g?lq3AX1B^nWV6G>xgDlN9ee(A;VPoN6n_T|2DU*NIfgb=-QFU$5Jwk)DQ*tGi^`e%+>a*8gsSYUMWV_;5dfbpxzIM?jbwJT$?M)s~kF&@Y z>i1_VaE#yD>RHV1IAX%}hX)>TPbH`#k;3^D8Z9kS0M`Y~&83>-`6?)|8`I|zPOA!M zQUsP2f51C}I3#QQt)0TOW}`sB0l=wU4*Pe$_SoJzP>9w)T%F}g2cV#R9@+?XK3_jX=t!-0=1oNVGT@}b5JErb!e7qC8aKtQd8Gq zKtv`g@=$|fm_Meh&RMD6F$$L1fJEyo&6TKkNe;N-ice85aFX~99Z0o;Ws@qZjMfu> z8yKjh^!%ozqJ*o1la^J>zNyS;T}~Xxns4du<6ojMYB z5pj2ptyBOId$_z><+A$Mb*1LcPTig^9R@=7;4lz_d+^j9q0ifYF9r*WAGx`yvxq|{ zyG0~pP;HH3Mivsy$jvkITi%dExiKqbyWh29J-_nTwW2%idOq!HPrEj!UAxn+7t^kN zY1hkX*Z#EYjkGJ3cDNVE!iZD6a&+N>=f1HpQrU;T>Y!)o~icUMaQH-v(qaM|@f-}t5&zi?!P z@ZEg=>6csj08#YqaQC9LAax|hxuS8(g-w6(=dImRuFL zAsyGM;v|LDlBeR@(s654oTT7Yb``fd9k*7+NeZhas^Z$yaSy3DNny3*tGMUWagV4t zNny1Vs<`fS++!+EQdliTD(=N}+^WHK$33s&B!$&dqv8&xrs zxXk}Y>nR__^%e0D-0ND0K&16cHEcL&wc`)Rt|x#=T6iz!+l7{54}&6TWa7h+QtG@Q%m;S~)Kng5k;HcE zbGs$qaZG>2qG{m(Gd_o=t@pnyaooQ(RwtPms{UJ z*R0Ik7Aj5F9b$4XD?P^KFOr)gr?>_1ISossVpM_r4+X4#>*(MTb4q>;M3n(U=bpTh zvT_5*NW=2t19i9mUh+R`X*4F6+SxI(!D35Ef@_rZI%pc zIQ<9rCX1XsbrH7}mPX+6V_%{fEFCOEvUC{D`yoGX$8N947hOZ}VQ$jLEY0#H*Cw_X z!f(rAL}Q9ps%=G?k^h*Sr5FYC5eFi)`Oykr4KoATBlhN1vOl&rtjgz8aB}>!$_rpX z#1or=hhv&-D60uVA=TZg;8tdp^~nn8N!>S!b^zVTrx?{B6biZIGOzha!}V;$BEZnk zPXGLIq$Heuvey)Sc{V~H866#dqh_D+oun~qoBw2*fF#fQPmG!u5wI`G?J8gYiQsHT z>B;5qG;epN4;c53r&FGjcC+)v7@)L_h85b+2Bcl_U+U)lQZ=u0{0i}^hPzFC=!-P* zcO%tM%V;8fMib}K#Cbw>Xd^JlyV9*iu{8VzTC2`as-Dbf?~@trecic{_R7}s)9sDe zE2O=u;(i1q%y0Whx6S<}|!ob#v|C z({PMz z#69R@tHf9&VR6{pF7U%Jeb#tWG=N1_I;K2P>=hK z^5dsTW*t1bPm;=n%Vd$0y+UeeCAZ-B8Pj%R;u*&l`7vhhRH6=J=1Hs{tdexbw3FCZ zpz5;6N_|z=o}LO~Qo!12#P=cYk+}$qE_qSFV_^)l2Lsgp8nt*K!_!lYy;{IwQIc|& ze|?IjyyTIyIXSO+ahU3qFv#HuAb0t$zA?mF$4a}GKjT3He&P5B1Px0q(x(qzhDf*NT3uCBM4X2ia=W+CXVBs5}PBxS=pL9sT(YI}!*63p(iWDJd zZS;BS`fc~X{KbHzi`eSy(27Sl5T`*F%V~^&lpXV|>eOM(_L^dSkf<18B4}lG zYA~~sT9fGJZGhBJ#o#Yucj@3;2~MIswhKN1+(8; zJVKwiz3(UK*&KNV`~ni=YSyzInA9|v7iJsH?c&mAn00NbxRRSiymOe2i=OLH5UVjaT^!Cg`c{3bkW4`ELJOOC2v=K8V{FA!*+pyJO1e)-z=l%1>-yWj9IU`2x@L$ zepPRnwvkffXTrWEV~zZML|oc?lxf~=m#W4M+eAkG>zgQZHX_~|NM)?vL!yb>SHW;3 zdVmtQA0d9?c27|3=C?PjEdh7Ngh$q@-dMSUwz-`c%Yy~qtn@d*ZM%DP6dMlFWyKZ_ z#Mc(lSFGGq0N)yY5f9n{obX#mk1E|97vJD!&TjA%MkioN2*+BL7JV(GSe53$K)qNb z3Mi;&x$XBK;{7b6^=A4!jS*w@05klcX?E2Ddu^-K!rsvOGR??dyP+Rn?7S(Z$@;f@ zcah$0r}sfrL6-z&9LNBfo%)tPJwb_(wFjDIa>+7Ue@-7ED&5-mv>i=S%G?wRMFJSpaQoK{`XITrX9-$_ym(T^hx1 zTFv9Ff@QORxTG@fU5H|0nWY1faBWbHc57j;-6%USf2Xrdmc}3zbzTRf%4ofM_&D>m z2j;g&HmLrLZxFIv)v8AJR$=sC`mo@{vaqG&pOdMjuVKxauDD8%kFAPIJmsagtfcV- zYni`?$)Lub9JRMT?@k_%%0t?NpYr5q(=2N_2*?6MU-;u7z(Y_nmo2N2z=TKZ+jYjJuw3eL7Ef$00=t~~8sQMVTT&SC~`eVIX8FE)phOr*<+zV!Z zsnGJ0N5yb4@H59PJvOII(gbO=-a-|+;<`%I3a8B5!tC^w$ic_BV~lTv;2D4RS~Xtm z4e`wJJ*o_?+qZi^M1Sy81Nx_&qPnv#1G@PI(!f@vmxy+|E@%9PXdVR{tA9siBH6V4 zBvoLQl4(KC^Q-yF@-NHe?9@mB2rtCQhe6m4<#WA4ua(B?4@r)V!F%81OY_$-4%8}o zT1Z><{PAfh$_y6eD|V~lIRQ9U+O}EU6=tn}4)CW1xo8MTxPxiw$~F9yS_9I!SD8=L z{O9M^&z;{+tskoX>AG$08&5L`E3_s2&yf$M@+e@nvV3<##$AYF=`}pui|*LKB5g{CFd3MY$l)J(n_qvJhoUH(;?3~ z60i4{wno?DFj_}5X&BA<>}=IIOAx52{V|E1kTh2QnX%aWBd9Np=GB+V@YEGVY_MKZ z{;Hk!8qNPj40J5)q47w2@9*#`Xln@Qz0LCt;fq?UM$~I z7xO|;p_g*br1uyTb{H+U>)fsCHWVi^^4NgAnKgXL6gjVc9v2$Fy9wQ~Q|FUSnL0wR&*7 zfy6%(hCov#N_z=qb+6scY}qR;1QFUARXV8@48DIVZOrcxwrH_Y!%WMCtr{4p-7r7W zKBGl8Ga3sWz4@O9N)DPnAJmQvP#w6T47emYSI#c1uL=hIabW>(tUyGPSQk<6O< z$baGy&~3jAeq>rwN^2s`iEq%26)mr@{f6od(f#)RYwfoQ)8}VcQG+u~tvPy9js=-Y z-1&(+Z;g}#{#%u!V$z1FlwALCue_Gv4z#T>3cZ1k6)&hS$$_nx*8AzM``1y1p-hCN zspoBD!dsN`uNzdAYWFYsG6`Q^A|^`Kxs3Zd&A6{jQHU}7FQ}CoEzN&Z1n{!aA~(iJ zyw;53Siq2`$Sn&<7TZJ~$ zdz1&;-3fw+uFu167I-k!h?9-O(7dM>Z4}`x?j%= zDnuv-haSpA>1wGoj}eu*C1Z|L4Ck!We;gXRC1Z^tax$Z?I<=ZOmo~f|mon`-w2^nt zQYaA2t1b|%su7mU^!s_kV#!E%boC7$@oKc07axXLmlyl$<}k@FEM>b_Z-65iD#8{w zA0k?9JAaW>d(O4(k!}L=E~pQpo8J5b;s?kCYIEGRaXkA-vp;M&(}|OQBV3mIY`s8U zAqY2GUnH`3yrig9lG`Pl&XMqcP2PnHs2ok|J6(c4!I11*Z#|esl3T;RVQurt#VS?H z+g<3IMmTo7HZAK_>(#yGA5xOV4|FQaxh#xD5?05LdlM=4JJ<=Hs6I@=^1_ZB0{`P~ z4lVCZJ^kTHG3%AKZ`bs`FGGK-kqbAXN#==@a+El!ANc?P9pupLG@krO?H;gQyPWO& z>Lbib)*+|KJ#>$zbqXRGTC}2FKd45KPj?Th5#*(H4|1I*t$V=v1o|`-Ia}_h&86Ul zf->u1b?SOmdW7?5Q!CZf-6=PXv2%g=C9N(X`UhY9zA@DbYyzjQwoJxFV`?zp!kWN4 zhxN{>L9`Tl8KO!{0U46kPxuVw1aAByGXgrik5*0yz=W(&jG_q7aOTAYNV=kO_gg{%Lf8cA$`4T91+on37mot;{w%QBav ze88M6Fo~SQqWT{iCaMRM8mf)fxhx(UOwFv+H`AFI zFHFTUUNY1L$`I}_-mn+J_K4O(2wbKLV@Q^ne-jhVfKk!S#3yTx&!|X>>4^0BggRt- z6JrQ(VTzld%aiK3YHpfIFXPr)JUkI8pOo1OjK|C_nfx>r>6 zo3}6H3ZSqKzF4SBY3+-fq4UH(d*eD%u3@33|j$Y#`ku&>m7ce$vAsA47_8U2tTAvTQ2z66;Z>Ry6~?EQ|3Y~xC}`gkwnq5(IDv0}st7POqi14!!C_`UpsW|X{!FF zwITby_mK%_-}e~51#6_u$~cG??4M#E1QH3_)2fXpJoKP&eSBQ<&tLW{#XDLxabWx! zL6b4<75`y-eL214O#Ulv@|C_~%sg(LNS+v%?EA9+g!QKRR=@R-bYsD51+OLtvI|aH zD!sL)S^|44)d61TtvSX1?<~*2$(*L-!WO#jJ3*273%xGQVV8}(Woan+r{UT6ts}?| zJmvi0lbdharlCN;nfdcin?GCf2eR*bF*E;yq4wP}>A#su)CD_R8i-9-^VK)(%8)%XS9a%;zl!|KD9T-iTLyIrU*20d zTDJ!x=xUVg3S?uy>+*UkbN$Z1&$hV2kGxDNs{dQR9UT-K+kq`K*^r`pQlKiZML<_J z4ZOtlzPbZ;OWA$GA!%ejAt_XdB(ht|Gve-7aT22AB9!FiTdLwDM91aIywM)ZlTvR~ zaS|ebT`f7T%WjbqY*Hyye2r9g%R1WYggoDnkc9tgyk(1U#KmO>4$ z#7-MT$u%(N1O_cQsa4sePxtVI?ApR|gKjxiCG3@Bf&&nY~Jn(K3SszDg=lr zOGEH^5VT{Cnd9XFf(Iwh3!^p~jtD|j%~De|9MNx4HPH?%V0n35IJ6F?%H>PVLLF-s ztM43hviedUYcuHvTkZ3O%cRwS_od!p+|X*-b*f|}o)dSyv@+6LGD3Re)P5b6*+;{a zMH@(BFyuo1`9?aa5JyHv{id|Ifwy7@c>X%FAyC#>wkq!2CRn?_vy6 zdaZ)MZw9UhA$%qdWqu%cwaU%!9CI$X@9kIQ{@+7Og@ArUNr-^1MMYl>IUm2HAT;U@ zjz_iQi=$|rz?mCerW(ob7ei5l&b?UW=68-+BPjacYSQ@cq39yrz{kA?YR4C$pPsiB ziXQVIXvY^vk)`1XQ?EKpJH8mAzN2A?h(*B=NAJI@>G!{frcd5djqLUSYsVKs(|>3P z?H&Z}_~K~#o`%!r!O@N{hNcM`#(EEicFZx$)uhM771q+bS~JW9)VowIasNF8KKCbu zz?4^{c4QzhLWh0sJawyvu-}8A9T^A&!r!w#T&Usf^WbPl1_E6;|9`9xzdxW_y<3;1 z@XGq2y=r|Bg(Gj({ePYO=Sd;h=~S}=zZpoSA3q<=BtARUDk=CuNzfwS_j9o+3z~~rcu>jdID{NspfH`Zuj5| z<>~#Yn48oVJlWu`WK65At@Gq=_*`S-wL=w<%glab`55~gvolb-qv4Rfq#s3qz8qfa zKtCuOZ~fS&V^<^R z-c-&{TO%i}yz(J}2Cw|V_JZpNm#}%bHkgTSXv>3{+Pid6uwDN7cv%$`$Hx})t(yjo6ob&|XHGm>u4O2-b$Z|Glz9Fh2Z zhgZfgq`MlTO~(i7`F@>u!|9~hO-;w8YhpJv9hZKpn}gQO3|@Dp)0dN0h$B|mbX@2n zHok9C({btg*o95UrPpIceFaU&g-l|X00-KrJ5Qm$?_5+f+xx~UkGinkH$qV}+sZMD z22PR3JQPz~R}QbriWt~dj^eAuign>3ySh+!^5Oci9C9_~s<^^#QN+RYftK>5<&#bC zS2F~>NvBNUa(+-*&Efltpe?z7xIMF+a@a71ZLb)6cA1n^dKhUQ2@@o=SC&sx8irMN zWffs@!s%+l8Dw3loa(k3kK{ZI!_^o z=r`Q-5ih`9PtCYjgbWyqT>(|C8Z@-#%C%+3jgic0%%N<&7$*H245oPnc81p7OV`Hsu4ba;A@X?b59jyDS#Rc<|80_Y+ zgk@YSx{TGdMyYAmdPjk>1YG{QTA}kv=EcvAN5zYI8;v-z6w6_u^f~+gZsWmrXWBTb zR_rW`V0T0=afU@dw2TCzj*^GMRK#e0ocRDT7ZK{Mpw#yNt>hq>OP0ROh*a@JL7A(;32MMPV`dC-5jGTtYhYZdfHGU+Ag~Z7*rax zy2oc$=4Nk`?Vd3|PGSzH2Te*C1#1;%tX+yHxD>NebgLwT+rlD*7@mSvkWIFyfN>M* zmedg&#Z(a*(G*Ty=jjk|?;c^%S|Obv<{a2vMl|WfT?ZM;fXYD^jg3cTSe%-1*Gnhm zq#nz3WET$5H8F)^t4DK+;$#E~#VI;y$FsCSIVB4Y?i7J`yHyRiTKjo5_UD){t8cA) z0Pjj|q%t)M>r@7Fa@1cmUgxE*+NYEos4jI8Q)hsTD+gAgxVD0qgIUU^H+2ugZXC1Y ziD}Rg2n(z?@-?bOA)tasZ6W=JlPGWP;hZ@Vxbtg#YJ9N?AkpY-7y7QTIykQ!#Yi^B zjFP9{lb_UmDB-+J8nJf7!~&M+5>Y5Ghiip(&_!uC3-S2Srkh^(fpv^aRk=J*YP7!j zH;#Iv|95(xxEw!Q(u2U9(;swi|nlI0x z$iUWM=&w0y{JSJfkx->3!n^h=BGhuXLM?Zr!ud|Ie^Q+oeJV4YH`9>X5x(hqDEa|L zhVA!SY6MYncSlTNh;4Nt9@4KTzbcJq<+62oS~yqO8WjgknCt{fm|yJHRYDi`TGbdQ z=P8iOW2GyVxw^U0!5ev8XgFz1 zeJzGHMf%KWeFZY>(`VpbdRoro()4josTiTn=N&Ek>RijUfS639Rjn!Dphooe=V1M8 zuGm=g6hUgmZXCy9CA7MAxAZc!h9#GGsS9*H5TwP$y!T7nQ44r?8TUWtarpx8mi{wEi7QqQ8&lSb81GDMwFLOL5|!TM<4U80;7cJ;9lR>9COtyJer(O>iU>y=` z5aE%S$DE3TftHMz9T84R>)t|5Bw}?)Eu=n1^H%}h+s}`?IP)pkWvsr25NYiQqvgM( zlKtlXer*pIvYI!frNAjJ=#+JDu*K-wI-5;tUg-%!Bj{$--gS;NQ%ZFm zFml|Y`bbFZyGSaLRL~-?8yML ztwcuex`B|0Q+02E*J)=cTWEQGqx4tcOj8*`_j%Z$eq*efm0WL421*as%R9#ooik1A(Cdfrzi3)Dkp8$O!UixMOZ;K_|wNrL-sG%%lT4Dib8s@ zbYYh0eQlA6Jo{->hX%A7(X7;EJ)&X}n3XD34owM{y^QtHyWg5}X$DT=DLmXQ1 z{6)y&iWId+pW@rs4eU0t9Wk6sR-w8PF6`9F9URAPxJ2qUxZhIs%{UKx{)eZ7f1%kn zO^zDb%$-uu8VNs5VfRs(l24pc|M{Nw;?Dv2t{`C3$pgaNjN#z2K{OTOLEyz`|v|hkKV;o2btIe;>H^ui^vFlEn9a)ps2*COe?1X^tc}xmJsp8M${5w$XSJ1reylSblRls`t z+f4b?_kW;F-3IKN1A<^YXnzBO!QGI;>URl`SO zd|yIFjO?~5f=816x?$$FVBeYcRY9X$)h2{F0GoGV_9ovQek7U2kPdQ1W3;hd)RboO zoO&Rc3NZTxvY%8!CE|}H1F;`5N0Gvrnd@9NpLq>?Nq3EOD(fe1FWq+M*NkvBb7-y+ zzADT&pKpY33Ev{V)A*M0t>s(Icj2aaV2<~G1EUk=M(z~z*!;S~)QM8%hE%}D>~3AK zs{-S3s7EG)u~AY#Yeo*0JNjDFpUTej`JbQK3Wbmfh@b`z#S*_7& z#M*7Lhq5bkHVI5FQpIwbmX|BJXoP@GW&9XbJIv*ae0ACO%=%l~rT)WoBa%FRQ@%-7 z*zB2DcaK8uSCmN|?-h|7>uu|ke7jc4u#~^9l@Zs4zUC()9~rY!2CKPMDQnbS%Cvl2 zVBs24r_Sk=xj$^JlqjW7s{qIVlX$B*%9>%F#3)&4p_F+WHm0BYz0M==)jmLS9vga6 zDuqf!RMsoK24}oi-a{euo~ZrFd*$#6#nC?W(H_YqB7!?&}_wyHJ4vk1u z_>RFSw>1)6H&zHKcDZNw_v=U! zzva?fTNw!uS_Q3_o{iu%syZyWH5OE~_rL7QdN)_y4tjoIY5BLSQxjQ#=(~0%vDrDR zW@N3J8y(U3)**^}YE&%isjT2@iCO-}17`^Gvb_HD@SlEC>j-!CU~Ulbe@(xKwZOh| zkX>WEUuJB4(|U8_N68PFqdvNP^ZG~vEwsAe0_)1D)9c>!0Dt=a{Cc5e+9GVu8dXZr zzF$l1q6mTwW33je;&i- zhwS5FMe}60i1~5YLBJ|Uqvu%cIp%qeYR^%IgR5ze@sU5XP38p5Iy)Pp>eb}|d|Ssg z_gyDwwYrbKm;Cdv#5omBNr`AW_Q>}kja2V%k-O=o6P&DmRD9IPUN19%79};xY{A}G zKU*Y%UUuWT&J>ZpAy>K`TX>7xsrGU$Jv44?m!?Fh7R@gq0d4aVgmvYWaPllNlF&yG zGgIiAfq|{k6y8M3!)+9_D%l&}Lf5-r$4+*=yS2B<^|s^1exJRWDUQnUq7(sXic;8> z4AjmQrit7~YH1X(J(L|cI@{-{x;K(AbsN*v>-AAyU)6F$mBPp;t)1#;XtWvCXBW_%LSCwexg9KVPrXo#VDctbX_qkrQq$xbXwh<h z5P2ZWLk@~eys%we>8Q_IKahw=|CuUCA^E2ivPc)QP!+Q9v<1weV^0tCUo=ov<2h!b zJ~3e1cCH3GUjdz8+QlkZg22YD_iA15(}4}FAL#Q@+kXWxneyx@dCszv<|e%YmG_%> zFY>LQ9?M!^`{eB$EEvtJNQim<=2pHN?ucb=_+cV&Wuodzf1>8fti=2)v%AW#lqt!; zUe-xam}e_~!Ad53a}!mUVPr4a8^$p*G5@kriSo-v+ltZ1R=k8t#jQsfJfsP!#Q0@! z<3EEuXIgqPAgke&Ulw*+qte;J55OBT9|q@BdaB~TSV}r$Z1T(93$K<2M_~?RSn4!6a!kvo6eR)sbN?*id(DPHbZ@9x~z8zQZ zkN9ya>bZaeov^q>R>en0TGxv2WTfZ7?QR3{b+R zll&M}-JB8wu`P=qc?*i$!oEUk)BzK`!^e>#3)=J^V`GODMLlJ9MA+$`poQ&UQ=GXa zp}>Eg5%ItV3VjPa+o|YV&Wbme$kQq)39ufLVt%-GbSwR`5>ai6`eG1 zS3segh`=?bb%OvLW`8ziOSiFfS1(=2McXh`;NQm@Jg{Gq3z7HTXjkOevtpE(ZK{1r zK<*#qn#YD4Ei1qm2`7_I1dfs3MgrLDHPnbbH)Jy*fexg;vjtvI;Efhno@BTuWX~#_ z*xqzpozS1J_$~JY_>4{Mq)-eN{gKT|Vz1szhV}&QlLuns%q?q) z^2J6rHPp*Mspnah{Ssot@0LD};FQ{dq;{PC4*w2X95FVwd_p%-y>b^*BG}JOjF3+_ zQRz?Ik@bI=dmH$wt1I6-fuly7`ah?hwrNdk+Mc$-W|&|zQ@F+&VkAf-1d4D%qf*OQ zv|L3@5FM0+bMo@{pA%xuC|d56-tqQ2t@kNf#)9S11Sr9mwrH*5OD(oeduW&zm1SkWIuhS#+B$oTL(*aUx#NdPT*vY{ zAw=Olh;<%{FWFIp7b6CD?3Mc|FTEJ|{ssJGKf49ZIphk{+@>=b+at@J_C4O!ArkD?uvjOwjldE@zR~q zhbV-E*RCA|W?-}n{9RX{c6BlKS;GhjoxERtn%DI$mpqd?2W{%=iI_<5rtsjH@@Usk z`xNiNhQ#TqeQSpIz2AGVDdDAFUNiji>8B3MKWhFg94I74NT#XyG%JdpzsO!@Sveii z-iNr^uLDs2R5Gz|EB%q<|=H6RDfH5slRWU z&|Z(nz0O^9;srXbVU^#G6%wTgE-kSH(csdk^Hnl@>t{?m*nSU3Vx|XQY|5l$yEEK^ z#um&cxT%2UHupE8w~mTt5G{O?;F;A2g1>K`Za3z5$LFWi-G52-3#;19x01Z+-Hksq zsv7BzGWF^&=-%)RY&CYT=hrvbfBnWYCSK6srxY-fQba|iTbh)B?@WDzFX*g5|Lufj zzAtN{;ajP!2VT$w(f9W$QYkx6yn1nR=dikI3dCNr;&OjGhRxfOaLtJSY=+1AGVamn zuzuJkzu+K0??DVkR9^lR!tILJCLoj|xE^Jvd`&&UYu=Z_5;)r~BV+A9hG|5m?eU*& zlZ~59Jfi|m9Ne~%k3WCg%*JUWtM?<>aLj|Pl0%DO(veKlA#N)U|2C2ttnDBkS4n8H zIK#B5nWb^I4rsNV1gQ1uD%5&}EpLWW7i6zuXs32oYixgtdZixTLd0VK_4dDEx=z=s z>HvMUy#}zQCxs@~lwJi<%T&Y4_p+fp?0g&2tE|OXhAh41GtAPjh3%001grb%{F{!9 zsMm{lVNAxwuvL^Lxxc-hesIR{{XKppp+{O)!*+sHCA>5>l}Sryx+GR_TxQ?kUcMqh zEJJbeqCHC3H|}v^x8G;q|6u4q^g}FrPR1sxl#Ej(=}^B3gJ zZO@e_0o75`Tk6EckF`g6md(bUR%91sZ-v+TuQB*X)@r3kf2o@|I1qDgHTf(31%dEN!0pKHMD`_Nq(sVWTWxA!(2@n%NraOjP&xF zPfXB=m*}Q%Rs6#fiyn^ujC62IB30rEITmR5dT&o+C7oN&ki*W9ws-@g(T&i$>u#1U zs(FFp4On=ozoVeB0E4wE9~oc;es|edNX;K$JOtS+CpFvS>D>vu0*}#O#Vcxl=>sIH zB%8?n$^}OxQ%bKtlYX`4*X$>hCyMuG*6G1%h=B6Bw^Mmvbk-)=KUXfX)Af)utbbv? z5JJJbz3EpI6DC5;;EDr~B~S81i-wSJ_vEovz$NBpkMM?#!^SfYdd9i5hycf{gYrb@ z4q2t0#yg_e!#@_xYWA`95jGe+AU=Z#9q=vMkM}Ji6`dpMeaY@Pt7K&>(K%9-pdUFn zQ^JEhG}O5@3C=Y1Nq`P!ElVAacs*PImK_|9j`UZe$`l_wwvU+FO@XzpZ-%$SL)SOi z_u7HQ&OOlT+#SoEyJMMi_jWjU?`pomrU8EaO?`s53<};NpI~NFQ0J)W7T)ag7QR9& zMUDPHa02}&?$+ZAZ`7r>mz*0(tp3I5L}I6E6WStScyAO^um9_GJ^cS5Z$B&_{Uamh z*B~Uk<-bogR+Rh=JmO9KiE!=cmEQHgP~Zc#E|6CvuK5jtT6THiw@Ou)PqlnM9!Zj1 z%OjxIzo2B_X>g$ji2f^OhMC-!yJtF2UZhyQU!DgPv&nfX`SW4&_UHx z$6n=Pc;-7#a=VrlnCqV-N1GMA?+sry^nv%PGg@vBx3@o5T*wv2>Hgb=#-NGnMHe3QqGxf`gf~yU7>*eBoq3gO zto;?JDZ+bwZ?}D99475SPr0xl5ECaxCY_q87?Iu}B`;F65f@>Zm5zSR=fU;J+LB(UJo=C( zIn^H{ch}O7ktxUg=X_+W6Q-wu)VU-(;$8S!U@u=}u)>@k?gj6$$fms4vGni;d8O|^ z$XTXioe{Ec46bYH++pI|o2$15H#Yl^t0~DUFT1C3CFn;qBXlikM(wAK+kBu+O0t*! zGrHCZ_5+SPPx9#*+UP8`tynj4pG?h)MrM?{5A-9KP1_?gqRv(BK4tF1?4l?Y_UYdH z1%2`8emW2B$wN=%q1}0CXC4~LL)-GumOQjM2hCVz8O&&NpXKg@G^%1Ob)O~fv)FxF z-6!cj^X=1J)ugXVTA7EO+9JP-ykB`9D$7IhJQU4CrFp0%4^`UP7~xCgp^7|Io`=fv zP&^Ms^H6CXD#=5UJhbz=Ts?;J(6&6ZB@aE3hj!)1 zyED;po?V&v+IevPgp z5v36J)X4tO)W}3kjoh)6kW6>4!ZEa}(#mx6)^CSu?P>z_H`2W-54Gi? z<#}jX2xVqe`ZJm{-7i9jes_dUW*yk?E}|zg-PJh#?#;AVrn?Fszk3tWGTr;|@w=CR z0?q4-@Sc207G(e0mBd<21J@30z4JVkt&gM*EYGU2*lW4Io-uoK+)guS$8s92it!e$ zPBQ1qs&dz-oi)~4fUCt|6BM%c~sW4=Vq_@AJ#N5 z*i46NnF}O2>=i@Q7ZU;Lq6`K*dIK3CUe~di5}VFXw607LKhZiCf@9P9iLzGB>jbzi z(oZqmDxz?u={`aZawu8%q0pg}-3Oc_pSb@O^N3l~XS&rj)T%nutx*6}mFX6p165{b z%;%HHbZZa-kyCVSc-@562)UlNJ8)ibF0 zPJ5dPH|ouPJ2iIdn)2YX=B>KCG-;TtRlH-@FH*>z?}b6LhLb5zkwP0Hah)KDBseKL z@eWZ+&@Fmp9vI$tl2~*mJ+TRyNRt?{IcB_WVkpqOE^8Ot5*uk*vg4AJkfbq8(yh|6 zD_Fc4;(=teU-MXeZXr0P9kQ10NpxyRH65e5y}DTmQj3u z&-I3XM^vo6f5x;oy~;ndKcccOgafd;if!Lb8YqDlg8G92)tI897}kJ@SGY6t*OH~C z-Ta^GVfpVT{~Gc?p? z*fvwzRHnRI9Y_zALbEv6zxfg^I{?O0IgHBZeVn@W;)uyldCBcF+J8g$)i5+lGo`n2 z6eE(5nlhBRVPfj&DJyRDj}9L_YxwscE#^BRUwDAoLdgGIp~P}{^a_wZ=e4}x#ee0s zyn@F?i2u=fB`zzuOEVWm`CiSVDp4=K-)s3dlpQbmE3_9cxwHL$6`~(tH<-c80azO} zS8{xvGq461kNHL~LBA-S^G98K=mz$P**<1bB&qF9XMssKnOd4Oc9KnrIu7D6M9t)6 zS@t82VH{@`K_iJJj)gKPN=io7;$P@r*7NxHE_kf-uqKEt`tdH^<~J4j1D+H4-b-jJn8M?v1yMn zZ+QJ5#Gv++q5Z}5H&en5ZJEf!j-egq$vnSQhs8wrb6EqfbyHL({jkKZ&RzN?nAspg z=to`X@NXxOOWC9`LKZTSG-p5gO`Aw29Zl`xavz?|9t*Ob^WC3PQEl>Q*fK_~W>B?g z!W3uvD1p zar|+>%}|V;H`DcFW!RN9Pr}5=6hM(i$CtQJRvVQPxQ;dz!itQ_&#`Vcq=BU`(c>wkItg? zq6=zJ>Ir0-R!g4JeYd)>Vsi;6ONS)mQE~pK{G$s%p{Pi8P89$Oku^P0Lh;N|JW6xRfm!$WadRO z7e!`zU62RXon)-+o$m>!4%C_a!{M;&r%ixQ{b7g$hhlBVt)HTa4w}RVu%UZBEF;_s zcsw;!VsdBui}S)V^Ar^aw)ZYOVfCd~KLMC8E2!EY@S%d!0#T!ndw4`2S z)foEWP{=v|WcCEg;B95_HYBe{#L!@I(E<+azs1ga+vyY2cZkPjZsLiP6|4na!|uej zpj8GAwJr!=mRjsqby7?Cj*9W8T7kAyJgM?5WTDvVCppsU*L%8J;wYWBW<$4g#QM5T z%p8ie|7>K2B;?TE)cLk z%XFTR?wppyNM#}EIsS9Ix#Ra25Z&S~fNj~&xv9>?8p$c4vTc>AfSDK|zq zsq5m|N$lg#_jBHNac;b){sw&qF)gso_hO%SS|8RHa~B)AzT}T@M2X4{1wY zLgglfoUf4f(^6~5Y~4TNGjfW2MjCBkq;4u@<+w-5>PuLrEXIhqIoPE~`ir9|HMIRT zyB4-$z!u4TE%o>a(*$Ox!>&{;BFPQ^=&e=iwVUZCzo&!WpuWQI(b6HC=BJF*CxAGZ zYC9@HVIW2A3IZw@DtV1m@k5?2G^CGF?|h6izm$UjFw?>GaW4 z1LyJbzxxh&C}9c8t)xGAN1~&r4v$XcL`yDqmBl{KV&A3M}{B`#LBY)N}Meyvo7e_FQI|wuN;!VX!eYN!aj2+S{ zA8Ev5Xt;==l8m0?KNBpdX1SV2n+A8dCq16aT;3!B-JjFM$>sJ_g9SAf*VC{6+DLs3 zD7X%oxgqW^oX=x@bdfX&FD=X6>f`ie0D7zIEWW{773sVVe%ek=-L#m4`+oi6pnj^~ zqe__1=itNjOT>S5t3G|0buaGR+k;AOgDM&674-CyE3d4co-q`VtLD!f zf?=KBTa}{%@|cRkM2CY%33>E7ULXzPFq6>J$h8 zo$KLt-8hLKK zmGJfEJSolYHuHOH`qn!6HDSoMgx87>?tj0!V2(DS+TIf`U1&LovR9yfu(z>RUZT1vdW zRoa?EJ|AuD=(5mc^qO*-OgGS{PTte)65dvvk) zgHCli1f}-P?ihrYDF<*^xE-6oVzDbm&p|*<9f17J9Uc9++=oJUd)(?ju?=II?dSk4 zsUvQnVBWXHA5cRDbqpu3E1<11k@qQ|i%NM+?tS?SW%-z9fv5BE8WscBT(d<>mz{?% z;CIcJLz_M7!8P+kYd(*#5V@u?wDY4i&^7-hv;ZW6U-MU?Z6I6ktO%_JML$CbMt{!d zDAB`O0<~PcIlGVqz4WgrZRcApq<+}eO`CRgzIFS#xU{Cqjo;3%}j1zLoNbsocGbchC~og!NXQRMpj6 zSyEMfIuC2jm8$B~c~}`zRed@SD?h5LPv>D}x27Vjw{lZemCsf=T#j>wHRh*B!;yWG zc>T1_w}wIeLtENydfwkP{QI+tcRhJ@+DmZrg#WxZ`x*AybU4z#T|LT4+_v-ff7@E? z{mmqd^W*&m2@yj+N#gcvU~5xDCRZLr#oWB_?cp?ICJR(>XbQXRh>r z65P6zV9o$Ps4@3yDy?aN)6=B8meC9Ax>kzPEK!llVA0B zd-dBnd)2gk+E2J#Kbw<0uX!{0{RzL6=wF#tD%u&|LhLo{37eFVpwzHm_IR#tDxC{v z)*ts)m93yVm=DKo@5V`ufWoP$cWdWNYR#AI6uXY_8_V7U%La{Ln7ws~H+hHGy^&n; zu>RB0jTh|BCAAL1+W(VkZ>K<2|Hr(_QA)R;Lh}^N&v`tp{xNJu&3SCvE`PgsF%|!j zRsVOc`Y+a{#wyxJ995xxS3*ITF?TQGNf$>m(x^{y;hJ$$<*rq7E}2XPExY6VF0r+`Wr@ns_vJPC8TpzU?fxXB1x5n_>qM*uQ^Tv66oz~#7{A)Wrz^NZqxBUYOHmSJFVL%a|*I@r`LVE>m;~dt|)wS zViB$OV@jm~NvV)p^-R%PDAH471LL^{wkwe}``g=0V72u*yU^&FQHr|MG!CK# zCo`UVw5^|`)2UxSdhBbB@re@~%ceY3 z^8ag&KokR90X1B~Nu?_|ezbfip-0&_S<|C;n*E+~ez}*-Z=JT68cuKZd-k}@7yCU= zJ7|gDqbJ=7UF!F|=%8hO&prn&_j_J(P@CVAb~B>F}0>1dXcPH*BDtVAi}@X5Ew-9w$t@E{SDG|yLJaFd6KntKW_KD6wQA;d!XN`ptGu&JA0qSQ)=2tUf<6F z&FZ66pv(v^dr9igWBW&k4HOTly!XZR;Iyv zECIK>RbDUs3P?s8+vouLvB8c-*hzo>0I8oDtNvS6!%+31wP)5cY!?{U2`dVbKj$}(!>gxtj7J~8I_ZLH<{ zcUb95JN=XN`*SLS zSxJ9RBAC_cSp37NCnZ(JVK!ot_6bRH|E<8sl`FMHb>+0zNQVFoY>MhWCb+Aps)ZGEq|O!(t;hGD zM7qBa*XZBAYs3$YXFB@c<6=+-H4Dw9&%2djzZm(6Y49p+;`X17K1R(sz=Cgu3#@S; z>xO)%RLV1GUS`s#-my>bhZCmW(u!YO#puWKsS7)i#!xbDPRy(c)@A`23mW*0g`h|G zAbf4RtUZ926U{D5RXI_S5yw(6StRPh>nqv*ZX0zj;d9AI(0R}>ws|R*of9MG#79i? z5vftdH+ardEoAZyb30%-jQyWvzm%2@gBzoMjhP=%yzEE{V&NT?Imd?)RFwT;7!HvnF zyVro$z)I;iE)Kc}+_t>oKmh`3slmuJnY|%ZTe|Kbbmw79^5dMmbkBmJqK8|Q=IEx(<<-RvHc9sS2 zMU-aqSv$b7JJrgRqF##HEF}JxeWr~l58HZP#D;PU+tDpMQfp>TXtyhrsj0>79|ghF zr1?g8Uk7A*O0(s0X#@*7eiFO0l-}dJPP-I*|ECmgzCGHV80pbfF#V16YzQF}*gtVq zW4yrjP2*}Azwz(1i(_{xCXJEXw&@^w@PHUD3(6}q-8zLk(yi0G`b*u^P}KH8=v2lm zQ4Wk4R%+bgHPWry&iW&S!C5jSp}__zIH8v86Sp|BNjHqs+nQd!vQ`E<~ur;>s> z4WUM3MTvm|X@#gttv|M*lw!&o3TGrW1jU?kPI_J6!FT*JE4$OX!x82An~!i~^?&d~ z$@hPbgB()p=)pxSb4NdpgI<>E*|HN=)eZoJD*zZT*i9PWR+Q*oEgP}wz1zS=T7-@ zj7uJ78lwT)mUd3HUAe{1oD$a%7G!>4o!*o0^i_1adOO<(TN~-g_p&j?<9a#!J2Id0 zMtFX|?LCf4vP(!e-h#)!*A(72t)uNV{B+;6!WGeNG16&?;8ZTCPbG#cB#qVBfP$_? zL~FXnI&)QKUm$x3r6Rjsz^?X_dZ!OE38$KpPpKX|Z zZHOr1rJJFw6Oiq2iQZAp@8Ta8F;^1q1%D6(R#xk+1qHqJID0zmB^ui-ORZ@tZhv1U zwX`6@cZeXSQO|`csQYhOwF%#Iz(#E)D<~|@v5Hb=^um!QmYg7n`wB2D1p|ZE)~z4~ z?tE@v$r6tl(Y7TfVAg4(q4@?~S7b2=ge@!twy*@&!XY0>Gnz>~Gmh5flzk7#g_I0( z3q`hu%ALy_%EH`k@G_~dT#~2IQRbOHm7$Y~T&9`SN5&HsRxf)8#u##DtNtpJ>K>1l z{dhgL%} zsqzJ3P3V;Of|8myGB1V(rfK_67DPC(#zkPx9FOqXf(Va?5tu;7BQzC6_zn?*8I>sA znV=K@%z!541N1a~Wm*0;EQ2a#p3SF#>WA97|=-&1&llg1Vjmigfh z`Ecb*#C4&3QjZqI`K)CdC)*oNWm~YERkYEQGpS#@C?NdTg2*Q;a%g!YV)3iO_btSFP3gKsAIBEMdP?u-(VCxG)2zpYtzwzhHGugawU z&V>-?^@2ESh0M*uZFKyU=`hw7lguHtjEv1WO^;EV_g+D*_@CN*f zGPhqmo5H28wZgF!Gtuk06?qh;F2Yu^lsebKHxpt1H5%vzt#nI4M*D6iqZ!scnbe&H z0V4!JMV#n2(<)4zj5ezG-GVs(6vmNeUq~uD3gWD>4D`?diC-=VxY7bzUBIz|fQv04 zoJ1;G#+$6h0;*h!nu35cEuh*3e4!v<0s*0j&uAwg6I{wKmwrHO@2%ymJxiPu(_e;yCd-c6VqOVg7YB9q$fLdE+m_74hTFAHPu z4rAxyyigElrsXEx%#7~Pc83c>&(4REYaR0V_%J__ z`RxlZ8jdqBhQ|g8whJhbv2oV2@v}z&+<}hn+T+rl;nF2ZhX_YZcV?L7bLEjdF79t{ zusoVAF2DJ>)r#A8T-+bJxHB!TrW3owKtooTPqj4|a{;+dHJD}wuFExKYe9{VG54iz zSxis=cYHI!xA}FKzG>5cE{OOH5ml6-6ME&x1#uoAPHxbC8#t5teL?7;eE#mxWtV>m zJGZGgB)$K2gjGkDPirK;l6U@#oIlSy?~-#D&K$o#{&~%I4{px}|0Q~doI;vCfvbzJ zW<9jrUF_t_el||YQ#&i%vqnNxV4pa5p9YDaSQ7s}CY(82gAIwLTTE2NUd)HNSrMLT z>pC4c@Fk+L6q+t72sspii?bz^(wVmY-{3+8zL~RS>F0q1HcEnZTOLOJEzYerm|5KS=dOP)4CBgxB>ECAv6HxyphW&1zfhSP^ZFci}J>$RMu; z*+VOHZEOeseuLf_+@ZE+rs9`GwWQ7T56OXTg-m}D`_n*6IGfo214XCW{;RqpT&m|D zrt;(tMrlquND!$TxVSZu;$8KVAxcO%Hup<1HPRGI36_obT8ckk&B3=>Ux=%Tf6XuI z{8lv+yht~y7dJChtM!iiGP_{iOrz8+%>EN|Er6NmX1H_tux1L?TguYm$&Q$fSJW%}m~56U(lNqGWgkU{q-2MB37 zT(!8G9qQuUzGV^ISw}`)Pp$DrdISxz-v5w(FqCCMD8vn_^vyDKB@68p`{yeU9`+vo z3=P!v=vM0*rY&fPqE+#~O8*P9zqC$Lxq5Z@4>aY)JBmpZtg}ar9s}jnN!$H9<(g#q z2Rw4b0AMwIuh;);+5%U(zlRqE04j;EP0G4Vqy#7X1T=T_xE)STZ1vwxGOX9EPDEL3 zPcL5aHNeWEHXReG%ajJw9>4xWfHi;+Y+Z(>Z*@NbPp+uT{JqZkRpxOr96!f}{L;^1 zQklE>UdoxS&(aW;)5xK1Qa-8ynfMP$Up47)=pEFaZf zU8E@Bx5xAEe>wHt`S--*`1gGB`cwS-czl0%BEB|O;+PMP#~1mF@xA}u@MY>{&I^<> z8~_7o&VK)JVF6bb&M(K8??)vk)Hf_2mSqa&t0l*wJAS@89$)*r;mg#QP(D!R%Xh|c z2>(p^K6xU(Rj&Q8l2A~-onwX7{d48}ITojmo1a5`6OO~z_7~&pIuV}^bI`xX<4gR- z`2ObI@MY>J$Xr`N`~B?A!V3SH_WRe9-=)5eUP40?MlY#9jW3i(qB&{gc45>7q_#`K zrLv2IO(u76;I{Mgws>}K>Xt|mCYbG6^99+H+?3ySES#rCFwe$Rydc};rbmCoe>Gbn zb~ZM8l1Vo?;p|=BA9wF7)Ug>s0*OZxC{Sp}(o1uVg-K4l-$z{Dz+C;@e7&WGmD_Rz zXM|9Rq8uX$^r#yLrP=MC9MoK{mCEGpt069L{_V8{A*nyL@_k6Oc6xfs5YZl6@xIX- zd&VrNC4qddPY@&JB=MZpOI^SD1jabY4*9nVw&t5%&Cm{}m%fKGN`4J(VGeQDC3W9r zxtlvn;Zh_;n5Lu>sZ$MPHlB^p&%f5d!0*h?Ce%_PkhO^DQ$8Ncq8Lc!k!?u)> zS!5Xx0YWbTMlc@KfgsKeJ|u^#rLsk&8}v7PRbqoK0midmprH_@?7~E(jov?dHoC{z zGgvLvQS@l4$=a6Ip)JD`M`!<(14sl`9Ugr@_YigRKrwY{%+!_&f9x**?VvXC<}v^9 zq$fFFN_m~|*))RWV76e3_uds;Y>O7e+TNw-u_7$Ga=lU0Hq%oylO77Csq&y-OUpEW zkGO|P-(_aX#E;9^y-tUgf2LbvfLq=jf*R;|ia2y$C*tnb4t~6ghjSa}vpL}!<&~RX zPCAM*(C{jv7CbLAKOqf{gqkI#lPo~WD__u@Nhcak#okl)=GTp@@O+@GEm7KH-bZzX z^B?;RbMqsV9XqMdPU0*>JaG$5!1I&GScdObZ|RTC!Px%$0j9h#?x}13!+v>U(q43o zHyryg?H_Rv(6xTN?fX#HOb@!ahH3K189HL`%8itO{)*aWj|QF<5sw0M|X-Ov|e z#F%|g)~~;pZL>HDX4?$5>p%}3ceNPG&Q74{oMm#2%B`GoL2Np(Lf`mzsI~`l9MUj^;qCiI zfAc5bC&&%fpRpsa^+?RBKqRb}FrIAX|C=iLaEPsM=4uL@+V69Et+b) zlz(RbD03_Lo-}spJ|ur|+LQAEq#uoK2AjGH66+3)mM{XJya&3N0|g%`{FFY>-Eg+6!L4M_azUEn>g9CT(UpF4qrtepz(wo7L{FH<)yUVn&Z75@ErR3jP zbaZ#YuK-ZwxTtkZ*$Gbph|8pTn zX#v*-8V<*IfpLNnB11~kOWmi$eHeK1jJgj4PcDX`J_+}!aGxsosdS$j_o>z==#Y^y zzj*ZKU|^Y`STN9`@7zc*FlazYFmSH{rNO{91ERse9s}aRz$*rn1p{LSlm`Q)7zXp_ zRs;hT1|))k8UreWftdzW1p}=HR0kc)1x&B8%ePJqckhEaZDNLNq4v+`+O4f7^r=#N z-SR2gDj1N_GnIRlA*I}_4JZjZIt+WMu)o{={QUg$A6lRIkuK0OkqwUY-c|c)%CBxQf&bL>- z1+BfNT6@W4o7(G;zUt>O1L)@?2GFEM@H~HRH0Y3FH-CEk`2NZ5XXe}Q_OX2X?WJ_N z_Im<&y!{?lNZ5W406W3{Ud0)2!&z#>X2@M_IQ*rs4P|~#ZP=%;+Hk-C+HlZ-(x7|2 z0Z|M-8xS9z7a9r-`cB>`uhLV1?h({<3ijbozSn^~ta|c&4lD)S>i7FJvB@XTK|LVW1M5+h9Ab+=L@!K^%d#c zcL$dAW_t8C%~mL7I-zx!W-;Ks{C67n@U>EV?AOd#{Vx-S4iG6G64nAEhj^BFk3=~2 z!C|Pg_c4&1>)&u?y~JdAi|49=Ob@evNaAbD-ru{dN zQ`Z~la$diLkAkdh#m@4xyb|lZh03Ms?!PdbOXIm*9@-ysxp1NGd9OcGkk9`i{L(+D zg~P8wo~wuO)7Xji{QRXQcg3D~X?%A3(C8v8DlQma!qaqyQuxpfb=qOkE3`gvmEeE- z%Niv_O%Kd&-+ThWnW~k0-|ArJfdQH+M{dzSLT>FPdE@iT&G>vTF;cfQF}b&L*OGCT z>E6_COTuoiNkq@PKB_C5m6ZJ|^2iSvojDJcc#i=k8E zC(Z+*bDwh_37vazK2%M%h(9(Z5w-LSE}J12wLElg!byh&q4MjV-jK&VxuuI`a^0JA zEtTuOoNI|H)S9c1SPWZOZF)(mn(`jM{+zm{ndUh?3UeA^PSKu(4x-QJ;aFCe`EN%5 zE4UQIwnXa|uqa~9q&O8&+w-m}U7eTOjN^Hw{3N}xXdd^d@ zdEQsxDcC$W7kCOb&us;sg3WVhfu~^ee4@Zpuz5aR;3?QVUo7wxY@V+acnUVp0|lOf z&GS%!r(p9uQs5~V8`894=dmIdF}$v&?6qCRPKX&A=c4ap#e1$|&q20IGkwK1#H4SU zGZAe7tp=R$z*SiA?n`U{-IQbdYY_R>zdZWWhY#;H^zz9>p5lE+?AvX=9gg0VSe+@| z3MI(K#wvjrhWq}$L5x>DHRXjVcE6J1HcZtn6I`byf+eJA(^P1=r7zY|qRQwrYcw*I zpZQZ0K`Hy2E$I(+uoeptk8xBIvWR|wTcNn23e6O)nA3@Eut%<3`dDA>5-KHLGTM>a z#p~Z4sbh)uG$}VH(u9y^b3#$@*^pT6d^RM+-|+%+PW_s4HD_=zMUDRV=TP%a5&Ggl**%lOpyS zf6zP|OD8(0fmiu5S^f(5mnl}O2H8brAXz3<$z@EWmDqh^B@j>Q+F>PXy)UuUfR?O~ z_Bp1*ULgq&l1v7rQUf{P3a?V9nD-HYx$bCcFc(mQ3lkROMUJM{=fb9Xl`^)iL=-R@ zY;Xab^2B9LXz$4HRMOrF%bFnhQ?HUceo3udPp=`I zu@GySN~Cm1hOIdY4Jmgpq`%g|kRplcD36$;MT`i71A8SPxhEVV$$P>f5?f;Bfo81V zp=L(_`Jt1{51sqMp~Dymht4v!RuURWLd4N+i8hA=%jbvi!|-Hm3jRiMEh2L|p7x|s zS}{SHd=*!p(JGaH)vH8aOCBN3ja5XT!DC;pHmq*IwQdW?W6NQp)6ArG`L(+0xt^eL zTOw-bVMm-x)P1cxiEdp>VFMYS);7PSFUt^a>Pi=6(B66%abzX zXwK+etwD%Y^&$#%e4a$cYyj%sf`=_(6tLb8Z*`SU<%_10DVm|`@Rb|h{oXW9v+(q0e zzwp`A(Fxwgdzfxa>BO9EU&*FrjvH^%&ExS~@q>wtB+|8bP%rknxtk!IbtBUwKt=!G ztrd(+ueA)OPj#OL_o>rI^?u|e>U~i-O7)<-P?0 z9btg`76cS=zDAk5Z$Usu7~sAI0Y&tMrLb>7Kt~whz6Aj~o@FWQTM*C@2DooQKoL!C zDePMi&=Cf>Z$Us2L}@APTM*C@2DooQK#|EL)ZD&d02^0y4t){^>WeiHuWR2MCIoR% zgjbPDCh8PX?N++6Cv3PTy``zCtF=e931{+R#c;T6TI&fbHl5K*Qmagu$YrSMEZX6E z$x^6N(<|`=u$Wz*196s*e0DB2aB$ARabCw zUD&eXT(OJ9dGB;SCWYPUV#el*-winGQb2MbB;L6-3UCff5k`v575^J>d50++VauoPAVS2kCi*xUx*fIl|++5AX%0I?f7X#r+lHGWg4a%}As`i4##fW2m5 zrdr{hZv-K+jtL=J)5*`0&V)^KFke-7jIbkK<$fyn2f&|NQkuU7nKy}n37~yIzcD#R zlAo>5Ar&w)scT;XvI&niTJ!?S;Wm3zh%M7!qM5%y3{5o7+RGxgd0T#Jb|MzN z>bNeJC!#-Gf;!0=0a=(}k`NY*aG>4GUa2lV#5gl%HYjwxVGJ81M0$yY-*=|GTXq58 z-ex+fE+Z&eYnXeiwNw3N(~}kNyUSd>Ux4a)l~7rDm2Xo!+9S5Qlc`nn7ztTgXu-~^ zu2>-EVpE5rEZT_&Mm+4PDDqNT^)>QbY{#)P)bPyI(F&&2F&GPqH)iT(#@+ohl@~;c!{Vv{LWV-E@1aHA7t}-te8kMNz>5&8D=5PubK48TK&*k zqoV2%-m>f`8rdgA@h5hY%|g_`Du1LAv`soiKqmU#u3ukA>#EMZrAa%^BVOOuKTtX@ zD%mv5WKy|6FAmra#Z6^myCmPE}5=hlGHeWBQt?*!ToL^QZI{Ah@7|FiTBIl-gn!l)$iA>V*u-=si=^E+CM0zzA)* zy~9c*nv6C=%F(_ldeeyza+Lf?8Ld{5xS|VR4#5F}&m`kqJCoSry2J-9 zv8!b+F)=JZ7vqo>z}2zML+qy%nQnA-s?VlBy~RH5Olirw7oq zB9hv1M7sV6L#Ed2+G%K`)6+!g*kno~XKY>FdN(`wZQ6_jn{2ta3~Vt^6MQ=xTr+iS zbAIY+p9_jaPWoxr*S$k7jG{#EYH$s|ey8(OhjvC>)jK1uO*(du-v^R7U5u^0R_f6ZQsLrDs0FB*~?e~TH1 z7ZEfm9U+gK$^a-Ymi=w+)7nM$XnT{K8tAZ86LeFP!mGSWWDqVPPoe_g z7{l|5I)1LM#ts!Btf-L2l>K>7YqY+`tE7orvv}^o-7)40V;Gi`ch;M<%nYv1T8wx> zOvxftBDSKL=)H$rbOK`a>N{+yRvskQ>%^kiu|@O2VbPZ;ltxu$c&m{($URBo#zYz7 zTCqiHr22R+4*167;A?9_EyKEROAm1D%As~i6C~wXO)A$4d$uK>kK@&GB&-kUXI0}d zD>B}~G-YgF1T0q48baqSSIbh^^A)RXJ*U-1FoiSGi&yhxNNy1} z{PN{!)gtE+lHIgQ$)M>&;9`u&R?NhM^Pwb0-fLm}Fm_xgsFQfBq4M`4l_=3xOf?zV zUM4ZRT&5OT#6WAQqRiTC;;21|{@}$|CzgBh`H4C&{+1VCl4$ng+=d`%hZo0E|C?ky z71uAoI&M2;xU>^wGzM?Y-oqQ=g@)0 z=xLsf9L6~HQekcOH9Cx5p^>3s{Mdcv3VK= znr#_lZqSG-&=&|--$_WASEe{{roFj1Q9PDecm07l%*UG4@`ETk5B?_hP9Me=#SI@R zG!$tZL3Fn(EQ2vRk7+BEIAe>N31OAF^)Ua&pc%|I@rgCzR`OU_boeC80jWIk+OsWJyI_y9p7OO!=ZCVk zo26#ytGxhy7l&W%Z3XtM_7)aac+;l1ZDKG(7r81k-E~V$HO=%To}NR&U^4#CmhM63 zRI98z{RJ4nV_K)(#RPI(HQwuI_-6kQ>~AG)F^q8*W(Yq?w{&XqRpT^^;m z;AL_}bFM16;yIUSvZE}QbckH#QJxDHKkBH+xinfj61m8Gh+Lo^59rWxWPm6G+M!j{ zsc!kxarJxCp>J)@H=;OoIhV+B{pv7IL(W$;*fBHb;%GSTjcsA9rkuaVY)5m>)qtya znTxY!ei%2I3ymx866f2d`Gy@z1{fTP@&MxlOlg2s!Zy2dYd*kH^H-_3;%P8Gz~o7M z`K%U<5BcCz3%t3v*Ja+8NHCOOT|N#RxJ-3X6ynqOTD(gxQJvVxq4%{05Z%zb z+(kB7CCQXTevTNDaBJS~qGoJ1K@PUrbWiWn9C9kF$qnR7fIv>wnL8+Q5=PFVlE?%H zY)Mb3#UksbyGt1e=?EMq$uOU&vdh#wQ3*(0i_uuGx;Uz_rsG=VpQ$Oi>ai@NHItrl z2$cBEEdB|1A#~O&a@A|{(>;p5Dbb}iYHeW2mxs5Xtg*pL>?j9;GU@7YWG_{?y&|0b zzg!f?b8_P9Rt8+z#0$%`UX_WkIVSomf$%Z>N}@iMP+y}R@j-550yKiW}kUl;-X80}b| zbBPwWR5Cy{E)inH>4v6jos9QB+>TG`*o5}aZq?0T=JdXyv&lW$*EjT8zLi-ox!;T3 z=X|yHM+5>me%Ag}W^-f+cEyfRBvY$*bjd2cC2BikNKH>P3c+q}EA?$Dah`pNA(r&e zkxX)O8>n02xv)JXfFxeE6s0-eoumM9-_`9C6`m84hFRgRw)HR*RQAbDvmqXk}4411( zph4$=(;({ZDGYhKFl29G$cu#``wBx|DGbRLh8ze(5HA`!gh58mYL z%Bk3mU-?44mlTs2JQJ9XSNEAaUbH(UzDR)^)ou|-WAoFa{ zY9vSx^uipb4X-J2Wt#FR#(jc8D<{UrYEGND+49?>l)%E!Hk+$HPwC)uQQP~u=k`pS zmvJ?7yYyIr+vW<{mf%X$sRXLXqcOa#1a0rdOOT7Nu0pC?b7rPbC-HT`a`f!5UvnP} zQ(RKg{(%v9u0>gMVWiKFz4*mJ`k^drC%8D_N47Se3+re9hl}RA{AFf6*)3`ROlq4& zFTysRJE_(6=y3?at=#n&%xU70h0jcRDwq8Lt>P+t8oNvFr4K8jzgbrait495wt63v zTO~IT`#;a+81+7x2gdIxFHr80~?rX|U@SnZ#5pH1rA8sq>)>g8fO z#(#`CGU@+x__y3zkrbc5JJoht&=JbUoX$&Zn!*fTGc_|t z9u`2rRG$6A-`E~dIhlKvutqSl6*M|8U%LV7H=(_LOHni@g)+cSE@GbvlLsejt1I~= zHKbN|HF0B@mleI(pbKYaYuSM$a&l_uVEdyK>S>BnjB*v7067l9dE9(fFqbG>G{sX6 zg8USoDdhW6qIxZl>b=!nFPy2jT(zghdUKM8U4P-V{G5}35t}JugAuXz)KEog*S_<# zH{JeyCg&5-55V!$X>riH^WLD3+W#Per-fCXULzKWPWRQ+7{+qEVqJ`^8h-h`nZe>3 z_N_9Tz1r)Gi>AGHeK|h0ucLWscGz}$%~!OkHSJl^?TSk>gI)t3na#xw+UzoE!RmLD z>UR?g#w~36mEPhlO4r)NzNoKO^DqI#h?U-y8i{hEQx$paVQsGqZDw$@;uh~N{^?e3 zSr$!tHIqK*3iYOCA7+#9K?p5!6qXqoqvazHg*-EIv~k+u_Fq%(s?^b9hJ$~2&Eg<^ z|2|F9k8vw9Q~H>nzJDVuAXuwgTvPN!h>(J%uTMpw6Z?9fwk?F@Fw&+<*#5G^k3iZ% z^JyK!N9~R|#KCQ1(ZSj!Ji-Q%qklq#ybGc&O7_+r#|{S9ZZ1PBd+L_I$!xZa5N!Ns z!`x{3|C6AHdwc%ftWCr6yj3@GstmUUKy>UL( zAxny$URxBmpmbUf0Lb)4q&)@ZbV6>`GNJbXBp@&tC;wzCg)CY*pMb%{J>Vg8P9_A~dQ@~7LVwjnd@pUhSvHtlWh2HK>-nH^8 z62-x%1=wf>CDzj3<-ZmipeX-TV>+hR>018DO1)?-I7hPn#6?GF%+gHjN5hg+dM#;R zh89!xV(M*5{(UufbadjtloxtGWb63J?N~8M4MnDN40kr`hF;fo$X@WCNT%+nx`&#Q zbJ-N0SlQ)TbDrwD!8PLLu6roD7Vmb`7%HQ0kwsr7s>fQI+7O?ow`;SB9 zZPT6?rp!gfG;iF?a92i0^q0^cZQg@}H7YIbSrQE1v4zB>XrQ^~XX1AQI%_U%i6yfq zy=1x-LOB&Mhio%38UKq`RR}AiP|L|_X{Pi&fOVOWI7&Z+YbF89_3TP)Nn&;W1r=A% z8OI<#j0ly{9Fa|Q+Dz}k@@l@)V9i6lkzTK=S>s>Mh-8uEa$Z||%}f1}?7hivUjK0_ zrBvA8srDwnwerKZym{I70uh(}w*9*lU8i*~8{vB9Oh|;`*Ko^6Nl7-*-dYooc6&Yl zKtwWmYriHtg?f`arV@BPs>7lo_t163sLGp^Q>A0`6RWeII@|1{-D79hY08>{8BRUH zEcc5Ii8{Ig{+JGdmQH61p=yXiV2BA?%&qgZq&r_!uhN2E<=AM1pttC}>f&EcV;Fc{ z4AWNtF$l1U7Lv))9>-jwg>8r0YwKxAc<+xXS|*})V}tt&`<4hztsNt z{XPtHku7quh(6F~!pEhy^)Pzvcp(jc#PE}w?A{TH~%s3l4rdIPj)@k zezuE|q;H&7c59t_PD`)bUn1t?-X*{E7T~({XPIq=$+jFWm073S%wS}Q_JFn_Jg8KNER?90oUwLy&{`_TU3WXV_SU!I|b4lgOJwls z!BZ8F+<#(BJUdO}pS%;z%n~qf#VWX~zr2`%u=JQ?5$8Ujnab;XP8K%CKELMgD0bEG zKC>2(Nk_y4GLcQGqo04|d^Px-qm7f^tkL<@Y!K2=U!q5?VZOU&g^69pj$pBvZ*~Ex8k?y+!Xg<`jAO zX-YNm2b#U9@w%P3v>@7NLS|+#vC~=~>K`OTB|f%E^_7u`X!b(K{H9W%u1AAAHF10W z??F4s^ekuPhnZ-mE_IXA#w8haxCP;8Zv!+?Ku>os1y$DzUjJ)~o16Tj{vLWXqFK5x zZtdbGYi0-R>n`N-2&_bg)Q(e*K^tt?RI0KyB%;%Hcysnn`{m6a8P84gUowuAlPurb zIPI6KU-f@EZN$s;xMGUC-LokPUuHRhS>^!lnumDh36jxL8XE#p9pG$XyCC`ERjrB0 zArel!6q1S!eqSqI02{uqWi2B8k^et5&QQxudx;HJHVC}FOEu?7oEoilrNVaj#U-PE zoiCyr)TFtJ<`eqj-NL>phkcW<&!7>ey>#;#G{oq$`J@H}rsoD*W}@UGruM(6s`WPD zg2i*K?a#I83u;f+mP!jy2HQ3rV0p^gbHtl7Htp?qwkPUsviz8B@i3X$(we@_2?$!mFr zL%GFhtMTF#iuVYLw=#YRE*DN3Zh3s*5_rUhN0;exu>HDE#UTG~wMB ze)Yzh+(Y4aQ}`9f2_7)AdjnBEj*K4h`iE(6DZJ2~2s+pF_6-JaO?(V0ed?AA5rdMM znr<{&>A&HE=DX{^d(_|#+vpj`;Ul3CoS+ZiO5gVxV`Ro)SF9y{>+*7=h_rFZ>DZ0r znSpB=3=j|0Nj(6ZPE5HXQnZDbnPFJ^@rcvt<`U`M_2WITQHf@ueylnMU$5j>`f;cn z?|r9o97j36mrgfDICXTQ*Y|`5%8XDKt`dTk1-kG*6BiccbYV3F1q$`yk^kT6!*N)G z>BC{`{pI?wHDBM|`ut`3u-ee;zY*qwRWfv&Vp@@}*|?eVMghgZy~?lzw(Ye9PX?){(BUZ)hdjw{8r#4X?Izb&;`xrY6|A*U8sf_K{EkX>13 zp48!lm)T2c7#&Nb3R{vtrwYe2*BuKLVHSMeT?>B6f1GTWWlB#EwP2A2d2wBNiZo$_ zGN{pa$MP8p^Ak%)-S)^pU^V;?^kEH{yPPikidIx?edqGM-sB_Kf83k=_Vpj870319 z7o`WYJ9gPl^kB}*I;FAwANFgqw^Njt?I_fP&!m0*PzQ!Ws&j9JCSM$7W2#dMu$S^l zd!iCdO*SOb77)89(E*VC$eE@H&rhtP#dVT3H~r86p%y%q);BHK0Vim|%NgNz5+YQA zIkKZN?f;yyhRa{vKiPofi{|^W6K2nW0jKZ&Z1j^MjpelD)o96sHW3y-Ls^zcS@s`4 zQ7P`rDaC%M6hBAY)=auoDg%57l`vMm3FcRPI2gR&gd{$T)ikjU=0@M5Iny~E(sAr-q zeJpb${YZOU%B*Vx=Kqlb`M=)(A1IK0L@4N1DUh43>m`BF!pc(n;Ix<9A3aXBWR>n4 zy2O@OElDi7s(mG;Rho01DBFIedqQpN)A&ha`AhUka7j2m_MqlJ9D_KTk8QSNM%h>1 z1MMG2j!xG^qd|fg-(cx_qdjgCUyyck-jLUIKQV$H6Y19P1$WmAaE~&t|5s!X^eQ(7 zd8z-Tc+*HoEFpuMf^w+^VwV08(-1DB1-wsSu;I?tAdrqT?QL()FHyrz)Gs6VGbTzm z&6xHQ`p`?$j^2D7u~8nPgLm%!C`oO3HTn&w59`!nG;zNjif%#S)bWgH6*Sqx2{1b~ znjYMUQ~~|;4Z3O8EY$pBMm>lk)1D7caP)nJp+!H9ess!HqaW6EPbi5_NL^3$ragc2 zsZ7s^>cBhu}5VVhmpJuXZy>k{^~3)|wtHn}jp zwM*DO7q-oXZF6CIeV4EUE^Nq!?RH^9E^N$&?Q~&JyD+`bOS;J4S>1QLuzfCUw+oB9 zuqRyD0T=d!3oCbFdtBI<3zH}a&Pu}k*TUfh8>wVB(CeElwGqv#t`nJx&d}XLKndVd zwgB%P_q`_vqOmCy&22H;jb2ysHTLe&(=trw8D~=>)1wY#Mvp5|W-y^c3XBS^2ykmJ zx_0n#vv>231r?C$S(8#{|7Ae>bNrA{l%7KJL?-?ZhA=)a(-%_~j4WA+pNU?$hvRyg zhUj9FN2VNm2tJ4AMD0qUa2@)v)4F8HVg@@wd%BKg(s9wEH=6{+VGCjF5w@S!oR+HH zTFl|`?d?mh)bO0VXXTe{PvNrdtnotRW-KytVD6UBL-l2ps}9em1iLXz-Obst4~COm zGg$Ga&eGbGFvI6IV8T_S3nA74Ev!3Vx}9v>muRW!f7A9h@KIJ*;(sO?Vbqal&{3mJ zHC?A|f+wRH8hBGcUX*V?5xS(m+Wt_E z4CwcQlt0{}R@KwYPeRv1C?P`0IcKIwXR7V5sti|d=uHcSWSb-owNgW35NI*(_SxAy zP7%5ei%KvrE{^~1YZQ?N;qPDz`x>2y7b;$`hiZnhi_r*e# zaTRz-sI4F!W9lrd)K`gTa71vpZ=|t&DW7If_{hkO9^Q<*I?bN!&Wiak{&OH7eO9K% z&20`nJ~bX6-^$P3)a3E0J^aXl*~kBi3O%09|KH{E^Mg$L4sGrMp1+0nKK_sK&d$1} z6Uel5O!#PZxQ(Uc-q5ej7-(l@cSM_3$)1SV`%I#GXHd43Y2}%>P%-FJ68etf!-T^G@2^`ndN4d3I^9K5#9q z<*O;ffK*H!h}O9Ofr&3>2Mofmg#a90*vL2gsKBJGxy-VoH&Mu_&L9dMUirrz0{cm4lmDW>;7wzDIE|? zUTXq{ih!Rrb<|8(i=o77J}#xTJC#S^<_8Xw6L&moZxZ%bo+ zI@}j9YTriV9Q_z>a9Bq@;VHcexwZsZh_25^K#~&xRaTS+vzO?!|A|UJbj3v~ojb77 z@;PLsC#ou6ZPeaD7mbm34rE!?5izDafSvQ#R?thg!j;?XU3MLEN{5XlsVNh+ewGug zDE?z)Rp-9D7*U5VOE~8htG8ouR#1o<1dmEB&-F}nWlFEMeZ%Q=NGKE--V-U zV`UiRaTY0khH^XuGNklz4jm(h^9}q`w@u|T_!Ugq0WRh*bE?U$qvm^RWN}|*7j@@S zZ(@`DZ+%?aw<3j3jPHNd>Ex8(9`wXJxR_a3rsmh=eb2&T(p;-feCne(;)4Ml0fGqZ zL!YVxArE1ncQOU=F_O$7V*S< zcF$uW$8l3VX9RAjW9BL~(q!$YTKWzy6{wNb9=waw!^=nH@jJj-O-4 z&#~j@*zpVO_yuqLrO3jCtDfT5KYOn{K0l86ogDidHHb=mQ*9&zRO&)-x zU|KBaPxW~LbwD>yE^H3J_^>@IGLIzBJfdiV;}t~>UwEEFqcTZb_>fAgXK_g$mLn*N zXmcd`R~l3#P))IUGK#WqEgG$-dL$q)+XnF*X(XVTOsY4tzgrw2($h$Stxmu%?Ew4A z)8fElie}WrFO86}fx<2IvP)8`%nUyxrc7hyKECr9Xh4K{Gzx7Rb>FHw;4xTI;wVfm zqMs?-9de+ls*}6xlabO;fj2cUHfyUF+8-WKQ#+ax3gCIIe07?#TNQtB*vwA@2@`@6 zAUl90ZDd6ht_e&cDoTTY2s9@Kw;6IRMZfD5?V4*hy&4xgHI{IvW)HT)LbLRSWhxP= z-$Ow)PZb~eH+zLch*yXK*U2~0T+>}+W zT|3P+rn7a9Nu_!~e!{^gMsv>LZGbKwnkxM+wgEs1duS*$pz_?tqzR!4*JDQIVvCjk zt5Q3)F86cCi#G42@BE1#J zpwH$Y^@1#{RWG)pkhU3GB#!lcrbGf5tt1kBWip8KM}l(#3B4tAkZQPBRKszL8ad0i zjgTAhlZwgd1HEb`x?ruWT!A4=y=v<*6RIM*RE$X&_P0N{4+&l!I6@d=xLP}?P(DX9 z7nLCXxJ5zr&7l(Rz+5AHRv@?Q{nS3O?RnL3k?Ks%Aq-#C%gpe*iq&*Z*+Oq?45pnI zO;D%;aTc%>P^~yr;Mvm}5&LCk_`?D4YL+V9w&XJ5Qt2wX@8GRLt=yrv-VnXT6lXcZ zD)2#p;i6?aLwo5B<4Q}I_;VO)(r2IbgN+X$P}b2|FG~w4oh1=MZXxu`vbZ`?>kCoe z-Iz+zr)Ap!lfAjor)6IOioA#{7wy?8D7Whcl$X=H7hOUQE(LlDB?=+c7?QIB;=qu* zl@(pEH!?v8Wjs54LWTIObLuHq-Qmiq>;F9myJ2VS|H+)2=@eVTOCL!w{$3=nPB>Q^ zJssxW(B<`5GQLRItvh)YYc1CnSJf@i66FA&Wy)Y=uWaU=ZI%11No88qw}N2U3sjIqjmei^eGMhaJI{h{oowOVKf~8vR?gXVl@=p^&cx~tLu53qs-L}+s zy{mLfpoOv(H|rN_f_6~m)e!o~LoG-QT$sqCc!lP}s6vbB&w-MvEH>pN;^Hw%b}$HmIdwXdJHv#niKJ&0nt$iivy0nfPPuP+y}Zl#tOR3CDVCPRlJB zq2F4|)dKZ2573thK0H^*dXB8Eh=-E411^GoUJV9D`3J_dea7^6)%sLhn?yVlQ4yWS zw3snnH1rEI;4OKU+fO->%J=eFJgpTkQYxc}C9*H?nR@bee}%V*HBSy#$ZXQACTqSv z3-F^gq*dxaOP}$Fr?P5WfmI&JVbYA)ypwAA00?1^vRi4b+&DQJqooCU!fcH8_c;c( zmYzn;ceFVzEv>7J^UU#Gzd<~J1aMKr`&X|O>tdp%Hcs9f>{#fLl^?-GdtUaJeAHNHt|%wEADP{+d%0 z^_L+W^%uDxqW;{Jv2@n?bkDhwY&#;# zlMQ*;XIMU-1s;Y`k9>+|xQL+#kobr(OV~t>k<^WjGE?Xz8tkYP5+llVvnSSdqpN3^I3z91Lkt{k z01uanX3KCi=?q|`16;;~GDZS~mI+f%PV3o6XYfPjERryo{3gwhA<{rTU`Om1;xp;0 z$_UaaBh6dEQlBi<@S=seS_N~y)s`y29XX@G)k`HOx;TDZxb#K^S3(eTrCdd6Qo|W| zIPZA!UM#?%J7q80dchz;8s?ZXYN=2f(FV*!^Xb8mw z1hvA?E$TEn)kVInAP|g|vZBwTVG+B`0hzvVJ{@9_$*$^Ngq36q_)f2wF2Al$Qp}rc zJcbpqpw(%rXlWyRok&lStd)-M;l~w@WrkaOIZumiK{-XL8dzHu&dx85pHM%$)3q%c zX=(+JM$^NY!6~6$!ZQUMPJ$Jh9mc&-dg&-+K3e258gNzH&o$_TaX3{rATWU*+-cm4 z!(y0VjJQBSrHzh6q+Nuw>gLIdq_2B~x7xRj`mdtU^G>d(6H#OHfWs;Dz`k&$Hu>3T zF|dD>uN)_3mVD(qUqv=QwNs4WYFNLXwn9kL%?{zwj$OTMi&ofyp~4P^c&k_0Q8GFM zmX=;#l-2T(SS{kBO(7xNc>GT)wHVSQQXMAOH|S4Nfevh~-=iL24&ejP+rN6f zoAGWMWQ$I6h1*jhqJP{5A&sz!(eQ1k0I}dds$8%GIKxrjm&Fw=7@R`{tm_rE-;QnT8Xe4TGRu)xT|+Z><>4( zcI-N1KHDq}pxNK7^Fkt;yFm#6FHMmS+Ljk*Kj=&boZ_@hJfO{PQ&W2#tT#Q$vJwge zovj?5&;cPv_s)Q4q~3@Y|6(afO|LwukbO=e3-j79%qDzdBrz`}m(=-xRH^L|wi<81 zy!sR7h4_$U&d|)euLr$(BS_4k{aL&0ZwORVs!{tedVpYh9rh(kuane`U3E-#WAXdK z!pF+G$Ru6X2laGWHA)d+GZdl-SZS2O2OiUS&~1%DlZsUYJNe?=S5y-d1)L{>l(=<= zh5sa0EPzomVUvJm514fa01zR<;S*G3Rv;e$T*suqqseb)8i-=?y5LY)l`0v2qch~H z4D^=5HmXPQqw>IW^a#yS?TUN_iX9=i8hMfZah*K}nG@)+-USj)Bq4;%gxLZhNcRVV z{L&@mp!Zp49G%Ldpb&?BCiDqj)(Tl79EF~6mI(E=fN^@)9IGxu1LFBp$l;KFUR{#4 zkgKeP#UzU|Mu&1fQ+N6)1jRf3jeq#8KfJ`lbj4562t!f7+|j{EA~Pz^mlFL)oG-|d zB>GC&=R0w8q(vLCyj7DxM&_QJxH4N2*pC65;|Zg8A+vWqwDPWH=0FZVykY!Ebwo@(-`bk$>9f0%=4se2n>KVI=0()ATY zlB)6wRs_E{OJ)IRczzK{gi)rM#0}&QMvkrY`sINF5Pt&B#rwT*>w`>HkhDz8cqRbh z9ySk26dkvWyDL>q7|`8?5Xjl_yD&p$y4S;QN-Eel8)9ErGomcs=6y2BHcobm{fH3V z?!Q26aSqR&VnB8rXV~pw_6%$hX$(2x`{am;<3gUw9=OUcoQ)p$nfY>tdSH9vq^mcz za#VD&>K<#(k#$iwUvRxJuI%{snUy=-Jkt>)H5rxtNi;uo5?c`*RG&l)Ty1ofZ<~I# zTM+e|(v{cs8Oy~K9>AzM?Ygd&J(>~OV4`dFp{mtfmqs^U)9TQurUhzgoO63Waq`e^OGws5RB^eHc5=ygotg}Ls6RFJIN z8KjjUhd*?A_qC1kB6;t%$vSaT@SVyt=1#=;b8fWCHafS$bl7e3N(P#a08{NmSP0E1Y~n`FVxTD@s8kLbNF zU}Tv4+l$w8+4It+!JV=L)rfAOC@~cp74Itxlx}i%41Q2L#m#`}<&Ty5znY}%00oa~ zVF4wvEGZZdXoQXOm@$pbZpL)_ALdOZIWN^6>WQ$4)FchjFGuLi(_&QtQ8}(bqQ%O~ zq*)3Wy-2@I6bQ2`M0e8yVSW0<;Blk2ls1y?A>4lr^fqd}(q>6JoT$I2T-D#pBT@gz z`WJzlOafUCQY08azl+f0A4OfP*2m3Yz#w)UzB6@(_HP1P{g(%PGSMw!aGMS7Y$UcqHAGjb&zSUywA$NOm{Q{wx z*~5G%lC#xjAA9!4!YX zEYr*mVM-vB)-QnL^27aCn5T`}gOHX@c7w^9Z*!5k-~7~SejfJ+94vl5OL*`vwG7S* z_}e4T$$X>YLJsVUQKiLELN$Pa{Fg+}o8S}Z8Ig((pZg^F#iVh`(Lp5DGFUC8h)8OZ zM(PDYMOBG`COTwd@RU(2>zlGeJZ9CnsqW1+Df}i=u@X3tom>rd0*8-`aPJ6c{)X9W z)b5aebJGzbmDB z^V*9RtH7d49a3FQBzZ(&+N;;_YljOO?bV_IRQhV+Y!I{=n|TwHneoZV(e$tHWdyqJ{!k4qS^Kp44%O3DvdOKB&Ak%f?162v3 zzOunGSqE|^1gHYAMfTR8bMSapg4(MKt0i~J9eTwzqHHZG+1j)fln{aFaygKvu>vy? z0J01%z6bU8XS~LAy6ia*y`v#CBtiI4AVimMgrA1Ue^WgFB9&jpPWgeZ3^96m26##{ z9|JoG5EeTZ9dKUvRf-h=S1eZ2yO@C|GxD(5%1rimQ{&~i_A}pp7O1Chd6x}$jnc#C z!#(j|3T}mh%kSvrg*JpD`&n#1OYCQ<{VcPeabw*-utAo zVnN&53x5GUlcs%C zUn>)@)y}K0+G)<}3$V#oHB{NFQH-A~QP`uaBToL&)%A(jhQw>5^U574Hl=@cfmYm# z{BceL%;#+WFQ*xq1WIbZzfkRWxwN0Wg32)3Z@$1)?Z?7^cj@D*0<$*ACX7VOO-gFH zZx3oYsaetz$x!V_+gfrK9(y)m-&$0+;MM({BTNqBHzo< zoY97LR|c9YL(=gK*w0LPhL3p}k!3|W;lt5MU)j|Ara#biJIxf{D&1VV^h%~XAofkv z?YYgxNyrT;{1~Mjgn2j`W6CM#l{?WMIBmBkd!znE=H6J}jj@k!aPdryx?|wr1CSe) zSlxtb%EQV^@TR;G>wo^#+1tb;<;H%l6*nfgS<{$E*l2f|SixA#Grb$pz_JmI6C4~r z8^g$X7CUxwb_MquQ}))rE$(iaq1zqJNUb?5z$y&|F1t-sGBKTIc}u2i*Ccq)no)`` zp<1@gy8~5u!C2Kd%zfg~D2=LM$`l67Epa5R;^s`_rS|7foi=%sGopX2J;+#C%*vH- z137QI*=FU(&#PF)4VfE>Qp=8c!n=_YmR={gzI@&AU*%X5n9_j*XTASPow26+Xk4DhRB zIAhr>(0mSnH1BKdx~gPxR9dj|CeAb6m^|Ws)cu;Ys?^W@+Qe~Blve(cCV_pJxX)t$ zKHaFpgQyvISLHsY{CWeF=#YB*q6}1{tFI_EL7nlv1MZ3*x zT&;R3)|RBReUNI&WXQvv^TQjpE}vYOpQ!+si`1s=P0I@3rl1QY1T9!Gf~D^YabwmCl=k# z4-{e68aSv3Ch)qh1e)6FLYLwNqEA8OcV_rSO<#LsfXpU7ybsW9Lh{Kh&Wv!g(xQ67 zO0Er=IYiI3@DMHiH|M_l(3YXvyQk*Z5h&^qr3?qEGysx|e1$jmUP+u)EyH_M04v*{ z$kdm|7~o2;s(hbM!C!gOmi3`mn_9EgQ{(`c1_%`ID@GPmJd3i9W~S&1Zd7kpqh|@ z9D-7m8Ocn=9k-pw9T{CGkW)%2R}ecKi24O<3lcIDS*B+qVL5RIE?4%!lfod1j<5%a zD)yl7P!){Z?$h2?Rzjt&aAd7E_n5!H=4YS?8${N5u9D3@RSzlY9@D8#3(XeCnck>( z1w}n0&4JH%v&~UfJPH2_AU>qvV+^o9;JJsn>U%;TxkN2Z^L1a7lv<@{0u?ASaeLHw zwpAU(Y1{9jPCHl;F{bS@%HK1lAE1K*cEihJvKeFb)y<2(q(l8LQzYm2Wow=+k377^ zb|AqD4gHOX9uuVxt7Q(kjTB-rKRZVi7`bJZUkw3qh~=I*Zk@2c(eR(_$M5#$wbJV{ zP7vPTa0ep5P|m)T;1%IMW)^Y>)JE0EyTT~%z(wtomoe)Yy}N&DHyy@CxqF*4qr!io zOyzdp>^Swi*dJ0|Z%5ttq4e5L9l-a_B|@UK@OJSp&7NsFCK(D^Ma8!r{1y<6+WD%hASR4MHw)89sXGVD(~`g>AHTImAJ6*H*hIOVL-i2e&P zbZb6q-3gF_s$nhET9V{jbfIDxHBTSk<2*;=;zF&&*cNJiP(Den^C^^eh-ldd5u2O z_7BoZ<{3?RU^w!90{MO)T;A34jiKjtodGgQm?E)#%<_R#U5V4d>hN8U@hlpOd+-p| z57b3cZTo1FZe!Xpqx_ID{XMwTAI(^#7k6HKP9GNj{h|yVF#ow3R01dbvr#c3_j1nf zfKpQr?xtllqag6_&?szx;hZ2h#bg*`Kb1-w&qiD#^0hK~mJ7*z=ITH-RIa+8*=Vfb zr-4KijOTk!RsC!d&k^_+6e{{{PrUwZ?!OFuWY=HAifg%KKng=2%*>HOp#TRBZ3=*4 z5(N%G0jKI^C;(&ZM~fH=2nFXqH;dB$AXP`!^>o(EU)Af@eV7A>@8z|wfLZH1Om<<& zO@0p_h6vo`Cz|*XA;KQJ@r4c#CDUPsyJ~7Q!f0c7E9 zyR51Rdt5eK_Xv|bj7Y;jn3Ga*FNJU}-FGkNNOvu|0nytW2%+caX*nm2H5IFM#GI9#&S$rt?Y}T zz{YZZw6eD%K3N?J#-c_2#$@TYk6v+xJQZI{iMHSeG-2Ok0nc%az3)AWu{X^x=s6q5 zWGPtYjXT;WF!rLSS}$0z=Ie8V%w!*!$q$(*EqqmaVIHOm$-GUvcJ!HWMCEZ^)2eN&nvjq7~KLCdymevx8G8QH9MNWXP-9A-cgi_=gU zmL*el!s#Szc)AmjwVD+K@bg9ew_Ekn{RVebeZ}0F-8XSpU+}c5s8Mpf+m{54*Ij+% z*8dVTLBm^hpInT7kAP!lJ?dQ#)yz)@roV?G?>+~n^bTr^E*6J}PslqX7J5Hg_~g+u z)F7T|-1--RUbPq+mk9-F1w6D!IltqJaxw>&Bk;|0_@v_Ste8HCqcxuLW|cSkWCuW3% z68cY~*;#`BmmK*?cax}x3U|?+dCYevnWEJ_@-42VK;qlLZZd8i}$g$aonq07t;N1=5cZ~v@6dHuN>$#PUw>mzCwBCel`^;Q*9 zSX0Wx*HU;SuManj7E_Nc@ZMH;dg;kcX`Ux z&R+nFX`pfrbz($;Z3()tAlecTPH+q#JJX|u0Z%qQQBH~Kd-Qk&xsFC|&qrI}%zNHy z$v{2J?(4dr+J(1rOfet}knGPCOI4DBC9iH&LqVuSI7MdTBA%Sv)M)G5qLraI?wuqg z;dsq1KV0~1$`8C&<&xtJM;~*)j3`QEuZRgWL!w*U;q4bu?Wkb_n|J?^8Rqf?dW_dR=**uv2Gt z-SCESi6;V^OarDBx!(CRc)atcGj+U_jgCT5F|e z%sV(}!V+gufM|YBb`yx>A~-mBd`S=hSyBHA^Hla*$+LHAJa?t7dUmk&>fX@D^g`Zl z!)}g7it>t>>KiaDf8f!!R^d|6b9Fq59lVz6xOyLbdycfp4%Zp_8pgF~tC@I-5Cd)W z>U}4=Ql-kPS4%tSn3=0rizXp;!mu6Pbl}8jF5c497fsKf0JM0g_!2{$@ay~dN(mVn ze$2s7C!Xnko);wY;o|2}H{ydwsj|qv3S5e?`8bz@)dzYnRXaiD^@RNz)vq#^smKqX zy&Nds%5Orgfb}EkaFqfWRi<5=_kgSl1CE$g%ATeL*cwG}R+gxTfxUz)vPJ4}2 zMH0T;zJ2KtYq`(`ft#b3A$cpeA}iIoOy+(XfskRftW*o=ec9U()eK`wFV_Z;aDLQX zD@4t1CwLz1u6I_AkuB@xv=GdaY<9|$+C{zf%Bf*Gtm}4KL;4>X zTg(qqtZ->n4gp*Wf$uJz2C&jVoPe9Lo86Z8ggz#Dp_)6P;$kpmjCi!|h*)KK>C`M% zAgl$8EuiMYVzlQR;T-x(E|{Rx!Q6fJm^v9g)IUI!ed%$%~I(-31y8T?sl z6$U2Nv`Ob@76yWE84a;s;xK;H?%&1mUee~Ws{!69!w^|tz}*nT51-Swe>h9^?Ix?# zFKow-YUQ>x&In9&=e2fUq7DQ^|E71g%v%qg|HVZ9**gCv)O?8LQPt5vnf5as4IclT7_Nc1pDQYr?@v;S*8d zH2=r($@~KN+&KWBGh2tkCop_`PCO8A@81B6)<8c5z5qV2C;*Or`2LXiWDOsmM-uql z5XUF$!ua4UPU#`@*h5=nyv8@z)AMlw{p?P_-wbO}-|Jzo@afAoGGoNV)h=!&-EK_j zG^ghbOW!w7kJIll4G;R|To_+{UNWh}c|rkj=r;x!!e8zI$~AZR^a~{LIn?H~XD(I2 zC`+-m+EDvF;{5)>G*uyMiC6l-p8x}V`fYyy5@LF-gfCO!LaU0A?Gtmc@c@2e_QQ6^ znCOqBeI(XtpY!Xl%8S=ump4eh^1nd+HTr_%p_o(u{4dZRA25(i^mji2#`*GIFnoNP z6gVaCQ{wm(d;xs!AArwgL*m2n);RS)NB_7J_-w`u((+z-5qt)kNB?m@)Ikrk;b1A* zZG%Xy;}2~QHAx1&`)^9TJausJ0`}0r@}?!qGlo@OAW`0-*PZ%Zth~Yc{)77lv_CM; zZ~req?clG;;-VIK1}(FaK=U2HtxEW4<6|NfZ9$73md zl7!Ml?ae0=0KTCCe8aXqZ_uA3%*_#La4b5n!d6+GSD2e+)+w&BwC(x%<8^nUxXrIA z`e}VGMGRIyL+SIatav*5FFC&;Go1XgVru8VUFU~hQuu}FHAw#!C-V2bs__3}`Q3^9 zo8$QvB@?E=fc6?x{?@zW_*d!tntn3TH>~<6^4}gWUosE3{)zm3|6fx3H4d|UcOw60 zogey1=3$n)6JCT30&M%84lUeU+Wi^{Ep3MGh=T{GM zsClf_!i2u@Y)tO$@`bmuYU}ARUTrSs#LJh=!z@3L$babNr25NB=dkKuoT$IfPyHqHg~}f+pFdXs9Qk|@80Yt| z%?g?Lko{u(QJ%nOR2(14e<6GZ$%{Xcf9KjHddQ~E;m~8xopE}s)cK)@WFBVuO^N(d zlFM%$X8Glb{G;OKOXgvg?@#34`BGB-TZUQwo(YNi>-^MTG7q!-rbPZJ$>nbyX8Glb z{G;OKOXgvg?@#34`5RUL(aw5_Iz2m>2khe*7o5M|%9zoye>A+yfTutWJp>zkzGD!7 zRwUq!9gN?bL(u5+@Czj19s0GZufk72{aN_!VWHWs?@A3%+dG{@;5L-K*p$dWMdycq zB=a!auRM`|RC4)yhFQKpk$)%GYw7-7G7q!-J$EGPuk-8r%f^Mlyfb9|6Zxma%a_c< zEWbRFe^he$?+&wkeik#Xgwdr}5cc((6Uztp0x~d3tp5$(UlU2d zyIsTMM!;}YIrkL~U@ldyA?RJ4$lv!1O>eb7XU0%y43XcR$iG?VhaNL7LXW}xy`=zx zEK%M7nUQ)57_^VGK6*9mGn&C~zw!62u2xgIhe)*5Q2MPx!0Gw3u^J!0rLu8(>ywvS zk#Nq7>}npk^Jswl4#w}M0r(wwaR7c_0lzP=myMKiU#L)CNp>0t494{Wq&oNzfiJ1A6&l=^5gJ+>cC4+z}x;)1#g7)S~@ey z$sq0Z)4}kbNx+*t1iT-_;bjaD-kk|}pRKX$`=tba*&5!ZTpf&DctuQPCXkEo$F%7e-#>Q0z&n5cn9G5k z$MU#Ut(u$txw0|gYq|)Wr|NBFYy(x{Q+~`=GB)-Pv41R$s0-LLyKjlpC;Bs+-bwV? z@DC1s*0a(!M12P7lZb%R`u=vn!K|aKFhXl%G`$gj_g>pMz-tcy-h%Gc4yw(x5;NT;*p0j;T;!2M8#ak zkNyX^$YC9E6vG|Y)(Pd4L>!@avmshe4UA#0IG0N(2Vm@zp4};@7MNgeGs4TsgsaVV zNi0Wza_w^l92>!}30_H@`$#@}4mV&p;AJB=yP(M&-pcH>I;{7^M9x|D;Nk71ZGZys zAu`tnI#`Ikh9tCbL`s_W8?h! z8%LC7zjv`Cg`Z)wX-#XS+VRj*R>qZj?jpoC$Z%FQ;pNS!{0(fKQ6G zOb*n#Vbx+Uc90=dUs#NhtV3g2KJlFU)t@8R4)~xzotFr!_<*qmPUfOr*wo4CD?31&i{`;f;2cm8{bdhPi z>Q8lX9FX@6<5hPmPp_-Z?2P{1xtf?@!`&|CaqwRHPc_@*yZdHyo#5wCqJ3ExU-HN3 zZJf?y?iA922wKU*DWpIm5ze%HplFAPOmwGmJc$~a%ZebWxlWD`%W>gaBCTcO)dZ$V zM}HW#H6+JW_}lgG-Y*VFR>>!xq&G)y{eCGO_p*H?Ha0ih`nU46;$6O6F{@!!C8@2J zIysTYQM~VQpvW7II4#9N$aT_a=sjGWW!*Qmj1u}A3uKRy=+$Xnw4k|cE5Ix=c7wST z!->w6_GMCpczP52Wqp&tKV{t8XC7A%yzfpqjP0*7Iz$~nl)L?LzoEr1H1 zTJjA$@kOw*Gqegu;yxfNH6#bO0_L(c1ci@z?wi{6>eJ$tPEfa0sE{0WoKkU1SUHMG z31xFH5y_PT#-~A?e}WCmlq2LKSLF#gmp@)SO{-JI_;?2Wq%$~AHw-*qTXaq0eC?cU z5g{33SkI_a1F2>tP(T9fW#y;_?{76qR)n9ufza6S(lVD3*(RQ2=rpA@B7tUDV4j>5 z>JNF#y8fEtsL)aI5PiRaf* z0R4@$j>jrq?-qbdz6Zm*CnY&n}IJVe2A5?MNRPETLG!VwTtrL!U}s=btOo2Rp5T7M9%T6CF+ zr&ZiiXf9K7CrVc71bw{<&b7^Uqe1+k3&-n9*UIgrJ|iNo&8+-@)v){=iv041<-I)c z++@`4lNfivsuqQM+wFWAtG4nRU62aaAS@h}5CYC0mvzlDl@yrG0qKG4qA>cPaB$mt z;U8n=8h+sm_o>be)HX$$HG3DQ?MgeM#h1}#$!#YbY_crXqlk`{HnUWZ!pTy+No6Gb z6}CJh_`3SjTAmU7)r;__dJ!KTjK@62t1M#l@a9!-$D<3+h1>c#Wa~CRS=s_i_`_TJ zZss(kdC2AuDj=MZ_ja(u_*t8AZ_I28JSWY>mG88DxFzriU*bl}ZA7;47HtZY>3H?% zv0hUOcbkdI?ZwxQH&FHUXk>#eI`@f|&55%+jLFsyAHe4WLwvXhy?V@TRo}GpL>pdq zq)uZt9f|po-3{1z7f9Y3VJog95iC>#uat3!!(|SKQM$KlZ5>QTCo5V@Ru4EA8jYyl zh6b>uK)Mdi|G^$3+9s(k$o(%087|8GqB@c61p7biAV!Hv?0=2MOx5fEFaD=gOqLvx z0no5gp^+&3qz+@w^3VE{>@7Y1n_aW*TQ|{JJcLanZdj}zZv_Mfw0jvpKki_^jy`Ja zvsM#rjNP&5vh|{uk5=l=q8L9EwQpBkK2GMJsb)d9T##A-t)vHtZc@#b!2!#0PKl9VrSdAM7>8|_~;R{`<`rEL=hKmnA1)8okc;}e=xb3Q;F$GM+ z>yPl8QZX7n&9JJK>lt@rH|M(GVoG9ofQ#SQ6Q{$P2%N6bTRclZGr(=lFeVvY^31*m|orFi<3I7ma?_!WoiQWzI% zMXsV*;+1W642C>Bh(eBr#Rp6@l3z8(4q5 zjfaq#gydA-Z&U1R35rer@(>gQD8c|tX(pN-K$)&Khjz8COXnzcphyVk-kNN}4}+fA zp&Gt`6-}<`D<#PU#?!R5u;J2dD`E+Sh4Y9E;BbxC0Iym4Rs0C}fKVvOqjz)h+7v8& z0);Iyq>|EDnl&EDNUkVY|DDDwxJq^(f8gwx}2vAbSQw$lo78*2TV z>U_WW31$+9i+i+7^5`<34Ba3pBgtry3{rCP-p0eiaVvx$yB`Z7qxl9ngj*Urm`6=9 zBL4}cStnZgTb^hSZoi$pExUu8Sd3-j*THNL|GwAU68@mK;s?TWuD65{;B|Z~)bpBy z3kM#4N0ijl@J;19)9Vc1_jufFWF0r!K1nsoPv9NbXxq)(e;T8oz{B@d;Vqfrn7V@R zO#vb-OZ}~fyrGQlU;?E1mJW47AcudG_`>X5IMUMHrKum2f~P9qx1JY*P6!?_8d61* z<8wz0%)5jhZYpnLu86e#qE?*0+NT8v&#&0y=>=U7AqAJe_cLope*dGBy>h%iZL1~&y)$^$?5SMKGR1c3gVFd@ zjK=+zun*S8w?qS1ObUM|CG?kss{W&5e0XtLYG@pYd99Xj<&Z*XZ#}0J^qo23{yrn} z;s|tDyAfT@Q$PZ}`%=Idk#+P4IA4za-c6U)9{En-J|U0{HolXYc+E+?X4$W@Tx-;x zqQ8^!wR6sJ%k>H;BXU^6Tdr>zM-OL2cJW1jB}&I{)%QrHuz_n<$4c^`0@sE z=u~yR8EdrstAb6d#Mw`UyY}rLj2w?H@Kzp0O?!j8%w0UwLnYaVc1Kk%Qa#xp^rQZ)5QC&={Opa)J6w8>;#P z&zj)F=sZs8#~rR6ME^_1;}g6)7z-6q=9teZvs%g=OmATyRo=)vrrWd|xVt;@-VXP& zqD|e5;laqx7w#4-+LC?ks+}U>lz>J`=nB z9@VER7kS1qnTIjYqUI8T6;-rv2F&A$MpES>+_}b|wws6eeVhNd@cKS zs&7R$B`a}`HeDs6?+}}(m9dWQqGbQ2`z8kaDv#4)M$(wO3mC*n-l~0VU&}^jDQ;fSig|CWtSq(Q95MliN7M5lzzHGkZFw`b=UP|_E9KkH{2X}Bd zzk5VpYyCbP-zc|aMxj&CoxwKoIT6%FQnwWkka!)%FYWZKQCm49pb%HOi+bE zw_9F?(W5QK3F7k((yspKimktZ6_!Q#wSLr$S|y3hlK7ICi`Q|!C30P@cU<0*d}6aK z|4)pU#IaZf>iAVL|E>HNjF*@KbnTVg!CR}m=B?(#TWv6R;_Oy#!942=HPbWM-4fEo z6>%7%S#(TE+}GF`E?n0ax}x2^PMSj}6Mz0)Sa8=c7l?YuU@V$1F4v}_BvH*yw~aPT zw>t`t)smYFPh0or(uKjS6&^h2H@pu>sU@j0!If0E+Q`5S> zm~RIPWeChQJ)+S-Tx!VWgJMc}lN8#~F%V<$`pLQQu|j3?;grIwA|DdE@G12!ePtoWahrxk8~jk`KbZ{X-B#9DPnh*k4h1?c9#kGZznxluoE zS|G=$?IB$>|L)jFZfjYq2qHFVX|8YMbgpw^>Guz$41`aowPUzaP|7CxVMOn(Eam!< zk8gDCjn;W|ArB&2-T=fXIdhZE+0A#Tgz3`0BQl(P#D&Oz4#;5<#mXQ-Bc#TCU=C} zyi-(p(vA7j=;Wo`qa7@fqJy9rl@7lyw4z6mPS08;Yz8ALw|O_;lVdcjk>J-9qb`5yI3iX%tUA zRa|*HA(<*fG1OBfmEx`~U4>deo5i&bT}Ffz#eH)bXa%zKlt+PqsTPtw2cYLwB#SavlxgM6rxz z)crNo%R71WYtlfc7@Mi|M&u=-1cSb69|($hVxAUrMK=?sNtxIu>DVQ|!!9|Juu~51 znQI)D@2%PEF=;f~GM`DUZQ++El**e!>7cJsZUjeA)h=O)g%*f0kP zJj}D3Z)ML^@gWgaZ^)f3C%3qekYJzL8yd+qKuf&cH!{q#xyWh>r+~IH*NTGMLVvH`g$MZ!F(WU6rjyD|jG*5ownYA(AwC(2MOJ{rJIN?~^L=wZf$4&Q18k{(xE%r($S zph84zR8BQ_#g5+S+7)%9KD53%NId!`ft$QpPxV^&oC_W{CLa#&Hzx15E>jQmM@i@d zh~#H}N5qeD?m<4imKSB|%808iu<;{bYEY=uSE`I3wfeH?!=m21qfM)n`Z}q~yQkNB z>KtpElVz22@+r!bcU|7m{}9pI!L>ztXb=(hi>`{Z6IT~Ga^=(lesbrHrV86*|sl1s#VCS59;TZl%e(9*-+wYMQdde!K>gW)rtCq^SRdE1X3 zhfa|3dWdRva^W%L&w`Xh>K-H_$FqQumBvgl4?y663&5CP#@(?rS}3|YL0Fs;JCuc# z_X|D0^o8lkeB7T+Plq4n{^czvV<@na9EaqD(&i5b#ePTZplUv4^qWnO3P_7t*etIs`<%hP?TD2$b(cNCY{A!?* z&Jw`gJ6y-3%?WX)KN~F0jgW4-(C>yXOuuda7xaT}s=uV4sM>b24f-92cHWS?do0cF z4WPmlCt`XGmS?TMieSiKd+4~RL+B#2RqojP-0I8}v|8E8p&dNqBEhXwZV$sX4n?9>Tdokr~efe**WekW}1j=GD)U2Bb) zvaU|n(F>GeR97q$q%!#$sR{fu0}7OZ)%3J_UH!azG`uViv#x}c=Ch^p`!lsTx=Jm& zGq9<+F`8c_Yp9z~h^V|}?q&mvUB#mr6d28~<}SXE+|k0HO0}^Hq|Rrlejtr(u0vQF z<}1>}885{M<*vIOY^s6DjF-TTwJ4_OxFC&-kSys96T8OgAlsK6A&7$6jg!Nhxh_|J zm#IM{xy@x_ewyzH70fy{C`5~xbwz{{mTA_hp`LJbofw#e`OLaf{pL06%6L1v@xQ6X z!1F3H|IB#A>&!pz9>I8InkQO+>~vqhxk46oqbt-dmmjH39BA;(GEEU(-^s~`feeCb zPrja|F}%eS%#9YgD^FVYpEElfgZVYwjj^=1$SC1nLQj3<7TJqreaYC|N{e}-{$=LA zWQf81Wjg)h)cP%qkm^_G%66riKDquWx+t}Br87R)y9ATgOZ9$g=F`)tkBBoQW(QDo zyeHUcOlUKAp4#i$7W+7DBC4{_{lukt{bq++Xfk`g%KY6OWbvpw`M9$xvWNOA1l<^) zn7r?p*qTVQ;k(N4eb;AX{m$6-LA|kU_j^XxyGYl5qx=J`)cuGx3A^9K`!b>2p0b1WCwxNmBI)21?31H!D(FNRTT`i;z#l!d-_Wg%`rK>Cl)COq7J9AbH` zbuEN!N{4pA%@M+%_O^u**%Us4~<@=>%&hAP3$Tjk?hn^-jD zV~>1%Z4+y*e0(S$*KOj$Ej~n8pYX1iayDi1)1AlG#V1ag2T&Q(iqUdk#IAAhJ5O9; z_MpCe=C*L}wcID!Q-sp?kj!VciHdPw6FcIgr}eAsY3^$T0xnpkKFdx}AHKPm-2TH1 z@*-zm%cFj0xXm2^37;ONI#$9w#-xtdkSpS&$XLW>1p2Q z*aiqNS6?{h88_Lx@E68waHlW0jZmL430u~f)I+1VauYk26XzS^^80X2`&DU36dTar zh;_>X2gQJ;JN*8+sC$L!<^~OQsqm?TGN!R!KO$A?aq46Eu2dJ-U2{OO^oPI4>&FQe z!2+-G@+mJF^74t1^#|k1Kk}I`pa0EE&TEGMUC3(q|Jz_udB!K78sFW^WlrH%-<_d< z0i9_6O7y?jjLr;oDS<*!3YRmHZ;s|uaIza1i!6G z7fPC)00_O_{U_vo@cvu1KULqK$!3WWsStzJ6*kwgjpbEgNUJI%er2b1z3X7wgKp#1 zj2m5t!fl@5j)liux%O7(i>%kh={>V1_H&o$OP|&J^c?A5;3k=C*`SKbzxAH*8JD$z zDK6%HH=tKoBosAd-y~sOXS{SMZKgZT|1;V>7+d(U@mgE#55BzZ%&tBgGbVKk56K<| zziV_{)eWh?GaUVWmEgnLW>dYwXBQo_Rjsk{h@EVedgSIHfAk)g=?zG%4v^&vPxPKt z;T8!kCYe&39u^brn`W(BWHL5AZK3qVezw5os_xCF-r5OcM-yRNAmzAe-i4jP(}KS- z3AUT`7DKH`^j*dz?vL`jE{j)3FNi9^i0ki~W0_1xsVc$JMRbdDB&JR_N1BmN)U?S0cTG%|u1iAClT<87cAzOrDa9d! zA5AB=d@1}e3May7;ntFxn5>l7Y!R!KPR?u8J|o=}_AC4Qn&6RWBv2uP?MUE5YR1N9DfuaUjPBUjI*8Ci1pzC_(aXMe;ar~^m&>>YgdDO6DULu2gzS6dgRzA8hJ z(pUNyroK{byejvjdDq&}>oOO**Bz<<6dm>|J#8Z5Ro_DQt3BrKl)ZyQahxe{`Z#6^F_FJfJmW-R+h zUP+lH#Z|YcYhzQ4$WA#Da*8lk64uFHq}5s^@^4^(RspHpn{m|-m-t{MxkEu(0AVG> zZK}I$viL0RFFO(5%5e`lYvC{0VzwP)(s~g`<#VnB(xM1k~@6?i4km6-4*- zaq(@0vHb-xh|^IYlSG0n-qeslWRg%*L}AtUUTvnBms zC5dblSzxUCcgi(h6%87Qx*Nl1zWVytB;?*Rlh6%i+3!TXl0r7xitRr2`|LTXo~0Hv znb=-5&paJ|zt@zxj0#z4lv`fP*l?vae)#NHHz;UR_TM~94%I!z5xWJgDePH*;0r)N zw&tt9PmQJHnZH=-3db_TTY5u(VjjUKSem;+M)#Mb{tFb+z`vIqW`)`t|Fz1KY+0@r z3_;Ih)Qgpx*UE6FLFrypMAu_bNT(bR!bm45Ha;U`YY5!JIl1WHxn>xLn5E%nWH(QorcxGDwpVE?loTqe{$xT&u`;iM`!? zo;-z{*UePiOwDtr`Say){U|9Xd315ZMVfV>=VjP z=VDUkYc(`^Kj*YdvucTGi#ja>Aej8I>Q2lUBn1p;3|W$+Q+I^w;)xf zdpmTY;8pQukWvNtSJa$I@lmJAyG{QpSLgWPPIdn;R*0(fZDP@zpDNwkFqKYL$PuWJ zLuvf+y1;%lR(fdRypz=AZCzu_{hDkN{srmu=}5f~b}IU4Z0is6!^b#e%mHI*DUd4< z%;`Gt;AhnIF5zr(x`;v;m!3q*3?jlVG8|CalN|Q=TnjM1JZPIvBRORLE5mk)vpKenXByc52+D+Wa zsy|!XR*6rSvz{k7Sl0bl9I9MUyIobUqFiVpeafG<+ex7j{OGUaXI7mLwqr)VkCkV} z-Jy?yOu7l1Er>Cz)<^pmq>{G^Z!gItPIIpsAABR!i{!&y4T6j423udaViUsKJmGea zQmwU18Sb+`G}BlmCsU7ZK;ZJ;K6)9KcRMxQ^{-#3I+V;8?{Xob#yh`=vcA< zib8AU*TG1kav^c}SWp&mI7lWL%369r#@4E7iVerWQ5+h!**QncgPVo7DsD{f+WCNz z1zxorh;$(b4a{gHv+=&f{e*+~SE|yWFchSXm9xP|>O|T2jHPuc-64f~VmfQ)z8dCk za+tdl*4_aSPxngh$Q<+%gtDj%X|EfmD}Q0UQZC`P z`bwcXs@dd4fqIZ3&5V5P&c7fO4XEAecL{yVT?VX+vCf+$u#?*Zyd!ln@fV@ zDrXle$7l#s6I6#*H%d_qP&OGuD4WZi3J+2`cDv}A5v_F8CR3$xD%lI)UcBm@NKo*N z3d2ISRm75`h&Zx@9K(P{ZCzq6;XQCmNUNZjcQW~Wrr6Tb3bhB#!$`L1+(cu5q;-qy z)0#d>rqpl~L4nXBoy3FLoBnN38Fm#By(yFN>P&Dwr`#S zFl&xY%4%jVPEVs~wBo;F`XJQ%$QEsSQ*2vjZ|GgjyxB7@PhX2@HK`HkqleVEO%KeX z?vv)usP|;F;Z3oTqvbU+g<2Z**YF5%7D_;`0kl>BD<-C}3g}iCM?Jbt3Zfaxn5mJu z6FMYs8b9S}^h%GjJS2-f%1Gk9o2xmOW~328?=+Vs+r<7SB1+SIWGqd~B%akCwQ-6x zhk5U2GGl3ZTBeH6y+IyG;E~kc?xTAbBU~IUO_wWv|`=?-t@hDGFGvri6H5A?{2kPg#}!5W;PR zu)M2q*7(lfYzBy8MdqZOb7|0nKsn5_8{>&Waz7V_kow{<%03r{ko)2=7JLqjh(q!V zg0XGyI9oxT#C|+kVT4TohrM@?i>m7W_|E_;B08gzS(;9ThKh!1<^`Am2E2qyYNll+ z3J8S^!Qd@Z3^WlbD(lIzvL~M&E1%M`(n2muUdjr~($doI7*s;_)jP-oK z-`_vK*YD`!oV`DLt-bc%YhTYkd(=0K@3Vyf=XPuSzO6Ea?zhq?s)6vJE48M6mAc+n9DG0PBnuf|C6%lUu9s>RB0GELQI(`*OI-d^tJGRJ zjTJ{(@XIasasdG}vDi{HK8R6u^E>}?v^7wK;G=lbn-_I?os$%O{ z)xJ~4Wa<4y>GJs$6Kg&_~>E-IxwFHC_PQ#mYn!B=56X0+P)tyS3k2(LVi9e@aAultmQ%gOJd*JQwG$ z(QH8dxgFBOK7gz%bdRUY*YP2Mf{w7k9V54M}h62h9$eAuk_ z%J7Jx3pTEbvnKL=i$xs(@+%nhf0b(grb9wLkfr}2=)11X!%O*J2$Q#7x1Zql$E<3}_lFZ8jLR%gr9RNpYU z_O}G1vbH%lZLIL=l~tgYs>MiKOVxtPI@0coBf=Ml(-%jQFOKQHII>&f_#ai)d&D-h zYI%>$we-iP%Bt4O$t_jLceO@PDr7xxU#XC1m^>AC@xNOtBz=T@^BPjLqNz4&c32W; z5xeG~i;_66J~g+Fds}bb@mPx%)^WTfDhX~gY?p57TCMCRpLFYsW_zs5>qOtTt%Z5* zwJN!z9R_~NWZ+f$azk_bZnDkhE%*PGt^Q>(H0}LS+f3OI|JM2KyQu!y1-xzg&|gp9@&HGg47>mjG2E4*l$*~2>ewOmqij^9V~`;hSt?6afGlOJ zwY+gB@~8E*;l*An`PASLTd(93gF4*uSwY%f{65D|J~7~VF)0C&7>un}#G-DsB4z|@ z&4(&@QcpWxU+9AO>wVBjtvFd$oNk#waa@cJ7{yZJ^!Ra~=K zT|T*!_8s!yL@DldwW@rrp>wlj+Q{tOJ*lS?@1F@;Pf)g!AK_kyTP+RThj>0B>hZi- zd*J{`Nu==ssj9ntNUG_swVhJ9WT8wLGJ7Tw_*Y%}54v>R>Q||_5Al4Y4goy78wkgS zH8%<$;?Tz@oGt7$tXUCJ@gB#lyDu-Zl2SA=T7+@;_cKCp6f^; zW~H_2jhddWp4oU3SK28(ZtiN_lxW%k{LtkH&viVzc}{EOPVaJvFK3VNTt|2}EB@qa zVW{*IBz|Sje9d%!B0P~EBG1*_#qGw-(r_Q*`3TQ-Ji8^FC`X9rq?2OL&E}r!Z0ILz;=9%`Dx>UL$Op29XKJ+PTUd!U-~pf!2rGDP4bFZIJzT2m#E z7GtH_RjL}PlQGe#<=_Eo@SZY?_b&{Uo|SL6606j)Ge<$FpOY39h6YM7y4(r8I%8K$ z=sW@*n@jg=?t59x$VX06?VS#_>tztP7fJ4ZdB`Nj`bR!dvFa_Q6va zE$M8D4HNl$UqxZfO#|n`Xw_`waI50NXtlufXURIPXD08pp)%_tG_*<0d*)-Y_|Z>z z=zgBThNWp;IoO&9yQE|$Bm zu1IuWyi%>AEu?gn(OcArSo?pitya@p(AK6Vqfym1;=k5*qm~KMJetd8Rj6GPt7_}~ zueGi8mA4TlZIk|MZEJjK>ojRQ{lC`sXp7pO?H$HRRVI7V4w6k+qipw% z`v}i6z>%hffla+8lJ@9qyF~T=oBO-f>aC9PSnQmRD9iTZC#2SKEKTAEyhfw#R99WB zV-KiH5mZjK>0YHZ-Go+$}$Mp&(xlYZkl3GI;Yhr z8712y)`|w(tt;2bsSrm=*g5l4iBq=JXw6QP3}US=*+LyI+auD1YZzZZw9u7Iu8kP> z|92&S@qz7s*_F_HOVduFB&wES>PoZ~m+vE+%t1a|W`fs^wU6S~6j=A7zdFNoM z$#_>@LX;F*%$qk9jdHTyFDC_AS6&OIZvEiB@UXWQ&q8D^0gB~}MA^*D zIX*SU#%Ok`loU9odA&)pI(5eo$*X|dytQ*tnLWJJ3N}{W6D+}sCD?V|h`NI&rnzV8 z_7we5+ZD!=dyd`29+f{hu$O%=buX2g&T~HJeD3}4Q)gbyFh5YO_wJdmfVraWfmOQ=zV5dj?E(U70qEmdA7u@)+b?FPd_~cMT z4nhv#^qqD?Yv%ebmqA(xha0cd%r($3*4j;jnxAi6PtwJ-h{nIk!X~+_1>&3LgCVE+lmrQ=j^kvuE@NJr;JSC! zy;1=M+s{~+-o{!jiTFUKk}V8rv-dNNTyzv6M6ief>7w`5sbmd2=U;SXn4*4j#?Xat z&Sd&|@-N3ENLAPB_h}2YRdQ4b7By^eXwfeow;VMP@Q9ktD=(6KE*>1(=d)%#I2AXb z_~wv)UDdG*t9!vkjn-F(m4rBc|DSWZ?+)40P>-wP}p&@G2`+!)9u*g7zpb)82}6}m~Z#9#>+Hwd`%x#;MFgy0#$n`YV@>yU8*-HLbNWr z|10TtFgO`Z4BN@s`bC@6cS%1l{cWCAUD(zJRd)r{1+wLFi3(Cq`Zifw2FxUga+T2? zXGP)~Ble;>lf;Q>=+5cljA(LZi_@t)wU-9slhou>ikjjxy~$^-?vvf*vr+R|kE)3&bJ(hb*lH=ux7%rl!1r(O(VPvRrxw`{2zobICVu%Z9i1$ z7ZS?gbZkx0$*Pn7OSNAKVOdsA=PB6Urs}l6I&_t#1?+`s>w~*V5IdR178k1}_(4g? zo2s7g^*JCPi%oj8s{|f)dQqo7`>Ia)V-mKamFj`9MRIJVNLk34eX5+MJiydAE|8Z$ z7=CbU!D)X^BBU8DRznpR>?O{U!5^yeAg?4+jk36)27k%VlJ2U9zI~?D;wj{4`9hav zTH&aIO8dROA% z_^0b_{BB7k>)Hj?Hbl}KGX#<5*mMN(r~Mf^XrE`D{e4`$|8`Pg)b^eJdo3q1u!*Di z4Qbnpt*i~nh^IIyxOkMU*eR`dB&DBSupr5=J3YjQt{F#e5U6dxC(6-z-LMBN_?smEJ-3U8b)Fm+e?;6I*NLufv#@Q|Xm442bx^Rj|!O84NV3rV9Z zasNnna-0@lp6MOx=rXdxkivrabe4aUAvXx2!o~7TtIhquzZcNrfIJO&0d} zJ+>qL=-|?lfQNXNw_t%KD?5rYQd#7ejck47dlXrp3oZ%n$Rl6Bh9D!*|8CV-x0`xg z>RAALC_JGH`?cm2*2I%V+DlECyINnpsAO=rqN+YWRekAKw6o7=m^hz&_9XM>`CnWT z*{x`MpVL5n4$@4D{U;53&zg8jUI?=ko3H6+=e(Q5cTvJltyVj1L_4*010K|aLl^R^ z2wuK2ghbDI94_G{0oJ9rNZryzX(tBtk%NpP)s9EUo1hsoRJR)N3QUpRMku z#PV45fqKGkziCU(ND_+^mz=Te8TNM3DYe2|$GvAA_xqx@tUB0AXm|JV3ov=v@(mvL z(x-;;KqN1~5_jrxw;^81UUld&(5uGTJi5}NDo$$em-yfrvWVW~!87C+pTVk;P@*Lh zEDH~#NJw4KS&bz!JxA>%m*eWJu7mtahwA_#v$bK&2aLvs9V|l9?qQPScI)`}IEn{O z>$rV-?(<#$_|xP%XFM%LaTy=+gI{tE2aPI`WJ>Q=H&M;KVISmmz)KF3QTIyJMGmaQ ze(PEMQTswV;sd=DY44P$409~1!whit?on3(tS4SJ`qhm zmAVi0T@NE8pXOt#qq@)ZrZDxoPj-`!s0&x~F_lfyaCS^(SDj5`s!-M0G^Pr}DYJ8J zBNP2EFE~PyYPYu1y5KhQ3jhQ$b-%atru*I88(kFB@5}1vMLUho_wpSmaYrDQ7+QRt ze8};-jMO+>w6esd_|auXl&HU`qx}jKZaZbzU4%+6TU;QYAL1L%+>p=dnj0{t)wQ^6 zg?v|A@VXSGw!6~P9>Zk9rk%9E+`?8Uq9LIAC8o4ED_5+Og}s$4WOP#Xx&QAU_o>oO z8D~n3jf69w4Oqg1y&onNL(7ry9;2$G{?f(s_2w}@nFN0;o1&q$319WE>S-cVUw@>=zS2Q_@EBF_dpayDvTD85-&z>F zHW}B{8Xw|FD_a$(ge(zlQ6VJKKkpJeWlwkT5_u>ZiJfu$^f=}hMMC}v9+ms1t5#gN^T>Dy>wval`R;2#?hp|M^{P!lO7acGxIJr`m zoH!TZ!LP7I^e?=-M(WOk`j@dGcQYQB(mTX&y$&`WBxchJQxR41SV_Pk9KJha)^h$^)Borv&Rhw#Y}dz_!8i0Avf52e@qE zJlLip+1Ak-@_{wvcX9GFOS|RmZG?4FjWui`jrY{wtOyiMdnRh+WHFe<^iRQ){>=|-jV4_MBP-(?H@ZM%P7 z=VJ~sOwAXZTK1`*E&GdodZPGhK)zm%E>1>3`!65k_zrVJsdR&pp`*OF1~qz^7)TLp6-e1eNhMO4A|NQr1( zB>ua9E&4?oC3?gO_58UQzb}}ioM7yq{XSEM6AY)bzv5vA3tHJ<3dHC+`%p9JFr2f5 zo!LqwGlj-FcC3rX;wuZ}ygl`k;x)rO3?4-{62iHaa$YnacbA~Gs+_;797Y`2=RMIc zczIK6N&D-^CS8k#5hWknjL%~+l~Zo5_x=j+z{(Z$Jj-`)WrnBli!d}Gqa-uc&oYCx zz72PG$(AOG#c#+`f${4xYt+R6WQHl_qK-#e%I?L3OC`4hN|#p7>nVz}L?9igT<9KH zcUzOV(yA~0`y7!YRcw9aqxH~!kq>k0+Gpnnjlx;9S>?7;aky3b#y%z=4_2$E(!k0yvtyiE8BYWeQ32f@u z9XIz-TW-V5)$@foU&pZNt*n-n={@8IOEyk{xJ*SvFyBnSpDLIX|c&y#ZPL9d5P4<@7lA3~QS*GvWlVt%fRE$KoZ0zJ~I<$QYCezQL<$e9z@-twCc#H)(uUkEVAd+Id|CU)A&N zosrwA61!#wlu=};*+xoI&)jq~qkGfkB#XGH(O$V*6o0=~0c~2h4QvCTWBMt;8FghRUrI3Hat*RvJJ zuiMgNXlguiPb*&7=ebvitSyHR4`5*~{yd^tm>i z_1EL~N*wuTy_L;83mIwRG2cv=Y^>UL&)ZjQyX2|#vV=Qx-YD@dcBGzK>}c4%*b(!| zB9-J>`~;IQ5?1AbxA7JKicgmPRPL9%w%jvvc=?jo?{s{6ajxUw)?~-}!kbi*XYmtE z!bn)*5#E7^_B(|59Y~eXP0FH)j?eqgbTgqon3?P`igK1Dzs(f*bz~1S$w|*INzR&;YER9{ap&06GV^lNGqPscXXK@&rRLZN3>aV!QbuQaQggDB zGY#L2teNht+>BgLYSzs812m=?8J=8wWVC%kYVMqg84FSsJnT8Cxv4pG+!;BV_~G`T z%t5#2W~8L{kDi^Jk#%cIvM2f08L6`}vWDAxW!Qs+SwiO`V7T3U35v8i_LLkL?P1yO zTu+~-0DnSrQqO{_UImN$6t_l5p9nIcYh`vs*}mGATVH*UtZBdm52uY8f-YZXfNjrzhvyb5rM}=HN~G zax-RRrrKvF=jEp64p)Xn^y+1|C&rA8x6gFX&d$h8O|j3-@T5~Fvu4e=!(kn%Y&CE;9 zRpK&}$%C2p2`Ht+x%09-#Osm-DXxs%nQkQ^FY9(?WKJIDtBlIX?mx<%t&B-tus|7` zO3o_dQs>%ZfW~L0WFT(5Cp|SsNg~XI-m%JrWbUc6W+kU8s{Bc*Gt;x&Sb9nxN@u_x zlc^fLCu2^kGV%6g#g&>&Zfl~Gs57_cDicvEh5Cbj@p(D!{<@Hu*)uXyvpmYA99^l& z?wJS_)%vMACr~`@EO0e3dO8U)I*YjTX2UD-&&)_sM!6|{WhADgMP`r7%*a+oy0I`4 z=*|E%>8WK^EZHWZGnFLCpo!VZOgOzbTXAGgD`Ja@-OaN&OStnOat)XvHL@FRDn^XBh=KJ2hp#5|@|hAzfLs zay`k)BzLxbaD)<m{s|dUA~W=?wX2yUnQT{WCJEJ(F$q$m zjHP^}#3V25z0o@}QyG<>h9G9BuL07T!SvgW%F;rB~ETW*W)lAo-O3HE1qSec#*mRGxDb+kC&Yzu~ zF8QxJGu?Bwr`U{H_E?%ba@C!am#f4l=gzk$s%^Gt7&8;g5*Zr-1WwM% z#Wcs$f+dS<_6%B0H9siFELto@k8!>d>vntQ69?)iIaKXfdRENzu*} zO(vgBZenQ+O!jIR@~G70IrH^4A~utDL4S_R zp*fcpmUfK3bau8|8c}HZ?XiCpBwUp5$U?F7+cFBQe^Zn5+z1gE6Ao#Q9mC zba_zQ=w7)^y#SA4y>k0#{zlhec=pQ7Q$~-Q6hC2HOrkx0!i4b??4!roC&x~(kBh&- z9yi_C6ykTPM-lnR+d`^4_PS; z7t*LI_B40S>}1c`4w$U{pD^c8wz>A`L03iCZ=aEkN#!Ct#XVE&p(J1W1SvtY>5GR4 z@spXkG?}V?y=LK>nI2&e%S=sUly)vKkU)$PiU;F52ei%~0L;S;^`QLdrQgym{ z<7a8;9eHH1K0sE-*W@exAOS?C{T7p-#(Gu}36LctF@WT3El!KWQxtnNwwAPwZ43BQa01WUk$aLN7BK+uYnJRfBN)7?0a{W-@`P8?M~68CMO| z96`!_hI-UR-R|@rHnS-+Q<==plw^rzQ>mHiXjQl=1QjcT8KE>?XL~uu&?$DQ-+9^0 z5L30OkSBQ-Er~w=!Dw3!5-z<6wL)ziQg4?!`rmOebWYK^n%eGjdZ?zpf$8H}C@1xf zJeilDos6B;wt2VB1YDoyYd5;>^9~E_VFL#Z9Ms3>=wNp8Jel*+-ZKA8P0^qKTI#T& zLwpNW1`QY(5upwy)F-<#a6p8T?(t*~zw*jV1|0)((*|TQDjal`M5r%o9CdW<@0#?- zr58Chk0i(E3uK|~6Wza$Q(JG_EbB5{#(G({%rd*wPV^49*ob7S-!Q9%cu&Nk%t zc53T@oAmg)ICuOSHtoLc-#gOO>o-S(>wx1xQTE|Lcd#C1ZSE=2< z)a7)m)bzMiPj6Q}U)MSGaE>$2{`CIX8A*j-`2cDQ3 z>&Up|`mwgW@s0_y+<9HCmQH)3Q_H{nXssOEIv@I|cWt`?9iuh>qZQiSSZAE7g+J<6 z@0H#onp>G3qn7h&hpv}P*Xw0Hf4+CD)z(`blIu}HKWg!N_iOy^KG5Zy)brn=yK5^F zAFfC_b?w8tf30p;r*wB{rNZTGebA}ozaC~8xLWrgtn)`WJAT)H$?AXH5jB3zrp$TU zUyaKCI(GZuQ=6lnPn=S_;MF=uuI|?Dv0~q4E8=IBJsqW&i?07M$F%4E+4qUo*N9vU z^v99hx#}yld$d!#+bgy5w`lHsd!^>zUAMnLr&f-BdOj8E`ldU(T>r`&n{M|b{B(F_ zol>s5b$j@wLbJyYb^j}!Dy*E)-2s*40)CacTfr@t-C5>&uxr5N&vgGD&I_Jzot*Wg z&YwT9^77@&Z|y$+9mkBEsUw`dzt+R;uF&{vH22Y^PR%~m_@{p{rA!aEF;dsnk(+-1 z_Y1w3JJEysdn9J{rs20KCu~P-wzJcXUKwi(^zpjDu%~a#iI{*3Y*eczQ{!qMSr_{&pyupN~)Aehs+X ziDP%{ftPP~OzXbT@kU9g!*$7v(fex#M&H%V<#_47Y{z%+wT^zL^Zw{!x63i)gI);( zJC90mZTeUIzX$%}dhw2Q*W_2%#KjL9;(9LQnV9_G(zriTPE~LIa7k>ozpcto`6;I3 z6USmMa}+qsL;i4lGVET*1wY0)w!gV6TGp}qJ@Vw!-If)Xt^aA>(`};rMP283Y~2&{ zUfxzbsKdJ2ebLbypKV=x|FBpXk{PTyuvv(zBu$%lp4rb>$n>;FY z@p@u0WkDOAUryPSDLCHQo4BpVGuvW2J+Ybm%XXiaWm8u`y^*WOd_W$8zhQ5qFZH%b+n3nWM~vLZC3{V(5P8M#uy4g`RQ` zbUid3S^-Ukg=eLMbtW^RH3knf@mpJL9Bt%T&e;8=VtIU!wA4|B1)e0*^FRrA~Jzf0ZZy z9G*v4pK{Ru5hmDVJ5JpBPV!)wh45=3Bj3cmrH72EDxI{b22UlSa8HM{exQ=OnPmauI~C=0tc-V%PmrUyosf1NXZ1b zb;=lwXq$8u=&X#@GR9{7v4Qe?neZ}Z(_~2d`_kk0=`yNgMQ%%aq^0$)6nbZGrjsC$ zvy!{2hx9jBe!5PVu{~D$VMB)KWaxn%R0!ea)M#xbcU6Y;6Gz5x(`8h~2H~0hDevh{>SL1(Y5T-xMMhd$S#0ZbWQeUx zUca+9n7r)FvlHG*?$euOi0-?twF<@@=8f1kxXpS{7GR^|-q{-t9?o+qykd9Dn`FSE ze7+zQEFZgmBi7s|TfiP&{VdqS)Q>^vF^K2&@QNL7sgim{5cRt9(@3X0Ji7YzSVIT7 ziwv#)n`LZ4hKzT2S4kTnd~!AJpW>9e$dK`fAxC70jW*Xq+IX?;gH=HXE+3%=QU6Fj zYck|+$dG5FZeS;skFMSWN&Ymqbs2+b^?EJXpKV>skJGW#wMuNfQY)uQ%2B)gxQPtv zfNmeV|77b%`$5@OQl7|>d{u$jZx>$we?3=Z*^jgacODaRKPEF2DcN+uT;21 zhK!S!*6nMOajvbOZTkjMUsehccDfTb@>Y`}cdeaV>y-RB*Vc_TmtfNVGCZuWLmuV^TQ~ZLo=f{tUwUJQw-bL2G9E$3z9t*f>Vc-mxwdY|VD3X2oU9EzE@{9% zHa4>{tsZDH&b4(z26llC4dpkL}w_K8c=IRb$b! z6>+ywU4cjq#BEj6BI&gdOB=#ViY#!6o|5lsevz60$*v&zBdL=#lGnrr5u28W7cz(J zLE1W!3V-AWlhOG$xOZn8cM!* zM|Znkl7VR7fm~>dgbw_b{1w}3t^U)kT~%DoWeT%xkebb;gFJ2*gw|T=>gf>uwSv~m zJ2+U%&4vzrm~HnaZqY%k^g?_uCbo|Fv?KNl&@hPSj{LQ%<9}>!A7W0`hGPGlzX+zV+vSwrc76dUvVVXWO;%lg4htgnn_ z{iP3UEmtGAD<#{FwVCN~C9ozji8zKM=@QnE1`?_xmfN58hcT?d+``(?c-9^!l8UR) zr#D(zSuePZ_-RnI|c`ud_z2>ON-=QzUNz~3nHVF()b0I{LPMa0vK z5F_xtPKia6VJhB<5^sn8Vt>O(>je0d&}TTZE+E|(qd^yy|3aP;NaY|jx(5HtNLe@1 z-WGefjNI&wq=BTr2l*aB-VMg56KNBB=&zQIlQdjKnEu4onex!=L2MubSt0O;qRG{S zwc(Z;D{Zvc51&LMsT-*XA=ktngYlELU95+{t;Al$GNd|o=%AUCY8t^fJE-*;OoOdf z0%J8?)ZO+Stk$+|#VIwL&{lptQ?2hR*dC`%ujYaZY$LQVsxH3G?4*V_JZv31YSP+U z)xfq+9kqBn;I{FlT&K4K08I+1>@LZ~U~ptoac65DrZ-=Uq6en}t^tMy*euc~adN;{^isHM-U_5cFn z7CqWa9aD2dRYcrcM1op7c5H8UqF8%fw4fx|+98;T)%1$i9c>~?MC0PJ+9Vz|CVp9) zs}mWemd4QNfE{l9MvLy#nsqtBI}x&tg+t7-?^-@UdQ^U z16yi^y>z2agi)+l{uS6r9j7VC9lspD8%Ou}X_#pb$Wd;PFb z2eyARv5esFC~DBPgu4V;U62_@dozq$Iv!*gI>ck^vBcSpy4nlNj-^%&rv8pWZUmtm z)Z}Qmdb4(Gr)Ej*m`1EI#Bl@le-O2N5SsR2eN#5X+`>BXwMbcjjM0Sdi%e~+PqE}h9I;$Y>Ozop8Lmj;ABc=Zo^Qi%2r*wlO|z=<2f=Y8^`BkM@JR~# zs5LyA8a!D|T`zQTl7fERufgXcQr?N$*p4++7h3XKgw&2f|AENuN{)9S=VerK6M9O| zavAy!R_njC4xPaQk?v1viEdJU{m6+f+ClwPf`AhSy9hY_9^d@*V2Apfjv9v-DYB&Pw)ofjIv+Zr4(3ZTP{XgDDqSIWoA5=)llZNDJiT|{6*QKP)8{k7c1{zQ4ym zkX~^THT_9t4J-HomQ%{}misNsEsHG&{Py@&`?XOX#pXxzHl={h;#cK4%fprxmVC<* zzgd=@e$y@Oc#pD#wBM!tt{hXoRt_memT&z&_p9;C^Uv{r%@Uye!W)!1r0z@Qh_cf1 zo!>WpNB#Es?e^R5cSPB2X|24a992G3K2Z)TOD%U>?y_WB=J~&2+2Oav@`|OhbpXGt z_JQ)gQlsQp?zDX7_krJAe!E)d`p@>y^e!-XYEhis_lv~O8c+%t6E@b)HUnXP-*{(wpshH%W7)> z4Z}v3+WymV3bS+tYWq)>Y1aPJUm5zVH6cjscK~hm14?Ub<0Z>;mdE`{{EGZ$`?c~5 z446VY6O0A-rX9JP*7G1%y;B)!nQC!Z`dBWs^rhXA`N9}%IG>XKlsd6pc~zNY8DY7? za*1CjZ0ibaJc0L4cky2Du(FpAV_#C@E!S9jS*+OagVdLJ-t;ZTO0p^G-Ab7<-4bWH z%5sUNyB{r}B^C=?M2*W)KEhfm`C96FOO&O*1*j`>FjqG_4|3teyr;q>T{Lyy0S@m zR&iRcwDhn9Tm1ayqu+STF6B+7LfNLgqP(DtwZvEkS}wJ8wzT!T(~^t*ukqWWyhhD^ zQJG@7)-v1@VY$q5fu)n*VoM%1Fi2VHccbNbWj!@J+H$p}pQWcI#L~uM@tbSOrhd0p zmixt8A}vELgDe9qp_cBJ_Lf#m>E>B-s0p*EKbd~vmM}|ii`{aurK2Ut;_tW6G6$QV zZOO2tTKtr@0bMO!ES)UvEP)n(+KdI%ZMWriOS&b^l7juq_|}-$iv7zRTARsh_Rlha zI{s4|)!_E}JX5a$OxyJ4UvGBXw>9PydNWLOFAcmAp6Q+8)C8(7L3Q~|s?@-`v%Lxl zta>mlRG*E|xTOMVfmPEFqP;)IEmcM?&7QSq-37l4sJK*+KS83feu>_#Ewl`Qs1+niryNW2Eg4Ax3oWp2$DM3v6QE4)E!yu#NqZ+n$rcr<=ZXHD<3ydBQr z*W#79CI2PZC@f$W_)>|uQ zEk5Bh$k5x+L5tt8Ny9dbIL+yn{4(Mp`#Eg(-WTM|Eu^V9$(jGY+9*gLrFew6eNsm1J7>|2ODq1-I0wZM+XpJ z&$IE#`e!@H2FW{^f8W*MeGB>?vMp-x4uWPuf2G&C`LY&SmC#YhNMrW;2JdrFCG;UA zP*o-SbgHyGu5xxiVs_&`h?|1WXOmIP$As@j_(O#Mgzy*R z?t%L=+(&SeXO>S1e+l8)6cck8oR>va`@ug1C-W=^z1;U0qfH{8GDzJ~C>68>t!4<`Hxa5n5z zodItEj{+x0D;?mJe@r9p)3|x_kv{_WAB5+vP}M2IpCr5(bQtbh+{bYDA$%R-`w_k` z;lIQE18(dk|4Q6H623p-zbE{0!iR%@1s)3C3;b*FE5N@6{|3A_?#pn0f%{9`mlOVT z!e2^wJK>MwUWk=F&%?b1_g38V3I7J+?s@MXB~#vO}04tD|JV+g;5@cD#yg17Sb3t)cu z>&p$^Nv}3|S3<_K;eG}`dF~$^H6kzK%+L$pA2nj~w(TQ6|MuCkC7m`!PF#IY*>#7v zZ&_XT)azHC-dOgjrAO2=%R5A0@WL$>lM*AGeUHCUdCBV+##kP8Re3&7ig{x0)m2Y~ zoOb43Ij0hhnyyaWetZ4p4xf(Ld-#$!zU;O%vhSw-WkY^^EzM&WV%yRPIe0;+zuGwVC{V8-6PL`dI4` z9exOU?c?S7QLh(Nyz$THtIBR})1|D{yw*|UKYMZ8HTTad-_hf-=);2(M(nt5UF6J3 zL!;i^G^6~s#NE;P@6Rf~V?*!q@M#6*9fz!NG|qlkEWYVlHL$eIeR64;XF_1)7jtfl z`m}G=8;>cEzA+|u?Y1j=orv1$_<39K4|kWZb8Lt%{py##3-tkKgKeYhOh(`GpT`8nNshziszze59;s^+!=%KDr|6g6|r( zz1Z%GsP+ZvWyi;7l*j+pseIz^Uq`pG1VlysoEi0d#EPhD%bpSKC(ewXIPgGuV%Oji z8!F4oul?*F(LLX{H#E3UH!O=R{w;3X%dJ*Kjj%sk9{R#J(Icm}j_l(oD&H~kq3Bbg z%bLl5=%2s7@x8n2wkzK#iMoE)(#YdGmXxo!u4lCUo$ZkeG6qF|GO<(nEB3&O^0E*| zYwxPapF8i4+&}uAvc*RyZ=3RZR=Fj6SM;fxF43nl$CnQYeY(8h8NX)o@80xE+1^lB zRB>YOZK;`GZ|hdDr|hHj3!=vl+PCe2_Xb2=|MB2AemruZJpP8Zj-*Y_DBCU5qf#oI z<=5^SRNi;{#nE40eNXg+)avV2Zda7c3+fxya{cFVytA4Ezw;6vcCC|}w`0b9jQhu#i8vbjAxXt*AemRbXT~Zw@ z`u$w-(c3>&h}(>R|6YUl5$G3aNR9Sfc%;Ew1D%4p9c}QAhmL=y(R`kBpsM2y-fQa{ zyf;D_(2>AK?{#e(y{|zR1~q!KAa#tUMpon0;;eD5qFtBqo8dO@A@l*#4{3Wnlo)M) zPK|R*6m2d202i%npzdGk95aA!m_9`OehafTgOok0lbmcTdynZShSHC$ zr;kaZPnbr3A#v76vd??CqU?`g+<66inF%YpOL&(lY&w01hgc;1^bzc%?yiM3ir z$A2Md4C6kfn>H6nyhNK1i0)4OPm-5(rwlGCDl^^$Wv2|9P+9(kE~4_uAA4B+LfFY#_`A!fYVS z2EuG0%=3hKo-ofL>p5gTkL>4(>v`f*@8TAJ!T+!H>2*crhC#jlv*Ejak8JpIQo)8( zFHYUiu0y{KX_uXNe$T+7=f~Xn_;Zr{mab8y`Om#D{>$fDy>Q2K=I>>^FBUs4ta-+f zSGU_y{>8731$STU%=lxBbL$PI&f9IjIFAi~Eyn!ajeKvzw>RZ{ds89bupjxwJcC1+8Y&!K8bU-3idzUbT+o%@pZaMB)5+QUhEIB5?j?ct=oA8GGL+W*hW zYyNu|maiCLiCs5nRor8{r@7wxcmISJ!wOxMpFI+{#huQuF`mnz!!XaaG^`5%bXZH#qlw9~nE~%FA6zGuOty zRD0mf`o#;XQ=;G7KL4g2mG2#natvG>;)uGbZ}}$6g|W9S`A6K0#_p~T-C`2HUcS-w z+pYhJyLQi+n872)IRBG$S?o(e7rUNYv?hLHeeIj`Pc5%*Sa^K zc4hgsbGpZF>i1CGbvyouo7N*C;i(6K@3l@0 z*;;;c|IpYU-dquP=hJaczE!B*PP9-#npID#60VNne#vQt&MS2*2nF*r#ODW zzuNEYzWMp;yZiRuv3%l1RoP)bN3WjsPscT5ww3?;fnKqz{&jcUtG|znxo3J(!pPE3 zUB7?6CGJ(fA7WNlT;#mt=%ko0MjnXsq!-4&{@MjQ?XSLCz1n`wj*|=fRmnGKzXZJE zc%!zm{H6uHW4~;FN8FU3N9>3Rn~?B*;n%JY%eTbs@vn`sJs9B3`1znS>&vpZE7Ru3 zf3)n9o!3QIRbM}S)Q-CSQB_G-y%z2N)tioyw(9cHkA=o|S}-N>b}sDwcC~Ho)Ez?{Nma2)k44LQYy+$p zRQ#NIY3z(ak#Q3{+N%#oPE1JnrQY>J`YUn0D-XnE7aeg-3Eo`!_%qAmuKehR_=oJ_ zJ6m7BzuH!P+m5QoXH@NXdT%Er0&K;KD=2pG<;G}K zrXuvg3t}%%`!Uw`<$cwAI$oFXOyX~@yZv5>>+;E)G2KUPas=O6P<1r;(zxrs9u)uk zA47Mp^nO`g9J*}BmZD`B zj~kTqdd!_J{Yo3nFPTLgoN9JnBbtm7d`u6g)*v+l2@h?9Y zxATh|f2{t;QxENkZT(nPL==>{AfQ7qFa_OS|x7kC2MI#Pkib4dg5`%zi;`~@mRm*^(( z$rw(?S)oukGz6m1n%0y(Jgh1T} z>LLqY+B=4p}9%v=B9@-6wZT&ax*#F!0<^M}* zkus6GE@cq`nd?O+?m}oSR0-8WU9ltSPfDS~&=72DC^Q_3grXs%?gtXyCOnYHm-;>m znhq_5)wdcd=jbJNGVQD)BSl&(%T7)QDg1M*hfMFoUGr zg^YYL@N?aU3`4FF&bT8&9s7iGm+_8}@jOa*%U${;<1Th9ByFKwogjl}5YLxGS3@Hq zvB?Bz3KS3Vs!TlxA)WgINUk6#1d=xEQb^X#WUZ?YWQU~96gez!s&Zvv#tDsqWb7zp zj91NWyqm_z@+_C&B3nom*lftmIV_O%fdiQx8Q()xcK8@ya-?C43Zk_*-YZzet5{fj=EQc;6ZC*FN}{i+u1y zx0v`7&+4}xd`$#DgyDmKx5yvZ;GJQ{$)5r}e`>*}fnVe+{rFGghpF!+Tub_gf$tsM z;QhjkoAet6zGg^+_XR05BmE{k9Xy<$V;9?K!cF&HOwI zRt;v0Y8g8U7U}~#12)tL)|Grq1iPk%_y&VzgBkX%+9Kh^j*`Guffbt5VM=E~|l$Dd45owal9jRt*;DBfr*yZ=T>AuLNH=(Kmh+ zeAT1|?^EV9o618v=FsaKyq$f-Zx?)WgSXxXzZ3if_^=kzF7_}TJmkg(pY29IcnbLU zE$~aeuLU1`OM_SXxTZ4K%d8A+3fPWXVFVKYR z@k`#6fuCI3;O%9OpJ&PUgJ8kS8oZr+l5c>A^t}s{!IFnm{h07(gNN>E@XDOGDQ?#?f5BFQjcNfCx$D6)!7lMpp1TEqtHFD_54;w<>}_nx z9Iq+Ofh;a|-`n7gG2^4O{!?@d15X6s&AmzQF$JpLF7f+_zR%37*U{-O}0N6Jn8Fm^2#*Um;{~=E^8!B{CZxBd=8jbD#35{fv*Br zzVVH326y_vC2jj9e(+$ke4YiX2lM#Af=O?>4=fC9nh(qcmINkhH>FpPZ#tN(1x)f` zA=pr`{boMB`~+VEeiD3)kM^?+JnUG5_d#>{o66}h`1vdJ)?@k7e0xyw-wO|L4;9GuUzp+`qDgJ5TfhQZhGkvtN3&E$fYV`io+=iL#XbpHR z`)@L6ubSf5^_Q|N10QN@^xk8RU$^0dU>iC%de@j`n|M!xhhNa>m2@`A=27H^pl<|N z=sB2#jR13jZI#K3kte1+O#=TaqS5=Xnb(A8gQpB^^p=_RGUZt*c)-<--sAMm=gJq| zHiGXT-sp`t%h%hQy1*-&0I44fwlYQGKeDF;J z3yW!)Zywk*uyfNPGFO3>`oK1VRr|p9f}QjcUoBX8?4Na!G7Vr6U^>_mbNWnW77AVi zo@cf*Q+wtDk8m}51ALTe3b=h_qxV4{@(aP&f*1L~*MZwcVKYAPYVeKVcec<@NPd1L z{MR;mmznj~`&?NxDokwjs)xrJ_6(2kbq8BNw$UqVG)=ZB{?Jgc<6!TZF;o4T0={M( zb=QpRydJQ6Fn_Z?ru<$7esp}JH>HL2NZgyjBPKL@UzQD5hR&usv>&`?W~0}Iy|;v) z09Wp4^gb2QG9H55(x=$-=R?22;1N$ZdcTo{krv{gBznEp=-uXHZ0G@ByRFfCn-BS` z!0XE!y#vhSVpIAyi~Jpp-dVKYEycedJn7v=Z=sL;I{{u<)7X5TXd0u1Fy_qPhdrD1 z)7zK`Fwgsq-me)yv=ny|xa)AE_erzvrn1cjuRhx7J!EdvO=&9yFRX3!Mk2mRzNxNl z1YZX}*au!C^1)-xxGDa6@Du0Zw^61c$IfXdO#BhxE^uG*CxNGcJI(Q%^v?z_1ds87 zmx6CT5C2B+{paDY0T1}jcl`C>q2Rvaw}r5N2Y#1XKXdxQH-r03Klpy|I3N7k-~n~M z`Afk=!F};>1fO&s{u*%4dHCzW*ZJU=HqXXlb2T_k=2`pWQLu2ZEno~Cnqkr=jRM;M zmT1OI<(>|H*hjp=za0DwxUY1t2M<5q*nB<8B!4$}BKY;@`1NuV-D|;Df}fi%i94VR z^&QMt+@atb!3UdVo8oqX*PMqx1zh>wH-90x9o$#^>%fzI@JrgN!Lz}`&HCx>)lsm* z^YC&YiL%ZIZ+EaQK6oYHBEb)W`_g+Fc;F8$r(5)12p$IBlHQMiMS}UVr!C-_;F0Du zo66)M_(~sfi|!}EH=KvRD+=yC5C2f`|4HyNa9{0US2k}S2lrLBL&3Y(`;LDKcqF(l{(0b;=iz?@eC2ug zw}6-V;3sLyLGZ)i!RGYyEZ7OK8nBky0^7yZr}M-c0e-?qykb{L;2}TxPIorA3*1+^ zm4c^$H=Api`k#&9tH7@@r^{q_HQ<}Ulg+q^zaBi`XWw>dV_p|}9y|iv1@0^UB=D5; z;Mw4X=fO+C*PSQ+jo{Vi;jaPz>OB1Q-~qq**55`UhJyR5*Ad{Z^YABur-1t^zijYT z=ix5}-wd8&EeGp^>(vasJ~?W0dfy{L!RY_$Op(5dfieV zC6ANO>o?o_6Xb>O<^Q}PHz$>m&-)(I_WE>kH~GbRwojgu;3u!nlbhsy$60@XJVO2@ zd%bP@L*$d>`SwqgyksV$uFF%OAa|4JtCt(KddM%c*V|t|d4xP)|2xSik5g}wm!$L8 z2gqy4Z_Km)5P2W@yzR5~Pn3LwJm2TZ1o?u&r>hQWs|(HKrMJa=q5W#?fcIaa$MU*c9?9`zFu3u z4U_L?xt}edfpuKA<@?C@7Aa*E*>c3dSl7L`7ZLh3ZBul!23q}b(p+j?ZSN*C)3HU zv9H^9T{A^)lHYF6ZLh6l73WLxkvutnPge^#l-jnI2G(o0^{rd#uT#ovueZHt{p9*) zrCzYVHd}okdE)Eu+c&m6LLRzasrHX7y#6@3c9T-S&(pUlso$>D<9YIu)qIZeDRp3h zT>8F}ytqRxc-LlDx2XB&EWWSgRHX&U{6Cmc zz7v@^Wohjx%f4{xN&dnv?Xw@hWc9kTvt^MoeCQJem(;|SYUVxUqCKN3`qLTJ#YhsH zxcKfFwF|rOF!tenIDil11YY*EQo*0is0!@-`HZT=u6t)xD~{qj#e*|y4-P*tqsDNs zhEin4xYt56EcmHSo;*uKHJB7uz`)U*$$jMm+ipvcj9)6 zSEtp3IEY7ZXiZv8;&4S;74BzwYuOI$bEH)b4xXP@9vtAl+aAfeKXw2cmDFQ>1NGR% z+Ow>`j=vu#=3YoAHe6|C$}|q(8234baFY8Kqd3rzRtc;%QvV$7aVd6fO{;30^wJMF z$US=9IPlH1+Kr2EORK%u_x-e*z|niTR|^~WQ9r@<;0;(G;Qli4{q!St;Xa(e5t%>8 z^H8vf597cC?9b;}FVA|bz`lp*M;yhiIQVP&5j!LFgUrVx*!T_ofWufj!1g^#Kj1K~ z#@aC3fn(gS)`j&Ep2va%co-+}KJ5HsS{=n9yy6AwaV3so7mndpoWMJA5)WW)l>U_Y zIDw5P*^UJ5xgSi&t}*rp4r3ELxo0XM)BD&TSf8RE$6lje@*~v0$n;zEC-!lVOEnJS z1{}qH95_9r`mlaRMn!O9c}B%?tTdxiGXJcMDt?K&vop%T30#Mbb24fh4&WXf!y&Af zag87Q@ID;HDO`Lm%Xyjoge!0uZ^F)UmV=|`Wz|(stUtqk z#3tT}!}vj*#7|)7KK3IH;H8JiaT!kH8m#YUKVlOHB*!7iaa8hWGin0+@QmcR^e{QD z#>R6QwHfFe~*^VDM(-i$-I8z=B?Y#g8-`|t#g;u);H zK>ZuM|L_K^V>k9;KMvzQtZ|<}1UqpY2XP9=aLJp@f06xw1K5qD*pIcBsFxf^B*$^d zaZ2)+sZWyQN*us$9L0XDO;V3tID&&XF7scZ9y@W#5w-(YVttBwY+^qS;Xa(e5y@Yr zUUHn09GARB|Kdt)a6f_@`>-E}ai8QkB01Olg1X(_F*@cYrKA(#C?);Z8IV{j^ij!;bN})mAu32k?VsvjNLei z{n&VudhEnu?80L>gb(8+UN%jCCOIDAVqAkw?7<=2gOhjw8%Hu~1PAdXPT<0Kng13) z2iS*ea1?v6_BQp{i3e~1kKh=d#CnSQqs+%;IEHJm{tornhkI}o58&cy>Tv*1;utRc z7xUkx9-FuZhp`81N2$jyJb*)Z1Sjz%_Wg_cf3tjChP8iFk4@~sVcdg@-=iJ}W~j$8 zJc(Ut>ffV3a2bx_8m#j@f(M(p2Z!+hj^Zee;Rzg4{2b!M5aDvl-i6F zE0pTSzH^n@jh*F6?Zw6_r6$Cym70#Zsh4TohhsR5lXwglxAXr}Y~Vsge_$O4aWxL(2JGu# zIoR~G9XNr9aqbiJ;=hYMu-F5OJ+RmVi#@Q|1B*Sd*aM3_@WJVU=-1|N%g7}K+MnPV zcmZC4Ly&}bK|x`4fp#LC4j+S0!Z~mrtbuiK5p0Aj;45$~G(jue3b(->&#JK;wVf(Kv^MBsPu zB>V&R!^?08QlM?*?-RqRa3-7uW#E7fun}sY4jN!9+yFPjci?vTA^ZgHf%{<(48ddY z7dQZKLI##{q3twS0q21M7r{oTg*x~eG{TK=3v|Oy_yO#Kd*D8J2p)mo!YIVy0K5#Z z!@ID=S)iQ^E1(os!g{EN%is#Q8m@z8xCy=m--Em0UKoNu!e1c{FT$&E7=FR~<(Kd% zynm3(J~C8)BbQk%YM8DEYuaSIeYQ=mBKL3M>_j)&Zm_2JFg^xyNm7Oh#>=)Go8H8D z&^8@mdIbL*SUPmtyFqOANRnWo5^o?HKHd*bY1dgu35 zz&3q;4evj=5M*e;SHc!(g`44_&lhOFg2&*`U>sVaIUzKQad?UL{~+s;wYhmXg1jdU zI_6AVdL`HB@M*KeFU>u3XcHa5ueW61AAC*XJ;J#3U6Q_#K9FDglD>^`|Fi6q@5{Zg z*t{^e|M?Y(?0ex>+RJ<5R&sF<=GOD7u|nK`qonGju{P^ur(w!6=Nw6ih?Wm#K$xsDfIkhi2%6Ug(EG7=lq4 zhbfqbA};bThjOTbTBwI+=!9PAhd~&EQ5c6Qn1&)Z^-vB~Pz&|Y44u#m{V)haFbd-^ z1=CQ(FWfALa;Sn@sE20ggkI=}K^THj7>6mChN61vp&Y897V4oHI-wW(VGxF36vkl+ zrlE)%Z3;i$%Lohcad9Pl6 z*<}~&D=+`zS61njj!!$f^mWDs7aA9=Td%M5wKuglwKg?&G_BG;*XC*Wws`dGTN~SM z&^w#jJ6gPL`h^a|vEDF@4Ti3-+)6`_&fL1X`m1b_+)0r=M#wQ$e!f|mc7wOoqhH{- zV4Z}Hj%^+Oc7Nkm&C%xdH#r(}D|57Xn%exc^KNLn#j*94mR8T&7LVre>}c!Qu{~#h zyXM%|*s)D>NSoPBn>VqA3R|{?0$!LbBsbz~Wi9@uF8*!zdK&$Wnxkpkmge@x?M=tV zwrulI*WA+9vZb-Ty>SOCr)73Q?Ox5neE(dqqpfj!%k`|(%Od&5kzGS>$y+-*G{^Pc z?c3+SHtCSH*2YVx{BMICljU3{$G=JrmclMusdZfBR5{mfj5b1mhb{_?+U4U`f4moGKIJOJf`%svcLHbVG-VRnf`G1Pw zeonR`H%L1f?f_{giOxf-g!8sAF*{i8e$2GhZqr=_nlQY^YIW@O-eYU0J;v5Uwe0ZO z!RnWXnU>FI^7`aloftp%8Bv-_JK<4~^-8-W?UJ-hSqovFwS6Ou%lTj0$+>>=xnrMc znKie(7~|4+(oW8$2WcnI@3a;vmi@6Gto3U0;HT#cvd_$8c6PAZA7ILAC!c}bv>Q0q z&2!6r)z(gv<6`2!w@()QI>`EE`wD4SNIUaHSwn8H*83KdGS{%?)2?ZDTqK$B9>~wH eHMG)B-p|%xEl=9YI;~+R?Xu5hnw=rJ4F3TK%vL)9 diff --git a/recorderlib/libs/x86_64/libmp3lame.so b/recorderlib/libs/x86_64/libmp3lame.so deleted file mode 100644 index 9a3ddba6e86fd462122b4aa399ad45f6b409bbba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 252000 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 E1Kg+gF8}}l diff --git a/recorderlib/src/main/jni/Android.mk b/recorderlib/src/main/jni/Android.mk deleted file mode 100644 index 9b1c14f..0000000 --- a/recorderlib/src/main/jni/Android.mk +++ /dev/null @@ -1,32 +0,0 @@ -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) - -LAME_LIBMP3_DIR := lame-3.100_libmp3lame - -LOCAL_MODULE := mp3lame - -LOCAL_SRC_FILES :=\ -$(LAME_LIBMP3_DIR)/bitstream.c \ -$(LAME_LIBMP3_DIR)/fft.c \ -$(LAME_LIBMP3_DIR)/id3tag.c \ -$(LAME_LIBMP3_DIR)/mpglib_interface.c \ -$(LAME_LIBMP3_DIR)/presets.c \ -$(LAME_LIBMP3_DIR)/quantize.c \ -$(LAME_LIBMP3_DIR)/reservoir.c \ -$(LAME_LIBMP3_DIR)/tables.c \ -$(LAME_LIBMP3_DIR)/util.c \ -$(LAME_LIBMP3_DIR)/VbrTag.c \ -$(LAME_LIBMP3_DIR)/encoder.c \ -$(LAME_LIBMP3_DIR)/gain_analysis.c \ -$(LAME_LIBMP3_DIR)/lame.c \ -$(LAME_LIBMP3_DIR)/newmdct.c \ -$(LAME_LIBMP3_DIR)/psymodel.c \ -$(LAME_LIBMP3_DIR)/quantize_pvt.c \ -$(LAME_LIBMP3_DIR)/set_get.c \ -$(LAME_LIBMP3_DIR)/takehiro.c \ -$(LAME_LIBMP3_DIR)/vbrquantize.c \ -$(LAME_LIBMP3_DIR)/version.c \ -MP3Encoder.c - -include $(BUILD_SHARED_LIBRARY) diff --git a/recorderlib/src/main/jni/Application.mk b/recorderlib/src/main/jni/Application.mk deleted file mode 100644 index e2a4693..0000000 --- a/recorderlib/src/main/jni/Application.mk +++ /dev/null @@ -1,4 +0,0 @@ -APP_ABI := armeabi armeabi-v7a arm64-v8a x86 x86_64 mips mips64 -APP_MODULES := mp3lame -APP_CFLAGS += -DSTDC_HEADERS -APP_PLATFORM := android-21 diff --git a/recorderlib/src/main/jni/Mp3Encoder.c b/recorderlib/src/main/jni/Mp3Encoder.c deleted file mode 100644 index 33f7e9a..0000000 --- a/recorderlib/src/main/jni/Mp3Encoder.c +++ /dev/null @@ -1,58 +0,0 @@ -#include "lame-3.100_libmp3lame/lame.h" -#include "Mp3Encoder.h" - -static lame_global_flags *glf = NULL; - -JNIEXPORT void JNICALL Java_com_zlw_main_recorderlib_recorder_mp3_Mp3Encoder_init( - JNIEnv *env, jclass cls, jint inSamplerate, jint outChannel, - jint outSamplerate, jint outBitrate, jint quality) { - if (glf != NULL) { - lame_close(glf); - glf = NULL; - } - glf = lame_init(); - lame_set_in_samplerate(glf, inSamplerate); - lame_set_num_channels(glf, outChannel); - lame_set_out_samplerate(glf, outSamplerate); - lame_set_brate(glf, outBitrate); - lame_set_quality(glf, quality); - lame_init_params(glf); -} - -JNIEXPORT jint JNICALL Java_com_zlw_main_recorderlib_recorder_mp3_Mp3Encoder_encode( - JNIEnv *env, jclass cls, jshortArray buffer_l, jshortArray buffer_r, - jint samples, jbyteArray mp3buf) { - jshort* j_buffer_l = (*env)->GetShortArrayElements(env, buffer_l, NULL); - - jshort* j_buffer_r = (*env)->GetShortArrayElements(env, buffer_r, NULL); - - const jsize mp3buf_size = (*env)->GetArrayLength(env, mp3buf); - jbyte* j_mp3buf = (*env)->GetByteArrayElements(env, mp3buf, NULL); - - int result = lame_encode_buffer(glf, j_buffer_l, j_buffer_r, - samples, j_mp3buf, mp3buf_size); - - (*env)->ReleaseShortArrayElements(env, buffer_l, j_buffer_l, 0); - (*env)->ReleaseShortArrayElements(env, buffer_r, j_buffer_r, 0); - (*env)->ReleaseByteArrayElements(env, mp3buf, j_mp3buf, 0); - - return result; -} - -JNIEXPORT jint JNICALL Java_com_zlw_main_recorderlib_recorder_mp3_Mp3Encoder_flush( - JNIEnv *env, jclass cls, jbyteArray mp3buf) { - const jsize mp3buf_size = (*env)->GetArrayLength(env, mp3buf); - jbyte* j_mp3buf = (*env)->GetByteArrayElements(env, mp3buf, NULL); - - int result = lame_encode_flush(glf, j_mp3buf, mp3buf_size); - - (*env)->ReleaseByteArrayElements(env, mp3buf, j_mp3buf, 0); - - return result; -} - -JNIEXPORT void JNICALL Java_com_zlw_main_recorderlib_recorder_mp3_Mp3Encoder_close( - JNIEnv *env, jclass cls) { - lame_close(glf); - glf = NULL; -} diff --git a/recorderlib/src/main/jni/Mp3Encoder.h b/recorderlib/src/main/jni/Mp3Encoder.h deleted file mode 100644 index 5817b35..0000000 --- a/recorderlib/src/main/jni/Mp3Encoder.h +++ /dev/null @@ -1,28 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include - -#ifndef _Included_Mp3Encoder -#define _Included_Mp3Encoder -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com.zlw.main.recorderlib.recorder.mp3.Mp3Encoder - * Method: init - */ -JNIEXPORT void JNICALL Java_com_zlw_main_recorderlib_recorder_mp3_Mp3Encoder_init - (JNIEnv *, jclass, jint, jint, jint, jint, jint); - -JNIEXPORT jint JNICALL Java_com_zlw_main_recorderlib_recorder_mp3_Mp3Encoder_encode - (JNIEnv *, jclass, jshortArray, jshortArray, jint, jbyteArray); - -JNIEXPORT jint JNICALL Java_com_zlw_main_recorderlib_recorder_mp3_Mp3Encoder_flush - (JNIEnv *, jclass, jbyteArray); - -JNIEXPORT void JNICALL Java_com_zlw_main_recorderlib_recorder_mp3_Mp3Encoder_close - (JNIEnv *, jclass); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/VbrTag.c b/recorderlib/src/main/jni/lame-3.100_libmp3lame/VbrTag.c deleted file mode 100644 index 5800a44..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/VbrTag.c +++ /dev/null @@ -1,1082 +0,0 @@ -/* - * Xing VBR tagging for LAME. - * - * Copyright (c) 1999 A.L. Faber - * Copyright (c) 2001 Jonathan Dee - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* $Id: VbrTag.c,v 1.106 2017/08/06 18:15:47 robert Exp $ */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include "lame.h" -#include "machine.h" -#include "encoder.h" -#include "util.h" -#include "bitstream.h" -#include "VbrTag.h" -#include "lame_global_flags.h" -#include "tables.h" - -#ifdef __sun__ -/* woraround for SunOS 4.x, it has SEEK_* defined here */ -#include -#endif - - -#ifdef _DEBUG -/* #define DEBUG_VBRTAG */ -#endif - -/* - * 4 bytes for Header Tag - * 4 bytes for Header Flags - * 100 bytes for entry (NUMTOCENTRIES) - * 4 bytes for FRAME SIZE - * 4 bytes for STREAM_SIZE - * 4 bytes for VBR SCALE. a VBR quality indicator: 0=best 100=worst - * 20 bytes for LAME tag. for example, "LAME3.12 (beta 6)" - * ___________ - * 140 bytes -*/ -#define VBRHEADERSIZE (NUMTOCENTRIES+4+4+4+4+4) - -#define LAMEHEADERSIZE (VBRHEADERSIZE + 9 + 1 + 1 + 8 + 1 + 1 + 3 + 1 + 1 + 2 + 4 + 2 + 2) - -/* the size of the Xing header (MPEG1 and MPEG2) in kbps */ -#define XING_BITRATE1 128 -#define XING_BITRATE2 64 -#define XING_BITRATE25 32 - -extern const char* get_lame_tag_encoder_short_version(void); - -static const char VBRTag0[] = { "Xing" }; -static const char VBRTag1[] = { "Info" }; - - - - -/* Lookup table for fast CRC computation - * See 'CRC_update_lookup' - * Uses the polynomial x^16+x^15+x^2+1 */ - -static const unsigned int crc16_lookup[256] = { - 0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241, - 0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440, - 0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40, - 0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841, - 0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40, - 0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41, - 0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641, - 0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040, - 0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240, - 0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441, - 0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41, - 0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840, - 0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41, - 0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40, - 0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640, - 0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041, - 0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240, - 0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441, - 0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41, - 0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840, - 0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41, - 0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40, - 0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640, - 0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041, - 0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241, - 0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440, - 0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40, - 0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841, - 0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40, - 0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41, - 0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641, - 0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040 -}; - - - - - -/*********************************************************************** - * Robert Hegemann 2001-01-17 - ***********************************************************************/ - -static void -addVbr(VBR_seek_info_t * v, int bitrate) -{ - int i; - - v->nVbrNumFrames++; - v->sum += bitrate; - v->seen++; - - if (v->seen < v->want) { - return; - } - - if (v->pos < v->size) { - v->bag[v->pos] = v->sum; - v->pos++; - v->seen = 0; - } - if (v->pos == v->size) { - for (i = 1; i < v->size; i += 2) { - v->bag[i / 2] = v->bag[i]; - } - v->want *= 2; - v->pos /= 2; - } -} - -static void -Xing_seek_table(VBR_seek_info_t const* v, unsigned char *t) -{ - int i, indx; - int seek_point; - - if (v->pos <= 0) - return; - - for (i = 1; i < NUMTOCENTRIES; ++i) { - float j = i / (float) NUMTOCENTRIES, act, sum; - indx = (int) (floor(j * v->pos)); - if (indx > v->pos - 1) - indx = v->pos - 1; - act = v->bag[indx]; - sum = v->sum; - seek_point = (int) (256. * act / sum); - if (seek_point > 255) - seek_point = 255; - t[i] = seek_point; - } -} - -#ifdef DEBUG_VBR_SEEKING_TABLE -static void -print_seeking(unsigned char *t) -{ - int i; - - printf("seeking table "); - for (i = 0; i < NUMTOCENTRIES; ++i) { - printf(" %d ", t[i]); - } - printf("\n"); -} -#endif - - -/**************************************************************************** - * AddVbrFrame: Add VBR entry, used to fill the VBR the TOC entries - * Paramters: - * nStreamPos: how many bytes did we write to the bitstream so far - * (in Bytes NOT Bits) - **************************************************************************** -*/ -void -AddVbrFrame(lame_internal_flags * gfc) -{ - int kbps = bitrate_table[gfc->cfg.version][gfc->ov_enc.bitrate_index]; - assert(gfc->VBR_seek_table.bag); - addVbr(&gfc->VBR_seek_table, kbps); -} - - -/*-------------------------------------------------------------*/ -static int -ExtractI4(const unsigned char *buf) -{ - int x; - /* big endian extract */ - x = buf[0]; - x <<= 8; - x |= buf[1]; - x <<= 8; - x |= buf[2]; - x <<= 8; - x |= buf[3]; - return x; -} - -static void -CreateI4(unsigned char *buf, uint32_t nValue) -{ - /* big endian create */ - buf[0] = (nValue >> 24) & 0xff; - buf[1] = (nValue >> 16) & 0xff; - buf[2] = (nValue >> 8) & 0xff; - buf[3] = (nValue) & 0xff; -} - - - -static void -CreateI2(unsigned char *buf, int nValue) -{ - /* big endian create */ - buf[0] = (nValue >> 8) & 0xff; - buf[1] = (nValue) & 0xff; -} - -/* check for magic strings*/ -static int -IsVbrTag(const unsigned char *buf) -{ - int isTag0, isTag1; - - isTag0 = ((buf[0] == VBRTag0[0]) && (buf[1] == VBRTag0[1]) && (buf[2] == VBRTag0[2]) - && (buf[3] == VBRTag0[3])); - isTag1 = ((buf[0] == VBRTag1[0]) && (buf[1] == VBRTag1[1]) && (buf[2] == VBRTag1[2]) - && (buf[3] == VBRTag1[3])); - - return (isTag0 || isTag1); -} - -#define SHIFT_IN_BITS_VALUE(x,n,v) ( x = (x << (n)) | ( (v) & ~(-1 << (n)) ) ) - -static void -setLameTagFrameHeader(lame_internal_flags const *gfc, unsigned char *buffer) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - EncResult_t const *const eov = &gfc->ov_enc; - char abyte, bbyte; - - SHIFT_IN_BITS_VALUE(buffer[0], 8u, 0xffu); - - SHIFT_IN_BITS_VALUE(buffer[1], 3u, 7); - SHIFT_IN_BITS_VALUE(buffer[1], 1u, (cfg->samplerate_out < 16000) ? 0 : 1); - SHIFT_IN_BITS_VALUE(buffer[1], 1u, cfg->version); - SHIFT_IN_BITS_VALUE(buffer[1], 2u, 4 - 3); - SHIFT_IN_BITS_VALUE(buffer[1], 1u, (!cfg->error_protection) ? 1 : 0); - - SHIFT_IN_BITS_VALUE(buffer[2], 4u, eov->bitrate_index); - SHIFT_IN_BITS_VALUE(buffer[2], 2u, cfg->samplerate_index); - SHIFT_IN_BITS_VALUE(buffer[2], 1u, 0); - SHIFT_IN_BITS_VALUE(buffer[2], 1u, cfg->extension); - - SHIFT_IN_BITS_VALUE(buffer[3], 2u, cfg->mode); - SHIFT_IN_BITS_VALUE(buffer[3], 2u, eov->mode_ext); - SHIFT_IN_BITS_VALUE(buffer[3], 1u, cfg->copyright); - SHIFT_IN_BITS_VALUE(buffer[3], 1u, cfg->original); - SHIFT_IN_BITS_VALUE(buffer[3], 2u, cfg->emphasis); - - /* the default VBR header. 48 kbps layer III, no padding, no crc */ - /* but sampling freq, mode andy copyright/copy protection taken */ - /* from first valid frame */ - buffer[0] = (uint8_t) 0xff; - abyte = (buffer[1] & (unsigned char) 0xf1); - { - int bitrate; - if (1 == cfg->version) { - bitrate = XING_BITRATE1; - } - else { - if (cfg->samplerate_out < 16000) - bitrate = XING_BITRATE25; - else - bitrate = XING_BITRATE2; - } - - if (cfg->vbr == vbr_off) - bitrate = cfg->avg_bitrate; - - if (cfg->free_format) - bbyte = 0x00; - else - bbyte = 16 * BitrateIndex(bitrate, cfg->version, cfg->samplerate_out); - } - - /* Use as much of the info from the real frames in the - * Xing header: samplerate, channels, crc, etc... - */ - if (cfg->version == 1) { - /* MPEG1 */ - buffer[1] = abyte | (char) 0x0a; /* was 0x0b; */ - abyte = buffer[2] & (char) 0x0d; /* AF keep also private bit */ - buffer[2] = (char) bbyte | abyte; /* 64kbs MPEG1 frame */ - } - else { - /* MPEG2 */ - buffer[1] = abyte | (char) 0x02; /* was 0x03; */ - abyte = buffer[2] & (char) 0x0d; /* AF keep also private bit */ - buffer[2] = (char) bbyte | abyte; /* 64kbs MPEG2 frame */ - } -} - -#if 0 -static int CheckVbrTag(unsigned char *buf); - -/*-------------------------------------------------------------*/ -/* Same as GetVbrTag below, but only checks for the Xing tag. - requires buf to contain only 40 bytes */ -/*-------------------------------------------------------------*/ -int -CheckVbrTag(unsigned char *buf) -{ - int h_id, h_mode; - - /* get selected MPEG header data */ - h_id = (buf[1] >> 3) & 1; - h_mode = (buf[3] >> 6) & 3; - - /* determine offset of header */ - if (h_id) { - /* mpeg1 */ - if (h_mode != 3) - buf += (32 + 4); - else - buf += (17 + 4); - } - else { - /* mpeg2 */ - if (h_mode != 3) - buf += (17 + 4); - else - buf += (9 + 4); - } - - return IsVbrTag(buf); -} -#endif - -int -GetVbrTag(VBRTAGDATA * pTagData, const unsigned char *buf) -{ - int i, head_flags; - int h_bitrate, h_id, h_mode, h_sr_index, h_layer; - int enc_delay, enc_padding; - - /* get Vbr header data */ - pTagData->flags = 0; - - /* get selected MPEG header data */ - h_layer = (buf[1] >> 1) & 3; - if ( h_layer != 0x01 ) { - /* the following code assumes Layer-3, so give up here */ - return 0; - } - h_id = (buf[1] >> 3) & 1; - h_sr_index = (buf[2] >> 2) & 3; - h_mode = (buf[3] >> 6) & 3; - h_bitrate = ((buf[2] >> 4) & 0xf); - h_bitrate = bitrate_table[h_id][h_bitrate]; - - /* check for FFE syncword */ - if ((buf[1] >> 4) == 0xE) - pTagData->samprate = samplerate_table[2][h_sr_index]; - else - pTagData->samprate = samplerate_table[h_id][h_sr_index]; - /* if( h_id == 0 ) */ - /* pTagData->samprate >>= 1; */ - - - - /* determine offset of header */ - if (h_id) { - /* mpeg1 */ - if (h_mode != 3) - buf += (32 + 4); - else - buf += (17 + 4); - } - else { - /* mpeg2 */ - if (h_mode != 3) - buf += (17 + 4); - else - buf += (9 + 4); - } - - if (!IsVbrTag(buf)) - return 0; - - buf += 4; - - pTagData->h_id = h_id; - - head_flags = pTagData->flags = ExtractI4(buf); - buf += 4; /* get flags */ - - if (head_flags & FRAMES_FLAG) { - pTagData->frames = ExtractI4(buf); - buf += 4; - } - - if (head_flags & BYTES_FLAG) { - pTagData->bytes = ExtractI4(buf); - buf += 4; - } - - if (head_flags & TOC_FLAG) { - if (pTagData->toc != NULL) { - for (i = 0; i < NUMTOCENTRIES; i++) - pTagData->toc[i] = buf[i]; - } - buf += NUMTOCENTRIES; - } - - pTagData->vbr_scale = -1; - - if (head_flags & VBR_SCALE_FLAG) { - pTagData->vbr_scale = ExtractI4(buf); - buf += 4; - } - - pTagData->headersize = ((h_id + 1) * 72000 * h_bitrate) / pTagData->samprate; - - buf += 21; - enc_delay = buf[0] << 4; - enc_delay += buf[1] >> 4; - enc_padding = (buf[1] & 0x0F) << 8; - enc_padding += buf[2]; - /* check for reasonable values (this may be an old Xing header, */ - /* not a INFO tag) */ - if (enc_delay < 0 || enc_delay > 3000) - enc_delay = -1; - if (enc_padding < 0 || enc_padding > 3000) - enc_padding = -1; - - pTagData->enc_delay = enc_delay; - pTagData->enc_padding = enc_padding; - -#ifdef DEBUG_VBRTAG - fprintf(stderr, "\n\n********************* VBR TAG INFO *****************\n"); - fprintf(stderr, "tag :%s\n", VBRTag); - fprintf(stderr, "head_flags :%d\n", head_flags); - fprintf(stderr, "bytes :%d\n", pTagData->bytes); - fprintf(stderr, "frames :%d\n", pTagData->frames); - fprintf(stderr, "VBR Scale :%d\n", pTagData->vbr_scale); - fprintf(stderr, "enc_delay = %i \n", enc_delay); - fprintf(stderr, "enc_padding= %i \n", enc_padding); - fprintf(stderr, "toc:\n"); - if (pTagData->toc != NULL) { - for (i = 0; i < NUMTOCENTRIES; i++) { - if ((i % 10) == 0) - fprintf(stderr, "\n"); - fprintf(stderr, " %3d", (int) (pTagData->toc[i])); - } - } - fprintf(stderr, "\n***************** END OF VBR TAG INFO ***************\n"); -#endif - return 1; /* success */ -} - - -/**************************************************************************** - * InitVbrTag: Initializes the header, and write empty frame to stream - * Paramters: - * fpStream: pointer to output file stream - * nMode : Channel Mode: 0=STEREO 1=JS 2=DS 3=MONO - **************************************************************************** -*/ -int -InitVbrTag(lame_global_flags * gfp) -{ - lame_internal_flags *gfc = gfp->internal_flags; - SessionConfig_t const *const cfg = &gfc->cfg; - int kbps_header; - -#define MAXFRAMESIZE 2880 /* or 0xB40, the max freeformat 640 32kHz framesize */ - - /* - * Xing VBR pretends to be a 48kbs layer III frame. (at 44.1kHz). - * (at 48kHz they use 56kbs since 48kbs frame not big enough for - * table of contents) - * let's always embed Xing header inside a 64kbs layer III frame. - * this gives us enough room for a LAME version string too. - * size determined by sampling frequency (MPEG1) - * 32kHz: 216 bytes@48kbs 288bytes@ 64kbs - * 44.1kHz: 156 bytes 208bytes@64kbs (+1 if padding = 1) - * 48kHz: 144 bytes 192 - * - * MPEG 2 values are the same since the framesize and samplerate - * are each reduced by a factor of 2. - */ - - - if (1 == cfg->version) { - kbps_header = XING_BITRATE1; - } - else { - if (cfg->samplerate_out < 16000) - kbps_header = XING_BITRATE25; - else - kbps_header = XING_BITRATE2; - } - - if (cfg->vbr == vbr_off) - kbps_header = cfg->avg_bitrate; - - /** make sure LAME Header fits into Frame - */ - { - int total_frame_size = ((cfg->version + 1) * 72000 * kbps_header) / cfg->samplerate_out; - int header_size = (cfg->sideinfo_len + LAMEHEADERSIZE); - gfc->VBR_seek_table.TotalFrameSize = total_frame_size; - if (total_frame_size < header_size || total_frame_size > MAXFRAMESIZE) { - /* disable tag, it wont fit */ - gfc->cfg.write_lame_tag = 0; - return 0; - } - } - - gfc->VBR_seek_table.nVbrNumFrames = 0; - gfc->VBR_seek_table.nBytesWritten = 0; - gfc->VBR_seek_table.sum = 0; - - gfc->VBR_seek_table.seen = 0; - gfc->VBR_seek_table.want = 1; - gfc->VBR_seek_table.pos = 0; - - if (gfc->VBR_seek_table.bag == NULL) { - gfc->VBR_seek_table.bag = lame_calloc(int, 400); - if (gfc->VBR_seek_table.bag != NULL) { - gfc->VBR_seek_table.size = 400; - } - else { - gfc->VBR_seek_table.size = 0; - ERRORF(gfc, "Error: can't allocate VbrFrames buffer\n"); - gfc->cfg.write_lame_tag = 0; - return -1; - } - } - - /* write dummy VBR tag of all 0's into bitstream */ - { - uint8_t buffer[MAXFRAMESIZE]; - size_t i, n; - - memset(buffer, 0, sizeof(buffer)); - setLameTagFrameHeader(gfc, buffer); - n = gfc->VBR_seek_table.TotalFrameSize; - for (i = 0; i < n; ++i) { - add_dummy_byte(gfc, buffer[i], 1); - } - } - /* Success */ - return 0; -} - - - -/* fast CRC-16 computation - uses table crc16_lookup 8*/ -static uint16_t -CRC_update_lookup(uint16_t value, uint16_t crc) -{ - uint16_t tmp; - tmp = crc ^ value; - crc = (crc >> 8) ^ crc16_lookup[tmp & 0xff]; - return crc; -} - -void -UpdateMusicCRC(uint16_t * crc, unsigned char const *buffer, int size) -{ - int i; - for (i = 0; i < size; ++i) - *crc = CRC_update_lookup(buffer[i], *crc); -} - - - - - -/**************************************************************************** - * Jonathan Dee 2001/08/31 - * - * PutLameVBR: Write LAME info: mini version + info on various switches used - * Paramters: - * pbtStreamBuffer : pointer to output buffer - * id3v2size : size of id3v2 tag in bytes - * crc : computation of crc-16 of Lame Tag so far (starting at frame sync) - * - **************************************************************************** -*/ -static int -PutLameVBR(lame_global_flags const *gfp, size_t nMusicLength, uint8_t * pbtStreamBuffer, uint16_t crc) -{ - lame_internal_flags const *gfc = gfp->internal_flags; - SessionConfig_t const *const cfg = &gfc->cfg; - - int nBytesWritten = 0; - int i; - - int enc_delay = gfc->ov_enc.encoder_delay; /* encoder delay */ - int enc_padding = gfc->ov_enc.encoder_padding; /* encoder padding */ - - /*recall: cfg->vbr_q is for example set by the switch -V */ - /* gfp->quality by -q, -h, -f, etc */ - - int nQuality = (100 - 10 * gfp->VBR_q - gfp->quality); - - - /* - NOTE: - Even though the specification for the LAME VBR tag - did explicitly mention other encoders than LAME, - many SW/HW decoder seem to be able to make use of - this tag only, if the encoder version starts with LAME. - To be compatible with such decoders, ANY encoder will - be forced to write a fake LAME version string! - As a result, the encoder version info becomes worthless. - */ - const char *szVersion = get_lame_tag_encoder_short_version(); - uint8_t nVBR; - uint8_t nRevision = 0x00; - uint8_t nRevMethod; - uint8_t vbr_type_translator[] = { 1, 5, 3, 2, 4, 0, 3 }; /*numbering different in vbr_mode vs. Lame tag */ - - uint8_t nLowpass = - (((cfg->lowpassfreq / 100.0) + .5) > 255 ? 255 : (cfg->lowpassfreq / 100.0) + .5); - - uint32_t nPeakSignalAmplitude = 0; - - uint16_t nRadioReplayGain = 0; - uint16_t nAudiophileReplayGain = 0; - - uint8_t nNoiseShaping = cfg->noise_shaping; - uint8_t nStereoMode = 0; - int bNonOptimal = 0; - uint8_t nSourceFreq = 0; - uint8_t nMisc = 0; - uint16_t nMusicCRC = 0; - - /*psy model type: Gpsycho or NsPsytune */ - unsigned char bExpNPsyTune = 1; /* only NsPsytune */ - unsigned char bSafeJoint = (cfg->use_safe_joint_stereo) != 0; - - unsigned char bNoGapMore = 0; - unsigned char bNoGapPrevious = 0; - - int nNoGapCount = gfp->nogap_total; - int nNoGapCurr = gfp->nogap_current; - - - uint8_t nAthType = cfg->ATHtype; /*4 bits. */ - - uint8_t nFlags = 0; - - /* if ABR, {store bitrate <=255} else { store "-b"} */ - int nABRBitrate; - switch (cfg->vbr) { - case vbr_abr:{ - nABRBitrate = cfg->vbr_avg_bitrate_kbps; - break; - } - case vbr_off:{ - nABRBitrate = cfg->avg_bitrate; - break; - } - default:{ /*vbr modes */ - nABRBitrate = bitrate_table[cfg->version][cfg->vbr_min_bitrate_index];; - } - } - - - /*revision and vbr method */ - if (cfg->vbr < sizeof(vbr_type_translator)) - nVBR = vbr_type_translator[cfg->vbr]; - else - nVBR = 0x00; /*unknown. */ - - nRevMethod = 0x10 * nRevision + nVBR; - - - /* ReplayGain */ - if (cfg->findReplayGain) { - int RadioGain = gfc->ov_rpg.RadioGain; - if (RadioGain > 0x1FE) - RadioGain = 0x1FE; - if (RadioGain < -0x1FE) - RadioGain = -0x1FE; - - nRadioReplayGain = 0x2000; /* set name code */ - nRadioReplayGain |= 0xC00; /* set originator code to `determined automatically' */ - - if (RadioGain >= 0) - nRadioReplayGain |= RadioGain; /* set gain adjustment */ - else { - nRadioReplayGain |= 0x200; /* set the sign bit */ - nRadioReplayGain |= -RadioGain; /* set gain adjustment */ - } - } - - /* peak sample */ - if (cfg->findPeakSample) - nPeakSignalAmplitude = - abs((int) ((((FLOAT) gfc->ov_rpg.PeakSample) / 32767.0) * pow(2, 23) + .5)); - - /*nogap */ - if (nNoGapCount != -1) { - if (nNoGapCurr > 0) - bNoGapPrevious = 1; - - if (nNoGapCurr < nNoGapCount - 1) - bNoGapMore = 1; - } - - /*flags */ - - nFlags = nAthType + (bExpNPsyTune << 4) - + (bSafeJoint << 5) - + (bNoGapMore << 6) - + (bNoGapPrevious << 7); - - - if (nQuality < 0) - nQuality = 0; - - /*stereo mode field... a bit ugly. */ - - switch (cfg->mode) { - case MONO: - nStereoMode = 0; - break; - case STEREO: - nStereoMode = 1; - break; - case DUAL_CHANNEL: - nStereoMode = 2; - break; - case JOINT_STEREO: - if (cfg->force_ms) - nStereoMode = 4; - else - nStereoMode = 3; - break; - case NOT_SET: - /* FALLTHROUGH */ - default: - nStereoMode = 7; - break; - } - - /*Intensity stereo : nStereoMode = 6. IS is not implemented */ - - if (cfg->samplerate_in <= 32000) - nSourceFreq = 0x00; - else if (cfg->samplerate_in == 48000) - nSourceFreq = 0x02; - else if (cfg->samplerate_in > 48000) - nSourceFreq = 0x03; - else - nSourceFreq = 0x01; /*default is 44100Hz. */ - - - /*Check if the user overrided the default LAME behaviour with some nasty options */ - - if (cfg->short_blocks == short_block_forced || cfg->short_blocks == short_block_dispensed || ((cfg->lowpassfreq == -1) && (cfg->highpassfreq == -1)) || /* "-k" */ - (cfg->disable_reservoir && cfg->avg_bitrate < 320) || - cfg->noATH || cfg->ATHonly || (nAthType == 0) || cfg->samplerate_in <= 32000) - bNonOptimal = 1; - - nMisc = nNoiseShaping + (nStereoMode << 2) - + (bNonOptimal << 5) - + (nSourceFreq << 6); - - - nMusicCRC = gfc->nMusicCRC; - - - /*Write all this information into the stream */ - CreateI4(&pbtStreamBuffer[nBytesWritten], nQuality); - nBytesWritten += 4; - - strncpy((char *) &pbtStreamBuffer[nBytesWritten], szVersion, 9); - nBytesWritten += 9; - - pbtStreamBuffer[nBytesWritten] = nRevMethod; - nBytesWritten++; - - pbtStreamBuffer[nBytesWritten] = nLowpass; - nBytesWritten++; - - CreateI4(&pbtStreamBuffer[nBytesWritten], nPeakSignalAmplitude); - nBytesWritten += 4; - - CreateI2(&pbtStreamBuffer[nBytesWritten], nRadioReplayGain); - nBytesWritten += 2; - - CreateI2(&pbtStreamBuffer[nBytesWritten], nAudiophileReplayGain); - nBytesWritten += 2; - - pbtStreamBuffer[nBytesWritten] = nFlags; - nBytesWritten++; - - if (nABRBitrate >= 255) - pbtStreamBuffer[nBytesWritten] = 0xFF; - else - pbtStreamBuffer[nBytesWritten] = nABRBitrate; - nBytesWritten++; - - pbtStreamBuffer[nBytesWritten] = enc_delay >> 4; /* works for win32, does it for unix? */ - pbtStreamBuffer[nBytesWritten + 1] = (enc_delay << 4) + (enc_padding >> 8); - pbtStreamBuffer[nBytesWritten + 2] = enc_padding; - - nBytesWritten += 3; - - pbtStreamBuffer[nBytesWritten] = nMisc; - nBytesWritten++; - - - pbtStreamBuffer[nBytesWritten++] = 0; /*unused in rev0 */ - - CreateI2(&pbtStreamBuffer[nBytesWritten], cfg->preset); - nBytesWritten += 2; - - CreateI4(&pbtStreamBuffer[nBytesWritten], (int) nMusicLength); - nBytesWritten += 4; - - CreateI2(&pbtStreamBuffer[nBytesWritten], nMusicCRC); - nBytesWritten += 2; - - /*Calculate tag CRC.... must be done here, since it includes - *previous information*/ - - for (i = 0; i < nBytesWritten; i++) - crc = CRC_update_lookup(pbtStreamBuffer[i], crc); - - CreateI2(&pbtStreamBuffer[nBytesWritten], crc); - nBytesWritten += 2; - - return nBytesWritten; -} - -static long -skipId3v2(FILE * fpStream) -{ - size_t nbytes; - long id3v2TagSize; - unsigned char id3v2Header[10]; - - /* seek to the beginning of the stream */ - if (fseek(fpStream, 0, SEEK_SET) != 0) { - return -2; /* not seekable, abort */ - } - /* read 10 bytes in case there's an ID3 version 2 header here */ - nbytes = fread(id3v2Header, 1, sizeof(id3v2Header), fpStream); - if (nbytes != sizeof(id3v2Header)) { - return -3; /* not readable, maybe opened Write-Only */ - } - /* does the stream begin with the ID3 version 2 file identifier? */ - if (!strncmp((char *) id3v2Header, "ID3", 3)) { - /* the tag size (minus the 10-byte header) is encoded into four - * bytes where the most significant bit is clear in each byte */ - id3v2TagSize = (((id3v2Header[6] & 0x7f) << 21) - | ((id3v2Header[7] & 0x7f) << 14) - | ((id3v2Header[8] & 0x7f) << 7) - | (id3v2Header[9] & 0x7f)) - + sizeof id3v2Header; - } - else { - /* no ID3 version 2 tag in this stream */ - id3v2TagSize = 0; - } - return id3v2TagSize; -} - - - -size_t -lame_get_lametag_frame(lame_global_flags const *gfp, unsigned char *buffer, size_t size) -{ - lame_internal_flags *gfc; - SessionConfig_t const *cfg; - unsigned long stream_size; - unsigned int nStreamIndex; - uint8_t btToc[NUMTOCENTRIES]; - - if (gfp == 0) { - return 0; - } - gfc = gfp->internal_flags; - if (gfc == 0) { - return 0; - } - if (!is_lame_internal_flags_valid(gfc)) { - return 0; - } - cfg = &gfc->cfg; - if (cfg->write_lame_tag == 0) { - return 0; - } - if (gfc->VBR_seek_table.pos <= 0) { - return 0; - } - if (size < gfc->VBR_seek_table.TotalFrameSize) { - return gfc->VBR_seek_table.TotalFrameSize; - } - if (buffer == 0) { - return 0; - } - - memset(buffer, 0, gfc->VBR_seek_table.TotalFrameSize); - - /* 4 bytes frame header */ - - setLameTagFrameHeader(gfc, buffer); - - /* Clear all TOC entries */ - memset(btToc, 0, sizeof(btToc)); - - if (cfg->free_format) { - int i; - for (i = 1; i < NUMTOCENTRIES; ++i) - btToc[i] = 255 * i / 100; - } - else { - Xing_seek_table(&gfc->VBR_seek_table, btToc); - } -#ifdef DEBUG_VBR_SEEKING_TABLE - print_seeking(btToc); -#endif - - /* Start writing the tag after the zero frame */ - nStreamIndex = cfg->sideinfo_len; - /* note! Xing header specifies that Xing data goes in the - * ancillary data with NO ERROR PROTECTION. If error protecton - * in enabled, the Xing data still starts at the same offset, - * and now it is in sideinfo data block, and thus will not - * decode correctly by non-Xing tag aware players */ - if (cfg->error_protection) - nStreamIndex -= 2; - - /* Put Vbr tag */ - if (cfg->vbr == vbr_off) { - buffer[nStreamIndex++] = VBRTag1[0]; - buffer[nStreamIndex++] = VBRTag1[1]; - buffer[nStreamIndex++] = VBRTag1[2]; - buffer[nStreamIndex++] = VBRTag1[3]; - - } - else { - buffer[nStreamIndex++] = VBRTag0[0]; - buffer[nStreamIndex++] = VBRTag0[1]; - buffer[nStreamIndex++] = VBRTag0[2]; - buffer[nStreamIndex++] = VBRTag0[3]; - } - - /* Put header flags */ - CreateI4(&buffer[nStreamIndex], FRAMES_FLAG + BYTES_FLAG + TOC_FLAG + VBR_SCALE_FLAG); - nStreamIndex += 4; - - /* Put Total Number of frames */ - CreateI4(&buffer[nStreamIndex], gfc->VBR_seek_table.nVbrNumFrames); - nStreamIndex += 4; - - /* Put total audio stream size, including Xing/LAME Header */ - stream_size = gfc->VBR_seek_table.nBytesWritten + gfc->VBR_seek_table.TotalFrameSize; - CreateI4(&buffer[nStreamIndex], stream_size); - nStreamIndex += 4; - - /* Put TOC */ - memcpy(&buffer[nStreamIndex], btToc, sizeof(btToc)); - nStreamIndex += sizeof(btToc); - - - if (cfg->error_protection) { - /* (jo) error_protection: add crc16 information to header */ - CRC_writeheader(gfc, (char *) buffer); - } - { - /*work out CRC so far: initially crc = 0 */ - uint16_t crc = 0x00; - unsigned int i; - for (i = 0; i < nStreamIndex; i++) - crc = CRC_update_lookup(buffer[i], crc); - /*Put LAME VBR info */ - nStreamIndex += PutLameVBR(gfp, stream_size, buffer + nStreamIndex, crc); - } - -#ifdef DEBUG_VBRTAG - { - VBRTAGDATA TestHeader; - GetVbrTag(&TestHeader, buffer); - } -#endif - - return gfc->VBR_seek_table.TotalFrameSize; -} - -/*********************************************************************** - * - * PutVbrTag: Write final VBR tag to the file - * Paramters: - * lpszFileName: filename of MP3 bit stream - * nVbrScale : encoder quality indicator (0..100) - **************************************************************************** - */ - -int -PutVbrTag(lame_global_flags const *gfp, FILE * fpStream) -{ - lame_internal_flags *gfc = gfp->internal_flags; - - long lFileSize; - long id3v2TagSize; - size_t nbytes; - uint8_t buffer[MAXFRAMESIZE]; - - if (gfc->VBR_seek_table.pos <= 0) - return -1; - - /* Seek to end of file */ - fseek(fpStream, 0, SEEK_END); - - /* Get file size */ - lFileSize = ftell(fpStream); - - /* Abort if file has zero length. Yes, it can happen :) */ - if (lFileSize == 0) - return -1; - - /* - * The VBR tag may NOT be located at the beginning of the stream. - * If an ID3 version 2 tag was added, then it must be skipped to write - * the VBR tag data. - */ - - id3v2TagSize = skipId3v2(fpStream); - - if (id3v2TagSize < 0) { - return id3v2TagSize; - } - - /*Seek to the beginning of the stream */ - fseek(fpStream, id3v2TagSize, SEEK_SET); - - nbytes = lame_get_lametag_frame(gfp, buffer, sizeof(buffer)); - if (nbytes > sizeof(buffer)) { - return -1; - } - - if (nbytes < 1) { - return 0; - } - - /* Put it all to disk again */ - if (fwrite(buffer, nbytes, 1, fpStream) != 1) { - return -1; - } - - return 0; /* success */ -} diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/VbrTag.h b/recorderlib/src/main/jni/lame-3.100_libmp3lame/VbrTag.h deleted file mode 100644 index 406af36..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/VbrTag.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Xing VBR tagging for LAME. - * - * Copyright (c) 1999 A.L. Faber - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef LAME_VRBTAG_H -#define LAME_VRBTAG_H - - -/* ----------------------------------------------------------- - * A Vbr header may be present in the ancillary - * data field of the first frame of an mp3 bitstream - * The Vbr header (optionally) contains - * frames total number of audio frames in the bitstream - * bytes total number of bytes in the bitstream - * toc table of contents - - * toc (table of contents) gives seek points - * for random access - * the ith entry determines the seek point for - * i-percent duration - * seek point in bytes = (toc[i]/256.0) * total_bitstream_bytes - * e.g. half duration seek point = (toc[50]/256.0) * total_bitstream_bytes - */ - - -#define FRAMES_FLAG 0x0001 -#define BYTES_FLAG 0x0002 -#define TOC_FLAG 0x0004 -#define VBR_SCALE_FLAG 0x0008 - -#define NUMTOCENTRIES 100 - -#ifndef lame_internal_flags_defined -#define lame_internal_flags_defined -struct lame_internal_flags; -typedef struct lame_internal_flags lame_internal_flags; -#endif - - -/*structure to receive extracted header */ -/* toc may be NULL*/ -typedef struct { - int h_id; /* from MPEG header, 0=MPEG2, 1=MPEG1 */ - int samprate; /* determined from MPEG header */ - int flags; /* from Vbr header data */ - int frames; /* total bit stream frames from Vbr header data */ - int bytes; /* total bit stream bytes from Vbr header data */ - int vbr_scale; /* encoded vbr scale from Vbr header data */ - unsigned char toc[NUMTOCENTRIES]; /* may be NULL if toc not desired */ - int headersize; /* size of VBR header, in bytes */ - int enc_delay; /* encoder delay */ - int enc_padding; /* encoder paddign added at end of stream */ -} VBRTAGDATA; - -int GetVbrTag(VBRTAGDATA * pTagData, const unsigned char *buf); - -int InitVbrTag(lame_global_flags * gfp); -int PutVbrTag(lame_global_flags const *gfp, FILE * fid); -void AddVbrFrame(lame_internal_flags * gfc); -void UpdateMusicCRC(uint16_t * crc, const unsigned char *buffer, int size); - -#endif diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/bitstream.c b/recorderlib/src/main/jni/lame-3.100_libmp3lame/bitstream.c deleted file mode 100644 index aa35915..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/bitstream.c +++ /dev/null @@ -1,1111 +0,0 @@ -/* - * MP3 bitstream Output interface for LAME - * - * Copyright (c) 1999-2000 Mark Taylor - * Copyright (c) 1999-2002 Takehiro Tominaga - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * $Id: bitstream.c,v 1.99 2017/08/31 14:14:46 robert Exp $ - */ - - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include - -#include "lame.h" -#include "machine.h" -#include "encoder.h" -#include "util.h" -#include "tables.h" -#include "quantize_pvt.h" -#include "lame_global_flags.h" -#include "gain_analysis.h" -#include "VbrTag.h" -#include "bitstream.h" -#include "tables.h" - - - -/* unsigned int is at least this large: */ -/* we work with ints, so when doing bit manipulation, we limit - * ourselves to MAX_LENGTH-2 just to be on the safe side */ -#define MAX_LENGTH 32 - - - -#ifdef DEBUG -static int hogege; -#endif - - - -static int -calcFrameLength(SessionConfig_t const *const cfg, int kbps, int pad) -{ - return 8 * ((cfg->version + 1) * 72000 * kbps / cfg->samplerate_out + pad); -} - - -/*********************************************************************** - * compute bitsperframe and mean_bits for a layer III frame - **********************************************************************/ -int -getframebits(const lame_internal_flags * gfc) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - EncResult_t const *const eov = &gfc->ov_enc; - int bit_rate; - - /* get bitrate in kbps [?] */ - if (eov->bitrate_index) - bit_rate = bitrate_table[cfg->version][eov->bitrate_index]; - else - bit_rate = cfg->avg_bitrate; - /*assert(bit_rate <= 550); */ - assert(8 <= bit_rate && bit_rate <= 640); - - /* main encoding routine toggles padding on and off */ - /* one Layer3 Slot consists of 8 bits */ - return calcFrameLength(cfg, bit_rate, eov->padding); -} - -int -get_max_frame_buffer_size_by_constraint(SessionConfig_t const * cfg, int constraint) -{ - int maxmp3buf = 0; - if (cfg->avg_bitrate > 320) { - /* in freeformat the buffer is constant */ - if (constraint == MDB_STRICT_ISO) { - maxmp3buf = calcFrameLength(cfg, cfg->avg_bitrate, 0); - } - else { - /* maximum allowed bits per granule are 7680 */ - maxmp3buf = 7680 * (cfg->version + 1); - } - } - else { - int max_kbps; - if (cfg->samplerate_out < 16000) { - max_kbps = bitrate_table[cfg->version][8]; /* default: allow 64 kbps (MPEG-2.5) */ - } - else { - max_kbps = bitrate_table[cfg->version][14]; - } - switch (constraint) - { - default: - case MDB_DEFAULT: - /* Bouvigne suggests this more lax interpretation of the ISO doc instead of using 8*960. */ - /* All mp3 decoders should have enough buffer to handle this value: size of a 320kbps 32kHz frame */ - maxmp3buf = 8 * 1440; - break; - case MDB_STRICT_ISO: - maxmp3buf = calcFrameLength(cfg, max_kbps, 0); - break; - case MDB_MAXIMUM: - maxmp3buf = 7680 * (cfg->version + 1); - break; - } - } - return maxmp3buf; -} - - -static void -putheader_bits(lame_internal_flags * gfc) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - EncStateVar_t *const esv = &gfc->sv_enc; - Bit_stream_struc *bs = &gfc->bs; -#ifdef DEBUG - hogege += cfg->sideinfo_len * 8; -#endif - memcpy(&bs->buf[bs->buf_byte_idx], esv->header[esv->w_ptr].buf, cfg->sideinfo_len); - bs->buf_byte_idx += cfg->sideinfo_len; - bs->totbit += cfg->sideinfo_len * 8; - esv->w_ptr = (esv->w_ptr + 1) & (MAX_HEADER_BUF - 1); -} - - - - -/*write j bits into the bit stream */ -inline static void -putbits2(lame_internal_flags * gfc, int val, int j) -{ - EncStateVar_t const *const esv = &gfc->sv_enc; - Bit_stream_struc *bs; - bs = &gfc->bs; - - assert(j < MAX_LENGTH - 2); - - while (j > 0) { - int k; - if (bs->buf_bit_idx == 0) { - bs->buf_bit_idx = 8; - bs->buf_byte_idx++; - assert(bs->buf_byte_idx < BUFFER_SIZE); - assert(esv->header[esv->w_ptr].write_timing >= bs->totbit); - if (esv->header[esv->w_ptr].write_timing == bs->totbit) { - putheader_bits(gfc); - } - bs->buf[bs->buf_byte_idx] = 0; - } - - k = Min(j, bs->buf_bit_idx); - j -= k; - - bs->buf_bit_idx -= k; - - assert(j < MAX_LENGTH); /* 32 too large on 32 bit machines */ - assert(bs->buf_bit_idx < MAX_LENGTH); - - bs->buf[bs->buf_byte_idx] |= ((val >> j) << bs->buf_bit_idx); - bs->totbit += k; - } -} - -/*write j bits into the bit stream, ignoring frame headers */ -inline static void -putbits_noheaders(lame_internal_flags * gfc, int val, int j) -{ - Bit_stream_struc *bs; - bs = &gfc->bs; - - assert(j < MAX_LENGTH - 2); - - while (j > 0) { - int k; - if (bs->buf_bit_idx == 0) { - bs->buf_bit_idx = 8; - bs->buf_byte_idx++; - assert(bs->buf_byte_idx < BUFFER_SIZE); - bs->buf[bs->buf_byte_idx] = 0; - } - - k = Min(j, bs->buf_bit_idx); - j -= k; - - bs->buf_bit_idx -= k; - - assert(j < MAX_LENGTH); /* 32 too large on 32 bit machines */ - assert(bs->buf_bit_idx < MAX_LENGTH); - - bs->buf[bs->buf_byte_idx] |= ((val >> j) << bs->buf_bit_idx); - bs->totbit += k; - } -} - - -/* - Some combinations of bitrate, Fs, and stereo make it impossible to stuff - out a frame using just main_data, due to the limited number of bits to - indicate main_data_length. In these situations, we put stuffing bits into - the ancillary data... -*/ - -inline static void -drain_into_ancillary(lame_internal_flags * gfc, int remainingBits) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - EncStateVar_t *const esv = &gfc->sv_enc; - int i; - assert(remainingBits >= 0); - - if (remainingBits >= 8) { - putbits2(gfc, 0x4c, 8); - remainingBits -= 8; - } - if (remainingBits >= 8) { - putbits2(gfc, 0x41, 8); - remainingBits -= 8; - } - if (remainingBits >= 8) { - putbits2(gfc, 0x4d, 8); - remainingBits -= 8; - } - if (remainingBits >= 8) { - putbits2(gfc, 0x45, 8); - remainingBits -= 8; - } - - if (remainingBits >= 32) { - const char *const version = get_lame_short_version(); - if (remainingBits >= 32) - for (i = 0; i < (int) strlen(version) && remainingBits >= 8; ++i) { - remainingBits -= 8; - putbits2(gfc, version[i], 8); - } - } - - for (; remainingBits >= 1; remainingBits -= 1) { - putbits2(gfc, esv->ancillary_flag, 1); - esv->ancillary_flag ^= !cfg->disable_reservoir; - } - - assert(remainingBits == 0); - -} - -/*write N bits into the header */ -inline static void -writeheader(lame_internal_flags * gfc, int val, int j) -{ - EncStateVar_t *const esv = &gfc->sv_enc; - int ptr = esv->header[esv->h_ptr].ptr; - - while (j > 0) { - int const k = Min(j, 8 - (ptr & 7)); - j -= k; - assert(j < MAX_LENGTH); /* >> 32 too large for 32 bit machines */ - esv->header[esv->h_ptr].buf[ptr >> 3] - |= ((val >> j)) << (8 - (ptr & 7) - k); - ptr += k; - } - esv->header[esv->h_ptr].ptr = ptr; -} - - -static int -CRC_update(int value, int crc) -{ - int i; - value <<= 8; - for (i = 0; i < 8; i++) { - value <<= 1; - crc <<= 1; - - if (((crc ^ value) & 0x10000)) - crc ^= CRC16_POLYNOMIAL; - } - return crc; -} - - -void -CRC_writeheader(lame_internal_flags const *gfc, char *header) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - int crc = 0xffff; /* (jo) init crc16 for error_protection */ - int i; - - crc = CRC_update(((unsigned char *) header)[2], crc); - crc = CRC_update(((unsigned char *) header)[3], crc); - for (i = 6; i < cfg->sideinfo_len; i++) { - crc = CRC_update(((unsigned char *) header)[i], crc); - } - - header[4] = crc >> 8; - header[5] = crc & 255; -} - -inline static void -encodeSideInfo2(lame_internal_flags * gfc, int bitsPerFrame) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - EncResult_t const *const eov = &gfc->ov_enc; - EncStateVar_t *const esv = &gfc->sv_enc; - III_side_info_t *l3_side; - int gr, ch; - - l3_side = &gfc->l3_side; - esv->header[esv->h_ptr].ptr = 0; - memset(esv->header[esv->h_ptr].buf, 0, cfg->sideinfo_len); - if (cfg->samplerate_out < 16000) - writeheader(gfc, 0xffe, 12); - else - writeheader(gfc, 0xfff, 12); - writeheader(gfc, (cfg->version), 1); - writeheader(gfc, 4 - 3, 2); - writeheader(gfc, (!cfg->error_protection), 1); - writeheader(gfc, (eov->bitrate_index), 4); - writeheader(gfc, (cfg->samplerate_index), 2); - writeheader(gfc, (eov->padding), 1); - writeheader(gfc, (cfg->extension), 1); - writeheader(gfc, (cfg->mode), 2); - writeheader(gfc, (eov->mode_ext), 2); - writeheader(gfc, (cfg->copyright), 1); - writeheader(gfc, (cfg->original), 1); - writeheader(gfc, (cfg->emphasis), 2); - if (cfg->error_protection) { - writeheader(gfc, 0, 16); /* dummy */ - } - - if (cfg->version == 1) { - /* MPEG1 */ - assert(l3_side->main_data_begin >= 0); - writeheader(gfc, (l3_side->main_data_begin), 9); - - if (cfg->channels_out == 2) - writeheader(gfc, l3_side->private_bits, 3); - else - writeheader(gfc, l3_side->private_bits, 5); - - for (ch = 0; ch < cfg->channels_out; ch++) { - int band; - for (band = 0; band < 4; band++) { - writeheader(gfc, l3_side->scfsi[ch][band], 1); - } - } - - for (gr = 0; gr < 2; gr++) { - for (ch = 0; ch < cfg->channels_out; ch++) { - gr_info *const gi = &l3_side->tt[gr][ch]; - writeheader(gfc, gi->part2_3_length + gi->part2_length, 12); - writeheader(gfc, gi->big_values / 2, 9); - writeheader(gfc, gi->global_gain, 8); - writeheader(gfc, gi->scalefac_compress, 4); - - if (gi->block_type != NORM_TYPE) { - writeheader(gfc, 1, 1); /* window_switching_flag */ - writeheader(gfc, gi->block_type, 2); - writeheader(gfc, gi->mixed_block_flag, 1); - - if (gi->table_select[0] == 14) - gi->table_select[0] = 16; - writeheader(gfc, gi->table_select[0], 5); - if (gi->table_select[1] == 14) - gi->table_select[1] = 16; - writeheader(gfc, gi->table_select[1], 5); - - writeheader(gfc, gi->subblock_gain[0], 3); - writeheader(gfc, gi->subblock_gain[1], 3); - writeheader(gfc, gi->subblock_gain[2], 3); - } - else { - writeheader(gfc, 0, 1); /* window_switching_flag */ - if (gi->table_select[0] == 14) - gi->table_select[0] = 16; - writeheader(gfc, gi->table_select[0], 5); - if (gi->table_select[1] == 14) - gi->table_select[1] = 16; - writeheader(gfc, gi->table_select[1], 5); - if (gi->table_select[2] == 14) - gi->table_select[2] = 16; - writeheader(gfc, gi->table_select[2], 5); - - assert(0 <= gi->region0_count && gi->region0_count < 16); - assert(0 <= gi->region1_count && gi->region1_count < 8); - writeheader(gfc, gi->region0_count, 4); - writeheader(gfc, gi->region1_count, 3); - } - writeheader(gfc, gi->preflag, 1); - writeheader(gfc, gi->scalefac_scale, 1); - writeheader(gfc, gi->count1table_select, 1); - } - } - } - else { - /* MPEG2 */ - assert(l3_side->main_data_begin >= 0); - writeheader(gfc, (l3_side->main_data_begin), 8); - writeheader(gfc, l3_side->private_bits, cfg->channels_out); - - gr = 0; - for (ch = 0; ch < cfg->channels_out; ch++) { - gr_info *const gi = &l3_side->tt[gr][ch]; - writeheader(gfc, gi->part2_3_length + gi->part2_length, 12); - writeheader(gfc, gi->big_values / 2, 9); - writeheader(gfc, gi->global_gain, 8); - writeheader(gfc, gi->scalefac_compress, 9); - - if (gi->block_type != NORM_TYPE) { - writeheader(gfc, 1, 1); /* window_switching_flag */ - writeheader(gfc, gi->block_type, 2); - writeheader(gfc, gi->mixed_block_flag, 1); - - if (gi->table_select[0] == 14) - gi->table_select[0] = 16; - writeheader(gfc, gi->table_select[0], 5); - if (gi->table_select[1] == 14) - gi->table_select[1] = 16; - writeheader(gfc, gi->table_select[1], 5); - - writeheader(gfc, gi->subblock_gain[0], 3); - writeheader(gfc, gi->subblock_gain[1], 3); - writeheader(gfc, gi->subblock_gain[2], 3); - } - else { - writeheader(gfc, 0, 1); /* window_switching_flag */ - if (gi->table_select[0] == 14) - gi->table_select[0] = 16; - writeheader(gfc, gi->table_select[0], 5); - if (gi->table_select[1] == 14) - gi->table_select[1] = 16; - writeheader(gfc, gi->table_select[1], 5); - if (gi->table_select[2] == 14) - gi->table_select[2] = 16; - writeheader(gfc, gi->table_select[2], 5); - - assert(0 <= gi->region0_count && gi->region0_count < 16); - assert(0 <= gi->region1_count && gi->region1_count < 8); - writeheader(gfc, gi->region0_count, 4); - writeheader(gfc, gi->region1_count, 3); - } - - writeheader(gfc, gi->scalefac_scale, 1); - writeheader(gfc, gi->count1table_select, 1); - } - } - - if (cfg->error_protection) { - /* (jo) error_protection: add crc16 information to header */ - CRC_writeheader(gfc, esv->header[esv->h_ptr].buf); - } - - { - int const old = esv->h_ptr; - assert(esv->header[old].ptr == cfg->sideinfo_len * 8); - - esv->h_ptr = (old + 1) & (MAX_HEADER_BUF - 1); - esv->header[esv->h_ptr].write_timing = esv->header[old].write_timing + bitsPerFrame; - - if (esv->h_ptr == esv->w_ptr) { - /* yikes! we are out of header buffer space */ - ERRORF(gfc, "Error: MAX_HEADER_BUF too small in bitstream.c \n"); - } - - } -} - - -inline static int -huffman_coder_count1(lame_internal_flags * gfc, gr_info const *gi) -{ - /* Write count1 area */ - struct huffcodetab const *const h = &ht[gi->count1table_select + 32]; - int i, bits = 0; -#ifdef DEBUG - int gegebo = gfc->bs.totbit; -#endif - - int const *ix = &gi->l3_enc[gi->big_values]; - FLOAT const *xr = &gi->xr[gi->big_values]; - assert(gi->count1table_select < 2); - - for (i = (gi->count1 - gi->big_values) / 4; i > 0; --i) { - int huffbits = 0; - int p = 0, v; - - v = ix[0]; - if (v) { - p += 8; - if (xr[0] < 0.0f) - huffbits++; - assert(v <= 1); - } - - v = ix[1]; - if (v) { - p += 4; - huffbits *= 2; - if (xr[1] < 0.0f) - huffbits++; - assert(v <= 1); - } - - v = ix[2]; - if (v) { - p += 2; - huffbits *= 2; - if (xr[2] < 0.0f) - huffbits++; - assert(v <= 1); - } - - v = ix[3]; - if (v) { - p++; - huffbits *= 2; - if (xr[3] < 0.0f) - huffbits++; - assert(v <= 1); - } - - ix += 4; - xr += 4; - putbits2(gfc, huffbits + h->table[p], h->hlen[p]); - bits += h->hlen[p]; - } -#ifdef DEBUG - DEBUGF(gfc, "count1: real: %ld counted:%d (bigv %d count1len %d)\n", - gfc->bs.totbit - gegebo, gi->count1bits, gi->big_values, gi->count1); -#endif - return bits; -} - - - -/* - Implements the pseudocode of page 98 of the IS - */ -inline static int -Huffmancode(lame_internal_flags * const gfc, const unsigned int tableindex, - int start, int end, gr_info const *gi) -{ - struct huffcodetab const *const h = &ht[tableindex]; - unsigned int const linbits = h->xlen; - int i, bits = 0; - - assert(tableindex < 32u); - if (!tableindex) - return bits; - - for (i = start; i < end; i += 2) { - int16_t cbits = 0; - uint16_t xbits = 0; - unsigned int xlen = h->xlen; - unsigned int ext = 0; - unsigned int x1 = gi->l3_enc[i]; - unsigned int x2 = gi->l3_enc[i + 1]; - - assert(gi->l3_enc[i] >= 0); - assert(gi->l3_enc[i+1] >= 0); - - if (x1 != 0u) { - if (gi->xr[i] < 0.0f) - ext++; - cbits--; - } - - if (tableindex > 15u) { - /* use ESC-words */ - if (x1 >= 15u) { - uint16_t const linbits_x1 = x1 - 15u; - assert(linbits_x1 <= h->linmax); - ext |= linbits_x1 << 1u; - xbits = linbits; - x1 = 15u; - } - - if (x2 >= 15u) { - uint16_t const linbits_x2 = x2 - 15u; - assert(linbits_x2 <= h->linmax); - ext <<= linbits; - ext |= linbits_x2; - xbits += linbits; - x2 = 15u; - } - xlen = 16; - } - - if (x2 != 0u) { - ext <<= 1; - if (gi->xr[i + 1] < 0.0f) - ext++; - cbits--; - } - - assert((x1 | x2) < 16u); - - x1 = x1 * xlen + x2; - xbits -= cbits; - cbits += h->hlen[x1]; - - assert(cbits <= MAX_LENGTH); - assert(xbits <= MAX_LENGTH); - - putbits2(gfc, h->table[x1], cbits); - putbits2(gfc, (int)ext, xbits); - bits += cbits + xbits; - } - return bits; -} - -/* - Note the discussion of huffmancodebits() on pages 28 - and 29 of the IS, as well as the definitions of the side - information on pages 26 and 27. - */ -static int -ShortHuffmancodebits(lame_internal_flags * gfc, gr_info const *gi) -{ - int bits; - int region1Start; - - region1Start = 3 * gfc->scalefac_band.s[3]; - if (region1Start > gi->big_values) - region1Start = gi->big_values; - - /* short blocks do not have a region2 */ - bits = Huffmancode(gfc, gi->table_select[0], 0, region1Start, gi); - bits += Huffmancode(gfc, gi->table_select[1], region1Start, gi->big_values, gi); - return bits; -} - -static int -LongHuffmancodebits(lame_internal_flags * gfc, gr_info const *gi) -{ - unsigned int i; - int bigvalues, bits; - int region1Start, region2Start; - - bigvalues = gi->big_values; - assert(0 <= bigvalues && bigvalues <= 576); - - assert(gi->region0_count >= -1); - assert(gi->region1_count >= -1); - i = gi->region0_count + 1; - assert((size_t) i < dimension_of(gfc->scalefac_band.l)); - region1Start = gfc->scalefac_band.l[i]; - i += gi->region1_count + 1; - assert((size_t) i < dimension_of(gfc->scalefac_band.l)); - region2Start = gfc->scalefac_band.l[i]; - - if (region1Start > bigvalues) - region1Start = bigvalues; - - if (region2Start > bigvalues) - region2Start = bigvalues; - - bits = Huffmancode(gfc, gi->table_select[0], 0, region1Start, gi); - bits += Huffmancode(gfc, gi->table_select[1], region1Start, region2Start, gi); - bits += Huffmancode(gfc, gi->table_select[2], region2Start, bigvalues, gi); - return bits; -} - -inline static int -writeMainData(lame_internal_flags * const gfc) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - III_side_info_t const *const l3_side = &gfc->l3_side; - int gr, ch, sfb, data_bits, tot_bits = 0; - - if (cfg->version == 1) { - /* MPEG 1 */ - for (gr = 0; gr < 2; gr++) { - for (ch = 0; ch < cfg->channels_out; ch++) { - gr_info const *const gi = &l3_side->tt[gr][ch]; - int const slen1 = slen1_tab[gi->scalefac_compress]; - int const slen2 = slen2_tab[gi->scalefac_compress]; - data_bits = 0; -#ifdef DEBUG - hogege = gfc->bs.totbit; -#endif - for (sfb = 0; sfb < gi->sfbdivide; sfb++) { - if (gi->scalefac[sfb] == -1) - continue; /* scfsi is used */ - putbits2(gfc, gi->scalefac[sfb], slen1); - data_bits += slen1; - } - for (; sfb < gi->sfbmax; sfb++) { - if (gi->scalefac[sfb] == -1) - continue; /* scfsi is used */ - putbits2(gfc, gi->scalefac[sfb], slen2); - data_bits += slen2; - } - assert(data_bits == gi->part2_length); - - if (gi->block_type == SHORT_TYPE) { - data_bits += ShortHuffmancodebits(gfc, gi); - } - else { - data_bits += LongHuffmancodebits(gfc, gi); - } - data_bits += huffman_coder_count1(gfc, gi); -#ifdef DEBUG - DEBUGF(gfc, "<%ld> ", gfc->bs.totbit - hogege); -#endif - /* does bitcount in quantize.c agree with actual bit count? */ - assert(data_bits == gi->part2_3_length + gi->part2_length); - tot_bits += data_bits; - } /* for ch */ - } /* for gr */ - } - else { - /* MPEG 2 */ - gr = 0; - for (ch = 0; ch < cfg->channels_out; ch++) { - gr_info const *const gi = &l3_side->tt[gr][ch]; - int i, sfb_partition, scale_bits = 0; - assert(gi->sfb_partition_table); - data_bits = 0; -#ifdef DEBUG - hogege = gfc->bs.totbit; -#endif - sfb = 0; - sfb_partition = 0; - - if (gi->block_type == SHORT_TYPE) { - for (; sfb_partition < 4; sfb_partition++) { - int const sfbs = gi->sfb_partition_table[sfb_partition] / 3; - int const slen = gi->slen[sfb_partition]; - for (i = 0; i < sfbs; i++, sfb++) { - putbits2(gfc, Max(gi->scalefac[sfb * 3 + 0], 0), slen); - putbits2(gfc, Max(gi->scalefac[sfb * 3 + 1], 0), slen); - putbits2(gfc, Max(gi->scalefac[sfb * 3 + 2], 0), slen); - scale_bits += 3 * slen; - } - } - data_bits += ShortHuffmancodebits(gfc, gi); - } - else { - for (; sfb_partition < 4; sfb_partition++) { - int const sfbs = gi->sfb_partition_table[sfb_partition]; - int const slen = gi->slen[sfb_partition]; - for (i = 0; i < sfbs; i++, sfb++) { - putbits2(gfc, Max(gi->scalefac[sfb], 0), slen); - scale_bits += slen; - } - } - data_bits += LongHuffmancodebits(gfc, gi); - } - data_bits += huffman_coder_count1(gfc, gi); -#ifdef DEBUG - DEBUGF(gfc, "<%ld> ", gfc->bs.totbit - hogege); -#endif - /* does bitcount in quantize.c agree with actual bit count? */ - assert(data_bits == gi->part2_3_length); - assert(scale_bits == gi->part2_length); - tot_bits += scale_bits + data_bits; - } /* for ch */ - } /* for gf */ - return tot_bits; -} /* main_data */ - - - -/* compute the number of bits required to flush all mp3 frames - currently in the buffer. This should be the same as the - reservoir size. Only call this routine between frames - i.e. - only after all headers and data have been added to the buffer - by format_bitstream(). - - Also compute total_bits_output = - size of mp3 buffer (including frame headers which may not - have yet been send to the mp3 buffer) + - number of bits needed to flush all mp3 frames. - - total_bytes_output is the size of the mp3 output buffer if - lame_encode_flush_nogap() was called right now. - - */ -int -compute_flushbits(const lame_internal_flags * gfc, int *total_bytes_output) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - EncStateVar_t const *const esv = &gfc->sv_enc; - int flushbits, remaining_headers; - int bitsPerFrame; - int last_ptr, first_ptr; - first_ptr = esv->w_ptr; /* first header to add to bitstream */ - last_ptr = esv->h_ptr - 1; /* last header to add to bitstream */ - if (last_ptr == -1) - last_ptr = MAX_HEADER_BUF - 1; - - /* add this many bits to bitstream so we can flush all headers */ - flushbits = esv->header[last_ptr].write_timing - gfc->bs.totbit; - *total_bytes_output = flushbits; - - if (flushbits >= 0) { - /* if flushbits >= 0, some headers have not yet been written */ - /* reduce flushbits by the size of the headers */ - remaining_headers = 1 + last_ptr - first_ptr; - if (last_ptr < first_ptr) - remaining_headers = 1 + last_ptr - first_ptr + MAX_HEADER_BUF; - flushbits -= remaining_headers * 8 * cfg->sideinfo_len; - } - - - /* finally, add some bits so that the last frame is complete - * these bits are not necessary to decode the last frame, but - * some decoders will ignore last frame if these bits are missing - */ - bitsPerFrame = getframebits(gfc); - flushbits += bitsPerFrame; - *total_bytes_output += bitsPerFrame; - /* round up: */ - if (*total_bytes_output % 8) - *total_bytes_output = 1 + (*total_bytes_output / 8); - else - *total_bytes_output = (*total_bytes_output / 8); - *total_bytes_output += gfc->bs.buf_byte_idx + 1; - - - if (flushbits < 0) { -#if 0 - /* if flushbits < 0, this would mean that the buffer looks like: - * (data...) last_header (data...) (extra data that should not be here...) - */ - DEBUGF(gfc, "last header write_timing = %i \n", esv->header[last_ptr].write_timing); - DEBUGF(gfc, "first header write_timing = %i \n", esv->header[first_ptr].write_timing); - DEBUGF(gfc, "bs.totbit: %i \n", gfc->bs.totbit); - DEBUGF(gfc, "first_ptr, last_ptr %i %i \n", first_ptr, last_ptr); - DEBUGF(gfc, "remaining_headers = %i \n", remaining_headers); - DEBUGF(gfc, "bitsperframe: %i \n", bitsPerFrame); - DEBUGF(gfc, "sidelen: %i \n", cfg->sideinfo_len); -#endif - ERRORF(gfc, "strange error flushing buffer ... \n"); - } - return flushbits; -} - - -void -flush_bitstream(lame_internal_flags * gfc) -{ - EncStateVar_t *const esv = &gfc->sv_enc; - III_side_info_t *l3_side; - int nbytes; - int flushbits; - int last_ptr = esv->h_ptr - 1; /* last header to add to bitstream */ - if (last_ptr == -1) - last_ptr = MAX_HEADER_BUF - 1; - l3_side = &gfc->l3_side; - - - if ((flushbits = compute_flushbits(gfc, &nbytes)) < 0) - return; - drain_into_ancillary(gfc, flushbits); - - /* check that the 100% of the last frame has been written to bitstream */ - assert(esv->header[last_ptr].write_timing + getframebits(gfc) - == gfc->bs.totbit); - - /* we have padded out all frames with ancillary data, which is the - same as filling the bitreservoir with ancillary data, so : */ - esv->ResvSize = 0; - l3_side->main_data_begin = 0; -} - - - - -void -add_dummy_byte(lame_internal_flags * gfc, unsigned char val, unsigned int n) -{ - EncStateVar_t *const esv = &gfc->sv_enc; - int i; - - while (n-- > 0u) { - putbits_noheaders(gfc, val, 8); - - for (i = 0; i < MAX_HEADER_BUF; ++i) - esv->header[i].write_timing += 8; - } -} - - -/* - format_bitstream() - - This is called after a frame of audio has been quantized and coded. - It will write the encoded audio to the bitstream. Note that - from a layer3 encoder's perspective the bit stream is primarily - a series of main_data() blocks, with header and side information - inserted at the proper locations to maintain framing. (See Figure A.7 - in the IS). - */ -int -format_bitstream(lame_internal_flags * gfc) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - EncStateVar_t *const esv = &gfc->sv_enc; - int bits, nbytes; - III_side_info_t *l3_side; - int bitsPerFrame; - l3_side = &gfc->l3_side; - - bitsPerFrame = getframebits(gfc); - drain_into_ancillary(gfc, l3_side->resvDrain_pre); - - encodeSideInfo2(gfc, bitsPerFrame); - bits = 8 * cfg->sideinfo_len; - bits += writeMainData(gfc); - drain_into_ancillary(gfc, l3_side->resvDrain_post); - bits += l3_side->resvDrain_post; - - l3_side->main_data_begin += (bitsPerFrame - bits) / 8; - - /* compare number of bits needed to clear all buffered mp3 frames - * with what we think the resvsize is: */ - if (compute_flushbits(gfc, &nbytes) != esv->ResvSize) { - ERRORF(gfc, "Internal buffer inconsistency. flushbits <> ResvSize"); - } - - - /* compare main_data_begin for the next frame with what we - * think the resvsize is: */ - if ((l3_side->main_data_begin * 8) != esv->ResvSize) { - ERRORF(gfc, "bit reservoir error: \n" - "l3_side->main_data_begin: %i \n" - "Resvoir size: %i \n" - "resv drain (post) %i \n" - "resv drain (pre) %i \n" - "header and sideinfo: %i \n" - "data bits: %i \n" - "total bits: %i (remainder: %i) \n" - "bitsperframe: %i \n", - 8 * l3_side->main_data_begin, - esv->ResvSize, - l3_side->resvDrain_post, - l3_side->resvDrain_pre, - 8 * cfg->sideinfo_len, - bits - l3_side->resvDrain_post - 8 * cfg->sideinfo_len, - bits, bits % 8, bitsPerFrame); - - ERRORF(gfc, "This is a fatal error. It has several possible causes:"); - ERRORF(gfc, "90%% LAME compiled with buggy version of gcc using advanced optimizations"); - ERRORF(gfc, " 9%% Your system is overclocked"); - ERRORF(gfc, " 1%% bug in LAME encoding library"); - - esv->ResvSize = l3_side->main_data_begin * 8; - }; - assert(gfc->bs.totbit % 8 == 0); - - if (gfc->bs.totbit > 1000000000) { - /* to avoid totbit overflow, (at 8h encoding at 128kbs) lets reset bit counter */ - int i; - for (i = 0; i < MAX_HEADER_BUF; ++i) - esv->header[i].write_timing -= gfc->bs.totbit; - gfc->bs.totbit = 0; - } - - - return 0; -} - - -static int -do_gain_analysis(lame_internal_flags * gfc, unsigned char* buffer, int minimum) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - RpgStateVar_t const *const rsv = &gfc->sv_rpg; - RpgResult_t *const rov = &gfc->ov_rpg; -#ifdef DECODE_ON_THE_FLY - if (cfg->decode_on_the_fly) { /* decode the frame */ - sample_t pcm_buf[2][1152]; - int mp3_in = minimum; - int samples_out = -1; - - /* re-synthesis to pcm. Repeat until we get a samples_out=0 */ - while (samples_out != 0) { - - samples_out = hip_decode1_unclipped(gfc->hip, buffer, mp3_in, pcm_buf[0], pcm_buf[1]); - /* samples_out = 0: need more data to decode - * samples_out = -1: error. Lets assume 0 pcm output - * samples_out = number of samples output */ - - /* set the lenght of the mp3 input buffer to zero, so that in the - * next iteration of the loop we will be querying mpglib about - * buffered data */ - mp3_in = 0; - - if (samples_out == -1) { - /* error decoding. Not fatal, but might screw up - * the ReplayGain tag. What should we do? Ignore for now */ - samples_out = 0; - } - if (samples_out > 0) { - /* process the PCM data */ - - /* this should not be possible, and indicates we have - * overflown the pcm_buf buffer */ - assert(samples_out <= 1152); - - if (cfg->findPeakSample) { - int i; - /* FIXME: is this correct? maybe Max(fabs(pcm),PeakSample) */ - for (i = 0; i < samples_out; i++) { - if (pcm_buf[0][i] > rov->PeakSample) - rov->PeakSample = pcm_buf[0][i]; - else if (-pcm_buf[0][i] > rov->PeakSample) - rov->PeakSample = -pcm_buf[0][i]; - } - if (cfg->channels_out > 1) - for (i = 0; i < samples_out; i++) { - if (pcm_buf[1][i] > rov->PeakSample) - rov->PeakSample = pcm_buf[1][i]; - else if (-pcm_buf[1][i] > rov->PeakSample) - rov->PeakSample = -pcm_buf[1][i]; - } - } - - if (cfg->findReplayGain) - if (AnalyzeSamples - (rsv->rgdata, pcm_buf[0], pcm_buf[1], samples_out, - cfg->channels_out) == GAIN_ANALYSIS_ERROR) - return -6; - - } /* if (samples_out>0) */ - } /* while (samples_out!=0) */ - } /* if (gfc->decode_on_the_fly) */ -#endif - return minimum; -} - -static int -do_copy_buffer(lame_internal_flags * gfc, unsigned char *buffer, int size) -{ - Bit_stream_struc *const bs = &gfc->bs; - int const minimum = bs->buf_byte_idx + 1; - if (minimum <= 0) - return 0; - if (minimum > size) - return -1; /* buffer is too small */ - memcpy(buffer, bs->buf, minimum); - bs->buf_byte_idx = -1; - bs->buf_bit_idx = 0; - return minimum; -} - -/* copy data out of the internal MP3 bit buffer into a user supplied - unsigned char buffer. - - mp3data=0 indicates data in buffer is an id3tags and VBR tags - mp3data=1 data is real mp3 frame data. - - -*/ -int -copy_buffer(lame_internal_flags * gfc, unsigned char *buffer, int size, int mp3data) -{ - int const minimum = do_copy_buffer(gfc, buffer, size); - if (minimum > 0 && mp3data) { - UpdateMusicCRC(&gfc->nMusicCRC, buffer, minimum); - - /** sum number of bytes belonging to the mp3 stream - * this info will be written into the Xing/LAME header for seeking - */ - gfc->VBR_seek_table.nBytesWritten += minimum; - - return do_gain_analysis(gfc, buffer, minimum); - } /* if (mp3data) */ - return minimum; -} - - -void -init_bit_stream_w(lame_internal_flags * gfc) -{ - EncStateVar_t *const esv = &gfc->sv_enc; - - esv->h_ptr = esv->w_ptr = 0; - esv->header[esv->h_ptr].write_timing = 0; - - gfc->bs.buf = lame_calloc(unsigned char, BUFFER_SIZE); - gfc->bs.buf_size = BUFFER_SIZE; - gfc->bs.buf_byte_idx = -1; - gfc->bs.buf_bit_idx = 0; - gfc->bs.totbit = 0; -} - -/* end of bitstream.c */ diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/bitstream.h b/recorderlib/src/main/jni/lame-3.100_libmp3lame/bitstream.h deleted file mode 100644 index 3ae48d0..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/bitstream.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * MP3 bitstream Output interface for LAME - * - * Copyright (c) 1999 Takehiro TOMINAGA - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef LAME_BITSTREAM_H -#define LAME_BITSTREAM_H - -int getframebits(const lame_internal_flags * gfc); - -int format_bitstream(lame_internal_flags * gfc); - -void flush_bitstream(lame_internal_flags * gfc); -void add_dummy_byte(lame_internal_flags * gfc, unsigned char val, unsigned int n); - -int copy_buffer(lame_internal_flags * gfc, unsigned char *buffer, int buffer_size, - int update_crc); -void init_bit_stream_w(lame_internal_flags * gfc); -void CRC_writeheader(lame_internal_flags const *gfc, char *buffer); -int compute_flushbits(const lame_internal_flags * gfp, int *nbytes); - -int get_max_frame_buffer_size_by_constraint(SessionConfig_t const * cfg, int constraint); - -#endif diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/encoder.c b/recorderlib/src/main/jni/lame-3.100_libmp3lame/encoder.c deleted file mode 100644 index 48f46c7..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/encoder.c +++ /dev/null @@ -1,574 +0,0 @@ -/* - * LAME MP3 encoding engine - * - * Copyright (c) 1999 Mark Taylor - * Copyright (c) 2000-2002 Takehiro Tominaga - * Copyright (c) 2000-2011 Robert Hegemann - * Copyright (c) 2001 Gabriel Bouvigne - * Copyright (c) 2001 John Dahlstrom - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* $Id: encoder.c,v 1.114 2017/08/26 10:54:57 robert Exp $ */ - -#ifdef HAVE_CONFIG_H -#include -#endif - - -#include "lame.h" -#include "machine.h" -#include "encoder.h" -#include "util.h" -#include "lame_global_flags.h" -#include "newmdct.h" -#include "psymodel.h" -#include "lame-analysis.h" -#include "bitstream.h" -#include "VbrTag.h" -#include "quantize.h" -#include "quantize_pvt.h" - - - -/* - * auto-adjust of ATH, useful for low volume - * Gabriel Bouvigne 3 feb 2001 - * - * modifies some values in - * gfp->internal_flags->ATH - * (gfc->ATH) - */ -static void -adjust_ATH(lame_internal_flags const *const gfc) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - FLOAT gr2_max, max_pow; - - if (gfc->ATH->use_adjust == 0) { - gfc->ATH->adjust_factor = 1.0; /* no adjustment */ - return; - } - - /* jd - 2001 mar 12, 27, jun 30 */ - /* loudness based on equal loudness curve; */ - /* use granule with maximum combined loudness */ - max_pow = gfc->ov_psy.loudness_sq[0][0]; - gr2_max = gfc->ov_psy.loudness_sq[1][0]; - if (cfg->channels_out == 2) { - max_pow += gfc->ov_psy.loudness_sq[0][1]; - gr2_max += gfc->ov_psy.loudness_sq[1][1]; - } - else { - max_pow += max_pow; - gr2_max += gr2_max; - } - if (cfg->mode_gr == 2) { - max_pow = Max(max_pow, gr2_max); - } - max_pow *= 0.5; /* max_pow approaches 1.0 for full band noise */ - - /* jd - 2001 mar 31, jun 30 */ - /* user tuning of ATH adjustment region */ - max_pow *= gfc->ATH->aa_sensitivity_p; - - /* adjust ATH depending on range of maximum value - */ - - /* jd - 2001 feb27, mar12,20, jun30, jul22 */ - /* continuous curves based on approximation */ - /* to GB's original values. */ - /* For an increase in approximate loudness, */ - /* set ATH adjust to adjust_limit immediately */ - /* after a delay of one frame. */ - /* For a loudness decrease, reduce ATH adjust */ - /* towards adjust_limit gradually. */ - /* max_pow is a loudness squared or a power. */ - if (max_pow > 0.03125) { /* ((1 - 0.000625)/ 31.98) from curve below */ - if (gfc->ATH->adjust_factor >= 1.0) { - gfc->ATH->adjust_factor = 1.0; - } - else { - /* preceding frame has lower ATH adjust; */ - /* ascend only to the preceding adjust_limit */ - /* in case there is leading low volume */ - if (gfc->ATH->adjust_factor < gfc->ATH->adjust_limit) { - gfc->ATH->adjust_factor = gfc->ATH->adjust_limit; - } - } - gfc->ATH->adjust_limit = 1.0; - } - else { /* adjustment curve */ - /* about 32 dB maximum adjust (0.000625) */ - FLOAT const adj_lim_new = 31.98 * max_pow + 0.000625; - if (gfc->ATH->adjust_factor >= adj_lim_new) { /* descend gradually */ - gfc->ATH->adjust_factor *= adj_lim_new * 0.075 + 0.925; - if (gfc->ATH->adjust_factor < adj_lim_new) { /* stop descent */ - gfc->ATH->adjust_factor = adj_lim_new; - } - } - else { /* ascend */ - if (gfc->ATH->adjust_limit >= adj_lim_new) { - gfc->ATH->adjust_factor = adj_lim_new; - } - else { /* preceding frame has lower ATH adjust; */ - /* ascend only to the preceding adjust_limit */ - if (gfc->ATH->adjust_factor < gfc->ATH->adjust_limit) { - gfc->ATH->adjust_factor = gfc->ATH->adjust_limit; - } - } - } - gfc->ATH->adjust_limit = adj_lim_new; - } -} - -/*********************************************************************** - * - * some simple statistics - * - * bitrate index 0: free bitrate -> not allowed in VBR mode - * : bitrates, kbps depending on MPEG version - * bitrate index 15: forbidden - * - * mode_ext: - * 0: LR - * 1: LR-i - * 2: MS - * 3: MS-i - * - ***********************************************************************/ - -static void -updateStats(lame_internal_flags * const gfc) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - EncResult_t *eov = &gfc->ov_enc; - int gr, ch; - assert(0 <= eov->bitrate_index && eov->bitrate_index < 16); - assert(0 <= eov->mode_ext && eov->mode_ext < 4); - - /* count bitrate indices */ - eov->bitrate_channelmode_hist[eov->bitrate_index][4]++; - eov->bitrate_channelmode_hist[15][4]++; - - /* count 'em for every mode extension in case of 2 channel encoding */ - if (cfg->channels_out == 2) { - eov->bitrate_channelmode_hist[eov->bitrate_index][eov->mode_ext]++; - eov->bitrate_channelmode_hist[15][eov->mode_ext]++; - } - for (gr = 0; gr < cfg->mode_gr; ++gr) { - for (ch = 0; ch < cfg->channels_out; ++ch) { - int bt = gfc->l3_side.tt[gr][ch].block_type; - if (gfc->l3_side.tt[gr][ch].mixed_block_flag) - bt = 4; - eov->bitrate_blocktype_hist[eov->bitrate_index][bt]++; - eov->bitrate_blocktype_hist[eov->bitrate_index][5]++; - eov->bitrate_blocktype_hist[15][bt]++; - eov->bitrate_blocktype_hist[15][5]++; - } - } -} - - - - -static void -lame_encode_frame_init(lame_internal_flags * gfc, const sample_t *const inbuf[2]) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - - int ch, gr; - - if (gfc->lame_encode_frame_init == 0) { - sample_t primebuff0[286 + 1152 + 576]; - sample_t primebuff1[286 + 1152 + 576]; - int const framesize = 576 * cfg->mode_gr; - /* prime the MDCT/polyphase filterbank with a short block */ - int i, j; - gfc->lame_encode_frame_init = 1; - memset(primebuff0, 0, sizeof(primebuff0)); - memset(primebuff1, 0, sizeof(primebuff1)); - for (i = 0, j = 0; i < 286 + 576 * (1 + cfg->mode_gr); ++i) { - if (i < framesize) { - primebuff0[i] = 0; - if (cfg->channels_out == 2) - primebuff1[i] = 0; - } - else { - primebuff0[i] = inbuf[0][j]; - if (cfg->channels_out == 2) - primebuff1[i] = inbuf[1][j]; - ++j; - } - } - /* polyphase filtering / mdct */ - for (gr = 0; gr < cfg->mode_gr; gr++) { - for (ch = 0; ch < cfg->channels_out; ch++) { - gfc->l3_side.tt[gr][ch].block_type = SHORT_TYPE; - } - } - mdct_sub48(gfc, primebuff0, primebuff1); - - /* check FFT will not use a negative starting offset */ -#if 576 < FFTOFFSET -# error FFTOFFSET greater than 576: FFT uses a negative offset -#endif - /* check if we have enough data for FFT */ - assert(gfc->sv_enc.mf_size >= (BLKSIZE + framesize - FFTOFFSET)); - /* check if we have enough data for polyphase filterbank */ - assert(gfc->sv_enc.mf_size >= (512 + framesize - 32)); - } - -} - - - - - - - -/************************************************************************ -* -* encodeframe() Layer 3 -* -* encode a single frame -* -************************************************************************ -lame_encode_frame() - - - gr 0 gr 1 -inbuf: |--------------|--------------|--------------| - - -Polyphase (18 windows, each shifted 32) -gr 0: -window1 <----512----> -window18 <----512----> - -gr 1: -window1 <----512----> -window18 <----512----> - - - -MDCT output: |--------------|--------------|--------------| - -FFT's <---------1024----------> - <---------1024--------> - - - - inbuf = buffer of PCM data size=MP3 framesize - encoder acts on inbuf[ch][0], but output is delayed by MDCTDELAY - so the MDCT coefficints are from inbuf[ch][-MDCTDELAY] - - psy-model FFT has a 1 granule delay, so we feed it data for the - next granule. - FFT is centered over granule: 224+576+224 - So FFT starts at: 576-224-MDCTDELAY - - MPEG2: FFT ends at: BLKSIZE+576-224-MDCTDELAY (1328) - MPEG1: FFT ends at: BLKSIZE+2*576-224-MDCTDELAY (1904) - - MPEG2: polyphase first window: [0..511] - 18th window: [544..1055] (1056) - MPEG1: 36th window: [1120..1631] (1632) - data needed: 512+framesize-32 - - A close look newmdct.c shows that the polyphase filterbank - only uses data from [0..510] for each window. Perhaps because the window - used by the filterbank is zero for the last point, so Takehiro's - code doesn't bother to compute with it. - - FFT starts at 576-224-MDCTDELAY (304) = 576-FFTOFFSET - -*/ - -typedef FLOAT chgrdata[2][2]; - - -int -lame_encode_mp3_frame( /* Output */ - lame_internal_flags * gfc, /* Context */ - sample_t const *inbuf_l, /* Input */ - sample_t const *inbuf_r, /* Input */ - unsigned char *mp3buf, /* Output */ - int mp3buf_size) -{ /* Output */ - SessionConfig_t const *const cfg = &gfc->cfg; - int mp3count; - III_psy_ratio masking_LR[2][2]; /*LR masking & energy */ - III_psy_ratio masking_MS[2][2]; /*MS masking & energy */ - const III_psy_ratio (*masking)[2]; /*pointer to selected maskings */ - const sample_t *inbuf[2]; - - FLOAT tot_ener[2][4]; - FLOAT ms_ener_ratio[2] = { .5, .5 }; - FLOAT pe[2][2] = { {0., 0.}, {0., 0.} }, pe_MS[2][2] = { { - 0., 0.}, { - 0., 0.}}; - FLOAT (*pe_use)[2]; - - int ch, gr; - - inbuf[0] = inbuf_l; - inbuf[1] = inbuf_r; - - if (gfc->lame_encode_frame_init == 0) { - /*first run? */ - lame_encode_frame_init(gfc, inbuf); - - } - - - /********************** padding *****************************/ - /* padding method as described in - * "MPEG-Layer3 / Bitstream Syntax and Decoding" - * by Martin Sieler, Ralph Sperschneider - * - * note: there is no padding for the very first frame - * - * Robert Hegemann 2000-06-22 - */ - gfc->ov_enc.padding = FALSE; - if ((gfc->sv_enc.slot_lag -= gfc->sv_enc.frac_SpF) < 0) { - gfc->sv_enc.slot_lag += cfg->samplerate_out; - gfc->ov_enc.padding = TRUE; - } - - - - /**************************************** - * Stage 1: psychoacoustic model * - ****************************************/ - - { - /* psychoacoustic model - * psy model has a 1 granule (576) delay that we must compensate for - * (mt 6/99). - */ - int ret; - const sample_t *bufp[2] = {0, 0}; /* address of beginning of left & right granule */ - int blocktype[2]; - - for (gr = 0; gr < cfg->mode_gr; gr++) { - - for (ch = 0; ch < cfg->channels_out; ch++) { - bufp[ch] = &inbuf[ch][576 + gr * 576 - FFTOFFSET]; - } - ret = L3psycho_anal_vbr(gfc, bufp, gr, - masking_LR, masking_MS, - pe[gr], pe_MS[gr], tot_ener[gr], blocktype); - if (ret != 0) - return -4; - - if (cfg->mode == JOINT_STEREO) { - ms_ener_ratio[gr] = tot_ener[gr][2] + tot_ener[gr][3]; - if (ms_ener_ratio[gr] > 0) - ms_ener_ratio[gr] = tot_ener[gr][3] / ms_ener_ratio[gr]; - } - - /* block type flags */ - for (ch = 0; ch < cfg->channels_out; ch++) { - gr_info *const cod_info = &gfc->l3_side.tt[gr][ch]; - cod_info->block_type = blocktype[ch]; - cod_info->mixed_block_flag = 0; - } - } - } - - - /* auto-adjust of ATH, useful for low volume */ - adjust_ATH(gfc); - - - /**************************************** - * Stage 2: MDCT * - ****************************************/ - - /* polyphase filtering / mdct */ - mdct_sub48(gfc, inbuf[0], inbuf[1]); - - - /**************************************** - * Stage 3: MS/LR decision * - ****************************************/ - - /* Here will be selected MS or LR coding of the 2 stereo channels */ - gfc->ov_enc.mode_ext = MPG_MD_LR_LR; - - if (cfg->force_ms) { - gfc->ov_enc.mode_ext = MPG_MD_MS_LR; - } - else if (cfg->mode == JOINT_STEREO) { - /* ms_ratio = is scaled, for historical reasons, to look like - a ratio of side_channel / total. - 0 = signal is 100% mono - .5 = L & R uncorrelated - */ - - /* [0] and [1] are the results for the two granules in MPEG-1, - * in MPEG-2 it's only a faked averaging of the same value - * _prev is the value of the last granule of the previous frame - * _next is the value of the first granule of the next frame - */ - - FLOAT sum_pe_MS = 0; - FLOAT sum_pe_LR = 0; - for (gr = 0; gr < cfg->mode_gr; gr++) { - for (ch = 0; ch < cfg->channels_out; ch++) { - sum_pe_MS += pe_MS[gr][ch]; - sum_pe_LR += pe[gr][ch]; - } - } - - /* based on PE: M/S coding would not use much more bits than L/R */ - if (sum_pe_MS <= 1.00 * sum_pe_LR) { - - gr_info const *const gi0 = &gfc->l3_side.tt[0][0]; - gr_info const *const gi1 = &gfc->l3_side.tt[cfg->mode_gr - 1][0]; - - if (gi0[0].block_type == gi0[1].block_type && gi1[0].block_type == gi1[1].block_type) { - - gfc->ov_enc.mode_ext = MPG_MD_MS_LR; - } - } - } - - /* bit and noise allocation */ - if (gfc->ov_enc.mode_ext == MPG_MD_MS_LR) { - masking = (const III_psy_ratio (*)[2])masking_MS; /* use MS masking */ - pe_use = pe_MS; - } - else { - masking = (const III_psy_ratio (*)[2])masking_LR; /* use LR masking */ - pe_use = pe; - } - - - /* copy data for MP3 frame analyzer */ - if (cfg->analysis && gfc->pinfo != NULL) { - for (gr = 0; gr < cfg->mode_gr; gr++) { - for (ch = 0; ch < cfg->channels_out; ch++) { - gfc->pinfo->ms_ratio[gr] = 0; - gfc->pinfo->ms_ener_ratio[gr] = ms_ener_ratio[gr]; - gfc->pinfo->blocktype[gr][ch] = gfc->l3_side.tt[gr][ch].block_type; - gfc->pinfo->pe[gr][ch] = pe_use[gr][ch]; - memcpy(gfc->pinfo->xr[gr][ch], &gfc->l3_side.tt[gr][ch].xr[0], sizeof(FLOAT) * 576); - /* in psymodel, LR and MS data was stored in pinfo. - switch to MS data: */ - if (gfc->ov_enc.mode_ext == MPG_MD_MS_LR) { - gfc->pinfo->ers[gr][ch] = gfc->pinfo->ers[gr][ch + 2]; - memcpy(gfc->pinfo->energy[gr][ch], gfc->pinfo->energy[gr][ch + 2], - sizeof(gfc->pinfo->energy[gr][ch])); - } - } - } - } - - - /**************************************** - * Stage 4: quantization loop * - ****************************************/ - - if (cfg->vbr == vbr_off || cfg->vbr == vbr_abr) { - static FLOAT const fircoef[9] = { - -0.0207887 * 5, -0.0378413 * 5, -0.0432472 * 5, -0.031183 * 5, - 7.79609e-18 * 5, 0.0467745 * 5, 0.10091 * 5, 0.151365 * 5, - 0.187098 * 5 - }; - - int i; - FLOAT f; - - for (i = 0; i < 18; i++) - gfc->sv_enc.pefirbuf[i] = gfc->sv_enc.pefirbuf[i + 1]; - - f = 0.0; - for (gr = 0; gr < cfg->mode_gr; gr++) - for (ch = 0; ch < cfg->channels_out; ch++) - f += pe_use[gr][ch]; - gfc->sv_enc.pefirbuf[18] = f; - - f = gfc->sv_enc.pefirbuf[9]; - for (i = 0; i < 9; i++) - f += (gfc->sv_enc.pefirbuf[i] + gfc->sv_enc.pefirbuf[18 - i]) * fircoef[i]; - - f = (670 * 5 * cfg->mode_gr * cfg->channels_out) / f; - for (gr = 0; gr < cfg->mode_gr; gr++) { - for (ch = 0; ch < cfg->channels_out; ch++) { - pe_use[gr][ch] *= f; - } - } - } - switch (cfg->vbr) - { - default: - case vbr_off: - CBR_iteration_loop(gfc, (const FLOAT (*)[2])pe_use, ms_ener_ratio, masking); - break; - case vbr_abr: - ABR_iteration_loop(gfc, (const FLOAT (*)[2])pe_use, ms_ener_ratio, masking); - break; - case vbr_rh: - VBR_old_iteration_loop(gfc, (const FLOAT (*)[2])pe_use, ms_ener_ratio, masking); - break; - case vbr_mt: - case vbr_mtrh: - VBR_new_iteration_loop(gfc, (const FLOAT (*)[2])pe_use, ms_ener_ratio, masking); - break; - } - - - /**************************************** - * Stage 5: bitstream formatting * - ****************************************/ - - - /* write the frame to the bitstream */ - (void) format_bitstream(gfc); - - /* copy mp3 bit buffer into array */ - mp3count = copy_buffer(gfc, mp3buf, mp3buf_size, 1); - - - if (cfg->write_lame_tag) { - AddVbrFrame(gfc); - } - - if (cfg->analysis && gfc->pinfo != NULL) { - int framesize = 576 * cfg->mode_gr; - for (ch = 0; ch < cfg->channels_out; ch++) { - int j; - for (j = 0; j < FFTOFFSET; j++) - gfc->pinfo->pcmdata[ch][j] = gfc->pinfo->pcmdata[ch][j + framesize]; - for (j = FFTOFFSET; j < 1600; j++) { - gfc->pinfo->pcmdata[ch][j] = inbuf[ch][j - FFTOFFSET]; - } - } - gfc->sv_qnt.masking_lower = 1.0; - - set_frame_pinfo(gfc, masking); - } - - ++gfc->ov_enc.frame_number; - - updateStats(gfc); - - return mp3count; -} diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/encoder.h b/recorderlib/src/main/jni/lame-3.100_libmp3lame/encoder.h deleted file mode 100644 index b06a7c6..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/encoder.h +++ /dev/null @@ -1,156 +0,0 @@ -/* - * encoder.h include file - * - * Copyright (c) 2000 Mark Taylor - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - - -#ifndef LAME_ENCODER_H -#define LAME_ENCODER_H - -/*********************************************************************** -* -* encoder and decoder delays -* -***********************************************************************/ - -/* - * layer III enc->dec delay: 1056 (1057?) (observed) - * layer II enc->dec delay: 480 (481?) (observed) - * - * polyphase 256-16 (dec or enc) = 240 - * mdct 256+32 (9*32) (dec or enc) = 288 - * total: 512+16 - * - * My guess is that delay of polyphase filterbank is actualy 240.5 - * (there are technical reasons for this, see postings in mp3encoder). - * So total Encode+Decode delay = ENCDELAY + 528 + 1 - */ - -/* - * ENCDELAY The encoder delay. - * - * Minimum allowed is MDCTDELAY (see below) - * - * The first 96 samples will be attenuated, so using a value less than 96 - * will result in corrupt data for the first 96-ENCDELAY samples. - * - * suggested: 576 - * set to 1160 to sync with FhG. - */ - -#define ENCDELAY 576 - - - -/* - * make sure there is at least one complete frame after the - * last frame containing real data - * - * Using a value of 288 would be sufficient for a - * a very sophisticated decoder that can decode granule-by-granule instead - * of frame by frame. But lets not assume this, and assume the decoder - * will not decode frame N unless it also has data for frame N+1 - * - */ -/*#define POSTDELAY 288*/ -#define POSTDELAY 1152 - - - -/* - * delay of the MDCT used in mdct.c - * original ISO routines had a delay of 528! - * Takehiro's routines: - */ - -#define MDCTDELAY 48 -#define FFTOFFSET (224+MDCTDELAY) - -/* - * Most decoders, including the one we use, have a delay of 528 samples. - */ - -#define DECDELAY 528 - - -/* number of subbands */ -#define SBLIMIT 32 - -/* parition bands bands */ -#define CBANDS 64 - -/* number of critical bands/scale factor bands where masking is computed*/ -#define SBPSY_l 21 -#define SBPSY_s 12 - -/* total number of scalefactor bands encoded */ -#define SBMAX_l 22 -#define SBMAX_s 13 -#define PSFB21 6 -#define PSFB12 6 - - - -/* FFT sizes */ -#define BLKSIZE 1024 -#define HBLKSIZE (BLKSIZE/2 + 1) -#define BLKSIZE_s 256 -#define HBLKSIZE_s (BLKSIZE_s/2 + 1) - - -/* #define switch_pe 1800 */ -#define NORM_TYPE 0 -#define START_TYPE 1 -#define SHORT_TYPE 2 -#define STOP_TYPE 3 - -/* - * Mode Extention: - * When we are in stereo mode, there are 4 possible methods to store these - * two channels. The stereo modes -m? are using a subset of them. - * - * -ms: MPG_MD_LR_LR - * -mj: MPG_MD_LR_LR and MPG_MD_MS_LR - * -mf: MPG_MD_MS_LR - * -mi: all - */ -#if 0 -#define MPG_MD_LR_LR 0 -#define MPG_MD_LR_I 1 -#define MPG_MD_MS_LR 2 -#define MPG_MD_MS_I 3 -#endif -enum MPEGChannelMode -{ MPG_MD_LR_LR = 0 -, MPG_MD_LR_I = 1 -, MPG_MD_MS_LR = 2 -, MPG_MD_MS_I = 3 -}; - -#ifndef lame_internal_flags_defined -#define lame_internal_flags_defined -struct lame_internal_flags; -typedef struct lame_internal_flags lame_internal_flags; -#endif - -int lame_encode_mp3_frame(lame_internal_flags * gfc, - sample_t const *inbuf_l, - sample_t const *inbuf_r, unsigned char *mp3buf, int mp3buf_size); - -#endif /* LAME_ENCODER_H */ diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/fft.c b/recorderlib/src/main/jni/lame-3.100_libmp3lame/fft.c deleted file mode 100644 index d429791..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/fft.c +++ /dev/null @@ -1,338 +0,0 @@ -/* -** FFT and FHT routines -** Copyright 1988, 1993; Ron Mayer -** Copyright (c) 1999-2000 Takehiro Tominaga -** -** fht(fz,n); -** Does a hartley transform of "n" points in the array "fz". -** -** NOTE: This routine uses at least 2 patented algorithms, and may be -** under the restrictions of a bunch of different organizations. -** Although I wrote it completely myself; it is kind of a derivative -** of a routine I once authored and released under the GPL, so it -** may fall under the free software foundation's restrictions; -** it was worked on as a Stanford Univ project, so they claim -** some rights to it; it was further optimized at work here, so -** I think this company claims parts of it. The patents are -** held by R. Bracewell (the FHT algorithm) and O. Buneman (the -** trig generator), both at Stanford Univ. -** If it were up to me, I'd say go do whatever you want with it; -** but it would be polite to give credit to the following people -** if you use this anywhere: -** Euler - probable inventor of the fourier transform. -** Gauss - probable inventor of the FFT. -** Hartley - probable inventor of the hartley transform. -** Buneman - for a really cool trig generator -** Mayer(me) - for authoring this particular version and -** including all the optimizations in one package. -** Thanks, -** Ron Mayer; mayer@acuson.com -** and added some optimization by -** Mather - idea of using lookup table -** Takehiro - some dirty hack for speed up -*/ - -/* $Id: fft.c,v 1.39 2017/09/06 15:07:29 robert Exp $ */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include "lame.h" -#include "machine.h" -#include "encoder.h" -#include "util.h" -#include "fft.h" - - - - -#define TRI_SIZE (5-1) /* 1024 = 4**5 */ - -/* fft.c */ - -static const FLOAT costab[TRI_SIZE * 2] = { - 9.238795325112867e-01, 3.826834323650898e-01, - 9.951847266721969e-01, 9.801714032956060e-02, - 9.996988186962042e-01, 2.454122852291229e-02, - 9.999811752826011e-01, 6.135884649154475e-03 -}; - -static void -fht(FLOAT * fz, int n) -{ - const FLOAT *tri = costab; - int k4; - FLOAT *fi, *gi; - FLOAT const *fn; - - n <<= 1; /* to get BLKSIZE, because of 3DNow! ASM routine */ - fn = fz + n; - k4 = 4; - do { - FLOAT s1, c1; - int i, k1, k2, k3, kx; - kx = k4 >> 1; - k1 = k4; - k2 = k4 << 1; - k3 = k2 + k1; - k4 = k2 << 1; - fi = fz; - gi = fi + kx; - do { - FLOAT f0, f1, f2, f3; - f1 = fi[0] - fi[k1]; - f0 = fi[0] + fi[k1]; - f3 = fi[k2] - fi[k3]; - f2 = fi[k2] + fi[k3]; - fi[k2] = f0 - f2; - fi[0] = f0 + f2; - fi[k3] = f1 - f3; - fi[k1] = f1 + f3; - f1 = gi[0] - gi[k1]; - f0 = gi[0] + gi[k1]; - f3 = SQRT2 * gi[k3]; - f2 = SQRT2 * gi[k2]; - gi[k2] = f0 - f2; - gi[0] = f0 + f2; - gi[k3] = f1 - f3; - gi[k1] = f1 + f3; - gi += k4; - fi += k4; - } while (fi < fn); - c1 = tri[0]; - s1 = tri[1]; - for (i = 1; i < kx; i++) { - FLOAT c2, s2; - c2 = 1 - (2 * s1) * s1; - s2 = (2 * s1) * c1; - fi = fz + i; - gi = fz + k1 - i; - do { - FLOAT a, b, g0, f0, f1, g1, f2, g2, f3, g3; - b = s2 * fi[k1] - c2 * gi[k1]; - a = c2 * fi[k1] + s2 * gi[k1]; - f1 = fi[0] - a; - f0 = fi[0] + a; - g1 = gi[0] - b; - g0 = gi[0] + b; - b = s2 * fi[k3] - c2 * gi[k3]; - a = c2 * fi[k3] + s2 * gi[k3]; - f3 = fi[k2] - a; - f2 = fi[k2] + a; - g3 = gi[k2] - b; - g2 = gi[k2] + b; - b = s1 * f2 - c1 * g3; - a = c1 * f2 + s1 * g3; - fi[k2] = f0 - a; - fi[0] = f0 + a; - gi[k3] = g1 - b; - gi[k1] = g1 + b; - b = c1 * g2 - s1 * f3; - a = s1 * g2 + c1 * f3; - gi[k2] = g0 - a; - gi[0] = g0 + a; - fi[k3] = f1 - b; - fi[k1] = f1 + b; - gi += k4; - fi += k4; - } while (fi < fn); - c2 = c1; - c1 = c2 * tri[0] - s1 * tri[1]; - s1 = c2 * tri[1] + s1 * tri[0]; - } - tri += 2; - } while (k4 < n); -} - - -static const unsigned char rv_tbl[] = { - 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, - 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0, - 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, - 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, - 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, - 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4, - 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, - 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc, - 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, - 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, - 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, - 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa, - 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, - 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6, - 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, - 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe -}; - -#define ch01(index) (buffer[chn][index]) - -#define ml00(f) (window[i ] * f(i)) -#define ml10(f) (window[i + 0x200] * f(i + 0x200)) -#define ml20(f) (window[i + 0x100] * f(i + 0x100)) -#define ml30(f) (window[i + 0x300] * f(i + 0x300)) - -#define ml01(f) (window[i + 0x001] * f(i + 0x001)) -#define ml11(f) (window[i + 0x201] * f(i + 0x201)) -#define ml21(f) (window[i + 0x101] * f(i + 0x101)) -#define ml31(f) (window[i + 0x301] * f(i + 0x301)) - -#define ms00(f) (window_s[i ] * f(i + k)) -#define ms10(f) (window_s[0x7f - i] * f(i + k + 0x80)) -#define ms20(f) (window_s[i + 0x40] * f(i + k + 0x40)) -#define ms30(f) (window_s[0x3f - i] * f(i + k + 0xc0)) - -#define ms01(f) (window_s[i + 0x01] * f(i + k + 0x01)) -#define ms11(f) (window_s[0x7e - i] * f(i + k + 0x81)) -#define ms21(f) (window_s[i + 0x41] * f(i + k + 0x41)) -#define ms31(f) (window_s[0x3e - i] * f(i + k + 0xc1)) - -void -fft_short(lame_internal_flags const *const gfc, - FLOAT x_real[3][BLKSIZE_s], int chn, const sample_t *const buffer[2]) -{ - int i; - int j; - int b; - -#define window_s gfc->cd_psy->window_s -#define window gfc->cd_psy->window - - for (b = 0; b < 3; b++) { - FLOAT *x = &x_real[b][BLKSIZE_s / 2]; - short const k = (576 / 3) * (b + 1); - j = BLKSIZE_s / 8 - 1; - do { - FLOAT f0, f1, f2, f3, w; - - i = rv_tbl[j << 2]; - - f0 = ms00(ch01); - w = ms10(ch01); - f1 = f0 - w; - f0 = f0 + w; - f2 = ms20(ch01); - w = ms30(ch01); - f3 = f2 - w; - f2 = f2 + w; - - x -= 4; - x[0] = f0 + f2; - x[2] = f0 - f2; - x[1] = f1 + f3; - x[3] = f1 - f3; - - f0 = ms01(ch01); - w = ms11(ch01); - f1 = f0 - w; - f0 = f0 + w; - f2 = ms21(ch01); - w = ms31(ch01); - f3 = f2 - w; - f2 = f2 + w; - - x[BLKSIZE_s / 2 + 0] = f0 + f2; - x[BLKSIZE_s / 2 + 2] = f0 - f2; - x[BLKSIZE_s / 2 + 1] = f1 + f3; - x[BLKSIZE_s / 2 + 3] = f1 - f3; - } while (--j >= 0); - -#undef window -#undef window_s - - gfc->fft_fht(x, BLKSIZE_s / 2); - /* BLKSIZE_s/2 because of 3DNow! ASM routine */ - } -} - -void -fft_long(lame_internal_flags const *const gfc, - FLOAT x[BLKSIZE], int chn, const sample_t *const buffer[2]) -{ - int i; - int jj = BLKSIZE / 8 - 1; - x += BLKSIZE / 2; - -#define window_s gfc->cd_psy->window_s -#define window gfc->cd_psy->window - - do { - FLOAT f0, f1, f2, f3, w; - - i = rv_tbl[jj]; - f0 = ml00(ch01); - w = ml10(ch01); - f1 = f0 - w; - f0 = f0 + w; - f2 = ml20(ch01); - w = ml30(ch01); - f3 = f2 - w; - f2 = f2 + w; - - x -= 4; - x[0] = f0 + f2; - x[2] = f0 - f2; - x[1] = f1 + f3; - x[3] = f1 - f3; - - f0 = ml01(ch01); - w = ml11(ch01); - f1 = f0 - w; - f0 = f0 + w; - f2 = ml21(ch01); - w = ml31(ch01); - f3 = f2 - w; - f2 = f2 + w; - - x[BLKSIZE / 2 + 0] = f0 + f2; - x[BLKSIZE / 2 + 2] = f0 - f2; - x[BLKSIZE / 2 + 1] = f1 + f3; - x[BLKSIZE / 2 + 3] = f1 - f3; - } while (--jj >= 0); - -#undef window -#undef window_s - - gfc->fft_fht(x, BLKSIZE / 2); - /* BLKSIZE/2 because of 3DNow! ASM routine */ -} - -#ifdef HAVE_NASM -extern void fht_3DN(FLOAT * fz, int n); -extern void fht_SSE(FLOAT * fz, int n); -#endif - -void -init_fft(lame_internal_flags * const gfc) -{ - int i; - - /* The type of window used here will make no real difference, but */ - /* in the interest of merging nspsytune stuff - switch to blackman window */ - for (i = 0; i < BLKSIZE; i++) - /* blackman window */ - gfc->cd_psy->window[i] = 0.42 - 0.5 * cos(2 * PI * (i + .5) / BLKSIZE) + - 0.08 * cos(4 * PI * (i + .5) / BLKSIZE); - - for (i = 0; i < BLKSIZE_s / 2; i++) - gfc->cd_psy->window_s[i] = 0.5 * (1.0 - cos(2.0 * PI * (i + 0.5) / BLKSIZE_s)); - - gfc->fft_fht = fht; -#ifdef HAVE_NASM - if (gfc->CPU_features.AMD_3DNow) { - gfc->fft_fht = fht_3DN; - } - else if (gfc->CPU_features.SSE) { - gfc->fft_fht = fht_SSE; - } - else { - gfc->fft_fht = fht; - } -#else -#ifdef HAVE_XMMINTRIN_H -#ifdef MIN_ARCH_SSE - gfc->fft_fht = fht_SSE2; -#endif -#endif -#endif -} diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/fft.h b/recorderlib/src/main/jni/lame-3.100_libmp3lame/fft.h deleted file mode 100644 index 258df88..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/fft.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Fast Fourier Transform include file - * - * Copyright (c) 2000 Mark Taylor - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef LAME_FFT_H -#define LAME_FFT_H - -void fft_long(lame_internal_flags const *const gfc, FLOAT x_real[BLKSIZE], - int chn, const sample_t *const data[2]); - -void fft_short(lame_internal_flags const *const gfc, FLOAT x_real[3][BLKSIZE_s], - int chn, const sample_t *const data[2]); - -void init_fft(lame_internal_flags * const gfc); - -#endif - -/* End of fft.h */ diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/gain_analysis.c b/recorderlib/src/main/jni/lame-3.100_libmp3lame/gain_analysis.c deleted file mode 100644 index c94db78..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/gain_analysis.c +++ /dev/null @@ -1,476 +0,0 @@ -/* - * ReplayGainAnalysis - analyzes input samples and give the recommended dB change - * Copyright (C) 2001 David Robinson and Glen Sawyer - * Improvements and optimizations added by Frank Klemm, and by Marcel Muller - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * concept and filter values by David Robinson (David@Robinson.org) - * -- blame him if you think the idea is flawed - * original coding by Glen Sawyer (mp3gain@hotmail.com) - * -- blame him if you think this runs too slowly, or the coding is otherwise flawed - * - * lots of code improvements by Frank Klemm ( http://www.uni-jena.de/~pfk/mpp/ ) - * -- credit him for all the _good_ programming ;) - * - * - * For an explanation of the concepts and the basic algorithms involved, go to: - * http://www.replaygain.org/ - */ - -/* - * Here's the deal. Call - * - * InitGainAnalysis ( long samplefreq ); - * - * to initialize everything. Call - * - * AnalyzeSamples ( const Float_t* left_samples, - * const Float_t* right_samples, - * size_t num_samples, - * int num_channels ); - * - * as many times as you want, with as many or as few samples as you want. - * If mono, pass the sample buffer in through left_samples, leave - * right_samples NULL, and make sure num_channels = 1. - * - * GetTitleGain() - * - * will return the recommended dB level change for all samples analyzed - * SINCE THE LAST TIME you called GetTitleGain() OR InitGainAnalysis(). - * - * GetAlbumGain() - * - * will return the recommended dB level change for all samples analyzed - * since InitGainAnalysis() was called and finalized with GetTitleGain(). - * - * Pseudo-code to process an album: - * - * Float_t l_samples [4096]; - * Float_t r_samples [4096]; - * size_t num_samples; - * unsigned int num_songs; - * unsigned int i; - * - * InitGainAnalysis ( 44100 ); - * for ( i = 1; i <= num_songs; i++ ) { - * while ( ( num_samples = getSongSamples ( song[i], left_samples, right_samples ) ) > 0 ) - * AnalyzeSamples ( left_samples, right_samples, num_samples, 2 ); - * fprintf ("Recommended dB change for song %2d: %+6.2f dB\n", i, GetTitleGain() ); - * } - * fprintf ("Recommended dB change for whole album: %+6.2f dB\n", GetAlbumGain() ); - */ - -/* - * So here's the main source of potential code confusion: - * - * The filters applied to the incoming samples are IIR filters, - * meaning they rely on up to number of previous samples - * AND up to number of previous filtered samples. - * - * I set up the AnalyzeSamples routine to minimize memory usage and interface - * complexity. The speed isn't compromised too much (I don't think), but the - * internal complexity is higher than it should be for such a relatively - * simple routine. - * - * Optimization/clarity suggestions are welcome. - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include -#include - -#include "lame.h" -#include "machine.h" -#include "gain_analysis.h" - -/* for each filter: */ -/* [0] 48 kHz, [1] 44.1 kHz, [2] 32 kHz, [3] 24 kHz, [4] 22050 Hz, [5] 16 kHz, [6] 12 kHz, [7] is 11025 Hz, [8] 8 kHz */ - -#ifdef WIN32 -#pragma warning ( disable : 4305 ) -#endif - - -/*lint -save -e736 loss of precision */ -static const Float_t ABYule[9][multiple_of(4, 2 * YULE_ORDER + 1)] = { - /* 20 18 16 14 12 10 8 6 4 2 0 19 17 15 13 11 9 7 5 3 1 */ - { 0.00288463683916, 0.00012025322027, 0.00306428023191, 0.00594298065125, -0.02074045215285, 0.02161526843274, -0.01655260341619, -0.00009291677959, -0.00123395316851, -0.02160367184185, 0.03857599435200, 0.13919314567432, -0.86984376593551, 2.75465861874613, -5.87257861775999, 9.48293806319790,-12.28759895145294, 13.05504219327545,-11.34170355132042, 7.81501653005538, -3.84664617118067}, - {-0.00187763777362, 0.00674613682247, -0.00240879051584, 0.01624864962975, -0.02596338512915, 0.02245293253339, -0.00834990904936, -0.00851165645469, -0.00848709379851, -0.02911007808948, 0.05418656406430, 0.13149317958808, -0.75104302451432, 2.19611684890774, -4.39470996079559, 6.85401540936998, -8.81498681370155, 9.47693607801280, -8.54751527471874, 6.36317777566148, -3.47845948550071}, - {-0.00881362733839, 0.00651420667831, -0.01390589421898, 0.03174092540049, 0.00222312597743, 0.04781476674921, -0.05588393329856, 0.02163541888798, -0.06247880153653, -0.09331049056315, 0.15457299681924, 0.02347897407020, -0.05032077717131, 0.16378164858596, -0.45953458054983, 1.00595954808547, -1.67148153367602, 2.23697657451713, -2.64577170229825, 2.84868151156327, -2.37898834973084}, - {-0.02950134983287, 0.00205861885564, -0.00000828086748, 0.06276101321749, -0.00584456039913, -0.02364141202522, -0.00915702933434, 0.03282930172664, -0.08587323730772, -0.22613988682123, 0.30296907319327, 0.00302439095741, 0.02005851806501, 0.04500235387352, -0.22138138954925, 0.39120800788284, -0.22638893773906, -0.16276719120440, -0.25656257754070, 1.07977492259970, -1.61273165137247}, - {-0.01760176568150, -0.01635381384540, 0.00832043980773, 0.05724228140351, -0.00589500224440, -0.00469977914380, -0.07834489609479, 0.11921148675203, -0.11828570177555, -0.25572241425570, 0.33642304856132, 0.02977207319925, -0.04237348025746, 0.08333755284107, -0.04067510197014, -0.12453458140019, 0.47854794562326, -0.80774944671438, 0.12205022308084, 0.87350271418188, -1.49858979367799}, - { 0.00541907748707, -0.03193428438915, -0.01863887810927, 0.10478503600251, 0.04097565135648, -0.12398163381748, 0.04078262797139, -0.01419140100551, -0.22784394429749, -0.14351757464547, 0.44915256608450, 0.03222754072173, 0.05784820375801, 0.06747620744683, 0.00613424350682, 0.22199650564824, -0.42029820170918, 0.00213767857124, -0.37256372942400, 0.29661783706366, -0.62820619233671}, - {-0.00588215443421, -0.03788984554840, 0.08647503780351, 0.00647310677246, -0.27562961986224, 0.30931782841830, -0.18901604199609, 0.16744243493672, 0.16242137742230, -0.75464456939302, 0.56619470757641, 0.01807364323573, 0.01639907836189, -0.04784254229033, 0.06739368333110, -0.33032403314006, 0.45054734505008, 0.00819999645858, -0.26806001042947, 0.29156311971249, -1.04800335126349}, - {-0.00749618797172, -0.03721611395801, 0.06920467763959, 0.01628462406333, -0.25344790059353, 0.15558449135573, 0.02377945217615, 0.17520704835522, -0.14289799034253, -0.53174909058578, 0.58100494960553, 0.01818801111503, 0.02442357316099, -0.02505961724053, -0.05246019024463, -0.23313271880868, 0.38952639978999, 0.14728154134330, -0.20256413484477, -0.31863563325245, -0.51035327095184}, - {-0.02217936801134, 0.04788665548180, -0.04060034127000, -0.11202315195388, -0.02459864859345, 0.14590772289388, -0.10214864179676, 0.04267842219415, -0.00275953611929, -0.42163034350696, 0.53648789255105, 0.04704409688120, 0.05477720428674, -0.18823009262115, -0.17556493366449, 0.15113130533216, 0.26408300200955, -0.04678328784242, -0.03424681017675, -0.43193942311114, -0.25049871956020} -}; - -static const Float_t ABButter[9][multiple_of(4, 2 * BUTTER_ORDER + 1)] = { - /* 5 4 3 2 1 */ - {0.98621192462708, 0.97261396931306, -1.97242384925416, -1.97223372919527, 0.98621192462708}, - {0.98500175787242, 0.97022847566350, -1.97000351574484, -1.96977855582618, 0.98500175787242}, - {0.97938932735214, 0.95920349965459, -1.95877865470428, -1.95835380975398, 0.97938932735214}, - {0.97531843204928, 0.95124613669835, -1.95063686409857, -1.95002759149878, 0.97531843204928}, - {0.97316523498161, 0.94705070426118, -1.94633046996323, -1.94561023566527, 0.97316523498161}, - {0.96454515552826, 0.93034775234268, -1.92909031105652, -1.92783286977036, 0.96454515552826}, - {0.96009142950541, 0.92177618768381, -1.92018285901082, -1.91858953033784, 0.96009142950541}, - {0.95856916599601, 0.91885558323625, -1.91713833199203, -1.91542108074780, 0.95856916599601}, - {0.94597685600279, 0.89487434461664, -1.89195371200558, -1.88903307939452, 0.94597685600279} -}; - -/*lint -restore */ - -#ifdef WIN32 -#pragma warning ( default : 4305 ) -#endif - -/* When calling this procedure, make sure that ip[-order] and op[-order] point to real data! */ - -static void -filterYule(const Float_t * input, Float_t * output, size_t nSamples, const Float_t * const kernel) -{ - while (nSamples--) { - Float_t y0 = input[-10] * kernel[ 0]; - Float_t y2 = input[ -9] * kernel[ 1]; - Float_t y4 = input[ -8] * kernel[ 2]; - Float_t y6 = input[ -7] * kernel[ 3]; - Float_t s00 = y0 + y2 + y4 + y6; - Float_t y8 = input[ -6] * kernel[ 4]; - Float_t yA = input[ -5] * kernel[ 5]; - Float_t yC = input[ -4] * kernel[ 6]; - Float_t yE = input[ -3] * kernel[ 7]; - Float_t s01 = y8 + yA + yC + yE; - Float_t yG = input[ -2] * kernel[ 8] + input[ -1] * kernel[ 9]; - Float_t yK = input[ 0] * kernel[10]; - - Float_t s1 = s00 + s01 + yG + yK; - - Float_t x1 = output[-10] * kernel[11] + output[ -9] * kernel[12]; - Float_t x5 = output[ -8] * kernel[13] + output[ -7] * kernel[14]; - Float_t x9 = output[ -6] * kernel[15] + output[ -5] * kernel[16]; - Float_t xD = output[ -4] * kernel[17] + output[ -3] * kernel[18]; - Float_t xH = output[ -2] * kernel[19] + output[ -1] * kernel[20]; - - Float_t s2 = x1 + x5 + x9 + xD + xH; - - output[0] = (Float_t)(s1 - s2); - - ++output; - ++input; - } -} - -static void -filterButter(const Float_t * input, Float_t * output, size_t nSamples, const Float_t * const kernel) -{ - while (nSamples--) { - Float_t s1 = input[-2] * kernel[0] + input[-1] * kernel[2] + input[ 0] * kernel[4]; - Float_t s2 = output[-2] * kernel[1] + output[-1] * kernel[3]; - output[0] = (Float_t)(s1 - s2); - ++output; - ++input; - } -} - - - -static int ResetSampleFrequency(replaygain_t * rgData, long samplefreq); - -/* returns a INIT_GAIN_ANALYSIS_OK if successful, INIT_GAIN_ANALYSIS_ERROR if not */ - -int -ResetSampleFrequency(replaygain_t * rgData, long samplefreq) -{ - /* zero out initial values, only first MAX_ORDER values */ - memset(rgData->linprebuf, 0, MAX_ORDER * sizeof(*rgData->linprebuf)); - memset(rgData->rinprebuf, 0, MAX_ORDER * sizeof(*rgData->rinprebuf)); - memset(rgData->lstepbuf, 0, MAX_ORDER * sizeof(*rgData->lstepbuf)); - memset(rgData->rstepbuf, 0, MAX_ORDER * sizeof(*rgData->rstepbuf)); - memset(rgData->loutbuf, 0, MAX_ORDER * sizeof(*rgData->loutbuf)); - memset(rgData->routbuf, 0, MAX_ORDER * sizeof(*rgData->routbuf)); - - switch ((int) (samplefreq)) { - case 48000: - rgData->freqindex = 0; - break; - case 44100: - rgData->freqindex = 1; - break; - case 32000: - rgData->freqindex = 2; - break; - case 24000: - rgData->freqindex = 3; - break; - case 22050: - rgData->freqindex = 4; - break; - case 16000: - rgData->freqindex = 5; - break; - case 12000: - rgData->freqindex = 6; - break; - case 11025: - rgData->freqindex = 7; - break; - case 8000: - rgData->freqindex = 8; - break; - default: - return INIT_GAIN_ANALYSIS_ERROR; - } - - rgData->sampleWindow = - (samplefreq * RMS_WINDOW_TIME_NUMERATOR + RMS_WINDOW_TIME_DENOMINATOR - - 1) / RMS_WINDOW_TIME_DENOMINATOR; - - rgData->lsum = 0.; - rgData->rsum = 0.; - rgData->totsamp = 0; - - memset(rgData->A, 0, sizeof(rgData->A)); - - return INIT_GAIN_ANALYSIS_OK; -} - -int -InitGainAnalysis(replaygain_t * rgData, long samplefreq) -{ - if (ResetSampleFrequency(rgData, samplefreq) != INIT_GAIN_ANALYSIS_OK) { - return INIT_GAIN_ANALYSIS_ERROR; - } - - rgData->linpre = rgData->linprebuf + MAX_ORDER; - rgData->rinpre = rgData->rinprebuf + MAX_ORDER; - rgData->lstep = rgData->lstepbuf + MAX_ORDER; - rgData->rstep = rgData->rstepbuf + MAX_ORDER; - rgData->lout = rgData->loutbuf + MAX_ORDER; - rgData->rout = rgData->routbuf + MAX_ORDER; - - memset(rgData->B, 0, sizeof(rgData->B)); - - return INIT_GAIN_ANALYSIS_OK; -} - -/* returns GAIN_ANALYSIS_OK if successful, GAIN_ANALYSIS_ERROR if not */ - -int -AnalyzeSamples(replaygain_t * rgData, const Float_t * left_samples, const Float_t * right_samples, - size_t num_samples, int num_channels) -{ - const Float_t *curleft; - const Float_t *curright; - long batchsamples; - long cursamples; - long cursamplepos; - int i; - Float_t sum_l, sum_r; - - if (num_samples == 0) - return GAIN_ANALYSIS_OK; - - cursamplepos = 0; - batchsamples = (long) num_samples; - - switch (num_channels) { - case 1: - right_samples = left_samples; - break; - case 2: - break; - default: - return GAIN_ANALYSIS_ERROR; - } - - if (num_samples < MAX_ORDER) { - memcpy(rgData->linprebuf + MAX_ORDER, left_samples, num_samples * sizeof(Float_t)); - memcpy(rgData->rinprebuf + MAX_ORDER, right_samples, num_samples * sizeof(Float_t)); - } - else { - memcpy(rgData->linprebuf + MAX_ORDER, left_samples, MAX_ORDER * sizeof(Float_t)); - memcpy(rgData->rinprebuf + MAX_ORDER, right_samples, MAX_ORDER * sizeof(Float_t)); - } - - while (batchsamples > 0) { - cursamples = batchsamples > rgData->sampleWindow - rgData->totsamp ? - rgData->sampleWindow - rgData->totsamp : batchsamples; - if (cursamplepos < MAX_ORDER) { - curleft = rgData->linpre + cursamplepos; - curright = rgData->rinpre + cursamplepos; - if (cursamples > MAX_ORDER - cursamplepos) - cursamples = MAX_ORDER - cursamplepos; - } - else { - curleft = left_samples + cursamplepos; - curright = right_samples + cursamplepos; - } - - YULE_FILTER(curleft, rgData->lstep + rgData->totsamp, cursamples, - ABYule[rgData->freqindex]); - YULE_FILTER(curright, rgData->rstep + rgData->totsamp, cursamples, - ABYule[rgData->freqindex]); - - BUTTER_FILTER(rgData->lstep + rgData->totsamp, rgData->lout + rgData->totsamp, cursamples, - ABButter[rgData->freqindex]); - BUTTER_FILTER(rgData->rstep + rgData->totsamp, rgData->rout + rgData->totsamp, cursamples, - ABButter[rgData->freqindex]); - - curleft = rgData->lout + rgData->totsamp; /* Get the squared values */ - curright = rgData->rout + rgData->totsamp; - - sum_l = 0; - sum_r = 0; - i = cursamples & 0x03; - while (i--) { - Float_t const l = *curleft++; - Float_t const r = *curright++; - sum_l += l * l; - sum_r += r * r; - } - i = cursamples / 4; - while (i--) { - Float_t l0 = curleft[0] * curleft[0]; - Float_t l1 = curleft[1] * curleft[1]; - Float_t l2 = curleft[2] * curleft[2]; - Float_t l3 = curleft[3] * curleft[3]; - Float_t sl = l0 + l1 + l2 + l3; - Float_t r0 = curright[0] * curright[0]; - Float_t r1 = curright[1] * curright[1]; - Float_t r2 = curright[2] * curright[2]; - Float_t r3 = curright[3] * curright[3]; - Float_t sr = r0 + r1 + r2 + r3; - sum_l += sl; - curleft += 4; - sum_r += sr; - curright += 4; - } - rgData->lsum += sum_l; - rgData->rsum += sum_r; - - batchsamples -= cursamples; - cursamplepos += cursamples; - rgData->totsamp += cursamples; - if (rgData->totsamp == rgData->sampleWindow) { /* Get the Root Mean Square (RMS) for this set of samples */ - double const val = - STEPS_per_dB * 10. * log10((rgData->lsum + rgData->rsum) / rgData->totsamp * 0.5 + - 1.e-37); - size_t ival = (val <= 0) ? 0 : (size_t) val; - if (ival >= sizeof(rgData->A) / sizeof(*(rgData->A))) - ival = sizeof(rgData->A) / sizeof(*(rgData->A)) - 1; - rgData->A[ival]++; - rgData->lsum = rgData->rsum = 0.; - memmove(rgData->loutbuf, rgData->loutbuf + rgData->totsamp, - MAX_ORDER * sizeof(Float_t)); - memmove(rgData->routbuf, rgData->routbuf + rgData->totsamp, - MAX_ORDER * sizeof(Float_t)); - memmove(rgData->lstepbuf, rgData->lstepbuf + rgData->totsamp, - MAX_ORDER * sizeof(Float_t)); - memmove(rgData->rstepbuf, rgData->rstepbuf + rgData->totsamp, - MAX_ORDER * sizeof(Float_t)); - rgData->totsamp = 0; - } - if (rgData->totsamp > rgData->sampleWindow) /* somehow I really screwed up: Error in programming! Contact author about totsamp > sampleWindow */ - return GAIN_ANALYSIS_ERROR; - } - if (num_samples < MAX_ORDER) { - memmove(rgData->linprebuf, rgData->linprebuf + num_samples, - (MAX_ORDER - num_samples) * sizeof(Float_t)); - memmove(rgData->rinprebuf, rgData->rinprebuf + num_samples, - (MAX_ORDER - num_samples) * sizeof(Float_t)); - memcpy(rgData->linprebuf + MAX_ORDER - num_samples, left_samples, - num_samples * sizeof(Float_t)); - memcpy(rgData->rinprebuf + MAX_ORDER - num_samples, right_samples, - num_samples * sizeof(Float_t)); - } - else { - memcpy(rgData->linprebuf, left_samples + num_samples - MAX_ORDER, - MAX_ORDER * sizeof(Float_t)); - memcpy(rgData->rinprebuf, right_samples + num_samples - MAX_ORDER, - MAX_ORDER * sizeof(Float_t)); - } - - return GAIN_ANALYSIS_OK; -} - - -static Float_t -analyzeResult(uint32_t const *Array, size_t len) -{ - uint32_t elems; - uint32_t upper; - uint32_t sum; - size_t i; - - elems = 0; - for (i = 0; i < len; i++) - elems += Array[i]; - if (elems == 0) - return GAIN_NOT_ENOUGH_SAMPLES; - - upper = (uint32_t) ceil(elems * (1. - RMS_PERCENTILE)); - sum = 0; - for (i = len; i-- > 0;) { - sum += Array[i]; - if (sum >= upper) { - break; - } - } - - return (Float_t) ((Float_t) PINK_REF - (Float_t) i / (Float_t) STEPS_per_dB); -} - - -Float_t -GetTitleGain(replaygain_t * rgData) -{ - Float_t retval; - unsigned int i; - - retval = analyzeResult(rgData->A, sizeof(rgData->A) / sizeof(*(rgData->A))); - - for (i = 0; i < sizeof(rgData->A) / sizeof(*(rgData->A)); i++) { - rgData->B[i] += rgData->A[i]; - rgData->A[i] = 0; - } - - for (i = 0; i < MAX_ORDER; i++) - rgData->linprebuf[i] = rgData->lstepbuf[i] - = rgData->loutbuf[i] - = rgData->rinprebuf[i] - = rgData->rstepbuf[i] - = rgData->routbuf[i] = 0.f; - - rgData->totsamp = 0; - rgData->lsum = rgData->rsum = 0.; - return retval; -} - -#if 0 -static Float_t GetAlbumGain(replaygain_t const* rgData); - -Float_t -GetAlbumGain(replaygain_t const* rgData) -{ - return analyzeResult(rgData->B, sizeof(rgData->B) / sizeof(*(rgData->B))); -} -#endif - -/* end of gain_analysis.c */ diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/gain_analysis.h b/recorderlib/src/main/jni/lame-3.100_libmp3lame/gain_analysis.h deleted file mode 100644 index a6b56ab..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/gain_analysis.h +++ /dev/null @@ -1,109 +0,0 @@ -/* - * ReplayGainAnalysis - analyzes input samples and give the recommended dB change - * Copyright (C) 2001 David Robinson and Glen Sawyer - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * concept and filter values by David Robinson (David@Robinson.org) - * -- blame him if you think the idea is flawed - * coding by Glen Sawyer (mp3gain@hotmail.com) 735 W 255 N, Orem, UT 84057-4505 USA - * -- blame him if you think this runs too slowly, or the coding is otherwise flawed - * - * For an explanation of the concepts and the basic algorithms involved, go to: - * http://www.replaygain.org/ - */ - -#ifndef GAIN_ANALYSIS_H -#define GAIN_ANALYSIS_H - -#ifdef HAVE_INTTYPES_H -# include -#else -# ifdef HAVE_STDINT_H -# include -# endif -#endif - -#ifdef __cplusplus -extern "C" { -#endif - - - typedef sample_t Float_t; /* Type used for filtering */ - - -#define PINK_REF 64.82 /* 298640883795 */ /* calibration value for 89dB */ - - -#define YULE_ORDER 10 -#define BUTTER_ORDER 2 -#define YULE_FILTER filterYule -#define BUTTER_FILTER filterButter -#define RMS_PERCENTILE 0.95 /* percentile which is louder than the proposed level */ -#define MAX_SAMP_FREQ 48000L /* maximum allowed sample frequency [Hz] */ -#define RMS_WINDOW_TIME_NUMERATOR 1L -#define RMS_WINDOW_TIME_DENOMINATOR 20L /* numerator / denominator = time slice size [s] */ -#define STEPS_per_dB 100 /* Table entries per dB */ -#define MAX_dB 120 /* Table entries for 0...MAX_dB (normal max. values are 70...80 dB) */ - - enum { GAIN_NOT_ENOUGH_SAMPLES = -24601, GAIN_ANALYSIS_ERROR = 0, GAIN_ANALYSIS_OK = - 1, INIT_GAIN_ANALYSIS_ERROR = 0, INIT_GAIN_ANALYSIS_OK = 1 - }; - - enum { MAX_ORDER = (BUTTER_ORDER > YULE_ORDER ? BUTTER_ORDER : YULE_ORDER) - , MAX_SAMPLES_PER_WINDOW = ((MAX_SAMP_FREQ * RMS_WINDOW_TIME_NUMERATOR) / RMS_WINDOW_TIME_DENOMINATOR + 1) /* max. Samples per Time slice */ - }; - - struct replaygain_data { - Float_t linprebuf[MAX_ORDER * 2]; - Float_t *linpre; /* left input samples, with pre-buffer */ - Float_t lstepbuf[MAX_SAMPLES_PER_WINDOW + MAX_ORDER]; - Float_t *lstep; /* left "first step" (i.e. post first filter) samples */ - Float_t loutbuf[MAX_SAMPLES_PER_WINDOW + MAX_ORDER]; - Float_t *lout; /* left "out" (i.e. post second filter) samples */ - Float_t rinprebuf[MAX_ORDER * 2]; - Float_t *rinpre; /* right input samples ... */ - Float_t rstepbuf[MAX_SAMPLES_PER_WINDOW + MAX_ORDER]; - Float_t *rstep; - Float_t routbuf[MAX_SAMPLES_PER_WINDOW + MAX_ORDER]; - Float_t *rout; - long sampleWindow; /* number of samples required to reach number of milliseconds required for RMS window */ - long totsamp; - double lsum; - double rsum; - int freqindex; - int first; - uint32_t A[STEPS_per_dB * MAX_dB]; - uint32_t B[STEPS_per_dB * MAX_dB]; - - }; -#ifndef replaygain_data_defined -#define replaygain_data_defined - typedef struct replaygain_data replaygain_t; -#endif - - - - - int InitGainAnalysis(replaygain_t * rgData, long samplefreq); - int AnalyzeSamples(replaygain_t * rgData, const Float_t * left_samples, - const Float_t * right_samples, size_t num_samples, int num_channels); - Float_t GetTitleGain(replaygain_t * rgData); - - -#ifdef __cplusplus -} -#endif -#endif /* GAIN_ANALYSIS_H */ diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/id3tag.c b/recorderlib/src/main/jni/lame-3.100_libmp3lame/id3tag.c deleted file mode 100644 index ac48510..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/id3tag.c +++ /dev/null @@ -1,1926 +0,0 @@ -/* - * id3tag.c -- Write ID3 version 1 and 2 tags. - * - * Copyright (C) 2000 Don Melton - * Copyright (C) 2011-2017 Robert Hegemann - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. - */ - -/* - * HISTORY: This source file is part of LAME (see http://www.mp3dev.org) - * and was originally adapted by Conrad Sanderson - * from mp3info by Ricardo Cerqueira to write only ID3 version 1 - * tags. Don Melton COMPLETELY rewrote it to support version - * 2 tags and be more conformant to other standards while remaining flexible. - * - * NOTE: See http://id3.org/ for more information about ID3 tag formats. - */ - -/* $Id: id3tag.c,v 1.80 2017/08/28 15:39:51 robert Exp $ */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#ifdef STDC_HEADERS -# include -# include -# include -# include -#else -# ifndef HAVE_STRCHR -# define strchr index -# define strrchr rindex -# endif -char *strchr(), *strrchr(); -# ifndef HAVE_MEMCPY -# define memcpy(d, s, n) bcopy ((s), (d), (n)) -# endif -#endif - - -#include "lame.h" -#include "machine.h" -#include "encoder.h" -#include "id3tag.h" -#include "lame_global_flags.h" -#include "util.h" -#include "bitstream.h" - - -static const char *const genre_names[] = { - /* - * NOTE: The spelling of these genre names is identical to those found in - * Winamp and mp3info. - */ - "Blues", "Classic Rock", "Country", "Dance", "Disco", "Funk", "Grunge", - "Hip-Hop", "Jazz", "Metal", "New Age", "Oldies", "Other", "Pop", "R&B", - "Rap", "Reggae", "Rock", "Techno", "Industrial", "Alternative", "Ska", - "Death Metal", "Pranks", "Soundtrack", "Euro-Techno", "Ambient", "Trip-Hop", - "Vocal", "Jazz+Funk", "Fusion", "Trance", "Classical", "Instrumental", - "Acid", "House", "Game", "Sound Clip", "Gospel", "Noise", "Alternative Rock", - "Bass", "Soul", "Punk", "Space", "Meditative", "Instrumental Pop", - "Instrumental Rock", "Ethnic", "Gothic", "Darkwave", "Techno-Industrial", - "Electronic", "Pop-Folk", "Eurodance", "Dream", "Southern Rock", "Comedy", - "Cult", "Gangsta", "Top 40", "Christian Rap", "Pop/Funk", "Jungle", - "Native US", "Cabaret", "New Wave", "Psychedelic", "Rave", - "Showtunes", "Trailer", "Lo-Fi", "Tribal", "Acid Punk", "Acid Jazz", - "Polka", "Retro", "Musical", "Rock & Roll", "Hard Rock", "Folk", - "Folk-Rock", "National Folk", "Swing", "Fast Fusion", "Bebob", "Latin", - "Revival", "Celtic", "Bluegrass", "Avantgarde", "Gothic Rock", - "Progressive Rock", "Psychedelic Rock", "Symphonic Rock", "Slow Rock", - "Big Band", "Chorus", "Easy Listening", "Acoustic", "Humour", "Speech", - "Chanson", "Opera", "Chamber Music", "Sonata", "Symphony", "Booty Bass", - "Primus", "Porn Groove", "Satire", "Slow Jam", "Club", "Tango", "Samba", - "Folklore", "Ballad", "Power Ballad", "Rhythmic Soul", "Freestyle", "Duet", - "Punk Rock", "Drum Solo", "A Cappella", "Euro-House", "Dance Hall", - "Goa", "Drum & Bass", "Club-House", "Hardcore", "Terror", "Indie", - "BritPop", "Negerpunk", "Polsk Punk", "Beat", "Christian Gangsta", - "Heavy Metal", "Black Metal", "Crossover", "Contemporary Christian", - "Christian Rock", "Merengue", "Salsa", "Thrash Metal", "Anime", "JPop", - "SynthPop" -}; - -#define GENRE_NAME_COUNT \ - ((int)(sizeof genre_names / sizeof (const char *const))) - -static const int genre_alpha_map[] = { - 123, 34, 74, 73, 99, 20, 40, 26, 145, 90, 116, 41, 135, 85, 96, 138, 89, 0, - 107, 132, 65, 88, 104, 102, 97, 136, 61, 141, 32, 1, 112, 128, 57, 140, 2, - 139, 58, 3, 125, 50, 22, 4, 55, 127, 122, 120, 98, 52, 48, 54, 124, 25, 84, - 80, 115, 81, 119, 5, 30, 36, 59, 126, 38, 49, 91, 6, 129, 79, 137, 7, 35, - 100, 131, 19, 33, 46, 47, 8, 29, 146, 63, 86, 71, 45, 142, 9, 77, 82, 64, - 133, 10, 66, 39, 11, 103, 12, 75, 134, 13, 53, 62, 109, 117, 23, 108, 92, - 67, 93, 43, 121, 15, 68, 14, 16, 76, 87, 118, 17, 78, 143, 114, 110, 69, 21, - 111, 95, 105, 42, 37, 24, 56, 44, 101, 83, 94, 106, 147, 113, 18, 51, 130, - 144, 60, 70, 31, 72, 27, 28 -}; - -#define GENRE_ALPHA_COUNT ((int)(sizeof genre_alpha_map / sizeof (int))) - -#define GENRE_INDEX_OTHER 12 - - -#define FRAME_ID(a, b, c, d) \ - ( ((unsigned long)(a) << 24) \ - | ((unsigned long)(b) << 16) \ - | ((unsigned long)(c) << 8) \ - | ((unsigned long)(d) << 0) ) - -typedef enum UsualStringIDs { ID_TITLE = FRAME_ID('T', 'I', 'T', '2') - , ID_ARTIST = FRAME_ID('T', 'P', 'E', '1') - , ID_ALBUM = FRAME_ID('T', 'A', 'L', 'B') - , ID_GENRE = FRAME_ID('T', 'C', 'O', 'N') - , ID_ENCODER = FRAME_ID('T', 'S', 'S', 'E') - , ID_PLAYLENGTH = FRAME_ID('T', 'L', 'E', 'N') - , ID_COMMENT = FRAME_ID('C', 'O', 'M', 'M') /* full text string */ -} UsualStringIDs; - -typedef enum NumericStringIDs { ID_DATE = FRAME_ID('T', 'D', 'A', 'T') /* "ddMM" */ - , ID_TIME = FRAME_ID('T', 'I', 'M', 'E') /* "hhmm" */ - , ID_TPOS = FRAME_ID('T', 'P', 'O', 'S') /* '0'-'9' and '/' allowed */ - , ID_TRACK = FRAME_ID('T', 'R', 'C', 'K') /* '0'-'9' and '/' allowed */ - , ID_YEAR = FRAME_ID('T', 'Y', 'E', 'R') /* "yyyy" */ -} NumericStringIDs; - -typedef enum MiscIDs { ID_TXXX = FRAME_ID('T', 'X', 'X', 'X') - , ID_WXXX = FRAME_ID('W', 'X', 'X', 'X') - , ID_SYLT = FRAME_ID('S', 'Y', 'L', 'T') - , ID_APIC = FRAME_ID('A', 'P', 'I', 'C') - , ID_GEOB = FRAME_ID('G', 'E', 'O', 'B') - , ID_PCNT = FRAME_ID('P', 'C', 'N', 'T') - , ID_AENC = FRAME_ID('A', 'E', 'N', 'C') - , ID_LINK = FRAME_ID('L', 'I', 'N', 'K') - , ID_ENCR = FRAME_ID('E', 'N', 'C', 'R') - , ID_GRID = FRAME_ID('G', 'R', 'I', 'D') - , ID_PRIV = FRAME_ID('P', 'R', 'I', 'V') - , ID_USLT = FRAME_ID('U', 'S', 'L', 'T') /* full text string */ - , ID_USER = FRAME_ID('U', 'S', 'E', 'R') /* full text string */ - , ID_PCST = FRAME_ID('P', 'C', 'S', 'T') /* iTunes Podcast indicator, only presence important */ - , ID_WFED = FRAME_ID('W', 'F', 'E', 'D') /* iTunes Podcast URL as TEXT FRAME !!! violates standard */ -} MiscIDs; - - -static int -frame_id_matches(int id, int mask) -{ - int result = 0, i, window = 0xff; - for (i = 0; i < 4; ++i, window <<= 8) { - int const mw = (mask & window); - int const iw = (id & window); - if (mw != 0 && mw != iw) { - result |= iw; - } - } - return result; -} - -static int -isFrameIdMatching(int id, int mask) -{ - return frame_id_matches(id, mask) == 0 ? 1 : 0; -} - -static int -test_tag_spec_flags(lame_internal_flags const *gfc, unsigned int tst) -{ - return (gfc->tag_spec.flags & tst) != 0u ? 1 : 0; -} - -#if 0 -static void -debug_tag_spec_flags(lame_internal_flags * gfc, const char* info) -{ - MSGF(gfc, "%s\n", info); - MSGF(gfc, "CHANGED_FLAG : %d\n", test_tag_spec_flags(gfc, CHANGED_FLAG )); - MSGF(gfc, "ADD_V2_FLAG : %d\n", test_tag_spec_flags(gfc, ADD_V2_FLAG )); - MSGF(gfc, "V1_ONLY_FLAG : %d\n", test_tag_spec_flags(gfc, V1_ONLY_FLAG )); - MSGF(gfc, "V2_ONLY_FLAG : %d\n", test_tag_spec_flags(gfc, V2_ONLY_FLAG )); - MSGF(gfc, "SPACE_V1_FLAG : %d\n", test_tag_spec_flags(gfc, SPACE_V1_FLAG)); - MSGF(gfc, "PAD_V2_FLAG : %d\n", test_tag_spec_flags(gfc, PAD_V2_FLAG )); -} -#endif - -static int -is_lame_internal_flags_null(lame_t gfp) -{ - return (gfp && gfp->internal_flags) ? 0 : 1; -} - -static int -id3v2_add_ucs2_lng(lame_t gfp, uint32_t frame_id, unsigned short const *desc, unsigned short const *text); -static int -id3v2_add_latin1_lng(lame_t gfp, uint32_t frame_id, char const *desc, char const *text); - - -static void -copyV1ToV2(lame_t gfp, int frame_id, char const *s) -{ - lame_internal_flags *gfc = gfp != 0 ? gfp->internal_flags : 0; - if (gfc != 0) { - unsigned int flags = gfc->tag_spec.flags; - id3v2_add_latin1_lng(gfp, frame_id, 0, s); - gfc->tag_spec.flags = flags; -#if 0 - debug_tag_spec_flags(gfc, "copyV1ToV2"); -#endif - } -} - - -static void -id3v2AddLameVersion(lame_t gfp) -{ - char buffer[1024]; - const char *b = get_lame_os_bitness(); - const char *v = get_lame_version(); - const char *u = get_lame_url(); - const size_t lenb = strlen(b); - - if (lenb > 0) { - sprintf(buffer, "LAME %s version %s (%s)", b, v, u); - } - else { - sprintf(buffer, "LAME version %s (%s)", v, u); - } - copyV1ToV2(gfp, ID_ENCODER, buffer); -} - -static void -id3v2AddAudioDuration(lame_t gfp, double ms) -{ - SessionConfig_t const *const cfg = &gfp->internal_flags->cfg; /* caller checked pointers */ - char buffer[1024]; - double const max_ulong = MAX_U_32_NUM; - unsigned long playlength_ms; - - ms *= 1000; - ms /= cfg->samplerate_in; - if (ms > max_ulong) { - playlength_ms = max_ulong; - } - else if (ms < 0) { - playlength_ms = 0; - } - else { - playlength_ms = ms; - } - sprintf(buffer, "%lu", playlength_ms); - copyV1ToV2(gfp, ID_PLAYLENGTH, buffer); -} - -void -id3tag_genre_list(void (*handler) (int, const char *, void *), void *cookie) -{ - if (handler) { - int i; - for (i = 0; i < GENRE_NAME_COUNT; ++i) { - if (i < GENRE_ALPHA_COUNT) { - int j = genre_alpha_map[i]; - handler(j, genre_names[j], cookie); - } - } - } -} - -#define GENRE_NUM_UNKNOWN 255 - - - -void -id3tag_init(lame_t gfp) -{ - lame_internal_flags *gfc = 0; - - if (is_lame_internal_flags_null(gfp)) { - return; - } - gfc = gfp->internal_flags; - free_id3tag(gfc); - memset(&gfc->tag_spec, 0, sizeof gfc->tag_spec); - gfc->tag_spec.genre_id3v1 = GENRE_NUM_UNKNOWN; - gfc->tag_spec.padding_size = 128; - id3v2AddLameVersion(gfp); -} - - - -void -id3tag_add_v2(lame_t gfp) -{ - lame_internal_flags *gfc = 0; - - if (is_lame_internal_flags_null(gfp)) { - return; - } - gfc = gfp->internal_flags; - gfc->tag_spec.flags &= ~V1_ONLY_FLAG; - gfc->tag_spec.flags |= ADD_V2_FLAG; -} - -void -id3tag_v1_only(lame_t gfp) -{ - lame_internal_flags *gfc = 0; - - if (is_lame_internal_flags_null(gfp)) { - return; - } - gfc = gfp->internal_flags; - gfc->tag_spec.flags &= ~(ADD_V2_FLAG | V2_ONLY_FLAG); - gfc->tag_spec.flags |= V1_ONLY_FLAG; -} - -void -id3tag_v2_only(lame_t gfp) -{ - lame_internal_flags *gfc = 0; - - if (is_lame_internal_flags_null(gfp)) { - return; - } - gfc = gfp->internal_flags; - gfc->tag_spec.flags &= ~V1_ONLY_FLAG; - gfc->tag_spec.flags |= V2_ONLY_FLAG; -} - -void -id3tag_space_v1(lame_t gfp) -{ - lame_internal_flags *gfc = 0; - - if (is_lame_internal_flags_null(gfp)) { - return; - } - gfc = gfp->internal_flags; - gfc->tag_spec.flags &= ~V2_ONLY_FLAG; - gfc->tag_spec.flags |= SPACE_V1_FLAG; -} - -void -id3tag_pad_v2(lame_t gfp) -{ - id3tag_set_pad(gfp, 128); -} - -void -id3tag_set_pad(lame_t gfp, size_t n) -{ - lame_internal_flags *gfc = 0; - - if (is_lame_internal_flags_null(gfp)) { - return; - } - gfc = gfp->internal_flags; - gfc->tag_spec.flags &= ~V1_ONLY_FLAG; - gfc->tag_spec.flags |= PAD_V2_FLAG; - gfc->tag_spec.flags |= ADD_V2_FLAG; - gfc->tag_spec.padding_size = (unsigned int)n; -} - -static int -hasUcs2ByteOrderMarker(unsigned short bom) -{ - if (bom == 0xFFFEu || bom == 0xFEFFu) { - return 1; - } - return 0; -} - - -static unsigned short -swap_bytes(unsigned short w) -{ - return (0xff00u & (w << 8)) | (0x00ffu & (w >> 8)); -} - - -static unsigned short -toLittleEndian(unsigned short bom, unsigned short c) -{ - if (bom == 0xFFFEu) { - return swap_bytes(c); - } - return c; -} - -static unsigned short -fromLatin1Char(const unsigned short* s, unsigned short c) -{ - if (s[0] == 0xFFFEu) { - return swap_bytes(c); - } - return c; -} - - -static size_t -local_strdup(char **dst, const char *src) -{ - if (dst == 0) { - return 0; - } - free(*dst); - *dst = 0; - if (src != 0) { - size_t n; - for (n = 0; src[n] != 0; ++n) { /* calc src string length */ - } - if (n > 0) { /* string length without zero termination */ - assert(sizeof(*src) == sizeof(**dst)); - *dst = lame_calloc(char, n + 1); - if (*dst != 0) { - memcpy(*dst, src, n * sizeof(**dst)); - (*dst)[n] = 0; - return n; - } - } - } - return 0; -} - -static size_t -local_ucs2_strdup(unsigned short **dst, unsigned short const *src) -{ - if (dst == 0) { - return 0; - } - free(*dst); /* free old string pointer */ - *dst = 0; - if (src != 0) { - size_t n; - for (n = 0; src[n] != 0; ++n) { /* calc src string length */ - } - if (n > 0) { /* string length without zero termination */ - assert(sizeof(*src) >= 2); - assert(sizeof(*src) == sizeof(**dst)); - *dst = lame_calloc(unsigned short, n + 1); - if (*dst != 0) { - memcpy(*dst, src, n * sizeof(**dst)); - (*dst)[n] = 0; - return n; - } - } - } - return 0; -} - - -static size_t -local_ucs2_strlen(unsigned short const *s) -{ - size_t n = 0; - if (s != 0) { - while (*s++) { - ++n; - } - } - return n; -} - - -static size_t -local_ucs2_substr(unsigned short** dst, unsigned short const* src, size_t start, size_t end) -{ - size_t const len = 1 + 1 + ((start < end) ? (end - start) : 0); - size_t n = 0; - unsigned short *ptr = lame_calloc(unsigned short, len); - *dst = ptr; - if (ptr == 0 || src == 0) { - return 0; - } - if (hasUcs2ByteOrderMarker(src[0])) { - ptr[n++] = src[0]; - if (start == 0) { - ++start; - } - } - while (start < end) { - ptr[n++] = src[start++]; - } - ptr[n] = 0; - return n; -} - -static int -local_ucs2_pos(unsigned short const* str, unsigned short c) -{ - int i; - for (i = 0; str != 0 && str[i] != 0; ++i) { - if (str[i] == c) { - return i; - } - } - return -1; -} - -static int -local_char_pos(char const* str, char c) -{ - int i; - for (i = 0; str != 0 && str[i] != 0; ++i) { - if (str[i] == c) { - return i; - } - } - return -1; -} - -static int -maybeLatin1(unsigned short const* text) -{ - if (text) { - unsigned short bom = *text++; - while (*text) { - unsigned short c = toLittleEndian(bom, *text++); - if (c > 0x00fe) return 0; - } - } - return 1; -} - -static int searchGenre(char const* genre); -static int sloppySearchGenre(char const* genre); - -static int -lookupGenre(char const* genre) -{ - char *str; - int num = strtol(genre, &str, 10); - /* is the input a string or a valid number? */ - if (*str) { - num = searchGenre(genre); - if (num == GENRE_NAME_COUNT) { - num = sloppySearchGenre(genre); - } - if (num == GENRE_NAME_COUNT) { - return -2; /* no common genre text found */ - } - } - else { - if ((num < 0) || (num >= GENRE_NAME_COUNT)) { - return -1; /* number unknown */ - } - } - return num; -} - -static unsigned char * -writeLoBytes(unsigned char *frame, unsigned short const *str, size_t n); - -static char* -local_strdup_utf16_to_latin1(unsigned short const* utf16) -{ - size_t len = local_ucs2_strlen(utf16); - unsigned char* latin1 = lame_calloc(unsigned char, len+1); - writeLoBytes(latin1, utf16, len); - return (char*)latin1; -} - - -static int -id3tag_set_genre_utf16(lame_t gfp, unsigned short const* text) -{ - lame_internal_flags* gfc = gfp->internal_flags; - int ret; - if (text == 0) { - return -3; - } - if (!hasUcs2ByteOrderMarker(text[0])) { - return -3; - } - if (maybeLatin1(text)) { - char* latin1 = local_strdup_utf16_to_latin1(text); - int num = lookupGenre(latin1); - free(latin1); - if (num == -1) return -1; /* number out of range */ - if (num >= 0) { /* common genre found */ - gfc->tag_spec.flags |= CHANGED_FLAG; - gfc->tag_spec.genre_id3v1 = num; - copyV1ToV2(gfp, ID_GENRE, genre_names[num]); - return 0; - } - } - ret = id3v2_add_ucs2_lng(gfp, ID_GENRE, 0, text); - if (ret == 0) { - gfc->tag_spec.flags |= CHANGED_FLAG; - gfc->tag_spec.genre_id3v1 = GENRE_INDEX_OTHER; - } - return ret; -} - -/* -Some existing options for ID3 tag can be specified by --tv option -as follows. ---tt , --tv TIT2=value ---ta , --tv TPE1=value ---tl , --tv TALB=value ---ty , --tv TYER=value ---tn , --tv TRCK=value ---tg , --tv TCON=value -(although some are not exactly same)*/ - -int -id3tag_set_albumart(lame_t gfp, const char *image, size_t size) -{ - int mimetype = MIMETYPE_NONE; - lame_internal_flags *gfc = 0; - - if (is_lame_internal_flags_null(gfp)) { - return 0; - } - gfc = gfp->internal_flags; - - if (image != 0) { - unsigned char const *data = (unsigned char const *) image; - /* determine MIME type from the actual image data */ - if (2 < size && data[0] == 0xFF && data[1] == 0xD8) { - mimetype = MIMETYPE_JPEG; - } - else if (4 < size && data[0] == 0x89 && strncmp((const char *) &data[1], "PNG", 3) == 0) { - mimetype = MIMETYPE_PNG; - } - else if (4 < size && strncmp((const char *) data, "GIF8", 4) == 0) { - mimetype = MIMETYPE_GIF; - } - else { - return -1; - } - } - if (gfc->tag_spec.albumart != 0) { - free(gfc->tag_spec.albumart); - gfc->tag_spec.albumart = 0; - gfc->tag_spec.albumart_size = 0; - gfc->tag_spec.albumart_mimetype = MIMETYPE_NONE; - } - if (size < 1 || mimetype == MIMETYPE_NONE) { - return 0; - } - gfc->tag_spec.albumart = lame_calloc(unsigned char, size); - if (gfc->tag_spec.albumart != 0) { - memcpy(gfc->tag_spec.albumart, image, size); - gfc->tag_spec.albumart_size = (unsigned int)size; - gfc->tag_spec.albumart_mimetype = mimetype; - gfc->tag_spec.flags |= CHANGED_FLAG; - id3tag_add_v2(gfp); - } - return 0; -} - -static unsigned char * -set_4_byte_value(unsigned char *bytes, uint32_t value) -{ - int i; - for (i = 3; i >= 0; --i) { - bytes[i] = value & 0xffUL; - value >>= 8; - } - return bytes + 4; -} - -static uint32_t -toID3v2TagId(char const *s) -{ - unsigned int i, x = 0; - if (s == 0) { - return 0; - } - for (i = 0; i < 4 && s[i] != 0; ++i) { - char const c = s[i]; - unsigned int const u = 0x0ff & c; - x <<= 8; - x |= u; - if (c < 'A' || 'Z' < c) { - if (c < '0' || '9' < c) { - return 0; - } - } - } - return x; -} - -static uint32_t -toID3v2TagId_ucs2(unsigned short const *s) -{ - unsigned int i, x = 0; - unsigned short bom = 0; - if (s == 0) { - return 0; - } - bom = s[0]; - if (hasUcs2ByteOrderMarker(bom)) { - ++s; - } - for (i = 0; i < 4 && s[i] != 0; ++i) { - unsigned short const c = toLittleEndian(bom, s[i]); - if (c < 'A' || 'Z' < c) { - if (c < '0' || '9' < c) { - return 0; - } - } - x <<= 8; - x |= c; - } - return x; -} - -#if 0 -static int -isNumericString(uint32_t frame_id) -{ - switch (frame_id) { - case ID_DATE: - case ID_TIME: - case ID_TPOS: - case ID_TRACK: - case ID_YEAR: - return 1; - } - return 0; -} -#endif - -static int -isMultiFrame(uint32_t frame_id) -{ - switch (frame_id) { - case ID_TXXX: - case ID_WXXX: - case ID_COMMENT: - case ID_SYLT: - case ID_APIC: - case ID_GEOB: - case ID_PCNT: - case ID_AENC: - case ID_LINK: - case ID_ENCR: - case ID_GRID: - case ID_PRIV: - return 1; - } - return 0; -} - -#if 0 -static int -isFullTextString(int frame_id) -{ - switch (frame_id) { - case ID_VSLT: - case ID_COMMENT: - return 1; - } - return 0; -} -#endif - -static FrameDataNode * -findNode(id3tag_spec const *tag, uint32_t frame_id, FrameDataNode const *last) -{ - FrameDataNode *node = last ? last->nxt : tag->v2_head; - while (node != 0) { - if (node->fid == frame_id) { - return node; - } - node = node->nxt; - } - return 0; -} - -static void -appendNode(id3tag_spec * tag, FrameDataNode * node) -{ - if (tag->v2_tail == 0 || tag->v2_head == 0) { - tag->v2_head = node; - tag->v2_tail = node; - } - else { - tag->v2_tail->nxt = node; - tag->v2_tail = node; - } -} - -static void -setLang(char *dst, char const *src) -{ - int i; - if (src == 0 || src[0] == 0) { - dst[0] = 'e'; - dst[1] = 'n'; - dst[2] = 'g'; - } - else { - for (i = 0; i < 3 && src && *src; ++i) { - dst[i] = src[i]; - } - for (; i < 3; ++i) { - dst[i] = ' '; - } - } -} - -static int -isSameLang(char const *l1, char const *l2) -{ - char d[3]; - int i; - setLang(d, l2); - for (i = 0; i < 3; ++i) { - char a = tolower(l1[i]); - char b = tolower(d[i]); - if (a < ' ') - a = ' '; - if (b < ' ') - b = ' '; - if (a != b) { - return 0; - } - } - return 1; -} - -static int -isSameDescriptor(FrameDataNode const *node, char const *dsc) -{ - size_t i; - if (node->dsc.enc == 1 && node->dsc.dim > 0) { - return 0; - } - for (i = 0; i < node->dsc.dim; ++i) { - if (!dsc || node->dsc.ptr.l[i] != dsc[i]) { - return 0; - } - } - return 1; -} - -static int -isSameDescriptorUcs2(FrameDataNode const *node, unsigned short const *dsc) -{ - size_t i; - if (node->dsc.enc != 1 && node->dsc.dim > 0) { - return 0; - } - for (i = 0; i < node->dsc.dim; ++i) { - if (!dsc || node->dsc.ptr.u[i] != dsc[i]) { - return 0; - } - } - return 1; -} - -static int -id3v2_add_ucs2(lame_t gfp, uint32_t frame_id, char const *lng, unsigned short const *desc, unsigned short const *text) -{ - lame_internal_flags *gfc = gfp != 0 ? gfp->internal_flags : 0; - if (gfc != 0) { - FrameDataNode *node = findNode(&gfc->tag_spec, frame_id, 0); - char lang[4]; - setLang(lang, lng); - if (isMultiFrame(frame_id)) { - while (node) { - if (isSameLang(node->lng, lang)) { - if (isSameDescriptorUcs2(node, desc)) { - break; - } - } - node = findNode(&gfc->tag_spec, frame_id, node); - } - } - if (node == 0) { - node = lame_calloc(FrameDataNode, 1); - if (node == 0) { - return -254; /* memory problem */ - } - appendNode(&gfc->tag_spec, node); - } - node->fid = frame_id; - setLang(node->lng, lang); - node->dsc.dim = local_ucs2_strdup(&node->dsc.ptr.u, desc); - node->dsc.enc = 1; - node->txt.dim = local_ucs2_strdup(&node->txt.ptr.u, text); - node->txt.enc = 1; - gfc->tag_spec.flags |= (CHANGED_FLAG | ADD_V2_FLAG); - return 0; - } - return -255; -} - -static int -id3v2_add_latin1(lame_t gfp, uint32_t frame_id, char const *lng, char const *desc, char const *text) -{ - lame_internal_flags *gfc = gfp != 0 ? gfp->internal_flags : 0; - if (gfc != 0) { - FrameDataNode *node = findNode(&gfc->tag_spec, frame_id, 0); - char lang[4]; - setLang(lang, lng); - if (isMultiFrame(frame_id)) { - while (node) { - if (isSameLang(node->lng, lang)) { - if (isSameDescriptor(node, desc)) { - break; - } - } - node = findNode(&gfc->tag_spec, frame_id, node); - } - } - if (node == 0) { - node = lame_calloc(FrameDataNode, 1); - if (node == 0) { - return -254; /* memory problem */ - } - appendNode(&gfc->tag_spec, node); - } - node->fid = frame_id; - setLang(node->lng, lang); - node->dsc.dim = local_strdup(&node->dsc.ptr.l, desc); - node->dsc.enc = 0; - node->txt.dim = local_strdup(&node->txt.ptr.l, text); - node->txt.enc = 0; - gfc->tag_spec.flags |= (CHANGED_FLAG | ADD_V2_FLAG); - return 0; - } - return -255; -} - -static char const* -id3v2_get_language(lame_t gfp) -{ - lame_internal_flags const* gfc = gfp ? gfp->internal_flags : 0; - if (gfc) return gfc->tag_spec.language; - return 0; -} - -static int -id3v2_add_ucs2_lng(lame_t gfp, uint32_t frame_id, unsigned short const *desc, unsigned short const *text) -{ - char const* lang = id3v2_get_language(gfp); - return id3v2_add_ucs2(gfp, frame_id, lang, desc, text); -} - -static int -id3v2_add_latin1_lng(lame_t gfp, uint32_t frame_id, char const *desc, char const *text) -{ - char const* lang = id3v2_get_language(gfp); - return id3v2_add_latin1(gfp, frame_id, lang, desc, text); -} - -static int -id3tag_set_userinfo_latin1(lame_t gfp, uint32_t id, char const *fieldvalue) -{ - char const separator = '='; - int rc = -7; - int a = local_char_pos(fieldvalue, separator); - if (a >= 0) { - char* dup = 0; - local_strdup(&dup, fieldvalue); - dup[a] = 0; - rc = id3v2_add_latin1_lng(gfp, id, dup, dup+a+1); - free(dup); - } - return rc; -} - -static int -id3tag_set_userinfo_ucs2(lame_t gfp, uint32_t id, unsigned short const *fieldvalue) -{ - unsigned short const separator = fromLatin1Char(fieldvalue,'='); - int rc = -7; - size_t b = local_ucs2_strlen(fieldvalue); - int a = local_ucs2_pos(fieldvalue, separator); - if (a >= 0) { - unsigned short* dsc = 0, *val = 0; - local_ucs2_substr(&dsc, fieldvalue, 0, a); - local_ucs2_substr(&val, fieldvalue, a+1, b); - rc = id3v2_add_ucs2_lng(gfp, id, dsc, val); - free(dsc); - free(val); - } - return rc; -} - -int -id3tag_set_textinfo_utf16(lame_t gfp, char const *id, unsigned short const *text) -{ - uint32_t const frame_id = toID3v2TagId(id); - if (frame_id == 0) { - return -1; - } - if (is_lame_internal_flags_null(gfp)) { - return 0; - } - if (text == 0) { - return 0; - } - if (!hasUcs2ByteOrderMarker(text[0])) { - return -3; /* BOM missing */ - } - if (frame_id == ID_TXXX || frame_id == ID_WXXX || frame_id == ID_COMMENT) { - return id3tag_set_userinfo_ucs2(gfp, frame_id, text); - } - if (frame_id == ID_GENRE) { - return id3tag_set_genre_utf16(gfp, text); - } - if (frame_id == ID_PCST) { - return id3v2_add_ucs2_lng(gfp, frame_id, 0, text); - } - if (frame_id == ID_USER) { - return id3v2_add_ucs2_lng(gfp, frame_id, text, 0); - } - if (frame_id == ID_WFED) { - return id3v2_add_ucs2_lng(gfp, frame_id, text, 0); /* iTunes expects WFED to be a text frame */ - } - if (isFrameIdMatching(frame_id, FRAME_ID('T', 0, 0, 0)) - ||isFrameIdMatching(frame_id, FRAME_ID('W', 0, 0, 0))) { -#if 0 - if (isNumericString(frame_id)) { - return -2; /* must be Latin-1 encoded */ - } -#endif - return id3v2_add_ucs2_lng(gfp, frame_id, 0, text); - } - return -255; /* not supported by now */ -} - -extern int -id3tag_set_textinfo_ucs2(lame_t gfp, char const *id, unsigned short const *text); - -int -id3tag_set_textinfo_ucs2(lame_t gfp, char const *id, unsigned short const *text) -{ - return id3tag_set_textinfo_utf16(gfp, id, text); -} - -int -id3tag_set_textinfo_latin1(lame_t gfp, char const *id, char const *text) -{ - uint32_t const frame_id = toID3v2TagId(id); - if (frame_id == 0) { - return -1; - } - if (is_lame_internal_flags_null(gfp)) { - return 0; - } - if (text == 0) { - return 0; - } - if (frame_id == ID_TXXX || frame_id == ID_WXXX || frame_id == ID_COMMENT) { - return id3tag_set_userinfo_latin1(gfp, frame_id, text); - } - if (frame_id == ID_GENRE) { - return id3tag_set_genre(gfp, text); - } - if (frame_id == ID_PCST) { - return id3v2_add_latin1_lng(gfp, frame_id, 0, text); - } - if (frame_id == ID_USER) { - return id3v2_add_latin1_lng(gfp, frame_id, text, 0); - } - if (frame_id == ID_WFED) { - return id3v2_add_latin1_lng(gfp, frame_id, text, 0); /* iTunes expects WFED to be a text frame */ - } - if (isFrameIdMatching(frame_id, FRAME_ID('T', 0, 0, 0)) - ||isFrameIdMatching(frame_id, FRAME_ID('W', 0, 0, 0))) { - return id3v2_add_latin1_lng(gfp, frame_id, 0, text); - } - return -255; /* not supported by now */ -} - - -int -id3tag_set_comment_latin1(lame_t gfp, char const *lang, char const *desc, char const *text) -{ - if (is_lame_internal_flags_null(gfp)) { - return 0; - } - return id3v2_add_latin1(gfp, ID_COMMENT, lang, desc, text); -} - - -int -id3tag_set_comment_utf16(lame_t gfp, char const *lang, unsigned short const *desc, unsigned short const *text) -{ - if (is_lame_internal_flags_null(gfp)) { - return 0; - } - return id3v2_add_ucs2(gfp, ID_COMMENT, lang, desc, text); -} - -extern int -id3tag_set_comment_ucs2(lame_t gfp, char const *lang, unsigned short const *desc, unsigned short const *text); - - -int -id3tag_set_comment_ucs2(lame_t gfp, char const *lang, unsigned short const *desc, unsigned short const *text) -{ - if (is_lame_internal_flags_null(gfp)) { - return 0; - } - return id3tag_set_comment_utf16(gfp, lang, desc, text); -} - - -void -id3tag_set_title(lame_t gfp, const char *title) -{ - lame_internal_flags *gfc = gfp != 0 ? gfp->internal_flags : 0; - if (gfc && title && *title) { - local_strdup(&gfc->tag_spec.title, title); - gfc->tag_spec.flags |= CHANGED_FLAG; - copyV1ToV2(gfp, ID_TITLE, title); - } -} - -void -id3tag_set_artist(lame_t gfp, const char *artist) -{ - lame_internal_flags *gfc = gfp != 0 ? gfp->internal_flags : 0; - if (gfc && artist && *artist) { - local_strdup(&gfc->tag_spec.artist, artist); - gfc->tag_spec.flags |= CHANGED_FLAG; - copyV1ToV2(gfp, ID_ARTIST, artist); - } -} - -void -id3tag_set_album(lame_t gfp, const char *album) -{ - lame_internal_flags *gfc = gfp != 0 ? gfp->internal_flags : 0; - if (gfc && album && *album) { - local_strdup(&gfc->tag_spec.album, album); - gfc->tag_spec.flags |= CHANGED_FLAG; - copyV1ToV2(gfp, ID_ALBUM, album); - } -} - -void -id3tag_set_year(lame_t gfp, const char *year) -{ - lame_internal_flags *gfc = gfp != 0 ? gfp->internal_flags : 0; - if (gfc && year && *year) { - int num = atoi(year); - if (num < 0) { - num = 0; - } - /* limit a year to 4 digits so it fits in a version 1 tag */ - if (num > 9999) { - num = 9999; - } - if (num) { - gfc->tag_spec.year = num; - gfc->tag_spec.flags |= CHANGED_FLAG; - } - copyV1ToV2(gfp, ID_YEAR, year); - } -} - -void -id3tag_set_comment(lame_t gfp, const char *comment) -{ - lame_internal_flags *gfc = gfp != 0 ? gfp->internal_flags : 0; - if (gfc && comment && *comment) { - local_strdup(&gfc->tag_spec.comment, comment); - gfc->tag_spec.flags |= CHANGED_FLAG; - { - uint32_t const flags = gfc->tag_spec.flags; - id3v2_add_latin1_lng(gfp, ID_COMMENT, "", comment); - gfc->tag_spec.flags = flags; - } - } -} - -int -id3tag_set_track(lame_t gfp, const char *track) -{ - char const *trackcount; - lame_internal_flags *gfc = gfp != 0 ? gfp->internal_flags : 0; - int ret = 0; - - if (gfc && track && *track) { - int num = atoi(track); - /* check for valid ID3v1 track number range */ - if (num < 1 || num > 255) { - num = 0; - ret = -1; /* track number out of ID3v1 range, ignored for ID3v1 */ - gfc->tag_spec.flags |= (CHANGED_FLAG | ADD_V2_FLAG); - } - if (num) { - gfc->tag_spec.track_id3v1 = num; - gfc->tag_spec.flags |= CHANGED_FLAG; - } - /* Look for the total track count after a "/", same restrictions */ - trackcount = strchr(track, '/'); - if (trackcount && *trackcount) { - gfc->tag_spec.flags |= (CHANGED_FLAG | ADD_V2_FLAG); - } - copyV1ToV2(gfp, ID_TRACK, track); - } - return ret; -} - -/* would use real "strcasecmp" but it isn't portable */ -static int -local_strcasecmp(const char *s1, const char *s2) -{ - unsigned char c1; - unsigned char c2; - do { - c1 = tolower(*s1); - c2 = tolower(*s2); - if (!c1) { - break; - } - ++s1; - ++s2; - } while (c1 == c2); - return c1 - c2; -} - - -static -const char* nextUpperAlpha(const char* p, char x) -{ - char c; - for(c = toupper(*p); *p != 0; c = toupper(*++p)) { - if ('A' <= c && c <= 'Z') { - if (c != x) { - return p; - } - } - } - return p; -} - - -static int -sloppyCompared(const char* p, const char* q) -{ - char cp, cq; - p = nextUpperAlpha(p, 0); - q = nextUpperAlpha(q, 0); - cp = toupper(*p); - cq = toupper(*q); - while (cp == cq) { - if (cp == 0) { - return 1; - } - if (p[1] == '.') { /* some abbrevation */ - while (*q && *q++ != ' ') { - } - } - p = nextUpperAlpha(p, cp); - q = nextUpperAlpha(q, cq); - cp = toupper(*p); - cq = toupper(*q); - } - return 0; -} - - -static int -sloppySearchGenre(const char *genre) -{ - int i; - for (i = 0; i < GENRE_NAME_COUNT; ++i) { - if (sloppyCompared(genre, genre_names[i])) { - return i; - } - } - return GENRE_NAME_COUNT; -} - - -static int -searchGenre(const char* genre) -{ - int i; - for (i = 0; i < GENRE_NAME_COUNT; ++i) { - if (!local_strcasecmp(genre, genre_names[i])) { - return i; - } - } - return GENRE_NAME_COUNT; -} - - -int -id3tag_set_genre(lame_t gfp, const char *genre) -{ - lame_internal_flags *gfc = gfp != 0 ? gfp->internal_flags : 0; - int ret = 0; - if (gfc && genre && *genre) { - int const num = lookupGenre(genre); - if (num == -1) return num; - gfc->tag_spec.flags |= CHANGED_FLAG; - if (num >= 0) { - gfc->tag_spec.genre_id3v1 = num; - genre = genre_names[num]; - } - else { - gfc->tag_spec.genre_id3v1 = GENRE_INDEX_OTHER; - gfc->tag_spec.flags |= ADD_V2_FLAG; - } - copyV1ToV2(gfp, ID_GENRE, genre); - } - return ret; -} - - -static size_t -sizeOfNode(FrameDataNode const *node) -{ - size_t n = 0; - if (node) { - n = 10; /* header size */ - n += 1; /* text encoding flag */ - switch (node->txt.enc) { - default: - case 0: - if (node->dsc.dim > 0) { - n += node->dsc.dim + 1; - } - n += node->txt.dim; - break; - case 1: - if (node->dsc.dim > 0) { - n += (node->dsc.dim+1) * 2; - } - n += node->txt.dim * 2; - break; - } - } - return n; -} - -static size_t -sizeOfCommentNode(FrameDataNode const *node) -{ - size_t n = 0; - if (node) { - n = 10; /* header size */ - n += 1; /* text encoding flag */ - n += 3; /* language */ - switch (node->dsc.enc) { - default: - case 0: - n += 1 + node->dsc.dim; - break; - case 1: - n += 2 + node->dsc.dim * 2; - break; - } - switch (node->txt.enc) { - default: - case 0: - n += node->txt.dim; - break; - case 1: - n += node->txt.dim * 2; - break; - } - } - return n; -} - -static size_t -sizeOfWxxxNode(FrameDataNode const *node) -{ - size_t n = 0; - if (node) { - n = 10; /* header size */ - if (node->dsc.dim > 0) { - n += 1; /* text encoding flag */ - switch (node->dsc.enc) { - default: - case 0: - n += 1 + node->dsc.dim; - break; - case 1: - n += 2 + node->dsc.dim * 2; - break; - } - } - if (node->txt.dim > 0) { - switch (node->txt.enc) { - default: - case 0: - n += node->txt.dim; - break; - case 1: - n += node->txt.dim - 1; /* UCS2 -> Latin1, skip BOM */ - break; - } - } - } - return n; -} - -static unsigned char * -writeChars(unsigned char *frame, char const *str, size_t n) -{ - while (n--) { - *frame++ = *str++; - } - return frame; -} - -static unsigned char * -writeUcs2s(unsigned char *frame, unsigned short const *str, size_t n) -{ - if (n > 0) { - unsigned short const bom = *str; - while (n--) { - unsigned short const c = toLittleEndian(bom, *str++); - *frame++ = 0x00ffu & c; - *frame++ = 0x00ffu & (c >> 8); - } - } - return frame; -} - -static unsigned char * -writeLoBytes(unsigned char *frame, unsigned short const *str, size_t n) -{ - if (n > 0) { - unsigned short const bom = *str; - if (hasUcs2ByteOrderMarker(bom)) { - str++; n--; /* skip BOM */ - } - while (n--) { - unsigned short const c = toLittleEndian(bom, *str++); - if (c < 0x0020u || 0x00ffu < c) { - *frame++ = 0x0020; /* blank */ - } - else { - *frame++ = c; - } - } - } - return frame; -} - -static unsigned char * -set_frame_comment(unsigned char *frame, FrameDataNode const *node) -{ - size_t const n = sizeOfCommentNode(node); - if (n > 10) { - frame = set_4_byte_value(frame, node->fid); - frame = set_4_byte_value(frame, (uint32_t) (n - 10)); - /* clear 2-byte header flags */ - *frame++ = 0; - *frame++ = 0; - /* encoding descriptor byte */ - *frame++ = node->txt.enc == 1 ? 1 : 0; - /* 3 bytes language */ - *frame++ = node->lng[0]; - *frame++ = node->lng[1]; - *frame++ = node->lng[2]; - /* descriptor with zero byte(s) separator */ - if (node->dsc.enc != 1) { - frame = writeChars(frame, node->dsc.ptr.l, node->dsc.dim); - *frame++ = 0; - } - else { - frame = writeUcs2s(frame, node->dsc.ptr.u, node->dsc.dim); - *frame++ = 0; - *frame++ = 0; - } - /* comment full text */ - if (node->txt.enc != 1) { - frame = writeChars(frame, node->txt.ptr.l, node->txt.dim); - } - else { - frame = writeUcs2s(frame, node->txt.ptr.u, node->txt.dim); - } - } - return frame; -} - -static unsigned char * -set_frame_custom2(unsigned char *frame, FrameDataNode const *node) -{ - size_t const n = sizeOfNode(node); - if (n > 10) { - frame = set_4_byte_value(frame, node->fid); - frame = set_4_byte_value(frame, (unsigned long) (n - 10)); - /* clear 2-byte header flags */ - *frame++ = 0; - *frame++ = 0; - /* clear 1 encoding descriptor byte to indicate ISO-8859-1 format */ - *frame++ = node->txt.enc == 1 ? 1 : 0; - if (node->dsc.dim > 0) { - if (node->dsc.enc != 1) { - frame = writeChars(frame, node->dsc.ptr.l, node->dsc.dim); - *frame++ = 0; - } - else { - frame = writeUcs2s(frame, node->dsc.ptr.u, node->dsc.dim); - *frame++ = 0; - *frame++ = 0; - } - } - if (node->txt.enc != 1) { - frame = writeChars(frame, node->txt.ptr.l, node->txt.dim); - } - else { - frame = writeUcs2s(frame, node->txt.ptr.u, node->txt.dim); - } - } - return frame; -} - -static unsigned char * -set_frame_wxxx(unsigned char *frame, FrameDataNode const *node) -{ - size_t const n = sizeOfWxxxNode(node); - if (n > 10) { - frame = set_4_byte_value(frame, node->fid); - frame = set_4_byte_value(frame, (unsigned long) (n - 10)); - /* clear 2-byte header flags */ - *frame++ = 0; - *frame++ = 0; - if (node->dsc.dim > 0) { - /* clear 1 encoding descriptor byte to indicate ISO-8859-1 format */ - *frame++ = node->dsc.enc == 1 ? 1 : 0; - if (node->dsc.enc != 1) { - frame = writeChars(frame, node->dsc.ptr.l, node->dsc.dim); - *frame++ = 0; - } - else { - frame = writeUcs2s(frame, node->dsc.ptr.u, node->dsc.dim); - *frame++ = 0; - *frame++ = 0; - } - } - if (node->txt.enc != 1) { - frame = writeChars(frame, node->txt.ptr.l, node->txt.dim); - } - else { - frame = writeLoBytes(frame, node->txt.ptr.u, node->txt.dim); - } - } - return frame; -} - -static unsigned char * -set_frame_apic(unsigned char *frame, const char *mimetype, const unsigned char *data, size_t size) -{ - /* ID3v2.3 standard APIC frame: - *

- * Text encoding $xx - * MIME type $00 - * Picture type $xx - * Description $00 (00) - * Picture data - */ - if (mimetype && data && size) { - frame = set_4_byte_value(frame, FRAME_ID('A', 'P', 'I', 'C')); - frame = set_4_byte_value(frame, (unsigned long) (4 + strlen(mimetype) + size)); - /* clear 2-byte header flags */ - *frame++ = 0; - *frame++ = 0; - /* clear 1 encoding descriptor byte to indicate ISO-8859-1 format */ - *frame++ = 0; - /* copy mime_type */ - while (*mimetype) { - *frame++ = *mimetype++; - } - *frame++ = 0; - /* set picture type to 0 */ - *frame++ = 0; - /* empty description field */ - *frame++ = 0; - /* copy the image data */ - while (size--) { - *frame++ = *data++; - } - } - return frame; -} - -int -id3tag_set_fieldvalue(lame_t gfp, const char *fieldvalue) -{ - if (is_lame_internal_flags_null(gfp)) { - return 0; - } - if (fieldvalue && *fieldvalue) { - if (strlen(fieldvalue) < 5 || fieldvalue[4] != '=') { - return -1; - } - return id3tag_set_textinfo_latin1(gfp, fieldvalue, &fieldvalue[5]); - } - return 0; -} - -int -id3tag_set_fieldvalue_utf16(lame_t gfp, const unsigned short *fieldvalue) -{ - if (is_lame_internal_flags_null(gfp)) { - return 0; - } - if (fieldvalue && *fieldvalue) { - size_t dx = hasUcs2ByteOrderMarker(fieldvalue[0]); - unsigned short const separator = fromLatin1Char(fieldvalue, '='); - char fid[5] = {0,0,0,0,0}; - uint32_t const frame_id = toID3v2TagId_ucs2(fieldvalue); - if (local_ucs2_strlen(fieldvalue) < (5+dx) || fieldvalue[4+dx] != separator) { - return -1; - } - fid[0] = (frame_id >> 24) & 0x0ff; - fid[1] = (frame_id >> 16) & 0x0ff; - fid[2] = (frame_id >> 8) & 0x0ff; - fid[3] = frame_id & 0x0ff; - if (frame_id != 0) { - unsigned short* txt = 0; - int rc; - local_ucs2_substr(&txt, fieldvalue, dx+5, local_ucs2_strlen(fieldvalue)); - rc = id3tag_set_textinfo_utf16(gfp, fid, txt); - free(txt); - return rc; - } - } - return -1; -} - -extern int -id3tag_set_fieldvalue_ucs2(lame_t gfp, const unsigned short *fieldvalue); - -int -id3tag_set_fieldvalue_ucs2(lame_t gfp, const unsigned short *fieldvalue) -{ - if (is_lame_internal_flags_null(gfp)) { - return 0; - } - return id3tag_set_fieldvalue_utf16(gfp, fieldvalue); -} - -size_t -lame_get_id3v2_tag(lame_t gfp, unsigned char *buffer, size_t size) -{ - lame_internal_flags *gfc = 0; - - if (is_lame_internal_flags_null(gfp)) { - return 0; - } - gfc = gfp->internal_flags; - if (test_tag_spec_flags(gfc, V1_ONLY_FLAG)) { - return 0; - } -#if 0 - debug_tag_spec_flags(gfc, "lame_get_id3v2_tag"); -#endif - { - int usev2 = test_tag_spec_flags(gfc, ADD_V2_FLAG | V2_ONLY_FLAG); - /* calculate length of four fields which may not fit in verion 1 tag */ - size_t title_length = gfc->tag_spec.title ? strlen(gfc->tag_spec.title) : 0; - size_t artist_length = gfc->tag_spec.artist ? strlen(gfc->tag_spec.artist) : 0; - size_t album_length = gfc->tag_spec.album ? strlen(gfc->tag_spec.album) : 0; - size_t comment_length = gfc->tag_spec.comment ? strlen(gfc->tag_spec.comment) : 0; - /* write tag if explicitly requested or if fields overflow */ - if ((title_length > 30) - || (artist_length > 30) - || (album_length > 30) - || (comment_length > 30) - || (gfc->tag_spec.track_id3v1 && (comment_length > 28))) { - usev2 = 1; - } - if (usev2) { - size_t tag_size; - unsigned char *p; - size_t adjusted_tag_size; - const char *albumart_mime = NULL; - static const char *mime_jpeg = "image/jpeg"; - static const char *mime_png = "image/png"; - static const char *mime_gif = "image/gif"; - - if (gfp->num_samples != MAX_U_32_NUM) { - id3v2AddAudioDuration(gfp, gfp->num_samples); - } - - /* calulate size of tag starting with 10-byte tag header */ - tag_size = 10; - if (gfc->tag_spec.albumart && gfc->tag_spec.albumart_size) { - switch (gfc->tag_spec.albumart_mimetype) { - case MIMETYPE_JPEG: - albumart_mime = mime_jpeg; - break; - case MIMETYPE_PNG: - albumart_mime = mime_png; - break; - case MIMETYPE_GIF: - albumart_mime = mime_gif; - break; - } - if (albumart_mime) { - tag_size += 10 + 4 + strlen(albumart_mime) + gfc->tag_spec.albumart_size; - } - } - { - id3tag_spec *tag = &gfc->tag_spec; - if (tag->v2_head != 0) { - FrameDataNode *node; - for (node = tag->v2_head; node != 0; node = node->nxt) { - if (node->fid == ID_COMMENT || node->fid == ID_USER) { - tag_size += sizeOfCommentNode(node); - } - else if (isFrameIdMatching(node->fid, FRAME_ID('W',0,0,0))) { - tag_size += sizeOfWxxxNode(node); - } - else { - tag_size += sizeOfNode(node); - } - } - } - } - if (test_tag_spec_flags(gfc, PAD_V2_FLAG)) { - /* add some bytes of padding */ - tag_size += gfc->tag_spec.padding_size; - } - if (size < tag_size) { - return tag_size; - } - if (buffer == 0) { - return 0; - } - p = buffer; - /* set tag header starting with file identifier */ - *p++ = 'I'; - *p++ = 'D'; - *p++ = '3'; - /* set version number word */ - *p++ = 3; - *p++ = 0; - /* clear flags byte */ - *p++ = 0; - /* calculate and set tag size = total size - header size */ - adjusted_tag_size = tag_size - 10; - /* encode adjusted size into four bytes where most significant - * bit is clear in each byte, for 28-bit total */ - *p++ = (unsigned char) ((adjusted_tag_size >> 21) & 0x7fu); - *p++ = (unsigned char) ((adjusted_tag_size >> 14) & 0x7fu); - *p++ = (unsigned char) ((adjusted_tag_size >> 7) & 0x7fu); - *p++ = (unsigned char) (adjusted_tag_size & 0x7fu); - - /* - * NOTE: The remainder of the tag (frames and padding, if any) - * are not "unsynchronized" to prevent false MPEG audio headers - * from appearing in the bitstream. Why? Well, most players - * and utilities know how to skip the ID3 version 2 tag by now - * even if they don't read its contents, and it's actually - * very unlikely that such a false "sync" pattern would occur - * in just the simple text frames added here. - */ - - /* set each frame in tag */ - { - id3tag_spec *tag = &gfc->tag_spec; - if (tag->v2_head != 0) { - FrameDataNode *node; - for (node = tag->v2_head; node != 0; node = node->nxt) { - if (node->fid == ID_COMMENT || node->fid == ID_USER) { - p = set_frame_comment(p, node); - } - else if (isFrameIdMatching(node->fid,FRAME_ID('W',0,0,0))) { - p = set_frame_wxxx(p, node); - } - else { - p = set_frame_custom2(p, node); - } - } - } - } - if (albumart_mime) { - p = set_frame_apic(p, albumart_mime, gfc->tag_spec.albumart, - gfc->tag_spec.albumart_size); - } - /* clear any padding bytes */ - memset(p, 0, tag_size - (p - buffer)); - return tag_size; - } - } - return 0; -} - -int -id3tag_write_v2(lame_t gfp) -{ - lame_internal_flags *gfc = 0; - - if (is_lame_internal_flags_null(gfp)) { - return 0; - } - gfc = gfp->internal_flags; -#if 0 - debug_tag_spec_flags(gfc, "write v2"); -#endif - if (test_tag_spec_flags(gfc, V1_ONLY_FLAG)) { - return 0; - } - if (test_tag_spec_flags(gfc, CHANGED_FLAG)) { - unsigned char *tag = 0; - size_t tag_size, n; - - n = lame_get_id3v2_tag(gfp, 0, 0); - tag = lame_calloc(unsigned char, n); - if (tag == 0) { - return -1; - } - tag_size = lame_get_id3v2_tag(gfp, tag, n); - if (tag_size > n) { - free(tag); - return -1; - } - else { - size_t i; - /* write tag directly into bitstream at current position */ - for (i = 0; i < tag_size; ++i) { - add_dummy_byte(gfc, tag[i], 1); - } - } - free(tag); - return (int) tag_size; /* ok, tag should not exceed 2GB */ - } - return 0; -} - -static unsigned char * -set_text_field(unsigned char *field, const char *text, size_t size, int pad) -{ - while (size--) { - if (text && *text) { - *field++ = *text++; - } - else { - *field++ = pad; - } - } - return field; -} - -size_t -lame_get_id3v1_tag(lame_t gfp, unsigned char *buffer, size_t size) -{ - size_t const tag_size = 128; - lame_internal_flags *gfc; - - if (gfp == 0) { - return 0; - } - if (size < tag_size) { - return tag_size; - } - gfc = gfp->internal_flags; - if (gfc == 0) { - return 0; - } - if (buffer == 0) { - return 0; - } - if (test_tag_spec_flags(gfc, V2_ONLY_FLAG)) { - return 0; - } - if (test_tag_spec_flags(gfc, CHANGED_FLAG)) { - unsigned char *p = buffer; - int pad = test_tag_spec_flags(gfc, SPACE_V1_FLAG) ? ' ' : 0; - char year[5]; - - /* set tag identifier */ - *p++ = 'T'; - *p++ = 'A'; - *p++ = 'G'; - /* set each field in tag */ - p = set_text_field(p, gfc->tag_spec.title, 30, pad); - p = set_text_field(p, gfc->tag_spec.artist, 30, pad); - p = set_text_field(p, gfc->tag_spec.album, 30, pad); - sprintf(year, "%d", gfc->tag_spec.year); - p = set_text_field(p, gfc->tag_spec.year ? year : NULL, 4, pad); - /* limit comment field to 28 bytes if a track is specified */ - p = set_text_field(p, gfc->tag_spec.comment, gfc->tag_spec.track_id3v1 ? 28 : 30, pad); - if (gfc->tag_spec.track_id3v1) { - /* clear the next byte to indicate a version 1.1 tag */ - *p++ = 0; - *p++ = gfc->tag_spec.track_id3v1; - } - *p++ = gfc->tag_spec.genre_id3v1; - return tag_size; - } - return 0; -} - -int -id3tag_write_v1(lame_t gfp) -{ - lame_internal_flags* gfc = 0; - size_t i, n, m; - unsigned char tag[128]; - - if (is_lame_internal_flags_null(gfp)) { - return 0; - } - gfc = gfp->internal_flags; - - m = sizeof(tag); - n = lame_get_id3v1_tag(gfp, tag, m); - if (n > m) { - return 0; - } - /* write tag directly into bitstream at current position */ - for (i = 0; i < n; ++i) { - add_dummy_byte(gfc, tag[i], 1); - } - return (int) n; /* ok, tag has fixed size of 128 bytes, well below 2GB */ -} diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/id3tag.h b/recorderlib/src/main/jni/lame-3.100_libmp3lame/id3tag.h deleted file mode 100644 index 9cd9ad9..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/id3tag.h +++ /dev/null @@ -1,64 +0,0 @@ - -#ifndef LAME_ID3_H -#define LAME_ID3_H - - -#define CHANGED_FLAG (1U << 0) -#define ADD_V2_FLAG (1U << 1) -#define V1_ONLY_FLAG (1U << 2) -#define V2_ONLY_FLAG (1U << 3) -#define SPACE_V1_FLAG (1U << 4) -#define PAD_V2_FLAG (1U << 5) - -enum { - MIMETYPE_NONE = 0, - MIMETYPE_JPEG, - MIMETYPE_PNG, - MIMETYPE_GIF -}; - -typedef struct FrameDataNode { - struct FrameDataNode *nxt; - uint32_t fid; /* Frame Identifier */ - char lng[4]; /* 3-character language descriptor */ - struct { - union { - char *l; /* ptr to Latin-1 chars */ - unsigned short *u; /* ptr to UCS-2 text */ - unsigned char *b; /* ptr to raw bytes */ - } ptr; - size_t dim; - int enc; /* 0:Latin-1, 1:UCS-2, 2:RAW */ - } dsc , txt; -} FrameDataNode; - - -typedef struct id3tag_spec { - /* private data members */ - unsigned int flags; - int year; - char *title; - char *artist; - char *album; - char *comment; - int track_id3v1; - int genre_id3v1; - unsigned char *albumart; - unsigned int albumart_size; - unsigned int padding_size; - int albumart_mimetype; - char language[4]; /* the language of the frame's content, according to ISO-639-2 */ - FrameDataNode *v2_head, *v2_tail; -} id3tag_spec; - - -/* write tag into stream at current position */ -extern int id3tag_write_v2(lame_global_flags * gfp); -extern int id3tag_write_v1(lame_global_flags * gfp); -/* - * NOTE: A version 2 tag will NOT be added unless one of the text fields won't - * fit in a version 1 tag (e.g. the title string is longer than 30 characters), - * or the "id3tag_add_v2" or "id3tag_v2_only" functions are used. - */ - -#endif diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/l3side.h b/recorderlib/src/main/jni/lame-3.100_libmp3lame/l3side.h deleted file mode 100644 index f65bbed..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/l3side.h +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Layer 3 side include file - * - * Copyright (c) 1999 Mark Taylor - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef LAME_L3SIDE_H -#define LAME_L3SIDE_H - -/* max scalefactor band, max(SBMAX_l, SBMAX_s*3, (SBMAX_s-3)*3+8) */ -#define SFBMAX (SBMAX_s*3) - -/* Layer III side information. */ -typedef struct { - int l[1 + SBMAX_l]; - int s[1 + SBMAX_s]; - int psfb21[1 + PSFB21]; - int psfb12[1 + PSFB12]; -} scalefac_struct; - - -typedef struct { - FLOAT l[SBMAX_l]; - FLOAT s[SBMAX_s][3]; -} III_psy_xmin; - -typedef struct { - III_psy_xmin thm; - III_psy_xmin en; -} III_psy_ratio; - -typedef struct { - FLOAT xr[576]; - int l3_enc[576]; - int scalefac[SFBMAX]; - FLOAT xrpow_max; - - int part2_3_length; - int big_values; - int count1; - int global_gain; - int scalefac_compress; - int block_type; - int mixed_block_flag; - int table_select[3]; - int subblock_gain[3 + 1]; - int region0_count; - int region1_count; - int preflag; - int scalefac_scale; - int count1table_select; - - int part2_length; - int sfb_lmax; - int sfb_smin; - int psy_lmax; - int sfbmax; - int psymax; - int sfbdivide; - int width[SFBMAX]; - int window[SFBMAX]; - int count1bits; - /* added for LSF */ - const int *sfb_partition_table; - int slen[4]; - - int max_nonzero_coeff; - char energy_above_cutoff[SFBMAX]; -} gr_info; - -typedef struct { - gr_info tt[2][2]; - int main_data_begin; - int private_bits; - int resvDrain_pre; - int resvDrain_post; - int scfsi[2][4]; -} III_side_info_t; - -#endif diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/lame-analysis.h b/recorderlib/src/main/jni/lame-3.100_libmp3lame/lame-analysis.h deleted file mode 100644 index 5055a60..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/lame-analysis.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - * GTK plotting routines source file - * - * Copyright (c) 1999 Mark Taylor - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef LAME_GTKANAL_H -#define LAME_GTKANAL_H - - -#define READ_AHEAD 40 /* number of frames to read ahead */ -#define MAXMPGLAG READ_AHEAD /* if the mpg123 lag becomes bigger than this - we have to stop */ -#define NUMBACK 6 /* number of frames we can back up */ -#define NUMPINFO (NUMBACK+READ_AHEAD+1) - - - -struct plotting_data { - int frameNum; /* current frame number */ - int frameNum123; - int num_samples; /* number of pcm samples read for this frame */ - double frametime; /* starting time of frame, in seconds */ - double pcmdata[2][1600]; - double pcmdata2[2][1152 + 1152 - DECDELAY]; - double xr[2][2][576]; - double mpg123xr[2][2][576]; - double ms_ratio[2]; - double ms_ener_ratio[2]; - - /* L,R, M and S values */ - double energy_save[4][BLKSIZE]; /* psymodel is one ahead */ - double energy[2][4][BLKSIZE]; - double pe[2][4]; - double thr[2][4][SBMAX_l]; - double en[2][4][SBMAX_l]; - double thr_s[2][4][3 * SBMAX_s]; - double en_s[2][4][3 * SBMAX_s]; - double ers_save[4]; /* psymodel is one ahead */ - double ers[2][4]; - - double sfb[2][2][SBMAX_l]; - double sfb_s[2][2][3 * SBMAX_s]; - double LAMEsfb[2][2][SBMAX_l]; - double LAMEsfb_s[2][2][3 * SBMAX_s]; - - int LAMEqss[2][2]; - int qss[2][2]; - int big_values[2][2]; - int sub_gain[2][2][3]; - - double xfsf[2][2][SBMAX_l]; - double xfsf_s[2][2][3 * SBMAX_s]; - - int over[2][2]; - double tot_noise[2][2]; - double max_noise[2][2]; - double over_noise[2][2]; - int over_SSD[2][2]; - int blocktype[2][2]; - int scalefac_scale[2][2]; - int preflag[2][2]; - int mpg123blocktype[2][2]; - int mixed[2][2]; - int mainbits[2][2]; - int sfbits[2][2]; - int LAMEmainbits[2][2]; - int LAMEsfbits[2][2]; - int framesize, stereo, js, ms_stereo, i_stereo, emph, bitrate, sampfreq, maindata; - int crc, padding; - int scfsi[2], mean_bits, resvsize; - int totbits; -}; -#ifndef plotting_data_defined -#define plotting_data_defined -typedef struct plotting_data plotting_data; -#endif -#if 0 -extern plotting_data *pinfo; -#endif -#endif diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/lame.c b/recorderlib/src/main/jni/lame-3.100_libmp3lame/lame.c deleted file mode 100644 index cb82225..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/lame.c +++ /dev/null @@ -1,2665 +0,0 @@ -/* -*- mode: C; mode: fold -*- */ -/* - * LAME MP3 encoding engine - * - * Copyright (c) 1999-2000 Mark Taylor - * Copyright (c) 2000-2005 Takehiro Tominaga - * Copyright (c) 2000-2017 Robert Hegemann - * Copyright (c) 2000-2005 Gabriel Bouvigne - * Copyright (c) 2000-2004 Alexander Leidinger - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* $Id: lame.c,v 1.377 2017/09/26 12:14:02 robert Exp $ */ - -#ifdef HAVE_CONFIG_H -# include -#endif - - -#include "lame.h" -#include "machine.h" - -#include "encoder.h" -#include "util.h" -#include "lame_global_flags.h" -#include "gain_analysis.h" -#include "bitstream.h" -#include "quantize_pvt.h" -#include "set_get.h" -#include "quantize.h" -#include "psymodel.h" -#include "version.h" -#include "VbrTag.h" -#include "tables.h" - - -#if defined(__FreeBSD__) && !defined(__alpha__) -#include -#endif -#ifdef __riscos__ -#include "asmstuff.h" -#endif - -#ifdef __sun__ -/* woraround for SunOS 4.x, it has SEEK_* defined here */ -#include -#endif - - -#define LAME_DEFAULT_QUALITY 3 - - - -int -is_lame_global_flags_valid(const lame_global_flags * gfp) -{ - if (gfp == NULL) - return 0; - if (gfp->class_id != LAME_ID) - return 0; - return 1; -} - - -int -is_lame_internal_flags_valid(const lame_internal_flags * gfc) -{ - if (gfc == NULL) - return 0; - if (gfc->class_id != LAME_ID) - return 0; - if (gfc->lame_init_params_successful <=0) - return 0; - return 1; -} - - - -static FLOAT -filter_coef(FLOAT x) -{ - if (x > 1.0) - return 0.0; - if (x <= 0.0) - return 1.0; - - return cos(PI / 2 * x); -} - -static void -lame_init_params_ppflt(lame_internal_flags * gfc) -{ - SessionConfig_t *const cfg = &gfc->cfg; - - /***************************************************************/ - /* compute info needed for polyphase filter (filter type==0, default) */ - /***************************************************************/ - - int band, maxband, minband; - FLOAT freq; - int lowpass_band = 32; - int highpass_band = -1; - - if (cfg->lowpass1 > 0) { - minband = 999; - for (band = 0; band <= 31; band++) { - freq = band / 31.0; - /* this band and above will be zeroed: */ - if (freq >= cfg->lowpass2) { - lowpass_band = Min(lowpass_band, band); - } - if (cfg->lowpass1 < freq && freq < cfg->lowpass2) { - minband = Min(minband, band); - } - } - - /* compute the *actual* transition band implemented by - * the polyphase filter */ - if (minband == 999) { - cfg->lowpass1 = (lowpass_band - .75) / 31.0; - } - else { - cfg->lowpass1 = (minband - .75) / 31.0; - } - cfg->lowpass2 = lowpass_band / 31.0; - } - - /* make sure highpass filter is within 90% of what the effective - * highpass frequency will be */ - if (cfg->highpass2 > 0) { - if (cfg->highpass2 < .9 * (.75 / 31.0)) { - cfg->highpass1 = 0; - cfg->highpass2 = 0; - MSGF(gfc, "Warning: highpass filter disabled. " "highpass frequency too small\n"); - } - } - - if (cfg->highpass2 > 0) { - maxband = -1; - for (band = 0; band <= 31; band++) { - freq = band / 31.0; - /* this band and below will be zereod */ - if (freq <= cfg->highpass1) { - highpass_band = Max(highpass_band, band); - } - if (cfg->highpass1 < freq && freq < cfg->highpass2) { - maxband = Max(maxband, band); - } - } - /* compute the *actual* transition band implemented by - * the polyphase filter */ - cfg->highpass1 = highpass_band / 31.0; - if (maxband == -1) { - cfg->highpass2 = (highpass_band + .75) / 31.0; - } - else { - cfg->highpass2 = (maxband + .75) / 31.0; - } - } - - for (band = 0; band < 32; band++) { - FLOAT fc1, fc2; - freq = band / 31.0f; - if (cfg->highpass2 > cfg->highpass1) { - fc1 = filter_coef((cfg->highpass2 - freq) / (cfg->highpass2 - cfg->highpass1 + 1e-20)); - } - else { - fc1 = 1.0f; - } - if (cfg->lowpass2 > cfg->lowpass1) { - fc2 = filter_coef((freq - cfg->lowpass1) / (cfg->lowpass2 - cfg->lowpass1 + 1e-20)); - } - else { - fc2 = 1.0f; - } - gfc->sv_enc.amp_filter[band] = fc1 * fc2; - } -} - - -static void -optimum_bandwidth(double *const lowerlimit, double *const upperlimit, const unsigned bitrate) -{ -/* - * Input: - * bitrate total bitrate in kbps - * - * Output: - * lowerlimit: best lowpass frequency limit for input filter in Hz - * upperlimit: best highpass frequency limit for input filter in Hz - */ - int table_index; - - typedef struct { - int bitrate; /* only indicative value */ - int lowpass; - } band_pass_t; - - const band_pass_t freq_map[] = { - {8, 2000}, - {16, 3700}, - {24, 3900}, - {32, 5500}, - {40, 7000}, - {48, 7500}, - {56, 10000}, - {64, 11000}, - {80, 13500}, - {96, 15100}, - {112, 15600}, - {128, 17000}, - {160, 17500}, - {192, 18600}, - {224, 19400}, - {256, 19700}, - {320, 20500} - }; - - - table_index = nearestBitrateFullIndex(bitrate); - - (void) freq_map[table_index].bitrate; - *lowerlimit = freq_map[table_index].lowpass; - - -/* - * Now we try to choose a good high pass filtering frequency. - * This value is currently not used. - * For fu < 16 kHz: sqrt(fu*fl) = 560 Hz - * For fu = 18 kHz: no high pass filtering - * This gives: - * - * 2 kHz => 160 Hz - * 3 kHz => 107 Hz - * 4 kHz => 80 Hz - * 8 kHz => 40 Hz - * 16 kHz => 20 Hz - * 17 kHz => 10 Hz - * 18 kHz => 0 Hz - * - * These are ad hoc values and these can be optimized if a high pass is available. - */ -/* if (f_low <= 16000) - f_high = 16000. * 20. / f_low; - else if (f_low <= 18000) - f_high = 180. - 0.01 * f_low; - else - f_high = 0.;*/ - - /* - * When we sometimes have a good highpass filter, we can add the highpass - * frequency to the lowpass frequency - */ - - /*if (upperlimit != NULL) - *upperlimit = f_high;*/ - (void) upperlimit; -} - - -static int -optimum_samplefreq(int lowpassfreq, int input_samplefreq) -{ -/* - * Rules: - * - if possible, sfb21 should NOT be used - * - */ - int suggested_samplefreq = 44100; - - if (input_samplefreq >= 48000) - suggested_samplefreq = 48000; - else if (input_samplefreq >= 44100) - suggested_samplefreq = 44100; - else if (input_samplefreq >= 32000) - suggested_samplefreq = 32000; - else if (input_samplefreq >= 24000) - suggested_samplefreq = 24000; - else if (input_samplefreq >= 22050) - suggested_samplefreq = 22050; - else if (input_samplefreq >= 16000) - suggested_samplefreq = 16000; - else if (input_samplefreq >= 12000) - suggested_samplefreq = 12000; - else if (input_samplefreq >= 11025) - suggested_samplefreq = 11025; - else if (input_samplefreq >= 8000) - suggested_samplefreq = 8000; - - if (lowpassfreq == -1) - return suggested_samplefreq; - - if (lowpassfreq <= 15960) - suggested_samplefreq = 44100; - if (lowpassfreq <= 15250) - suggested_samplefreq = 32000; - if (lowpassfreq <= 11220) - suggested_samplefreq = 24000; - if (lowpassfreq <= 9970) - suggested_samplefreq = 22050; - if (lowpassfreq <= 7230) - suggested_samplefreq = 16000; - if (lowpassfreq <= 5420) - suggested_samplefreq = 12000; - if (lowpassfreq <= 4510) - suggested_samplefreq = 11025; - if (lowpassfreq <= 3970) - suggested_samplefreq = 8000; - - if (input_samplefreq < suggested_samplefreq) { - /* choose a valid MPEG sample frequency above the input sample frequency - to avoid SFB21/12 bitrate bloat - rh 061115 - */ - if (input_samplefreq > 44100) { - return 48000; - } - if (input_samplefreq > 32000) { - return 44100; - } - if (input_samplefreq > 24000) { - return 32000; - } - if (input_samplefreq > 22050) { - return 24000; - } - if (input_samplefreq > 16000) { - return 22050; - } - if (input_samplefreq > 12000) { - return 16000; - } - if (input_samplefreq > 11025) { - return 12000; - } - if (input_samplefreq > 8000) { - return 11025; - } - return 8000; - } - return suggested_samplefreq; -} - - - - - -/* set internal feature flags. USER should not access these since - * some combinations will produce strange results */ -static void -lame_init_qval(lame_global_flags * gfp) -{ - lame_internal_flags *const gfc = gfp->internal_flags; - SessionConfig_t *const cfg = &gfc->cfg; - - switch (gfp->quality) { - default: - case 9: /* no psymodel, no noise shaping */ - cfg->noise_shaping = 0; - cfg->noise_shaping_amp = 0; - cfg->noise_shaping_stop = 0; - cfg->use_best_huffman = 0; - cfg->full_outer_loop = 0; - break; - - case 8: - gfp->quality = 7; - /*lint --fallthrough */ - case 7: /* use psymodel (for short block and m/s switching), but no noise shapping */ - cfg->noise_shaping = 0; - cfg->noise_shaping_amp = 0; - cfg->noise_shaping_stop = 0; - cfg->use_best_huffman = 0; - cfg->full_outer_loop = 0; - if (cfg->vbr == vbr_mt || cfg->vbr == vbr_mtrh) { - cfg->full_outer_loop = -1; - } - break; - - case 6: - if (cfg->noise_shaping == 0) - cfg->noise_shaping = 1; - cfg->noise_shaping_amp = 0; - cfg->noise_shaping_stop = 0; - if (cfg->subblock_gain == -1) - cfg->subblock_gain = 1; - cfg->use_best_huffman = 0; - cfg->full_outer_loop = 0; - break; - - case 5: - if (cfg->noise_shaping == 0) - cfg->noise_shaping = 1; - cfg->noise_shaping_amp = 0; - cfg->noise_shaping_stop = 0; - if (cfg->subblock_gain == -1) - cfg->subblock_gain = 1; - cfg->use_best_huffman = 0; - cfg->full_outer_loop = 0; - break; - - case 4: - if (cfg->noise_shaping == 0) - cfg->noise_shaping = 1; - cfg->noise_shaping_amp = 0; - cfg->noise_shaping_stop = 0; - if (cfg->subblock_gain == -1) - cfg->subblock_gain = 1; - cfg->use_best_huffman = 1; - cfg->full_outer_loop = 0; - break; - - case 3: - if (cfg->noise_shaping == 0) - cfg->noise_shaping = 1; - cfg->noise_shaping_amp = 1; - cfg->noise_shaping_stop = 1; - if (cfg->subblock_gain == -1) - cfg->subblock_gain = 1; - cfg->use_best_huffman = 1; - cfg->full_outer_loop = 0; - break; - - case 2: - if (cfg->noise_shaping == 0) - cfg->noise_shaping = 1; - if (gfc->sv_qnt.substep_shaping == 0) - gfc->sv_qnt.substep_shaping = 2; - cfg->noise_shaping_amp = 1; - cfg->noise_shaping_stop = 1; - if (cfg->subblock_gain == -1) - cfg->subblock_gain = 1; - cfg->use_best_huffman = 1; /* inner loop */ - cfg->full_outer_loop = 0; - break; - - case 1: - if (cfg->noise_shaping == 0) - cfg->noise_shaping = 1; - if (gfc->sv_qnt.substep_shaping == 0) - gfc->sv_qnt.substep_shaping = 2; - cfg->noise_shaping_amp = 2; - cfg->noise_shaping_stop = 1; - if (cfg->subblock_gain == -1) - cfg->subblock_gain = 1; - cfg->use_best_huffman = 1; - cfg->full_outer_loop = 0; - break; - - case 0: - if (cfg->noise_shaping == 0) - cfg->noise_shaping = 1; - if (gfc->sv_qnt.substep_shaping == 0) - gfc->sv_qnt.substep_shaping = 2; - cfg->noise_shaping_amp = 2; - cfg->noise_shaping_stop = 1; - if (cfg->subblock_gain == -1) - cfg->subblock_gain = 1; - cfg->use_best_huffman = 1; /*type 2 disabled because of it slowness, - in favor of full outer loop search */ - cfg->full_outer_loop = 1; - break; - } - -} - - - -static double -linear_int(double a, double b, double m) -{ - return a + m * (b - a); -} - - - -/******************************************************************** - * initialize internal params based on data in gf - * (globalflags struct filled in by calling program) - * - * OUTLINE: - * - * We first have some complex code to determine bitrate, - * output samplerate and mode. It is complicated by the fact - * that we allow the user to set some or all of these parameters, - * and need to determine best possible values for the rest of them: - * - * 1. set some CPU related flags - * 2. check if we are mono->mono, stereo->mono or stereo->stereo - * 3. compute bitrate and output samplerate: - * user may have set compression ratio - * user may have set a bitrate - * user may have set a output samplerate - * 4. set some options which depend on output samplerate - * 5. compute the actual compression ratio - * 6. set mode based on compression ratio - * - * The remaining code is much simpler - it just sets options - * based on the mode & compression ratio: - * - * set allow_diff_short based on mode - * select lowpass filter based on compression ratio & mode - * set the bitrate index, and min/max bitrates for VBR modes - * disable VBR tag if it is not appropriate - * initialize the bitstream - * initialize scalefac_band data - * set sideinfo_len (based on channels, CRC, out_samplerate) - * write an id3v2 tag into the bitstream - * write VBR tag into the bitstream - * set mpeg1/2 flag - * estimate the number of frames (based on a lot of data) - * - * now we set more flags: - * nspsytune: - * see code - * VBR modes - * see code - * CBR/ABR - * see code - * - * Finally, we set the algorithm flags based on the gfp->quality value - * lame_init_qval(gfp); - * - ********************************************************************/ -int -lame_init_params(lame_global_flags * gfp) -{ - - int i; - int j; - lame_internal_flags *gfc; - SessionConfig_t *cfg; - - if (!is_lame_global_flags_valid(gfp)) - return -1; - - gfc = gfp->internal_flags; - if (gfc == 0) - return -1; - - if (is_lame_internal_flags_valid(gfc)) - return -1; /* already initialized */ - - /* start updating lame internal flags */ - gfc->class_id = LAME_ID; - gfc->lame_init_params_successful = 0; /* will be set to one, when we get through until the end */ - - if (gfp->samplerate_in < 1) - return -1; /* input sample rate makes no sense */ - if (gfp->num_channels < 1 || 2 < gfp->num_channels) - return -1; /* number of input channels makes no sense */ - if (gfp->samplerate_out != 0) { - int v=0; - if (SmpFrqIndex(gfp->samplerate_out, &v) < 0) - return -1; /* output sample rate makes no sense */ - } - - cfg = &gfc->cfg; - - cfg->enforce_min_bitrate = gfp->VBR_hard_min; - cfg->analysis = gfp->analysis; - if (cfg->analysis) - gfp->write_lame_tag = 0; - - /* some file options not allowed if output is: not specified or stdout */ - if (gfc->pinfo != NULL) - gfp->write_lame_tag = 0; /* disable Xing VBR tag */ - - /* report functions */ - gfc->report_msg = gfp->report.msgf; - gfc->report_dbg = gfp->report.debugf; - gfc->report_err = gfp->report.errorf; - - if (gfp->asm_optimizations.amd3dnow) - gfc->CPU_features.AMD_3DNow = has_3DNow(); - else - gfc->CPU_features.AMD_3DNow = 0; - - if (gfp->asm_optimizations.mmx) - gfc->CPU_features.MMX = has_MMX(); - else - gfc->CPU_features.MMX = 0; - - if (gfp->asm_optimizations.sse) { - gfc->CPU_features.SSE = has_SSE(); - gfc->CPU_features.SSE2 = has_SSE2(); - } - else { - gfc->CPU_features.SSE = 0; - gfc->CPU_features.SSE2 = 0; - } - - - cfg->vbr = gfp->VBR; - cfg->error_protection = gfp->error_protection; - cfg->copyright = gfp->copyright; - cfg->original = gfp->original; - cfg->extension = gfp->extension; - cfg->emphasis = gfp->emphasis; - - cfg->channels_in = gfp->num_channels; - if (cfg->channels_in == 1) - gfp->mode = MONO; - cfg->channels_out = (gfp->mode == MONO) ? 1 : 2; - if (gfp->mode != JOINT_STEREO) - gfp->force_ms = 0; /* forced mid/side stereo for j-stereo only */ - cfg->force_ms = gfp->force_ms; - - if (cfg->vbr == vbr_off && gfp->VBR_mean_bitrate_kbps != 128 && gfp->brate == 0) - gfp->brate = gfp->VBR_mean_bitrate_kbps; - - switch (cfg->vbr) { - case vbr_off: - case vbr_mtrh: - case vbr_mt: - /* these modes can handle free format condition */ - break; - default: - gfp->free_format = 0; /* mode can't be mixed with free format */ - break; - } - - cfg->free_format = gfp->free_format; - - if (cfg->vbr == vbr_off && gfp->brate == 0) { - /* no bitrate or compression ratio specified, use 11.025 */ - if (EQ(gfp->compression_ratio, 0)) - gfp->compression_ratio = 11.025; /* rate to compress a CD down to exactly 128000 bps */ - } - - /* find bitrate if user specify a compression ratio */ - if (cfg->vbr == vbr_off && gfp->compression_ratio > 0) { - - if (gfp->samplerate_out == 0) - gfp->samplerate_out = map2MP3Frequency((int) (0.97 * gfp->samplerate_in)); /* round up with a margin of 3% */ - - /* choose a bitrate for the output samplerate which achieves - * specified compression ratio - */ - gfp->brate = gfp->samplerate_out * 16 * cfg->channels_out / (1.e3 * gfp->compression_ratio); - - /* we need the version for the bitrate table look up */ - cfg->samplerate_index = SmpFrqIndex(gfp->samplerate_out, &cfg->version); - assert(cfg->samplerate_index >=0); - - if (!cfg->free_format) /* for non Free Format find the nearest allowed bitrate */ - gfp->brate = FindNearestBitrate(gfp->brate, cfg->version, gfp->samplerate_out); - } - if (gfp->samplerate_out) { - if (gfp->samplerate_out < 16000) { - gfp->VBR_mean_bitrate_kbps = Max(gfp->VBR_mean_bitrate_kbps, 8); - gfp->VBR_mean_bitrate_kbps = Min(gfp->VBR_mean_bitrate_kbps, 64); - } - else if (gfp->samplerate_out < 32000) { - gfp->VBR_mean_bitrate_kbps = Max(gfp->VBR_mean_bitrate_kbps, 8); - gfp->VBR_mean_bitrate_kbps = Min(gfp->VBR_mean_bitrate_kbps, 160); - } - else { - gfp->VBR_mean_bitrate_kbps = Max(gfp->VBR_mean_bitrate_kbps, 32); - gfp->VBR_mean_bitrate_kbps = Min(gfp->VBR_mean_bitrate_kbps, 320); - } - } - /* WORK IN PROGRESS */ - /* mapping VBR scale to internal VBR quality settings */ - if (gfp->samplerate_out == 0 && (cfg->vbr == vbr_mt || cfg->vbr == vbr_mtrh)) { - float const qval = gfp->VBR_q + gfp->VBR_q_frac; - struct q_map { int sr_a; float qa, qb, ta, tb; int lp; }; - struct q_map const m[9] - = { {48000, 0.0,6.5, 0.0,6.5, 23700} - , {44100, 0.0,6.5, 0.0,6.5, 21780} - , {32000, 6.5,8.0, 5.2,6.5, 15800} - , {24000, 8.0,8.5, 5.2,6.0, 11850} - , {22050, 8.5,9.01, 5.2,6.5, 10892} - , {16000, 9.01,9.4, 4.9,6.5, 7903} - , {12000, 9.4,9.6, 4.5,6.0, 5928} - , {11025, 9.6,9.9, 5.1,6.5, 5446} - , { 8000, 9.9,10., 4.9,6.5, 3952} - }; - for (i = 2; i < 9; ++i) { - if (gfp->samplerate_in == m[i].sr_a) { - if (qval < m[i].qa) { - double d = qval / m[i].qa; - d = d * m[i].ta; - gfp->VBR_q = (int)d; - gfp->VBR_q_frac = d - gfp->VBR_q; - } - } - if (gfp->samplerate_in >= m[i].sr_a) { - if (m[i].qa <= qval && qval < m[i].qb) { - float const q_ = m[i].qb-m[i].qa; - float const t_ = m[i].tb-m[i].ta; - double d = m[i].ta + t_ * (qval-m[i].qa) / q_; - gfp->VBR_q = (int)d; - gfp->VBR_q_frac = d - gfp->VBR_q; - gfp->samplerate_out = m[i].sr_a; - if (gfp->lowpassfreq == 0) { - gfp->lowpassfreq = -1; - } - break; - } - } - } - } - - /****************************************************************/ - /* if a filter has not been enabled, see if we should add one: */ - /****************************************************************/ - if (gfp->lowpassfreq == 0) { - double lowpass = 16000; - double highpass; - - switch (cfg->vbr) { - case vbr_off:{ - optimum_bandwidth(&lowpass, &highpass, gfp->brate); - break; - } - case vbr_abr:{ - optimum_bandwidth(&lowpass, &highpass, gfp->VBR_mean_bitrate_kbps); - break; - } - case vbr_rh:{ - int const x[11] = { - 19500, 19000, 18600, 18000, 17500, 16000, 15600, 14900, 12500, 10000, 3950 - }; - if (0 <= gfp->VBR_q && gfp->VBR_q <= 9) { - double a = x[gfp->VBR_q], b = x[gfp->VBR_q + 1], m = gfp->VBR_q_frac; - lowpass = linear_int(a, b, m); - } - else { - lowpass = 19500; - } - break; - } - case vbr_mtrh: - case vbr_mt:{ - int const x[11] = { - 24000, 19500, 18500, 18000, 17500, 17000, 16500, 15600, 15200, 7230, 3950 - }; - if (0 <= gfp->VBR_q && gfp->VBR_q <= 9) { - double a = x[gfp->VBR_q], b = x[gfp->VBR_q + 1], m = gfp->VBR_q_frac; - lowpass = linear_int(a, b, m); - } - else { - lowpass = 21500; - } - break; - } - default:{ - int const x[11] = { - 19500, 19000, 18500, 18000, 17500, 16500, 15500, 14500, 12500, 9500, 3950 - }; - if (0 <= gfp->VBR_q && gfp->VBR_q <= 9) { - double a = x[gfp->VBR_q], b = x[gfp->VBR_q + 1], m = gfp->VBR_q_frac; - lowpass = linear_int(a, b, m); - } - else { - lowpass = 19500; - } - } - } - - if (gfp->mode == MONO && (cfg->vbr == vbr_off || cfg->vbr == vbr_abr)) - lowpass *= 1.5; - - gfp->lowpassfreq = lowpass; - } - - if (gfp->samplerate_out == 0) { - if (2 * gfp->lowpassfreq > gfp->samplerate_in) { - gfp->lowpassfreq = gfp->samplerate_in / 2; - } - gfp->samplerate_out = optimum_samplefreq((int) gfp->lowpassfreq, gfp->samplerate_in); - } - if (cfg->vbr == vbr_mt || cfg->vbr == vbr_mtrh) { - gfp->lowpassfreq = Min(24000, gfp->lowpassfreq); - } - else { - gfp->lowpassfreq = Min(20500, gfp->lowpassfreq); - } - gfp->lowpassfreq = Min(gfp->samplerate_out / 2, gfp->lowpassfreq); - - if (cfg->vbr == vbr_off) { - gfp->compression_ratio = gfp->samplerate_out * 16 * cfg->channels_out / (1.e3 * gfp->brate); - } - if (cfg->vbr == vbr_abr) { - gfp->compression_ratio = - gfp->samplerate_out * 16 * cfg->channels_out / (1.e3 * gfp->VBR_mean_bitrate_kbps); - } - - cfg->disable_reservoir = gfp->disable_reservoir; - cfg->lowpassfreq = gfp->lowpassfreq; - cfg->highpassfreq = gfp->highpassfreq; - cfg->samplerate_in = gfp->samplerate_in; - cfg->samplerate_out = gfp->samplerate_out; - cfg->mode_gr = cfg->samplerate_out <= 24000 ? 1 : 2; /* Number of granules per frame */ - - - /* - * sample freq bitrate compression ratio - * [kHz] [kbps/channel] for 16 bit input - * 44.1 56 12.6 - * 44.1 64 11.025 - * 44.1 80 8.82 - * 22.05 24 14.7 - * 22.05 32 11.025 - * 22.05 40 8.82 - * 16 16 16.0 - * 16 24 10.667 - * - */ - /* - * For VBR, take a guess at the compression_ratio. - * For example: - * - * VBR_q compression like - * - 4.4 320 kbps/44 kHz - * 0...1 5.5 256 kbps/44 kHz - * 2 7.3 192 kbps/44 kHz - * 4 8.8 160 kbps/44 kHz - * 6 11 128 kbps/44 kHz - * 9 14.7 96 kbps - * - * for lower bitrates, downsample with --resample - */ - - switch (cfg->vbr) { - case vbr_mt: - case vbr_rh: - case vbr_mtrh: - { - /*numbers are a bit strange, but they determine the lowpass value */ - FLOAT const cmp[] = { 5.7, 6.5, 7.3, 8.2, 10, 11.9, 13, 14, 15, 16.5 }; - gfp->compression_ratio = cmp[gfp->VBR_q]; - } - break; - case vbr_abr: - gfp->compression_ratio = - cfg->samplerate_out * 16 * cfg->channels_out / (1.e3 * gfp->VBR_mean_bitrate_kbps); - break; - default: - gfp->compression_ratio = cfg->samplerate_out * 16 * cfg->channels_out / (1.e3 * gfp->brate); - break; - } - - - /* mode = -1 (not set by user) or - * mode = MONO (because of only 1 input channel). - * If mode has not been set, then select J-STEREO - */ - if (gfp->mode == NOT_SET) { - gfp->mode = JOINT_STEREO; - } - - cfg->mode = gfp->mode; - - - /* apply user driven high pass filter */ - if (cfg->highpassfreq > 0) { - cfg->highpass1 = 2. * cfg->highpassfreq; - - if (gfp->highpasswidth >= 0) - cfg->highpass2 = 2. * (cfg->highpassfreq + gfp->highpasswidth); - else /* 0% above on default */ - cfg->highpass2 = (1 + 0.00) * 2. * cfg->highpassfreq; - - cfg->highpass1 /= cfg->samplerate_out; - cfg->highpass2 /= cfg->samplerate_out; - } - else { - cfg->highpass1 = 0; - cfg->highpass2 = 0; - } - /* apply user driven low pass filter */ - cfg->lowpass1 = 0; - cfg->lowpass2 = 0; - if (cfg->lowpassfreq > 0 && cfg->lowpassfreq < (cfg->samplerate_out / 2) ) { - cfg->lowpass2 = 2. * cfg->lowpassfreq; - if (gfp->lowpasswidth >= 0) { - cfg->lowpass1 = 2. * (cfg->lowpassfreq - gfp->lowpasswidth); - if (cfg->lowpass1 < 0) /* has to be >= 0 */ - cfg->lowpass1 = 0; - } - else { /* 0% below on default */ - cfg->lowpass1 = (1 - 0.00) * 2. * cfg->lowpassfreq; - } - cfg->lowpass1 /= cfg->samplerate_out; - cfg->lowpass2 /= cfg->samplerate_out; - } - - - - - /**********************************************************************/ - /* compute info needed for polyphase filter (filter type==0, default) */ - /**********************************************************************/ - lame_init_params_ppflt(gfc); - - - /******************************************************* - * samplerate and bitrate index - *******************************************************/ - cfg->samplerate_index = SmpFrqIndex(cfg->samplerate_out, &cfg->version); - assert(cfg->samplerate_index >= 0); - - if (cfg->vbr == vbr_off) { - if (cfg->free_format) { - gfc->ov_enc.bitrate_index = 0; - } - else { - gfp->brate = FindNearestBitrate(gfp->brate, cfg->version, cfg->samplerate_out); - gfc->ov_enc.bitrate_index = BitrateIndex(gfp->brate, cfg->version, cfg->samplerate_out); - if (gfc->ov_enc.bitrate_index <= 0) { - /* This never happens, because of preceding FindNearestBitrate! - * But, set a sane value, just in case - */ - assert(0); - gfc->ov_enc.bitrate_index = 8; - } - } - } - else { - gfc->ov_enc.bitrate_index = 1; - } - - init_bit_stream_w(gfc); - - j = cfg->samplerate_index + (3 * cfg->version) + 6 * (cfg->samplerate_out < 16000); - for (i = 0; i < SBMAX_l + 1; i++) - gfc->scalefac_band.l[i] = sfBandIndex[j].l[i]; - - for (i = 0; i < PSFB21 + 1; i++) { - int const size = (gfc->scalefac_band.l[22] - gfc->scalefac_band.l[21]) / PSFB21; - int const start = gfc->scalefac_band.l[21] + i * size; - gfc->scalefac_band.psfb21[i] = start; - } - gfc->scalefac_band.psfb21[PSFB21] = 576; - - for (i = 0; i < SBMAX_s + 1; i++) - gfc->scalefac_band.s[i] = sfBandIndex[j].s[i]; - - for (i = 0; i < PSFB12 + 1; i++) { - int const size = (gfc->scalefac_band.s[13] - gfc->scalefac_band.s[12]) / PSFB12; - int const start = gfc->scalefac_band.s[12] + i * size; - gfc->scalefac_band.psfb12[i] = start; - } - gfc->scalefac_band.psfb12[PSFB12] = 192; - - /* determine the mean bitrate for main data */ - if (cfg->mode_gr == 2) /* MPEG 1 */ - cfg->sideinfo_len = (cfg->channels_out == 1) ? 4 + 17 : 4 + 32; - else /* MPEG 2 */ - cfg->sideinfo_len = (cfg->channels_out == 1) ? 4 + 9 : 4 + 17; - - if (cfg->error_protection) - cfg->sideinfo_len += 2; - - { - int k; - - for (k = 0; k < 19; k++) - gfc->sv_enc.pefirbuf[k] = 700 * cfg->mode_gr * cfg->channels_out; - - if (gfp->ATHtype == -1) - gfp->ATHtype = 4; - } - - assert(gfp->VBR_q <= 9); - assert(gfp->VBR_q >= 0); - - switch (cfg->vbr) { - - case vbr_mt: - case vbr_mtrh:{ - if (gfp->strict_ISO < 0) { - gfp->strict_ISO = MDB_MAXIMUM; - } - if (gfp->useTemporal < 0) { - gfp->useTemporal = 0; /* off by default for this VBR mode */ - } - - (void) apply_preset(gfp, 500 - (gfp->VBR_q * 10), 0); - /* The newer VBR code supports only a limited - subset of quality levels: - 9-5=5 are the same, uses x^3/4 quantization - 4-0=0 are the same 5 plus best huffman divide code - */ - if (gfp->quality < 0) - gfp->quality = LAME_DEFAULT_QUALITY; - if (gfp->quality < 5) - gfp->quality = 0; - if (gfp->quality > 7) - gfp->quality = 7; - - /* sfb21 extra only with MPEG-1 at higher sampling rates - */ - if (gfp->experimentalY) - gfc->sv_qnt.sfb21_extra = 0; - else - gfc->sv_qnt.sfb21_extra = (cfg->samplerate_out > 44000); - - break; - - } - case vbr_rh:{ - - (void) apply_preset(gfp, 500 - (gfp->VBR_q * 10), 0); - - /* sfb21 extra only with MPEG-1 at higher sampling rates - */ - if (gfp->experimentalY) - gfc->sv_qnt.sfb21_extra = 0; - else - gfc->sv_qnt.sfb21_extra = (cfg->samplerate_out > 44000); - - /* VBR needs at least the output of GPSYCHO, - * so we have to garantee that by setting a minimum - * quality level, actually level 6 does it. - * down to level 6 - */ - if (gfp->quality > 6) - gfp->quality = 6; - - - if (gfp->quality < 0) - gfp->quality = LAME_DEFAULT_QUALITY; - - break; - } - - default: /* cbr/abr */ { - - /* no sfb21 extra with CBR code - */ - gfc->sv_qnt.sfb21_extra = 0; - - if (gfp->quality < 0) - gfp->quality = LAME_DEFAULT_QUALITY; - - - if (cfg->vbr == vbr_off) - (void) lame_set_VBR_mean_bitrate_kbps(gfp, gfp->brate); - /* second, set parameters depending on bitrate */ - (void) apply_preset(gfp, gfp->VBR_mean_bitrate_kbps, 0); - gfp->VBR = cfg->vbr; - - break; - } - } - - /*initialize default values common for all modes */ - - gfc->sv_qnt.mask_adjust = gfp->maskingadjust; - gfc->sv_qnt.mask_adjust_short = gfp->maskingadjust_short; - - /* just another daily changing developer switch */ - if (gfp->tune) { - gfc->sv_qnt.mask_adjust += gfp->tune_value_a; - gfc->sv_qnt.mask_adjust_short += gfp->tune_value_a; - } - - - if (cfg->vbr != vbr_off) { /* choose a min/max bitrate for VBR */ - /* if the user didn't specify VBR_max_bitrate: */ - cfg->vbr_min_bitrate_index = 1; /* default: allow 8 kbps (MPEG-2) or 32 kbps (MPEG-1) */ - cfg->vbr_max_bitrate_index = 14; /* default: allow 160 kbps (MPEG-2) or 320 kbps (MPEG-1) */ - if (cfg->samplerate_out < 16000) - cfg->vbr_max_bitrate_index = 8; /* default: allow 64 kbps (MPEG-2.5) */ - if (gfp->VBR_min_bitrate_kbps) { - gfp->VBR_min_bitrate_kbps = - FindNearestBitrate(gfp->VBR_min_bitrate_kbps, cfg->version, cfg->samplerate_out); - cfg->vbr_min_bitrate_index = - BitrateIndex(gfp->VBR_min_bitrate_kbps, cfg->version, cfg->samplerate_out); - if (cfg->vbr_min_bitrate_index < 0) { - /* This never happens, because of preceding FindNearestBitrate! - * But, set a sane value, just in case - */ - assert(0); - cfg->vbr_min_bitrate_index = 1; - } - } - if (gfp->VBR_max_bitrate_kbps) { - gfp->VBR_max_bitrate_kbps = - FindNearestBitrate(gfp->VBR_max_bitrate_kbps, cfg->version, cfg->samplerate_out); - cfg->vbr_max_bitrate_index = - BitrateIndex(gfp->VBR_max_bitrate_kbps, cfg->version, cfg->samplerate_out); - if (cfg->vbr_max_bitrate_index < 0) { - /* This never happens, because of preceding FindNearestBitrate! - * But, set a sane value, just in case - */ - assert(0); - cfg->vbr_max_bitrate_index = cfg->samplerate_out < 16000 ? 8 : 14; - } - } - gfp->VBR_min_bitrate_kbps = bitrate_table[cfg->version][cfg->vbr_min_bitrate_index]; - gfp->VBR_max_bitrate_kbps = bitrate_table[cfg->version][cfg->vbr_max_bitrate_index]; - gfp->VBR_mean_bitrate_kbps = - Min(bitrate_table[cfg->version][cfg->vbr_max_bitrate_index], - gfp->VBR_mean_bitrate_kbps); - gfp->VBR_mean_bitrate_kbps = - Max(bitrate_table[cfg->version][cfg->vbr_min_bitrate_index], - gfp->VBR_mean_bitrate_kbps); - } - - cfg->preset = gfp->preset; - cfg->write_lame_tag = gfp->write_lame_tag; - gfc->sv_qnt.substep_shaping = gfp->substep_shaping; - cfg->noise_shaping = gfp->noise_shaping; - cfg->subblock_gain = gfp->subblock_gain; - cfg->use_best_huffman = gfp->use_best_huffman; - cfg->avg_bitrate = gfp->brate; - cfg->vbr_avg_bitrate_kbps = gfp->VBR_mean_bitrate_kbps; - cfg->compression_ratio = gfp->compression_ratio; - - /* initialize internal qval settings */ - lame_init_qval(gfp); - - - /* automatic ATH adjustment on - */ - if (gfp->athaa_type < 0) - gfc->ATH->use_adjust = 3; - else - gfc->ATH->use_adjust = gfp->athaa_type; - - - /* initialize internal adaptive ATH settings -jd */ - gfc->ATH->aa_sensitivity_p = pow(10.0, gfp->athaa_sensitivity / -10.0); - - - if (gfp->short_blocks == short_block_not_set) { - gfp->short_blocks = short_block_allowed; - } - - /*Note Jan/2003: Many hardware decoders cannot handle short blocks in regular - stereo mode unless they are coupled (same type in both channels) - it is a rare event (1 frame per min. or so) that LAME would use - uncoupled short blocks, so lets turn them off until we decide - how to handle this. No other encoders allow uncoupled short blocks, - even though it is in the standard. */ - /* rh 20040217: coupling makes no sense for mono and dual-mono streams - */ - if (gfp->short_blocks == short_block_allowed - && (cfg->mode == JOINT_STEREO || cfg->mode == STEREO)) { - gfp->short_blocks = short_block_coupled; - } - - cfg->short_blocks = gfp->short_blocks; - - - if (lame_get_quant_comp(gfp) < 0) - (void) lame_set_quant_comp(gfp, 1); - if (lame_get_quant_comp_short(gfp) < 0) - (void) lame_set_quant_comp_short(gfp, 0); - - if (lame_get_msfix(gfp) < 0) - lame_set_msfix(gfp, 0); - - /* select psychoacoustic model */ - (void) lame_set_exp_nspsytune(gfp, lame_get_exp_nspsytune(gfp) | 1); - - if (gfp->ATHtype < 0) - gfp->ATHtype = 4; - - if (gfp->ATHcurve < 0) - gfp->ATHcurve = 4; - - if (gfp->interChRatio < 0) - gfp->interChRatio = 0; - - if (gfp->useTemporal < 0) - gfp->useTemporal = 1; /* on by default */ - - - cfg->interChRatio = gfp->interChRatio; - cfg->msfix = gfp->msfix; - cfg->ATH_offset_db = 0-gfp->ATH_lower_db; - cfg->ATH_offset_factor = powf(10.f, cfg->ATH_offset_db * 0.1f); - cfg->ATHcurve = gfp->ATHcurve; - cfg->ATHtype = gfp->ATHtype; - cfg->ATHonly = gfp->ATHonly; - cfg->ATHshort = gfp->ATHshort; - cfg->noATH = gfp->noATH; - - cfg->quant_comp = gfp->quant_comp; - cfg->quant_comp_short = gfp->quant_comp_short; - - cfg->use_temporal_masking_effect = gfp->useTemporal; - if (cfg->mode == JOINT_STEREO) { - cfg->use_safe_joint_stereo = gfp->exp_nspsytune & 2; - } - else { - cfg->use_safe_joint_stereo = 0; - } - { - cfg->adjust_bass_db = (gfp->exp_nspsytune >> 2) & 63; - if (cfg->adjust_bass_db >= 32.f) - cfg->adjust_bass_db -= 64.f; - cfg->adjust_bass_db *= 0.25f; - - cfg->adjust_alto_db = (gfp->exp_nspsytune >> 8) & 63; - if (cfg->adjust_alto_db >= 32.f) - cfg->adjust_alto_db -= 64.f; - cfg->adjust_alto_db *= 0.25f; - - cfg->adjust_treble_db = (gfp->exp_nspsytune >> 14) & 63; - if (cfg->adjust_treble_db >= 32.f) - cfg->adjust_treble_db -= 64.f; - cfg->adjust_treble_db *= 0.25f; - - /* to be compatible with Naoki's original code, the next 6 bits - * define only the amount of changing treble for sfb21 */ - cfg->adjust_sfb21_db = (gfp->exp_nspsytune >> 20) & 63; - if (cfg->adjust_sfb21_db >= 32.f) - cfg->adjust_sfb21_db -= 64.f; - cfg->adjust_sfb21_db *= 0.25f; - cfg->adjust_sfb21_db += cfg->adjust_treble_db; - } - - /* Setting up the PCM input data transform matrix, to apply - * user defined re-scaling, and or two-to-one channel downmix. - */ - { - FLOAT m[2][2] = { {1.0f, 0.0f}, {0.0f, 1.0f} }; - - /* user selected scaling of the samples */ - m[0][0] *= gfp->scale; - m[0][1] *= gfp->scale; - m[1][0] *= gfp->scale; - m[1][1] *= gfp->scale; - /* user selected scaling of the channel 0 (left) samples */ - m[0][0] *= gfp->scale_left; - m[0][1] *= gfp->scale_left; - /* user selected scaling of the channel 1 (right) samples */ - m[1][0] *= gfp->scale_right; - m[1][1] *= gfp->scale_right; - /* Downsample to Mono if 2 channels in and 1 channel out */ - if (cfg->channels_in == 2 && cfg->channels_out == 1) { - m[0][0] = 0.5f * (m[0][0] + m[1][0]); - m[0][1] = 0.5f * (m[0][1] + m[1][1]); - m[1][0] = 0; - m[1][1] = 0; - } - cfg->pcm_transform[0][0] = m[0][0]; - cfg->pcm_transform[0][1] = m[0][1]; - cfg->pcm_transform[1][0] = m[1][0]; - cfg->pcm_transform[1][1] = m[1][1]; - } - - /* padding method as described in - * "MPEG-Layer3 / Bitstream Syntax and Decoding" - * by Martin Sieler, Ralph Sperschneider - * - * note: there is no padding for the very first frame - * - * Robert Hegemann 2000-06-22 - */ - gfc->sv_enc.slot_lag = gfc->sv_enc.frac_SpF = 0; - if (cfg->vbr == vbr_off) - gfc->sv_enc.slot_lag = gfc->sv_enc.frac_SpF - = ((cfg->version + 1) * 72000L * cfg->avg_bitrate) % cfg->samplerate_out; - - (void) lame_init_bitstream(gfp); - - iteration_init(gfc); - (void) psymodel_init(gfp); - - cfg->buffer_constraint = get_max_frame_buffer_size_by_constraint(cfg, gfp->strict_ISO); - - - cfg->findReplayGain = gfp->findReplayGain; - cfg->decode_on_the_fly = gfp->decode_on_the_fly; - - if (cfg->decode_on_the_fly) - cfg->findPeakSample = 1; - - if (cfg->findReplayGain) { - if (InitGainAnalysis(gfc->sv_rpg.rgdata, cfg->samplerate_out) == INIT_GAIN_ANALYSIS_ERROR) { - /* Actually this never happens, our samplerates are the ones RG accepts! - * But just in case, turn RG off - */ - assert(0); - cfg->findReplayGain = 0; - } - } - -#ifdef DECODE_ON_THE_FLY - if (cfg->decode_on_the_fly && !gfp->decode_only) { - if (gfc->hip) { - hip_decode_exit(gfc->hip); - } - gfc->hip = hip_decode_init(); - /* report functions */ - hip_set_errorf(gfc->hip, gfp->report.errorf); - hip_set_debugf(gfc->hip, gfp->report.debugf); - hip_set_msgf(gfc->hip, gfp->report.msgf); - } -#endif - /* updating lame internal flags finished successful */ - gfc->lame_init_params_successful = 1; - return 0; -} - -static void -concatSep(char* dest, char const* sep, char const* str) -{ - if (*dest != 0) strcat(dest, sep); - strcat(dest, str); -} - -/* - * print_config - * - * Prints some selected information about the coding parameters via - * the macro command MSGF(), which is currently mapped to lame_errorf - * (reports via a error function?), which is a printf-like function - * for . - */ - -void -lame_print_config(const lame_global_flags * gfp) -{ - lame_internal_flags const *const gfc = gfp->internal_flags; - SessionConfig_t const *const cfg = &gfc->cfg; - double const out_samplerate = cfg->samplerate_out; - double const in_samplerate = cfg->samplerate_in; - - MSGF(gfc, "LAME %s %s (%s)\n", get_lame_version(), get_lame_os_bitness(), get_lame_url()); - -#if (LAME_ALPHA_VERSION) - MSGF(gfc, "warning: alpha versions should be used for testing only\n"); -#endif - if (gfc->CPU_features.MMX - || gfc->CPU_features.AMD_3DNow || gfc->CPU_features.SSE || gfc->CPU_features.SSE2) { - char text[256] = { 0 }; - int fft_asm_used = 0; -#ifdef HAVE_NASM - if (gfc->CPU_features.AMD_3DNow) { - fft_asm_used = 1; - } - else if (gfc->CPU_features.SSE) { - fft_asm_used = 2; - } -#else -# if defined( HAVE_XMMINTRIN_H ) && defined( MIN_ARCH_SSE ) - { - fft_asm_used = 3; - } -# endif -#endif - if (gfc->CPU_features.MMX) { -#ifdef MMX_choose_table - concatSep(text, ", ", "MMX (ASM used)"); -#else - concatSep(text, ", ", "MMX"); -#endif - } - if (gfc->CPU_features.AMD_3DNow) { - concatSep(text, ", ", (fft_asm_used == 1) ? "3DNow! (ASM used)" : "3DNow!"); - } - if (gfc->CPU_features.SSE) { -#if defined(HAVE_XMMINTRIN_H) - concatSep(text, ", ", "SSE (ASM used)"); -#else - concatSep(text, ", ", (fft_asm_used == 2) ? "SSE (ASM used)" : "SSE"); -#endif - } - if (gfc->CPU_features.SSE2) { - concatSep(text, ", ", (fft_asm_used == 3) ? "SSE2 (ASM used)" : "SSE2"); - } - MSGF(gfc, "CPU features: %s\n", text); - } - - if (cfg->channels_in == 2 && cfg->channels_out == 1 /* mono */ ) { - MSGF(gfc, "Autoconverting from stereo to mono. Setting encoding to mono mode.\n"); - } - - if (isResamplingNecessary(cfg)) { - MSGF(gfc, "Resampling: input %g kHz output %g kHz\n", - 1.e-3 * in_samplerate, 1.e-3 * out_samplerate); - } - - if (cfg->highpass2 > 0.) - MSGF(gfc, - "Using polyphase highpass filter, transition band: %5.0f Hz - %5.0f Hz\n", - 0.5 * cfg->highpass1 * out_samplerate, 0.5 * cfg->highpass2 * out_samplerate); - if (0. < cfg->lowpass1 || 0. < cfg->lowpass2) { - MSGF(gfc, - "Using polyphase lowpass filter, transition band: %5.0f Hz - %5.0f Hz\n", - 0.5 * cfg->lowpass1 * out_samplerate, 0.5 * cfg->lowpass2 * out_samplerate); - } - else { - MSGF(gfc, "polyphase lowpass filter disabled\n"); - } - - if (cfg->free_format) { - MSGF(gfc, "Warning: many decoders cannot handle free format bitstreams\n"); - if (cfg->avg_bitrate > 320) { - MSGF(gfc, - "Warning: many decoders cannot handle free format bitrates >320 kbps (see documentation)\n"); - } - } -} - - -/** rh: - * some pretty printing is very welcome at this point! - * so, if someone is willing to do so, please do it! - * add more, if you see more... - */ -void -lame_print_internals(const lame_global_flags * gfp) -{ - lame_internal_flags const *const gfc = gfp->internal_flags; - SessionConfig_t const *const cfg = &gfc->cfg; - const char *pc = ""; - - /* compiler/processor optimizations, operational, etc. - */ - MSGF(gfc, "\nmisc:\n\n"); - - MSGF(gfc, "\tscaling: %g\n", gfp->scale); - MSGF(gfc, "\tch0 (left) scaling: %g\n", gfp->scale_left); - MSGF(gfc, "\tch1 (right) scaling: %g\n", gfp->scale_right); - switch (cfg->use_best_huffman) { - default: - pc = "normal"; - break; - case 1: - pc = "best (outside loop)"; - break; - case 2: - pc = "best (inside loop, slow)"; - break; - } - MSGF(gfc, "\thuffman search: %s\n", pc); - MSGF(gfc, "\texperimental Y=%d\n", gfp->experimentalY); - MSGF(gfc, "\t...\n"); - - /* everything controlling the stream format - */ - MSGF(gfc, "\nstream format:\n\n"); - switch (cfg->version) { - case 0: - pc = "2.5"; - break; - case 1: - pc = "1"; - break; - case 2: - pc = "2"; - break; - default: - pc = "?"; - break; - } - MSGF(gfc, "\tMPEG-%s Layer 3\n", pc); - switch (cfg->mode) { - case JOINT_STEREO: - pc = "joint stereo"; - break; - case STEREO: - pc = "stereo"; - break; - case DUAL_CHANNEL: - pc = "dual channel"; - break; - case MONO: - pc = "mono"; - break; - case NOT_SET: - pc = "not set (error)"; - break; - default: - pc = "unknown (error)"; - break; - } - MSGF(gfc, "\t%d channel - %s\n", cfg->channels_out, pc); - - switch (cfg->vbr) { - case vbr_off: - pc = "off"; - break; - default: - pc = "all"; - break; - } - MSGF(gfc, "\tpadding: %s\n", pc); - - if (vbr_default == cfg->vbr) - pc = "(default)"; - else if (cfg->free_format) - pc = "(free format)"; - else - pc = ""; - switch (cfg->vbr) { - case vbr_off: - MSGF(gfc, "\tconstant bitrate - CBR %s\n", pc); - break; - case vbr_abr: - MSGF(gfc, "\tvariable bitrate - ABR %s\n", pc); - break; - case vbr_rh: - MSGF(gfc, "\tvariable bitrate - VBR rh %s\n", pc); - break; - case vbr_mt: - MSGF(gfc, "\tvariable bitrate - VBR mt %s\n", pc); - break; - case vbr_mtrh: - MSGF(gfc, "\tvariable bitrate - VBR mtrh %s\n", pc); - break; - default: - MSGF(gfc, "\t ?? oops, some new one ?? \n"); - break; - } - if (cfg->write_lame_tag) - MSGF(gfc, "\tusing LAME Tag\n"); - MSGF(gfc, "\t...\n"); - - /* everything controlling psychoacoustic settings, like ATH, etc. - */ - MSGF(gfc, "\npsychoacoustic:\n\n"); - - switch (cfg->short_blocks) { - default: - case short_block_not_set: - pc = "?"; - break; - case short_block_allowed: - pc = "allowed"; - break; - case short_block_coupled: - pc = "channel coupled"; - break; - case short_block_dispensed: - pc = "dispensed"; - break; - case short_block_forced: - pc = "forced"; - break; - } - MSGF(gfc, "\tusing short blocks: %s\n", pc); - MSGF(gfc, "\tsubblock gain: %d\n", cfg->subblock_gain); - MSGF(gfc, "\tadjust masking: %g dB\n", gfc->sv_qnt.mask_adjust); - MSGF(gfc, "\tadjust masking short: %g dB\n", gfc->sv_qnt.mask_adjust_short); - MSGF(gfc, "\tquantization comparison: %d\n", cfg->quant_comp); - MSGF(gfc, "\t ^ comparison short blocks: %d\n", cfg->quant_comp_short); - MSGF(gfc, "\tnoise shaping: %d\n", cfg->noise_shaping); - MSGF(gfc, "\t ^ amplification: %d\n", cfg->noise_shaping_amp); - MSGF(gfc, "\t ^ stopping: %d\n", cfg->noise_shaping_stop); - - pc = "using"; - if (cfg->ATHshort) - pc = "the only masking for short blocks"; - if (cfg->ATHonly) - pc = "the only masking"; - if (cfg->noATH) - pc = "not used"; - MSGF(gfc, "\tATH: %s\n", pc); - MSGF(gfc, "\t ^ type: %d\n", cfg->ATHtype); - MSGF(gfc, "\t ^ shape: %g%s\n", cfg->ATHcurve, " (only for type 4)"); - MSGF(gfc, "\t ^ level adjustement: %g dB\n", cfg->ATH_offset_db); - MSGF(gfc, "\t ^ adjust type: %d\n", gfc->ATH->use_adjust); - MSGF(gfc, "\t ^ adjust sensitivity power: %f\n", gfc->ATH->aa_sensitivity_p); - - MSGF(gfc, "\texperimental psy tunings by Naoki Shibata\n"); - MSGF(gfc, "\t adjust masking bass=%g dB, alto=%g dB, treble=%g dB, sfb21=%g dB\n", - 10 * log10(gfc->sv_qnt.longfact[0]), - 10 * log10(gfc->sv_qnt.longfact[7]), - 10 * log10(gfc->sv_qnt.longfact[14]), 10 * log10(gfc->sv_qnt.longfact[21])); - - pc = cfg->use_temporal_masking_effect ? "yes" : "no"; - MSGF(gfc, "\tusing temporal masking effect: %s\n", pc); - MSGF(gfc, "\tinterchannel masking ratio: %g\n", cfg->interChRatio); - MSGF(gfc, "\t...\n"); - - /* that's all ? - */ - MSGF(gfc, "\n"); - return; -} - - -static void -save_gain_values(lame_internal_flags * gfc) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - RpgStateVar_t const *const rsv = &gfc->sv_rpg; - RpgResult_t *const rov = &gfc->ov_rpg; - /* save the ReplayGain value */ - if (cfg->findReplayGain) { - FLOAT const RadioGain = (FLOAT) GetTitleGain(rsv->rgdata); - if (NEQ(RadioGain, GAIN_NOT_ENOUGH_SAMPLES)) { - rov->RadioGain = (int) floor(RadioGain * 10.0 + 0.5); /* round to nearest */ - } - else { - rov->RadioGain = 0; - } - } - - /* find the gain and scale change required for no clipping */ - if (cfg->findPeakSample) { - rov->noclipGainChange = (int) ceil(log10(rov->PeakSample / 32767.0) * 20.0 * 10.0); /* round up */ - - if (rov->noclipGainChange > 0) { /* clipping occurs */ - rov->noclipScale = floor((32767.0f / rov->PeakSample) * 100.0f) / 100.0f; /* round down */ - } - else /* no clipping */ - rov->noclipScale = -1.0f; - } -} - - - -static int -update_inbuffer_size(lame_internal_flags * gfc, const int nsamples) -{ - EncStateVar_t *const esv = &gfc->sv_enc; - if (esv->in_buffer_0 == 0 || esv->in_buffer_nsamples < nsamples) { - if (esv->in_buffer_0) { - free(esv->in_buffer_0); - } - if (esv->in_buffer_1) { - free(esv->in_buffer_1); - } - esv->in_buffer_0 = lame_calloc(sample_t, nsamples); - esv->in_buffer_1 = lame_calloc(sample_t, nsamples); - esv->in_buffer_nsamples = nsamples; - } - if (esv->in_buffer_0 == NULL || esv->in_buffer_1 == NULL) { - if (esv->in_buffer_0) { - free(esv->in_buffer_0); - } - if (esv->in_buffer_1) { - free(esv->in_buffer_1); - } - esv->in_buffer_0 = 0; - esv->in_buffer_1 = 0; - esv->in_buffer_nsamples = 0; - ERRORF(gfc, "Error: can't allocate in_buffer buffer\n"); - return -2; - } - return 0; -} - - -static int -calcNeeded(SessionConfig_t const * cfg) -{ - int mf_needed; - int pcm_samples_per_frame = 576 * cfg->mode_gr; - - /* some sanity checks */ -#if ENCDELAY < MDCTDELAY -# error ENCDELAY is less than MDCTDELAY, see encoder.h -#endif -#if FFTOFFSET > BLKSIZE -# error FFTOFFSET is greater than BLKSIZE, see encoder.h -#endif - - mf_needed = BLKSIZE + pcm_samples_per_frame - FFTOFFSET; /* amount needed for FFT */ - /*mf_needed = Max(mf_needed, 286 + 576 * (1 + gfc->mode_gr)); */ - mf_needed = Max(mf_needed, 512 + pcm_samples_per_frame - 32); - - assert(MFSIZE >= mf_needed); - - return mf_needed; -} - - -/* - * THE MAIN LAME ENCODING INTERFACE - * mt 3/00 - * - * input pcm data, output (maybe) mp3 frames. - * This routine handles all buffering, resampling and filtering for you. - * The required mp3buffer_size can be computed from num_samples, - * samplerate and encoding rate, but here is a worst case estimate: - * - * mp3buffer_size in bytes = 1.25*num_samples + 7200 - * - * return code = number of bytes output in mp3buffer. can be 0 - * - * NOTE: this routine uses LAME's internal PCM data representation, - * 'sample_t'. It should not be used by any application. - * applications should use lame_encode_buffer(), - * lame_encode_buffer_float() - * lame_encode_buffer_int() - * etc... depending on what type of data they are working with. -*/ -static int -lame_encode_buffer_sample_t(lame_internal_flags * gfc, - int nsamples, unsigned char *mp3buf, const int mp3buf_size) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - EncStateVar_t *const esv = &gfc->sv_enc; - int pcm_samples_per_frame = 576 * cfg->mode_gr; - int mp3size = 0, ret, i, ch, mf_needed; - int mp3out; - sample_t *mfbuf[2]; - sample_t *in_buffer[2]; - - if (gfc->class_id != LAME_ID) - return -3; - - if (nsamples == 0) - return 0; - - /* copy out any tags that may have been written into bitstream */ - { /* if user specifed buffer size = 0, dont check size */ - int const buf_size = mp3buf_size == 0 ? INT_MAX : mp3buf_size; - mp3out = copy_buffer(gfc, mp3buf, buf_size, 0); - } - if (mp3out < 0) - return mp3out; /* not enough buffer space */ - mp3buf += mp3out; - mp3size += mp3out; - - in_buffer[0] = esv->in_buffer_0; - in_buffer[1] = esv->in_buffer_1; - - mf_needed = calcNeeded(cfg); - - mfbuf[0] = esv->mfbuf[0]; - mfbuf[1] = esv->mfbuf[1]; - - while (nsamples > 0) { - sample_t const *in_buffer_ptr[2]; - int n_in = 0; /* number of input samples processed with fill_buffer */ - int n_out = 0; /* number of samples output with fill_buffer */ - /* n_in <> n_out if we are resampling */ - - in_buffer_ptr[0] = in_buffer[0]; - in_buffer_ptr[1] = in_buffer[1]; - /* copy in new samples into mfbuf, with resampling */ - fill_buffer(gfc, mfbuf, &in_buffer_ptr[0], nsamples, &n_in, &n_out); - - /* compute ReplayGain of resampled input if requested */ - if (cfg->findReplayGain && !cfg->decode_on_the_fly) - if (AnalyzeSamples - (gfc->sv_rpg.rgdata, &mfbuf[0][esv->mf_size], &mfbuf[1][esv->mf_size], n_out, - cfg->channels_out) == GAIN_ANALYSIS_ERROR) - return -6; - - - - /* update in_buffer counters */ - nsamples -= n_in; - in_buffer[0] += n_in; - if (cfg->channels_out == 2) - in_buffer[1] += n_in; - - /* update mfbuf[] counters */ - esv->mf_size += n_out; - assert(esv->mf_size <= MFSIZE); - - /* lame_encode_flush may have set gfc->mf_sample_to_encode to 0 - * so we have to reinitialize it here when that happened. - */ - if (esv->mf_samples_to_encode < 1) { - esv->mf_samples_to_encode = ENCDELAY + POSTDELAY; - } - esv->mf_samples_to_encode += n_out; - - - if (esv->mf_size >= mf_needed) { - /* encode the frame. */ - /* mp3buf = pointer to current location in buffer */ - /* mp3buf_size = size of original mp3 output buffer */ - /* = 0 if we should not worry about the */ - /* buffer size because calling program is */ - /* to lazy to compute it */ - /* mp3size = size of data written to buffer so far */ - /* mp3buf_size-mp3size = amount of space avalable */ - - int buf_size = mp3buf_size - mp3size; - if (mp3buf_size == 0) - buf_size = INT_MAX; - - ret = lame_encode_mp3_frame(gfc, mfbuf[0], mfbuf[1], mp3buf, buf_size); - - if (ret < 0) - return ret; - mp3buf += ret; - mp3size += ret; - - /* shift out old samples */ - esv->mf_size -= pcm_samples_per_frame; - esv->mf_samples_to_encode -= pcm_samples_per_frame; - for (ch = 0; ch < cfg->channels_out; ch++) - for (i = 0; i < esv->mf_size; i++) - mfbuf[ch][i] = mfbuf[ch][i + pcm_samples_per_frame]; - } - } - assert(nsamples == 0); - - return mp3size; -} - -enum PCMSampleType -{ pcm_short_type -, pcm_int_type -, pcm_long_type -, pcm_float_type -, pcm_double_type -}; - -static void -lame_copy_inbuffer(lame_internal_flags* gfc, - void const* l, void const* r, int nsamples, - enum PCMSampleType pcm_type, int jump, FLOAT s) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - EncStateVar_t *const esv = &gfc->sv_enc; - sample_t* ib0 = esv->in_buffer_0; - sample_t* ib1 = esv->in_buffer_1; - FLOAT m[2][2]; - - /* Apply user defined re-scaling */ - m[0][0] = s * cfg->pcm_transform[0][0]; - m[0][1] = s * cfg->pcm_transform[0][1]; - m[1][0] = s * cfg->pcm_transform[1][0]; - m[1][1] = s * cfg->pcm_transform[1][1]; - - /* make a copy of input buffer, changing type to sample_t */ -#define COPY_AND_TRANSFORM(T) \ -{ \ - T const *bl = l, *br = r; \ - int i; \ - for (i = 0; i < nsamples; i++) { \ - sample_t const xl = *bl; \ - sample_t const xr = *br; \ - sample_t const u = xl * m[0][0] + xr * m[0][1]; \ - sample_t const v = xl * m[1][0] + xr * m[1][1]; \ - ib0[i] = u; \ - ib1[i] = v; \ - bl += jump; \ - br += jump; \ - } \ -} - switch ( pcm_type ) { - case pcm_short_type: - COPY_AND_TRANSFORM(short int); - break; - case pcm_int_type: - COPY_AND_TRANSFORM(int); - break; - case pcm_long_type: - COPY_AND_TRANSFORM(long int); - break; - case pcm_float_type: - COPY_AND_TRANSFORM(float); - break; - case pcm_double_type: - COPY_AND_TRANSFORM(double); - break; - } -} - - -static int -lame_encode_buffer_template(lame_global_flags * gfp, - void const* buffer_l, void const* buffer_r, const int nsamples, - unsigned char *mp3buf, const int mp3buf_size, enum PCMSampleType pcm_type, int aa, FLOAT norm) -{ - if (is_lame_global_flags_valid(gfp)) { - lame_internal_flags *const gfc = gfp->internal_flags; - if (is_lame_internal_flags_valid(gfc)) { - SessionConfig_t const *const cfg = &gfc->cfg; - - if (nsamples == 0) - return 0; - - if (update_inbuffer_size(gfc, nsamples) != 0) { - return -2; - } - /* make a copy of input buffer, changing type to sample_t */ - if (cfg->channels_in > 1) { - if (buffer_l == 0 || buffer_r == 0) { - return 0; - } - lame_copy_inbuffer(gfc, buffer_l, buffer_r, nsamples, pcm_type, aa, norm); - } - else { - if (buffer_l == 0) { - return 0; - } - lame_copy_inbuffer(gfc, buffer_l, buffer_l, nsamples, pcm_type, aa, norm); - } - - return lame_encode_buffer_sample_t(gfc, nsamples, mp3buf, mp3buf_size); - } - } - return -3; -} - -int -lame_encode_buffer(lame_global_flags * gfp, - const short int pcm_l[], const short int pcm_r[], const int nsamples, - unsigned char *mp3buf, const int mp3buf_size) -{ - return lame_encode_buffer_template(gfp, pcm_l, pcm_r, nsamples, mp3buf, mp3buf_size, pcm_short_type, 1, 1.0); -} - - -int -lame_encode_buffer_float(lame_global_flags * gfp, - const float pcm_l[], const float pcm_r[], const int nsamples, - unsigned char *mp3buf, const int mp3buf_size) -{ - /* input is assumed to be normalized to +/- 32768 for full scale */ - return lame_encode_buffer_template(gfp, pcm_l, pcm_r, nsamples, mp3buf, mp3buf_size, pcm_float_type, 1, 1.0); -} - - -int -lame_encode_buffer_ieee_float(lame_t gfp, - const float pcm_l[], const float pcm_r[], const int nsamples, - unsigned char *mp3buf, const int mp3buf_size) -{ - /* input is assumed to be normalized to +/- 1.0 for full scale */ - return lame_encode_buffer_template(gfp, pcm_l, pcm_r, nsamples, mp3buf, mp3buf_size, pcm_float_type, 1, 32767.0); -} - - -int -lame_encode_buffer_interleaved_ieee_float(lame_t gfp, - const float pcm[], const int nsamples, - unsigned char *mp3buf, const int mp3buf_size) -{ - /* input is assumed to be normalized to +/- 1.0 for full scale */ - return lame_encode_buffer_template(gfp, pcm, pcm+1, nsamples, mp3buf, mp3buf_size, pcm_float_type, 2, 32767.0); -} - - -int -lame_encode_buffer_ieee_double(lame_t gfp, - const double pcm_l[], const double pcm_r[], const int nsamples, - unsigned char *mp3buf, const int mp3buf_size) -{ - /* input is assumed to be normalized to +/- 1.0 for full scale */ - return lame_encode_buffer_template(gfp, pcm_l, pcm_r, nsamples, mp3buf, mp3buf_size, pcm_double_type, 1, 32767.0); -} - - -int -lame_encode_buffer_interleaved_ieee_double(lame_t gfp, - const double pcm[], const int nsamples, - unsigned char *mp3buf, const int mp3buf_size) -{ - /* input is assumed to be normalized to +/- 1.0 for full scale */ - return lame_encode_buffer_template(gfp, pcm, pcm+1, nsamples, mp3buf, mp3buf_size, pcm_double_type, 2, 32767.0); -} - - -int -lame_encode_buffer_int(lame_global_flags * gfp, - const int pcm_l[], const int pcm_r[], const int nsamples, - unsigned char *mp3buf, const int mp3buf_size) -{ - /* input is assumed to be normalized to +/- MAX_INT for full scale */ - FLOAT const norm = (1.0 / (1L << (8 * sizeof(int) - 16))); - return lame_encode_buffer_template(gfp, pcm_l, pcm_r, nsamples, mp3buf, mp3buf_size, pcm_int_type, 1, norm); -} - - -int -lame_encode_buffer_long2(lame_global_flags * gfp, - const long pcm_l[], const long pcm_r[], const int nsamples, - unsigned char *mp3buf, const int mp3buf_size) -{ - /* input is assumed to be normalized to +/- MAX_LONG for full scale */ - FLOAT const norm = (1.0 / (1L << (8 * sizeof(long) - 16))); - return lame_encode_buffer_template(gfp, pcm_l, pcm_r, nsamples, mp3buf, mp3buf_size, pcm_long_type, 1, norm); -} - - -int -lame_encode_buffer_long(lame_global_flags * gfp, - const long pcm_l[], const long pcm_r[], const int nsamples, - unsigned char *mp3buf, const int mp3buf_size) -{ - /* input is assumed to be normalized to +/- 32768 for full scale */ - return lame_encode_buffer_template(gfp, pcm_l, pcm_r, nsamples, mp3buf, mp3buf_size, pcm_long_type, 1, 1.0); -} - - - -int -lame_encode_buffer_interleaved(lame_global_flags * gfp, - short int pcm[], int nsamples, - unsigned char *mp3buf, int mp3buf_size) -{ - /* input is assumed to be normalized to +/- MAX_SHORT for full scale */ - return lame_encode_buffer_template(gfp, pcm, pcm+1, nsamples, mp3buf, mp3buf_size, pcm_short_type, 2, 1.0); -} - - -int -lame_encode_buffer_interleaved_int(lame_t gfp, - const int pcm[], const int nsamples, - unsigned char *mp3buf, const int mp3buf_size) -{ - /* input is assumed to be normalized to +/- MAX(int) for full scale */ - FLOAT const norm = (1.0 / (1L << (8 * sizeof(int)-16))); - return lame_encode_buffer_template(gfp, pcm, pcm + 1, nsamples, mp3buf, mp3buf_size, pcm_int_type, 2, norm); -} - - - - -/***************************************************************** - Flush mp3 buffer, pad with ancillary data so last frame is complete. - Reset reservoir size to 0 - but keep all PCM samples and MDCT data in memory - This option is used to break a large file into several mp3 files - that when concatenated together will decode with no gaps - Because we set the reservoir=0, they will also decode seperately - with no errors. -*********************************************************************/ -int -lame_encode_flush_nogap(lame_global_flags * gfp, unsigned char *mp3buffer, int mp3buffer_size) -{ - int rc = -3; - if (is_lame_global_flags_valid(gfp)) { - lame_internal_flags *const gfc = gfp->internal_flags; - if (is_lame_internal_flags_valid(gfc)) { - flush_bitstream(gfc); - /* if user specifed buffer size = 0, dont check size */ - if (mp3buffer_size == 0) - mp3buffer_size = INT_MAX; - rc = copy_buffer(gfc, mp3buffer, mp3buffer_size, 1); - save_gain_values(gfc); - } - } - return rc; -} - - -/* called by lame_init_params. You can also call this after flush_nogap - if you want to write new id3v2 and Xing VBR tags into the bitstream */ -int -lame_init_bitstream(lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - lame_internal_flags *const gfc = gfp->internal_flags; - if (gfc != 0) { - gfc->ov_enc.frame_number = 0; - - if (gfp->write_id3tag_automatic) { - (void) id3tag_write_v2(gfp); - } - /* initialize histogram data optionally used by frontend */ - memset(gfc->ov_enc.bitrate_channelmode_hist, 0, - sizeof(gfc->ov_enc.bitrate_channelmode_hist)); - memset(gfc->ov_enc.bitrate_blocktype_hist, 0, - sizeof(gfc->ov_enc.bitrate_blocktype_hist)); - - gfc->ov_rpg.PeakSample = 0.0; - - /* Write initial VBR Header to bitstream and init VBR data */ - if (gfc->cfg.write_lame_tag) - (void) InitVbrTag(gfp); - - - return 0; - } - } - return -3; -} - - -/*****************************************************************/ -/* flush internal PCM sample buffers, then mp3 buffers */ -/* then write id3 v1 tags into bitstream. */ -/*****************************************************************/ - -int -lame_encode_flush(lame_global_flags * gfp, unsigned char *mp3buffer, int mp3buffer_size) -{ - lame_internal_flags *gfc; - SessionConfig_t const *cfg; - EncStateVar_t *esv; - short int buffer[2][1152]; - int imp3 = 0, mp3count, mp3buffer_size_remaining; - - /* we always add POSTDELAY=288 padding to make sure granule with real - * data can be complety decoded (because of 50% overlap with next granule */ - int end_padding; - int frames_left; - int samples_to_encode; - int pcm_samples_per_frame; - int mf_needed; - int is_resampling_necessary; - double resample_ratio = 1; - - if (!is_lame_global_flags_valid(gfp)) { - return -3; - } - gfc = gfp->internal_flags; - if (!is_lame_internal_flags_valid(gfc)) { - return -3; - } - cfg = &gfc->cfg; - esv = &gfc->sv_enc; - - /* Was flush already called? */ - if (esv->mf_samples_to_encode < 1) { - return 0; - } - pcm_samples_per_frame = 576 * cfg->mode_gr; - mf_needed = calcNeeded(cfg); - - samples_to_encode = esv->mf_samples_to_encode - POSTDELAY; - - memset(buffer, 0, sizeof(buffer)); - mp3count = 0; - - is_resampling_necessary = isResamplingNecessary(cfg); - if (is_resampling_necessary) { - resample_ratio = (double)cfg->samplerate_in / (double)cfg->samplerate_out; - /* delay due to resampling; needs to be fixed, if resampling code gets changed */ - samples_to_encode += 16. / resample_ratio; - } - end_padding = pcm_samples_per_frame - (samples_to_encode % pcm_samples_per_frame); - if (end_padding < 576) - end_padding += pcm_samples_per_frame; - gfc->ov_enc.encoder_padding = end_padding; - - frames_left = (samples_to_encode + end_padding) / pcm_samples_per_frame; - while (frames_left > 0 && imp3 >= 0) { - int const frame_num = gfc->ov_enc.frame_number; - int bunch = mf_needed - esv->mf_size; - - bunch *= resample_ratio; - if (bunch > 1152) bunch = 1152; - if (bunch < 1) bunch = 1; - - mp3buffer_size_remaining = mp3buffer_size - mp3count; - - /* if user specifed buffer size = 0, dont check size */ - if (mp3buffer_size == 0) - mp3buffer_size_remaining = 0; - - /* send in a frame of 0 padding until all internal sample buffers - * are flushed - */ - imp3 = lame_encode_buffer(gfp, buffer[0], buffer[1], bunch, - mp3buffer, mp3buffer_size_remaining); - - mp3buffer += imp3; - mp3count += imp3; - { /* even a single pcm sample can produce several frames! - * for example: 1 Hz input file resampled to 8 kHz mpeg2.5 - */ - int const new_frames = gfc->ov_enc.frame_number - frame_num; - if (new_frames > 0) - frames_left -= new_frames; - } - } - /* Set esv->mf_samples_to_encode to 0, so we may detect - * and break loops calling it more than once in a row. - */ - esv->mf_samples_to_encode = 0; - - if (imp3 < 0) { - /* some type of fatal error */ - return imp3; - } - - mp3buffer_size_remaining = mp3buffer_size - mp3count; - /* if user specifed buffer size = 0, dont check size */ - if (mp3buffer_size == 0) - mp3buffer_size_remaining = INT_MAX; - - /* mp3 related stuff. bit buffer might still contain some mp3 data */ - flush_bitstream(gfc); - imp3 = copy_buffer(gfc, mp3buffer, mp3buffer_size_remaining, 1); - save_gain_values(gfc); - if (imp3 < 0) { - /* some type of fatal error */ - return imp3; - } - mp3buffer += imp3; - mp3count += imp3; - mp3buffer_size_remaining = mp3buffer_size - mp3count; - /* if user specifed buffer size = 0, dont check size */ - if (mp3buffer_size == 0) - mp3buffer_size_remaining = INT_MAX; - - if (gfp->write_id3tag_automatic) { - /* write a id3 tag to the bitstream */ - (void) id3tag_write_v1(gfp); - - imp3 = copy_buffer(gfc, mp3buffer, mp3buffer_size_remaining, 0); - - if (imp3 < 0) { - return imp3; - } - mp3count += imp3; - } -#if 0 - { - int const ed = gfc->ov_enc.encoder_delay; - int const ep = gfc->ov_enc.encoder_padding; - int const ns = (gfc->ov_enc.frame_number * pcm_samples_per_frame) - (ed + ep); - double duration = ns; - duration /= cfg->samplerate_out; - MSGF(gfc, "frames=%d\n", gfc->ov_enc.frame_number); - MSGF(gfc, "pcm_samples_per_frame=%d\n", pcm_samples_per_frame); - MSGF(gfc, "encoder delay=%d\n", ed); - MSGF(gfc, "encoder padding=%d\n", ep); - MSGF(gfc, "sample count=%d (%g)\n", ns, cfg->samplerate_in * duration); - MSGF(gfc, "duration=%g sec\n", duration); - } -#endif - return mp3count; -} - -/*********************************************************************** - * - * lame_close () - * - * frees internal buffers - * - ***********************************************************************/ - -int -lame_close(lame_global_flags * gfp) -{ - int ret = 0; - if (gfp && gfp->class_id == LAME_ID) { - lame_internal_flags *const gfc = gfp->internal_flags; - gfp->class_id = 0; - if (NULL == gfc || gfc->class_id != LAME_ID) { - ret = -3; - } - if (NULL != gfc) { - gfc->lame_init_params_successful = 0; - gfc->class_id = 0; - /* this routine will free all malloc'd data in gfc, and then free gfc: */ - freegfc(gfc); - gfp->internal_flags = NULL; - } - if (gfp->lame_allocated_gfp) { - gfp->lame_allocated_gfp = 0; - free(gfp); - } - } - return ret; -} - -/*****************************************************************/ -/* flush internal mp3 buffers, and free internal buffers */ -/*****************************************************************/ -#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED -int CDECL -lame_encode_finish(lame_global_flags * gfp, unsigned char *mp3buffer, int mp3buffer_size); -#else -#endif - -int -lame_encode_finish(lame_global_flags * gfp, unsigned char *mp3buffer, int mp3buffer_size) -{ - int const ret = lame_encode_flush(gfp, mp3buffer, mp3buffer_size); - - (void) lame_close(gfp); - - return ret; -} - -/*****************************************************************/ -/* write VBR Xing header, and ID3 version 1 tag, if asked for */ -/*****************************************************************/ -void lame_mp3_tags_fid(lame_global_flags * gfp, FILE * fpStream); - -void -lame_mp3_tags_fid(lame_global_flags * gfp, FILE * fpStream) -{ - lame_internal_flags *gfc; - SessionConfig_t const *cfg; - if (!is_lame_global_flags_valid(gfp)) { - return; - } - gfc = gfp->internal_flags; - if (!is_lame_internal_flags_valid(gfc)) { - return; - } - cfg = &gfc->cfg; - if (!cfg->write_lame_tag) { - return; - } - /* Write Xing header again */ - if (fpStream && !fseek(fpStream, 0, SEEK_SET)) { - int rc = PutVbrTag(gfp, fpStream); - switch (rc) { - default: - /* OK */ - break; - - case -1: - ERRORF(gfc, "Error: could not update LAME tag.\n"); - break; - - case -2: - ERRORF(gfc, "Error: could not update LAME tag, file not seekable.\n"); - break; - - case -3: - ERRORF(gfc, "Error: could not update LAME tag, file not readable.\n"); - break; - } - } -} - - -static int -lame_init_internal_flags(lame_internal_flags* gfc) -{ - if (NULL == gfc) - return -1; - - gfc->cfg.vbr_min_bitrate_index = 1; /* not 0 ????? */ - gfc->cfg.vbr_max_bitrate_index = 13; /* not 14 ????? */ - gfc->cfg.decode_on_the_fly = 0; - gfc->cfg.findReplayGain = 0; - gfc->cfg.findPeakSample = 0; - - gfc->sv_qnt.OldValue[0] = 180; - gfc->sv_qnt.OldValue[1] = 180; - gfc->sv_qnt.CurrentStep[0] = 4; - gfc->sv_qnt.CurrentStep[1] = 4; - gfc->sv_qnt.masking_lower = 1; - - /* The reason for - * int mf_samples_to_encode = ENCDELAY + POSTDELAY; - * ENCDELAY = internal encoder delay. And then we have to add POSTDELAY=288 - * because of the 50% MDCT overlap. A 576 MDCT granule decodes to - * 1152 samples. To synthesize the 576 samples centered under this granule - * we need the previous granule for the first 288 samples (no problem), and - * the next granule for the next 288 samples (not possible if this is last - * granule). So we need to pad with 288 samples to make sure we can - * encode the 576 samples we are interested in. - */ - gfc->sv_enc.mf_samples_to_encode = ENCDELAY + POSTDELAY; - gfc->sv_enc.mf_size = ENCDELAY - MDCTDELAY; /* we pad input with this many 0's */ - gfc->ov_enc.encoder_padding = 0; - gfc->ov_enc.encoder_delay = ENCDELAY; - - gfc->ov_rpg.RadioGain = 0; - gfc->ov_rpg.noclipGainChange = 0; - gfc->ov_rpg.noclipScale = -1.0; - - gfc->ATH = lame_calloc(ATH_t, 1); - if (NULL == gfc->ATH) - return -2; /* maybe error codes should be enumerated in lame.h ?? */ - - gfc->sv_rpg.rgdata = lame_calloc(replaygain_t, 1); - if (NULL == gfc->sv_rpg.rgdata) { - return -2; - } - return 0; -} - -/* initialize mp3 encoder */ -#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED -static -#else -#endif -int -lame_init_old(lame_global_flags * gfp) -{ - disable_FPE(); /* disable floating point exceptions */ - - memset(gfp, 0, sizeof(lame_global_flags)); - - gfp->class_id = LAME_ID; - - /* Global flags. set defaults here for non-zero values */ - /* see lame.h for description */ - /* set integer values to -1 to mean that LAME will compute the - * best value, UNLESS the calling program as set it - * (and the value is no longer -1) - */ - gfp->strict_ISO = MDB_MAXIMUM; - - gfp->mode = NOT_SET; - gfp->original = 1; - gfp->samplerate_in = 44100; - gfp->num_channels = 2; - gfp->num_samples = MAX_U_32_NUM; - - gfp->write_lame_tag = 1; - gfp->quality = -1; - gfp->short_blocks = short_block_not_set; - gfp->subblock_gain = -1; - - gfp->lowpassfreq = 0; - gfp->highpassfreq = 0; - gfp->lowpasswidth = -1; - gfp->highpasswidth = -1; - - gfp->VBR = vbr_off; - gfp->VBR_q = 4; - gfp->VBR_mean_bitrate_kbps = 128; - gfp->VBR_min_bitrate_kbps = 0; - gfp->VBR_max_bitrate_kbps = 0; - gfp->VBR_hard_min = 0; - - gfp->quant_comp = -1; - gfp->quant_comp_short = -1; - - gfp->msfix = -1; - - gfp->attackthre = -1; - gfp->attackthre_s = -1; - - gfp->scale = 1; - gfp->scale_left = 1; - gfp->scale_right = 1; - - gfp->ATHcurve = -1; - gfp->ATHtype = -1; /* default = -1 = set in lame_init_params */ - /* 2 = equal loudness curve */ - gfp->athaa_sensitivity = 0.0; /* no offset */ - gfp->athaa_type = -1; - gfp->useTemporal = -1; - gfp->interChRatio = -1; - - gfp->findReplayGain = 0; - gfp->decode_on_the_fly = 0; - - gfp->asm_optimizations.mmx = 1; - gfp->asm_optimizations.amd3dnow = 1; - gfp->asm_optimizations.sse = 1; - - gfp->preset = 0; - - gfp->write_id3tag_automatic = 1; - - gfp->report.debugf = &lame_report_def; - gfp->report.errorf = &lame_report_def; - gfp->report.msgf = &lame_report_def; - - gfp->internal_flags = lame_calloc(lame_internal_flags, 1); - - if (lame_init_internal_flags(gfp->internal_flags) < 0) { - freegfc(gfp->internal_flags); - gfp->internal_flags = 0; - return -1; - } - return 0; -} - - -lame_global_flags * -lame_init(void) -{ - lame_global_flags *gfp; - int ret; - - init_log_table(); - - gfp = lame_calloc(lame_global_flags, 1); - if (gfp == NULL) - return NULL; - - ret = lame_init_old(gfp); - if (ret != 0) { - free(gfp); - return NULL; - } - - gfp->lame_allocated_gfp = 1; - return gfp; -} - - -/*********************************************************************** - * - * some simple statistics - * - * Robert Hegemann 2000-10-11 - * - ***********************************************************************/ - -/* histogram of used bitrate indexes: - * One has to weight them to calculate the average bitrate in kbps - * - * bitrate indices: - * there are 14 possible bitrate indices, 0 has the special meaning - * "free format" which is not possible to mix with VBR and 15 is forbidden - * anyway. - * - * stereo modes: - * 0: LR number of left-right encoded frames - * 1: LR-I number of left-right and intensity encoded frames - * 2: MS number of mid-side encoded frames - * 3: MS-I number of mid-side and intensity encoded frames - * - * 4: number of encoded frames - * - */ - -void -lame_bitrate_kbps(const lame_global_flags * gfp, int bitrate_kbps[14]) -{ - if (is_lame_global_flags_valid(gfp)) { - lame_internal_flags const *const gfc = gfp->internal_flags; - if (is_lame_internal_flags_valid(gfc)) { - SessionConfig_t const *const cfg = &gfc->cfg; - int i; - if (cfg->free_format) { - for (i = 0; i < 14; i++) - bitrate_kbps[i] = -1; - bitrate_kbps[0] = cfg->avg_bitrate; - } - else { - for (i = 0; i < 14; i++) - bitrate_kbps[i] = bitrate_table[cfg->version][i + 1]; - } - } - } -} - - -void -lame_bitrate_hist(const lame_global_flags * gfp, int bitrate_count[14]) -{ - if (is_lame_global_flags_valid(gfp)) { - lame_internal_flags const *const gfc = gfp->internal_flags; - if (is_lame_internal_flags_valid(gfc)) { - SessionConfig_t const *const cfg = &gfc->cfg; - EncResult_t const *const eov = &gfc->ov_enc; - int i; - - if (cfg->free_format) { - for (i = 0; i < 14; i++) { - bitrate_count[i] = 0; - } - bitrate_count[0] = eov->bitrate_channelmode_hist[0][4]; - } - else { - for (i = 0; i < 14; i++) { - bitrate_count[i] = eov->bitrate_channelmode_hist[i + 1][4]; - } - } - } - } -} - - -void -lame_stereo_mode_hist(const lame_global_flags * gfp, int stmode_count[4]) -{ - if (is_lame_global_flags_valid(gfp)) { - lame_internal_flags const *const gfc = gfp->internal_flags; - if (is_lame_internal_flags_valid(gfc)) { - EncResult_t const *const eov = &gfc->ov_enc; - int i; - - for (i = 0; i < 4; i++) { - stmode_count[i] = eov->bitrate_channelmode_hist[15][i]; - } - } - } -} - - - -void -lame_bitrate_stereo_mode_hist(const lame_global_flags * gfp, int bitrate_stmode_count[14][4]) -{ - if (is_lame_global_flags_valid(gfp)) { - lame_internal_flags const *const gfc = gfp->internal_flags; - if (is_lame_internal_flags_valid(gfc)) { - SessionConfig_t const *const cfg = &gfc->cfg; - EncResult_t const *const eov = &gfc->ov_enc; - int i; - int j; - - if (cfg->free_format) { - for (j = 0; j < 14; j++) - for (i = 0; i < 4; i++) { - bitrate_stmode_count[j][i] = 0; - } - for (i = 0; i < 4; i++) { - bitrate_stmode_count[0][i] = eov->bitrate_channelmode_hist[0][i]; - } - } - else { - for (j = 0; j < 14; j++) { - for (i = 0; i < 4; i++) { - bitrate_stmode_count[j][i] = eov->bitrate_channelmode_hist[j + 1][i]; - } - } - } - } - } -} - - -void -lame_block_type_hist(const lame_global_flags * gfp, int btype_count[6]) -{ - if (is_lame_global_flags_valid(gfp)) { - lame_internal_flags const *const gfc = gfp->internal_flags; - if (is_lame_internal_flags_valid(gfc)) { - EncResult_t const *const eov = &gfc->ov_enc; - int i; - - for (i = 0; i < 6; ++i) { - btype_count[i] = eov->bitrate_blocktype_hist[15][i]; - } - } - } -} - - - -void -lame_bitrate_block_type_hist(const lame_global_flags * gfp, int bitrate_btype_count[14][6]) -{ - if (is_lame_global_flags_valid(gfp)) { - lame_internal_flags const *const gfc = gfp->internal_flags; - if (is_lame_internal_flags_valid(gfc)) { - SessionConfig_t const *const cfg = &gfc->cfg; - EncResult_t const *const eov = &gfc->ov_enc; - int i, j; - - if (cfg->free_format) { - for (j = 0; j < 14; ++j) { - for (i = 0; i < 6; ++i) { - bitrate_btype_count[j][i] = 0; - } - } - for (i = 0; i < 6; ++i) { - bitrate_btype_count[0][i] = eov->bitrate_blocktype_hist[0][i]; - } - } - else { - for (j = 0; j < 14; ++j) { - for (i = 0; i < 6; ++i) { - bitrate_btype_count[j][i] = eov->bitrate_blocktype_hist[j + 1][i]; - } - } - } - } - } -} - -/* end of lame.c */ diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/lame.h b/recorderlib/src/main/jni/lame-3.100_libmp3lame/lame.h deleted file mode 100644 index 5196690..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/lame.h +++ /dev/null @@ -1,1342 +0,0 @@ -/* - * Interface to MP3 LAME encoding engine - * - * Copyright (c) 1999 Mark Taylor - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* $Id: lame.h,v 1.192 2017/08/31 14:14:46 robert Exp $ */ - -#ifndef LAME_LAME_H -#define LAME_LAME_H - -/* for size_t typedef */ -#include -/* for va_list typedef */ -#include -/* for FILE typedef, TODO: remove when removing lame_mp3_tags_fid */ -#include - -#if defined(__cplusplus) -extern "C" { -#endif - -typedef void (*lame_report_function)(const char *format, va_list ap); - -#if defined(WIN32) || defined(_WIN32) -#undef CDECL -#define CDECL __cdecl -#else -#define CDECL -#endif - -#define DEPRECATED_OR_OBSOLETE_CODE_REMOVED 1 - -typedef enum vbr_mode_e { - vbr_off=0, - vbr_mt, /* obsolete, same as vbr_mtrh */ - vbr_rh, - vbr_abr, - vbr_mtrh, - vbr_max_indicator, /* Don't use this! It's used for sanity checks. */ - vbr_default=vbr_mtrh /* change this to change the default VBR mode of LAME */ -} vbr_mode; - - -/* MPEG modes */ -typedef enum MPEG_mode_e { - STEREO = 0, - JOINT_STEREO, - DUAL_CHANNEL, /* LAME doesn't supports this! */ - MONO, - NOT_SET, - MAX_INDICATOR /* Don't use this! It's used for sanity checks. */ -} MPEG_mode; - -/* Padding types */ -typedef enum Padding_type_e { - PAD_NO = 0, - PAD_ALL, - PAD_ADJUST, - PAD_MAX_INDICATOR /* Don't use this! It's used for sanity checks. */ -} Padding_type; - - - -/*presets*/ -typedef enum preset_mode_e { - /*values from 8 to 320 should be reserved for abr bitrates*/ - /*for abr I'd suggest to directly use the targeted bitrate as a value*/ - ABR_8 = 8, - ABR_320 = 320, - - V9 = 410, /*Vx to match Lame and VBR_xx to match FhG*/ - VBR_10 = 410, - V8 = 420, - VBR_20 = 420, - V7 = 430, - VBR_30 = 430, - V6 = 440, - VBR_40 = 440, - V5 = 450, - VBR_50 = 450, - V4 = 460, - VBR_60 = 460, - V3 = 470, - VBR_70 = 470, - V2 = 480, - VBR_80 = 480, - V1 = 490, - VBR_90 = 490, - V0 = 500, - VBR_100 = 500, - - - - /*still there for compatibility*/ - R3MIX = 1000, - STANDARD = 1001, - EXTREME = 1002, - INSANE = 1003, - STANDARD_FAST = 1004, - EXTREME_FAST = 1005, - MEDIUM = 1006, - MEDIUM_FAST = 1007 -} preset_mode; - - -/*asm optimizations*/ -typedef enum asm_optimizations_e { - MMX = 1, - AMD_3DNOW = 2, - SSE = 3 -} asm_optimizations; - - -/* psychoacoustic model */ -typedef enum Psy_model_e { - PSY_GPSYCHO = 1, - PSY_NSPSYTUNE = 2 -} Psy_model; - - -/* buffer considerations */ -typedef enum buffer_constraint_e { - MDB_DEFAULT=0, - MDB_STRICT_ISO=1, - MDB_MAXIMUM=2 -} buffer_constraint; - - -struct lame_global_struct; -typedef struct lame_global_struct lame_global_flags; -typedef lame_global_flags *lame_t; - - - - -/*********************************************************************** - * - * The LAME API - * These functions should be called, in this order, for each - * MP3 file to be encoded. See the file "API" for more documentation - * - ***********************************************************************/ - - -/* - * REQUIRED: - * initialize the encoder. sets default for all encoder parameters, - * returns NULL if some malloc()'s failed - * otherwise returns pointer to structure needed for all future - * API calls. - */ -lame_global_flags * CDECL lame_init(void); -#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED -#else -/* obsolete version */ -int CDECL lame_init_old(lame_global_flags *); -#endif - -/* - * OPTIONAL: - * set as needed to override defaults - */ - -/******************************************************************** - * input stream description - ***********************************************************************/ -/* number of samples. default = 2^32-1 */ -int CDECL lame_set_num_samples(lame_global_flags *, unsigned long); -unsigned long CDECL lame_get_num_samples(const lame_global_flags *); - -/* input sample rate in Hz. default = 44100hz */ -int CDECL lame_set_in_samplerate(lame_global_flags *, int); -int CDECL lame_get_in_samplerate(const lame_global_flags *); - -/* number of channels in input stream. default=2 */ -int CDECL lame_set_num_channels(lame_global_flags *, int); -int CDECL lame_get_num_channels(const lame_global_flags *); - -/* - scale the input by this amount before encoding. default=1 - (not used by decoding routines) -*/ -int CDECL lame_set_scale(lame_global_flags *, float); -float CDECL lame_get_scale(const lame_global_flags *); - -/* - scale the channel 0 (left) input by this amount before encoding. default=1 - (not used by decoding routines) -*/ -int CDECL lame_set_scale_left(lame_global_flags *, float); -float CDECL lame_get_scale_left(const lame_global_flags *); - -/* - scale the channel 1 (right) input by this amount before encoding. default=1 - (not used by decoding routines) -*/ -int CDECL lame_set_scale_right(lame_global_flags *, float); -float CDECL lame_get_scale_right(const lame_global_flags *); - -/* - output sample rate in Hz. default = 0, which means LAME picks best value - based on the amount of compression. MPEG only allows: - MPEG1 32, 44.1, 48khz - MPEG2 16, 22.05, 24 - MPEG2.5 8, 11.025, 12 - (not used by decoding routines) -*/ -int CDECL lame_set_out_samplerate(lame_global_flags *, int); -int CDECL lame_get_out_samplerate(const lame_global_flags *); - - -/******************************************************************** - * general control parameters - ***********************************************************************/ -/* 1=cause LAME to collect data for an MP3 frame analyzer. default=0 */ -int CDECL lame_set_analysis(lame_global_flags *, int); -int CDECL lame_get_analysis(const lame_global_flags *); - -/* - 1 = write a Xing VBR header frame. - default = 1 - this variable must have been added by a Hungarian notation Windows programmer :-) -*/ -int CDECL lame_set_bWriteVbrTag(lame_global_flags *, int); -int CDECL lame_get_bWriteVbrTag(const lame_global_flags *); - -/* 1=decode only. use lame/mpglib to convert mp3/ogg to wav. default=0 */ -int CDECL lame_set_decode_only(lame_global_flags *, int); -int CDECL lame_get_decode_only(const lame_global_flags *); - -#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED -#else -/* 1=encode a Vorbis .ogg file. default=0 */ -/* DEPRECATED */ -int CDECL lame_set_ogg(lame_global_flags *, int); -int CDECL lame_get_ogg(const lame_global_flags *); -#endif - -/* - internal algorithm selection. True quality is determined by the bitrate - but this variable will effect quality by selecting expensive or cheap algorithms. - quality=0..9. 0=best (very slow). 9=worst. - recommended: 2 near-best quality, not too slow - 5 good quality, fast - 7 ok quality, really fast -*/ -int CDECL lame_set_quality(lame_global_flags *, int); -int CDECL lame_get_quality(const lame_global_flags *); - -/* - mode = 0,1,2,3 = stereo, jstereo, dual channel (not supported), mono - default: lame picks based on compression ration and input channels -*/ -int CDECL lame_set_mode(lame_global_flags *, MPEG_mode); -MPEG_mode CDECL lame_get_mode(const lame_global_flags *); - -#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED -#else -/* - mode_automs. Use a M/S mode with a switching threshold based on - compression ratio - DEPRECATED -*/ -int CDECL lame_set_mode_automs(lame_global_flags *, int); -int CDECL lame_get_mode_automs(const lame_global_flags *); -#endif - -/* - force_ms. Force M/S for all frames. For testing only. - default = 0 (disabled) -*/ -int CDECL lame_set_force_ms(lame_global_flags *, int); -int CDECL lame_get_force_ms(const lame_global_flags *); - -/* use free_format? default = 0 (disabled) */ -int CDECL lame_set_free_format(lame_global_flags *, int); -int CDECL lame_get_free_format(const lame_global_flags *); - -/* perform ReplayGain analysis? default = 0 (disabled) */ -int CDECL lame_set_findReplayGain(lame_global_flags *, int); -int CDECL lame_get_findReplayGain(const lame_global_flags *); - -/* decode on the fly. Search for the peak sample. If the ReplayGain - * analysis is enabled then perform the analysis on the decoded data - * stream. default = 0 (disabled) - * NOTE: if this option is set the build-in decoder should not be used */ -int CDECL lame_set_decode_on_the_fly(lame_global_flags *, int); -int CDECL lame_get_decode_on_the_fly(const lame_global_flags *); - -#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED -#else -/* DEPRECATED: now does the same as lame_set_findReplayGain() - default = 0 (disabled) */ -int CDECL lame_set_ReplayGain_input(lame_global_flags *, int); -int CDECL lame_get_ReplayGain_input(const lame_global_flags *); - -/* DEPRECATED: now does the same as - lame_set_decode_on_the_fly() && lame_set_findReplayGain() - default = 0 (disabled) */ -int CDECL lame_set_ReplayGain_decode(lame_global_flags *, int); -int CDECL lame_get_ReplayGain_decode(const lame_global_flags *); - -/* DEPRECATED: now does the same as lame_set_decode_on_the_fly() - default = 0 (disabled) */ -int CDECL lame_set_findPeakSample(lame_global_flags *, int); -int CDECL lame_get_findPeakSample(const lame_global_flags *); -#endif - -/* counters for gapless encoding */ -int CDECL lame_set_nogap_total(lame_global_flags*, int); -int CDECL lame_get_nogap_total(const lame_global_flags*); - -int CDECL lame_set_nogap_currentindex(lame_global_flags* , int); -int CDECL lame_get_nogap_currentindex(const lame_global_flags*); - - -/* - * OPTIONAL: - * Set printf like error/debug/message reporting functions. - * The second argument has to be a pointer to a function which looks like - * void my_debugf(const char *format, va_list ap) - * { - * (void) vfprintf(stdout, format, ap); - * } - * If you use NULL as the value of the pointer in the set function, the - * lame buildin function will be used (prints to stderr). - * To quiet any output you have to replace the body of the example function - * with just "return;" and use it in the set function. - */ -int CDECL lame_set_errorf(lame_global_flags *, lame_report_function); -int CDECL lame_set_debugf(lame_global_flags *, lame_report_function); -int CDECL lame_set_msgf (lame_global_flags *, lame_report_function); - - - -/* set one of brate compression ratio. default is compression ratio of 11. */ -int CDECL lame_set_brate(lame_global_flags *, int); -int CDECL lame_get_brate(const lame_global_flags *); -int CDECL lame_set_compression_ratio(lame_global_flags *, float); -float CDECL lame_get_compression_ratio(const lame_global_flags *); - - -int CDECL lame_set_preset( lame_global_flags* gfp, int ); -int CDECL lame_set_asm_optimizations( lame_global_flags* gfp, int, int ); - - - -/******************************************************************** - * frame params - ***********************************************************************/ -/* mark as copyright. default=0 */ -int CDECL lame_set_copyright(lame_global_flags *, int); -int CDECL lame_get_copyright(const lame_global_flags *); - -/* mark as original. default=1 */ -int CDECL lame_set_original(lame_global_flags *, int); -int CDECL lame_get_original(const lame_global_flags *); - -/* error_protection. Use 2 bytes from each frame for CRC checksum. default=0 */ -int CDECL lame_set_error_protection(lame_global_flags *, int); -int CDECL lame_get_error_protection(const lame_global_flags *); - -#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED -#else -/* padding_type. 0=pad no frames 1=pad all frames 2=adjust padding(default) */ -int CDECL lame_set_padding_type(lame_global_flags *, Padding_type); -Padding_type CDECL lame_get_padding_type(const lame_global_flags *); -#endif - -/* MP3 'private extension' bit Meaningless. default=0 */ -int CDECL lame_set_extension(lame_global_flags *, int); -int CDECL lame_get_extension(const lame_global_flags *); - -/* enforce strict ISO compliance. default=0 */ -int CDECL lame_set_strict_ISO(lame_global_flags *, int); -int CDECL lame_get_strict_ISO(const lame_global_flags *); - - -/******************************************************************** - * quantization/noise shaping - ***********************************************************************/ - -/* disable the bit reservoir. For testing only. default=0 */ -int CDECL lame_set_disable_reservoir(lame_global_flags *, int); -int CDECL lame_get_disable_reservoir(const lame_global_flags *); - -/* select a different "best quantization" function. default=0 */ -int CDECL lame_set_quant_comp(lame_global_flags *, int); -int CDECL lame_get_quant_comp(const lame_global_flags *); -int CDECL lame_set_quant_comp_short(lame_global_flags *, int); -int CDECL lame_get_quant_comp_short(const lame_global_flags *); - -int CDECL lame_set_experimentalX(lame_global_flags *, int); /* compatibility*/ -int CDECL lame_get_experimentalX(const lame_global_flags *); - -/* another experimental option. for testing only */ -int CDECL lame_set_experimentalY(lame_global_flags *, int); -int CDECL lame_get_experimentalY(const lame_global_flags *); - -/* another experimental option. for testing only */ -int CDECL lame_set_experimentalZ(lame_global_flags *, int); -int CDECL lame_get_experimentalZ(const lame_global_flags *); - -/* Naoki's psycho acoustic model. default=0 */ -int CDECL lame_set_exp_nspsytune(lame_global_flags *, int); -int CDECL lame_get_exp_nspsytune(const lame_global_flags *); - -void CDECL lame_set_msfix(lame_global_flags *, double); -float CDECL lame_get_msfix(const lame_global_flags *); - - -/******************************************************************** - * VBR control - ***********************************************************************/ -/* Types of VBR. default = vbr_off = CBR */ -int CDECL lame_set_VBR(lame_global_flags *, vbr_mode); -vbr_mode CDECL lame_get_VBR(const lame_global_flags *); - -/* VBR quality level. 0=highest 9=lowest */ -int CDECL lame_set_VBR_q(lame_global_flags *, int); -int CDECL lame_get_VBR_q(const lame_global_flags *); - -/* VBR quality level. 0=highest 9=lowest, Range [0,...,10[ */ -int CDECL lame_set_VBR_quality(lame_global_flags *, float); -float CDECL lame_get_VBR_quality(const lame_global_flags *); - -/* Ignored except for VBR=vbr_abr (ABR mode) */ -int CDECL lame_set_VBR_mean_bitrate_kbps(lame_global_flags *, int); -int CDECL lame_get_VBR_mean_bitrate_kbps(const lame_global_flags *); - -int CDECL lame_set_VBR_min_bitrate_kbps(lame_global_flags *, int); -int CDECL lame_get_VBR_min_bitrate_kbps(const lame_global_flags *); - -int CDECL lame_set_VBR_max_bitrate_kbps(lame_global_flags *, int); -int CDECL lame_get_VBR_max_bitrate_kbps(const lame_global_flags *); - -/* - 1=strictly enforce VBR_min_bitrate. Normally it will be violated for - analog silence -*/ -int CDECL lame_set_VBR_hard_min(lame_global_flags *, int); -int CDECL lame_get_VBR_hard_min(const lame_global_flags *); - -/* for preset */ -#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED -#else -int CDECL lame_set_preset_expopts(lame_global_flags *, int); -#endif - -/******************************************************************** - * Filtering control - ***********************************************************************/ -/* freq in Hz to apply lowpass. Default = 0 = lame chooses. -1 = disabled */ -int CDECL lame_set_lowpassfreq(lame_global_flags *, int); -int CDECL lame_get_lowpassfreq(const lame_global_flags *); -/* width of transition band, in Hz. Default = one polyphase filter band */ -int CDECL lame_set_lowpasswidth(lame_global_flags *, int); -int CDECL lame_get_lowpasswidth(const lame_global_flags *); - -/* freq in Hz to apply highpass. Default = 0 = lame chooses. -1 = disabled */ -int CDECL lame_set_highpassfreq(lame_global_flags *, int); -int CDECL lame_get_highpassfreq(const lame_global_flags *); -/* width of transition band, in Hz. Default = one polyphase filter band */ -int CDECL lame_set_highpasswidth(lame_global_flags *, int); -int CDECL lame_get_highpasswidth(const lame_global_flags *); - - -/******************************************************************** - * psycho acoustics and other arguments which you should not change - * unless you know what you are doing - ***********************************************************************/ - -/* only use ATH for masking */ -int CDECL lame_set_ATHonly(lame_global_flags *, int); -int CDECL lame_get_ATHonly(const lame_global_flags *); - -/* only use ATH for short blocks */ -int CDECL lame_set_ATHshort(lame_global_flags *, int); -int CDECL lame_get_ATHshort(const lame_global_flags *); - -/* disable ATH */ -int CDECL lame_set_noATH(lame_global_flags *, int); -int CDECL lame_get_noATH(const lame_global_flags *); - -/* select ATH formula */ -int CDECL lame_set_ATHtype(lame_global_flags *, int); -int CDECL lame_get_ATHtype(const lame_global_flags *); - -/* lower ATH by this many db */ -int CDECL lame_set_ATHlower(lame_global_flags *, float); -float CDECL lame_get_ATHlower(const lame_global_flags *); - -/* select ATH adaptive adjustment type */ -int CDECL lame_set_athaa_type( lame_global_flags *, int); -int CDECL lame_get_athaa_type( const lame_global_flags *); - -#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED -#else -/* select the loudness approximation used by the ATH adaptive auto-leveling */ -int CDECL lame_set_athaa_loudapprox( lame_global_flags *, int); -int CDECL lame_get_athaa_loudapprox( const lame_global_flags *); -#endif - -/* adjust (in dB) the point below which adaptive ATH level adjustment occurs */ -int CDECL lame_set_athaa_sensitivity( lame_global_flags *, float); -float CDECL lame_get_athaa_sensitivity( const lame_global_flags* ); - -#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED -#else -/* OBSOLETE: predictability limit (ISO tonality formula) */ -int CDECL lame_set_cwlimit(lame_global_flags *, int); -int CDECL lame_get_cwlimit(const lame_global_flags *); -#endif - -/* - allow blocktypes to differ between channels? - default: 0 for jstereo, 1 for stereo -*/ -int CDECL lame_set_allow_diff_short(lame_global_flags *, int); -int CDECL lame_get_allow_diff_short(const lame_global_flags *); - -/* use temporal masking effect (default = 1) */ -int CDECL lame_set_useTemporal(lame_global_flags *, int); -int CDECL lame_get_useTemporal(const lame_global_flags *); - -/* use temporal masking effect (default = 1) */ -int CDECL lame_set_interChRatio(lame_global_flags *, float); -float CDECL lame_get_interChRatio(const lame_global_flags *); - -/* disable short blocks */ -int CDECL lame_set_no_short_blocks(lame_global_flags *, int); -int CDECL lame_get_no_short_blocks(const lame_global_flags *); - -/* force short blocks */ -int CDECL lame_set_force_short_blocks(lame_global_flags *, int); -int CDECL lame_get_force_short_blocks(const lame_global_flags *); - -/* Input PCM is emphased PCM (for instance from one of the rarely - emphased CDs), it is STRONGLY not recommended to use this, because - psycho does not take it into account, and last but not least many decoders - ignore these bits */ -int CDECL lame_set_emphasis(lame_global_flags *, int); -int CDECL lame_get_emphasis(const lame_global_flags *); - - - -/************************************************************************/ -/* internal variables, cannot be set... */ -/* provided because they may be of use to calling application */ -/************************************************************************/ -/* version 0=MPEG-2 1=MPEG-1 (2=MPEG-2.5) */ -int CDECL lame_get_version(const lame_global_flags *); - -/* encoder delay */ -int CDECL lame_get_encoder_delay(const lame_global_flags *); - -/* - padding appended to the input to make sure decoder can fully decode - all input. Note that this value can only be calculated during the - call to lame_encoder_flush(). Before lame_encoder_flush() has - been called, the value of encoder_padding = 0. -*/ -int CDECL lame_get_encoder_padding(const lame_global_flags *); - -/* size of MPEG frame */ -int CDECL lame_get_framesize(const lame_global_flags *); - -/* number of PCM samples buffered, but not yet encoded to mp3 data. */ -int CDECL lame_get_mf_samples_to_encode( const lame_global_flags* gfp ); - -/* - size (bytes) of mp3 data buffered, but not yet encoded. - this is the number of bytes which would be output by a call to - lame_encode_flush_nogap. NOTE: lame_encode_flush() will return - more bytes than this because it will encode the reamining buffered - PCM samples before flushing the mp3 buffers. -*/ -int CDECL lame_get_size_mp3buffer( const lame_global_flags* gfp ); - -/* number of frames encoded so far */ -int CDECL lame_get_frameNum(const lame_global_flags *); - -/* - lame's estimate of the total number of frames to be encoded - only valid if calling program set num_samples -*/ -int CDECL lame_get_totalframes(const lame_global_flags *); - -/* RadioGain value. Multiplied by 10 and rounded to the nearest. */ -int CDECL lame_get_RadioGain(const lame_global_flags *); - -/* AudiophileGain value. Multipled by 10 and rounded to the nearest. */ -int CDECL lame_get_AudiophileGain(const lame_global_flags *); - -/* the peak sample */ -float CDECL lame_get_PeakSample(const lame_global_flags *); - -/* Gain change required for preventing clipping. The value is correct only if - peak sample searching was enabled. If negative then the waveform - already does not clip. The value is multiplied by 10 and rounded up. */ -int CDECL lame_get_noclipGainChange(const lame_global_flags *); - -/* user-specified scale factor required for preventing clipping. Value is - correct only if peak sample searching was enabled and no user-specified - scaling was performed. If negative then either the waveform already does - not clip or the value cannot be determined */ -float CDECL lame_get_noclipScale(const lame_global_flags *); - -/* returns the limit of PCM samples, which one can pass in an encode call - under the constrain of a provided buffer of size buffer_size */ -int CDECL lame_get_maximum_number_of_samples(lame_t gfp, size_t buffer_size); - - - - -/* - * REQUIRED: - * sets more internal configuration based on data provided above. - * returns -1 if something failed. - */ -int CDECL lame_init_params(lame_global_flags *); - - -/* - * OPTIONAL: - * get the version number, in a string. of the form: - * "3.63 (beta)" or just "3.63". - */ -const char* CDECL get_lame_version ( void ); -const char* CDECL get_lame_short_version ( void ); -const char* CDECL get_lame_very_short_version ( void ); -const char* CDECL get_psy_version ( void ); -const char* CDECL get_lame_url ( void ); -const char* CDECL get_lame_os_bitness ( void ); - -/* - * OPTIONAL: - * get the version numbers in numerical form. - */ -typedef struct { - /* generic LAME version */ - int major; - int minor; - int alpha; /* 0 if not an alpha version */ - int beta; /* 0 if not a beta version */ - - /* version of the psy model */ - int psy_major; - int psy_minor; - int psy_alpha; /* 0 if not an alpha version */ - int psy_beta; /* 0 if not a beta version */ - - /* compile time features */ - const char *features; /* Don't make assumptions about the contents! */ -} lame_version_t; -void CDECL get_lame_version_numerical(lame_version_t *); - - -/* - * OPTIONAL: - * print internal lame configuration to message handler - */ -void CDECL lame_print_config(const lame_global_flags* gfp); - -void CDECL lame_print_internals( const lame_global_flags *gfp); - - -/* - * input pcm data, output (maybe) mp3 frames. - * This routine handles all buffering, resampling and filtering for you. - * - * return code number of bytes output in mp3buf. Can be 0 - * -1: mp3buf was too small - * -2: malloc() problem - * -3: lame_init_params() not called - * -4: psycho acoustic problems - * - * The required mp3buf_size can be computed from num_samples, - * samplerate and encoding rate, but here is a worst case estimate: - * - * mp3buf_size in bytes = 1.25*num_samples + 7200 - * - * I think a tighter bound could be: (mt, March 2000) - * MPEG1: - * num_samples*(bitrate/8)/samplerate + 4*1152*(bitrate/8)/samplerate + 512 - * MPEG2: - * num_samples*(bitrate/8)/samplerate + 4*576*(bitrate/8)/samplerate + 256 - * - * but test first if you use that! - * - * set mp3buf_size = 0 and LAME will not check if mp3buf_size is - * large enough. - * - * NOTE: - * if gfp->num_channels=2, but gfp->mode = 3 (mono), the L & R channels - * will be averaged into the L channel before encoding only the L channel - * This will overwrite the data in buffer_l[] and buffer_r[]. - * -*/ -int CDECL lame_encode_buffer ( - lame_global_flags* gfp, /* global context handle */ - const short int buffer_l [], /* PCM data for left channel */ - const short int buffer_r [], /* PCM data for right channel */ - const int nsamples, /* number of samples per channel */ - unsigned char* mp3buf, /* pointer to encoded MP3 stream */ - const int mp3buf_size ); /* number of valid octets in this - stream */ - -/* - * as above, but input has L & R channel data interleaved. - * NOTE: - * num_samples = number of samples in the L (or R) - * channel, not the total number of samples in pcm[] - */ -int CDECL lame_encode_buffer_interleaved( - lame_global_flags* gfp, /* global context handlei */ - short int pcm[], /* PCM data for left and right - channel, interleaved */ - int num_samples, /* number of samples per channel, - _not_ number of samples in - pcm[] */ - unsigned char* mp3buf, /* pointer to encoded MP3 stream */ - int mp3buf_size ); /* number of valid octets in this - stream */ - - -/* as lame_encode_buffer, but for 'float's. - * !! NOTE: !! data must still be scaled to be in the same range as - * short int, +/- 32768 - */ -int CDECL lame_encode_buffer_float( - lame_global_flags* gfp, /* global context handle */ - const float pcm_l [], /* PCM data for left channel */ - const float pcm_r [], /* PCM data for right channel */ - const int nsamples, /* number of samples per channel */ - unsigned char* mp3buf, /* pointer to encoded MP3 stream */ - const int mp3buf_size ); /* number of valid octets in this - stream */ - -/* as lame_encode_buffer, but for 'float's. - * !! NOTE: !! data must be scaled to +/- 1 full scale - */ -int CDECL lame_encode_buffer_ieee_float( - lame_t gfp, - const float pcm_l [], /* PCM data for left channel */ - const float pcm_r [], /* PCM data for right channel */ - const int nsamples, - unsigned char * mp3buf, - const int mp3buf_size); -int CDECL lame_encode_buffer_interleaved_ieee_float( - lame_t gfp, - const float pcm[], /* PCM data for left and right - channel, interleaved */ - const int nsamples, - unsigned char * mp3buf, - const int mp3buf_size); - -/* as lame_encode_buffer, but for 'double's. - * !! NOTE: !! data must be scaled to +/- 1 full scale - */ -int CDECL lame_encode_buffer_ieee_double( - lame_t gfp, - const double pcm_l [], /* PCM data for left channel */ - const double pcm_r [], /* PCM data for right channel */ - const int nsamples, - unsigned char * mp3buf, - const int mp3buf_size); -int CDECL lame_encode_buffer_interleaved_ieee_double( - lame_t gfp, - const double pcm[], /* PCM data for left and right - channel, interleaved */ - const int nsamples, - unsigned char * mp3buf, - const int mp3buf_size); - -/* as lame_encode_buffer, but for long's - * !! NOTE: !! data must still be scaled to be in the same range as - * short int, +/- 32768 - * - * This scaling was a mistake (doesn't allow one to exploit full - * precision of type 'long'. Use lame_encode_buffer_long2() instead. - * - */ -int CDECL lame_encode_buffer_long( - lame_global_flags* gfp, /* global context handle */ - const long buffer_l [], /* PCM data for left channel */ - const long buffer_r [], /* PCM data for right channel */ - const int nsamples, /* number of samples per channel */ - unsigned char* mp3buf, /* pointer to encoded MP3 stream */ - const int mp3buf_size ); /* number of valid octets in this - stream */ - -/* Same as lame_encode_buffer_long(), but with correct scaling. - * !! NOTE: !! data must still be scaled to be in the same range as - * type 'long'. Data should be in the range: +/- 2^(8*size(long)-1) - * - */ -int CDECL lame_encode_buffer_long2( - lame_global_flags* gfp, /* global context handle */ - const long buffer_l [], /* PCM data for left channel */ - const long buffer_r [], /* PCM data for right channel */ - const int nsamples, /* number of samples per channel */ - unsigned char* mp3buf, /* pointer to encoded MP3 stream */ - const int mp3buf_size ); /* number of valid octets in this - stream */ - -/* as lame_encode_buffer, but for int's - * !! NOTE: !! input should be scaled to the maximum range of 'int' - * If int is 4 bytes, then the values should range from - * +/- 2147483648. - * - * This routine does not (and cannot, without loosing precision) use - * the same scaling as the rest of the lame_encode_buffer() routines. - * - */ -int CDECL lame_encode_buffer_int( - lame_global_flags* gfp, /* global context handle */ - const int buffer_l [], /* PCM data for left channel */ - const int buffer_r [], /* PCM data for right channel */ - const int nsamples, /* number of samples per channel */ - unsigned char* mp3buf, /* pointer to encoded MP3 stream */ - const int mp3buf_size ); /* number of valid octets in this - stream */ - -/* - * as above, but for interleaved data. - * !! NOTE: !! data must still be scaled to be in the same range as - * type 'int32_t'. Data should be in the range: +/- 2^(8*size(int32_t)-1) - * NOTE: - * num_samples = number of samples in the L (or R) - * channel, not the total number of samples in pcm[] - */ -int -lame_encode_buffer_interleaved_int( - lame_t gfp, - const int pcm [], /* PCM data for left and right - channel, interleaved */ - const int nsamples, /* number of samples per channel, - _not_ number of samples in - pcm[] */ - unsigned char* mp3buf, /* pointer to encoded MP3 stream */ - const int mp3buf_size ); /* number of valid octets in this - stream */ - - - -/* - * REQUIRED: - * lame_encode_flush will flush the intenal PCM buffers, padding with - * 0's to make sure the final frame is complete, and then flush - * the internal MP3 buffers, and thus may return a - * final few mp3 frames. 'mp3buf' should be at least 7200 bytes long - * to hold all possible emitted data. - * - * will also write id3v1 tags (if any) into the bitstream - * - * return code = number of bytes output to mp3buf. Can be 0 - */ -int CDECL lame_encode_flush( - lame_global_flags * gfp, /* global context handle */ - unsigned char* mp3buf, /* pointer to encoded MP3 stream */ - int size); /* number of valid octets in this stream */ - -/* - * OPTIONAL: - * lame_encode_flush_nogap will flush the internal mp3 buffers and pad - * the last frame with ancillary data so it is a complete mp3 frame. - * - * 'mp3buf' should be at least 7200 bytes long - * to hold all possible emitted data. - * - * After a call to this routine, the outputed mp3 data is complete, but - * you may continue to encode new PCM samples and write future mp3 data - * to a different file. The two mp3 files will play back with no gaps - * if they are concatenated together. - * - * This routine will NOT write id3v1 tags into the bitstream. - * - * return code = number of bytes output to mp3buf. Can be 0 - */ -int CDECL lame_encode_flush_nogap( - lame_global_flags * gfp, /* global context handle */ - unsigned char* mp3buf, /* pointer to encoded MP3 stream */ - int size); /* number of valid octets in this stream */ - -/* - * OPTIONAL: - * Normally, this is called by lame_init_params(). It writes id3v2 and - * Xing headers into the front of the bitstream, and sets frame counters - * and bitrate histogram data to 0. You can also call this after - * lame_encode_flush_nogap(). - */ -int CDECL lame_init_bitstream( - lame_global_flags * gfp); /* global context handle */ - - - -/* - * OPTIONAL: some simple statistics - * a bitrate histogram to visualize the distribution of used frame sizes - * a stereo mode histogram to visualize the distribution of used stereo - * modes, useful in joint-stereo mode only - * 0: LR left-right encoded - * 1: LR-I left-right and intensity encoded (currently not supported) - * 2: MS mid-side encoded - * 3: MS-I mid-side and intensity encoded (currently not supported) - * - * attention: don't call them after lame_encode_finish - * suggested: lame_encode_flush -> lame_*_hist -> lame_close - */ - -void CDECL lame_bitrate_hist( - const lame_global_flags * gfp, - int bitrate_count[14] ); -void CDECL lame_bitrate_kbps( - const lame_global_flags * gfp, - int bitrate_kbps [14] ); -void CDECL lame_stereo_mode_hist( - const lame_global_flags * gfp, - int stereo_mode_count[4] ); - -void CDECL lame_bitrate_stereo_mode_hist ( - const lame_global_flags * gfp, - int bitrate_stmode_count[14][4] ); - -void CDECL lame_block_type_hist ( - const lame_global_flags * gfp, - int btype_count[6] ); - -void CDECL lame_bitrate_block_type_hist ( - const lame_global_flags * gfp, - int bitrate_btype_count[14][6] ); - -#if (DEPRECATED_OR_OBSOLETE_CODE_REMOVED && 0) -#else -/* - * OPTIONAL: - * lame_mp3_tags_fid will rewrite a Xing VBR tag to the mp3 file with file - * pointer fid. These calls perform forward and backwards seeks, so make - * sure fid is a real file. Make sure lame_encode_flush has been called, - * and all mp3 data has been written to the file before calling this - * function. - * NOTE: - * if VBR tags are turned off by the user, or turned off by LAME because - * the output is not a regular file, this call does nothing - * NOTE: - * LAME wants to read from the file to skip an optional ID3v2 tag, so - * make sure you opened the file for writing and reading. - * NOTE: - * You can call lame_get_lametag_frame instead, if you want to insert - * the lametag yourself. -*/ -void CDECL lame_mp3_tags_fid(lame_global_flags *, FILE* fid); -#endif - -/* - * OPTIONAL: - * lame_get_lametag_frame copies the final LAME-tag into 'buffer'. - * The function returns the number of bytes copied into buffer, or - * the required buffer size, if the provided buffer is too small. - * Function failed, if the return value is larger than 'size'! - * Make sure lame_encode flush has been called before calling this function. - * NOTE: - * if VBR tags are turned off by the user, or turned off by LAME, - * this call does nothing and returns 0. - * NOTE: - * LAME inserted an empty frame in the beginning of mp3 audio data, - * which you have to replace by the final LAME-tag frame after encoding. - * In case there is no ID3v2 tag, usually this frame will be the very first - * data in your mp3 file. If you put some other leading data into your - * file, you'll have to do some bookkeeping about where to write this buffer. - */ -size_t CDECL lame_get_lametag_frame( - const lame_global_flags *, unsigned char* buffer, size_t size); - -/* - * REQUIRED: - * final call to free all remaining buffers - */ -int CDECL lame_close (lame_global_flags *); - -#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED -#else -/* - * OBSOLETE: - * lame_encode_finish combines lame_encode_flush() and lame_close() in - * one call. However, once this call is made, the statistics routines - * will no longer work because the data will have been cleared, and - * lame_mp3_tags_fid() cannot be called to add data to the VBR header - */ -int CDECL lame_encode_finish( - lame_global_flags* gfp, - unsigned char* mp3buf, - int size ); -#endif - - - - - - -/********************************************************************* - * - * decoding - * - * a simple interface to mpglib, part of mpg123, is also included if - * libmp3lame is compiled with HAVE_MPGLIB - * - *********************************************************************/ - -struct hip_global_struct; -typedef struct hip_global_struct hip_global_flags; -typedef hip_global_flags *hip_t; - - -typedef struct { - int header_parsed; /* 1 if header was parsed and following data was - computed */ - int stereo; /* number of channels */ - int samplerate; /* sample rate */ - int bitrate; /* bitrate */ - int mode; /* mp3 frame type */ - int mode_ext; /* mp3 frame type */ - int framesize; /* number of samples per mp3 frame */ - - /* this data is only computed if mpglib detects a Xing VBR header */ - unsigned long nsamp; /* number of samples in mp3 file. */ - int totalframes; /* total number of frames in mp3 file */ - - /* this data is not currently computed by the mpglib routines */ - int framenum; /* frames decoded counter */ -} mp3data_struct; - -/* required call to initialize decoder */ -hip_t CDECL hip_decode_init(void); - -/* cleanup call to exit decoder */ -int CDECL hip_decode_exit(hip_t gfp); - -/* HIP reporting functions */ -void CDECL hip_set_errorf(hip_t gfp, lame_report_function f); -void CDECL hip_set_debugf(hip_t gfp, lame_report_function f); -void CDECL hip_set_msgf (hip_t gfp, lame_report_function f); - -/********************************************************************* - * input 1 mp3 frame, output (maybe) pcm data. - * - * nout = hip_decode(hip, mp3buf,len,pcm_l,pcm_r); - * - * input: - * len : number of bytes of mp3 data in mp3buf - * mp3buf[len] : mp3 data to be decoded - * - * output: - * nout: -1 : decoding error - * 0 : need more data before we can complete the decode - * >0 : returned 'nout' samples worth of data in pcm_l,pcm_r - * pcm_l[nout] : left channel data - * pcm_r[nout] : right channel data - * - *********************************************************************/ -int CDECL hip_decode( hip_t gfp - , unsigned char * mp3buf - , size_t len - , short pcm_l[] - , short pcm_r[] - ); - -/* same as hip_decode, and also returns mp3 header data */ -int CDECL hip_decode_headers( hip_t gfp - , unsigned char* mp3buf - , size_t len - , short pcm_l[] - , short pcm_r[] - , mp3data_struct* mp3data - ); - -/* same as hip_decode, but returns at most one frame */ -int CDECL hip_decode1( hip_t gfp - , unsigned char* mp3buf - , size_t len - , short pcm_l[] - , short pcm_r[] - ); - -/* same as hip_decode1, but returns at most one frame and mp3 header data */ -int CDECL hip_decode1_headers( hip_t gfp - , unsigned char* mp3buf - , size_t len - , short pcm_l[] - , short pcm_r[] - , mp3data_struct* mp3data - ); - -/* same as hip_decode1_headers, but also returns enc_delay and enc_padding - from VBR Info tag, (-1 if no info tag was found) */ -int CDECL hip_decode1_headersB( hip_t gfp - , unsigned char* mp3buf - , size_t len - , short pcm_l[] - , short pcm_r[] - , mp3data_struct* mp3data - , int *enc_delay - , int *enc_padding - ); - - - -/* OBSOLETE: - * lame_decode... functions are there to keep old code working - * but it is strongly recommended to replace calls by hip_decode... - * function calls, see above. - */ -#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED -#else -int CDECL lame_decode_init(void); -int CDECL lame_decode( - unsigned char * mp3buf, - int len, - short pcm_l[], - short pcm_r[] ); -int CDECL lame_decode_headers( - unsigned char* mp3buf, - int len, - short pcm_l[], - short pcm_r[], - mp3data_struct* mp3data ); -int CDECL lame_decode1( - unsigned char* mp3buf, - int len, - short pcm_l[], - short pcm_r[] ); -int CDECL lame_decode1_headers( - unsigned char* mp3buf, - int len, - short pcm_l[], - short pcm_r[], - mp3data_struct* mp3data ); -int CDECL lame_decode1_headersB( - unsigned char* mp3buf, - int len, - short pcm_l[], - short pcm_r[], - mp3data_struct* mp3data, - int *enc_delay, - int *enc_padding ); -int CDECL lame_decode_exit(void); - -#endif /* obsolete lame_decode API calls */ - - -/********************************************************************* - * - * id3tag stuff - * - *********************************************************************/ - -/* - * id3tag.h -- Interface to write ID3 version 1 and 2 tags. - * - * Copyright (C) 2000 Don Melton. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. - */ - -/* utility to obtain alphabetically sorted list of genre names with numbers */ -void CDECL id3tag_genre_list( - void (*handler)(int, const char *, void *), - void* cookie); - -void CDECL id3tag_init (lame_t gfp); - -/* force addition of version 2 tag */ -void CDECL id3tag_add_v2 (lame_t gfp); - -/* add only a version 1 tag */ -void CDECL id3tag_v1_only (lame_t gfp); - -/* add only a version 2 tag */ -void CDECL id3tag_v2_only (lame_t gfp); - -/* pad version 1 tag with spaces instead of nulls */ -void CDECL id3tag_space_v1 (lame_t gfp); - -/* pad version 2 tag with extra 128 bytes */ -void CDECL id3tag_pad_v2 (lame_t gfp); - -/* pad version 2 tag with extra n bytes */ -void CDECL id3tag_set_pad (lame_t gfp, size_t n); - -void CDECL id3tag_set_title(lame_t gfp, const char* title); -void CDECL id3tag_set_artist(lame_t gfp, const char* artist); -void CDECL id3tag_set_album(lame_t gfp, const char* album); -void CDECL id3tag_set_year(lame_t gfp, const char* year); -void CDECL id3tag_set_comment(lame_t gfp, const char* comment); - -/* return -1 result if track number is out of ID3v1 range - and ignored for ID3v1 */ -int CDECL id3tag_set_track(lame_t gfp, const char* track); - -/* return non-zero result if genre name or number is invalid - result 0: OK - result -1: genre number out of range - result -2: no valid ID3v1 genre name, mapped to ID3v1 'Other' - but taken as-is for ID3v2 genre tag */ -int CDECL id3tag_set_genre(lame_t gfp, const char* genre); - -/* return non-zero result if field name is invalid */ -int CDECL id3tag_set_fieldvalue(lame_t gfp, const char* fieldvalue); - -/* return non-zero result if image type is invalid */ -int CDECL id3tag_set_albumart(lame_t gfp, const char* image, size_t size); - -/* lame_get_id3v1_tag copies ID3v1 tag into buffer. - * Function returns number of bytes copied into buffer, or number - * of bytes rquired if buffer 'size' is too small. - * Function fails, if returned value is larger than 'size'. - * NOTE: - * This functions does nothing, if user/LAME disabled ID3v1 tag. - */ -size_t CDECL lame_get_id3v1_tag(lame_t gfp, unsigned char* buffer, size_t size); - -/* lame_get_id3v2_tag copies ID3v2 tag into buffer. - * Function returns number of bytes copied into buffer, or number - * of bytes rquired if buffer 'size' is too small. - * Function fails, if returned value is larger than 'size'. - * NOTE: - * This functions does nothing, if user/LAME disabled ID3v2 tag. - */ -size_t CDECL lame_get_id3v2_tag(lame_t gfp, unsigned char* buffer, size_t size); - -/* normaly lame_init_param writes ID3v2 tags into the audio stream - * Call lame_set_write_id3tag_automatic(gfp, 0) before lame_init_param - * to turn off this behaviour and get ID3v2 tag with above function - * write it yourself into your file. - */ -void CDECL lame_set_write_id3tag_automatic(lame_global_flags * gfp, int); -int CDECL lame_get_write_id3tag_automatic(lame_global_flags const* gfp); - -/* experimental */ -int CDECL id3tag_set_textinfo_latin1(lame_t gfp, char const *id, char const *text); - -/* experimental */ -int CDECL id3tag_set_comment_latin1(lame_t gfp, char const *lang, char const *desc, char const *text); - -#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED -#else -/* experimental */ -int CDECL id3tag_set_textinfo_ucs2(lame_t gfp, char const *id, unsigned short const *text); - -/* experimental */ -int CDECL id3tag_set_comment_ucs2(lame_t gfp, char const *lang, - unsigned short const *desc, unsigned short const *text); - -/* experimental */ -int CDECL id3tag_set_fieldvalue_ucs2(lame_t gfp, const unsigned short *fieldvalue); -#endif - -/* experimental */ -int CDECL id3tag_set_fieldvalue_utf16(lame_t gfp, const unsigned short *fieldvalue); - -/* experimental */ -int CDECL id3tag_set_textinfo_utf16(lame_t gfp, char const *id, unsigned short const *text); - -/* experimental */ -int CDECL id3tag_set_comment_utf16(lame_t gfp, char const *lang, unsigned short const *desc, unsigned short const *text); - - -/*********************************************************************** -* -* list of valid bitrates [kbps] & sample frequencies [Hz]. -* first index: 0: MPEG-2 values (sample frequencies 16...24 kHz) -* 1: MPEG-1 values (sample frequencies 32...48 kHz) -* 2: MPEG-2.5 values (sample frequencies 8...12 kHz) -***********************************************************************/ - -extern const int bitrate_table [3][16]; -extern const int samplerate_table [3][ 4]; - -/* access functions for use in DLL, global vars are not exported */ -int CDECL lame_get_bitrate(int mpeg_version, int table_index); -int CDECL lame_get_samplerate(int mpeg_version, int table_index); - - -/* maximum size of albumart image (128KB), which affects LAME_MAXMP3BUFFER - as well since lame_encode_buffer() also returns ID3v2 tag data */ -#define LAME_MAXALBUMART (128 * 1024) - -/* maximum size of mp3buffer needed if you encode at most 1152 samples for - each call to lame_encode_buffer. see lame_encode_buffer() below - (LAME_MAXMP3BUFFER is now obsolete) */ -#define LAME_MAXMP3BUFFER (16384 + LAME_MAXALBUMART) - - -typedef enum { - LAME_OKAY = 0, - LAME_NOERROR = 0, - LAME_GENERICERROR = -1, - LAME_NOMEM = -10, - LAME_BADBITRATE = -11, - LAME_BADSAMPFREQ = -12, - LAME_INTERNALERROR = -13, - - FRONTEND_READERROR = -80, - FRONTEND_WRITEERROR = -81, - FRONTEND_FILETOOLARGE = -82 - -} lame_errorcodes_t; - -#if defined(__cplusplus) -} -#endif -#endif /* LAME_LAME_H */ - diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/lame_global_flags.h b/recorderlib/src/main/jni/lame-3.100_libmp3lame/lame_global_flags.h deleted file mode 100644 index ad9e677..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/lame_global_flags.h +++ /dev/null @@ -1,184 +0,0 @@ -#ifndef LAME_GLOBAL_FLAGS_H -#define LAME_GLOBAL_FLAGS_H - -#ifndef lame_internal_flags_defined -#define lame_internal_flags_defined -struct lame_internal_flags; -typedef struct lame_internal_flags lame_internal_flags; -#endif - - -typedef enum short_block_e { - short_block_not_set = -1, /* allow LAME to decide */ - short_block_allowed = 0, /* LAME may use them, even different block types for L/R */ - short_block_coupled, /* LAME may use them, but always same block types in L/R */ - short_block_dispensed, /* LAME will not use short blocks, long blocks only */ - short_block_forced /* LAME will not use long blocks, short blocks only */ -} short_block_t; - -/*********************************************************************** -* -* Control Parameters set by User. These parameters are here for -* backwards compatibility with the old, non-shared lib API. -* Please use the lame_set_variablename() functions below -* -* -***********************************************************************/ -struct lame_global_struct { - unsigned int class_id; - - /* input description */ - unsigned long num_samples; /* number of samples. default=2^32-1 */ - int num_channels; /* input number of channels. default=2 */ - int samplerate_in; /* input_samp_rate in Hz. default=44.1 kHz */ - int samplerate_out; /* output_samp_rate. - default: LAME picks best value - at least not used for MP3 decoding: - Remember 44.1 kHz MP3s and AC97 */ - float scale; /* scale input by this amount before encoding - at least not used for MP3 decoding */ - float scale_left; /* scale input of channel 0 (left) by this - amount before encoding */ - float scale_right; /* scale input of channel 1 (right) by this - amount before encoding */ - - /* general control params */ - int analysis; /* collect data for a MP3 frame analyzer? */ - int write_lame_tag; /* add Xing VBR tag? */ - int decode_only; /* use lame/mpglib to convert mp3 to wav */ - int quality; /* quality setting 0=best, 9=worst default=5 */ - MPEG_mode mode; /* see enum in lame.h - default = LAME picks best value */ - int force_ms; /* force M/S mode. requires mode=1 */ - int free_format; /* use free format? default=0 */ - int findReplayGain; /* find the RG value? default=0 */ - int decode_on_the_fly; /* decode on the fly? default=0 */ - int write_id3tag_automatic; /* 1 (default) writes ID3 tags, 0 not */ - - int nogap_total; - int nogap_current; - - int substep_shaping; - int noise_shaping; - int subblock_gain; /* 0 = no, 1 = yes */ - int use_best_huffman; /* 0 = no. 1=outside loop 2=inside loop(slow) */ - - /* - * set either brate>0 or compression_ratio>0, LAME will compute - * the value of the variable not set. - * Default is compression_ratio = 11.025 - */ - int brate; /* bitrate */ - float compression_ratio; /* sizeof(wav file)/sizeof(mp3 file) */ - - - /* frame params */ - int copyright; /* mark as copyright. default=0 */ - int original; /* mark as original. default=1 */ - int extension; /* the MP3 'private extension' bit. - Meaningless */ - int emphasis; /* Input PCM is emphased PCM (for - instance from one of the rarely - emphased CDs), it is STRONGLY not - recommended to use this, because - psycho does not take it into account, - and last but not least many decoders - don't care about these bits */ - int error_protection; /* use 2 bytes per frame for a CRC - checksum. default=0 */ - int strict_ISO; /* enforce ISO spec as much as possible */ - - int disable_reservoir; /* use bit reservoir? */ - - /* quantization/noise shaping */ - int quant_comp; - int quant_comp_short; - int experimentalY; - int experimentalZ; - int exp_nspsytune; - - int preset; - - /* VBR control */ - vbr_mode VBR; - float VBR_q_frac; /* Range [0,...,1[ */ - int VBR_q; /* Range [0,...,9] */ - int VBR_mean_bitrate_kbps; - int VBR_min_bitrate_kbps; - int VBR_max_bitrate_kbps; - int VBR_hard_min; /* strictly enforce VBR_min_bitrate - normaly, it will be violated for analog - silence */ - - - /* resampling and filtering */ - int lowpassfreq; /* freq in Hz. 0=lame choses. - -1=no filter */ - int highpassfreq; /* freq in Hz. 0=lame choses. - -1=no filter */ - int lowpasswidth; /* freq width of filter, in Hz - (default=15%) */ - int highpasswidth; /* freq width of filter, in Hz - (default=15%) */ - - - - /* - * psycho acoustics and other arguments which you should not change - * unless you know what you are doing - */ - float maskingadjust; - float maskingadjust_short; - int ATHonly; /* only use ATH */ - int ATHshort; /* only use ATH for short blocks */ - int noATH; /* disable ATH */ - int ATHtype; /* select ATH formula */ - float ATHcurve; /* change ATH formula 4 shape */ - float ATH_lower_db; /* lower ATH by this many db */ - int athaa_type; /* select ATH auto-adjust scheme */ - float athaa_sensitivity; /* dB, tune active region of auto-level */ - short_block_t short_blocks; - int useTemporal; /* use temporal masking effect */ - float interChRatio; - float msfix; /* Naoki's adjustment of Mid/Side maskings */ - - int tune; /* 0 off, 1 on */ - float tune_value_a; /* used to pass values for debugging and stuff */ - - float attackthre; /* attack threshold for L/R/M channel */ - float attackthre_s; /* attack threshold for S channel */ - - - struct { - void (*msgf) (const char *format, va_list ap); - void (*debugf) (const char *format, va_list ap); - void (*errorf) (const char *format, va_list ap); - } report; - - /************************************************************************/ - /* internal variables, do not set... */ - /* provided because they may be of use to calling application */ - /************************************************************************/ - - int lame_allocated_gfp; /* is this struct owned by calling - program or lame? */ - - - - /**************************************************************************/ - /* more internal variables are stored in this structure: */ - /**************************************************************************/ - lame_internal_flags *internal_flags; - - - struct { - int mmx; - int amd3dnow; - int sse; - - } asm_optimizations; -}; - -int is_lame_global_flags_valid(const lame_global_flags * gfp); - -#endif /* LAME_GLOBAL_FLAGS_H */ diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/lameerror.h b/recorderlib/src/main/jni/lame-3.100_libmp3lame/lameerror.h deleted file mode 100644 index 7d9216b..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/lameerror.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * A collection of LAME Error Codes - * - * Please use the constants defined here instead of some arbitrary - * values. Currently the values starting at -10 to avoid intersection - * with the -1, -2, -3 and -4 used in the current code. - * - * May be this should be a part of the include/lame.h. - */ - -typedef enum { - LAME_OKAY = 0, - LAME_NOERROR = 0, - LAME_GENERICERROR = -1, - LAME_NOMEM = -10, - LAME_BADBITRATE = -11, - LAME_BADSAMPFREQ = -12, - LAME_INTERNALERROR = -13, - - FRONTEND_READERROR = -80, - FRONTEND_WRITEERROR = -81, - FRONTEND_FILETOOLARGE = -82, - -} lame_errorcodes_t; - -/* end of lameerror.h */ diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/machine.h b/recorderlib/src/main/jni/lame-3.100_libmp3lame/machine.h deleted file mode 100644 index bf6fff2..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/machine.h +++ /dev/null @@ -1,189 +0,0 @@ -/* - * Machine dependent defines/includes for LAME. - * - * Copyright (c) 1999 A.L. Faber - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef LAME_MACHINE_H -#define LAME_MACHINE_H - -#include "version.h" - -#include -#include - -#ifdef STDC_HEADERS -# include -# include -#else -# ifndef HAVE_STRCHR -# define strchr index -# define strrchr rindex -# endif -char *strchr(), *strrchr(); -# ifndef HAVE_MEMCPY -# define memcpy(d, s, n) bcopy ((s), (d), (n)) -# define memmove(d, s, n) bcopy ((s), (d), (n)) -# endif -#endif - -#if defined(__riscos__) && defined(FPA10) -# include "ymath.h" -#else -# include -#endif -#include - -#include - -#ifdef HAVE_ERRNO_H -# include -#endif -#ifdef HAVE_FCNTL_H -# include -#endif - -#if defined(macintosh) -# include -# include -#else -# include -# include -#endif - -#ifdef HAVE_INTTYPES_H -# include -#else -# ifdef HAVE_STDINT_H -# include -# endif -#endif - -#ifdef WITH_DMALLOC -#include -#endif - -/* - * 3 different types of pow() functions: - * - table lookup - * - pow() - * - exp() on some machines this is claimed to be faster than pow() - */ - -#define POW20(x) (assert(0 <= (x+Q_MAX2) && x < Q_MAX), pow20[x+Q_MAX2]) -/*#define POW20(x) pow(2.0,((double)(x)-210)*.25) */ -/*#define POW20(x) exp( ((double)(x)-210)*(.25*LOG2) ) */ - -#define IPOW20(x) (assert(0 <= x && x < Q_MAX), ipow20[x]) -/*#define IPOW20(x) exp( -((double)(x)-210)*.1875*LOG2 ) */ -/*#define IPOW20(x) pow(2.0,-((double)(x)-210)*.1875) */ - -/* in case this is used without configure */ -#ifndef inline -# define inline -#endif - -#if defined(_MSC_VER) -# undef inline -# define inline _inline -#elif defined(__SASC) || defined(__GNUC__) || defined(__ICC) || defined(__ECC) -/* if __GNUC__ we always want to inline, not only if the user requests it */ -# undef inline -# define inline __inline -#endif - -#if defined(_MSC_VER) -# pragma warning( disable : 4244 ) -/*# pragma warning( disable : 4305 ) */ -#endif - -/* - * FLOAT for variables which require at least 32 bits - * FLOAT8 for variables which require at least 64 bits - * - * On some machines, 64 bit will be faster than 32 bit. Also, some math - * routines require 64 bit float, so setting FLOAT=float will result in a - * lot of conversions. - */ - -#if ( defined(_MSC_VER) || defined(__BORLANDC__) || defined(__MINGW32__) ) -# define WIN32_LEAN_AND_MEAN -# include -# include -# define FLOAT_MAX FLT_MAX -#else -# ifndef FLOAT -typedef float FLOAT; -# ifdef FLT_MAX -# define FLOAT_MAX FLT_MAX -# else -# define FLOAT_MAX 1e37 /* approx */ -# endif -# endif -#endif - -#ifndef FLOAT8 -typedef double FLOAT8; -# ifdef DBL_MAX -# define FLOAT8_MAX DBL_MAX -# else -# define FLOAT8_MAX 1e99 /* approx */ -# endif -#else -# ifdef FLT_MAX -# define FLOAT8_MAX FLT_MAX -# else -# define FLOAT8_MAX 1e37 /* approx */ -# endif -#endif - -/* sample_t must be floating point, at least 32 bits */ -typedef FLOAT sample_t; - -#define dimension_of(array) (sizeof(array)/sizeof(array[0])) -#define beyond(array) (array+dimension_of(array)) -#define compiletime_assert(expression) enum{static_assert_##FILE##_##LINE = 1/((expression)?1:0)} -#define lame_calloc(TYPE, COUNT) ((TYPE*)calloc(COUNT, sizeof(TYPE))) -#define multiple_of(CHUNK, COUNT) (\ - ( (COUNT) < 1 || (CHUNK) < 1 || (COUNT) % (CHUNK) == 0 ) \ - ? (COUNT) \ - : ((COUNT) + (CHUNK) - (COUNT) % (CHUNK)) \ - ) - -#if 1 -#define EQ(a,b) (\ -(fabs(a) > fabs(b)) \ - ? (fabs((a)-(b)) <= (fabs(a) * 1e-6f)) \ - : (fabs((a)-(b)) <= (fabs(b) * 1e-6f))) -#else -#define EQ(a,b) (fabs((a)-(b))<1E-37) -#endif - -#define NEQ(a,b) (!EQ(a,b)) - -#ifdef _MSC_VER -# if _MSC_VER < 1400 -# define fabsf fabs -# define powf pow -# define log10f log10 -# endif -#endif - -#endif - -/* end of machine.h */ diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/mpglib_interface.c b/recorderlib/src/main/jni/lame-3.100_libmp3lame/mpglib_interface.c deleted file mode 100644 index d0f0b1d..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/mpglib_interface.c +++ /dev/null @@ -1,477 +0,0 @@ -/* -*- mode: C; mode: fold -*- */ -/* - * LAME MP3 encoding engine - * - * Copyright (c) 1999-2000 Mark Taylor - * Copyright (c) 2003 Olcios - * Copyright (c) 2008 Robert Hegemann - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* $Id: mpglib_interface.c,v 1.44 2012/02/18 13:09:00 robert Exp $ */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#ifdef HAVE_MPGLIB -#define hip_global_struct mpstr_tag -#include "lame.h" -#include "machine.h" -#include "encoder.h" -#include "interface.h" - -#include "util.h" - - - -#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED -/* - * OBSOLETE: - * - kept to let it link - * - forward declaration to silence compiler - */ -int CDECL lame_decode_init(void); -int CDECL lame_decode( - unsigned char * mp3buf, - int len, - short pcm_l[], - short pcm_r[] ); -int CDECL lame_decode_headers( - unsigned char* mp3buf, - int len, - short pcm_l[], - short pcm_r[], - mp3data_struct* mp3data ); -int CDECL lame_decode1( - unsigned char* mp3buf, - int len, - short pcm_l[], - short pcm_r[] ); -int CDECL lame_decode1_headers( - unsigned char* mp3buf, - int len, - short pcm_l[], - short pcm_r[], - mp3data_struct* mp3data ); -int CDECL lame_decode1_headersB( - unsigned char* mp3buf, - int len, - short pcm_l[], - short pcm_r[], - mp3data_struct* mp3data, - int *enc_delay, - int *enc_padding ); -int CDECL lame_decode_exit(void); -#endif - - -static MPSTR mp; - -int -lame_decode_exit(void) -{ - ExitMP3(&mp); - return 0; -} - - -int -lame_decode_init(void) -{ - (void) InitMP3(&mp); - return 0; -} - - - - -/* copy mono samples */ -#define COPY_MONO(DST_TYPE, SRC_TYPE) \ - DST_TYPE *pcm_l = (DST_TYPE *)pcm_l_raw; \ - SRC_TYPE const *p_samples = (SRC_TYPE const *)p; \ - for (i = 0; i < processed_samples; i++) \ - *pcm_l++ = (DST_TYPE)(*p_samples++); - -/* copy stereo samples */ -#define COPY_STEREO(DST_TYPE, SRC_TYPE) \ - DST_TYPE *pcm_l = (DST_TYPE *)pcm_l_raw, *pcm_r = (DST_TYPE *)pcm_r_raw; \ - SRC_TYPE const *p_samples = (SRC_TYPE const *)p; \ - for (i = 0; i < processed_samples; i++) { \ - *pcm_l++ = (DST_TYPE)(*p_samples++); \ - *pcm_r++ = (DST_TYPE)(*p_samples++); \ - } - - - -/* - * For lame_decode: return code - * -1 error - * 0 ok, but need more data before outputing any samples - * n number of samples output. either 576 or 1152 depending on MP3 file. - */ - -static int -decode1_headersB_clipchoice(PMPSTR pmp, unsigned char *buffer, size_t len, - char pcm_l_raw[], char pcm_r_raw[], mp3data_struct * mp3data, - int *enc_delay, int *enc_padding, - char *p, size_t psize, int decoded_sample_size, - int (*decodeMP3_ptr) (PMPSTR, unsigned char *, int, char *, int, - int *)) -{ - static const int smpls[2][4] = { - /* Layer I II III */ - {0, 384, 1152, 1152}, /* MPEG-1 */ - {0, 384, 1152, 576} /* MPEG-2(.5) */ - }; - - int processed_bytes; - int processed_samples; /* processed samples per channel */ - int ret; - int i; - int const len_l = len < INT_MAX ? (int) len : INT_MAX; - int const psize_l = psize < INT_MAX ? (int) psize : INT_MAX; - - mp3data->header_parsed = 0; - ret = (*decodeMP3_ptr) (pmp, buffer, len_l, p, psize_l, &processed_bytes); - /* three cases: - * 1. headers parsed, but data not complete - * pmp->header_parsed==1 - * pmp->framesize=0 - * pmp->fsizeold=size of last frame, or 0 if this is first frame - * - * 2. headers, data parsed, but ancillary data not complete - * pmp->header_parsed==1 - * pmp->framesize=size of frame - * pmp->fsizeold=size of last frame, or 0 if this is first frame - * - * 3. frame fully decoded: - * pmp->header_parsed==0 - * pmp->framesize=0 - * pmp->fsizeold=size of frame (which is now the last frame) - * - */ - if (pmp->header_parsed || pmp->fsizeold > 0 || pmp->framesize > 0) { - mp3data->header_parsed = 1; - mp3data->stereo = pmp->fr.stereo; - mp3data->samplerate = freqs[pmp->fr.sampling_frequency]; - mp3data->mode = pmp->fr.mode; - mp3data->mode_ext = pmp->fr.mode_ext; - mp3data->framesize = smpls[pmp->fr.lsf][pmp->fr.lay]; - - /* free format, we need the entire frame before we can determine - * the bitrate. If we haven't gotten the entire frame, bitrate=0 */ - if (pmp->fsizeold > 0) /* works for free format and fixed, no overrun, temporal results are < 400.e6 */ - mp3data->bitrate = 8 * (4 + pmp->fsizeold) * mp3data->samplerate / - (1.e3 * mp3data->framesize) + 0.5; - else if (pmp->framesize > 0) - mp3data->bitrate = 8 * (4 + pmp->framesize) * mp3data->samplerate / - (1.e3 * mp3data->framesize) + 0.5; - else - mp3data->bitrate = tabsel_123[pmp->fr.lsf][pmp->fr.lay - 1][pmp->fr.bitrate_index]; - - - - if (pmp->num_frames > 0) { - /* Xing VBR header found and num_frames was set */ - mp3data->totalframes = pmp->num_frames; - mp3data->nsamp = mp3data->framesize * pmp->num_frames; - *enc_delay = pmp->enc_delay; - *enc_padding = pmp->enc_padding; - } - } - - switch (ret) { - case MP3_OK: - switch (pmp->fr.stereo) { - case 1: - processed_samples = processed_bytes / decoded_sample_size; - if (decoded_sample_size == sizeof(short)) { - COPY_MONO(short, short) - } - else { - COPY_MONO(sample_t, FLOAT) - } - break; - case 2: - processed_samples = (processed_bytes / decoded_sample_size) >> 1; - if (decoded_sample_size == sizeof(short)) { - COPY_STEREO(short, short) - } - else { - COPY_STEREO(sample_t, FLOAT) - } - break; - default: - processed_samples = -1; - assert(0); - break; - } - break; - - case MP3_NEED_MORE: - processed_samples = 0; - break; - - case MP3_ERR: - processed_samples = -1; - break; - - default: - processed_samples = -1; - assert(0); - break; - } - - /*fprintf(stderr,"ok, more, err: %i %i %i\n", MP3_OK, MP3_NEED_MORE, MP3_ERR ); */ - /*fprintf(stderr,"ret = %i out=%i\n", ret, processed_samples ); */ - return processed_samples; -} - - -#define OUTSIZE_CLIPPED (4096*sizeof(short)) - -int -lame_decode1_headersB(unsigned char *buffer, - int len, - short pcm_l[], short pcm_r[], mp3data_struct * mp3data, - int *enc_delay, int *enc_padding) -{ - static char out[OUTSIZE_CLIPPED]; - - return decode1_headersB_clipchoice(&mp, buffer, len, (char *) pcm_l, (char *) pcm_r, mp3data, - enc_delay, enc_padding, out, OUTSIZE_CLIPPED, - sizeof(short), decodeMP3); -} - - - - - -/* - * For lame_decode: return code - * -1 error - * 0 ok, but need more data before outputing any samples - * n number of samples output. Will be at most one frame of - * MPEG data. - */ - -int -lame_decode1_headers(unsigned char *buffer, - int len, short pcm_l[], short pcm_r[], mp3data_struct * mp3data) -{ - int enc_delay, enc_padding; - return lame_decode1_headersB(buffer, len, pcm_l, pcm_r, mp3data, &enc_delay, &enc_padding); -} - - -int -lame_decode1(unsigned char *buffer, int len, short pcm_l[], short pcm_r[]) -{ - mp3data_struct mp3data; - - return lame_decode1_headers(buffer, len, pcm_l, pcm_r, &mp3data); -} - - -/* - * For lame_decode: return code - * -1 error - * 0 ok, but need more data before outputing any samples - * n number of samples output. a multiple of 576 or 1152 depending on MP3 file. - */ - -int -lame_decode_headers(unsigned char *buffer, - int len, short pcm_l[], short pcm_r[], mp3data_struct * mp3data) -{ - int ret; - int totsize = 0; /* number of decoded samples per channel */ - - for (;;) { - switch (ret = lame_decode1_headers(buffer, len, pcm_l + totsize, pcm_r + totsize, mp3data)) { - case -1: - return ret; - case 0: - return totsize; - default: - totsize += ret; - len = 0; /* future calls to decodeMP3 are just to flush buffers */ - break; - } - } -} - - -int -lame_decode(unsigned char *buffer, int len, short pcm_l[], short pcm_r[]) -{ - mp3data_struct mp3data; - - return lame_decode_headers(buffer, len, pcm_l, pcm_r, &mp3data); -} - - - - -hip_t hip_decode_init(void) -{ - hip_t hip = lame_calloc(hip_global_flags, 1); - InitMP3(hip); - return hip; -} - - -int hip_decode_exit(hip_t hip) -{ - if (hip) { - ExitMP3(hip); - free(hip); - } - return 0; -} - - -/* we forbid input with more than 1152 samples per channel for output in the unclipped mode */ -#define OUTSIZE_UNCLIPPED (1152*2*sizeof(FLOAT)) - -int -hip_decode1_unclipped(hip_t hip, unsigned char *buffer, size_t len, sample_t pcm_l[], sample_t pcm_r[]) -{ - static char out[OUTSIZE_UNCLIPPED]; - mp3data_struct mp3data; - int enc_delay, enc_padding; - - if (hip) { - return decode1_headersB_clipchoice(hip, buffer, len, (char *) pcm_l, (char *) pcm_r, &mp3data, - &enc_delay, &enc_padding, out, OUTSIZE_UNCLIPPED, - sizeof(FLOAT), decodeMP3_unclipped); - } - return 0; -} - -/* - * For hip_decode: return code - * -1 error - * 0 ok, but need more data before outputing any samples - * n number of samples output. Will be at most one frame of - * MPEG data. - */ - -int -hip_decode1_headers(hip_t hip, unsigned char *buffer, - size_t len, short pcm_l[], short pcm_r[], mp3data_struct * mp3data) -{ - int enc_delay, enc_padding; - return hip_decode1_headersB(hip, buffer, len, pcm_l, pcm_r, mp3data, &enc_delay, &enc_padding); -} - - -int -hip_decode1(hip_t hip, unsigned char *buffer, size_t len, short pcm_l[], short pcm_r[]) -{ - mp3data_struct mp3data; - return hip_decode1_headers(hip, buffer, len, pcm_l, pcm_r, &mp3data); -} - - -/* - * For hip_decode: return code - * -1 error - * 0 ok, but need more data before outputing any samples - * n number of samples output. a multiple of 576 or 1152 depending on MP3 file. - */ - -int -hip_decode_headers(hip_t hip, unsigned char *buffer, - size_t len, short pcm_l[], short pcm_r[], mp3data_struct * mp3data) -{ - int ret; - int totsize = 0; /* number of decoded samples per channel */ - - for (;;) { - switch (ret = hip_decode1_headers(hip, buffer, len, pcm_l + totsize, pcm_r + totsize, mp3data)) { - case -1: - return ret; - case 0: - return totsize; - default: - totsize += ret; - len = 0; /* future calls to decodeMP3 are just to flush buffers */ - break; - } - } -} - - -int -hip_decode(hip_t hip, unsigned char *buffer, size_t len, short pcm_l[], short pcm_r[]) -{ - mp3data_struct mp3data; - return hip_decode_headers(hip, buffer, len, pcm_l, pcm_r, &mp3data); -} - - -int -hip_decode1_headersB(hip_t hip, unsigned char *buffer, - size_t len, - short pcm_l[], short pcm_r[], mp3data_struct * mp3data, - int *enc_delay, int *enc_padding) -{ - static char out[OUTSIZE_CLIPPED]; - if (hip) { - return decode1_headersB_clipchoice(hip, buffer, len, (char *) pcm_l, (char *) pcm_r, mp3data, - enc_delay, enc_padding, out, OUTSIZE_CLIPPED, - sizeof(short), decodeMP3); - } - return -1; -} - - -void hip_set_pinfo(hip_t hip, plotting_data* pinfo) -{ - if (hip) { - hip->pinfo = pinfo; - } -} - - - -void hip_set_errorf(hip_t hip, lame_report_function func) -{ - if (hip) { - hip->report_err = func; - } -} - -void hip_set_debugf(hip_t hip, lame_report_function func) -{ - if (hip) { - hip->report_dbg = func; - } -} - -void hip_set_msgf (hip_t hip, lame_report_function func) -{ - if (hip) { - hip->report_msg = func; - } -} - -#endif - -/* end of mpglib_interface.c */ diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/newmdct.c b/recorderlib/src/main/jni/lame-3.100_libmp3lame/newmdct.c deleted file mode 100644 index 596cac9..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/newmdct.c +++ /dev/null @@ -1,1039 +0,0 @@ -/* - * MP3 window subband -> subband filtering -> mdct routine - * - * Copyright (c) 1999-2000 Takehiro Tominaga - * - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Special Thanks to Patrick De Smet for your advices. - */ - -/* $Id: newmdct.c,v 1.39 2011/05/07 16:05:17 rbrito Exp $ */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include "lame.h" -#include "machine.h" -#include "encoder.h" -#include "util.h" -#include "newmdct.h" - - - -#ifndef USE_GOGO_SUBBAND -static const FLOAT enwindow[] = { - -4.77e-07 * 0.740951125354959 / 2.384e-06, 1.03951e-04 * 0.740951125354959 / 2.384e-06, - 9.53674e-04 * 0.740951125354959 / 2.384e-06, 2.841473e-03 * 0.740951125354959 / 2.384e-06, - 3.5758972e-02 * 0.740951125354959 / 2.384e-06, 3.401756e-03 * 0.740951125354959 / 2.384e-06, 9.83715e-04 * 0.740951125354959 / 2.384e-06, 9.9182e-05 * 0.740951125354959 / 2.384e-06, /* 15 */ - 1.2398e-05 * 0.740951125354959 / 2.384e-06, 1.91212e-04 * 0.740951125354959 / 2.384e-06, - 2.283096e-03 * 0.740951125354959 / 2.384e-06, 1.6994476e-02 * 0.740951125354959 / 2.384e-06, - -1.8756866e-02 * 0.740951125354959 / 2.384e-06, -2.630711e-03 * 0.740951125354959 / 2.384e-06, - -2.47478e-04 * 0.740951125354959 / 2.384e-06, -1.4782e-05 * 0.740951125354959 / 2.384e-06, - 9.063471690191471e-01, - 1.960342806591213e-01, - - - -4.77e-07 * 0.773010453362737 / 2.384e-06, 1.05858e-04 * 0.773010453362737 / 2.384e-06, - 9.30786e-04 * 0.773010453362737 / 2.384e-06, 2.521515e-03 * 0.773010453362737 / 2.384e-06, - 3.5694122e-02 * 0.773010453362737 / 2.384e-06, 3.643036e-03 * 0.773010453362737 / 2.384e-06, 9.91821e-04 * 0.773010453362737 / 2.384e-06, 9.6321e-05 * 0.773010453362737 / 2.384e-06, /* 14 */ - 1.1444e-05 * 0.773010453362737 / 2.384e-06, 1.65462e-04 * 0.773010453362737 / 2.384e-06, - 2.110004e-03 * 0.773010453362737 / 2.384e-06, 1.6112804e-02 * 0.773010453362737 / 2.384e-06, - -1.9634247e-02 * 0.773010453362737 / 2.384e-06, -2.803326e-03 * 0.773010453362737 / 2.384e-06, - -2.77042e-04 * 0.773010453362737 / 2.384e-06, -1.6689e-05 * 0.773010453362737 / 2.384e-06, - 8.206787908286602e-01, - 3.901806440322567e-01, - - - -4.77e-07 * 0.803207531480645 / 2.384e-06, 1.07288e-04 * 0.803207531480645 / 2.384e-06, - 9.02653e-04 * 0.803207531480645 / 2.384e-06, 2.174854e-03 * 0.803207531480645 / 2.384e-06, - 3.5586357e-02 * 0.803207531480645 / 2.384e-06, 3.858566e-03 * 0.803207531480645 / 2.384e-06, 9.95159e-04 * 0.803207531480645 / 2.384e-06, 9.3460e-05 * 0.803207531480645 / 2.384e-06, /* 13 */ - 1.0014e-05 * 0.803207531480645 / 2.384e-06, 1.40190e-04 * 0.803207531480645 / 2.384e-06, - 1.937389e-03 * 0.803207531480645 / 2.384e-06, 1.5233517e-02 * 0.803207531480645 / 2.384e-06, - -2.0506859e-02 * 0.803207531480645 / 2.384e-06, -2.974033e-03 * 0.803207531480645 / 2.384e-06, - -3.07560e-04 * 0.803207531480645 / 2.384e-06, -1.8120e-05 * 0.803207531480645 / 2.384e-06, - 7.416505462720353e-01, - 5.805693545089249e-01, - - - -4.77e-07 * 0.831469612302545 / 2.384e-06, 1.08242e-04 * 0.831469612302545 / 2.384e-06, - 8.68797e-04 * 0.831469612302545 / 2.384e-06, 1.800537e-03 * 0.831469612302545 / 2.384e-06, - 3.5435200e-02 * 0.831469612302545 / 2.384e-06, 4.049301e-03 * 0.831469612302545 / 2.384e-06, 9.94205e-04 * 0.831469612302545 / 2.384e-06, 9.0599e-05 * 0.831469612302545 / 2.384e-06, /* 12 */ - 9.060e-06 * 0.831469612302545 / 2.384e-06, 1.16348e-04 * 0.831469612302545 / 2.384e-06, - 1.766682e-03 * 0.831469612302545 / 2.384e-06, 1.4358521e-02 * 0.831469612302545 / 2.384e-06, - -2.1372318e-02 * 0.831469612302545 / 2.384e-06, -3.14188e-03 * 0.831469612302545 / 2.384e-06, - -3.39031e-04 * 0.831469612302545 / 2.384e-06, -1.9550e-05 * 0.831469612302545 / 2.384e-06, - 6.681786379192989e-01, - 7.653668647301797e-01, - - - -4.77e-07 * 0.857728610000272 / 2.384e-06, 1.08719e-04 * 0.857728610000272 / 2.384e-06, - 8.29220e-04 * 0.857728610000272 / 2.384e-06, 1.399517e-03 * 0.857728610000272 / 2.384e-06, - 3.5242081e-02 * 0.857728610000272 / 2.384e-06, 4.215240e-03 * 0.857728610000272 / 2.384e-06, 9.89437e-04 * 0.857728610000272 / 2.384e-06, 8.7261e-05 * 0.857728610000272 / 2.384e-06, /* 11 */ - 8.106e-06 * 0.857728610000272 / 2.384e-06, 9.3937e-05 * 0.857728610000272 / 2.384e-06, - 1.597881e-03 * 0.857728610000272 / 2.384e-06, 1.3489246e-02 * 0.857728610000272 / 2.384e-06, - -2.2228718e-02 * 0.857728610000272 / 2.384e-06, -3.306866e-03 * 0.857728610000272 / 2.384e-06, - -3.71456e-04 * 0.857728610000272 / 2.384e-06, -2.1458e-05 * 0.857728610000272 / 2.384e-06, - 5.993769336819237e-01, - 9.427934736519954e-01, - - - -4.77e-07 * 0.881921264348355 / 2.384e-06, 1.08719e-04 * 0.881921264348355 / 2.384e-06, - 7.8392e-04 * 0.881921264348355 / 2.384e-06, 9.71317e-04 * 0.881921264348355 / 2.384e-06, - 3.5007000e-02 * 0.881921264348355 / 2.384e-06, 4.357815e-03 * 0.881921264348355 / 2.384e-06, 9.80854e-04 * 0.881921264348355 / 2.384e-06, 8.3923e-05 * 0.881921264348355 / 2.384e-06, /* 10 */ - 7.629e-06 * 0.881921264348355 / 2.384e-06, 7.2956e-05 * 0.881921264348355 / 2.384e-06, - 1.432419e-03 * 0.881921264348355 / 2.384e-06, 1.2627602e-02 * 0.881921264348355 / 2.384e-06, - -2.3074150e-02 * 0.881921264348355 / 2.384e-06, -3.467083e-03 * 0.881921264348355 / 2.384e-06, - -4.04358e-04 * 0.881921264348355 / 2.384e-06, -2.3365e-05 * 0.881921264348355 / 2.384e-06, - 5.345111359507916e-01, - 1.111140466039205e+00, - - - -9.54e-07 * 0.903989293123443 / 2.384e-06, 1.08242e-04 * 0.903989293123443 / 2.384e-06, - 7.31945e-04 * 0.903989293123443 / 2.384e-06, 5.15938e-04 * 0.903989293123443 / 2.384e-06, - 3.4730434e-02 * 0.903989293123443 / 2.384e-06, 4.477024e-03 * 0.903989293123443 / 2.384e-06, 9.68933e-04 * 0.903989293123443 / 2.384e-06, 8.0585e-05 * 0.903989293123443 / 2.384e-06, /* 9 */ - 6.676e-06 * 0.903989293123443 / 2.384e-06, 5.2929e-05 * 0.903989293123443 / 2.384e-06, - 1.269817e-03 * 0.903989293123443 / 2.384e-06, 1.1775017e-02 * 0.903989293123443 / 2.384e-06, - -2.3907185e-02 * 0.903989293123443 / 2.384e-06, -3.622532e-03 * 0.903989293123443 / 2.384e-06, - -4.38213e-04 * 0.903989293123443 / 2.384e-06, -2.5272e-05 * 0.903989293123443 / 2.384e-06, - 4.729647758913199e-01, - 1.268786568327291e+00, - - - -9.54e-07 * 0.92387953251128675613 / 2.384e-06, - 1.06812e-04 * 0.92387953251128675613 / 2.384e-06, - 6.74248e-04 * 0.92387953251128675613 / 2.384e-06, - 3.3379e-05 * 0.92387953251128675613 / 2.384e-06, - 3.4412861e-02 * 0.92387953251128675613 / 2.384e-06, - 4.573822e-03 * 0.92387953251128675613 / 2.384e-06, - 9.54151e-04 * 0.92387953251128675613 / 2.384e-06, - 7.6771e-05 * 0.92387953251128675613 / 2.384e-06, - 6.199e-06 * 0.92387953251128675613 / 2.384e-06, 3.4332e-05 * 0.92387953251128675613 / 2.384e-06, - 1.111031e-03 * 0.92387953251128675613 / 2.384e-06, - 1.0933399e-02 * 0.92387953251128675613 / 2.384e-06, - -2.4725437e-02 * 0.92387953251128675613 / 2.384e-06, - -3.771782e-03 * 0.92387953251128675613 / 2.384e-06, - -4.72546e-04 * 0.92387953251128675613 / 2.384e-06, - -2.7657e-05 * 0.92387953251128675613 / 2.384e-06, - 4.1421356237309504879e-01, /* tan(PI/8) */ - 1.414213562373095e+00, - - - -9.54e-07 * 0.941544065183021 / 2.384e-06, 1.05381e-04 * 0.941544065183021 / 2.384e-06, - 6.10352e-04 * 0.941544065183021 / 2.384e-06, -4.75883e-04 * 0.941544065183021 / 2.384e-06, - 3.4055710e-02 * 0.941544065183021 / 2.384e-06, 4.649162e-03 * 0.941544065183021 / 2.384e-06, 9.35555e-04 * 0.941544065183021 / 2.384e-06, 7.3433e-05 * 0.941544065183021 / 2.384e-06, /* 7 */ - 5.245e-06 * 0.941544065183021 / 2.384e-06, 1.7166e-05 * 0.941544065183021 / 2.384e-06, - 9.56535e-04 * 0.941544065183021 / 2.384e-06, 1.0103703e-02 * 0.941544065183021 / 2.384e-06, - -2.5527000e-02 * 0.941544065183021 / 2.384e-06, -3.914356e-03 * 0.941544065183021 / 2.384e-06, - -5.07355e-04 * 0.941544065183021 / 2.384e-06, -3.0041e-05 * 0.941544065183021 / 2.384e-06, - 3.578057213145241e-01, - 1.546020906725474e+00, - - - -9.54e-07 * 0.956940335732209 / 2.384e-06, 1.02520e-04 * 0.956940335732209 / 2.384e-06, - 5.39303e-04 * 0.956940335732209 / 2.384e-06, -1.011848e-03 * 0.956940335732209 / 2.384e-06, - 3.3659935e-02 * 0.956940335732209 / 2.384e-06, 4.703045e-03 * 0.956940335732209 / 2.384e-06, 9.15051e-04 * 0.956940335732209 / 2.384e-06, 7.0095e-05 * 0.956940335732209 / 2.384e-06, /* 6 */ - 4.768e-06 * 0.956940335732209 / 2.384e-06, 9.54e-07 * 0.956940335732209 / 2.384e-06, - 8.06808e-04 * 0.956940335732209 / 2.384e-06, 9.287834e-03 * 0.956940335732209 / 2.384e-06, - -2.6310921e-02 * 0.956940335732209 / 2.384e-06, -4.048824e-03 * 0.956940335732209 / 2.384e-06, - -5.42164e-04 * 0.956940335732209 / 2.384e-06, -3.2425e-05 * 0.956940335732209 / 2.384e-06, - 3.033466836073424e-01, - 1.662939224605090e+00, - - - -1.431e-06 * 0.970031253194544 / 2.384e-06, 9.9182e-05 * 0.970031253194544 / 2.384e-06, - 4.62532e-04 * 0.970031253194544 / 2.384e-06, -1.573563e-03 * 0.970031253194544 / 2.384e-06, - 3.3225536e-02 * 0.970031253194544 / 2.384e-06, 4.737377e-03 * 0.970031253194544 / 2.384e-06, 8.91685e-04 * 0.970031253194544 / 2.384e-06, 6.6280e-05 * 0.970031253194544 / 2.384e-06, /* 5 */ - 4.292e-06 * 0.970031253194544 / 2.384e-06, -1.3828e-05 * 0.970031253194544 / 2.384e-06, - 6.61850e-04 * 0.970031253194544 / 2.384e-06, 8.487225e-03 * 0.970031253194544 / 2.384e-06, - -2.7073860e-02 * 0.970031253194544 / 2.384e-06, -4.174709e-03 * 0.970031253194544 / 2.384e-06, - -5.76973e-04 * 0.970031253194544 / 2.384e-06, -3.4809e-05 * 0.970031253194544 / 2.384e-06, - 2.504869601913055e-01, - 1.763842528696710e+00, - - - -1.431e-06 * 0.98078528040323 / 2.384e-06, 9.5367e-05 * 0.98078528040323 / 2.384e-06, - 3.78609e-04 * 0.98078528040323 / 2.384e-06, -2.161503e-03 * 0.98078528040323 / 2.384e-06, - 3.2754898e-02 * 0.98078528040323 / 2.384e-06, 4.752159e-03 * 0.98078528040323 / 2.384e-06, 8.66413e-04 * 0.98078528040323 / 2.384e-06, 6.2943e-05 * 0.98078528040323 / 2.384e-06, /* 4 */ - 3.815e-06 * 0.98078528040323 / 2.384e-06, -2.718e-05 * 0.98078528040323 / 2.384e-06, - 5.22137e-04 * 0.98078528040323 / 2.384e-06, 7.703304e-03 * 0.98078528040323 / 2.384e-06, - -2.7815342e-02 * 0.98078528040323 / 2.384e-06, -4.290581e-03 * 0.98078528040323 / 2.384e-06, - -6.11782e-04 * 0.98078528040323 / 2.384e-06, -3.7670e-05 * 0.98078528040323 / 2.384e-06, - 1.989123673796580e-01, - 1.847759065022573e+00, - - - -1.907e-06 * 0.989176509964781 / 2.384e-06, 9.0122e-05 * 0.989176509964781 / 2.384e-06, - 2.88486e-04 * 0.989176509964781 / 2.384e-06, -2.774239e-03 * 0.989176509964781 / 2.384e-06, - 3.2248020e-02 * 0.989176509964781 / 2.384e-06, 4.748821e-03 * 0.989176509964781 / 2.384e-06, 8.38757e-04 * 0.989176509964781 / 2.384e-06, 5.9605e-05 * 0.989176509964781 / 2.384e-06, /* 3 */ - 3.338e-06 * 0.989176509964781 / 2.384e-06, -3.9577e-05 * 0.989176509964781 / 2.384e-06, - 3.88145e-04 * 0.989176509964781 / 2.384e-06, 6.937027e-03 * 0.989176509964781 / 2.384e-06, - -2.8532982e-02 * 0.989176509964781 / 2.384e-06, -4.395962e-03 * 0.989176509964781 / 2.384e-06, - -6.46591e-04 * 0.989176509964781 / 2.384e-06, -4.0531e-05 * 0.989176509964781 / 2.384e-06, - 1.483359875383474e-01, - 1.913880671464418e+00, - - - -1.907e-06 * 0.995184726672197 / 2.384e-06, 8.4400e-05 * 0.995184726672197 / 2.384e-06, - 1.91689e-04 * 0.995184726672197 / 2.384e-06, -3.411293e-03 * 0.995184726672197 / 2.384e-06, - 3.1706810e-02 * 0.995184726672197 / 2.384e-06, 4.728317e-03 * 0.995184726672197 / 2.384e-06, - 8.09669e-04 * 0.995184726672197 / 2.384e-06, 5.579e-05 * 0.995184726672197 / 2.384e-06, - 3.338e-06 * 0.995184726672197 / 2.384e-06, -5.0545e-05 * 0.995184726672197 / 2.384e-06, - 2.59876e-04 * 0.995184726672197 / 2.384e-06, 6.189346e-03 * 0.995184726672197 / 2.384e-06, - -2.9224873e-02 * 0.995184726672197 / 2.384e-06, -4.489899e-03 * 0.995184726672197 / 2.384e-06, - -6.80923e-04 * 0.995184726672197 / 2.384e-06, -4.3392e-05 * 0.995184726672197 / 2.384e-06, - 9.849140335716425e-02, - 1.961570560806461e+00, - - - -2.384e-06 * 0.998795456205172 / 2.384e-06, 7.7724e-05 * 0.998795456205172 / 2.384e-06, - 8.8215e-05 * 0.998795456205172 / 2.384e-06, -4.072189e-03 * 0.998795456205172 / 2.384e-06, - 3.1132698e-02 * 0.998795456205172 / 2.384e-06, 4.691124e-03 * 0.998795456205172 / 2.384e-06, - 7.79152e-04 * 0.998795456205172 / 2.384e-06, 5.2929e-05 * 0.998795456205172 / 2.384e-06, - 2.861e-06 * 0.998795456205172 / 2.384e-06, -6.0558e-05 * 0.998795456205172 / 2.384e-06, - 1.37329e-04 * 0.998795456205172 / 2.384e-06, 5.462170e-03 * 0.998795456205172 / 2.384e-06, - -2.9890060e-02 * 0.998795456205172 / 2.384e-06, -4.570484e-03 * 0.998795456205172 / 2.384e-06, - -7.14302e-04 * 0.998795456205172 / 2.384e-06, -4.6253e-05 * 0.998795456205172 / 2.384e-06, - 4.912684976946725e-02, - 1.990369453344394e+00, - - - 3.5780907e-02 * SQRT2 * 0.5 / 2.384e-06, 1.7876148e-02 * SQRT2 * 0.5 / 2.384e-06, - 3.134727e-03 * SQRT2 * 0.5 / 2.384e-06, 2.457142e-03 * SQRT2 * 0.5 / 2.384e-06, - 9.71317e-04 * SQRT2 * 0.5 / 2.384e-06, 2.18868e-04 * SQRT2 * 0.5 / 2.384e-06, - 1.01566e-04 * SQRT2 * 0.5 / 2.384e-06, 1.3828e-05 * SQRT2 * 0.5 / 2.384e-06, - - 3.0526638e-02 / 2.384e-06, 4.638195e-03 / 2.384e-06, 7.47204e-04 / 2.384e-06, - 4.9591e-05 / 2.384e-06, - 4.756451e-03 / 2.384e-06, 2.1458e-05 / 2.384e-06, -6.9618e-05 / 2.384e-06, /* 2.384e-06/2.384e-06 */ -}; -#endif - - -#define NS 12 -#define NL 36 - -static const FLOAT win[4][NL] = { - { - 2.382191739347913e-13, - 6.423305872147834e-13, - 9.400849094049688e-13, - 1.122435026096556e-12, - 1.183840321267481e-12, - 1.122435026096556e-12, - 9.400849094049690e-13, - 6.423305872147839e-13, - 2.382191739347918e-13, - - 5.456116108943412e-12, - 4.878985199565852e-12, - 4.240448995017367e-12, - 3.559909094758252e-12, - 2.858043359288075e-12, - 2.156177623817898e-12, - 1.475637723558783e-12, - 8.371015190102974e-13, - 2.599706096327376e-13, - - -5.456116108943412e-12, - -4.878985199565852e-12, - -4.240448995017367e-12, - -3.559909094758252e-12, - -2.858043359288076e-12, - -2.156177623817898e-12, - -1.475637723558783e-12, - -8.371015190102975e-13, - -2.599706096327376e-13, - - -2.382191739347923e-13, - -6.423305872147843e-13, - -9.400849094049696e-13, - -1.122435026096556e-12, - -1.183840321267481e-12, - -1.122435026096556e-12, - -9.400849094049694e-13, - -6.423305872147840e-13, - -2.382191739347918e-13, - }, - { - 2.382191739347913e-13, - 6.423305872147834e-13, - 9.400849094049688e-13, - 1.122435026096556e-12, - 1.183840321267481e-12, - 1.122435026096556e-12, - 9.400849094049688e-13, - 6.423305872147841e-13, - 2.382191739347918e-13, - - 5.456116108943413e-12, - 4.878985199565852e-12, - 4.240448995017367e-12, - 3.559909094758253e-12, - 2.858043359288075e-12, - 2.156177623817898e-12, - 1.475637723558782e-12, - 8.371015190102975e-13, - 2.599706096327376e-13, - - -5.461314069809755e-12, - -4.921085770524055e-12, - -4.343405037091838e-12, - -3.732668368707687e-12, - -3.093523840190885e-12, - -2.430835727329465e-12, - -1.734679010007751e-12, - -9.748253656609281e-13, - -2.797435120168326e-13, - - 0.000000000000000e+00, - 0.000000000000000e+00, - 0.000000000000000e+00, - 0.000000000000000e+00, - 0.000000000000000e+00, - 0.000000000000000e+00, - -2.283748241799531e-13, - -4.037858874020686e-13, - -2.146547464825323e-13, - }, - { - 1.316524975873958e-01, /* win[SHORT_TYPE] */ - 4.142135623730950e-01, - 7.673269879789602e-01, - - 1.091308501069271e+00, /* tantab_l */ - 1.303225372841206e+00, - 1.569685577117490e+00, - 1.920982126971166e+00, - 2.414213562373094e+00, - 3.171594802363212e+00, - 4.510708503662055e+00, - 7.595754112725146e+00, - 2.290376554843115e+01, - - 0.98480775301220802032, /* cx */ - 0.64278760968653936292, - 0.34202014332566882393, - 0.93969262078590842791, - -0.17364817766693030343, - -0.76604444311897790243, - 0.86602540378443870761, - 0.500000000000000e+00, - - -5.144957554275265e-01, /* ca */ - -4.717319685649723e-01, - -3.133774542039019e-01, - -1.819131996109812e-01, - -9.457419252642064e-02, - -4.096558288530405e-02, - -1.419856857247115e-02, - -3.699974673760037e-03, - - 8.574929257125442e-01, /* cs */ - 8.817419973177052e-01, - 9.496286491027329e-01, - 9.833145924917901e-01, - 9.955178160675857e-01, - 9.991605581781475e-01, - 9.998991952444470e-01, - 9.999931550702802e-01, - }, - { - 0.000000000000000e+00, - 0.000000000000000e+00, - 0.000000000000000e+00, - 0.000000000000000e+00, - 0.000000000000000e+00, - 0.000000000000000e+00, - 2.283748241799531e-13, - 4.037858874020686e-13, - 2.146547464825323e-13, - - 5.461314069809755e-12, - 4.921085770524055e-12, - 4.343405037091838e-12, - 3.732668368707687e-12, - 3.093523840190885e-12, - 2.430835727329466e-12, - 1.734679010007751e-12, - 9.748253656609281e-13, - 2.797435120168326e-13, - - -5.456116108943413e-12, - -4.878985199565852e-12, - -4.240448995017367e-12, - -3.559909094758253e-12, - -2.858043359288075e-12, - -2.156177623817898e-12, - -1.475637723558782e-12, - -8.371015190102975e-13, - -2.599706096327376e-13, - - -2.382191739347913e-13, - -6.423305872147834e-13, - -9.400849094049688e-13, - -1.122435026096556e-12, - -1.183840321267481e-12, - -1.122435026096556e-12, - -9.400849094049688e-13, - -6.423305872147841e-13, - -2.382191739347918e-13, - } -}; - -#define tantab_l (win[SHORT_TYPE]+3) -#define cx (win[SHORT_TYPE]+12) -#define ca (win[SHORT_TYPE]+20) -#define cs (win[SHORT_TYPE]+28) - -/************************************************************************ -* -* window_subband() -* -* PURPOSE: Overlapping window on PCM samples -* -* SEMANTICS: -* 32 16-bit pcm samples are scaled to fractional 2's complement and -* concatenated to the end of the window buffer #x#. The updated window -* buffer #x# is then windowed by the analysis window #c# to produce the -* windowed sample #z# -* -************************************************************************/ - -/* - * new IDCT routine written by Takehiro TOMINAGA - */ -static const int order[] = { - 0, 1, 16, 17, 8, 9, 24, 25, 4, 5, 20, 21, 12, 13, 28, 29, - 2, 3, 18, 19, 10, 11, 26, 27, 6, 7, 22, 23, 14, 15, 30, 31 -}; - - -/* returns sum_j=0^31 a[j]*cos(PI*j*(k+1/2)/32), 0<=k<32 */ -inline static void -window_subband(const sample_t * x1, FLOAT a[SBLIMIT]) -{ - int i; - FLOAT const *wp = enwindow + 10; - - const sample_t *x2 = &x1[238 - 14 - 286]; - - for (i = -15; i < 0; i++) { - FLOAT w, s, t; - - w = wp[-10]; - s = x2[-224] * w; - t = x1[224] * w; - w = wp[-9]; - s += x2[-160] * w; - t += x1[160] * w; - w = wp[-8]; - s += x2[-96] * w; - t += x1[96] * w; - w = wp[-7]; - s += x2[-32] * w; - t += x1[32] * w; - w = wp[-6]; - s += x2[32] * w; - t += x1[-32] * w; - w = wp[-5]; - s += x2[96] * w; - t += x1[-96] * w; - w = wp[-4]; - s += x2[160] * w; - t += x1[-160] * w; - w = wp[-3]; - s += x2[224] * w; - t += x1[-224] * w; - - w = wp[-2]; - s += x1[-256] * w; - t -= x2[256] * w; - w = wp[-1]; - s += x1[-192] * w; - t -= x2[192] * w; - w = wp[0]; - s += x1[-128] * w; - t -= x2[128] * w; - w = wp[1]; - s += x1[-64] * w; - t -= x2[64] * w; - w = wp[2]; - s += x1[0] * w; - t -= x2[0] * w; - w = wp[3]; - s += x1[64] * w; - t -= x2[-64] * w; - w = wp[4]; - s += x1[128] * w; - t -= x2[-128] * w; - w = wp[5]; - s += x1[192] * w; - t -= x2[-192] * w; - - /* - * this multiplyer could be removed, but it needs more 256 FLOAT data. - * thinking about the data cache performance, I think we should not - * use such a huge table. tt 2000/Oct/25 - */ - s *= wp[6]; - w = t - s; - a[30 + i * 2] = t + s; - a[31 + i * 2] = wp[7] * w; - wp += 18; - x1--; - x2++; - } - { - FLOAT s, t, u, v; - t = x1[-16] * wp[-10]; - s = x1[-32] * wp[-2]; - t += (x1[-48] - x1[16]) * wp[-9]; - s += x1[-96] * wp[-1]; - t += (x1[-80] + x1[48]) * wp[-8]; - s += x1[-160] * wp[0]; - t += (x1[-112] - x1[80]) * wp[-7]; - s += x1[-224] * wp[1]; - t += (x1[-144] + x1[112]) * wp[-6]; - s -= x1[32] * wp[2]; - t += (x1[-176] - x1[144]) * wp[-5]; - s -= x1[96] * wp[3]; - t += (x1[-208] + x1[176]) * wp[-4]; - s -= x1[160] * wp[4]; - t += (x1[-240] - x1[208]) * wp[-3]; - s -= x1[224]; - - u = s - t; - v = s + t; - - t = a[14]; - s = a[15] - t; - - a[31] = v + t; /* A0 */ - a[30] = u + s; /* A1 */ - a[15] = u - s; /* A2 */ - a[14] = v - t; /* A3 */ - } - { - FLOAT xr; - xr = a[28] - a[0]; - a[0] += a[28]; - a[28] = xr * wp[-2 * 18 + 7]; - xr = a[29] - a[1]; - a[1] += a[29]; - a[29] = xr * wp[-2 * 18 + 7]; - - xr = a[26] - a[2]; - a[2] += a[26]; - a[26] = xr * wp[-4 * 18 + 7]; - xr = a[27] - a[3]; - a[3] += a[27]; - a[27] = xr * wp[-4 * 18 + 7]; - - xr = a[24] - a[4]; - a[4] += a[24]; - a[24] = xr * wp[-6 * 18 + 7]; - xr = a[25] - a[5]; - a[5] += a[25]; - a[25] = xr * wp[-6 * 18 + 7]; - - xr = a[22] - a[6]; - a[6] += a[22]; - a[22] = xr * SQRT2; - xr = a[23] - a[7]; - a[7] += a[23]; - a[23] = xr * SQRT2 - a[7]; - a[7] -= a[6]; - a[22] -= a[7]; - a[23] -= a[22]; - - xr = a[6]; - a[6] = a[31] - xr; - a[31] = a[31] + xr; - xr = a[7]; - a[7] = a[30] - xr; - a[30] = a[30] + xr; - xr = a[22]; - a[22] = a[15] - xr; - a[15] = a[15] + xr; - xr = a[23]; - a[23] = a[14] - xr; - a[14] = a[14] + xr; - - xr = a[20] - a[8]; - a[8] += a[20]; - a[20] = xr * wp[-10 * 18 + 7]; - xr = a[21] - a[9]; - a[9] += a[21]; - a[21] = xr * wp[-10 * 18 + 7]; - - xr = a[18] - a[10]; - a[10] += a[18]; - a[18] = xr * wp[-12 * 18 + 7]; - xr = a[19] - a[11]; - a[11] += a[19]; - a[19] = xr * wp[-12 * 18 + 7]; - - xr = a[16] - a[12]; - a[12] += a[16]; - a[16] = xr * wp[-14 * 18 + 7]; - xr = a[17] - a[13]; - a[13] += a[17]; - a[17] = xr * wp[-14 * 18 + 7]; - - xr = -a[20] + a[24]; - a[20] += a[24]; - a[24] = xr * wp[-12 * 18 + 7]; - xr = -a[21] + a[25]; - a[21] += a[25]; - a[25] = xr * wp[-12 * 18 + 7]; - - xr = a[4] - a[8]; - a[4] += a[8]; - a[8] = xr * wp[-12 * 18 + 7]; - xr = a[5] - a[9]; - a[5] += a[9]; - a[9] = xr * wp[-12 * 18 + 7]; - - xr = a[0] - a[12]; - a[0] += a[12]; - a[12] = xr * wp[-4 * 18 + 7]; - xr = a[1] - a[13]; - a[1] += a[13]; - a[13] = xr * wp[-4 * 18 + 7]; - xr = a[16] - a[28]; - a[16] += a[28]; - a[28] = xr * wp[-4 * 18 + 7]; - xr = -a[17] + a[29]; - a[17] += a[29]; - a[29] = xr * wp[-4 * 18 + 7]; - - xr = SQRT2 * (a[2] - a[10]); - a[2] += a[10]; - a[10] = xr; - xr = SQRT2 * (a[3] - a[11]); - a[3] += a[11]; - a[11] = xr; - xr = SQRT2 * (-a[18] + a[26]); - a[18] += a[26]; - a[26] = xr - a[18]; - xr = SQRT2 * (-a[19] + a[27]); - a[19] += a[27]; - a[27] = xr - a[19]; - - xr = a[2]; - a[19] -= a[3]; - a[3] -= xr; - a[2] = a[31] - xr; - a[31] += xr; - xr = a[3]; - a[11] -= a[19]; - a[18] -= xr; - a[3] = a[30] - xr; - a[30] += xr; - xr = a[18]; - a[27] -= a[11]; - a[19] -= xr; - a[18] = a[15] - xr; - a[15] += xr; - - xr = a[19]; - a[10] -= xr; - a[19] = a[14] - xr; - a[14] += xr; - xr = a[10]; - a[11] -= xr; - a[10] = a[23] - xr; - a[23] += xr; - xr = a[11]; - a[26] -= xr; - a[11] = a[22] - xr; - a[22] += xr; - xr = a[26]; - a[27] -= xr; - a[26] = a[7] - xr; - a[7] += xr; - - xr = a[27]; - a[27] = a[6] - xr; - a[6] += xr; - - xr = SQRT2 * (a[0] - a[4]); - a[0] += a[4]; - a[4] = xr; - xr = SQRT2 * (a[1] - a[5]); - a[1] += a[5]; - a[5] = xr; - xr = SQRT2 * (a[16] - a[20]); - a[16] += a[20]; - a[20] = xr; - xr = SQRT2 * (a[17] - a[21]); - a[17] += a[21]; - a[21] = xr; - - xr = -SQRT2 * (a[8] - a[12]); - a[8] += a[12]; - a[12] = xr - a[8]; - xr = -SQRT2 * (a[9] - a[13]); - a[9] += a[13]; - a[13] = xr - a[9]; - xr = -SQRT2 * (a[25] - a[29]); - a[25] += a[29]; - a[29] = xr - a[25]; - xr = -SQRT2 * (a[24] + a[28]); - a[24] -= a[28]; - a[28] = xr - a[24]; - - xr = a[24] - a[16]; - a[24] = xr; - xr = a[20] - xr; - a[20] = xr; - xr = a[28] - xr; - a[28] = xr; - - xr = a[25] - a[17]; - a[25] = xr; - xr = a[21] - xr; - a[21] = xr; - xr = a[29] - xr; - a[29] = xr; - - xr = a[17] - a[1]; - a[17] = xr; - xr = a[9] - xr; - a[9] = xr; - xr = a[25] - xr; - a[25] = xr; - xr = a[5] - xr; - a[5] = xr; - xr = a[21] - xr; - a[21] = xr; - xr = a[13] - xr; - a[13] = xr; - xr = a[29] - xr; - a[29] = xr; - - xr = a[1] - a[0]; - a[1] = xr; - xr = a[16] - xr; - a[16] = xr; - xr = a[17] - xr; - a[17] = xr; - xr = a[8] - xr; - a[8] = xr; - xr = a[9] - xr; - a[9] = xr; - xr = a[24] - xr; - a[24] = xr; - xr = a[25] - xr; - a[25] = xr; - xr = a[4] - xr; - a[4] = xr; - xr = a[5] - xr; - a[5] = xr; - xr = a[20] - xr; - a[20] = xr; - xr = a[21] - xr; - a[21] = xr; - xr = a[12] - xr; - a[12] = xr; - xr = a[13] - xr; - a[13] = xr; - xr = a[28] - xr; - a[28] = xr; - xr = a[29] - xr; - a[29] = xr; - - xr = a[0]; - a[0] += a[31]; - a[31] -= xr; - xr = a[1]; - a[1] += a[30]; - a[30] -= xr; - xr = a[16]; - a[16] += a[15]; - a[15] -= xr; - xr = a[17]; - a[17] += a[14]; - a[14] -= xr; - xr = a[8]; - a[8] += a[23]; - a[23] -= xr; - xr = a[9]; - a[9] += a[22]; - a[22] -= xr; - xr = a[24]; - a[24] += a[7]; - a[7] -= xr; - xr = a[25]; - a[25] += a[6]; - a[6] -= xr; - xr = a[4]; - a[4] += a[27]; - a[27] -= xr; - xr = a[5]; - a[5] += a[26]; - a[26] -= xr; - xr = a[20]; - a[20] += a[11]; - a[11] -= xr; - xr = a[21]; - a[21] += a[10]; - a[10] -= xr; - xr = a[12]; - a[12] += a[19]; - a[19] -= xr; - xr = a[13]; - a[13] += a[18]; - a[18] -= xr; - xr = a[28]; - a[28] += a[3]; - a[3] -= xr; - xr = a[29]; - a[29] += a[2]; - a[2] -= xr; - } - -} - - -/*-------------------------------------------------------------------*/ -/* */ -/* Function: Calculation of the MDCT */ -/* In the case of long blocks (type 0,1,3) there are */ -/* 36 coefficents in the time domain and 18 in the frequency */ -/* domain. */ -/* In the case of short blocks (type 2) there are 3 */ -/* transformations with short length. This leads to 12 coefficents */ -/* in the time and 6 in the frequency domain. In this case the */ -/* results are stored side by side in the vector out[]. */ -/* */ -/* New layer3 */ -/* */ -/*-------------------------------------------------------------------*/ - -inline static void -mdct_short(FLOAT * inout) -{ - int l; - for (l = 0; l < 3; l++) { - FLOAT tc0, tc1, tc2, ts0, ts1, ts2; - - ts0 = inout[2 * 3] * win[SHORT_TYPE][0] - inout[5 * 3]; - tc0 = inout[0 * 3] * win[SHORT_TYPE][2] - inout[3 * 3]; - tc1 = ts0 + tc0; - tc2 = ts0 - tc0; - - ts0 = inout[5 * 3] * win[SHORT_TYPE][0] + inout[2 * 3]; - tc0 = inout[3 * 3] * win[SHORT_TYPE][2] + inout[0 * 3]; - ts1 = ts0 + tc0; - ts2 = -ts0 + tc0; - - tc0 = (inout[1 * 3] * win[SHORT_TYPE][1] - inout[4 * 3]) * 2.069978111953089e-11; /* tritab_s[1] */ - ts0 = (inout[4 * 3] * win[SHORT_TYPE][1] + inout[1 * 3]) * 2.069978111953089e-11; /* tritab_s[1] */ - - inout[3 * 0] = tc1 * 1.907525191737280e-11 /* tritab_s[2] */ + tc0; - inout[3 * 5] = -ts1 * 1.907525191737280e-11 /* tritab_s[0] */ + ts0; - - tc2 = tc2 * 0.86602540378443870761 * 1.907525191737281e-11 /* tritab_s[2] */ ; - ts1 = ts1 * 0.5 * 1.907525191737281e-11 + ts0; - inout[3 * 1] = tc2 - ts1; - inout[3 * 2] = tc2 + ts1; - - tc1 = tc1 * 0.5 * 1.907525191737281e-11 - tc0; - ts2 = ts2 * 0.86602540378443870761 * 1.907525191737281e-11 /* tritab_s[0] */ ; - inout[3 * 3] = tc1 + ts2; - inout[3 * 4] = tc1 - ts2; - - inout++; - } -} - -inline static void -mdct_long(FLOAT * out, FLOAT const *in) -{ - FLOAT ct, st; - { - FLOAT tc1, tc2, tc3, tc4, ts5, ts6, ts7, ts8; - /* 1,2, 5,6, 9,10, 13,14, 17 */ - tc1 = in[17] - in[9]; - tc3 = in[15] - in[11]; - tc4 = in[14] - in[12]; - ts5 = in[0] + in[8]; - ts6 = in[1] + in[7]; - ts7 = in[2] + in[6]; - ts8 = in[3] + in[5]; - - out[17] = (ts5 + ts7 - ts8) - (ts6 - in[4]); - st = (ts5 + ts7 - ts8) * cx[7] + (ts6 - in[4]); - ct = (tc1 - tc3 - tc4) * cx[6]; - out[5] = ct + st; - out[6] = ct - st; - - tc2 = (in[16] - in[10]) * cx[6]; - ts6 = ts6 * cx[7] + in[4]; - ct = tc1 * cx[0] + tc2 + tc3 * cx[1] + tc4 * cx[2]; - st = -ts5 * cx[4] + ts6 - ts7 * cx[5] + ts8 * cx[3]; - out[1] = ct + st; - out[2] = ct - st; - - ct = tc1 * cx[1] - tc2 - tc3 * cx[2] + tc4 * cx[0]; - st = -ts5 * cx[5] + ts6 - ts7 * cx[3] + ts8 * cx[4]; - out[9] = ct + st; - out[10] = ct - st; - - ct = tc1 * cx[2] - tc2 + tc3 * cx[0] - tc4 * cx[1]; - st = ts5 * cx[3] - ts6 + ts7 * cx[4] - ts8 * cx[5]; - out[13] = ct + st; - out[14] = ct - st; - } - { - FLOAT ts1, ts2, ts3, ts4, tc5, tc6, tc7, tc8; - - ts1 = in[8] - in[0]; - ts3 = in[6] - in[2]; - ts4 = in[5] - in[3]; - tc5 = in[17] + in[9]; - tc6 = in[16] + in[10]; - tc7 = in[15] + in[11]; - tc8 = in[14] + in[12]; - - out[0] = (tc5 + tc7 + tc8) + (tc6 + in[13]); - ct = (tc5 + tc7 + tc8) * cx[7] - (tc6 + in[13]); - st = (ts1 - ts3 + ts4) * cx[6]; - out[11] = ct + st; - out[12] = ct - st; - - ts2 = (in[7] - in[1]) * cx[6]; - tc6 = in[13] - tc6 * cx[7]; - ct = tc5 * cx[3] - tc6 + tc7 * cx[4] + tc8 * cx[5]; - st = ts1 * cx[2] + ts2 + ts3 * cx[0] + ts4 * cx[1]; - out[3] = ct + st; - out[4] = ct - st; - - ct = -tc5 * cx[5] + tc6 - tc7 * cx[3] - tc8 * cx[4]; - st = ts1 * cx[1] + ts2 - ts3 * cx[2] - ts4 * cx[0]; - out[7] = ct + st; - out[8] = ct - st; - - ct = -tc5 * cx[4] + tc6 - tc7 * cx[5] - tc8 * cx[3]; - st = ts1 * cx[0] - ts2 + ts3 * cx[1] - ts4 * cx[2]; - out[15] = ct + st; - out[16] = ct - st; - } -} - - -void -mdct_sub48(lame_internal_flags * gfc, const sample_t * w0, const sample_t * w1) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - EncStateVar_t *const esv = &gfc->sv_enc; - int gr, k, ch; - const sample_t *wk; - - wk = w0 + 286; - /* thinking cache performance, ch->gr loop is better than gr->ch loop */ - for (ch = 0; ch < cfg->channels_out; ch++) { - for (gr = 0; gr < cfg->mode_gr; gr++) { - int band; - gr_info *const gi = &(gfc->l3_side.tt[gr][ch]); - FLOAT *mdct_enc = gi->xr; - FLOAT *samp = esv->sb_sample[ch][1 - gr][0]; - - for (k = 0; k < 18 / 2; k++) { - window_subband(wk, samp); - window_subband(wk + 32, samp + 32); - samp += 64; - wk += 64; - /* - * Compensate for inversion in the analysis filter - */ - for (band = 1; band < 32; band += 2) { - samp[band - 32] *= -1; - } - } - - /* - * Perform imdct of 18 previous subband samples - * + 18 current subband samples - */ - for (band = 0; band < 32; band++, mdct_enc += 18) { - int type = gi->block_type; - FLOAT const *const band0 = esv->sb_sample[ch][gr][0] + order[band]; - FLOAT *const band1 = esv->sb_sample[ch][1 - gr][0] + order[band]; - if (gi->mixed_block_flag && band < 2) - type = 0; - if (esv->amp_filter[band] < 1e-12) { - memset(mdct_enc, 0, 18 * sizeof(FLOAT)); - } - else { - if (esv->amp_filter[band] < 1.0) { - for (k = 0; k < 18; k++) - band1[k * 32] *= esv->amp_filter[band]; - } - if (type == SHORT_TYPE) { - for (k = -NS / 4; k < 0; k++) { - FLOAT const w = win[SHORT_TYPE][k + 3]; - mdct_enc[k * 3 + 9] = band0[(9 + k) * 32] * w - band0[(8 - k) * 32]; - mdct_enc[k * 3 + 18] = band0[(14 - k) * 32] * w + band0[(15 + k) * 32]; - mdct_enc[k * 3 + 10] = band0[(15 + k) * 32] * w - band0[(14 - k) * 32]; - mdct_enc[k * 3 + 19] = band1[(2 - k) * 32] * w + band1[(3 + k) * 32]; - mdct_enc[k * 3 + 11] = band1[(3 + k) * 32] * w - band1[(2 - k) * 32]; - mdct_enc[k * 3 + 20] = band1[(8 - k) * 32] * w + band1[(9 + k) * 32]; - } - mdct_short(mdct_enc); - } - else { - FLOAT work[18]; - for (k = -NL / 4; k < 0; k++) { - FLOAT a, b; - a = win[type][k + 27] * band1[(k + 9) * 32] - + win[type][k + 36] * band1[(8 - k) * 32]; - b = win[type][k + 9] * band0[(k + 9) * 32] - - win[type][k + 18] * band0[(8 - k) * 32]; - work[k + 9] = a - b * tantab_l[k + 9]; - work[k + 18] = a * tantab_l[k + 9] + b; - } - - mdct_long(mdct_enc, work); - } - } - /* - * Perform aliasing reduction butterfly - */ - if (type != SHORT_TYPE && band != 0) { - for (k = 7; k >= 0; --k) { - FLOAT bu, bd; - bu = mdct_enc[k] * ca[k] + mdct_enc[-1 - k] * cs[k]; - bd = mdct_enc[k] * cs[k] - mdct_enc[-1 - k] * ca[k]; - - mdct_enc[-1 - k] = bu; - mdct_enc[k] = bd; - } - } - } - } - wk = w1 + 286; - if (cfg->mode_gr == 1) { - memcpy(esv->sb_sample[ch][0], esv->sb_sample[ch][1], 576 * sizeof(FLOAT)); - } - } -} diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/newmdct.h b/recorderlib/src/main/jni/lame-3.100_libmp3lame/newmdct.h deleted file mode 100644 index 0b58a95..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/newmdct.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * New Modified DCT include file - * - * Copyright (c) 1999 Takehiro TOMINAGA - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef LAME_NEWMDCT_H -#define LAME_NEWMDCT_H - -void mdct_sub48(lame_internal_flags * gfc, const sample_t * w0, const sample_t * w1); - -#endif /* LAME_NEWMDCT_H */ diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/presets.c b/recorderlib/src/main/jni/lame-3.100_libmp3lame/presets.c deleted file mode 100644 index 93594f5..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/presets.c +++ /dev/null @@ -1,404 +0,0 @@ -/* - * presets.c -- Apply presets - * - * Copyright (c) 2002-2008 Gabriel Bouvigne - * Copyright (c) 2007-2012 Robert Hegemann - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. - */ - - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include "lame.h" -#include "machine.h" -#include "set_get.h" -#include "encoder.h" -#include "util.h" -#include "lame_global_flags.h" - -#define SET_OPTION(opt, val, def) if (enforce) \ - (void) lame_set_##opt(gfp, val); \ - else if (!(fabs(lame_get_##opt(gfp) - def) > 0)) \ - (void) lame_set_##opt(gfp, val); - -#define SET__OPTION(opt, val, def) if (enforce) \ - lame_set_##opt(gfp, val); \ - else if (!(fabs(lame_get_##opt(gfp) - def) > 0)) \ - lame_set_##opt(gfp, val); - -#undef Min -#undef Max - -static inline int -min_int(int a, int b) -{ - if (a < b) { - return a; - } - return b; -} - -static inline int -max_int(int a, int b) -{ - if (a > b) { - return a; - } - return b; -} - - - -typedef struct { - int vbr_q; - int quant_comp; - int quant_comp_s; - int expY; - FLOAT st_lrm; /*short threshold */ - FLOAT st_s; - FLOAT masking_adj; - FLOAT masking_adj_short; - FLOAT ath_lower; - FLOAT ath_curve; - FLOAT ath_sensitivity; - FLOAT interch; - int safejoint; - int sfb21mod; - FLOAT msfix; - FLOAT minval; - FLOAT ath_fixpoint; -} vbr_presets_t; - - /* *INDENT-OFF* */ - - /* Switch mappings for VBR mode VBR_RH */ - static const vbr_presets_t vbr_old_switch_map[] = { - /*vbr_q qcomp_l qcomp_s expY st_lrm st_s mask adj_l adj_s ath_lower ath_curve ath_sens interChR safejoint sfb21mod msfix */ - {0, 9, 9, 0, 5.20, 125.0, -4.2, -6.3, 4.8, 1, 0, 0, 2, 21, 0.97, 5, 100}, - {1, 9, 9, 0, 5.30, 125.0, -3.6, -5.6, 4.5, 1.5, 0, 0, 2, 21, 1.35, 5, 100}, - {2, 9, 9, 0, 5.60, 125.0, -2.2, -3.5, 2.8, 2, 0, 0, 2, 21, 1.49, 5, 100}, - {3, 9, 9, 1, 5.80, 130.0, -1.8, -2.8, 2.6, 3, -4, 0, 2, 20, 1.64, 5, 100}, - {4, 9, 9, 1, 6.00, 135.0, -0.7, -1.1, 1.1, 3.5, -8, 0, 2, 0, 1.79, 5, 100}, - {5, 9, 9, 1, 6.40, 140.0, 0.5, 0.4, -7.5, 4, -12, 0.0002, 0, 0, 1.95, 5, 100}, - {6, 9, 9, 1, 6.60, 145.0, 0.67, 0.65, -14.7, 6.5, -19, 0.0004, 0, 0, 2.30, 5, 100}, - {7, 9, 9, 1, 6.60, 145.0, 0.8, 0.75, -19.7, 8, -22, 0.0006, 0, 0, 2.70, 5, 100}, - {8, 9, 9, 1, 6.60, 145.0, 1.2, 1.15, -27.5, 10, -23, 0.0007, 0, 0, 0, 5, 100}, - {9, 9, 9, 1, 6.60, 145.0, 1.6, 1.6, -36, 11, -25, 0.0008, 0, 0, 0, 5, 100}, - {10, 9, 9, 1, 6.60, 145.0, 2.0, 2.0, -36, 12, -25, 0.0008, 0, 0, 0, 5, 100} - }; - - static const vbr_presets_t vbr_mt_psy_switch_map[] = { - /*vbr_q qcomp_l qcomp_s expY st_lrm st_s mask adj_l adj_s ath_lower ath_curve ath_sens --- safejoint sfb21mod msfix */ - {0, 9, 9, 0, 4.20, 25.0, -6.8, -6.8, 7.1, 1, 0, 0, 2, 31, 1.000, 5, 100}, - {1, 9, 9, 0, 4.20, 25.0, -4.8, -4.8, 5.4, 1.4, -1, 0, 2, 27, 1.122, 5, 98}, - {2, 9, 9, 0, 4.20, 25.0, -2.6, -2.6, 3.7, 2.0, -3, 0, 2, 23, 1.288, 5, 97}, - {3, 9, 9, 1, 4.20, 25.0, -1.6, -1.6, 2.0, 2.0, -5, 0, 2, 18, 1.479, 5, 96}, - {4, 9, 9, 1, 4.20, 25.0, -0.0, -0.0, 0.0, 2.0, -8, 0, 2, 12, 1.698, 5, 95}, - {5, 9, 9, 1, 4.20, 25.0, 1.3, 1.3, -6, 3.5, -11, 0, 2, 8, 1.950, 5, 94.2}, -#if 0 - {6, 9, 9, 1, 4.50, 100.0, 1.5, 1.5, -24.0, 6.0, -14, 0, 2, 4, 2.239, 3, 93.9}, - {7, 9, 9, 1, 4.80, 200.0, 1.7, 1.7, -28.0, 9.0, -20, 0, 2, 0, 2.570, 1, 93.6}, -#else - {6, 9, 9, 1, 4.50, 100.0, 2.2, 2.3, -12.0, 6.0, -14, 0, 2, 4, 2.239, 3, 93.9}, - {7, 9, 9, 1, 4.80, 200.0, 2.7, 2.7, -18.0, 9.0, -17, 0, 2, 0, 2.570, 1, 93.6}, -#endif - {8, 9, 9, 1, 5.30, 300.0, 2.8, 2.8, -21.0, 10.0, -23, 0.0002, 0, 0, 2.951, 0, 93.3}, - {9, 9, 9, 1, 6.60, 300.0, 2.8, 2.8, -23.0, 11.0, -25, 0.0006, 0, 0, 3.388, 0, 93.3}, - {10, 9, 9, 1, 25.00, 300.0, 2.8, 2.8, -25.0, 12.0, -27, 0.0025, 0, 0, 3.500, 0, 93.3} - }; - - /* *INDENT-ON* */ - -static vbr_presets_t const* -get_vbr_preset(int v) -{ - switch (v) { - case vbr_mtrh: - case vbr_mt: - return &vbr_mt_psy_switch_map[0]; - default: - return &vbr_old_switch_map[0]; - } -} - -#define NOOP(m) (void)p.m -#define LERP(m) (p.m = p.m + x * (q.m - p.m)) - -static void -apply_vbr_preset(lame_global_flags * gfp, int a, int enforce) -{ - vbr_presets_t const *vbr_preset = get_vbr_preset(lame_get_VBR(gfp)); - float x = gfp->VBR_q_frac; - vbr_presets_t p = vbr_preset[a]; - vbr_presets_t q = vbr_preset[a + 1]; - vbr_presets_t const *set = &p; - - NOOP(vbr_q); - NOOP(quant_comp); - NOOP(quant_comp_s); - NOOP(expY); - LERP(st_lrm); - LERP(st_s); - LERP(masking_adj); - LERP(masking_adj_short); - LERP(ath_lower); - LERP(ath_curve); - LERP(ath_sensitivity); - LERP(interch); - NOOP(safejoint); - LERP(sfb21mod); - LERP(msfix); - LERP(minval); - LERP(ath_fixpoint); - - (void) lame_set_VBR_q(gfp, set->vbr_q); - SET_OPTION(quant_comp, set->quant_comp, -1); - SET_OPTION(quant_comp_short, set->quant_comp_s, -1); - if (set->expY) { - (void) lame_set_experimentalY(gfp, set->expY); - } - SET_OPTION(short_threshold_lrm, set->st_lrm, -1); - SET_OPTION(short_threshold_s, set->st_s, -1); - SET_OPTION(maskingadjust, set->masking_adj, 0); - SET_OPTION(maskingadjust_short, set->masking_adj_short, 0); - if (lame_get_VBR(gfp) == vbr_mt || lame_get_VBR(gfp) == vbr_mtrh) { - lame_set_ATHtype(gfp, 5); - } - SET_OPTION(ATHlower, set->ath_lower, 0); - SET_OPTION(ATHcurve, set->ath_curve, -1); - SET_OPTION(athaa_sensitivity, set->ath_sensitivity, 0); - if (set->interch > 0) { - SET_OPTION(interChRatio, set->interch, -1); - } - - /* parameters for which there is no proper set/get interface */ - if (set->safejoint > 0) { - (void) lame_set_exp_nspsytune(gfp, lame_get_exp_nspsytune(gfp) | 2); - } - if (set->sfb21mod > 0) { - int const nsp = lame_get_exp_nspsytune(gfp); - int const val = (nsp >> 20) & 63; - if (val == 0) { - int const sf21mod = (set->sfb21mod << 20) | nsp; - (void) lame_set_exp_nspsytune(gfp, sf21mod); - } - } - SET__OPTION(msfix, set->msfix, -1); - - if (enforce == 0) { - gfp->VBR_q = a; - gfp->VBR_q_frac = x; - } - gfp->internal_flags->cfg.minval = set->minval; - { /* take care of gain adjustments */ - double const x = fabs(gfp->scale); - double const y = (x > 0.f) ? (10.f * log10(x)) : 0.f; - gfp->internal_flags->cfg.ATHfixpoint = set->ath_fixpoint - y; - } -} - -static int -apply_abr_preset(lame_global_flags * gfp, int preset, int enforce) -{ - typedef struct { - int abr_kbps; - int quant_comp; - int quant_comp_s; - int safejoint; - FLOAT nsmsfix; - FLOAT st_lrm; /*short threshold */ - FLOAT st_s; - FLOAT scale; - FLOAT masking_adj; - FLOAT ath_lower; - FLOAT ath_curve; - FLOAT interch; - int sfscale; - } abr_presets_t; - - - /* *INDENT-OFF* */ - - /* - * Switch mappings for ABR mode - */ - const abr_presets_t abr_switch_map[] = { - /* kbps quant q_s safejoint nsmsfix st_lrm st_s scale msk ath_lwr ath_curve interch , sfscale */ - { 8, 9, 9, 0, 0, 6.60, 145, 0.95, 0, -30.0, 11, 0.0012, 1}, /* 8, impossible to use in stereo */ - { 16, 9, 9, 0, 0, 6.60, 145, 0.95, 0, -25.0, 11, 0.0010, 1}, /* 16 */ - { 24, 9, 9, 0, 0, 6.60, 145, 0.95, 0, -20.0, 11, 0.0010, 1}, /* 24 */ - { 32, 9, 9, 0, 0, 6.60, 145, 0.95, 0, -15.0, 11, 0.0010, 1}, /* 32 */ - { 40, 9, 9, 0, 0, 6.60, 145, 0.95, 0, -10.0, 11, 0.0009, 1}, /* 40 */ - { 48, 9, 9, 0, 0, 6.60, 145, 0.95, 0, -10.0, 11, 0.0009, 1}, /* 48 */ - { 56, 9, 9, 0, 0, 6.60, 145, 0.95, 0, -6.0, 11, 0.0008, 1}, /* 56 */ - { 64, 9, 9, 0, 0, 6.60, 145, 0.95, 0, -2.0, 11, 0.0008, 1}, /* 64 */ - { 80, 9, 9, 0, 0, 6.60, 145, 0.95, 0, .0, 8, 0.0007, 1}, /* 80 */ - { 96, 9, 9, 0, 2.50, 6.60, 145, 0.95, 0, 1.0, 5.5, 0.0006, 1}, /* 96 */ - {112, 9, 9, 0, 2.25, 6.60, 145, 0.95, 0, 2.0, 4.5, 0.0005, 1}, /* 112 */ - {128, 9, 9, 0, 1.95, 6.40, 140, 0.95, 0, 3.0, 4, 0.0002, 1}, /* 128 */ - {160, 9, 9, 1, 1.79, 6.00, 135, 0.95, -2, 5.0, 3.5, 0, 1}, /* 160 */ - {192, 9, 9, 1, 1.49, 5.60, 125, 0.97, -4, 7.0, 3, 0, 0}, /* 192 */ - {224, 9, 9, 1, 1.25, 5.20, 125, 0.98, -6, 9.0, 2, 0, 0}, /* 224 */ - {256, 9, 9, 1, 0.97, 5.20, 125, 1.00, -8, 10.0, 1, 0, 0}, /* 256 */ - {320, 9, 9, 1, 0.90, 5.20, 125, 1.00, -10, 12.0, 0, 0, 0} /* 320 */ - }; - - /* *INDENT-ON* */ - - /* Variables for the ABR stuff */ - int r; - int actual_bitrate = preset; - - r = nearestBitrateFullIndex(preset); - - (void) lame_set_VBR(gfp, vbr_abr); - (void) lame_set_VBR_mean_bitrate_kbps(gfp, (actual_bitrate)); - (void) lame_set_VBR_mean_bitrate_kbps(gfp, min_int(lame_get_VBR_mean_bitrate_kbps(gfp), 320)); - (void) lame_set_VBR_mean_bitrate_kbps(gfp, max_int(lame_get_VBR_mean_bitrate_kbps(gfp), 8)); - (void) lame_set_brate(gfp, lame_get_VBR_mean_bitrate_kbps(gfp)); - - - /* parameters for which there is no proper set/get interface */ - if (abr_switch_map[r].safejoint > 0) - (void) lame_set_exp_nspsytune(gfp, lame_get_exp_nspsytune(gfp) | 2); /* safejoint */ - - if (abr_switch_map[r].sfscale > 0) - (void) lame_set_sfscale(gfp, 1); - - - SET_OPTION(quant_comp, abr_switch_map[r].quant_comp, -1); - SET_OPTION(quant_comp_short, abr_switch_map[r].quant_comp_s, -1); - - SET__OPTION(msfix, abr_switch_map[r].nsmsfix, -1); - - SET_OPTION(short_threshold_lrm, abr_switch_map[r].st_lrm, -1); - SET_OPTION(short_threshold_s, abr_switch_map[r].st_s, -1); - - /* ABR seems to have big problems with clipping, especially at low bitrates */ - /* so we compensate for that here by using a scale value depending on bitrate */ - lame_set_scale(gfp, lame_get_scale(gfp) * abr_switch_map[r].scale); - - SET_OPTION(maskingadjust, abr_switch_map[r].masking_adj, 0); - if (abr_switch_map[r].masking_adj > 0) { - SET_OPTION(maskingadjust_short, abr_switch_map[r].masking_adj * .9, 0); - } - else { - SET_OPTION(maskingadjust_short, abr_switch_map[r].masking_adj * 1.1, 0); - } - - - SET_OPTION(ATHlower, abr_switch_map[r].ath_lower, 0); - SET_OPTION(ATHcurve, abr_switch_map[r].ath_curve, -1); - - SET_OPTION(interChRatio, abr_switch_map[r].interch, -1); - - (void) abr_switch_map[r].abr_kbps; - - gfp->internal_flags->cfg.minval = 5. * (abr_switch_map[r].abr_kbps / 320.); - - return preset; -} - - - -int -apply_preset(lame_global_flags * gfp, int preset, int enforce) -{ - /*translate legacy presets */ - switch (preset) { - case R3MIX: - { - preset = V3; - (void) lame_set_VBR(gfp, vbr_mtrh); - break; - } - case MEDIUM: - case MEDIUM_FAST: - { - preset = V4; - (void) lame_set_VBR(gfp, vbr_mtrh); - break; - } - case STANDARD: - case STANDARD_FAST: - { - preset = V2; - (void) lame_set_VBR(gfp, vbr_mtrh); - break; - } - case EXTREME: - case EXTREME_FAST: - { - preset = V0; - (void) lame_set_VBR(gfp, vbr_mtrh); - break; - } - case INSANE: - { - preset = 320; - gfp->preset = preset; - (void) apply_abr_preset(gfp, preset, enforce); - lame_set_VBR(gfp, vbr_off); - return preset; - } - } - - gfp->preset = preset; - { - switch (preset) { - case V9: - apply_vbr_preset(gfp, 9, enforce); - return preset; - case V8: - apply_vbr_preset(gfp, 8, enforce); - return preset; - case V7: - apply_vbr_preset(gfp, 7, enforce); - return preset; - case V6: - apply_vbr_preset(gfp, 6, enforce); - return preset; - case V5: - apply_vbr_preset(gfp, 5, enforce); - return preset; - case V4: - apply_vbr_preset(gfp, 4, enforce); - return preset; - case V3: - apply_vbr_preset(gfp, 3, enforce); - return preset; - case V2: - apply_vbr_preset(gfp, 2, enforce); - return preset; - case V1: - apply_vbr_preset(gfp, 1, enforce); - return preset; - case V0: - apply_vbr_preset(gfp, 0, enforce); - return preset; - default: - break; - } - } - if (8 <= preset && preset <= 320) { - return apply_abr_preset(gfp, preset, enforce); - } - - gfp->preset = 0; /*no corresponding preset found */ - return preset; -} diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/psymodel.c b/recorderlib/src/main/jni/lame-3.100_libmp3lame/psymodel.c deleted file mode 100644 index 60076ee..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/psymodel.c +++ /dev/null @@ -1,2167 +0,0 @@ -/* - * psymodel.c - * - * Copyright (c) 1999-2000 Mark Taylor - * Copyright (c) 2001-2002 Naoki Shibata - * Copyright (c) 2000-2003 Takehiro Tominaga - * Copyright (c) 2000-2012 Robert Hegemann - * Copyright (c) 2000-2005 Gabriel Bouvigne - * Copyright (c) 2000-2005 Alexander Leidinger - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* $Id: psymodel.c,v 1.216 2017/09/06 19:38:23 aleidinger Exp $ */ - - -/* -PSYCHO ACOUSTICS - - -This routine computes the psycho acoustics, delayed by one granule. - -Input: buffer of PCM data (1024 samples). - -This window should be centered over the 576 sample granule window. -The routine will compute the psycho acoustics for -this granule, but return the psycho acoustics computed -for the *previous* granule. This is because the block -type of the previous granule can only be determined -after we have computed the psycho acoustics for the following -granule. - -Output: maskings and energies for each scalefactor band. -block type, PE, and some correlation measures. -The PE is used by CBR modes to determine if extra bits -from the bit reservoir should be used. The correlation -measures are used to determine mid/side or regular stereo. -*/ -/* -Notation: - -barks: a non-linear frequency scale. Mapping from frequency to - barks is given by freq2bark() - -scalefactor bands: The spectrum (frequencies) are broken into - SBMAX "scalefactor bands". Thes bands - are determined by the MPEG ISO spec. In - the noise shaping/quantization code, we allocate - bits among the partition bands to achieve the - best possible quality - -partition bands: The spectrum is also broken into about - 64 "partition bands". Each partition - band is about .34 barks wide. There are about 2-5 - partition bands for each scalefactor band. - -LAME computes all psycho acoustic information for each partition -band. Then at the end of the computations, this information -is mapped to scalefactor bands. The energy in each scalefactor -band is taken as the sum of the energy in all partition bands -which overlap the scalefactor band. The maskings can be computed -in the same way (and thus represent the average masking in that band) -or by taking the minmum value multiplied by the number of -partition bands used (which represents a minimum masking in that band). -*/ -/* -The general outline is as follows: - -1. compute the energy in each partition band -2. compute the tonality in each partition band -3. compute the strength of each partion band "masker" -4. compute the masking (via the spreading function applied to each masker) -5. Modifications for mid/side masking. - -Each partition band is considiered a "masker". The strength -of the i'th masker in band j is given by: - - s3(bark(i)-bark(j))*strength(i) - -The strength of the masker is a function of the energy and tonality. -The more tonal, the less masking. LAME uses a simple linear formula -(controlled by NMT and TMN) which says the strength is given by the -energy divided by a linear function of the tonality. -*/ -/* -s3() is the "spreading function". It is given by a formula -determined via listening tests. - -The total masking in the j'th partition band is the sum over -all maskings i. It is thus given by the convolution of -the strength with s3(), the "spreading function." - -masking(j) = sum_over_i s3(i-j)*strength(i) = s3 o strength - -where "o" = convolution operator. s3 is given by a formula determined -via listening tests. It is normalized so that s3 o 1 = 1. - -Note: instead of a simple convolution, LAME also has the -option of using "additive masking" - -The most critical part is step 2, computing the tonality of each -partition band. LAME has two tonality estimators. The first -is based on the ISO spec, and measures how predictiable the -signal is over time. The more predictable, the more tonal. -The second measure is based on looking at the spectrum of -a single granule. The more peaky the spectrum, the more -tonal. By most indications, the latter approach is better. - -Finally, in step 5, the maskings for the mid and side -channel are possibly increased. Under certain circumstances, -noise in the mid & side channels is assumed to also -be masked by strong maskers in the L or R channels. - - -Other data computed by the psy-model: - -ms_ratio side-channel / mid-channel masking ratio (for previous granule) -ms_ratio_next side-channel / mid-channel masking ratio for this granule - -percep_entropy[2] L and R values (prev granule) of PE - A measure of how - much pre-echo is in the previous granule -percep_entropy_MS[2] mid and side channel values (prev granule) of percep_entropy -energy[4] L,R,M,S energy in each channel, prev granule -blocktype_d[2] block type to use for previous granule -*/ - - - - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include - -#include "lame.h" -#include "machine.h" -#include "encoder.h" -#include "util.h" -#include "psymodel.h" -#include "lame_global_flags.h" -#include "fft.h" -#include "lame-analysis.h" - - -#define NSFIRLEN 21 - -#ifdef M_LN10 -#define LN_TO_LOG10 (M_LN10/10) -#else -#define LN_TO_LOG10 0.2302585093 -#endif - - -/* - L3psycho_anal. Compute psycho acoustics. - - Data returned to the calling program must be delayed by one - granule. - - This is done in two places. - If we do not need to know the blocktype, the copying - can be done here at the top of the program: we copy the data for - the last granule (computed during the last call) before it is - overwritten with the new data. It looks like this: - - 0. static psymodel_data - 1. calling_program_data = psymodel_data - 2. compute psymodel_data - - For data which needs to know the blocktype, the copying must be - done at the end of this loop, and the old values must be saved: - - 0. static psymodel_data_old - 1. compute psymodel_data - 2. compute possible block type of this granule - 3. compute final block type of previous granule based on #2. - 4. calling_program_data = psymodel_data_old - 5. psymodel_data_old = psymodel_data -*/ - - - - - -/* psycho_loudness_approx - jd - 2001 mar 12 -in: energy - BLKSIZE/2 elements of frequency magnitudes ^ 2 - gfp - uses out_samplerate, ATHtype (also needed for ATHformula) -returns: loudness^2 approximation, a positive value roughly tuned for a value - of 1.0 for signals near clipping. -notes: When calibrated, feeding this function binary white noise at sample - values +32767 or -32768 should return values that approach 3. - ATHformula is used to approximate an equal loudness curve. -future: Data indicates that the shape of the equal loudness curve varies - with intensity. This function might be improved by using an equal - loudness curve shaped for typical playback levels (instead of the - ATH, that is shaped for the threshold). A flexible realization might - simply bend the existing ATH curve to achieve the desired shape. - However, the potential gain may not be enough to justify an effort. -*/ -static FLOAT -psycho_loudness_approx(FLOAT const *energy, FLOAT const *eql_w) -{ - int i; - FLOAT loudness_power; - - loudness_power = 0.0; - /* apply weights to power in freq. bands */ - for (i = 0; i < BLKSIZE / 2; ++i) - loudness_power += energy[i] * eql_w[i]; - loudness_power *= VO_SCALE; - - return loudness_power; -} - -/* mask_add optimization */ -/* init the limit values used to avoid computing log in mask_add when it is not necessary */ - -/* For example, with i = 10*log10(m2/m1)/10*16 (= log10(m2/m1)*16) - * - * abs(i)>8 is equivalent (as i is an integer) to - * abs(i)>=9 - * i>=9 || i<=-9 - * equivalent to (as i is the biggest integer smaller than log10(m2/m1)*16 - * or the smallest integer bigger than log10(m2/m1)*16 depending on the sign of log10(m2/m1)*16) - * log10(m2/m1)>=9/16 || log10(m2/m1)<=-9/16 - * exp10 is strictly increasing thus this is equivalent to - * m2/m1 >= 10^(9/16) || m2/m1<=10^(-9/16) which are comparisons to constants - */ - - -#define I1LIMIT 8 /* as in if(i>8) */ -#define I2LIMIT 23 /* as in if(i>24) -> changed 23 */ -#define MLIMIT 15 /* as in if(m<15) */ - -/* pow(10, (I1LIMIT + 1) / 16.0); */ -static const FLOAT ma_max_i1 = 3.6517412725483771; -/* pow(10, (I2LIMIT + 1) / 16.0); */ -static const FLOAT ma_max_i2 = 31.622776601683793; -/* pow(10, (MLIMIT) / 10.0); */ -static const FLOAT ma_max_m = 31.622776601683793; - - /*This is the masking table: - According to tonality, values are going from 0dB (TMN) - to 9.3dB (NMT). - After additive masking computation, 8dB are added, so - final values are going from 8dB to 17.3dB - */ -static const FLOAT tab[] = { - 1.0 /*pow(10, -0) */ , - 0.79433 /*pow(10, -0.1) */ , - 0.63096 /*pow(10, -0.2) */ , - 0.63096 /*pow(10, -0.2) */ , - 0.63096 /*pow(10, -0.2) */ , - 0.63096 /*pow(10, -0.2) */ , - 0.63096 /*pow(10, -0.2) */ , - 0.25119 /*pow(10, -0.6) */ , - 0.11749 /*pow(10, -0.93) */ -}; - -static const int tab_mask_add_delta[] = { 2, 2, 2, 1, 1, 1, 0, 0, -1 }; -#define STATIC_ASSERT_EQUAL_DIMENSION(A,B) enum{static_assert_##A=1/((dimension_of(A) == dimension_of(B))?1:0)} - -inline static int -mask_add_delta(int i) -{ - STATIC_ASSERT_EQUAL_DIMENSION(tab_mask_add_delta,tab); - assert(i < (int)dimension_of(tab)); - return tab_mask_add_delta[i]; -} - - -static void -init_mask_add_max_values(void) -{ -#ifndef NDEBUG - FLOAT const _ma_max_i1 = pow(10, (I1LIMIT + 1) / 16.0); - FLOAT const _ma_max_i2 = pow(10, (I2LIMIT + 1) / 16.0); - FLOAT const _ma_max_m = pow(10, (MLIMIT) / 10.0); - assert(fabs(ma_max_i1 - _ma_max_i1) <= FLT_EPSILON); - assert(fabs(ma_max_i2 - _ma_max_i2) <= FLT_EPSILON); - assert(fabs(ma_max_m - _ma_max_m ) <= FLT_EPSILON); -#endif -} - - - - -/* addition of simultaneous masking Naoki Shibata 2000/7 */ -inline static FLOAT -vbrpsy_mask_add(FLOAT m1, FLOAT m2, int b, int delta) -{ - static const FLOAT table2[] = { - 1.33352 * 1.33352, 1.35879 * 1.35879, 1.38454 * 1.38454, 1.39497 * 1.39497, - 1.40548 * 1.40548, 1.3537 * 1.3537, 1.30382 * 1.30382, 1.22321 * 1.22321, - 1.14758 * 1.14758, - 1 - }; - - FLOAT ratio; - - if (m1 < 0) { - m1 = 0; - } - if (m2 < 0) { - m2 = 0; - } - if (m1 <= 0) { - return m2; - } - if (m2 <= 0) { - return m1; - } - if (m2 > m1) { - ratio = m2 / m1; - } - else { - ratio = m1 / m2; - } - if (abs(b) <= delta) { /* approximately, 1 bark = 3 partitions */ - /* originally 'if(i > 8)' */ - if (ratio >= ma_max_i1) { - return m1 + m2; - } - else { - int i = (int) (FAST_LOG10_X(ratio, 16.0f)); - return (m1 + m2) * table2[i]; - } - } - if (ratio < ma_max_i2) { - return m1 + m2; - } - if (m1 < m2) { - m1 = m2; - } - return m1; -} - - -/* short block threshold calculation (part 2) - - partition band bo_s[sfb] is at the transition from scalefactor - band sfb to the next one sfb+1; enn and thmm have to be split - between them -*/ -static void -convert_partition2scalefac(PsyConst_CB2SB_t const *const gd, FLOAT const *eb, FLOAT const *thr, - FLOAT enn_out[], FLOAT thm_out[]) -{ - FLOAT enn, thmm; - int sb, b, n = gd->n_sb; - enn = thmm = 0.0f; - for (sb = b = 0; sb < n; ++b, ++sb) { - int const bo_sb = gd->bo[sb]; - int const npart = gd->npart; - int const b_lim = bo_sb < npart ? bo_sb : npart; - while (b < b_lim) { - assert(eb[b] >= 0); /* iff failed, it may indicate some index error elsewhere */ - assert(thr[b] >= 0); - enn += eb[b]; - thmm += thr[b]; - b++; - } - if (b >= npart) { - enn_out[sb] = enn; - thm_out[sb] = thmm; - ++sb; - break; - } - assert(eb[b] >= 0); /* iff failed, it may indicate some index error elsewhere */ - assert(thr[b] >= 0); - { - /* at transition sfb -> sfb+1 */ - FLOAT const w_curr = gd->bo_weight[sb]; - FLOAT const w_next = 1.0f - w_curr; - enn += w_curr * eb[b]; - thmm += w_curr * thr[b]; - enn_out[sb] = enn; - thm_out[sb] = thmm; - enn = w_next * eb[b]; - thmm = w_next * thr[b]; - } - } - /* zero initialize the rest */ - for (; sb < n; ++sb) { - enn_out[sb] = 0; - thm_out[sb] = 0; - } -} - -static void -convert_partition2scalefac_s(lame_internal_flags * gfc, FLOAT const *eb, FLOAT const *thr, int chn, - int sblock) -{ - PsyStateVar_t *const psv = &gfc->sv_psy; - PsyConst_CB2SB_t const *const gds = &gfc->cd_psy->s; - FLOAT enn[SBMAX_s], thm[SBMAX_s]; - int sb; - convert_partition2scalefac(gds, eb, thr, enn, thm); - for (sb = 0; sb < SBMAX_s; ++sb) { - psv->en[chn].s[sb][sblock] = enn[sb]; - psv->thm[chn].s[sb][sblock] = thm[sb]; - } -} - -/* longblock threshold calculation (part 2) */ -static void -convert_partition2scalefac_l(lame_internal_flags * gfc, FLOAT const *eb, FLOAT const *thr, int chn) -{ - PsyStateVar_t *const psv = &gfc->sv_psy; - PsyConst_CB2SB_t const *const gdl = &gfc->cd_psy->l; - FLOAT *enn = &psv->en[chn].l[0]; - FLOAT *thm = &psv->thm[chn].l[0]; - convert_partition2scalefac(gdl, eb, thr, enn, thm); -} - -static void -convert_partition2scalefac_l_to_s(lame_internal_flags * gfc, FLOAT const *eb, FLOAT const *thr, - int chn) -{ - PsyStateVar_t *const psv = &gfc->sv_psy; - PsyConst_CB2SB_t const *const gds = &gfc->cd_psy->l_to_s; - FLOAT enn[SBMAX_s], thm[SBMAX_s]; - int sb, sblock; - convert_partition2scalefac(gds, eb, thr, enn, thm); - for (sb = 0; sb < SBMAX_s; ++sb) { - FLOAT const scale = 1. / 64.f; - FLOAT const tmp_enn = enn[sb]; - FLOAT const tmp_thm = thm[sb] * scale; - for (sblock = 0; sblock < 3; ++sblock) { - psv->en[chn].s[sb][sblock] = tmp_enn; - psv->thm[chn].s[sb][sblock] = tmp_thm; - } - } -} - - - -static inline FLOAT -NS_INTERP(FLOAT x, FLOAT y, FLOAT r) -{ - /* was pow((x),(r))*pow((y),1-(r)) */ - if (r >= 1.0f) - return x; /* 99.7% of the time */ - if (r <= 0.0f) - return y; - if (y > 0.0f) - return powf(x / y, r) * y; /* rest of the time */ - return 0.0f; /* never happens */ -} - - - -static FLOAT -pecalc_s(III_psy_ratio const *mr, FLOAT masking_lower) -{ - FLOAT pe_s; - static const FLOAT regcoef_s[] = { - 11.8, /* these values are tuned only for 44.1kHz... */ - 13.6, - 17.2, - 32, - 46.5, - 51.3, - 57.5, - 67.1, - 71.5, - 84.6, - 97.6, - 130, -/* 255.8 */ - }; - unsigned int sb, sblock; - - pe_s = 1236.28f / 4; - for (sb = 0; sb < SBMAX_s - 1; sb++) { - for (sblock = 0; sblock < 3; sblock++) { - FLOAT const thm = mr->thm.s[sb][sblock]; - assert(sb < dimension_of(regcoef_s)); - if (thm > 0.0f) { - FLOAT const x = thm * masking_lower; - FLOAT const en = mr->en.s[sb][sblock]; - if (en > x) { - if (en > x * 1e10f) { - pe_s += regcoef_s[sb] * (10.0f * LOG10); - } - else { - assert(x > 0); - pe_s += regcoef_s[sb] * FAST_LOG10(en / x); - } - } - } - } - } - - return pe_s; -} - -static FLOAT -pecalc_l(III_psy_ratio const *mr, FLOAT masking_lower) -{ - FLOAT pe_l; - static const FLOAT regcoef_l[] = { - 6.8, /* these values are tuned only for 44.1kHz... */ - 5.8, - 5.8, - 6.4, - 6.5, - 9.9, - 12.1, - 14.4, - 15, - 18.9, - 21.6, - 26.9, - 34.2, - 40.2, - 46.8, - 56.5, - 60.7, - 73.9, - 85.7, - 93.4, - 126.1, -/* 241.3 */ - }; - unsigned int sb; - - pe_l = 1124.23f / 4; - for (sb = 0; sb < SBMAX_l - 1; sb++) { - FLOAT const thm = mr->thm.l[sb]; - assert(sb < dimension_of(regcoef_l)); - if (thm > 0.0f) { - FLOAT const x = thm * masking_lower; - FLOAT const en = mr->en.l[sb]; - if (en > x) { - if (en > x * 1e10f) { - pe_l += regcoef_l[sb] * (10.0f * LOG10); - } - else { - assert(x > 0); - pe_l += regcoef_l[sb] * FAST_LOG10(en / x); - } - } - } - } - - return pe_l; -} - - -static void -calc_energy(PsyConst_CB2SB_t const *l, FLOAT const *fftenergy, FLOAT * eb, FLOAT * max, FLOAT * avg) -{ - int b, j; - - for (b = j = 0; b < l->npart; ++b) { - FLOAT ebb = 0, m = 0; - int i; - for (i = 0; i < l->numlines[b]; ++i, ++j) { - FLOAT const el = fftenergy[j]; - assert(el >= 0); - ebb += el; - if (m < el) - m = el; - } - eb[b] = ebb; - max[b] = m; - avg[b] = ebb * l->rnumlines[b]; - assert(l->rnumlines[b] >= 0); - assert(ebb >= 0); - assert(eb[b] >= 0); - assert(max[b] >= 0); - assert(avg[b] >= 0); - } -} - - -static void -calc_mask_index_l(lame_internal_flags const *gfc, FLOAT const *max, - FLOAT const *avg, unsigned char *mask_idx) -{ - PsyConst_CB2SB_t const *const gdl = &gfc->cd_psy->l; - FLOAT m, a; - int b, k; - int const last_tab_entry = sizeof(tab) / sizeof(tab[0]) - 1; - b = 0; - a = avg[b] + avg[b + 1]; - assert(a >= 0); - if (a > 0.0f) { - m = max[b]; - if (m < max[b + 1]) - m = max[b + 1]; - assert((gdl->numlines[b] + gdl->numlines[b + 1] - 1) > 0); - a = 20.0f * (m * 2.0f - a) - / (a * (gdl->numlines[b] + gdl->numlines[b + 1] - 1)); - k = (int) a; - if (k > last_tab_entry) - k = last_tab_entry; - mask_idx[b] = k; - } - else { - mask_idx[b] = 0; - } - - for (b = 1; b < gdl->npart - 1; b++) { - a = avg[b - 1] + avg[b] + avg[b + 1]; - assert(a >= 0); - if (a > 0.0f) { - m = max[b - 1]; - if (m < max[b]) - m = max[b]; - if (m < max[b + 1]) - m = max[b + 1]; - assert((gdl->numlines[b - 1] + gdl->numlines[b] + gdl->numlines[b + 1] - 1) > 0); - a = 20.0f * (m * 3.0f - a) - / (a * (gdl->numlines[b - 1] + gdl->numlines[b] + gdl->numlines[b + 1] - 1)); - k = (int) a; - if (k > last_tab_entry) - k = last_tab_entry; - mask_idx[b] = k; - } - else { - mask_idx[b] = 0; - } - } - assert(b > 0); - assert(b == gdl->npart - 1); - - a = avg[b - 1] + avg[b]; - assert(a >= 0); - if (a > 0.0f) { - m = max[b - 1]; - if (m < max[b]) - m = max[b]; - assert((gdl->numlines[b - 1] + gdl->numlines[b] - 1) > 0); - a = 20.0f * (m * 2.0f - a) - / (a * (gdl->numlines[b - 1] + gdl->numlines[b] - 1)); - k = (int) a; - if (k > last_tab_entry) - k = last_tab_entry; - mask_idx[b] = k; - } - else { - mask_idx[b] = 0; - } - assert(b == (gdl->npart - 1)); -} - - -static void -vbrpsy_compute_fft_l(lame_internal_flags * gfc, const sample_t * const buffer[2], int chn, - int gr_out, FLOAT fftenergy[HBLKSIZE], FLOAT(*wsamp_l)[BLKSIZE]) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - PsyStateVar_t *psv = &gfc->sv_psy; - plotting_data *plt = cfg->analysis ? gfc->pinfo : 0; - int j; - - if (chn < 2) { - fft_long(gfc, *wsamp_l, chn, buffer); - } - else if (chn == 2) { - FLOAT const sqrt2_half = SQRT2 * 0.5f; - /* FFT data for mid and side channel is derived from L & R */ - for (j = BLKSIZE - 1; j >= 0; --j) { - FLOAT const l = wsamp_l[0][j]; - FLOAT const r = wsamp_l[1][j]; - wsamp_l[0][j] = (l + r) * sqrt2_half; - wsamp_l[1][j] = (l - r) * sqrt2_half; - } - } - - /********************************************************************* - * compute energies - *********************************************************************/ - fftenergy[0] = wsamp_l[0][0]; - fftenergy[0] *= fftenergy[0]; - - for (j = BLKSIZE / 2 - 1; j >= 0; --j) { - FLOAT const re = (*wsamp_l)[BLKSIZE / 2 - j]; - FLOAT const im = (*wsamp_l)[BLKSIZE / 2 + j]; - fftenergy[BLKSIZE / 2 - j] = (re * re + im * im) * 0.5f; - } - /* total energy */ - { - FLOAT totalenergy = 0.0f; - for (j = 11; j < HBLKSIZE; j++) - totalenergy += fftenergy[j]; - - psv->tot_ener[chn] = totalenergy; - } - - if (plt) { - for (j = 0; j < HBLKSIZE; j++) { - plt->energy[gr_out][chn][j] = plt->energy_save[chn][j]; - plt->energy_save[chn][j] = fftenergy[j]; - } - } -} - - -static void -vbrpsy_compute_fft_s(lame_internal_flags const *gfc, const sample_t * const buffer[2], int chn, - int sblock, FLOAT(*fftenergy_s)[HBLKSIZE_s], FLOAT(*wsamp_s)[3][BLKSIZE_s]) -{ - int j; - - if (sblock == 0 && chn < 2) { - fft_short(gfc, *wsamp_s, chn, buffer); - } - if (chn == 2) { - FLOAT const sqrt2_half = SQRT2 * 0.5f; - /* FFT data for mid and side channel is derived from L & R */ - for (j = BLKSIZE_s - 1; j >= 0; --j) { - FLOAT const l = wsamp_s[0][sblock][j]; - FLOAT const r = wsamp_s[1][sblock][j]; - wsamp_s[0][sblock][j] = (l + r) * sqrt2_half; - wsamp_s[1][sblock][j] = (l - r) * sqrt2_half; - } - } - - /********************************************************************* - * compute energies - *********************************************************************/ - fftenergy_s[sblock][0] = (*wsamp_s)[sblock][0]; - fftenergy_s[sblock][0] *= fftenergy_s[sblock][0]; - for (j = BLKSIZE_s / 2 - 1; j >= 0; --j) { - FLOAT const re = (*wsamp_s)[sblock][BLKSIZE_s / 2 - j]; - FLOAT const im = (*wsamp_s)[sblock][BLKSIZE_s / 2 + j]; - fftenergy_s[sblock][BLKSIZE_s / 2 - j] = (re * re + im * im) * 0.5f; - } -} - - - /********************************************************************* - * compute loudness approximation (used for ATH auto-level adjustment) - *********************************************************************/ -static void -vbrpsy_compute_loudness_approximation_l(lame_internal_flags * gfc, int gr_out, int chn, - const FLOAT fftenergy[HBLKSIZE]) -{ - PsyStateVar_t *psv = &gfc->sv_psy; - if (chn < 2) { /*no loudness for mid/side ch */ - gfc->ov_psy.loudness_sq[gr_out][chn] = psv->loudness_sq_save[chn]; - psv->loudness_sq_save[chn] = psycho_loudness_approx(fftenergy, gfc->ATH->eql_w); - } -} - - - /********************************************************************** - * Apply HPF of fs/4 to the input signal. - * This is used for attack detection / handling. - **********************************************************************/ -static void -vbrpsy_attack_detection(lame_internal_flags * gfc, const sample_t * const buffer[2], int gr_out, - III_psy_ratio masking_ratio[2][2], III_psy_ratio masking_MS_ratio[2][2], - FLOAT energy[4], FLOAT sub_short_factor[4][3], int ns_attacks[4][4], - int uselongblock[2]) -{ - FLOAT ns_hpfsmpl[2][576]; - SessionConfig_t const *const cfg = &gfc->cfg; - PsyStateVar_t *const psv = &gfc->sv_psy; - plotting_data *plt = cfg->analysis ? gfc->pinfo : 0; - int const n_chn_out = cfg->channels_out; - /* chn=2 and 3 = Mid and Side channels */ - int const n_chn_psy = (cfg->mode == JOINT_STEREO) ? 4 : n_chn_out; - int chn, i, j; - - memset(&ns_hpfsmpl[0][0], 0, sizeof(ns_hpfsmpl)); - /* Don't copy the input buffer into a temporary buffer */ - /* unroll the loop 2 times */ - for (chn = 0; chn < n_chn_out; chn++) { - static const FLOAT fircoef[] = { - -8.65163e-18 * 2, -0.00851586 * 2, -6.74764e-18 * 2, 0.0209036 * 2, - -3.36639e-17 * 2, -0.0438162 * 2, -1.54175e-17 * 2, 0.0931738 * 2, - -5.52212e-17 * 2, -0.313819 * 2 - }; - /* apply high pass filter of fs/4 */ - const sample_t *const firbuf = &buffer[chn][576 - 350 - NSFIRLEN + 192]; - assert(dimension_of(fircoef) == ((NSFIRLEN - 1) / 2)); - for (i = 0; i < 576; i++) { - FLOAT sum1, sum2; - sum1 = firbuf[i + 10]; - sum2 = 0.0; - for (j = 0; j < ((NSFIRLEN - 1) / 2) - 1; j += 2) { - sum1 += fircoef[j] * (firbuf[i + j] + firbuf[i + NSFIRLEN - j]); - sum2 += fircoef[j + 1] * (firbuf[i + j + 1] + firbuf[i + NSFIRLEN - j - 1]); - } - ns_hpfsmpl[chn][i] = sum1 + sum2; - } - masking_ratio[gr_out][chn].en = psv->en[chn]; - masking_ratio[gr_out][chn].thm = psv->thm[chn]; - if (n_chn_psy > 2) { - /* MS maskings */ - /*percep_MS_entropy [chn-2] = gfc -> pe [chn]; */ - masking_MS_ratio[gr_out][chn].en = psv->en[chn + 2]; - masking_MS_ratio[gr_out][chn].thm = psv->thm[chn + 2]; - } - } - for (chn = 0; chn < n_chn_psy; chn++) { - FLOAT attack_intensity[12]; - FLOAT en_subshort[12]; - FLOAT en_short[4] = { 0, 0, 0, 0 }; - FLOAT const *pf = ns_hpfsmpl[chn & 1]; - int ns_uselongblock = 1; - - if (chn == 2) { - for (i = 0, j = 576; j > 0; ++i, --j) { - FLOAT const l = ns_hpfsmpl[0][i]; - FLOAT const r = ns_hpfsmpl[1][i]; - ns_hpfsmpl[0][i] = l + r; - ns_hpfsmpl[1][i] = l - r; - } - } - /*************************************************************** - * determine the block type (window type) - ***************************************************************/ - /* calculate energies of each sub-shortblocks */ - for (i = 0; i < 3; i++) { - en_subshort[i] = psv->last_en_subshort[chn][i + 6]; - assert(psv->last_en_subshort[chn][i + 4] > 0); - attack_intensity[i] = en_subshort[i] / psv->last_en_subshort[chn][i + 4]; - en_short[0] += en_subshort[i]; - } - - for (i = 0; i < 9; i++) { - FLOAT const *const pfe = pf + 576 / 9; - FLOAT p = 1.; - for (; pf < pfe; pf++) - if (p < fabs(*pf)) - p = fabs(*pf); - psv->last_en_subshort[chn][i] = en_subshort[i + 3] = p; - en_short[1 + i / 3] += p; - if (p > en_subshort[i + 3 - 2]) { - assert(en_subshort[i + 3 - 2] > 0); - p = p / en_subshort[i + 3 - 2]; - } - else if (en_subshort[i + 3 - 2] > p * 10.0f) { - assert(p > 0); - p = en_subshort[i + 3 - 2] / (p * 10.0f); - } - else { - p = 0.0; - } - attack_intensity[i + 3] = p; - } - - /* pulse like signal detection for fatboy.wav and so on */ - for (i = 0; i < 3; ++i) { - FLOAT const enn = - en_subshort[i * 3 + 3] + en_subshort[i * 3 + 4] + en_subshort[i * 3 + 5]; - FLOAT factor = 1.f; - if (en_subshort[i * 3 + 5] * 6 < enn) { - factor *= 0.5f; - if (en_subshort[i * 3 + 4] * 6 < enn) { - factor *= 0.5f; - } - } - sub_short_factor[chn][i] = factor; - } - - if (plt) { - FLOAT x = attack_intensity[0]; - for (i = 1; i < 12; i++) { - if (x < attack_intensity[i]) { - x = attack_intensity[i]; - } - } - plt->ers[gr_out][chn] = plt->ers_save[chn]; - plt->ers_save[chn] = x; - } - - /* compare energies between sub-shortblocks */ - { - FLOAT x = gfc->cd_psy->attack_threshold[chn]; - for (i = 0; i < 12; i++) { - if (ns_attacks[chn][i / 3] == 0) { - if (attack_intensity[i] > x) { - ns_attacks[chn][i / 3] = (i % 3) + 1; - } - } - } - } - /* should have energy change between short blocks, in order to avoid periodic signals */ - /* Good samples to show the effect are Trumpet test songs */ - /* GB: tuned (1) to avoid too many short blocks for test sample TRUMPET */ - /* RH: tuned (2) to let enough short blocks through for test sample FSOL and SNAPS */ - for (i = 1; i < 4; i++) { - FLOAT const u = en_short[i - 1]; - FLOAT const v = en_short[i]; - FLOAT const m = Max(u, v); - if (m < 40000) { /* (2) */ - if (u < 1.7f * v && v < 1.7f * u) { /* (1) */ - if (i == 1 && ns_attacks[chn][0] <= ns_attacks[chn][i]) { - ns_attacks[chn][0] = 0; - } - ns_attacks[chn][i] = 0; - } - } - } - - if (ns_attacks[chn][0] <= psv->last_attacks[chn]) { - ns_attacks[chn][0] = 0; - } - - if (psv->last_attacks[chn] == 3 || - ns_attacks[chn][0] + ns_attacks[chn][1] + ns_attacks[chn][2] + ns_attacks[chn][3]) { - ns_uselongblock = 0; - - if (ns_attacks[chn][1] && ns_attacks[chn][0]) { - ns_attacks[chn][1] = 0; - } - if (ns_attacks[chn][2] && ns_attacks[chn][1]) { - ns_attacks[chn][2] = 0; - } - if (ns_attacks[chn][3] && ns_attacks[chn][2]) { - ns_attacks[chn][3] = 0; - } - } - - if (chn < 2) { - uselongblock[chn] = ns_uselongblock; - } - else { - if (ns_uselongblock == 0) { - uselongblock[0] = uselongblock[1] = 0; - } - } - - /* there is a one granule delay. Copy maskings computed last call - * into masking_ratio to return to calling program. - */ - energy[chn] = psv->tot_ener[chn]; - } -} - - -static void -vbrpsy_skip_masking_s(lame_internal_flags * gfc, int chn, int sblock) -{ - if (sblock == 0) { - FLOAT *nbs2 = &gfc->sv_psy.nb_s2[chn][0]; - FLOAT *nbs1 = &gfc->sv_psy.nb_s1[chn][0]; - int const n = gfc->cd_psy->s.npart; - int b; - for (b = 0; b < n; b++) { - nbs2[b] = nbs1[b]; - } - } -} - - -static void -vbrpsy_calc_mask_index_s(lame_internal_flags const *gfc, FLOAT const *max, - FLOAT const *avg, unsigned char *mask_idx) -{ - PsyConst_CB2SB_t const *const gds = &gfc->cd_psy->s; - FLOAT m, a; - int b, k; - int const last_tab_entry = dimension_of(tab) - 1; - b = 0; - a = avg[b] + avg[b + 1]; - assert(a >= 0); - if (a > 0.0f) { - m = max[b]; - if (m < max[b + 1]) - m = max[b + 1]; - assert((gds->numlines[b] + gds->numlines[b + 1] - 1) > 0); - a = 20.0f * (m * 2.0f - a) - / (a * (gds->numlines[b] + gds->numlines[b + 1] - 1)); - k = (int) a; - if (k > last_tab_entry) - k = last_tab_entry; - mask_idx[b] = k; - } - else { - mask_idx[b] = 0; - } - - for (b = 1; b < gds->npart - 1; b++) { - a = avg[b - 1] + avg[b] + avg[b + 1]; - assert(b + 1 < gds->npart); - assert(a >= 0); - if (a > 0.0) { - m = max[b - 1]; - if (m < max[b]) - m = max[b]; - if (m < max[b + 1]) - m = max[b + 1]; - assert((gds->numlines[b - 1] + gds->numlines[b] + gds->numlines[b + 1] - 1) > 0); - a = 20.0f * (m * 3.0f - a) - / (a * (gds->numlines[b - 1] + gds->numlines[b] + gds->numlines[b + 1] - 1)); - k = (int) a; - if (k > last_tab_entry) - k = last_tab_entry; - mask_idx[b] = k; - } - else { - mask_idx[b] = 0; - } - } - assert(b > 0); - assert(b == gds->npart - 1); - - a = avg[b - 1] + avg[b]; - assert(a >= 0); - if (a > 0.0f) { - m = max[b - 1]; - if (m < max[b]) - m = max[b]; - assert((gds->numlines[b - 1] + gds->numlines[b] - 1) > 0); - a = 20.0f * (m * 2.0f - a) - / (a * (gds->numlines[b - 1] + gds->numlines[b] - 1)); - k = (int) a; - if (k > last_tab_entry) - k = last_tab_entry; - mask_idx[b] = k; - } - else { - mask_idx[b] = 0; - } - assert(b == (gds->npart - 1)); -} - - -static void -vbrpsy_compute_masking_s(lame_internal_flags * gfc, const FLOAT(*fftenergy_s)[HBLKSIZE_s], - FLOAT * eb, FLOAT * thr, int chn, int sblock) -{ - PsyStateVar_t *const psv = &gfc->sv_psy; - PsyConst_CB2SB_t const *const gds = &gfc->cd_psy->s; - FLOAT max[CBANDS], avg[CBANDS]; - int i, j, b; - unsigned char mask_idx_s[CBANDS]; - - memset(max, 0, sizeof(max)); - memset(avg, 0, sizeof(avg)); - - for (b = j = 0; b < gds->npart; ++b) { - FLOAT ebb = 0, m = 0; - int const n = gds->numlines[b]; - for (i = 0; i < n; ++i, ++j) { - FLOAT const el = fftenergy_s[sblock][j]; - ebb += el; - if (m < el) - m = el; - } - eb[b] = ebb; - assert(ebb >= 0); - max[b] = m; - assert(n > 0); - avg[b] = ebb * gds->rnumlines[b]; - assert(avg[b] >= 0); - } - assert(b == gds->npart); - assert(j == 129); - vbrpsy_calc_mask_index_s(gfc, max, avg, mask_idx_s); - for (j = b = 0; b < gds->npart; b++) { - int kk = gds->s3ind[b][0]; - int const last = gds->s3ind[b][1]; - int const delta = mask_add_delta(mask_idx_s[b]); - int dd, dd_n; - FLOAT x, ecb, avg_mask; - FLOAT const masking_lower = gds->masking_lower[b] * gfc->sv_qnt.masking_lower; - - dd = mask_idx_s[kk]; - dd_n = 1; - ecb = gds->s3[j] * eb[kk] * tab[mask_idx_s[kk]]; - ++j, ++kk; - while (kk <= last) { - dd += mask_idx_s[kk]; - dd_n += 1; - x = gds->s3[j] * eb[kk] * tab[mask_idx_s[kk]]; - ecb = vbrpsy_mask_add(ecb, x, kk - b, delta); - ++j, ++kk; - } - dd = (1 + 2 * dd) / (2 * dd_n); - avg_mask = tab[dd] * 0.5f; - ecb *= avg_mask; -#if 0 /* we can do PRE ECHO control now here, or do it later */ - if (psv->blocktype_old[chn & 0x01] == SHORT_TYPE) { - /* limit calculated threshold by even older granule */ - FLOAT const t1 = rpelev_s * psv->nb_s1[chn][b]; - FLOAT const t2 = rpelev2_s * psv->nb_s2[chn][b]; - FLOAT const tm = (t2 > 0) ? Min(ecb, t2) : ecb; - thr[b] = (t1 > 0) ? NS_INTERP(Min(tm, t1), ecb, 0.6) : ecb; - } - else { - /* limit calculated threshold by older granule */ - FLOAT const t1 = rpelev_s * psv->nb_s1[chn][b]; - thr[b] = (t1 > 0) ? NS_INTERP(Min(ecb, t1), ecb, 0.6) : ecb; - } -#else /* we do it later */ - thr[b] = ecb; -#endif - psv->nb_s2[chn][b] = psv->nb_s1[chn][b]; - psv->nb_s1[chn][b] = ecb; - { - /* if THR exceeds EB, the quantization routines will take the difference - * from other bands. in case of strong tonal samples (tonaltest.wav) - * this leads to heavy distortions. that's why we limit THR here. - */ - x = max[b]; - x *= gds->minval[b]; - x *= avg_mask; - if (thr[b] > x) { - thr[b] = x; - } - } - if (masking_lower > 1) { - thr[b] *= masking_lower; - } - if (thr[b] > eb[b]) { - thr[b] = eb[b]; - } - if (masking_lower < 1) { - thr[b] *= masking_lower; - } - - assert(thr[b] >= 0); - } - for (; b < CBANDS; ++b) { - eb[b] = 0; - thr[b] = 0; - } -} - - -static void -vbrpsy_compute_masking_l(lame_internal_flags * gfc, const FLOAT fftenergy[HBLKSIZE], - FLOAT eb_l[CBANDS], FLOAT thr[CBANDS], int chn) -{ - PsyStateVar_t *const psv = &gfc->sv_psy; - PsyConst_CB2SB_t const *const gdl = &gfc->cd_psy->l; - FLOAT max[CBANDS], avg[CBANDS]; - unsigned char mask_idx_l[CBANDS + 2]; - int k, b; - - /********************************************************************* - * Calculate the energy and the tonality of each partition. - *********************************************************************/ - calc_energy(gdl, fftenergy, eb_l, max, avg); - calc_mask_index_l(gfc, max, avg, mask_idx_l); - - /********************************************************************* - * convolve the partitioned energy and unpredictability - * with the spreading function, s3_l[b][k] - ********************************************************************/ - k = 0; - for (b = 0; b < gdl->npart; b++) { - FLOAT x, ecb, avg_mask, t; - FLOAT const masking_lower = gdl->masking_lower[b] * gfc->sv_qnt.masking_lower; - /* convolve the partitioned energy with the spreading function */ - int kk = gdl->s3ind[b][0]; - int const last = gdl->s3ind[b][1]; - int const delta = mask_add_delta(mask_idx_l[b]); - int dd = 0, dd_n = 0; - - dd = mask_idx_l[kk]; - dd_n += 1; - ecb = gdl->s3[k] * eb_l[kk] * tab[mask_idx_l[kk]]; - ++k, ++kk; - while (kk <= last) { - dd += mask_idx_l[kk]; - dd_n += 1; - x = gdl->s3[k] * eb_l[kk] * tab[mask_idx_l[kk]]; - t = vbrpsy_mask_add(ecb, x, kk - b, delta); -#if 0 - ecb += eb_l[kk]; - if (ecb > t) { - ecb = t; - } -#else - ecb = t; -#endif - ++k, ++kk; - } - dd = (1 + 2 * dd) / (2 * dd_n); - avg_mask = tab[dd] * 0.5f; - ecb *= avg_mask; - - /**** long block pre-echo control ****/ - /* dont use long block pre-echo control if previous granule was - * a short block. This is to avoid the situation: - * frame0: quiet (very low masking) - * frame1: surge (triggers short blocks) - * frame2: regular frame. looks like pre-echo when compared to - * frame0, but all pre-echo was in frame1. - */ - /* chn=0,1 L and R channels - chn=2,3 S and M channels. - */ - if (psv->blocktype_old[chn & 0x01] == SHORT_TYPE) { - FLOAT const ecb_limit = rpelev * psv->nb_l1[chn][b]; - if (ecb_limit > 0) { - thr[b] = Min(ecb, ecb_limit); - } - else { - /* Robert 071209: - Because we don't calculate long block psy when we know a granule - should be of short blocks, we don't have any clue how the granule - before would have looked like as a long block. So we have to guess - a little bit for this END_TYPE block. - Most of the time we get away with this sloppyness. (fingers crossed :) - The speed increase is worth it. - */ - thr[b] = Min(ecb, eb_l[b] * NS_PREECHO_ATT2); - } - } - else { - FLOAT ecb_limit_2 = rpelev2 * psv->nb_l2[chn][b]; - FLOAT ecb_limit_1 = rpelev * psv->nb_l1[chn][b]; - FLOAT ecb_limit; - if (ecb_limit_2 <= 0) { - ecb_limit_2 = ecb; - } - if (ecb_limit_1 <= 0) { - ecb_limit_1 = ecb; - } - if (psv->blocktype_old[chn & 0x01] == NORM_TYPE) { - ecb_limit = Min(ecb_limit_1, ecb_limit_2); - } - else { - ecb_limit = ecb_limit_1; - } - thr[b] = Min(ecb, ecb_limit); - } - psv->nb_l2[chn][b] = psv->nb_l1[chn][b]; - psv->nb_l1[chn][b] = ecb; - { - /* if THR exceeds EB, the quantization routines will take the difference - * from other bands. in case of strong tonal samples (tonaltest.wav) - * this leads to heavy distortions. that's why we limit THR here. - */ - x = max[b]; - x *= gdl->minval[b]; - x *= avg_mask; - if (thr[b] > x) { - thr[b] = x; - } - } - if (masking_lower > 1) { - thr[b] *= masking_lower; - } - if (thr[b] > eb_l[b]) { - thr[b] = eb_l[b]; - } - if (masking_lower < 1) { - thr[b] *= masking_lower; - } - assert(thr[b] >= 0); - } - for (; b < CBANDS; ++b) { - eb_l[b] = 0; - thr[b] = 0; - } -} - - -static void -vbrpsy_compute_block_type(SessionConfig_t const *cfg, int *uselongblock) -{ - int chn; - - if (cfg->short_blocks == short_block_coupled - /* force both channels to use the same block type */ - /* this is necessary if the frame is to be encoded in ms_stereo. */ - /* But even without ms_stereo, FhG does this */ - && !(uselongblock[0] && uselongblock[1])) - uselongblock[0] = uselongblock[1] = 0; - - for (chn = 0; chn < cfg->channels_out; chn++) { - /* disable short blocks */ - if (cfg->short_blocks == short_block_dispensed) { - uselongblock[chn] = 1; - } - if (cfg->short_blocks == short_block_forced) { - uselongblock[chn] = 0; - } - } -} - - -static void -vbrpsy_apply_block_type(PsyStateVar_t * psv, int nch, int const *uselongblock, int *blocktype_d) -{ - int chn; - - /* update the blocktype of the previous granule, since it depends on what - * happend in this granule */ - for (chn = 0; chn < nch; chn++) { - int blocktype = NORM_TYPE; - /* disable short blocks */ - - if (uselongblock[chn]) { - /* no attack : use long blocks */ - assert(psv->blocktype_old[chn] != START_TYPE); - if (psv->blocktype_old[chn] == SHORT_TYPE) - blocktype = STOP_TYPE; - } - else { - /* attack : use short blocks */ - blocktype = SHORT_TYPE; - if (psv->blocktype_old[chn] == NORM_TYPE) { - psv->blocktype_old[chn] = START_TYPE; - } - if (psv->blocktype_old[chn] == STOP_TYPE) - psv->blocktype_old[chn] = SHORT_TYPE; - } - - blocktype_d[chn] = psv->blocktype_old[chn]; /* value returned to calling program */ - psv->blocktype_old[chn] = blocktype; /* save for next call to l3psy_anal */ - } -} - - -/*************************************************************** - * compute M/S thresholds from Johnston & Ferreira 1992 ICASSP paper - ***************************************************************/ - -static void -vbrpsy_compute_MS_thresholds(const FLOAT eb[4][CBANDS], FLOAT thr[4][CBANDS], - const FLOAT cb_mld[CBANDS], const FLOAT ath_cb[CBANDS], FLOAT athlower, - FLOAT msfix, int n) -{ - FLOAT const msfix2 = msfix * 2.f; - FLOAT rside, rmid; - int b; - for (b = 0; b < n; ++b) { - FLOAT const ebM = eb[2][b]; - FLOAT const ebS = eb[3][b]; - FLOAT const thmL = thr[0][b]; - FLOAT const thmR = thr[1][b]; - FLOAT thmM = thr[2][b]; - FLOAT thmS = thr[3][b]; - - /* use this fix if L & R masking differs by 2db or less */ - /* if db = 10*log10(x2/x1) < 2 */ - /* if (x2 < 1.58*x1) { */ - if (thmL <= 1.58f * thmR && thmR <= 1.58f * thmL) { - FLOAT const mld_m = cb_mld[b] * ebS; - FLOAT const mld_s = cb_mld[b] * ebM; - FLOAT const tmp_m = Min(thmS, mld_m); - FLOAT const tmp_s = Min(thmM, mld_s); - rmid = Max(thmM, tmp_m); - rside = Max(thmS, tmp_s); - } - else { - rmid = thmM; - rside = thmS; - } - if (msfix > 0.f) { - /***************************************************************/ - /* Adjust M/S maskings if user set "msfix" */ - /***************************************************************/ - /* Naoki Shibata 2000 */ - FLOAT thmLR, thmMS; - FLOAT const ath = ath_cb[b] * athlower; - FLOAT const tmp_l = Max(thmL, ath); - FLOAT const tmp_r = Max(thmR, ath); - thmLR = Min(tmp_l, tmp_r); - thmM = Max(rmid, ath); - thmS = Max(rside, ath); - thmMS = thmM + thmS; - if (thmMS > 0.f && (thmLR * msfix2) < thmMS) { - FLOAT const f = thmLR * msfix2 / thmMS; - thmM *= f; - thmS *= f; - assert(thmMS > 0.f); - } - rmid = Min(thmM, rmid); - rside = Min(thmS, rside); - } - if (rmid > ebM) { - rmid = ebM; - } - if (rside > ebS) { - rside = ebS; - } - thr[2][b] = rmid; - thr[3][b] = rside; - } -} - - -/* - * NOTE: the bitrate reduction from the inter-channel masking effect is low - * compared to the chance of getting annyoing artefacts. L3psycho_anal_vbr does - * not use this feature. (Robert 071216) -*/ - -int -L3psycho_anal_vbr(lame_internal_flags * gfc, - const sample_t * const buffer[2], int gr_out, - III_psy_ratio masking_ratio[2][2], - III_psy_ratio masking_MS_ratio[2][2], - FLOAT percep_entropy[2], FLOAT percep_MS_entropy[2], - FLOAT energy[4], int blocktype_d[2]) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - PsyStateVar_t *const psv = &gfc->sv_psy; - PsyConst_CB2SB_t const *const gdl = &gfc->cd_psy->l; - PsyConst_CB2SB_t const *const gds = &gfc->cd_psy->s; - plotting_data *plt = cfg->analysis ? gfc->pinfo : 0; - - III_psy_xmin last_thm[4]; - - /* fft and energy calculation */ - FLOAT(*wsamp_l)[BLKSIZE]; - FLOAT(*wsamp_s)[3][BLKSIZE_s]; - FLOAT fftenergy[HBLKSIZE]; - FLOAT fftenergy_s[3][HBLKSIZE_s]; - FLOAT wsamp_L[2][BLKSIZE]; - FLOAT wsamp_S[2][3][BLKSIZE_s]; - FLOAT eb[4][CBANDS], thr[4][CBANDS]; - - FLOAT sub_short_factor[4][3]; - FLOAT thmm; - FLOAT const pcfact = 0.6f; - FLOAT const ath_factor = - (cfg->msfix > 0.f) ? (cfg->ATH_offset_factor * gfc->ATH->adjust_factor) : 1.f; - - const FLOAT(*const_eb)[CBANDS] = (const FLOAT(*)[CBANDS]) eb; - const FLOAT(*const_fftenergy_s)[HBLKSIZE_s] = (const FLOAT(*)[HBLKSIZE_s]) fftenergy_s; - - /* block type */ - int ns_attacks[4][4] = { {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} }; - int uselongblock[2]; - - /* usual variables like loop indices, etc.. */ - int chn, sb, sblock; - - /* chn=2 and 3 = Mid and Side channels */ - int const n_chn_psy = (cfg->mode == JOINT_STEREO) ? 4 : cfg->channels_out; - - memcpy(&last_thm[0], &psv->thm[0], sizeof(last_thm)); - - vbrpsy_attack_detection(gfc, buffer, gr_out, masking_ratio, masking_MS_ratio, energy, - sub_short_factor, ns_attacks, uselongblock); - - vbrpsy_compute_block_type(cfg, uselongblock); - - /* LONG BLOCK CASE */ - { - for (chn = 0; chn < n_chn_psy; chn++) { - int const ch01 = chn & 0x01; - - wsamp_l = wsamp_L + ch01; - vbrpsy_compute_fft_l(gfc, buffer, chn, gr_out, fftenergy, wsamp_l); - vbrpsy_compute_loudness_approximation_l(gfc, gr_out, chn, fftenergy); - vbrpsy_compute_masking_l(gfc, fftenergy, eb[chn], thr[chn], chn); - } - if (cfg->mode == JOINT_STEREO) { - if ((uselongblock[0] + uselongblock[1]) == 2) { - vbrpsy_compute_MS_thresholds(const_eb, thr, gdl->mld_cb, gfc->ATH->cb_l, - ath_factor, cfg->msfix, gdl->npart); - } - } - /* TODO: apply adaptive ATH masking here ?? */ - for (chn = 0; chn < n_chn_psy; chn++) { - convert_partition2scalefac_l(gfc, eb[chn], thr[chn], chn); - convert_partition2scalefac_l_to_s(gfc, eb[chn], thr[chn], chn); - } - } - /* SHORT BLOCKS CASE */ - { - int const force_short_block_calc = gfc->cd_psy->force_short_block_calc; - for (sblock = 0; sblock < 3; sblock++) { - for (chn = 0; chn < n_chn_psy; ++chn) { - int const ch01 = chn & 0x01; - if (uselongblock[ch01] && !force_short_block_calc) { - vbrpsy_skip_masking_s(gfc, chn, sblock); - } - else { - /* compute masking thresholds for short blocks */ - wsamp_s = wsamp_S + ch01; - vbrpsy_compute_fft_s(gfc, buffer, chn, sblock, fftenergy_s, wsamp_s); - vbrpsy_compute_masking_s(gfc, const_fftenergy_s, eb[chn], thr[chn], chn, - sblock); - } - } - if (cfg->mode == JOINT_STEREO) { - if ((uselongblock[0] + uselongblock[1]) == 0) { - vbrpsy_compute_MS_thresholds(const_eb, thr, gds->mld_cb, gfc->ATH->cb_s, - ath_factor, cfg->msfix, gds->npart); - } - } - /* TODO: apply adaptive ATH masking here ?? */ - for (chn = 0; chn < n_chn_psy; ++chn) { - int const ch01 = chn & 0x01; - if (!uselongblock[ch01] || force_short_block_calc) { - convert_partition2scalefac_s(gfc, eb[chn], thr[chn], chn, sblock); - } - } - } - - /**** short block pre-echo control ****/ - for (chn = 0; chn < n_chn_psy; chn++) { - for (sb = 0; sb < SBMAX_s; sb++) { - FLOAT new_thmm[3], prev_thm, t1, t2; - for (sblock = 0; sblock < 3; sblock++) { - thmm = psv->thm[chn].s[sb][sblock]; - thmm *= NS_PREECHO_ATT0; - - t1 = t2 = thmm; - - if (sblock > 0) { - prev_thm = new_thmm[sblock - 1]; - } - else { - prev_thm = last_thm[chn].s[sb][2]; - } - if (ns_attacks[chn][sblock] >= 2 || ns_attacks[chn][sblock + 1] == 1) { - t1 = NS_INTERP(prev_thm, thmm, NS_PREECHO_ATT1 * pcfact); - } - thmm = Min(t1, thmm); - if (ns_attacks[chn][sblock] == 1) { - t2 = NS_INTERP(prev_thm, thmm, NS_PREECHO_ATT2 * pcfact); - } - else if ((sblock == 0 && psv->last_attacks[chn] == 3) - || (sblock > 0 && ns_attacks[chn][sblock - 1] == 3)) { /* 2nd preceeding block */ - switch (sblock) { - case 0: - prev_thm = last_thm[chn].s[sb][1]; - break; - case 1: - prev_thm = last_thm[chn].s[sb][2]; - break; - case 2: - prev_thm = new_thmm[0]; - break; - } - t2 = NS_INTERP(prev_thm, thmm, NS_PREECHO_ATT2 * pcfact); - } - - thmm = Min(t1, thmm); - thmm = Min(t2, thmm); - - /* pulse like signal detection for fatboy.wav and so on */ - thmm *= sub_short_factor[chn][sblock]; - - new_thmm[sblock] = thmm; - } - for (sblock = 0; sblock < 3; sblock++) { - psv->thm[chn].s[sb][sblock] = new_thmm[sblock]; - } - } - } - } - for (chn = 0; chn < n_chn_psy; chn++) { - psv->last_attacks[chn] = ns_attacks[chn][2]; - } - - - /*************************************************************** - * determine final block type - ***************************************************************/ - vbrpsy_apply_block_type(psv, cfg->channels_out, uselongblock, blocktype_d); - - /********************************************************************* - * compute the value of PE to return ... no delay and advance - *********************************************************************/ - for (chn = 0; chn < n_chn_psy; chn++) { - FLOAT *ppe; - int type; - III_psy_ratio const *mr; - - if (chn > 1) { - ppe = percep_MS_entropy - 2; - type = NORM_TYPE; - if (blocktype_d[0] == SHORT_TYPE || blocktype_d[1] == SHORT_TYPE) - type = SHORT_TYPE; - mr = &masking_MS_ratio[gr_out][chn - 2]; - } - else { - ppe = percep_entropy; - type = blocktype_d[chn]; - mr = &masking_ratio[gr_out][chn]; - } - if (type == SHORT_TYPE) { - ppe[chn] = pecalc_s(mr, gfc->sv_qnt.masking_lower); - } - else { - ppe[chn] = pecalc_l(mr, gfc->sv_qnt.masking_lower); - } - - if (plt) { - plt->pe[gr_out][chn] = ppe[chn]; - } - } - return 0; -} - - - - -/* - * The spreading function. Values returned in units of energy - */ -static FLOAT -s3_func(FLOAT bark) -{ - FLOAT tempx, x, tempy, temp; - tempx = bark; - if (tempx >= 0) - tempx *= 3; - else - tempx *= 1.5; - - if (tempx >= 0.5 && tempx <= 2.5) { - temp = tempx - 0.5; - x = 8.0 * (temp * temp - 2.0 * temp); - } - else - x = 0.0; - tempx += 0.474; - tempy = 15.811389 + 7.5 * tempx - 17.5 * sqrt(1.0 + tempx * tempx); - - if (tempy <= -60.0) - return 0.0; - - tempx = exp((x + tempy) * LN_TO_LOG10); - - /* Normalization. The spreading function should be normalized so that: - +inf - / - | s3 [ bark ] d(bark) = 1 - / - -inf - */ - tempx /= .6609193; - return tempx; -} - -#if 0 -static FLOAT -norm_s3_func(void) -{ - double lim_a = 0, lim_b = 0; - double x = 0, l, h; - for (x = 0; s3_func(x) > 1e-20; x -= 1); - l = x; - h = 0; - while (fabs(h - l) > 1e-12) { - x = (h + l) / 2; - if (s3_func(x) > 0) { - h = x; - } - else { - l = x; - } - } - lim_a = l; - for (x = 0; s3_func(x) > 1e-20; x += 1); - l = 0; - h = x; - while (fabs(h - l) > 1e-12) { - x = (h + l) / 2; - if (s3_func(x) > 0) { - l = x; - } - else { - h = x; - } - } - lim_b = h; - { - double sum = 0; - int const m = 1000; - int i; - for (i = 0; i <= m; ++i) { - double x = lim_a + i * (lim_b - lim_a) / m; - double y = s3_func(x); - sum += y; - } - { - double norm = (m + 1) / (sum * (lim_b - lim_a)); - /*printf( "norm = %lf\n",norm); */ - return norm; - } - } -} -#endif - -static FLOAT -stereo_demask(double f) -{ - /* setup stereo demasking thresholds */ - /* formula reverse enginerred from plot in paper */ - double arg = freq2bark(f); - arg = (Min(arg, 15.5) / 15.5); - - return pow(10.0, 1.25 * (1 - cos(PI * arg)) - 2.5); -} - -static void -init_numline(PsyConst_CB2SB_t * gd, FLOAT sfreq, int fft_size, - int mdct_size, int sbmax, int const *scalepos) -{ - FLOAT b_frq[CBANDS + 1]; - FLOAT const mdct_freq_frac = sfreq / (2.0f * mdct_size); - FLOAT const deltafreq = fft_size / (2.0f * mdct_size); - int partition[HBLKSIZE] = { 0 }; - int i, j, ni; - int sfb; - sfreq /= fft_size; - j = 0; - ni = 0; - /* compute numlines, the number of spectral lines in each partition band */ - /* each partition band should be about DELBARK wide. */ - for (i = 0; i < CBANDS; i++) { - FLOAT bark1; - int j2, nl; - bark1 = freq2bark(sfreq * j); - - b_frq[i] = sfreq * j; - - for (j2 = j; freq2bark(sfreq * j2) - bark1 < DELBARK && j2 <= fft_size / 2; j2++); - - nl = j2 - j; - gd->numlines[i] = nl; - gd->rnumlines[i] = (nl > 0) ? (1.0f / nl) : 0; - - ni = i + 1; - - while (j < j2) { - assert(j < HBLKSIZE); - partition[j++] = i; - } - if (j > fft_size / 2) { - j = fft_size / 2; - ++i; - break; - } - } - assert(i < CBANDS); - b_frq[i] = sfreq * j; - - gd->n_sb = sbmax; - gd->npart = ni; - - { - j = 0; - for (i = 0; i < gd->npart; i++) { - int const nl = gd->numlines[i]; - FLOAT const freq = sfreq * (j + nl / 2); - gd->mld_cb[i] = stereo_demask(freq); - j += nl; - } - for (; i < CBANDS; ++i) { - gd->mld_cb[i] = 1; - } - } - for (sfb = 0; sfb < sbmax; sfb++) { - int i1, i2, bo; - int start = scalepos[sfb]; - int end = scalepos[sfb + 1]; - - i1 = floor(.5 + deltafreq * (start - .5)); - if (i1 < 0) - i1 = 0; - i2 = floor(.5 + deltafreq * (end - .5)); - - if (i2 > fft_size / 2) - i2 = fft_size / 2; - - bo = partition[i2]; - gd->bm[sfb] = (partition[i1] + partition[i2]) / 2; - gd->bo[sfb] = bo; - - /* calculate how much of this band belongs to current scalefactor band */ - { - FLOAT const f_tmp = mdct_freq_frac * end; - FLOAT bo_w = (f_tmp - b_frq[bo]) / (b_frq[bo + 1] - b_frq[bo]); - if (bo_w < 0) { - bo_w = 0; - } - else { - if (bo_w > 1) { - bo_w = 1; - } - } - gd->bo_weight[sfb] = bo_w; - } - gd->mld[sfb] = stereo_demask(mdct_freq_frac * start); - } -} - -static void -compute_bark_values(PsyConst_CB2SB_t const *gd, FLOAT sfreq, int fft_size, - FLOAT * bval, FLOAT * bval_width) -{ - /* compute bark values of each critical band */ - int k, j = 0, ni = gd->npart; - sfreq /= fft_size; - for (k = 0; k < ni; k++) { - int const w = gd->numlines[k]; - FLOAT bark1, bark2; - - bark1 = freq2bark(sfreq * (j)); - bark2 = freq2bark(sfreq * (j + w - 1)); - bval[k] = .5 * (bark1 + bark2); - - bark1 = freq2bark(sfreq * (j - .5)); - bark2 = freq2bark(sfreq * (j + w - .5)); - bval_width[k] = bark2 - bark1; - j += w; - } -} - -static int -init_s3_values(FLOAT ** p, int (*s3ind)[2], int npart, - FLOAT const *bval, FLOAT const *bval_width, FLOAT const *norm) -{ - FLOAT s3[CBANDS][CBANDS]; - /* The s3 array is not linear in the bark scale. - * bval[x] should be used to get the bark value. - */ - int i, j, k; - int numberOfNoneZero = 0; - - memset(&s3[0][0], 0, sizeof(s3)); - - /* s[i][j], the value of the spreading function, - * centered at band j (masker), for band i (maskee) - * - * i.e.: sum over j to spread into signal barkval=i - * NOTE: i and j are used opposite as in the ISO docs - */ - for (i = 0; i < npart; i++) { - for (j = 0; j < npart; j++) { - FLOAT v = s3_func(bval[i] - bval[j]) * bval_width[j]; - s3[i][j] = v * norm[i]; - } - } - for (i = 0; i < npart; i++) { - for (j = 0; j < npart; j++) { - if (s3[i][j] > 0.0f) - break; - } - s3ind[i][0] = j; - - for (j = npart - 1; j > 0; j--) { - if (s3[i][j] > 0.0f) - break; - } - s3ind[i][1] = j; - numberOfNoneZero += (s3ind[i][1] - s3ind[i][0] + 1); - } - *p = lame_calloc(FLOAT, numberOfNoneZero); - if (!*p) - return -1; - - k = 0; - for (i = 0; i < npart; i++) - for (j = s3ind[i][0]; j <= s3ind[i][1]; j++) - (*p)[k++] = s3[i][j]; - - return 0; -} - -int -psymodel_init(lame_global_flags const *gfp) -{ - lame_internal_flags *const gfc = gfp->internal_flags; - SessionConfig_t *const cfg = &gfc->cfg; - PsyStateVar_t *const psv = &gfc->sv_psy; - PsyConst_t *gd; - int i, j, b, sb, k; - FLOAT bvl_a = 13, bvl_b = 24; - FLOAT snr_l_a = 0, snr_l_b = 0; - FLOAT snr_s_a = -8.25, snr_s_b = -4.5; - - FLOAT bval[CBANDS]; - FLOAT bval_width[CBANDS]; - FLOAT norm[CBANDS]; - FLOAT const sfreq = cfg->samplerate_out; - - FLOAT xav = 10, xbv = 12; - FLOAT const minval_low = (0.f - cfg->minval); - - if (gfc->cd_psy != 0) { - return 0; - } - memset(norm, 0, sizeof(norm)); - - gd = lame_calloc(PsyConst_t, 1); - gfc->cd_psy = gd; - - gd->force_short_block_calc = gfp->experimentalZ; - - psv->blocktype_old[0] = psv->blocktype_old[1] = NORM_TYPE; /* the vbr header is long blocks */ - - for (i = 0; i < 4; ++i) { - for (j = 0; j < CBANDS; ++j) { - psv->nb_l1[i][j] = 1e20; - psv->nb_l2[i][j] = 1e20; - psv->nb_s1[i][j] = psv->nb_s2[i][j] = 1.0; - } - for (sb = 0; sb < SBMAX_l; sb++) { - psv->en[i].l[sb] = 1e20; - psv->thm[i].l[sb] = 1e20; - } - for (j = 0; j < 3; ++j) { - for (sb = 0; sb < SBMAX_s; sb++) { - psv->en[i].s[sb][j] = 1e20; - psv->thm[i].s[sb][j] = 1e20; - } - psv->last_attacks[i] = 0; - } - for (j = 0; j < 9; j++) - psv->last_en_subshort[i][j] = 10.; - } - - - /* init. for loudness approx. -jd 2001 mar 27 */ - psv->loudness_sq_save[0] = psv->loudness_sq_save[1] = 0.0; - - - - /************************************************************************* - * now compute the psychoacoustic model specific constants - ************************************************************************/ - /* compute numlines, bo, bm, bval, bval_width, mld */ - init_numline(&gd->l, sfreq, BLKSIZE, 576, SBMAX_l, gfc->scalefac_band.l); - assert(gd->l.npart < CBANDS); - compute_bark_values(&gd->l, sfreq, BLKSIZE, bval, bval_width); - - /* compute the spreading function */ - for (i = 0; i < gd->l.npart; i++) { - double snr = snr_l_a; - if (bval[i] >= bvl_a) { - snr = snr_l_b * (bval[i] - bvl_a) / (bvl_b - bvl_a) - + snr_l_a * (bvl_b - bval[i]) / (bvl_b - bvl_a); - } - norm[i] = pow(10.0, snr / 10.0); - } - i = init_s3_values(&gd->l.s3, gd->l.s3ind, gd->l.npart, bval, bval_width, norm); - if (i) - return i; - - /* compute long block specific values, ATH and MINVAL */ - j = 0; - for (i = 0; i < gd->l.npart; i++) { - double x; - - /* ATH */ - x = FLOAT_MAX; - for (k = 0; k < gd->l.numlines[i]; k++, j++) { - FLOAT const freq = sfreq * j / (1000.0 * BLKSIZE); - FLOAT level; - /* freq = Min(.1,freq); *//* ATH below 100 Hz constant, not further climbing */ - level = ATHformula(cfg, freq * 1000) - 20; /* scale to FFT units; returned value is in dB */ - level = pow(10., 0.1 * level); /* convert from dB -> energy */ - level *= gd->l.numlines[i]; - if (x > level) - x = level; - } - gfc->ATH->cb_l[i] = x; - - /* MINVAL. - For low freq, the strength of the masking is limited by minval - this is an ISO MPEG1 thing, dont know if it is really needed */ - /* FIXME: it does work to reduce low-freq problems in S53-Wind-Sax - and lead-voice samples, but introduces some 3 kbps bit bloat too. - TODO: Further refinement of the shape of this hack. - */ - x = 20.0 * (bval[i] / xav - 1.0); - if (x > 6) { - x = 30; - } - if (x < minval_low) { - x = minval_low; - } - if (cfg->samplerate_out < 44000) { - x = 30; - } - x -= 8.; - gd->l.minval[i] = pow(10.0, x / 10.) * gd->l.numlines[i]; - } - - /************************************************************************ - * do the same things for short blocks - ************************************************************************/ - init_numline(&gd->s, sfreq, BLKSIZE_s, 192, SBMAX_s, gfc->scalefac_band.s); - assert(gd->s.npart < CBANDS); - compute_bark_values(&gd->s, sfreq, BLKSIZE_s, bval, bval_width); - - /* SNR formula. short block is normalized by SNR. is it still right ? */ - j = 0; - for (i = 0; i < gd->s.npart; i++) { - double x; - double snr = snr_s_a; - if (bval[i] >= bvl_a) { - snr = snr_s_b * (bval[i] - bvl_a) / (bvl_b - bvl_a) - + snr_s_a * (bvl_b - bval[i]) / (bvl_b - bvl_a); - } - norm[i] = pow(10.0, snr / 10.0); - - /* ATH */ - x = FLOAT_MAX; - for (k = 0; k < gd->s.numlines[i]; k++, j++) { - FLOAT const freq = sfreq * j / (1000.0 * BLKSIZE_s); - FLOAT level; - /* freq = Min(.1,freq); *//* ATH below 100 Hz constant, not further climbing */ - level = ATHformula(cfg, freq * 1000) - 20; /* scale to FFT units; returned value is in dB */ - level = pow(10., 0.1 * level); /* convert from dB -> energy */ - level *= gd->s.numlines[i]; - if (x > level) - x = level; - } - gfc->ATH->cb_s[i] = x; - - /* MINVAL. - For low freq, the strength of the masking is limited by minval - this is an ISO MPEG1 thing, dont know if it is really needed */ - x = 7.0 * (bval[i] / xbv - 1.0); - if (bval[i] > xbv) { - x *= 1 + log(1 + x) * 3.1; - } - if (bval[i] < xbv) { - x *= 1 + log(1 - x) * 2.3; - } - if (x > 6) { - x = 30; - } - if (x < minval_low) { - x = minval_low; - } - if (cfg->samplerate_out < 44000) { - x = 30; - } - x -= 8; - gd->s.minval[i] = pow(10.0, x / 10) * gd->s.numlines[i]; - } - - i = init_s3_values(&gd->s.s3, gd->s.s3ind, gd->s.npart, bval, bval_width, norm); - if (i) - return i; - - - init_mask_add_max_values(); - init_fft(gfc); - - /* setup temporal masking */ - gd->decay = exp(-1.0 * LOG10 / (temporalmask_sustain_sec * sfreq / 192.0)); - - { - FLOAT msfix; - msfix = NS_MSFIX; - if (cfg->use_safe_joint_stereo) - msfix = 1.0; - if (fabs(cfg->msfix) > 0.0) - msfix = cfg->msfix; - cfg->msfix = msfix; - - /* spread only from npart_l bands. Normally, we use the spreading - * function to convolve from npart_l down to npart_l bands - */ - for (b = 0; b < gd->l.npart; b++) - if (gd->l.s3ind[b][1] > gd->l.npart - 1) - gd->l.s3ind[b][1] = gd->l.npart - 1; - } - - /* prepare for ATH auto adjustment: - * we want to decrease the ATH by 12 dB per second - */ -#define frame_duration (576. * cfg->mode_gr / sfreq) - gfc->ATH->decay = pow(10., -12. / 10. * frame_duration); - gfc->ATH->adjust_factor = 0.01; /* minimum, for leading low loudness */ - gfc->ATH->adjust_limit = 1.0; /* on lead, allow adjust up to maximum */ -#undef frame_duration - - assert(gd->l.bo[SBMAX_l - 1] <= gd->l.npart); - assert(gd->s.bo[SBMAX_s - 1] <= gd->s.npart); - - if (cfg->ATHtype != -1) { - /* compute equal loudness weights (eql_w) */ - FLOAT freq; - FLOAT const freq_inc = (FLOAT) cfg->samplerate_out / (FLOAT) (BLKSIZE); - FLOAT eql_balance = 0.0; - freq = 0.0; - for (i = 0; i < BLKSIZE / 2; ++i) { - /* convert ATH dB to relative power (not dB) */ - /* to determine eql_w */ - freq += freq_inc; - gfc->ATH->eql_w[i] = 1. / pow(10, ATHformula(cfg, freq) / 10); - eql_balance += gfc->ATH->eql_w[i]; - } - eql_balance = 1.0 / eql_balance; - for (i = BLKSIZE / 2; --i >= 0;) { /* scale weights */ - gfc->ATH->eql_w[i] *= eql_balance; - } - } - { - for (b = j = 0; b < gd->s.npart; ++b) { - for (i = 0; i < gd->s.numlines[b]; ++i) { - ++j; - } - } - assert(j == 129); - for (b = j = 0; b < gd->l.npart; ++b) { - for (i = 0; i < gd->l.numlines[b]; ++i) { - ++j; - } - } - assert(j == 513); - } - /* short block attack threshold */ - { - float x = gfp->attackthre; - float y = gfp->attackthre_s; - if (x < 0) { - x = NSATTACKTHRE; - } - if (y < 0) { - y = NSATTACKTHRE_S; - } - gd->attack_threshold[0] = gd->attack_threshold[1] = gd->attack_threshold[2] = x; - gd->attack_threshold[3] = y; - } - { - float sk_s = -10.f, sk_l = -4.7f; - static float const sk[] = - { -7.4, -7.4, -7.4, -9.5, -7.4, -6.1, -5.5, -4.7, -4.7, -4.7, -4.7 }; - if (gfp->VBR_q < 4) { - sk_l = sk_s = sk[0]; - } - else { - sk_l = sk_s = sk[gfp->VBR_q] + gfp->VBR_q_frac * (sk[gfp->VBR_q] - sk[gfp->VBR_q + 1]); - } - b = 0; - for (; b < gd->s.npart; b++) { - float m = (float) (gd->s.npart - b) / gd->s.npart; - gd->s.masking_lower[b] = powf(10.f, sk_s * m * 0.1f); - } - for (; b < CBANDS; ++b) { - gd->s.masking_lower[b] = 1.f; - } - b = 0; - for (; b < gd->l.npart; b++) { - float m = (float) (gd->l.npart - b) / gd->l.npart; - gd->l.masking_lower[b] = powf(10.f, sk_l * m * 0.1f); - } - for (; b < CBANDS; ++b) { - gd->l.masking_lower[b] = 1.f; - } - } - memcpy(&gd->l_to_s, &gd->l, sizeof(gd->l_to_s)); - init_numline(&gd->l_to_s, sfreq, BLKSIZE, 192, SBMAX_s, gfc->scalefac_band.s); - return 0; -} diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/psymodel.h b/recorderlib/src/main/jni/lame-3.100_libmp3lame/psymodel.h deleted file mode 100644 index f46083c..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/psymodel.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * psymodel.h - * - * Copyright (c) 1999 Mark Taylor - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef LAME_PSYMODEL_H -#define LAME_PSYMODEL_H - - -int L3psycho_anal_ns(lame_internal_flags * gfc, - const sample_t *const buffer[2], int gr, - III_psy_ratio ratio[2][2], - III_psy_ratio MS_ratio[2][2], - FLOAT pe[2], FLOAT pe_MS[2], FLOAT ener[2], int blocktype_d[2]); - -int L3psycho_anal_vbr(lame_internal_flags * gfc, - const sample_t *const buffer[2], int gr, - III_psy_ratio ratio[2][2], - III_psy_ratio MS_ratio[2][2], - FLOAT pe[2], FLOAT pe_MS[2], FLOAT ener[2], int blocktype_d[2]); - - -int psymodel_init(lame_global_flags const* gfp); - - -#define rpelev 2 -#define rpelev2 16 -#define rpelev_s 2 -#define rpelev2_s 16 - -/* size of each partition band, in barks: */ -#define DELBARK .34 - - -/* tuned for output level (sensitive to energy scale) */ -#define VO_SCALE (1./( 14752*14752 )/(BLKSIZE/2)) - -#define temporalmask_sustain_sec 0.01 - -#define NS_PREECHO_ATT0 0.8 -#define NS_PREECHO_ATT1 0.6 -#define NS_PREECHO_ATT2 0.3 - -#define NS_MSFIX 3.5 -#define NSATTACKTHRE 4.4 -#define NSATTACKTHRE_S 25 - -#endif /* LAME_PSYMODEL_H */ diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/quantize.c b/recorderlib/src/main/jni/lame-3.100_libmp3lame/quantize.c deleted file mode 100644 index 9ba9c16..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/quantize.c +++ /dev/null @@ -1,2050 +0,0 @@ -/* - * MP3 quantization - * - * Copyright (c) 1999-2000 Mark Taylor - * Copyright (c) 1999-2003 Takehiro Tominaga - * Copyright (c) 2000-2011 Robert Hegemann - * Copyright (c) 2001-2005 Gabriel Bouvigne - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* $Id: quantize.c,v 1.219 2017/08/02 19:48:05 robert Exp $ */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include "lame.h" -#include "machine.h" -#include "encoder.h" -#include "util.h" -#include "quantize_pvt.h" -#include "reservoir.h" -#include "bitstream.h" -#include "vbrquantize.h" -#include "quantize.h" -#ifdef HAVE_XMMINTRIN_H -#include "vector/lame_intrin.h" -#endif - - - - -/* convert from L/R <-> Mid/Side */ -static void -ms_convert(III_side_info_t * l3_side, int gr) -{ - int i; - for (i = 0; i < 576; ++i) { - FLOAT l, r; - l = l3_side->tt[gr][0].xr[i]; - r = l3_side->tt[gr][1].xr[i]; - l3_side->tt[gr][0].xr[i] = (l + r) * (FLOAT) (SQRT2 * 0.5); - l3_side->tt[gr][1].xr[i] = (l - r) * (FLOAT) (SQRT2 * 0.5); - } -} - -/************************************************************************ - * - * init_outer_loop() - * mt 6/99 - * - * initializes cod_info, scalefac and xrpow - * - * returns 0 if all energies in xr are zero, else 1 - * - ************************************************************************/ - -static void -init_xrpow_core_c(gr_info * const cod_info, FLOAT xrpow[576], int upper, FLOAT * sum) -{ - int i; - FLOAT tmp; - *sum = 0; - for (i = 0; i <= upper; ++i) { - tmp = fabs(cod_info->xr[i]); - *sum += tmp; - xrpow[i] = sqrt(tmp * sqrt(tmp)); - - if (xrpow[i] > cod_info->xrpow_max) - cod_info->xrpow_max = xrpow[i]; - } -} - - - - - -void -init_xrpow_core_init(lame_internal_flags * const gfc) -{ - gfc->init_xrpow_core = init_xrpow_core_c; - -#if defined(HAVE_XMMINTRIN_H) - if (gfc->CPU_features.SSE) - gfc->init_xrpow_core = init_xrpow_core_sse; -#endif -#ifndef HAVE_NASM -#ifdef MIN_ARCH_SSE - gfc->init_xrpow_core = init_xrpow_core_sse; -#endif -#endif -} - - - -static int -init_xrpow(lame_internal_flags * gfc, gr_info * const cod_info, FLOAT xrpow[576]) -{ - FLOAT sum = 0; - int i; - int const upper = cod_info->max_nonzero_coeff; - - assert(xrpow != NULL); - cod_info->xrpow_max = 0; - - /* check if there is some energy we have to quantize - * and calculate xrpow matching our fresh scalefactors - */ - assert(0 <= upper && upper <= 575); - memset(&(xrpow[upper]), 0, (576 - upper) * sizeof(xrpow[0])); - - - gfc->init_xrpow_core(cod_info, xrpow, upper, &sum); - - /* return 1 if we have something to quantize, else 0 - */ - if (sum > (FLOAT) 1E-20) { - int j = 0; - if (gfc->sv_qnt.substep_shaping & 2) - j = 1; - - for (i = 0; i < cod_info->psymax; i++) - gfc->sv_qnt.pseudohalf[i] = j; - - return 1; - } - - memset(&cod_info->l3_enc[0], 0, sizeof(int) * 576); - return 0; -} - - - - - -/* -Gabriel Bouvigne feb/apr 2003 -Analog silence detection in partitionned sfb21 -or sfb12 for short blocks - -From top to bottom of sfb, changes to 0 -coeffs which are below ath. It stops on the first -coeff higher than ath. -*/ -static void -psfb21_analogsilence(lame_internal_flags const *gfc, gr_info * const cod_info) -{ - ATH_t const *const ATH = gfc->ATH; - FLOAT *const xr = cod_info->xr; - - if (cod_info->block_type != SHORT_TYPE) { /* NORM, START or STOP type, but not SHORT blocks */ - int gsfb; - int stop = 0; - for (gsfb = PSFB21 - 1; gsfb >= 0 && !stop; gsfb--) { - int const start = gfc->scalefac_band.psfb21[gsfb]; - int const end = gfc->scalefac_band.psfb21[gsfb + 1]; - int j; - FLOAT ath21; - ath21 = athAdjust(ATH->adjust_factor, ATH->psfb21[gsfb], ATH->floor, 0); - - if (gfc->sv_qnt.longfact[21] > 1e-12f) - ath21 *= gfc->sv_qnt.longfact[21]; - - for (j = end - 1; j >= start; j--) { - if (fabs(xr[j]) < ath21) - xr[j] = 0; - else { - stop = 1; - break; - } - } - } - } - else { - /*note: short blocks coeffs are reordered */ - int block; - for (block = 0; block < 3; block++) { - - int gsfb; - int stop = 0; - for (gsfb = PSFB12 - 1; gsfb >= 0 && !stop; gsfb--) { - int const start = gfc->scalefac_band.s[12] * 3 + - (gfc->scalefac_band.s[13] - gfc->scalefac_band.s[12]) * block + - (gfc->scalefac_band.psfb12[gsfb] - gfc->scalefac_band.psfb12[0]); - int const end = - start + (gfc->scalefac_band.psfb12[gsfb + 1] - gfc->scalefac_band.psfb12[gsfb]); - int j; - FLOAT ath12; - ath12 = athAdjust(ATH->adjust_factor, ATH->psfb12[gsfb], ATH->floor, 0); - - if (gfc->sv_qnt.shortfact[12] > 1e-12f) - ath12 *= gfc->sv_qnt.shortfact[12]; - - for (j = end - 1; j >= start; j--) { - if (fabs(xr[j]) < ath12) - xr[j] = 0; - else { - stop = 1; - break; - } - } - } - } - } - -} - - - - - -static void -init_outer_loop(lame_internal_flags const *gfc, gr_info * const cod_info) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - int sfb, j; - /* initialize fresh cod_info - */ - cod_info->part2_3_length = 0; - cod_info->big_values = 0; - cod_info->count1 = 0; - cod_info->global_gain = 210; - cod_info->scalefac_compress = 0; - /* mixed_block_flag, block_type was set in psymodel.c */ - cod_info->table_select[0] = 0; - cod_info->table_select[1] = 0; - cod_info->table_select[2] = 0; - cod_info->subblock_gain[0] = 0; - cod_info->subblock_gain[1] = 0; - cod_info->subblock_gain[2] = 0; - cod_info->subblock_gain[3] = 0; /* this one is always 0 */ - cod_info->region0_count = 0; - cod_info->region1_count = 0; - cod_info->preflag = 0; - cod_info->scalefac_scale = 0; - cod_info->count1table_select = 0; - cod_info->part2_length = 0; - if (cfg->samplerate_out <= 8000) { - cod_info->sfb_lmax = 17; - cod_info->sfb_smin = 9; - cod_info->psy_lmax = 17; - } - else { - cod_info->sfb_lmax = SBPSY_l; - cod_info->sfb_smin = SBPSY_s; - cod_info->psy_lmax = gfc->sv_qnt.sfb21_extra ? SBMAX_l : SBPSY_l; - } - cod_info->psymax = cod_info->psy_lmax; - cod_info->sfbmax = cod_info->sfb_lmax; - cod_info->sfbdivide = 11; - for (sfb = 0; sfb < SBMAX_l; sfb++) { - cod_info->width[sfb] - = gfc->scalefac_band.l[sfb + 1] - gfc->scalefac_band.l[sfb]; - cod_info->window[sfb] = 3; /* which is always 0. */ - } - if (cod_info->block_type == SHORT_TYPE) { - FLOAT ixwork[576]; - FLOAT *ix; - - cod_info->sfb_smin = 0; - cod_info->sfb_lmax = 0; - if (cod_info->mixed_block_flag) { - /* - * MPEG-1: sfbs 0-7 long block, 3-12 short blocks - * MPEG-2(.5): sfbs 0-5 long block, 3-12 short blocks - */ - cod_info->sfb_smin = 3; - cod_info->sfb_lmax = cfg->mode_gr * 2 + 4; - } - if (cfg->samplerate_out <= 8000) { - cod_info->psymax - = cod_info->sfb_lmax - + 3 * (9 - cod_info->sfb_smin); - cod_info->sfbmax = cod_info->sfb_lmax + 3 * (9 - cod_info->sfb_smin); - } - else { - cod_info->psymax - = cod_info->sfb_lmax - + 3 * ((gfc->sv_qnt.sfb21_extra ? SBMAX_s : SBPSY_s) - cod_info->sfb_smin); - cod_info->sfbmax = cod_info->sfb_lmax + 3 * (SBPSY_s - cod_info->sfb_smin); - } - cod_info->sfbdivide = cod_info->sfbmax - 18; - cod_info->psy_lmax = cod_info->sfb_lmax; - /* re-order the short blocks, for more efficient encoding below */ - /* By Takehiro TOMINAGA */ - /* - Within each scalefactor band, data is given for successive - time windows, beginning with window 0 and ending with window 2. - Within each window, the quantized values are then arranged in - order of increasing frequency... - */ - ix = &cod_info->xr[gfc->scalefac_band.l[cod_info->sfb_lmax]]; - memcpy(ixwork, cod_info->xr, 576 * sizeof(FLOAT)); - for (sfb = cod_info->sfb_smin; sfb < SBMAX_s; sfb++) { - int const start = gfc->scalefac_band.s[sfb]; - int const end = gfc->scalefac_band.s[sfb + 1]; - int window, l; - for (window = 0; window < 3; window++) { - for (l = start; l < end; l++) { - *ix++ = ixwork[3 * l + window]; - } - } - } - - j = cod_info->sfb_lmax; - for (sfb = cod_info->sfb_smin; sfb < SBMAX_s; sfb++) { - cod_info->width[j] = cod_info->width[j + 1] = cod_info->width[j + 2] - = gfc->scalefac_band.s[sfb + 1] - gfc->scalefac_band.s[sfb]; - cod_info->window[j] = 0; - cod_info->window[j + 1] = 1; - cod_info->window[j + 2] = 2; - j += 3; - } - } - - cod_info->count1bits = 0; - cod_info->sfb_partition_table = nr_of_sfb_block[0][0]; - cod_info->slen[0] = 0; - cod_info->slen[1] = 0; - cod_info->slen[2] = 0; - cod_info->slen[3] = 0; - - cod_info->max_nonzero_coeff = 575; - - /* fresh scalefactors are all zero - */ - memset(cod_info->scalefac, 0, sizeof(cod_info->scalefac)); - - if (cfg->vbr != vbr_mt && cfg->vbr != vbr_mtrh && cfg->vbr != vbr_abr && cfg->vbr != vbr_off) { - psfb21_analogsilence(gfc, cod_info); - } -} - - - -/************************************************************************ - * - * bin_search_StepSize() - * - * author/date?? - * - * binary step size search - * used by outer_loop to get a quantizer step size to start with - * - ************************************************************************/ - -typedef enum { - BINSEARCH_NONE, - BINSEARCH_UP, - BINSEARCH_DOWN -} binsearchDirection_t; - -static int -bin_search_StepSize(lame_internal_flags * const gfc, gr_info * const cod_info, - int desired_rate, const int ch, const FLOAT xrpow[576]) -{ - int nBits; - int CurrentStep = gfc->sv_qnt.CurrentStep[ch]; - int flag_GoneOver = 0; - int const start = gfc->sv_qnt.OldValue[ch]; - binsearchDirection_t Direction = BINSEARCH_NONE; - cod_info->global_gain = start; - desired_rate -= cod_info->part2_length; - - assert(CurrentStep); - for (;;) { - int step; - nBits = count_bits(gfc, xrpow, cod_info, 0); - - if (CurrentStep == 1 || nBits == desired_rate) - break; /* nothing to adjust anymore */ - - if (nBits > desired_rate) { - /* increase Quantize_StepSize */ - if (Direction == BINSEARCH_DOWN) - flag_GoneOver = 1; - - if (flag_GoneOver) - CurrentStep /= 2; - Direction = BINSEARCH_UP; - step = CurrentStep; - } - else { - /* decrease Quantize_StepSize */ - if (Direction == BINSEARCH_UP) - flag_GoneOver = 1; - - if (flag_GoneOver) - CurrentStep /= 2; - Direction = BINSEARCH_DOWN; - step = -CurrentStep; - } - cod_info->global_gain += step; - if (cod_info->global_gain < 0) { - cod_info->global_gain = 0; - flag_GoneOver = 1; - } - if (cod_info->global_gain > 255) { - cod_info->global_gain = 255; - flag_GoneOver = 1; - } - } - - assert(cod_info->global_gain >= 0); - assert(cod_info->global_gain < 256); - - while (nBits > desired_rate && cod_info->global_gain < 255) { - cod_info->global_gain++; - nBits = count_bits(gfc, xrpow, cod_info, 0); - } - gfc->sv_qnt.CurrentStep[ch] = (start - cod_info->global_gain >= 4) ? 4 : 2; - gfc->sv_qnt.OldValue[ch] = cod_info->global_gain; - cod_info->part2_3_length = nBits; - return nBits; -} - - - - -/************************************************************************ - * - * trancate_smallspectrums() - * - * Takehiro TOMINAGA 2002-07-21 - * - * trancate smaller nubmers into 0 as long as the noise threshold is allowed. - * - ************************************************************************/ -static int -floatcompare(const void *v1, const void *v2) -{ - const FLOAT *const a = v1, *const b = v2; - if (*a > *b) - return 1; - if (*a < *b) - return -1; - return 0; -} - -static void -trancate_smallspectrums(lame_internal_flags const *gfc, - gr_info * const gi, const FLOAT * const l3_xmin, FLOAT * const work) -{ - int sfb, j, width; - FLOAT distort[SFBMAX]; - calc_noise_result dummy; - - if ((!(gfc->sv_qnt.substep_shaping & 4) && gi->block_type == SHORT_TYPE) - || gfc->sv_qnt.substep_shaping & 0x80) - return; - (void) calc_noise(gi, l3_xmin, distort, &dummy, 0); - for (j = 0; j < 576; j++) { - FLOAT xr = 0.0; - if (gi->l3_enc[j] != 0) - xr = fabs(gi->xr[j]); - work[j] = xr; - } - - j = 0; - sfb = 8; - if (gi->block_type == SHORT_TYPE) - sfb = 6; - do { - FLOAT allowedNoise, trancateThreshold; - int nsame, start; - - width = gi->width[sfb]; - j += width; - if (distort[sfb] >= 1.0) - continue; - - qsort(&work[j - width], width, sizeof(FLOAT), floatcompare); - if (EQ(work[j - 1], 0.0)) - continue; /* all zero sfb */ - - allowedNoise = (1.0 - distort[sfb]) * l3_xmin[sfb]; - trancateThreshold = 0.0; - start = 0; - do { - FLOAT noise; - for (nsame = 1; start + nsame < width; nsame++) - if (NEQ(work[start + j - width], work[start + j + nsame - width])) - break; - - noise = work[start + j - width] * work[start + j - width] * nsame; - if (allowedNoise < noise) { - if (start != 0) - trancateThreshold = work[start + j - width - 1]; - break; - } - allowedNoise -= noise; - start += nsame; - } while (start < width); - if (EQ(trancateThreshold, 0.0)) - continue; - -/* printf("%e %e %e\n", */ -/* trancateThreshold/l3_xmin[sfb], */ -/* trancateThreshold/(l3_xmin[sfb]*start), */ -/* trancateThreshold/(l3_xmin[sfb]*(start+width)) */ -/* ); */ -/* if (trancateThreshold > 1000*l3_xmin[sfb]*start) */ -/* trancateThreshold = 1000*l3_xmin[sfb]*start; */ - - do { - if (fabs(gi->xr[j - width]) <= trancateThreshold) - gi->l3_enc[j - width] = 0; - } while (--width > 0); - } while (++sfb < gi->psymax); - - gi->part2_3_length = noquant_count_bits(gfc, gi, 0); -} - - -/************************************************************************* - * - * loop_break() - * - * author/date?? - * - * Function: Returns zero if there is a scalefac which has not been - * amplified. Otherwise it returns one. - * - *************************************************************************/ - -inline static int -loop_break(const gr_info * const cod_info) -{ - int sfb; - - for (sfb = 0; sfb < cod_info->sfbmax; sfb++) - if (cod_info->scalefac[sfb] - + cod_info->subblock_gain[cod_info->window[sfb]] == 0) - return 0; - - return 1; -} - - - - -/* mt 5/99: Function: Improved calc_noise for a single channel */ - -/************************************************************************* - * - * quant_compare() - * - * author/date?? - * - * several different codes to decide which quantization is better - * - *************************************************************************/ - -static double -penalties(double noise) -{ - return FAST_LOG10(0.368 + 0.632 * noise * noise * noise); -} - -static double -get_klemm_noise(const FLOAT * distort, const gr_info * const gi) -{ - int sfb; - double klemm_noise = 1E-37; - for (sfb = 0; sfb < gi->psymax; sfb++) - klemm_noise += penalties(distort[sfb]); - - return Max(1e-20, klemm_noise); -} - -inline static int -quant_compare(const int quant_comp, - const calc_noise_result * const best, - calc_noise_result * const calc, const gr_info * const gi, const FLOAT * distort) -{ - /* - noise is given in decibels (dB) relative to masking thesholds. - - over_noise: ??? (the previous comment is fully wrong) - tot_noise: ??? (the previous comment is fully wrong) - max_noise: max quantization noise - - */ - int better; - - switch (quant_comp) { - default: - case 9:{ - if (best->over_count > 0) { - /* there are distorted sfb */ - better = calc->over_SSD <= best->over_SSD; - if (calc->over_SSD == best->over_SSD) - better = calc->bits < best->bits; - } - else { - /* no distorted sfb */ - better = ((calc->max_noise < 0) && - ((calc->max_noise * 10 + calc->bits) <= - (best->max_noise * 10 + best->bits))); - } - break; - } - - case 0: - better = calc->over_count < best->over_count - || (calc->over_count == best->over_count && calc->over_noise < best->over_noise) - || (calc->over_count == best->over_count && - EQ(calc->over_noise, best->over_noise) && calc->tot_noise < best->tot_noise); - break; - - case 8: - calc->max_noise = get_klemm_noise(distort, gi); - /*lint --fallthrough */ - case 1: - better = calc->max_noise < best->max_noise; - break; - case 2: - better = calc->tot_noise < best->tot_noise; - break; - case 3: - better = (calc->tot_noise < best->tot_noise) - && (calc->max_noise < best->max_noise); - break; - case 4: - better = (calc->max_noise <= 0.0 && best->max_noise > 0.2) - || (calc->max_noise <= 0.0 && - best->max_noise < 0.0 && - best->max_noise > calc->max_noise - 0.2 && calc->tot_noise < best->tot_noise) - || (calc->max_noise <= 0.0 && - best->max_noise > 0.0 && - best->max_noise > calc->max_noise - 0.2 && - calc->tot_noise < best->tot_noise + best->over_noise) - || (calc->max_noise > 0.0 && - best->max_noise > -0.05 && - best->max_noise > calc->max_noise - 0.1 && - calc->tot_noise + calc->over_noise < best->tot_noise + best->over_noise) - || (calc->max_noise > 0.0 && - best->max_noise > -0.1 && - best->max_noise > calc->max_noise - 0.15 && - calc->tot_noise + calc->over_noise + calc->over_noise < - best->tot_noise + best->over_noise + best->over_noise); - break; - case 5: - better = calc->over_noise < best->over_noise - || (EQ(calc->over_noise, best->over_noise) && calc->tot_noise < best->tot_noise); - break; - case 6: - better = calc->over_noise < best->over_noise - || (EQ(calc->over_noise, best->over_noise) && - (calc->max_noise < best->max_noise - || (EQ(calc->max_noise, best->max_noise) && calc->tot_noise <= best->tot_noise) - )); - break; - case 7: - better = calc->over_count < best->over_count || calc->over_noise < best->over_noise; - break; - } - - - if (best->over_count == 0) { - /* - If no distorted bands, only use this quantization - if it is better, and if it uses less bits. - Unfortunately, part2_3_length is sometimes a poor - estimator of the final size at low bitrates. - */ - better = better && calc->bits < best->bits; - } - - - return better; -} - - - -/************************************************************************* - * - * amp_scalefac_bands() - * - * author/date?? - * - * Amplify the scalefactor bands that violate the masking threshold. - * See ISO 11172-3 Section C.1.5.4.3.5 - * - * distort[] = noise/masking - * distort[] > 1 ==> noise is not masked - * distort[] < 1 ==> noise is masked - * max_dist = maximum value of distort[] - * - * Three algorithms: - * noise_shaping_amp - * 0 Amplify all bands with distort[]>1. - * - * 1 Amplify all bands with distort[] >= max_dist^(.5); - * ( 50% in the db scale) - * - * 2 Amplify first band with distort[] >= max_dist; - * - * - * For algorithms 0 and 1, if max_dist < 1, then amplify all bands - * with distort[] >= .95*max_dist. This is to make sure we always - * amplify at least one band. - * - * - *************************************************************************/ -static void -amp_scalefac_bands(lame_internal_flags * gfc, - gr_info * const cod_info, FLOAT const *distort, FLOAT xrpow[576], int bRefine) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - int j, sfb; - FLOAT ifqstep34, trigger; - int noise_shaping_amp; - - if (cod_info->scalefac_scale == 0) { - ifqstep34 = 1.29683955465100964055; /* 2**(.75*.5) */ - } - else { - ifqstep34 = 1.68179283050742922612; /* 2**(.75*1) */ - } - - /* compute maximum value of distort[] */ - trigger = 0; - for (sfb = 0; sfb < cod_info->sfbmax; sfb++) { - if (trigger < distort[sfb]) - trigger = distort[sfb]; - } - - noise_shaping_amp = cfg->noise_shaping_amp; - if (noise_shaping_amp == 3) { - if (bRefine == 1) - noise_shaping_amp = 2; - else - noise_shaping_amp = 1; - } - switch (noise_shaping_amp) { - case 2: - /* amplify exactly 1 band */ - break; - - case 1: - /* amplify bands within 50% of max (on db scale) */ - if (trigger > 1.0) - trigger = pow(trigger, .5); - else - trigger *= .95; - break; - - case 0: - default: - /* ISO algorithm. amplify all bands with distort>1 */ - if (trigger > 1.0) - trigger = 1.0; - else - trigger *= .95; - break; - } - - j = 0; - for (sfb = 0; sfb < cod_info->sfbmax; sfb++) { - int const width = cod_info->width[sfb]; - int l; - j += width; - if (distort[sfb] < trigger) - continue; - - if (gfc->sv_qnt.substep_shaping & 2) { - gfc->sv_qnt.pseudohalf[sfb] = !gfc->sv_qnt.pseudohalf[sfb]; - if (!gfc->sv_qnt.pseudohalf[sfb] && cfg->noise_shaping_amp == 2) - return; - } - cod_info->scalefac[sfb]++; - for (l = -width; l < 0; l++) { - xrpow[j + l] *= ifqstep34; - if (xrpow[j + l] > cod_info->xrpow_max) - cod_info->xrpow_max = xrpow[j + l]; - } - - if (cfg->noise_shaping_amp == 2) - return; - } -} - -/************************************************************************* - * - * inc_scalefac_scale() - * - * Takehiro Tominaga 2000-xx-xx - * - * turns on scalefac scale and adjusts scalefactors - * - *************************************************************************/ - -static void -inc_scalefac_scale(gr_info * const cod_info, FLOAT xrpow[576]) -{ - int l, j, sfb; - const FLOAT ifqstep34 = 1.29683955465100964055; - - j = 0; - for (sfb = 0; sfb < cod_info->sfbmax; sfb++) { - int const width = cod_info->width[sfb]; - int s = cod_info->scalefac[sfb]; - if (cod_info->preflag) - s += pretab[sfb]; - j += width; - if (s & 1) { - s++; - for (l = -width; l < 0; l++) { - xrpow[j + l] *= ifqstep34; - if (xrpow[j + l] > cod_info->xrpow_max) - cod_info->xrpow_max = xrpow[j + l]; - } - } - cod_info->scalefac[sfb] = s >> 1; - } - cod_info->preflag = 0; - cod_info->scalefac_scale = 1; -} - - - -/************************************************************************* - * - * inc_subblock_gain() - * - * Takehiro Tominaga 2000-xx-xx - * - * increases the subblock gain and adjusts scalefactors - * - *************************************************************************/ - -static int -inc_subblock_gain(const lame_internal_flags * const gfc, gr_info * const cod_info, FLOAT xrpow[576]) -{ - int sfb, window; - int *const scalefac = cod_info->scalefac; - - /* subbloc_gain can't do anything in the long block region */ - for (sfb = 0; sfb < cod_info->sfb_lmax; sfb++) { - if (scalefac[sfb] >= 16) - return 1; - } - - for (window = 0; window < 3; window++) { - int s1, s2, l, j; - s1 = s2 = 0; - - for (sfb = cod_info->sfb_lmax + window; sfb < cod_info->sfbdivide; sfb += 3) { - if (s1 < scalefac[sfb]) - s1 = scalefac[sfb]; - } - for (; sfb < cod_info->sfbmax; sfb += 3) { - if (s2 < scalefac[sfb]) - s2 = scalefac[sfb]; - } - - if (s1 < 16 && s2 < 8) - continue; - - if (cod_info->subblock_gain[window] >= 7) - return 1; - - /* even though there is no scalefactor for sfb12 - * subblock gain affects upper frequencies too, that's why - * we have to go up to SBMAX_s - */ - cod_info->subblock_gain[window]++; - j = gfc->scalefac_band.l[cod_info->sfb_lmax]; - for (sfb = cod_info->sfb_lmax + window; sfb < cod_info->sfbmax; sfb += 3) { - FLOAT amp; - int const width = cod_info->width[sfb]; - int s = scalefac[sfb]; - assert(s >= 0); - s = s - (4 >> cod_info->scalefac_scale); - if (s >= 0) { - scalefac[sfb] = s; - j += width * 3; - continue; - } - - scalefac[sfb] = 0; - { - int const gain = 210 + (s << (cod_info->scalefac_scale + 1)); - amp = IPOW20(gain); - } - j += width * (window + 1); - for (l = -width; l < 0; l++) { - xrpow[j + l] *= amp; - if (xrpow[j + l] > cod_info->xrpow_max) - cod_info->xrpow_max = xrpow[j + l]; - } - j += width * (3 - window - 1); - } - - { - FLOAT const amp = IPOW20(202); - j += cod_info->width[sfb] * (window + 1); - for (l = -cod_info->width[sfb]; l < 0; l++) { - xrpow[j + l] *= amp; - if (xrpow[j + l] > cod_info->xrpow_max) - cod_info->xrpow_max = xrpow[j + l]; - } - } - } - return 0; -} - - - -/******************************************************************** - * - * balance_noise() - * - * Takehiro Tominaga /date?? - * Robert Hegemann 2000-09-06: made a function of it - * - * amplifies scalefactor bands, - * - if all are already amplified returns 0 - * - if some bands are amplified too much: - * * try to increase scalefac_scale - * * if already scalefac_scale was set - * try on short blocks to increase subblock gain - * - ********************************************************************/ -inline static int -balance_noise(lame_internal_flags * gfc, - gr_info * const cod_info, FLOAT const *distort, FLOAT xrpow[576], int bRefine) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - int status; - - amp_scalefac_bands(gfc, cod_info, distort, xrpow, bRefine); - - /* check to make sure we have not amplified too much - * loop_break returns 0 if there is an unamplified scalefac - * scale_bitcount returns 0 if no scalefactors are too large - */ - - status = loop_break(cod_info); - - if (status) - return 0; /* all bands amplified */ - - /* not all scalefactors have been amplified. so these - * scalefacs are possibly valid. encode them: - */ - status = scale_bitcount(gfc, cod_info); - - if (!status) - return 1; /* amplified some bands not exceeding limits */ - - /* some scalefactors are too large. - * lets try setting scalefac_scale=1 - */ - if (cfg->noise_shaping > 1) { - memset(&gfc->sv_qnt.pseudohalf[0], 0, sizeof(gfc->sv_qnt.pseudohalf)); - if (!cod_info->scalefac_scale) { - inc_scalefac_scale(cod_info, xrpow); - status = 0; - } - else { - if (cod_info->block_type == SHORT_TYPE && cfg->subblock_gain > 0) { - status = inc_subblock_gain(gfc, cod_info, xrpow) - || loop_break(cod_info); - } - } - } - - if (!status) { - status = scale_bitcount(gfc, cod_info); - } - return !status; -} - - - -/************************************************************************ - * - * outer_loop () - * - * Function: The outer iteration loop controls the masking conditions - * of all scalefactorbands. It computes the best scalefac and - * global gain. This module calls the inner iteration loop - * - * mt 5/99 completely rewritten to allow for bit reservoir control, - * mid/side channels with L/R or mid/side masking thresholds, - * and chooses best quantization instead of last quantization when - * no distortion free quantization can be found. - * - * added VBR support mt 5/99 - * - * some code shuffle rh 9/00 - ************************************************************************/ - -static int -outer_loop(lame_internal_flags * gfc, gr_info * const cod_info, const FLOAT * const l3_xmin, /* allowed distortion */ - FLOAT xrpow[576], /* coloured magnitudes of spectral */ - const int ch, const int targ_bits) -{ /* maximum allowed bits */ - SessionConfig_t const *const cfg = &gfc->cfg; - gr_info cod_info_w; - FLOAT save_xrpow[576]; - FLOAT distort[SFBMAX]; - calc_noise_result best_noise_info; - int huff_bits; - int better; - int age; - calc_noise_data prev_noise; - int best_part2_3_length = 9999999; - int bEndOfSearch = 0; - int bRefine = 0; - int best_ggain_pass1 = 0; - - (void) bin_search_StepSize(gfc, cod_info, targ_bits, ch, xrpow); - - if (!cfg->noise_shaping) - /* fast mode, no noise shaping, we are ready */ - return 100; /* default noise_info.over_count */ - - memset(&prev_noise, 0, sizeof(calc_noise_data)); - - - /* compute the distortion in this quantization */ - /* coefficients and thresholds both l/r (or both mid/side) */ - (void) calc_noise(cod_info, l3_xmin, distort, &best_noise_info, &prev_noise); - best_noise_info.bits = cod_info->part2_3_length; - - cod_info_w = *cod_info; - age = 0; - /* if (cfg->vbr == vbr_rh || cfg->vbr == vbr_mtrh) */ - memcpy(save_xrpow, xrpow, sizeof(FLOAT) * 576); - - while (!bEndOfSearch) { - /* BEGIN MAIN LOOP */ - do { - calc_noise_result noise_info; - int search_limit; - int maxggain = 255; - - /* When quantization with no distorted bands is found, - * allow up to X new unsuccesful tries in serial. This - * gives us more possibilities for different quant_compare modes. - * Much more than 3 makes not a big difference, it is only slower. - */ - - if (gfc->sv_qnt.substep_shaping & 2) { - search_limit = 20; - } - else { - search_limit = 3; - } - - - - /* Check if the last scalefactor band is distorted. - * in VBR mode we can't get rid of the distortion, so quit now - * and VBR mode will try again with more bits. - * (makes a 10% speed increase, the files I tested were - * binary identical, 2000/05/20 Robert Hegemann) - * distort[] > 1 means noise > allowed noise - */ - if (gfc->sv_qnt.sfb21_extra) { - if (distort[cod_info_w.sfbmax] > 1.0) - break; - if (cod_info_w.block_type == SHORT_TYPE - && (distort[cod_info_w.sfbmax + 1] > 1.0 - || distort[cod_info_w.sfbmax + 2] > 1.0)) - break; - } - - /* try a new scalefactor conbination on cod_info_w */ - if (balance_noise(gfc, &cod_info_w, distort, xrpow, bRefine) == 0) - break; - if (cod_info_w.scalefac_scale) - maxggain = 254; - - /* inner_loop starts with the initial quantization step computed above - * and slowly increases until the bits < huff_bits. - * Thus it is important not to start with too large of an inital - * quantization step. Too small is ok, but inner_loop will take longer - */ - huff_bits = targ_bits - cod_info_w.part2_length; - if (huff_bits <= 0) - break; - - /* increase quantizer stepsize until needed bits are below maximum - */ - while ((cod_info_w.part2_3_length - = count_bits(gfc, xrpow, &cod_info_w, &prev_noise)) > huff_bits - && cod_info_w.global_gain <= maxggain) - cod_info_w.global_gain++; - - if (cod_info_w.global_gain > maxggain) - break; - - if (best_noise_info.over_count == 0) { - - while ((cod_info_w.part2_3_length - = count_bits(gfc, xrpow, &cod_info_w, &prev_noise)) > best_part2_3_length - && cod_info_w.global_gain <= maxggain) - cod_info_w.global_gain++; - - if (cod_info_w.global_gain > maxggain) - break; - } - - /* compute the distortion in this quantization */ - (void) calc_noise(&cod_info_w, l3_xmin, distort, &noise_info, &prev_noise); - noise_info.bits = cod_info_w.part2_3_length; - - /* check if this quantization is better - * than our saved quantization */ - if (cod_info->block_type != SHORT_TYPE) /* NORM, START or STOP type */ - better = cfg->quant_comp; - else - better = cfg->quant_comp_short; - - - better = quant_compare(better, &best_noise_info, &noise_info, &cod_info_w, distort); - - - /* save data so we can restore this quantization later */ - if (better) { - best_part2_3_length = cod_info->part2_3_length; - best_noise_info = noise_info; - *cod_info = cod_info_w; - age = 0; - /* save data so we can restore this quantization later */ - /*if (cfg->vbr == vbr_rh || cfg->vbr == vbr_mtrh) */ { - /* store for later reuse */ - memcpy(save_xrpow, xrpow, sizeof(FLOAT) * 576); - } - } - else { - /* early stop? */ - if (cfg->full_outer_loop == 0) { - if (++age > search_limit && best_noise_info.over_count == 0) - break; - if ((cfg->noise_shaping_amp == 3) && bRefine && age > 30) - break; - if ((cfg->noise_shaping_amp == 3) && bRefine && - (cod_info_w.global_gain - best_ggain_pass1) > 15) - break; - } - } - } - while ((cod_info_w.global_gain + cod_info_w.scalefac_scale) < 255); - - if (cfg->noise_shaping_amp == 3) { - if (!bRefine) { - /* refine search */ - cod_info_w = *cod_info; - memcpy(xrpow, save_xrpow, sizeof(FLOAT) * 576); - age = 0; - best_ggain_pass1 = cod_info_w.global_gain; - - bRefine = 1; - } - else { - /* search already refined, stop */ - bEndOfSearch = 1; - } - - } - else { - bEndOfSearch = 1; - } - } - - assert((cod_info->global_gain + cod_info->scalefac_scale) <= 255); - /* finish up - */ - if (cfg->vbr == vbr_rh || cfg->vbr == vbr_mtrh || cfg->vbr == vbr_mt) - /* restore for reuse on next try */ - memcpy(xrpow, save_xrpow, sizeof(FLOAT) * 576); - /* do the 'substep shaping' - */ - else if (gfc->sv_qnt.substep_shaping & 1) - trancate_smallspectrums(gfc, cod_info, l3_xmin, xrpow); - - return best_noise_info.over_count; -} - - - - - -/************************************************************************ - * - * iteration_finish_one() - * - * Robert Hegemann 2000-09-06 - * - * update reservoir status after FINAL quantization/bitrate - * - ************************************************************************/ - -static void -iteration_finish_one(lame_internal_flags * gfc, int gr, int ch) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - III_side_info_t *const l3_side = &gfc->l3_side; - gr_info *const cod_info = &l3_side->tt[gr][ch]; - - /* try some better scalefac storage - */ - best_scalefac_store(gfc, gr, ch, l3_side); - - /* best huffman_divide may save some bits too - */ - if (cfg->use_best_huffman == 1) - best_huffman_divide(gfc, cod_info); - - /* update reservoir status after FINAL quantization/bitrate - */ - ResvAdjust(gfc, cod_info); -} - - - -/********************************************************************* - * - * VBR_encode_granule() - * - * 2000-09-04 Robert Hegemann - * - *********************************************************************/ - -static void -VBR_encode_granule(lame_internal_flags * gfc, gr_info * const cod_info, const FLOAT * const l3_xmin, /* allowed distortion of the scalefactor */ - FLOAT xrpow[576], /* coloured magnitudes of spectral values */ - const int ch, int min_bits, int max_bits) -{ - gr_info bst_cod_info; - FLOAT bst_xrpow[576]; - int const Max_bits = max_bits; - int real_bits = max_bits + 1; - int this_bits = (max_bits + min_bits) / 2; - int dbits, over, found = 0; - int const sfb21_extra = gfc->sv_qnt.sfb21_extra; - - assert(Max_bits <= MAX_BITS_PER_CHANNEL); - memset(bst_cod_info.l3_enc, 0, sizeof(bst_cod_info.l3_enc)); - - /* search within round about 40 bits of optimal - */ - do { - assert(this_bits >= min_bits); - assert(this_bits <= max_bits); - assert(min_bits <= max_bits); - - if (this_bits > Max_bits - 42) - gfc->sv_qnt.sfb21_extra = 0; - else - gfc->sv_qnt.sfb21_extra = sfb21_extra; - - over = outer_loop(gfc, cod_info, l3_xmin, xrpow, ch, this_bits); - - /* is quantization as good as we are looking for ? - * in this case: is no scalefactor band distorted? - */ - if (over <= 0) { - found = 1; - /* now we know it can be done with "real_bits" - * and maybe we can skip some iterations - */ - real_bits = cod_info->part2_3_length; - - /* store best quantization so far - */ - bst_cod_info = *cod_info; - memcpy(bst_xrpow, xrpow, sizeof(FLOAT) * 576); - - /* try with fewer bits - */ - max_bits = real_bits - 32; - dbits = max_bits - min_bits; - this_bits = (max_bits + min_bits) / 2; - } - else { - /* try with more bits - */ - min_bits = this_bits + 32; - dbits = max_bits - min_bits; - this_bits = (max_bits + min_bits) / 2; - - if (found) { - found = 2; - /* start again with best quantization so far - */ - *cod_info = bst_cod_info; - memcpy(xrpow, bst_xrpow, sizeof(FLOAT) * 576); - } - } - } while (dbits > 12); - - gfc->sv_qnt.sfb21_extra = sfb21_extra; - - /* found=0 => nothing found, use last one - * found=1 => we just found the best and left the loop - * found=2 => we restored a good one and have now l3_enc to restore too - */ - if (found == 2) { - memcpy(cod_info->l3_enc, bst_cod_info.l3_enc, sizeof(int) * 576); - } - assert(cod_info->part2_3_length <= Max_bits); - -} - - - -/************************************************************************ - * - * get_framebits() - * - * Robert Hegemann 2000-09-05 - * - * calculates - * * how many bits are available for analog silent granules - * * how many bits to use for the lowest allowed bitrate - * * how many bits each bitrate would provide - * - ************************************************************************/ - -static void -get_framebits(lame_internal_flags * gfc, int frameBits[15]) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - EncResult_t *const eov = &gfc->ov_enc; - int bitsPerFrame, i; - - /* always use at least this many bits per granule per channel - * unless we detect analog silence, see below - */ - eov->bitrate_index = cfg->vbr_min_bitrate_index; - bitsPerFrame = getframebits(gfc); - - /* bits for analog silence - */ - eov->bitrate_index = 1; - bitsPerFrame = getframebits(gfc); - - for (i = 1; i <= cfg->vbr_max_bitrate_index; i++) { - eov->bitrate_index = i; - frameBits[i] = ResvFrameBegin(gfc, &bitsPerFrame); - } -} - - - -/********************************************************************* - * - * VBR_prepare() - * - * 2000-09-04 Robert Hegemann - * - * * converts LR to MS coding when necessary - * * calculates allowed/adjusted quantization noise amounts - * * detects analog silent frames - * - * some remarks: - * - lower masking depending on Quality setting - * - quality control together with adjusted ATH MDCT scaling - * on lower quality setting allocate more noise from - * ATH masking, and on higher quality setting allocate - * less noise from ATH masking. - * - experiments show that going more than 2dB over GPSYCHO's - * limits ends up in very annoying artefacts - * - *********************************************************************/ - -/* RH: this one needs to be overhauled sometime */ - -static int -VBR_old_prepare(lame_internal_flags * gfc, - const FLOAT pe[2][2], FLOAT const ms_ener_ratio[2], - const III_psy_ratio ratio[2][2], - FLOAT l3_xmin[2][2][SFBMAX], - int frameBits[16], int min_bits[2][2], int max_bits[2][2], int bands[2][2]) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - EncResult_t *const eov = &gfc->ov_enc; - - FLOAT masking_lower_db, adjust = 0.0; - int gr, ch; - int analog_silence = 1; - int avg, mxb, bits = 0; - - eov->bitrate_index = cfg->vbr_max_bitrate_index; - avg = ResvFrameBegin(gfc, &avg) / cfg->mode_gr; - - get_framebits(gfc, frameBits); - - for (gr = 0; gr < cfg->mode_gr; gr++) { - mxb = on_pe(gfc, pe, max_bits[gr], avg, gr, 0); - if (gfc->ov_enc.mode_ext == MPG_MD_MS_LR) { - ms_convert(&gfc->l3_side, gr); - reduce_side(max_bits[gr], ms_ener_ratio[gr], avg, mxb); - } - for (ch = 0; ch < cfg->channels_out; ++ch) { - gr_info *const cod_info = &gfc->l3_side.tt[gr][ch]; - - if (cod_info->block_type != SHORT_TYPE) { /* NORM, START or STOP type */ - adjust = 1.28 / (1 + exp(3.5 - pe[gr][ch] / 300.)) - 0.05; - masking_lower_db = gfc->sv_qnt.mask_adjust - adjust; - } - else { - adjust = 2.56 / (1 + exp(3.5 - pe[gr][ch] / 300.)) - 0.14; - masking_lower_db = gfc->sv_qnt.mask_adjust_short - adjust; - } - gfc->sv_qnt.masking_lower = pow(10.0, masking_lower_db * 0.1); - - init_outer_loop(gfc, cod_info); - bands[gr][ch] = calc_xmin(gfc, &ratio[gr][ch], cod_info, l3_xmin[gr][ch]); - if (bands[gr][ch]) - analog_silence = 0; - - min_bits[gr][ch] = 126; - - bits += max_bits[gr][ch]; - } - } - for (gr = 0; gr < cfg->mode_gr; gr++) { - for (ch = 0; ch < cfg->channels_out; ch++) { - if (bits > frameBits[cfg->vbr_max_bitrate_index] && bits > 0) { - max_bits[gr][ch] *= frameBits[cfg->vbr_max_bitrate_index]; - max_bits[gr][ch] /= bits; - } - if (min_bits[gr][ch] > max_bits[gr][ch]) - min_bits[gr][ch] = max_bits[gr][ch]; - - } /* for ch */ - } /* for gr */ - - return analog_silence; -} - -static void -bitpressure_strategy(lame_internal_flags const *gfc, - FLOAT l3_xmin[2][2][SFBMAX], const int min_bits[2][2], int max_bits[2][2]) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - int gr, ch, sfb; - for (gr = 0; gr < cfg->mode_gr; gr++) { - for (ch = 0; ch < cfg->channels_out; ch++) { - gr_info const *const gi = &gfc->l3_side.tt[gr][ch]; - FLOAT *pxmin = l3_xmin[gr][ch]; - for (sfb = 0; sfb < gi->psy_lmax; sfb++) - *pxmin++ *= 1. + .029 * sfb * sfb / SBMAX_l / SBMAX_l; - - if (gi->block_type == SHORT_TYPE) { - for (sfb = gi->sfb_smin; sfb < SBMAX_s; sfb++) { - *pxmin++ *= 1. + .029 * sfb * sfb / SBMAX_s / SBMAX_s; - *pxmin++ *= 1. + .029 * sfb * sfb / SBMAX_s / SBMAX_s; - *pxmin++ *= 1. + .029 * sfb * sfb / SBMAX_s / SBMAX_s; - } - } - max_bits[gr][ch] = Max(min_bits[gr][ch], 0.9 * max_bits[gr][ch]); - } - } -} - -/************************************************************************ - * - * VBR_iteration_loop() - * - * tries to find out how many bits are needed for each granule and channel - * to get an acceptable quantization. An appropriate bitrate will then be - * choosed for quantization. rh 8/99 - * - * Robert Hegemann 2000-09-06 rewrite - * - ************************************************************************/ - -void -VBR_old_iteration_loop(lame_internal_flags * gfc, const FLOAT pe[2][2], - const FLOAT ms_ener_ratio[2], const III_psy_ratio ratio[2][2]) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - EncResult_t *const eov = &gfc->ov_enc; - FLOAT l3_xmin[2][2][SFBMAX]; - - FLOAT xrpow[576]; - int bands[2][2]; - int frameBits[15]; - int used_bits; - int bits; - int min_bits[2][2], max_bits[2][2]; - int mean_bits; - int ch, gr, analog_silence; - III_side_info_t *const l3_side = &gfc->l3_side; - - analog_silence = VBR_old_prepare(gfc, pe, ms_ener_ratio, ratio, - l3_xmin, frameBits, min_bits, max_bits, bands); - - /*---------------------------------*/ - for (;;) { - - /* quantize granules with lowest possible number of bits - */ - - used_bits = 0; - - for (gr = 0; gr < cfg->mode_gr; gr++) { - for (ch = 0; ch < cfg->channels_out; ch++) { - int ret; - gr_info *const cod_info = &l3_side->tt[gr][ch]; - - /* init_outer_loop sets up cod_info, scalefac and xrpow - */ - ret = init_xrpow(gfc, cod_info, xrpow); - if (ret == 0 || max_bits[gr][ch] == 0) { - /* xr contains no energy - * l3_enc, our encoding data, will be quantized to zero - */ - continue; /* with next channel */ - } - - VBR_encode_granule(gfc, cod_info, l3_xmin[gr][ch], xrpow, - ch, min_bits[gr][ch], max_bits[gr][ch]); - - /* do the 'substep shaping' - */ - if (gfc->sv_qnt.substep_shaping & 1) { - trancate_smallspectrums(gfc, &l3_side->tt[gr][ch], l3_xmin[gr][ch], xrpow); - } - - ret = cod_info->part2_3_length + cod_info->part2_length; - used_bits += ret; - } /* for ch */ - } /* for gr */ - - /* find lowest bitrate able to hold used bits - */ - if (analog_silence && !cfg->enforce_min_bitrate) - /* we detected analog silence and the user did not specify - * any hard framesize limit, so start with smallest possible frame - */ - eov->bitrate_index = 1; - else - eov->bitrate_index = cfg->vbr_min_bitrate_index; - - for (; eov->bitrate_index < cfg->vbr_max_bitrate_index; eov->bitrate_index++) { - if (used_bits <= frameBits[eov->bitrate_index]) - break; - } - bits = ResvFrameBegin(gfc, &mean_bits); - - if (used_bits <= bits) - break; - - bitpressure_strategy(gfc, l3_xmin, (const int (*)[2])min_bits, max_bits); - - } /* breaks adjusted */ - /*--------------------------------------*/ - - for (gr = 0; gr < cfg->mode_gr; gr++) { - for (ch = 0; ch < cfg->channels_out; ch++) { - iteration_finish_one(gfc, gr, ch); - } /* for ch */ - } /* for gr */ - ResvFrameEnd(gfc, mean_bits); -} - - - -static int -VBR_new_prepare(lame_internal_flags * gfc, - const FLOAT pe[2][2], const III_psy_ratio ratio[2][2], - FLOAT l3_xmin[2][2][SFBMAX], int frameBits[16], int max_bits[2][2], - int* max_resv) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - EncResult_t *const eov = &gfc->ov_enc; - - int gr, ch; - int analog_silence = 1; - int avg, bits = 0; - int maximum_framebits; - - if (!cfg->free_format) { - eov->bitrate_index = cfg->vbr_max_bitrate_index; - (void) ResvFrameBegin(gfc, &avg); - *max_resv = gfc->sv_enc.ResvMax; - - get_framebits(gfc, frameBits); - maximum_framebits = frameBits[cfg->vbr_max_bitrate_index]; - } - else { - eov->bitrate_index = 0; - maximum_framebits = ResvFrameBegin(gfc, &avg); - frameBits[0] = maximum_framebits; - *max_resv = gfc->sv_enc.ResvMax; - } - - for (gr = 0; gr < cfg->mode_gr; gr++) { - (void) on_pe(gfc, pe, max_bits[gr], avg, gr, 0); - if (gfc->ov_enc.mode_ext == MPG_MD_MS_LR) { - ms_convert(&gfc->l3_side, gr); - } - for (ch = 0; ch < cfg->channels_out; ++ch) { - gr_info *const cod_info = &gfc->l3_side.tt[gr][ch]; - - gfc->sv_qnt.masking_lower = pow(10.0, gfc->sv_qnt.mask_adjust * 0.1); - - init_outer_loop(gfc, cod_info); - if (0 != calc_xmin(gfc, &ratio[gr][ch], cod_info, l3_xmin[gr][ch])) - analog_silence = 0; - - bits += max_bits[gr][ch]; - } - } - for (gr = 0; gr < cfg->mode_gr; gr++) { - for (ch = 0; ch < cfg->channels_out; ch++) { - if (bits > maximum_framebits && bits > 0) { - max_bits[gr][ch] *= maximum_framebits; - max_bits[gr][ch] /= bits; - } - - } /* for ch */ - } /* for gr */ - if (analog_silence) { - *max_resv = 0; - } - return analog_silence; -} - - - -void -VBR_new_iteration_loop(lame_internal_flags * gfc, const FLOAT pe[2][2], - const FLOAT ms_ener_ratio[2], const III_psy_ratio ratio[2][2]) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - EncResult_t *const eov = &gfc->ov_enc; - FLOAT l3_xmin[2][2][SFBMAX]; - - FLOAT xrpow[2][2][576]; - int frameBits[15]; - int used_bits; - int max_bits[2][2]; - int ch, gr, analog_silence, pad; - III_side_info_t *const l3_side = &gfc->l3_side; - - const FLOAT (*const_l3_xmin)[2][SFBMAX] = (const FLOAT (*)[2][SFBMAX])l3_xmin; - const FLOAT (*const_xrpow)[2][576] = (const FLOAT (*)[2][576])xrpow; - const int (*const_max_bits)[2] = (const int (*)[2])max_bits; - - (void) ms_ener_ratio; /* not used */ - - memset(xrpow, 0, sizeof(xrpow)); - - analog_silence = VBR_new_prepare(gfc, pe, ratio, l3_xmin, frameBits, max_bits, &pad); - - for (gr = 0; gr < cfg->mode_gr; gr++) { - for (ch = 0; ch < cfg->channels_out; ch++) { - gr_info *const cod_info = &l3_side->tt[gr][ch]; - - /* init_outer_loop sets up cod_info, scalefac and xrpow - */ - if (0 == init_xrpow(gfc, cod_info, xrpow[gr][ch])) { - max_bits[gr][ch] = 0; /* silent granule needs no bits */ - } - } /* for ch */ - } /* for gr */ - - /* quantize granules with lowest possible number of bits - */ - - used_bits = VBR_encode_frame(gfc, const_xrpow, const_l3_xmin, const_max_bits); - - if (!cfg->free_format) { - int i, j; - - /* find lowest bitrate able to hold used bits - */ - if (analog_silence && !cfg->enforce_min_bitrate) { - /* we detected analog silence and the user did not specify - * any hard framesize limit, so start with smallest possible frame - */ - i = 1; - } - else { - i = cfg->vbr_min_bitrate_index; - } - - for (; i < cfg->vbr_max_bitrate_index; i++) { - if (used_bits <= frameBits[i]) - break; - } - if (i > cfg->vbr_max_bitrate_index) { - i = cfg->vbr_max_bitrate_index; - } - if (pad > 0) { - for (j = cfg->vbr_max_bitrate_index; j > i; --j) { - int const unused = frameBits[j] - used_bits; - if (unused <= pad) - break; - } - eov->bitrate_index = j; - } - else { - eov->bitrate_index = i; - } - } - else { -#if 0 - static int mmm = 0; - int fff = getFramesize_kbps(gfc, used_bits); - int hhh = getFramesize_kbps(gfc, MAX_BITS_PER_GRANULE * cfg->mode_gr); - if (mmm < fff) - mmm = fff; - printf("demand=%3d kbps max=%3d kbps limit=%3d kbps\n", fff, mmm, hhh); -#endif - eov->bitrate_index = 0; - } - if (used_bits <= frameBits[eov->bitrate_index]) { - /* update Reservoire status */ - int mean_bits, fullframebits; - fullframebits = ResvFrameBegin(gfc, &mean_bits); - assert(used_bits <= fullframebits); - for (gr = 0; gr < cfg->mode_gr; gr++) { - for (ch = 0; ch < cfg->channels_out; ch++) { - gr_info const *const cod_info = &l3_side->tt[gr][ch]; - ResvAdjust(gfc, cod_info); - } - } - ResvFrameEnd(gfc, mean_bits); - } - else { - /* SHOULD NOT HAPPEN INTERNAL ERROR - */ - ERRORF(gfc, "INTERNAL ERROR IN VBR NEW CODE, please send bug report\n"); - exit(-1); - } -} - - - - - -/******************************************************************** - * - * calc_target_bits() - * - * calculates target bits for ABR encoding - * - * mt 2000/05/31 - * - ********************************************************************/ - -static void -calc_target_bits(lame_internal_flags * gfc, - const FLOAT pe[2][2], - FLOAT const ms_ener_ratio[2], - int targ_bits[2][2], int *analog_silence_bits, int *max_frame_bits) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - EncResult_t *const eov = &gfc->ov_enc; - III_side_info_t const *const l3_side = &gfc->l3_side; - FLOAT res_factor; - int gr, ch, totbits, mean_bits; - int framesize = 576 * cfg->mode_gr; - - eov->bitrate_index = cfg->vbr_max_bitrate_index; - *max_frame_bits = ResvFrameBegin(gfc, &mean_bits); - - eov->bitrate_index = 1; - mean_bits = getframebits(gfc) - cfg->sideinfo_len * 8; - *analog_silence_bits = mean_bits / (cfg->mode_gr * cfg->channels_out); - - mean_bits = cfg->vbr_avg_bitrate_kbps * framesize * 1000; - if (gfc->sv_qnt.substep_shaping & 1) - mean_bits *= 1.09; - mean_bits /= cfg->samplerate_out; - mean_bits -= cfg->sideinfo_len * 8; - mean_bits /= (cfg->mode_gr * cfg->channels_out); - - /* - res_factor is the percentage of the target bitrate that should - be used on average. the remaining bits are added to the - bitreservoir and used for difficult to encode frames. - - Since we are tracking the average bitrate, we should adjust - res_factor "on the fly", increasing it if the average bitrate - is greater than the requested bitrate, and decreasing it - otherwise. Reasonable ranges are from .9 to 1.0 - - Until we get the above suggestion working, we use the following - tuning: - compression ratio res_factor - 5.5 (256kbps) 1.0 no need for bitreservoir - 11 (128kbps) .93 7% held for reservoir - - with linear interpolation for other values. - - */ - res_factor = .93 + .07 * (11.0 - cfg->compression_ratio) / (11.0 - 5.5); - if (res_factor < .90) - res_factor = .90; - if (res_factor > 1.00) - res_factor = 1.00; - - for (gr = 0; gr < cfg->mode_gr; gr++) { - int sum = 0; - for (ch = 0; ch < cfg->channels_out; ch++) { - targ_bits[gr][ch] = res_factor * mean_bits; - - if (pe[gr][ch] > 700) { - int add_bits = (pe[gr][ch] - 700) / 1.4; - - gr_info const *const cod_info = &l3_side->tt[gr][ch]; - targ_bits[gr][ch] = res_factor * mean_bits; - - /* short blocks use a little extra, no matter what the pe */ - if (cod_info->block_type == SHORT_TYPE) { - if (add_bits < mean_bits / 2) - add_bits = mean_bits / 2; - } - /* at most increase bits by 1.5*average */ - if (add_bits > mean_bits * 3 / 2) - add_bits = mean_bits * 3 / 2; - else if (add_bits < 0) - add_bits = 0; - - targ_bits[gr][ch] += add_bits; - } - if (targ_bits[gr][ch] > MAX_BITS_PER_CHANNEL) { - targ_bits[gr][ch] = MAX_BITS_PER_CHANNEL; - } - sum += targ_bits[gr][ch]; - } /* for ch */ - if (sum > MAX_BITS_PER_GRANULE) { - for (ch = 0; ch < cfg->channels_out; ++ch) { - targ_bits[gr][ch] *= MAX_BITS_PER_GRANULE; - targ_bits[gr][ch] /= sum; - } - } - } /* for gr */ - - if (gfc->ov_enc.mode_ext == MPG_MD_MS_LR) - for (gr = 0; gr < cfg->mode_gr; gr++) { - reduce_side(targ_bits[gr], ms_ener_ratio[gr], mean_bits * cfg->channels_out, - MAX_BITS_PER_GRANULE); - } - - /* sum target bits - */ - totbits = 0; - for (gr = 0; gr < cfg->mode_gr; gr++) { - for (ch = 0; ch < cfg->channels_out; ch++) { - if (targ_bits[gr][ch] > MAX_BITS_PER_CHANNEL) - targ_bits[gr][ch] = MAX_BITS_PER_CHANNEL; - totbits += targ_bits[gr][ch]; - } - } - - /* repartion target bits if needed - */ - if (totbits > *max_frame_bits && totbits > 0) { - for (gr = 0; gr < cfg->mode_gr; gr++) { - for (ch = 0; ch < cfg->channels_out; ch++) { - targ_bits[gr][ch] *= *max_frame_bits; - targ_bits[gr][ch] /= totbits; - } - } - } -} - - - - - - -/******************************************************************** - * - * ABR_iteration_loop() - * - * encode a frame with a disired average bitrate - * - * mt 2000/05/31 - * - ********************************************************************/ - -void -ABR_iteration_loop(lame_internal_flags * gfc, const FLOAT pe[2][2], - const FLOAT ms_ener_ratio[2], const III_psy_ratio ratio[2][2]) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - EncResult_t *const eov = &gfc->ov_enc; - FLOAT l3_xmin[SFBMAX]; - FLOAT xrpow[576]; - int targ_bits[2][2]; - int mean_bits, max_frame_bits; - int ch, gr, ath_over; - int analog_silence_bits; - gr_info *cod_info; - III_side_info_t *const l3_side = &gfc->l3_side; - - mean_bits = 0; - - calc_target_bits(gfc, pe, ms_ener_ratio, targ_bits, &analog_silence_bits, &max_frame_bits); - - /* encode granules - */ - for (gr = 0; gr < cfg->mode_gr; gr++) { - - if (gfc->ov_enc.mode_ext == MPG_MD_MS_LR) { - ms_convert(&gfc->l3_side, gr); - } - for (ch = 0; ch < cfg->channels_out; ch++) { - FLOAT adjust, masking_lower_db; - cod_info = &l3_side->tt[gr][ch]; - - if (cod_info->block_type != SHORT_TYPE) { /* NORM, START or STOP type */ - /* adjust = 1.28/(1+exp(3.5-pe[gr][ch]/300.))-0.05; */ - adjust = 0; - masking_lower_db = gfc->sv_qnt.mask_adjust - adjust; - } - else { - /* adjust = 2.56/(1+exp(3.5-pe[gr][ch]/300.))-0.14; */ - adjust = 0; - masking_lower_db = gfc->sv_qnt.mask_adjust_short - adjust; - } - gfc->sv_qnt.masking_lower = pow(10.0, masking_lower_db * 0.1); - - - /* cod_info, scalefac and xrpow get initialized in init_outer_loop - */ - init_outer_loop(gfc, cod_info); - if (init_xrpow(gfc, cod_info, xrpow)) { - /* xr contains energy we will have to encode - * calculate the masking abilities - * find some good quantization in outer_loop - */ - ath_over = calc_xmin(gfc, &ratio[gr][ch], cod_info, l3_xmin); - if (0 == ath_over) /* analog silence */ - targ_bits[gr][ch] = analog_silence_bits; - - (void) outer_loop(gfc, cod_info, l3_xmin, xrpow, ch, targ_bits[gr][ch]); - } - iteration_finish_one(gfc, gr, ch); - } /* ch */ - } /* gr */ - - /* find a bitrate which can refill the resevoir to positive size. - */ - for (eov->bitrate_index = cfg->vbr_min_bitrate_index; - eov->bitrate_index <= cfg->vbr_max_bitrate_index; eov->bitrate_index++) { - if (ResvFrameBegin(gfc, &mean_bits) >= 0) - break; - } - assert(eov->bitrate_index <= cfg->vbr_max_bitrate_index); - - ResvFrameEnd(gfc, mean_bits); -} - - - - - - -/************************************************************************ - * - * CBR_iteration_loop() - * - * author/date?? - * - * encodes one frame of MP3 data with constant bitrate - * - ************************************************************************/ - -void -CBR_iteration_loop(lame_internal_flags * gfc, const FLOAT pe[2][2], - const FLOAT ms_ener_ratio[2], const III_psy_ratio ratio[2][2]) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - FLOAT l3_xmin[SFBMAX]; - FLOAT xrpow[576]; - int targ_bits[2]; - int mean_bits, max_bits; - int gr, ch; - III_side_info_t *const l3_side = &gfc->l3_side; - gr_info *cod_info; - - (void) ResvFrameBegin(gfc, &mean_bits); - - /* quantize! */ - for (gr = 0; gr < cfg->mode_gr; gr++) { - - /* calculate needed bits - */ - max_bits = on_pe(gfc, pe, targ_bits, mean_bits, gr, gr); - - if (gfc->ov_enc.mode_ext == MPG_MD_MS_LR) { - ms_convert(&gfc->l3_side, gr); - reduce_side(targ_bits, ms_ener_ratio[gr], mean_bits, max_bits); - } - - for (ch = 0; ch < cfg->channels_out; ch++) { - FLOAT adjust, masking_lower_db; - cod_info = &l3_side->tt[gr][ch]; - - if (cod_info->block_type != SHORT_TYPE) { /* NORM, START or STOP type */ - /* adjust = 1.28/(1+exp(3.5-pe[gr][ch]/300.))-0.05; */ - adjust = 0; - masking_lower_db = gfc->sv_qnt.mask_adjust - adjust; - } - else { - /* adjust = 2.56/(1+exp(3.5-pe[gr][ch]/300.))-0.14; */ - adjust = 0; - masking_lower_db = gfc->sv_qnt.mask_adjust_short - adjust; - } - gfc->sv_qnt.masking_lower = pow(10.0, masking_lower_db * 0.1); - - /* init_outer_loop sets up cod_info, scalefac and xrpow - */ - init_outer_loop(gfc, cod_info); - if (init_xrpow(gfc, cod_info, xrpow)) { - /* xr contains energy we will have to encode - * calculate the masking abilities - * find some good quantization in outer_loop - */ - (void) calc_xmin(gfc, &ratio[gr][ch], cod_info, l3_xmin); - (void) outer_loop(gfc, cod_info, l3_xmin, xrpow, ch, targ_bits[ch]); - } - - iteration_finish_one(gfc, gr, ch); - assert(cod_info->part2_3_length <= MAX_BITS_PER_CHANNEL); - assert(cod_info->part2_3_length <= targ_bits[ch]); - } /* for ch */ - } /* for gr */ - - ResvFrameEnd(gfc, mean_bits); -} diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/quantize.h b/recorderlib/src/main/jni/lame-3.100_libmp3lame/quantize.h deleted file mode 100644 index 56edcc7..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/quantize.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * MP3 quantization - * - * Copyright (c) 1999 Mark Taylor - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef LAME_QUANTIZE_H -#define LAME_QUANTIZE_H - -void CBR_iteration_loop(lame_internal_flags * gfc, const FLOAT pe[2][2], - const FLOAT ms_ratio[2], const III_psy_ratio ratio[2][2]); - -void VBR_old_iteration_loop(lame_internal_flags * gfc, const FLOAT pe[2][2], - const FLOAT ms_ratio[2], const III_psy_ratio ratio[2][2]); - -void VBR_new_iteration_loop(lame_internal_flags * gfc, const FLOAT pe[2][2], - const FLOAT ms_ratio[2], const III_psy_ratio ratio[2][2]); - -void ABR_iteration_loop(lame_internal_flags * gfc, const FLOAT pe[2][2], - const FLOAT ms_ratio[2], const III_psy_ratio ratio[2][2]); - - -#endif /* LAME_QUANTIZE_H */ diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/quantize_pvt.c b/recorderlib/src/main/jni/lame-3.100_libmp3lame/quantize_pvt.c deleted file mode 100644 index d8d6447..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/quantize_pvt.c +++ /dev/null @@ -1,1074 +0,0 @@ -/* - * quantize_pvt source file - * - * Copyright (c) 1999-2002 Takehiro Tominaga - * Copyright (c) 2000-2012 Robert Hegemann - * Copyright (c) 2001 Naoki Shibata - * Copyright (c) 2002-2005 Gabriel Bouvigne - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* $Id: quantize_pvt.c,v 1.175 2017/09/06 15:07:30 robert Exp $ */ -#ifdef HAVE_CONFIG_H -# include -#endif - - -#include "lame.h" -#include "machine.h" -#include "encoder.h" -#include "util.h" -#include "quantize_pvt.h" -#include "reservoir.h" -#include "lame-analysis.h" -#include - - -#define NSATHSCALE 100 /* Assuming dynamic range=96dB, this value should be 92 */ - -/* - The following table is used to implement the scalefactor - partitioning for MPEG2 as described in section - 2.4.3.2 of the IS. The indexing corresponds to the - way the tables are presented in the IS: - - [table_number][row_in_table][column of nr_of_sfb] -*/ -const int nr_of_sfb_block[6][3][4] = { - { - {6, 5, 5, 5}, - {9, 9, 9, 9}, - {6, 9, 9, 9} - }, - { - {6, 5, 7, 3}, - {9, 9, 12, 6}, - {6, 9, 12, 6} - }, - { - {11, 10, 0, 0}, - {18, 18, 0, 0}, - {15, 18, 0, 0} - }, - { - {7, 7, 7, 0}, - {12, 12, 12, 0}, - {6, 15, 12, 0} - }, - { - {6, 6, 6, 3}, - {12, 9, 9, 6}, - {6, 12, 9, 6} - }, - { - {8, 8, 5, 0}, - {15, 12, 9, 0}, - {6, 18, 9, 0} - } -}; - - -/* Table B.6: layer3 preemphasis */ -const int pretab[SBMAX_l] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0 -}; - -/* - Here are MPEG1 Table B.8 and MPEG2 Table B.1 - -- Layer III scalefactor bands. - Index into this using a method such as: - idx = fr_ps->header->sampling_frequency - + (fr_ps->header->version * 3) -*/ - - -const scalefac_struct sfBandIndex[9] = { - { /* Table B.2.b: 22.05 kHz */ - {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, - 522, 576}, - {0, 4, 8, 12, 18, 24, 32, 42, 56, 74, 100, 132, 174, 192} - , {0, 0, 0, 0, 0, 0, 0} /* sfb21 pseudo sub bands */ - , {0, 0, 0, 0, 0, 0, 0} /* sfb12 pseudo sub bands */ - }, - { /* Table B.2.c: 24 kHz */ /* docs: 332. mpg123(broken): 330 */ - {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 114, 136, 162, 194, 232, 278, 332, 394, 464, - 540, 576}, - {0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 136, 180, 192} - , {0, 0, 0, 0, 0, 0, 0} /* sfb21 pseudo sub bands */ - , {0, 0, 0, 0, 0, 0, 0} /* sfb12 pseudo sub bands */ - }, - { /* Table B.2.a: 16 kHz */ - {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, - 522, 576}, - {0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 134, 174, 192} - , {0, 0, 0, 0, 0, 0, 0} /* sfb21 pseudo sub bands */ - , {0, 0, 0, 0, 0, 0, 0} /* sfb12 pseudo sub bands */ - }, - { /* Table B.8.b: 44.1 kHz */ - {0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 52, 62, 74, 90, 110, 134, 162, 196, 238, 288, 342, 418, - 576}, - {0, 4, 8, 12, 16, 22, 30, 40, 52, 66, 84, 106, 136, 192} - , {0, 0, 0, 0, 0, 0, 0} /* sfb21 pseudo sub bands */ - , {0, 0, 0, 0, 0, 0, 0} /* sfb12 pseudo sub bands */ - }, - { /* Table B.8.c: 48 kHz */ - {0, 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 60, 72, 88, 106, 128, 156, 190, 230, 276, 330, 384, - 576}, - {0, 4, 8, 12, 16, 22, 28, 38, 50, 64, 80, 100, 126, 192} - , {0, 0, 0, 0, 0, 0, 0} /* sfb21 pseudo sub bands */ - , {0, 0, 0, 0, 0, 0, 0} /* sfb12 pseudo sub bands */ - }, - { /* Table B.8.a: 32 kHz */ - {0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 54, 66, 82, 102, 126, 156, 194, 240, 296, 364, 448, 550, - 576}, - {0, 4, 8, 12, 16, 22, 30, 42, 58, 78, 104, 138, 180, 192} - , {0, 0, 0, 0, 0, 0, 0} /* sfb21 pseudo sub bands */ - , {0, 0, 0, 0, 0, 0, 0} /* sfb12 pseudo sub bands */ - }, - { /* MPEG-2.5 11.025 kHz */ - {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, - 522, 576}, - {0 / 3, 12 / 3, 24 / 3, 36 / 3, 54 / 3, 78 / 3, 108 / 3, 144 / 3, 186 / 3, 240 / 3, 312 / 3, - 402 / 3, 522 / 3, 576 / 3} - , {0, 0, 0, 0, 0, 0, 0} /* sfb21 pseudo sub bands */ - , {0, 0, 0, 0, 0, 0, 0} /* sfb12 pseudo sub bands */ - }, - { /* MPEG-2.5 12 kHz */ - {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, - 522, 576}, - {0 / 3, 12 / 3, 24 / 3, 36 / 3, 54 / 3, 78 / 3, 108 / 3, 144 / 3, 186 / 3, 240 / 3, 312 / 3, - 402 / 3, 522 / 3, 576 / 3} - , {0, 0, 0, 0, 0, 0, 0} /* sfb21 pseudo sub bands */ - , {0, 0, 0, 0, 0, 0, 0} /* sfb12 pseudo sub bands */ - }, - { /* MPEG-2.5 8 kHz */ - {0, 12, 24, 36, 48, 60, 72, 88, 108, 132, 160, 192, 232, 280, 336, 400, 476, 566, 568, 570, - 572, 574, 576}, - {0 / 3, 24 / 3, 48 / 3, 72 / 3, 108 / 3, 156 / 3, 216 / 3, 288 / 3, 372 / 3, 480 / 3, 486 / 3, - 492 / 3, 498 / 3, 576 / 3} - , {0, 0, 0, 0, 0, 0, 0} /* sfb21 pseudo sub bands */ - , {0, 0, 0, 0, 0, 0, 0} /* sfb12 pseudo sub bands */ - } -}; - - -/* FIXME: move global variables in some struct */ - -FLOAT pow20[Q_MAX + Q_MAX2 + 1]; -FLOAT ipow20[Q_MAX]; -FLOAT pow43[PRECALC_SIZE]; -/* initialized in first call to iteration_init */ -#ifdef TAKEHIRO_IEEE754_HACK -FLOAT adj43asm[PRECALC_SIZE]; -#else -FLOAT adj43[PRECALC_SIZE]; -#endif - -/* -compute the ATH for each scalefactor band -cd range: 0..96db - -Input: 3.3kHz signal 32767 amplitude (3.3kHz is where ATH is smallest = -5db) -longblocks: sfb=12 en0/bw=-11db max_en0 = 1.3db -shortblocks: sfb=5 -9db 0db - -Input: 1 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 (repeated) -longblocks: amp=1 sfb=12 en0/bw=-103 db max_en0 = -92db - amp=32767 sfb=12 -12 db -1.4db - -Input: 1 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 (repeated) -shortblocks: amp=1 sfb=5 en0/bw= -99 -86 - amp=32767 sfb=5 -9 db 4db - - -MAX energy of largest wave at 3.3kHz = 1db -AVE energy of largest wave at 3.3kHz = -11db -Let's take AVE: -11db = maximum signal in sfb=12. -Dynamic range of CD: 96db. Therefor energy of smallest audible wave -in sfb=12 = -11 - 96 = -107db = ATH at 3.3kHz. - -ATH formula for this wave: -5db. To adjust to LAME scaling, we need -ATH = ATH_formula - 103 (db) -ATH = ATH * 2.5e-10 (ener) - -*/ - -static FLOAT -ATHmdct(SessionConfig_t const *cfg, FLOAT f) -{ - FLOAT ath; - - ath = ATHformula(cfg, f); - - if (cfg->ATHfixpoint > 0) { - ath -= cfg->ATHfixpoint; - } - else { - ath -= NSATHSCALE; - } - ath += cfg->ATH_offset_db; - - /* modify the MDCT scaling for the ATH and convert to energy */ - ath = powf(10.0f, ath * 0.1f); - return ath; -} - -static void -compute_ath(lame_internal_flags const* gfc) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - FLOAT *const ATH_l = gfc->ATH->l; - FLOAT *const ATH_psfb21 = gfc->ATH->psfb21; - FLOAT *const ATH_s = gfc->ATH->s; - FLOAT *const ATH_psfb12 = gfc->ATH->psfb12; - int sfb, i, start, end; - FLOAT ATH_f; - FLOAT const samp_freq = cfg->samplerate_out; - - for (sfb = 0; sfb < SBMAX_l; sfb++) { - start = gfc->scalefac_band.l[sfb]; - end = gfc->scalefac_band.l[sfb + 1]; - ATH_l[sfb] = FLOAT_MAX; - for (i = start; i < end; i++) { - FLOAT const freq = i * samp_freq / (2 * 576); - ATH_f = ATHmdct(cfg, freq); /* freq in kHz */ - ATH_l[sfb] = Min(ATH_l[sfb], ATH_f); - } - } - - for (sfb = 0; sfb < PSFB21; sfb++) { - start = gfc->scalefac_band.psfb21[sfb]; - end = gfc->scalefac_band.psfb21[sfb + 1]; - ATH_psfb21[sfb] = FLOAT_MAX; - for (i = start; i < end; i++) { - FLOAT const freq = i * samp_freq / (2 * 576); - ATH_f = ATHmdct(cfg, freq); /* freq in kHz */ - ATH_psfb21[sfb] = Min(ATH_psfb21[sfb], ATH_f); - } - } - - for (sfb = 0; sfb < SBMAX_s; sfb++) { - start = gfc->scalefac_band.s[sfb]; - end = gfc->scalefac_band.s[sfb + 1]; - ATH_s[sfb] = FLOAT_MAX; - for (i = start; i < end; i++) { - FLOAT const freq = i * samp_freq / (2 * 192); - ATH_f = ATHmdct(cfg, freq); /* freq in kHz */ - ATH_s[sfb] = Min(ATH_s[sfb], ATH_f); - } - ATH_s[sfb] *= (gfc->scalefac_band.s[sfb + 1] - gfc->scalefac_band.s[sfb]); - } - - for (sfb = 0; sfb < PSFB12; sfb++) { - start = gfc->scalefac_band.psfb12[sfb]; - end = gfc->scalefac_band.psfb12[sfb + 1]; - ATH_psfb12[sfb] = FLOAT_MAX; - for (i = start; i < end; i++) { - FLOAT const freq = i * samp_freq / (2 * 192); - ATH_f = ATHmdct(cfg, freq); /* freq in kHz */ - ATH_psfb12[sfb] = Min(ATH_psfb12[sfb], ATH_f); - } - /*not sure about the following */ - ATH_psfb12[sfb] *= (gfc->scalefac_band.s[13] - gfc->scalefac_band.s[12]); - } - - - /* no-ATH mode: - * reduce ATH to -200 dB - */ - - if (cfg->noATH) { - for (sfb = 0; sfb < SBMAX_l; sfb++) { - ATH_l[sfb] = 1E-20; - } - for (sfb = 0; sfb < PSFB21; sfb++) { - ATH_psfb21[sfb] = 1E-20; - } - for (sfb = 0; sfb < SBMAX_s; sfb++) { - ATH_s[sfb] = 1E-20; - } - for (sfb = 0; sfb < PSFB12; sfb++) { - ATH_psfb12[sfb] = 1E-20; - } - } - - /* work in progress, don't rely on it too much - */ - gfc->ATH->floor = 10. * log10(ATHmdct(cfg, -1.)); - - /* - { FLOAT g=10000, t=1e30, x; - for ( f = 100; f < 10000; f++ ) { - x = ATHmdct( cfg, f ); - if ( t > x ) t = x, g = f; - } - printf("min=%g\n", g); - } */ -} - - -static float const payload_long[2][4] = -{ {-0.000f, -0.000f, -0.000f, +0.000f} -, {-0.500f, -0.250f, -0.025f, +0.500f} -}; -static float const payload_short[2][4] = -{ {-0.000f, -0.000f, -0.000f, +0.000f} -, {-2.000f, -1.000f, -0.050f, +0.500f} -}; - -/************************************************************************/ -/* initialization for iteration_loop */ -/************************************************************************/ -void -iteration_init(lame_internal_flags * gfc) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - III_side_info_t *const l3_side = &gfc->l3_side; - FLOAT adjust, db; - int i, sel; - - if (gfc->iteration_init_init == 0) { - gfc->iteration_init_init = 1; - - l3_side->main_data_begin = 0; - compute_ath(gfc); - - pow43[0] = 0.0; - for (i = 1; i < PRECALC_SIZE; i++) - pow43[i] = pow((FLOAT) i, 4.0 / 3.0); - -#ifdef TAKEHIRO_IEEE754_HACK - adj43asm[0] = 0.0; - for (i = 1; i < PRECALC_SIZE; i++) - adj43asm[i] = i - 0.5 - pow(0.5 * (pow43[i - 1] + pow43[i]), 0.75); -#else - for (i = 0; i < PRECALC_SIZE - 1; i++) - adj43[i] = (i + 1) - pow(0.5 * (pow43[i] + pow43[i + 1]), 0.75); - adj43[i] = 0.5; -#endif - for (i = 0; i < Q_MAX; i++) - ipow20[i] = pow(2.0, (double) (i - 210) * -0.1875); - for (i = 0; i <= Q_MAX + Q_MAX2; i++) - pow20[i] = pow(2.0, (double) (i - 210 - Q_MAX2) * 0.25); - - huffman_init(gfc); - init_xrpow_core_init(gfc); - - sel = 1;/* RH: all modes like vbr-new (cfg->vbr == vbr_mt || cfg->vbr == vbr_mtrh) ? 1 : 0;*/ - - /* long */ - db = cfg->adjust_bass_db + payload_long[sel][0]; - adjust = powf(10.f, db * 0.1f); - for (i = 0; i <= 6; ++i) { - gfc->sv_qnt.longfact[i] = adjust; - } - db = cfg->adjust_alto_db + payload_long[sel][1]; - adjust = powf(10.f, db * 0.1f); - for (; i <= 13; ++i) { - gfc->sv_qnt.longfact[i] = adjust; - } - db = cfg->adjust_treble_db + payload_long[sel][2]; - adjust = powf(10.f, db * 0.1f); - for (; i <= 20; ++i) { - gfc->sv_qnt.longfact[i] = adjust; - } - db = cfg->adjust_sfb21_db + payload_long[sel][3]; - adjust = powf(10.f, db * 0.1f); - for (; i < SBMAX_l; ++i) { - gfc->sv_qnt.longfact[i] = adjust; - } - - /* short */ - db = cfg->adjust_bass_db + payload_short[sel][0]; - adjust = powf(10.f, db * 0.1f); - for (i = 0; i <= 2; ++i) { - gfc->sv_qnt.shortfact[i] = adjust; - } - db = cfg->adjust_alto_db + payload_short[sel][1]; - adjust = powf(10.f, db * 0.1f); - for (; i <= 6; ++i) { - gfc->sv_qnt.shortfact[i] = adjust; - } - db = cfg->adjust_treble_db + payload_short[sel][2]; - adjust = powf(10.f, db * 0.1f); - for (; i <= 11; ++i) { - gfc->sv_qnt.shortfact[i] = adjust; - } - db = cfg->adjust_sfb21_db + payload_short[sel][3]; - adjust = powf(10.f, db * 0.1f); - for (; i < SBMAX_s; ++i) { - gfc->sv_qnt.shortfact[i] = adjust; - } - } -} - - - - - -/************************************************************************ - * allocate bits among 2 channels based on PE - * mt 6/99 - * bugfixes rh 8/01: often allocated more than the allowed 4095 bits - ************************************************************************/ -int -on_pe(lame_internal_flags * gfc, const FLOAT pe[][2], int targ_bits[2], int mean_bits, int gr, int cbr) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - int extra_bits = 0, tbits, bits; - int add_bits[2] = {0, 0}; - int max_bits; /* maximum allowed bits for this granule */ - int ch; - - /* allocate targ_bits for granule */ - ResvMaxBits(gfc, mean_bits, &tbits, &extra_bits, cbr); - max_bits = tbits + extra_bits; - if (max_bits > MAX_BITS_PER_GRANULE) /* hard limit per granule */ - max_bits = MAX_BITS_PER_GRANULE; - - for (bits = 0, ch = 0; ch < cfg->channels_out; ++ch) { - /****************************************************************** - * allocate bits for each channel - ******************************************************************/ - targ_bits[ch] = Min(MAX_BITS_PER_CHANNEL, tbits / cfg->channels_out); - - add_bits[ch] = targ_bits[ch] * pe[gr][ch] / 700.0 - targ_bits[ch]; - - /* at most increase bits by 1.5*average */ - if (add_bits[ch] > mean_bits * 3 / 4) - add_bits[ch] = mean_bits * 3 / 4; - if (add_bits[ch] < 0) - add_bits[ch] = 0; - - if (add_bits[ch] + targ_bits[ch] > MAX_BITS_PER_CHANNEL) - add_bits[ch] = Max(0, MAX_BITS_PER_CHANNEL - targ_bits[ch]); - - bits += add_bits[ch]; - } - if (bits > extra_bits && bits > 0) { - for (ch = 0; ch < cfg->channels_out; ++ch) { - add_bits[ch] = extra_bits * add_bits[ch] / bits; - } - } - - for (ch = 0; ch < cfg->channels_out; ++ch) { - targ_bits[ch] += add_bits[ch]; - extra_bits -= add_bits[ch]; - } - - for (bits = 0, ch = 0; ch < cfg->channels_out; ++ch) { - bits += targ_bits[ch]; - } - if (bits > MAX_BITS_PER_GRANULE) { - int sum = 0; - for (ch = 0; ch < cfg->channels_out; ++ch) { - targ_bits[ch] *= MAX_BITS_PER_GRANULE; - targ_bits[ch] /= bits; - sum += targ_bits[ch]; - } - assert(sum <= MAX_BITS_PER_GRANULE); - } - - return max_bits; -} - - - - -void -reduce_side(int targ_bits[2], FLOAT ms_ener_ratio, int mean_bits, int max_bits) -{ - int move_bits; - FLOAT fac; - - assert(max_bits <= MAX_BITS_PER_GRANULE); - assert(targ_bits[0] + targ_bits[1] <= MAX_BITS_PER_GRANULE); - - /* ms_ener_ratio = 0: allocate 66/33 mid/side fac=.33 - * ms_ener_ratio =.5: allocate 50/50 mid/side fac= 0 */ - /* 75/25 split is fac=.5 */ - /* float fac = .50*(.5-ms_ener_ratio[gr])/.5; */ - fac = .33 * (.5 - ms_ener_ratio) / .5; - if (fac < 0) - fac = 0; - if (fac > .5) - fac = .5; - - /* number of bits to move from side channel to mid channel */ - /* move_bits = fac*targ_bits[1]; */ - move_bits = fac * .5 * (targ_bits[0] + targ_bits[1]); - - if (move_bits > MAX_BITS_PER_CHANNEL - targ_bits[0]) { - move_bits = MAX_BITS_PER_CHANNEL - targ_bits[0]; - } - if (move_bits < 0) - move_bits = 0; - - if (targ_bits[1] >= 125) { - /* dont reduce side channel below 125 bits */ - if (targ_bits[1] - move_bits > 125) { - - /* if mid channel already has 2x more than average, dont bother */ - /* mean_bits = bits per granule (for both channels) */ - if (targ_bits[0] < mean_bits) - targ_bits[0] += move_bits; - targ_bits[1] -= move_bits; - } - else { - targ_bits[0] += targ_bits[1] - 125; - targ_bits[1] = 125; - } - } - - move_bits = targ_bits[0] + targ_bits[1]; - if (move_bits > max_bits) { - targ_bits[0] = (max_bits * targ_bits[0]) / move_bits; - targ_bits[1] = (max_bits * targ_bits[1]) / move_bits; - } - assert(targ_bits[0] <= MAX_BITS_PER_CHANNEL); - assert(targ_bits[1] <= MAX_BITS_PER_CHANNEL); - assert(targ_bits[0] + targ_bits[1] <= MAX_BITS_PER_GRANULE); -} - - -/** - * Robert Hegemann 2001-04-27: - * this adjusts the ATH, keeping the original noise floor - * affects the higher frequencies more than the lower ones - */ - -FLOAT -athAdjust(FLOAT a, FLOAT x, FLOAT athFloor, float ATHfixpoint) -{ - /* work in progress - */ - FLOAT const o = 90.30873362f; - FLOAT const p = (ATHfixpoint < 1.f) ? 94.82444863f : ATHfixpoint; - FLOAT u = FAST_LOG10_X(x, 10.0f); - FLOAT const v = a * a; - FLOAT w = 0.0f; - u -= athFloor; /* undo scaling */ - if (v > 1E-20f) - w = 1.f + FAST_LOG10_X(v, 10.0f / o); - if (w < 0) - w = 0.f; - u *= w; - u += athFloor + o - p; /* redo scaling */ - - return powf(10.f, 0.1f * u); -} - - - -/*************************************************************************/ -/* calc_xmin */ -/*************************************************************************/ - -/* - Calculate the allowed distortion for each scalefactor band, - as determined by the psychoacoustic model. - xmin(sb) = ratio(sb) * en(sb) / bw(sb) - - returns number of sfb's with energy > ATH -*/ - -int -calc_xmin(lame_internal_flags const *gfc, - III_psy_ratio const *const ratio, gr_info * const cod_info, FLOAT * pxmin) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - int sfb, gsfb, j = 0, ath_over = 0, k; - ATH_t const *const ATH = gfc->ATH; - const FLOAT *const xr = cod_info->xr; - int max_nonzero; - - for (gsfb = 0; gsfb < cod_info->psy_lmax; gsfb++) { - FLOAT en0, xmin; - FLOAT rh1, rh2, rh3; - int width, l; - - xmin = athAdjust(ATH->adjust_factor, ATH->l[gsfb], ATH->floor, cfg->ATHfixpoint); - xmin *= gfc->sv_qnt.longfact[gsfb]; - - width = cod_info->width[gsfb]; - rh1 = xmin / width; -#ifdef DBL_EPSILON - rh2 = DBL_EPSILON; -#else - rh2 = 2.2204460492503131e-016; -#endif - en0 = 0.0; - for (l = 0; l < width; ++l) { - FLOAT const xa = xr[j++]; - FLOAT const x2 = xa * xa; - en0 += x2; - rh2 += (x2 < rh1) ? x2 : rh1; - } - if (en0 > xmin) - ath_over++; - - if (en0 < xmin) { - rh3 = en0; - } - else if (rh2 < xmin) { - rh3 = xmin; - } - else { - rh3 = rh2; - } - xmin = rh3; - { - FLOAT const e = ratio->en.l[gsfb]; - if (e > 1e-12f) { - FLOAT x; - x = en0 * ratio->thm.l[gsfb] / e; - x *= gfc->sv_qnt.longfact[gsfb]; - if (xmin < x) - xmin = x; - } - } - xmin = Max(xmin, DBL_EPSILON); - cod_info->energy_above_cutoff[gsfb] = (en0 > xmin+1e-14f) ? 1 : 0; - *pxmin++ = xmin; - } /* end of long block loop */ - - - - - /*use this function to determine the highest non-zero coeff */ - max_nonzero = 0; - for (k = 575; k > 0; --k) { - if (fabs(xr[k]) > 1e-12f) { - max_nonzero = k; - break; - } - } - if (cod_info->block_type != SHORT_TYPE) { /* NORM, START or STOP type, but not SHORT */ - max_nonzero |= 1; /* only odd numbers */ - } - else { - max_nonzero /= 6; /* 3 short blocks */ - max_nonzero *= 6; - max_nonzero += 5; - } - - if (gfc->sv_qnt.sfb21_extra == 0 && cfg->samplerate_out < 44000) { - int const sfb_l = (cfg->samplerate_out <= 8000) ? 17 : 21; - int const sfb_s = (cfg->samplerate_out <= 8000) ? 9 : 12; - int limit = 575; - if (cod_info->block_type != SHORT_TYPE) { /* NORM, START or STOP type, but not SHORT */ - limit = gfc->scalefac_band.l[sfb_l]-1; - } - else { - limit = 3*gfc->scalefac_band.s[sfb_s]-1; - } - if (max_nonzero > limit) { - max_nonzero = limit; - } - } - cod_info->max_nonzero_coeff = max_nonzero; - - - - for (sfb = cod_info->sfb_smin; gsfb < cod_info->psymax; sfb++, gsfb += 3) { - int width, b, l; - FLOAT tmpATH; - - tmpATH = athAdjust(ATH->adjust_factor, ATH->s[sfb], ATH->floor, cfg->ATHfixpoint); - tmpATH *= gfc->sv_qnt.shortfact[sfb]; - - width = cod_info->width[gsfb]; - for (b = 0; b < 3; b++) { - FLOAT en0 = 0.0, xmin = tmpATH; - FLOAT rh1, rh2, rh3; - - rh1 = tmpATH / width; -#ifdef DBL_EPSILON - rh2 = DBL_EPSILON; -#else - rh2 = 2.2204460492503131e-016; -#endif - for (l = 0; l < width; ++l) { - FLOAT const xa = xr[j++]; - FLOAT const x2 = xa * xa; - en0 += x2; - rh2 += (x2 < rh1) ? x2 : rh1; - } - if (en0 > tmpATH) - ath_over++; - - if (en0 < tmpATH) { - rh3 = en0; - } - else if (rh2 < tmpATH) { - rh3 = tmpATH; - } - else { - rh3 = rh2; - } - xmin = rh3; - { - FLOAT const e = ratio->en.s[sfb][b]; - if (e > 1e-12f) { - FLOAT x; - x = en0 * ratio->thm.s[sfb][b] / e; - x *= gfc->sv_qnt.shortfact[sfb]; - if (xmin < x) - xmin = x; - } - } - xmin = Max(xmin, DBL_EPSILON); - cod_info->energy_above_cutoff[gsfb+b] = (en0 > xmin+1e-14f) ? 1 : 0; - *pxmin++ = xmin; - } /* b */ - if (cfg->use_temporal_masking_effect) { - if (pxmin[-3] > pxmin[-3 + 1]) - pxmin[-3 + 1] += (pxmin[-3] - pxmin[-3 + 1]) * gfc->cd_psy->decay; - if (pxmin[-3 + 1] > pxmin[-3 + 2]) - pxmin[-3 + 2] += (pxmin[-3 + 1] - pxmin[-3 + 2]) * gfc->cd_psy->decay; - } - } /* end of short block sfb loop */ - - return ath_over; -} - - -static FLOAT -calc_noise_core_c(const gr_info * const cod_info, int *startline, int l, FLOAT step) -{ - FLOAT noise = 0; - int j = *startline; - const int *const ix = cod_info->l3_enc; - - if (j > cod_info->count1) { - while (l--) { - FLOAT temp; - temp = cod_info->xr[j]; - j++; - noise += temp * temp; - temp = cod_info->xr[j]; - j++; - noise += temp * temp; - } - } - else if (j > cod_info->big_values) { - FLOAT ix01[2]; - ix01[0] = 0; - ix01[1] = step; - while (l--) { - FLOAT temp; - temp = fabs(cod_info->xr[j]) - ix01[ix[j]]; - j++; - noise += temp * temp; - temp = fabs(cod_info->xr[j]) - ix01[ix[j]]; - j++; - noise += temp * temp; - } - } - else { - while (l--) { - FLOAT temp; - temp = fabs(cod_info->xr[j]) - pow43[ix[j]] * step; - j++; - noise += temp * temp; - temp = fabs(cod_info->xr[j]) - pow43[ix[j]] * step; - j++; - noise += temp * temp; - } - } - - *startline = j; - return noise; -} - - -/*************************************************************************/ -/* calc_noise */ -/*************************************************************************/ - -/* -oo dB => -1.00 */ -/* - 6 dB => -0.97 */ -/* - 3 dB => -0.80 */ -/* - 2 dB => -0.64 */ -/* - 1 dB => -0.38 */ -/* 0 dB => 0.00 */ -/* + 1 dB => +0.49 */ -/* + 2 dB => +1.06 */ -/* + 3 dB => +1.68 */ -/* + 6 dB => +3.69 */ -/* +10 dB => +6.45 */ - -int -calc_noise(gr_info const *const cod_info, - FLOAT const *l3_xmin, - FLOAT * distort, calc_noise_result * const res, calc_noise_data * prev_noise) -{ - int sfb, l, over = 0; - FLOAT over_noise_db = 0; - FLOAT tot_noise_db = 0; /* 0 dB relative to masking */ - FLOAT max_noise = -20.0; /* -200 dB relative to masking */ - int j = 0; - const int *scalefac = cod_info->scalefac; - - res->over_SSD = 0; - - - for (sfb = 0; sfb < cod_info->psymax; sfb++) { - int const s = - cod_info->global_gain - (((*scalefac++) + (cod_info->preflag ? pretab[sfb] : 0)) - << (cod_info->scalefac_scale + 1)) - - cod_info->subblock_gain[cod_info->window[sfb]] * 8; - FLOAT const r_l3_xmin = 1.f / *l3_xmin++; - FLOAT distort_ = 0.0f; - FLOAT noise = 0.0f; - - if (prev_noise && (prev_noise->step[sfb] == s)) { - - /* use previously computed values */ - j += cod_info->width[sfb]; - distort_ = r_l3_xmin * prev_noise->noise[sfb]; - - noise = prev_noise->noise_log[sfb]; - - } - else { - FLOAT const step = POW20(s); - l = cod_info->width[sfb] >> 1; - - if ((j + cod_info->width[sfb]) > cod_info->max_nonzero_coeff) { - int usefullsize; - usefullsize = cod_info->max_nonzero_coeff - j + 1; - - if (usefullsize > 0) - l = usefullsize >> 1; - else - l = 0; - } - - noise = calc_noise_core_c(cod_info, &j, l, step); - - - if (prev_noise) { - /* save noise values */ - prev_noise->step[sfb] = s; - prev_noise->noise[sfb] = noise; - } - - distort_ = r_l3_xmin * noise; - - /* multiplying here is adding in dB, but can overflow */ - noise = FAST_LOG10(Max(distort_, 1E-20f)); - - if (prev_noise) { - /* save noise values */ - prev_noise->noise_log[sfb] = noise; - } - } - *distort++ = distort_; - - if (prev_noise) { - /* save noise values */ - prev_noise->global_gain = cod_info->global_gain;; - } - - - /*tot_noise *= Max(noise, 1E-20); */ - tot_noise_db += noise; - - if (noise > 0.0) { - int tmp; - - tmp = Max((int) (noise * 10 + .5), 1); - res->over_SSD += tmp * tmp; - - over++; - /* multiplying here is adding in dB -but can overflow */ - /*over_noise *= noise; */ - over_noise_db += noise; - } - max_noise = Max(max_noise, noise); - - } - - res->over_count = over; - res->tot_noise = tot_noise_db; - res->over_noise = over_noise_db; - res->max_noise = max_noise; - - return over; -} - - - - - - - - -/************************************************************************ - * - * set_pinfo() - * - * updates plotting data - * - * Mark Taylor 2000-??-?? - * - * Robert Hegemann: moved noise/distortion calc into it - * - ************************************************************************/ - -static void -set_pinfo(lame_internal_flags const *gfc, - gr_info * const cod_info, const III_psy_ratio * const ratio, const int gr, const int ch) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - int sfb, sfb2; - int j, i, l, start, end, bw; - FLOAT en0, en1; - FLOAT const ifqstep = (cod_info->scalefac_scale == 0) ? .5 : 1.0; - int const *const scalefac = cod_info->scalefac; - - FLOAT l3_xmin[SFBMAX], xfsf[SFBMAX]; - calc_noise_result noise; - - (void) calc_xmin(gfc, ratio, cod_info, l3_xmin); - (void) calc_noise(cod_info, l3_xmin, xfsf, &noise, 0); - - j = 0; - sfb2 = cod_info->sfb_lmax; - if (cod_info->block_type != SHORT_TYPE && !cod_info->mixed_block_flag) - sfb2 = 22; - for (sfb = 0; sfb < sfb2; sfb++) { - start = gfc->scalefac_band.l[sfb]; - end = gfc->scalefac_band.l[sfb + 1]; - bw = end - start; - for (en0 = 0.0; j < end; j++) - en0 += cod_info->xr[j] * cod_info->xr[j]; - en0 /= bw; - /* convert to MDCT units */ - en1 = 1e15; /* scaling so it shows up on FFT plot */ - gfc->pinfo->en[gr][ch][sfb] = en1 * en0; - gfc->pinfo->xfsf[gr][ch][sfb] = en1 * l3_xmin[sfb] * xfsf[sfb] / bw; - - if (ratio->en.l[sfb] > 0 && !cfg->ATHonly) - en0 = en0 / ratio->en.l[sfb]; - else - en0 = 0.0; - - gfc->pinfo->thr[gr][ch][sfb] = en1 * Max(en0 * ratio->thm.l[sfb], gfc->ATH->l[sfb]); - - /* there is no scalefactor bands >= SBPSY_l */ - gfc->pinfo->LAMEsfb[gr][ch][sfb] = 0; - if (cod_info->preflag && sfb >= 11) - gfc->pinfo->LAMEsfb[gr][ch][sfb] = -ifqstep * pretab[sfb]; - - if (sfb < SBPSY_l) { - assert(scalefac[sfb] >= 0); /* scfsi should be decoded by caller side */ - gfc->pinfo->LAMEsfb[gr][ch][sfb] -= ifqstep * scalefac[sfb]; - } - } /* for sfb */ - - if (cod_info->block_type == SHORT_TYPE) { - sfb2 = sfb; - for (sfb = cod_info->sfb_smin; sfb < SBMAX_s; sfb++) { - start = gfc->scalefac_band.s[sfb]; - end = gfc->scalefac_band.s[sfb + 1]; - bw = end - start; - for (i = 0; i < 3; i++) { - for (en0 = 0.0, l = start; l < end; l++) { - en0 += cod_info->xr[j] * cod_info->xr[j]; - j++; - } - en0 = Max(en0 / bw, 1e-20); - /* convert to MDCT units */ - en1 = 1e15; /* scaling so it shows up on FFT plot */ - - gfc->pinfo->en_s[gr][ch][3 * sfb + i] = en1 * en0; - gfc->pinfo->xfsf_s[gr][ch][3 * sfb + i] = en1 * l3_xmin[sfb2] * xfsf[sfb2] / bw; - if (ratio->en.s[sfb][i] > 0) - en0 = en0 / ratio->en.s[sfb][i]; - else - en0 = 0.0; - if (cfg->ATHonly || cfg->ATHshort) - en0 = 0; - - gfc->pinfo->thr_s[gr][ch][3 * sfb + i] = - en1 * Max(en0 * ratio->thm.s[sfb][i], gfc->ATH->s[sfb]); - - /* there is no scalefactor bands >= SBPSY_s */ - gfc->pinfo->LAMEsfb_s[gr][ch][3 * sfb + i] - = -2.0 * cod_info->subblock_gain[i]; - if (sfb < SBPSY_s) { - gfc->pinfo->LAMEsfb_s[gr][ch][3 * sfb + i] -= ifqstep * scalefac[sfb2]; - } - sfb2++; - } - } - } /* block type short */ - gfc->pinfo->LAMEqss[gr][ch] = cod_info->global_gain; - gfc->pinfo->LAMEmainbits[gr][ch] = cod_info->part2_3_length + cod_info->part2_length; - gfc->pinfo->LAMEsfbits[gr][ch] = cod_info->part2_length; - - gfc->pinfo->over[gr][ch] = noise.over_count; - gfc->pinfo->max_noise[gr][ch] = noise.max_noise * 10.0; - gfc->pinfo->over_noise[gr][ch] = noise.over_noise * 10.0; - gfc->pinfo->tot_noise[gr][ch] = noise.tot_noise * 10.0; - gfc->pinfo->over_SSD[gr][ch] = noise.over_SSD; -} - - -/************************************************************************ - * - * set_frame_pinfo() - * - * updates plotting data for a whole frame - * - * Robert Hegemann 2000-10-21 - * - ************************************************************************/ - -void -set_frame_pinfo(lame_internal_flags * gfc, const III_psy_ratio ratio[2][2]) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - int ch; - int gr; - - /* for every granule and channel patch l3_enc and set info - */ - for (gr = 0; gr < cfg->mode_gr; gr++) { - for (ch = 0; ch < cfg->channels_out; ch++) { - gr_info *const cod_info = &gfc->l3_side.tt[gr][ch]; - int scalefac_sav[SFBMAX]; - memcpy(scalefac_sav, cod_info->scalefac, sizeof(scalefac_sav)); - - /* reconstruct the scalefactors in case SCFSI was used - */ - if (gr == 1) { - int sfb; - for (sfb = 0; sfb < cod_info->sfb_lmax; sfb++) { - if (cod_info->scalefac[sfb] < 0) /* scfsi */ - cod_info->scalefac[sfb] = gfc->l3_side.tt[0][ch].scalefac[sfb]; - } - } - - set_pinfo(gfc, cod_info, &ratio[gr][ch], gr, ch); - memcpy(cod_info->scalefac, scalefac_sav, sizeof(scalefac_sav)); - } /* for ch */ - } /* for gr */ -} diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/quantize_pvt.h b/recorderlib/src/main/jni/lame-3.100_libmp3lame/quantize_pvt.h deleted file mode 100644 index b8333e7..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/quantize_pvt.h +++ /dev/null @@ -1,128 +0,0 @@ -/* - * quantize_pvt include file - * - * Copyright (c) 1999 Takehiro TOMINAGA - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef LAME_QUANTIZE_PVT_H -#define LAME_QUANTIZE_PVT_H - -#define IXMAX_VAL 8206 /* ix always <= 8191+15. see count_bits() */ - -/* buggy Winamp decoder cannot handle values > 8191 */ -/* #define IXMAX_VAL 8191 */ - -#define PRECALC_SIZE (IXMAX_VAL+2) - - -extern const int nr_of_sfb_block[6][3][4]; -extern const int pretab[SBMAX_l]; -extern const int slen1_tab[16]; -extern const int slen2_tab[16]; - -extern const scalefac_struct sfBandIndex[9]; - -extern FLOAT pow43[PRECALC_SIZE]; -#ifdef TAKEHIRO_IEEE754_HACK -extern FLOAT adj43asm[PRECALC_SIZE]; -#else -extern FLOAT adj43[PRECALC_SIZE]; -#endif - -#define Q_MAX (256+1) -#define Q_MAX2 116 /* minimum possible number of - -cod_info->global_gain - + ((scalefac[] + (cod_info->preflag ? pretab[sfb] : 0)) - << (cod_info->scalefac_scale + 1)) - + cod_info->subblock_gain[cod_info->window[sfb]] * 8; - - for long block, 0+((15+3)<<2) = 18*4 = 72 - for short block, 0+(15<<2)+7*8 = 15*4+56 = 116 - */ - -extern FLOAT pow20[Q_MAX + Q_MAX2 + 1]; -extern FLOAT ipow20[Q_MAX]; - -typedef struct calc_noise_result_t { - FLOAT over_noise; /* sum of quantization noise > masking */ - FLOAT tot_noise; /* sum of all quantization noise */ - FLOAT max_noise; /* max quantization noise */ - int over_count; /* number of quantization noise > masking */ - int over_SSD; /* SSD-like cost of distorted bands */ - int bits; -} calc_noise_result; - - -/** -* allows re-use of previously -* computed noise values -*/ -typedef struct calc_noise_data_t { - int global_gain; - int sfb_count1; - int step[39]; - FLOAT noise[39]; - FLOAT noise_log[39]; -} calc_noise_data; - - -int on_pe(lame_internal_flags * gfc, const FLOAT pe[2][2], - int targ_bits[2], int mean_bits, int gr, int cbr); - -void reduce_side(int targ_bits[2], FLOAT ms_ener_ratio, int mean_bits, int max_bits); - - -void iteration_init(lame_internal_flags * gfc); - - -int calc_xmin(lame_internal_flags const *gfc, - III_psy_ratio const *const ratio, gr_info * const cod_info, FLOAT * l3_xmin); - -int calc_noise(const gr_info * const cod_info, - const FLOAT * l3_xmin, - FLOAT * distort, calc_noise_result * const res, calc_noise_data * prev_noise); - -void set_frame_pinfo(lame_internal_flags * gfc, const III_psy_ratio ratio[2][2]); - - - - -/* takehiro.c */ - -int count_bits(lame_internal_flags const *const gfc, const FLOAT * const xr, - gr_info * const cod_info, calc_noise_data * prev_noise); -int noquant_count_bits(lame_internal_flags const *const gfc, - gr_info * const cod_info, calc_noise_data * prev_noise); - - -void best_huffman_divide(const lame_internal_flags * const gfc, gr_info * const cod_info); - -void best_scalefac_store(const lame_internal_flags * gfc, const int gr, const int ch, - III_side_info_t * const l3_side); - -int scale_bitcount(const lame_internal_flags * gfc, gr_info * cod_info); - -void huffman_init(lame_internal_flags * const gfc); - -void init_xrpow_core_init(lame_internal_flags * const gfc); - -FLOAT athAdjust(FLOAT a, FLOAT x, FLOAT athFloor, float ATHfixpoint); - -#define LARGE_BITS 100000 - -#endif /* LAME_QUANTIZE_PVT_H */ diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/reservoir.c b/recorderlib/src/main/jni/lame-3.100_libmp3lame/reservoir.c deleted file mode 100644 index 4fdaa8d..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/reservoir.c +++ /dev/null @@ -1,293 +0,0 @@ -/* - * bit reservoir source file - * - * Copyright (c) 1999-2000 Mark Taylor - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* $Id: reservoir.c,v 1.45 2011/05/07 16:05:17 rbrito Exp $ */ - -#ifdef HAVE_CONFIG_H -# include -#endif - - -#include "lame.h" -#include "machine.h" -#include "encoder.h" -#include "util.h" -#include "reservoir.h" - -#include "bitstream.h" -#include "lame-analysis.h" -#include "lame_global_flags.h" - - -/* - ResvFrameBegin: - Called (repeatedly) at the beginning of a frame. Updates the maximum - size of the reservoir, and checks to make sure main_data_begin - was set properly by the formatter -*/ - -/* - * Background information: - * - * This is the original text from the ISO standard. Because of - * sooo many bugs and irritations correcting comments are added - * in brackets []. A '^W' means you should remove the last word. - * - * 1) The following rule can be used to calculate the maximum - * number of bits used for one granule [^W frame]: - * At the highest possible bitrate of Layer III (320 kbps - * per stereo signal [^W^W^W], 48 kHz) the frames must be of - * [^W^W^W are designed to have] constant length, i.e. - * one buffer [^W^W the frame] length is: - * - * 320 kbps * 1152/48 kHz = 7680 bit = 960 byte - * - * This value is used as the maximum buffer per channel [^W^W] at - * lower bitrates [than 320 kbps]. At 64 kbps mono or 128 kbps - * stereo the main granule length is 64 kbps * 576/48 kHz = 768 bit - * [per granule and channel] at 48 kHz sampling frequency. - * This means that there is a maximum deviation (short time buffer - * [= reservoir]) of 7680 - 2*2*768 = 4608 bits is allowed at 64 kbps. - * The actual deviation is equal to the number of bytes [with the - * meaning of octets] denoted by the main_data_end offset pointer. - * The actual maximum deviation is (2^9-1)*8 bit = 4088 bits - * [for MPEG-1 and (2^8-1)*8 bit for MPEG-2, both are hard limits]. - * ... The xchange of buffer bits between the left and right channel - * is allowed without restrictions [exception: dual channel]. - * Because of the [constructed] constraint on the buffer size - * main_data_end is always set to 0 in the case of bit_rate_index==14, - * i.e. data rate 320 kbps per stereo signal [^W^W^W]. In this case - * all data are allocated between adjacent header [^W sync] words - * [, i.e. there is no buffering at all]. - */ - -int -ResvFrameBegin(lame_internal_flags * gfc, int *mean_bits) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - EncStateVar_t *const esv = &gfc->sv_enc; - int fullFrameBits; - int resvLimit; - int maxmp3buf; - III_side_info_t *const l3_side = &gfc->l3_side; - int frameLength; - int meanBits; - - frameLength = getframebits(gfc); - meanBits = (frameLength - cfg->sideinfo_len * 8) / cfg->mode_gr; - -/* - * Meaning of the variables: - * resvLimit: (0, 8, ..., 8*255 (MPEG-2), 8*511 (MPEG-1)) - * Number of bits can be stored in previous frame(s) due to - * counter size constaints - * maxmp3buf: ( ??? ... 8*1951 (MPEG-1 and 2), 8*2047 (MPEG-2.5)) - * Number of bits allowed to encode one frame (you can take 8*511 bit - * from the bit reservoir and at most 8*1440 bit from the current - * frame (320 kbps, 32 kHz), so 8*1951 bit is the largest possible - * value for MPEG-1 and -2) - * - * maximum allowed granule/channel size times 4 = 8*2047 bits., - * so this is the absolute maximum supported by the format. - * - * - * fullFrameBits: maximum number of bits available for encoding - * the current frame. - * - * mean_bits: target number of bits per granule. - * - * frameLength: - * - * gfc->ResvMax: maximum allowed reservoir - * - * gfc->ResvSize: current reservoir size - * - * l3_side->resvDrain_pre: - * ancillary data to be added to previous frame: - * (only usefull in VBR modes if it is possible to have - * maxmp3buf < fullFrameBits)). Currently disabled, - * see #define NEW_DRAIN - * 2010-02-13: RH now enabled, it seems to be needed for CBR too, - * as there exists one example, where the FhG decoder - * can't decode a -b320 CBR file anymore. - * - * l3_side->resvDrain_post: - * ancillary data to be added to this frame: - * - */ - - /* main_data_begin has 9 bits in MPEG-1, 8 bits MPEG-2 */ - resvLimit = (8 * 256) * cfg->mode_gr - 8; - - /* maximum allowed frame size. dont use more than this number of - bits, even if the frame has the space for them: */ - maxmp3buf = cfg->buffer_constraint; - esv->ResvMax = maxmp3buf - frameLength; - if (esv->ResvMax > resvLimit) - esv->ResvMax = resvLimit; - if (esv->ResvMax < 0 || cfg->disable_reservoir) - esv->ResvMax = 0; - - fullFrameBits = meanBits * cfg->mode_gr + Min(esv->ResvSize, esv->ResvMax); - - if (fullFrameBits > maxmp3buf) - fullFrameBits = maxmp3buf; - - assert(0 == esv->ResvMax % 8); - assert(esv->ResvMax >= 0); - - l3_side->resvDrain_pre = 0; - - if (gfc->pinfo != NULL) { - gfc->pinfo->mean_bits = meanBits / 2; /* expected bits per channel per granule [is this also right for mono/stereo, MPEG-1/2 ?] */ - gfc->pinfo->resvsize = esv->ResvSize; - } - *mean_bits = meanBits; - return fullFrameBits; -} - - -/* - ResvMaxBits - returns targ_bits: target number of bits to use for 1 granule - extra_bits: amount extra available from reservoir - Mark Taylor 4/99 -*/ -void -ResvMaxBits(lame_internal_flags * gfc, int mean_bits, int *targ_bits, int *extra_bits, int cbr) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - EncStateVar_t *const esv = &gfc->sv_enc; - int add_bits, targBits, extraBits; - int ResvSize = esv->ResvSize, ResvMax = esv->ResvMax; - - /* conpensate the saved bits used in the 1st granule */ - if (cbr) - ResvSize += mean_bits; - - if (gfc->sv_qnt.substep_shaping & 1) - ResvMax *= 0.9; - - targBits = mean_bits; - - /* extra bits if the reservoir is almost full */ - if (ResvSize * 10 > ResvMax * 9) { - add_bits = ResvSize - (ResvMax * 9) / 10; - targBits += add_bits; - gfc->sv_qnt.substep_shaping |= 0x80; - } - else { - add_bits = 0; - gfc->sv_qnt.substep_shaping &= 0x7f; - /* build up reservoir. this builds the reservoir a little slower - * than FhG. It could simple be mean_bits/15, but this was rigged - * to always produce 100 (the old value) at 128kbs */ - /* *targ_bits -= (int) (mean_bits/15.2); */ - if (!cfg->disable_reservoir && !(gfc->sv_qnt.substep_shaping & 1)) - targBits -= .1 * mean_bits; - } - - - /* amount from the reservoir we are allowed to use. ISO says 6/10 */ - extraBits = (ResvSize < (esv->ResvMax * 6) / 10 ? ResvSize : (esv->ResvMax * 6) / 10); - extraBits -= add_bits; - - if (extraBits < 0) - extraBits = 0; - - *targ_bits = targBits; - *extra_bits = extraBits; -} - -/* - ResvAdjust: - Called after a granule's bit allocation. Readjusts the size of - the reservoir to reflect the granule's usage. -*/ -void -ResvAdjust(lame_internal_flags * gfc, gr_info const *gi) -{ - gfc->sv_enc.ResvSize -= gi->part2_3_length + gi->part2_length; -} - - -/* - ResvFrameEnd: - Called after all granules in a frame have been allocated. Makes sure - that the reservoir size is within limits, possibly by adding stuffing - bits. -*/ -void -ResvFrameEnd(lame_internal_flags * gfc, int mean_bits) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - EncStateVar_t *const esv = &gfc->sv_enc; - III_side_info_t *const l3_side = &gfc->l3_side; - int stuffingBits; - int over_bits; - - esv->ResvSize += mean_bits * cfg->mode_gr; - stuffingBits = 0; - l3_side->resvDrain_post = 0; - l3_side->resvDrain_pre = 0; - - /* we must be byte aligned */ - if ((over_bits = esv->ResvSize % 8) != 0) - stuffingBits += over_bits; - - - over_bits = (esv->ResvSize - stuffingBits) - esv->ResvMax; - if (over_bits > 0) { - assert(0 == over_bits % 8); - assert(over_bits >= 0); - stuffingBits += over_bits; - } - - - /* NOTE: enabling the NEW_DRAIN code fixes some problems with FhG decoder - shipped with MS Windows operating systems. Using this, it is even - possible to use Gabriel's lax buffer consideration again, which - assumes, any decoder should have a buffer large enough - for a 320 kbps frame at 32 kHz sample rate. - - old drain code: - lame -b320 BlackBird.wav ---> does not play with GraphEdit.exe using FhG decoder V1.5 Build 50 - - new drain code: - lame -b320 BlackBird.wav ---> plays fine with GraphEdit.exe using FhG decoder V1.5 Build 50 - - Robert Hegemann, 2010-02-13. - */ - /* drain as many bits as possible into previous frame ancillary data - * In particular, in VBR mode ResvMax may have changed, and we have - * to make sure main_data_begin does not create a reservoir bigger - * than ResvMax mt 4/00*/ - { - int mdb_bytes = Min(l3_side->main_data_begin * 8, stuffingBits) / 8; - l3_side->resvDrain_pre += 8 * mdb_bytes; - stuffingBits -= 8 * mdb_bytes; - esv->ResvSize -= 8 * mdb_bytes; - l3_side->main_data_begin -= mdb_bytes; - } - /* drain the rest into this frames ancillary data */ - l3_side->resvDrain_post += stuffingBits; - esv->ResvSize -= stuffingBits; -} diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/reservoir.h b/recorderlib/src/main/jni/lame-3.100_libmp3lame/reservoir.h deleted file mode 100644 index 7c58593..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/reservoir.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * bit reservoir include file - * - * Copyright (c) 1999 Mark Taylor - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef LAME_RESERVOIR_H -#define LAME_RESERVOIR_H - -int ResvFrameBegin(lame_internal_flags * gfc, int *mean_bits); -void ResvMaxBits(lame_internal_flags * gfc, int mean_bits, int *targ_bits, int *max_bits, - int cbr); -void ResvAdjust(lame_internal_flags * gfc, gr_info const *gi); -void ResvFrameEnd(lame_internal_flags * gfc, int mean_bits); - -#endif /* LAME_RESERVOIR_H */ diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/set_get.c b/recorderlib/src/main/jni/lame-3.100_libmp3lame/set_get.c deleted file mode 100644 index f763900..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/set_get.c +++ /dev/null @@ -1,2346 +0,0 @@ -/* -*- mode: C; mode: fold -*- */ -/* - * set/get functions for lame_global_flags - * - * Copyright (c) 2001-2005 Alexander Leidinger - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* $Id: set_get.c,v 1.104 2017/09/06 15:07:30 robert Exp $ */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include "lame.h" -#include "machine.h" -#include "encoder.h" -#include "util.h" -#include "bitstream.h" /* because of compute_flushbits */ - -#include "set_get.h" -#include "lame_global_flags.h" - -/* - * input stream description - */ - - -/* number of samples */ -/* it's unlikely for this function to return an error */ -int -lame_set_num_samples(lame_global_flags * gfp, unsigned long num_samples) -{ - if (is_lame_global_flags_valid(gfp)) { - /* default = 2^32-1 */ - gfp->num_samples = num_samples; - return 0; - } - return -1; -} - -unsigned long -lame_get_num_samples(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->num_samples; - } - return 0; -} - - -/* input samplerate */ -int -lame_set_in_samplerate(lame_global_flags * gfp, int in_samplerate) -{ - if (is_lame_global_flags_valid(gfp)) { - if (in_samplerate < 1) - return -1; - /* input sample rate in Hz, default = 44100 Hz */ - gfp->samplerate_in = in_samplerate; - return 0; - } - return -1; -} - -int -lame_get_in_samplerate(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->samplerate_in; - } - return 0; -} - - -/* number of channels in input stream */ -int -lame_set_num_channels(lame_global_flags * gfp, int num_channels) -{ - if (is_lame_global_flags_valid(gfp)) { - /* default = 2 */ - if (2 < num_channels || 0 >= num_channels) { - return -1; /* we don't support more than 2 channels */ - } - gfp->num_channels = num_channels; - return 0; - } - return -1; -} - -int -lame_get_num_channels(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->num_channels; - } - return 0; -} - - -/* scale the input by this amount before encoding (not used for decoding) */ -int -lame_set_scale(lame_global_flags * gfp, float scale) -{ - if (is_lame_global_flags_valid(gfp)) { - /* default = 1 */ - gfp->scale = scale; - return 0; - } - return -1; -} - -float -lame_get_scale(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->scale; - } - return 0; -} - - -/* scale the channel 0 (left) input by this amount before - encoding (not used for decoding) */ -int -lame_set_scale_left(lame_global_flags * gfp, float scale) -{ - if (is_lame_global_flags_valid(gfp)) { - /* default = 1 */ - gfp->scale_left = scale; - return 0; - } - return -1; -} - -float -lame_get_scale_left(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->scale_left; - } - return 0; -} - - -/* scale the channel 1 (right) input by this amount before - encoding (not used for decoding) */ -int -lame_set_scale_right(lame_global_flags * gfp, float scale) -{ - if (is_lame_global_flags_valid(gfp)) { - /* default = 1 */ - gfp->scale_right = scale; - return 0; - } - return -1; -} - -float -lame_get_scale_right(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->scale_right; - } - return 0; -} - - -/* output sample rate in Hz */ -int -lame_set_out_samplerate(lame_global_flags * gfp, int out_samplerate) -{ - if (is_lame_global_flags_valid(gfp)) { - /* - * default = 0: LAME picks best value based on the amount - * of compression - * MPEG only allows: - * MPEG1 32, 44.1, 48khz - * MPEG2 16, 22.05, 24 - * MPEG2.5 8, 11.025, 12 - * - * (not used by decoding routines) - */ - if (out_samplerate != 0) { - int v=0; - if (SmpFrqIndex(out_samplerate, &v) < 0) - return -1; - } - gfp->samplerate_out = out_samplerate; - return 0; - } - return -1; -} - -int -lame_get_out_samplerate(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->samplerate_out; - } - return 0; -} - - - - -/* - * general control parameters - */ - -/* collect data for an MP3 frame analzyer */ -int -lame_set_analysis(lame_global_flags * gfp, int analysis) -{ - if (is_lame_global_flags_valid(gfp)) { - /* default = 0 */ - - /* enforce disable/enable meaning, if we need more than two values - we need to switch to an enum to have an apropriate representation - of the possible meanings of the value */ - if (0 > analysis || 1 < analysis) - return -1; - gfp->analysis = analysis; - return 0; - } - return -1; -} - -int -lame_get_analysis(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - assert(0 <= gfp->analysis && 1 >= gfp->analysis); - return gfp->analysis; - } - return 0; -} - - -/* write a Xing VBR header frame */ -int -lame_set_bWriteVbrTag(lame_global_flags * gfp, int bWriteVbrTag) -{ - if (is_lame_global_flags_valid(gfp)) { - /* default = 1 (on) for VBR/ABR modes, 0 (off) for CBR mode */ - - /* enforce disable/enable meaning, if we need more than two values - we need to switch to an enum to have an apropriate representation - of the possible meanings of the value */ - if (0 > bWriteVbrTag || 1 < bWriteVbrTag) - return -1; - gfp->write_lame_tag = bWriteVbrTag; - return 0; - } - return -1; -} - -int -lame_get_bWriteVbrTag(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - assert(0 <= gfp->write_lame_tag && 1 >= gfp->write_lame_tag); - return gfp->write_lame_tag; - } - return 0; -} - - - -/* decode only, use lame/mpglib to convert mp3 to wav */ -int -lame_set_decode_only(lame_global_flags * gfp, int decode_only) -{ - if (is_lame_global_flags_valid(gfp)) { - /* default = 0 (disabled) */ - - /* enforce disable/enable meaning, if we need more than two values - we need to switch to an enum to have an apropriate representation - of the possible meanings of the value */ - if (0 > decode_only || 1 < decode_only) - return -1; - gfp->decode_only = decode_only; - return 0; - } - return -1; -} - -int -lame_get_decode_only(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - assert(0 <= gfp->decode_only && 1 >= gfp->decode_only); - return gfp->decode_only; - } - return 0; -} - - -#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED -/* 1=encode a Vorbis .ogg file. default=0 */ -/* DEPRECATED */ -int CDECL lame_set_ogg(lame_global_flags *, int); -int CDECL lame_get_ogg(const lame_global_flags *); -#else -#endif - -/* encode a Vorbis .ogg file */ -/* DEPRECATED */ -int -lame_set_ogg(lame_global_flags * gfp, int ogg) -{ - (void) gfp; - (void) ogg; - return -1; -} - -int -lame_get_ogg(const lame_global_flags * gfp) -{ - (void) gfp; - return 0; -} - - -/* - * Internal algorithm selection. - * True quality is determined by the bitrate but this variable will effect - * quality by selecting expensive or cheap algorithms. - * quality=0..9. 0=best (very slow). 9=worst. - * recommended: 3 near-best quality, not too slow - * 5 good quality, fast - * 7 ok quality, really fast - */ -int -lame_set_quality(lame_global_flags * gfp, int quality) -{ - if (is_lame_global_flags_valid(gfp)) { - if (quality < 0) { - gfp->quality = 0; - } - else if (quality > 9) { - gfp->quality = 9; - } - else { - gfp->quality = quality; - } - return 0; - } - return -1; -} - -int -lame_get_quality(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->quality; - } - return 0; -} - - -/* mode = STEREO, JOINT_STEREO, DUAL_CHANNEL (not supported), MONO */ -int -lame_set_mode(lame_global_flags * gfp, MPEG_mode mode) -{ - if (is_lame_global_flags_valid(gfp)) { - int mpg_mode = mode; - /* default: lame chooses based on compression ratio and input channels */ - if (mpg_mode < 0 || MAX_INDICATOR <= mpg_mode) - return -1; /* Unknown MPEG mode! */ - gfp->mode = mode; - return 0; - } - return -1; -} - -MPEG_mode -lame_get_mode(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - assert(gfp->mode < MAX_INDICATOR); - return gfp->mode; - } - return NOT_SET; -} - - -#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED -/* - mode_automs. Use a M/S mode with a switching threshold based on - compression ratio - DEPRECATED -*/ -int CDECL lame_set_mode_automs(lame_global_flags *, int); -int CDECL lame_get_mode_automs(const lame_global_flags *); -#else -#endif - -/* Us a M/S mode with a switching threshold based on compression ratio */ -/* DEPRECATED */ -int -lame_set_mode_automs(lame_global_flags * gfp, int mode_automs) -{ - if (is_lame_global_flags_valid(gfp)) { - /* default = 0 (disabled) */ - - /* enforce disable/enable meaning, if we need more than two values - we need to switch to an enum to have an apropriate representation - of the possible meanings of the value */ - if (0 > mode_automs || 1 < mode_automs) - return -1; - lame_set_mode(gfp, JOINT_STEREO); - return 0; - } - return -1; -} - -int -lame_get_mode_automs(const lame_global_flags * gfp) -{ - (void) gfp; - return 1; -} - - -/* - * Force M/S for all frames. For testing only. - * Requires mode = 1. - */ -int -lame_set_force_ms(lame_global_flags * gfp, int force_ms) -{ - if (is_lame_global_flags_valid(gfp)) { - /* default = 0 (disabled) */ - - /* enforce disable/enable meaning, if we need more than two values - we need to switch to an enum to have an apropriate representation - of the possible meanings of the value */ - if (0 > force_ms || 1 < force_ms) - return -1; - gfp->force_ms = force_ms; - return 0; - } - return -1; -} - -int -lame_get_force_ms(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - assert(0 <= gfp->force_ms && 1 >= gfp->force_ms); - return gfp->force_ms; - } - return 0; -} - - -/* Use free_format. */ -int -lame_set_free_format(lame_global_flags * gfp, int free_format) -{ - if (is_lame_global_flags_valid(gfp)) { - /* default = 0 (disabled) */ - - /* enforce disable/enable meaning, if we need more than two values - we need to switch to an enum to have an apropriate representation - of the possible meanings of the value */ - if (0 > free_format || 1 < free_format) - return -1; - gfp->free_format = free_format; - return 0; - } - return -1; -} - -int -lame_get_free_format(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - assert(0 <= gfp->free_format && 1 >= gfp->free_format); - return gfp->free_format; - } - return 0; -} - - - -/* Perform ReplayGain analysis */ -int -lame_set_findReplayGain(lame_global_flags * gfp, int findReplayGain) -{ - if (is_lame_global_flags_valid(gfp)) { - /* default = 0 (disabled) */ - - /* enforce disable/enable meaning, if we need more than two values - we need to switch to an enum to have an apropriate representation - of the possible meanings of the value */ - if (0 > findReplayGain || 1 < findReplayGain) - return -1; - gfp->findReplayGain = findReplayGain; - return 0; - } - return -1; -} - -int -lame_get_findReplayGain(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - assert(0 <= gfp->findReplayGain && 1 >= gfp->findReplayGain); - return gfp->findReplayGain; - } - return 0; -} - - -/* Decode on the fly. Find the peak sample. If ReplayGain analysis is - enabled then perform it on the decoded data. */ -int -lame_set_decode_on_the_fly(lame_global_flags * gfp, int decode_on_the_fly) -{ - if (is_lame_global_flags_valid(gfp)) { -#ifndef DECODE_ON_THE_FLY - return -1; -#else - /* default = 0 (disabled) */ - - /* enforce disable/enable meaning, if we need more than two values - we need to switch to an enum to have an apropriate representation - of the possible meanings of the value */ - if (0 > decode_on_the_fly || 1 < decode_on_the_fly) - return -1; - - gfp->decode_on_the_fly = decode_on_the_fly; - - return 0; -#endif - } - return -1; -} - -int -lame_get_decode_on_the_fly(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - assert(0 <= gfp->decode_on_the_fly && 1 >= gfp->decode_on_the_fly); - return gfp->decode_on_the_fly; - } - return 0; -} - -#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED -/* DEPRECATED: now does the same as lame_set_findReplayGain() - default = 0 (disabled) */ -int CDECL lame_set_ReplayGain_input(lame_global_flags *, int); -int CDECL lame_get_ReplayGain_input(const lame_global_flags *); - -/* DEPRECATED: now does the same as - lame_set_decode_on_the_fly() && lame_set_findReplayGain() - default = 0 (disabled) */ -int CDECL lame_set_ReplayGain_decode(lame_global_flags *, int); -int CDECL lame_get_ReplayGain_decode(const lame_global_flags *); - -/* DEPRECATED: now does the same as lame_set_decode_on_the_fly() - default = 0 (disabled) */ -int CDECL lame_set_findPeakSample(lame_global_flags *, int); -int CDECL lame_get_findPeakSample(const lame_global_flags *); -#else -#endif - -/* DEPRECATED. same as lame_set_decode_on_the_fly() */ -int -lame_set_findPeakSample(lame_global_flags * gfp, int arg) -{ - return lame_set_decode_on_the_fly(gfp, arg); -} - -int -lame_get_findPeakSample(const lame_global_flags * gfp) -{ - return lame_get_decode_on_the_fly(gfp); -} - -/* DEPRECATED. same as lame_set_findReplayGain() */ -int -lame_set_ReplayGain_input(lame_global_flags * gfp, int arg) -{ - return lame_set_findReplayGain(gfp, arg); -} - -int -lame_get_ReplayGain_input(const lame_global_flags * gfp) -{ - return lame_get_findReplayGain(gfp); -} - -/* DEPRECATED. same as lame_set_decode_on_the_fly() && - lame_set_findReplayGain() */ -int -lame_set_ReplayGain_decode(lame_global_flags * gfp, int arg) -{ - if (lame_set_decode_on_the_fly(gfp, arg) < 0 || lame_set_findReplayGain(gfp, arg) < 0) - return -1; - else - return 0; -} - -int -lame_get_ReplayGain_decode(const lame_global_flags * gfp) -{ - if (lame_get_decode_on_the_fly(gfp) > 0 && lame_get_findReplayGain(gfp) > 0) - return 1; - else - return 0; -} - - -/* set and get some gapless encoding flags */ - -int -lame_set_nogap_total(lame_global_flags * gfp, int the_nogap_total) -{ - if (is_lame_global_flags_valid(gfp)) { - gfp->nogap_total = the_nogap_total; - return 0; - } - return -1; -} - -int -lame_get_nogap_total(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->nogap_total; - } - return 0; -} - -int -lame_set_nogap_currentindex(lame_global_flags * gfp, int the_nogap_index) -{ - if (is_lame_global_flags_valid(gfp)) { - gfp->nogap_current = the_nogap_index; - return 0; - } - return -1; -} - -int -lame_get_nogap_currentindex(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->nogap_current; - } - return 0; -} - - -/* message handlers */ -int -lame_set_errorf(lame_global_flags * gfp, void (*func) (const char *, va_list)) -{ - if (is_lame_global_flags_valid(gfp)) { - gfp->report.errorf = func; - return 0; - } - return -1; -} - -int -lame_set_debugf(lame_global_flags * gfp, void (*func) (const char *, va_list)) -{ - if (is_lame_global_flags_valid(gfp)) { - gfp->report.debugf = func; - return 0; - } - return -1; -} - -int -lame_set_msgf(lame_global_flags * gfp, void (*func) (const char *, va_list)) -{ - if (is_lame_global_flags_valid(gfp)) { - gfp->report.msgf = func; - return 0; - } - return -1; -} - - -/* - * Set one of - * - brate - * - compression ratio. - * - * Default is compression ratio of 11. - */ -int -lame_set_brate(lame_global_flags * gfp, int brate) -{ - if (is_lame_global_flags_valid(gfp)) { - gfp->brate = brate; - if (brate > 320) { - gfp->disable_reservoir = 1; - } - return 0; - } - return -1; -} - -int -lame_get_brate(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->brate; - } - return 0; -} - -int -lame_set_compression_ratio(lame_global_flags * gfp, float compression_ratio) -{ - if (is_lame_global_flags_valid(gfp)) { - gfp->compression_ratio = compression_ratio; - return 0; - } - return -1; -} - -float -lame_get_compression_ratio(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->compression_ratio; - } - return 0; -} - - - - -/* - * frame parameters - */ - -/* Mark as copyright protected. */ -int -lame_set_copyright(lame_global_flags * gfp, int copyright) -{ - if (is_lame_global_flags_valid(gfp)) { - /* default = 0 (disabled) */ - - /* enforce disable/enable meaning, if we need more than two values - we need to switch to an enum to have an apropriate representation - of the possible meanings of the value */ - if (0 > copyright || 1 < copyright) - return -1; - gfp->copyright = copyright; - return 0; - } - return -1; -} - -int -lame_get_copyright(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - assert(0 <= gfp->copyright && 1 >= gfp->copyright); - return gfp->copyright; - } - return 0; -} - - -/* Mark as original. */ -int -lame_set_original(lame_global_flags * gfp, int original) -{ - if (is_lame_global_flags_valid(gfp)) { - /* default = 1 (enabled) */ - - /* enforce disable/enable meaning, if we need more than two values - we need to switch to an enum to have an apropriate representation - of the possible meanings of the value */ - if (0 > original || 1 < original) - return -1; - gfp->original = original; - return 0; - } - return -1; -} - -int -lame_get_original(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - assert(0 <= gfp->original && 1 >= gfp->original); - return gfp->original; - } - return 0; -} - - -/* - * error_protection. - * Use 2 bytes from each frame for CRC checksum. - */ -int -lame_set_error_protection(lame_global_flags * gfp, int error_protection) -{ - if (is_lame_global_flags_valid(gfp)) { - /* default = 0 (disabled) */ - - /* enforce disable/enable meaning, if we need more than two values - we need to switch to an enum to have an apropriate representation - of the possible meanings of the value */ - if (0 > error_protection || 1 < error_protection) - return -1; - gfp->error_protection = error_protection; - return 0; - } - return -1; -} - -int -lame_get_error_protection(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - assert(0 <= gfp->error_protection && 1 >= gfp->error_protection); - return gfp->error_protection; - } - return 0; -} - - -#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED -/* padding_type. 0=pad no frames 1=pad all frames 2=adjust padding(default) */ -int CDECL lame_set_padding_type(lame_global_flags *, Padding_type); -Padding_type CDECL lame_get_padding_type(const lame_global_flags *); -#else -#endif - -/* - * padding_type. - * PAD_NO = pad no frames - * PAD_ALL = pad all frames - * PAD_ADJUST = adjust padding - */ -int -lame_set_padding_type(lame_global_flags * gfp, Padding_type padding_type) -{ - (void) gfp; - (void) padding_type; - return 0; -} - -Padding_type -lame_get_padding_type(const lame_global_flags * gfp) -{ - (void) gfp; - return PAD_ADJUST; -} - - -/* MP3 'private extension' bit. Meaningless. */ -int -lame_set_extension(lame_global_flags * gfp, int extension) -{ - if (is_lame_global_flags_valid(gfp)) { - /* default = 0 (disabled) */ - /* enforce disable/enable meaning, if we need more than two values - we need to switch to an enum to have an apropriate representation - of the possible meanings of the value */ - if (0 > extension || 1 < extension) - return -1; - gfp->extension = extension; - return 0; - } - return -1; -} - -int -lame_get_extension(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - assert(0 <= gfp->extension && 1 >= gfp->extension); - return gfp->extension; - } - return 0; -} - - -/* Enforce strict ISO compliance. */ -int -lame_set_strict_ISO(lame_global_flags * gfp, int val) -{ - if (is_lame_global_flags_valid(gfp)) { - /* default = 0 (disabled) */ - /* enforce disable/enable meaning, if we need more than two values - we need to switch to an enum to have an apropriate representation - of the possible meanings of the value */ - if (val < MDB_DEFAULT || MDB_MAXIMUM < val) - return -1; - gfp->strict_ISO = val; - return 0; - } - return -1; -} - -int -lame_get_strict_ISO(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->strict_ISO; - } - return 0; -} - - - - -/******************************************************************** - * quantization/noise shaping - ***********************************************************************/ - -/* Disable the bit reservoir. For testing only. */ -int -lame_set_disable_reservoir(lame_global_flags * gfp, int disable_reservoir) -{ - if (is_lame_global_flags_valid(gfp)) { - /* default = 0 (disabled) */ - - /* enforce disable/enable meaning, if we need more than two values - we need to switch to an enum to have an apropriate representation - of the possible meanings of the value */ - if (0 > disable_reservoir || 1 < disable_reservoir) - return -1; - gfp->disable_reservoir = disable_reservoir; - return 0; - } - return -1; -} - -int -lame_get_disable_reservoir(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - assert(0 <= gfp->disable_reservoir && 1 >= gfp->disable_reservoir); - return gfp->disable_reservoir; - } - return 0; -} - - - - -int -lame_set_experimentalX(lame_global_flags * gfp, int experimentalX) -{ - if (is_lame_global_flags_valid(gfp)) { - lame_set_quant_comp(gfp, experimentalX); - lame_set_quant_comp_short(gfp, experimentalX); - return 0; - } - return -1; -} - -int -lame_get_experimentalX(const lame_global_flags * gfp) -{ - return lame_get_quant_comp(gfp); -} - - -/* Select a different "best quantization" function. default = 0 */ -int -lame_set_quant_comp(lame_global_flags * gfp, int quant_type) -{ - if (is_lame_global_flags_valid(gfp)) { - gfp->quant_comp = quant_type; - return 0; - } - return -1; -} - -int -lame_get_quant_comp(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->quant_comp; - } - return 0; -} - - -/* Select a different "best quantization" function. default = 0 */ -int -lame_set_quant_comp_short(lame_global_flags * gfp, int quant_type) -{ - if (is_lame_global_flags_valid(gfp)) { - gfp->quant_comp_short = quant_type; - return 0; - } - return -1; -} - -int -lame_get_quant_comp_short(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->quant_comp_short; - } - return 0; -} - - -/* Another experimental option. For testing only. */ -int -lame_set_experimentalY(lame_global_flags * gfp, int experimentalY) -{ - if (is_lame_global_flags_valid(gfp)) { - gfp->experimentalY = experimentalY; - return 0; - } - return -1; -} - -int -lame_get_experimentalY(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->experimentalY; - } - return 0; -} - - -int -lame_set_experimentalZ(lame_global_flags * gfp, int experimentalZ) -{ - if (is_lame_global_flags_valid(gfp)) { - gfp->experimentalZ = experimentalZ; - return 0; - } - return -1; -} - -int -lame_get_experimentalZ(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->experimentalZ; - } - return 0; -} - - -/* Naoki's psycho acoustic model. */ -int -lame_set_exp_nspsytune(lame_global_flags * gfp, int exp_nspsytune) -{ - if (is_lame_global_flags_valid(gfp)) { - /* default = 0 (disabled) */ - gfp->exp_nspsytune = exp_nspsytune; - return 0; - } - return -1; -} - -int -lame_get_exp_nspsytune(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->exp_nspsytune; - } - return 0; -} - - - - -/******************************************************************** - * VBR control - ***********************************************************************/ - -/* Types of VBR. default = vbr_off = CBR */ -int -lame_set_VBR(lame_global_flags * gfp, vbr_mode VBR) -{ - if (is_lame_global_flags_valid(gfp)) { - int vbr_q = VBR; - if (0 > vbr_q || vbr_max_indicator <= vbr_q) - return -1; /* Unknown VBR mode! */ - gfp->VBR = VBR; - return 0; - } - return -1; -} - -vbr_mode -lame_get_VBR(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - assert(gfp->VBR < vbr_max_indicator); - return gfp->VBR; - } - return vbr_off; -} - - -/* - * VBR quality level. - * 0 = highest - * 9 = lowest - */ -int -lame_set_VBR_q(lame_global_flags * gfp, int VBR_q) -{ - if (is_lame_global_flags_valid(gfp)) { - int ret = 0; - - if (0 > VBR_q) { - ret = -1; /* Unknown VBR quality level! */ - VBR_q = 0; - } - if (9 < VBR_q) { - ret = -1; - VBR_q = 9; - } - gfp->VBR_q = VBR_q; - gfp->VBR_q_frac = 0; - return ret; - } - return -1; -} - -int -lame_get_VBR_q(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - assert(0 <= gfp->VBR_q && 10 > gfp->VBR_q); - return gfp->VBR_q; - } - return 0; -} - -int -lame_set_VBR_quality(lame_global_flags * gfp, float VBR_q) -{ - if (is_lame_global_flags_valid(gfp)) { - int ret = 0; - - if (0 > VBR_q) { - ret = -1; /* Unknown VBR quality level! */ - VBR_q = 0; - } - if (9.999 < VBR_q) { - ret = -1; - VBR_q = 9.999; - } - - gfp->VBR_q = (int) VBR_q; - gfp->VBR_q_frac = VBR_q - gfp->VBR_q; - - return ret; - } - return -1; -} - -float -lame_get_VBR_quality(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->VBR_q + gfp->VBR_q_frac; - } - return 0; -} - - -/* Ignored except for VBR = vbr_abr (ABR mode) */ -int -lame_set_VBR_mean_bitrate_kbps(lame_global_flags * gfp, int VBR_mean_bitrate_kbps) -{ - if (is_lame_global_flags_valid(gfp)) { - gfp->VBR_mean_bitrate_kbps = VBR_mean_bitrate_kbps; - return 0; - } - return -1; -} - -int -lame_get_VBR_mean_bitrate_kbps(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->VBR_mean_bitrate_kbps; - } - return 0; -} - -int -lame_set_VBR_min_bitrate_kbps(lame_global_flags * gfp, int VBR_min_bitrate_kbps) -{ - if (is_lame_global_flags_valid(gfp)) { - gfp->VBR_min_bitrate_kbps = VBR_min_bitrate_kbps; - return 0; - } - return -1; -} - -int -lame_get_VBR_min_bitrate_kbps(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->VBR_min_bitrate_kbps; - } - return 0; -} - -int -lame_set_VBR_max_bitrate_kbps(lame_global_flags * gfp, int VBR_max_bitrate_kbps) -{ - if (is_lame_global_flags_valid(gfp)) { - gfp->VBR_max_bitrate_kbps = VBR_max_bitrate_kbps; - return 0; - } - return -1; -} - -int -lame_get_VBR_max_bitrate_kbps(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->VBR_max_bitrate_kbps; - } - return 0; -} - - -/* - * Strictly enforce VBR_min_bitrate. - * Normally it will be violated for analog silence. - */ -int -lame_set_VBR_hard_min(lame_global_flags * gfp, int VBR_hard_min) -{ - if (is_lame_global_flags_valid(gfp)) { - /* default = 0 (disabled) */ - - /* enforce disable/enable meaning, if we need more than two values - we need to switch to an enum to have an apropriate representation - of the possible meanings of the value */ - if (0 > VBR_hard_min || 1 < VBR_hard_min) - return -1; - - gfp->VBR_hard_min = VBR_hard_min; - - return 0; - } - return -1; -} - -int -lame_get_VBR_hard_min(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - assert(0 <= gfp->VBR_hard_min && 1 >= gfp->VBR_hard_min); - return gfp->VBR_hard_min; - } - return 0; -} - - -/******************************************************************** - * Filtering control - ***********************************************************************/ - -/* - * Freqency in Hz to apply lowpass. - * 0 = default = lame chooses - * -1 = disabled - */ -int -lame_set_lowpassfreq(lame_global_flags * gfp, int lowpassfreq) -{ - if (is_lame_global_flags_valid(gfp)) { - gfp->lowpassfreq = lowpassfreq; - return 0; - } - return -1; -} - -int -lame_get_lowpassfreq(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->lowpassfreq; - } - return 0; -} - - -/* - * Width of transition band (in Hz). - * default = one polyphase filter band - */ -int -lame_set_lowpasswidth(lame_global_flags * gfp, int lowpasswidth) -{ - if (is_lame_global_flags_valid(gfp)) { - gfp->lowpasswidth = lowpasswidth; - return 0; - } - return -1; -} - -int -lame_get_lowpasswidth(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->lowpasswidth; - } - return 0; -} - - -/* - * Frequency in Hz to apply highpass. - * 0 = default = lame chooses - * -1 = disabled - */ -int -lame_set_highpassfreq(lame_global_flags * gfp, int highpassfreq) -{ - if (is_lame_global_flags_valid(gfp)) { - gfp->highpassfreq = highpassfreq; - return 0; - } - return -1; -} - -int -lame_get_highpassfreq(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->highpassfreq; - } - return 0; -} - - -/* - * Width of transition band (in Hz). - * default = one polyphase filter band - */ -int -lame_set_highpasswidth(lame_global_flags * gfp, int highpasswidth) -{ - if (is_lame_global_flags_valid(gfp)) { - gfp->highpasswidth = highpasswidth; - return 0; - } - return -1; -} - -int -lame_get_highpasswidth(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->highpasswidth; - } - return 0; -} - - - - -/* - * psycho acoustics and other arguments which you should not change - * unless you know what you are doing - */ - - -/* Adjust masking values. */ -int -lame_set_maskingadjust(lame_global_flags * gfp, float adjust) -{ - if (is_lame_global_flags_valid(gfp)) { - gfp->maskingadjust = adjust; - return 0; - } - return -1; -} - -float -lame_get_maskingadjust(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->maskingadjust; - } - return 0; -} - -int -lame_set_maskingadjust_short(lame_global_flags * gfp, float adjust) -{ - if (is_lame_global_flags_valid(gfp)) { - gfp->maskingadjust_short = adjust; - return 0; - } - return -1; -} - -float -lame_get_maskingadjust_short(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->maskingadjust_short; - } - return 0; -} - -/* Only use ATH for masking. */ -int -lame_set_ATHonly(lame_global_flags * gfp, int ATHonly) -{ - if (is_lame_global_flags_valid(gfp)) { - gfp->ATHonly = ATHonly; - return 0; - } - return -1; -} - -int -lame_get_ATHonly(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->ATHonly; - } - return 0; -} - - -/* Only use ATH for short blocks. */ -int -lame_set_ATHshort(lame_global_flags * gfp, int ATHshort) -{ - if (is_lame_global_flags_valid(gfp)) { - gfp->ATHshort = ATHshort; - return 0; - } - return -1; -} - -int -lame_get_ATHshort(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->ATHshort; - } - return 0; -} - - -/* Disable ATH. */ -int -lame_set_noATH(lame_global_flags * gfp, int noATH) -{ - if (is_lame_global_flags_valid(gfp)) { - gfp->noATH = noATH; - return 0; - } - return -1; -} - -int -lame_get_noATH(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->noATH; - } - return 0; -} - - -/* Select ATH formula. */ -int -lame_set_ATHtype(lame_global_flags * gfp, int ATHtype) -{ - if (is_lame_global_flags_valid(gfp)) { - /* XXX: ATHtype should be converted to an enum. */ - gfp->ATHtype = ATHtype; - return 0; - } - return -1; -} - -int -lame_get_ATHtype(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->ATHtype; - } - return 0; -} - - -/* Select ATH formula 4 shape. */ -int -lame_set_ATHcurve(lame_global_flags * gfp, float ATHcurve) -{ - if (is_lame_global_flags_valid(gfp)) { - gfp->ATHcurve = ATHcurve; - return 0; - } - return -1; -} - -float -lame_get_ATHcurve(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->ATHcurve; - } - return 0; -} - - -/* Lower ATH by this many db. */ -int -lame_set_ATHlower(lame_global_flags * gfp, float ATHlower) -{ - if (is_lame_global_flags_valid(gfp)) { - gfp->ATH_lower_db = ATHlower; - return 0; - } - return -1; -} - -float -lame_get_ATHlower(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->ATH_lower_db; - } - return 0; -} - - -/* Select ATH adaptive adjustment scheme. */ -int -lame_set_athaa_type(lame_global_flags * gfp, int athaa_type) -{ - if (is_lame_global_flags_valid(gfp)) { - gfp->athaa_type = athaa_type; - return 0; - } - return -1; -} - -int -lame_get_athaa_type(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->athaa_type; - } - return 0; -} - - -#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED -int CDECL lame_set_athaa_loudapprox(lame_global_flags * gfp, int athaa_loudapprox); -int CDECL lame_get_athaa_loudapprox(const lame_global_flags * gfp); -#else -#endif - -/* Select the loudness approximation used by the ATH adaptive auto-leveling. */ -int -lame_set_athaa_loudapprox(lame_global_flags * gfp, int athaa_loudapprox) -{ - (void) gfp; - (void) athaa_loudapprox; - return 0; -} - -int -lame_get_athaa_loudapprox(const lame_global_flags * gfp) -{ - (void) gfp; - /* obsolete, the type known under number 2 is the only survival */ - return 2; -} - - -/* Adjust (in dB) the point below which adaptive ATH level adjustment occurs. */ -int -lame_set_athaa_sensitivity(lame_global_flags * gfp, float athaa_sensitivity) -{ - if (is_lame_global_flags_valid(gfp)) { - gfp->athaa_sensitivity = athaa_sensitivity; - return 0; - } - return -1; -} - -float -lame_get_athaa_sensitivity(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->athaa_sensitivity; - } - return 0; -} - - -/* Predictability limit (ISO tonality formula) */ -int lame_set_cwlimit(lame_global_flags * gfp, int cwlimit); -int lame_get_cwlimit(const lame_global_flags * gfp); - -int -lame_set_cwlimit(lame_global_flags * gfp, int cwlimit) -{ - (void) gfp; - (void) cwlimit; - return 0; -} - -int -lame_get_cwlimit(const lame_global_flags * gfp) -{ - (void) gfp; - return 0; -} - - - -/* - * Allow blocktypes to differ between channels. - * default: - * 0 for jstereo => block types coupled - * 1 for stereo => block types may differ - */ -int -lame_set_allow_diff_short(lame_global_flags * gfp, int allow_diff_short) -{ - if (is_lame_global_flags_valid(gfp)) { - gfp->short_blocks = allow_diff_short ? short_block_allowed : short_block_coupled; - return 0; - } - return -1; -} - -int -lame_get_allow_diff_short(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - if (gfp->short_blocks == short_block_allowed) - return 1; /* short blocks allowed to differ */ - else - return 0; /* not set, dispensed, forced or coupled */ - } - return 0; -} - - -/* Use temporal masking effect */ -int -lame_set_useTemporal(lame_global_flags * gfp, int useTemporal) -{ - if (is_lame_global_flags_valid(gfp)) { - /* default = 1 (enabled) */ - - /* enforce disable/enable meaning, if we need more than two values - we need to switch to an enum to have an apropriate representation - of the possible meanings of the value */ - if (0 <= useTemporal && useTemporal <= 1) { - gfp->useTemporal = useTemporal; - return 0; - } - } - return -1; -} - -int -lame_get_useTemporal(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - assert(0 <= gfp->useTemporal && 1 >= gfp->useTemporal); - return gfp->useTemporal; - } - return 0; -} - - -/* Use inter-channel masking effect */ -int -lame_set_interChRatio(lame_global_flags * gfp, float ratio) -{ - if (is_lame_global_flags_valid(gfp)) { - /* default = 0.0 (no inter-channel maskin) */ - if (0 <= ratio && ratio <= 1.0) { - gfp->interChRatio = ratio; - return 0; - } - } - return -1; -} - -float -lame_get_interChRatio(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - assert((0 <= gfp->interChRatio && gfp->interChRatio <= 1.0) || EQ(gfp->interChRatio, -1)); - return gfp->interChRatio; - } - return 0; -} - - -/* Use pseudo substep shaping method */ -int -lame_set_substep(lame_global_flags * gfp, int method) -{ - if (is_lame_global_flags_valid(gfp)) { - /* default = 0.0 (no substep noise shaping) */ - if (0 <= method && method <= 7) { - gfp->substep_shaping = method; - return 0; - } - } - return -1; -} - -int -lame_get_substep(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - assert(0 <= gfp->substep_shaping && gfp->substep_shaping <= 7); - return gfp->substep_shaping; - } - return 0; -} - -/* scalefactors scale */ -int -lame_set_sfscale(lame_global_flags * gfp, int val) -{ - if (is_lame_global_flags_valid(gfp)) { - gfp->noise_shaping = (val != 0) ? 2 : 1; - return 0; - } - return -1; -} - -int -lame_get_sfscale(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return (gfp->noise_shaping == 2) ? 1 : 0; - } - return 0; -} - -/* subblock gain */ -int -lame_set_subblock_gain(lame_global_flags * gfp, int sbgain) -{ - if (is_lame_global_flags_valid(gfp)) { - gfp->subblock_gain = sbgain; - return 0; - } - return -1; -} - -int -lame_get_subblock_gain(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->subblock_gain; - } - return 0; -} - - -/* Disable short blocks. */ -int -lame_set_no_short_blocks(lame_global_flags * gfp, int no_short_blocks) -{ - if (is_lame_global_flags_valid(gfp)) { - /* enforce disable/enable meaning, if we need more than two values - we need to switch to an enum to have an apropriate representation - of the possible meanings of the value */ - if (0 <= no_short_blocks && no_short_blocks <= 1) { - gfp->short_blocks = no_short_blocks ? short_block_dispensed : short_block_allowed; - return 0; - } - } - return -1; -} - -int -lame_get_no_short_blocks(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - switch (gfp->short_blocks) { - default: - case short_block_not_set: - return -1; - case short_block_dispensed: - return 1; - case short_block_allowed: - case short_block_coupled: - case short_block_forced: - return 0; - } - } - return -1; -} - - -/* Force short blocks. */ -int -lame_set_force_short_blocks(lame_global_flags * gfp, int short_blocks) -{ - if (is_lame_global_flags_valid(gfp)) { - /* enforce disable/enable meaning, if we need more than two values - we need to switch to an enum to have an apropriate representation - of the possible meanings of the value */ - if (0 > short_blocks || 1 < short_blocks) - return -1; - - if (short_blocks == 1) - gfp->short_blocks = short_block_forced; - else if (gfp->short_blocks == short_block_forced) - gfp->short_blocks = short_block_allowed; - - return 0; - } - return -1; -} - -int -lame_get_force_short_blocks(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - switch (gfp->short_blocks) { - default: - case short_block_not_set: - return -1; - case short_block_dispensed: - case short_block_allowed: - case short_block_coupled: - return 0; - case short_block_forced: - return 1; - } - } - return -1; -} - -int -lame_set_short_threshold_lrm(lame_global_flags * gfp, float lrm) -{ - if (is_lame_global_flags_valid(gfp)) { - gfp->attackthre = lrm; - return 0; - } - return -1; -} - -float -lame_get_short_threshold_lrm(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->attackthre; - } - return 0; -} - -int -lame_set_short_threshold_s(lame_global_flags * gfp, float s) -{ - if (is_lame_global_flags_valid(gfp)) { - gfp->attackthre_s = s; - return 0; - } - return -1; -} - -float -lame_get_short_threshold_s(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->attackthre_s; - } - return 0; -} - -int -lame_set_short_threshold(lame_global_flags * gfp, float lrm, float s) -{ - if (is_lame_global_flags_valid(gfp)) { - lame_set_short_threshold_lrm(gfp, lrm); - lame_set_short_threshold_s(gfp, s); - return 0; - } - return -1; -} - - -/* - * Input PCM is emphased PCM - * (for instance from one of the rarely emphased CDs). - * - * It is STRONGLY not recommended to use this, because psycho does not - * take it into account, and last but not least many decoders - * ignore these bits - */ -int -lame_set_emphasis(lame_global_flags * gfp, int emphasis) -{ - if (is_lame_global_flags_valid(gfp)) { - /* XXX: emphasis should be converted to an enum */ - if (0 <= emphasis && emphasis < 4) { - gfp->emphasis = emphasis; - return 0; - } - } - return -1; -} - -int -lame_get_emphasis(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - assert(0 <= gfp->emphasis && gfp->emphasis < 4); - return gfp->emphasis; - } - return 0; -} - - - - -/***************************************************************/ -/* internal variables, cannot be set... */ -/* provided because they may be of use to calling application */ -/***************************************************************/ - -/* MPEG version. - * 0 = MPEG-2 - * 1 = MPEG-1 - * (2 = MPEG-2.5) - */ -int -lame_get_version(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - lame_internal_flags const *const gfc = gfp->internal_flags; - if (is_lame_internal_flags_valid(gfc)) { - return gfc->cfg.version; - } - } - return 0; -} - - -/* Encoder delay. */ -int -lame_get_encoder_delay(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - lame_internal_flags const *const gfc = gfp->internal_flags; - if (is_lame_internal_flags_valid(gfc)) { - return gfc->ov_enc.encoder_delay; - } - } - return 0; -} - -/* padding added to the end of the input */ -int -lame_get_encoder_padding(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - lame_internal_flags const *const gfc = gfp->internal_flags; - if (is_lame_internal_flags_valid(gfc)) { - return gfc->ov_enc.encoder_padding; - } - } - return 0; -} - - -/* Size of MPEG frame. */ -int -lame_get_framesize(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - lame_internal_flags const *const gfc = gfp->internal_flags; - if (is_lame_internal_flags_valid(gfc)) { - SessionConfig_t const *const cfg = &gfc->cfg; - return 576 * cfg->mode_gr; - } - } - return 0; -} - - -/* Number of frames encoded so far. */ -int -lame_get_frameNum(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - lame_internal_flags const *const gfc = gfp->internal_flags; - if (is_lame_internal_flags_valid(gfc)) { - return gfc->ov_enc.frame_number; - } - } - return 0; -} - -int -lame_get_mf_samples_to_encode(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - lame_internal_flags const *const gfc = gfp->internal_flags; - if (is_lame_internal_flags_valid(gfc)) { - return gfc->sv_enc.mf_samples_to_encode; - } - } - return 0; -} - -int CDECL -lame_get_size_mp3buffer(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - lame_internal_flags const *const gfc = gfp->internal_flags; - if (is_lame_internal_flags_valid(gfc)) { - int size; - compute_flushbits(gfc, &size); - return size; - } - } - return 0; -} - -int -lame_get_RadioGain(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - lame_internal_flags const *const gfc = gfp->internal_flags; - if (is_lame_internal_flags_valid(gfc)) { - return gfc->ov_rpg.RadioGain; - } - } - return 0; -} - -int -lame_get_AudiophileGain(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - lame_internal_flags const *const gfc = gfp->internal_flags; - if (is_lame_internal_flags_valid(gfc)) { - return 0; - } - } - return 0; -} - -float -lame_get_PeakSample(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - lame_internal_flags const *const gfc = gfp->internal_flags; - if (is_lame_internal_flags_valid(gfc)) { - return (float) gfc->ov_rpg.PeakSample; - } - } - return 0; -} - -int -lame_get_noclipGainChange(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - lame_internal_flags const *const gfc = gfp->internal_flags; - if (is_lame_internal_flags_valid(gfc)) { - return gfc->ov_rpg.noclipGainChange; - } - } - return 0; -} - -float -lame_get_noclipScale(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - lame_internal_flags const *const gfc = gfp->internal_flags; - if (is_lame_internal_flags_valid(gfc)) { - return gfc->ov_rpg.noclipScale; - } - } - return 0; -} - - -/* - * LAME's estimate of the total number of frames to be encoded. - * Only valid if calling program set num_samples. - */ -int -lame_get_totalframes(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - lame_internal_flags const *const gfc = gfp->internal_flags; - if (is_lame_internal_flags_valid(gfc)) { - SessionConfig_t const *const cfg = &gfc->cfg; - unsigned long const pcm_samples_per_frame = 576 * cfg->mode_gr; - unsigned long pcm_samples_to_encode = gfp->num_samples; - unsigned long end_padding = 0; - int frames = 0; - - if (pcm_samples_to_encode == (0ul-1ul)) - return 0; /* unknown */ - - /* estimate based on user set num_samples: */ - if (cfg->samplerate_in != cfg->samplerate_out) { - /* resampling, estimate new samples_to_encode */ - double resampled_samples_to_encode = 0.0, frames_f = 0.0; - if (cfg->samplerate_in > 0) { - resampled_samples_to_encode = pcm_samples_to_encode; - resampled_samples_to_encode *= cfg->samplerate_out; - resampled_samples_to_encode /= cfg->samplerate_in; - } - if (resampled_samples_to_encode <= 0.0) - return 0; /* unlikely to happen, so what, no estimate! */ - frames_f = floor(resampled_samples_to_encode / pcm_samples_per_frame); - if (frames_f >= (INT_MAX-2)) - return 0; /* overflow, happens eventually, no estimate! */ - frames = frames_f; - resampled_samples_to_encode -= frames * pcm_samples_per_frame; - pcm_samples_to_encode = ceil(resampled_samples_to_encode); - } - else { - frames = pcm_samples_to_encode / pcm_samples_per_frame; - pcm_samples_to_encode -= frames * pcm_samples_per_frame; - } - pcm_samples_to_encode += 576ul; - end_padding = pcm_samples_per_frame - (pcm_samples_to_encode % pcm_samples_per_frame); - if (end_padding < 576ul) { - end_padding += pcm_samples_per_frame; - } - pcm_samples_to_encode += end_padding; - frames += (pcm_samples_to_encode / pcm_samples_per_frame); - /* check to see if we underestimated totalframes */ - /* if (totalframes < gfp->frameNum) */ - /* totalframes = gfp->frameNum; */ - return frames; - } - } - return 0; -} - - - - - -int -lame_set_preset(lame_global_flags * gfp, int preset) -{ - if (is_lame_global_flags_valid(gfp)) { - gfp->preset = preset; - return apply_preset(gfp, preset, 1); - } - return -1; -} - - - -int -lame_set_asm_optimizations(lame_global_flags * gfp, int optim, int mode) -{ - if (is_lame_global_flags_valid(gfp)) { - mode = (mode == 1 ? 1 : 0); - switch (optim) { - case MMX:{ - gfp->asm_optimizations.mmx = mode; - return optim; - } - case AMD_3DNOW:{ - gfp->asm_optimizations.amd3dnow = mode; - return optim; - } - case SSE:{ - gfp->asm_optimizations.sse = mode; - return optim; - } - default: - return optim; - } - } - return -1; -} - - -void -lame_set_write_id3tag_automatic(lame_global_flags * gfp, int v) -{ - if (is_lame_global_flags_valid(gfp)) { - gfp->write_id3tag_automatic = v; - } -} - - -int -lame_get_write_id3tag_automatic(lame_global_flags const *gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->write_id3tag_automatic; - } - return 1; -} - - -/* - -UNDOCUMENTED, experimental settings. These routines are not prototyped -in lame.h. You should not use them, they are experimental and may -change. - -*/ - - -/* - * just another daily changing developer switch - */ -void CDECL lame_set_tune(lame_global_flags *, float); - -void -lame_set_tune(lame_global_flags * gfp, float val) -{ - if (is_lame_global_flags_valid(gfp)) { - gfp->tune_value_a = val; - gfp->tune = 1; - } -} - -/* Custom msfix hack */ -void -lame_set_msfix(lame_global_flags * gfp, double msfix) -{ - if (is_lame_global_flags_valid(gfp)) { - /* default = 0 */ - gfp->msfix = msfix; - } -} - -float -lame_get_msfix(const lame_global_flags * gfp) -{ - if (is_lame_global_flags_valid(gfp)) { - return gfp->msfix; - } - return 0; -} - -#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED -int CDECL lame_set_preset_expopts(lame_global_flags *, int); -#else -#endif - -int -lame_set_preset_expopts(lame_global_flags * gfp, int preset_expopts) -{ - (void) gfp; - (void) preset_expopts; - return 0; -} - - -int -lame_set_preset_notune(lame_global_flags * gfp, int preset_notune) -{ - (void) gfp; - (void) preset_notune; - return 0; -} - -static int -calc_maximum_input_samples_for_buffer_size(lame_internal_flags const* gfc, size_t buffer_size) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - int const pcm_samples_per_frame = 576 * cfg->mode_gr; - int frames_per_buffer = 0, input_samples_per_buffer = 0; - int kbps = 320; - - if (cfg->samplerate_out < 16000) - kbps = 64; - else if (cfg->samplerate_out < 32000) - kbps = 160; - else - kbps = 320; - if (cfg->free_format) - kbps = cfg->avg_bitrate; - else if (cfg->vbr == vbr_off) { - kbps = cfg->avg_bitrate; - } - { - int const pad = 1; - int const bpf = ((cfg->version + 1) * 72000 * kbps / cfg->samplerate_out + pad); - frames_per_buffer = buffer_size / bpf; - } - { - double ratio = (double) cfg->samplerate_in / cfg->samplerate_out; - input_samples_per_buffer = pcm_samples_per_frame * frames_per_buffer * ratio; - } - return input_samples_per_buffer; -} - -int -lame_get_maximum_number_of_samples(lame_t gfp, size_t buffer_size) -{ - if (is_lame_global_flags_valid(gfp)) { - lame_internal_flags const *const gfc = gfp->internal_flags; - if (is_lame_internal_flags_valid(gfc)) { - return calc_maximum_input_samples_for_buffer_size(gfc, buffer_size); - } - } - return LAME_GENERICERROR; -} diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/set_get.h b/recorderlib/src/main/jni/lame-3.100_libmp3lame/set_get.h deleted file mode 100644 index 775ecfd..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/set_get.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * set_get.h -- Internal set/get definitions - * - * Copyright (C) 2003 Gabriel Bouvigne / Lame project - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifndef __SET_GET_H__ -#define __SET_GET_H__ - - -#if defined(__cplusplus) -extern "C" { -#endif - -/* select psychoacoustic model */ - -/* manage short blocks */ - int CDECL lame_set_short_threshold(lame_global_flags *, float, float); - int CDECL lame_set_short_threshold_lrm(lame_global_flags *, float); - float CDECL lame_get_short_threshold_lrm(const lame_global_flags *); - int CDECL lame_set_short_threshold_s(lame_global_flags *, float); - float CDECL lame_get_short_threshold_s(const lame_global_flags *); - - - int CDECL lame_set_maskingadjust(lame_global_flags *, float); - float CDECL lame_get_maskingadjust(const lame_global_flags *); - - int CDECL lame_set_maskingadjust_short(lame_global_flags *, float); - float CDECL lame_get_maskingadjust_short(const lame_global_flags *); - -/* select ATH formula 4 shape */ - int CDECL lame_set_ATHcurve(lame_global_flags *, float); - float CDECL lame_get_ATHcurve(const lame_global_flags *); - - int CDECL lame_set_preset_notune(lame_global_flags *, int); - -/* substep shaping method */ - int CDECL lame_set_substep(lame_global_flags *, int); - int CDECL lame_get_substep(const lame_global_flags *); - -/* scalefactors scale */ - int CDECL lame_set_sfscale(lame_global_flags *, int); - int CDECL lame_get_sfscale(const lame_global_flags *); - -/* subblock gain */ - int CDECL lame_set_subblock_gain(lame_global_flags *, int); - int CDECL lame_get_subblock_gain(const lame_global_flags *); - - - -/*presets*/ - int apply_preset(lame_global_flags *, int preset, int enforce); - - void CDECL lame_set_tune(lame_t, float); /* FOR INTERNAL USE ONLY */ - void CDECL lame_set_msfix(lame_t gfp, double msfix); - - -#if defined(__cplusplus) -} -#endif -#endif diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/tables.c b/recorderlib/src/main/jni/lame-3.100_libmp3lame/tables.c deleted file mode 100644 index a023099..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/tables.c +++ /dev/null @@ -1,564 +0,0 @@ -/* - * MPEG layer 3 tables source file - * - * Copyright (c) 1999 Albert L Faber - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* $Id: tables.c,v 1.29 2011/05/07 16:05:17 rbrito Exp $ */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include "machine.h" - -#include "lame.h" -#include "tables.h" - - -static const uint16_t t1HB[] = { - 1, 1, - 1, 0 -}; - -static const uint16_t t2HB[] = { - 1, 2, 1, - 3, 1, 1, - 3, 2, 0 -}; - -static const uint16_t t3HB[] = { - 3, 2, 1, - 1, 1, 1, - 3, 2, 0 -}; - -static const uint16_t t5HB[] = { - 1, 2, 6, 5, - 3, 1, 4, 4, - 7, 5, 7, 1, - 6, 1, 1, 0 -}; - -static const uint16_t t6HB[] = { - 7, 3, 5, 1, - 6, 2, 3, 2, - 5, 4, 4, 1, - 3, 3, 2, 0 -}; - -static const uint16_t t7HB[] = { - 1, 2, 10, 19, 16, 10, - 3, 3, 7, 10, 5, 3, - 11, 4, 13, 17, 8, 4, - 12, 11, 18, 15, 11, 2, - 7, 6, 9, 14, 3, 1, - 6, 4, 5, 3, 2, 0 -}; - -static const uint16_t t8HB[] = { - 3, 4, 6, 18, 12, 5, - 5, 1, 2, 16, 9, 3, - 7, 3, 5, 14, 7, 3, - 19, 17, 15, 13, 10, 4, - 13, 5, 8, 11, 5, 1, - 12, 4, 4, 1, 1, 0 -}; - -static const uint16_t t9HB[] = { - 7, 5, 9, 14, 15, 7, - 6, 4, 5, 5, 6, 7, - 7, 6, 8, 8, 8, 5, - 15, 6, 9, 10, 5, 1, - 11, 7, 9, 6, 4, 1, - 14, 4, 6, 2, 6, 0 -}; - -static const uint16_t t10HB[] = { - 1, 2, 10, 23, 35, 30, 12, 17, - 3, 3, 8, 12, 18, 21, 12, 7, - 11, 9, 15, 21, 32, 40, 19, 6, - 14, 13, 22, 34, 46, 23, 18, 7, - 20, 19, 33, 47, 27, 22, 9, 3, - 31, 22, 41, 26, 21, 20, 5, 3, - 14, 13, 10, 11, 16, 6, 5, 1, - 9, 8, 7, 8, 4, 4, 2, 0 -}; - -static const uint16_t t11HB[] = { - 3, 4, 10, 24, 34, 33, 21, 15, - 5, 3, 4, 10, 32, 17, 11, 10, - 11, 7, 13, 18, 30, 31, 20, 5, - 25, 11, 19, 59, 27, 18, 12, 5, - 35, 33, 31, 58, 30, 16, 7, 5, - 28, 26, 32, 19, 17, 15, 8, 14, - 14, 12, 9, 13, 14, 9, 4, 1, - 11, 4, 6, 6, 6, 3, 2, 0 -}; - -static const uint16_t t12HB[] = { - 9, 6, 16, 33, 41, 39, 38, 26, - 7, 5, 6, 9, 23, 16, 26, 11, - 17, 7, 11, 14, 21, 30, 10, 7, - 17, 10, 15, 12, 18, 28, 14, 5, - 32, 13, 22, 19, 18, 16, 9, 5, - 40, 17, 31, 29, 17, 13, 4, 2, - 27, 12, 11, 15, 10, 7, 4, 1, - 27, 12, 8, 12, 6, 3, 1, 0 -}; - -static const uint16_t t13HB[] = { - 1, 5, 14, 21, 34, 51, 46, 71, 42, 52, 68, 52, 67, 44, 43, 19, - 3, 4, 12, 19, 31, 26, 44, 33, 31, 24, 32, 24, 31, 35, 22, 14, - 15, 13, 23, 36, 59, 49, 77, 65, 29, 40, 30, 40, 27, 33, 42, 16, - 22, 20, 37, 61, 56, 79, 73, 64, 43, 76, 56, 37, 26, 31, 25, 14, - 35, 16, 60, 57, 97, 75, 114, 91, 54, 73, 55, 41, 48, 53, 23, 24, - 58, 27, 50, 96, 76, 70, 93, 84, 77, 58, 79, 29, 74, 49, 41, 17, - 47, 45, 78, 74, 115, 94, 90, 79, 69, 83, 71, 50, 59, 38, 36, 15, - 72, 34, 56, 95, 92, 85, 91, 90, 86, 73, 77, 65, 51, 44, 43, 42, - 43, 20, 30, 44, 55, 78, 72, 87, 78, 61, 46, 54, 37, 30, 20, 16, - 53, 25, 41, 37, 44, 59, 54, 81, 66, 76, 57, 54, 37, 18, 39, 11, - 35, 33, 31, 57, 42, 82, 72, 80, 47, 58, 55, 21, 22, 26, 38, 22, - 53, 25, 23, 38, 70, 60, 51, 36, 55, 26, 34, 23, 27, 14, 9, 7, - 34, 32, 28, 39, 49, 75, 30, 52, 48, 40, 52, 28, 18, 17, 9, 5, - 45, 21, 34, 64, 56, 50, 49, 45, 31, 19, 12, 15, 10, 7, 6, 3, - 48, 23, 20, 39, 36, 35, 53, 21, 16, 23, 13, 10, 6, 1, 4, 2, - 16, 15, 17, 27, 25, 20, 29, 11, 17, 12, 16, 8, 1, 1, 0, 1 -}; - -static const uint16_t t15HB[] = { - 7, 12, 18, 53, 47, 76, 124, 108, 89, 123, 108, 119, 107, 81, 122, 63, - 13, 5, 16, 27, 46, 36, 61, 51, 42, 70, 52, 83, 65, 41, 59, 36, - 19, 17, 15, 24, 41, 34, 59, 48, 40, 64, 50, 78, 62, 80, 56, 33, - 29, 28, 25, 43, 39, 63, 55, 93, 76, 59, 93, 72, 54, 75, 50, 29, - 52, 22, 42, 40, 67, 57, 95, 79, 72, 57, 89, 69, 49, 66, 46, 27, - 77, 37, 35, 66, 58, 52, 91, 74, 62, 48, 79, 63, 90, 62, 40, 38, - 125, 32, 60, 56, 50, 92, 78, 65, 55, 87, 71, 51, 73, 51, 70, 30, - 109, 53, 49, 94, 88, 75, 66, 122, 91, 73, 56, 42, 64, 44, 21, 25, - 90, 43, 41, 77, 73, 63, 56, 92, 77, 66, 47, 67, 48, 53, 36, 20, - 71, 34, 67, 60, 58, 49, 88, 76, 67, 106, 71, 54, 38, 39, 23, 15, - 109, 53, 51, 47, 90, 82, 58, 57, 48, 72, 57, 41, 23, 27, 62, 9, - 86, 42, 40, 37, 70, 64, 52, 43, 70, 55, 42, 25, 29, 18, 11, 11, - 118, 68, 30, 55, 50, 46, 74, 65, 49, 39, 24, 16, 22, 13, 14, 7, - 91, 44, 39, 38, 34, 63, 52, 45, 31, 52, 28, 19, 14, 8, 9, 3, - 123, 60, 58, 53, 47, 43, 32, 22, 37, 24, 17, 12, 15, 10, 2, 1, - 71, 37, 34, 30, 28, 20, 17, 26, 21, 16, 10, 6, 8, 6, 2, 0 -}; - -static const uint16_t t16HB[] = { - 1, 5, 14, 44, 74, 63, 110, 93, 172, 149, 138, 242, 225, 195, 376, 17, - 3, 4, 12, 20, 35, 62, 53, 47, 83, 75, 68, 119, 201, 107, 207, 9, - 15, 13, 23, 38, 67, 58, 103, 90, 161, 72, 127, 117, 110, 209, 206, 16, - 45, 21, 39, 69, 64, 114, 99, 87, 158, 140, 252, 212, 199, 387, 365, 26, - 75, 36, 68, 65, 115, 101, 179, 164, 155, 264, 246, 226, 395, 382, 362, 9, - 66, 30, 59, 56, 102, 185, 173, 265, 142, 253, 232, 400, 388, 378, 445, 16, - 111, 54, 52, 100, 184, 178, 160, 133, 257, 244, 228, 217, 385, 366, 715, 10, - 98, 48, 91, 88, 165, 157, 148, 261, 248, 407, 397, 372, 380, 889, 884, 8, - 85, 84, 81, 159, 156, 143, 260, 249, 427, 401, 392, 383, 727, 713, 708, 7, - 154, 76, 73, 141, 131, 256, 245, 426, 406, 394, 384, 735, 359, 710, 352, 11, - 139, 129, 67, 125, 247, 233, 229, 219, 393, 743, 737, 720, 885, 882, 439, 4, - 243, 120, 118, 115, 227, 223, 396, 746, 742, 736, 721, 712, 706, 223, 436, 6, - 202, 224, 222, 218, 216, 389, 386, 381, 364, 888, 443, 707, 440, 437, 1728, 4, - 747, 211, 210, 208, 370, 379, 734, 723, 714, 1735, 883, 877, 876, 3459, 865, 2, - 377, 369, 102, 187, 726, 722, 358, 711, 709, 866, 1734, 871, 3458, 870, 434, 0, - 12, 10, 7, 11, 10, 17, 11, 9, 13, 12, 10, 7, 5, 3, 1, 3 -}; - -static const uint16_t t24HB[] = { - 15, 13, 46, 80, 146, 262, 248, 434, 426, 669, 653, 649, 621, 517, 1032, 88, - 14, 12, 21, 38, 71, 130, 122, 216, 209, 198, 327, 345, 319, 297, 279, 42, - 47, 22, 41, 74, 68, 128, 120, 221, 207, 194, 182, 340, 315, 295, 541, 18, - 81, 39, 75, 70, 134, 125, 116, 220, 204, 190, 178, 325, 311, 293, 271, 16, - 147, 72, 69, 135, 127, 118, 112, 210, 200, 188, 352, 323, 306, 285, 540, 14, - 263, 66, 129, 126, 119, 114, 214, 202, 192, 180, 341, 317, 301, 281, 262, 12, - 249, 123, 121, 117, 113, 215, 206, 195, 185, 347, 330, 308, 291, 272, 520, 10, - 435, 115, 111, 109, 211, 203, 196, 187, 353, 332, 313, 298, 283, 531, 381, 17, - 427, 212, 208, 205, 201, 193, 186, 177, 169, 320, 303, 286, 268, 514, 377, 16, - 335, 199, 197, 191, 189, 181, 174, 333, 321, 305, 289, 275, 521, 379, 371, 11, - 668, 184, 183, 179, 175, 344, 331, 314, 304, 290, 277, 530, 383, 373, 366, 10, - 652, 346, 171, 168, 164, 318, 309, 299, 287, 276, 263, 513, 375, 368, 362, 6, - 648, 322, 316, 312, 307, 302, 292, 284, 269, 261, 512, 376, 370, 364, 359, 4, - 620, 300, 296, 294, 288, 282, 273, 266, 515, 380, 374, 369, 365, 361, 357, 2, - 1033, 280, 278, 274, 267, 264, 259, 382, 378, 372, 367, 363, 360, 358, 356, 0, - 43, 20, 19, 17, 15, 13, 11, 9, 7, 6, 4, 7, 5, 3, 1, 3 -}; - -static const uint16_t t32HB[] = { - 1 << 0, 5 << 1, 4 << 1, 5 << 2, 6 << 1, 5 << 2, 4 << 2, 4 << 3, - 7 << 1, 3 << 2, 6 << 2, 0 << 3, 7 << 2, 2 << 3, 3 << 3, 1 << 4 -}; - -static const uint16_t t33HB[] = { - 15 << 0, 14 << 1, 13 << 1, 12 << 2, 11 << 1, 10 << 2, 9 << 2, 8 << 3, - 7 << 1, 6 << 2, 5 << 2, 4 << 3, 3 << 2, 2 << 3, 1 << 3, 0 << 4 -}; - - -const uint8_t t1l[] = { - 1, 4, - 3, 5 -}; - -static const uint8_t t2l[] = { - 1, 4, 7, - 4, 5, 7, - 6, 7, 8 -}; - -static const uint8_t t3l[] = { - 2, 3, 7, - 4, 4, 7, - 6, 7, 8 -}; - -static const uint8_t t5l[] = { - 1, 4, 7, 8, - 4, 5, 8, 9, - 7, 8, 9, 10, - 8, 8, 9, 10 -}; - -static const uint8_t t6l[] = { - 3, 4, 6, 8, - 4, 4, 6, 7, - 5, 6, 7, 8, - 7, 7, 8, 9 -}; - -static const uint8_t t7l[] = { - 1, 4, 7, 9, 9, 10, - 4, 6, 8, 9, 9, 10, - 7, 7, 9, 10, 10, 11, - 8, 9, 10, 11, 11, 11, - 8, 9, 10, 11, 11, 12, - 9, 10, 11, 12, 12, 12 -}; - -static const uint8_t t8l[] = { - 2, 4, 7, 9, 9, 10, - 4, 4, 6, 10, 10, 10, - 7, 6, 8, 10, 10, 11, - 9, 10, 10, 11, 11, 12, - 9, 9, 10, 11, 12, 12, - 10, 10, 11, 11, 13, 13 -}; - -static const uint8_t t9l[] = { - 3, 4, 6, 7, 9, 10, - 4, 5, 6, 7, 8, 10, - 5, 6, 7, 8, 9, 10, - 7, 7, 8, 9, 9, 10, - 8, 8, 9, 9, 10, 11, - 9, 9, 10, 10, 11, 11 -}; - -static const uint8_t t10l[] = { - 1, 4, 7, 9, 10, 10, 10, 11, - 4, 6, 8, 9, 10, 11, 10, 10, - 7, 8, 9, 10, 11, 12, 11, 11, - 8, 9, 10, 11, 12, 12, 11, 12, - 9, 10, 11, 12, 12, 12, 12, 12, - 10, 11, 12, 12, 13, 13, 12, 13, - 9, 10, 11, 12, 12, 12, 13, 13, - 10, 10, 11, 12, 12, 13, 13, 13 -}; - -static const uint8_t t11l[] = { - 2, 4, 6, 8, 9, 10, 9, 10, - 4, 5, 6, 8, 10, 10, 9, 10, - 6, 7, 8, 9, 10, 11, 10, 10, - 8, 8, 9, 11, 10, 12, 10, 11, - 9, 10, 10, 11, 11, 12, 11, 12, - 9, 10, 11, 12, 12, 13, 12, 13, - 9, 9, 9, 10, 11, 12, 12, 12, - 9, 9, 10, 11, 12, 12, 12, 12 -}; - -static const uint8_t t12l[] = { - 4, 4, 6, 8, 9, 10, 10, 10, - 4, 5, 6, 7, 9, 9, 10, 10, - 6, 6, 7, 8, 9, 10, 9, 10, - 7, 7, 8, 8, 9, 10, 10, 10, - 8, 8, 9, 9, 10, 10, 10, 11, - 9, 9, 10, 10, 10, 11, 10, 11, - 9, 9, 9, 10, 10, 11, 11, 12, - 10, 10, 10, 11, 11, 11, 11, 12 -}; - -static const uint8_t t13l[] = { - 1, 5, 7, 8, 9, 10, 10, 11, 10, 11, 12, 12, 13, 13, 14, 14, - 4, 6, 8, 9, 10, 10, 11, 11, 11, 11, 12, 12, 13, 14, 14, 14, - 7, 8, 9, 10, 11, 11, 12, 12, 11, 12, 12, 13, 13, 14, 15, 15, - 8, 9, 10, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 15, 15, - 9, 9, 11, 11, 12, 12, 13, 13, 12, 13, 13, 14, 14, 15, 15, 16, - 10, 10, 11, 12, 12, 12, 13, 13, 13, 13, 14, 13, 15, 15, 16, 16, - 10, 11, 12, 12, 13, 13, 13, 13, 13, 14, 14, 14, 15, 15, 16, 16, - 11, 11, 12, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 16, 18, 18, - 10, 10, 11, 12, 12, 13, 13, 14, 14, 14, 14, 15, 15, 16, 17, 17, - 11, 11, 12, 12, 13, 13, 13, 15, 14, 15, 15, 16, 16, 16, 18, 17, - 11, 12, 12, 13, 13, 14, 14, 15, 14, 15, 16, 15, 16, 17, 18, 19, - 12, 12, 12, 13, 14, 14, 14, 14, 15, 15, 15, 16, 17, 17, 17, 18, - 12, 13, 13, 14, 14, 15, 14, 15, 16, 16, 17, 17, 17, 18, 18, 18, - 13, 13, 14, 15, 15, 15, 16, 16, 16, 16, 16, 17, 18, 17, 18, 18, - 14, 14, 14, 15, 15, 15, 17, 16, 16, 19, 17, 17, 17, 19, 18, 18, - 13, 14, 15, 16, 16, 16, 17, 16, 17, 17, 18, 18, 21, 20, 21, 18 -}; - -static const uint8_t t15l[] = { - 3, 5, 6, 8, 8, 9, 10, 10, 10, 11, 11, 12, 12, 12, 13, 14, - 5, 5, 7, 8, 9, 9, 10, 10, 10, 11, 11, 12, 12, 12, 13, 13, - 6, 7, 7, 8, 9, 9, 10, 10, 10, 11, 11, 12, 12, 13, 13, 13, - 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, - 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 12, 12, 12, 13, 13, 13, - 9, 9, 9, 10, 10, 10, 11, 11, 11, 11, 12, 12, 13, 13, 13, 14, - 10, 9, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 13, 13, 14, 14, - 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 14, - 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 14, 14, 14, - 10, 10, 11, 11, 11, 11, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, - 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 14, 15, 14, - 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 15, - 12, 12, 11, 12, 12, 12, 13, 13, 13, 13, 13, 13, 14, 14, 15, 15, - 12, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 14, 15, 15, - 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 14, 15, - 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 15, 15, 15, 15 -}; - -static const uint8_t t16_5l[] = { - 1, 5, 7, 9, 10, 10, 11, 11, 12, 12, 12, 13, 13, 13, 14, 11, - 4, 6, 8, 9, 10, 11, 11, 11, 12, 12, 12, 13, 14, 13, 14, 11, - 7, 8, 9, 10, 11, 11, 12, 12, 13, 12, 13, 13, 13, 14, 14, 12, - 9, 9, 10, 11, 11, 12, 12, 12, 13, 13, 14, 14, 14, 15, 15, 13, - 10, 10, 11, 11, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 12, - 10, 10, 11, 11, 12, 13, 13, 14, 13, 14, 14, 15, 15, 15, 16, 13, - 11, 11, 11, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 16, 13, - 11, 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 15, 15, 17, 17, 13, - 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 13, - 12, 12, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 15, 16, 15, 14, - 12, 13, 12, 13, 14, 14, 14, 14, 15, 16, 16, 16, 17, 17, 16, 13, - 13, 13, 13, 13, 14, 14, 15, 16, 16, 16, 16, 16, 16, 15, 16, 14, - 13, 14, 14, 14, 14, 15, 15, 15, 15, 17, 16, 16, 16, 16, 18, 14, - 15, 14, 14, 14, 15, 15, 16, 16, 16, 18, 17, 17, 17, 19, 17, 14, - 14, 15, 13, 14, 16, 16, 15, 16, 16, 17, 18, 17, 19, 17, 16, 14, - 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 12 -}; - -static const uint8_t t16l[] = { - 1, 5, 7, 9, 10, 10, 11, 11, 12, 12, 12, 13, 13, 13, 14, 10, - 4, 6, 8, 9, 10, 11, 11, 11, 12, 12, 12, 13, 14, 13, 14, 10, - 7, 8, 9, 10, 11, 11, 12, 12, 13, 12, 13, 13, 13, 14, 14, 11, - 9, 9, 10, 11, 11, 12, 12, 12, 13, 13, 14, 14, 14, 15, 15, 12, - 10, 10, 11, 11, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 11, - 10, 10, 11, 11, 12, 13, 13, 14, 13, 14, 14, 15, 15, 15, 16, 12, - 11, 11, 11, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 16, 12, - 11, 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 15, 15, 17, 17, 12, - 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 12, - 12, 12, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 15, 16, 15, 13, - 12, 13, 12, 13, 14, 14, 14, 14, 15, 16, 16, 16, 17, 17, 16, 12, - 13, 13, 13, 13, 14, 14, 15, 16, 16, 16, 16, 16, 16, 15, 16, 13, - 13, 14, 14, 14, 14, 15, 15, 15, 15, 17, 16, 16, 16, 16, 18, 13, - 15, 14, 14, 14, 15, 15, 16, 16, 16, 18, 17, 17, 17, 19, 17, 13, - 14, 15, 13, 14, 16, 16, 15, 16, 16, 17, 18, 17, 19, 17, 16, 13, - 10, 10, 10, 11, 11, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 10 -}; - -static const uint8_t t24l[] = { - 4, 5, 7, 8, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 13, 10, - 5, 6, 7, 8, 9, 10, 10, 11, 11, 11, 12, 12, 12, 12, 12, 10, - 7, 7, 8, 9, 9, 10, 10, 11, 11, 11, 11, 12, 12, 12, 13, 9, - 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 9, - 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 12, 12, 12, 12, 13, 9, - 10, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 9, - 10, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 9, - 11, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 10, - 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 10, - 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 10, - 12, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 10, - 12, 12, 11, 11, 11, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 10, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 10, - 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 10, - 13, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 10, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 6 -}; - -const uint8_t t32l[] = { - 1 + 0, 4 + 1, 4 + 1, 5 + 2, 4 + 1, 6 + 2, 5 + 2, 6 + 3, - 4 + 1, 5 + 2, 5 + 2, 6 + 3, 5 + 2, 6 + 3, 6 + 3, 6 + 4 -}; - -const uint8_t t33l[] = { - 4 + 0, 4 + 1, 4 + 1, 4 + 2, 4 + 1, 4 + 2, 4 + 2, 4 + 3, - 4 + 1, 4 + 2, 4 + 2, 4 + 3, 4 + 2, 4 + 3, 4 + 3, 4 + 4 -}; - - -const struct huffcodetab ht[HTN] = { - /* xlen, linmax, table, hlen */ - {0, 0, NULL, NULL}, - {2, 0, t1HB, t1l}, - {3, 0, t2HB, t2l}, - {3, 0, t3HB, t3l}, - {0, 0, NULL, NULL}, /* Apparently not used */ - {4, 0, t5HB, t5l}, - {4, 0, t6HB, t6l}, - {6, 0, t7HB, t7l}, - {6, 0, t8HB, t8l}, - {6, 0, t9HB, t9l}, - {8, 0, t10HB, t10l}, - {8, 0, t11HB, t11l}, - {8, 0, t12HB, t12l}, - {16, 0, t13HB, t13l}, - {0, 0, NULL, t16_5l}, /* Apparently not used */ - {16, 0, t15HB, t15l}, - - {1, 1, t16HB, t16l}, - {2, 3, t16HB, t16l}, - {3, 7, t16HB, t16l}, - {4, 15, t16HB, t16l}, - {6, 63, t16HB, t16l}, - {8, 255, t16HB, t16l}, - {10, 1023, t16HB, t16l}, - {13, 8191, t16HB, t16l}, - - {4, 15, t24HB, t24l}, - {5, 31, t24HB, t24l}, - {6, 63, t24HB, t24l}, - {7, 127, t24HB, t24l}, - {8, 255, t24HB, t24l}, - {9, 511, t24HB, t24l}, - {11, 2047, t24HB, t24l}, - {13, 8191, t24HB, t24l}, - - {0, 0, t32HB, t32l}, - {0, 0, t33HB, t33l}, -}; - - - - - -/* for (i = 0; i < 16*16; i++) { - * largetbl[i] = ((ht[16].hlen[i]) << 16) + ht[24].hlen[i]; - * } - */ -const uint32_t largetbl[16 * 16] = { - 0x010004, 0x050005, 0x070007, 0x090008, 0x0a0009, 0x0a000a, 0x0b000a, 0x0b000b, - 0x0c000b, 0x0c000c, 0x0c000c, 0x0d000c, 0x0d000c, 0x0d000c, 0x0e000d, 0x0a000a, - 0x040005, 0x060006, 0x080007, 0x090008, 0x0a0009, 0x0b000a, 0x0b000a, 0x0b000b, - 0x0c000b, 0x0c000b, 0x0c000c, 0x0d000c, 0x0e000c, 0x0d000c, 0x0e000c, 0x0a000a, - 0x070007, 0x080007, 0x090008, 0x0a0009, 0x0b0009, 0x0b000a, 0x0c000a, 0x0c000b, - 0x0d000b, 0x0c000b, 0x0d000b, 0x0d000c, 0x0d000c, 0x0e000c, 0x0e000d, 0x0b0009, - 0x090008, 0x090008, 0x0a0009, 0x0b0009, 0x0b000a, 0x0c000a, 0x0c000a, 0x0c000b, - 0x0d000b, 0x0d000b, 0x0e000b, 0x0e000c, 0x0e000c, 0x0f000c, 0x0f000c, 0x0c0009, - 0x0a0009, 0x0a0009, 0x0b0009, 0x0b000a, 0x0c000a, 0x0c000a, 0x0d000a, 0x0d000b, - 0x0d000b, 0x0e000b, 0x0e000c, 0x0e000c, 0x0f000c, 0x0f000c, 0x0f000d, 0x0b0009, - 0x0a000a, 0x0a0009, 0x0b000a, 0x0b000a, 0x0c000a, 0x0d000a, 0x0d000b, 0x0e000b, - 0x0d000b, 0x0e000b, 0x0e000c, 0x0f000c, 0x0f000c, 0x0f000c, 0x10000c, 0x0c0009, - 0x0b000a, 0x0b000a, 0x0b000a, 0x0c000a, 0x0d000a, 0x0d000b, 0x0d000b, 0x0d000b, - 0x0e000b, 0x0e000c, 0x0e000c, 0x0e000c, 0x0f000c, 0x0f000c, 0x10000d, 0x0c0009, - 0x0b000b, 0x0b000a, 0x0c000a, 0x0c000a, 0x0d000b, 0x0d000b, 0x0d000b, 0x0e000b, - 0x0e000c, 0x0f000c, 0x0f000c, 0x0f000c, 0x0f000c, 0x11000d, 0x11000d, 0x0c000a, - 0x0b000b, 0x0c000b, 0x0c000b, 0x0d000b, 0x0d000b, 0x0d000b, 0x0e000b, 0x0e000b, - 0x0f000b, 0x0f000c, 0x0f000c, 0x0f000c, 0x10000c, 0x10000d, 0x10000d, 0x0c000a, - 0x0c000b, 0x0c000b, 0x0c000b, 0x0d000b, 0x0d000b, 0x0e000b, 0x0e000b, 0x0f000c, - 0x0f000c, 0x0f000c, 0x0f000c, 0x10000c, 0x0f000d, 0x10000d, 0x0f000d, 0x0d000a, - 0x0c000c, 0x0d000b, 0x0c000b, 0x0d000b, 0x0e000b, 0x0e000c, 0x0e000c, 0x0e000c, - 0x0f000c, 0x10000c, 0x10000c, 0x10000d, 0x11000d, 0x11000d, 0x10000d, 0x0c000a, - 0x0d000c, 0x0d000c, 0x0d000b, 0x0d000b, 0x0e000b, 0x0e000c, 0x0f000c, 0x10000c, - 0x10000c, 0x10000c, 0x10000c, 0x10000d, 0x10000d, 0x0f000d, 0x10000d, 0x0d000a, - 0x0d000c, 0x0e000c, 0x0e000c, 0x0e000c, 0x0e000c, 0x0f000c, 0x0f000c, 0x0f000c, - 0x0f000c, 0x11000c, 0x10000d, 0x10000d, 0x10000d, 0x10000d, 0x12000d, 0x0d000a, - 0x0f000c, 0x0e000c, 0x0e000c, 0x0e000c, 0x0f000c, 0x0f000c, 0x10000c, 0x10000c, - 0x10000d, 0x12000d, 0x11000d, 0x11000d, 0x11000d, 0x13000d, 0x11000d, 0x0d000a, - 0x0e000d, 0x0f000c, 0x0d000c, 0x0e000c, 0x10000c, 0x10000c, 0x0f000c, 0x10000d, - 0x10000d, 0x11000d, 0x12000d, 0x11000d, 0x13000d, 0x11000d, 0x10000d, 0x0d000a, - 0x0a0009, 0x0a0009, 0x0a0009, 0x0b0009, 0x0b0009, 0x0c0009, 0x0c0009, 0x0c0009, - 0x0d0009, 0x0d0009, 0x0d0009, 0x0d000a, 0x0d000a, 0x0d000a, 0x0d000a, 0x0a0006 -}; - -/* for (i = 0; i < 3*3; i++) { - * table23[i] = ((ht[2].hlen[i]) << 16) + ht[3].hlen[i]; - * } - */ -const uint32_t table23[3 * 3] = { - 0x010002, 0x040003, 0x070007, - 0x040004, 0x050004, 0x070007, - 0x060006, 0x070007, 0x080008 -}; - -/* for (i = 0; i < 4*4; i++) { - * table56[i] = ((ht[5].hlen[i]) << 16) + ht[6].hlen[i]; - * } - */ -const uint32_t table56[4 * 4] = { - 0x010003, 0x040004, 0x070006, 0x080008, 0x040004, 0x050004, 0x080006, 0x090007, - 0x070005, 0x080006, 0x090007, 0x0a0008, 0x080007, 0x080007, 0x090008, 0x0a0009 -}; - - - -/* - * 0: MPEG-2 LSF - * 1: MPEG-1 - * 2: MPEG-2.5 LSF FhG extention (1995-07-11 shn) - */ - -typedef enum { - MPEG_2 = 0, - MPEG_1 = 1, - MPEG_25 = 2 -} MPEG_t; - -const int bitrate_table[3][16] = { - {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, -1}, /* MPEG 2 */ - {0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, -1}, /* MPEG 1 */ - {0, 8, 16, 24, 32, 40, 48, 56, 64, -1, -1, -1, -1, -1, -1, -1}, /* MPEG 2.5 */ -}; - -const int samplerate_table[3][4] = { - {22050, 24000, 16000, -1}, /* MPEG 2 */ - {44100, 48000, 32000, -1}, /* MPEG 1 */ - {11025, 12000, 8000, -1}, /* MPEG 2.5 */ -}; - -int -lame_get_bitrate(int mpeg_version, int table_index) -{ - if (0 <= mpeg_version && mpeg_version <= 2) { - if (0 <= table_index && table_index <= 15) { - return bitrate_table[mpeg_version][table_index]; - } - } - return -1; -} - -int -lame_get_samplerate(int mpeg_version, int table_index) -{ - if (0 <= mpeg_version && mpeg_version <= 2) { - if (0 <= table_index && table_index <= 3) { - return samplerate_table[mpeg_version][table_index]; - } - } - return -1; -} - - -/* This is the scfsi_band table from 2.4.2.7 of the IS */ -const int scfsi_band[5] = { 0, 6, 11, 16, 21 }; - -/* end of tables.c */ diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/tables.h b/recorderlib/src/main/jni/lame-3.100_libmp3lame/tables.h deleted file mode 100644 index 0dd7deb..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/tables.h +++ /dev/null @@ -1,95 +0,0 @@ -/* - * MPEG layer 3 tables include file - * - * Copyright (c) 1999 Albert L Faber - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef LAME_TABLES_H -#define LAME_TABLES_H - -#if 0 -typedef struct { - unsigned char no; - unsigned char width; - unsigned char minval_2; - float quiet_thr; - float norm; - float bark; -} type1_t; - -typedef struct { - unsigned char no; - unsigned char width; - float quiet_thr; - float norm; - float SNR; - float bark; -} type2_t; - -typedef struct { - unsigned int no:5; - unsigned int cbw:3; - unsigned int bu:6; - unsigned int bo:6; - unsigned int w1_576:10; - unsigned int w2_576:10; -} type34_t; - -typedef struct { - size_t len1; - const type1_t *const tab1; - size_t len2; - const type2_t *const tab2; - size_t len3; - const type34_t *const tab3; - size_t len4; - const type34_t *const tab4; -} type5_t; - -extern const type5_t table5[6]; - -#endif - -#define HTN 34 - -struct huffcodetab { - const unsigned int xlen; /* max. x-index+ */ - const unsigned int linmax; /* max number to be stored in linbits */ - const uint16_t *table; /* pointer to array[xlen][ylen] */ - const uint8_t *hlen; /* pointer to array[xlen][ylen] */ -}; - -extern const struct huffcodetab ht[HTN]; - /* global memory block */ - /* array of all huffcodtable headers */ - /* 0..31 Huffman code table 0..31 */ - /* 32,33 count1-tables */ - -extern const uint8_t t32l[]; -extern const uint8_t t33l[]; - -extern const uint32_t largetbl[16 * 16]; -extern const uint32_t table23[3 * 3]; -extern const uint32_t table56[4 * 4]; - -extern const int scfsi_band[5]; - -extern const int bitrate_table [3][16]; -extern const int samplerate_table [3][ 4]; - -#endif /* LAME_TABLES_H */ diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/takehiro.c b/recorderlib/src/main/jni/lame-3.100_libmp3lame/takehiro.c deleted file mode 100644 index 67aba1b..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/takehiro.c +++ /dev/null @@ -1,1375 +0,0 @@ -/* - * MP3 huffman table selecting and bit counting - * - * Copyright (c) 1999-2005 Takehiro TOMINAGA - * Copyright (c) 2002-2005 Gabriel Bouvigne - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* $Id: takehiro.c,v 1.80 2017/09/06 15:07:30 robert Exp $ */ - -#ifdef HAVE_CONFIG_H -# include -#endif - - -#include "lame.h" -#include "machine.h" -#include "encoder.h" -#include "util.h" -#include "quantize_pvt.h" -#include "tables.h" - - -static const struct { - const int region0_count; - const int region1_count; -} subdv_table[23] = { - { - 0, 0}, /* 0 bands */ - { - 0, 0}, /* 1 bands */ - { - 0, 0}, /* 2 bands */ - { - 0, 0}, /* 3 bands */ - { - 0, 0}, /* 4 bands */ - { - 0, 1}, /* 5 bands */ - { - 1, 1}, /* 6 bands */ - { - 1, 1}, /* 7 bands */ - { - 1, 2}, /* 8 bands */ - { - 2, 2}, /* 9 bands */ - { - 2, 3}, /* 10 bands */ - { - 2, 3}, /* 11 bands */ - { - 3, 4}, /* 12 bands */ - { - 3, 4}, /* 13 bands */ - { - 3, 4}, /* 14 bands */ - { - 4, 5}, /* 15 bands */ - { - 4, 5}, /* 16 bands */ - { - 4, 6}, /* 17 bands */ - { - 5, 6}, /* 18 bands */ - { - 5, 6}, /* 19 bands */ - { - 5, 7}, /* 20 bands */ - { - 6, 7}, /* 21 bands */ - { - 6, 7}, /* 22 bands */ -}; - - - - - -/********************************************************************* - * nonlinear quantization of xr - * More accurate formula than the ISO formula. Takes into account - * the fact that we are quantizing xr -> ix, but we want ix^4/3 to be - * as close as possible to x^4/3. (taking the nearest int would mean - * ix is as close as possible to xr, which is different.) - * - * From Segher Boessenkool 11/1999 - * - * 09/2000: ASM code removed in favor of IEEE754 hack by Takehiro - * Tominaga. If you need the ASM code, check CVS circa Aug 2000. - * - * 01/2004: Optimizations by Gabriel Bouvigne - *********************************************************************/ - - - - - -static void -quantize_lines_xrpow_01(unsigned int l, FLOAT istep, const FLOAT * xr, int *ix) -{ - const FLOAT compareval0 = (1.0f - 0.4054f) / istep; - unsigned int i; - - assert(l > 0); - assert(l % 2 == 0); - for (i = 0; i < l; i += 2) { - FLOAT const xr_0 = xr[i+0]; - FLOAT const xr_1 = xr[i+1]; - int const ix_0 = (compareval0 > xr_0) ? 0 : 1; - int const ix_1 = (compareval0 > xr_1) ? 0 : 1; - ix[i+0] = ix_0; - ix[i+1] = ix_1; - } -} - - - -#ifdef TAKEHIRO_IEEE754_HACK - -typedef union { - float f; - int i; -} fi_union; - -#define MAGIC_FLOAT (65536*(128)) -#define MAGIC_INT 0x4b000000 - - -static void -quantize_lines_xrpow(unsigned int l, FLOAT istep, const FLOAT * xp, int *pi) -{ - fi_union *fi; - unsigned int remaining; - - assert(l > 0); - - fi = (fi_union *) pi; - - l = l >> 1; - remaining = l % 2; - l = l >> 1; - while (l--) { - double x0 = istep * xp[0]; - double x1 = istep * xp[1]; - double x2 = istep * xp[2]; - double x3 = istep * xp[3]; - - x0 += MAGIC_FLOAT; - fi[0].f = x0; - x1 += MAGIC_FLOAT; - fi[1].f = x1; - x2 += MAGIC_FLOAT; - fi[2].f = x2; - x3 += MAGIC_FLOAT; - fi[3].f = x3; - - fi[0].f = x0 + adj43asm[fi[0].i - MAGIC_INT]; - fi[1].f = x1 + adj43asm[fi[1].i - MAGIC_INT]; - fi[2].f = x2 + adj43asm[fi[2].i - MAGIC_INT]; - fi[3].f = x3 + adj43asm[fi[3].i - MAGIC_INT]; - - fi[0].i -= MAGIC_INT; - fi[1].i -= MAGIC_INT; - fi[2].i -= MAGIC_INT; - fi[3].i -= MAGIC_INT; - fi += 4; - xp += 4; - }; - if (remaining) { - double x0 = istep * xp[0]; - double x1 = istep * xp[1]; - - x0 += MAGIC_FLOAT; - fi[0].f = x0; - x1 += MAGIC_FLOAT; - fi[1].f = x1; - - fi[0].f = x0 + adj43asm[fi[0].i - MAGIC_INT]; - fi[1].f = x1 + adj43asm[fi[1].i - MAGIC_INT]; - - fi[0].i -= MAGIC_INT; - fi[1].i -= MAGIC_INT; - } - -} - - -#else - -/********************************************************************* - * XRPOW_FTOI is a macro to convert floats to ints. - * if XRPOW_FTOI(x) = nearest_int(x), then QUANTFAC(x)=adj43asm[x] - * ROUNDFAC= -0.0946 - * - * if XRPOW_FTOI(x) = floor(x), then QUANTFAC(x)=asj43[x] - * ROUNDFAC=0.4054 - * - * Note: using floor() or (int) is extremely slow. On machines where - * the TAKEHIRO_IEEE754_HACK code above does not work, it is worthwile - * to write some ASM for XRPOW_FTOI(). - *********************************************************************/ -#define XRPOW_FTOI(src,dest) ((dest) = (int)(src)) -#define QUANTFAC(rx) adj43[rx] -#define ROUNDFAC 0.4054 - - -static void -quantize_lines_xrpow(unsigned int l, FLOAT istep, const FLOAT * xr, int *ix) -{ - unsigned int remaining; - - assert(l > 0); - - l = l >> 1; - remaining = l % 2; - l = l >> 1; - while (l--) { - FLOAT x0, x1, x2, x3; - int rx0, rx1, rx2, rx3; - - x0 = *xr++ * istep; - x1 = *xr++ * istep; - XRPOW_FTOI(x0, rx0); - x2 = *xr++ * istep; - XRPOW_FTOI(x1, rx1); - x3 = *xr++ * istep; - XRPOW_FTOI(x2, rx2); - x0 += QUANTFAC(rx0); - XRPOW_FTOI(x3, rx3); - x1 += QUANTFAC(rx1); - XRPOW_FTOI(x0, *ix++); - x2 += QUANTFAC(rx2); - XRPOW_FTOI(x1, *ix++); - x3 += QUANTFAC(rx3); - XRPOW_FTOI(x2, *ix++); - XRPOW_FTOI(x3, *ix++); - }; - if (remaining) { - FLOAT x0, x1; - int rx0, rx1; - - x0 = *xr++ * istep; - x1 = *xr++ * istep; - XRPOW_FTOI(x0, rx0); - XRPOW_FTOI(x1, rx1); - x0 += QUANTFAC(rx0); - x1 += QUANTFAC(rx1); - XRPOW_FTOI(x0, *ix++); - XRPOW_FTOI(x1, *ix++); - } - -} - - - -#endif - - - -/********************************************************************* - * Quantization function - * This function will select which lines to quantize and call the - * proper quantization function - *********************************************************************/ - -static void -quantize_xrpow(const FLOAT * xp, int *pi, FLOAT istep, gr_info const *const cod_info, - calc_noise_data const *prev_noise) -{ - /* quantize on xr^(3/4) instead of xr */ - int sfb; - int sfbmax; - int j = 0; - int prev_data_use; - int *iData; - int accumulate = 0; - int accumulate01 = 0; - int *acc_iData; - const FLOAT *acc_xp; - - iData = pi; - acc_xp = xp; - acc_iData = iData; - - - /* Reusing previously computed data does not seems to work if global gain - is changed. Finding why it behaves this way would allow to use a cache of - previously computed values (let's 10 cached values per sfb) that would - probably provide a noticeable speedup */ - prev_data_use = (prev_noise && (cod_info->global_gain == prev_noise->global_gain)); - - if (cod_info->block_type == SHORT_TYPE) - sfbmax = 38; - else - sfbmax = 21; - - for (sfb = 0; sfb <= sfbmax; sfb++) { - int step = -1; - - if (prev_data_use || cod_info->block_type == NORM_TYPE) { - step = - cod_info->global_gain - - ((cod_info->scalefac[sfb] + (cod_info->preflag ? pretab[sfb] : 0)) - << (cod_info->scalefac_scale + 1)) - - cod_info->subblock_gain[cod_info->window[sfb]] * 8; - } - assert(cod_info->width[sfb] >= 0); - if (prev_data_use && (prev_noise->step[sfb] == step)) { - /* do not recompute this part, - but compute accumulated lines */ - if (accumulate) { - quantize_lines_xrpow(accumulate, istep, acc_xp, acc_iData); - accumulate = 0; - } - if (accumulate01) { - quantize_lines_xrpow_01(accumulate01, istep, acc_xp, acc_iData); - accumulate01 = 0; - } - } - else { /*should compute this part */ - int l; - l = cod_info->width[sfb]; - - if ((j + cod_info->width[sfb]) > cod_info->max_nonzero_coeff) { - /*do not compute upper zero part */ - int usefullsize; - usefullsize = cod_info->max_nonzero_coeff - j + 1; - memset(&pi[cod_info->max_nonzero_coeff], 0, - sizeof(int) * (576 - cod_info->max_nonzero_coeff)); - l = usefullsize; - - if (l < 0) { - l = 0; - } - - /* no need to compute higher sfb values */ - sfb = sfbmax + 1; - } - - /*accumulate lines to quantize */ - if (!accumulate && !accumulate01) { - acc_iData = iData; - acc_xp = xp; - } - if (prev_noise && - prev_noise->sfb_count1 > 0 && - sfb >= prev_noise->sfb_count1 && - prev_noise->step[sfb] > 0 && step >= prev_noise->step[sfb]) { - - if (accumulate) { - quantize_lines_xrpow(accumulate, istep, acc_xp, acc_iData); - accumulate = 0; - acc_iData = iData; - acc_xp = xp; - } - accumulate01 += l; - } - else { - if (accumulate01) { - quantize_lines_xrpow_01(accumulate01, istep, acc_xp, acc_iData); - accumulate01 = 0; - acc_iData = iData; - acc_xp = xp; - } - accumulate += l; - } - - if (l <= 0) { - /* rh: 20040215 - * may happen due to "prev_data_use" optimization - */ - if (accumulate01) { - quantize_lines_xrpow_01(accumulate01, istep, acc_xp, acc_iData); - accumulate01 = 0; - } - if (accumulate) { - quantize_lines_xrpow(accumulate, istep, acc_xp, acc_iData); - accumulate = 0; - } - - break; /* ends for-loop */ - } - } - if (sfb <= sfbmax) { - iData += cod_info->width[sfb]; - xp += cod_info->width[sfb]; - j += cod_info->width[sfb]; - } - } - if (accumulate) { /*last data part */ - quantize_lines_xrpow(accumulate, istep, acc_xp, acc_iData); - accumulate = 0; - } - if (accumulate01) { /*last data part */ - quantize_lines_xrpow_01(accumulate01, istep, acc_xp, acc_iData); - accumulate01 = 0; - } - -} - - - - -/*************************************************************************/ -/* ix_max */ -/*************************************************************************/ - -static int -ix_max(const int *ix, const int *end) -{ - int max1 = 0, max2 = 0; - - do { - int const x1 = *ix++; - int const x2 = *ix++; - if (max1 < x1) - max1 = x1; - - if (max2 < x2) - max2 = x2; - } while (ix < end); - if (max1 < max2) - max1 = max2; - return max1; -} - - - - - - - - -static int -count_bit_ESC(const int *ix, const int *const end, int t1, const int t2, unsigned int *const s) -{ - /* ESC-table is used */ - unsigned int const linbits = ht[t1].xlen * 65536u + ht[t2].xlen; - unsigned int sum = 0, sum2; - - do { - unsigned int x = *ix++; - unsigned int y = *ix++; - - if (x >= 15u) { - x = 15u; - sum += linbits; - } - if (y >= 15u) { - y = 15u; - sum += linbits; - } - x <<= 4u; - x += y; - sum += largetbl[x]; - } while (ix < end); - - sum2 = sum & 0xffffu; - sum >>= 16u; - - if (sum > sum2) { - sum = sum2; - t1 = t2; - } - - *s += sum; - return t1; -} - - -static int -count_bit_noESC(const int *ix, const int *end, int mx, unsigned int *s) -{ - /* No ESC-words */ - unsigned int sum1 = 0; - const uint8_t *const hlen1 = ht[1].hlen; - (void) mx; - - do { - unsigned int const x0 = *ix++; - unsigned int const x1 = *ix++; - sum1 += hlen1[ x0+x0 + x1 ]; - } while (ix < end); - - *s += sum1; - return 1; -} - - -static const int huf_tbl_noESC[] = { - 1, 2, 5, 7, 7, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13 -}; - - -static int -count_bit_noESC_from2(const int *ix, const int *end, int max, unsigned int *s) -{ - int t1 = huf_tbl_noESC[max - 1]; - /* No ESC-words */ - const unsigned int xlen = ht[t1].xlen; - uint32_t const* table = (t1 == 2) ? &table23[0] : &table56[0]; - unsigned int sum = 0, sum2; - - do { - unsigned int const x0 = *ix++; - unsigned int const x1 = *ix++; - sum += table[ x0 * xlen + x1 ]; - } while (ix < end); - - sum2 = sum & 0xffffu; - sum >>= 16u; - - if (sum > sum2) { - sum = sum2; - t1++; - } - - *s += sum; - return t1; -} - - -inline static int -count_bit_noESC_from3(const int *ix, const int *end, int max, unsigned int * s) -{ - int t1 = huf_tbl_noESC[max - 1]; - /* No ESC-words */ - unsigned int sum1 = 0; - unsigned int sum2 = 0; - unsigned int sum3 = 0; - const unsigned int xlen = ht[t1].xlen; - const uint8_t *const hlen1 = ht[t1].hlen; - const uint8_t *const hlen2 = ht[t1 + 1].hlen; - const uint8_t *const hlen3 = ht[t1 + 2].hlen; - int t; - - do { - unsigned int x0 = *ix++; - unsigned int x1 = *ix++; - unsigned int x = x0 * xlen + x1; - sum1 += hlen1[x]; - sum2 += hlen2[x]; - sum3 += hlen3[x]; - } while (ix < end); - - t = t1; - if (sum1 > sum2) { - sum1 = sum2; - t++; - } - if (sum1 > sum3) { - sum1 = sum3; - t = t1 + 2; - } - *s += sum1; - - return t; -} - - -/*************************************************************************/ -/* choose table */ -/*************************************************************************/ - -/* - Choose the Huffman table that will encode ix[begin..end] with - the fewest bits. - - Note: This code contains knowledge about the sizes and characteristics - of the Huffman tables as defined in the IS (Table B.7), and will not work - with any arbitrary tables. -*/ -static int count_bit_null(const int* ix, const int* end, int max, unsigned int* s) -{ - (void) ix; - (void) end; - (void) max; - (void) s; - return 0; -} - -typedef int (*count_fnc)(const int* ix, const int* end, int max, unsigned int* s); - -static const count_fnc count_fncs[] = -{ &count_bit_null -, &count_bit_noESC -, &count_bit_noESC_from2 -, &count_bit_noESC_from2 -, &count_bit_noESC_from3 -, &count_bit_noESC_from3 -, &count_bit_noESC_from3 -, &count_bit_noESC_from3 -, &count_bit_noESC_from3 -, &count_bit_noESC_from3 -, &count_bit_noESC_from3 -, &count_bit_noESC_from3 -, &count_bit_noESC_from3 -, &count_bit_noESC_from3 -, &count_bit_noESC_from3 -, &count_bit_noESC_from3 -}; - -static int -choose_table_nonMMX(const int *ix, const int *const end, int *const _s) -{ - unsigned int* s = (unsigned int*)_s; - unsigned int max; - int choice, choice2; - max = ix_max(ix, end); - - if (max <= 15) { - return count_fncs[max](ix, end, max, s); - } - /* try tables with linbits */ - if (max > IXMAX_VAL) { - *s = LARGE_BITS; - return -1; - } - max -= 15u; - for (choice2 = 24; choice2 < 32; choice2++) { - if (ht[choice2].linmax >= max) { - break; - } - } - - for (choice = choice2 - 8; choice < 24; choice++) { - if (ht[choice].linmax >= max) { - break; - } - } - return count_bit_ESC(ix, end, choice, choice2, s); -} - - - -/*************************************************************************/ -/* count_bit */ -/*************************************************************************/ -int -noquant_count_bits(lame_internal_flags const *const gfc, - gr_info * const gi, calc_noise_data * prev_noise) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - int bits = 0; - int i, a1, a2; - int const *const ix = gi->l3_enc; - - i = Min(576, ((gi->max_nonzero_coeff + 2) >> 1) << 1); - - if (prev_noise) - prev_noise->sfb_count1 = 0; - - /* Determine count1 region */ - for (; i > 1; i -= 2) - if (ix[i - 1] | ix[i - 2]) - break; - gi->count1 = i; - - /* Determines the number of bits to encode the quadruples. */ - a1 = a2 = 0; - for (; i > 3; i -= 4) { - int x4 = ix[i-4]; - int x3 = ix[i-3]; - int x2 = ix[i-2]; - int x1 = ix[i-1]; - int p; - /* hack to check if all values <= 1 */ - if ((unsigned int) (x4 | x3 | x2 | x1) > 1) - break; - - p = ((x4 * 2 + x3) * 2 + x2) * 2 + x1; - a1 += t32l[p]; - a2 += t33l[p]; - } - - bits = a1; - gi->count1table_select = 0; - if (a1 > a2) { - bits = a2; - gi->count1table_select = 1; - } - - gi->count1bits = bits; - gi->big_values = i; - if (i == 0) - return bits; - - if (gi->block_type == SHORT_TYPE) { - a1 = 3 * gfc->scalefac_band.s[3]; - if (a1 > gi->big_values) - a1 = gi->big_values; - a2 = gi->big_values; - - } - else if (gi->block_type == NORM_TYPE) { - assert(i <= 576); /* bv_scf has 576 entries (0..575) */ - a1 = gi->region0_count = gfc->sv_qnt.bv_scf[i - 2]; - a2 = gi->region1_count = gfc->sv_qnt.bv_scf[i - 1]; - - assert(a1 + a2 + 2 < SBPSY_l); - a2 = gfc->scalefac_band.l[a1 + a2 + 2]; - a1 = gfc->scalefac_band.l[a1 + 1]; - if (a2 < i) - gi->table_select[2] = gfc->choose_table(ix + a2, ix + i, &bits); - - } - else { - gi->region0_count = 7; - /*gi->region1_count = SBPSY_l - 7 - 1; */ - gi->region1_count = SBMAX_l - 1 - 7 - 1; - a1 = gfc->scalefac_band.l[7 + 1]; - a2 = i; - if (a1 > a2) { - a1 = a2; - } - } - - - /* have to allow for the case when bigvalues < region0 < region1 */ - /* (and region0, region1 are ignored) */ - a1 = Min(a1, i); - a2 = Min(a2, i); - - assert(a1 >= 0); - assert(a2 >= 0); - - /* Count the number of bits necessary to code the bigvalues region. */ - if (0 < a1) - gi->table_select[0] = gfc->choose_table(ix, ix + a1, &bits); - if (a1 < a2) - gi->table_select[1] = gfc->choose_table(ix + a1, ix + a2, &bits); - if (cfg->use_best_huffman == 2) { - gi->part2_3_length = bits; - best_huffman_divide(gfc, gi); - bits = gi->part2_3_length; - } - - - if (prev_noise) { - if (gi->block_type == NORM_TYPE) { - int sfb = 0; - while (gfc->scalefac_band.l[sfb] < gi->big_values) { - sfb++; - } - prev_noise->sfb_count1 = sfb; - } - } - - return bits; -} - -int -count_bits(lame_internal_flags const *const gfc, - const FLOAT * const xr, gr_info * const gi, calc_noise_data * prev_noise) -{ - int *const ix = gi->l3_enc; - - /* since quantize_xrpow uses table lookup, we need to check this first: */ - FLOAT const w = (IXMAX_VAL) / IPOW20(gi->global_gain); - - if (gi->xrpow_max > w) - return LARGE_BITS; - - quantize_xrpow(xr, ix, IPOW20(gi->global_gain), gi, prev_noise); - - if (gfc->sv_qnt.substep_shaping & 2) { - int sfb, j = 0; - /* 0.634521682242439 = 0.5946*2**(.5*0.1875) */ - int const gain = gi->global_gain + gi->scalefac_scale; - const FLOAT roundfac = 0.634521682242439 / IPOW20(gain); - for (sfb = 0; sfb < gi->sfbmax; sfb++) { - int const width = gi->width[sfb]; - assert(width >= 0); - if (!gfc->sv_qnt.pseudohalf[sfb]) { - j += width; - } - else { - int k; - for (k = j, j += width; k < j; ++k) { - ix[k] = (xr[k] >= roundfac) ? ix[k] : 0; - } - } - } - } - return noquant_count_bits(gfc, gi, prev_noise); -} - -/*********************************************************************** - re-calculate the best scalefac_compress using scfsi - the saved bits are kept in the bit reservoir. - **********************************************************************/ - - -inline static void -recalc_divide_init(const lame_internal_flags * const gfc, - gr_info const *cod_info, - int const *const ix, int r01_bits[], int r01_div[], int r0_tbl[], int r1_tbl[]) -{ - int r0, r1, bigv, r0t, r1t, bits; - - bigv = cod_info->big_values; - - for (r0 = 0; r0 <= 7 + 15; r0++) { - r01_bits[r0] = LARGE_BITS; - } - - for (r0 = 0; r0 < 16; r0++) { - int const a1 = gfc->scalefac_band.l[r0 + 1]; - int r0bits; - if (a1 >= bigv) - break; - r0bits = 0; - r0t = gfc->choose_table(ix, ix + a1, &r0bits); - - for (r1 = 0; r1 < 8; r1++) { - int const a2 = gfc->scalefac_band.l[r0 + r1 + 2]; - if (a2 >= bigv) - break; - - bits = r0bits; - r1t = gfc->choose_table(ix + a1, ix + a2, &bits); - if (r01_bits[r0 + r1] > bits) { - r01_bits[r0 + r1] = bits; - r01_div[r0 + r1] = r0; - r0_tbl[r0 + r1] = r0t; - r1_tbl[r0 + r1] = r1t; - } - } - } -} - -inline static void -recalc_divide_sub(const lame_internal_flags * const gfc, - const gr_info * cod_info2, - gr_info * const gi, - const int *const ix, - const int r01_bits[], const int r01_div[], const int r0_tbl[], const int r1_tbl[]) -{ - int bits, r2, a2, bigv, r2t; - - bigv = cod_info2->big_values; - - for (r2 = 2; r2 < SBMAX_l + 1; r2++) { - a2 = gfc->scalefac_band.l[r2]; - if (a2 >= bigv) - break; - - bits = r01_bits[r2 - 2] + cod_info2->count1bits; - if (gi->part2_3_length <= bits) - break; - - r2t = gfc->choose_table(ix + a2, ix + bigv, &bits); - if (gi->part2_3_length <= bits) - continue; - - memcpy(gi, cod_info2, sizeof(gr_info)); - gi->part2_3_length = bits; - gi->region0_count = r01_div[r2 - 2]; - gi->region1_count = r2 - 2 - r01_div[r2 - 2]; - gi->table_select[0] = r0_tbl[r2 - 2]; - gi->table_select[1] = r1_tbl[r2 - 2]; - gi->table_select[2] = r2t; - } -} - - - - -void -best_huffman_divide(const lame_internal_flags * const gfc, gr_info * const gi) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - int i, a1, a2; - gr_info cod_info2; - int const *const ix = gi->l3_enc; - - int r01_bits[7 + 15 + 1]; - int r01_div[7 + 15 + 1]; - int r0_tbl[7 + 15 + 1]; - int r1_tbl[7 + 15 + 1]; - - - /* SHORT BLOCK stuff fails for MPEG2 */ - if (gi->block_type == SHORT_TYPE && cfg->mode_gr == 1) - return; - - - memcpy(&cod_info2, gi, sizeof(gr_info)); - if (gi->block_type == NORM_TYPE) { - recalc_divide_init(gfc, gi, ix, r01_bits, r01_div, r0_tbl, r1_tbl); - recalc_divide_sub(gfc, &cod_info2, gi, ix, r01_bits, r01_div, r0_tbl, r1_tbl); - } - - i = cod_info2.big_values; - if (i == 0 || (unsigned int) (ix[i - 2] | ix[i - 1]) > 1) - return; - - i = gi->count1 + 2; - if (i > 576) - return; - - /* Determines the number of bits to encode the quadruples. */ - memcpy(&cod_info2, gi, sizeof(gr_info)); - cod_info2.count1 = i; - a1 = a2 = 0; - - assert(i <= 576); - - for (; i > cod_info2.big_values; i -= 4) { - int const p = ((ix[i - 4] * 2 + ix[i - 3]) * 2 + ix[i - 2]) * 2 + ix[i - 1]; - a1 += t32l[p]; - a2 += t33l[p]; - } - cod_info2.big_values = i; - - cod_info2.count1table_select = 0; - if (a1 > a2) { - a1 = a2; - cod_info2.count1table_select = 1; - } - - cod_info2.count1bits = a1; - - if (cod_info2.block_type == NORM_TYPE) - recalc_divide_sub(gfc, &cod_info2, gi, ix, r01_bits, r01_div, r0_tbl, r1_tbl); - else { - /* Count the number of bits necessary to code the bigvalues region. */ - cod_info2.part2_3_length = a1; - a1 = gfc->scalefac_band.l[7 + 1]; - if (a1 > i) { - a1 = i; - } - if (a1 > 0) - cod_info2.table_select[0] = - gfc->choose_table(ix, ix + a1, (int *) &cod_info2.part2_3_length); - if (i > a1) - cod_info2.table_select[1] = - gfc->choose_table(ix + a1, ix + i, (int *) &cod_info2.part2_3_length); - if (gi->part2_3_length > cod_info2.part2_3_length) - memcpy(gi, &cod_info2, sizeof(gr_info)); - } -} - -static const int slen1_n[16] = { 1, 1, 1, 1, 8, 2, 2, 2, 4, 4, 4, 8, 8, 8, 16, 16 }; -static const int slen2_n[16] = { 1, 2, 4, 8, 1, 2, 4, 8, 2, 4, 8, 2, 4, 8, 4, 8 }; -const int slen1_tab[16] = { 0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4 }; -const int slen2_tab[16] = { 0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3 }; - -static void -scfsi_calc(int ch, III_side_info_t * l3_side) -{ - unsigned int i; - int s1, s2, c1, c2; - int sfb; - gr_info *const gi = &l3_side->tt[1][ch]; - gr_info const *const g0 = &l3_side->tt[0][ch]; - - for (i = 0; i < (sizeof(scfsi_band) / sizeof(int)) - 1; i++) { - for (sfb = scfsi_band[i]; sfb < scfsi_band[i + 1]; sfb++) { - if (g0->scalefac[sfb] != gi->scalefac[sfb] - && gi->scalefac[sfb] >= 0) - break; - } - if (sfb == scfsi_band[i + 1]) { - for (sfb = scfsi_band[i]; sfb < scfsi_band[i + 1]; sfb++) { - gi->scalefac[sfb] = -1; - } - l3_side->scfsi[ch][i] = 1; - } - } - - s1 = c1 = 0; - for (sfb = 0; sfb < 11; sfb++) { - if (gi->scalefac[sfb] == -1) - continue; - c1++; - if (s1 < gi->scalefac[sfb]) - s1 = gi->scalefac[sfb]; - } - - s2 = c2 = 0; - for (; sfb < SBPSY_l; sfb++) { - if (gi->scalefac[sfb] == -1) - continue; - c2++; - if (s2 < gi->scalefac[sfb]) - s2 = gi->scalefac[sfb]; - } - - for (i = 0; i < 16; i++) { - if (s1 < slen1_n[i] && s2 < slen2_n[i]) { - int const c = slen1_tab[i] * c1 + slen2_tab[i] * c2; - if (gi->part2_length > c) { - gi->part2_length = c; - gi->scalefac_compress = (int)i; - } - } - } -} - -/* -Find the optimal way to store the scalefactors. -Only call this routine after final scalefactors have been -chosen and the channel/granule will not be re-encoded. - */ -void -best_scalefac_store(const lame_internal_flags * gfc, - const int gr, const int ch, III_side_info_t * const l3_side) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - /* use scalefac_scale if we can */ - gr_info *const gi = &l3_side->tt[gr][ch]; - int sfb, i, j, l; - int recalc = 0; - - /* remove scalefacs from bands with ix=0. This idea comes - * from the AAC ISO docs. added mt 3/00 */ - /* check if l3_enc=0 */ - j = 0; - for (sfb = 0; sfb < gi->sfbmax; sfb++) { - int const width = gi->width[sfb]; - assert(width >= 0); - for (l = j, j += width; l < j; ++l) { - if (gi->l3_enc[l] != 0) - break; - } - if (l == j) - gi->scalefac[sfb] = recalc = -2; /* anything goes. */ - /* only best_scalefac_store and calc_scfsi - * know--and only they should know--about the magic number -2. - */ - } - - if (!gi->scalefac_scale && !gi->preflag) { - int s = 0; - for (sfb = 0; sfb < gi->sfbmax; sfb++) - if (gi->scalefac[sfb] > 0) - s |= gi->scalefac[sfb]; - - if (!(s & 1) && s != 0) { - for (sfb = 0; sfb < gi->sfbmax; sfb++) - if (gi->scalefac[sfb] > 0) - gi->scalefac[sfb] >>= 1; - - gi->scalefac_scale = recalc = 1; - } - } - - if (!gi->preflag && gi->block_type != SHORT_TYPE && cfg->mode_gr == 2) { - for (sfb = 11; sfb < SBPSY_l; sfb++) - if (gi->scalefac[sfb] < pretab[sfb] && gi->scalefac[sfb] != -2) - break; - if (sfb == SBPSY_l) { - for (sfb = 11; sfb < SBPSY_l; sfb++) - if (gi->scalefac[sfb] > 0) - gi->scalefac[sfb] -= pretab[sfb]; - - gi->preflag = recalc = 1; - } - } - - for (i = 0; i < 4; i++) - l3_side->scfsi[ch][i] = 0; - - if (cfg->mode_gr == 2 && gr == 1 - && l3_side->tt[0][ch].block_type != SHORT_TYPE - && l3_side->tt[1][ch].block_type != SHORT_TYPE) { - scfsi_calc(ch, l3_side); - recalc = 0; - } - for (sfb = 0; sfb < gi->sfbmax; sfb++) { - if (gi->scalefac[sfb] == -2) { - gi->scalefac[sfb] = 0; /* if anything goes, then 0 is a good choice */ - } - } - if (recalc) { - (void) scale_bitcount(gfc, gi); - } -} - - -#ifndef NDEBUG -static int -all_scalefactors_not_negative(int const *scalefac, int n) -{ - int i; - for (i = 0; i < n; ++i) { - if (scalefac[i] < 0) - return 0; - } - return 1; -} -#endif - - -/* number of bits used to encode scalefacs */ - -/* 18*slen1_tab[i] + 18*slen2_tab[i] */ -static const int scale_short[16] = { - 0, 18, 36, 54, 54, 36, 54, 72, 54, 72, 90, 72, 90, 108, 108, 126 -}; - -/* 17*slen1_tab[i] + 18*slen2_tab[i] */ -static const int scale_mixed[16] = { - 0, 18, 36, 54, 51, 35, 53, 71, 52, 70, 88, 69, 87, 105, 104, 122 -}; - -/* 11*slen1_tab[i] + 10*slen2_tab[i] */ -static const int scale_long[16] = { - 0, 10, 20, 30, 33, 21, 31, 41, 32, 42, 52, 43, 53, 63, 64, 74 -}; - - -/*************************************************************************/ -/* scale_bitcount */ -/*************************************************************************/ - -/* Also calculates the number of bits necessary to code the scalefactors. */ - -static int -mpeg1_scale_bitcount(const lame_internal_flags * gfc, gr_info * const cod_info) -{ - int k, sfb, max_slen1 = 0, max_slen2 = 0; - - /* maximum values */ - const int *tab; - int *const scalefac = cod_info->scalefac; - - (void) gfc; - assert(all_scalefactors_not_negative(scalefac, cod_info->sfbmax)); - - if (cod_info->block_type == SHORT_TYPE) { - tab = scale_short; - if (cod_info->mixed_block_flag) - tab = scale_mixed; - } - else { /* block_type == 1,2,or 3 */ - tab = scale_long; - if (!cod_info->preflag) { - for (sfb = 11; sfb < SBPSY_l; sfb++) - if (scalefac[sfb] < pretab[sfb]) - break; - - if (sfb == SBPSY_l) { - cod_info->preflag = 1; - for (sfb = 11; sfb < SBPSY_l; sfb++) - scalefac[sfb] -= pretab[sfb]; - } - } - } - - for (sfb = 0; sfb < cod_info->sfbdivide; sfb++) - if (max_slen1 < scalefac[sfb]) - max_slen1 = scalefac[sfb]; - - for (; sfb < cod_info->sfbmax; sfb++) - if (max_slen2 < scalefac[sfb]) - max_slen2 = scalefac[sfb]; - - /* from Takehiro TOMINAGA 10/99 - * loop over *all* posible values of scalefac_compress to find the - * one which uses the smallest number of bits. ISO would stop - * at first valid index */ - cod_info->part2_length = LARGE_BITS; - for (k = 0; k < 16; k++) { - if (max_slen1 < slen1_n[k] && max_slen2 < slen2_n[k] - && cod_info->part2_length > tab[k]) { - cod_info->part2_length = tab[k]; - cod_info->scalefac_compress = k; - } - } - return cod_info->part2_length == LARGE_BITS; -} - - - -/* - table of largest scalefactor values for MPEG2 -*/ -static const int max_range_sfac_tab[6][4] = { - {15, 15, 7, 7}, - {15, 15, 7, 0}, - {7, 3, 0, 0}, - {15, 31, 31, 0}, - {7, 7, 7, 0}, - {3, 3, 0, 0} -}; - - - - -/*************************************************************************/ -/* scale_bitcount_lsf */ -/*************************************************************************/ - -/* Also counts the number of bits to encode the scalefacs but for MPEG 2 */ -/* Lower sampling frequencies (24, 22.05 and 16 kHz.) */ - -/* This is reverse-engineered from section 2.4.3.2 of the MPEG2 IS, */ -/* "Audio Decoding Layer III" */ - -static int -mpeg2_scale_bitcount(const lame_internal_flags * gfc, gr_info * const cod_info) -{ - int table_number, row_in_table, partition, nr_sfb, window, over; - int i, sfb, max_sfac[4]; - const int *partition_table; - int const *const scalefac = cod_info->scalefac; - - /* - Set partition table. Note that should try to use table one, - but do not yet... - */ - if (cod_info->preflag) - table_number = 2; - else - table_number = 0; - - for (i = 0; i < 4; i++) - max_sfac[i] = 0; - - if (cod_info->block_type == SHORT_TYPE) { - row_in_table = 1; - partition_table = &nr_of_sfb_block[table_number][row_in_table][0]; - for (sfb = 0, partition = 0; partition < 4; partition++) { - nr_sfb = partition_table[partition] / 3; - for (i = 0; i < nr_sfb; i++, sfb++) - for (window = 0; window < 3; window++) - if (scalefac[sfb * 3 + window] > max_sfac[partition]) - max_sfac[partition] = scalefac[sfb * 3 + window]; - } - } - else { - row_in_table = 0; - partition_table = &nr_of_sfb_block[table_number][row_in_table][0]; - for (sfb = 0, partition = 0; partition < 4; partition++) { - nr_sfb = partition_table[partition]; - for (i = 0; i < nr_sfb; i++, sfb++) - if (scalefac[sfb] > max_sfac[partition]) - max_sfac[partition] = scalefac[sfb]; - } - } - - for (over = 0, partition = 0; partition < 4; partition++) { - if (max_sfac[partition] > max_range_sfac_tab[table_number][partition]) - over++; - } - if (!over) { - /* - Since no bands have been over-amplified, we can set scalefac_compress - and slen[] for the formatter - */ - static const int log2tab[] = { 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4 }; - - int slen1, slen2, slen3, slen4; - - cod_info->sfb_partition_table = nr_of_sfb_block[table_number][row_in_table]; - for (partition = 0; partition < 4; partition++) - cod_info->slen[partition] = log2tab[max_sfac[partition]]; - - /* set scalefac_compress */ - slen1 = cod_info->slen[0]; - slen2 = cod_info->slen[1]; - slen3 = cod_info->slen[2]; - slen4 = cod_info->slen[3]; - - switch (table_number) { - case 0: - cod_info->scalefac_compress = (((slen1 * 5) + slen2) << 4) - + (slen3 << 2) - + slen4; - break; - - case 1: - cod_info->scalefac_compress = 400 + (((slen1 * 5) + slen2) << 2) - + slen3; - break; - - case 2: - cod_info->scalefac_compress = 500 + (slen1 * 3) + slen2; - break; - - default: - ERRORF(gfc, "intensity stereo not implemented yet\n"); - break; - } - } -#ifdef DEBUG - if (over) - ERRORF(gfc, "---WARNING !! Amplification of some bands over limits\n"); -#endif - if (!over) { - assert(cod_info->sfb_partition_table); - cod_info->part2_length = 0; - for (partition = 0; partition < 4; partition++) - cod_info->part2_length += - cod_info->slen[partition] * cod_info->sfb_partition_table[partition]; - } - return over; -} - - -int -scale_bitcount(const lame_internal_flags * gfc, gr_info * cod_info) -{ - if (gfc->cfg.mode_gr == 2) { - return mpeg1_scale_bitcount(gfc, cod_info); - } - else { - return mpeg2_scale_bitcount(gfc, cod_info); - } -} - - -#ifdef MMX_choose_table -extern int choose_table_MMX(const int *ix, const int *const end, int *const s); -#endif - -void -huffman_init(lame_internal_flags * const gfc) -{ - int i; - - gfc->choose_table = choose_table_nonMMX; - -#ifdef MMX_choose_table - if (gfc->CPU_features.MMX) { - gfc->choose_table = choose_table_MMX; - } -#endif - - for (i = 2; i <= 576; i += 2) { - int scfb_anz = 0, bv_index; - while (gfc->scalefac_band.l[++scfb_anz] < i); - - bv_index = subdv_table[scfb_anz].region0_count; - while (gfc->scalefac_band.l[bv_index + 1] > i) - bv_index--; - - if (bv_index < 0) { - /* this is an indication that everything is going to - be encoded as region0: bigvalues < region0 < region1 - so lets set region0, region1 to some value larger - than bigvalues */ - bv_index = subdv_table[scfb_anz].region0_count; - } - - gfc->sv_qnt.bv_scf[i - 2] = bv_index; - - bv_index = subdv_table[scfb_anz].region1_count; - while (gfc->scalefac_band.l[bv_index + gfc->sv_qnt.bv_scf[i - 2] + 2] > i) - bv_index--; - - if (bv_index < 0) { - bv_index = subdv_table[scfb_anz].region1_count; - } - - gfc->sv_qnt.bv_scf[i - 1] = bv_index; - } -} diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/util.c b/recorderlib/src/main/jni/lame-3.100_libmp3lame/util.c deleted file mode 100644 index 43b457c..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/util.c +++ /dev/null @@ -1,1018 +0,0 @@ -/* - * lame utility library source file - * - * Copyright (c) 1999 Albert L Faber - * Copyright (c) 2000-2005 Alexander Leidinger - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* $Id: util.c,v 1.159 2017/09/06 15:07:30 robert Exp $ */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include -#include "lame.h" -#include "machine.h" -#include "encoder.h" -#include "util.h" -#include "tables.h" - -#define PRECOMPUTE -#if defined(__FreeBSD__) && !defined(__alpha__) -# include -#endif - - -/*********************************************************************** -* -* Global Function Definitions -* -***********************************************************************/ -/*empty and close mallocs in gfc */ - -void -free_id3tag(lame_internal_flags * const gfc) -{ - gfc->tag_spec.language[0] = 0; - if (gfc->tag_spec.title != 0) { - free(gfc->tag_spec.title); - gfc->tag_spec.title = 0; - } - if (gfc->tag_spec.artist != 0) { - free(gfc->tag_spec.artist); - gfc->tag_spec.artist = 0; - } - if (gfc->tag_spec.album != 0) { - free(gfc->tag_spec.album); - gfc->tag_spec.album = 0; - } - if (gfc->tag_spec.comment != 0) { - free(gfc->tag_spec.comment); - gfc->tag_spec.comment = 0; - } - - if (gfc->tag_spec.albumart != 0) { - free(gfc->tag_spec.albumart); - gfc->tag_spec.albumart = 0; - gfc->tag_spec.albumart_size = 0; - gfc->tag_spec.albumart_mimetype = MIMETYPE_NONE; - } - if (gfc->tag_spec.v2_head != 0) { - FrameDataNode *node = gfc->tag_spec.v2_head; - do { - void *p = node->dsc.ptr.b; - void *q = node->txt.ptr.b; - void *r = node; - node = node->nxt; - free(p); - free(q); - free(r); - } while (node != 0); - gfc->tag_spec.v2_head = 0; - gfc->tag_spec.v2_tail = 0; - } -} - - -static void -free_global_data(lame_internal_flags * gfc) -{ - if (gfc && gfc->cd_psy) { - if (gfc->cd_psy->l.s3) { - /* XXX allocated in psymodel_init() */ - free(gfc->cd_psy->l.s3); - } - if (gfc->cd_psy->s.s3) { - /* XXX allocated in psymodel_init() */ - free(gfc->cd_psy->s.s3); - } - free(gfc->cd_psy); - gfc->cd_psy = 0; - } -} - - -void -freegfc(lame_internal_flags * const gfc) -{ /* bit stream structure */ - int i; - - if (gfc == 0) return; - - for (i = 0; i <= 2 * BPC; i++) - if (gfc->sv_enc.blackfilt[i] != NULL) { - free(gfc->sv_enc.blackfilt[i]); - gfc->sv_enc.blackfilt[i] = NULL; - } - if (gfc->sv_enc.inbuf_old[0]) { - free(gfc->sv_enc.inbuf_old[0]); - gfc->sv_enc.inbuf_old[0] = NULL; - } - if (gfc->sv_enc.inbuf_old[1]) { - free(gfc->sv_enc.inbuf_old[1]); - gfc->sv_enc.inbuf_old[1] = NULL; - } - - if (gfc->bs.buf != NULL) { - free(gfc->bs.buf); - gfc->bs.buf = NULL; - } - - if (gfc->VBR_seek_table.bag) { - free(gfc->VBR_seek_table.bag); - gfc->VBR_seek_table.bag = NULL; - gfc->VBR_seek_table.size = 0; - } - if (gfc->ATH) { - free(gfc->ATH); - } - if (gfc->sv_rpg.rgdata) { - free(gfc->sv_rpg.rgdata); - } - if (gfc->sv_enc.in_buffer_0) { - free(gfc->sv_enc.in_buffer_0); - } - if (gfc->sv_enc.in_buffer_1) { - free(gfc->sv_enc.in_buffer_1); - } - free_id3tag(gfc); - -#ifdef DECODE_ON_THE_FLY - if (gfc->hip) { - hip_decode_exit(gfc->hip); - gfc->hip = 0; - } -#endif - - free_global_data(gfc); - - free(gfc); -} - -void -calloc_aligned(aligned_pointer_t * ptr, unsigned int size, unsigned int bytes) -{ - if (ptr) { - if (!ptr->pointer) { - ptr->pointer = malloc(size + bytes); - if (ptr->pointer != 0) { - memset(ptr->pointer, 0, size + bytes); - if (bytes > 0) { - ptr->aligned = (void *) ((((size_t) ptr->pointer + bytes - 1) / bytes) * bytes); - } - else { - ptr->aligned = ptr->pointer; - } - } - else { - ptr->aligned = 0; - } - } - } -} - -void -free_aligned(aligned_pointer_t * ptr) -{ - if (ptr) { - if (ptr->pointer) { - free(ptr->pointer); - ptr->pointer = 0; - ptr->aligned = 0; - } - } -} - -/*those ATH formulas are returning -their minimum value for input = -1*/ - -static FLOAT -ATHformula_GB(FLOAT f, FLOAT value, FLOAT f_min, FLOAT f_max) -{ - /* from Painter & Spanias - modified by Gabriel Bouvigne to better fit the reality - ath = 3.640 * pow(f,-0.8) - - 6.800 * exp(-0.6*pow(f-3.4,2.0)) - + 6.000 * exp(-0.15*pow(f-8.7,2.0)) - + 0.6* 0.001 * pow(f,4.0); - - - In the past LAME was using the Painter &Spanias formula. - But we had some recurrent problems with HF content. - We measured real ATH values, and found the older formula - to be inacurate in the higher part. So we made this new - formula and this solved most of HF problematic testcases. - The tradeoff is that in VBR mode it increases a lot the - bitrate. */ - - -/*this curve can be udjusted according to the VBR scale: -it adjusts from something close to Painter & Spanias -on V9 up to Bouvigne's formula for V0. This way the VBR -bitrate is more balanced according to the -V value.*/ - - FLOAT ath; - - /* the following Hack allows to ask for the lowest value */ - if (f < -.3) - f = 3410; - - f /= 1000; /* convert to khz */ - f = Max(f_min, f); - f = Min(f_max, f); - - ath = 3.640 * pow(f, -0.8) - - 6.800 * exp(-0.6 * pow(f - 3.4, 2.0)) - + 6.000 * exp(-0.15 * pow(f - 8.7, 2.0)) - + (0.6 + 0.04 * value) * 0.001 * pow(f, 4.0); - return ath; -} - - - -FLOAT -ATHformula(SessionConfig_t const *cfg, FLOAT f) -{ - FLOAT ath; - switch (cfg->ATHtype) { - case 0: - ath = ATHformula_GB(f, 9, 0.1f, 24.0f); - break; - case 1: - ath = ATHformula_GB(f, -1, 0.1f, 24.0f); /*over sensitive, should probably be removed */ - break; - case 2: - ath = ATHformula_GB(f, 0, 0.1f, 24.0f); - break; - case 3: - ath = ATHformula_GB(f, 1, 0.1f, 24.0f) + 6; /*modification of GB formula by Roel */ - break; - case 4: - ath = ATHformula_GB(f, cfg->ATHcurve, 0.1f, 24.0f); - break; - case 5: - ath = ATHformula_GB(f, cfg->ATHcurve, 3.41f, 16.1f); - break; - default: - ath = ATHformula_GB(f, 0, 0.1f, 24.0f); - break; - } - return ath; -} - -/* see for example "Zwicker: Psychoakustik, 1982; ISBN 3-540-11401-7 */ -FLOAT -freq2bark(FLOAT freq) -{ - /* input: freq in hz output: barks */ - if (freq < 0) - freq = 0; - freq = freq * 0.001; - return 13.0 * atan(.76 * freq) + 3.5 * atan(freq * freq / (7.5 * 7.5)); -} - -#if 0 -extern FLOAT freq2cbw(FLOAT freq); - -/* see for example "Zwicker: Psychoakustik, 1982; ISBN 3-540-11401-7 */ -FLOAT -freq2cbw(FLOAT freq) -{ - /* input: freq in hz output: critical band width */ - freq = freq * 0.001; - return 25 + 75 * pow(1 + 1.4 * (freq * freq), 0.69); -} - -#endif - - - - -#define ABS(A) (((A)>0) ? (A) : -(A)) - -int -FindNearestBitrate(int bRate, /* legal rates from 8 to 320 */ - int version, int samplerate) -{ /* MPEG-1 or MPEG-2 LSF */ - int bitrate; - int i; - - if (samplerate < 16000) - version = 2; - - bitrate = bitrate_table[version][1]; - - for (i = 2; i <= 14; i++) { - if (bitrate_table[version][i] > 0) { - if (ABS(bitrate_table[version][i] - bRate) < ABS(bitrate - bRate)) - bitrate = bitrate_table[version][i]; - } - } - return bitrate; -} - - - - - -#ifndef Min -#define Min(A, B) ((A) < (B) ? (A) : (B)) -#endif -#ifndef Max -#define Max(A, B) ((A) > (B) ? (A) : (B)) -#endif - - -/* Used to find table index when - * we need bitrate-based values - * determined using tables - * - * bitrate in kbps - * - * Gabriel Bouvigne 2002-11-03 - */ -int -nearestBitrateFullIndex(uint16_t bitrate) -{ - /* borrowed from DM abr presets */ - - const int full_bitrate_table[] = - { 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320 }; - - - int lower_range = 0, lower_range_kbps = 0, upper_range = 0, upper_range_kbps = 0; - - - int b; - - - /* We assume specified bitrate will be 320kbps */ - upper_range_kbps = full_bitrate_table[16]; - upper_range = 16; - lower_range_kbps = full_bitrate_table[16]; - lower_range = 16; - - /* Determine which significant bitrates the value specified falls between, - * if loop ends without breaking then we were correct above that the value was 320 - */ - for (b = 0; b < 16; b++) { - if ((Max(bitrate, full_bitrate_table[b + 1])) != bitrate) { - upper_range_kbps = full_bitrate_table[b + 1]; - upper_range = b + 1; - lower_range_kbps = full_bitrate_table[b]; - lower_range = (b); - break; /* We found upper range */ - } - } - - /* Determine which range the value specified is closer to */ - if ((upper_range_kbps - bitrate) > (bitrate - lower_range_kbps)) { - return lower_range; - } - return upper_range; -} - - - - - -/* map frequency to a valid MP3 sample frequency - * - * Robert Hegemann 2000-07-01 - */ -int -map2MP3Frequency(int freq) -{ - if (freq <= 8000) - return 8000; - if (freq <= 11025) - return 11025; - if (freq <= 12000) - return 12000; - if (freq <= 16000) - return 16000; - if (freq <= 22050) - return 22050; - if (freq <= 24000) - return 24000; - if (freq <= 32000) - return 32000; - if (freq <= 44100) - return 44100; - - return 48000; -} - -int -BitrateIndex(int bRate, /* legal rates from 32 to 448 kbps */ - int version, /* MPEG-1 or MPEG-2/2.5 LSF */ - int samplerate) -{ /* convert bitrate in kbps to index */ - int i; - if (samplerate < 16000) - version = 2; - for (i = 0; i <= 14; i++) { - if (bitrate_table[version][i] > 0) { - if (bitrate_table[version][i] == bRate) { - return i; - } - } - } - return -1; -} - -/* convert samp freq in Hz to index */ - -int -SmpFrqIndex(int sample_freq, int *const version) -{ - switch (sample_freq) { - case 44100: - *version = 1; - return 0; - case 48000: - *version = 1; - return 1; - case 32000: - *version = 1; - return 2; - case 22050: - *version = 0; - return 0; - case 24000: - *version = 0; - return 1; - case 16000: - *version = 0; - return 2; - case 11025: - *version = 0; - return 0; - case 12000: - *version = 0; - return 1; - case 8000: - *version = 0; - return 2; - default: - *version = 0; - return -1; - } -} - - -/***************************************************************************** -* -* End of bit_stream.c package -* -*****************************************************************************/ - - - - - - - - - - -/* resampling via FIR filter, blackman window */ -inline static FLOAT -blackman(FLOAT x, FLOAT fcn, int l) -{ - /* This algorithm from: - SIGNAL PROCESSING ALGORITHMS IN FORTRAN AND C - S.D. Stearns and R.A. David, Prentice-Hall, 1992 - */ - FLOAT bkwn, x2; - FLOAT const wcn = (PI * fcn); - - x /= l; - if (x < 0) - x = 0; - if (x > 1) - x = 1; - x2 = x - .5; - - bkwn = 0.42 - 0.5 * cos(2 * x * PI) + 0.08 * cos(4 * x * PI); - if (fabs(x2) < 1e-9) - return wcn / PI; - else - return (bkwn * sin(l * wcn * x2) / (PI * l * x2)); - - -} - - - - -/* gcd - greatest common divisor */ -/* Joint work of Euclid and M. Hendry */ - -static int -gcd(int i, int j) -{ - /* assert ( i > 0 && j > 0 ); */ - return j ? gcd(j, i % j) : i; -} - - - -static int -fill_buffer_resample(lame_internal_flags * gfc, - sample_t * outbuf, - int desired_len, sample_t const *inbuf, int len, int *num_used, int ch) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - EncStateVar_t *esv = &gfc->sv_enc; - double resample_ratio = (double)cfg->samplerate_in / (double)cfg->samplerate_out; - int BLACKSIZE; - FLOAT offset, xvalue; - int i, j = 0, k; - int filter_l; - FLOAT fcn, intratio; - FLOAT *inbuf_old; - int bpc; /* number of convolution functions to pre-compute */ - bpc = cfg->samplerate_out / gcd(cfg->samplerate_out, cfg->samplerate_in); - if (bpc > BPC) - bpc = BPC; - - intratio = (fabs(resample_ratio - floor(.5 + resample_ratio)) < FLT_EPSILON); - fcn = 1.00 / resample_ratio; - if (fcn > 1.00) - fcn = 1.00; - filter_l = 31; /* must be odd */ - filter_l += intratio; /* unless resample_ratio=int, it must be even */ - - - BLACKSIZE = filter_l + 1; /* size of data needed for FIR */ - - if (gfc->fill_buffer_resample_init == 0) { - esv->inbuf_old[0] = lame_calloc(sample_t, BLACKSIZE); - esv->inbuf_old[1] = lame_calloc(sample_t, BLACKSIZE); - for (i = 0; i <= 2 * bpc; ++i) - esv->blackfilt[i] = lame_calloc(sample_t, BLACKSIZE); - - esv->itime[0] = 0; - esv->itime[1] = 0; - - /* precompute blackman filter coefficients */ - for (j = 0; j <= 2 * bpc; j++) { - FLOAT sum = 0.; - offset = (j - bpc) / (2. * bpc); - for (i = 0; i <= filter_l; i++) - sum += esv->blackfilt[j][i] = blackman(i - offset, fcn, filter_l); - for (i = 0; i <= filter_l; i++) - esv->blackfilt[j][i] /= sum; - } - gfc->fill_buffer_resample_init = 1; - } - - inbuf_old = esv->inbuf_old[ch]; - - /* time of j'th element in inbuf = itime + j/ifreq; */ - /* time of k'th element in outbuf = j/ofreq */ - for (k = 0; k < desired_len; k++) { - double time0 = k * resample_ratio; /* time of k'th output sample */ - int joff; - - j = floor(time0 - esv->itime[ch]); - - /* check if we need more input data */ - if ((filter_l + j - filter_l / 2) >= len) - break; - - /* blackman filter. by default, window centered at j+.5(filter_l%2) */ - /* but we want a window centered at time0. */ - offset = (time0 - esv->itime[ch] - (j + .5 * (filter_l % 2))); - assert(fabs(offset) <= .501); - - /* find the closest precomputed window for this offset: */ - joff = floor((offset * 2 * bpc) + bpc + .5); - - xvalue = 0.; - for (i = 0; i <= filter_l; ++i) { - int const j2 = i + j - filter_l / 2; - sample_t y; - assert(j2 < len); - assert(j2 + BLACKSIZE >= 0); - y = (j2 < 0) ? inbuf_old[BLACKSIZE + j2] : inbuf[j2]; -#ifdef PRECOMPUTE - xvalue += y * esv->blackfilt[joff][i]; -#else - xvalue += y * blackman(i - offset, fcn, filter_l); /* very slow! */ -#endif - } - outbuf[k] = xvalue; - } - - - /* k = number of samples added to outbuf */ - /* last k sample used data from [j-filter_l/2,j+filter_l-filter_l/2] */ - - /* how many samples of input data were used: */ - *num_used = Min(len, filter_l + j - filter_l / 2); - - /* adjust our input time counter. Incriment by the number of samples used, - * then normalize so that next output sample is at time 0, next - * input buffer is at time itime[ch] */ - esv->itime[ch] += *num_used - k * resample_ratio; - - /* save the last BLACKSIZE samples into the inbuf_old buffer */ - if (*num_used >= BLACKSIZE) { - for (i = 0; i < BLACKSIZE; i++) - inbuf_old[i] = inbuf[*num_used + i - BLACKSIZE]; - } - else { - /* shift in *num_used samples into inbuf_old */ - int const n_shift = BLACKSIZE - *num_used; /* number of samples to shift */ - - /* shift n_shift samples by *num_used, to make room for the - * num_used new samples */ - for (i = 0; i < n_shift; ++i) - inbuf_old[i] = inbuf_old[i + *num_used]; - - /* shift in the *num_used samples */ - for (j = 0; i < BLACKSIZE; ++i, ++j) - inbuf_old[i] = inbuf[j]; - - assert(j == *num_used); - } - return k; /* return the number samples created at the new samplerate */ -} - -int -isResamplingNecessary(SessionConfig_t const* cfg) -{ - int const l = cfg->samplerate_out * 0.9995f; - int const h = cfg->samplerate_out * 1.0005f; - return (cfg->samplerate_in < l) || (h < cfg->samplerate_in) ? 1 : 0; -} - -/* copy in new samples from in_buffer into mfbuf, with resampling - if necessary. n_in = number of samples from the input buffer that - were used. n_out = number of samples copied into mfbuf */ - -void -fill_buffer(lame_internal_flags * gfc, - sample_t * const mfbuf[2], sample_t const * const in_buffer[2], int nsamples, int *n_in, int *n_out) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - int mf_size = gfc->sv_enc.mf_size; - int framesize = 576 * cfg->mode_gr; - int nout, ch = 0; - int nch = cfg->channels_out; - - /* copy in new samples into mfbuf, with resampling if necessary */ - if (isResamplingNecessary(cfg)) { - do { - nout = - fill_buffer_resample(gfc, &mfbuf[ch][mf_size], - framesize, in_buffer[ch], nsamples, n_in, ch); - } while (++ch < nch); - *n_out = nout; - } - else { - nout = Min(framesize, nsamples); - do { - memcpy(&mfbuf[ch][mf_size], &in_buffer[ch][0], nout * sizeof(mfbuf[0][0])); - } while (++ch < nch); - *n_out = nout; - *n_in = nout; - } -} - - - - - - - -/*********************************************************************** -* -* Message Output -* -***********************************************************************/ - -void -lame_report_def(const char *format, va_list args) -{ - (void) vfprintf(stderr, format, args); - fflush(stderr); /* an debug function should flush immediately */ -} - -void -lame_report_fnc(lame_report_function print_f, const char *format, ...) -{ - if (print_f) { - va_list args; - va_start(args, format); - print_f(format, args); - va_end(args); - } -} - - -void -lame_debugf(const lame_internal_flags* gfc, const char *format, ...) -{ - if (gfc && gfc->report_dbg) { - va_list args; - va_start(args, format); - gfc->report_dbg(format, args); - va_end(args); - } -} - - -void -lame_msgf(const lame_internal_flags* gfc, const char *format, ...) -{ - if (gfc && gfc->report_msg) { - va_list args; - va_start(args, format); - gfc->report_msg(format, args); - va_end(args); - } -} - - -void -lame_errorf(const lame_internal_flags* gfc, const char *format, ...) -{ - if (gfc && gfc->report_err) { - va_list args; - va_start(args, format); - gfc->report_err(format, args); - va_end(args); - } -} - - - -/*********************************************************************** - * - * routines to detect CPU specific features like 3DNow, MMX, SSE - * - * donated by Frank Klemm - * added Robert Hegemann 2000-10-10 - * - ***********************************************************************/ - -#ifdef HAVE_NASM -extern int has_MMX_nasm(void); -extern int has_3DNow_nasm(void); -extern int has_SSE_nasm(void); -extern int has_SSE2_nasm(void); -#endif - -int -has_MMX(void) -{ -#ifdef HAVE_NASM - return has_MMX_nasm(); -#else - return 0; /* don't know, assume not */ -#endif -} - -int -has_3DNow(void) -{ -#ifdef HAVE_NASM - return has_3DNow_nasm(); -#else - return 0; /* don't know, assume not */ -#endif -} - -int -has_SSE(void) -{ -#ifdef HAVE_NASM - return has_SSE_nasm(); -#else -#if defined( _M_X64 ) || defined( MIN_ARCH_SSE ) - return 1; -#else - return 0; /* don't know, assume not */ -#endif -#endif -} - -int -has_SSE2(void) -{ -#ifdef HAVE_NASM - return has_SSE2_nasm(); -#else -#if defined( _M_X64 ) || defined( MIN_ARCH_SSE ) - return 1; -#else - return 0; /* don't know, assume not */ -#endif -#endif -} - -void -disable_FPE(void) -{ -/* extremly system dependent stuff, move to a lib to make the code readable */ -/*==========================================================================*/ - - - - /* - * Disable floating point exceptions - */ - - - - -#if defined(__FreeBSD__) && !defined(__alpha__) - { - /* seet floating point mask to the Linux default */ - fp_except_t mask; - mask = fpgetmask(); - /* if bit is set, we get SIGFPE on that error! */ - fpsetmask(mask & ~(FP_X_INV | FP_X_DZ)); - /* DEBUGF("FreeBSD mask is 0x%x\n",mask); */ - } -#endif - -#if defined(__riscos__) && !defined(ABORTFP) - /* Disable FPE's under RISC OS */ - /* if bit is set, we disable trapping that error! */ - /* _FPE_IVO : invalid operation */ - /* _FPE_DVZ : divide by zero */ - /* _FPE_OFL : overflow */ - /* _FPE_UFL : underflow */ - /* _FPE_INX : inexact */ - DisableFPETraps(_FPE_IVO | _FPE_DVZ | _FPE_OFL); -#endif - - /* - * Debugging stuff - * The default is to ignore FPE's, unless compiled with -DABORTFP - * so add code below to ENABLE FPE's. - */ - -#if defined(ABORTFP) -#if defined(_MSC_VER) - { -#if 0 - /* rh 061207 - the following fix seems to be a workaround for a problem in the - parent process calling LAME. It would be better to fix the broken - application => code disabled. - */ - - /* set affinity to a single CPU. Fix for EAC/lame on SMP systems from - "Todd Richmond" */ - SYSTEM_INFO si; - GetSystemInfo(&si); - SetProcessAffinityMask(GetCurrentProcess(), si.dwActiveProcessorMask); -#endif -#include - unsigned int mask; - mask = _controlfp(0, 0); - mask &= ~(_EM_OVERFLOW | _EM_UNDERFLOW | _EM_ZERODIVIDE | _EM_INVALID); - mask = _controlfp(mask, _MCW_EM); - } -#elif defined(__CYGWIN__) -# define _FPU_GETCW(cw) __asm__ ("fnstcw %0" : "=m" (*&cw)) -# define _FPU_SETCW(cw) __asm__ ("fldcw %0" : : "m" (*&cw)) - -# define _EM_INEXACT 0x00000020 /* inexact (precision) */ -# define _EM_UNDERFLOW 0x00000010 /* underflow */ -# define _EM_OVERFLOW 0x00000008 /* overflow */ -# define _EM_ZERODIVIDE 0x00000004 /* zero divide */ -# define _EM_INVALID 0x00000001 /* invalid */ - { - unsigned int mask; - _FPU_GETCW(mask); - /* Set the FPU control word to abort on most FPEs */ - mask &= ~(_EM_OVERFLOW | _EM_ZERODIVIDE | _EM_INVALID); - _FPU_SETCW(mask); - } -# elif defined(__linux__) - { - -# include -# ifndef _FPU_GETCW -# define _FPU_GETCW(cw) __asm__ ("fnstcw %0" : "=m" (*&cw)) -# endif -# ifndef _FPU_SETCW -# define _FPU_SETCW(cw) __asm__ ("fldcw %0" : : "m" (*&cw)) -# endif - - /* - * Set the Linux mask to abort on most FPE's - * if bit is set, we _mask_ SIGFPE on that error! - * mask &= ~( _FPU_MASK_IM | _FPU_MASK_ZM | _FPU_MASK_OM | _FPU_MASK_UM ); - */ - - unsigned int mask; - _FPU_GETCW(mask); - mask &= ~(_FPU_MASK_IM | _FPU_MASK_ZM | _FPU_MASK_OM); - _FPU_SETCW(mask); - } -#endif -#endif /* ABORTFP */ -} - - - - - -#ifdef USE_FAST_LOG -/*********************************************************************** - * - * Fast Log Approximation for log2, used to approximate every other log - * (log10 and log) - * maximum absolute error for log10 is around 10-6 - * maximum *relative* error can be high when x is almost 1 because error/log10(x) tends toward x/e - * - * use it if typical RESULT values are > 1e-5 (for example if x>1.00001 or x<0.99999) - * or if the relative precision in the domain around 1 is not important (result in 1 is exact and 0) - * - ***********************************************************************/ - - -#define LOG2_SIZE (512) -#define LOG2_SIZE_L2 (9) - -static ieee754_float32_t log_table[LOG2_SIZE + 1]; - - - -void -init_log_table(void) -{ - int j; - static int init = 0; - - /* Range for log2(x) over [1,2[ is [0,1[ */ - assert((1 << LOG2_SIZE_L2) == LOG2_SIZE); - - if (!init) { - for (j = 0; j < LOG2_SIZE + 1; j++) - log_table[j] = log(1.0f + j / (ieee754_float32_t) LOG2_SIZE) / log(2.0f); - } - init = 1; -} - - - -ieee754_float32_t -fast_log2(ieee754_float32_t x) -{ - ieee754_float32_t log2val, partial; - union { - ieee754_float32_t f; - int i; - } fi; - int mantisse; - fi.f = x; - mantisse = fi.i & 0x7fffff; - log2val = ((fi.i >> 23) & 0xFF) - 0x7f; - partial = (mantisse & ((1 << (23 - LOG2_SIZE_L2)) - 1)); - partial *= 1.0f / ((1 << (23 - LOG2_SIZE_L2))); - - - mantisse >>= (23 - LOG2_SIZE_L2); - - /* log2val += log_table[mantisse]; without interpolation the results are not good */ - log2val += log_table[mantisse] * (1.0f - partial) + log_table[mantisse + 1] * partial; - - return log2val; -} - -#else /* Don't use FAST_LOG */ - - -void -init_log_table(void) -{ -} - - -#endif - -/* end of util.c */ diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/util.h b/recorderlib/src/main/jni/lame-3.100_libmp3lame/util.h deleted file mode 100644 index c622959..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/util.h +++ /dev/null @@ -1,616 +0,0 @@ -/* - * lame utility library include file - * - * Copyright (c) 1999 Albert L Faber - * Copyright (c) 2008 Robert Hegemann - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef LAME_UTIL_H -#define LAME_UTIL_H - -#include "l3side.h" -#include "id3tag.h" -#include "lame_global_flags.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/*********************************************************************** -* -* Global Definitions -* -***********************************************************************/ - -#ifndef FALSE -#define FALSE 0 -#endif - -#ifndef TRUE -#define TRUE (!FALSE) -#endif - -#ifdef UINT_MAX -# define MAX_U_32_NUM UINT_MAX -#else -# define MAX_U_32_NUM 0xFFFFFFFF -#endif - -#ifndef PI -# ifdef M_PI -# define PI M_PI -# else -# define PI 3.14159265358979323846 -# endif -#endif - - -#ifdef M_LN2 -# define LOG2 M_LN2 -#else -# define LOG2 0.69314718055994530942 -#endif - -#ifdef M_LN10 -# define LOG10 M_LN10 -#else -# define LOG10 2.30258509299404568402 -#endif - - -#ifdef M_SQRT2 -# define SQRT2 M_SQRT2 -#else -# define SQRT2 1.41421356237309504880 -#endif - - -#define CRC16_POLYNOMIAL 0x8005 - -#define MAX_BITS_PER_CHANNEL 4095 -#define MAX_BITS_PER_GRANULE 7680 - -/* "bit_stream.h" Definitions */ -#define BUFFER_SIZE LAME_MAXMP3BUFFER - -#define Min(A, B) ((A) < (B) ? (A) : (B)) -#define Max(A, B) ((A) > (B) ? (A) : (B)) - -/* log/log10 approximations */ -#ifdef USE_FAST_LOG -#define FAST_LOG10(x) (fast_log2(x)*(LOG2/LOG10)) -#define FAST_LOG(x) (fast_log2(x)*LOG2) -#define FAST_LOG10_X(x,y) (fast_log2(x)*(LOG2/LOG10*(y))) -#define FAST_LOG_X(x,y) (fast_log2(x)*(LOG2*(y))) -#else -#define FAST_LOG10(x) log10(x) -#define FAST_LOG(x) log(x) -#define FAST_LOG10_X(x,y) (log10(x)*(y)) -#define FAST_LOG_X(x,y) (log(x)*(y)) -#endif - - - struct replaygain_data; -#ifndef replaygain_data_defined -#define replaygain_data_defined - typedef struct replaygain_data replaygain_t; -#endif - struct plotting_data; -#ifndef plotting_data_defined -#define plotting_data_defined - typedef struct plotting_data plotting_data; -#endif - -/*********************************************************************** -* -* Global Type Definitions -* -***********************************************************************/ - - typedef struct { - void *aligned; /* pointer to ie. 128 bit aligned memory */ - void *pointer; /* to use with malloc/free */ - } aligned_pointer_t; - - void calloc_aligned(aligned_pointer_t * ptr, unsigned int size, unsigned int bytes); - void free_aligned(aligned_pointer_t * ptr); - - - /* "bit_stream.h" Type Definitions */ - - typedef struct bit_stream_struc { - unsigned char *buf; /* bit stream buffer */ - int buf_size; /* size of buffer (in number of bytes) */ - int totbit; /* bit counter of bit stream */ - int buf_byte_idx; /* pointer to top byte in buffer */ - int buf_bit_idx; /* pointer to top bit of top byte in buffer */ - - /* format of file in rd mode (BINARY/ASCII) */ - } Bit_stream_struc; - - - - typedef struct { - int sum; /* what we have seen so far */ - int seen; /* how many frames we have seen in this chunk */ - int want; /* how many frames we want to collect into one chunk */ - int pos; /* actual position in our bag */ - int size; /* size of our bag */ - int *bag; /* pointer to our bag */ - unsigned int nVbrNumFrames; - unsigned long nBytesWritten; - /* VBR tag data */ - unsigned int TotalFrameSize; - } VBR_seek_info_t; - - - /** - * ATH related stuff, if something new ATH related has to be added, - * please plugg it here into the ATH_t struct - */ - typedef struct { - int use_adjust; /* method for the auto adjustment */ - FLOAT aa_sensitivity_p; /* factor for tuning the (sample power) - point below which adaptive threshold - of hearing adjustment occurs */ - FLOAT adjust_factor; /* lowering based on peak volume, 1 = no lowering */ - FLOAT adjust_limit; /* limit for dynamic ATH adjust */ - FLOAT decay; /* determined to lower x dB each second */ - FLOAT floor; /* lowest ATH value */ - FLOAT l[SBMAX_l]; /* ATH for sfbs in long blocks */ - FLOAT s[SBMAX_s]; /* ATH for sfbs in short blocks */ - FLOAT psfb21[PSFB21]; /* ATH for partitionned sfb21 in long blocks */ - FLOAT psfb12[PSFB12]; /* ATH for partitionned sfb12 in short blocks */ - FLOAT cb_l[CBANDS]; /* ATH for long block convolution bands */ - FLOAT cb_s[CBANDS]; /* ATH for short block convolution bands */ - FLOAT eql_w[BLKSIZE / 2]; /* equal loudness weights (based on ATH) */ - } ATH_t; - - /** - * PSY Model related stuff - */ - - typedef struct { - FLOAT masking_lower[CBANDS]; - FLOAT minval[CBANDS]; - FLOAT rnumlines[CBANDS]; - FLOAT mld_cb[CBANDS]; - FLOAT mld[Max(SBMAX_l,SBMAX_s)]; - FLOAT bo_weight[Max(SBMAX_l,SBMAX_s)]; /* band weight long scalefactor bands, at transition */ - FLOAT attack_threshold; /* short block tuning */ - int s3ind[CBANDS][2]; - int numlines[CBANDS]; - int bm[Max(SBMAX_l,SBMAX_s)]; - int bo[Max(SBMAX_l,SBMAX_s)]; - int npart; - int n_sb; /* SBMAX_l or SBMAX_s */ - FLOAT *s3; - } PsyConst_CB2SB_t; - - - /** - * global data constants - */ - typedef struct { - FLOAT window[BLKSIZE], window_s[BLKSIZE_s / 2]; - PsyConst_CB2SB_t l; - PsyConst_CB2SB_t s; - PsyConst_CB2SB_t l_to_s; - FLOAT attack_threshold[4]; - FLOAT decay; - int force_short_block_calc; - } PsyConst_t; - - - typedef struct { - - FLOAT nb_l1[4][CBANDS], nb_l2[4][CBANDS]; - FLOAT nb_s1[4][CBANDS], nb_s2[4][CBANDS]; - - III_psy_xmin thm[4]; - III_psy_xmin en[4]; - - /* loudness calculation (for adaptive threshold of hearing) */ - FLOAT loudness_sq_save[2]; /* account for granule delay of L3psycho_anal */ - - FLOAT tot_ener[4]; - - FLOAT last_en_subshort[4][9]; - int last_attacks[4]; - - int blocktype_old[2]; - } PsyStateVar_t; - - - typedef struct { - /* loudness calculation (for adaptive threshold of hearing) */ - FLOAT loudness_sq[2][2]; /* loudness^2 approx. per granule and channel */ - } PsyResult_t; - - - /* variables used by encoder.c */ - typedef struct { - /* variables for newmdct.c */ - FLOAT sb_sample[2][2][18][SBLIMIT]; - FLOAT amp_filter[32]; - - /* variables used by util.c */ - /* BPC = maximum number of filter convolution windows to precompute */ -#define BPC 320 - double itime[2]; /* float precision seems to be not enough */ - sample_t *inbuf_old[2]; - sample_t *blackfilt[2 * BPC + 1]; - - FLOAT pefirbuf[19]; - - /* used for padding */ - int frac_SpF; - int slot_lag; - - /* variables for bitstream.c */ - /* mpeg1: buffer=511 bytes smallest frame: 96-38(sideinfo)=58 - * max number of frames in reservoir: 8 - * mpeg2: buffer=255 bytes. smallest frame: 24-23bytes=1 - * with VBR, if you are encoding all silence, it is possible to - * have 8kbs/24khz frames with 1byte of data each, which means we need - * to buffer up to 255 headers! */ - /* also, max_header_buf has to be a power of two */ -#define MAX_HEADER_BUF 256 -#define MAX_HEADER_LEN 40 /* max size of header is 38 */ - struct { - int write_timing; - int ptr; - char buf[MAX_HEADER_LEN]; - } header[MAX_HEADER_BUF]; - - int h_ptr; - int w_ptr; - int ancillary_flag; - - /* variables for reservoir.c */ - int ResvSize; /* in bits */ - int ResvMax; /* in bits */ - - int in_buffer_nsamples; - sample_t *in_buffer_0; - sample_t *in_buffer_1; - -#ifndef MFSIZE -# define MFSIZE ( 3*1152 + ENCDELAY - MDCTDELAY ) -#endif - sample_t mfbuf[2][MFSIZE]; - - int mf_samples_to_encode; - int mf_size; - - } EncStateVar_t; - - - typedef struct { - /* simple statistics */ - int bitrate_channelmode_hist[16][4 + 1]; - int bitrate_blocktype_hist[16][4 + 1 + 1]; /*norm/start/short/stop/mixed(short)/sum */ - - int bitrate_index; - int frame_number; /* number of frames encoded */ - int padding; /* padding for the current frame? */ - int mode_ext; - int encoder_delay; - int encoder_padding; /* number of samples of padding appended to input */ - } EncResult_t; - - - /* variables used by quantize.c */ - typedef struct { - /* variables for nspsytune */ - FLOAT longfact[SBMAX_l]; - FLOAT shortfact[SBMAX_s]; - FLOAT masking_lower; - FLOAT mask_adjust; /* the dbQ stuff */ - FLOAT mask_adjust_short; /* the dbQ stuff */ - int OldValue[2]; - int CurrentStep[2]; - int pseudohalf[SFBMAX]; - int sfb21_extra; /* will be set in lame_init_params */ - int substep_shaping; /* 0 = no substep - 1 = use substep shaping at last step(VBR only) - (not implemented yet) - 2 = use substep inside loop - 3 = use substep inside loop and last step - */ - - - char bv_scf[576]; - } QntStateVar_t; - - - typedef struct { - replaygain_t *rgdata; - /* ReplayGain */ - } RpgStateVar_t; - - - typedef struct { - FLOAT noclipScale; /* user-specified scale factor required for preventing clipping */ - sample_t PeakSample; - int RadioGain; - int noclipGainChange; /* gain change required for preventing clipping */ - } RpgResult_t; - - - typedef struct { - int version; /* 0=MPEG-2/2.5 1=MPEG-1 */ - int samplerate_index; - int sideinfo_len; - - int noise_shaping; /* 0 = none - 1 = ISO AAC model - 2 = allow scalefac_select=1 - */ - - int subblock_gain; /* 0 = no, 1 = yes */ - int use_best_huffman; /* 0 = no. 1=outside loop 2=inside loop(slow) */ - int noise_shaping_amp; /* 0 = ISO model: amplify all distorted bands - 1 = amplify within 50% of max (on db scale) - 2 = amplify only most distorted band - 3 = method 1 and refine with method 2 - */ - - int noise_shaping_stop; /* 0 = stop at over=0, all scalefacs amplified or - a scalefac has reached max value - 1 = stop when all scalefacs amplified or - a scalefac has reached max value - 2 = stop when all scalefacs amplified - */ - - - int full_outer_loop; /* 0 = stop early after 0 distortion found. 1 = full search */ - - int lowpassfreq; - int highpassfreq; - int samplerate_in; /* input_samp_rate in Hz. default=44.1 kHz */ - int samplerate_out; /* output_samp_rate. */ - int channels_in; /* number of channels in the input data stream (PCM or decoded PCM) */ - int channels_out; /* number of channels in the output data stream (not used for decoding) */ - int mode_gr; /* granules per frame */ - int force_ms; /* force M/S mode. requires mode=1 */ - - int quant_comp; - int quant_comp_short; - - int use_temporal_masking_effect; - int use_safe_joint_stereo; - - int preset; - - vbr_mode vbr; - int vbr_avg_bitrate_kbps; - int vbr_min_bitrate_index; /* min bitrate index */ - int vbr_max_bitrate_index; /* max bitrate index */ - int avg_bitrate; - int enforce_min_bitrate; /* strictly enforce VBR_min_bitrate normaly, it will be violated for analog silence */ - - int findReplayGain; /* find the RG value? default=0 */ - int findPeakSample; - int decode_on_the_fly; /* decode on the fly? default=0 */ - int analysis; - int disable_reservoir; - int buffer_constraint; /* enforce ISO spec as much as possible */ - int free_format; - int write_lame_tag; /* add Xing VBR tag? */ - - int error_protection; /* use 2 bytes per frame for a CRC checksum. default=0 */ - int copyright; /* mark as copyright. default=0 */ - int original; /* mark as original. default=1 */ - int extension; /* the MP3 'private extension' bit. Meaningless */ - int emphasis; /* Input PCM is emphased PCM (for - instance from one of the rarely - emphased CDs), it is STRONGLY not - recommended to use this, because - psycho does not take it into account, - and last but not least many decoders - don't care about these bits */ - - - MPEG_mode mode; - short_block_t short_blocks; - - float interChRatio; - float msfix; /* Naoki's adjustment of Mid/Side maskings */ - float ATH_offset_db;/* add to ATH this many db */ - float ATH_offset_factor;/* change ATH by this factor, derived from ATH_offset_db */ - float ATHcurve; /* change ATH formula 4 shape */ - int ATHtype; - int ATHonly; /* only use ATH */ - int ATHshort; /* only use ATH for short blocks */ - int noATH; /* disable ATH */ - - float ATHfixpoint; - - float adjust_alto_db; - float adjust_bass_db; - float adjust_treble_db; - float adjust_sfb21_db; - - float compression_ratio; /* sizeof(wav file)/sizeof(mp3 file) */ - - /* lowpass and highpass filter control */ - FLOAT lowpass1, lowpass2; /* normalized frequency bounds of passband */ - FLOAT highpass1, highpass2; /* normalized frequency bounds of passband */ - - /* scale input by this amount before encoding at least not used for MP3 decoding */ - FLOAT pcm_transform[2][2]; - - FLOAT minval; - } SessionConfig_t; - - - struct lame_internal_flags { - - /******************************************************************** - * internal variables NOT set by calling program, and should not be * - * modified by the calling program * - ********************************************************************/ - - /* - * Some remarks to the Class_ID field: - * The Class ID is an Identifier for a pointer to this struct. - * It is very unlikely that a pointer to lame_global_flags has the same 32 bits - * in it's structure (large and other special properties, for instance prime). - * - * To test that the structure is right and initialized, use: - * if ( gfc -> Class_ID == LAME_ID ) ... - * Other remark: - * If you set a flag to 0 for uninit data and 1 for init data, the right test - * should be "if (flag == 1)" and NOT "if (flag)". Unintended modification - * of this element will be otherwise misinterpreted as an init. - */ -# define LAME_ID 0xFFF88E3B - unsigned long class_id; - - int lame_init_params_successful; - int lame_encode_frame_init; - int iteration_init_init; - int fill_buffer_resample_init; - - SessionConfig_t cfg; - - /* variables used by lame.c */ - Bit_stream_struc bs; - III_side_info_t l3_side; - - scalefac_struct scalefac_band; - - PsyStateVar_t sv_psy; /* DATA FROM PSYMODEL.C */ - PsyResult_t ov_psy; - EncStateVar_t sv_enc; /* DATA FROM ENCODER.C */ - EncResult_t ov_enc; - QntStateVar_t sv_qnt; /* DATA FROM QUANTIZE.C */ - - RpgStateVar_t sv_rpg; - RpgResult_t ov_rpg; - - /* optional ID3 tags, used in id3tag.c */ - struct id3tag_spec tag_spec; - uint16_t nMusicCRC; - - uint16_t _unused; - - /* CPU features */ - struct { - unsigned int MMX:1; /* Pentium MMX, Pentium II...IV, K6, K6-2, - K6-III, Athlon */ - unsigned int AMD_3DNow:1; /* K6-2, K6-III, Athlon */ - unsigned int SSE:1; /* Pentium III, Pentium 4 */ - unsigned int SSE2:1; /* Pentium 4, K8 */ - unsigned int _unused:28; - } CPU_features; - - - VBR_seek_info_t VBR_seek_table; /* used for Xing VBR header */ - - ATH_t *ATH; /* all ATH related stuff */ - - PsyConst_t *cd_psy; - - /* used by the frame analyzer */ - plotting_data *pinfo; - hip_t hip; - - /* functions to replace with CPU feature optimized versions in takehiro.c */ - int (*choose_table) (const int *ix, const int *const end, int *const s); - void (*fft_fht) (FLOAT *, int); - void (*init_xrpow_core) (gr_info * const cod_info, FLOAT xrpow[576], int upper, - FLOAT * sum); - - lame_report_function report_msg; - lame_report_function report_dbg; - lame_report_function report_err; - }; - -#ifndef lame_internal_flags_defined -#define lame_internal_flags_defined - typedef struct lame_internal_flags lame_internal_flags; -#endif - - -/*********************************************************************** -* -* Global Function Prototype Declarations -* -***********************************************************************/ - void freegfc(lame_internal_flags * const gfc); - void free_id3tag(lame_internal_flags * const gfc); - extern int BitrateIndex(int, int, int); - extern int FindNearestBitrate(int, int, int); - extern int map2MP3Frequency(int freq); - extern int SmpFrqIndex(int, int *const); - extern int nearestBitrateFullIndex(uint16_t brate); - extern FLOAT ATHformula(SessionConfig_t const *cfg, FLOAT freq); - extern FLOAT freq2bark(FLOAT freq); - void disable_FPE(void); - -/* log/log10 approximations */ - extern void init_log_table(void); - extern extern float fast_log2(float x); - - int isResamplingNecessary(SessionConfig_t const* cfg); - - void fill_buffer(lame_internal_flags * gfc, - sample_t *const mfbuf[2], - sample_t const *const in_buffer[2], int nsamples, int *n_in, int *n_out); - -/* same as lame_decode1 (look in lame.h), but returns - unclipped raw floating-point samples. It is declared - here, not in lame.h, because it returns LAME's - internal type sample_t. No more than 1152 samples - per channel are allowed. */ - int hip_decode1_unclipped(hip_t hip, unsigned char *mp3buf, - size_t len, sample_t pcm_l[], sample_t pcm_r[]); - - - extern int has_MMX(void); - extern int has_3DNow(void); - extern int has_SSE(void); - extern int has_SSE2(void); - - - -/*********************************************************************** -* -* Macros about Message Printing and Exit -* -***********************************************************************/ - - extern void lame_report_def(const char* format, va_list args); - extern void lame_report_fnc(lame_report_function print_f, const char *, ...); - extern void lame_errorf(const lame_internal_flags * gfc, const char *, ...); - extern void lame_debugf(const lame_internal_flags * gfc, const char *, ...); - extern void lame_msgf(const lame_internal_flags * gfc, const char *, ...); -#define DEBUGF lame_debugf -#define ERRORF lame_errorf -#define MSGF lame_msgf - - int is_lame_internal_flags_valid(const lame_internal_flags * gfp); - - extern void hip_set_pinfo(hip_t hip, plotting_data* pinfo); - -#ifdef __cplusplus -} -#endif -#endif /* LAME_UTIL_H */ diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/vbrquantize.c b/recorderlib/src/main/jni/lame-3.100_libmp3lame/vbrquantize.c deleted file mode 100644 index 0f703b7..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/vbrquantize.c +++ /dev/null @@ -1,1580 +0,0 @@ -/* - * MP3 quantization - * - * Copyright (c) 1999-2000 Mark Taylor - * Copyright (c) 2000-2012 Robert Hegemann - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* $Id: vbrquantize.c,v 1.142 2012/02/07 13:36:35 robert Exp $ */ - -#ifdef HAVE_CONFIG_H -# include -#endif - - -#include "lame.h" -#include "machine.h" -#include "encoder.h" -#include "util.h" -#include "vbrquantize.h" -#include "quantize_pvt.h" - - - - -struct algo_s; -typedef struct algo_s algo_t; - -typedef void (*alloc_sf_f) (const algo_t *, const int *, const int *, int); -typedef uint8_t (*find_sf_f) (const FLOAT *, const FLOAT *, FLOAT, unsigned int, uint8_t); - -struct algo_s { - alloc_sf_f alloc; - find_sf_f find; - const FLOAT *xr34orig; - lame_internal_flags *gfc; - gr_info *cod_info; - int mingain_l; - int mingain_s[3]; -}; - - - -/* Remarks on optimizing compilers: - * - * the MSVC compiler may get into aliasing problems when accessing - * memory through the fi_union. declaring it volatile does the trick here - * - * the calc_sfb_noise_* functions are not inlined because the intel compiler - * optimized executeables won't work as expected anymore - */ - -#ifdef _MSC_VER -# if _MSC_VER < 1400 -# define VOLATILE volatile -# else -# define VOLATILE -# endif -#else -# define VOLATILE -#endif - -typedef VOLATILE union { - float f; - int i; -} fi_union; - - - -#ifdef TAKEHIRO_IEEE754_HACK -#define DOUBLEX double -#else -#define DOUBLEX FLOAT -#endif - -#define MAGIC_FLOAT_def (65536*(128)) -#define MAGIC_INT_def 0x4b000000 - -#ifdef TAKEHIRO_IEEE754_HACK -#else -/********************************************************************* - * XRPOW_FTOI is a macro to convert floats to ints. - * if XRPOW_FTOI(x) = nearest_int(x), then QUANTFAC(x)=adj43asm[x] - * ROUNDFAC= -0.0946 - * - * if XRPOW_FTOI(x) = floor(x), then QUANTFAC(x)=asj43[x] - * ROUNDFAC=0.4054 - *********************************************************************/ -# define QUANTFAC(rx) adj43[rx] -# define ROUNDFAC_def 0.4054f -# define XRPOW_FTOI(src,dest) ((dest) = (int)(src)) -#endif - -static int const MAGIC_INT = MAGIC_INT_def; -#ifndef TAKEHIRO_IEEE754_HACK -static DOUBLEX const ROUNDFAC = ROUNDFAC_def; -#endif -static DOUBLEX const MAGIC_FLOAT = MAGIC_FLOAT_def; - - -inline static float -vec_max_c(const float * xr34, unsigned int bw) -{ - float xfsf = 0; - unsigned int i = bw >> 2u; - unsigned int const remaining = (bw & 0x03u); - - while (i-- > 0) { - if (xfsf < xr34[0]) { - xfsf = xr34[0]; - } - if (xfsf < xr34[1]) { - xfsf = xr34[1]; - } - if (xfsf < xr34[2]) { - xfsf = xr34[2]; - } - if (xfsf < xr34[3]) { - xfsf = xr34[3]; - } - xr34 += 4; - } - switch( remaining ) { - case 3: if (xfsf < xr34[2]) xfsf = xr34[2]; - case 2: if (xfsf < xr34[1]) xfsf = xr34[1]; - case 1: if (xfsf < xr34[0]) xfsf = xr34[0]; - default: break; - } - return xfsf; -} - - -inline static uint8_t -find_lowest_scalefac(const FLOAT xr34) -{ - uint8_t sf_ok = 255; - uint8_t sf = 128, delsf = 64; - uint8_t i; - FLOAT const ixmax_val = IXMAX_VAL; - for (i = 0; i < 8; ++i) { - FLOAT const xfsf = ipow20[sf] * xr34; - if (xfsf <= ixmax_val) { - sf_ok = sf; - sf -= delsf; - } - else { - sf += delsf; - } - delsf >>= 1; - } - return sf_ok; -} - - -inline static void -k_34_4(DOUBLEX x[4], int l3[4]) -{ -#ifdef TAKEHIRO_IEEE754_HACK - fi_union fi[4]; - - assert(x[0] <= IXMAX_VAL && x[1] <= IXMAX_VAL && x[2] <= IXMAX_VAL && x[3] <= IXMAX_VAL); - x[0] += MAGIC_FLOAT; - fi[0].f = x[0]; - x[1] += MAGIC_FLOAT; - fi[1].f = x[1]; - x[2] += MAGIC_FLOAT; - fi[2].f = x[2]; - x[3] += MAGIC_FLOAT; - fi[3].f = x[3]; - fi[0].f = x[0] + adj43asm[fi[0].i - MAGIC_INT]; - fi[1].f = x[1] + adj43asm[fi[1].i - MAGIC_INT]; - fi[2].f = x[2] + adj43asm[fi[2].i - MAGIC_INT]; - fi[3].f = x[3] + adj43asm[fi[3].i - MAGIC_INT]; - l3[0] = fi[0].i - MAGIC_INT; - l3[1] = fi[1].i - MAGIC_INT; - l3[2] = fi[2].i - MAGIC_INT; - l3[3] = fi[3].i - MAGIC_INT; -#else - assert(x[0] <= IXMAX_VAL && x[1] <= IXMAX_VAL && x[2] <= IXMAX_VAL && x[3] <= IXMAX_VAL); - XRPOW_FTOI(x[0], l3[0]); - XRPOW_FTOI(x[1], l3[1]); - XRPOW_FTOI(x[2], l3[2]); - XRPOW_FTOI(x[3], l3[3]); - x[0] += QUANTFAC(l3[0]); - x[1] += QUANTFAC(l3[1]); - x[2] += QUANTFAC(l3[2]); - x[3] += QUANTFAC(l3[3]); - XRPOW_FTOI(x[0], l3[0]); - XRPOW_FTOI(x[1], l3[1]); - XRPOW_FTOI(x[2], l3[2]); - XRPOW_FTOI(x[3], l3[3]); -#endif -} - - - - - -/* do call the calc_sfb_noise_* functions only with sf values - * for which holds: sfpow34*xr34 <= IXMAX_VAL - */ - -static FLOAT -calc_sfb_noise_x34(const FLOAT * xr, const FLOAT * xr34, unsigned int bw, uint8_t sf) -{ - DOUBLEX x[4]; - int l3[4]; - const FLOAT sfpow = pow20[sf + Q_MAX2]; /*pow(2.0,sf/4.0); */ - const FLOAT sfpow34 = ipow20[sf]; /*pow(sfpow,-3.0/4.0); */ - - FLOAT xfsf = 0; - unsigned int i = bw >> 2u; - unsigned int const remaining = (bw & 0x03u); - - while (i-- > 0) { - x[0] = sfpow34 * xr34[0]; - x[1] = sfpow34 * xr34[1]; - x[2] = sfpow34 * xr34[2]; - x[3] = sfpow34 * xr34[3]; - - k_34_4(x, l3); - - x[0] = fabsf(xr[0]) - sfpow * pow43[l3[0]]; - x[1] = fabsf(xr[1]) - sfpow * pow43[l3[1]]; - x[2] = fabsf(xr[2]) - sfpow * pow43[l3[2]]; - x[3] = fabsf(xr[3]) - sfpow * pow43[l3[3]]; - xfsf += (x[0] * x[0] + x[1] * x[1]) + (x[2] * x[2] + x[3] * x[3]); - - xr += 4; - xr34 += 4; - } - if (remaining) { - x[0] = x[1] = x[2] = x[3] = 0; - switch( remaining ) { - case 3: x[2] = sfpow34 * xr34[2]; - case 2: x[1] = sfpow34 * xr34[1]; - case 1: x[0] = sfpow34 * xr34[0]; - } - - k_34_4(x, l3); - x[0] = x[1] = x[2] = x[3] = 0; - - switch( remaining ) { - case 3: x[2] = fabsf(xr[2]) - sfpow * pow43[l3[2]]; - case 2: x[1] = fabsf(xr[1]) - sfpow * pow43[l3[1]]; - case 1: x[0] = fabsf(xr[0]) - sfpow * pow43[l3[0]]; - } - xfsf += (x[0] * x[0] + x[1] * x[1]) + (x[2] * x[2] + x[3] * x[3]); - } - return xfsf; -} - - - -struct calc_noise_cache { - int valid; - FLOAT value; -}; - -typedef struct calc_noise_cache calc_noise_cache_t; - - -static uint8_t -tri_calc_sfb_noise_x34(const FLOAT * xr, const FLOAT * xr34, FLOAT l3_xmin, unsigned int bw, - uint8_t sf, calc_noise_cache_t * did_it) -{ - if (did_it[sf].valid == 0) { - did_it[sf].valid = 1; - did_it[sf].value = calc_sfb_noise_x34(xr, xr34, bw, sf); - } - if (l3_xmin < did_it[sf].value) { - return 1; - } - if (sf < 255) { - uint8_t const sf_x = sf + 1; - if (did_it[sf_x].valid == 0) { - did_it[sf_x].valid = 1; - did_it[sf_x].value = calc_sfb_noise_x34(xr, xr34, bw, sf_x); - } - if (l3_xmin < did_it[sf_x].value) { - return 1; - } - } - if (sf > 0) { - uint8_t const sf_x = sf - 1; - if (did_it[sf_x].valid == 0) { - did_it[sf_x].valid = 1; - did_it[sf_x].value = calc_sfb_noise_x34(xr, xr34, bw, sf_x); - } - if (l3_xmin < did_it[sf_x].value) { - return 1; - } - } - return 0; -} - - -/** - * Robert Hegemann 2001-05-01 - * calculates quantization step size determined by allowed masking - */ -static int -calc_scalefac(FLOAT l3_xmin, int bw) -{ - FLOAT const c = 5.799142446; /* 10 * 10^(2/3) * log10(4/3) */ - return 210 + (int) (c * log10f(l3_xmin / bw) - .5f); -} - -static uint8_t -guess_scalefac_x34(const FLOAT * xr, const FLOAT * xr34, FLOAT l3_xmin, unsigned int bw, uint8_t sf_min) -{ - int const guess = calc_scalefac(l3_xmin, bw); - if (guess < sf_min) return sf_min; - if (guess >= 255) return 255; - (void) xr; - (void) xr34; - return guess; -} - - -/* the find_scalefac* routines calculate - * a quantization step size which would - * introduce as much noise as is allowed. - * The larger the step size the more - * quantization noise we'll get. The - * scalefactors are there to lower the - * global step size, allowing limited - * differences in quantization step sizes - * per band (shaping the noise). - */ - -static uint8_t -find_scalefac_x34(const FLOAT * xr, const FLOAT * xr34, FLOAT l3_xmin, unsigned int bw, - uint8_t sf_min) -{ - calc_noise_cache_t did_it[256]; - uint8_t sf = 128, sf_ok = 255, delsf = 128, seen_good_one = 0, i; - memset(did_it, 0, sizeof(did_it)); - for (i = 0; i < 8; ++i) { - delsf >>= 1; - if (sf <= sf_min) { - sf += delsf; - } - else { - uint8_t const bad = tri_calc_sfb_noise_x34(xr, xr34, l3_xmin, bw, sf, did_it); - if (bad) { /* distortion. try a smaller scalefactor */ - sf -= delsf; - } - else { - sf_ok = sf; - sf += delsf; - seen_good_one = 1; - } - } - } - /* returning a scalefac without distortion, if possible - */ - if (seen_good_one > 0) { - sf = sf_ok; - } - if (sf <= sf_min) { - sf = sf_min; - } - return sf; -} - - - -/*********************************************************************** - * - * calc_short_block_vbr_sf() - * calc_long_block_vbr_sf() - * - * Mark Taylor 2000-??-?? - * Robert Hegemann 2000-10-25 made functions of it - * - ***********************************************************************/ - -/* a variation for vbr-mtrh */ -static int -block_sf(algo_t * that, const FLOAT l3_xmin[SFBMAX], int vbrsf[SFBMAX], int vbrsfmin[SFBMAX]) -{ - FLOAT max_xr34; - const FLOAT *const xr = &that->cod_info->xr[0]; - const FLOAT *const xr34_orig = &that->xr34orig[0]; - const int *const width = &that->cod_info->width[0]; - const char *const energy_above_cutoff = &that->cod_info->energy_above_cutoff[0]; - unsigned int const max_nonzero_coeff = (unsigned int) that->cod_info->max_nonzero_coeff; - uint8_t maxsf = 0; - int sfb = 0, m_o = -1; - unsigned int j = 0, i = 0; - int const psymax = that->cod_info->psymax; - - assert(that->cod_info->max_nonzero_coeff >= 0); - - that->mingain_l = 0; - that->mingain_s[0] = 0; - that->mingain_s[1] = 0; - that->mingain_s[2] = 0; - while (j <= max_nonzero_coeff) { - unsigned int const w = (unsigned int) width[sfb]; - unsigned int const m = (unsigned int) (max_nonzero_coeff - j + 1); - unsigned int l = w; - uint8_t m1, m2; - if (l > m) { - l = m; - } - max_xr34 = vec_max_c(&xr34_orig[j], l); - - m1 = find_lowest_scalefac(max_xr34); - vbrsfmin[sfb] = m1; - if (that->mingain_l < m1) { - that->mingain_l = m1; - } - if (that->mingain_s[i] < m1) { - that->mingain_s[i] = m1; - } - if (++i > 2) { - i = 0; - } - if (sfb < psymax && w > 2) { /* mpeg2.5 at 8 kHz doesn't use all scalefactors, unused have width 2 */ - if (energy_above_cutoff[sfb]) { - m2 = that->find(&xr[j], &xr34_orig[j], l3_xmin[sfb], l, m1); -#if 0 - if (0) { - /** Robert Hegemann 2007-09-29: - * It seems here is some more potential for speed improvements. - * Current find method does 11-18 quantization calculations. - * Using a "good guess" may help to reduce this amount. - */ - uint8_t guess = calc_scalefac(l3_xmin[sfb], l); - DEBUGF(that->gfc, "sfb=%3d guess=%3d found=%3d diff=%3d\n", sfb, guess, m2, - m2 - guess); - } -#endif - if (maxsf < m2) { - maxsf = m2; - } - if (m_o < m2 && m2 < 255) { - m_o = m2; - } - } - else { - m2 = 255; - maxsf = 255; - } - } - else { - if (maxsf < m1) { - maxsf = m1; - } - m2 = maxsf; - } - vbrsf[sfb] = m2; - ++sfb; - j += w; - } - for (; sfb < SFBMAX; ++sfb) { - vbrsf[sfb] = maxsf; - vbrsfmin[sfb] = 0; - } - if (m_o > -1) { - maxsf = m_o; - for (sfb = 0; sfb < SFBMAX; ++sfb) { - if (vbrsf[sfb] == 255) { - vbrsf[sfb] = m_o; - } - } - } - return maxsf; -} - - - -/*********************************************************************** - * - * quantize xr34 based on scalefactors - * - * block_xr34 - * - * Mark Taylor 2000-??-?? - * Robert Hegemann 2000-10-20 made functions of them - * - ***********************************************************************/ - -static void -quantize_x34(const algo_t * that) -{ - DOUBLEX x[4]; - const FLOAT *xr34_orig = that->xr34orig; - gr_info *const cod_info = that->cod_info; - int const ifqstep = (cod_info->scalefac_scale == 0) ? 2 : 4; - int *l3 = cod_info->l3_enc; - unsigned int j = 0, sfb = 0; - unsigned int const max_nonzero_coeff = (unsigned int) cod_info->max_nonzero_coeff; - - assert(cod_info->max_nonzero_coeff >= 0); - assert(cod_info->max_nonzero_coeff < 576); - - while (j <= max_nonzero_coeff) { - int const s = - (cod_info->scalefac[sfb] + (cod_info->preflag ? pretab[sfb] : 0)) * ifqstep - + cod_info->subblock_gain[cod_info->window[sfb]] * 8; - uint8_t const sfac = (uint8_t) (cod_info->global_gain - s); - FLOAT const sfpow34 = ipow20[sfac]; - unsigned int const w = (unsigned int) cod_info->width[sfb]; - unsigned int const m = (unsigned int) (max_nonzero_coeff - j + 1); - unsigned int i, remaining; - - assert((cod_info->global_gain - s) >= 0); - assert(cod_info->width[sfb] >= 0); - j += w; - ++sfb; - - i = (w <= m) ? w : m; - remaining = (i & 0x03u); - i >>= 2u; - - while (i-- > 0) { - x[0] = sfpow34 * xr34_orig[0]; - x[1] = sfpow34 * xr34_orig[1]; - x[2] = sfpow34 * xr34_orig[2]; - x[3] = sfpow34 * xr34_orig[3]; - - k_34_4(x, l3); - - l3 += 4; - xr34_orig += 4; - } - if (remaining) { - int tmp_l3[4]; - x[0] = x[1] = x[2] = x[3] = 0; - switch( remaining ) { - case 3: x[2] = sfpow34 * xr34_orig[2]; - case 2: x[1] = sfpow34 * xr34_orig[1]; - case 1: x[0] = sfpow34 * xr34_orig[0]; - } - - k_34_4(x, tmp_l3); - - switch( remaining ) { - case 3: l3[2] = tmp_l3[2]; - case 2: l3[1] = tmp_l3[1]; - case 1: l3[0] = tmp_l3[0]; - } - - l3 += remaining; - xr34_orig += remaining; - } - } -} - - - -static const uint8_t max_range_short[SBMAX_s * 3] = { - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 0, 0, 0 -}; - -static const uint8_t max_range_long[SBMAX_l] = { - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0 -}; - -static const uint8_t max_range_long_lsf_pretab[SBMAX_l] = { - 7, 7, 7, 7, 7, 7, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; - - - -/* - sfb=0..5 scalefac < 16 - sfb>5 scalefac < 8 - - ifqstep = ( cod_info->scalefac_scale == 0 ) ? 2 : 4; - ol_sf = (cod_info->global_gain-210.0); - ol_sf -= 8*cod_info->subblock_gain[i]; - ol_sf -= ifqstep*scalefac[gr][ch].s[sfb][i]; -*/ - -static void -set_subblock_gain(gr_info * cod_info, const int mingain_s[3], int sf[]) -{ - const int maxrange1 = 15, maxrange2 = 7; - const int ifqstepShift = (cod_info->scalefac_scale == 0) ? 1 : 2; - int *const sbg = cod_info->subblock_gain; - unsigned int const psymax = (unsigned int) cod_info->psymax; - unsigned int psydiv = 18; - int sbg0, sbg1, sbg2; - unsigned int sfb, i; - int min_sbg = 7; - - if (psydiv > psymax) { - psydiv = psymax; - } - for (i = 0; i < 3; ++i) { - int maxsf1 = 0, maxsf2 = 0, minsf = 1000; - /* see if we should use subblock gain */ - for (sfb = i; sfb < psydiv; sfb += 3) { /* part 1 */ - int const v = -sf[sfb]; - if (maxsf1 < v) { - maxsf1 = v; - } - if (minsf > v) { - minsf = v; - } - } - for (; sfb < SFBMAX; sfb += 3) { /* part 2 */ - int const v = -sf[sfb]; - if (maxsf2 < v) { - maxsf2 = v; - } - if (minsf > v) { - minsf = v; - } - } - - /* boost subblock gain as little as possible so we can - * reach maxsf1 with scalefactors - * 8*sbg >= maxsf1 - */ - { - int const m1 = maxsf1 - (maxrange1 << ifqstepShift); - int const m2 = maxsf2 - (maxrange2 << ifqstepShift); - - maxsf1 = Max(m1, m2); - } - if (minsf > 0) { - sbg[i] = minsf >> 3; - } - else { - sbg[i] = 0; - } - if (maxsf1 > 0) { - int const m1 = sbg[i]; - int const m2 = (maxsf1 + 7) >> 3; - sbg[i] = Max(m1, m2); - } - if (sbg[i] > 0 && mingain_s[i] > (cod_info->global_gain - sbg[i] * 8)) { - sbg[i] = (cod_info->global_gain - mingain_s[i]) >> 3; - } - if (sbg[i] > 7) { - sbg[i] = 7; - } - if (min_sbg > sbg[i]) { - min_sbg = sbg[i]; - } - } - sbg0 = sbg[0] * 8; - sbg1 = sbg[1] * 8; - sbg2 = sbg[2] * 8; - for (sfb = 0; sfb < SFBMAX; sfb += 3) { - sf[sfb + 0] += sbg0; - sf[sfb + 1] += sbg1; - sf[sfb + 2] += sbg2; - } - if (min_sbg > 0) { - for (i = 0; i < 3; ++i) { - sbg[i] -= min_sbg; - } - cod_info->global_gain -= min_sbg * 8; - } -} - - - -/* - ifqstep = ( cod_info->scalefac_scale == 0 ) ? 2 : 4; - ol_sf = (cod_info->global_gain-210.0); - ol_sf -= ifqstep*scalefac[gr][ch].l[sfb]; - if (cod_info->preflag && sfb>=11) - ol_sf -= ifqstep*pretab[sfb]; -*/ -static void -set_scalefacs(gr_info * cod_info, const int *vbrsfmin, int sf[], const uint8_t * max_range) -{ - const int ifqstep = (cod_info->scalefac_scale == 0) ? 2 : 4; - const int ifqstepShift = (cod_info->scalefac_scale == 0) ? 1 : 2; - int *const scalefac = cod_info->scalefac; - int const sfbmax = cod_info->sfbmax; - int sfb; - int const *const sbg = cod_info->subblock_gain; - int const *const window = cod_info->window; - int const preflag = cod_info->preflag; - - if (preflag) { - for (sfb = 11; sfb < sfbmax; ++sfb) { - sf[sfb] += pretab[sfb] * ifqstep; - } - } - for (sfb = 0; sfb < sfbmax; ++sfb) { - int const gain = cod_info->global_gain - (sbg[window[sfb]] * 8) - - ((preflag ? pretab[sfb] : 0) * ifqstep); - - if (sf[sfb] < 0) { - int const m = gain - vbrsfmin[sfb]; - /* ifqstep*scalefac >= -sf[sfb], so round UP */ - scalefac[sfb] = (ifqstep - 1 - sf[sfb]) >> ifqstepShift; - - if (scalefac[sfb] > max_range[sfb]) { - scalefac[sfb] = max_range[sfb]; - } - if (scalefac[sfb] > 0 && (scalefac[sfb] << ifqstepShift) > m) { - scalefac[sfb] = m >> ifqstepShift; - } - } - else { - scalefac[sfb] = 0; - } - } - for (; sfb < SFBMAX; ++sfb) { - scalefac[sfb] = 0; /* sfb21 */ - } -} - - -#ifndef NDEBUG -static int -checkScalefactor(const gr_info * cod_info, const int vbrsfmin[SFBMAX]) -{ - int const ifqstep = cod_info->scalefac_scale == 0 ? 2 : 4; - int sfb; - for (sfb = 0; sfb < cod_info->psymax; ++sfb) { - const int s = - ((cod_info->scalefac[sfb] + - (cod_info->preflag ? pretab[sfb] : 0)) * ifqstep) + - cod_info->subblock_gain[cod_info->window[sfb]] * 8; - - if ((cod_info->global_gain - s) < vbrsfmin[sfb]) { - /* - fprintf( stdout, "sf %d\n", sfb ); - fprintf( stdout, "min %d\n", vbrsfmin[sfb] ); - fprintf( stdout, "ggain %d\n", cod_info->global_gain ); - fprintf( stdout, "scalefac %d\n", cod_info->scalefac[sfb] ); - fprintf( stdout, "pretab %d\n", (cod_info->preflag ? pretab[sfb] : 0) ); - fprintf( stdout, "scale %d\n", (cod_info->scalefac_scale + 1) ); - fprintf( stdout, "subgain %d\n", cod_info->subblock_gain[cod_info->window[sfb]] * 8 ); - fflush( stdout ); - exit(-1); - */ - return 0; - } - } - return 1; -} -#endif - - -/****************************************************************** - * - * short block scalefacs - * - ******************************************************************/ - -static void -short_block_constrain(const algo_t * that, const int vbrsf[SFBMAX], - const int vbrsfmin[SFBMAX], int vbrmax) -{ - gr_info *const cod_info = that->cod_info; - lame_internal_flags const *const gfc = that->gfc; - SessionConfig_t const *const cfg = &gfc->cfg; - int const maxminsfb = that->mingain_l; - int mover, maxover0 = 0, maxover1 = 0, delta = 0; - int v, v0, v1; - int sfb; - int const psymax = cod_info->psymax; - - for (sfb = 0; sfb < psymax; ++sfb) { - assert(vbrsf[sfb] >= vbrsfmin[sfb]); - v = vbrmax - vbrsf[sfb]; - if (delta < v) { - delta = v; - } - v0 = v - (4 * 14 + 2 * max_range_short[sfb]); - v1 = v - (4 * 14 + 4 * max_range_short[sfb]); - if (maxover0 < v0) { - maxover0 = v0; - } - if (maxover1 < v1) { - maxover1 = v1; - } - } - if (cfg->noise_shaping == 2) { - /* allow scalefac_scale=1 */ - mover = Min(maxover0, maxover1); - } - else { - mover = maxover0; - } - if (delta > mover) { - delta = mover; - } - vbrmax -= delta; - maxover0 -= mover; - maxover1 -= mover; - - if (maxover0 == 0) { - cod_info->scalefac_scale = 0; - } - else if (maxover1 == 0) { - cod_info->scalefac_scale = 1; - } - if (vbrmax < maxminsfb) { - vbrmax = maxminsfb; - } - cod_info->global_gain = vbrmax; - - if (cod_info->global_gain < 0) { - cod_info->global_gain = 0; - } - else if (cod_info->global_gain > 255) { - cod_info->global_gain = 255; - } - { - int sf_temp[SFBMAX]; - for (sfb = 0; sfb < SFBMAX; ++sfb) { - sf_temp[sfb] = vbrsf[sfb] - vbrmax; - } - set_subblock_gain(cod_info, &that->mingain_s[0], sf_temp); - set_scalefacs(cod_info, vbrsfmin, sf_temp, max_range_short); - } - assert(checkScalefactor(cod_info, vbrsfmin)); -} - - - -/****************************************************************** - * - * long block scalefacs - * - ******************************************************************/ - -static void -long_block_constrain(const algo_t * that, const int vbrsf[SFBMAX], const int vbrsfmin[SFBMAX], - int vbrmax) -{ - gr_info *const cod_info = that->cod_info; - lame_internal_flags const *const gfc = that->gfc; - SessionConfig_t const *const cfg = &gfc->cfg; - uint8_t const *max_rangep; - int const maxminsfb = that->mingain_l; - int sfb; - int maxover0, maxover1, maxover0p, maxover1p, mover, delta = 0; - int v, v0, v1, v0p, v1p, vm0p = 1, vm1p = 1; - int const psymax = cod_info->psymax; - - max_rangep = cfg->mode_gr == 2 ? max_range_long : max_range_long_lsf_pretab; - - maxover0 = 0; - maxover1 = 0; - maxover0p = 0; /* pretab */ - maxover1p = 0; /* pretab */ - - for (sfb = 0; sfb < psymax; ++sfb) { - assert(vbrsf[sfb] >= vbrsfmin[sfb]); - v = vbrmax - vbrsf[sfb]; - if (delta < v) { - delta = v; - } - v0 = v - 2 * max_range_long[sfb]; - v1 = v - 4 * max_range_long[sfb]; - v0p = v - 2 * (max_rangep[sfb] + pretab[sfb]); - v1p = v - 4 * (max_rangep[sfb] + pretab[sfb]); - if (maxover0 < v0) { - maxover0 = v0; - } - if (maxover1 < v1) { - maxover1 = v1; - } - if (maxover0p < v0p) { - maxover0p = v0p; - } - if (maxover1p < v1p) { - maxover1p = v1p; - } - } - if (vm0p == 1) { - int gain = vbrmax - maxover0p; - if (gain < maxminsfb) { - gain = maxminsfb; - } - for (sfb = 0; sfb < psymax; ++sfb) { - int const a = (gain - vbrsfmin[sfb]) - 2 * pretab[sfb]; - if (a <= 0) { - vm0p = 0; - vm1p = 0; - break; - } - } - } - if (vm1p == 1) { - int gain = vbrmax - maxover1p; - if (gain < maxminsfb) { - gain = maxminsfb; - } - for (sfb = 0; sfb < psymax; ++sfb) { - int const b = (gain - vbrsfmin[sfb]) - 4 * pretab[sfb]; - if (b <= 0) { - vm1p = 0; - break; - } - } - } - if (vm0p == 0) { - maxover0p = maxover0; - } - if (vm1p == 0) { - maxover1p = maxover1; - } - if (cfg->noise_shaping != 2) { - maxover1 = maxover0; - maxover1p = maxover0p; - } - mover = Min(maxover0, maxover0p); - mover = Min(mover, maxover1); - mover = Min(mover, maxover1p); - - if (delta > mover) { - delta = mover; - } - vbrmax -= delta; - if (vbrmax < maxminsfb) { - vbrmax = maxminsfb; - } - maxover0 -= mover; - maxover0p -= mover; - maxover1 -= mover; - maxover1p -= mover; - - if (maxover0 == 0) { - cod_info->scalefac_scale = 0; - cod_info->preflag = 0; - max_rangep = max_range_long; - } - else if (maxover0p == 0) { - cod_info->scalefac_scale = 0; - cod_info->preflag = 1; - } - else if (maxover1 == 0) { - cod_info->scalefac_scale = 1; - cod_info->preflag = 0; - max_rangep = max_range_long; - } - else if (maxover1p == 0) { - cod_info->scalefac_scale = 1; - cod_info->preflag = 1; - } - else { - assert(0); /* this should not happen */ - } - cod_info->global_gain = vbrmax; - if (cod_info->global_gain < 0) { - cod_info->global_gain = 0; - } - else if (cod_info->global_gain > 255) { - cod_info->global_gain = 255; - } - { - int sf_temp[SFBMAX]; - for (sfb = 0; sfb < SFBMAX; ++sfb) { - sf_temp[sfb] = vbrsf[sfb] - vbrmax; - } - set_scalefacs(cod_info, vbrsfmin, sf_temp, max_rangep); - } - assert(checkScalefactor(cod_info, vbrsfmin)); -} - - - -static void -bitcount(const algo_t * that) -{ - int rc = scale_bitcount(that->gfc, that->cod_info); - - if (rc == 0) { - return; - } - /* this should not happen due to the way the scalefactors are selected */ - ERRORF(that->gfc, "INTERNAL ERROR IN VBR NEW CODE (986), please send bug report\n"); - exit(-1); -} - - - -static int -quantizeAndCountBits(const algo_t * that) -{ - quantize_x34(that); - that->cod_info->part2_3_length = noquant_count_bits(that->gfc, that->cod_info, 0); - return that->cod_info->part2_3_length; -} - - - - - -static int -tryGlobalStepsize(const algo_t * that, const int sfwork[SFBMAX], - const int vbrsfmin[SFBMAX], int delta) -{ - FLOAT const xrpow_max = that->cod_info->xrpow_max; - int sftemp[SFBMAX], i, nbits; - int gain, vbrmax = 0; - for (i = 0; i < SFBMAX; ++i) { - gain = sfwork[i] + delta; - if (gain < vbrsfmin[i]) { - gain = vbrsfmin[i]; - } - if (gain > 255) { - gain = 255; - } - if (vbrmax < gain) { - vbrmax = gain; - } - sftemp[i] = gain; - } - that->alloc(that, sftemp, vbrsfmin, vbrmax); - bitcount(that); - nbits = quantizeAndCountBits(that); - that->cod_info->xrpow_max = xrpow_max; - return nbits; -} - - - -static void -searchGlobalStepsizeMax(const algo_t * that, const int sfwork[SFBMAX], - const int vbrsfmin[SFBMAX], int target) -{ - gr_info const *const cod_info = that->cod_info; - const int gain = cod_info->global_gain; - int curr = gain; - int gain_ok = 1024; - int nbits = LARGE_BITS; - int l = gain, r = 512; - - assert(gain >= 0); - while (l <= r) { - curr = (l + r) >> 1; - nbits = tryGlobalStepsize(that, sfwork, vbrsfmin, curr - gain); - if (nbits == 0 || (nbits + cod_info->part2_length) < target) { - r = curr - 1; - gain_ok = curr; - } - else { - l = curr + 1; - if (gain_ok == 1024) { - gain_ok = curr; - } - } - } - if (gain_ok != curr) { - curr = gain_ok; - nbits = tryGlobalStepsize(that, sfwork, vbrsfmin, curr - gain); - } -} - - - -static int -sfDepth(const int sfwork[SFBMAX]) -{ - int m = 0; - unsigned int i, j; - for (j = SFBMAX, i = 0; j > 0; --j, ++i) { - int const di = 255 - sfwork[i]; - if (m < di) { - m = di; - } - assert(sfwork[i] >= 0); - assert(sfwork[i] <= 255); - } - assert(m >= 0); - assert(m <= 255); - return m; -} - - -static void -cutDistribution(const int sfwork[SFBMAX], int sf_out[SFBMAX], int cut) -{ - unsigned int i, j; - for (j = SFBMAX, i = 0; j > 0; --j, ++i) { - int const x = sfwork[i]; - sf_out[i] = x < cut ? x : cut; - } -} - - -static int -flattenDistribution(const int sfwork[SFBMAX], int sf_out[SFBMAX], int dm, int k, int p) -{ - unsigned int i, j; - int x, sfmax = 0; - if (dm > 0) { - for (j = SFBMAX, i = 0; j > 0; --j, ++i) { - int const di = p - sfwork[i]; - x = sfwork[i] + (k * di) / dm; - if (x < 0) { - x = 0; - } - else { - if (x > 255) { - x = 255; - } - } - sf_out[i] = x; - if (sfmax < x) { - sfmax = x; - } - } - } - else { - for (j = SFBMAX, i = 0; j > 0u; --j, ++i) { - x = sfwork[i]; - sf_out[i] = x; - if (sfmax < x) { - sfmax = x; - } - } - } - return sfmax; -} - - -static int -tryThatOne(algo_t const* that, const int sftemp[SFBMAX], const int vbrsfmin[SFBMAX], int vbrmax) -{ - FLOAT const xrpow_max = that->cod_info->xrpow_max; - int nbits = LARGE_BITS; - that->alloc(that, sftemp, vbrsfmin, vbrmax); - bitcount(that); - nbits = quantizeAndCountBits(that); - nbits += that->cod_info->part2_length; - that->cod_info->xrpow_max = xrpow_max; - return nbits; -} - - -static void -outOfBitsStrategy(algo_t const* that, const int sfwork[SFBMAX], const int vbrsfmin[SFBMAX], int target) -{ - int wrk[SFBMAX]; - int const dm = sfDepth(sfwork); - int const p = that->cod_info->global_gain; - int nbits; - - /* PART 1 */ - { - int bi = dm / 2; - int bi_ok = -1; - int bu = 0; - int bo = dm; - for (;;) { - int const sfmax = flattenDistribution(sfwork, wrk, dm, bi, p); - nbits = tryThatOne(that, wrk, vbrsfmin, sfmax); - if (nbits <= target) { - bi_ok = bi; - bo = bi - 1; - } - else { - bu = bi + 1; - } - if (bu <= bo) { - bi = (bu + bo) / 2; - } - else { - break; - } - } - if (bi_ok >= 0) { - if (bi != bi_ok) { - int const sfmax = flattenDistribution(sfwork, wrk, dm, bi_ok, p); - nbits = tryThatOne(that, wrk, vbrsfmin, sfmax); - } - return; - } - } - - /* PART 2: */ - { - int bi = (255 + p) / 2; - int bi_ok = -1; - int bu = p; - int bo = 255; - for (;;) { - int const sfmax = flattenDistribution(sfwork, wrk, dm, dm, bi); - nbits = tryThatOne(that, wrk, vbrsfmin, sfmax); - if (nbits <= target) { - bi_ok = bi; - bo = bi - 1; - } - else { - bu = bi + 1; - } - if (bu <= bo) { - bi = (bu + bo) / 2; - } - else { - break; - } - } - if (bi_ok >= 0) { - if (bi != bi_ok) { - int const sfmax = flattenDistribution(sfwork, wrk, dm, dm, bi_ok); - nbits = tryThatOne(that, wrk, vbrsfmin, sfmax); - } - return; - } - } - - /* fall back to old code, likely to be never called */ - searchGlobalStepsizeMax(that, wrk, vbrsfmin, target); -} - - -static int -reduce_bit_usage(lame_internal_flags * gfc, int gr, int ch -#if 0 - , const FLOAT xr34orig[576], const FLOAT l3_xmin[SFBMAX], int maxbits -#endif - ) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - gr_info *const cod_info = &gfc->l3_side.tt[gr][ch]; - /* try some better scalefac storage - */ - best_scalefac_store(gfc, gr, ch, &gfc->l3_side); - - /* best huffman_divide may save some bits too - */ - if (cfg->use_best_huffman == 1) - best_huffman_divide(gfc, cod_info); - return cod_info->part2_3_length + cod_info->part2_length; -} - - - - -int -VBR_encode_frame(lame_internal_flags * gfc, const FLOAT xr34orig[2][2][576], - const FLOAT l3_xmin[2][2][SFBMAX], const int max_bits[2][2]) -{ - SessionConfig_t const *const cfg = &gfc->cfg; - int sfwork_[2][2][SFBMAX]; - int vbrsfmin_[2][2][SFBMAX]; - algo_t that_[2][2]; - int const ngr = cfg->mode_gr; - int const nch = cfg->channels_out; - int max_nbits_ch[2][2] = {{0, 0}, {0 ,0}}; - int max_nbits_gr[2] = {0, 0}; - int max_nbits_fr = 0; - int use_nbits_ch[2][2] = {{MAX_BITS_PER_CHANNEL+1, MAX_BITS_PER_CHANNEL+1} - ,{MAX_BITS_PER_CHANNEL+1, MAX_BITS_PER_CHANNEL+1}}; - int use_nbits_gr[2] = { MAX_BITS_PER_GRANULE+1, MAX_BITS_PER_GRANULE+1 }; - int use_nbits_fr = MAX_BITS_PER_GRANULE+MAX_BITS_PER_GRANULE; - int gr, ch; - int ok, sum_fr; - - /* set up some encoding parameters - */ - for (gr = 0; gr < ngr; ++gr) { - max_nbits_gr[gr] = 0; - for (ch = 0; ch < nch; ++ch) { - max_nbits_ch[gr][ch] = max_bits[gr][ch]; - use_nbits_ch[gr][ch] = 0; - max_nbits_gr[gr] += max_bits[gr][ch]; - max_nbits_fr += max_bits[gr][ch]; - that_[gr][ch].find = (cfg->full_outer_loop < 0) ? guess_scalefac_x34 : find_scalefac_x34; - that_[gr][ch].gfc = gfc; - that_[gr][ch].cod_info = &gfc->l3_side.tt[gr][ch]; - that_[gr][ch].xr34orig = xr34orig[gr][ch]; - if (that_[gr][ch].cod_info->block_type == SHORT_TYPE) { - that_[gr][ch].alloc = short_block_constrain; - } - else { - that_[gr][ch].alloc = long_block_constrain; - } - } /* for ch */ - } - /* searches scalefactors - */ - for (gr = 0; gr < ngr; ++gr) { - for (ch = 0; ch < nch; ++ch) { - if (max_bits[gr][ch] > 0) { - algo_t *that = &that_[gr][ch]; - int *sfwork = sfwork_[gr][ch]; - int *vbrsfmin = vbrsfmin_[gr][ch]; - int vbrmax; - - vbrmax = block_sf(that, l3_xmin[gr][ch], sfwork, vbrsfmin); - that->alloc(that, sfwork, vbrsfmin, vbrmax); - bitcount(that); - } - else { - /* xr contains no energy - * l3_enc, our encoding data, will be quantized to zero - * continue with next channel - */ - } - } /* for ch */ - } - /* encode 'as is' - */ - use_nbits_fr = 0; - for (gr = 0; gr < ngr; ++gr) { - use_nbits_gr[gr] = 0; - for (ch = 0; ch < nch; ++ch) { - algo_t const *that = &that_[gr][ch]; - if (max_bits[gr][ch] > 0) { - memset(&that->cod_info->l3_enc[0], 0, sizeof(that->cod_info->l3_enc)); - (void) quantizeAndCountBits(that); - } - else { - /* xr contains no energy - * l3_enc, our encoding data, will be quantized to zero - * continue with next channel - */ - } - use_nbits_ch[gr][ch] = reduce_bit_usage(gfc, gr, ch); - use_nbits_gr[gr] += use_nbits_ch[gr][ch]; - } /* for ch */ - use_nbits_fr += use_nbits_gr[gr]; - } - - /* check bit constrains - */ - if (use_nbits_fr <= max_nbits_fr) { - ok = 1; - for (gr = 0; gr < ngr; ++gr) { - if (use_nbits_gr[gr] > MAX_BITS_PER_GRANULE) { - /* violates the rule that every granule has to use no more - * bits than MAX_BITS_PER_GRANULE - */ - ok = 0; - } - for (ch = 0; ch < nch; ++ch) { - if (use_nbits_ch[gr][ch] > MAX_BITS_PER_CHANNEL) { - /* violates the rule that every gr_ch has to use no more - * bits than MAX_BITS_PER_CHANNEL - * - * This isn't explicitly stated in the ISO docs, but the - * part2_3_length field has only 12 bits, that makes it - * up to a maximum size of 4095 bits!!! - */ - ok = 0; - } - } - } - if (ok) { - return use_nbits_fr; - } - } - - /* OK, we are in trouble and have to define how many bits are - * to be used for each granule - */ - { - ok = 1; - sum_fr = 0; - - for (gr = 0; gr < ngr; ++gr) { - max_nbits_gr[gr] = 0; - for (ch = 0; ch < nch; ++ch) { - if (use_nbits_ch[gr][ch] > MAX_BITS_PER_CHANNEL) { - max_nbits_ch[gr][ch] = MAX_BITS_PER_CHANNEL; - } - else { - max_nbits_ch[gr][ch] = use_nbits_ch[gr][ch]; - } - max_nbits_gr[gr] += max_nbits_ch[gr][ch]; - } - if (max_nbits_gr[gr] > MAX_BITS_PER_GRANULE) { - float f[2] = {0.0f, 0.0f}, s = 0.0f; - for (ch = 0; ch < nch; ++ch) { - if (max_nbits_ch[gr][ch] > 0) { - f[ch] = sqrt(sqrt(max_nbits_ch[gr][ch])); - s += f[ch]; - } - else { - f[ch] = 0; - } - } - for (ch = 0; ch < nch; ++ch) { - if (s > 0) { - max_nbits_ch[gr][ch] = MAX_BITS_PER_GRANULE * f[ch] / s; - } - else { - max_nbits_ch[gr][ch] = 0; - } - } - if (nch > 1) { - if (max_nbits_ch[gr][0] > use_nbits_ch[gr][0] + 32) { - max_nbits_ch[gr][1] += max_nbits_ch[gr][0]; - max_nbits_ch[gr][1] -= use_nbits_ch[gr][0] + 32; - max_nbits_ch[gr][0] = use_nbits_ch[gr][0] + 32; - } - if (max_nbits_ch[gr][1] > use_nbits_ch[gr][1] + 32) { - max_nbits_ch[gr][0] += max_nbits_ch[gr][1]; - max_nbits_ch[gr][0] -= use_nbits_ch[gr][1] + 32; - max_nbits_ch[gr][1] = use_nbits_ch[gr][1] + 32; - } - if (max_nbits_ch[gr][0] > MAX_BITS_PER_CHANNEL) { - max_nbits_ch[gr][0] = MAX_BITS_PER_CHANNEL; - } - if (max_nbits_ch[gr][1] > MAX_BITS_PER_CHANNEL) { - max_nbits_ch[gr][1] = MAX_BITS_PER_CHANNEL; - } - } - max_nbits_gr[gr] = 0; - for (ch = 0; ch < nch; ++ch) { - max_nbits_gr[gr] += max_nbits_ch[gr][ch]; - } - } - sum_fr += max_nbits_gr[gr]; - } - if (sum_fr > max_nbits_fr) { - { - float f[2] = {0.0f, 0.0f}, s = 0.0f; - for (gr = 0; gr < ngr; ++gr) { - if (max_nbits_gr[gr] > 0) { - f[gr] = sqrt(max_nbits_gr[gr]); - s += f[gr]; - } - else { - f[gr] = 0; - } - } - for (gr = 0; gr < ngr; ++gr) { - if (s > 0) { - max_nbits_gr[gr] = max_nbits_fr * f[gr] / s; - } - else { - max_nbits_gr[gr] = 0; - } - } - } - if (ngr > 1) { - if (max_nbits_gr[0] > use_nbits_gr[0] + 125) { - max_nbits_gr[1] += max_nbits_gr[0]; - max_nbits_gr[1] -= use_nbits_gr[0] + 125; - max_nbits_gr[0] = use_nbits_gr[0] + 125; - } - if (max_nbits_gr[1] > use_nbits_gr[1] + 125) { - max_nbits_gr[0] += max_nbits_gr[1]; - max_nbits_gr[0] -= use_nbits_gr[1] + 125; - max_nbits_gr[1] = use_nbits_gr[1] + 125; - } - for (gr = 0; gr < ngr; ++gr) { - if (max_nbits_gr[gr] > MAX_BITS_PER_GRANULE) { - max_nbits_gr[gr] = MAX_BITS_PER_GRANULE; - } - } - } - for (gr = 0; gr < ngr; ++gr) { - float f[2] = {0.0f, 0.0f}, s = 0.0f; - for (ch = 0; ch < nch; ++ch) { - if (max_nbits_ch[gr][ch] > 0) { - f[ch] = sqrt(max_nbits_ch[gr][ch]); - s += f[ch]; - } - else { - f[ch] = 0; - } - } - for (ch = 0; ch < nch; ++ch) { - if (s > 0) { - max_nbits_ch[gr][ch] = max_nbits_gr[gr] * f[ch] / s; - } - else { - max_nbits_ch[gr][ch] = 0; - } - } - if (nch > 1) { - if (max_nbits_ch[gr][0] > use_nbits_ch[gr][0] + 32) { - max_nbits_ch[gr][1] += max_nbits_ch[gr][0]; - max_nbits_ch[gr][1] -= use_nbits_ch[gr][0] + 32; - max_nbits_ch[gr][0] = use_nbits_ch[gr][0] + 32; - } - if (max_nbits_ch[gr][1] > use_nbits_ch[gr][1] + 32) { - max_nbits_ch[gr][0] += max_nbits_ch[gr][1]; - max_nbits_ch[gr][0] -= use_nbits_ch[gr][1] + 32; - max_nbits_ch[gr][1] = use_nbits_ch[gr][1] + 32; - } - for (ch = 0; ch < nch; ++ch) { - if (max_nbits_ch[gr][ch] > MAX_BITS_PER_CHANNEL) { - max_nbits_ch[gr][ch] = MAX_BITS_PER_CHANNEL; - } - } - } - } - } - /* sanity check */ - sum_fr = 0; - for (gr = 0; gr < ngr; ++gr) { - int sum_gr = 0; - for (ch = 0; ch < nch; ++ch) { - sum_gr += max_nbits_ch[gr][ch]; - if (max_nbits_ch[gr][ch] > MAX_BITS_PER_CHANNEL) { - ok = 0; - } - } - sum_fr += sum_gr; - if (sum_gr > MAX_BITS_PER_GRANULE) { - ok = 0; - } - } - if (sum_fr > max_nbits_fr) { - ok = 0; - } - if (!ok) { - /* we must have done something wrong, fallback to 'on_pe' based constrain */ - for (gr = 0; gr < ngr; ++gr) { - for (ch = 0; ch < nch; ++ch) { - max_nbits_ch[gr][ch] = max_bits[gr][ch]; - } - } - } - } - - /* we already called the 'best_scalefac_store' function, so we need to reset some - * variables before we can do it again. - */ - for (ch = 0; ch < nch; ++ch) { - gfc->l3_side.scfsi[ch][0] = 0; - gfc->l3_side.scfsi[ch][1] = 0; - gfc->l3_side.scfsi[ch][2] = 0; - gfc->l3_side.scfsi[ch][3] = 0; - } - for (gr = 0; gr < ngr; ++gr) { - for (ch = 0; ch < nch; ++ch) { - gfc->l3_side.tt[gr][ch].scalefac_compress = 0; - } - } - - /* alter our encoded data, until it fits into the target bitrate - */ - use_nbits_fr = 0; - for (gr = 0; gr < ngr; ++gr) { - use_nbits_gr[gr] = 0; - for (ch = 0; ch < nch; ++ch) { - algo_t const *that = &that_[gr][ch]; - use_nbits_ch[gr][ch] = 0; - if (max_bits[gr][ch] > 0) { - int *sfwork = sfwork_[gr][ch]; - int const *vbrsfmin = vbrsfmin_[gr][ch]; - cutDistribution(sfwork, sfwork, that->cod_info->global_gain); - outOfBitsStrategy(that, sfwork, vbrsfmin, max_nbits_ch[gr][ch]); - } - use_nbits_ch[gr][ch] = reduce_bit_usage(gfc, gr, ch); - assert(use_nbits_ch[gr][ch] <= max_nbits_ch[gr][ch]); - use_nbits_gr[gr] += use_nbits_ch[gr][ch]; - } /* for ch */ - use_nbits_fr += use_nbits_gr[gr]; - } - - /* check bit constrains, but it should always be ok, iff there are no bugs ;-) - */ - if (use_nbits_fr <= max_nbits_fr) { - return use_nbits_fr; - } - - ERRORF(gfc, "INTERNAL ERROR IN VBR NEW CODE (1313), please send bug report\n" - "maxbits=%d usedbits=%d\n", max_nbits_fr, use_nbits_fr); - exit(-1); -} diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/vbrquantize.h b/recorderlib/src/main/jni/lame-3.100_libmp3lame/vbrquantize.h deleted file mode 100644 index 1c0d18f..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/vbrquantize.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * MP3 VBR quantization - * - * Copyright (c) 1999 Mark Taylor - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef LAME_VBRQUANTIZE_H -#define LAME_VBRQUANTIZE_H - -int VBR_encode_frame(lame_internal_flags * gfc, const FLOAT xr34orig[2][2][576], - const FLOAT l3_xmin[2][2][SFBMAX], const int maxbits[2][2]); - -#endif /* LAME_VBRQUANTIZE_H */ diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/version.c b/recorderlib/src/main/jni/lame-3.100_libmp3lame/version.c deleted file mode 100644 index 2943406..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/version.c +++ /dev/null @@ -1,254 +0,0 @@ -/* - * Version numbering for LAME. - * - * Copyright (c) 1999 A.L. Faber - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/*! - \file version.c - \brief Version numbering for LAME. - - Contains functions which describe the version of LAME. - - \author A.L. Faber - \version \$Id: version.c,v 1.34 2011/11/18 09:51:02 robert Exp $ - \ingroup libmp3lame -*/ - - -#ifdef HAVE_CONFIG_H -# include -#endif - - -#include "lame.h" -#include "machine.h" - -#include "version.h" /* macros of version numbers */ - - - - - -/*! Get the LAME version string. */ -/*! - \param void - \return a pointer to a string which describes the version of LAME. -*/ -const char * -get_lame_version(void) -{ /* primary to write screen reports */ - /* Here we can also add informations about compile time configurations */ - -#if LAME_ALPHA_VERSION - static /*@observer@ */ const char *const str = - STR(LAME_MAJOR_VERSION) "." STR(LAME_MINOR_VERSION) " " - "(alpha " STR(LAME_PATCH_VERSION) ", " __DATE__ " " __TIME__ ")"; -#elif LAME_BETA_VERSION - static /*@observer@ */ const char *const str = - STR(LAME_MAJOR_VERSION) "." STR(LAME_MINOR_VERSION) " " - "(beta " STR(LAME_PATCH_VERSION) ", " __DATE__ ")"; -#elif LAME_RELEASE_VERSION && (LAME_PATCH_VERSION > 0) - static /*@observer@ */ const char *const str = - STR(LAME_MAJOR_VERSION) "." STR(LAME_MINOR_VERSION) "." STR(LAME_PATCH_VERSION); -#else - static /*@observer@ */ const char *const str = - STR(LAME_MAJOR_VERSION) "." STR(LAME_MINOR_VERSION); -#endif - - return str; -} - - -/*! Get the short LAME version string. */ -/*! - It's mainly for inclusion into the MP3 stream. - - \param void - \return a pointer to the short version of the LAME version string. -*/ -const char * -get_lame_short_version(void) -{ - /* adding date and time to version string makes it harder for output - validation */ - -#if LAME_ALPHA_VERSION - static /*@observer@ */ const char *const str = - STR(LAME_MAJOR_VERSION) "." STR(LAME_MINOR_VERSION) " (alpha " STR(LAME_PATCH_VERSION) ")"; -#elif LAME_BETA_VERSION - static /*@observer@ */ const char *const str = - STR(LAME_MAJOR_VERSION) "." STR(LAME_MINOR_VERSION) " (beta " STR(LAME_PATCH_VERSION) ")"; -#elif LAME_RELEASE_VERSION && (LAME_PATCH_VERSION > 0) - static /*@observer@ */ const char *const str = - STR(LAME_MAJOR_VERSION) "." STR(LAME_MINOR_VERSION) "." STR(LAME_PATCH_VERSION); -#else - static /*@observer@ */ const char *const str = - STR(LAME_MAJOR_VERSION) "." STR(LAME_MINOR_VERSION); -#endif - - return str; -} - -/*! Get the _very_ short LAME version string. */ -/*! - It's used in the LAME VBR tag only. - - \param void - \return a pointer to the short version of the LAME version string. -*/ -const char * -get_lame_very_short_version(void) -{ - /* adding date and time to version string makes it harder for output - validation */ -#if LAME_ALPHA_VERSION -#define P "a" -#elif LAME_BETA_VERSION -#define P "b" -#elif LAME_RELEASE_VERSION && (LAME_PATCH_VERSION > 0) -#define P "r" -#else -#define P " " -#endif - static /*@observer@ */ const char *const str = -#if (LAME_PATCH_VERSION > 0) - "LAME" STR(LAME_MAJOR_VERSION) "." STR(LAME_MINOR_VERSION) P STR(LAME_PATCH_VERSION) -#else - "LAME" STR(LAME_MAJOR_VERSION) "." STR(LAME_MINOR_VERSION) P -#endif - ; - return str; -} - -/*! Get the _very_ short LAME version string. */ -/*! - It's used in the LAME VBR tag only, limited to 9 characters max. - Due to some 3rd party HW/SW decoders, it has to start with LAME. - - \param void - \return a pointer to the short version of the LAME version string. - */ -const char* -get_lame_tag_encoder_short_version(void) -{ - static /*@observer@ */ const char *const str = - /* FIXME: new scheme / new version counting / drop versioning here ? */ - "LAME" STR(LAME_MAJOR_VERSION) "." STR(LAME_MINOR_VERSION) P - ; - return str; -} - -/*! Get the version string for GPSYCHO. */ -/*! - \param void - \return a pointer to a string which describes the version of GPSYCHO. -*/ -const char * -get_psy_version(void) -{ -#if PSY_ALPHA_VERSION > 0 - static /*@observer@ */ const char *const str = - STR(PSY_MAJOR_VERSION) "." STR(PSY_MINOR_VERSION) - " (alpha " STR(PSY_ALPHA_VERSION) ", " __DATE__ " " __TIME__ ")"; -#elif PSY_BETA_VERSION > 0 - static /*@observer@ */ const char *const str = - STR(PSY_MAJOR_VERSION) "." STR(PSY_MINOR_VERSION) - " (beta " STR(PSY_BETA_VERSION) ", " __DATE__ ")"; -#else - static /*@observer@ */ const char *const str = - STR(PSY_MAJOR_VERSION) "." STR(PSY_MINOR_VERSION); -#endif - - return str; -} - - -/*! Get the URL for the LAME website. */ -/*! - \param void - \return a pointer to a string which is a URL for the LAME website. -*/ -const char * -get_lame_url(void) -{ - static /*@observer@ */ const char *const str = LAME_URL; - - return str; -} - - -/*! Get the numerical representation of the version. */ -/*! - Writes the numerical representation of the version of LAME and - GPSYCHO into lvp. - - \param lvp -*/ -void -get_lame_version_numerical(lame_version_t * lvp) -{ - static /*@observer@ */ const char *const features = ""; /* obsolete */ - - /* generic version */ - lvp->major = LAME_MAJOR_VERSION; - lvp->minor = LAME_MINOR_VERSION; -#if LAME_ALPHA_VERSION - lvp->alpha = LAME_PATCH_VERSION; - lvp->beta = 0; -#elif LAME_BETA_VERSION - lvp->alpha = 0; - lvp->beta = LAME_PATCH_VERSION; -#else - lvp->alpha = 0; - lvp->beta = 0; -#endif - - /* psy version */ - lvp->psy_major = PSY_MAJOR_VERSION; - lvp->psy_minor = PSY_MINOR_VERSION; - lvp->psy_alpha = PSY_ALPHA_VERSION; - lvp->psy_beta = PSY_BETA_VERSION; - - /* compile time features */ - /*@-mustfree@ */ - lvp->features = features; - /*@=mustfree@ */ -} - - -const char * -get_lame_os_bitness(void) -{ - static /*@observer@ */ const char *const strXX = ""; - static /*@observer@ */ const char *const str32 = "32bits"; - static /*@observer@ */ const char *const str64 = "64bits"; - - switch (sizeof(void *)) { - case 4: - return str32; - - case 8: - return str64; - - default: - return strXX; - } -} - -/* end of version.c */ diff --git a/recorderlib/src/main/jni/lame-3.100_libmp3lame/version.h b/recorderlib/src/main/jni/lame-3.100_libmp3lame/version.h deleted file mode 100644 index f5fef50..0000000 --- a/recorderlib/src/main/jni/lame-3.100_libmp3lame/version.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Version numbering for LAME. - * - * Copyright (c) 1999 A.L. Faber - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef LAME_VERSION_H -#define LAME_VERSION_H - - -/* - * To make a string from a token, use the # operator: - */ -#ifndef STR -# define __STR(x) #x -# define STR(x) __STR(x) -#endif - -# define LAME_URL "http://lame.sf.net" - - -# define LAME_MAJOR_VERSION 3 /* Major version number */ -# define LAME_MINOR_VERSION 100 /* Minor version number */ -# define LAME_TYPE_VERSION 2 /* 0:alpha 1:beta 2:release */ -# define LAME_PATCH_VERSION 0 /* Patch level */ -# define LAME_ALPHA_VERSION (LAME_TYPE_VERSION==0) -# define LAME_BETA_VERSION (LAME_TYPE_VERSION==1) -# define LAME_RELEASE_VERSION (LAME_TYPE_VERSION==2) - -# define PSY_MAJOR_VERSION 1 /* Major version number */ -# define PSY_MINOR_VERSION 0 /* Minor version number */ -# define PSY_ALPHA_VERSION 0 /* Set number if this is an alpha version, otherwise zero */ -# define PSY_BETA_VERSION 0 /* Set number if this is a beta version, otherwise zero */ - -#if LAME_ALPHA_VERSION -#define LAME_PATCH_LEVEL_STRING " alpha " STR(LAME_PATCH_VERSION) -#endif -#if LAME_BETA_VERSION -#define LAME_PATCH_LEVEL_STRING " beta " STR(LAME_PATCH_VERSION) -#endif -#if LAME_RELEASE_VERSION -#if LAME_PATCH_VERSION -#define LAME_PATCH_LEVEL_STRING " release " STR(LAME_PATCH_VERSION) -#else -#define LAME_PATCH_LEVEL_STRING "" -#endif -#endif - -# define LAME_VERSION_STRING STR(LAME_MAJOR_VERSION) "." STR(LAME_MINOR_VERSION) LAME_PATCH_LEVEL_STRING - -#endif /* LAME_VERSION_H */ - -/* End of version.h */