Universal Binary

CQTexperiment
vspader 2006-04-17 13:06:07 +00:00
parent fccfcf391c
commit 150e162c91
30 changed files with 5053 additions and 0 deletions

Binary file not shown.

View File

@ -0,0 +1,10 @@
libmpcdec is the result of the work of many people:
* Andree Buschmann and Frank Klemm
Original implementation and core development.
* Peter Pawlowski and Benoit Amiaux
Portability and further optimizations.
* Miles Egan
Port to pure C, documentation, and api refinements.

View File

@ -0,0 +1,31 @@
Copyright (c) 2005, The Musepack Development Team
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the The Musepack Development Team nor the
names of its contributors may be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@ -0,0 +1,23 @@
1.2
* 1.1.1 broke the API (BOOL type changed to mpc_bool_t). Version bumped to 1.2 to reflect the major change. Sorry to those who were caught by this error
* Fixed relative/absolute includes (#include "stuff.h" in /include/mpcdec, #include <mpcdec/stuff> in src/)
* Added msvc project files
* Changed mpc_reader_t structure, any specific data of the reader's
implementations should be hidden behind the (void*) data pointer. (example
in default implementation mpc_reader_file)
* Renamed to libmpcdec (to make room for libmpcenc)
1.1.1
* fix for fixed-point mode bug
1.1
* add compliance & cleanup patches from Michael Roitzsch of xine project
* switch to BSD license
* port to pure C
* add doxygen documentation
* revise API somewhat
1.0.3
* autotools build process
* sample binary added
* floating-point mode by default

View File

@ -0,0 +1,3 @@
How to install libmpcdec:
"./configure [--prefix=/usr] && make" as a regular user
"make install" as root

View File

@ -0,0 +1,6 @@
Musepack Decoder Library 1.2:
run "./configure; make"
To create a sample app using the musepack decoder library in src/
Check src/sample.cpp for more details.

View File

@ -0,0 +1,105 @@
/* include/config.h. Generated by configure. */
/* include/config.h.in. Generated from configure.ac by autoheader. */
/* Define to 1 if you have the <dlfcn.h> header file. */
#define HAVE_DLFCN_H 1
/* Define to 1 if you have the <inttypes.h> header file. */
#define HAVE_INTTYPES_H 1
/* Define to 1 if you have the `memmove' function. */
#define HAVE_MEMMOVE 1
/* Define to 1 if you have the <memory.h> header file. */
#define HAVE_MEMORY_H 1
/* Define to 1 if you have the `memset' function. */
#define HAVE_MEMSET 1
/* Define to 1 if the system has the type `ptrdiff_t'. */
#define HAVE_PTRDIFF_T 1
/* Define to 1 if you have the `sqrt' function. */
#define HAVE_SQRT 1
/* Define to 1 if stdbool.h conforms to C99. */
#define HAVE_STDBOOL_H 1
/* Define to 1 if you have the <stdint.h> header file. */
#define HAVE_STDINT_H 1
/* Define to 1 if you have the <stdlib.h> header file. */
#define HAVE_STDLIB_H 1
/* Define to 1 if you have the <strings.h> header file. */
#define HAVE_STRINGS_H 1
/* Define to 1 if you have the <string.h> header file. */
#define HAVE_STRING_H 1
/* Define to 1 if you have the <sys/stat.h> header file. */
#define HAVE_SYS_STAT_H 1
/* Define to 1 if you have the <sys/types.h> header file. */
#define HAVE_SYS_TYPES_H 1
/* Define to 1 if you have the <unistd.h> header file. */
#define HAVE_UNISTD_H 1
/* Define to 1 if the system has the type `_Bool'. */
#define HAVE__BOOL 1
/* Name of package */
#define PACKAGE "libmpcdec"
/* Define to the address where bug reports for this package should be sent. */
#define PACKAGE_BUGREPORT ""
/* Define to the full name of this package. */
#define PACKAGE_NAME ""
/* Define to the full name and version of this package. */
#define PACKAGE_STRING ""
/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME ""
/* Define to the version of this package. */
#define PACKAGE_VERSION ""
/* The size of a `int', as computed by sizeof. */
#define SIZEOF_INT 4
/* The size of a `long', as computed by sizeof. */
#define SIZEOF_LONG 4
/* The size of a `long long', as computed by sizeof. */
#define SIZEOF_LONG_LONG 8
/* The size of a `short', as computed by sizeof. */
#define SIZEOF_SHORT 2
/* Define to 1 if you have the ANSI C header files. */
#define STDC_HEADERS 1
/* Version number of package */
#define VERSION "1.2"
/* Define to 1 if your processor stores words with the most significant byte
first (like Motorola and SPARC, unlike Intel and VAX). */
#define WORDS_BIGENDIAN 1
/* Define to empty if `const' does not conform to ANSI C. */
/* #undef const */
/* Define to `__inline__' or `__inline' if that's what the C compiler
calls it, or to nothing if 'inline' is not supported under any name. */
#ifndef __cplusplus
/* #undef inline */
#endif
/* Define to `long' if <sys/types.h> does not define. */
/* #undef off_t */
/* Define to `unsigned' if <sys/types.h> does not define. */
/* #undef size_t */

View File

@ -0,0 +1,38 @@
/**
\mainpage libmpcdec documentation
\section whats what is libmpcdec
libmpcdec is a library that decodes musepack compressed audio data. Musepack
is a free, high performance, high quality lossy audio compression codec. For
more information on musepack visit http://www.musepack.net.
\section using using libmpcdec
Using libmpcdec is very straightforward. There are typically four things you must
do to use libmpcdec in your application.
\subsection step1 step 1: implement an mpc_reader to provide raw data to the decoder library
The role of the mpc_reader is to provide raw mpc stream data to the mpc decoding library.
This data can come from a file, a network socket, or any other source you wish.
See the documentation of
\link mpc_reader_t mpc_reader \endlink
for more information.
\subsection step2 step2: read the streaminfo properties structure from the stream
This is a simple matter of calling the streaminfo_init() and streaminfo_read() functions,
supplying your mpc_reader as a source of raw data. This reads the stream properties header from the
mpc stream. This information will be used to prime the decoder for decoding in
the next step.
\subsection step3 step 3: initialize an mpc_decoder with your mpc_reader source
This is just a matter of calling the mpc_decoder_setup() and mpc_decoder_initialize()
functions with your mpc_decoder, mpc_reader data source and streaminfo information.
\subsection step4 step 4: iteratively read raw sample data from the mpc decoder
Once you've initialized the decoding library you just iteratively call the
mpc_decoder_decode routine until it indicates that the entire stream has been read.
For a simple example of all of these steps see the sample application distributed with
libmpcdec in src/sample.cpp.
*/

View File

@ -0,0 +1,48 @@
/*
Copyright (c) 2005, The Musepack Development Team
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the The Musepack Development Team nor the
names of its contributors may be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __MUSEPACK_CONFIG_TYPES_H__
#define __MUSEPACK_CONFIG_TYPES_H__
typedef unsigned char mpc_bool_t;
#define TRUE 1
#define FALSE 0
typedef short mpc_int16_t;
typedef unsigned short mpc_uint16_t;
typedef int mpc_int32_t;
typedef unsigned int mpc_uint32_t;
typedef long long mpc_int64_t;
#endif // __MUSEPACK_CONFIG_TYPES_H__

View File

@ -0,0 +1,48 @@
/*
Copyright (c) 2005, The Musepack Development Team
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the The Musepack Development Team nor the
names of its contributors may be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __MUSEPACK_CONFIG_TYPES_H__
#define __MUSEPACK_CONFIG_TYPES_H__
typedef unsigned char mpc_bool_t;
#define TRUE 1
#define FALSE 0
typedef @SIZE16@ mpc_int16_t;
typedef @USIZE16@ mpc_uint16_t;
typedef @SIZE32@ mpc_int32_t;
typedef @USIZE32@ mpc_uint32_t;
typedef @SIZE64@ mpc_int64_t;
#endif // __MUSEPACK_CONFIG_TYPES_H__

View File

@ -0,0 +1,48 @@
/*
Copyright (c) 2005, The Musepack Development Team
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the The Musepack Development Team nor the
names of its contributors may be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __MUSEPACK_CONFIG_WIN32_H__
#define __MUSEPACK_CONFIG_WIN32_H__
typedef unsigned char mpc_bool_t;
#define TRUE 1
#define FALSE 0
typedef __int16 mpc_int16_t;
typedef unsigned __int16 mpc_uint16_t;
typedef __int32 mpc_int32_t;
typedef unsigned __int32 mpc_uint32_t;
typedef __int64 mpc_int64_t;
#endif // __MUSEPACK_CONFIG_WIN32_H__

View File

@ -0,0 +1,148 @@
/*
Copyright (c) 2005, The Musepack Development Team
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the The Musepack Development Team nor the
names of its contributors may be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(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_
#include "huffman.h"
#include "math.h"
#include "mpcdec.h"
#include "reader.h"
#include "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

View File

@ -0,0 +1,80 @@
/*
Copyright (c) 2005, The Musepack Development Team
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the The Musepack Development Team nor the
names of its contributors may be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(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 huffman.h
/// Data structures and functions for huffman coding.
#ifndef _mpcdec_huffman_h_
#define _mpcdec_huffman_h_
#ifndef WIN32
#include "mpcdec/config_types.h"
#else
#include "mpcdec/config_win32.h"
#endif
#include "decoder.h"
struct mpc_decoder_t; // forward declare to break circular dependencies
/// Huffman table entry.
typedef struct huffman_type_t {
mpc_uint32_t Code;
mpc_uint32_t Length;
mpc_int32_t Value;
} HuffmanTyp;
//! \brief Sorts huffman-tables by codeword.
//!
//! offset resulting value.
//! \param elements
//! \param Table table to sort
//! \param offset offset of resulting sort
void
mpc_decoder_resort_huff_tables(
const mpc_uint32_t elements, HuffmanTyp *Table, const mpc_int32_t offset);
/// Initializes sv6 huffman decoding structures.
void mpc_decoder_init_huffman_sv6(struct mpc_decoder_t *d);
/// Initializes sv6 huffman decoding tables.
void mpc_decoder_init_huffman_sv6_tables(struct mpc_decoder_t *d);
/// Initializes sv7 huffman decoding structures.
void mpc_decoder_init_huffman_sv7(struct mpc_decoder_t *d);
/// Initializes sv7 huffman decoding tables.
void mpc_decoder_init_huffman_sv7_tables(struct mpc_decoder_t *d);
#endif // _mpcdec_huffman_h_

View File

@ -0,0 +1,67 @@
/*
Copyright (c) 2005, The Musepack Development Team
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the The Musepack Development Team nor the
names of its contributors may be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(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 internal.h
/// Definitions and structures used only internally by the libmpcdec.
#ifndef _mpcdec_internal_h
#define _mpcdec_internal_h
enum {
MPC_DECODER_SYNTH_DELAY = 481
};
/// Big/little endian 32 bit byte swapping routine.
static __inline
mpc_uint32_t swap32(mpc_uint32_t val) {
const unsigned char* src = (const unsigned char*)&val;
return
(mpc_uint32_t)src[0] |
((mpc_uint32_t)src[1] << 8) | ((mpc_uint32_t)src[2] << 16) | ((mpc_uint32_t)src[3] << 24);
}
/// Searches for a ID3v2-tag and reads the length (in bytes) of it.
/// \param reader supplying raw stream data
/// \return size of tag, in bytes
/// \return -1 on errors of any kind
mpc_int32_t JumpID3v2(mpc_reader* fp);
/// helper functions used by multiple files
mpc_uint32_t mpc_random_int(mpc_decoder *d); // in synth_filter.c
void mpc_decoder_initialisiere_quantisierungstabellen(mpc_decoder *d, double scale_factor);
void mpc_decoder_synthese_filter_float(mpc_decoder *d, MPC_SAMPLE_FORMAT* OutData);
#endif // _mpcdec_internal_h

View File

@ -0,0 +1,144 @@
/*
Copyright (c) 2005, The Musepack Development Team
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the The Musepack Development Team nor the
names of its contributors may be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(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 math.h
/// Libmpcdec internal math routines.
#ifndef _mpcdec_math_h_
#define _mpcdec_math_h_
//#define MPC_FIXED_POINT
#define MPC_FIXED_POINT_SHIFT 16
#ifdef MPC_FIXED_POINT
#ifdef _WIN32_WCE
#include <cmnintrin.h>
#define MPC_HAVE_MULHIGH
#endif
#define MPC_FIXED_POINT_SCALE_SHIFT (MPC_FIXED_POINT_SHIFT + MPC_FIXED_POINT_FRACTPART)
#define MPC_FIXED_POINT_SCALE (1 << (MPC_FIXED_POINT_SCALE_SHIFT - 1))
//in fixedpoint mode, results in decode output buffer are in -MPC_FIXED_POINT_SCALE ... MPC_FIXED_POINT_SCALE range
#define MPC_FIXED_POINT_FRACTPART 14
typedef mpc_int32_t MPC_SAMPLE_FORMAT;
typedef mpc_int64_t MPC_SAMPLE_FORMAT_MULTIPLY;
#define MAKE_MPC_SAMPLE(X) (MPC_SAMPLE_FORMAT)((double)(X) * (double)(((mpc_int64_t)1)<<MPC_FIXED_POINT_FRACTPART))
#define MAKE_MPC_SAMPLE_EX(X,Y) (MPC_SAMPLE_FORMAT)((double)(X) * (double)(((mpc_int64_t)1)<<(Y)))
#define MPC_MULTIPLY_NOTRUNCATE(X,Y) \
(((MPC_SAMPLE_FORMAT_MULTIPLY)(X) * (MPC_SAMPLE_FORMAT_MULTIPLY)(Y)) >> MPC_FIXED_POINT_FRACTPART)
#define MPC_MULTIPLY_EX_NOTRUNCATE(X,Y,Z) \
(((MPC_SAMPLE_FORMAT_MULTIPLY)(X) * (MPC_SAMPLE_FORMAT_MULTIPLY)(Y)) >> (Z))
#ifdef _DEBUG
static inline MPC_SAMPLE_FORMAT MPC_MULTIPLY(MPC_SAMPLE_FORMAT item1,MPC_SAMPLE_FORMAT item2)
{
MPC_SAMPLE_FORMAT_MULTIPLY temp = MPC_MULTIPLY_NOTRUNCATE(item1,item2);
assert(temp == (MPC_SAMPLE_FORMAT_MULTIPLY)(MPC_SAMPLE_FORMAT)temp);
return (MPC_SAMPLE_FORMAT)temp;
}
static inline MPC_SAMPLE_FORMAT MPC_MULTIPLY_EX(MPC_SAMPLE_FORMAT item1,MPC_SAMPLE_FORMAT item2,unsigned shift)
{
MPC_SAMPLE_FORMAT_MULTIPLY temp = MPC_MULTIPLY_EX_NOTRUNCATE(item1,item2,shift);
assert(temp == (MPC_SAMPLE_FORMAT_MULTIPLY)(MPC_SAMPLE_FORMAT)temp);
return (MPC_SAMPLE_FORMAT)temp;
}
#else
#define MPC_MULTIPLY(X,Y) ((MPC_SAMPLE_FORMAT)MPC_MULTIPLY_NOTRUNCATE(X,Y))
#define MPC_MULTIPLY_EX(X,Y,Z) ((MPC_SAMPLE_FORMAT)MPC_MULTIPLY_EX_NOTRUNCATE(X,Y,Z))
#endif
#ifdef MPC_HAVE_MULHIGH
#define MPC_MULTIPLY_FRACT(X,Y) _MulHigh(X,Y)
#else
#define MPC_MULTIPLY_FRACT(X,Y) MPC_MULTIPLY_EX(X,Y,32)
#endif
#define MPC_MAKE_FRACT_CONST(X) (MPC_SAMPLE_FORMAT)((X) * (double)(((mpc_int64_t)1)<<32) )
#define MPC_MULTIPLY_FRACT_CONST(X,Y) MPC_MULTIPLY_FRACT(X,MPC_MAKE_FRACT_CONST(Y))
#define MPC_MULTIPLY_FRACT_CONST_FIX(X,Y,Z) ( MPC_MULTIPLY_FRACT(X,MPC_MAKE_FRACT_CONST( Y / (1<<(Z)) )) << (Z) )
#define MPC_MULTIPLY_FRACT_CONST_SHR(X,Y,Z) MPC_MULTIPLY_FRACT(X,MPC_MAKE_FRACT_CONST( Y / (1<<(Z)) ))
#define MPC_MULTIPLY_FLOAT_INT(X,Y) ((X)*(Y))
#define MPC_SCALE_CONST(X,Y,Z) MPC_MULTIPLY_EX(X,MAKE_MPC_SAMPLE_EX(Y,Z),(Z))
#define MPC_SCALE_CONST_SHL(X,Y,Z,S) MPC_MULTIPLY_EX(X,MAKE_MPC_SAMPLE_EX(Y,Z),(Z)-(S))
#define MPC_SCALE_CONST_SHR(X,Y,Z,S) MPC_MULTIPLY_EX(X,MAKE_MPC_SAMPLE_EX(Y,Z),(Z)+(S))
#define MPC_SHR(X,Y) ((X)>>(Y))
#define MPC_SHL(X,Y) ((X)<<(Y))
#else
//in floating-point mode, decoded samples are in -1...1 range
typedef float MPC_SAMPLE_FORMAT;
#define MAKE_MPC_SAMPLE(X) ((MPC_SAMPLE_FORMAT)(X))
#define MAKE_MPC_SAMPLE_EX(X,Y) ((MPC_SAMPLE_FORMAT)(X))
#define MPC_MULTIPLY_FRACT(X,Y) ((X)*(Y))
#define MPC_MAKE_FRACT_CONST(X) (X)
#define MPC_MULTIPLY_FRACT_CONST(X,Y) MPC_MULTPLY_FRACT(X,MPC_MAKE_FRACT_CONST(Y))
#define MPC_MULTIPLY_FRACT_CONST_SHR(X,Y,Z) MPC_MULTIPLY_FRACT(X,MPC_MAKE_FRACT_CONST( Y ))
#define MPC_MULTIPLY_FRACT_CONST_FIX(X,Y,Z) MPC_MULTIPLY_FRACT(X,MPC_MAKE_FRACT_CONST( Y ))
#define MPC_MULTIPLY_FLOAT_INT(X,Y) ((X)*(Y))
#define MPC_MULTIPLY(X,Y) ((X)*(Y))
#define MPC_MULTIPLY_EX(X,Y,Z) ((X)*(Y))
#define MPC_SCALE_CONST(X,Y,Z) ((X)*(Y))
#define MPC_SCALE_CONST_SHL(X,Y,Z,S) ((X)*(Y))
#define MPC_SCALE_CONST_SHR(X,Y,Z,S) ((X)*(Y))
#define MPC_SHR(X,Y) (X)
#define MPC_SHL(X,Y) (X)
#endif
#endif // _mpcdec_math_h_

View File

@ -0,0 +1,132 @@
/*
Copyright (c) 2005, The Musepack Development Team
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the The Musepack Development Team nor the
names of its contributors may be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(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 mpcdec.h
/// Top level include file for libmpcdec.
#ifndef _mpcdec_h_
#define _mpcdec_h_
#ifdef __cplusplus
extern "C" {
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifndef WIN32
#include "mpcdec/config_types.h"
#else
#include "mpcdec/config_win32.h"
#endif
#include "decoder.h"
#include "math.h"
#include "reader.h"
#include "streaminfo.h"
enum {
MPC_FRAME_LENGTH = (36 * 32), /// samples per mpc frame
MPC_DECODER_BUFFER_LENGTH = 4 * MPC_FRAME_LENGTH /// required buffer size for decoder
};
// error codes
#define ERROR_CODE_OK 0
#define ERROR_CODE_FILE -1
#define ERROR_CODE_SV7BETA 1
#define ERROR_CODE_CBR 2
#define ERROR_CODE_IS 3
#define ERROR_CODE_BLOCKSIZE 4
#define ERROR_CODE_INVALIDSV 5
/// Initializes a streaminfo structure.
/// \param si streaminfo structure to initialize
void mpc_streaminfo_init(mpc_streaminfo *si);
/// Reads streaminfo header from the mpc stream supplied by r.
/// \param si streaminfo pointer to which info will be written
/// \param r stream reader to supply raw data
/// \return error code
mpc_int32_t mpc_streaminfo_read(mpc_streaminfo *si, mpc_reader *r);
/// Gets length of stream si, in seconds.
/// \return length of stream in seconds
double mpc_streaminfo_get_length(mpc_streaminfo *si);
/// Returns length of stream si, in samples.
/// \return length of stream in samples
mpc_int64_t mpc_streaminfo_get_length_samples(mpc_streaminfo *si);
/// Sets up decoder library.
/// Call this first when preparing to decode an mpc stream.
/// \param r reader that will supply raw data to the decoder
void mpc_decoder_setup(mpc_decoder *d, mpc_reader *r);
/// Initializes mpc decoder with the supplied stream info parameters.
/// Call this next after calling mpc_decoder_setup.
/// \param si streaminfo structure indicating format of source stream
/// \return TRUE if decoder was initalized successfully, FALSE otherwise
mpc_bool_t mpc_decoder_initialize(mpc_decoder *d, mpc_streaminfo *si);
/// Sets decoder sample scaling factor. All decoded samples will be multiplied
/// by this factor.
/// \param scale_factor multiplicative scaling factor
void mpc_decoder_scale_output(mpc_decoder *d, double scale_factor);
/// Actually reads data from previously initialized stream. Call
/// this iteratively to decode the mpc stream.
/// \param buffer destination buffer for decoded samples
/// \param vbr_update_acc \todo document me
/// \param vbr_update_bits \todo document me
/// \return -1 if an error is encountered
/// \return 0 if the stream has been completely decoded successfully and there are no more samples
/// \return > 0 to indicate the number of bytes that were actually read from the stream.
mpc_uint32_t mpc_decoder_decode(
mpc_decoder *d,
MPC_SAMPLE_FORMAT *buffer,
mpc_uint32_t *vbr_update_acc,
mpc_uint32_t *vbr_update_bits);
/// Seeks to the specified sample in the source stream.
mpc_bool_t mpc_decoder_seek_sample(mpc_decoder *d, mpc_int64_t destsample);
/// Seeks to specified position in seconds in the source stream.
mpc_bool_t mpc_decoder_seek_seconds(mpc_decoder *d, double seconds);
#ifdef __cplusplus
}
#endif // __cplusplus
#endif // _mpcdec_h_

View File

@ -0,0 +1,82 @@
/*
Copyright (c) 2005, The Musepack Development Team
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the The Musepack Development Team nor the
names of its contributors may be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(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 reader.h
#ifndef _mpcdec_reader_h_
#define _mpcdec_reader_h_
/// \brief Stream reader interface structure.
///
/// This is the structure you must supply to the musepack decoding library
/// to feed it with raw data. Implement the five member functions to provide
/// a functional reader.
typedef struct mpc_reader_t {
/// Reads size bytes of data into buffer at ptr.
mpc_int32_t (*read)(void *t, void *ptr, mpc_int32_t size);
/// Seeks to byte position offset.
mpc_bool_t (*seek)(void *t, mpc_int32_t offset);
/// Returns the current byte offset in the stream.
mpc_int32_t (*tell)(void *t);
/// Returns the total length of the source stream, in bytes.
mpc_int32_t (*get_size)(void *t);
/// True if the stream is a seekable stream.
mpc_bool_t (*canseek)(void *t);
/// Field that can be used to identify a particular instance of
/// reader or carry along data associated with that reader.
void *data;
} mpc_reader;
typedef struct mpc_reader_file_t {
mpc_reader reader;
FILE *file;
long file_size;
mpc_bool_t is_seekable;
} mpc_reader_file;
/// Initializes reader with default stdio file reader implementation. Use
/// this if you're just reading from a plain file.
///
/// \param r reader struct to initalize
/// \param input input stream to attach to the reader
void mpc_reader_setup_file_reader(mpc_reader_file *r, FILE *input);
#endif // _mpcdec_reader_h_

View File

@ -0,0 +1,51 @@
/*
Copyright (c) 2005, The Musepack Development Team
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the The Musepack Development Team nor the
names of its contributors may be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(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 requant.h
/// Requantization function definitions.
#ifndef _mpcdec_requant_h
#define _mpcdec_requant_h_
#include "mpcdec.h"
/* C O N S T A N T S */
extern const mpc_uint32_t Res_bit [18]; // bits per sample for chosen quantizer
extern const MPC_SAMPLE_FORMAT __Cc [1 + 18]; // coefficients for requantization
extern const mpc_int32_t __Dc [1 + 18]; // offset for requantization
#define Cc (__Cc + 1)
#define Dc (__Dc + 1)
#endif // _mpcdec_requant_h_

View File

@ -0,0 +1,86 @@
/*
Copyright (c) 2005, The Musepack Development Team
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the The Musepack Development Team nor the
names of its contributors may be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(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 streaminfo.h
#ifndef _mpcdec_streaminfo_h_
#define _mpcdec_streaminfo_h_
typedef mpc_int32_t mpc_streaminfo_off_t;
/// \brief mpc stream properties structure
///
/// Structure containing all the properties of an mpc stream. Populated
/// by the streaminfo_read function.
typedef struct mpc_streaminfo {
/// @name core mpc stream properties
//@{
mpc_uint32_t sample_freq; ///< sample frequency of stream
mpc_uint32_t channels; ///< number of channels in stream
mpc_streaminfo_off_t header_position; ///< byte offset of position of header in stream
mpc_uint32_t stream_version; ///< streamversion of stream
mpc_uint32_t bitrate; ///< bitrate of stream file (in bps)
double average_bitrate; ///< average bitrate of stream (in bits/sec)
mpc_uint32_t frames; ///< number of frames in stream
mpc_int64_t pcm_samples;
mpc_uint32_t max_band; ///< maximum band-index used in stream (0...31)
mpc_uint32_t is; ///< intensity stereo (0: off, 1: on)
mpc_uint32_t ms; ///< mid/side stereo (0: off, 1: on)
mpc_uint32_t block_size; ///< only needed for SV4...SV6 -> not supported
mpc_uint32_t profile; ///< quality profile of stream
const char* profile_name; ///< name of profile used by stream
//@}
/// @name replaygain related fields
//@{
mpc_int16_t gain_title; ///< replaygain title value
mpc_int16_t gain_album; ///< replaygain album value
mpc_uint16_t peak_album; ///< peak album loudness level
mpc_uint16_t peak_title; ///< peak title loudness level
//@}
/// @name true gapless support data
//@{
mpc_uint32_t is_true_gapless; ///< true gapless? (0: no, 1: yes)
mpc_uint32_t last_frame_samples; ///< number of valid samples within last frame
mpc_uint32_t encoder_version; ///< version of encoder used
char encoder[256]; ///< encoder name
mpc_streaminfo_off_t tag_offset; ///< offset to file tags
mpc_streaminfo_off_t total_file_length; ///< total length of underlying file
//@}
} mpc_streaminfo;
#endif // _mpcdec_streaminfo_h_

View File

@ -0,0 +1,268 @@
/*
Copyright (c) 2005, The Musepack Development Team
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the The Musepack Development Team nor the
names of its contributors may be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(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 huffsv46.c
/// Implementations of huffman decoding for streamversions < 7.
#include <mpcdec/mpcdec.h>
#include <mpcdec/requant.h>
#include <mpcdec/huffman.h>
void
mpc_decoder_init_huffman_sv6(mpc_decoder *d)
{
mpc_decoder_init_huffman_sv6_tables(d);
mpc_decoder_resort_huff_tables(16, d->Region_A , 0);
mpc_decoder_resort_huff_tables( 8, d->Region_B , 0);
mpc_decoder_resort_huff_tables( 4, d->Region_C , 0);
mpc_decoder_resort_huff_tables( 8, d->SCFI_Bundle , 0);
mpc_decoder_resort_huff_tables(13, d->DSCF_Entropie , 6);
mpc_decoder_resort_huff_tables( 3, d->Entropie_1 , Dc[1]);
mpc_decoder_resort_huff_tables( 5, d->Entropie_2 , Dc[2]);
mpc_decoder_resort_huff_tables( 7, d->Entropie_3 , Dc[3]);
mpc_decoder_resort_huff_tables( 9, d->Entropie_4 , Dc[4]);
mpc_decoder_resort_huff_tables(15, d->Entropie_5 , Dc[5]);
mpc_decoder_resort_huff_tables(31, d->Entropie_6 , Dc[6]);
mpc_decoder_resort_huff_tables(63, d->Entropie_7 , Dc[7]);
}
void
mpc_decoder_init_huffman_sv6_tables(mpc_decoder *d)
{
// SCFI-bundle
d->SCFI_Bundle[7].Code= 1; d->SCFI_Bundle[7].Length= 1;
d->SCFI_Bundle[3].Code= 1; d->SCFI_Bundle[3].Length= 2;
d->SCFI_Bundle[5].Code= 0; d->SCFI_Bundle[5].Length= 3;
d->SCFI_Bundle[1].Code= 7; d->SCFI_Bundle[1].Length= 5;
d->SCFI_Bundle[2].Code= 6; d->SCFI_Bundle[2].Length= 5;
d->SCFI_Bundle[4].Code= 4; d->SCFI_Bundle[4].Length= 5;
d->SCFI_Bundle[0].Code= 11; d->SCFI_Bundle[0].Length= 6;
d->SCFI_Bundle[6].Code= 10; d->SCFI_Bundle[6].Length= 6;
// region A (subbands 0..10)
d->Region_A[ 1].Code= 1; d->Region_A[ 1].Length= 1;
d->Region_A[ 2].Code= 0; d->Region_A[ 2].Length= 2;
d->Region_A[ 0].Code= 2; d->Region_A[ 0].Length= 3;
d->Region_A[ 3].Code= 15; d->Region_A[ 3].Length= 5;
d->Region_A[ 5].Code= 13; d->Region_A[ 5].Length= 5;
d->Region_A[ 6].Code= 12; d->Region_A[ 6].Length= 5;
d->Region_A[ 4].Code= 29; d->Region_A[ 4].Length= 6;
d->Region_A[ 7].Code= 57; d->Region_A[ 7].Length= 7;
d->Region_A[ 8].Code= 113; d->Region_A[ 8].Length= 8;
d->Region_A[ 9].Code= 225; d->Region_A[ 9].Length= 9;
d->Region_A[10].Code= 449; d->Region_A[10].Length= 10;
d->Region_A[11].Code= 897; d->Region_A[11].Length= 11;
d->Region_A[12].Code= 1793; d->Region_A[12].Length= 12;
d->Region_A[13].Code= 3585; d->Region_A[13].Length= 13;
d->Region_A[14].Code= 7169; d->Region_A[14].Length= 14;
d->Region_A[15].Code= 7168; d->Region_A[15].Length= 14;
// region B (subbands 11..22)
d->Region_B[1].Code= 1; d->Region_B[1].Length= 1;
d->Region_B[0].Code= 1; d->Region_B[0].Length= 2;
d->Region_B[2].Code= 1; d->Region_B[2].Length= 3;
d->Region_B[3].Code= 1; d->Region_B[3].Length= 4;
d->Region_B[4].Code= 1; d->Region_B[4].Length= 5;
d->Region_B[5].Code= 1; d->Region_B[5].Length= 6;
d->Region_B[6].Code= 1; d->Region_B[6].Length= 7;
d->Region_B[7].Code= 0; d->Region_B[7].Length= 7;
// region C (subbands 23..31)
d->Region_C[0].Code= 1; d->Region_C[0].Length= 1;
d->Region_C[1].Code= 1; d->Region_C[1].Length= 2;
d->Region_C[2].Code= 1; d->Region_C[2].Length= 3;
d->Region_C[3].Code= 0; d->Region_C[3].Length= 3;
// DSCF
d->DSCF_Entropie[ 6].Code= 0; d->DSCF_Entropie[ 6].Length= 2;
d->DSCF_Entropie[ 7].Code= 7; d->DSCF_Entropie[ 7].Length= 3;
d->DSCF_Entropie[ 5].Code= 4; d->DSCF_Entropie[ 5].Length= 3;
d->DSCF_Entropie[ 8].Code= 3; d->DSCF_Entropie[ 8].Length= 3;
d->DSCF_Entropie[ 9].Code= 13; d->DSCF_Entropie[ 9].Length= 4;
d->DSCF_Entropie[ 4].Code= 11; d->DSCF_Entropie[ 4].Length= 4;
d->DSCF_Entropie[10].Code= 10; d->DSCF_Entropie[10].Length= 4;
d->DSCF_Entropie[ 2].Code= 4; d->DSCF_Entropie[ 2].Length= 4;
d->DSCF_Entropie[11].Code= 25; d->DSCF_Entropie[11].Length= 5;
d->DSCF_Entropie[ 3].Code= 24; d->DSCF_Entropie[ 3].Length= 5;
d->DSCF_Entropie[ 1].Code= 11; d->DSCF_Entropie[ 1].Length= 5;
d->DSCF_Entropie[12].Code= 21; d->DSCF_Entropie[12].Length= 6;
d->DSCF_Entropie[ 0].Code= 20; d->DSCF_Entropie[ 0].Length= 6;
// first quantizer
d->Entropie_1[1].Code= 1; d->Entropie_1[1].Length= 1;
d->Entropie_1[0].Code= 1; d->Entropie_1[0].Length= 2;
d->Entropie_1[2].Code= 0; d->Entropie_1[2].Length= 2;
// second quantizer
d->Entropie_2[2].Code= 3; d->Entropie_2[2].Length= 2;
d->Entropie_2[3].Code= 1; d->Entropie_2[3].Length= 2;
d->Entropie_2[1].Code= 0; d->Entropie_2[1].Length= 2;
d->Entropie_2[4].Code= 5; d->Entropie_2[4].Length= 3;
d->Entropie_2[0].Code= 4; d->Entropie_2[0].Length= 3;
// third quantizer
d->Entropie_3[3].Code= 3; d->Entropie_3[3].Length= 2;
d->Entropie_3[2].Code= 1; d->Entropie_3[2].Length= 2;
d->Entropie_3[4].Code= 0; d->Entropie_3[4].Length= 2;
d->Entropie_3[1].Code= 5; d->Entropie_3[1].Length= 3;
d->Entropie_3[5].Code= 9; d->Entropie_3[5].Length= 4;
d->Entropie_3[0].Code= 17; d->Entropie_3[0].Length= 5;
d->Entropie_3[6].Code= 16; d->Entropie_3[6].Length= 5;
// forth quantizer
d->Entropie_4[4].Code= 0; d->Entropie_4[4].Length= 2;
d->Entropie_4[5].Code= 6; d->Entropie_4[5].Length= 3;
d->Entropie_4[3].Code= 5; d->Entropie_4[3].Length= 3;
d->Entropie_4[6].Code= 4; d->Entropie_4[6].Length= 3;
d->Entropie_4[2].Code= 3; d->Entropie_4[2].Length= 3;
d->Entropie_4[7].Code= 15; d->Entropie_4[7].Length= 4;
d->Entropie_4[1].Code= 14; d->Entropie_4[1].Length= 4;
d->Entropie_4[0].Code= 5; d->Entropie_4[0].Length= 4;
d->Entropie_4[8].Code= 4; d->Entropie_4[8].Length= 4;
// fifth quantizer
d->Entropie_5[7 ].Code= 4; d->Entropie_5[7 ].Length= 3;
d->Entropie_5[8 ].Code= 3; d->Entropie_5[8 ].Length= 3;
d->Entropie_5[6 ].Code= 2; d->Entropie_5[6 ].Length= 3;
d->Entropie_5[9 ].Code= 0; d->Entropie_5[9 ].Length= 3;
d->Entropie_5[5 ].Code= 15; d->Entropie_5[5 ].Length= 4;
d->Entropie_5[4 ].Code= 13; d->Entropie_5[4 ].Length= 4;
d->Entropie_5[10].Code= 12; d->Entropie_5[10].Length= 4;
d->Entropie_5[11].Code= 10; d->Entropie_5[11].Length= 4;
d->Entropie_5[3 ].Code= 3; d->Entropie_5[3 ].Length= 4;
d->Entropie_5[12].Code= 2; d->Entropie_5[12].Length= 4;
d->Entropie_5[2 ].Code= 29; d->Entropie_5[2 ].Length= 5;
d->Entropie_5[1 ].Code= 23; d->Entropie_5[1 ].Length= 5;
d->Entropie_5[13].Code= 22; d->Entropie_5[13].Length= 5;
d->Entropie_5[0 ].Code= 57; d->Entropie_5[0 ].Length= 6;
d->Entropie_5[14].Code= 56; d->Entropie_5[14].Length= 6;
// sixth quantizer
d->Entropie_6[15].Code= 9; d->Entropie_6[15].Length= 4;
d->Entropie_6[16].Code= 8; d->Entropie_6[16].Length= 4;
d->Entropie_6[14].Code= 7; d->Entropie_6[14].Length= 4;
d->Entropie_6[18].Code= 6; d->Entropie_6[18].Length= 4;
d->Entropie_6[17].Code= 5; d->Entropie_6[17].Length= 4;
d->Entropie_6[12].Code= 3; d->Entropie_6[12].Length= 4;
d->Entropie_6[13].Code= 2; d->Entropie_6[13].Length= 4;
d->Entropie_6[19].Code= 0; d->Entropie_6[19].Length= 4;
d->Entropie_6[11].Code= 31; d->Entropie_6[11].Length= 5;
d->Entropie_6[20].Code= 30; d->Entropie_6[20].Length= 5;
d->Entropie_6[10].Code= 29; d->Entropie_6[10].Length= 5;
d->Entropie_6[9 ].Code= 27; d->Entropie_6[9 ].Length= 5;
d->Entropie_6[21].Code= 26; d->Entropie_6[21].Length= 5;
d->Entropie_6[22].Code= 25; d->Entropie_6[22].Length= 5;
d->Entropie_6[8 ].Code= 24; d->Entropie_6[8 ].Length= 5;
d->Entropie_6[7 ].Code= 23; d->Entropie_6[7 ].Length= 5;
d->Entropie_6[23].Code= 21; d->Entropie_6[23].Length= 5;
d->Entropie_6[6 ].Code= 9; d->Entropie_6[6 ].Length= 5;
d->Entropie_6[24].Code= 3; d->Entropie_6[24].Length= 5;
d->Entropie_6[25].Code= 57; d->Entropie_6[25].Length= 6;
d->Entropie_6[5 ].Code= 56; d->Entropie_6[5 ].Length= 6;
d->Entropie_6[4 ].Code= 45; d->Entropie_6[4 ].Length= 6;
d->Entropie_6[26].Code= 41; d->Entropie_6[26].Length= 6;
d->Entropie_6[2 ].Code= 40; d->Entropie_6[2 ].Length= 6;
d->Entropie_6[27].Code= 17; d->Entropie_6[27].Length= 6;
d->Entropie_6[28].Code= 16; d->Entropie_6[28].Length= 6;
d->Entropie_6[3 ].Code= 5; d->Entropie_6[3 ].Length= 6;
d->Entropie_6[29].Code= 89; d->Entropie_6[29].Length= 7;
d->Entropie_6[1 ].Code= 88; d->Entropie_6[1 ].Length= 7;
d->Entropie_6[30].Code= 9; d->Entropie_6[30].Length= 7;
d->Entropie_6[0 ].Code= 8; d->Entropie_6[0 ].Length= 7;
// seventh quantizer
d->Entropie_7[25].Code= 0; d->Entropie_7[25].Length= 5;
d->Entropie_7[37].Code= 1; d->Entropie_7[37].Length= 5;
d->Entropie_7[62].Code= 16; d->Entropie_7[62].Length= 8;
d->Entropie_7[ 0].Code= 17; d->Entropie_7[ 0].Length= 8;
d->Entropie_7[ 3].Code= 9; d->Entropie_7[ 3].Length= 7;
d->Entropie_7[ 5].Code= 10; d->Entropie_7[ 5].Length= 7;
d->Entropie_7[ 6].Code= 11; d->Entropie_7[ 6].Length= 7;
d->Entropie_7[38].Code= 3; d->Entropie_7[38].Length= 5;
d->Entropie_7[35].Code= 4; d->Entropie_7[35].Length= 5;
d->Entropie_7[33].Code= 5; d->Entropie_7[33].Length= 5;
d->Entropie_7[24].Code= 6; d->Entropie_7[24].Length= 5;
d->Entropie_7[27].Code= 7; d->Entropie_7[27].Length= 5;
d->Entropie_7[26].Code= 8; d->Entropie_7[26].Length= 5;
d->Entropie_7[12].Code= 18; d->Entropie_7[12].Length= 6;
d->Entropie_7[50].Code= 19; d->Entropie_7[50].Length= 6;
d->Entropie_7[29].Code= 10; d->Entropie_7[29].Length= 5;
d->Entropie_7[31].Code= 11; d->Entropie_7[31].Length= 5;
d->Entropie_7[36].Code= 12; d->Entropie_7[36].Length= 5;
d->Entropie_7[34].Code= 13; d->Entropie_7[34].Length= 5;
d->Entropie_7[28].Code= 14; d->Entropie_7[28].Length= 5;
d->Entropie_7[49].Code= 30; d->Entropie_7[49].Length= 6;
d->Entropie_7[56].Code= 62; d->Entropie_7[56].Length= 7;
d->Entropie_7[ 7].Code= 63; d->Entropie_7[ 7].Length= 7;
d->Entropie_7[32].Code= 16; d->Entropie_7[32].Length= 5;
d->Entropie_7[30].Code= 17; d->Entropie_7[30].Length= 5;
d->Entropie_7[13].Code= 36; d->Entropie_7[13].Length= 6;
d->Entropie_7[55].Code= 74; d->Entropie_7[55].Length= 7;
d->Entropie_7[61].Code= 150; d->Entropie_7[61].Length= 8;
d->Entropie_7[ 1].Code= 151; d->Entropie_7[ 1].Length= 8;
d->Entropie_7[14].Code= 38; d->Entropie_7[14].Length= 6;
d->Entropie_7[48].Code= 39; d->Entropie_7[48].Length= 6;
d->Entropie_7[ 4].Code= 80; d->Entropie_7[ 4].Length= 7;
d->Entropie_7[58].Code= 81; d->Entropie_7[58].Length= 7;
d->Entropie_7[47].Code= 41; d->Entropie_7[47].Length= 6;
d->Entropie_7[15].Code= 42; d->Entropie_7[15].Length= 6;
d->Entropie_7[16].Code= 43; d->Entropie_7[16].Length= 6;
d->Entropie_7[54].Code= 88; d->Entropie_7[54].Length= 7;
d->Entropie_7[ 8].Code= 89; d->Entropie_7[ 8].Length= 7;
d->Entropie_7[17].Code= 45; d->Entropie_7[17].Length= 6;
d->Entropie_7[46].Code= 46; d->Entropie_7[46].Length= 6;
d->Entropie_7[45].Code= 47; d->Entropie_7[45].Length= 6;
d->Entropie_7[53].Code= 96; d->Entropie_7[53].Length= 7;
d->Entropie_7[ 9].Code= 97; d->Entropie_7[ 9].Length= 7;
d->Entropie_7[43].Code= 49; d->Entropie_7[43].Length= 6;
d->Entropie_7[19].Code= 50; d->Entropie_7[19].Length= 6;
d->Entropie_7[18].Code= 51; d->Entropie_7[18].Length= 6;
d->Entropie_7[44].Code= 52; d->Entropie_7[44].Length= 6;
d->Entropie_7[ 2].Code= 212; d->Entropie_7[ 2].Length= 8;
d->Entropie_7[60].Code= 213; d->Entropie_7[60].Length= 8;
d->Entropie_7[10].Code= 107; d->Entropie_7[10].Length= 7;
d->Entropie_7[42].Code= 54; d->Entropie_7[42].Length= 6;
d->Entropie_7[41].Code= 55; d->Entropie_7[41].Length= 6;
d->Entropie_7[20].Code= 56; d->Entropie_7[20].Length= 6;
d->Entropie_7[21].Code= 57; d->Entropie_7[21].Length= 6;
d->Entropie_7[52].Code= 116; d->Entropie_7[52].Length= 7;
d->Entropie_7[51].Code= 117; d->Entropie_7[51].Length= 7;
d->Entropie_7[40].Code= 59; d->Entropie_7[40].Length= 6;
d->Entropie_7[22].Code= 60; d->Entropie_7[22].Length= 6;
d->Entropie_7[23].Code= 61; d->Entropie_7[23].Length= 6;
d->Entropie_7[39].Code= 62; d->Entropie_7[39].Length= 6;
d->Entropie_7[11].Code= 126; d->Entropie_7[11].Length= 7;
d->Entropie_7[57].Code= 254; d->Entropie_7[57].Length= 8;
d->Entropie_7[59].Code= 255; d->Entropie_7[59].Length= 8;
}

View File

@ -0,0 +1,500 @@
/*
Copyright (c) 2005, The Musepack Development Team
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the The Musepack Development Team nor the
names of its contributors may be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(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 huffsv7.c
/// Implementations of sv7 huffman decoding functions.
#include <mpcdec/mpcdec.h>
#include <mpcdec/huffman.h>
#include <mpcdec/requant.h>
void
mpc_decoder_init_huffman_sv7(mpc_decoder *d)
{
mpc_decoder_init_huffman_sv7_tables(d);
mpc_decoder_resort_huff_tables(10, &(d->HuffHdr[0]) , 5);
mpc_decoder_resort_huff_tables( 4, &(d->HuffSCFI[0]) , 0);
mpc_decoder_resort_huff_tables(16, &(d->HuffDSCF[0]) , 7);
mpc_decoder_resort_huff_tables(27, &(d->HuffQ1[0][0]) , 0);
mpc_decoder_resort_huff_tables(27, &(d->HuffQ1[1][0]) , 0);
mpc_decoder_resort_huff_tables(25, &(d->HuffQ2[0][0]) , 0);
mpc_decoder_resort_huff_tables(25, &(d->HuffQ2[1][0]) , 0);
mpc_decoder_resort_huff_tables( 7, &(d->HuffQ3[0][0]) , Dc[3]);
mpc_decoder_resort_huff_tables( 7, &(d->HuffQ3[1][0]) , Dc[3]);
mpc_decoder_resort_huff_tables( 9, &(d->HuffQ4[0][0]) , Dc[4]);
mpc_decoder_resort_huff_tables( 9, &(d->HuffQ4[1][0]) , Dc[4]);
mpc_decoder_resort_huff_tables(15, &(d->HuffQ5[0][0]) , Dc[5]);
mpc_decoder_resort_huff_tables(15, &(d->HuffQ5[1][0]) , Dc[5]);
mpc_decoder_resort_huff_tables(31, &(d->HuffQ6[0][0]) , Dc[6]);
mpc_decoder_resort_huff_tables(31, &(d->HuffQ6[1][0]) , Dc[6]);
mpc_decoder_resort_huff_tables(63, &(d->HuffQ7[0][0]) , Dc[7]);
mpc_decoder_resort_huff_tables(63, &(d->HuffQ7[1][0]) , Dc[7]);
}
void
mpc_decoder_init_huffman_sv7_tables(mpc_decoder *d)
{
/***************************** SCFI *******************************/
d->HuffSCFI[0].Code = 2; d->HuffSCFI[0].Length = 3;
d->HuffSCFI[1].Code = 1; d->HuffSCFI[1].Length = 1;
d->HuffSCFI[2].Code = 3; d->HuffSCFI[2].Length = 3;
d->HuffSCFI[3].Code = 0; d->HuffSCFI[3].Length = 2;
/***************************** DSCF *******************************/
d->HuffDSCF[ 0].Code = 32; d->HuffDSCF[ 0].Length = 6;
d->HuffDSCF[ 1].Code = 4; d->HuffDSCF[ 1].Length = 5;
d->HuffDSCF[ 2].Code = 17; d->HuffDSCF[ 2].Length = 5;
d->HuffDSCF[ 3].Code = 30; d->HuffDSCF[ 3].Length = 5;
d->HuffDSCF[ 4].Code = 13; d->HuffDSCF[ 4].Length = 4;
d->HuffDSCF[ 5].Code = 0; d->HuffDSCF[ 5].Length = 3;
d->HuffDSCF[ 6].Code = 3; d->HuffDSCF[ 6].Length = 3;
d->HuffDSCF[ 7].Code = 9; d->HuffDSCF[ 7].Length = 4;
d->HuffDSCF[ 8].Code = 5; d->HuffDSCF[ 8].Length = 3;
d->HuffDSCF[ 9].Code = 2; d->HuffDSCF[ 9].Length = 3;
d->HuffDSCF[10].Code = 14; d->HuffDSCF[10].Length = 4;
d->HuffDSCF[11].Code = 3; d->HuffDSCF[11].Length = 4;
d->HuffDSCF[12].Code = 31; d->HuffDSCF[12].Length = 5;
d->HuffDSCF[13].Code = 5; d->HuffDSCF[13].Length = 5;
d->HuffDSCF[14].Code = 33; d->HuffDSCF[14].Length = 6;
d->HuffDSCF[15].Code = 12; d->HuffDSCF[15].Length = 4;
/************************* frame-header ***************************/
/***************** differential quantizer indizes *****************/
d->HuffHdr[0].Code = 92; d->HuffHdr[0].Length = 8;
d->HuffHdr[1].Code = 47; d->HuffHdr[1].Length = 7;
d->HuffHdr[2].Code = 10; d->HuffHdr[2].Length = 5;
d->HuffHdr[3].Code = 4; d->HuffHdr[3].Length = 4;
d->HuffHdr[4].Code = 0; d->HuffHdr[4].Length = 2;
d->HuffHdr[5].Code = 1; d->HuffHdr[5].Length = 1;
d->HuffHdr[6].Code = 3; d->HuffHdr[6].Length = 3;
d->HuffHdr[7].Code = 22; d->HuffHdr[7].Length = 6;
d->HuffHdr[8].Code = 187; d->HuffHdr[8].Length = 9;
d->HuffHdr[9].Code = 186; d->HuffHdr[9].Length = 9;
/********************** 3-step quantizer **************************/
/********************* 3 bundled samples **************************/
//less shaped, book 0
d->HuffQ1[0][ 0].Code = 54; d->HuffQ1[0][ 0].Length = 6;
d->HuffQ1[0][ 1].Code = 9; d->HuffQ1[0][ 1].Length = 5;
d->HuffQ1[0][ 2].Code = 32; d->HuffQ1[0][ 2].Length = 6;
d->HuffQ1[0][ 3].Code = 5; d->HuffQ1[0][ 3].Length = 5;
d->HuffQ1[0][ 4].Code = 10; d->HuffQ1[0][ 4].Length = 4;
d->HuffQ1[0][ 5].Code = 7; d->HuffQ1[0][ 5].Length = 5;
d->HuffQ1[0][ 6].Code = 52; d->HuffQ1[0][ 6].Length = 6;
d->HuffQ1[0][ 7].Code = 0; d->HuffQ1[0][ 7].Length = 5;
d->HuffQ1[0][ 8].Code = 35; d->HuffQ1[0][ 8].Length = 6;
d->HuffQ1[0][ 9].Code = 10; d->HuffQ1[0][ 9].Length = 5;
d->HuffQ1[0][10].Code = 6; d->HuffQ1[0][10].Length = 4;
d->HuffQ1[0][11].Code = 4; d->HuffQ1[0][11].Length = 5;
d->HuffQ1[0][12].Code = 11; d->HuffQ1[0][12].Length = 4;
d->HuffQ1[0][13].Code = 7; d->HuffQ1[0][13].Length = 3;
d->HuffQ1[0][14].Code = 12; d->HuffQ1[0][14].Length = 4;
d->HuffQ1[0][15].Code = 3; d->HuffQ1[0][15].Length = 5;
d->HuffQ1[0][16].Code = 7; d->HuffQ1[0][16].Length = 4;
d->HuffQ1[0][17].Code = 11; d->HuffQ1[0][17].Length = 5;
d->HuffQ1[0][18].Code = 34; d->HuffQ1[0][18].Length = 6;
d->HuffQ1[0][19].Code = 1; d->HuffQ1[0][19].Length = 5;
d->HuffQ1[0][20].Code = 53; d->HuffQ1[0][20].Length = 6;
d->HuffQ1[0][21].Code = 6; d->HuffQ1[0][21].Length = 5;
d->HuffQ1[0][22].Code = 9; d->HuffQ1[0][22].Length = 4;
d->HuffQ1[0][23].Code = 2; d->HuffQ1[0][23].Length = 5;
d->HuffQ1[0][24].Code = 33; d->HuffQ1[0][24].Length = 6;
d->HuffQ1[0][25].Code = 8; d->HuffQ1[0][25].Length = 5;
d->HuffQ1[0][26].Code = 55; d->HuffQ1[0][26].Length = 6;
//more shaped, book 1
d->HuffQ1[1][ 0].Code = 103; d->HuffQ1[1][ 0].Length = 8;
d->HuffQ1[1][ 1].Code = 62; d->HuffQ1[1][ 1].Length = 7;
d->HuffQ1[1][ 2].Code = 225; d->HuffQ1[1][ 2].Length = 9;
d->HuffQ1[1][ 3].Code = 55; d->HuffQ1[1][ 3].Length = 7;
d->HuffQ1[1][ 4].Code = 3; d->HuffQ1[1][ 4].Length = 4;
d->HuffQ1[1][ 5].Code = 52; d->HuffQ1[1][ 5].Length = 7;
d->HuffQ1[1][ 6].Code = 101; d->HuffQ1[1][ 6].Length = 8;
d->HuffQ1[1][ 7].Code = 60; d->HuffQ1[1][ 7].Length = 7;
d->HuffQ1[1][ 8].Code = 227; d->HuffQ1[1][ 8].Length = 9;
d->HuffQ1[1][ 9].Code = 24; d->HuffQ1[1][ 9].Length = 6;
d->HuffQ1[1][10].Code = 0; d->HuffQ1[1][10].Length = 4;
d->HuffQ1[1][11].Code = 61; d->HuffQ1[1][11].Length = 7;
d->HuffQ1[1][12].Code = 4; d->HuffQ1[1][12].Length = 4;
d->HuffQ1[1][13].Code = 1; d->HuffQ1[1][13].Length = 1;
d->HuffQ1[1][14].Code = 5; d->HuffQ1[1][14].Length = 4;
d->HuffQ1[1][15].Code = 63; d->HuffQ1[1][15].Length = 7;
d->HuffQ1[1][16].Code = 1; d->HuffQ1[1][16].Length = 4;
d->HuffQ1[1][17].Code = 59; d->HuffQ1[1][17].Length = 7;
d->HuffQ1[1][18].Code = 226; d->HuffQ1[1][18].Length = 9;
d->HuffQ1[1][19].Code = 57; d->HuffQ1[1][19].Length = 7;
d->HuffQ1[1][20].Code = 100; d->HuffQ1[1][20].Length = 8;
d->HuffQ1[1][21].Code = 53; d->HuffQ1[1][21].Length = 7;
d->HuffQ1[1][22].Code = 2; d->HuffQ1[1][22].Length = 4;
d->HuffQ1[1][23].Code = 54; d->HuffQ1[1][23].Length = 7;
d->HuffQ1[1][24].Code = 224; d->HuffQ1[1][24].Length = 9;
d->HuffQ1[1][25].Code = 58; d->HuffQ1[1][25].Length = 7;
d->HuffQ1[1][26].Code = 102; d->HuffQ1[1][26].Length = 8;
/********************** 5-step quantizer **************************/
/********************* 2 bundled samples **************************/
//less shaped, book 0
d->HuffQ2[0][ 0].Code = 89; d->HuffQ2[0][ 0].Length = 7;
d->HuffQ2[0][ 1].Code = 47; d->HuffQ2[0][ 1].Length = 6;
d->HuffQ2[0][ 2].Code = 15; d->HuffQ2[0][ 2].Length = 5;
d->HuffQ2[0][ 3].Code = 0; d->HuffQ2[0][ 3].Length = 5;
d->HuffQ2[0][ 4].Code = 91; d->HuffQ2[0][ 4].Length = 7;
d->HuffQ2[0][ 5].Code = 4; d->HuffQ2[0][ 5].Length = 5;
d->HuffQ2[0][ 6].Code = 6; d->HuffQ2[0][ 6].Length = 4;
d->HuffQ2[0][ 7].Code = 13; d->HuffQ2[0][ 7].Length = 4;
d->HuffQ2[0][ 8].Code = 4; d->HuffQ2[0][ 8].Length = 4;
d->HuffQ2[0][ 9].Code = 5; d->HuffQ2[0][ 9].Length = 5;
d->HuffQ2[0][10].Code = 20; d->HuffQ2[0][10].Length = 5;
d->HuffQ2[0][11].Code = 12; d->HuffQ2[0][11].Length = 4;
d->HuffQ2[0][12].Code = 4; d->HuffQ2[0][12].Length = 3;
d->HuffQ2[0][13].Code = 15; d->HuffQ2[0][13].Length = 4;
d->HuffQ2[0][14].Code = 14; d->HuffQ2[0][14].Length = 5;
d->HuffQ2[0][15].Code = 3; d->HuffQ2[0][15].Length = 5;
d->HuffQ2[0][16].Code = 3; d->HuffQ2[0][16].Length = 4;
d->HuffQ2[0][17].Code = 14; d->HuffQ2[0][17].Length = 4;
d->HuffQ2[0][18].Code = 5; d->HuffQ2[0][18].Length = 4;
d->HuffQ2[0][19].Code = 1; d->HuffQ2[0][19].Length = 5;
d->HuffQ2[0][20].Code = 90; d->HuffQ2[0][20].Length = 7;
d->HuffQ2[0][21].Code = 2; d->HuffQ2[0][21].Length = 5;
d->HuffQ2[0][22].Code = 21; d->HuffQ2[0][22].Length = 5;
d->HuffQ2[0][23].Code = 46; d->HuffQ2[0][23].Length = 6;
d->HuffQ2[0][24].Code = 88; d->HuffQ2[0][24].Length = 7;
//more shaped, book 1
d->HuffQ2[1][ 0].Code = 921; d->HuffQ2[1][ 0].Length = 10;
d->HuffQ2[1][ 1].Code = 113; d->HuffQ2[1][ 1].Length = 7;
d->HuffQ2[1][ 2].Code = 51; d->HuffQ2[1][ 2].Length = 6;
d->HuffQ2[1][ 3].Code = 231; d->HuffQ2[1][ 3].Length = 8;
d->HuffQ2[1][ 4].Code = 922; d->HuffQ2[1][ 4].Length = 10;
d->HuffQ2[1][ 5].Code = 104; d->HuffQ2[1][ 5].Length = 7;
d->HuffQ2[1][ 6].Code = 30; d->HuffQ2[1][ 6].Length = 5;
d->HuffQ2[1][ 7].Code = 0; d->HuffQ2[1][ 7].Length = 3;
d->HuffQ2[1][ 8].Code = 29; d->HuffQ2[1][ 8].Length = 5;
d->HuffQ2[1][ 9].Code = 105; d->HuffQ2[1][ 9].Length = 7;
d->HuffQ2[1][10].Code = 50; d->HuffQ2[1][10].Length = 6;
d->HuffQ2[1][11].Code = 1; d->HuffQ2[1][11].Length = 3;
d->HuffQ2[1][12].Code = 2; d->HuffQ2[1][12].Length = 2;
d->HuffQ2[1][13].Code = 3; d->HuffQ2[1][13].Length = 3;
d->HuffQ2[1][14].Code = 49; d->HuffQ2[1][14].Length = 6;
d->HuffQ2[1][15].Code = 107; d->HuffQ2[1][15].Length = 7;
d->HuffQ2[1][16].Code = 27; d->HuffQ2[1][16].Length = 5;
d->HuffQ2[1][17].Code = 2; d->HuffQ2[1][17].Length = 3;
d->HuffQ2[1][18].Code = 31; d->HuffQ2[1][18].Length = 5;
d->HuffQ2[1][19].Code = 112; d->HuffQ2[1][19].Length = 7;
d->HuffQ2[1][20].Code = 920; d->HuffQ2[1][20].Length = 10;
d->HuffQ2[1][21].Code = 106; d->HuffQ2[1][21].Length = 7;
d->HuffQ2[1][22].Code = 48; d->HuffQ2[1][22].Length = 6;
d->HuffQ2[1][23].Code = 114; d->HuffQ2[1][23].Length = 7;
d->HuffQ2[1][24].Code = 923; d->HuffQ2[1][24].Length = 10;
/********************** 7-step quantizer **************************/
/*********************** single samples ***************************/
//less shaped, book 0
d->HuffQ3[0][0].Code = 12; d->HuffQ3[0][0].Length = 4;
d->HuffQ3[0][1].Code = 4; d->HuffQ3[0][1].Length = 3;
d->HuffQ3[0][2].Code = 0; d->HuffQ3[0][2].Length = 2;
d->HuffQ3[0][3].Code = 1; d->HuffQ3[0][3].Length = 2;
d->HuffQ3[0][4].Code = 7; d->HuffQ3[0][4].Length = 3;
d->HuffQ3[0][5].Code = 5; d->HuffQ3[0][5].Length = 3;
d->HuffQ3[0][6].Code = 13; d->HuffQ3[0][6].Length = 4;
//more shaped, book 1
d->HuffQ3[1][0].Code = 4; d->HuffQ3[1][0].Length = 5;
d->HuffQ3[1][1].Code = 3; d->HuffQ3[1][1].Length = 4;
d->HuffQ3[1][2].Code = 2; d->HuffQ3[1][2].Length = 2;
d->HuffQ3[1][3].Code = 3; d->HuffQ3[1][3].Length = 2;
d->HuffQ3[1][4].Code = 1; d->HuffQ3[1][4].Length = 2;
d->HuffQ3[1][5].Code = 0; d->HuffQ3[1][5].Length = 3;
d->HuffQ3[1][6].Code = 5; d->HuffQ3[1][6].Length = 5;
/********************** 9-step quantizer **************************/
/*********************** single samples ***************************/
//less shaped, book 0
d->HuffQ4[0][0].Code = 5; d->HuffQ4[0][0].Length = 4;
d->HuffQ4[0][1].Code = 0; d->HuffQ4[0][1].Length = 3;
d->HuffQ4[0][2].Code = 4; d->HuffQ4[0][2].Length = 3;
d->HuffQ4[0][3].Code = 6; d->HuffQ4[0][3].Length = 3;
d->HuffQ4[0][4].Code = 7; d->HuffQ4[0][4].Length = 3;
d->HuffQ4[0][5].Code = 5; d->HuffQ4[0][5].Length = 3;
d->HuffQ4[0][6].Code = 3; d->HuffQ4[0][6].Length = 3;
d->HuffQ4[0][7].Code = 1; d->HuffQ4[0][7].Length = 3;
d->HuffQ4[0][8].Code = 4; d->HuffQ4[0][8].Length = 4;
//more shaped, book 1
d->HuffQ4[1][0].Code = 9; d->HuffQ4[1][0].Length = 5;
d->HuffQ4[1][1].Code = 12; d->HuffQ4[1][1].Length = 4;
d->HuffQ4[1][2].Code = 3; d->HuffQ4[1][2].Length = 3;
d->HuffQ4[1][3].Code = 0; d->HuffQ4[1][3].Length = 2;
d->HuffQ4[1][4].Code = 2; d->HuffQ4[1][4].Length = 2;
d->HuffQ4[1][5].Code = 7; d->HuffQ4[1][5].Length = 3;
d->HuffQ4[1][6].Code = 13; d->HuffQ4[1][6].Length = 4;
d->HuffQ4[1][7].Code = 5; d->HuffQ4[1][7].Length = 4;
d->HuffQ4[1][8].Code = 8; d->HuffQ4[1][8].Length = 5;
/********************* 15-step quantizer **************************/
/*********************** single samples ***************************/
//less shaped, book 0
d->HuffQ5[0][ 0].Code = 57; d->HuffQ5[0][ 0].Length = 6;
d->HuffQ5[0][ 1].Code = 23; d->HuffQ5[0][ 1].Length = 5;
d->HuffQ5[0][ 2].Code = 8; d->HuffQ5[0][ 2].Length = 4;
d->HuffQ5[0][ 3].Code = 10; d->HuffQ5[0][ 3].Length = 4;
d->HuffQ5[0][ 4].Code = 13; d->HuffQ5[0][ 4].Length = 4;
d->HuffQ5[0][ 5].Code = 0; d->HuffQ5[0][ 5].Length = 3;
d->HuffQ5[0][ 6].Code = 2; d->HuffQ5[0][ 6].Length = 3;
d->HuffQ5[0][ 7].Code = 3; d->HuffQ5[0][ 7].Length = 3;
d->HuffQ5[0][ 8].Code = 1; d->HuffQ5[0][ 8].Length = 3;
d->HuffQ5[0][ 9].Code = 15; d->HuffQ5[0][ 9].Length = 4;
d->HuffQ5[0][10].Code = 12; d->HuffQ5[0][10].Length = 4;
d->HuffQ5[0][11].Code = 9; d->HuffQ5[0][11].Length = 4;
d->HuffQ5[0][12].Code = 29; d->HuffQ5[0][12].Length = 5;
d->HuffQ5[0][13].Code = 22; d->HuffQ5[0][13].Length = 5;
d->HuffQ5[0][14].Code = 56; d->HuffQ5[0][14].Length = 6;
//more shaped, book 1
d->HuffQ5[1][ 0].Code = 229; d->HuffQ5[1][ 0].Length = 8;
d->HuffQ5[1][ 1].Code = 56; d->HuffQ5[1][ 1].Length = 6;
d->HuffQ5[1][ 2].Code = 7; d->HuffQ5[1][ 2].Length = 5;
d->HuffQ5[1][ 3].Code = 2; d->HuffQ5[1][ 3].Length = 4;
d->HuffQ5[1][ 4].Code = 0; d->HuffQ5[1][ 4].Length = 3;
d->HuffQ5[1][ 5].Code = 3; d->HuffQ5[1][ 5].Length = 3;
d->HuffQ5[1][ 6].Code = 5; d->HuffQ5[1][ 6].Length = 3;
d->HuffQ5[1][ 7].Code = 6; d->HuffQ5[1][ 7].Length = 3;
d->HuffQ5[1][ 8].Code = 4; d->HuffQ5[1][ 8].Length = 3;
d->HuffQ5[1][ 9].Code = 2; d->HuffQ5[1][ 9].Length = 3;
d->HuffQ5[1][10].Code = 15; d->HuffQ5[1][10].Length = 4;
d->HuffQ5[1][11].Code = 29; d->HuffQ5[1][11].Length = 5;
d->HuffQ5[1][12].Code = 6; d->HuffQ5[1][12].Length = 5;
d->HuffQ5[1][13].Code = 115; d->HuffQ5[1][13].Length = 7;
d->HuffQ5[1][14].Code = 228; d->HuffQ5[1][14].Length = 8;
/********************* 31-step quantizer **************************/
/*********************** single samples ***************************/
//less shaped, book 0
d->HuffQ6[0][ 0].Code = 65; d->HuffQ6[0][ 0].Length = 7;
d->HuffQ6[0][ 1].Code = 6; d->HuffQ6[0][ 1].Length = 6;
d->HuffQ6[0][ 2].Code = 44; d->HuffQ6[0][ 2].Length = 6;
d->HuffQ6[0][ 3].Code = 45; d->HuffQ6[0][ 3].Length = 6;
d->HuffQ6[0][ 4].Code = 59; d->HuffQ6[0][ 4].Length = 6;
d->HuffQ6[0][ 5].Code = 13; d->HuffQ6[0][ 5].Length = 5;
d->HuffQ6[0][ 6].Code = 17; d->HuffQ6[0][ 6].Length = 5;
d->HuffQ6[0][ 7].Code = 19; d->HuffQ6[0][ 7].Length = 5;
d->HuffQ6[0][ 8].Code = 23; d->HuffQ6[0][ 8].Length = 5;
d->HuffQ6[0][ 9].Code = 21; d->HuffQ6[0][ 9].Length = 5;
d->HuffQ6[0][10].Code = 26; d->HuffQ6[0][10].Length = 5;
d->HuffQ6[0][11].Code = 30; d->HuffQ6[0][11].Length = 5;
d->HuffQ6[0][12].Code = 0; d->HuffQ6[0][12].Length = 4;
d->HuffQ6[0][13].Code = 2; d->HuffQ6[0][13].Length = 4;
d->HuffQ6[0][14].Code = 5; d->HuffQ6[0][14].Length = 4;
d->HuffQ6[0][15].Code = 7; d->HuffQ6[0][15].Length = 4;
d->HuffQ6[0][16].Code = 3; d->HuffQ6[0][16].Length = 4;
d->HuffQ6[0][17].Code = 4; d->HuffQ6[0][17].Length = 4;
d->HuffQ6[0][18].Code = 31; d->HuffQ6[0][18].Length = 5;
d->HuffQ6[0][19].Code = 28; d->HuffQ6[0][19].Length = 5;
d->HuffQ6[0][20].Code = 25; d->HuffQ6[0][20].Length = 5;
d->HuffQ6[0][21].Code = 27; d->HuffQ6[0][21].Length = 5;
d->HuffQ6[0][22].Code = 24; d->HuffQ6[0][22].Length = 5;
d->HuffQ6[0][23].Code = 20; d->HuffQ6[0][23].Length = 5;
d->HuffQ6[0][24].Code = 18; d->HuffQ6[0][24].Length = 5;
d->HuffQ6[0][25].Code = 12; d->HuffQ6[0][25].Length = 5;
d->HuffQ6[0][26].Code = 2; d->HuffQ6[0][26].Length = 5;
d->HuffQ6[0][27].Code = 58; d->HuffQ6[0][27].Length = 6;
d->HuffQ6[0][28].Code = 33; d->HuffQ6[0][28].Length = 6;
d->HuffQ6[0][29].Code = 7; d->HuffQ6[0][29].Length = 6;
d->HuffQ6[0][30].Code = 64; d->HuffQ6[0][30].Length = 7;
//more shaped, book 1
d->HuffQ6[1][ 0].Code = 6472; d->HuffQ6[1][ 0].Length = 13;
d->HuffQ6[1][ 1].Code = 6474; d->HuffQ6[1][ 1].Length = 13;
d->HuffQ6[1][ 2].Code = 808; d->HuffQ6[1][ 2].Length = 10;
d->HuffQ6[1][ 3].Code = 405; d->HuffQ6[1][ 3].Length = 9;
d->HuffQ6[1][ 4].Code = 203; d->HuffQ6[1][ 4].Length = 8;
d->HuffQ6[1][ 5].Code = 102; d->HuffQ6[1][ 5].Length = 7;
d->HuffQ6[1][ 6].Code = 49; d->HuffQ6[1][ 6].Length = 6;
d->HuffQ6[1][ 7].Code = 9; d->HuffQ6[1][ 7].Length = 5;
d->HuffQ6[1][ 8].Code = 15; d->HuffQ6[1][ 8].Length = 5;
d->HuffQ6[1][ 9].Code = 31; d->HuffQ6[1][ 9].Length = 5;
d->HuffQ6[1][10].Code = 2; d->HuffQ6[1][10].Length = 4;
d->HuffQ6[1][11].Code = 6; d->HuffQ6[1][11].Length = 4;
d->HuffQ6[1][12].Code = 8; d->HuffQ6[1][12].Length = 4;
d->HuffQ6[1][13].Code = 11; d->HuffQ6[1][13].Length = 4;
d->HuffQ6[1][14].Code = 13; d->HuffQ6[1][14].Length = 4;
d->HuffQ6[1][15].Code = 0; d->HuffQ6[1][15].Length = 3;
d->HuffQ6[1][16].Code = 14; d->HuffQ6[1][16].Length = 4;
d->HuffQ6[1][17].Code = 10; d->HuffQ6[1][17].Length = 4;
d->HuffQ6[1][18].Code = 9; d->HuffQ6[1][18].Length = 4;
d->HuffQ6[1][19].Code = 5; d->HuffQ6[1][19].Length = 4;
d->HuffQ6[1][20].Code = 3; d->HuffQ6[1][20].Length = 4;
d->HuffQ6[1][21].Code = 30; d->HuffQ6[1][21].Length = 5;
d->HuffQ6[1][22].Code = 14; d->HuffQ6[1][22].Length = 5;
d->HuffQ6[1][23].Code = 8; d->HuffQ6[1][23].Length = 5;
d->HuffQ6[1][24].Code = 48; d->HuffQ6[1][24].Length = 6;
d->HuffQ6[1][25].Code = 103; d->HuffQ6[1][25].Length = 7;
d->HuffQ6[1][26].Code = 201; d->HuffQ6[1][26].Length = 8;
d->HuffQ6[1][27].Code = 200; d->HuffQ6[1][27].Length = 8;
d->HuffQ6[1][28].Code = 1619; d->HuffQ6[1][28].Length = 11;
d->HuffQ6[1][29].Code = 6473; d->HuffQ6[1][29].Length = 13;
d->HuffQ6[1][30].Code = 6475; d->HuffQ6[1][30].Length = 13;
/********************* 63-step quantizer **************************/
/*********************** single samples ***************************/
//less shaped, book 0
d->HuffQ7[0][ 0].Code = 103; d->HuffQ7[0][ 0].Length = 8; /* 0.003338 - 01100111 */
d->HuffQ7[0][ 1].Code = 153; d->HuffQ7[0][ 1].Length = 8; /* 0.003766 - 10011001 */
d->HuffQ7[0][ 2].Code = 181; d->HuffQ7[0][ 2].Length = 8; /* 0.004715 - 10110101 */
d->HuffQ7[0][ 3].Code = 233; d->HuffQ7[0][ 3].Length = 8; /* 0.005528 - 11101001 */
d->HuffQ7[0][ 4].Code = 64; d->HuffQ7[0][ 4].Length = 7; /* 0.006677 - 1000000 */
d->HuffQ7[0][ 5].Code = 65; d->HuffQ7[0][ 5].Length = 7; /* 0.007041 - 1000001 */
d->HuffQ7[0][ 6].Code = 77; d->HuffQ7[0][ 6].Length = 7; /* 0.007733 - 1001101 */
d->HuffQ7[0][ 7].Code = 81; d->HuffQ7[0][ 7].Length = 7; /* 0.008296 - 1010001 */
d->HuffQ7[0][ 8].Code = 91; d->HuffQ7[0][ 8].Length = 7; /* 0.009295 - 1011011 */
d->HuffQ7[0][ 9].Code = 113; d->HuffQ7[0][ 9].Length = 7; /* 0.010814 - 1110001 */
d->HuffQ7[0][10].Code = 112; d->HuffQ7[0][10].Length = 7; /* 0.010807 - 1110000 */
d->HuffQ7[0][11].Code = 24; d->HuffQ7[0][11].Length = 6; /* 0.012748 - 011000 */
d->HuffQ7[0][12].Code = 29; d->HuffQ7[0][12].Length = 6; /* 0.013390 - 011101 */
d->HuffQ7[0][13].Code = 35; d->HuffQ7[0][13].Length = 6; /* 0.014224 - 100011 */
d->HuffQ7[0][14].Code = 37; d->HuffQ7[0][14].Length = 6; /* 0.015201 - 100101 */
d->HuffQ7[0][15].Code = 41; d->HuffQ7[0][15].Length = 6; /* 0.016642 - 101001 */
d->HuffQ7[0][16].Code = 44; d->HuffQ7[0][16].Length = 6; /* 0.017292 - 101100 */
d->HuffQ7[0][17].Code = 46; d->HuffQ7[0][17].Length = 6; /* 0.018647 - 101110 */
d->HuffQ7[0][18].Code = 51; d->HuffQ7[0][18].Length = 6; /* 0.020473 - 110011 */
d->HuffQ7[0][19].Code = 49; d->HuffQ7[0][19].Length = 6; /* 0.020152 - 110001 */
d->HuffQ7[0][20].Code = 54; d->HuffQ7[0][20].Length = 6; /* 0.021315 - 110110 */
d->HuffQ7[0][21].Code = 55; d->HuffQ7[0][21].Length = 6; /* 0.021358 - 110111 */
d->HuffQ7[0][22].Code = 57; d->HuffQ7[0][22].Length = 6; /* 0.021700 - 111001 */
d->HuffQ7[0][23].Code = 60; d->HuffQ7[0][23].Length = 6; /* 0.022449 - 111100 */
d->HuffQ7[0][24].Code = 0; d->HuffQ7[0][24].Length = 5; /* 0.023063 - 00000 */
d->HuffQ7[0][25].Code = 2; d->HuffQ7[0][25].Length = 5; /* 0.023854 - 00010 */
d->HuffQ7[0][26].Code = 10; d->HuffQ7[0][26].Length = 5; /* 0.025481 - 01010 */
d->HuffQ7[0][27].Code = 5; d->HuffQ7[0][27].Length = 5; /* 0.024867 - 00101 */
d->HuffQ7[0][28].Code = 9; d->HuffQ7[0][28].Length = 5; /* 0.025352 - 01001 */
d->HuffQ7[0][29].Code = 6; d->HuffQ7[0][29].Length = 5; /* 0.025074 - 00110 */
d->HuffQ7[0][30].Code = 13; d->HuffQ7[0][30].Length = 5; /* 0.025745 - 01101 */
d->HuffQ7[0][31].Code = 7; d->HuffQ7[0][31].Length = 5; /* 0.025195 - 00111 */
d->HuffQ7[0][32].Code = 11; d->HuffQ7[0][32].Length = 5; /* 0.025502 - 01011 */
d->HuffQ7[0][33].Code = 15; d->HuffQ7[0][33].Length = 5; /* 0.026251 - 01111 */
d->HuffQ7[0][34].Code = 8; d->HuffQ7[0][34].Length = 5; /* 0.025260 - 01000 */
d->HuffQ7[0][35].Code = 4; d->HuffQ7[0][35].Length = 5; /* 0.024418 - 00100 */
d->HuffQ7[0][36].Code = 3; d->HuffQ7[0][36].Length = 5; /* 0.023983 - 00011 */
d->HuffQ7[0][37].Code = 1; d->HuffQ7[0][37].Length = 5; /* 0.023697 - 00001 */
d->HuffQ7[0][38].Code = 63; d->HuffQ7[0][38].Length = 6; /* 0.023041 - 111111 */
d->HuffQ7[0][39].Code = 62; d->HuffQ7[0][39].Length = 6; /* 0.022656 - 111110 */
d->HuffQ7[0][40].Code = 61; d->HuffQ7[0][40].Length = 6; /* 0.022549 - 111101 */
d->HuffQ7[0][41].Code = 53; d->HuffQ7[0][41].Length = 6; /* 0.021151 - 110101 */
d->HuffQ7[0][42].Code = 59; d->HuffQ7[0][42].Length = 6; /* 0.022042 - 111011 */
d->HuffQ7[0][43].Code = 52; d->HuffQ7[0][43].Length = 6; /* 0.020837 - 110100 */
d->HuffQ7[0][44].Code = 48; d->HuffQ7[0][44].Length = 6; /* 0.019446 - 110000 */
d->HuffQ7[0][45].Code = 47; d->HuffQ7[0][45].Length = 6; /* 0.019189 - 101111 */
d->HuffQ7[0][46].Code = 43; d->HuffQ7[0][46].Length = 6; /* 0.017177 - 101011 */
d->HuffQ7[0][47].Code = 42; d->HuffQ7[0][47].Length = 6; /* 0.017035 - 101010 */
d->HuffQ7[0][48].Code = 39; d->HuffQ7[0][48].Length = 6; /* 0.015287 - 100111 */
d->HuffQ7[0][49].Code = 36; d->HuffQ7[0][49].Length = 6; /* 0.014559 - 100100 */
d->HuffQ7[0][50].Code = 33; d->HuffQ7[0][50].Length = 6; /* 0.014117 - 100001 */
d->HuffQ7[0][51].Code = 28; d->HuffQ7[0][51].Length = 6; /* 0.012776 - 011100 */
d->HuffQ7[0][52].Code = 117; d->HuffQ7[0][52].Length = 7; /* 0.011107 - 1110101 */
d->HuffQ7[0][53].Code = 101; d->HuffQ7[0][53].Length = 7; /* 0.010636 - 1100101 */
d->HuffQ7[0][54].Code = 100; d->HuffQ7[0][54].Length = 7; /* 0.009751 - 1100100 */
d->HuffQ7[0][55].Code = 80; d->HuffQ7[0][55].Length = 7; /* 0.008132 - 1010000 */
d->HuffQ7[0][56].Code = 69; d->HuffQ7[0][56].Length = 7; /* 0.007091 - 1000101 */
d->HuffQ7[0][57].Code = 68; d->HuffQ7[0][57].Length = 7; /* 0.007084 - 1000100 */
d->HuffQ7[0][58].Code = 50; d->HuffQ7[0][58].Length = 7; /* 0.006277 - 0110010 */
d->HuffQ7[0][59].Code = 232; d->HuffQ7[0][59].Length = 8; /* 0.005386 - 11101000 */
d->HuffQ7[0][60].Code = 180; d->HuffQ7[0][60].Length = 8; /* 0.004408 - 10110100 */
d->HuffQ7[0][61].Code = 152; d->HuffQ7[0][61].Length = 8; /* 0.003759 - 10011000 */
d->HuffQ7[0][62].Code = 102; d->HuffQ7[0][62].Length = 8; /* 0.003160 - 01100110 */
//more shaped, book 1
d->HuffQ7[1][ 0].Code = 14244; d->HuffQ7[1][ 0].Length = 14; /* 0.000059 - 11011110100100 */
d->HuffQ7[1][ 1].Code = 14253; d->HuffQ7[1][ 1].Length = 14; /* 0.000098 - 11011110101101 */
d->HuffQ7[1][ 2].Code = 14246; d->HuffQ7[1][ 2].Length = 14; /* 0.000078 - 11011110100110 */
d->HuffQ7[1][ 3].Code = 14254; d->HuffQ7[1][ 3].Length = 14; /* 0.000111 - 11011110101110 */
d->HuffQ7[1][ 4].Code = 3562; d->HuffQ7[1][ 4].Length = 12; /* 0.000320 - 110111101010 */
d->HuffQ7[1][ 5].Code = 752; d->HuffQ7[1][ 5].Length = 10; /* 0.000920 - 1011110000 */
d->HuffQ7[1][ 6].Code = 753; d->HuffQ7[1][ 6].Length = 10; /* 0.001057 - 1011110001 */
d->HuffQ7[1][ 7].Code = 160; d->HuffQ7[1][ 7].Length = 9; /* 0.001403 - 010100000 */
d->HuffQ7[1][ 8].Code = 162; d->HuffQ7[1][ 8].Length = 9; /* 0.001579 - 010100010 */
d->HuffQ7[1][ 9].Code = 444; d->HuffQ7[1][ 9].Length = 9; /* 0.002486 - 110111100 */
d->HuffQ7[1][10].Code = 122; d->HuffQ7[1][10].Length = 8; /* 0.003772 - 01111010 */
d->HuffQ7[1][11].Code = 223; d->HuffQ7[1][11].Length = 8; /* 0.005710 - 11011111 */
d->HuffQ7[1][12].Code = 60; d->HuffQ7[1][12].Length = 7; /* 0.006858 - 0111100 */
d->HuffQ7[1][13].Code = 73; d->HuffQ7[1][13].Length = 7; /* 0.008033 - 1001001 */
d->HuffQ7[1][14].Code = 110; d->HuffQ7[1][14].Length = 7; /* 0.009827 - 1101110 */
d->HuffQ7[1][15].Code = 14; d->HuffQ7[1][15].Length = 6; /* 0.012601 - 001110 */
d->HuffQ7[1][16].Code = 24; d->HuffQ7[1][16].Length = 6; /* 0.013194 - 011000 */
d->HuffQ7[1][17].Code = 25; d->HuffQ7[1][17].Length = 6; /* 0.013938 - 011001 */
d->HuffQ7[1][18].Code = 34; d->HuffQ7[1][18].Length = 6; /* 0.015693 - 100010 */
d->HuffQ7[1][19].Code = 37; d->HuffQ7[1][19].Length = 6; /* 0.017846 - 100101 */
d->HuffQ7[1][20].Code = 54; d->HuffQ7[1][20].Length = 6; /* 0.020078 - 110110 */
d->HuffQ7[1][21].Code = 3; d->HuffQ7[1][21].Length = 5; /* 0.022975 - 00011 */
d->HuffQ7[1][22].Code = 9; d->HuffQ7[1][22].Length = 5; /* 0.025631 - 01001 */
d->HuffQ7[1][23].Code = 11; d->HuffQ7[1][23].Length = 5; /* 0.027021 - 01011 */
d->HuffQ7[1][24].Code = 16; d->HuffQ7[1][24].Length = 5; /* 0.031465 - 10000 */
d->HuffQ7[1][25].Code = 19; d->HuffQ7[1][25].Length = 5; /* 0.034244 - 10011 */
d->HuffQ7[1][26].Code = 21; d->HuffQ7[1][26].Length = 5; /* 0.035921 - 10101 */
d->HuffQ7[1][27].Code = 24; d->HuffQ7[1][27].Length = 5; /* 0.037938 - 11000 */
d->HuffQ7[1][28].Code = 26; d->HuffQ7[1][28].Length = 5; /* 0.039595 - 11010 */
d->HuffQ7[1][29].Code = 29; d->HuffQ7[1][29].Length = 5; /* 0.041546 - 11101 */
d->HuffQ7[1][30].Code = 31; d->HuffQ7[1][30].Length = 5; /* 0.042623 - 11111 */
d->HuffQ7[1][31].Code = 2; d->HuffQ7[1][31].Length = 4; /* 0.045180 - 0010 */
d->HuffQ7[1][32].Code = 0; d->HuffQ7[1][32].Length = 4; /* 0.043151 - 0000 */
d->HuffQ7[1][33].Code = 30; d->HuffQ7[1][33].Length = 5; /* 0.042538 - 11110 */
d->HuffQ7[1][34].Code = 28; d->HuffQ7[1][34].Length = 5; /* 0.041422 - 11100 */
d->HuffQ7[1][35].Code = 25; d->HuffQ7[1][35].Length = 5; /* 0.039145 - 11001 */
d->HuffQ7[1][36].Code = 22; d->HuffQ7[1][36].Length = 5; /* 0.036691 - 10110 */
d->HuffQ7[1][37].Code = 20; d->HuffQ7[1][37].Length = 5; /* 0.034955 - 10100 */
d->HuffQ7[1][38].Code = 14; d->HuffQ7[1][38].Length = 5; /* 0.029155 - 01110 */
d->HuffQ7[1][39].Code = 13; d->HuffQ7[1][39].Length = 5; /* 0.027921 - 01101 */
d->HuffQ7[1][40].Code = 8; d->HuffQ7[1][40].Length = 5; /* 0.025553 - 01000 */
d->HuffQ7[1][41].Code = 6; d->HuffQ7[1][41].Length = 5; /* 0.023093 - 00110 */
d->HuffQ7[1][42].Code = 2; d->HuffQ7[1][42].Length = 5; /* 0.021200 - 00010 */
d->HuffQ7[1][43].Code = 46; d->HuffQ7[1][43].Length = 6; /* 0.018134 - 101110 */
d->HuffQ7[1][44].Code = 35; d->HuffQ7[1][44].Length = 6; /* 0.015824 - 100011 */
d->HuffQ7[1][45].Code = 31; d->HuffQ7[1][45].Length = 6; /* 0.014701 - 011111 */
d->HuffQ7[1][46].Code = 21; d->HuffQ7[1][46].Length = 6; /* 0.013187 - 010101 */
d->HuffQ7[1][47].Code = 15; d->HuffQ7[1][47].Length = 6; /* 0.012776 - 001111 */
d->HuffQ7[1][48].Code = 95; d->HuffQ7[1][48].Length = 7; /* 0.009664 - 1011111 */
d->HuffQ7[1][49].Code = 72; d->HuffQ7[1][49].Length = 7; /* 0.007922 - 1001000 */
d->HuffQ7[1][50].Code = 41; d->HuffQ7[1][50].Length = 7; /* 0.006838 - 0101001 */
d->HuffQ7[1][51].Code = 189; d->HuffQ7[1][51].Length = 8; /* 0.005024 - 10111101 */
d->HuffQ7[1][52].Code = 123; d->HuffQ7[1][52].Length = 8; /* 0.003830 - 01111011 */
d->HuffQ7[1][53].Code = 377; d->HuffQ7[1][53].Length = 9; /* 0.002232 - 101111001 */
d->HuffQ7[1][54].Code = 161; d->HuffQ7[1][54].Length = 9; /* 0.001566 - 010100001 */
d->HuffQ7[1][55].Code = 891; d->HuffQ7[1][55].Length = 10; /* 0.001383 - 1101111011 */
d->HuffQ7[1][56].Code = 327; d->HuffQ7[1][56].Length = 10; /* 0.000900 - 0101000111 */
d->HuffQ7[1][57].Code = 326; d->HuffQ7[1][57].Length = 10; /* 0.000790 - 0101000110 */
d->HuffQ7[1][58].Code = 3560; d->HuffQ7[1][58].Length = 12; /* 0.000254 - 110111101000 */
d->HuffQ7[1][59].Code = 14255; d->HuffQ7[1][59].Length = 14; /* 0.000117 - 11011110101111 */
d->HuffQ7[1][60].Code = 14247; d->HuffQ7[1][60].Length = 14; /* 0.000085 - 11011110100111 */
d->HuffQ7[1][61].Code = 14252; d->HuffQ7[1][61].Length = 14; /* 0.000085 - 11011110101100 */
d->HuffQ7[1][62].Code = 14245; d->HuffQ7[1][62].Length = 14; /* 0.000065 - 11011110100101 */
}

View File

@ -0,0 +1,83 @@
/*
Copyright (c) 2005, The Musepack Development Team
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the The Musepack Development Team nor the
names of its contributors may be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(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 idtag.c
/// Rudimentary id3tag handling routines, just enough to skip id3v2 tags,
/// if present.
#include <mpcdec/mpcdec.h>
#include <mpcdec/internal.h>
mpc_int32_t
JumpID3v2 (mpc_reader* r) {
unsigned char tmp [10];
mpc_uint32_t Unsynchronisation; // ID3v2.4-flag
mpc_uint32_t ExtHeaderPresent; // ID3v2.4-flag
mpc_uint32_t ExperimentalFlag; // ID3v2.4-flag
mpc_uint32_t FooterPresent; // ID3v2.4-flag
mpc_int32_t ret;
// seek to first byte of mpc data
if (!r->seek (r->data, 0)) {
return 0;
}
r->read(r->data, tmp, sizeof(tmp));
// check id3-tag
if ( 0 != memcmp ( tmp, "ID3", 3) )
return 0;
// read flags
Unsynchronisation = tmp[5] & 0x80;
ExtHeaderPresent = tmp[5] & 0x40;
ExperimentalFlag = tmp[5] & 0x20;
FooterPresent = tmp[5] & 0x10;
if ( tmp[5] & 0x0F )
return -1; // not (yet???) allowed
if ( (tmp[6] | tmp[7] | tmp[8] | tmp[9]) & 0x80 )
return -1; // not allowed
// read HeaderSize (syncsave: 4 * $0xxxxxxx = 28 significant bits)
ret = tmp[6] << 21;
ret += tmp[7] << 14;
ret += tmp[8] << 7;
ret += tmp[9] ;
ret += 10;
if ( FooterPresent )
ret += 10;
return ret;
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,96 @@
/*
Copyright (c) 2005, The Musepack Development Team
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the The Musepack Development Team nor the
names of its contributors may be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(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 mpc_reader.c
/// Contains implementations for simple file-based mpc_reader
#include <mpcdec/mpcdec.h>
/// mpc_reader callback implementations
static mpc_int32_t
read_impl(void *data, void *ptr, mpc_int32_t size)
{
mpc_reader_file *d = (mpc_reader_file *) data;
return fread(ptr, 1, size, d->file);
}
static mpc_bool_t
seek_impl(void *data, mpc_int32_t offset)
{
mpc_reader_file *d = (mpc_reader_file *) data;
return d->is_seekable ? !fseek(d->file, offset, SEEK_SET) : FALSE;
}
static mpc_int32_t
tell_impl(void *data)
{
mpc_reader_file *d = (mpc_reader_file *) data;
return ftell(d->file);
}
static mpc_int32_t
get_size_impl(void *data)
{
mpc_reader_file *d = (mpc_reader_file *) data;
return d->file_size;
}
static mpc_bool_t
canseek_impl(void *data)
{
mpc_reader_file *d = (mpc_reader_file *) data;
return d->is_seekable;
}
void
mpc_reader_setup_file_reader(mpc_reader_file *p_reader, FILE *input)
{
p_reader->reader.seek = seek_impl;
p_reader->reader.read = read_impl;
p_reader->reader.tell = tell_impl;
p_reader->reader.get_size = get_size_impl;
p_reader->reader.canseek = canseek_impl;
p_reader->reader.data = p_reader; // point back to ourselves
p_reader->file = input;
p_reader->is_seekable = TRUE;
fseek(input, 0, SEEK_END);
p_reader->file_size = ftell(input);
fseek(input, 0, SEEK_SET);
}

View File

@ -0,0 +1,152 @@
/*
Copyright (c) 2005, The Musepack Development Team
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the The Musepack Development Team nor the
names of its contributors may be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(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 requant.c
/// Requantization function implementations.
/// \todo document me
#include <mpcdec/mpcdec.h>
#include <mpcdec/internal.h>
/* C O N S T A N T S */
// bits per sample for chosen quantizer
const mpc_uint32_t Res_bit [18] = {
0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
};
// coefficients for requantization
// 65536/step bzw. 65536/(2*D+1)
#define _(X) MAKE_MPC_SAMPLE_EX(X,14)
const MPC_SAMPLE_FORMAT __Cc [1 + 18] = {
_(111.285962475327f), // 32768/2/255*sqrt(3)
_(65536.000000000000f), _(21845.333333333332f), _(13107.200000000001f), _(9362.285714285713f),
_(7281.777777777777f), _(4369.066666666666f), _(2114.064516129032f), _(1040.253968253968f),
_(516.031496062992f), _(257.003921568627f), _(128.250489236790f), _(64.062561094819f),
_(32.015632633121f), _(16.003907203907f), _(8.000976681723f), _(4.000244155527f),
_(2.000061037018f), _(1.000015259021f)
};
#undef _
// offset for requantization
// 2*D+1 = steps of quantizer
const mpc_int32_t __Dc [1 + 18] = {
2,
0, 1, 2, 3, 4, 7, 15, 31, 63,
127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767
};
#ifdef MPC_FIXED_POINT
static mpc_uint32_t find_shift(double fval)
{
mpc_int64_t val = (mpc_int64_t)fval;
if (val<0) val = -val;
mpc_uint32_t ptr = 0;
while(val) {val>>=1;ptr++;}
return ptr > 31 ? 0 : 31 - ptr;
}
#endif
/* F U N C T I O N S */
#define SET_SCF(N,X) d->SCF[N] = MAKE_MPC_SAMPLE_EX(X,d->SCF_shift[N] = (unsigned char)find_shift(X));
void
mpc_decoder_scale_output(mpc_decoder *d, double factor)
{
mpc_int32_t n;
double f1;
double f2;
#ifndef MPC_FIXED_POINT
factor *= 1.0 / (double)(1<<(MPC_FIXED_POINT_SHIFT-1));
#else
factor *= 1.0 / (double)(1<<(16 - MPC_FIXED_POINT_SHIFT));
#endif
f1 = f2 = factor;
// handles +1.58...-98.41 dB, where's scf[n] / scf[n-1] = 1.20050805774840750476
SET_SCF(1,factor);
f1 *= 0.83298066476582673961;
f2 *= 1/0.83298066476582673961;
for ( n = 1; n <= 128; n++ ) {
SET_SCF((unsigned char)(1+n),f1);
SET_SCF((unsigned char)(1-n),f2);
f1 *= 0.83298066476582673961;
f2 *= 1/0.83298066476582673961;
}
}
static void
mpc_decoder_quantisierungsmodes(mpc_decoder *d) // conversion: index -> quantizer (bitstream reading)
{ // conversion: quantizer -> index (bitstream writing)
mpc_int32_t Band = 0;
mpc_int32_t i;
do {
d->Q_bit [Band] = 4;
for ( i = 0; i < 16-1; i++ )
d->Q_res [Band] [i] = i;
d->Q_res [Band][i] = 17;
Band++;
} while ( Band < 11 );
do {
d->Q_bit [Band] = 3;
for ( i = 0; i < 8-1; i++ )
d->Q_res [Band] [i] = i;
d->Q_res [Band] [i] = 17;
Band++;
} while ( Band < 23 );
do {
d->Q_bit [Band] = 2;
for ( i = 0; i < 4-1; i++ )
d->Q_res [Band] [i] = i;
d->Q_res [Band] [i] = 17;
Band++;
} while ( Band < 32 );
}
void
mpc_decoder_initialisiere_quantisierungstabellen(mpc_decoder *d, double scale_factor)
{
mpc_decoder_quantisierungsmodes(d);
mpc_decoder_scale_output(d, scale_factor);
}

View File

@ -0,0 +1,328 @@
/*
Copyright (c) 2005, The Musepack Development Team
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the The Musepack Development Team nor the
names of its contributors may be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdio.h>
#include <assert.h>
#include <time.h>
#include <mpcdec/mpcdec.h>
/*
The data bundle we pass around with our reader to store file
position and size etc.
*/
typedef struct reader_data_t {
FILE *file;
long size;
mpc_bool_t seekable;
} reader_data;
/*
Our implementations of the mpc_reader callback functions.
*/
mpc_int32_t
read_impl(void *data, void *ptr, mpc_int32_t size)
{
reader_data *d = (reader_data *) data;
return fread(ptr, 1, size, d->file);
}
mpc_bool_t
seek_impl(void *data, mpc_int32_t offset)
{
reader_data *d = (reader_data *) data;
return d->seekable ? !fseek(d->file, offset, SEEK_SET) : false;
}
mpc_int32_t
tell_impl(void *data)
{
reader_data *d = (reader_data *) data;
return ftell(d->file);
}
mpc_int32_t
get_size_impl(void *data)
{
reader_data *d = (reader_data *) data;
return d->size;
}
mpc_bool_t
canseek_impl(void *data)
{
reader_data *d = (reader_data *) data;
return d->seekable;
}
#define WFX_SIZE (2+2+4+4+2+2)
#ifdef MPC_FIXED_POINT
static int
shift_signed(MPC_SAMPLE_FORMAT val, int shift)
{
if (shift > 0)
val <<= shift;
else if (shift < 0)
val >>= -shift;
return (int)val;
}
#endif
class WavWriter {
public:
WavWriter(FILE * p_output, unsigned p_nch, unsigned p_bps,
unsigned p_srate)
: m_file(p_output), m_nch(p_nch), m_bps(p_bps), m_srate(p_srate) {
assert(m_bps == 16 || m_bps == 24);
WriteRaw("RIFF", 4);
WriteDword(0); //fix this in destructor
WriteRaw("WAVE", 4);
WriteRaw("fmt ", 4);
WriteDword(WFX_SIZE);
WriteWord(1); //WAVE_FORMAT_PCM
WriteWord(m_nch);
WriteDword(m_srate);
WriteDword(m_srate * m_nch * (m_bps >> 3));
WriteWord(m_nch * (m_bps >> 3));
WriteWord(m_bps);
/*
WORD wFormatTag;
WORD nChannels;
DWORD nSamplesPerSec;
DWORD nAvgBytesPerSec;
WORD nBlockAlign;
WORD wBitsPerSample;
*/
WriteRaw("data", 4);
WriteDword(0); //fix this in destructor
m_data_bytes_written = 0;
} mpc_bool_t WriteSamples(const MPC_SAMPLE_FORMAT * p_buffer, unsigned p_size) {
unsigned n;
int clip_min = -1 << (m_bps - 1),
clip_max = (1 << (m_bps - 1)) - 1, float_scale = 1 << (m_bps - 1);
for (n = 0; n < p_size; n++) {
int val;
#ifdef MPC_FIXED_POINT
val =
shift_signed(p_buffer[n],
m_bps - MPC_FIXED_POINT_SCALE_SHIFT);
#else
val = (int)(p_buffer[n] * float_scale);
#endif
if (val < clip_min)
val = clip_min;
else if (val > clip_max)
val = clip_max;
if (!WriteInt(val, m_bps))
return false;
}
m_data_bytes_written += p_size * (m_bps >> 3);
return true;
}
~WavWriter() {
if (m_data_bytes_written & 1) {
char blah = 0;
WriteRaw(&blah, 1);
m_data_bytes_written++;
}
Seek(4);
WriteDword((unsigned long)(m_data_bytes_written + 4 + 8 + WFX_SIZE +
8));
Seek(8 + 4 + 8 + WFX_SIZE + 4);
WriteDword(m_data_bytes_written);
}
private:
mpc_bool_t Seek(unsigned p_offset) {
return !fseek(m_file, p_offset, SEEK_SET);
}
mpc_bool_t WriteRaw(const void *p_buffer, unsigned p_bytes) {
return fwrite(p_buffer, 1, p_bytes, m_file) == p_bytes;
}
mpc_bool_t WriteDword(unsigned long p_val) {
return WriteInt(p_val, 32);
}
mpc_bool_t WriteWord(unsigned short p_val) {
return WriteInt(p_val, 16);
}
// write a little-endian number properly
mpc_bool_t WriteInt(unsigned int p_val, unsigned p_width_bits) {
unsigned char temp;
unsigned shift = 0;
assert((p_width_bits % 8) == 0);
do {
temp = (unsigned char)((p_val >> shift) & 0xFF);
if (!WriteRaw(&temp, 1))
return false;
shift += 8;
} while (shift < p_width_bits);
return true;
}
unsigned m_nch, m_bps, m_srate;
FILE *m_file;
unsigned m_data_bytes_written;
};
static void
usage(const char *exename)
{
printf
("Usage: %s <infile.mpc> [<outfile.wav>]\nIf <outfile.wav> is not specified, decoder will run in benchmark mode.\n",
exename);
}
int
main(int argc, char **argv)
{
if (argc != 2 && argc != 3) {
if (argc > 0)
usage(argv[0]);
return 0;
}
FILE *input = fopen(argv[1], "rb");
FILE *output = 0;
if (input == 0) {
usage(argv[0]);
printf("Error opening input file: \"%s\"\n", argv[1]);
return 1;
}
if (argc == 3) {
output = fopen(argv[2], "wb");
if (output == 0) {
fclose(input);
usage(argv[0]);
printf("Error opening output file: \"%s\"\n", argv[2]);
return 1;
}
}
/* initialize our reader_data tag the reader will carry around with it */
reader_data data;
data.file = input;
data.seekable = true;
fseek(data.file, 0, SEEK_END);
data.size = ftell(data.file);
fseek(data.file, 0, SEEK_SET);
/* set up an mpc_reader linked to our function implementations */
mpc_decoder decoder;
mpc_reader reader;
reader.read = read_impl;
reader.seek = seek_impl;
reader.tell = tell_impl;
reader.get_size = get_size_impl;
reader.canseek = canseek_impl;
reader.data = &data;
/* read file's streaminfo data */
mpc_streaminfo info;
mpc_streaminfo_init(&info);
if (mpc_streaminfo_read(&info, &reader) != ERROR_CODE_OK) {
printf("Not a valid musepack file: \"%s\"\n", argv[1]);
return 1;
}
/* instantiate a decoder with our file reader */
mpc_decoder_setup(&decoder, &reader);
if (!mpc_decoder_initialize(&decoder, &info)) {
printf("Error initializing decoder.\n", argv[1]);
return 1;
}
/* decode the file */
printf("Decoding from:\n%s\nTo:\n%s\n", argv[1],
output ? argv[2] : "N/A");
WavWriter *wavwriter =
output ? new WavWriter(output, 2, 16, info.sample_freq) : 0;
MPC_SAMPLE_FORMAT sample_buffer[MPC_DECODER_BUFFER_LENGTH];
clock_t begin, end;
begin = clock();
unsigned total_samples = 0;
mpc_bool_t successful = FALSE;
for (;;) {
unsigned status = mpc_decoder_decode(&decoder, sample_buffer, 0, 0);
if (status == (unsigned)(-1)) {
//decode error
printf("Error decoding file.\n");
break;
}
else if (status == 0) //EOF
{
successful = true;
break;
}
else //status>0
{
total_samples += status;
if (wavwriter) {
if (!wavwriter->
WriteSamples(sample_buffer, status * /* stereo */ 2)) {
printf("Write error.\n");
break;
}
}
}
}
end = clock();
if (wavwriter) {
delete wavwriter;
}
if (successful) {
printf("\nFinished.\nTotal samples decoded: %u.\n", total_samples);
unsigned ms = (end - begin) * 1000 / CLOCKS_PER_SEC;
unsigned ratio =
(unsigned)((double)total_samples / (double)info.sample_freq /
((double)ms / 1000.0) * 100.0);
printf("Time: %u ms (%u.%02ux).\n", ms, ratio / 100, ratio % 100);
}
return 0;
}

View File

@ -0,0 +1,280 @@
/*
Copyright (c) 2005, The Musepack Development Team
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the The Musepack Development Team nor the
names of its contributors may be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(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 streaminfo.c
/// Implementation of streaminfo reading functions.
#include <mpcdec/mpcdec.h>
#include <mpcdec/internal.h>
static const char *
Stringify(mpc_uint32_t profile) // profile is 0...15, where 7...13 is used
{
static const char na[] = "n.a.";
static const char *Names[] = {
na, "'Unstable/Experimental'", na, na,
na, "'quality 0'", "'quality 1'", "'Telephone'",
"'Thumb'", "'Radio'", "'Standard'", "'Xtreme'",
"'Insane'", "'BrainDead'", "'quality 9'", "'quality 10'"
};
return profile >= sizeof(Names) / sizeof(*Names) ? na : Names[profile];
}
void
mpc_streaminfo_init(mpc_streaminfo * si)
{
memset(si, 0, sizeof(mpc_streaminfo));
}
// read information from SV8 header
// not yet implemented
static mpc_int32_t
streaminfo_read_header_sv8(mpc_streaminfo * si, mpc_reader * fp)
{
return 0;
}
/// Reads streaminfo from SV7 header.
static mpc_int32_t
streaminfo_read_header_sv7(mpc_streaminfo * si, mpc_uint32_t HeaderData[8])
{
const mpc_int32_t samplefreqs[4] = { 44100, 48000, 37800, 32000 };
//mpc_uint32_t HeaderData [8];
mpc_uint16_t Estimatedpeak_title = 0;
if (si->stream_version > 0x71) {
// Update (si->stream_version);
return 0;
}
/*
if ( !fp->seek ( si->header_position ) ) // seek to header start
return ERROR_CODE_FILE;
if ( fp->read ( HeaderData, sizeof HeaderData) != sizeof HeaderData )
return ERROR_CODE_FILE;
*/
si->bitrate = 0;
si->frames = HeaderData[1];
si->is = 0;
si->ms = (HeaderData[2] >> 30) & 0x0001;
si->max_band = (HeaderData[2] >> 24) & 0x003F;
si->block_size = 1;
si->profile = (HeaderData[2] << 8) >> 28;
si->profile_name = Stringify(si->profile);
si->sample_freq = samplefreqs[(HeaderData[2] >> 16) & 0x0003];
Estimatedpeak_title = (mpc_uint16_t) (HeaderData[2] & 0xFFFF); // read the ReplayGain data
si->gain_title = (mpc_uint16_t) ((HeaderData[3] >> 16) & 0xFFFF);
si->peak_title = (mpc_uint16_t) (HeaderData[3] & 0xFFFF);
si->gain_album = (mpc_uint16_t) ((HeaderData[4] >> 16) & 0xFFFF);
si->peak_album = (mpc_uint16_t) (HeaderData[4] & 0xFFFF);
si->is_true_gapless = (HeaderData[5] >> 31) & 0x0001; // true gapless: used?
si->last_frame_samples = (HeaderData[5] >> 20) & 0x07FF; // true gapless: valid samples for last frame
si->encoder_version = (HeaderData[6] >> 24) & 0x00FF;
if (si->encoder_version == 0) {
sprintf(si->encoder, "Buschmann 1.7.0...9, Klemm 0.90...1.05");
}
else {
switch (si->encoder_version % 10) {
case 0:
sprintf(si->encoder, "Release %u.%u", si->encoder_version / 100,
si->encoder_version / 10 % 10);
break;
case 2:
case 4:
case 6:
case 8:
sprintf(si->encoder, "Beta %u.%02u", si->encoder_version / 100,
si->encoder_version % 100);
break;
default:
sprintf(si->encoder, "--Alpha-- %u.%02u",
si->encoder_version / 100, si->encoder_version % 100);
break;
}
}
// if ( si->peak_title == 0 ) // there is no correct peak_title contained within header
// si->peak_title = (mpc_uint16_t)(Estimatedpeak_title * 1.18);
// if ( si->peak_album == 0 )
// si->peak_album = si->peak_title; // no correct peak_album, use peak_title
//si->sample_freq = 44100; // AB: used by all files up to SV7
si->channels = 2;
return ERROR_CODE_OK;
}
// read information from SV4-SV6 header
static mpc_int32_t
streaminfo_read_header_sv6(mpc_streaminfo * si, mpc_uint32_t HeaderData[8])
{
//mpc_uint32_t HeaderData [8];
/*
if ( !fp->seek ( si->header_position ) ) // seek to header start
return ERROR_CODE_FILE;
if ( fp->read ( HeaderData, sizeof HeaderData ) != sizeof HeaderData )
return ERROR_CODE_FILE;
*/
si->bitrate = (HeaderData[0] >> 23) & 0x01FF; // read the file-header (SV6 and below)
si->is = (HeaderData[0] >> 22) & 0x0001;
si->ms = (HeaderData[0] >> 21) & 0x0001;
si->stream_version = (HeaderData[0] >> 11) & 0x03FF;
si->max_band = (HeaderData[0] >> 6) & 0x001F;
si->block_size = (HeaderData[0]) & 0x003F;
si->profile = 0;
si->profile_name = Stringify((mpc_uint32_t) (-1));
if (si->stream_version >= 5)
si->frames = HeaderData[1]; // 32 bit
else
si->frames = (HeaderData[1] >> 16); // 16 bit
si->gain_title = 0; // not supported
si->peak_title = 0;
si->gain_album = 0;
si->peak_album = 0;
si->last_frame_samples = 0;
si->is_true_gapless = 0;
si->encoder_version = 0;
si->encoder[0] = '\0';
if (si->stream_version == 7)
return ERROR_CODE_SV7BETA; // are there any unsupported parameters used?
if (si->bitrate != 0)
return ERROR_CODE_CBR;
if (si->is != 0)
return ERROR_CODE_IS;
if (si->block_size != 1)
return ERROR_CODE_BLOCKSIZE;
if (si->stream_version < 6) // Bugfix: last frame was invalid for up to SV5
si->frames -= 1;
si->sample_freq = 44100; // AB: used by all files up to SV7
si->channels = 2;
if (si->stream_version < 4 || si->stream_version > 7)
return ERROR_CODE_INVALIDSV;
return ERROR_CODE_OK;
}
// reads file header and tags
mpc_int32_t
mpc_streaminfo_read(mpc_streaminfo * si, mpc_reader * r)
{
mpc_uint32_t HeaderData[8];
mpc_int32_t Error = 0;
// get header position
if ((si->header_position = JumpID3v2(r)) < 0) {
return ERROR_CODE_FILE;
}
// seek to first byte of mpc data
if (!r->seek(r->data, si->header_position)) {
return ERROR_CODE_FILE;
}
if (r->read(r->data, HeaderData, 8 * 4) != 8 * 4) {
return ERROR_CODE_FILE;
}
if (!r->seek(r->data, si->header_position + 6 * 4)) {
return ERROR_CODE_FILE;
}
si->total_file_length = r->get_size(r->data);
si->tag_offset = si->total_file_length;
if (memcmp(HeaderData, "MP+", 3) == 0) {
#ifndef MPC_LITTLE_ENDIAN
mpc_uint32_t ptr;
for (ptr = 0; ptr < 8; ptr++) {
HeaderData[ptr] = swap32(HeaderData[ptr]);
}
#endif
si->stream_version = HeaderData[0] >> 24;
// stream version 8
if ((si->stream_version & 15) >= 8) {
Error = streaminfo_read_header_sv8(si, r);
}
// stream version 7
else if ((si->stream_version & 15) == 7) {
Error = streaminfo_read_header_sv7(si, HeaderData);
}
}
else {
// stream version 4-6
Error = streaminfo_read_header_sv6(si, HeaderData);
}
// estimation, exact value needs too much time
si->pcm_samples = 1152 * si->frames - 576;
if (si->pcm_samples > 0) {
si->average_bitrate =
(si->tag_offset -
si->header_position) * 8.0 * si->sample_freq / si->pcm_samples;
}
else {
si->average_bitrate = 0;
}
return Error;
}
double
mpc_streaminfo_get_length(mpc_streaminfo * si)
{
return (double)mpc_streaminfo_get_length_samples(si) /
(double)si->sample_freq;
}
mpc_int64_t
mpc_streaminfo_get_length_samples(mpc_streaminfo * si)
{
mpc_int64_t samples = (mpc_int64_t) si->frames * MPC_FRAME_LENGTH;
if (si->is_true_gapless) {
samples -= (MPC_FRAME_LENGTH - si->last_frame_samples);
}
else {
samples -= MPC_DECODER_SYNTH_DELAY;
}
return samples;
}

View File

@ -0,0 +1,442 @@
/*
Copyright (c) 2005, The Musepack Development Team
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the The Musepack Development Team nor the
names of its contributors may be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(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 synth_filter.c
/// Synthesis functions.
/// \todo document me
#include <mpcdec/mpcdec.h>
#include <mpcdec/internal.h>
typedef mpc_int32_t ptrdiff_t;
/* C O N S T A N T S */
#undef _
#define MPC_FIXED_POINT_SYNTH_FIX 2
#ifdef MPC_FIXED_POINT
#define _(value) MPC_MAKE_FRACT_CONST((double)value/(double)(0x40000))
#else
#define _(value) MAKE_MPC_SAMPLE((double)value/(double)(0x10000))
#endif
static const MPC_SAMPLE_FORMAT Di_opt [32] [16] = {
{ _( 0), _( -29), _( 213), _( -459), _( 2037), _(-5153), _( 6574), _(-37489), _(75038), _(37489), _(6574), _( 5153), _(2037), _( 459), _(213), _(29) },
{ _( -1), _( -31), _( 218), _( -519), _( 2000), _(-5517), _( 5959), _(-39336), _(74992), _(35640), _(7134), _( 4788), _(2063), _( 401), _(208), _(26) },
{ _( -1), _( -35), _( 222), _( -581), _( 1952), _(-5879), _( 5288), _(-41176), _(74856), _(33791), _(7640), _( 4425), _(2080), _( 347), _(202), _(24) },
{ _( -1), _( -38), _( 225), _( -645), _( 1893), _(-6237), _( 4561), _(-43006), _(74630), _(31947), _(8092), _( 4063), _(2087), _( 294), _(196), _(21) },
{ _( -1), _( -41), _( 227), _( -711), _( 1822), _(-6589), _( 3776), _(-44821), _(74313), _(30112), _(8492), _( 3705), _(2085), _( 244), _(190), _(19) },
{ _( -1), _( -45), _( 228), _( -779), _( 1739), _(-6935), _( 2935), _(-46617), _(73908), _(28289), _(8840), _( 3351), _(2075), _( 197), _(183), _(17) },
{ _( -1), _( -49), _( 228), _( -848), _( 1644), _(-7271), _( 2037), _(-48390), _(73415), _(26482), _(9139), _( 3004), _(2057), _( 153), _(176), _(16) },
{ _( -2), _( -53), _( 227), _( -919), _( 1535), _(-7597), _( 1082), _(-50137), _(72835), _(24694), _(9389), _( 2663), _(2032), _( 111), _(169), _(14) },
{ _( -2), _( -58), _( 224), _( -991), _( 1414), _(-7910), _( 70), _(-51853), _(72169), _(22929), _(9592), _( 2330), _(2001), _( 72), _(161), _(13) },
{ _( -2), _( -63), _( 221), _(-1064), _( 1280), _(-8209), _( -998), _(-53534), _(71420), _(21189), _(9750), _( 2006), _(1962), _( 36), _(154), _(11) },
{ _( -2), _( -68), _( 215), _(-1137), _( 1131), _(-8491), _( -2122), _(-55178), _(70590), _(19478), _(9863), _( 1692), _(1919), _( 2), _(147), _(10) },
{ _( -3), _( -73), _( 208), _(-1210), _( 970), _(-8755), _( -3300), _(-56778), _(69679), _(17799), _(9935), _( 1388), _(1870), _( -29), _(139), _( 9) },
{ _( -3), _( -79), _( 200), _(-1283), _( 794), _(-8998), _( -4533), _(-58333), _(68692), _(16155), _(9966), _( 1095), _(1817), _( -57), _(132), _( 8) },
{ _( -4), _( -85), _( 189), _(-1356), _( 605), _(-9219), _( -5818), _(-59838), _(67629), _(14548), _(9959), _( 814), _(1759), _( -83), _(125), _( 7) },
{ _( -4), _( -91), _( 177), _(-1428), _( 402), _(-9416), _( -7154), _(-61289), _(66494), _(12980), _(9916), _( 545), _(1698), _(-106), _(117), _( 7) },
{ _( -5), _( -97), _( 163), _(-1498), _( 185), _(-9585), _( -8540), _(-62684), _(65290), _(11455), _(9838), _( 288), _(1634), _(-127), _(111), _( 6) },
{ _( -5), _(-104), _( 146), _(-1567), _( -45), _(-9727), _( -9975), _(-64019), _(64019), _( 9975), _(9727), _( 45), _(1567), _(-146), _(104), _( 5) },
{ _( -6), _(-111), _( 127), _(-1634), _( -288), _(-9838), _(-11455), _(-65290), _(62684), _( 8540), _(9585), _( -185), _(1498), _(-163), _( 97), _( 5) },
{ _( -7), _(-117), _( 106), _(-1698), _( -545), _(-9916), _(-12980), _(-66494), _(61289), _( 7154), _(9416), _( -402), _(1428), _(-177), _( 91), _( 4) },
{ _( -7), _(-125), _( 83), _(-1759), _( -814), _(-9959), _(-14548), _(-67629), _(59838), _( 5818), _(9219), _( -605), _(1356), _(-189), _( 85), _( 4) },
{ _( -8), _(-132), _( 57), _(-1817), _(-1095), _(-9966), _(-16155), _(-68692), _(58333), _( 4533), _(8998), _( -794), _(1283), _(-200), _( 79), _( 3) },
{ _( -9), _(-139), _( 29), _(-1870), _(-1388), _(-9935), _(-17799), _(-69679), _(56778), _( 3300), _(8755), _( -970), _(1210), _(-208), _( 73), _( 3) },
{ _(-10), _(-147), _( -2), _(-1919), _(-1692), _(-9863), _(-19478), _(-70590), _(55178), _( 2122), _(8491), _(-1131), _(1137), _(-215), _( 68), _( 2) },
{ _(-11), _(-154), _( -36), _(-1962), _(-2006), _(-9750), _(-21189), _(-71420), _(53534), _( 998), _(8209), _(-1280), _(1064), _(-221), _( 63), _( 2) },
{ _(-13), _(-161), _( -72), _(-2001), _(-2330), _(-9592), _(-22929), _(-72169), _(51853), _( -70), _(7910), _(-1414), _( 991), _(-224), _( 58), _( 2) },
{ _(-14), _(-169), _(-111), _(-2032), _(-2663), _(-9389), _(-24694), _(-72835), _(50137), _(-1082), _(7597), _(-1535), _( 919), _(-227), _( 53), _( 2) },
{ _(-16), _(-176), _(-153), _(-2057), _(-3004), _(-9139), _(-26482), _(-73415), _(48390), _(-2037), _(7271), _(-1644), _( 848), _(-228), _( 49), _( 1) },
{ _(-17), _(-183), _(-197), _(-2075), _(-3351), _(-8840), _(-28289), _(-73908), _(46617), _(-2935), _(6935), _(-1739), _( 779), _(-228), _( 45), _( 1) },
{ _(-19), _(-190), _(-244), _(-2085), _(-3705), _(-8492), _(-30112), _(-74313), _(44821), _(-3776), _(6589), _(-1822), _( 711), _(-227), _( 41), _( 1) },
{ _(-21), _(-196), _(-294), _(-2087), _(-4063), _(-8092), _(-31947), _(-74630), _(43006), _(-4561), _(6237), _(-1893), _( 645), _(-225), _( 38), _( 1) },
{ _(-24), _(-202), _(-347), _(-2080), _(-4425), _(-7640), _(-33791), _(-74856), _(41176), _(-5288), _(5879), _(-1952), _( 581), _(-222), _( 35), _( 1) },
{ _(-26), _(-208), _(-401), _(-2063), _(-4788), _(-7134), _(-35640), _(-74992), _(39336), _(-5959), _(5517), _(-2000), _( 519), _(-218), _( 31), _( 1) }
};
#undef _
static void Calculate_New_V ( const MPC_SAMPLE_FORMAT * Sample, MPC_SAMPLE_FORMAT * V )
{
// Calculating new V-buffer values for left channel
// calculate new V-values (ISO-11172-3, p. 39)
// based upon fast-MDCT algorithm by Byeong Gi Lee
/*static*/ MPC_SAMPLE_FORMAT A00, A01, A02, A03, A04, A05, A06, A07, A08, A09, A10, A11, A12, A13, A14, A15;
/*static*/ MPC_SAMPLE_FORMAT B00, B01, B02, B03, B04, B05, B06, B07, B08, B09, B10, B11, B12, B13, B14, B15;
MPC_SAMPLE_FORMAT tmp;
A00 = Sample[ 0] + Sample[31];
A01 = Sample[ 1] + Sample[30];
A02 = Sample[ 2] + Sample[29];
A03 = Sample[ 3] + Sample[28];
A04 = Sample[ 4] + Sample[27];
A05 = Sample[ 5] + Sample[26];
A06 = Sample[ 6] + Sample[25];
A07 = Sample[ 7] + Sample[24];
A08 = Sample[ 8] + Sample[23];
A09 = Sample[ 9] + Sample[22];
A10 = Sample[10] + Sample[21];
A11 = Sample[11] + Sample[20];
A12 = Sample[12] + Sample[19];
A13 = Sample[13] + Sample[18];
A14 = Sample[14] + Sample[17];
A15 = Sample[15] + Sample[16];
B00 = A00 + A15;
B01 = A01 + A14;
B02 = A02 + A13;
B03 = A03 + A12;
B04 = A04 + A11;
B05 = A05 + A10;
B06 = A06 + A09;
B07 = A07 + A08;;
B08 = MPC_SCALE_CONST((A00 - A15) , 0.5024192929f , 31);
B09 = MPC_SCALE_CONST((A01 - A14) , 0.5224986076f , 31);
B10 = MPC_SCALE_CONST((A02 - A13) , 0.5669440627f , 31);
B11 = MPC_SCALE_CONST((A03 - A12) , 0.6468217969f , 31);
B12 = MPC_SCALE_CONST((A04 - A11) , 0.7881546021f , 31);
B13 = MPC_SCALE_CONST((A05 - A10) , 1.0606776476f , 30);
B14 = MPC_SCALE_CONST((A06 - A09) , 1.7224471569f , 30);
B15 = MPC_SCALE_CONST((A07 - A08) , 5.1011486053f , 28);
A00 = B00 + B07;
A01 = B01 + B06;
A02 = B02 + B05;
A03 = B03 + B04;
A04 = MPC_SCALE_CONST((B00 - B07) , 0.5097956061f , 31);
A05 = MPC_SCALE_CONST((B01 - B06) , 0.6013448834f , 31);
A06 = MPC_SCALE_CONST((B02 - B05) , 0.8999761939f , 31);
A07 = MPC_SCALE_CONST((B03 - B04) , 2.5629155636f , 29);
A08 = B08 + B15;
A09 = B09 + B14;
A10 = B10 + B13;
A11 = B11 + B12;
A12 = MPC_SCALE_CONST((B08 - B15) , 0.5097956061f , 31);
A13 = MPC_SCALE_CONST((B09 - B14) , 0.6013448834f , 31);
A14 = MPC_SCALE_CONST((B10 - B13) , 0.8999761939f , 31);
A15 = MPC_SCALE_CONST((B11 - B12) , 2.5629155636f , 29);
B00 = A00 + A03;
B01 = A01 + A02;
B02 = MPC_MULTIPLY_FRACT_CONST_FIX((A00 - A03) , 0.5411961079f , 1);
B03 = MPC_MULTIPLY_FRACT_CONST_FIX((A01 - A02) , 1.3065630198f , 2);
B04 = A04 + A07;
B05 = A05 + A06;
B06 = MPC_MULTIPLY_FRACT_CONST_FIX((A04 - A07) , 0.5411961079f , 1);
B07 = MPC_MULTIPLY_FRACT_CONST_FIX((A05 - A06) , 1.3065630198f , 2);
B08 = A08 + A11;
B09 = A09 + A10;
B10 = MPC_MULTIPLY_FRACT_CONST_FIX((A08 - A11) , 0.5411961079f , 1);
B11 = MPC_MULTIPLY_FRACT_CONST_FIX((A09 - A10) , 1.3065630198f , 2);
B12 = A12 + A15;
B13 = A13 + A14;
B14 = MPC_MULTIPLY_FRACT_CONST_FIX((A12 - A15) , 0.5411961079f , 1);
B15 = MPC_MULTIPLY_FRACT_CONST_FIX((A13 - A14) , 1.3065630198f , 2);
A00 = B00 + B01;
A01 = MPC_MULTIPLY_FRACT_CONST_FIX((B00 - B01) , 0.7071067691f , 1);
A02 = B02 + B03;
A03 = MPC_MULTIPLY_FRACT_CONST_FIX((B02 - B03) , 0.7071067691f , 1);
A04 = B04 + B05;
A05 = MPC_MULTIPLY_FRACT_CONST_FIX((B04 - B05) , 0.7071067691f , 1);
A06 = B06 + B07;
A07 = MPC_MULTIPLY_FRACT_CONST_FIX((B06 - B07) , 0.7071067691f , 1);
A08 = B08 + B09;
A09 = MPC_MULTIPLY_FRACT_CONST_FIX((B08 - B09) , 0.7071067691f , 1);
A10 = B10 + B11;
A11 = MPC_MULTIPLY_FRACT_CONST_FIX((B10 - B11) , 0.7071067691f , 1);
A12 = B12 + B13;
A13 = MPC_MULTIPLY_FRACT_CONST_FIX((B12 - B13) , 0.7071067691f , 1);
A14 = B14 + B15;
A15 = MPC_MULTIPLY_FRACT_CONST_FIX((B14 - B15) , 0.7071067691f , 1);
V[48] = -A00;
V[ 0] = A01;
V[40] = -A02 - (V[ 8] = A03);
V[36] = -((V[ 4] = A05 + (V[12] = A07)) + A06);
V[44] = - A04 - A06 - A07;
V[ 6] = (V[10] = A11 + (V[14] = A15)) + A13;
V[38] = (V[34] = -(V[ 2] = A09 + A13 + A15) - A14) + A09 - A10 - A11;
V[46] = (tmp = -(A12 + A14 + A15)) - A08;
V[42] = tmp - A10 - A11;
A00 = MPC_MULTIPLY_FRACT_CONST_SHR((Sample[ 0] - Sample[31]) , 0.5006030202f , MPC_FIXED_POINT_SYNTH_FIX);
A01 = MPC_MULTIPLY_FRACT_CONST_SHR((Sample[ 1] - Sample[30]) , 0.5054709315f , MPC_FIXED_POINT_SYNTH_FIX);
A02 = MPC_MULTIPLY_FRACT_CONST_SHR((Sample[ 2] - Sample[29]) , 0.5154473186f , MPC_FIXED_POINT_SYNTH_FIX);
A03 = MPC_MULTIPLY_FRACT_CONST_SHR((Sample[ 3] - Sample[28]) , 0.5310425758f , MPC_FIXED_POINT_SYNTH_FIX);
A04 = MPC_MULTIPLY_FRACT_CONST_SHR((Sample[ 4] - Sample[27]) , 0.5531039238f , MPC_FIXED_POINT_SYNTH_FIX);
A05 = MPC_MULTIPLY_FRACT_CONST_SHR((Sample[ 5] - Sample[26]) , 0.5829349756f , MPC_FIXED_POINT_SYNTH_FIX);
A06 = MPC_MULTIPLY_FRACT_CONST_SHR((Sample[ 6] - Sample[25]) , 0.6225041151f , MPC_FIXED_POINT_SYNTH_FIX);
A07 = MPC_MULTIPLY_FRACT_CONST_SHR((Sample[ 7] - Sample[24]) , 0.6748083234f , MPC_FIXED_POINT_SYNTH_FIX);
A08 = MPC_MULTIPLY_FRACT_CONST_SHR((Sample[ 8] - Sample[23]) , 0.7445362806f , MPC_FIXED_POINT_SYNTH_FIX);
A09 = MPC_MULTIPLY_FRACT_CONST_SHR((Sample[ 9] - Sample[22]) , 0.8393496275f , MPC_FIXED_POINT_SYNTH_FIX);
A10 = MPC_MULTIPLY_FRACT_CONST_SHR((Sample[10] - Sample[21]) , 0.9725682139f , MPC_FIXED_POINT_SYNTH_FIX);
#if MPC_FIXED_POINT_SYNTH_FIX>=2
A11 = MPC_MULTIPLY_FRACT_CONST_SHR((Sample[11] - Sample[20]) , 1.1694399118f , MPC_FIXED_POINT_SYNTH_FIX);
A12 = MPC_MULTIPLY_FRACT_CONST_SHR((Sample[12] - Sample[19]) , 1.4841645956f , MPC_FIXED_POINT_SYNTH_FIX);
#else
A11 = MPC_SCALE_CONST_SHR ((Sample[11] - Sample[20]) , 1.1694399118f , 30, MPC_FIXED_POINT_SYNTH_FIX);
A12 = MPC_SCALE_CONST_SHR ((Sample[12] - Sample[19]) , 1.4841645956f , 30, MPC_FIXED_POINT_SYNTH_FIX);
#endif
A13 = MPC_SCALE_CONST_SHR ((Sample[13] - Sample[18]) , 2.0577809811f , 29, MPC_FIXED_POINT_SYNTH_FIX);
A14 = MPC_SCALE_CONST_SHR ((Sample[14] - Sample[17]) , 3.4076085091f , 29, MPC_FIXED_POINT_SYNTH_FIX);
A15 = MPC_SCALE_CONST_SHR ((Sample[15] - Sample[16]) , 10.1900081635f, 27 ,MPC_FIXED_POINT_SYNTH_FIX);
B00 = A00 + A15;
B01 = A01 + A14;
B02 = A02 + A13;
B03 = A03 + A12;
B04 = A04 + A11;
B05 = A05 + A10;
B06 = A06 + A09;
B07 = A07 + A08;
B08 = MPC_SCALE_CONST((A00 - A15) , 0.5024192929f , 31);
B09 = MPC_SCALE_CONST((A01 - A14) , 0.5224986076f , 31);
B10 = MPC_SCALE_CONST((A02 - A13) , 0.5669440627f , 31);
B11 = MPC_SCALE_CONST((A03 - A12) , 0.6468217969f , 31);
B12 = MPC_SCALE_CONST((A04 - A11) , 0.7881546021f , 31);
B13 = MPC_SCALE_CONST((A05 - A10) , 1.0606776476f , 30);
B14 = MPC_SCALE_CONST((A06 - A09) , 1.7224471569f , 30);
B15 = MPC_SCALE_CONST((A07 - A08) , 5.1011486053f , 28);
A00 = B00 + B07;
A01 = B01 + B06;
A02 = B02 + B05;
A03 = B03 + B04;
A04 = MPC_SCALE_CONST((B00 - B07) , 0.5097956061f , 31);
A05 = MPC_SCALE_CONST((B01 - B06) , 0.6013448834f , 31);
A06 = MPC_SCALE_CONST((B02 - B05) , 0.8999761939f , 31);
A07 = MPC_SCALE_CONST((B03 - B04) , 2.5629155636f , 29);
A08 = B08 + B15;
A09 = B09 + B14;
A10 = B10 + B13;
A11 = B11 + B12;
A12 = MPC_SCALE_CONST((B08 - B15) , 0.5097956061f , 31);
A13 = MPC_SCALE_CONST((B09 - B14) , 0.6013448834f , 31);
A14 = MPC_SCALE_CONST((B10 - B13) , 0.8999761939f , 31);
A15 = MPC_SCALE_CONST((B11 - B12) , 2.5629155636f , 29);
B00 = A00 + A03;
B01 = A01 + A02;
B02 = MPC_SCALE_CONST((A00 - A03) , 0.5411961079f , 31);
B03 = MPC_SCALE_CONST((A01 - A02) , 1.3065630198f , 30);
B04 = A04 + A07;
B05 = A05 + A06;
B06 = MPC_SCALE_CONST((A04 - A07) , 0.5411961079f , 31);
B07 = MPC_SCALE_CONST((A05 - A06) , 1.3065630198f , 30);
B08 = A08 + A11;
B09 = A09 + A10;
B10 = MPC_SCALE_CONST((A08 - A11) , 0.5411961079f , 31);
B11 = MPC_SCALE_CONST((A09 - A10) , 1.3065630198f , 30);
B12 = A12 + A15;
B13 = A13 + A14;
B14 = MPC_SCALE_CONST((A12 - A15) , 0.5411961079f , 31);
B15 = MPC_SCALE_CONST((A13 - A14) , 1.3065630198f , 30);
A00 = MPC_SHL(B00 + B01, MPC_FIXED_POINT_SYNTH_FIX);
A01 = MPC_SCALE_CONST_SHL((B00 - B01) , 0.7071067691f , 31, MPC_FIXED_POINT_SYNTH_FIX);
A02 = MPC_SHL(B02 + B03, MPC_FIXED_POINT_SYNTH_FIX);
A03 = MPC_SCALE_CONST_SHL((B02 - B03) , 0.7071067691f , 31, MPC_FIXED_POINT_SYNTH_FIX);
A04 = MPC_SHL(B04 + B05, MPC_FIXED_POINT_SYNTH_FIX);
A05 = MPC_SCALE_CONST_SHL((B04 - B05) , 0.7071067691f , 31, MPC_FIXED_POINT_SYNTH_FIX);
A06 = MPC_SHL(B06 + B07, MPC_FIXED_POINT_SYNTH_FIX);
A07 = MPC_SCALE_CONST_SHL((B06 - B07) , 0.7071067691f , 31, MPC_FIXED_POINT_SYNTH_FIX);
A08 = MPC_SHL(B08 + B09, MPC_FIXED_POINT_SYNTH_FIX);
A09 = MPC_SCALE_CONST_SHL((B08 - B09) , 0.7071067691f , 31, MPC_FIXED_POINT_SYNTH_FIX);
A10 = MPC_SHL(B10 + B11, MPC_FIXED_POINT_SYNTH_FIX);
A11 = MPC_SCALE_CONST_SHL((B10 - B11) , 0.7071067691f , 31, MPC_FIXED_POINT_SYNTH_FIX);
A12 = MPC_SHL(B12 + B13, MPC_FIXED_POINT_SYNTH_FIX);
A13 = MPC_SCALE_CONST_SHL((B12 - B13) , 0.7071067691f , 31, MPC_FIXED_POINT_SYNTH_FIX);
A14 = MPC_SHL(B14 + B15, MPC_FIXED_POINT_SYNTH_FIX);
A15 = MPC_SCALE_CONST_SHL((B14 - B15) , 0.7071067691f , 31, MPC_FIXED_POINT_SYNTH_FIX);
// mehrfach verwendete Ausdrücke: A04+A06+A07, A09+A13+A15
V[ 5] = (V[11] = (V[13] = A07 + (V[15] = A15)) + A11) + A05 + A13;
V[ 7] = (V[ 9] = A03 + A11 + A15) + A13;
V[33] = -(V[ 1] = A01 + A09 + A13 + A15) - A14;
V[35] = -(V[ 3] = A05 + A07 + A09 + A13 + A15) - A06 - A14;
V[37] = (tmp = -(A10 + A11 + A13 + A14 + A15)) - A05 - A06 - A07;
V[39] = tmp - A02 - A03; // abhängig vom Befehl drüber
V[41] = (tmp += A13 - A12) - A02 - A03; // abhängig vom Befehl 2 drüber
V[43] = tmp - A04 - A06 - A07; // abhängig von Befehlen 1 und 3 drüber
V[47] = (tmp = -(A08 + A12 + A14 + A15)) - A00;
V[45] = tmp - A04 - A06 - A07; // abhängig vom Befehl drüber
V[32] = -V[ 0];
V[31] = -V[ 1];
V[30] = -V[ 2];
V[29] = -V[ 3];
V[28] = -V[ 4];
V[27] = -V[ 5];
V[26] = -V[ 6];
V[25] = -V[ 7];
V[24] = -V[ 8];
V[23] = -V[ 9];
V[22] = -V[10];
V[21] = -V[11];
V[20] = -V[12];
V[19] = -V[13];
V[18] = -V[14];
V[17] = -V[15];
V[63] = V[33];
V[62] = V[34];
V[61] = V[35];
V[60] = V[36];
V[59] = V[37];
V[58] = V[38];
V[57] = V[39];
V[56] = V[40];
V[55] = V[41];
V[54] = V[42];
V[53] = V[43];
V[52] = V[44];
V[51] = V[45];
V[50] = V[46];
V[49] = V[47];
}
static void Synthese_Filter_float_internal(MPC_SAMPLE_FORMAT * OutData,MPC_SAMPLE_FORMAT * V,const MPC_SAMPLE_FORMAT * Y)
{
mpc_uint32_t n;
for ( n = 0; n < 36; n++, Y += 32 ) {
V -= 64;
Calculate_New_V ( Y, V );
{
MPC_SAMPLE_FORMAT * Data = OutData;
const MPC_SAMPLE_FORMAT * D = (const MPC_SAMPLE_FORMAT *) &Di_opt;
mpc_int32_t k;
//mpc_int32_t tmp;
for ( k = 0; k < 32; k++, D += 16, V++ ) {
*Data = MPC_SHL(
MPC_MULTIPLY_FRACT(V[ 0],D[ 0]) + MPC_MULTIPLY_FRACT(V[ 96],D[ 1]) + MPC_MULTIPLY_FRACT(V[128],D[ 2]) + MPC_MULTIPLY_FRACT(V[224],D[ 3])
+ MPC_MULTIPLY_FRACT(V[256],D[ 4]) + MPC_MULTIPLY_FRACT(V[352],D[ 5]) + MPC_MULTIPLY_FRACT(V[384],D[ 6]) + MPC_MULTIPLY_FRACT(V[480],D[ 7])
+ MPC_MULTIPLY_FRACT(V[512],D[ 8]) + MPC_MULTIPLY_FRACT(V[608],D[ 9]) + MPC_MULTIPLY_FRACT(V[640],D[10]) + MPC_MULTIPLY_FRACT(V[736],D[11])
+ MPC_MULTIPLY_FRACT(V[768],D[12]) + MPC_MULTIPLY_FRACT(V[864],D[13]) + MPC_MULTIPLY_FRACT(V[896],D[14]) + MPC_MULTIPLY_FRACT(V[992],D[15])
, 2);
Data += 2;
}
V -= 32;//bleh
OutData+=64;
}
}
}
void
mpc_decoder_synthese_filter_float(mpc_decoder *d, MPC_SAMPLE_FORMAT* OutData)
{
/********* left channel ********/
memmove(d->V_L + MPC_V_MEM, d->V_L, 960 * sizeof(MPC_SAMPLE_FORMAT) );
Synthese_Filter_float_internal(
OutData,
(MPC_SAMPLE_FORMAT *)(d->V_L + MPC_V_MEM),
(MPC_SAMPLE_FORMAT *)(d->Y_L [0]));
/******** right channel ********/
memmove(d->V_R + MPC_V_MEM, d->V_R, 960 * sizeof(MPC_SAMPLE_FORMAT) );
Synthese_Filter_float_internal(
OutData + 1,
(MPC_SAMPLE_FORMAT *)(d->V_R + MPC_V_MEM),
(MPC_SAMPLE_FORMAT *)(d->Y_R [0]));
}
/*******************************************/
/* */
/* dithered synthesis */
/* */
/*******************************************/
static const unsigned char Parity [256] = { // parity
0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,
1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,
1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,
0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,
1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,
0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,
0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,
1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0
};
/*
* This is a simple random number generator with good quality for audio purposes.
* It consists of two polycounters with opposite rotation direction and different
* periods. The periods are coprime, so the total period is the product of both.
*
* -------------------------------------------------------------------------------------------------
* +-> |31:30:29:28:27:26:25:24:23:22:21:20:19:18:17:16:15:14:13:12:11:10: 9: 8: 7: 6: 5: 4: 3: 2: 1: 0|
* | -------------------------------------------------------------------------------------------------
* | | | | | | |
* | +--+--+--+-XOR-+--------+
* | |
* +--------------------------------------------------------------------------------------+
*
* -------------------------------------------------------------------------------------------------
* |31:30:29:28:27:26:25:24:23:22:21:20:19:18:17:16:15:14:13:12:11:10: 9: 8: 7: 6: 5: 4: 3: 2: 1: 0| <-+
* ------------------------------------------------------------------------------------------------- |
* | | | | |
* +--+----XOR----+--+ |
* | |
* +----------------------------------------------------------------------------------------+
*
*
* The first has an period of 3*5*17*257*65537, the second of 7*47*73*178481,
* which gives a period of 18.410.713.077.675.721.215. The result is the
* XORed values of both generators.
*/
mpc_uint32_t
mpc_random_int(mpc_decoder *d)
{
#if 1
mpc_uint32_t t1, t2, t3, t4;
t3 = t1 = d->__r1; t4 = t2 = d->__r2; // Parity calculation is done via table lookup, this is also available
t1 &= 0xF5; t2 >>= 25; // on CPUs without parity, can be implemented in C and avoid unpredictable
t1 = Parity [t1]; t2 &= 0x63; // jumps and slow rotate through the carry flag operations.
t1 <<= 31; t2 = Parity [t2];
return (d->__r1 = (t3 >> 1) | t1 ) ^ (d->__r2 = (t4 + t4) | t2 );
#else
return (d->__r1 = (d->__r1 >> 1) | ((mpc_uint32_t)Parity [d->__r1 & 0xF5] << 31) ) ^
(d->__r2 = (d->__r2 << 1) | (mpc_uint32_t)Parity [(d->__r2 >> 25) & 0x63] );
#endif
}

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIdentifier</key>
<string>com.yourcompany.yourcocoaframework</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
</plist>

View File

@ -0,0 +1,379 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 42;
objects = {
/* Begin PBXBuildFile section */
8DC2EF530486A6940098B216 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C1666FE841158C02AAC07 /* InfoPlist.strings */; };
8E6096C509F314CF006D8BD7 /* huffsv7.c in Sources */ = {isa = PBXBuildFile; fileRef = 8E6096BC09F314CF006D8BD7 /* huffsv7.c */; };
8E6096C609F314CF006D8BD7 /* huffsv46.c in Sources */ = {isa = PBXBuildFile; fileRef = 8E6096BD09F314CF006D8BD7 /* huffsv46.c */; };
8E6096C709F314CF006D8BD7 /* idtag.c in Sources */ = {isa = PBXBuildFile; fileRef = 8E6096BE09F314CF006D8BD7 /* idtag.c */; };
8E6096C809F314CF006D8BD7 /* mpc_decoder.c in Sources */ = {isa = PBXBuildFile; fileRef = 8E6096BF09F314CF006D8BD7 /* mpc_decoder.c */; };
8E6096C909F314CF006D8BD7 /* mpc_reader.c in Sources */ = {isa = PBXBuildFile; fileRef = 8E6096C009F314CF006D8BD7 /* mpc_reader.c */; };
8E6096CA09F314CF006D8BD7 /* requant.c in Sources */ = {isa = PBXBuildFile; fileRef = 8E6096C109F314CF006D8BD7 /* requant.c */; };
8E6096CC09F314CF006D8BD7 /* streaminfo.c in Sources */ = {isa = PBXBuildFile; fileRef = 8E6096C309F314CF006D8BD7 /* streaminfo.c */; };
8E6096CD09F314CF006D8BD7 /* synth_filter.c in Sources */ = {isa = PBXBuildFile; fileRef = 8E6096C409F314CF006D8BD7 /* synth_filter.c */; };
8E6096DC09F314DB006D8BD7 /* config.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E6096CE09F314DB006D8BD7 /* config.h */; };
8E6096DD09F314DB006D8BD7 /* mainpage.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E6096CF09F314DB006D8BD7 /* mainpage.h */; };
8E6096DE09F314DB006D8BD7 /* config_types.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E6096D109F314DB006D8BD7 /* config_types.h */; settings = {ATTRIBUTES = (Public, ); }; };
8E6096E009F314DB006D8BD7 /* config_win32.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E6096D309F314DB006D8BD7 /* config_win32.h */; settings = {ATTRIBUTES = (Public, ); }; };
8E6096E109F314DB006D8BD7 /* decoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E6096D409F314DB006D8BD7 /* decoder.h */; settings = {ATTRIBUTES = (Public, ); }; };
8E6096E209F314DB006D8BD7 /* huffman.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E6096D509F314DB006D8BD7 /* huffman.h */; settings = {ATTRIBUTES = (Public, ); }; };
8E6096E309F314DB006D8BD7 /* internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E6096D609F314DB006D8BD7 /* internal.h */; settings = {ATTRIBUTES = (Public, ); }; };
8E6096E409F314DB006D8BD7 /* math.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E6096D709F314DB006D8BD7 /* math.h */; settings = {ATTRIBUTES = (Public, ); }; };
8E6096E509F314DB006D8BD7 /* mpcdec.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E6096D809F314DB006D8BD7 /* mpcdec.h */; settings = {ATTRIBUTES = (Public, ); }; };
8E6096E609F314DB006D8BD7 /* reader.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E6096D909F314DB006D8BD7 /* reader.h */; settings = {ATTRIBUTES = (Public, ); }; };
8E6096E709F314DB006D8BD7 /* requant.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E6096DA09F314DB006D8BD7 /* requant.h */; settings = {ATTRIBUTES = (Public, ); }; };
8E6096E809F314DB006D8BD7 /* streaminfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E6096DB09F314DB006D8BD7 /* streaminfo.h */; settings = {ATTRIBUTES = (Public, ); }; };
/* End PBXBuildFile section */
/* Begin PBXBuildStyle section */
014CEA440018CDF011CA2923 /* Debug */ = {
isa = PBXBuildStyle;
buildSettings = {
};
name = Debug;
};
014CEA450018CDF011CA2923 /* Release */ = {
isa = PBXBuildStyle;
buildSettings = {
};
name = Release;
};
/* End PBXBuildStyle section */
/* Begin PBXFileReference section */
089C1667FE841158C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
8DC2EF5A0486A6940098B216 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
8DC2EF5B0486A6940098B216 /* MPCDec.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MPCDec.framework; sourceTree = BUILT_PRODUCTS_DIR; };
8E6096BC09F314CF006D8BD7 /* huffsv7.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = huffsv7.c; path = Files/src/huffsv7.c; sourceTree = "<group>"; };
8E6096BD09F314CF006D8BD7 /* huffsv46.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = huffsv46.c; path = Files/src/huffsv46.c; sourceTree = "<group>"; };
8E6096BE09F314CF006D8BD7 /* idtag.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = idtag.c; path = Files/src/idtag.c; sourceTree = "<group>"; };
8E6096BF09F314CF006D8BD7 /* mpc_decoder.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = mpc_decoder.c; path = Files/src/mpc_decoder.c; sourceTree = "<group>"; };
8E6096C009F314CF006D8BD7 /* mpc_reader.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = mpc_reader.c; path = Files/src/mpc_reader.c; sourceTree = "<group>"; };
8E6096C109F314CF006D8BD7 /* requant.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = requant.c; path = Files/src/requant.c; sourceTree = "<group>"; };
8E6096C209F314CF006D8BD7 /* sample.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = sample.cpp; path = Files/src/sample.cpp; sourceTree = "<group>"; };
8E6096C309F314CF006D8BD7 /* streaminfo.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = streaminfo.c; path = Files/src/streaminfo.c; sourceTree = "<group>"; };
8E6096C409F314CF006D8BD7 /* synth_filter.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = synth_filter.c; path = Files/src/synth_filter.c; sourceTree = "<group>"; };
8E6096CE09F314DB006D8BD7 /* config.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = config.h; path = Files/include/config.h; sourceTree = "<group>"; };
8E6096CF09F314DB006D8BD7 /* mainpage.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = mainpage.h; path = Files/include/mainpage.h; sourceTree = "<group>"; };
8E6096D109F314DB006D8BD7 /* config_types.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = config_types.h; sourceTree = "<group>"; };
8E6096D309F314DB006D8BD7 /* config_win32.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = config_win32.h; sourceTree = "<group>"; };
8E6096D409F314DB006D8BD7 /* decoder.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = decoder.h; sourceTree = "<group>"; };
8E6096D509F314DB006D8BD7 /* huffman.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = huffman.h; sourceTree = "<group>"; };
8E6096D609F314DB006D8BD7 /* internal.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = internal.h; sourceTree = "<group>"; };
8E6096D709F314DB006D8BD7 /* math.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = math.h; sourceTree = "<group>"; };
8E6096D809F314DB006D8BD7 /* mpcdec.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = mpcdec.h; sourceTree = "<group>"; };
8E6096D909F314DB006D8BD7 /* reader.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = reader.h; sourceTree = "<group>"; };
8E6096DA09F314DB006D8BD7 /* requant.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = requant.h; sourceTree = "<group>"; };
8E6096DB09F314DB006D8BD7 /* streaminfo.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = streaminfo.h; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
8DC2EF560486A6940098B216 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
034768DFFF38A50411DB9C8B /* Products */ = {
isa = PBXGroup;
children = (
8DC2EF5B0486A6940098B216 /* MPCDec.framework */,
);
name = Products;
sourceTree = "<group>";
};
0867D691FE84028FC02AAC07 /* MPCDec */ = {
isa = PBXGroup;
children = (
8E6096BB09F314B2006D8BD7 /* Headers */,
8E6096BA09F314AD006D8BD7 /* Source */,
089C1665FE841158C02AAC07 /* Resources */,
0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */,
034768DFFF38A50411DB9C8B /* Products */,
);
name = MPCDec;
sourceTree = "<group>";
};
0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */ = {
isa = PBXGroup;
children = (
1058C7B0FEA5585E11CA2CBB /* Linked Frameworks */,
1058C7B2FEA5585E11CA2CBB /* Other Frameworks */,
);
name = "External Frameworks and Libraries";
sourceTree = "<group>";
};
089C1665FE841158C02AAC07 /* Resources */ = {
isa = PBXGroup;
children = (
8DC2EF5A0486A6940098B216 /* Info.plist */,
089C1666FE841158C02AAC07 /* InfoPlist.strings */,
);
name = Resources;
sourceTree = "<group>";
};
1058C7B0FEA5585E11CA2CBB /* Linked Frameworks */ = {
isa = PBXGroup;
children = (
);
name = "Linked Frameworks";
sourceTree = "<group>";
};
1058C7B2FEA5585E11CA2CBB /* Other Frameworks */ = {
isa = PBXGroup;
children = (
);
name = "Other Frameworks";
sourceTree = "<group>";
};
8E6096BA09F314AD006D8BD7 /* Source */ = {
isa = PBXGroup;
children = (
8E6096BC09F314CF006D8BD7 /* huffsv7.c */,
8E6096BD09F314CF006D8BD7 /* huffsv46.c */,
8E6096BE09F314CF006D8BD7 /* idtag.c */,
8E6096BF09F314CF006D8BD7 /* mpc_decoder.c */,
8E6096C009F314CF006D8BD7 /* mpc_reader.c */,
8E6096C109F314CF006D8BD7 /* requant.c */,
8E6096C209F314CF006D8BD7 /* sample.cpp */,
8E6096C309F314CF006D8BD7 /* streaminfo.c */,
8E6096C409F314CF006D8BD7 /* synth_filter.c */,
);
name = Source;
sourceTree = "<group>";
};
8E6096BB09F314B2006D8BD7 /* Headers */ = {
isa = PBXGroup;
children = (
8E6096CE09F314DB006D8BD7 /* config.h */,
8E6096CF09F314DB006D8BD7 /* mainpage.h */,
8E6096D009F314DB006D8BD7 /* mpcdec */,
);
name = Headers;
sourceTree = "<group>";
};
8E6096D009F314DB006D8BD7 /* mpcdec */ = {
isa = PBXGroup;
children = (
8E6096D109F314DB006D8BD7 /* config_types.h */,
8E6096D309F314DB006D8BD7 /* config_win32.h */,
8E6096D409F314DB006D8BD7 /* decoder.h */,
8E6096D509F314DB006D8BD7 /* huffman.h */,
8E6096D609F314DB006D8BD7 /* internal.h */,
8E6096D709F314DB006D8BD7 /* math.h */,
8E6096D809F314DB006D8BD7 /* mpcdec.h */,
8E6096D909F314DB006D8BD7 /* reader.h */,
8E6096DA09F314DB006D8BD7 /* requant.h */,
8E6096DB09F314DB006D8BD7 /* streaminfo.h */,
);
name = mpcdec;
path = Files/include/mpcdec;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */
8DC2EF500486A6940098B216 /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
8E6096DC09F314DB006D8BD7 /* config.h in Headers */,
8E6096DD09F314DB006D8BD7 /* mainpage.h in Headers */,
8E6096DE09F314DB006D8BD7 /* config_types.h in Headers */,
8E6096E009F314DB006D8BD7 /* config_win32.h in Headers */,
8E6096E109F314DB006D8BD7 /* decoder.h in Headers */,
8E6096E209F314DB006D8BD7 /* huffman.h in Headers */,
8E6096E309F314DB006D8BD7 /* internal.h in Headers */,
8E6096E409F314DB006D8BD7 /* math.h in Headers */,
8E6096E509F314DB006D8BD7 /* mpcdec.h in Headers */,
8E6096E609F314DB006D8BD7 /* reader.h in Headers */,
8E6096E709F314DB006D8BD7 /* requant.h in Headers */,
8E6096E809F314DB006D8BD7 /* streaminfo.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXHeadersBuildPhase section */
/* Begin PBXNativeTarget section */
8DC2EF4F0486A6940098B216 /* MPCDec */ = {
isa = PBXNativeTarget;
buildConfigurationList = 1DEB91AD08733DA50010E9CD /* Build configuration list for PBXNativeTarget "MPCDec" */;
buildPhases = (
8DC2EF500486A6940098B216 /* Headers */,
8DC2EF520486A6940098B216 /* Resources */,
8DC2EF540486A6940098B216 /* Sources */,
8DC2EF560486A6940098B216 /* Frameworks */,
);
buildRules = (
);
buildSettings = {
};
dependencies = (
);
name = MPCDec;
productInstallPath = "$(HOME)/Library/Frameworks";
productName = MPCDec;
productReference = 8DC2EF5B0486A6940098B216 /* MPCDec.framework */;
productType = "com.apple.product-type.framework";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
0867D690FE84028FC02AAC07 /* Project object */ = {
isa = PBXProject;
buildConfigurationList = 1DEB91B108733DA50010E9CD /* Build configuration list for PBXProject "MPCDec" */;
buildSettings = {
};
buildStyles = (
014CEA440018CDF011CA2923 /* Debug */,
014CEA450018CDF011CA2923 /* Release */,
);
hasScannedForEncodings = 1;
mainGroup = 0867D691FE84028FC02AAC07 /* MPCDec */;
productRefGroup = 034768DFFF38A50411DB9C8B /* Products */;
projectDirPath = "";
targets = (
8DC2EF4F0486A6940098B216 /* MPCDec */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
8DC2EF520486A6940098B216 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
8DC2EF530486A6940098B216 /* InfoPlist.strings in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
8DC2EF540486A6940098B216 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
8E6096C509F314CF006D8BD7 /* huffsv7.c in Sources */,
8E6096C609F314CF006D8BD7 /* huffsv46.c in Sources */,
8E6096C709F314CF006D8BD7 /* idtag.c in Sources */,
8E6096C809F314CF006D8BD7 /* mpc_decoder.c in Sources */,
8E6096C909F314CF006D8BD7 /* mpc_reader.c in Sources */,
8E6096CA09F314CF006D8BD7 /* requant.c in Sources */,
8E6096CC09F314CF006D8BD7 /* streaminfo.c in Sources */,
8E6096CD09F314CF006D8BD7 /* synth_filter.c in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXVariantGroup section */
089C1666FE841158C02AAC07 /* InfoPlist.strings */ = {
isa = PBXVariantGroup;
children = (
089C1667FE841158C02AAC07 /* English */,
);
name = InfoPlist.strings;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
1DEB91AE08733DA50010E9CD /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
COPY_PHASE_STRIP = NO;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
FRAMEWORK_VERSION = A;
GCC_DYNAMIC_NO_PIC = NO;
GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_MODEL_TUNING = G5;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PRECOMPILE_PREFIX_HEADER = NO;
GCC_PREFIX_HEADER = "";
HEADER_SEARCH_PATHS = Files/include/;
INFOPLIST_FILE = Info.plist;
INSTALL_PATH = "$(HOME)/Library/Frameworks";
PRODUCT_NAME = MPCDec;
WRAPPER_EXTENSION = framework;
ZERO_LINK = YES;
};
name = Debug;
};
1DEB91AF08733DA50010E9CD /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ARCHS = (
ppc,
i386,
);
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
FRAMEWORK_VERSION = A;
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
GCC_MODEL_TUNING = G5;
GCC_PRECOMPILE_PREFIX_HEADER = NO;
GCC_PREFIX_HEADER = "";
INFOPLIST_FILE = Info.plist;
INSTALL_PATH = "@executable_path/../Frameworks";
PRODUCT_NAME = MPCDec;
USER_HEADER_SEARCH_PATHS = Files/include/;
WRAPPER_EXTENSION = framework;
};
name = Release;
};
1DEB91B208733DA50010E9CD /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
PREBINDING = NO;
SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk;
};
name = Debug;
};
1DEB91B308733DA50010E9CD /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
PREBINDING = NO;
SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
1DEB91AD08733DA50010E9CD /* Build configuration list for PBXNativeTarget "MPCDec" */ = {
isa = XCConfigurationList;
buildConfigurations = (
1DEB91AE08733DA50010E9CD /* Debug */,
1DEB91AF08733DA50010E9CD /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
1DEB91B108733DA50010E9CD /* Build configuration list for PBXProject "MPCDec" */ = {
isa = XCConfigurationList;
buildConfigurations = (
1DEB91B208733DA50010E9CD /* Debug */,
1DEB91B308733DA50010E9CD /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 0867D690FE84028FC02AAC07 /* Project object */;
}