summaryrefslogtreecommitdiffstats
path: root/apps/codecs/libmusepack/mpc_decoder.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/codecs/libmusepack/mpc_decoder.c')
-rw-r--r--apps/codecs/libmusepack/mpc_decoder.c31
1 files changed, 19 insertions, 12 deletions
diff --git a/apps/codecs/libmusepack/mpc_decoder.c b/apps/codecs/libmusepack/mpc_decoder.c
index 1291055327..ee98722a05 100644
--- a/apps/codecs/libmusepack/mpc_decoder.c
+++ b/apps/codecs/libmusepack/mpc_decoder.c
@@ -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,19 +418,10 @@ 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
+ 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;