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