1/********************************************************************
2 *                                                                  *
3 * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE.   *
4 * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *
5 * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
6 * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *
7 *                                                                  *
8 * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009             *
9 * by the Xiph.Org Foundation http://www.xiph.org/                  *
10 *                                                                  *
11 ********************************************************************
12
13 function: random psychoacoustics (not including preecho)
14 last mod: $Id: psy.h 16946 2010-03-03 16:12:40Z xiphmont $
15
16 ********************************************************************/
17
18#ifndef _V_PSY_H_
19#define _V_PSY_H_
20#include "smallft.h"
21
22#include "backends.h"
23#include "envelope.h"
24
25#ifndef EHMER_MAX
26#define EHMER_MAX 56
27#endif
28
29/* psychoacoustic setup ********************************************/
30#define P_BANDS 17      /* 62Hz to 16kHz */
31#define P_LEVELS 8      /* 30dB to 100dB */
32#define P_LEVEL_0 30.    /* 30 dB */
33#define P_NOISECURVES 3
34
35#define NOISE_COMPAND_LEVELS 40
36typedef struct vorbis_info_psy{
37  int   blockflag;
38
39  float ath_adjatt;
40  float ath_maxatt;
41
42  float tone_masteratt[P_NOISECURVES];
43  float tone_centerboost;
44  float tone_decay;
45  float tone_abs_limit;
46  float toneatt[P_BANDS];
47
48  int noisemaskp;
49  float noisemaxsupp;
50  float noisewindowlo;
51  float noisewindowhi;
52  int   noisewindowlomin;
53  int   noisewindowhimin;
54  int   noisewindowfixed;
55  float noiseoff[P_NOISECURVES][P_BANDS];
56  float noisecompand[NOISE_COMPAND_LEVELS];
57
58  float max_curve_dB;
59
60  int normal_p;
61  int normal_start;
62  int normal_partition;
63  double normal_thresh;
64} vorbis_info_psy;
65
66typedef struct{
67  int   eighth_octave_lines;
68
69  /* for block long/short tuning; encode only */
70  float preecho_thresh[VE_BANDS];
71  float postecho_thresh[VE_BANDS];
72  float stretch_penalty;
73  float preecho_minenergy;
74
75  float ampmax_att_per_sec;
76
77  /* channel coupling config */
78  int   coupling_pkHz[PACKETBLOBS];
79  int   coupling_pointlimit[2][PACKETBLOBS];
80  int   coupling_prepointamp[PACKETBLOBS];
81  int   coupling_postpointamp[PACKETBLOBS];
82  int   sliding_lowpass[2][PACKETBLOBS];
83
84} vorbis_info_psy_global;
85
86typedef struct {
87  float ampmax;
88  int   channels;
89
90  vorbis_info_psy_global *gi;
91  int   coupling_pointlimit[2][P_NOISECURVES];
92} vorbis_look_psy_global;
93
94
95typedef struct {
96  int n;
97  struct vorbis_info_psy *vi;
98
99  float ***tonecurves;
100  float **noiseoffset;
101
102  float *ath;
103  long  *octave;             /* in n.ocshift format */
104  long  *bark;
105
106  long  firstoc;
107  long  shiftoc;
108  int   eighth_octave_lines; /* power of two, please */
109  int   total_octave_lines;
110  long  rate; /* cache it */
111
112  float m_val; /* Masking compensation value */
113
114} vorbis_look_psy;
115
116extern void   _vp_psy_init(vorbis_look_psy *p,vorbis_info_psy *vi,
117                           vorbis_info_psy_global *gi,int n,long rate);
118extern void   _vp_psy_clear(vorbis_look_psy *p);
119extern void  *_vi_psy_dup(void *source);
120
121extern void   _vi_psy_free(vorbis_info_psy *i);
122extern vorbis_info_psy *_vi_psy_copy(vorbis_info_psy *i);
123
124extern void _vp_noisemask(vorbis_look_psy *p,
125                          float *logmdct,
126                          float *logmask);
127
128extern void _vp_tonemask(vorbis_look_psy *p,
129                         float *logfft,
130                         float *logmask,
131                         float global_specmax,
132                         float local_specmax);
133
134extern void _vp_offset_and_mix(vorbis_look_psy *p,
135                               float *noise,
136                               float *tone,
137                               int offset_select,
138                               float *logmask,
139                               float *mdct,
140                               float *logmdct);
141
142extern float _vp_ampmax_decay(float amp,vorbis_dsp_state *vd);
143
144extern void _vp_couple_quantize_normalize(int blobno,
145                                          vorbis_info_psy_global *g,
146                                          vorbis_look_psy *p,
147                                          vorbis_info_mapping0 *vi,
148                                          float **mdct,
149                                          int   **iwork,
150                                          int    *nonzero,
151                                          int     sliding_lowpass,
152                                          int     ch);
153
154#endif
155