cannam@86: /******************************************************************** cannam@86: * * cannam@86: * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * cannam@86: * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * cannam@86: * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * cannam@86: * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * cannam@86: * * cannam@86: * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * cannam@86: * by the Xiph.Org Foundation http://www.xiph.org/ * cannam@86: * * cannam@86: ******************************************************************** cannam@86: cannam@86: function: random psychoacoustics (not including preecho) cannam@86: last mod: $Id: psy.h 16946 2010-03-03 16:12:40Z xiphmont $ cannam@86: cannam@86: ********************************************************************/ cannam@86: cannam@86: #ifndef _V_PSY_H_ cannam@86: #define _V_PSY_H_ cannam@86: #include "smallft.h" cannam@86: cannam@86: #include "backends.h" cannam@86: #include "envelope.h" cannam@86: cannam@86: #ifndef EHMER_MAX cannam@86: #define EHMER_MAX 56 cannam@86: #endif cannam@86: cannam@86: /* psychoacoustic setup ********************************************/ cannam@86: #define P_BANDS 17 /* 62Hz to 16kHz */ cannam@86: #define P_LEVELS 8 /* 30dB to 100dB */ cannam@86: #define P_LEVEL_0 30. /* 30 dB */ cannam@86: #define P_NOISECURVES 3 cannam@86: cannam@86: #define NOISE_COMPAND_LEVELS 40 cannam@86: typedef struct vorbis_info_psy{ cannam@86: int blockflag; cannam@86: cannam@86: float ath_adjatt; cannam@86: float ath_maxatt; cannam@86: cannam@86: float tone_masteratt[P_NOISECURVES]; cannam@86: float tone_centerboost; cannam@86: float tone_decay; cannam@86: float tone_abs_limit; cannam@86: float toneatt[P_BANDS]; cannam@86: cannam@86: int noisemaskp; cannam@86: float noisemaxsupp; cannam@86: float noisewindowlo; cannam@86: float noisewindowhi; cannam@86: int noisewindowlomin; cannam@86: int noisewindowhimin; cannam@86: int noisewindowfixed; cannam@86: float noiseoff[P_NOISECURVES][P_BANDS]; cannam@86: float noisecompand[NOISE_COMPAND_LEVELS]; cannam@86: cannam@86: float max_curve_dB; cannam@86: cannam@86: int normal_p; cannam@86: int normal_start; cannam@86: int normal_partition; cannam@86: double normal_thresh; cannam@86: } vorbis_info_psy; cannam@86: cannam@86: typedef struct{ cannam@86: int eighth_octave_lines; cannam@86: cannam@86: /* for block long/short tuning; encode only */ cannam@86: float preecho_thresh[VE_BANDS]; cannam@86: float postecho_thresh[VE_BANDS]; cannam@86: float stretch_penalty; cannam@86: float preecho_minenergy; cannam@86: cannam@86: float ampmax_att_per_sec; cannam@86: cannam@86: /* channel coupling config */ cannam@86: int coupling_pkHz[PACKETBLOBS]; cannam@86: int coupling_pointlimit[2][PACKETBLOBS]; cannam@86: int coupling_prepointamp[PACKETBLOBS]; cannam@86: int coupling_postpointamp[PACKETBLOBS]; cannam@86: int sliding_lowpass[2][PACKETBLOBS]; cannam@86: cannam@86: } vorbis_info_psy_global; cannam@86: cannam@86: typedef struct { cannam@86: float ampmax; cannam@86: int channels; cannam@86: cannam@86: vorbis_info_psy_global *gi; cannam@86: int coupling_pointlimit[2][P_NOISECURVES]; cannam@86: } vorbis_look_psy_global; cannam@86: cannam@86: cannam@86: typedef struct { cannam@86: int n; cannam@86: struct vorbis_info_psy *vi; cannam@86: cannam@86: float ***tonecurves; cannam@86: float **noiseoffset; cannam@86: cannam@86: float *ath; cannam@86: long *octave; /* in n.ocshift format */ cannam@86: long *bark; cannam@86: cannam@86: long firstoc; cannam@86: long shiftoc; cannam@86: int eighth_octave_lines; /* power of two, please */ cannam@86: int total_octave_lines; cannam@86: long rate; /* cache it */ cannam@86: cannam@86: float m_val; /* Masking compensation value */ cannam@86: cannam@86: } vorbis_look_psy; cannam@86: cannam@86: extern void _vp_psy_init(vorbis_look_psy *p,vorbis_info_psy *vi, cannam@86: vorbis_info_psy_global *gi,int n,long rate); cannam@86: extern void _vp_psy_clear(vorbis_look_psy *p); cannam@86: extern void *_vi_psy_dup(void *source); cannam@86: cannam@86: extern void _vi_psy_free(vorbis_info_psy *i); cannam@86: extern vorbis_info_psy *_vi_psy_copy(vorbis_info_psy *i); cannam@86: cannam@86: extern void _vp_noisemask(vorbis_look_psy *p, cannam@86: float *logmdct, cannam@86: float *logmask); cannam@86: cannam@86: extern void _vp_tonemask(vorbis_look_psy *p, cannam@86: float *logfft, cannam@86: float *logmask, cannam@86: float global_specmax, cannam@86: float local_specmax); cannam@86: cannam@86: extern void _vp_offset_and_mix(vorbis_look_psy *p, cannam@86: float *noise, cannam@86: float *tone, cannam@86: int offset_select, cannam@86: float *logmask, cannam@86: float *mdct, cannam@86: float *logmdct); cannam@86: cannam@86: extern float _vp_ampmax_decay(float amp,vorbis_dsp_state *vd); cannam@86: cannam@86: extern void _vp_couple_quantize_normalize(int blobno, cannam@86: vorbis_info_psy_global *g, cannam@86: vorbis_look_psy *p, cannam@86: vorbis_info_mapping0 *vi, cannam@86: float **mdct, cannam@86: int **iwork, cannam@86: int *nonzero, cannam@86: int sliding_lowpass, cannam@86: int ch); cannam@86: cannam@86: #endif