summaryrefslogtreecommitdiff
path: root/apps/codecs/libmusepack/decoder.h
diff options
context:
space:
mode:
Diffstat (limited to 'apps/codecs/libmusepack/decoder.h')
-rw-r--r--apps/codecs/libmusepack/decoder.h120
1 files changed, 42 insertions, 78 deletions
diff --git a/apps/codecs/libmusepack/decoder.h b/apps/codecs/libmusepack/decoder.h
index 9031bf2..b3d24cf 100644
--- a/apps/codecs/libmusepack/decoder.h
+++ b/apps/codecs/libmusepack/decoder.h
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2005, The Musepack Development Team
+ Copyright (c) 2005-2009, The Musepack Development Team
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -31,107 +31,71 @@
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-
/// \file decoder.h
+#ifndef _MPCDEC_DECODER_H_
+#define _MPCDEC_DECODER_H_
+#ifdef WIN32
+#pragma once
+#endif
-#ifndef _mpcdec_decoder_h_
-#define _mpcdec_decoder_h_
-
-#include "huffman.h"
-#include "math.h"
-#include "musepack.h"
#include "reader.h"
-#include "streaminfo.h"
-// define this to enable/disable support for streamversion SV4-6
-//#define MPC_SUPPORT_SV456
+#ifdef __cplusplus
+extern "C" {
+#endif
-// SCF_HACK is used to avoid possible distortion after seeking with mpc files
-// background: scf's are coded differential in time domain. if you seek to the
-// desired postion it might happen that the baseline is missed and the resulting
-// scf is much too high (hissing noise). this hack uses the lowest scaling until
-// a non-differential scf could be decoded after seek. through this hack subbands
-// are faded out until there was at least a single non-differential scf found.
-#define SCF_HACK
+#define SEEKING_TABLE_SIZE 256u
+// set it to SLOW_SEEKING_WINDOW to not use fast seeking
+#define FAST_SEEKING_WINDOW 32
+// set it to FAST_SEEKING_WINDOW to only use fast seeking
+#define SLOW_SEEKING_WINDOW 0x80000000
enum {
- MPC_V_MEM = 2304,
- MPC_DECODER_MEMSIZE = 16384, // overall buffer size (words)
- MPC_SEEK_BUFFER_SIZE = 8192, // seek buffer size (words)
+ MPC_V_MEM = 2304,
+ MPC_DECODER_MEMSIZE = 16384, // overall buffer size
};
-typedef struct {
- mpc_int16_t L [36];
- mpc_int16_t R [36];
-} QuantTyp;
-
-typedef struct mpc_decoder_t {
- mpc_reader *r;
-
+struct mpc_decoder_t {
/// @name internal state variables
//@{
+ mpc_uint32_t stream_version; ///< Streamversion of stream
+ mpc_int32_t max_band; ///< Maximum band-index used in stream (0...31)
+ mpc_uint32_t ms; ///< Mid/side stereo (0: off, 1: on)
+ mpc_uint32_t channels; ///< Number of channels in stream
- mpc_uint32_t next;
- mpc_uint32_t dword; /// currently decoded 32bit-word
- mpc_uint32_t pos; /// bit-position within dword
- mpc_uint32_t *Speicher; /// read-buffer
- mpc_uint32_t Zaehler; /// actual index within read-buffer
- mpc_uint32_t Ring;
-
- mpc_uint32_t samples_to_skip;
- mpc_uint32_t last_block_samples;
- mpc_uint32_t FwdJumpInfo;
- mpc_uint32_t ActDecodePos;
-
-
- mpc_uint32_t DecodedFrames;
- mpc_uint32_t OverallFrames;
- mpc_int32_t SampleRate; // Sample frequency
-
- mpc_uint32_t StreamVersion; // version of bitstream
- mpc_int32_t Max_Band;
- mpc_uint32_t MPCHeaderPos; // AB: needed to support ID3v2
+ mpc_uint64_t samples; ///< Number of samples in stream
- mpc_uint32_t FrameWasValid;
- mpc_uint32_t MS_used; // MS-coding used ?
- mpc_uint32_t TrueGaplessPresent;
-
- mpc_uint32_t WordsRead; // counts amount of decoded dwords
+ mpc_uint64_t decoded_samples; ///< Number of samples decoded from file begining
+ mpc_uint32_t samples_to_skip; ///< Number samples to skip (used for seeking)
+ mpc_int32_t last_max_band; ///< number of bands used in the last frame
// randomizer state variables
- mpc_uint32_t __r1;
- mpc_uint32_t __r2;
-
- mpc_int8_t SCF_Index_L [32] [3];
- mpc_int8_t SCF_Index_R [32] [3]; // holds scalefactor-indices
- QuantTyp Q [32]; // holds quantized samples
- mpc_int8_t Res_L [32];
- mpc_int8_t Res_R [32]; // holds the chosen quantizer for each subband
-#ifdef MPC_SUPPORT_SV456
+ mpc_uint32_t __r1;
+ mpc_uint32_t __r2;
+
+ mpc_int32_t SCF_Index_L [32] [3];
+ mpc_int32_t SCF_Index_R [32] [3]; // holds scalefactor-indices
+ mpc_quantizer 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_bool_t DSCF_Flag_L [32];
mpc_bool_t DSCF_Flag_R [32]; // differential SCF used?
-#endif
- mpc_int8_t SCFI_L [32];
- mpc_int8_t SCFI_R [32]; // describes order of transmitted SCF
+ mpc_int32_t SCFI_L [32];
+ mpc_int32_t SCFI_R [32]; // describes order of transmitted SCF
mpc_bool_t MS_Flag[32]; // MS used?
-
- mpc_uint32_t SeekTableCounter; // used to sum up skip info, if SeekTable_Step != 1
- mpc_uint32_t MaxDecodedFrames; // Maximum frames decoded (indicates usable seek table entries)
- mpc_uint32_t* SeekTable; // seek table itself
- mpc_uint8_t SeekTable_Step; // 1<<SeekTable_Step = frames per table index
- mpc_uint32_t SeekTable_Mask; // used to avoid modulo-operation in seek
-
#ifdef MPC_FIXED_POINT
mpc_uint8_t 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)[32];
- MPC_SAMPLE_FORMAT (*Y_R)[32];
+ MPC_SAMPLE_FORMAT *Y_L;
+ MPC_SAMPLE_FORMAT *Y_R;
MPC_SAMPLE_FORMAT SCF[256]; ///< holds adapted scalefactors (for clipping prevention)
//@}
+};
-} mpc_decoder;
-
-#endif // _mpc_decoder_h
+#ifdef __cplusplus
+}
+#endif
+#endif