summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/codecs/libmusepack/decoder.h2
-rw-r--r--apps/codecs/libmusepack/mpc_decoder.c31
-rw-r--r--apps/codecs/libmusepack/musepack.h2
3 files changed, 21 insertions, 14 deletions
diff --git a/apps/codecs/libmusepack/decoder.h b/apps/codecs/libmusepack/decoder.h
index 759670ee72..708533b09e 100644
--- a/apps/codecs/libmusepack/decoder.h
+++ b/apps/codecs/libmusepack/decoder.h
@@ -67,7 +67,7 @@ typedef struct mpc_decoder_t {
67 mpc_uint32_t Zaehler; /// actual index within read-buffer 67 mpc_uint32_t Zaehler; /// actual index within read-buffer
68 68
69 mpc_uint32_t samples_to_skip; 69 mpc_uint32_t samples_to_skip;
70 70 mpc_uint32_t last_block_samples;
71 mpc_uint32_t FwdJumpInfo; 71 mpc_uint32_t FwdJumpInfo;
72 mpc_uint32_t ActDecodePos; 72 mpc_uint32_t ActDecodePos;
73 73
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)
351 351
352 mpc_uint32_t FrameBitCnt = 0; 352 mpc_uint32_t FrameBitCnt = 0;
353 353
354 // output the last part of the last frame here, if needed
355 if (d->last_block_samples > 0) {
356 output_frame_length = d->last_block_samples;
357 d->last_block_samples = 0; // it's going to be handled now, so reset it
358 if (!d->TrueGaplessPresent) {
359 mpc_decoder_reset_y(d);
360 } else {
361 mpc_decoder_bitstream_read(d, 20);
362 mpc_decoder_read_bitstream_sv7(d);
363 mpc_decoder_requantisierung(d, d->Max_Band);
364 }
365 mpc_decoder_synthese_filter_float(d, buffer);
366 return output_frame_length;
367 }
368
354 if (d->DecodedFrames >= d->OverallFrames) { 369 if (d->DecodedFrames >= d->OverallFrames) {
355 return (mpc_uint32_t)(-1); // end of file -> abort decoding 370 return (mpc_uint32_t)(-1); // end of file -> abort decoding
356 } 371 }
@@ -403,19 +418,10 @@ mpc_decoder_decode_internal(mpc_decoder *d, MPC_SAMPLE_FORMAT *buffer)
403 418
404 // additional FilterDecay samples are needed for decay of synthesis filter 419 // additional FilterDecay samples are needed for decay of synthesis filter
405 if (MPC_DECODER_SYNTH_DELAY + mod_block >= MPC_FRAME_LENGTH) { 420 if (MPC_DECODER_SYNTH_DELAY + mod_block >= MPC_FRAME_LENGTH) {
406 if (!d->TrueGaplessPresent) { 421 // this variable will be checked for at the top of the function
407 mpc_decoder_reset_y(d); 422 d->last_block_samples = FilterDecay;
408 } else {
409 mpc_decoder_bitstream_read(d, 20);
410 mpc_decoder_read_bitstream_sv7(d);
411 mpc_decoder_requantisierung(d, d->Max_Band);
412 }
413
414 mpc_decoder_synthese_filter_float(d, buffer + 2304);
415
416 output_frame_length = MPC_FRAME_LENGTH + FilterDecay;
417 } 423 }
418 else { // there are only FilterDecay samples needed for this frame 424 else { // there are only FilterDecay samples needed for this frame
419 output_frame_length = FilterDecay; 425 output_frame_length = FilterDecay;
420 } 426 }
421 } 427 }
@@ -1173,6 +1179,7 @@ void mpc_decoder_setup(mpc_decoder *d, mpc_reader *r)
1173 d->OverallFrames = 0; 1179 d->OverallFrames = 0;
1174 d->DecodedFrames = 0; 1180 d->DecodedFrames = 0;
1175 d->TrueGaplessPresent = 0; 1181 d->TrueGaplessPresent = 0;
1182 d->last_block_samples = 0;
1176 d->WordsRead = 0; 1183 d->WordsRead = 0;
1177 d->Max_Band = 0; 1184 d->Max_Band = 0;
1178 d->SampleRate = 0; 1185 d->SampleRate = 0;
diff --git a/apps/codecs/libmusepack/musepack.h b/apps/codecs/libmusepack/musepack.h
index d631c6d05d..9155f3f74d 100644
--- a/apps/codecs/libmusepack/musepack.h
+++ b/apps/codecs/libmusepack/musepack.h
@@ -58,7 +58,7 @@ extern "C" {
58 58
59enum { 59enum {
60 MPC_FRAME_LENGTH = (36 * 32), /// samples per mpc frame 60 MPC_FRAME_LENGTH = (36 * 32), /// samples per mpc frame
61 MPC_DECODER_BUFFER_LENGTH = 4 * MPC_FRAME_LENGTH /// required buffer size for decoder 61 MPC_DECODER_BUFFER_LENGTH = 2 * MPC_FRAME_LENGTH /// required buffer size for decoder
62}; 62};
63 63
64// error codes 64// error codes