summaryrefslogtreecommitdiff
path: root/src/libmusepack/musepack/decoder.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/libmusepack/musepack/decoder.h')
-rw-r--r--src/libmusepack/musepack/decoder.h114
1 files changed, 114 insertions, 0 deletions
diff --git a/src/libmusepack/musepack/decoder.h b/src/libmusepack/musepack/decoder.h
new file mode 100644
index 000000000..08c316390
--- /dev/null
+++ b/src/libmusepack/musepack/decoder.h
@@ -0,0 +1,114 @@
+/// \file decoder.h
+
+#ifndef _musepack_decoder_h_
+#define _musepack_decoder_h_
+
+#include "musepack/huffman.h"
+#include "musepack/math.h"
+#include "musepack/musepack.h"
+#include "musepack/reader.h"
+#include "musepack/streaminfo.h"
+
+enum {
+ MPC_V_MEM = 2304,
+ MPC_DECODER_MEMSIZE = 16384, // overall buffer size
+};
+
+typedef struct {
+ mpc_int32_t L [36];
+ mpc_int32_t R [36];
+} QuantTyp;
+
+typedef struct mpc_decoder_t {
+ mpc_reader *r;
+
+ /// @name internal state variables
+ //@{
+
+ mpc_uint32_t dword; /// actually decoded 32bit-word
+ mpc_uint32_t pos; /// bit-position within dword
+ mpc_uint32_t Speicher[MPC_DECODER_MEMSIZE]; /// read-buffer
+ mpc_uint32_t Zaehler; /// actual index within read-buffer
+
+ mpc_uint32_t samples_to_skip;
+
+ mpc_uint32_t FwdJumpInfo;
+ mpc_uint32_t ActDecodePos;
+ mpc_uint32_t FrameWasValid;
+
+ mpc_uint32_t DecodedFrames;
+ mpc_uint32_t OverallFrames;
+ mpc_int32_t SampleRate; // Sample frequency
+
+ mpc_uint32_t StreamVersion; // version of bitstream
+ mpc_uint32_t MS_used; // MS-coding used ?
+ mpc_int32_t Max_Band;
+ mpc_uint32_t MPCHeaderPos; // AB: needed to support ID3v2
+ mpc_uint32_t LastValidSamples;
+ mpc_uint32_t TrueGaplessPresent;
+
+ mpc_uint32_t EQ_activated;
+
+ mpc_uint32_t WordsRead; // counts amount of decoded dwords
+
+ // randomizer state variables
+ mpc_uint32_t __r1;
+ mpc_uint32_t __r2;
+
+ mpc_uint32_t Q_bit [32];
+ mpc_uint32_t Q_res [32][16];
+
+ // huffman table stuff
+ HuffmanTyp HuffHdr [10];
+ HuffmanTyp HuffSCFI [ 4];
+ HuffmanTyp HuffDSCF [16];
+ HuffmanTyp* HuffQ [2] [8];
+
+ HuffmanTyp HuffQ1 [2] [3*3*3];
+ HuffmanTyp HuffQ2 [2] [5*5];
+ HuffmanTyp HuffQ3 [2] [ 7];
+ HuffmanTyp HuffQ4 [2] [ 9];
+ HuffmanTyp HuffQ5 [2] [15];
+ HuffmanTyp HuffQ6 [2] [31];
+ HuffmanTyp HuffQ7 [2] [63];
+ const HuffmanTyp* SampleHuff [18];
+ HuffmanTyp SCFI_Bundle [ 8];
+ HuffmanTyp DSCF_Entropie [13];
+ HuffmanTyp Region_A [16];
+ HuffmanTyp Region_B [ 8];
+ HuffmanTyp Region_C [ 4];
+
+ HuffmanTyp Entropie_1 [ 3];
+ HuffmanTyp Entropie_2 [ 5];
+ HuffmanTyp Entropie_3 [ 7];
+ HuffmanTyp Entropie_4 [ 9];
+ HuffmanTyp Entropie_5 [15];
+ HuffmanTyp Entropie_6 [31];
+ HuffmanTyp Entropie_7 [63];
+
+ mpc_int32_t SCF_Index_L [32] [3];
+ mpc_int32_t SCF_Index_R [32] [3]; // holds scalefactor-indices
+ QuantTyp Q [32]; // holds quantized samples
+ mpc_int32_t Res_L [32];
+ mpc_int32_t Res_R [32]; // holds the chosen quantizer for each subband
+ mpc_int32_t DSCF_Flag_L [32];
+ mpc_int32_t DSCF_Flag_R [32]; // differential SCF used?
+ mpc_int32_t SCFI_L [32];
+ mpc_int32_t SCFI_R [32]; // describes order of transmitted SCF
+ mpc_int32_t DSCF_Reference_L [32];
+ mpc_int32_t DSCF_Reference_R [32]; // holds last frames SCF
+ mpc_int32_t MS_Flag[32]; // MS used?
+#ifdef MPC_FIXED_POINT
+ unsigned char SCF_shift[256];
+#endif
+
+ MPC_SAMPLE_FORMAT V_L[MPC_V_MEM + 960];
+ MPC_SAMPLE_FORMAT V_R[MPC_V_MEM + 960];
+ MPC_SAMPLE_FORMAT Y_L[36][32];
+ MPC_SAMPLE_FORMAT Y_R[36][32];
+ MPC_SAMPLE_FORMAT SCF[256]; ///< holds adapted scalefactors (for clipping prevention)
+ //@}
+
+} mpc_decoder;
+
+#endif // _mpc_decoder_h