| @@ -50,7 +50,7 @@ typedef struct · 49 unmodified lines |
| 50 | 50 | mp3dec_t mp3d; |
| 51 | 51 | mp3dec_map_info_t file; |
| 52 | 52 | mp3dec_index_t index; |
| 53 | | − uint64_t offset, samples, detected_samples, start_offset, end_offset; |
| 53 | + uint64_t offset, samples, detected_samples, cur_sample, start_offset, end_offset; |
| 54 | 54 | mp3dec_frame_info_t info; |
| 55 | 55 | mp3d_sample_t buffer[MINIMP3_MAX_SAMPLES_PER_FRAME]; |
| 56 | 56 | #ifndef MINIMP3_NO_STDIO |
| @@ -274,8 +274,8 @@ void mp3dec_load_buf(mp3dec_t *dec, const uint8_t *buf, size_t buf_size, mp3dec_ · 217 unmodified lines |
| 274 | 274 | progress_cb(user_data, orig_buf_size, orig_buf_size - buf_size, &frame_info); |
| 275 | 275 | } |
| 276 | 276 | } while (frame_bytes); |
| 277 | | − if (detected_samples) |
| 278 | | − info->samples = detected_samples; |
| 277 | + if (detected_samples && info->samples > detected_samples) |
| 278 | + info->samples = detected_samples; /* cut padding */ |
| 279 | 279 | /* reallocate to normal buffer size */ |
| 280 | 280 | if (allocated != info->samples*sizeof(mp3d_sample_t)) |
| 281 | 281 | info->buffer = (mp3d_sample_t*)realloc(info->buffer, info->samples*sizeof(mp3d_sample_t)); |
| @@ -419,8 +419,10 @@ int mp3dec_ex_seek(mp3dec_ex_t *dec, uint64_t position) · 137 unmodified lines |
| 419 | 419 | if (MP3D_SEEK_TO_BYTE == dec->seek_method) |
| 420 | 420 | { |
| 421 | 421 | dec->offset = position; |
| 422 | + dec->cur_sample = 0; |
| 422 | 423 | return 0; |
| 423 | 424 | } |
| 425 | + dec->cur_sample = position; |
| 424 | 426 | position += dec->start_delay; |
| 425 | 427 | if (0 == position) |
| 426 | 428 | { /* optimize seek to zero, no index needed */ |
| @@ -499,9 +501,17 @@ size_t mp3dec_ex_read(mp3dec_ex_t *dec, mp3d_sample_t *buf, size_t samples) · 72 unmodified lines |
| 499 | 501 | size_t samples_requested = samples; |
| 500 | 502 | mp3dec_frame_info_t frame_info; |
| 501 | 503 | memset(&frame_info, 0, sizeof(frame_info)); |
| 504 | + if (dec->detected_samples && dec->cur_sample >= dec->detected_samples) |
| 505 | + return 0; /* at end of stream */ |
| 502 | 506 | if (dec->buffer_consumed < dec->buffer_samples) |
| 503 | 507 | { |
| 504 | 508 | size_t to_copy = MINIMP3_MIN((size_t)(dec->buffer_samples - dec->buffer_consumed), samples); |
| 509 | + if (dec->detected_samples) |
| 510 | + { /* count decoded samples to properly cut padding */ |
| 511 | + if (dec->cur_sample + to_copy >= dec->detected_samples) |
| 512 | + to_copy = dec->detected_samples - dec->cur_sample; |
| 513 | + dec->cur_sample += to_copy; |
| 514 | + } |
| 505 | 515 | memcpy(buf, dec->buffer + dec->buffer_consumed, to_copy*sizeof(mp3d_sample_t)); |
| 506 | 516 | buf += to_copy; |
| 507 | 517 | dec->buffer_consumed += to_copy; |
| @@ -509,6 +519,8 @@ size_t mp3dec_ex_read(mp3dec_ex_t *dec, mp3d_sample_t *buf, size_t samples) · 1 unmodified line |
| 509 | 519 | } |
| 510 | 520 | while (samples) |
| 511 | 521 | { |
| 522 | + if (dec->detected_samples && dec->cur_sample >= dec->detected_samples) |
| 523 | + break; |
| 512 | 524 | const uint8_t *dec_buf = dec->file.buffer + dec->offset; |
| 513 | 525 | uint64_t buf_size = end_offset - dec->offset; |
| 514 | 526 | if (!buf_size) |
| @@ -525,6 +537,12 @@ size_t mp3dec_ex_read(mp3dec_ex_t *dec, mp3d_sample_t *buf, size_t samples) · 10 unmodified lines |
| 525 | 537 | dec->to_skip -= skip; |
| 526 | 538 | } |
| 527 | 539 | size_t to_copy = MINIMP3_MIN((size_t)(dec->buffer_samples - dec->buffer_consumed), samples); |
| 540 | + if (dec->detected_samples) |
| 541 | + { /* ^ handle padding */ |
| 542 | + if (dec->cur_sample + to_copy >= dec->detected_samples) |
| 543 | + to_copy = dec->detected_samples - dec->cur_sample; |
| 544 | + dec->cur_sample += to_copy; |
| 545 | + } |
| 528 | 546 | memcpy(buf, dec->buffer + dec->buffer_consumed, to_copy*sizeof(mp3d_sample_t)); |
| 529 | 547 | buf += to_copy; |
| 530 | 548 | dec->buffer_consumed += to_copy; |