Index: apps/codecs/libmusepack/mpc_decoder.c =================================================================== --- apps/codecs/libmusepack/mpc_decoder.c (revision 17584) +++ apps/codecs/libmusepack/mpc_decoder.c (working copy) @@ -393,7 +393,7 @@ mpc_decoder_reset_bitstream_decode(d); d->DecodedFrames = 0; - d->SeekTableIndex = 0; +//AB d->SeekTableIndex = 0; d->MaxDecodedFrames = 0; d->StreamVersion = 0; d->MS_used = 0; @@ -470,7 +470,10 @@ } if (d->DecodedFrames == 0) + { d->SeekTable[0] = mpc_decoder_bits_read(d); + d->SeekTableCounter = 0; //AB + } // read jump-info for validity check of frame d->FwdJumpInfo = mpc_decoder_bitstream_read(d, 20); @@ -499,9 +502,14 @@ d->DecodedFrames++; /* update seek table */ - if (d->SeekTable_Step == 1) { + /* + if (d->SeekTable_Step == 1) + { d->SeekTable [d->DecodedFrames] = d->FwdJumpInfo + 20; - } else { + } + //AB + else + { if ((d->DecodedFrames-1) % d->SeekTable_Step == 0) { d->SeekTable[d->SeekTableIndex] = d->SeekTableCounter; d->SeekTableIndex += 1; @@ -509,6 +517,13 @@ } d->SeekTableCounter += d->FwdJumpInfo + 20; } + */ + d->SeekTableCounter += d->FwdJumpInfo + 20; + if (0 == (d->DecodedFrames % d->SeekTable_Step)) + { + d->SeekTable[d->DecodedFrames/d->SeekTable_Step] = d->SeekTableCounter; + d->SeekTableCounter = 0; + } // synthesize signal mpc_decoder_requantisierung(d, d->Max_Band); @@ -1438,7 +1453,7 @@ d->Max_Band = 0; d->SeekTable = NULL; d->SeekTable_Step = 1; - d->SeekTableIndex = 0; +//AB d->SeekTableIndex = 0; d->SeekTableCounter = 0; mpc_decoder_initialisiere_quantisierungstabellen(d, 1.0f); @@ -1488,10 +1503,12 @@ memset(d->SeekTable, 0, sizeof(Seekbuffer)); + // limit used table size to MPC_SEEK_BUFFER_SIZE seekTableSize = min(si->frames, MPC_SEEK_BUFFER_SIZE); - d->SeekTable_Step = si->frames / seekTableSize; - if (si->frames % seekTableSize) - d->SeekTable_Step+=1; + // frames per buffer to not exceed buffer and to be able to seek full file + d->SeekTable_Step = (si->frames + seekTableSize - 1) / seekTableSize; +//AB if (si->frames % seekTableSize) +//AB d->SeekTable_Step+=1; } mpc_bool_t mpc_decoder_initialize(mpc_decoder *d, mpc_streaminfo *si) @@ -1620,11 +1637,16 @@ d->DecodedFrames = 0; // jump to the last frame, updating seek table - if (d->SeekTable_Step == 1) { + /* + if (d->SeekTable_Step == 1) + { d->SeekTable[0] = (mpc_uint32_t)fpos; for (;d->DecodedFrames < lastFrame; d->DecodedFrames++) d->SeekTable[d->DecodedFrames+1] = mpc_decoder_jump_frame(d); - } else { + } + //AB + else + { d->SeekTableIndex = 0; d->SeekTableCounter = (mpc_uint32_t)fpos; for (;d->DecodedFrames < lastFrame; d->DecodedFrames++) { @@ -1636,24 +1658,55 @@ d->SeekTableCounter += mpc_decoder_jump_frame(d); } } - + */ + d->SeekTable[0] = (mpc_uint32_t)fpos; + d->SeekTableCounter = d->SeekTable[0]; + + for (d->DecodedFrames = 1; d->DecodedFrames < lastFrame; d->DecodedFrames++) + { + d->SeekTableCounter += mpc_decoder_jump_frame(d); + if (0 == (d->DecodedFrames % d->SeekTable_Step)) + { + d->SeekTable[d->DecodedFrames/d->SeekTable_Step] = d->SeekTableCounter; + d->SeekTableCounter = 0; + } + } + + + } else if (delta < 0) { mpc_decoder_reset_state(d); // jumps backwards using the seek table + /* fpos = d->SeekTable[0]; - if (d->SeekTable_Step == 1) { + if (d->SeekTable_Step == 1) + { for (d->DecodedFrames = 0;d->DecodedFrames < lastFrame; d->DecodedFrames++) fpos += d->SeekTable[d->DecodedFrames+1]; - } else { + } + //AB + else + { d->SeekTableIndex = 0; //d->SeekTableCounter = 0; for (d->DecodedFrames = 0;d->DecodedFrames < lastFrame; d->DecodedFrames+=d->SeekTable_Step, d->SeekTableIndex++) fpos += d->SeekTable[d->SeekTableIndex+1]; d->SeekTableCounter = d->SeekTable[d->SeekTableIndex]; } + */ + + fpos = d->SeekTable[0]; + for (d->DecodedFrames = 0; d->DecodedFrames < lastFrame; d->DecodedFrames++) + { + if (0 == (d->DecodedFrames+1) % d->SeekTable_Step) + { + fpos += d->SeekTable[(d->DecodedFrames+1)/d->SeekTable_Step]; + } + } + mpc_decoder_seek_to(d, fpos); } else if (delta > 33) { @@ -1661,13 +1714,19 @@ mpc_decoder_reset_state(d); // jumps forward from the current position - if (d->MaxDecodedFrames > lastFrame) { // REVIEW: Correct?? or (d->MaxDecodedFrames > d->DecodedFrames) + if (d->MaxDecodedFrames > lastFrame) // REVIEW: Correct?? or (d->MaxDecodedFrames > d->DecodedFrames) + { // jump to the last usable position in the seek table - if (d->SeekTable_Step == 1) { + /* + if (d->SeekTable_Step == 1) + { fpos = mpc_decoder_bits_read(d); for (; d->DecodedFrames < d->MaxDecodedFrames && d->DecodedFrames < lastFrame; d->DecodedFrames++) fpos += d->SeekTable[d->DecodedFrames+1]; - } else { + } + //AB + else + { // could test SeekTable offset and jump to next entry but this is easier for now... //d->SeekTableIndex = 0; //d->SeekTableCounter = 0; @@ -1677,13 +1736,27 @@ fpos += d->SeekTable[d->SeekTableIndex+1]; d->SeekTableCounter = d->SeekTable[d->SeekTableIndex]; } + */ + fpos = mpc_decoder_bits_read(d); + for (; d->DecodedFrames < d->MaxDecodedFrames && d->DecodedFrames < lastFrame; d->DecodedFrames++) + { + if (0 == (d->DecodedFrames+1) % d->SeekTable_Step) + { + fpos += d->SeekTable[(d->DecodedFrames+1)/d->SeekTable_Step]; + } + } mpc_decoder_seek_to(d, fpos); } - if (d->SeekTable_Step == 1) { + /* + if (d->SeekTable_Step == 1) + { for (;d->DecodedFrames < lastFrame; d->DecodedFrames++) d->SeekTable[d->DecodedFrames+1] = mpc_decoder_jump_frame(d); - } else { + } + //AB + else + { for (;d->DecodedFrames < lastFrame; d->DecodedFrames++) { if (d->DecodedFrames % d->SeekTable_Step == 0) { d->SeekTable[d->SeekTableIndex] = d->SeekTableCounter; @@ -1693,6 +1766,14 @@ d->SeekTableCounter += mpc_decoder_jump_frame(d); } } + */ + for (;d->DecodedFrames < lastFrame; d->DecodedFrames++) + { + if (0 == (d->DecodedFrames+1) % d->SeekTable_Step) + { + d->SeekTable[(d->DecodedFrames+1)/d->SeekTable_Step] = mpc_decoder_jump_frame(d); + } + } } // REVIEW: Needed? @@ -1726,12 +1807,17 @@ return FALSE; // REVIEW: Only if decodedFrames < maxDecodedFrames?? - if (d->SeekTable_Step == 1) { + /* + if (d->SeekTable_Step == 1) + { // check that the frame length corresponds with any data already in the seek table if (d->SeekTable[d->DecodedFrames+1] != 0 && d->SeekTable[d->DecodedFrames+1] != d->FwdJumpInfo + 20) return FALSE; d->SeekTable [d->DecodedFrames+1] = d->FwdJumpInfo + 20; - } else { + } + //AB + else + { if (d->DecodedFrames % d->SeekTable_Step == 0) { if (d->SeekTable[d->SeekTableIndex] != 0 && d->SeekTable[d->SeekTableIndex] != d->SeekTableCounter) return FALSE; @@ -1741,6 +1827,7 @@ } d->SeekTableCounter += d->FwdJumpInfo + 20; } + */ // update buffer mpc_decoder_update_buffer(d); Index: apps/codecs/libmusepack/decoder.h =================================================================== --- apps/codecs/libmusepack/decoder.h (revision 17584) +++ apps/codecs/libmusepack/decoder.h (working copy) @@ -49,7 +49,7 @@ enum { MPC_V_MEM = 2304, MPC_DECODER_MEMSIZE = 16384, // overall buffer size (words) - MPC_SEEK_BUFFER_SIZE = 65536, // seek buffer size (words) + MPC_SEEK_BUFFER_SIZE = 8192, // seek buffer size (words) }; typedef struct { @@ -79,8 +79,8 @@ mpc_uint32_t DecodedFrames; mpc_uint32_t OverallFrames; mpc_uint32_t MaxDecodedFrames; // Maximum frames decoded (indicates usable seek table entries) - mpc_uint16_t SeekTableIndex; - mpc_uint32_t SeekTableCounter; +//AB mpc_uint16_t SeekTableIndex; +//AB mpc_uint32_t SeekTableCounter; mpc_int32_t SampleRate; // Sample frequency mpc_uint32_t StreamVersion; // version of bitstream @@ -110,6 +110,7 @@ mpc_int8_t SCFI_R [32]; // describes order of transmitted SCF mpc_bool_t MS_Flag[32]; // MS used? + mpc_uint32_t SeekTableCounter; mpc_uint32_t* SeekTable; mpc_uint8_t SeekTable_Step;