| @@ -50,7 +50,7 @@ typedef struct · 49 unmodified lines |
| 50 | mp3dec_t mp3d; | 50 | mp3dec_t mp3d; |
| 51 | mp3dec_map_info_t file; | 51 | mp3dec_map_info_t file; |
| 52 | mp3dec_index_t index; | 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 | mp3dec_frame_info_t info; | 54 | mp3dec_frame_info_t info; |
| 55 | mp3d_sample_t buffer[MINIMP3_MAX_SAMPLES_PER_FRAME]; | 55 | mp3d_sample_t buffer[MINIMP3_MAX_SAMPLES_PER_FRAME]; |
| 56 | #ifndef MINIMP3_NO_STDIO | 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 | progress_cb(user_data, orig_buf_size, orig_buf_size - buf_size, &frame_info); | 274 | progress_cb(user_data, orig_buf_size, orig_buf_size - buf_size, &frame_info); |
| 275 | } | 275 | } |
| 276 | } while (frame_bytes); | 276 | } while (frame_bytes); |
| 277 | if (detected_samples) | 277 | if (detected_samples && info->samples > detected_samples) |
| 278 | info->samples = detected_samples; | 278 | info->samples = detected_samples; /* cut padding */ |
| 279 | /* reallocate to normal buffer size */ | 279 | /* reallocate to normal buffer size */ |
| 280 | if (allocated != info->samples*sizeof(mp3d_sample_t)) | 280 | if (allocated != info->samples*sizeof(mp3d_sample_t)) |
| 281 | info->buffer = (mp3d_sample_t*)realloc(info->buffer, info->samples*sizeof(mp3d_sample_t)); | 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 | if (MP3D_SEEK_TO_BYTE == dec->seek_method) | 419 | if (MP3D_SEEK_TO_BYTE == dec->seek_method) |
| 420 | { | 420 | { |
| 421 | dec->offset = position; | 421 | dec->offset = position; |
| | 422 | dec->cur_sample = 0; |
| 422 | return 0; | 423 | return 0; |
| 423 | } | 424 | } |
| | 425 | dec->cur_sample = position; |
| 424 | position += dec->start_delay; | 426 | position += dec->start_delay; |
| 425 | if (0 == position) | 427 | if (0 == position) |
| 426 | { /* optimize seek to zero, no index needed */ | 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 | size_t samples_requested = samples; | 501 | size_t samples_requested = samples; |
| 500 | mp3dec_frame_info_t frame_info; | 502 | mp3dec_frame_info_t frame_info; |
| 501 | memset(&frame_info, 0, sizeof(frame_info)); | 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 | if (dec->buffer_consumed < dec->buffer_samples) | 506 | if (dec->buffer_consumed < dec->buffer_samples) |
| 503 | { | 507 | { |
| 504 | size_t to_copy = MINIMP3_MIN((size_t)(dec->buffer_samples - dec->buffer_consumed), samples); | 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 | memcpy(buf, dec->buffer + dec->buffer_consumed, to_copy*sizeof(mp3d_sample_t)); | 515 | memcpy(buf, dec->buffer + dec->buffer_consumed, to_copy*sizeof(mp3d_sample_t)); |
| 506 | buf += to_copy; | 516 | buf += to_copy; |
| 507 | dec->buffer_consumed += to_copy; | 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 | while (samples) | 520 | while (samples) |
| 511 | { | 521 | { |
| | 522 | if (dec->detected_samples && dec->cur_sample >= dec->detected_samples) |
| | 523 | break; |
| 512 | const uint8_t *dec_buf = dec->file.buffer + dec->offset; | 524 | const uint8_t *dec_buf = dec->file.buffer + dec->offset; |
| 513 | uint64_t buf_size = end_offset - dec->offset; | 525 | uint64_t buf_size = end_offset - dec->offset; |
| 514 | if (!buf_size) | 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 | dec->to_skip -= skip; | 537 | dec->to_skip -= skip; |
| 526 | } | 538 | } |
| 527 | size_t to_copy = MINIMP3_MIN((size_t)(dec->buffer_samples - dec->buffer_consumed), samples); | 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 | memcpy(buf, dec->buffer + dec->buffer_consumed, to_copy*sizeof(mp3d_sample_t)); | 546 | memcpy(buf, dec->buffer + dec->buffer_consumed, to_copy*sizeof(mp3d_sample_t)); |
| 529 | buf += to_copy; | 547 | buf += to_copy; |
| 530 | dec->buffer_consumed += to_copy; | 548 | dec->buffer_consumed += to_copy; |