diff options
author | Roman Artiukhin <bahusdrive@gmail.com> | 2024-12-13 12:09:20 +0200 |
---|---|---|
committer | Roman Artiukhin <bahusdrive@gmail.com> | 2024-12-13 17:09:29 +0200 |
commit | 11fbbc78262b1ec8498cf11a307a9233274ddcfe (patch) | |
tree | d4876e7fad07193c9c7ee4a3e337ae8ad687a38a | |
parent | 23d185b7fef03f08c0b9d31a883ee1a7c1b40e4f (diff) | |
download | rockbox-11fbbc7826.tar.gz rockbox-11fbbc7826.zip |
metadata: mp3: Reduce size of is_cuesheet function
Saves 80 bytes on Sansa E200V2 (176 -> 96)
Change-Id: I976e47f74641110ef37049101b9eb0db0afe512b
-rw-r--r-- | lib/rbcodec/metadata/id3tags.c | 49 |
1 files changed, 22 insertions, 27 deletions
diff --git a/lib/rbcodec/metadata/id3tags.c b/lib/rbcodec/metadata/id3tags.c index c355da22da..588fdbef56 100644 --- a/lib/rbcodec/metadata/id3tags.c +++ b/lib/rbcodec/metadata/id3tags.c @@ -725,54 +725,49 @@ bool setid3v1title(int fd, struct mp3entry *entry) static bool is_cuesheet(char *tag, unsigned char *char_enc, unsigned char *cuesheet_offset) { - *char_enc = 0; + *char_enc = CHAR_ENC_ISO_8859_1; /* [enc type]+"CUESHEET\0" = 10 */ *cuesheet_offset = 10; - unsigned char utf16 = 0; - - switch (tag[0]) + const char* key = "CUESHEET"; + const int key_size = 8; + // check and skip encoding type + switch (*(tag++)) { - case 0x00: - *char_enc = CHAR_ENC_ISO_8859_1; - break; case 0x01: - if (!memcmp(tag + 1, BOM_UTF_16_BE, BOM_UTF_16_SIZE)) - utf16 = CHAR_ENC_UTF_16_BE; - else if (!memcmp(tag + 1, BOM_UTF_16_LE, BOM_UTF_16_SIZE)) - utf16 = CHAR_ENC_UTF_16_LE; + if (!memcmp(tag, BOM_UTF_16_BE, BOM_UTF_16_SIZE)) + *char_enc = CHAR_ENC_UTF_16_BE; + else if (!memcmp(tag, BOM_UTF_16_LE, BOM_UTF_16_SIZE)) + *char_enc = CHAR_ENC_UTF_16_LE; else return false; tag+= BOM_UTF_16_SIZE; - *char_enc = utf16; /* \1 + BOM(2) + C0U0E0S0H0E0E0T000 = 21 */ *cuesheet_offset = 21; break; + case 0x02: - utf16 = *char_enc = CHAR_ENC_UTF_16_BE; + *char_enc = CHAR_ENC_UTF_16_BE; /* \2 + 0C0U0E0S0H0E0E0T00 = 19 */ *cuesheet_offset = 19; break; + case 0x03: *char_enc = CHAR_ENC_UTF_8; - break; + //fallthrough + case 0x00: + return !strncmp(tag, key, key_size); + default: return false; } - ++tag; //skip encoding type - const char* key = "CUESHEET"; - - if (!utf16) - return !strncmp(tag, key, 8); - int tag_index; - for (int i =0; i < 8; ++i) + // check if UTF-16 string is variation of C0U0E0S0H0E0E0T or 0C0U0E0S0H0E0E0T + for (int i =0; i < key_size; ++i) { - tag_index = i<<1; - if ( (utf16 == CHAR_ENC_UTF_16_BE && tag[tag_index] == 0 && tag[tag_index + 1] == key[i] ) - || (tag[tag_index] == key[i] && tag[tag_index + 1] == 0 )) - continue; - return false; + const char* utf16_char = &tag[(i << 1)]; + if (*utf16_char + *(utf16_char + 1) != key[i]) + return false; } return true; } @@ -1093,7 +1088,7 @@ retry_with_limit: aren't binary */ if(!tr->binary) { if ( /* Is it an embedded cuesheet? */ - (tr->offset == 0 && tr->tag_length == 4 && !memcmp(header, "TXXX", 4)) && + (ptag == NULL && tr->tag_length == 4 && !memcmp(header, "TXXX", 4)) && (bytesread >= 14) ) { unsigned char char_enc; |