1
0
Fork 0
forked from len0rd/rockbox

FS#11920: Do not overwrite already existing metadata and take into account string termination. This can save several bytes of the metadata buffer when tags have multiple entries (e.g. multiple gerne tags)

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@29349 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Andree Buschmann 2011-02-20 16:12:05 +00:00
parent 85e40257dc
commit a7e25a01ba
4 changed files with 24 additions and 11 deletions

View file

@ -358,8 +358,7 @@ static int parseuser( struct mp3entry* entry, char* tag, int bufferpos )
if ((tag - entry->id3v2buf + desc_len + 2) < bufferpos) { if ((tag - entry->id3v2buf + desc_len + 2) < bufferpos) {
/* At least part of the value was read, so we can safely try to /* At least part of the value was read, so we can safely try to
* parse it * parse it */
*/
value = tag + desc_len + 1; value = tag + desc_len + 1;
value_len = bufferpos - (tag - entry->id3v2buf); value_len = bufferpos - (tag - entry->id3v2buf);
@ -368,8 +367,7 @@ static int parseuser( struct mp3entry* entry, char* tag, int bufferpos )
entry->albumartist = tag; entry->albumartist = tag;
#if CONFIG_CODEC == SWCODEC #if CONFIG_CODEC == SWCODEC
} else { } else {
value_len = parse_replaygain(tag, value, entry, tag, value_len = parse_replaygain(tag, value, entry, tag, value_len);
value_len);
#endif #endif
} }
} }
@ -1040,6 +1038,12 @@ void setid3v2title(int fd, struct mp3entry *entry)
#endif #endif
if( tr->ppFunc ) if( tr->ppFunc )
bufferpos = tr->ppFunc(entry, tag, bufferpos); 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 */ /* Seek to the next frame */
if(framelen < totframelen) if(framelen < totframelen)

View file

@ -337,7 +337,10 @@ long parse_tag(const char* name, char* value, struct mp3entry* id3,
p = NULL; 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 = strlen(value);
len = MIN(len, buf_remaining - 1); len = MIN(len, buf_remaining - 1);

View file

@ -117,11 +117,17 @@ static unsigned int read_mp4_tag_string(int fd, int size_left, char** buffer,
if (bytes_read) if (bytes_read)
{ {
(*buffer)[bytes_read] = 0; /* Do not overwrite already available metadata. Especially when reading
*dest = *buffer; * tags with e.g. multiple genres / artists. This way only the first
length = strlen(*buffer) + 1; * of multiple entries is used, all following are dropped. */
*buffer_left -= length; if (*dest == NULL)
*buffer += length; {
(*buffer)[bytes_read] = 0;
*dest = *buffer;
length = strlen(*buffer) + 1;
*buffer_left -= length;
*buffer += length;
}
} }
else else
{ {

View file

@ -217,7 +217,7 @@ superdom.c
#ifdef HAVE_TEST_PLUGINS /* enable in advanced build options */ #if 1//def HAVE_TEST_PLUGINS /* enable in advanced build options */
#ifdef HAVE_ADJUSTABLE_CPU_FREQ #ifdef HAVE_ADJUSTABLE_CPU_FREQ
test_boost.c test_boost.c
#endif #endif