diff options
| author | Andree Buschmann <AndreeBuschmann@t-online.de> | 2011-02-15 20:00:28 +0000 |
|---|---|---|
| committer | Andree Buschmann <AndreeBuschmann@t-online.de> | 2011-02-15 20:00:28 +0000 |
| commit | 237ca504e12c06a5cfa7cd0fb9d9c672dc588f1c (patch) | |
| tree | b6454cdfaa01c749e986386f7b3bc9fdc3a5f6c8 /apps/metadata | |
| parent | 258626f4550be2e586c9e5acf20cb71ee001a8e4 (diff) | |
| download | rockbox-237ca504e12c06a5cfa7cd0fb9d9c672dc588f1c.zip rockbox-237ca504e12c06a5cfa7cd0fb9d9c672dc588f1c.tar.gz rockbox-237ca504e12c06a5cfa7cd0fb9d9c672dc588f1c.tar.bz2 rockbox-237ca504e12c06a5cfa7cd0fb9d9c672dc588f1c.tar.xz | |
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
Diffstat (limited to 'apps/metadata')
| -rw-r--r-- | apps/metadata/id3tags.c | 12 | ||||
| -rw-r--r-- | apps/metadata/metadata_common.c | 5 | ||||
| -rw-r--r-- | apps/metadata/mp4.c | 31 |
3 files changed, 26 insertions, 22 deletions
diff --git a/apps/metadata/id3tags.c b/apps/metadata/id3tags.c index 9ee183a..9143f8a 100644 --- a/apps/metadata/id3tags.c +++ b/apps/metadata/id3tags.c @@ -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) diff --git a/apps/metadata/metadata_common.c b/apps/metadata/metadata_common.c index e1ef9a0..4f00177 100644 --- a/apps/metadata/metadata_common.c +++ b/apps/metadata/metadata_common.c @@ -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); diff --git a/apps/metadata/mp4.c b/apps/metadata/mp4.c index 1ef3701..26ab7cc 100644 --- a/apps/metadata/mp4.c +++ b/apps/metadata/mp4.c @@ -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; |