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

📄 mpc_decoder.c

📁 这是著名的TCPMP播放器在WINDWOWS,和WINCE下编译通过的源程序.笔者对其中的LIBMAD库做了针对ARM MPU的优化. 并增加了词幕功能.
💻 C
📖 第 1 页 / 共 4 页
字号:
            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];
            for (k=0; k<36; ++k)
                *L++ = mpc_decoder_huffman_decode(d, 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)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:
            R += 36;
            break;
        case -1:
                for (k=0; k<36; k++ ) {
                    tmp  = random_int(d);
                    *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 = d->HuffQ[mpc_decoder_bitstream_read(d, 1)][1];
                for (k=0; k<12; ++k)
                {
                    idx = mpc_decoder_huffman_decode_fast(d, Table);
                    *R++ = idx30[idx];
                    *R++ = idx31[idx];
                    *R++ = idx32[idx];
                }
                break;
            case 2:
                Table = d->HuffQ[mpc_decoder_bitstream_read(d, 1)][2];
                for (k=0; k<18; ++k)
                {
                    idx = mpc_decoder_huffman_decode_fast(d, Table);
                    *R++ = idx50[idx];
                    *R++ = idx51[idx];
                }
                break;
            case 3:
            case 4:
                Table = d->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];
                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];
                for (k=0; k<36; ++k)
                    *R++ = mpc_decoder_huffman_decode(d, 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)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->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;
  d->FwdJumpInfo = 0;
  d->ActDecodePos = 0;
  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;

  d->SeekTable = NULL; // Picard 2005.04.29 
  d->dword = 0;
  d->pos = 0;
  d->Zaehler = 0;
  d->WordsRead = 0;
  d->Max_Band = 0;

  mpc_decoder_initialisiere_quantisierungstabellen(d, 1.0f);
  mpc_decoder_init_huffman_sv6(d);
  mpc_decoder_init_huffman_sv7(d);
}

static void mpc_decoder_set_streaminfo(mpc_decoder *d, mpc_streaminfo *si)
{
    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->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;
}

mpc_bool_t mpc_decoder_initialize(mpc_decoder *d, mpc_streaminfo *si) 
{
    mpc_decoder_set_streaminfo(d, si);

    // AB: setting position to the beginning of the data-bitstream
    switch (d->StreamVersion) {
    case 0x04: f_seek(d, 4 + d->MPCHeaderPos); d->pos = 16; break;  // Geht auch 黚er eine der Helperfunktionen
    case 0x05:
    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;
    }

    // AB: fill buffer and initialize decoder
    f_read_dword(d, d->Speicher, MEMSIZE );
    d->dword = d->Speicher[d->Zaehler = 0];

    return TRUE;
}

//---------------------------------------------------------------
// will seek from the beginning of the file to the desired
// position in ms (given by seek_needed)
//---------------------------------------------------------------
#if 0
static void
helper1(mpc_decoder *d, mpc_uint32_t bitpos) 
{
    f_seek(d, (bitpos >> 5) * 4 + d->MPCHeaderPos);
    f_read_dword(d, d->Speicher, 2);
    d->dword = d->Speicher[d->Zaehler = 0];
    d->pos = bitpos & 31;
}
#endif

static void
helper2(mpc_decoder *d, mpc_uint32_t bitpos) 
{
    f_seek(d, (bitpos>>5) * 4 + d->MPCHeaderPos);
    f_read_dword(d, d->Speicher, MEMSIZE);
    d->dword = d->Speicher[d->Zaehler = 0];
    d->pos = bitpos & 31;
}

static void
helper3(mpc_decoder *d, mpc_uint32_t bitpos, mpc_uint32_t* buffoffs) 
{
    d->pos = bitpos & 31;
    bitpos >>= 5;
    if ((mpc_uint32_t)(bitpos - *buffoffs) >= MEMSIZE - 2) {
        *buffoffs = bitpos;
        f_seek(d, bitpos * 4L + d->MPCHeaderPos);
        f_read_dword(d, d->Speicher, MEMSIZE );
    }
    d->dword = d->Speicher[d->Zaehler = bitpos - *buffoffs ];
}

static mpc_uint32_t get_initial_fpos(mpc_decoder *d, mpc_uint32_t StreamVersion)
{
    mpc_uint32_t fpos = 0;
    switch ( d->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;
}

#if 0 //TCPMP floating point...
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));
}
#endif

mpc_bool_t mpc_decoder_seek_sample(mpc_decoder *d, mpc_int64_t destsample) 
{
    mpc_uint32_t fpos;
    mpc_uint32_t fwd;

    fwd = (mpc_uint32_t) (destsample / MPC_FRAME_LENGTH);
    d->samples_to_skip = MPC_DECODER_SYNTH_DELAY + (mpc_uint32_t)(destsample % MPC_FRAME_LENGTH);

    memset(d->Y_L          , 0, sizeof d->Y_L           );
    memset(d->Y_R          , 0, sizeof d->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           );
    memset(d->DSCF_Flag_L     , 0, sizeof d->DSCF_Flag_L      );
    memset(d->DSCF_Flag_R     , 0, sizeof d->DSCF_Flag_R      );
    memset(d->DSCF_Reference_L, 0, sizeof d->DSCF_Reference_L );
    memset(d->DSCF_Reference_R, 0, sizeof d->DSCF_Reference_R );
    memset(d->Q               , 0, sizeof d->Q                );
    memset(d->MS_Flag         , 0, sizeof d->MS_Flag          );

    // resetting synthesis filter to avoid "clicks"
    mpc_decoder_reset_synthesis(d);

    // prevent from desired position out of allowed range
    fwd = fwd < d->OverallFrames  ?  fwd  :  d->OverallFrames;

    // reset number of decoded frames
    d->DecodedFrames = 0;

    fpos = get_initial_fpos(d, d->StreamVersion);
    if (fpos == 0) {
        return FALSE;
    }

	// Picard 2005.04.29
	if (d->SeekTable)
	{
		unsigned long buffoffs = 0x80000000;
        for (;d->DecodedFrames + 128 < fwd; d->DecodedFrames++) 
		{
            if (d->SeekTable[d->DecodedFrames] == 0) 
			{
                helper3(d, fpos, &buffoffs);
                fpos += d->SeekTable[d->DecodedFrames] = 20 + mpc_decoder_bitstream_read(d,20);
            } 
			else 
                fpos += d->SeekTable[d->DecodedFrames];
        }
    }

    helper2(d, fpos);

    // read the last 32 frames before the desired position to scan the scalefactors (artifactless jumping)
    for ( ; d->DecodedFrames < fwd; d->DecodedFrames++ ) {
        mpc_uint32_t   FrameBitCnt;
        mpc_uint32_t   RING;
        RING         = d->Zaehler;
        d->FwdJumpInfo  = mpc_decoder_bitstream_read(d, 20);    // read jump-info
		if (d->SeekTable)
			d->SeekTable[d->DecodedFrames] = 20 + d->FwdJumpInfo; // Picard 2005.04.29
        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);
        }
        else {
            mpc_decoder_read_bitstream_sv6(d);
        }
        if (mpc_decoder_bits_read(d) - FrameBitCnt != d->FwdJumpInfo ) {
            // Box ("Bug in perform_jump");
            return FALSE;
        }
        // update buffer
        if ((RING ^ d->Zaehler) & MEMSIZE2) {
            f_read_dword(d, d->Speicher + (RING & MEMSIZE2),  MEMSIZE2);
        }
    }

    // LastBitsRead = BitsRead ();
    // LastFrame = d->DecodedFrames;

    return TRUE;
}

void mpc_decoder_update_buffer(mpc_decoder *d, mpc_uint32_t RING) 
{
    if ((RING ^ d->Zaehler) & MEMSIZE2 ) {
        // update buffer
        f_read_dword(d, d->Speicher + (RING & MEMSIZE2), MEMSIZE2);
    }
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -