"L. Spiro Engine"
|
00001 /******************************************************************** 00002 * * 00003 * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * 00004 * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * 00005 * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * 00006 * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * 00007 * * 00008 * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * 00009 * by the Xiph.Org Foundation http://www.xiph.org/ * 00010 * * 00011 ******************************************************************** 00012 00013 function: random psychoacoustics (not including preecho) 00014 last mod: $Id: psy.h 16946 2010-03-03 16:12:40Z xiphmont $ 00015 00016 ********************************************************************/ 00017 00018 00019 #ifndef __LSS_VORBISPSY_H__ 00020 #define __LSS_VORBISPSY_H__ 00021 00022 #include "../LSSSoundLib.h" 00023 #include "LSSVorbisCodec.h" 00024 #include "LSSVorbisConstants.h" 00025 #include "LSSVorbisMasking.h" 00026 #include "LSSVorbisStructs.h" 00027 00028 namespace lss { 00029 00036 class CVorbisPsy { 00037 public : 00038 // == Types. 00042 typedef struct vorbis_info_psy { 00043 LSINT32 blockflag; 00044 00045 LSFLOAT ath_adjatt; 00046 LSFLOAT ath_maxatt; 00047 00048 LSFLOAT tone_masteratt[P_NOISECURVES]; 00049 LSFLOAT tone_centerboost; 00050 LSFLOAT tone_decay; 00051 LSFLOAT tone_abs_limit; 00052 LSFLOAT toneatt[P_BANDS]; 00053 00054 LSINT32 noisemaskp; 00055 LSFLOAT noisemaxsupp; 00056 LSFLOAT noisewindowlo; 00057 LSFLOAT noisewindowhi; 00058 LSINT32 noisewindowlomin; 00059 LSINT32 noisewindowhimin; 00060 LSINT32 noisewindowfixed; 00061 LSFLOAT noiseoff[P_NOISECURVES][P_BANDS]; 00062 LSFLOAT noisecompand[NOISE_COMPAND_LEVELS]; 00063 00064 LSFLOAT max_curve_dB; 00065 00066 LSINT32 normal_p; 00067 LSINT32 normal_start; 00068 LSINT32 normal_partition; 00069 LSDOUBLE normal_thresh; 00070 } * LPvorbis_info_psy, * const LPCvorbis_info_psy; 00071 00075 typedef struct vorbis_info_psy_global { 00076 LSINT32 eighth_octave_lines; 00077 00078 // For block LSINT32/short tuning; encode only. 00079 LSFLOAT preecho_thresh[VE_BANDS]; 00080 LSFLOAT postecho_thresh[VE_BANDS]; 00081 LSFLOAT stretch_penalty; 00082 LSFLOAT preecho_minenergy; 00083 00084 LSFLOAT ampmax_att_per_sec; 00085 00086 // Channel coupling config. 00087 LSINT32 coupling_pkHz[PACKETBLOBS]; 00088 LSINT32 coupling_pointlimit[2][PACKETBLOBS]; 00089 LSINT32 coupling_prepointamp[PACKETBLOBS]; 00090 LSINT32 coupling_postpointamp[PACKETBLOBS]; 00091 LSINT32 sliding_lowpass[2][PACKETBLOBS]; 00092 00093 } * LPvorbis_info_psy_global, * const LPCvorbis_info_psy_global; 00094 00098 typedef struct vorbis_look_psy_global { 00099 LSFLOAT ampmax; 00100 LSINT32 channels; 00101 00102 vorbis_info_psy_global * gi; 00103 LSINT32 coupling_pointlimit[2][P_NOISECURVES]; 00104 } * LPvorbis_look_psy_global, * const LPCvorbis_look_psy_global; 00105 00109 typedef struct vorbis_look_psy { 00110 LSINT32 n; 00111 vorbis_info_psy * vi; 00112 00113 LSFLOAT *** tonecurves; 00114 LSFLOAT ** noiseoffset; 00115 00116 LSFLOAT * ath; 00117 LSINT32 * octave; // In n.ocshift format. 00118 LSINT32 * bark; 00119 00120 LSINT32 firstoc; 00121 LSINT32 shiftoc; 00122 LSINT32 eighth_octave_lines; // Power of two, please. 00123 LSINT32 total_octave_lines; 00124 LSINT32 rate; // Cache it. 00125 00126 LSFLOAT m_val; // Masking compensation value. 00127 00128 } * LPvorbis_look_psy, * LPCvorbis_look_psy; 00129 00130 00131 // == Functions. 00141 static LSVOID _vp_psy_init( vorbis_look_psy * _plpP, vorbis_info_psy * _pipVi, 00142 vorbis_info_psy_global * _pipgGi, LSINT32 _i32N, LSINT32 _i32Rate ); 00143 00149 static LSVOID _vp_psy_clear( vorbis_look_psy * _plpP ); 00150 00157 //static LSVOID * _vi_psy_dup( LSVOID * _pvSource ); 00158 00164 static LSVOID _vi_psy_free( vorbis_info_psy * _pipI ); 00165 00172 //static vorbis_info_psy * _vi_psy_copy( vorbis_info_psy * _pipI ); 00173 00181 static LSVOID _vp_noisemask( vorbis_look_psy * _plpP, 00182 LSFLOAT * _pfLogMdct, 00183 LSFLOAT * _pfLogMask ); 00184 00194 static LSVOID _vp_tonemask( vorbis_look_psy * _plpP, 00195 LSFLOAT * _pfLogFft, 00196 LSFLOAT * _pfLogMask, 00197 LSFLOAT _fGlobalSpecMax, 00198 LSFLOAT _fLocalSpecMax ); 00199 00211 static LSVOID _vp_offset_and_mix( vorbis_look_psy * _plpP, 00212 LSFLOAT * _pfNoise, 00213 LSFLOAT * _pfTone, 00214 LSINT32 _i32OffsetSelect, 00215 LSFLOAT * _pfLogMask, 00216 LSFLOAT * _pfMdct, 00217 LSFLOAT * _pfLogMdct ); 00218 00226 static LSFLOAT _vp_ampmax_decay( LSFLOAT _fAmp, CVorbisCodec::vorbis_dsp_state * _pdsVd ); 00227 00241 static LSVOID _vp_couple_quantize_normalize( LSINT32 _i32BlobNo, 00242 vorbis_info_psy_global * _pipgG, 00243 vorbis_look_psy * _plpP, 00244 CVorbisStructs::vorbis_info_mapping0 * _pipVi, 00245 LSFLOAT ** _pfMdct, 00246 LSINT32 ** _ppi32Work, 00247 LSINT32 * _pi32NonZero, 00248 LSINT32 _i32SlidingLowPass, 00249 LSINT32 _i32Ch ); 00250 00251 00252 protected : 00253 // == Functions. 00264 static LSFLOAT *** setup_tone_curves( LSFLOAT _fCurveAttDb[P_BANDS], LSFLOAT _fBinHz, LSINT32 _i32N, 00265 LSFLOAT _fCenterBoost, LSFLOAT _fCenterDecayRate ); 00266 00273 static LSVOID min_curve( LSFLOAT * _pfC, LSFLOAT * _pfC2 ); 00274 00281 static LSVOID max_curve( LSFLOAT * _pfC, LSFLOAT * _pfC2 ); 00282 00289 static LSVOID attenuate_curve( LSFLOAT * _pfC, LSFLOAT _fAtt ); 00290 00301 static LSVOID bark_noise_hybridmp( LSINT32 _i32N, const LSINT32 * _pi32B, 00302 const LSFLOAT * _pfF, 00303 LSFLOAT * _pfNoise, 00304 const LSFLOAT _fOffset, 00305 const LSINT32 _i32Fixed ); 00306 00317 static LSVOID seed_loop( vorbis_look_psy * _plpP, 00318 const LSFLOAT *** _pppfCurves, 00319 const LSFLOAT * _pfF, 00320 const LSFLOAT * _pfFlr, 00321 LSFLOAT * _pfSeed, 00322 LSFLOAT _fSpecMax ); 00323 00331 static LSVOID max_seeds( vorbis_look_psy * _plpP, 00332 LSFLOAT * _pfSeed, 00333 LSFLOAT * _pfFlr ); 00334 00346 static LSVOID seed_curve( LSFLOAT * _pfSeed, 00347 const LSFLOAT ** _pppfCurves, 00348 LSFLOAT _fAmp, 00349 LSINT32 _i32Oc, LSINT32 _i32N, 00350 LSINT32 _i32LinesPer, 00351 LSFLOAT _fDbOffset ); 00352 00360 static LSVOID seed_chase( LSFLOAT * _pfSeeds, LSINT32 _i32LinesPer, LSINT32 _i32N ); 00361 00374 static LSVOID flag_lossless( LSINT32 _i32Limit, LSFLOAT _fPrePoint, LSFLOAT _fPostPoint, LSFLOAT * _pfMdct, 00375 LSFLOAT * _pfFloor, LSINT32 * _pi32Flag, LSINT32 _i32I, LSINT32 _i32Jn ); 00376 00392 static LSFLOAT noise_normalize( vorbis_look_psy * _plpP, LSINT32 _i32Limit, LSFLOAT * _pfR, LSFLOAT * _pfQ, LSFLOAT * _pfF, LSINT32 * _pi32Flags, LSFLOAT _pfAcc, LSINT32 _i32I, LSINT32 _i32N, LSINT32 * _pi32Out ); 00393 00402 static LSINT32 LSE_CCALL apsort( LSVOID * _pvContext, const LSVOID * _pvA, const LSVOID * _pvB ); 00403 }; 00404 00405 } // namespace lss 00406 00407 #endif // __LSS_VORBISPSY_H__ 00408