ref: ffa5069968ddc9c5e85817e819265f0d6f6128eb
parent: 8b79f06f1b08e0a93cdc23f95e84cf272c442567
author: lieff <[email protected]>
date: Sat Jan 25 18:51:01 EST 2020
Improve tags skip. Also skip every tag type by default.
--- a/minimp3_ex.h
+++ b/minimp3_ex.h
@@ -90,21 +90,30 @@
{
char *buf = (char *)(*pbuf);
size_t buf_size = *pbuf_size;
- if (buf_size > 10 && !strncmp(buf, "ID3", 3))
+#ifndef MINIMP3_NOSKIP_ID3V2
+ if (buf_size > 10 && !memcmp(buf, "ID3", 3) && !((buf[5] & 15) || (buf[6] & 0x80) || (buf[7] & 0x80) || (buf[8] & 0x80) || (buf[9] & 0x80)))
{
- size_t id3v2size = (((buf[6] & 0x7f) << 21) | ((buf[7] & 0x7f) << 14) |
- ((buf[8] & 0x7f) << 7) | (buf[9] & 0x7f)) + 10;
+ size_t id3v2size = (((buf[6] & 0x7f) << 21) | ((buf[7] & 0x7f) << 14) | ((buf[8] & 0x7f) << 7) | (buf[9] & 0x7f)) + 10;
+ if ((buf[5] & 16))
+ id3v2size += 10; /* footer */
if (id3v2size >= buf_size)
id3v2size = buf_size;
buf += id3v2size;
buf_size -= id3v2size;
}
-#ifdef MINIMP3_SKIP_ID3V1
- if (buf_size > 128 && !strncmp(buf + buf_size - 128, "TAG", 3))
+#endif
+#ifndef MINIMP3_NOSKIP_ID3V1
+ if (buf_size > 128 && !memcmp(buf + buf_size - 128, "TAG", 3))
{
buf_size -= 128;
- if (buf_size > 227 && !strncmp(buf + buf_size - 227, "TAG+", 4))
+ if (buf_size > 227 && !memcmp(buf + buf_size - 227, "TAG+", 4))
buf_size -= 227;
+ }
+#endif
+#ifndef MINIMP3_NOSKIP_APEV2
+ if (buf_size > 32 && !memcmp(buf + buf_size - 32, "APETAGEX", 8))
+ {
+ buf_size -= 32;
}
#endif
*pbuf = (const uint8_t *)buf;
--- a/minimp3_test.c
+++ b/minimp3_test.c
@@ -3,7 +3,6 @@
/*#define MINIMP3_NONSTANDARD_BUT_LOGICAL*/
#define MINIMP3_IMPLEMENTATION
#define MINIMP3_ALLOW_MONO_STEREO_TRANSITION
-#define MINIMP3_SKIP_ID3V1
#include "minimp3_ex.h"
#include <stdio.h>
#include <math.h>