1#ifndef _mpp_dec_h_
2#define _mpp_dec_h_
3
4#include <DataIO.h>
5
6#ifndef _in_mpc_h_
7class StreamInfo;
8#endif
9
10#define _inline inline
11
12#define TO_FLOAT    1
13#define TO_PCM      2
14
15#ifndef MPC_DECODE
16#define MPC_DECODE    TO_FLOAT    // decode to 32 bit floats ( -1.000...+1.000 )
17//#define MPC_DECODE    TO_PCM      // decode to 16 bit PCM    ( -32768...+32767 )
18#endif
19
20
21#if   MPC_DECODE == TO_FLOAT
22  #define MPC_SAMPLE_FORMAT   float
23  #define MPC_SAMPLE_BPS      32
24  #define MPC_SAMPLE_TYPE     "FLOAT"
25#elif MPC_DECODE == TO_PCM
26  #define MPC_SAMPLE_FORMAT   short
27  #define MPC_SAMPLE_BPS      16
28  #define MPC_SAMPLE_TYPE     "PCM"
29#else
30  #error MPC_DECODE incorrect or undefined.
31#endif
32
33
34#define EQ_TAP          13                      // length of FIR filter for EQ
35#define DELAY           ((EQ_TAP + 1) / 2)      // delay of FIR
36#define FIR_BANDS       4                       // number of subbands to be FIR filtered
37
38#define MEMSIZE         16384                   // overall buffer size
39#define MEMSIZE2        (MEMSIZE/2)             // size of one buffer
40#define MEMMASK         (MEMSIZE-1)
41#define V_MEM           2304
42#define FRAMELEN        (36 * 32)               // samples per frame
43#define SYNTH_DELAY     481
44
45
46class MPC_decoder {
47private:
48  BPositionIO *m_reader;
49
50public:
51  MPC_decoder(BPositionIO *r);
52  ~MPC_decoder();
53
54  void SetStreamInfo ( StreamInfo *si );
55  int FileInit ();
56  void ScaleOutput ( double factor );
57  float ProcessReplayGain ( int mode, StreamInfo *info );
58  void perform_EQ ( void );
59
60  int DECODE ( MPC_SAMPLE_FORMAT *buffer );
61
62  void UpdateBuffer ( unsigned int RING );
63  int perform_jump ( int seek_needed );
64
65  void RESET_Synthesis ( void );
66  void RESET_Globals ( void );
67
68  unsigned int BitsRead ( void );
69
70private:
71  void RESET_Y ( void );
72  void Lese_Bitstrom_SV6 ( void );
73  void Lese_Bitstrom_SV7 ( void );
74
75  void Requantisierung ( const int Last_Band );
76
77public:
78  typedef struct {
79    int  L [36];
80    int  R [36];
81  } QuantTyp;
82
83  typedef struct {
84    unsigned int  Code;
85    unsigned int  Length;
86    int           Value;
87  } HuffmanTyp;
88
89public:
90  unsigned int  Speicher [MEMSIZE];         // read-buffer
91  unsigned int  dword;                      // actually decoded 32bit-word
92  unsigned int  pos;                        // bit-position within dword
93  unsigned int  Zaehler;                    // actual index within read-buffer
94
95  unsigned int  FwdJumpInfo;
96  unsigned int  ActDecodePos;
97  unsigned int  FrameWasValid;
98
99  unsigned int  DecodedFrames;
100  unsigned int  LastFrame;
101  unsigned int  LastBitsRead;
102  unsigned int  OverallFrames;
103  int           SectionBitrate;             // average bitrate for short section
104  int           SampleRate;                 // Sample frequency
105  int           NumberOfConsecutiveBrokenFrames;  // counter for consecutive broken frames
106  StreamInfo    *fInfo;
107
108private:
109  unsigned int  StreamVersion;              // version of bitstream
110  unsigned int  MS_used;                    // MS-coding used ?
111  int           Max_Band;
112  unsigned int  MPCHeaderPos;               // AB: needed to support ID3v2
113  //unsigned int  OverallFrames;
114  //unsigned int  DecodedFrames;
115  unsigned int  LastValidSamples;
116  unsigned int  TrueGaplessPresent;
117
118  unsigned int  EQ_activated;
119
120  unsigned int  WordsRead;                  // counts amount of decoded dwords
121  unsigned short* SeekTable;
122
123  /*static*/ unsigned int  __r1;
124  /*static*/ unsigned int  __r2;
125
126  unsigned long clips;
127
128private:
129  float         EQ_gain   [ 32 - FIR_BANDS ];
130  float         EQ_Filter [ FIR_BANDS ][ EQ_TAP ];
131
132  int           SCF_Index_L [32] [3];
133  int           SCF_Index_R [32] [3];       // holds scalefactor-indices
134  QuantTyp      Q [32];                     // holds quantized samples
135  int           Res_L [32];
136  int           Res_R [32];                 // holds the chosen quantizer for each subband
137  int           DSCF_Flag_L [32];
138  int           DSCF_Flag_R [32];           // differential SCF used?
139  int           SCFI_L [32];
140  int           SCFI_R [32];                // describes order of transmitted SCF
141  int           DSCF_Reference_L [32];
142  int           DSCF_Reference_R [32];      // holds last frames SCF
143  int           MS_Flag[32];                // MS used?
144
145  float         SAVE_L     [DELAY] [32];    // buffer for ...
146  float         SAVE_R     [DELAY] [32];    // ... upper subbands
147  float         FirSave_L  [FIR_BANDS] [EQ_TAP];// buffer for ...
148  float         FirSave_R  [FIR_BANDS] [EQ_TAP];// ... lowest subbands
149
150  HuffmanTyp    HuffHdr  [10];
151  HuffmanTyp    HuffSCFI [ 4];
152  HuffmanTyp    HuffDSCF [16];
153  HuffmanTyp*   HuffQ [2] [8];
154
155  HuffmanTyp    HuffQ1 [2] [3*3*3];
156  HuffmanTyp    HuffQ2 [2] [5*5];
157  HuffmanTyp    HuffQ3 [2] [ 7];
158  HuffmanTyp    HuffQ4 [2] [ 9];
159  HuffmanTyp    HuffQ5 [2] [15];
160  HuffmanTyp    HuffQ6 [2] [31];
161  HuffmanTyp    HuffQ7 [2] [63];
162
163  const HuffmanTyp* SampleHuff [18];
164  HuffmanTyp    SCFI_Bundle   [ 8];
165  HuffmanTyp    DSCF_Entropie [13];
166  HuffmanTyp    Region_A [16];
167  HuffmanTyp    Region_B [ 8];
168  HuffmanTyp    Region_C [ 4];
169
170  HuffmanTyp    Entropie_1 [ 3];
171  HuffmanTyp    Entropie_2 [ 5];
172  HuffmanTyp    Entropie_3 [ 7];
173  HuffmanTyp    Entropie_4 [ 9];
174  HuffmanTyp    Entropie_5 [15];
175  HuffmanTyp    Entropie_6 [31];
176  HuffmanTyp    Entropie_7 [63];
177
178  float         V_L [V_MEM + 960];
179  float         V_R [V_MEM + 960];
180  float         Y_L [36] [32];
181  float         Y_R [36] [32];
182
183  float         SCF  [256];                 // holds adapted scalefactors (for clipping prevention)
184  unsigned int  Q_bit [32];                 // holds amount of bits to save chosen quantizer (SV6)
185  unsigned int  Q_res [32] [16];            // holds conversion: index -> quantizer (SV6)
186
187private: // functions
188  void Reset_BitstreamDecode ( void );
189  unsigned int Bitstream_read ( const unsigned int );
190  int Huffman_Decode ( const HuffmanTyp* );         // works with maximum lengths up to 14
191  int Huffman_Decode_fast ( const HuffmanTyp* );    // works with maximum lengths up to 10
192  int Huffman_Decode_faster ( const HuffmanTyp* );  // works with maximum lengths up to  5
193  void SCFI_Bundle_read ( const HuffmanTyp*, int*, int* );
194
195  void Calculate_New_V ( const float* Sample, float* V );
196  void Vectoring_float ( float* Data, const float* V );
197  void Vectoring ( short* Data, const float* V );
198  void Vectoring_dithered ( short* Data, const float* V, const float* dither );
199  void GenerateDither_old ( float* p, size_t len );
200  void GenerateDither ( float* p, size_t len );
201
202  void Reset_V ( void );
203  void Synthese_Filter_float ( float* dst );
204  void Synthese_Filter_opt ( short* dst );
205  void Synthese_Filter_dithered ( short* dst );
206  unsigned int random_int ( void );
207
208  void EQSet ( int on, char data[10], int preamp );
209
210  void Helper1 ( unsigned long bitpos );
211  void Helper2 ( unsigned long bitpos );
212  void Helper3 ( unsigned long bitpos, long* buffoffs );
213
214  void Huffman_SV6_Encoder ( void );
215  void Huffman_SV6_Decoder ( void );
216  void Huffman_SV7_Encoder ( void );
217  void Huffman_SV7_Decoder ( void );
218
219  void initialisiere_Quantisierungstabellen ( void );
220  void Quantisierungsmodes ( void );        // conversion: index -> quantizer (bitstream reading)
221  void Resort_HuffTables ( const unsigned int elements, HuffmanTyp* Table, const int offset );
222
223private:
224  _inline int f_read(void *ptr, size_t size) { return m_reader->Read(ptr, size); };
225  _inline int f_seek(int offset, int origin) { return m_reader->Seek(offset, origin); };
226};
227
228#endif
229