forked from len0rd/rockbox
Revert "FS#13299: Simplify VBR frame parsing in the metadata decoder."
This reverts commit 756c0d2ac8
.
Change-Id: I5f98972f69e7645239fd9218c9d4eeb9bd2ec7a5
This commit is contained in:
parent
7aade87863
commit
fa9ddd5af9
1 changed files with 37 additions and 18 deletions
|
@ -212,18 +212,27 @@ static bool headers_have_same_type(unsigned long header1,
|
||||||
return header1 ? (header1 == header2) : true;
|
return header1 ? (header1 == header2) : true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Helper function to read 4-byte in big endian format. */
|
||||||
|
static void read_uint32be_mp3data(int fd, unsigned long *data)
|
||||||
|
{
|
||||||
|
#ifdef ROCKBOX_BIG_ENDIAN
|
||||||
|
(void)read(fd, (char*)data, 4);
|
||||||
|
#else
|
||||||
|
(void)read(fd, (char*)data, 4);
|
||||||
|
*data = betoh32(*data);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
static unsigned long __find_next_frame(int fd, long *offset, long max_offset,
|
static unsigned long __find_next_frame(int fd, long *offset, long max_offset,
|
||||||
unsigned long reference_header,
|
unsigned long reference_header,
|
||||||
int(*getfunc)(int fd, unsigned char *c),
|
int(*getfunc)(int fd, unsigned char *c),
|
||||||
bool single_header)
|
bool single_header)
|
||||||
{
|
{
|
||||||
uint32_t header=0;
|
unsigned long header=0;
|
||||||
uint32_t ref_header=0;
|
|
||||||
long ref_header_pos=0;
|
|
||||||
unsigned char tmp;
|
unsigned char tmp;
|
||||||
long pos = 0;
|
long pos = 0;
|
||||||
|
|
||||||
/* We will search until we find two consecutive MPEG frame headers with
|
/* We will search until we find two consecutive MPEG frame headers with
|
||||||
* the same MPEG version, layer and sampling frequency. The first header
|
* the same MPEG version, layer and sampling frequency. The first header
|
||||||
* of this pair is assumed to be the first valid MPEG frame header of the
|
* of this pair is assumed to be the first valid MPEG frame header of the
|
||||||
* whole stream. */
|
* whole stream. */
|
||||||
|
@ -234,33 +243,43 @@ static unsigned long __find_next_frame(int fd, long *offset, long max_offset,
|
||||||
return 0;
|
return 0;
|
||||||
header |= tmp;
|
header |= tmp;
|
||||||
pos++;
|
pos++;
|
||||||
|
|
||||||
/* Abort if max_offset is reached. Stop parsing. */
|
/* Abort if max_offset is reached. Stop parsing. */
|
||||||
if (max_offset > 0 && pos > max_offset)
|
if (max_offset > 0 && pos > max_offset)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (is_mp3frameheader(header)) {
|
if (is_mp3frameheader(header)) {
|
||||||
if (single_header) {
|
if (single_header) {
|
||||||
/* We search for one _single_ valid header that has the same
|
/* We search for one _single_ valid header that has the same
|
||||||
* type as the reference_header (if reference_header != 0).
|
* type as the reference_header (if reference_header != 0).
|
||||||
* In this case we are finished. */
|
* In this case we are finished. */
|
||||||
if (headers_have_same_type(reference_header, header))
|
if (headers_have_same_type(reference_header, header))
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
/* The current header is valid. Compare it against the last
|
/* The current header is valid. Now gather the frame size,
|
||||||
one we found. NOTE: ref_header MUST come second! */
|
* seek to this byte position and check if there is another
|
||||||
if (headers_have_same_type(header, ref_header)) {
|
* valid MPEG frame header of the same type. */
|
||||||
/* Found a match, return the header and offset of the FIRST */
|
struct mp3info info;
|
||||||
header = ref_header;
|
|
||||||
lseek(fd, ref_header_pos, SEEK_SET);
|
/* Gather frame size from given header and seek to next
|
||||||
|
* frame header. */
|
||||||
|
mp3headerinfo(&info, header);
|
||||||
|
lseek(fd, info.frame_size-4, SEEK_CUR);
|
||||||
|
|
||||||
|
/* Read possible next frame header and seek back to last frame
|
||||||
|
* headers byte position. */
|
||||||
|
reference_header = 0;
|
||||||
|
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. */
|
||||||
|
if (headers_have_same_type(header, reference_header))
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
/* Otherwise look for another.. */
|
|
||||||
ref_header = header;
|
|
||||||
ref_header_pos = lseek(fd, 0, SEEK_CUR);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} while (true);
|
} while (true);
|
||||||
|
|
||||||
*offset = pos - 4;
|
*offset = pos - 4;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue