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:
parent
fa9ddd5af9
commit
2ed4bf8a43
1 changed files with 15 additions and 12 deletions
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue