forked from len0rd/rockbox
All AAC-HE files will double the frame sample count, not only AAC-HE files with SBR upsampling. This change fixes issues with some m4a files reported in the forums.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@29310 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
258626f455
commit
237ca504e1
9 changed files with 36 additions and 36 deletions
|
@ -358,8 +358,7 @@ static int parseuser( struct mp3entry* entry, char* tag, int bufferpos )
|
|||
|
||||
if ((tag - entry->id3v2buf + desc_len + 2) < bufferpos) {
|
||||
/* At least part of the value was read, so we can safely try to
|
||||
* parse it
|
||||
*/
|
||||
* parse it */
|
||||
value = tag + desc_len + 1;
|
||||
value_len = bufferpos - (tag - entry->id3v2buf);
|
||||
|
||||
|
@ -368,8 +367,7 @@ static int parseuser( struct mp3entry* entry, char* tag, int bufferpos )
|
|||
entry->albumartist = tag;
|
||||
#if CONFIG_CODEC == SWCODEC
|
||||
} else {
|
||||
value_len = parse_replaygain(tag, value, entry, tag,
|
||||
value_len);
|
||||
value_len = parse_replaygain(tag, value, entry, tag, value_len);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
@ -1040,6 +1038,12 @@ void setid3v2title(int fd, struct mp3entry *entry)
|
|||
#endif
|
||||
if( tr->ppFunc )
|
||||
bufferpos = tr->ppFunc(entry, tag, bufferpos);
|
||||
|
||||
/* Trim. Take into account that multiple string contents will
|
||||
* only be displayed up to their first null termination. All
|
||||
* content after this null termination is obsolete and can be
|
||||
* overwritten. */
|
||||
bufferpos -= (bytesread - strlen(tag));
|
||||
|
||||
/* Seek to the next frame */
|
||||
if(framelen < totframelen)
|
||||
|
|
|
@ -337,7 +337,10 @@ long parse_tag(const char* name, char* value, struct mp3entry* id3,
|
|||
p = NULL;
|
||||
}
|
||||
|
||||
if (p)
|
||||
/* Do not overwrite already available metadata. Especially when reading
|
||||
* tags with e.g. multiple genres / artists. This way only the first
|
||||
* of multiple entries is used, all following are dropped. */
|
||||
if (p!=NULL && *p==NULL)
|
||||
{
|
||||
len = strlen(value);
|
||||
len = MIN(len, buf_remaining - 1);
|
||||
|
|
|
@ -73,9 +73,6 @@
|
|||
#define MP4_udta FOURCC('u', 'd', 't', 'a')
|
||||
#define MP4_extra FOURCC('-', '-', '-', '-')
|
||||
|
||||
/* Used to correct id3->samples, if SBR upsampling was detected in esds atom. */
|
||||
static bool SBR_upsampling_used = false;
|
||||
|
||||
/* Read the tag data from an MP4 file, storing up to buffer_size bytes in
|
||||
* buffer.
|
||||
*/
|
||||
|
@ -120,11 +117,17 @@ static unsigned int read_mp4_tag_string(int fd, int size_left, char** buffer,
|
|||
|
||||
if (bytes_read)
|
||||
{
|
||||
(*buffer)[bytes_read] = 0;
|
||||
*dest = *buffer;
|
||||
length = strlen(*buffer) + 1;
|
||||
*buffer_left -= length;
|
||||
*buffer += length;
|
||||
/* Do not overwrite already available metadata. Especially when reading
|
||||
* tags with e.g. multiple genres / artists. This way only the first
|
||||
* of multiple entries is used, all following are dropped. */
|
||||
if (*dest == NULL)
|
||||
{
|
||||
(*buffer)[bytes_read] = 0;
|
||||
*dest = *buffer;
|
||||
length = strlen(*buffer) + 1;
|
||||
*buffer_left -= length;
|
||||
*buffer += length;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -343,11 +346,6 @@ static bool read_mp4_esds(int fd, struct mp3entry* id3, uint32_t* size)
|
|||
* decoding (parts of) the file.
|
||||
*/
|
||||
id3->frequency *= 2;
|
||||
|
||||
/* Set this to true to be able to calculate the correct runtime
|
||||
* and bitrate. */
|
||||
SBR_upsampling_used = true;
|
||||
|
||||
sbr = true;
|
||||
}
|
||||
}
|
||||
|
@ -640,7 +638,7 @@ static bool read_mp4_container(int fd, struct mp3entry* id3,
|
|||
unsigned int i;
|
||||
|
||||
/* Reset to false. */
|
||||
id3->needs_upsampling_correction = true;
|
||||
id3->needs_upsampling_correction = false;
|
||||
|
||||
lseek(fd, 4, SEEK_CUR);
|
||||
read_uint32be(fd, &entries);
|
||||
|
@ -654,12 +652,12 @@ static bool read_mp4_container(int fd, struct mp3entry* id3,
|
|||
read_uint32be(fd, &n);
|
||||
read_uint32be(fd, &l);
|
||||
|
||||
/* Some SBR files use upsampling. In this case the number
|
||||
/* Some AAC file use HE profile. In this case the number
|
||||
* of output samples is doubled to a maximum of 2048
|
||||
* samples per frame. This means that files which already
|
||||
* report a frame size of 2048 in their header will not
|
||||
* need any further special handling. */
|
||||
if (SBR_upsampling_used && l<=1024)
|
||||
if (id3->codectype==AFMT_MP4_AAC_HE && l<=1024)
|
||||
{
|
||||
id3->samples += n * l * 2;
|
||||
id3->needs_upsampling_correction = true;
|
||||
|
@ -774,7 +772,6 @@ static bool read_mp4_container(int fd, struct mp3entry* id3,
|
|||
|
||||
bool get_mp4_metadata(int fd, struct mp3entry* id3)
|
||||
{
|
||||
SBR_upsampling_used = false;
|
||||
id3->codectype = AFMT_UNKNOWN;
|
||||
id3->filesize = 0;
|
||||
errno = 0;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue