59#ifdef MINIID3_IMPLEMENTATION
68 return ((
uint32_t)(p[0] & 0x7f) << 21)
92static int _id3_is_valid_image(
const uint8_t* p,
size_t len) {
93 if (
len < 4)
return 0;
95 if (p[0] == 0xFF && p[1] == 0xD8 && p[2] == 0xFF)
return 1;
97 if (p[0] == 0x89 && p[1] == 0x50 && p[2] == 0x4E && p[3] == 0x47)
return 1;
109 if (encoding == 0x01 || encoding == 0x02) {
111 while (p + 1 < fend) {
112 if (p[0] == 0 && p[1] == 0) { p += 2;
break; }
117 while (p < fend && *p) p++;
141 if (
hdr[0] !=
'I' ||
hdr[1] !=
'D' ||
hdr[2] !=
'3') {
fclose(
f);
return 0; }
148 if (tag_size == 0) {
fclose(
f);
return 0; }
151 if (!tag) {
fclose(
f);
return 0; }
153 if (
fread(tag, 1, tag_size,
f) != (
size_t)tag_size) {
161 if (ver >= 3 && (
flags & 0x40) && off + 4 <= tag_size) {
165 ext_size = _id3_synchsafe(tag + off);
169 ext_size = _id3_be32(tag + off);
172 if (off > tag_size) {
free(tag);
return 0; }
178 uint32_t fhdr_sz = (ver == 2) ? 6 : 10;
182 while (!found && off + fhdr_sz <= tag_size) {
186 if (fh[0] == 0)
break;
193 fsize = _id3_be24(fh + 3);
194 is_pic = (fh[0]==
'P' && fh[1]==
'I' && fh[2]==
'C');
203 fsize = _id3_synchsafe(fh + 4);
204 if (off + fhdr_sz + fsize > tag_size) {
206 fsize = _id3_be32(fh + 4);
209 fsize = _id3_be32(fh + 4);
211 is_pic = (fh[0]==
'A' && fh[1]==
'P' && fh[2]==
'I' && fh[3]==
'C');
215 if (off + fhdr_sz + fsize > tag_size)
break;
225 if (ver >= 4 && fhdr_sz == 10 && (fh[9] & 0x01)) {
229 if (p >= fend)
break;
254 while (p < fend && *p) p++;
258 if (p >= fend)
break;
262 if (!_id3_skip_desc(encoding, &p, fend))
break;
264 size_t img_len = (
size_t)(fend - p);
267 if (img_len > 0 && _id3_is_valid_image(p, img_len)) {
275 }
else if (img_len > 0) {
279 if (img_len > 2 && _id3_is_valid_image(p + 2, img_len - 2)) {
294 off += fhdr_sz + fsize;
uint64_t size_t
Definition stdint.h:104
uint8_t flags
Definition virtio.h:0
XE_LIB FILE * fopen(const char *name, const char *mode)
Definition stdio.cpp:44
XE_LIB int fclose(FILE *fp)
Definition stdio.cpp:226
XE_LIB size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
Definition stdio.cpp:96
unsigned char * img
Definition main.cpp:64
unsigned int uint32_t
Definition acefiex.h:163
unsigned char uint8_t
Definition acefiex.h:161
#define NULL
Definition actypes.h:561
const char * f
Definition drm_print.h:205
size_t len
Definition initial.c:23
int miniid3_read_album_art(const char *mp3_path, uint8_t **out_buf, size_t *out_len)
NetRingHdr * hdr
Definition netproxy.c:39
#define malloc(s)
Definition quickjs.c:2290
#define free(p)
Definition quickjs.c:2291