From 2b483958f961637e296432632a5b891eb061c22d Mon Sep 17 00:00:00 2001 From: Thom Johansen Date: Mon, 30 Jan 2006 01:00:40 +0000 Subject: Synced libmpcdec to musepack.net SVN. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8488 a1c6a512-1295-4272-9138-f99709370657 --- apps/codecs/libmusepack/config_types.h | 6 +- apps/codecs/libmusepack/decoder.h | 56 +--- apps/codecs/libmusepack/huffman.h | 32 +-- apps/codecs/libmusepack/huffsv46.c | 269 +++-------------- apps/codecs/libmusepack/huffsv7.c | 507 +++------------------------------ apps/codecs/libmusepack/idtag.c | 1 - apps/codecs/libmusepack/internal.h | 20 +- apps/codecs/libmusepack/math.h | 10 +- apps/codecs/libmusepack/mpc_decoder.c | 359 ++++++++++++----------- apps/codecs/libmusepack/musepack.h | 29 +- apps/codecs/libmusepack/reader.h | 23 +- apps/codecs/libmusepack/requant.c | 36 +-- apps/codecs/libmusepack/requant.h | 6 +- apps/codecs/libmusepack/streaminfo.c | 28 +- apps/codecs/libmusepack/streaminfo.h | 6 +- apps/codecs/libmusepack/synth_filter.c | 6 +- 16 files changed, 361 insertions(+), 1033 deletions(-) (limited to 'apps/codecs/libmusepack') diff --git a/apps/codecs/libmusepack/config_types.h b/apps/codecs/libmusepack/config_types.h index 8f42e11cce..30a609b863 100644 --- a/apps/codecs/libmusepack/config_types.h +++ b/apps/codecs/libmusepack/config_types.h @@ -35,9 +35,9 @@ #ifndef __MUSEPACK_CONFIG_TYPES_H__ #define __MUSEPACK_CONFIG_TYPES_H__ -// typedef unsigned char BOOL; -// #define TRUE 1 -// #define FALSE 0 +typedef unsigned char mpc_bool_t; +#define TRUE 1 +#define FALSE 0 /* these are filled in by configure */ typedef short mpc_int16_t; diff --git a/apps/codecs/libmusepack/decoder.h b/apps/codecs/libmusepack/decoder.h index 11acb7598b..759670ee72 100644 --- a/apps/codecs/libmusepack/decoder.h +++ b/apps/codecs/libmusepack/decoder.h @@ -34,8 +34,8 @@ /// \file decoder.h -#ifndef _musepack_decoder_h_ -#define _musepack_decoder_h_ +#ifndef _mpcdec_decoder_h_ +#define _mpcdec_decoder_h_ #include "huffman.h" #include "math.h" @@ -43,6 +43,8 @@ #include "reader.h" #include "streaminfo.h" +#define MPC_SUPPORT_SV456 + enum { MPC_V_MEM = 2304, MPC_DECODER_MEMSIZE = 16384, // overall buffer size @@ -59,29 +61,28 @@ typedef struct mpc_decoder_t { /// @name internal state variables //@{ - mpc_uint32_t dword; /// actually decoded 32bit-word + mpc_uint32_t dword; /// currently 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 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 FrameWasValid; + mpc_uint32_t MS_used; // MS-coding used ? + mpc_uint32_t TrueGaplessPresent; mpc_uint32_t WordsRead; // counts amount of decoded dwords @@ -89,49 +90,18 @@ typedef struct mpc_decoder_t { 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_bool_t DSCF_Flag_L [32]; + mpc_bool_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? + mpc_bool_t MS_Flag[32]; // MS used? #ifdef MPC_FIXED_POINT unsigned char SCF_shift[256]; #endif diff --git a/apps/codecs/libmusepack/huffman.h b/apps/codecs/libmusepack/huffman.h index a769fece4b..3edbeb7b6e 100644 --- a/apps/codecs/libmusepack/huffman.h +++ b/apps/codecs/libmusepack/huffman.h @@ -35,8 +35,8 @@ /// \file huffman.h /// Data structures and functions for huffman coding. -#ifndef _musepack_huffman_h_ -#define _musepack_huffman_h_ +#ifndef _mpcdec_huffman_h_ +#define _mpcdec_huffman_h_ #include "config_types.h" #include "decoder.h" @@ -46,30 +46,8 @@ 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; + mpc_uint16_t Length; + mpc_int16_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 // _musepack_huffman_h_ +#endif // _mpcdec_huffman_h_ diff --git a/apps/codecs/libmusepack/huffsv46.c b/apps/codecs/libmusepack/huffsv46.c index 4b6e0610d6..3e0fb3ed93 100644 --- a/apps/codecs/libmusepack/huffsv46.c +++ b/apps/codecs/libmusepack/huffsv46.c @@ -35,234 +35,41 @@ /// \file huffsv46.c /// Implementations of huffman decoding for streamversions < 7. -#include "musepack.h" -#include "requant.h" -#include "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; -} +#include +#include +#include + +#ifdef MPC_SUPPORT_SV456 + + +const HuffmanTyp mpc_table_SCFI_Bundle [ 8] = +{{2147483648u,1,7},{1073741824u,2,3},{939524096u,5,1},{805306368u,5,2},{738197504u,6,0},{671088640u,6,6},{536870912u,5,4},{0u,3,5},}; +const HuffmanTyp mpc_table_DSCF_Entropie [13] = +{{3758096384u,3,1},{3489660928u,4,3},{3355443200u,5,5},{3221225472u,5,-3},{2952790016u,4,-2},{2684354560u,4,4},{2147483648u,3,-1},{1610612736u,3,2},{1476395008u,5,-5},{1409286144u,6,6},{1342177280u,6,-6},{1073741824u,4,-4},{0u,2,0},}; +const HuffmanTyp mpc_table_Region_A [16] = +{{2147483648u,1,1},{2013265920u,5,3},{1946157056u,6,4},{1912602624u,7,7},{1895825408u,8,8},{1887436800u,9,9},{1883242496u,10,10},{1881145344u,11,11},{1880096768u,12,12},{1879572480u,13,13},{1879310336u,14,14},{1879048192u,14,15},{1744830464u,5,5},{1610612736u,5,6},{1073741824u,3,0},{0u,2,2},}; +const HuffmanTyp mpc_table_Region_B [ 8] = +{{2147483648u,1,1},{1073741824u,2,0},{536870912u,3,2},{268435456u,4,3},{134217728u,5,4},{67108864u,6,5},{33554432u,7,6},{0u,7,7},}; +const HuffmanTyp mpc_table_Region_C [ 4] = +{{2147483648u,1,0},{1073741824u,2,1},{536870912u,3,2},{0u,3,3},}; + +static const HuffmanTyp mpc_table_Entropie_1 [ 3] = +{{2147483648u,1,0},{1073741824u,2,-1},{0u,2,1},}; +static const HuffmanTyp mpc_table_Entropie_2 [ 5] = +{{3221225472u,2,0},{2684354560u,3,2},{2147483648u,3,-2},{1073741824u,2,1},{0u,2,-1},}; +static const HuffmanTyp mpc_table_Entropie_3 [ 7] = +{{3221225472u,2,0},{2684354560u,3,-2},{2415919104u,4,2},{2281701376u,5,-3},{2147483648u,5,3},{1073741824u,2,-1},{0u,2,1},}; +static const HuffmanTyp mpc_table_Entropie_4 [ 9] = +{{4026531840u,4,3},{3758096384u,4,-3},{3221225472u,3,1},{2684354560u,3,-1},{2147483648u,3,2},{1610612736u,3,-2},{1342177280u,4,-4},{1073741824u,4,4},{0u,2,0},}; +static const HuffmanTyp mpc_table_Entropie_5 [15] = +{{4026531840u,4,-2},{3892314112u,5,-5},{3825205248u,6,-7},{3758096384u,6,7},{3489660928u,4,-3},{3221225472u,4,3},{3087007744u,5,-6},{2952790016u,5,6},{2684354560u,4,4},{2147483648u,3,0},{1610612736u,3,1},{1073741824u,3,-1},{805306368u,4,-4},{536870912u,4,5},{0u,3,2},}; +static const HuffmanTyp mpc_table_Entropie_6 [31] = +{{4160749568u,5,-4},{4026531840u,5,5},{3892314112u,5,-5},{3825205248u,6,10},{3758096384u,6,-10},{3623878656u,5,-6},{3489660928u,5,6},{3355443200u,5,7},{3221225472u,5,-7},{3087007744u,5,-8},{3019898880u,6,-11},{2986344448u,7,14},{2952790016u,7,-14},{2818572288u,5,8},{2751463424u,6,11},{2684354560u,6,-13},{2415919104u,4,0},{2147483648u,4,1},{1879048192u,4,-1},{1610612736u,4,3},{1342177280u,4,2},{1207959552u,5,-9},{1140850688u,6,12},{1073741824u,6,13},{805306368u,4,-3},{536870912u,4,-2},{402653184u,5,9},{335544320u,6,-12},{301989888u,7,15},{268435456u,7,-15},{0u,4,4},}; +static const HuffmanTyp mpc_table_Entropie_7 [63] = +{{4278190080u,8,28},{4261412864u,8,26},{4227858432u,7,-20},{4160749568u,6,8},{4093640704u,6,-8},{4026531840u,6,-9},{3959422976u,6,9},{3925868544u,7,20},{3892314112u,7,21},{3825205248u,6,-10},{3758096384u,6,-11},{3690987520u,6,10},{3623878656u,6,11},{3590324224u,7,-21},{3573547008u,8,29},{3556769792u,8,-29},{3489660928u,6,13},{3422552064u,6,-13},{3355443200u,6,-12},{3288334336u,6,12},{3254779904u,7,-22},{3221225472u,7,22},{3154116608u,6,14},{3087007744u,6,15},{3019898880u,6,-14},{2986344448u,7,-23},{2952790016u,7,23},{2885681152u,6,-15},{2818572288u,6,-16},{2751463424u,6,16},{2717908992u,7,27},{2684354560u,7,-27},{2617245696u,6,17},{2550136832u,6,-17},{2533359616u,8,-30},{2516582400u,8,30},{2483027968u,7,24},{2415919104u,6,-18},{2281701376u,5,-1},{2147483648u,5,1},{2113929216u,7,-24},{2080374784u,7,25},{2013265920u,6,18},{1879048192u,5,-3},{1744830464u,5,3},{1610612736u,5,5},{1476395008u,5,0},{1342177280u,5,-2},{1275068416u,6,19},{1207959552u,6,-19},{1073741824u,5,-5},{939524096u,5,-4},{805306368u,5,-7},{671088640u,5,2},{536870912u,5,4},{402653184u,5,7},{369098752u,7,-25},{335544320u,7,-26},{301989888u,7,-28},{285212672u,8,-31},{268435456u,8,31},{134217728u,5,6},{0u,5,-6},}; + +const HuffmanTyp* mpc_table_SampleHuff [18] = { + NULL,mpc_table_Entropie_1,mpc_table_Entropie_2,mpc_table_Entropie_3,mpc_table_Entropie_4,mpc_table_Entropie_5,mpc_table_Entropie_6,mpc_table_Entropie_7,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL +}; + +#endif //#ifdef MPC_SUPPORT_SV456 diff --git a/apps/codecs/libmusepack/huffsv7.c b/apps/codecs/libmusepack/huffsv7.c index bebe1af07c..a59674191d 100644 --- a/apps/codecs/libmusepack/huffsv7.c +++ b/apps/codecs/libmusepack/huffsv7.c @@ -35,466 +35,47 @@ /// \file huffsv7.c /// Implementations of sv7 huffman decoding functions. -#include "musepack.h" -#include "huffman.h" -#include "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 */ -} +#include +#include +#include + +const HuffmanTyp mpc_table_HuffHdr [10] = +{{2147483648u,1,0},{1610612736u,3,1},{1577058304u,7,-4},{1568669696u,9,3},{1560281088u,9,4},{1543503872u,8,-5},{1476395008u,6,2},{1342177280u,5,-3},{1073741824u,4,-2},{0u,2,-1},}; +const HuffmanTyp mpc_table_HuffSCFI [ 4] = +{{2147483648u,1,1},{1610612736u,3,2},{1073741824u,3,0},{0u,2,3},}; +const HuffmanTyp mpc_table_HuffDSCF [16] = +{{4160749568u,5,5},{4026531840u,5,-4},{3758096384u,4,3},{3489660928u,4,-3},{3221225472u,4,8},{2684354560u,3,1},{2415919104u,4,0},{2281701376u,5,-5},{2214592512u,6,7},{2147483648u,6,-7},{1610612736u,3,-1},{1073741824u,3,2},{805306368u,4,4},{671088640u,5,6},{536870912u,5,-6},{0u,3,-2},}; + +static const HuffmanTyp mpc_table_HuffQ1 [2] [3*3*3] = { + {{3758096384u,3,13},{3690987520u,6,26},{3623878656u,6,0},{3556769792u,6,20},{3489660928u,6,6},{3221225472u,4,14},{2952790016u,4,12},{2684354560u,4,4},{2415919104u,4,22},{2348810240u,6,8},{2281701376u,6,18},{2214592512u,6,24},{2147483648u,6,2},{1879048192u,4,16},{1610612736u,4,10},{1476395008u,5,17},{1342177280u,5,9},{1207959552u,5,1},{1073741824u,5,25},{939524096u,5,5},{805306368u,5,21},{671088640u,5,3},{536870912u,5,11},{402653184u,5,15},{268435456u,5,23},{134217728u,5,19},{0u,5,7},}, + {{2147483648u,1,13},{2113929216u,7,15},{2080374784u,7,1},{2046820352u,7,11},{2013265920u,7,7},{1979711488u,7,17},{1946157056u,7,25},{1912602624u,7,19},{1904214016u,9,8},{1895825408u,9,18},{1887436800u,9,2},{1879048192u,9,24},{1845493760u,7,3},{1811939328u,7,23},{1778384896u,7,21},{1744830464u,7,5},{1728053248u,8,0},{1711276032u,8,26},{1694498816u,8,6},{1677721600u,8,20},{1610612736u,6,9},{1342177280u,4,14},{1073741824u,4,12},{805306368u,4,4},{536870912u,4,22},{268435456u,4,16},{0u,4,10},}, +}; +static const HuffmanTyp mpc_table_HuffQ2 [2] [5*5] = { + {{4026531840u,4,13},{3758096384u,4,17},{3489660928u,4,7},{3221225472u,4,11},{3154116608u,6,1},{3087007744u,6,23},{3053453312u,7,4},{3019898880u,7,20},{2986344448u,7,0},{2952790016u,7,24},{2818572288u,5,22},{2684354560u,5,10},{2147483648u,3,12},{2013265920u,5,2},{1879048192u,5,14},{1610612736u,4,6},{1342177280u,4,18},{1073741824u,4,8},{805306368u,4,16},{671088640u,5,9},{536870912u,5,5},{402653184u,5,15},{268435456u,5,21},{134217728u,5,19},{0u,5,3},}, + {{4160749568u,5,18},{4026531840u,5,6},{3892314112u,5,8},{3875536896u,8,3},{3871342592u,10,24},{3867148288u,10,4},{3862953984u,10,0},{3858759680u,10,20},{3825205248u,7,23},{3791650816u,7,1},{3758096384u,7,19},{3623878656u,5,16},{3590324224u,7,15},{3556769792u,7,21},{3523215360u,7,9},{3489660928u,7,5},{3422552064u,6,2},{3355443200u,6,10},{3288334336u,6,14},{3221225472u,6,22},{2147483648u,2,12},{1610612736u,3,13},{1073741824u,3,17},{536870912u,3,11},{0u,3,7},}, +}; +static const HuffmanTyp mpc_table_HuffQ3 [2] [ 7] = { + {{3758096384u,3,1},{3489660928u,4,3},{3221225472u,4,-3},{2684354560u,3,2},{2147483648u,3,-2},{1073741824u,2,0},{0u,2,-1},}, + {{3221225472u,2,0},{2147483648u,2,-1},{1073741824u,2,1},{805306368u,4,-2},{671088640u,5,3},{536870912u,5,-3},{0u,3,2},}, +}; +static const HuffmanTyp mpc_table_HuffQ4 [2] [ 9] = { + {{3758096384u,3,0},{3221225472u,3,-1},{2684354560u,3,1},{2147483648u,3,-2},{1610612736u,3,2},{1342177280u,4,-4},{1073741824u,4,4},{536870912u,3,3},{0u,3,-3},}, + {{3758096384u,3,1},{3489660928u,4,2},{3221225472u,4,-3},{2147483648u,2,0},{1610612736u,3,-2},{1342177280u,4,3},{1207959552u,5,-4},{1073741824u,5,4},{0u,2,-1},}, +}; +static const HuffmanTyp mpc_table_HuffQ5 [2] [15] = { + {{4026531840u,4,2},{3892314112u,5,5},{3825205248u,6,-7},{3758096384u,6,7},{3489660928u,4,-3},{3221225472u,4,3},{3087007744u,5,-6},{2952790016u,5,6},{2684354560u,4,-4},{2415919104u,4,4},{2147483648u,4,-5},{1610612736u,3,0},{1073741824u,3,-1},{536870912u,3,1},{0u,3,-2},}, + {{4026531840u,4,3},{3892314112u,5,4},{3858759680u,7,6},{3841982464u,8,-7},{3825205248u,8,7},{3758096384u,6,-6},{3221225472u,3,0},{2684354560u,3,-1},{2147483648u,3,1},{1610612736u,3,-2},{1073741824u,3,2},{939524096u,5,-5},{805306368u,5,5},{536870912u,4,-4},{0u,3,-3},}, +}; +static const HuffmanTyp mpc_table_HuffQ6 [2] [31] = { + {{4160749568u,5,3},{4026531840u,5,-4},{3959422976u,6,-11},{3892314112u,6,12},{3758096384u,5,4},{3623878656u,5,6},{3489660928u,5,-5},{3355443200u,5,5},{3221225472u,5,7},{3087007744u,5,-7},{3019898880u,6,-12},{2952790016u,6,-13},{2818572288u,5,-6},{2684354560u,5,8},{2550136832u,5,-8},{2415919104u,5,9},{2281701376u,5,-9},{2214592512u,6,13},{2181038080u,7,-15},{2147483648u,7,15},{1879048192u,4,0},{1744830464u,5,-10},{1610612736u,5,10},{1342177280u,4,-1},{1073741824u,4,2},{805306368u,4,1},{536870912u,4,-2},{469762048u,6,14},{402653184u,6,-14},{268435456u,5,11},{0u,4,-3},}, + {{4160749568u,5,-6},{4026531840u,5,6},{3758096384u,4,1},{3489660928u,4,-1},{3456106496u,7,10},{3422552064u,7,-10},{3405774848u,8,-11},{3397386240u,9,-12},{3395289088u,11,13},{3394764800u,13,15},{3394240512u,13,-14},{3393716224u,13,14},{3393191936u,13,-15},{3388997632u,10,-13},{3372220416u,8,11},{3355443200u,8,12},{3288334336u,6,-9},{3221225472u,6,9},{2952790016u,4,-2},{2684354560u,4,2},{2415919104u,4,3},{2147483648u,4,-3},{2013265920u,5,-7},{1879048192u,5,7},{1610612736u,4,-4},{1342177280u,4,4},{1207959552u,5,-8},{1073741824u,5,8},{805306368u,4,5},{536870912u,4,-5},{0u,3,0},}, +}; +static const HuffmanTyp mpc_table_HuffQ7 [2] [63] = { + {{4227858432u,6,7},{4160749568u,6,8},{4093640704u,6,9},{4026531840u,6,-8},{3959422976u,6,11},{3925868544u,7,21},{3909091328u,8,-28},{3892314112u,8,28},{3825205248u,6,-9},{3791650816u,7,-22},{3758096384u,7,-21},{3690987520u,6,-10},{3623878656u,6,-11},{3556769792u,6,10},{3489660928u,6,12},{3422552064u,6,-13},{3388997632u,7,22},{3355443200u,7,23},{3288334336u,6,-12},{3221225472u,6,13},{3154116608u,6,14},{3087007744u,6,-14},{3053453312u,7,-23},{3036676096u,8,-29},{3019898880u,8,29},{2952790016u,6,-15},{2885681152u,6,15},{2818572288u,6,16},{2751463424u,6,-16},{2717908992u,7,-24},{2684354560u,7,24},{2617245696u,6,17},{2583691264u,7,-25},{2566914048u,8,-30},{2550136832u,8,30},{2483027968u,6,-17},{2415919104u,6,18},{2348810240u,6,-18},{2315255808u,7,25},{2281701376u,7,26},{2214592512u,6,19},{2181038080u,7,-26},{2147483648u,7,-27},{2013265920u,5,2},{1946157056u,6,-19},{1879048192u,6,20},{1744830464u,5,-1},{1728053248u,8,-31},{1711276032u,8,31},{1677721600u,7,27},{1610612736u,6,-20},{1476395008u,5,1},{1342177280u,5,-5},{1207959552u,5,-3},{1073741824u,5,3},{939524096u,5,0},{805306368u,5,-2},{671088640u,5,-4},{536870912u,5,4},{402653184u,5,5},{268435456u,5,-6},{134217728u,5,6},{0u,5,-7},}, + {{4160749568u,5,-1},{4026531840u,5,2},{3892314112u,5,-2},{3758096384u,5,3},{3741319168u,8,-20},{3737124864u,10,24},{3736862720u,14,28},{3736600576u,14,-28},{3736338432u,14,-30},{3736076288u,14,30},{3735027712u,12,-27},{3734765568u,14,29},{3734503424u,14,-29},{3734241280u,14,31},{3733979136u,14,-31},{3732930560u,12,27},{3724541952u,9,-22},{3690987520u,7,-17},{3623878656u,6,-11},{3489660928u,5,-3},{3355443200u,5,4},{3221225472u,5,-4},{3187671040u,7,17},{3170893824u,8,20},{3162505216u,9,22},{3158310912u,10,-25},{3154116608u,10,-26},{3087007744u,6,12},{2952790016u,5,5},{2818572288u,5,-5},{2684354560u,5,6},{2550136832u,5,-6},{2483027968u,6,-12},{2449473536u,7,-18},{2415919104u,7,18},{2348810240u,6,13},{2281701376u,6,-13},{2147483648u,5,-7},{2080374784u,6,14},{2063597568u,8,21},{2046820352u,8,-21},{2013265920u,7,-19},{1879048192u,5,7},{1744830464u,5,8},{1677721600u,6,-14},{1610612736u,6,-15},{1476395008u,5,-8},{1409286144u,6,15},{1375731712u,7,19},{1371537408u,10,25},{1367343104u,10,26},{1358954496u,9,-23},{1350565888u,9,23},{1342177280u,9,-24},{1207959552u,5,-9},{1073741824u,5,9},{1006632960u,6,16},{939524096u,6,-16},{805306368u,5,10},{536870912u,4,0},{402653184u,5,-10},{268435456u,5,11},{0u,4,1},}, +}; + +const HuffmanTyp* mpc_table_HuffQ [2] [8] = { + {0,mpc_table_HuffQ1[0],mpc_table_HuffQ2[0],mpc_table_HuffQ3[0],mpc_table_HuffQ4[0],mpc_table_HuffQ5[0],mpc_table_HuffQ6[0],mpc_table_HuffQ7[0]}, + {0,mpc_table_HuffQ1[1],mpc_table_HuffQ2[1],mpc_table_HuffQ3[1],mpc_table_HuffQ4[1],mpc_table_HuffQ5[1],mpc_table_HuffQ6[1],mpc_table_HuffQ7[1]}, +}; diff --git a/apps/codecs/libmusepack/idtag.c b/apps/codecs/libmusepack/idtag.c index 8f1c9d58fc..8af5ce4d3b 100644 --- a/apps/codecs/libmusepack/idtag.c +++ b/apps/codecs/libmusepack/idtag.c @@ -38,7 +38,6 @@ #include "musepack.h" #include "internal.h" -#include "string.h" mpc_int32_t JumpID3v2 (mpc_reader* r) { diff --git a/apps/codecs/libmusepack/internal.h b/apps/codecs/libmusepack/internal.h index 27656d5a54..19642a240e 100644 --- a/apps/codecs/libmusepack/internal.h +++ b/apps/codecs/libmusepack/internal.h @@ -32,16 +32,24 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/// \file musepack_internal.h -/// Definitions and structures used only internally by the libmusepack. +/// \file internal.h +/// Definitions and structures used only internally by the libmpcdec. + +#ifndef _mpcdec_internal_h +#define _mpcdec_internal_h -#ifndef _musepack_internal_h -#define _musepack_internal_h enum { MPC_DECODER_SYNTH_DELAY = 481 }; +/// Big/little endian 32 bit byte swapping routine. +static __inline +mpc_uint32_t mpc_swap32(mpc_uint32_t val) { + return (((val & 0xff000000) >> 24) | ((val & 0x00ff0000) >> 8) | + ((val & 0x0000ff00) << 8) | ((val & 0x000000ff) << 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 @@ -49,9 +57,9 @@ enum { mpc_int32_t JumpID3v2(mpc_reader* fp); /// helper functions used by multiple files -mpc_uint32_t random_int(mpc_decoder *d); // in synth_filter.c +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 // _musepack_internal_h +#endif // _mpcdec_internal_h diff --git a/apps/codecs/libmusepack/math.h b/apps/codecs/libmusepack/math.h index 247e9d03cd..eb9b0e978a 100644 --- a/apps/codecs/libmusepack/math.h +++ b/apps/codecs/libmusepack/math.h @@ -32,11 +32,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/// \file mpc_math.h -/// Libmusepack internal math routines. +/// \file math.h +/// Libmpcdec internal math routines. -#ifndef _musepack_math_h_ -#define _musepack_math_h_ +#ifndef _mpcdec_math_h_ +#define _mpcdec_math_h_ #define MPC_FIXED_POINT @@ -215,5 +215,5 @@ typedef float MPC_SAMPLE_FORMAT; #endif -#endif // _musepack_math_h_ +#endif // _mpcdec_math_h_ diff --git a/apps/codecs/libmusepack/mpc_decoder.c b/apps/codecs/libmusepack/mpc_decoder.c index 024e7ab2c2..b608ae81e1 100644 --- a/apps/codecs/libmusepack/mpc_decoder.c +++ b/apps/codecs/libmusepack/mpc_decoder.c @@ -35,12 +35,29 @@ /// \file mpc_decoder.c /// Core decoding routines and logic. -#include #include "musepack.h" #include "internal.h" #include "requant.h" #include "huffman.h" +//SV7 tables +extern const HuffmanTyp* mpc_table_HuffQ [2] [8]; +extern const HuffmanTyp mpc_table_HuffHdr [10]; +extern const HuffmanTyp mpc_table_HuffSCFI [ 4]; +extern const HuffmanTyp mpc_table_HuffDSCF [16]; + + +#ifdef MPC_SUPPORT_SV456 +//SV4/5/6 tables +extern const HuffmanTyp* mpc_table_SampleHuff [18]; +extern const HuffmanTyp mpc_table_SCFI_Bundle [ 8]; +extern const HuffmanTyp mpc_table_DSCF_Entropie [13]; +extern const HuffmanTyp mpc_table_Region_A [16]; +extern const HuffmanTyp mpc_table_Region_B [ 8]; +extern const HuffmanTyp mpc_table_Region_C [ 4]; + +#endif + //------------------------------------------------------------------------------ // types //------------------------------------------------------------------------------ @@ -57,12 +74,10 @@ enum //------------------------------------------------------------------------------ // forward declarations //------------------------------------------------------------------------------ -void mpc_decoder_init_huffman_sv6(mpc_decoder *d); -void mpc_decoder_init_huffman_sv7(mpc_decoder *d); void mpc_decoder_read_bitstream_sv6(mpc_decoder *d); void mpc_decoder_read_bitstream_sv7(mpc_decoder *d); void mpc_decoder_update_buffer(mpc_decoder *d, mpc_uint32_t RING); -bool mpc_decoder_seek_sample(mpc_decoder *d, mpc_int64_t destsample); +mpc_bool_t mpc_decoder_seek_sample(mpc_decoder *d, mpc_int64_t destsample); void mpc_decoder_requantisierung(mpc_decoder *d, const mpc_int32_t Last_Band); //------------------------------------------------------------------------------ @@ -73,7 +88,7 @@ static mpc_int32_t f_read(mpc_decoder *d, void *ptr, size_t size) return d->r->read(d->r->data, ptr, size); }; -static bool f_seek(mpc_decoder *d, mpc_int32_t offset) +static mpc_bool_t f_seek(mpc_decoder *d, mpc_int32_t offset) { return d->r->seek(d->r->data, offset); }; @@ -84,7 +99,7 @@ static mpc_int32_t f_read_dword(mpc_decoder *d, mpc_uint32_t * ptr, mpc_uint32_t #ifndef MPC_LITTLE_ENDIAN mpc_uint32_t n; for(n = 0; n< count; n++) { - ptr[n] = swap32(ptr[n]); + ptr[n] = mpc_swap32(ptr[n]); } #endif return count; @@ -152,7 +167,7 @@ mpc_decoder_bitstream_read(mpc_decoder *d, const mpc_uint32_t bits) static void mpc_decoder_scfi_bundle_read( mpc_decoder *d, - HuffmanTyp* Table, mpc_int32_t* SCFI, mpc_int32_t* DSCF) + const HuffmanTyp* Table, mpc_int32_t* SCFI, mpc_bool_t* DSCF) { // load preview and decode mpc_uint32_t code = d->dword << d->pos; @@ -174,29 +189,6 @@ mpc_decoder_scfi_bundle_read( *DSCF = Table->Value & 1; } -static int -mpc_decoder_huffman_typ_cmpfn(const void* p1, const void* p2) -{ - if (((HuffmanTyp*) p1)->Code < ((HuffmanTyp*) p2)->Code ) return +1; - if (((HuffmanTyp*) p1)->Code > ((HuffmanTyp*) p2)->Code ) return -1; - return 0; -} - -// sort huffman-tables by codeword -// offset resulting value -void -mpc_decoder_resort_huff_tables( - const mpc_uint32_t elements, HuffmanTyp* Table, const mpc_int32_t offset ) -{ - mpc_uint32_t i; - - for ( i = 0; i < elements; i++ ) { - Table[i].Code <<= 32 - Table[i].Length; - Table[i].Value = i - offset; - } - qsort(Table, elements, sizeof(*Table), mpc_decoder_huffman_typ_cmpfn); -} - // basic huffman decoding routine // works with maximum lengths up to 14 static mpc_int32_t @@ -318,6 +310,39 @@ mpc_decoder_reset_globals(mpc_decoder *d) memset(d->MS_Flag , 0, sizeof d->MS_Flag ); } +mpc_uint32_t +mpc_decoder_decode_frame(mpc_decoder *d, mpc_uint32_t *in_buffer, + mpc_uint32_t in_len, MPC_SAMPLE_FORMAT *out_buffer) +{ + unsigned int i; + mpc_decoder_reset_bitstream_decode(d); + if (in_len > sizeof(d->Speicher)) in_len = sizeof(d->Speicher); + memcpy(d->Speicher, in_buffer, in_len); +#ifdef MPC_LITTLE_ENDIAN + for (i = 0; i < (in_len + 3) / 4; i++) + d->Speicher[i] = mpc_swap32(d->Speicher[i]); +#endif + d->dword = d->Speicher[0]; + switch (d->StreamVersion) { +#ifdef MPC_SUPPORT_SV456 + case 0x04: + case 0x05: + case 0x06: + mpc_decoder_read_bitstream_sv6(d); + break; +#endif + case 0x07: + case 0x17: + mpc_decoder_read_bitstream_sv7(d); + break; + default: + return (mpc_uint32_t)(-1); + } + mpc_decoder_requantisierung(d, d->Max_Band); + mpc_decoder_synthese_filter_float(d, out_buffer); + return mpc_decoder_bits_read(d); +} + static mpc_uint32_t mpc_decoder_decode_internal(mpc_decoder *d, MPC_SAMPLE_FORMAT *buffer) { @@ -337,11 +362,13 @@ mpc_decoder_decode_internal(mpc_decoder *d, MPC_SAMPLE_FORMAT *buffer) // decode data and check for validity of frame FrameBitCnt = mpc_decoder_bits_read(d); switch (d->StreamVersion) { +#ifdef MPC_SUPPORT_SV456 case 0x04: case 0x05: case 0x06: mpc_decoder_read_bitstream_sv6(d); break; +#endif case 0x07: case 0x17: mpc_decoder_read_bitstream_sv7(d); @@ -375,26 +402,12 @@ mpc_decoder_decode_internal(mpc_decoder *d, MPC_SAMPLE_FORMAT *buffer) // additional FilterDecay samples are needed for decay of synthesis filter if (MPC_DECODER_SYNTH_DELAY + mod_block >= MPC_FRAME_LENGTH) { - - // ********************************************************************** - // Rhoades 4/16/2002 - // Commented out are blocks of code which cause gapless playback to fail. - // Temporary fix... - // ********************************************************************** - if (!d->TrueGaplessPresent) { mpc_decoder_reset_y(d); - } - else { - //if ( MPC_FRAME_LENGTH != d->LastValidSamples ) { + } else { mpc_decoder_bitstream_read(d, 20); mpc_decoder_read_bitstream_sv7(d); mpc_decoder_requantisierung(d, d->Max_Band); - //FilterDecay = d->LastValidSamples; - //} - //else { - //FilterDecay = 0; - //} } mpc_decoder_synthese_filter_float(d, buffer + 2304); @@ -625,13 +638,49 @@ mpc_decoder_requantisierung(mpc_decoder *d, const mpc_int32_t Last_Band) } } +#ifdef MPC_SUPPORT_SV456 +static const unsigned char Q_res[32][16] = { +{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17}, +{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17}, +{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17}, +{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17}, +{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17}, +{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17}, +{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17}, +{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17}, +{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17}, +{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17}, +{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17}, +{0,1,2,3,4,5,6,17,0,0,0,0,0,0,0,0}, +{0,1,2,3,4,5,6,17,0,0,0,0,0,0,0,0}, +{0,1,2,3,4,5,6,17,0,0,0,0,0,0,0,0}, +{0,1,2,3,4,5,6,17,0,0,0,0,0,0,0,0}, +{0,1,2,3,4,5,6,17,0,0,0,0,0,0,0,0}, +{0,1,2,3,4,5,6,17,0,0,0,0,0,0,0,0}, +{0,1,2,3,4,5,6,17,0,0,0,0,0,0,0,0}, +{0,1,2,3,4,5,6,17,0,0,0,0,0,0,0,0}, +{0,1,2,3,4,5,6,17,0,0,0,0,0,0,0,0}, +{0,1,2,3,4,5,6,17,0,0,0,0,0,0,0,0}, +{0,1,2,3,4,5,6,17,0,0,0,0,0,0,0,0}, +{0,1,2,3,4,5,6,17,0,0,0,0,0,0,0,0}, +{0,1,2,17,0,0,0,0,0,0,0,0,0,0,0,0}, +{0,1,2,17,0,0,0,0,0,0,0,0,0,0,0,0}, +{0,1,2,17,0,0,0,0,0,0,0,0,0,0,0,0}, +{0,1,2,17,0,0,0,0,0,0,0,0,0,0,0,0}, +{0,1,2,17,0,0,0,0,0,0,0,0,0,0,0,0}, +{0,1,2,17,0,0,0,0,0,0,0,0,0,0,0,0}, +{0,1,2,17,0,0,0,0,0,0,0,0,0,0,0,0}, +{0,1,2,17,0,0,0,0,0,0,0,0,0,0,0,0}, +{0,1,2,17,0,0,0,0,0,0,0,0,0,0,0,0}, +}; + /****************************************** SV 6 ******************************************/ void mpc_decoder_read_bitstream_sv6(mpc_decoder *d) { mpc_int32_t n,k; mpc_int32_t Max_used_Band=0; - HuffmanTyp *Table; + const HuffmanTyp *Table; const HuffmanTyp *x1; const HuffmanTyp *x2; mpc_int32_t *L; @@ -644,15 +693,15 @@ mpc_decoder_read_bitstream_sv6(mpc_decoder *d) ResR = d->Res_R; for (n=0; n <= d->Max_Band; ++n, ++ResL, ++ResR) { - if (n<11) Table = d->Region_A; - else if (n>=11 && n<=22) Table = d->Region_B; - else /*if (n>=23)*/ Table = d->Region_C; + if (n<11) Table = mpc_table_Region_A; + else if (n>=11 && n<=22) Table = mpc_table_Region_B; + else /*if (n>=23)*/ Table = mpc_table_Region_C; - *ResL = d->Q_res[n][mpc_decoder_huffman_decode(d, Table)]; + *ResL = Q_res[n][mpc_decoder_huffman_decode(d, Table)]; if (d->MS_used) { d->MS_Flag[n] = mpc_decoder_bitstream_read(d, 1); } - *ResR = d->Q_res[n][mpc_decoder_huffman_decode(d, Table)]; + *ResR = Q_res[n][mpc_decoder_huffman_decode(d, Table)]; // only perform the following procedure up to the maximum non-zero subband if (*ResL || *ResR) Max_used_Band = n; @@ -662,8 +711,8 @@ mpc_decoder_read_bitstream_sv6(mpc_decoder *d) ResL = d->Res_L; ResR = d->Res_R; for (n=0; n<=Max_used_Band; ++n, ++ResL, ++ResR) { - if (*ResL) mpc_decoder_scfi_bundle_read(d, d->SCFI_Bundle, &(d->SCFI_L[n]), &(d->DSCF_Flag_L[n])); - if (*ResR) mpc_decoder_scfi_bundle_read(d, d->SCFI_Bundle, &(d->SCFI_R[n]), &(d->DSCF_Flag_R[n])); + if (*ResL) mpc_decoder_scfi_bundle_read(d, mpc_table_SCFI_Bundle, &(d->SCFI_L[n]), &(d->DSCF_Flag_L[n])); + if (*ResR) mpc_decoder_scfi_bundle_read(d, mpc_table_SCFI_Bundle, &(d->SCFI_R[n]), &(d->DSCF_Flag_R[n])); } /***************************** SCFI ********************************/ @@ -682,24 +731,24 @@ mpc_decoder_read_bitstream_sv6(mpc_decoder *d) switch (d->SCFI_L[n]) { case 3: - L[0] = L[2] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie); + L[0] = L[2] + mpc_decoder_huffman_decode_fast(d, mpc_table_DSCF_Entropie); L[1] = L[0]; L[2] = L[1]; break; case 1: - L[0] = L[2] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie); - L[1] = L[0] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie); + L[0] = L[2] + mpc_decoder_huffman_decode_fast(d, mpc_table_DSCF_Entropie); + L[1] = L[0] + mpc_decoder_huffman_decode_fast(d, mpc_table_DSCF_Entropie); L[2] = L[1]; break; case 2: - L[0] = L[2] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie); + L[0] = L[2] + mpc_decoder_huffman_decode_fast(d, mpc_table_DSCF_Entropie); L[1] = L[0]; - L[2] = L[1] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie); + L[2] = L[1] + mpc_decoder_huffman_decode_fast(d, mpc_table_DSCF_Entropie); break; case 0: - L[0] = L[2] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie); - L[1] = L[0] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie); - L[2] = L[1] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie); + L[0] = L[2] + mpc_decoder_huffman_decode_fast(d, mpc_table_DSCF_Entropie); + L[1] = L[0] + mpc_decoder_huffman_decode_fast(d, mpc_table_DSCF_Entropie); + L[2] = L[1] + mpc_decoder_huffman_decode_fast(d, mpc_table_DSCF_Entropie); break; default: return; @@ -748,24 +797,24 @@ mpc_decoder_read_bitstream_sv6(mpc_decoder *d) switch (d->SCFI_R[n]) { case 3: - R[0] = R[2] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie); + R[0] = R[2] + mpc_decoder_huffman_decode_fast(d, mpc_table_DSCF_Entropie); R[1] = R[0]; R[2] = R[1]; break; case 1: - R[0] = R[2] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie); - R[1] = R[0] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie); + R[0] = R[2] + mpc_decoder_huffman_decode_fast(d, mpc_table_DSCF_Entropie); + R[1] = R[0] + mpc_decoder_huffman_decode_fast(d, mpc_table_DSCF_Entropie); R[2] = R[1]; break; case 2: - R[0] = R[2] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie); + R[0] = R[2] + mpc_decoder_huffman_decode_fast(d, mpc_table_DSCF_Entropie); R[1] = R[0]; - R[2] = R[1] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie); + R[2] = R[1] + mpc_decoder_huffman_decode_fast(d, mpc_table_DSCF_Entropie); break; case 0: - R[0] = R[2] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie); - R[1] = R[0] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie); - R[2] = R[1] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie); + R[0] = R[2] + mpc_decoder_huffman_decode_fast(d, mpc_table_DSCF_Entropie); + R[1] = R[0] + mpc_decoder_huffman_decode_fast(d, mpc_table_DSCF_Entropie); + R[2] = R[1] + mpc_decoder_huffman_decode_fast(d, mpc_table_DSCF_Entropie); break; default: return; @@ -813,8 +862,8 @@ mpc_decoder_read_bitstream_sv6(mpc_decoder *d) for (n=0; n <= Max_used_Band; ++n, ++ResL, ++ResR) { // setting pointers - x1 = d->SampleHuff[*ResL]; - x2 = d->SampleHuff[*ResR]; + x1 = mpc_table_SampleHuff[*ResL]; + x2 = mpc_table_SampleHuff[*ResR]; L = d->Q[n].L; R = d->Q[n].R; @@ -833,7 +882,7 @@ mpc_decoder_read_bitstream_sv6(mpc_decoder *d) } } } - +#endif //MPC_SUPPORT_SV456 /****************************************** SV 7 ******************************************/ void mpc_decoder_read_bitstream_sv7(mpc_decoder *d) @@ -868,11 +917,11 @@ mpc_decoder_read_bitstream_sv7(mpc_decoder *d) ++ResL; ++ResR; // increase pointers for (n=1; n <= d->Max_Band; ++n, ++ResL, ++ResR) { - idx = mpc_decoder_huffman_decode_fast(d, d->HuffHdr); - *ResL = (idx!=4) ? *(ResL-1) + idx : (int)mpc_decoder_bitstream_read(d, 4); + idx = mpc_decoder_huffman_decode_fast(d, mpc_table_HuffHdr); + *ResL = (idx!=4) ? *(ResL-1) + idx : (int) mpc_decoder_bitstream_read(d, 4); - idx = mpc_decoder_huffman_decode_fast(d, d->HuffHdr); - *ResR = (idx!=4) ? *(ResR-1) + idx : (int)mpc_decoder_bitstream_read(d, 4); + idx = mpc_decoder_huffman_decode_fast(d, mpc_table_HuffHdr); + *ResR = (idx!=4) ? *(ResR-1) + idx : (int) mpc_decoder_bitstream_read(d, 4); if (d->MS_used && !(*ResL==0 && *ResR==0)) { d->MS_Flag[n] = mpc_decoder_bitstream_read(d, 1); @@ -889,8 +938,8 @@ mpc_decoder_read_bitstream_sv7(mpc_decoder *d) ResL = d->Res_L; ResR = d->Res_R; for (n=0; n <= Max_used_Band; ++n, ++L, ++R, ++ResL, ++ResR) { - if (*ResL) *L = mpc_decoder_huffman_decode_faster(d, d->HuffSCFI); - if (*ResR) *R = mpc_decoder_huffman_decode_faster(d, d->HuffSCFI); + if (*ResL) *L = mpc_decoder_huffman_decode_faster(d, mpc_table_HuffSCFI); + if (*ResR) *R = mpc_decoder_huffman_decode_faster(d, mpc_table_HuffSCFI); } /**************************** SCF/DSCF ****************************/ @@ -905,32 +954,32 @@ mpc_decoder_read_bitstream_sv7(mpc_decoder *d) switch (d->SCFI_L[n]) { case 1: - idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF); - L[0] = (idx!=8) ? L[2] + idx : (int)mpc_decoder_bitstream_read(d, 6); - idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF); - L[1] = (idx!=8) ? L[0] + idx : (int)mpc_decoder_bitstream_read(d, 6); + idx = mpc_decoder_huffman_decode_fast(d, mpc_table_HuffDSCF); + L[0] = (idx!=8) ? L[2] + idx : (int) mpc_decoder_bitstream_read(d, 6); + idx = mpc_decoder_huffman_decode_fast(d, mpc_table_HuffDSCF); + L[1] = (idx!=8) ? L[0] + idx : (int) mpc_decoder_bitstream_read(d, 6); L[2] = L[1]; break; case 3: - idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF); - L[0] = (idx!=8) ? L[2] + idx : (int)mpc_decoder_bitstream_read(d, 6); + idx = mpc_decoder_huffman_decode_fast(d, mpc_table_HuffDSCF); + L[0] = (idx!=8) ? L[2] + idx : (int) mpc_decoder_bitstream_read(d, 6); L[1] = L[0]; L[2] = L[1]; break; case 2: - idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF); - L[0] = (idx!=8) ? L[2] + idx : (int)mpc_decoder_bitstream_read(d, 6); + idx = mpc_decoder_huffman_decode_fast(d, mpc_table_HuffDSCF); + L[0] = (idx!=8) ? L[2] + idx : (int) mpc_decoder_bitstream_read(d, 6); L[1] = L[0]; - idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF); - L[2] = (idx!=8) ? L[1] + idx : (int)mpc_decoder_bitstream_read(d, 6); + idx = mpc_decoder_huffman_decode_fast(d, mpc_table_HuffDSCF); + L[2] = (idx!=8) ? L[1] + idx : (int) mpc_decoder_bitstream_read(d, 6); break; case 0: - idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF); - L[0] = (idx!=8) ? L[2] + idx : (int)mpc_decoder_bitstream_read(d, 6); - idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF); - L[1] = (idx!=8) ? L[0] + idx : (int)mpc_decoder_bitstream_read(d, 6); - idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF); - L[2] = (idx!=8) ? L[1] + idx : (int)mpc_decoder_bitstream_read(d, 6); + idx = mpc_decoder_huffman_decode_fast(d, mpc_table_HuffDSCF); + L[0] = (idx!=8) ? L[2] + idx : (int) mpc_decoder_bitstream_read(d, 6); + idx = mpc_decoder_huffman_decode_fast(d, mpc_table_HuffDSCF); + L[1] = (idx!=8) ? L[0] + idx : (int) mpc_decoder_bitstream_read(d, 6); + idx = mpc_decoder_huffman_decode_fast(d, mpc_table_HuffDSCF); + L[2] = (idx!=8) ? L[1] + idx : (int) mpc_decoder_bitstream_read(d, 6); break; default: return; @@ -945,32 +994,32 @@ mpc_decoder_read_bitstream_sv7(mpc_decoder *d) switch (d->SCFI_R[n]) { case 1: - idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF); - R[0] = (idx!=8) ? R[2] + idx : (int)mpc_decoder_bitstream_read(d, 6); - idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF); - R[1] = (idx!=8) ? R[0] + idx : (int)mpc_decoder_bitstream_read(d, 6); + idx = mpc_decoder_huffman_decode_fast(d, mpc_table_HuffDSCF); + R[0] = (idx!=8) ? R[2] + idx : (int) mpc_decoder_bitstream_read(d, 6); + idx = mpc_decoder_huffman_decode_fast(d, mpc_table_HuffDSCF); + R[1] = (idx!=8) ? R[0] + idx : (int) mpc_decoder_bitstream_read(d, 6); R[2] = R[1]; break; case 3: - idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF); - R[0] = (idx!=8) ? R[2] + idx : (int)mpc_decoder_bitstream_read(d, 6); + idx = mpc_decoder_huffman_decode_fast(d, mpc_table_HuffDSCF); + R[0] = (idx!=8) ? R[2] + idx : (int) mpc_decoder_bitstream_read(d, 6); R[1] = R[0]; R[2] = R[1]; break; case 2: - idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF); - R[0] = (idx!=8) ? R[2] + idx : (int)mpc_decoder_bitstream_read(d, 6); + idx = mpc_decoder_huffman_decode_fast(d, mpc_table_HuffDSCF); + R[0] = (idx!=8) ? R[2] + idx : (int) mpc_decoder_bitstream_read(d, 6); R[1] = R[0]; - idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF); - R[2] = (idx!=8) ? R[1] + idx : (int)mpc_decoder_bitstream_read(d, 6); + idx = mpc_decoder_huffman_decode_fast(d, mpc_table_HuffDSCF); + R[2] = (idx!=8) ? R[1] + idx : (int) mpc_decoder_bitstream_read(d, 6); break; case 0: - idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF); - R[0] = (idx!=8) ? R[2] + idx : (int)mpc_decoder_bitstream_read(d, 6); - idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF); - R[1] = (idx!=8) ? R[0] + idx : (int)mpc_decoder_bitstream_read(d, 6); - idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF); - R[2] = (idx!=8) ? R[1] + idx : (int)mpc_decoder_bitstream_read(d, 6); + idx = mpc_decoder_huffman_decode_fast(d, mpc_table_HuffDSCF); + R[0] = (idx!=8) ? R[2] + idx : (int) mpc_decoder_bitstream_read(d, 6); + idx = mpc_decoder_huffman_decode_fast(d, mpc_table_HuffDSCF); + R[1] = (idx!=8) ? R[0] + idx : (int) mpc_decoder_bitstream_read(d, 6); + idx = mpc_decoder_huffman_decode_fast(d, mpc_table_HuffDSCF); + R[2] = (idx!=8) ? R[1] + idx : (int) mpc_decoder_bitstream_read(d, 6); break; default: return; @@ -996,7 +1045,7 @@ mpc_decoder_read_bitstream_sv7(mpc_decoder *d) break; case -1: for (k=0; k<36; k++ ) { - tmp = random_int(d); + tmp = mpc_random_int(d); *L++ = ((tmp >> 24) & 0xFF) + ((tmp >> 16) & 0xFF) + ((tmp >> 8) & 0xFF) + ((tmp >> 0) & 0xFF) - 510; } break; @@ -1004,7 +1053,7 @@ mpc_decoder_read_bitstream_sv7(mpc_decoder *d) L += 36;// increase pointer break; case 1: - Table = d->HuffQ[mpc_decoder_bitstream_read(d, 1)][1]; + Table = mpc_table_HuffQ[mpc_decoder_bitstream_read(d, 1)][1]; for (k=0; k<12; ++k) { idx = mpc_decoder_huffman_decode_fast(d, Table); @@ -1014,7 +1063,7 @@ mpc_decoder_read_bitstream_sv7(mpc_decoder *d) } break; case 2: - Table = d->HuffQ[mpc_decoder_bitstream_read(d, 1)][2]; + Table = mpc_table_HuffQ[mpc_decoder_bitstream_read(d, 1)][2]; for (k=0; k<18; ++k) { idx = mpc_decoder_huffman_decode_fast(d, Table); @@ -1024,18 +1073,18 @@ mpc_decoder_read_bitstream_sv7(mpc_decoder *d) break; case 3: case 4: - Table = d->HuffQ[mpc_decoder_bitstream_read(d, 1)][*ResL]; + Table = mpc_table_HuffQ[mpc_decoder_bitstream_read(d, 1)][*ResL]; for (k=0; k<36; ++k) *L++ = mpc_decoder_huffman_decode_faster(d, Table); break; case 5: - Table = d->HuffQ[mpc_decoder_bitstream_read(d, 1)][*ResL]; + Table = mpc_table_HuffQ[mpc_decoder_bitstream_read(d, 1)][*ResL]; for (k=0; k<36; ++k) *L++ = mpc_decoder_huffman_decode_fast(d, Table); break; case 6: case 7: - Table = d->HuffQ[mpc_decoder_bitstream_read(d, 1)][*ResL]; + Table = mpc_table_HuffQ[mpc_decoder_bitstream_read(d, 1)][*ResL]; for (k=0; k<36; ++k) *L++ = mpc_decoder_huffman_decode(d, Table); break; @@ -1056,7 +1105,7 @@ mpc_decoder_read_bitstream_sv7(mpc_decoder *d) break; case -1: for (k=0; k<36; k++ ) { - tmp = random_int(d); + tmp = mpc_random_int(d); *R++ = ((tmp >> 24) & 0xFF) + ((tmp >> 16) & 0xFF) + ((tmp >> 8) & 0xFF) + ((tmp >> 0) & 0xFF) - 510; } break; @@ -1064,7 +1113,7 @@ mpc_decoder_read_bitstream_sv7(mpc_decoder *d) R += 36;// increase pointer break; case 1: - Table = d->HuffQ[mpc_decoder_bitstream_read(d, 1)][1]; + Table = mpc_table_HuffQ[mpc_decoder_bitstream_read(d, 1)][1]; for (k=0; k<12; ++k) { idx = mpc_decoder_huffman_decode_fast(d, Table); @@ -1074,7 +1123,7 @@ mpc_decoder_read_bitstream_sv7(mpc_decoder *d) } break; case 2: - Table = d->HuffQ[mpc_decoder_bitstream_read(d, 1)][2]; + Table = mpc_table_HuffQ[mpc_decoder_bitstream_read(d, 1)][2]; for (k=0; k<18; ++k) { idx = mpc_decoder_huffman_decode_fast(d, Table); @@ -1084,18 +1133,18 @@ mpc_decoder_read_bitstream_sv7(mpc_decoder *d) break; case 3: case 4: - Table = d->HuffQ[mpc_decoder_bitstream_read(d, 1)][*ResR]; + Table = mpc_table_HuffQ[mpc_decoder_bitstream_read(d, 1)][*ResR]; for (k=0; k<36; ++k) *R++ = mpc_decoder_huffman_decode_faster(d, Table); break; case 5: - Table = d->HuffQ[mpc_decoder_bitstream_read(d, 1)][*ResR]; + Table = mpc_table_HuffQ[mpc_decoder_bitstream_read(d, 1)][*ResR]; for (k=0; k<36; ++k) *R++ = mpc_decoder_huffman_decode_fast(d, Table); break; case 6: case 7: - Table = d->HuffQ[mpc_decoder_bitstream_read(d, 1)][*ResR]; + Table = mpc_table_HuffQ[mpc_decoder_bitstream_read(d, 1)][*ResR]; for (k=0; k<36; ++k) *R++ = mpc_decoder_huffman_decode(d, Table); break; @@ -1114,43 +1163,6 @@ void mpc_decoder_setup(mpc_decoder *d, mpc_reader *r) { d->r = r; - d->HuffQ[0][0] = 0; - d->HuffQ[1][0] = 0; - d->HuffQ[0][1] = d->HuffQ1[0]; - d->HuffQ[1][1] = d->HuffQ1[1]; - d->HuffQ[0][2] = d->HuffQ2[0]; - d->HuffQ[1][2] = d->HuffQ2[1]; - d->HuffQ[0][3] = d->HuffQ3[0]; - d->HuffQ[1][3] = d->HuffQ3[1]; - d->HuffQ[0][4] = d->HuffQ4[0]; - d->HuffQ[1][4] = d->HuffQ4[1]; - d->HuffQ[0][5] = d->HuffQ5[0]; - d->HuffQ[1][5] = d->HuffQ5[1]; - d->HuffQ[0][6] = d->HuffQ6[0]; - d->HuffQ[1][6] = d->HuffQ6[1]; - d->HuffQ[0][7] = d->HuffQ7[0]; - d->HuffQ[1][7] = d->HuffQ7[1]; - - d->SampleHuff[0] = NULL; - d->SampleHuff[1] = d->Entropie_1; - d->SampleHuff[2] = d->Entropie_2; - d->SampleHuff[3] = d->Entropie_3; - d->SampleHuff[4] = d->Entropie_4; - d->SampleHuff[5] = d->Entropie_5; - d->SampleHuff[6] = d->Entropie_6; - d->SampleHuff[7] = d->Entropie_7; - d->SampleHuff[8] = NULL; - d->SampleHuff[9] = NULL; - d->SampleHuff[10] = NULL; - d->SampleHuff[11] = NULL; - d->SampleHuff[12] = NULL; - d->SampleHuff[13] = NULL; - d->SampleHuff[14] = NULL; - d->SampleHuff[15] = NULL; - d->SampleHuff[16] = NULL; - d->SampleHuff[17] = NULL; - - d->EQ_activated = 0; d->MPCHeaderPos = 0; d->StreamVersion = 0; d->MS_used = 0; @@ -1159,12 +1171,10 @@ void mpc_decoder_setup(mpc_decoder *d, mpc_reader *r) d->FrameWasValid = 0; d->OverallFrames = 0; d->DecodedFrames = 0; - d->LastValidSamples = 0; d->TrueGaplessPresent = 0; d->WordsRead = 0; d->Max_Band = 0; d->SampleRate = 0; -// clips = 0; d->__r1 = 1; d->__r2 = 1; @@ -1175,8 +1185,6 @@ void mpc_decoder_setup(mpc_decoder *d, mpc_reader *r) d->Max_Band = 0; mpc_decoder_initialisiere_quantisierungstabellen(d, 1.0f); - mpc_decoder_init_huffman_sv6(d); - mpc_decoder_init_huffman_sv7(d); /* Link struct entries to actual tables which are placed in IRAM */ d->V_L = V_L; @@ -1186,7 +1194,7 @@ void mpc_decoder_setup(mpc_decoder *d, mpc_reader *r) #endif } -static void mpc_decoder_set_streaminfo(mpc_decoder *d, mpc_streaminfo *si) +void mpc_decoder_set_streaminfo(mpc_decoder *d, mpc_streaminfo *si) { mpc_decoder_reset_synthesis(d); mpc_decoder_reset_globals(d); @@ -1196,14 +1204,13 @@ static void mpc_decoder_set_streaminfo(mpc_decoder *d, mpc_streaminfo *si) d->Max_Band = si->max_band; d->OverallFrames = si->frames; d->MPCHeaderPos = si->header_position; - d->LastValidSamples = si->last_frame_samples; d->TrueGaplessPresent = si->is_true_gapless; d->SampleRate = (mpc_int32_t)si->sample_freq; d->samples_to_skip = MPC_DECODER_SYNTH_DELAY; } -bool mpc_decoder_initialize(mpc_decoder *d, mpc_streaminfo *si) +mpc_bool_t mpc_decoder_initialize(mpc_decoder *d, mpc_streaminfo *si) { mpc_decoder_set_streaminfo(d, si); @@ -1214,14 +1221,14 @@ bool mpc_decoder_initialize(mpc_decoder *d, mpc_streaminfo *si) case 0x06: f_seek(d, 8 + d->MPCHeaderPos); d->pos = 0; break; case 0x07: case 0x17: /*f_seek ( 24 + d->MPCHeaderPos );*/ d->pos = 8; break; - default: return false; + default: return FALSE; } // AB: fill buffer and initialize decoder f_read_dword(d, d->Speicher, MEMSIZE ); d->dword = d->Speicher[d->Zaehler = 0]; - return true; + return TRUE; } //--------------------------------------------------------------- @@ -1266,7 +1273,7 @@ helper3(mpc_decoder *d, mpc_uint32_t bitpos, mpc_uint32_t* buffoffs) static mpc_uint32_t get_initial_fpos(mpc_decoder *d, mpc_uint32_t StreamVersion) { mpc_uint32_t fpos = 0; - (void)StreamVersion; + (void) StreamVersion; switch ( d->StreamVersion ) { // setting position to the beginning of the data-bitstream case 0x04: fpos = 48; break; case 0x05: @@ -1277,12 +1284,12 @@ static mpc_uint32_t get_initial_fpos(mpc_decoder *d, mpc_uint32_t StreamVersion) return fpos; } -bool mpc_decoder_seek_seconds(mpc_decoder *d, double seconds) +mpc_bool_t mpc_decoder_seek_seconds(mpc_decoder *d, double seconds) { return mpc_decoder_seek_sample(d, (mpc_int64_t)(seconds * (double)d->SampleRate + 0.5)); } -bool mpc_decoder_seek_sample(mpc_decoder *d, mpc_int64_t destsample) +mpc_bool_t mpc_decoder_seek_sample(mpc_decoder *d, mpc_int64_t destsample) { mpc_uint32_t fpos; mpc_uint32_t fwd; @@ -1316,7 +1323,7 @@ bool mpc_decoder_seek_sample(mpc_decoder *d, mpc_int64_t destsample) fpos = get_initial_fpos(d, d->StreamVersion); if (fpos == 0) { - return false; + return FALSE; } helper2(d, fpos); @@ -1333,11 +1340,15 @@ bool mpc_decoder_seek_sample(mpc_decoder *d, mpc_int64_t destsample) mpc_decoder_read_bitstream_sv7(d); } else { +#ifdef MPC_SUPPORT_SV456 mpc_decoder_read_bitstream_sv6(d); +#else + return FALSE; +#endif } if (mpc_decoder_bits_read(d) - FrameBitCnt != d->FwdJumpInfo ) { // Box ("Bug in perform_jump"); - return false; + return FALSE; } // update buffer if ((RING ^ d->Zaehler) & MEMSIZE2) { @@ -1348,7 +1359,7 @@ bool mpc_decoder_seek_sample(mpc_decoder *d, mpc_int64_t destsample) // LastBitsRead = BitsRead (); // LastFrame = d->DecodedFrames; - return true; + return TRUE; } void mpc_decoder_update_buffer(mpc_decoder *d, mpc_uint32_t RING) diff --git a/apps/codecs/libmusepack/musepack.h b/apps/codecs/libmusepack/musepack.h index cd9a983603..d631c6d05d 100644 --- a/apps/codecs/libmusepack/musepack.h +++ b/apps/codecs/libmusepack/musepack.h @@ -32,19 +32,18 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/// \file musepack.h -/// Top level include file for libmusepack. +/// \file mpcdec.h +/// Top level include file for libmpcdec. -#ifndef _musepack_h_ -#define _musepack_h_ +#ifndef _mpcdec_h_ +#define _mpcdec_h_ #ifdef __cplusplus extern "C" { #endif -#include -#include -//#include +//#include +#include #include "../codec.h" #include "config_types.h" @@ -98,7 +97,9 @@ void mpc_decoder_setup(mpc_decoder *d, mpc_reader *r); /// 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 -bool mpc_decoder_initialize(mpc_decoder *d, mpc_streaminfo *si); +mpc_bool_t mpc_decoder_initialize(mpc_decoder *d, mpc_streaminfo *si); + +void mpc_decoder_set_streaminfo(mpc_decoder *d, mpc_streaminfo *si); /// Sets decoder sample scaling factor. All decoded samples will be multiplied /// by this factor. @@ -119,14 +120,20 @@ mpc_uint32_t mpc_decoder_decode( mpc_uint32_t *vbr_update_acc, mpc_uint32_t *vbr_update_bits); +mpc_uint32_t mpc_decoder_decode_frame( + mpc_decoder *d, + mpc_uint32_t *in_buffer, + mpc_uint32_t in_len, + MPC_SAMPLE_FORMAT *out_buffer); + /// Seeks to the specified sample in the source stream. -bool mpc_decoder_seek_sample(mpc_decoder *d, mpc_int64_t destsample); +mpc_bool_t mpc_decoder_seek_sample(mpc_decoder *d, mpc_int64_t destsample); /// Seeks to specified position in seconds in the source stream. -bool mpc_decoder_seek_seconds(mpc_decoder *d, double seconds); +mpc_bool_t mpc_decoder_seek_seconds(mpc_decoder *d, double seconds); #ifdef __cplusplus } #endif // __cplusplus -#endif // _musepack_h_ +#endif // _mpcdec_h_ diff --git a/apps/codecs/libmusepack/reader.h b/apps/codecs/libmusepack/reader.h index 3189e91971..83ef589e8f 100644 --- a/apps/codecs/libmusepack/reader.h +++ b/apps/codecs/libmusepack/reader.h @@ -34,8 +34,8 @@ /// \file reader.h -#ifndef _musepack_reader_h_ -#define _musepack_reader_h_ +#ifndef _mpcdec_reader_h_ +#define _mpcdec_reader_h_ /// \brief Stream reader interface structure. /// @@ -47,7 +47,7 @@ typedef struct mpc_reader_t { mpc_int32_t (*read)(void *t, void *ptr, mpc_int32_t size); /// Seeks to byte position offset. - bool (*seek)(void *t, mpc_int32_t 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); @@ -56,18 +56,27 @@ typedef struct mpc_reader_t { mpc_int32_t (*get_size)(void *t); /// True if the stream is a seekable stream. - bool (*canseek)(void *t); + mpc_bool_t (*canseek)(void *t); - /// Optional field that can be used to identify a particular instance of + /// Field that can be used to identify a particular instance of /// reader or carry along data associated with that reader. void *data; + } mpc_reader; +/* No standard STDIO based reader in Rockbox +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 *r, FILE *input); +/* void mpc_reader_setup_file_reader(mpc_reader_file *r, FILE *input); */ -#endif // _musepack_reader_h_ +#endif // _mpcdec_reader_h_ diff --git a/apps/codecs/libmusepack/requant.c b/apps/codecs/libmusepack/requant.c index df1175a105..a72a165786 100644 --- a/apps/codecs/libmusepack/requant.c +++ b/apps/codecs/libmusepack/requant.c @@ -72,9 +72,9 @@ const mpc_int32_t __Dc [1 + 18] = { #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_int64_t val = (mpc_int64_t)fval; mpc_uint32_t ptr = 0; + if (val<0) val = -val; while(val) {val>>=1;ptr++;} return ptr > 31 ? 0 : 31 - ptr; @@ -113,40 +113,8 @@ mpc_decoder_scale_output(mpc_decoder *d, double factor) } } -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); } diff --git a/apps/codecs/libmusepack/requant.h b/apps/codecs/libmusepack/requant.h index 71b2a3e800..e70dce7085 100644 --- a/apps/codecs/libmusepack/requant.h +++ b/apps/codecs/libmusepack/requant.h @@ -35,8 +35,8 @@ /// \file requant.h /// Requantization function definitions. -#ifndef _musepack_requant_h -#define _musepack_requant_h_ +#ifndef _mpcdec_requant_h +#define _mpcdec_requant_h_ #include "musepack.h" @@ -48,4 +48,4 @@ extern const mpc_int32_t __Dc [1 + 18]; // offset for requantiza #define Cc (__Cc + 1) #define Dc (__Dc + 1) -#endif // _musepack_requant_h_ +#endif // _mpcdec_requant_h_ diff --git a/apps/codecs/libmusepack/streaminfo.c b/apps/codecs/libmusepack/streaminfo.c index 8ec2234b4f..5475c6f0f6 100644 --- a/apps/codecs/libmusepack/streaminfo.c +++ b/apps/codecs/libmusepack/streaminfo.c @@ -35,7 +35,6 @@ /// \file streaminfo.c /// Implementation of streaminfo reading functions. -#include #include "musepack.h" #include "internal.h" @@ -59,16 +58,6 @@ 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) -{ - (void)si; - (void)fp; - return 0; -} - /// Reads streaminfo from SV7 header. static mpc_int32_t streaminfo_read_header_sv7(mpc_streaminfo * si, mpc_uint32_t HeaderData[8]) @@ -143,6 +132,7 @@ streaminfo_read_header_sv7(mpc_streaminfo * si, mpc_uint32_t HeaderData[8]) } // read information from SV4-SV6 header +#ifdef MPC_SUPPORT_SV456 static mpc_int32_t streaminfo_read_header_sv6(mpc_streaminfo * si, mpc_uint32_t HeaderData[8]) { @@ -199,7 +189,7 @@ streaminfo_read_header_sv6(mpc_streaminfo * si, mpc_uint32_t HeaderData[8]) return ERROR_CODE_OK; } - +#endif // reads file header and tags mpc_int32_t mpc_streaminfo_read(mpc_streaminfo * si, mpc_reader * r) @@ -228,23 +218,27 @@ mpc_streaminfo_read(mpc_streaminfo * si, mpc_reader * r) #ifndef MPC_LITTLE_ENDIAN mpc_uint32_t ptr; for (ptr = 0; ptr < 8; ptr++) { - HeaderData[ptr] = swap32(HeaderData[ptr]); + HeaderData[ptr] = mpc_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); + return ERROR_CODE_INVALIDSV; } // stream version 7 else if ((si->stream_version & 15) == 7) { Error = streaminfo_read_header_sv7(si, HeaderData); + if (Error != ERROR_CODE_OK) return Error; } - } - else { + } else { +#ifdef MPC_SUPPORT_SV456 // stream version 4-6 Error = streaminfo_read_header_sv6(si, HeaderData); +#else + return ERROR_CODE_INVALIDSV; +#endif } // estimation, exact value needs too much time @@ -259,7 +253,7 @@ mpc_streaminfo_read(mpc_streaminfo * si, mpc_reader * r) si->average_bitrate = 0; } - return Error; + return ERROR_CODE_OK; } double diff --git a/apps/codecs/libmusepack/streaminfo.h b/apps/codecs/libmusepack/streaminfo.h index d046f0ebc8..6c4b4ca108 100644 --- a/apps/codecs/libmusepack/streaminfo.h +++ b/apps/codecs/libmusepack/streaminfo.h @@ -34,8 +34,8 @@ /// \file streaminfo.h -#ifndef _musepack_streaminfo_h_ -#define _musepack_streaminfo_h_ +#ifndef _mpcdec_streaminfo_h_ +#define _mpcdec_streaminfo_h_ typedef mpc_int32_t mpc_streaminfo_off_t; @@ -83,4 +83,4 @@ typedef struct mpc_streaminfo { //@} } mpc_streaminfo; -#endif // _musepack_streaminfo_h_ +#endif // _mpcdec_streaminfo_h_ diff --git a/apps/codecs/libmusepack/synth_filter.c b/apps/codecs/libmusepack/synth_filter.c index f2945ce9c5..56bf65ea12 100644 --- a/apps/codecs/libmusepack/synth_filter.c +++ b/apps/codecs/libmusepack/synth_filter.c @@ -36,12 +36,9 @@ /// Synthesis functions. /// \todo document me -#include #include "musepack.h" #include "internal.h" -typedef mpc_int32_t ptrdiff_t; - /* C O N S T A N T S */ #undef _ @@ -334,7 +331,6 @@ static void Calculate_New_V ( const MPC_SAMPLE_FORMAT * Sample, MPC_SAMPLE_FORMA 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 ); @@ -457,7 +453,7 @@ static const unsigned char Parity [256] = { // parity * XORed values of both generators. */ mpc_uint32_t -random_int(mpc_decoder *d) +mpc_random_int(mpc_decoder *d) { #if 1 mpc_uint32_t t1, t2, t3, t4; -- cgit v1.2.3