FS#13299: Handle MP3 files with more than 128K of headers before audio data

Encountered a file with ~600K of ID3v1 headers.

Optimize the potential overhead by minimizing reverse seeks.

Change-Id: I972dbf1af1c36659f19c7ab4eed0b9149c642880
This commit is contained in:
Solomon Peachy 2021-06-16 17:28:55 -04:00
parent fa9ddd5af9
commit 2ed4bf8a43

View file

@ -263,21 +263,24 @@ static unsigned long __find_next_frame(int fd, long *offset, long max_offset,
/* Gather frame size from given header and seek to next /* Gather frame size from given header and seek to next
* frame header. */ * frame header. */
mp3headerinfo(&info, header); if (!mp3headerinfo(&info, header)) continue;
lseek(fd, info.frame_size-4, SEEK_CUR); lseek(fd, info.frame_size-4, SEEK_CUR);
/* Read possible next frame header and seek back to last frame /* Read possible next frame header and seek back to last frame
* headers byte position. */ * headers byte position. */
reference_header = 0; reference_header = 0;
read_uint32be_mp3data(fd, &reference_header); read_uint32be_mp3data(fd, &reference_header);
//
lseek(fd, -info.frame_size, SEEK_CUR);
/* If the current header is of the same type as the previous /* If the current header is of the same type as the previous
* header we are finished. */ * header we are finished. Rewind to frame data start. */
if (headers_have_same_type(header, reference_header)) if (headers_have_same_type(header, reference_header)) {
lseek(fd, -info.frame_size, SEEK_CUR);
break; break;
} }
/* Otherwise keep going. Rewind to to start of "next" frame. */
lseek(fd, -4, SEEK_CUR);
pos += info.frame_size - 4;
}
} }
} while (true); } while (true);
@ -512,7 +515,7 @@ static int get_next_header_info(int fd, long *bytecount, struct mp3info *info,
long tmp; long tmp;
unsigned long header = 0; unsigned long header = 0;
header = __find_next_frame(fd, &tmp, 0x20000, 0, fileread, single_header); header = __find_next_frame(fd, &tmp, 0x100000, 0, fileread, single_header);
if(header == 0) if(header == 0)
return -1; return -1;