📄 mpc_dec.cpp
字号:
{ idx = Huffman_Decode_fast(Table); *L++ = idx50[idx]; *L++ = idx51[idx]; } break; case 3: case 4: Table = HuffQ[Bitstream_read(1)][*ResL]; for (k=0; k<36; ++k) *L++ = Huffman_Decode_faster(Table); break; case 5: Table = HuffQ[Bitstream_read(1)][*ResL]; for (k=0; k<36; ++k) *L++ = Huffman_Decode_fast(Table); break; case 6: case 7: Table = HuffQ[Bitstream_read(1)][*ResL]; for (k=0; k<36; ++k) *L++ = Huffman_Decode(Table); 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) *L++ = (mpc_int32_t)Bitstream_read(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: R += 36; break; case -1: for (k=0; k<36; k++ ) { tmp = random_int (); *R++ = ((tmp >> 24) & 0xFF) + ((tmp >> 16) & 0xFF) + ((tmp >> 8) & 0xFF) + ((tmp >> 0) & 0xFF) - 510; } break; case 0: R += 36;// increase pointer break; case 1: Table = HuffQ[Bitstream_read(1)][1]; for (k=0; k<12; ++k) { idx = Huffman_Decode_fast(Table); *R++ = idx30[idx]; *R++ = idx31[idx]; *R++ = idx32[idx]; } break; case 2: Table = HuffQ[Bitstream_read(1)][2]; for (k=0; k<18; ++k) { idx = Huffman_Decode_fast(Table); *R++ = idx50[idx]; *R++ = idx51[idx]; } break; case 3: case 4: Table = HuffQ[Bitstream_read(1)][*ResR]; for (k=0; k<36; ++k) *R++ = Huffman_Decode_faster(Table); break; case 5: Table = HuffQ[Bitstream_read(1)][*ResR]; for (k=0; k<36; ++k) *R++ = Huffman_Decode_fast(Table); break; case 6: case 7: Table = HuffQ[Bitstream_read(1)][*ResR]; for (k=0; k<36; ++k) *R++ = Huffman_Decode(Table); 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) *R++ = (mpc_int32_t)Bitstream_read(Res_bit[*ResR]) - tmp; break; default: return; } }}MPC_decoder::~MPC_decoder (){ if (SeekTable) free ( SeekTable );
}MPC_decoder::MPC_decoder ( MPC_reader *r, double scale_factor ){ m_reader = r; HuffQ[0][0] = 0; HuffQ[1][0] = 0; HuffQ[0][1] = HuffQ1[0]; HuffQ[1][1] = HuffQ1[1]; HuffQ[0][2] = HuffQ2[0]; HuffQ[1][2] = HuffQ2[1]; HuffQ[0][3] = HuffQ3[0]; HuffQ[1][3] = HuffQ3[1]; HuffQ[0][4] = HuffQ4[0]; HuffQ[1][4] = HuffQ4[1]; HuffQ[0][5] = HuffQ5[0]; HuffQ[1][5] = HuffQ5[1]; HuffQ[0][6] = HuffQ6[0]; HuffQ[1][6] = HuffQ6[1]; HuffQ[0][7] = HuffQ7[0]; HuffQ[1][7] = HuffQ7[1]; SampleHuff[0] = NULL; SampleHuff[1] = Entropie_1; SampleHuff[2] = Entropie_2; SampleHuff[3] = Entropie_3; SampleHuff[4] = Entropie_4; SampleHuff[5] = Entropie_5; SampleHuff[6] = Entropie_6; SampleHuff[7] = Entropie_7; SampleHuff[8] = NULL; SampleHuff[9] = NULL; SampleHuff[10] = NULL; SampleHuff[11] = NULL; SampleHuff[12] = NULL; SampleHuff[13] = NULL; SampleHuff[14] = NULL; SampleHuff[15] = NULL; SampleHuff[16] = NULL; SampleHuff[17] = NULL; SeekTable = NULL;
EQ_activated = 0; MPCHeaderPos = 0; StreamVersion = 0; MS_used = 0; FwdJumpInfo = 0; ActDecodePos = 0; FrameWasValid = 0; OverallFrames = 0; DecodedFrames = 0; LastValidSamples = 0; TrueGaplessPresent = 0; WordsRead = 0; Max_Band = 0; SampleRate = 0;// clips = 0; __r1 = 1; __r2 = 1; dword = 0; pos = 0; Zaehler = 0; WordsRead = 0; Max_Band = 0; initialisiere_Quantisierungstabellen (scale_factor); Huffman_SV6_Decoder (); Huffman_SV7_Decoder ();}void MPC_decoder::SetStreamInfo ( const StreamInfo *si ){ RESET_Synthesis (); RESET_Globals (); StreamVersion = si->simple.StreamVersion; MS_used = si->simple.MS; Max_Band = si->simple.MaxBand; OverallFrames = si->simple.Frames; MPCHeaderPos = si->simple.HeaderPosition; LastValidSamples = si->simple.LastFrameSamples; TrueGaplessPresent = si->simple.IsTrueGapless; SampleRate = (mpc_int32_t)si->simple.SampleFreq; if ( SeekTable != NULL ) free ( SeekTable );
//SeekTable = (mpc_uint16_t*)calloc ( sizeof(mpc_uint16_t), OverallFrames+64 );
SeekTable = (mpc_uint16_t*)malloc ( sizeof(mpc_uint16_t)*(OverallFrames+64) ); // by picard 01/02/2005
memset(SeekTable,0,sizeof(mpc_uint16_t)*(OverallFrames+64));
samples_to_skip = SynthDelay;}bool MPC_decoder::Initialize(const StreamInfo * info){ SetStreamInfo(info); // AB: setting position to the beginning of the data-bitstream switch ( StreamVersion ) { case 0x04: f_seek ( 4 + MPCHeaderPos ); pos = 16; break; // Geht auch 黚er eine der Helperfunktionen case 0x05: case 0x06: f_seek ( 8 + MPCHeaderPos ); pos = 0; break; case 0x07: case 0x17: /*f_seek ( 24 + MPCHeaderPos );*/ pos = 8; break; default: return false; } // AB: fill buffer and initialize decoder f_read_dword ( Speicher, MEMSIZE ); dword = Speicher [Zaehler = 0]; return true;}//---------------------------------------------------------------// will seek from the beginning of the file to the desired// position in ms (given by seek_needed)//---------------------------------------------------------------voidMPC_decoder::Helper1 ( mpc_uint32_t bitpos ){ f_seek ( (bitpos>>5) * 4 + MPCHeaderPos ); f_read_dword ( Speicher, 2 ); dword = Speicher [ Zaehler = 0]; pos = bitpos & 31;}voidMPC_decoder::Helper2 ( mpc_uint32_t bitpos ){ f_seek ( (bitpos>>5) * 4 + MPCHeaderPos ); f_read_dword ( Speicher, MEMSIZE ); dword = Speicher [ Zaehler = 0]; pos = bitpos & 31;}voidMPC_decoder::Helper3 ( mpc_uint32_t bitpos, mpc_uint32_t* buffoffs ){ pos = bitpos & 31; bitpos >>= 5; if ( (mpc_uint32_t)(bitpos - *buffoffs) >= MEMSIZE-2 ) { *buffoffs = bitpos; f_seek ( bitpos * 4L + MPCHeaderPos ); f_read_dword ( Speicher, MEMSIZE ); } dword = Speicher [ Zaehler = bitpos - *buffoffs ];}static mpc_uint32_t get_initial_fpos(mpc_uint32_t StreamVersion){ mpc_uint32_t fpos = 0; switch ( StreamVersion ) { // setting position to the beginning of the data-bitstream case 0x04: fpos = 48; break; case 0x05: case 0x06: fpos = 64; break; case 0x07: case 0x17: fpos = 200; break; } return fpos;}bool MPC_decoder::SeekSeconds ( double seconds ){ return SeekSample((mpc_int64_t)(seconds * (double)SampleRate + 0.5));}bool MPC_decoder::SeekSample(mpc_int64_t destsample){ mpc_uint32_t fpos; mpc_uint32_t fwd; fwd = (mpc_uint32_t) (destsample / FrameLength); samples_to_skip = SynthDelay + (mpc_uint32_t)(destsample % FrameLength); memset ( Y_L , 0, sizeof Y_L ); memset ( Y_R , 0, sizeof Y_R ); memset ( SCF_Index_L , 0, sizeof SCF_Index_L ); memset ( SCF_Index_R , 0, sizeof SCF_Index_R ); memset ( Res_L , 0, sizeof Res_L ); memset ( Res_R , 0, sizeof Res_R ); memset ( SCFI_L , 0, sizeof SCFI_L ); memset ( SCFI_R , 0, sizeof SCFI_R ); memset ( DSCF_Flag_L , 0, sizeof DSCF_Flag_L ); memset ( DSCF_Flag_R , 0, sizeof DSCF_Flag_R ); memset ( DSCF_Reference_L, 0, sizeof DSCF_Reference_L ); memset ( DSCF_Reference_R, 0, sizeof DSCF_Reference_R ); memset ( Q , 0, sizeof Q ); memset ( MS_Flag , 0, sizeof MS_Flag ); RESET_Synthesis (); // resetting synthesis filter to avoid "clicks" fwd = fwd < OverallFrames ? fwd : OverallFrames; // prevent from desired position out of allowed range DecodedFrames = 0; // reset number of decoded frames fpos = get_initial_fpos(StreamVersion); if (fpos == 0) return false;
{
unsigned long buffoffs = 0x80000000;
for ( ; DecodedFrames + 128 < fwd; DecodedFrames++ ) { // proceed until 32 frames before (!!) desired position (allows to scan the scalefactors)
if ( SeekTable [DecodedFrames] == 0 ) {
Helper3 ( fpos, &buffoffs );
fpos += SeekTable [DecodedFrames] = 20 + Bitstream_read (20); // calculate desired pos (in Bits)
} else {
fpos += SeekTable [DecodedFrames];
}
}
}
Helper2 ( fpos ); for ( ; DecodedFrames < fwd; DecodedFrames++ ) { // read the last 32 frames before the desired position to scan the scalefactors (artifactless jumping) mpc_uint32_t FrameBitCnt; mpc_uint32_t RING; RING = Zaehler; FwdJumpInfo = Bitstream_read (20); // read jump-info SeekTable [DecodedFrames] = 20 + FwdJumpInfo;
ActDecodePos = (Zaehler << 5) + pos; FrameBitCnt = BitsRead (); // scanning the scalefactors and check for validity of frame if (StreamVersion >= 7) Lese_Bitstrom_SV7 (); else Lese_Bitstrom_SV6 (); if ( BitsRead() - FrameBitCnt != FwdJumpInfo ) {// Box ("Bug in perform_jump"); return false; } if ( (RING ^ Zaehler) & MEMSIZE2 ) // update buffer f_read_dword ( Speicher + (RING & MEMSIZE2), MEMSIZE2 ); }// LastBitsRead = BitsRead (); // LastFrame = DecodedFrames; return true;}void MPC_decoder::UpdateBuffer ( mpc_uint32_t RING ){ if ( (RING ^ Zaehler) & MEMSIZE2 ) f_read_dword ( Speicher + (RING & MEMSIZE2), MEMSIZE2 ); // update buffer}static mpc_uint32_t swap32(mpc_uint32_t val){ const unsigned char* src = (const unsigned char*)&val; return (mpc_uint32_t)src[0] | ((mpc_uint32_t)src[1] << 8) | ((mpc_uint32_t)src[2] << 16) | ((mpc_uint32_t)src[3] << 24);}mpc_int32_t MPC_decoder::f_read_dword( mpc_uint32_t * ptr, mpc_uint32_t count){ count = f_read(ptr,count << 2) >> 2;#ifndef MPC_LITTLE_ENDIAN mpc_uint32_t n; for(n=0;n<count;n++) ptr[n] = swap32(ptr[n]);#endif return count;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -