ref: cc6d6c05600bd7bdb0f9218433a4c8d710112ee3
parent: 78184ecef579fafd9fe2a6c13cf1c40063ba5ab0
author: lieff <lieff@users.noreply.github.com>
date: Tue Feb 4 07:42:15 EST 2020
mp3dec_ex: proper support free format + cuted mp3
--- a/minimp3_ex.h
+++ b/minimp3_ex.h
@@ -61,7 +61,7 @@
int buffer_samples, buffer_consumed, to_skip;
} mp3dec_ex_t;
-typedef int (*MP3D_ITERATE_CB)(void *user_data, const uint8_t *frame, int frame_size, int free_format_bytes, size_t offset, mp3dec_frame_info_t *info);
+typedef int (*MP3D_ITERATE_CB)(void *user_data, const uint8_t *frame, int frame_size, int free_format_bytes, size_t buf_size, size_t offset, mp3dec_frame_info_t *info);
typedef int (*MP3D_PROGRESS_CB)(void *user_data, size_t file_size, size_t offset, mp3dec_frame_info_t *info);
#ifdef __cplusplus
@@ -229,7 +229,7 @@
frames++;
if (callback)
{
- if (callback(user_data, hdr, frame_size, free_format_bytes, hdr - orig_buf, &frame_info))
+ if (callback(user_data, hdr, frame_size, free_format_bytes, buf_size, hdr - orig_buf, &frame_info))
break;
}
buf += frame_size;
@@ -238,7 +238,7 @@
return frames;
}
-static int mp3dec_load_index(void *user_data, const uint8_t *frame, int frame_size, int free_format_bytes, size_t offset, mp3dec_frame_info_t *info)
+static int mp3dec_load_index(void *user_data, const uint8_t *frame, int frame_size, int free_format_bytes, size_t buf_size, size_t offset, mp3dec_frame_info_t *info)
{
static const char g_xing_tag[4] = { 'X', 'i', 'n', 'g' };
static const char g_info_tag[4] = { 'I', 'n', 'f', 'o' };
@@ -280,7 +280,7 @@
if (!dec->buffer_samples && dec->index.num_frames < 256)
{ /* for some cutted mp3 frames, bit-reservoir not filled and decoding can't be started from first frames */
/* try to decode up to 255 first frames till samples starts to decode */
- dec->buffer_samples = mp3dec_decode_frame(&dec->mp3d, frame, frame_size, dec->buffer, info);
+ dec->buffer_samples = mp3dec_decode_frame(&dec->mp3d, frame, buf_size, dec->buffer, info);
dec->samples += dec->buffer_samples*info->channels;
} else
dec->samples += hdr_frame_samples(frame)*info->channels;
@@ -370,7 +370,7 @@
while (i && to_fill_bytes)
{ /* make sure bit-reservoir is filled when we start decoding */
const uint8_t *hdr = dec->file.buffer + dec->index.frames[i - 1].offset;
- int frame_size = hdr_frame_bytes(hdr, dec->free_format_bytes) + hdr_padding(hdr);
+ int frame_size = hdr_frame_bytes(hdr, dec->free_format_bytes) + hdr_padding(hdr) - HDR_SIZE; /* TODO: take sideinfo into account */
to_fill_bytes -= MINIMP3_MIN(to_fill_bytes, frame_size);
i--;
}
--- a/minimp3_test.c
+++ b/minimp3_test.c
@@ -71,8 +71,9 @@
size_t allocated;
} frames_iterate_data;
-static int frames_iterate_cb(void *user_data, const uint8_t *frame, int frame_size, int free_format_bytes, size_t offset, mp3dec_frame_info_t *info)
+static int frames_iterate_cb(void *user_data, const uint8_t *frame, int frame_size, int free_format_bytes, size_t buf_size, size_t offset, mp3dec_frame_info_t *info)
{
+ (void)buf_size;
(void)offset;
(void)free_format_bytes;
frames_iterate_data *d = user_data;