1
0
Fork 0
forked from len0rd/rockbox

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

@ -260,26 +260,29 @@ static unsigned long __find_next_frame(int fd, long *offset, long max_offset,
* seek to this byte position and check if there is another * seek to this byte position and check if there is another
* valid MPEG frame header of the same type. */ * valid MPEG frame header of the same type. */
struct mp3info info; struct mp3info info;
/* 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
* header we are finished. Rewind to frame data start. */
/* If the current header is of the same type as the previous if (headers_have_same_type(header, reference_header)) {
* header we are finished. */ lseek(fd, -info.frame_size, SEEK_CUR);
if (headers_have_same_type(header, reference_header))
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);
*offset = pos - 4; *offset = pos - 4;
@ -511,8 +514,8 @@ 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;