From aab1ed2d2dfd2785984da2e509f8eb6e773bde5f Mon Sep 17 00:00:00 2001 From: Joshua Ashton Date: Fri, 9 Aug 2024 11:35:33 +0100 Subject: [PATCH] Support for MP3 files < MAX_FRAME_SYNC_MATCHES If we match > 1 frame, and the next frame header is all NULL or a TAG then say that we matched a frame, as we likely reached the end of the file. Fixes: https://github.com/lieff/minimp3/issues/102 --- minimp3.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/minimp3.h b/minimp3.h index 3220ae1..7161ef5 100644 --- a/minimp3.h +++ b/minimp3.h @@ -1654,6 +1654,21 @@ static void mp3d_synth_granule(float *qmf_state, float *grbuf, int nbands, int n } } +static int hdr_is_tag(const uint8_t* hdr) +{ + return hdr[0] == 'T' && hdr[1] == 'A' && hdr[2] == 'G' && hdr[3] == '\0'; +} + +static int hdr_is_null(const uint8_t* hdr) +{ + return hdr[0] == '\0' && hdr[1] == '\0' && hdr[2] == '\0' && hdr[3] == '\0'; +} + +static int hdr_is_null_or_tag(const uint8_t* hdr) +{ + return hdr_is_tag(hdr) > 0 || hdr_is_null(hdr) > 0; +} + static int mp3d_match_frame(const uint8_t *hdr, int mp3_bytes, int frame_bytes) { int i, nmatch; @@ -1662,6 +1677,8 @@ static int mp3d_match_frame(const uint8_t *hdr, int mp3_bytes, int frame_bytes) i += hdr_frame_bytes(hdr + i, frame_bytes) + hdr_padding(hdr + i); if (i + HDR_SIZE > mp3_bytes) return nmatch > 0; + if (hdr_is_null_or_tag(hdr + i)) + return nmatch > 0; if (!hdr_compare(hdr, hdr + i)) return 0; }