⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mpc_dec.cpp

📁 betaplayer的源码 tcpmp的老版本
💻 CPP
📖 第 1 页 / 共 3 页
字号:
                {                    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 + -