summaryrefslogtreecommitdiff
path: root/apps/codecs/libmusepack/mpc_decoder.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/codecs/libmusepack/mpc_decoder.c')
-rw-r--r--apps/codecs/libmusepack/mpc_decoder.c1979
1 files changed, 452 insertions, 1527 deletions
diff --git a/apps/codecs/libmusepack/mpc_decoder.c b/apps/codecs/libmusepack/mpc_decoder.c
index d211980..5a78c94 100644
--- a/apps/codecs/libmusepack/mpc_decoder.c
+++ b/apps/codecs/libmusepack/mpc_decoder.c
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2005, The Musepack Development Team
+ Copyright (c) 2005-2009, The Musepack Development Team
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -31,577 +31,217 @@
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-
/// \file mpc_decoder.c
/// Core decoding routines and logic.
-#include "musepack.h"
+#include <string.h>
+#include "mpcdec.h"
+#include "minimax.h"
+#include "decoder.h"
+#include "huffman.h"
#include "internal.h"
+#include "mpcdec_math.h"
#include "requant.h"
-#include "huffman.h"
+#include "mpc_bits_reader.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
-
-#ifndef MPC_LITTLE_ENDIAN
-#define SWAP(X) mpc_swap32(X)
-#else
-#define SWAP(X) X
-#endif
-
-#ifdef SCF_HACK
-#define SCF_DIFF(SCF, D) (SCF == 127 ? 127 : SCF + D)
-#else
-#define SCF_DIFF(SCF, D) SCF + D
-#endif
-
-#define LOOKUP(x, e, q) mpc_decoder_make_huffman_lookup ( (q), sizeof(q), (x), (e) )
-#define Decode_DSCF() HUFFMAN_DECODE_FASTEST ( d, mpc_table_HuffDSCF, LUTDSCF, 6 )
-#define HUFFMAN_DECODE_FASTEST(d,a,b,c) mpc_decoder_huffman_decode_fastest ( (d), (a), (b), 32-(c) )
-#define HUFFMAN_DECODE_FASTERER(d,a,b,c) mpc_decoder_huffman_decode_fasterer ( (d), (a), (b), 32-(c) )
-
-mpc_uint8_t LUT1_0 [1<< 6] IBSS_ATTR_MPC_LARGE_IRAM;
-mpc_uint8_t LUT1_1 [1<< 9] IBSS_ATTR_MPC_LARGE_IRAM; // 576 Bytes
-mpc_uint8_t LUT2_0 [1<< 7] IBSS_ATTR_MPC_LARGE_IRAM;
-mpc_uint8_t LUT2_1 [1<<10] IBSS_ATTR_MPC_LARGE_IRAM; // 1152 Bytes
-mpc_uint8_t LUT3_0 [1<< 4] IBSS_ATTR_MPC_LARGE_IRAM;
-mpc_uint8_t LUT3_1 [1<< 5] IBSS_ATTR_MPC_LARGE_IRAM; // 48 Bytes
-mpc_uint8_t LUT4_0 [1<< 4] IBSS_ATTR_MPC_LARGE_IRAM;
-mpc_uint8_t LUT4_1 [1<< 5] IBSS_ATTR_MPC_LARGE_IRAM; // 48 Bytes
-mpc_uint8_t LUT5_0 [1<< 6] IBSS_ATTR_MPC_LARGE_IRAM;
-mpc_uint8_t LUT5_1 [1<< 8] IBSS_ATTR_MPC_LARGE_IRAM; // 320 Bytes
-mpc_uint8_t LUT6_0 [1<< 7] IBSS_ATTR_MPC_LARGE_IRAM;
-mpc_uint8_t LUT6_1 [1<< 7] IBSS_ATTR_MPC_LARGE_IRAM; // 256 Bytes
-mpc_uint8_t LUT7_0 [1<< 8] IBSS_ATTR_MPC_LARGE_IRAM;
-mpc_uint8_t LUT7_1 [1<< 8] IBSS_ATTR_MPC_LARGE_IRAM; // 512 Bytes
-mpc_uint8_t LUTDSCF [1<< 6] IBSS_ATTR_MPC_LARGE_IRAM; // 64 Bytes = 2976 Bytes
+extern const mpc_lut_data mpc_HuffQ [7] [2];
+extern const mpc_lut_data mpc_HuffHdr;
+extern const mpc_huffman mpc_table_HuffSCFI [ 4];
+extern const mpc_lut_data mpc_HuffDSCF;
+
+//SV8 tables
+extern const mpc_can_data mpc_can_Bands;
+extern const mpc_can_data mpc_can_SCFI[2];
+extern const mpc_can_data mpc_can_DSCF[2];
+extern const mpc_can_data mpc_can_Res [2];
+extern const mpc_can_data mpc_can_Q [8][2];
+extern const mpc_can_data mpc_can_Q1;
+extern const mpc_can_data mpc_can_Q9up;
+
+//Decoder globals (g_Y_L and g_Y_R do not fit into iram for all targets)
+static mpc_decoder g_mpc_decoder IBSS_ATTR;
+static MPC_SAMPLE_FORMAT g_Y_L[MPC_FRAME_LENGTH] IBSS_ATTR_MPC_LARGE_IRAM;
+static MPC_SAMPLE_FORMAT g_Y_R[MPC_FRAME_LENGTH] IBSS_ATTR_MPC_LARGE_IRAM;
+
+//SV7 globals (decoding results for bundled quantizers (3- and 5-step))
+static const mpc_int32_t g_sv7_idx30[] ICONST_ATTR =
+{-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1};
+static const mpc_int32_t g_sv7_idx31[] ICONST_ATTR =
+{-1,-1,-1, 0, 0, 0, 1, 1, 1,-1,-1,-1, 0, 0, 0, 1, 1, 1,-1,-1,-1, 0, 0, 0, 1, 1, 1};
+static const mpc_int32_t g_sv7_idx32[] ICONST_ATTR =
+{-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1};
+static const mpc_int32_t g_sv7_idx50[] ICONST_ATTR =
+{-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2};
+static const mpc_int32_t g_sv7_idx51[] ICONST_ATTR =
+{-2,-2,-2,-2,-2,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2};
+
+//SV8 globals (decoding results for bundled quantizers (3- and 5-step))
+static const mpc_int8_t g_sv8_idx50[125] ICONST_ATTR =
+{-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,
+ -2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,
+ -2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,
+ -2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,
+ -2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2};
+static const mpc_int8_t g_sv8_idx51[125] ICONST_ATTR =
+{-2,-2,-2,-2,-2,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2,
+ -2,-2,-2,-2,-2,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2,
+ -2,-2,-2,-2,-2,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2,
+ -2,-2,-2,-2,-2,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2,
+ -2,-2,-2,-2,-2,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2};
+static const mpc_int8_t g_sv8_idx52[125] ICONST_ATTR =
+{-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2};
+static const mpc_int8_t g_sv8_HuffQ2_var[125] ICONST_ATTR =
+{ 6, 5, 4, 5, 6, 5, 4, 3, 4, 5, 4, 3, 2, 3, 4, 5, 4, 3, 4, 5, 6, 5, 4, 5, 6,
+ 5, 4, 3, 4, 5, 4, 3, 2, 3, 4, 3, 2, 1, 2, 3, 4, 3, 2, 3, 4, 5, 4, 3, 4, 5,
+ 4, 3, 2, 3, 4, 3, 2, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, 2, 3, 4, 3, 2, 3, 4,
+ 5, 4, 3, 4, 5, 4, 3, 2, 3, 4, 3, 2, 1, 2, 3, 4, 3, 2, 3, 4, 5, 4, 3, 4, 5,
+ 6, 5, 4, 5, 6, 5, 4, 3, 4, 5, 4, 3, 2, 3, 4, 5, 4, 3, 4, 5, 6, 5, 4, 5, 6};
//------------------------------------------------------------------------------
// types
//------------------------------------------------------------------------------
enum
- {
- SEEK_PRE_DECODE = 33, // number of frames to be pre-decoded
- MEMSIZE = MPC_DECODER_MEMSIZE, // overall buffer size
- MEMSIZE2 = (MEMSIZE/2), // size of one buffer
- MEMMASK = (MEMSIZE-1)
- };
-
-//------------------------------------------------------------------------------
-// forward declarations
-//------------------------------------------------------------------------------
-void mpc_decoder_read_bitstream_sv6(mpc_decoder *d);
-void mpc_decoder_read_bitstream_sv7(mpc_decoder *d, mpc_bool_t fastSeeking);
-void mpc_decoder_update_buffer(mpc_decoder *d);
-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);
-void mpc_decoder_seek_to(mpc_decoder *d, mpc_uint32_t bitPos);
-void mpc_decoder_seek_forward(mpc_decoder *d, mpc_uint32_t bits);
-mpc_uint32_t mpc_decoder_jump_frame(mpc_decoder *d);
-void mpc_decoder_fill_buffer(mpc_decoder *d);
-void mpc_decoder_reset_state(mpc_decoder *d);
-static mpc_uint32_t get_initial_fpos(mpc_decoder *d, mpc_uint32_t StreamVersion);
-static inline mpc_int32_t mpc_decoder_huffman_decode_fastest(mpc_decoder *d, const HuffmanTyp* Table, const mpc_uint8_t* tab, mpc_uint16_t unused_bits);
-static void mpc_move_next(mpc_decoder *d);
-
-mpc_uint32_t Seekbuffer[MPC_SEEK_BUFFER_SIZE];
-mpc_uint32_t Speicher[MPC_DECODER_MEMSIZE];
-MPC_SAMPLE_FORMAT Y_L[36][32] IBSS_ATTR_MPC_LARGE_IRAM;
-MPC_SAMPLE_FORMAT Y_R[36][32] IBSS_ATTR_MPC_LARGE_IRAM;
-
-//------------------------------------------------------------------------------
-// utility functions
-//------------------------------------------------------------------------------
-static mpc_int32_t f_read(mpc_decoder *d, void *ptr, size_t size)
-{
- return d->r->read(d->r->data, ptr, size);
-};
-
-static mpc_bool_t f_seek(mpc_decoder *d, mpc_int32_t offset)
-{
- return d->r->seek(d->r->data, offset);
-};
-
-static mpc_int32_t f_read_dword(mpc_decoder *d, mpc_uint32_t * ptr, mpc_uint32_t count)
{
- count = f_read(d, ptr, count << 2) >> 2;
- return count;
-}
+ MEMSIZE = MPC_DECODER_MEMSIZE, // overall buffer size
+ MEMSIZE2 = (MEMSIZE/2), // size of one buffer
+ MEMMASK = (MEMSIZE-1)
+};
//------------------------------------------------------------------------------
-// huffman & bitstream functions
+// forward declarations
//------------------------------------------------------------------------------
-static const mpc_uint32_t mask [33] ICONST_ATTR = {
- 0x00000000, 0x00000001, 0x00000003, 0x00000007,
- 0x0000000F, 0x0000001F, 0x0000003F, 0x0000007F,
- 0x000000FF, 0x000001FF, 0x000003FF, 0x000007FF,
- 0x00000FFF, 0x00001FFF, 0x00003FFF, 0x00007FFF,
- 0x0000FFFF, 0x0001FFFF, 0x0003FFFF, 0x0007FFFF,
- 0x000FFFFF, 0x001FFFFF, 0x003FFFFF, 0x007FFFFF,
- 0x00FFFFFF, 0x01FFFFFF, 0x03FFFFFF, 0x07FFFFFF,
- 0x0FFFFFFF, 0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF,
- 0xFFFFFFFF
-};
-
-/* F U N C T I O N S */
-
-// resets bitstream decoding
-static void
-mpc_decoder_reset_bitstream_decode(mpc_decoder *d)
-{
- d->dword = 0;
- d->next = 0;
- d->pos = 0;
- d->Zaehler = 0;
- d->WordsRead = 0;
-}
-
-// reports the number of read bits
-static mpc_uint32_t
-mpc_decoder_bits_read(mpc_decoder *d)
-{
- return 32 * d->WordsRead + d->pos;
-}
-
-static void mpc_move_next(mpc_decoder *d) {
- d->Zaehler = (d->Zaehler + 1) & MEMMASK;
- d->dword = d->next;
- d->next = SWAP(d->Speicher[(d->Zaehler + 1) & MEMMASK]);
- d->pos -= 32;
- ++(d->WordsRead);
-}
-
-// read desired number of bits out of the bitstream
-static inline mpc_uint32_t
-mpc_decoder_bitstream_read(mpc_decoder *d, const mpc_uint32_t bits)
-{
- mpc_uint32_t out = d->dword;
-
- d->pos += bits;
-
- if (d->pos < 32) {
- out >>= (32 - d->pos);
- }
- else {
- mpc_move_next(d);
- if (d->pos) {
- out <<= d->pos;
- out |= d->dword >> (32 - d->pos);
- }
- }
-
- return out & mask[bits];
-}
-
-static void
-mpc_decoder_make_huffman_lookup(
- mpc_uint8_t* lookup, size_t length, const HuffmanTyp* Table, size_t elements )
-{
- size_t i;
- size_t idx = elements;
- mpc_uint32_t dval = (mpc_uint32_t)0x80000000L / length * 2;
- mpc_uint32_t val = dval - 1;
-
- for ( i = 0; i < length; i++, val += dval ) {
- while ( idx > 0 && val >= Table[idx-1].Code )
- idx--;
- *lookup++ = (mpc_uint8_t)idx;
- }
-
- return;
-}
-
-#ifdef MPC_SUPPORT_SV456
-// decode SCFI-bundle (sv4,5,6)
-static void
-mpc_decoder_scfi_bundle_read(
- mpc_decoder *d,
- const HuffmanTyp* Table, mpc_int8_t* SCFI, mpc_bool_t* DSCF)
-{
- // load preview and decode
- mpc_uint32_t code = d->dword << d->pos;
-
- if (d->pos > 26) {
- code |= d->next >> (32 - d->pos);
- }
- while (code < Table->Code) {
- Table++;
- }
-
- // set the new position within bitstream without performing a dummy-read
- if ((d->pos += Table->Length) >= 32) {
- mpc_move_next(d);
- }
-
- *SCFI = Table->Value >> 1;
- *DSCF = Table->Value & 1;
-}
-
-// basic huffman decoding routine
-// works with maximum lengths up to 14
-static mpc_int32_t
-mpc_decoder_huffman_decode(mpc_decoder *d, const HuffmanTyp *Table)
+void mpc_decoder_read_bitstream_sv7(mpc_decoder * d, mpc_bits_reader * r);
+void mpc_decoder_read_bitstream_sv8(mpc_decoder * d, mpc_bits_reader * r,
+ mpc_bool_t is_key_frame);
+static void mpc_decoder_requantisierung(mpc_decoder *d);
+
+/**
+ * set the scf indexes for seeking use
+ * needed only for sv7 seeking
+ * @param d
+ */
+void mpc_decoder_reset_scf(mpc_decoder * d, int value)
{
- // load preview and decode
- mpc_uint32_t code = d->dword << d->pos;
-
- if (d->pos > 18) {
- code |= d->next >> (32 - d->pos);
- }
- while (code < Table->Code) {
- Table++;
- }
-
- // set the new position within bitstream without performing a dummy-read
- if ((d->pos += Table->Length) >= 32) {
- mpc_move_next(d);
- }
-
- return Table->Value;
+ memset(d->SCF_Index_L, value, sizeof d->SCF_Index_L );
+ memset(d->SCF_Index_R, value, sizeof d->SCF_Index_R );
}
-#endif
-// faster huffman through previewing less bits
-// works with maximum lengths up to 10
-static mpc_int32_t
-mpc_decoder_huffman_decode_fast(mpc_decoder *d, const HuffmanTyp* Table)
+void mpc_decoder_setup(mpc_decoder *d)
{
- // load preview and decode
- mpc_uint32_t code = d->dword << d->pos;
-
- if (d->pos > 22) {
- code |= d->next >> (32 - d->pos);
- }
- while (code < Table->Code) {
- Table++;
- }
-
- // set the new position within bitstream without performing a dummy-read
- if ((d->pos += Table->Length) >= 32) {
- mpc_move_next(d);
- }
-
- return Table->Value;
-}
+ memset(d, 0, sizeof *d);
-// even faster huffman through previewing even less bits
-// works with maximum lengths up to 5
-static mpc_int32_t
-mpc_decoder_huffman_decode_faster(mpc_decoder *d, const HuffmanTyp* Table)
-{
- // load preview and decode
- mpc_uint32_t code = d->dword << d->pos;
+ d->__r1 = 1;
+ d->__r2 = 1;
+ d->Y_L = g_Y_L;
+ d->Y_R = g_Y_R;
- if (d->pos > 27) {
- code |= d->next >> (32 - d->pos);
- }
- while (code < Table->Code) {
- Table++;
- }
+ memset(d->Y_L, 0, sizeof(g_Y_L));
+ memset(d->Y_R, 0, sizeof(g_Y_R));
- // set the new position within bitstream without performing a dummy-read
- if ((d->pos += Table->Length) >= 32) {
- mpc_move_next(d);
- }
-
- return Table->Value;
+ mpc_decoder_init_quant(d, 1.0f);
}
-/* partial lookup table decode */
-static mpc_int32_t
-mpc_decoder_huffman_decode_fasterer(mpc_decoder *d, const HuffmanTyp* Table, const mpc_uint8_t* tab, mpc_uint16_t unused_bits)
+void mpc_decoder_set_streaminfo(mpc_decoder *d, mpc_streaminfo *si)
{
- // load preview and decode
- mpc_uint32_t code = d->dword << d->pos;
-
- if (d->pos > 18) { // preview 14 bits
- code |= d->next >> (32 - d->pos);
- }
-
- Table += tab [(size_t)(code >> unused_bits) ];
-
- while (code < Table->Code) {
- Table++;
- }
-
- // set the new position within bitstream without performing a dummy-read
- if ((d->pos += Table->Length) >= 32) {
- mpc_move_next(d);
- }
+ d->stream_version = si->stream_version;
+ d->ms = si->ms;
+ d->max_band = si->max_band;
+ d->channels = si->channels;
+ d->samples_to_skip = MPC_DECODER_SYNTH_DELAY + si->beg_silence;
- return Table->Value;
+ if (si->stream_version == 7 && si->is_true_gapless)
+ d->samples = ((si->samples + MPC_FRAME_LENGTH - 1) / MPC_FRAME_LENGTH) * MPC_FRAME_LENGTH;
+ else
+ d->samples = si->samples;
}
-/* full decode using lookup table */
-static inline mpc_int32_t
-mpc_decoder_huffman_decode_fastest(mpc_decoder *d, const HuffmanTyp* Table, const mpc_uint8_t* tab, mpc_uint16_t unused_bits)
+mpc_decoder * mpc_decoder_init(mpc_streaminfo *si)
{
- // load preview and decode
- mpc_uint32_t code = d->dword << d->pos;
+ mpc_decoder* p_tmp = &g_mpc_decoder;
- if (d->pos > unused_bits) {
- code |= d->next >> (32 - d->pos);
+ if (p_tmp != 0) {
+ mpc_decoder_setup(p_tmp);
+ mpc_decoder_set_streaminfo(p_tmp, si);
+ huff_init_lut(LUT_DEPTH);
}
- Table+=tab [(size_t)(code >> unused_bits) ];
-
- // set the new position within bitstream without performing a dummy-read
- if ((d->pos += Table->Length) >= 32) {
- mpc_move_next(d);
- }
-
- return Table->Value;
-}
-
-static void
-mpc_decoder_reset_v(mpc_decoder *d)
-{
- memset(d->V_L, 0, sizeof d->V_L);
- memset(d->V_R, 0, sizeof d->V_R);
-}
-
-static void
-mpc_decoder_reset_synthesis(mpc_decoder *d)
-{
- mpc_decoder_reset_v(d);
-}
-
-static void
-mpc_decoder_reset_y(mpc_decoder *d)
-{
- memset(d->Y_L, 0, sizeof Y_L);
- memset(d->Y_R, 0, sizeof Y_R);
-}
-
-static void
-mpc_decoder_reset_globals(mpc_decoder *d)
-{
- mpc_decoder_reset_bitstream_decode(d);
-
- d->DecodedFrames = 0;
- d->MaxDecodedFrames = 0;
- d->StreamVersion = 0;
- d->MS_used = 0;
-
- memset(d->Y_L , 0, sizeof Y_L );
- memset(d->Y_R , 0, sizeof Y_R );
- memset(d->SCF_Index_L , 0, sizeof d->SCF_Index_L);
- memset(d->SCF_Index_R , 0, sizeof d->SCF_Index_R);
- memset(d->Res_L , 0, sizeof d->Res_L );
- memset(d->Res_R , 0, sizeof d->Res_R );
- memset(d->SCFI_L , 0, sizeof d->SCFI_L );
- memset(d->SCFI_R , 0, sizeof d->SCFI_R );
-#ifdef MPC_SUPPORT_SV456
- memset(d->DSCF_Flag_L , 0, sizeof d->DSCF_Flag_L);
- memset(d->DSCF_Flag_R , 0, sizeof d->DSCF_Flag_R);
-#endif
- memset(d->Q , 0, sizeof d->Q );
- memset(d->MS_Flag , 0, sizeof d->MS_Flag );
+ return p_tmp;
}
-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)
+void mpc_decoder_exit(mpc_decoder *d)
{
- mpc_decoder_reset_bitstream_decode(d);
- if (in_len > sizeof(Speicher)) in_len = sizeof(Speicher);
- memcpy(d->Speicher, in_buffer, in_len);
- d->dword = SWAP(d->Speicher[0]);
- d->next = SWAP(d->Speicher[1]);
- 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, FALSE);
- 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);
+ (void)d;
}
-static mpc_uint32_t
-mpc_decoder_decode_internal(mpc_decoder *d, MPC_SAMPLE_FORMAT *buffer)
+void mpc_decoder_decode_frame(mpc_decoder * d,
+ mpc_bits_reader * r,
+ mpc_frame_info * i)
{
- mpc_uint32_t output_frame_length = MPC_FRAME_LENGTH;
-
- mpc_uint32_t FrameBitCnt = 0;
+ mpc_bits_reader r_sav = *r;
+ mpc_int64_t samples_left;
- // output the last part of the last frame here, if needed
- if (d->last_block_samples > 0) {
- output_frame_length = d->last_block_samples;
- d->last_block_samples = 0; // it's going to be handled now, so reset it
- if (!d->TrueGaplessPresent) {
- mpc_decoder_reset_y(d);
- } else {
- mpc_decoder_bitstream_read(d, 20);
- mpc_decoder_read_bitstream_sv7(d, FALSE);
- mpc_decoder_requantisierung(d, d->Max_Band);
- }
- mpc_decoder_synthese_filter_float(d, buffer);
- return output_frame_length;
- }
-
- if (d->DecodedFrames >= d->OverallFrames) {
- return (mpc_uint32_t)(-1); // end of file -> abort decoding
- }
+ samples_left = d->samples - d->decoded_samples + MPC_DECODER_SYNTH_DELAY;
- if (d->DecodedFrames == 0)
- {
- d->SeekTable[0] = mpc_decoder_bits_read(d);
- d->SeekTableCounter = 0;
+ if (samples_left <= 0 && d->samples != 0) {
+ i->samples = 0;
+ i->bits = -1;
+ return;
}
- // read jump-info for validity check of frame
- d->FwdJumpInfo = mpc_decoder_bitstream_read(d, 20);
-
- d->ActDecodePos = (d->Zaehler << 5) + d->pos;
-
- // 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, FALSE);
- break;
- default:
- return (mpc_uint32_t)(-1);
+ if (d->stream_version == 8) {
+ mpc_decoder_read_bitstream_sv8(d, r, i->is_key_frame);
+ } else {
+ mpc_decoder_read_bitstream_sv7(d, r);
}
- d->FrameWasValid = mpc_decoder_bits_read(d) - FrameBitCnt == d->FwdJumpInfo;
- d->DecodedFrames++;
-
- /* update seek table */
- d->SeekTableCounter += d->FwdJumpInfo + 20;
- if (0 == ((d->DecodedFrames) & (d->SeekTable_Mask)))
- {
- d->SeekTable[d->DecodedFrames>>d->SeekTable_Step] = d->SeekTableCounter;
- d->MaxDecodedFrames = d->DecodedFrames;
- d->SeekTableCounter = 0;
+ if (d->samples_to_skip < MPC_FRAME_LENGTH + MPC_DECODER_SYNTH_DELAY) {
+ mpc_decoder_requantisierung(d);
+ mpc_decoder_synthese_filter_float(d, i->buffer, d->channels);
}
- // synthesize signal
- mpc_decoder_requantisierung(d, d->Max_Band);
-
- mpc_decoder_synthese_filter_float(d, buffer);
-
- // cut off first MPC_DECODER_SYNTH_DELAY zero-samples
- if (d->DecodedFrames == d->OverallFrames && d->StreamVersion >= 6) {
- // reconstruct exact filelength
- mpc_int32_t mod_block = mpc_decoder_bitstream_read(d, 11);
- mpc_int32_t FilterDecay;
+ d->decoded_samples += MPC_FRAME_LENGTH;
- if (mod_block == 0) {
- // Encoder bugfix
- mod_block = 1152;
- }
- FilterDecay = (mod_block + MPC_DECODER_SYNTH_DELAY) % MPC_FRAME_LENGTH;
-
- // additional FilterDecay samples are needed for decay of synthesis filter
- if (MPC_DECODER_SYNTH_DELAY + mod_block >= MPC_FRAME_LENGTH) {
- // this variable will be checked for at the top of the function
- d->last_block_samples = FilterDecay;
- }
- else { // there are only FilterDecay samples needed for this frame
- output_frame_length = FilterDecay;
+ // reconstruct exact filelength
+ if (d->decoded_samples - d->samples < MPC_FRAME_LENGTH && d->stream_version == 7) {
+ int last_frame_samples = mpc_bits_read(r, 11);
+ if (d->decoded_samples == d->samples) {
+ if (last_frame_samples == 0) last_frame_samples = MPC_FRAME_LENGTH;
+ d->samples += last_frame_samples - MPC_FRAME_LENGTH;
+ samples_left += last_frame_samples - MPC_FRAME_LENGTH;
}
}
+ i->samples = samples_left > MPC_FRAME_LENGTH ? MPC_FRAME_LENGTH : samples_left < 0 ? 0 : (mpc_uint32_t) samples_left;
+ i->bits = (mpc_uint32_t) (((r->buff - r_sav.buff) << 3) + r_sav.count - r->count);
+
if (d->samples_to_skip) {
- if (output_frame_length < d->samples_to_skip) {
- d->samples_to_skip -= output_frame_length;
- output_frame_length = 0;
- }
- else {
- output_frame_length -= d->samples_to_skip;
- memmove(
- buffer,
- buffer + d->samples_to_skip,
- output_frame_length * sizeof (MPC_SAMPLE_FORMAT));
- memmove(
- buffer + MPC_FRAME_LENGTH,
- buffer + MPC_FRAME_LENGTH + d->samples_to_skip,
- output_frame_length * sizeof (MPC_SAMPLE_FORMAT));
+ if (i->samples <= d->samples_to_skip) {
+ d->samples_to_skip -= i->samples;
+ i->samples = 0;
+ } else {
+ i->samples -= d->samples_to_skip;
+
+ /* move valid samples to beginning for channel 0. noninterleaved! */
+ memmove(i->buffer,
+ i->buffer + d->samples_to_skip,
+ i->samples * sizeof(MPC_SAMPLE_FORMAT));
+ /* move valid samples to beginning for channel 1. noninterleaved! */
+ memmove(i->buffer + MPC_FRAME_LENGTH,
+ i->buffer + MPC_FRAME_LENGTH + d->samples_to_skip,
+ i->samples * sizeof(MPC_SAMPLE_FORMAT));
+
d->samples_to_skip = 0;
}
}
-
- return output_frame_length;
-}
-
-mpc_uint32_t mpc_decoder_decode(
- mpc_decoder *d,
- MPC_SAMPLE_FORMAT *buffer,
- mpc_uint32_t *vbr_update_acc,
- mpc_uint32_t *vbr_update_bits)
-{
- for(;;)
- {
- mpc_uint32_t RING = d->Zaehler;
- mpc_int32_t vbr_ring = (RING << 5) + d->pos;
-
- mpc_uint32_t valid_samples = mpc_decoder_decode_internal(d, buffer);
-
- if (valid_samples == (mpc_uint32_t)(-1) ) {
- return 0;
- }
-
- /**************** ERROR CONCEALMENT *****************/
- if (d->FrameWasValid == 0 ) {
- // error occurred in bitstream
- return (mpc_uint32_t)(-1);
- }
- else {
- if (vbr_update_acc && vbr_update_bits) {
- (*vbr_update_acc) ++;
- vbr_ring = (d->Zaehler << 5) + d->pos - vbr_ring;
- if (vbr_ring < 0) {
- vbr_ring += 524288;
- }
- (*vbr_update_bits) += vbr_ring;
- }
-
- }
- mpc_decoder_update_buffer(d);
-
- if (valid_samples > 0) {
- return valid_samples;
- }
- }
}
void
-mpc_decoder_requantisierung(mpc_decoder *d, const mpc_int32_t Last_Band)
+mpc_decoder_requantisierung(mpc_decoder *d)
{
mpc_int32_t Band;
mpc_int32_t n;
@@ -613,6 +253,7 @@ mpc_decoder_requantisierung(mpc_decoder *d, const mpc_int32_t Last_Band)
MPC_SAMPLE_FORMAT* YR;
mpc_int16_t* L;
mpc_int16_t* R;
+ const mpc_int32_t Last_Band = d->max_band;
#ifdef MPC_FIXED_POINT
#if MPC_FIXED_POINT_FRACTPART == 14
@@ -629,42 +270,42 @@ mpc_decoder_requantisierung(mpc_decoder *d, const mpc_int32_t Last_Band)
#endif
// requantization and scaling of subband-samples
for ( Band = 0; Band <= Last_Band; Band++ ) { // setting pointers
- YL = d->Y_L[0] + Band;
- YR = d->Y_R[0] + Band;
+ YL = d->Y_L + Band;
+ YR = d->Y_R + Band;
L = d->Q[Band].L;
R = d->Q[Band].R;
/************************** MS-coded **************************/
if ( d->MS_Flag [Band] ) {
if ( d->Res_L [Band] ) {
if ( d->Res_R [Band] ) { // M!=0, S!=0
- facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , (unsigned char)d->SCF_Index_L[Band][0]);
- facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , (unsigned char)d->SCF_Index_R[Band][0]);
+ facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][0] & 0xFF);
+ facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][0] & 0xFF);
for ( n = 0; n < 12; n++, YL += 32, YR += 32 ) {
*YL = (templ = MPC_MULTIPLY_FLOAT_INT(facL,*L++))+(tempr = MPC_MULTIPLY_FLOAT_INT(facR,*R++));
*YR = templ - tempr;
}
- facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , (unsigned char)d->SCF_Index_L[Band][1]);
- facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , (unsigned char)d->SCF_Index_R[Band][1]);
+ facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][1] & 0xFF);
+ facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][1] & 0xFF);
for ( ; n < 24; n++, YL += 32, YR += 32 ) {
*YL = (templ = MPC_MULTIPLY_FLOAT_INT(facL,*L++))+(tempr = MPC_MULTIPLY_FLOAT_INT(facR,*R++));
*YR = templ - tempr;
}
- facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , (unsigned char)d->SCF_Index_L[Band][2]);
- facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , (unsigned char)d->SCF_Index_R[Band][2]);
+ facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][2] & 0xFF);
+ facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][2] & 0xFF);
for ( ; n < 36; n++, YL += 32, YR += 32 ) {
*YL = (templ = MPC_MULTIPLY_FLOAT_INT(facL,*L++))+(tempr = MPC_MULTIPLY_FLOAT_INT(facR,*R++));
*YR = templ - tempr;
}
} else { // M!=0, S==0
- facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , (unsigned char)d->SCF_Index_L[Band][0]);
+ facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][0] & 0xFF);
for ( n = 0; n < 12; n++, YL += 32, YR += 32 ) {
*YR = *YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++);
}
- facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , (unsigned char)d->SCF_Index_L[Band][1]);
+ facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][1] & 0xFF);
for ( ; n < 24; n++, YL += 32, YR += 32 ) {
*YR = *YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++);
}
- facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , (unsigned char)d->SCF_Index_L[Band][2]);
+ facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][2] & 0xFF);
for ( ; n < 36; n++, YL += 32, YR += 32 ) {
*YR = *YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++);
}
@@ -672,15 +313,15 @@ mpc_decoder_requantisierung(mpc_decoder *d, const mpc_int32_t Last_Band)
} else {
if (d->Res_R[Band]) // M==0, S!=0
{
- facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , (unsigned char)d->SCF_Index_R[Band][0]);
+ facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][0] & 0xFF);
for ( n = 0; n < 12; n++, YL += 32, YR += 32 ) {
*YR = - (*YL = MPC_MULTIPLY_FLOAT_INT(facR,*(R++)));
}
- facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , (unsigned char)d->SCF_Index_R[Band][1]);
+ facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][1] & 0xFF);
for ( ; n < 24; n++, YL += 32, YR += 32 ) {
*YR = - (*YL = MPC_MULTIPLY_FLOAT_INT(facR,*(R++)));
}
- facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , (unsigned char)d->SCF_Index_R[Band][2]);
+ facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][2] & 0xFF);
for ( ; n < 36; n++, YL += 32, YR += 32 ) {
*YR = - (*YL = MPC_MULTIPLY_FLOAT_INT(facR,*(R++)));
}
@@ -695,36 +336,36 @@ mpc_decoder_requantisierung(mpc_decoder *d, const mpc_int32_t Last_Band)
else {
if ( d->Res_L [Band] ) {
if ( d->Res_R [Band] ) { // L!=0, R!=0
- facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , (unsigned char)d->SCF_Index_L[Band][0]);
- facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , (unsigned char)d->SCF_Index_R[Band][0]);
+ facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][0] & 0xFF);
+ facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][0] & 0xFF);
for (n = 0; n < 12; n++, YL += 32, YR += 32 ) {
*YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++);
*YR = MPC_MULTIPLY_FLOAT_INT(facR,*R++);
}
- facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , (unsigned char)d->SCF_Index_L[Band][1]);
- facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , (unsigned char)d->SCF_Index_R[Band][1]);
+ facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][1] & 0xFF);
+ facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][1] & 0xFF);
for (; n < 24; n++, YL += 32, YR += 32 ) {
*YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++);
*YR = MPC_MULTIPLY_FLOAT_INT(facR,*R++);
}
- facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , (unsigned char)d->SCF_Index_L[Band][2]);
- facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , (unsigned char)d->SCF_Index_R[Band][2]);
+ facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][2] & 0xFF);
+ facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][2] & 0xFF);
for (; n < 36; n++, YL += 32, YR += 32 ) {
*YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++);
*YR = MPC_MULTIPLY_FLOAT_INT(facR,*R++);
}
} else { // L!=0, R==0
- facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , (unsigned char)d->SCF_Index_L[Band][0]);
+ facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][0] & 0xFF);
for ( n = 0; n < 12; n++, YL += 32, YR += 32 ) {
*YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++);
*YR = 0;
}
- facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , (unsigned char)d->SCF_Index_L[Band][1]);
+ facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][1] & 0xFF);
for ( ; n < 24; n++, YL += 32, YR += 32 ) {
*YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++);
*YR = 0;
}
- facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , (unsigned char)d->SCF_Index_L[Band][2]);
+ facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][2] & 0xFF);
for ( ; n < 36; n++, YL += 32, YR += 32 ) {
*YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++);
*YR = 0;
@@ -733,17 +374,17 @@ mpc_decoder_requantisierung(mpc_decoder *d, const mpc_int32_t Last_Band)
}
else {
if ( d->Res_R [Band] ) { // L==0, R!=0
- facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , (unsigned char)d->SCF_Index_R[Band][0]);
+ facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][0] & 0xFF);
for ( n = 0; n < 12; n++, YL += 32, YR += 32 ) {
*YL = 0;
*YR = MPC_MULTIPLY_FLOAT_INT(facR,*R++);
}
- facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , (unsigned char)d->SCF_Index_R[Band][1]);
+ facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][1] & 0xFF);
for ( ; n < 24; n++, YL += 32, YR += 32 ) {
*YL = 0;
*YR = MPC_MULTIPLY_FLOAT_INT(facR,*R++);
}
- facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , (unsigned char)d->SCF_Index_R[Band][2]);
+ facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][2] & 0xFF);
for ( ; n < 36; n++, YL += 32, YR += 32 ) {
*YL = 0;
*YR = MPC_MULTIPLY_FLOAT_INT(facR,*R++);
@@ -758,1040 +399,324 @@ mpc_decoder_requantisierung(mpc_decoder *d, const mpc_int32_t Last_Band)
}
}
-#ifdef MPC_SUPPORT_SV456
-static const unsigned char Q_res[32][16] ICONST_ATTR = {
-{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)
+void mpc_decoder_read_bitstream_sv7(mpc_decoder * d, mpc_bits_reader * r)
{
- mpc_int32_t n,k;
- mpc_int32_t Max_used_Band=0;
- const HuffmanTyp *Table;
- const HuffmanTyp *x1;
- const HuffmanTyp *x2;
- mpc_int8_t *L;
- mpc_int8_t *R;
- mpc_int16_t *QL;
- mpc_int16_t *QR;
- mpc_int8_t *ResL = d->Res_L;
- mpc_int8_t *ResR = d->Res_R;
+ mpc_int32_t n, idx, Max_used_Band = 0;
- /************************ HEADER **************************/
- ResL = d->Res_L;
- ResR = d->Res_R;
- for (n=0; n <= d->Max_Band; ++n, ++ResL, ++ResR)
- {
- 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;
+ /***************************** Header *****************************/
- *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 = Q_res[n][mpc_decoder_huffman_decode(d, Table)];
+ // first subband
+ d->Res_L[0] = mpc_bits_read(r, 4);
+ d->Res_R[0] = mpc_bits_read(r, 4);
+ if (!(d->Res_L[0] == 0 && d->Res_R[0] == 0)) {
+ if (d->ms)
+ d->MS_Flag[0] = mpc_bits_read(r, 1);
+ Max_used_Band = 1;
+ }
+
+ // consecutive subbands
+ for ( n = 1; n <= d->max_band; n++ ) {
+ idx = mpc_bits_huff_lut(r, & mpc_HuffHdr);
+ d->Res_L[n] = (idx!=4) ? d->Res_L[n - 1] + idx : (int) mpc_bits_read(r, 4);
- // only perform the following procedure up to the maximum non-zero subband
- if (*ResL || *ResR) Max_used_Band = n;
+ idx = mpc_bits_huff_lut(r, & mpc_HuffHdr);
+ d->Res_R[n] = (idx!=4) ? d->Res_R[n - 1] + idx : (int) mpc_bits_read(r, 4);
+
+ if (!(d->Res_L[n] == 0 && d->Res_R[n] == 0)) {
+ if (d->ms)
+ d->MS_Flag[n] = mpc_bits_read(r, 1);
+ Max_used_Band = n + 1;
+ }
}
- /************************* SCFI-Bundle *****************************/
- 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, 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 ******************************/
+ for ( n = 0; n < Max_used_Band; n++ ) {
+ if (d->Res_L[n])
+ d->SCFI_L[n] = mpc_bits_huff_dec(r, mpc_table_HuffSCFI);
+ if (d->Res_R[n])
+ d->SCFI_R[n] = mpc_bits_huff_dec(r, mpc_table_HuffSCFI);
}
- /***************************** SCFI ********************************/
- ResL = d->Res_L;
- ResR = d->Res_R;
- L = d->SCF_Index_L[0];
- R = d->SCF_Index_R[0];
- for (n=0; n <= Max_used_Band; ++n, ++ResL, ++ResR, L+=3, R+=3)
- {
- if (*ResL)
- {
- /*********** DSCF ************/
- if (d->DSCF_Flag_L[n]==1)
- {
- switch (d->SCFI_L[n])
- {
- case 3:
- 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, 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, mpc_table_DSCF_Entropie);
- L[1] = L[0];
- 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, 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;
- break;
+ /**************************** SCF/DSCF ****************************/
+ for ( n = 0; n < Max_used_Band; n++ ) {
+ mpc_int32_t * SCF = d->SCF_Index_L[n];
+ mpc_uint32_t Res = d->Res_L[n], SCFI = d->SCFI_L[n];
+ do {
+ if (Res) {
+ switch (SCFI) {
+ case 1:
+ idx = mpc_bits_huff_lut(r, & mpc_HuffDSCF);
+ SCF[0] = (idx!=8) ? SCF[2] + idx : (int) mpc_bits_read(r, 6);
+ idx = mpc_bits_huff_lut(r, & mpc_HuffDSCF);
+ SCF[1] = (idx!=8) ? SCF[0] + idx : (int) mpc_bits_read(r, 6);
+ SCF[2] = SCF[1];
+ break;
+ case 3:
+ idx = mpc_bits_huff_lut(r, & mpc_HuffDSCF);
+ SCF[0] = (idx!=8) ? SCF[2] + idx : (int) mpc_bits_read(r, 6);
+ SCF[1] = SCF[0];
+ SCF[2] = SCF[1];
+ break;
+ case 2:
+ idx = mpc_bits_huff_lut(r, & mpc_HuffDSCF);
+ SCF[0] = (idx!=8) ? SCF[2] + idx : (int) mpc_bits_read(r, 6);
+ SCF[1] = SCF[0];
+ idx = mpc_bits_huff_lut(r, & mpc_HuffDSCF);
+ SCF[2] = (idx!=8) ? SCF[1] + idx : (int) mpc_bits_read(r, 6);
+ break;
+ case 0:
+ idx = mpc_bits_huff_lut(r, & mpc_HuffDSCF);
+ SCF[0] = (idx!=8) ? SCF[2] + idx : (int) mpc_bits_read(r, 6);
+ idx = mpc_bits_huff_lut(r, & mpc_HuffDSCF);
+ SCF[1] = (idx!=8) ? SCF[0] + idx : (int) mpc_bits_read(r, 6);
+ idx = mpc_bits_huff_lut(r, & mpc_HuffDSCF);
+ SCF[2] = (idx!=8) ? SCF[1] + idx : (int) mpc_bits_read(r, 6);
+ break;
+ default:
+ return;
}
+ if (SCF[0] > 1024)
+ SCF[0] = 0x8080;
+ if (SCF[1] > 1024)
+ SCF[1] = 0x8080;
+ if (SCF[2] > 1024)
+ SCF[2] = 0x8080;
}
- /************ SCF ************/
- else
- {
- switch (d->SCFI_L[n])
- {
- case 3:
- L[0] = mpc_decoder_bitstream_read(d, 6);
- L[1] = L[0];
- L[2] = L[1];
- break;
- case 1:
- L[0] = mpc_decoder_bitstream_read(d, 6);
- L[1] = mpc_decoder_bitstream_read(d, 6);
- L[2] = L[1];
- break;
- case 2:
- L[0] = mpc_decoder_bitstream_read(d, 6);
- L[1] = L[0];
- L[2] = mpc_decoder_bitstream_read(d, 6);
- break;
- case 0:
- L[0] = mpc_decoder_bitstream_read(d, 6);
- L[1] = mpc_decoder_bitstream_read(d, 6);
- L[2] = mpc_decoder_bitstream_read(d, 6);
- break;
- default:
- return;
+ Res = d->Res_R[n];
+ SCFI = d->SCFI_R[n];
+ } while ( SCF == d->SCF_Index_L[n] && (SCF = d->SCF_Index_R[n]));
+ }
+
+// if (d->seeking == TRUE)
+// return;
+
+ /***************************** Samples ****************************/
+ for ( n = 0; n < Max_used_Band; n++ ) {
+ mpc_int16_t *q = d->Q[n].L, Res = d->Res_L[n];
+ do {
+ mpc_int32_t k;
+ const mpc_lut_data *Table;
+ switch (Res) {
+ case -2: case -3: case -4: case -5: case -6: case -7: case -8: case -9:
+ case -10: case -11: case -12: case -13: case -14: case -15: case -16: case -17: case 0:
break;
- }
- }
- }
- if (*ResR)
- {
- /*********** DSCF ************/
- if (d->DSCF_Flag_R[n]==1)
- {
- switch (d->SCFI_R[n])
- {
- case 3:
- R[0] = R[2] + mpc_decoder_huffman_decode_fast(d, mpc_table_DSCF_Entropie);
- R[1] = R[0];
- R[2] = R[1];
+ case -1:
+ for (k=0; k<36; k++ ) {
+ mpc_uint32_t tmp = mpc_random_int(d);
+ q[k] = ((tmp >> 24) & 0xFF) + ((tmp >> 16) & 0xFF) + ((tmp >> 8) & 0xFF) + ((tmp >> 0) & 0xFF) - 510;
+ }
break;
case 1:
- 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];
+ Table = & mpc_HuffQ[0][mpc_bits_read(r, 1)];
+ for ( k = 0; k < 36; k += 3) {
+ idx = mpc_bits_huff_lut(r, Table);
+ q[k] = g_sv7_idx30[idx];
+ q[k + 1] = g_sv7_idx31[idx];
+ q[k + 2] = g_sv7_idx32[idx];
+ }
break;
case 2:
- 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, mpc_table_DSCF_Entropie);
- break;
- case 0:
- 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;
+ Table = & mpc_HuffQ[1][mpc_bits_read(r, 1)];
+ for ( k = 0; k < 36; k += 2) {
+ idx = mpc_bits_huff_lut(r, Table);
+ q[k] = g_sv7_idx50[idx];
+ q[k + 1] = g_sv7_idx51[idx];
+ }
break;
- }
- }
- /************ SCF ************/
- else
- {
- switch (d->SCFI_R[n])
- {
case 3:
- R[0] = mpc_decoder_bitstream_read(d, 6);
- R[1] = R[0];
- R[2] = R[1];
- break;
- case 1:
- R[0] = mpc_decoder_bitstream_read(d, 6);
- R[1] = mpc_decoder_bitstream_read(d, 6);
- R[2] = R[1];
- break;
- case 2:
- R[0] = mpc_decoder_bitstream_read(d, 6);
- R[1] = R[0];
- R[2] = mpc_decoder_bitstream_read(d, 6);
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ Table = & mpc_HuffQ[Res - 1][mpc_bits_read(r, 1)];
+ for ( k = 0; k < 36; k++ )
+ q[k] = mpc_bits_huff_lut(r, Table);
break;
- case 0:
- R[0] = mpc_decoder_bitstream_read(d, 6);
- R[1] = mpc_decoder_bitstream_read(d, 6);
- R[2] = mpc_decoder_bitstream_read(d, 6);
+ case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 17:
+ for ( k = 0; k < 36; k++ )
+ q[k] = (mpc_int32_t)mpc_bits_read(r, Res_bit[Res]) - Dc[Res];
break;
default:
return;
- break;
- }
- }
- }
- }
-
- /**************************** Samples ****************************/
- ResL = d->Res_L;
- ResR = d->Res_R;
- for (n=0; n <= Max_used_Band; ++n, ++ResL, ++ResR)
- {
- // setting pointers
- x1 = mpc_table_SampleHuff[*ResL];
- x2 = mpc_table_SampleHuff[*ResR];
- QL = d->Q[n].L;
- QR = d->Q[n].R;
-
- if (x1!=NULL || x2!=NULL)
- for (k=0; k<36; ++k)
- {
- if (x1 != NULL) *QL++ = mpc_decoder_huffman_decode_fast(d, x1);
- if (x2 != NULL) *QR++ = mpc_decoder_huffman_decode_fast(d, x2);
}
- if (*ResL>7 || *ResR>7)
- for (k=0; k<36; ++k)
- {
- if (*ResL>7) *QL++ = (mpc_int16_t)mpc_decoder_bitstream_read(d, Res_bit[*ResL]) - Dc[*ResL];
- if (*ResR>7) *QR++ = (mpc_int16_t)mpc_decoder_bitstream_read(d, Res_bit[*ResR]) - Dc[*ResR];
- }
+ Res = d->Res_R[n];
+ } while (q == d->Q[n].L && (q = d->Q[n].R));
}
}
-#endif //MPC_SUPPORT_SV456
-/****************************************** SV 7 ******************************************/
-void
-mpc_decoder_read_bitstream_sv7(mpc_decoder *d, mpc_bool_t fastSeeking)
+
+void mpc_decoder_read_bitstream_sv8(mpc_decoder * d, mpc_bits_reader * r, mpc_bool_t is_key_frame)
{
- mpc_int32_t n,k;
- mpc_int32_t Max_used_Band=0;
- const HuffmanTyp *Table;
- mpc_int32_t idx;
- mpc_int8_t *L ,*R;
- mpc_int16_t *LQ ,*RQ;
- mpc_int8_t *ResL,*ResR;
- mpc_uint32_t tmp;
- mpc_uint8_t *LUT;
- mpc_uint8_t max_length;
+ mpc_int32_t n, Max_used_Band;
+ const mpc_can_data * Table, * Tables[2];
/***************************** Header *****************************/
- ResL = d->Res_L;
- ResR = d->Res_R;
- // first subband
- *ResL = mpc_decoder_bitstream_read(d, 4);
- *ResR = mpc_decoder_bitstream_read(d, 4);
- if (d->MS_used && !(*ResL==0 && *ResR==0)) {
- d->MS_Flag[0] = mpc_decoder_bitstream_read(d, 1);
+ if (is_key_frame == MPC_TRUE) {
+ Max_used_Band = mpc_bits_log_dec(r, d->max_band + 1);
} else {
- d->MS_Flag[0] = 0;
- }
-
- // consecutive subbands
- ++ResL; ++ResR; // increase pointers
- for (n=1; n <= d->Max_Band; ++n, ++ResL, ++ResR)
- {
- 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, 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);
+ Max_used_Band = d->last_max_band + mpc_bits_can_dec(r, & mpc_can_Bands);
+ if (Max_used_Band > 32) Max_used_Band -= 33;
+ }
+ d->last_max_band = Max_used_Band;
+
+ if (Max_used_Band) {
+ d->Res_L[Max_used_Band-1] = mpc_bits_can_dec(r, & mpc_can_Res[0]);
+ d->Res_R[Max_used_Band-1] = mpc_bits_can_dec(r, & mpc_can_Res[0]);
+ if (d->Res_L[Max_used_Band-1] > 15) d->Res_L[Max_used_Band-1] -= 17;
+ if (d->Res_R[Max_used_Band-1] > 15) d->Res_R[Max_used_Band-1] -= 17;
+ for ( n = Max_used_Band - 2; n >= 0; n--) {
+ d->Res_L[n] = mpc_bits_can_dec(r, & mpc_can_Res[d->Res_L[n + 1] > 2]) + d->Res_L[n + 1];
+ if (d->Res_L[n] > 15) d->Res_L[n] -= 17;
+ d->Res_R[n] = mpc_bits_can_dec(r, & mpc_can_Res[d->Res_R[n + 1] > 2]) + d->Res_R[n + 1];
+ if (d->Res_R[n] > 15) d->Res_R[n] -= 17;
}
- // only perform following procedures up to the maximum non-zero subband
- if (*ResL!=0 || *ResR!=0) {
- Max_used_Band = n;
- } else {
- d->MS_Flag[n] = 0;
+ if (d->ms) {
+ int cnt = 0, tot = 0;
+ mpc_uint32_t tmp = 0;
+ for( n = 0; n < Max_used_Band; n++)
+ if ( d->Res_L[n] != 0 || d->Res_R[n] != 0 )
+ tot++;
+ cnt = mpc_bits_log_dec(r, tot);
+ if (cnt != 0 && cnt != tot)
+ tmp = mpc_bits_enum_dec(r, mini(cnt, tot-cnt), tot);
+ if (cnt * 2 > tot) tmp = ~tmp;
+ for( n = Max_used_Band - 1; n >= 0; n--)
+ if ( d->Res_L[n] != 0 || d->Res_R[n] != 0 ) {
+ d->MS_Flag[n] = tmp & 1;
+ tmp >>= 1;
+ }
}
}
- /****************************** SCFI ******************************/
- L = d->SCFI_L;
- R = d->SCFI_R;
- 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, mpc_table_HuffSCFI);
- if (*ResR) *R = mpc_decoder_huffman_decode_faster(d, mpc_table_HuffSCFI);
- }
- /**************************** SCF/DSCF ****************************/
- ResL = d->Res_L;
- ResR = d->Res_R;
- L = d->SCF_Index_L[0];
- R = d->SCF_Index_R[0];
- for (n=0; n<=Max_used_Band; ++n, ++ResL, ++ResR, L+=3, R+=3) {
- if (*ResL)
- {
- switch (d->SCFI_L[n])
- {
- case 1:
- idx = Decode_DSCF ();
- L[0] = (idx!=8) ? SCF_DIFF(L[2], idx) : (int) mpc_decoder_bitstream_read(d, 6);
- idx = Decode_DSCF ();
- L[1] = (idx!=8) ? SCF_DIFF(L[0], idx) : (int) mpc_decoder_bitstream_read(d, 6);
- L[2] = L[1];
- break;
- case 3:
- idx = Decode_DSCF ();
- L[0] = (idx!=8) ? SCF_DIFF(L[2], idx) : (int) mpc_decoder_bitstream_read(d, 6);
- L[1] = L[0];
- L[2] = L[1];
- break;
- case 2:
- idx = Decode_DSCF ();
- L[0] = (idx!=8) ? SCF_DIFF(L[2], idx) : (int) mpc_decoder_bitstream_read(d, 6);
- L[1] = L[0];
- idx = Decode_DSCF ();
- L[2] = (idx!=8) ? SCF_DIFF(L[1], idx) : (int) mpc_decoder_bitstream_read(d, 6);
- break;
- case 0:
- idx = Decode_DSCF ();
- L[0] = (idx!=8) ? SCF_DIFF(L[2], idx) : (int) mpc_decoder_bitstream_read(d, 6);
- idx = Decode_DSCF ();
- L[1] = (idx!=8) ? SCF_DIFF(L[0], idx) : (int) mpc_decoder_bitstream_read(d, 6);
- idx = Decode_DSCF ();
- L[2] = (idx!=8) ? SCF_DIFF(L[1], idx) : (int) mpc_decoder_bitstream_read(d, 6);
- break;
- default:
- return;
- break;
- }
- }
- if (*ResR)
- {
- switch (d->SCFI_R[n])
- {
- case 1:
- idx = Decode_DSCF ();
- R[0] = (idx!=8) ? SCF_DIFF(R[2], idx) : (int) mpc_decoder_bitstream_read(d, 6);
- idx = Decode_DSCF ();
- R[1] = (idx!=8) ? SCF_DIFF(R[0], idx) : (int) mpc_decoder_bitstream_read(d, 6);
- R[2] = R[1];
- break;
- case 3:
- idx = Decode_DSCF ();
- R[0] = (idx!=8) ? SCF_DIFF(R[2], idx) : (int) mpc_decoder_bitstream_read(d, 6);
- R[1] = R[0];
- R[2] = R[1];
- break;
- case 2:
- idx = Decode_DSCF ();
- R[0] = (idx!=8) ? SCF_DIFF(R[2], idx) : (int) mpc_decoder_bitstream_read(d, 6);
- R[1] = R[0];
- idx = Decode_DSCF ();
- R[2] = (idx!=8) ? SCF_DIFF(R[1], idx) : (int) mpc_decoder_bitstream_read(d, 6);
- break;
- case 0:
- idx = Decode_DSCF ();
- R[0] = (idx!=8) ? SCF_DIFF(R[2], idx) : (int) mpc_decoder_bitstream_read(d, 6);
- idx = Decode_DSCF ();
- R[1] = (idx!=8) ? SCF_DIFF(R[0], idx) : (int) mpc_decoder_bitstream_read(d, 6);
- idx = Decode_DSCF ();
- R[2] = (idx!=8) ? SCF_DIFF(R[1], idx) : (int) mpc_decoder_bitstream_read(d, 6);
- break;
- default:
- return;
- break;
- }
+ for( n = Max_used_Band; n <= d->max_band; n++)
+ d->Res_L[n] = d->Res_R[n] = 0;
+
+ /****************************** SCFI ******************************/
+ if (is_key_frame == MPC_TRUE){
+ for( n = 0; n < 32; n++)
+ d->DSCF_Flag_L[n] = d->DSCF_Flag_R[n] = 1; // new block -> force key frame
+ }
+
+ Tables[0] = & mpc_can_SCFI[0];
+ Tables[1] = & mpc_can_SCFI[1];
+ for ( n = 0; n < Max_used_Band; n++ ) {
+ int tmp = 0, cnt = -1;
+ if (d->Res_L[n]) cnt++;
+ if (d->Res_R[n]) cnt++;
+ if (cnt >= 0) {
+ tmp = mpc_bits_can_dec(r, Tables[cnt]);
+ if (d->Res_L[n]) d->SCFI_L[n] = tmp >> (2 * cnt);
+ if (d->Res_R[n]) d->SCFI_R[n] = tmp & 3;
}
}
- if (fastSeeking)
- return;
+ /**************************** SCF/DSCF ****************************/
- /***************************** Samples ****************************/
- ResL = d->Res_L;
- ResR = d->Res_R;
- LQ = d->Q[0].L;
- RQ = d->Q[0].R;
- for (n=0; n <= Max_used_Band; ++n, ++ResL, ++ResR, LQ+=36, RQ+=36)
- {
- /************** links **************/
- switch (*ResL)
- {
- case -2: case -3: case -4: case -5: case -6: case -7: case -8: case -9:
- case -10: case -11: case -12: case -13: case -14: case -15: case -16: case -17:
- LQ += 36;
- break;
- case -1:
- for (k=0; k<36; k++ ) {
- tmp = mpc_random_int(d);
- *LQ++ = ((tmp >> 24) & 0xFF) + ((tmp >> 16) & 0xFF) + ((tmp >> 8) & 0xFF) + ((tmp >> 0) & 0xFF) - 510;
- }
- break;
- case 0:
- LQ += 36;// increase pointer
- break;
- case 1:
- if (mpc_decoder_bitstream_read(d, 1)) {
- Table = mpc_table_HuffQ[1][1];
- LUT = LUT1_1;
- max_length = 9;
- } else {
- Table = mpc_table_HuffQ[0][1];
- LUT = LUT1_0;
- max_length = 6;
- }
- for (k=0; k<12; ++k)
- {
- idx = HUFFMAN_DECODE_FASTEST ( d, Table, LUT, max_length );
- *LQ++ = idx30[idx];
- *LQ++ = idx31[idx];
- *LQ++ = idx32[idx];
- }
- break;
- case 2:
- if (mpc_decoder_bitstream_read(d, 1)) {
- Table = mpc_table_HuffQ[1][2];
- LUT = LUT2_1;
- max_length = 10;
- } else {
- Table = mpc_table_HuffQ[0][2];
- LUT = LUT2_0;
- max_length = 7;
- }
- for (k=0; k<18; ++k)
- {
- idx = HUFFMAN_DECODE_FASTEST ( d, Table, LUT, max_length );
- *LQ++ = idx50[idx];
- *LQ++ = idx51[idx];
- }
- break;
- case 3:
- if (mpc_decoder_bitstream_read(d, 1)) {
- Table = mpc_table_HuffQ[1][3];
- LUT = LUT3_1;
- max_length = 5;
- } else {
- Table = mpc_table_HuffQ[0][3];
- LUT = LUT3_0;
- max_length = 4;
- }
- for (k=0; k<36; ++k)
- *LQ++ = HUFFMAN_DECODE_FASTEST ( d, Table, LUT, max_length );
- break;
- case 4:
- if (mpc_decoder_bitstream_read(d, 1)) {
- Table = mpc_table_HuffQ[1][4];
- LUT = LUT4_1;
- max_length = 5;
- } else {
- Table = mpc_table_HuffQ[0][4];
- LUT = LUT4_0;
- max_length = 4;
- }
- for (k=0; k<36; ++k)
- *LQ++ = HUFFMAN_DECODE_FASTEST ( d, Table, LUT, max_length );
- break;
- case 5:
- if (mpc_decoder_bitstream_read(d, 1)) {
- Table = mpc_table_HuffQ[1][5];
- LUT = LUT5_1;
- max_length = 8;
- } else {
- Table = mpc_table_HuffQ[0][5];
- LUT = LUT5_0;
- max_length = 6;
- }
- for (k=0; k<36; ++k)
- *LQ++ = HUFFMAN_DECODE_FASTEST ( d, Table, LUT, max_length );
- break;
- case 6:
- if (mpc_decoder_bitstream_read(d, 1)) {
- Table = mpc_table_HuffQ[1][6];
- LUT = LUT6_1;
- max_length = 7;
- for (k=0; k<36; ++k)
- *LQ++ = HUFFMAN_DECODE_FASTERER ( d, Table, LUT, max_length );
- } else {
- Table = mpc_table_HuffQ[0][6];
- LUT = LUT6_0;
- max_length = 7;
- for (k=0; k<36; ++k)
- *LQ++ = HUFFMAN_DECODE_FASTEST ( d, Table, LUT, max_length );
- }
- break;
- case 7:
- if (mpc_decoder_bitstream_read(d, 1)) {
- Table = mpc_table_HuffQ[1][7];
- LUT = LUT7_1;
- max_length = 8;
- for (k=0; k<36; ++k)
- *LQ++ = HUFFMAN_DECODE_FASTERER ( d, Table, LUT, max_length );
- } else {
- Table = mpc_table_HuffQ[0][7];
- LUT = LUT7_0;
- max_length = 8;
- for (k=0; k<36; ++k)
- *LQ++ = HUFFMAN_DECODE_FASTEST ( d, Table, LUT, max_length );
- }
- break;
- case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 17:
- tmp = Dc[*ResL];
- for (k=0; k<36; ++k)
- *LQ++ = (mpc_int16_t)mpc_decoder_bitstream_read(d, Res_bit[*ResL]) - tmp;
- break;
- default:
- return;
- }
- /************** rechts **************/
- switch (*ResR)
- {
- case -2: case -3: case -4: case -5: case -6: case -7: case -8: case -9:
- case -10: case -11: case -12: case -13: case -14: case -15: case -16: case -17:
- RQ += 36;
- break;
- case -1:
- for (k=0; k<36; k++ ) {
- tmp = mpc_random_int(d);
- *RQ++ = ((tmp >> 24) & 0xFF) + ((tmp >> 16) & 0xFF) + ((tmp >> 8) & 0xFF) + ((tmp >> 0) & 0xFF) - 510;
- }
- break;
- case 0:
- RQ += 36;// increase pointer
- break;
- case 1:
- if (mpc_decoder_bitstream_read(d, 1)) {
- Table = mpc_table_HuffQ[1][1];
- LUT = LUT1_1;
- max_length = 9;
- } else {
- Table = mpc_table_HuffQ[0][1];
- LUT = LUT1_0;
- max_length = 6;
- }
- for (k=0; k<12; ++k)
- {
- idx = HUFFMAN_DECODE_FASTEST ( d, Table, LUT, max_length );
- *RQ++ = idx30[idx];
- *RQ++ = idx31[idx];
- *RQ++ = idx32[idx];
- }
- break;
- case 2:
- if (mpc_decoder_bitstream_read(d, 1)) {
- Table = mpc_table_HuffQ[1][2];
- LUT = LUT2_1;
- max_length = 10;
- } else {
- Table = mpc_table_HuffQ[0][2];
- LUT = LUT2_0;
- max_length = 7;
- }
- for (k=0; k<18; ++k)
- {
- idx = HUFFMAN_DECODE_FASTEST ( d, Table, LUT, max_length );
- *RQ++ = idx50[idx];
- *RQ++ = idx51[idx];
- }
- break;
- case 3:
- if (mpc_decoder_bitstream_read(d, 1)) {
- Table = mpc_table_HuffQ[1][3];
- LUT = LUT3_1;
- max_length = 5;
- } else {
- Table = mpc_table_HuffQ[0][3];
- LUT = LUT3_0;
- max_length = 4;
- }
- for (k=0; k<36; ++k)
- *RQ++ = HUFFMAN_DECODE_FASTEST ( d, Table, LUT, max_length );
- break;
- case 4:
- if (mpc_decoder_bitstream_read(d, 1)) {
- Table = mpc_table_HuffQ[1][4];
- LUT = LUT4_1;
- max_length = 5;
+ for ( n = 0; n < Max_used_Band; n++ ) {
+ mpc_int32_t * SCF = d->SCF_Index_L[n];
+ mpc_uint32_t Res = d->Res_L[n], SCFI = d->SCFI_L[n];
+ mpc_bool_t * DSCF_Flag = &d->DSCF_Flag_L[n];
+
+ do {
+ if ( Res ) {
+ int m;
+ if (*DSCF_Flag == 1) {
+ SCF[0] = (mpc_int32_t)mpc_bits_read(r, 7) - 6;
+ *DSCF_Flag = 0;
} else {
- Table = mpc_table_HuffQ[0][4];
- LUT = LUT4_0;
- max_length = 4;
+ mpc_uint_t tmp = mpc_bits_can_dec(r, & mpc_can_DSCF[1]);
+ if (tmp == 64)
+ tmp += mpc_bits_read(r, 6);
+ SCF[0] = ((SCF[2] - 25 + tmp) & 127) - 6;
}
- for (k=0; k<36; ++k)
- *RQ++ = HUFFMAN_DECODE_FASTEST ( d, Table, LUT, max_length );
- break;
- case 5:
- if (mpc_decoder_bitstream_read(d, 1)) {
- Table = mpc_table_HuffQ[1][5];
- LUT = LUT5_1;
- max_length = 8;
- } else {
- Table = mpc_table_HuffQ[0][5];
- LUT = LUT5_0;
- max_length = 6;
+ for( m = 0; m < 2; m++){
+ if (((SCFI << m) & 2) == 0) {
+ mpc_uint_t tmp = mpc_bits_can_dec(r, & mpc_can_DSCF[0]);
+ if (tmp == 31)
+ tmp = 64 + mpc_bits_read(r, 6);
+ SCF[m + 1] = ((SCF[m] - 25 + tmp) & 127) - 6;
+ } else
+ SCF[m + 1] = SCF[m];
}
- for (k=0; k<36; ++k)
- *RQ++ = HUFFMAN_DECODE_FASTEST ( d, Table, LUT, max_length );
- break;
- case 6:
- if (mpc_decoder_bitstream_read(d, 1)) {
- Table = mpc_table_HuffQ[1][6];
- LUT = LUT6_1;
- max_length = 7;
- for (k=0; k<36; ++k)
- *RQ++ = HUFFMAN_DECODE_FASTERER ( d, Table, LUT, max_length );
- } else {
- Table = mpc_table_HuffQ[0][6];
- LUT = LUT6_0;
- max_length = 7;
- for (k=0; k<36; ++k)
- *RQ++ = HUFFMAN_DECODE_FASTEST ( d, Table, LUT, max_length );
}
- break;
- case 7:
- if (mpc_decoder_bitstream_read(d, 1)) {
- Table = mpc_table_HuffQ[1][7];
- LUT = LUT7_1;
- max_length = 8;
- for (k=0; k<36; ++k)
- *RQ++ = HUFFMAN_DECODE_FASTERER ( d, Table, LUT, max_length );
- } else {
- Table = mpc_table_HuffQ[0][7];
- LUT = LUT7_0;
- max_length = 8;
- for (k=0; k<36; ++k)
- *RQ++ = HUFFMAN_DECODE_FASTEST ( d, Table, LUT, max_length );
- }
- break;
- case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 17:
- tmp = Dc[*ResR];
- for (k=0; k<36; ++k)
- *RQ++ = (mpc_int16_t)mpc_decoder_bitstream_read(d, Res_bit[*ResR]) - tmp;
- break;
- default:
- return;
- }
- }
-}
-
-void mpc_decoder_setup(mpc_decoder *d, mpc_reader *r)
-{
- d->r = r;
-
- d->MPCHeaderPos = 0;
- d->StreamVersion = 0;
- d->MS_used = 0;
- d->FwdJumpInfo = 0;
- d->ActDecodePos = 0;
- d->FrameWasValid = 0;
- d->OverallFrames = 0;
- d->DecodedFrames = 0;
- d->MaxDecodedFrames = 0;
- d->TrueGaplessPresent = 0;
- d->last_block_samples = 0;
- d->WordsRead = 0;
- d->Max_Band = 0;
- d->SampleRate = 0;
- d->__r1 = 1;
- d->__r2 = 1;
-
- d->dword = 0;
- d->pos = 0;
- d->Zaehler = 0;
- d->Ring = 0;
- d->WordsRead = 0;
- d->Max_Band = 0;
- d->SeekTable_Step = 0;
- d->SeekTable_Mask = 0;
- d->SeekTableCounter = 0;
-
- mpc_decoder_initialisiere_quantisierungstabellen(d, 1.0f);
-
- LOOKUP ( mpc_table_HuffQ[0][1], 27, LUT1_0 );
- LOOKUP ( mpc_table_HuffQ[1][1], 27, LUT1_1 );
- LOOKUP ( mpc_table_HuffQ[0][2], 25, LUT2_0 );
- LOOKUP ( mpc_table_HuffQ[1][2], 25, LUT2_1 );
- LOOKUP ( mpc_table_HuffQ[0][3], 7, LUT3_0 );
- LOOKUP ( mpc_table_HuffQ[1][3], 7, LUT3_1 );
- LOOKUP ( mpc_table_HuffQ[0][4], 9, LUT4_0 );
- LOOKUP ( mpc_table_HuffQ[1][4], 9, LUT4_1 );
- LOOKUP ( mpc_table_HuffQ[0][5], 15, LUT5_0 );
- LOOKUP ( mpc_table_HuffQ[1][5], 15, LUT5_1 );
- LOOKUP ( mpc_table_HuffQ[0][6], 31, LUT6_0 );
- LOOKUP ( mpc_table_HuffQ[1][6], 31, LUT6_1 );
- LOOKUP ( mpc_table_HuffQ[0][7], 63, LUT7_0 );
- LOOKUP ( mpc_table_HuffQ[1][7], 63, LUT7_1 );
- LOOKUP ( mpc_table_HuffDSCF, 16, LUTDSCF );
-
- d->SeekTable = Seekbuffer;
- d->Speicher = Speicher;
- d->Y_L = Y_L;
- d->Y_R = Y_R;
-
- #if defined(CPU_COLDFIRE)
- coldfire_set_macsr(EMAC_FRACTIONAL | EMAC_SATURATE);
- #endif
-}
-
-static void mpc_decoder_set_streaminfo(mpc_decoder *d, mpc_streaminfo *si)
-{
- mpc_uint32_t seekTableSize;
-
- mpc_decoder_reset_synthesis(d);
- mpc_decoder_reset_globals(d);
-
- d->StreamVersion = si->stream_version;
- d->MS_used = si->ms;
- d->Max_Band = si->max_band;
- d->OverallFrames = si->frames;
- d->MPCHeaderPos = si->header_position;
- d->TrueGaplessPresent = si->is_true_gapless;
- d->SampleRate = (mpc_int32_t)si->sample_freq;
-
- d->samples_to_skip = MPC_DECODER_SYNTH_DELAY;
-
- memset(d->SeekTable, 0, sizeof(Seekbuffer));
-
- // limit used table size to MPC_SEEK_BUFFER_SIZE
- seekTableSize = min(si->frames, MPC_SEEK_BUFFER_SIZE);
- // frames per buffer to not exceed buffer and to be able to seek full file
- while ( seekTableSize < si->frames / (1<<d->SeekTable_Step) )
- {
- d->SeekTable_Step++;
+ Res = d->Res_R[n];
+ SCFI = d->SCFI_R[n];
+ DSCF_Flag = &d->DSCF_Flag_R[n];
+ } while ( SCF == d->SCF_Index_L[n] && (SCF = d->SCF_Index_R[n]));
}
- d->SeekTable_Mask = (1 << d->SeekTable_Step) - 1;
-}
-
-mpc_bool_t mpc_decoder_initialize(mpc_decoder *d, mpc_streaminfo *si)
-{
- mpc_uint32_t bitPos;
- mpc_uint32_t fpos;
-
- mpc_decoder_set_streaminfo(d, si);
-
- // setting position to the beginning of the data-bitstream
- bitPos = get_initial_fpos(d, d->StreamVersion);
- fpos = bitPos >> 5;
- // fill buffer and initialize decoder
- f_seek(d, fpos*4 + d->MPCHeaderPos);
- f_read_dword(d, d->Speicher, MEMSIZE);
- d->Ring = 0;
- d->Zaehler = 0;
- d->pos = bitPos & 31;
- d->WordsRead = fpos;
- d->dword = SWAP(d->Speicher[0]);
- d->next = SWAP(d->Speicher[1]);
-
- return TRUE;
-}
-
-// jumps over the current frame
-mpc_uint32_t mpc_decoder_jump_frame(mpc_decoder *d) {
-
- mpc_uint32_t frameSize;
-
- // ensure the buffer is full
- mpc_decoder_update_buffer(d);
-
- // bits in frame
- frameSize = mpc_decoder_bitstream_read(d, 20);
-
- // jump forward
- mpc_decoder_seek_forward(d, frameSize);
-
- return frameSize + 20;
-
-}
-
-static mpc_uint32_t get_initial_fpos(mpc_decoder *d, mpc_uint32_t StreamVersion)
-{
- mpc_uint32_t fpos = 0;
- (void) StreamVersion;
-
- // setting position to the beginning of the data-bitstream
- switch ( d->StreamVersion ) {
- case 0x04: fpos = 48; break;
- case 0x05:
- case 0x06: fpos = 64; break;
- case 0x07:
- case 0x17: fpos = 200; break;
- }
- return fpos;
-}
-
-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));
-}
-
-void mpc_decoder_reset_state(mpc_decoder *d) {
-
- memset(d->Y_L , 0, sizeof Y_L );
- memset(d->Y_R , 0, sizeof Y_R );
-#ifdef SCF_HACK
- memset(d->SCF_Index_L , 127, sizeof d->SCF_Index_L );
- memset(d->SCF_Index_R , 127, sizeof d->SCF_Index_R );
-#else
- memset(d->SCF_Index_L , 0, sizeof d->SCF_Index_L );
- memset(d->SCF_Index_R , 0, sizeof d->SCF_Index_R );
-#endif
- memset(d->Res_L , 0, sizeof d->Res_L );
- memset(d->Res_R , 0, sizeof d->Res_R );
- memset(d->SCFI_L , 0, sizeof d->SCFI_L );
- memset(d->SCFI_R , 0, sizeof d->SCFI_R );
-#ifdef MPC_SUPPORT_SV456
- memset(d->DSCF_Flag_L , 0, sizeof d->DSCF_Flag_L );
- memset(d->DSCF_Flag_R , 0, sizeof d->DSCF_Flag_R );
-#endif
- memset(d->Q , 0, sizeof d->Q );
- memset(d->MS_Flag , 0, sizeof d->MS_Flag );
-
-}
-
-mpc_bool_t mpc_decoder_seek_sample(mpc_decoder *d, mpc_int64_t destsample)
-{
- mpc_uint32_t fpos = 0; // the bit to seek to
- mpc_uint32_t seekFrame = 0; // the frame to seek to
- mpc_uint32_t lastFrame = 0; // last frame to seek to before scanning scale factors
- mpc_int32_t delta = 0; // direction of seek
-
- destsample += MPC_DECODER_SYNTH_DELAY;
- seekFrame = (mpc_uint32_t) ((destsample) / MPC_FRAME_LENGTH);
- d->samples_to_skip = (mpc_uint32_t)((destsample) % MPC_FRAME_LENGTH);
-
- // prevent from desired position out of allowed range
- seekFrame = seekFrame < d->OverallFrames ? seekFrame : d->OverallFrames;
-
- // seek direction (note: avoids casting to int64)
- delta = (d->DecodedFrames > seekFrame ? -(mpc_int32_t)(d->DecodedFrames - seekFrame) : (mpc_int32_t)(seekFrame - d->DecodedFrames));
-
- if (seekFrame > SEEK_PRE_DECODE)
- lastFrame = seekFrame - SEEK_PRE_DECODE + 1 - (1<<d->SeekTable_Step);
-
- if (d->MaxDecodedFrames == 0) // nothing decoded yet, parse stream
- {
- mpc_decoder_reset_state(d);
-
- // starts from the beginning since no frames have been decoded yet, or not using seek table
- fpos = get_initial_fpos(d, d->StreamVersion);
-
- // seek to the first frame
- mpc_decoder_seek_to(d, fpos);
-
- // jump to the last frame via parsing, updating seek table
- d->SeekTable[0] = (mpc_uint32_t)fpos;
- d->SeekTableCounter = 0;
- for (d->DecodedFrames = 0; d->DecodedFrames < lastFrame; d->DecodedFrames++)
- {
- d->SeekTableCounter += mpc_decoder_jump_frame(d);
- if (0 == ((d->DecodedFrames+1) & (d->SeekTable_Mask)))
- {
- d->SeekTable[(d->DecodedFrames+1)>>d->SeekTable_Step] = d->SeekTableCounter;
- d->MaxDecodedFrames = d->DecodedFrames;
- d->SeekTableCounter = 0;
- }
- }
- }
- else if (delta < 0) // jump backwards, seek table is already available
- {
- mpc_decoder_reset_state(d);
-
- // jumps backwards using the seek table
- fpos = d->SeekTable[0];
- for (d->DecodedFrames = 0; d->DecodedFrames < lastFrame; d->DecodedFrames++)
- {
- if (0 == ((d->DecodedFrames+1) & (d->SeekTable_Mask)))
- {
- fpos += d->SeekTable[(d->DecodedFrames+1)>>d->SeekTable_Step];
- d->SeekTableCounter = 0;
- }
- }
- mpc_decoder_seek_to(d, fpos);
- }
- else if (delta > SEEK_PRE_DECODE) // jump forward, seek table is available
- {
- mpc_decoder_reset_state(d);
-
- // 1st loop: jump to the last usable position in the seek table
- fpos = mpc_decoder_bits_read(d);
- for (; d->DecodedFrames < d->MaxDecodedFrames && d->DecodedFrames < lastFrame; d->DecodedFrames++)
- {
- if (0 == ((d->DecodedFrames+1) & (d->SeekTable_Mask)))
- {
- fpos += d->SeekTable[(d->DecodedFrames+1)>>d->SeekTable_Step];
- d->SeekTableCounter = 0;
- }
- }
- mpc_decoder_seek_to(d, fpos);
-
- // 2nd loop: jump the residual frames via parsing, update seek table
- for (;d->DecodedFrames < lastFrame; d->DecodedFrames++)
- {
- d->SeekTableCounter += mpc_decoder_jump_frame(d);
- if (0 == ((d->DecodedFrames+1) & (d->SeekTable_Mask)))
- {
- d->SeekTable[(d->DecodedFrames+1)>>d->SeekTable_Step] = d->SeekTableCounter;
- d->MaxDecodedFrames = d->DecodedFrames;
- d->SeekTableCounter = 0;
+ /***************************** Samples ****************************/
+ for ( n = 0; n < Max_used_Band; n++ ) {
+ mpc_int16_t *q = d->Q[n].L, Res = d->Res_L[n];
+ static const int thres[] = {0, 0, 3, 0, 0, 1, 3, 4, 8};
+ do {
+ mpc_int32_t k = 0, idx = 1;
+ if (Res != 0) {
+ if (Res == 2) {
+ Tables[0] = & mpc_can_Q [0][0];
+ Tables[1] = & mpc_can_Q [0][1];
+ idx = 2 * thres[Res];
+ for ( ; k < 36; k += 3) {
+ int tmp = mpc_bits_can_dec(r, Tables[idx > thres[Res]]);
+ q[k] = g_sv8_idx50[tmp];
+ q[k + 1] = g_sv8_idx51[tmp];
+ q[k + 2] = g_sv8_idx52[tmp];
+ idx = (idx >> 1) + g_sv8_HuffQ2_var[tmp];
+ }
+ } else if (Res == 1) {
+ Table = & mpc_can_Q1;
+ for( ; k < 36; ){
+ int kmax = k + 18;
+ mpc_uint_t cnt = mpc_bits_can_dec(r, Table);
+ idx = 0;
+ if (cnt > 0 && cnt < 18)
+ idx = mpc_bits_enum_dec(r, cnt <= 9 ? cnt : 18 - cnt, 18);
+ if (cnt > 9) idx = ~idx;
+ for ( ; k < kmax; k++) {
+ q[k] = 0;
+ if ( idx & (1 << 17) )
+ q[k] = (mpc_bits_read(r, 1) << 1) - 1;
+ idx <<= 1;
+ }
+ }
+ } else if (Res == -1) {
+ for ( ; k<36; k++ ) {
+ mpc_uint32_t tmp = mpc_random_int(d);
+ q[k] = ((tmp >> 24) & 0xFF) + ((tmp >> 16) & 0xFF) + ((tmp >> 8) & 0xFF) + ((tmp >> 0) & 0xFF) - 510;
+ }
+ } else if (Res <= 4) {
+ Table = & mpc_can_Q[1][Res - 3];
+ for ( ; k < 36; k += 2 ) {
+ union {
+ mpc_int8_t sym;
+ struct { mpc_int8_t s1:4, s2:4; };
+ } tmp;
+ tmp.sym = mpc_bits_can_dec(r, Table);
+ q[k] = tmp.s1;
+ q[k + 1] = tmp.s2;
+ }
+ } else if (Res <= 8) {
+ Tables[0] = & mpc_can_Q [Res - 3][0];
+ Tables[1] = & mpc_can_Q [Res - 3][1];
+ idx = 2 * thres[Res];
+ for ( ; k < 36; k++ ) {
+ q[k] = mpc_bits_can_dec(r, Tables[idx > thres[Res]]);
+ idx = (idx >> 1) + absi(q[k]);
+ }
+ } else {
+ for ( ; k < 36; k++ ) {
+ q[k] = (unsigned char) mpc_bits_can_dec(r, & mpc_can_Q9up);
+ if (Res != 9)
+ q[k] = (q[k] << (Res - 9)) | mpc_bits_read(r, Res - 9);
+ q[k] -= Dc[Res];
+ }
+ }
}
- }
- }
- // until here we jumped to desired position -SEEK_PRE_DECODE frames
-
- // now we decode the last SEEK_PRE_DECODE frames until we reach the seek
- // position. this is neccessary as mpc uses entropy coding in time domain
- for (;d->DecodedFrames < seekFrame; d->DecodedFrames++)
- {
- mpc_uint32_t FrameBitCnt;
-
- d->FwdJumpInfo = mpc_decoder_bitstream_read(d, 20); // read jump-info
- d->ActDecodePos = (d->Zaehler << 5) + d->pos;
- FrameBitCnt = mpc_decoder_bits_read(d);
- // scanning the scalefactors (and check for validity of frame)
- if (d->StreamVersion >= 7)
- {
- mpc_decoder_read_bitstream_sv7(d, (d->DecodedFrames < seekFrame - 1));
- }
- else
- {
-#ifdef MPC_SUPPORT_SV456
- mpc_decoder_read_bitstream_sv6(d);
-#else
- return FALSE;
-#endif
- }
- FrameBitCnt = mpc_decoder_bits_read(d) - FrameBitCnt;
-
- if (d->FwdJumpInfo > FrameBitCnt)
- mpc_decoder_seek_forward(d, d->FwdJumpInfo - FrameBitCnt);
- else if (FrameBitCnt != d->FwdJumpInfo )
- // Bug in perform_jump;
- return FALSE;
-
- // update seek table, if there new entries to fill
- d->SeekTableCounter += d->FwdJumpInfo + 20;
- if (0 == ((d->DecodedFrames+1) & (d->SeekTable_Mask)))
- {
- d->SeekTable[(d->DecodedFrames+1)>>d->SeekTable_Step] = d->SeekTableCounter;
- d->MaxDecodedFrames = d->DecodedFrames;
- d->SeekTableCounter = 0;
- }
-
- // update buffer
- mpc_decoder_update_buffer(d);
-
- if (d->DecodedFrames == seekFrame - 1)
- {
- // initialize the synth correctly for perfect decoding
- mpc_decoder_requantisierung(d, d->Max_Band);
- mpc_decoder_synthese_filter_float(d, NULL);
- }
+ Res = d->Res_R[n];
+ } while (q == d->Q[n].L && (q = d->Q[n].R));
}
-
- return TRUE;
-}
-
-
-void mpc_decoder_fill_buffer(mpc_decoder *d) {
-
- f_read_dword(d, d->Speicher, MEMSIZE);
- d->dword = SWAP(d->Speicher[d->Zaehler = 0]);
- d->next = SWAP(d->Speicher[1]);
- d->Ring = 0;
-
-}
-
-
-void mpc_decoder_update_buffer(mpc_decoder *d)
-{
- if ((d->Ring ^ d->Zaehler) & MEMSIZE2) {
- // update buffer
- f_read_dword(d, d->Speicher + (d->Ring & MEMSIZE2), MEMSIZE2);
- d->Ring = d->Zaehler;
- }
-}
-
-
-void mpc_decoder_seek_to(mpc_decoder *d, mpc_uint32_t bitPos) {
-
- // required dword
- mpc_uint32_t fpos = (bitPos >> 5);
- mpc_uint32_t bufferStart = d->WordsRead - d->Zaehler;
- if ((d->Zaehler & MEMSIZE2) != FALSE)
- bufferStart += MEMSIZE2;
-
- if (fpos >= bufferStart && fpos < bufferStart + MEMSIZE) {
-
- // required position is within the buffer, no need to seek
- d->Zaehler = (fpos - bufferStart + ((d->Zaehler & MEMSIZE2) != FALSE ? MEMSIZE2 : 0)) & MEMMASK;
- d->pos = bitPos & 31;
- d->WordsRead = fpos;
- d->dword = SWAP(d->Speicher[d->Zaehler]);
- d->next = SWAP(d->Speicher[(d->Zaehler + 1) & MEMMASK]);
-
- mpc_decoder_update_buffer(d);
-
-
- } else {
-
- // DWORD aligned
- f_seek(d, fpos*4 + d->MPCHeaderPos);
- d->Zaehler = 0;
- d->pos = bitPos & 31;
- d->WordsRead = fpos;
-
- mpc_decoder_fill_buffer(d);
-
- }
-
-}
-
-void mpc_decoder_seek_forward(mpc_decoder *d, mpc_uint32_t bits) {
-
- bits += d->pos;
- d->pos = bits & 31;
- bits = bits >> 5; // to DWORDs
- d->Zaehler = (d->Zaehler + bits) & MEMMASK;
- d->dword = SWAP(d->Speicher[d->Zaehler]);
- d->next = SWAP(d->Speicher[(d->Zaehler + 1) & MEMMASK]);
- d->WordsRead += bits;
-
}