1
0
Fork 0
forked from len0rd/rockbox

Make libmusepack output the last frame in two passes. Reclaim the IRAM taken in the last commit. Please let me know if you can hear any artifacts or get any broken files from this!

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@9825 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Thom Johansen 2006-04-27 23:52:55 +00:00
parent a181a4c1eb
commit 43a105aae3
3 changed files with 21 additions and 14 deletions

View file

@ -67,7 +67,7 @@ typedef struct mpc_decoder_t {
mpc_uint32_t Zaehler; /// actual index within read-buffer
mpc_uint32_t samples_to_skip;
mpc_uint32_t last_block_samples;
mpc_uint32_t FwdJumpInfo;
mpc_uint32_t ActDecodePos;

View file

@ -351,6 +351,21 @@ mpc_decoder_decode_internal(mpc_decoder *d, MPC_SAMPLE_FORMAT *buffer)
mpc_uint32_t FrameBitCnt = 0;
// 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);
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
}
@ -403,17 +418,8 @@ mpc_decoder_decode_internal(mpc_decoder *d, MPC_SAMPLE_FORMAT *buffer)
// additional FilterDecay samples are needed for decay of synthesis filter
if (MPC_DECODER_SYNTH_DELAY + mod_block >= MPC_FRAME_LENGTH) {
if (!d->TrueGaplessPresent) {
mpc_decoder_reset_y(d);
} else {
mpc_decoder_bitstream_read(d, 20);
mpc_decoder_read_bitstream_sv7(d);
mpc_decoder_requantisierung(d, d->Max_Band);
}
mpc_decoder_synthese_filter_float(d, buffer + 2304);
output_frame_length = MPC_FRAME_LENGTH + FilterDecay;
// 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;
@ -1173,6 +1179,7 @@ void mpc_decoder_setup(mpc_decoder *d, mpc_reader *r)
d->OverallFrames = 0;
d->DecodedFrames = 0;
d->TrueGaplessPresent = 0;
d->last_block_samples = 0;
d->WordsRead = 0;
d->Max_Band = 0;
d->SampleRate = 0;

View file

@ -58,7 +58,7 @@ extern "C" {
enum {
MPC_FRAME_LENGTH = (36 * 32), /// samples per mpc frame
MPC_DECODER_BUFFER_LENGTH = 4 * MPC_FRAME_LENGTH /// required buffer size for decoder
MPC_DECODER_BUFFER_LENGTH = 2 * MPC_FRAME_LENGTH /// required buffer size for decoder
};
// error codes