aboutsummaryrefslogtreecommitdiffstats
path: root/taglib/mp4
diff options
context:
space:
mode:
authorTsuda Kageyu <tsuda.kageyu@gmail.com>2015-11-19 16:35:55 +0900
committerTsuda Kageyu <tsuda.kageyu@gmail.com>2015-11-19 16:35:55 +0900
commita3564d8c68643dcddbb6f166171a26653398a010 (patch)
tree4d87b48e37a070bfe7d3e972566477519e2444e4 /taglib/mp4
parent72a807def1375debb7f10b6815533113c37b1daf (diff)
Efficient lookup for the MP4/ASF field name and ID3v1 genre tables.
Linear lookup is much faster and memory efficient when an array is very small.
Diffstat (limited to 'taglib/mp4')
-rw-r--r--taglib/mp4/mp4tag.cpp124
1 files changed, 65 insertions, 59 deletions
diff --git a/taglib/mp4/mp4tag.cpp b/taglib/mp4/mp4tag.cpp
index 47c802ce..005c8a4d 100644
--- a/taglib/mp4/mp4tag.cpp
+++ b/taglib/mp4/mp4tag.cpp
@@ -814,70 +814,76 @@ bool MP4::Tag::contains(const String &key) const
return d->items.contains(key);
}
-static const char *keyTranslation[][2] = {
- { "\251nam", "TITLE" },
- { "\251ART", "ARTIST" },
- { "\251alb", "ALBUM" },
- { "\251cmt", "COMMENT" },
- { "\251gen", "GENRE" },
- { "\251day", "DATE" },
- { "\251wrt", "COMPOSER" },
- { "\251grp", "GROUPING" },
- { "aART", "ALBUMARTIST" },
- { "trkn", "TRACKNUMBER" },
- { "disk", "DISCNUMBER" },
- { "cpil", "COMPILATION" },
- { "tmpo", "BPM" },
- { "cprt", "COPYRIGHT" },
- { "\251lyr", "LYRICS" },
- { "\251too", "ENCODEDBY" },
- { "soal", "ALBUMSORT" },
- { "soaa", "ALBUMARTISTSORT" },
- { "soar", "ARTISTSORT" },
- { "sonm", "TITLESORT" },
- { "soco", "COMPOSERSORT" },
- { "sosn", "SHOWSORT" },
- { "----:com.apple.iTunes:MusicBrainz Track Id", "MUSICBRAINZ_TRACKID" },
- { "----:com.apple.iTunes:MusicBrainz Artist Id", "MUSICBRAINZ_ARTISTID" },
- { "----:com.apple.iTunes:MusicBrainz Album Id", "MUSICBRAINZ_ALBUMID" },
- { "----:com.apple.iTunes:MusicBrainz Album Artist Id", "MUSICBRAINZ_ALBUMARTISTID" },
- { "----:com.apple.iTunes:MusicBrainz Release Group Id", "MUSICBRAINZ_RELEASEGROUPID" },
- { "----:com.apple.iTunes:MusicBrainz Work Id", "MUSICBRAINZ_WORKID" },
- { "----:com.apple.iTunes:ASIN", "ASIN" },
- { "----:com.apple.iTunes:LABEL", "LABEL" },
- { "----:com.apple.iTunes:LYRICIST", "LYRICIST" },
- { "----:com.apple.iTunes:CONDUCTOR", "CONDUCTOR" },
- { "----:com.apple.iTunes:REMIXER", "REMIXER" },
- { "----:com.apple.iTunes:ENGINEER", "ENGINEER" },
- { "----:com.apple.iTunes:PRODUCER", "PRODUCER" },
- { "----:com.apple.iTunes:DJMIXER", "DJMIXER" },
- { "----:com.apple.iTunes:MIXER", "MIXER" },
- { "----:com.apple.iTunes:SUBTITLE", "SUBTITLE" },
- { "----:com.apple.iTunes:DISCSUBTITLE", "DISCSUBTITLE" },
- { "----:com.apple.iTunes:MOOD", "MOOD" },
- { "----:com.apple.iTunes:ISRC", "ISRC" },
- { "----:com.apple.iTunes:CATALOGNUMBER", "CATALOGNUMBER" },
- { "----:com.apple.iTunes:BARCODE", "BARCODE" },
- { "----:com.apple.iTunes:SCRIPT", "SCRIPT" },
- { "----:com.apple.iTunes:LANGUAGE", "LANGUAGE" },
- { "----:com.apple.iTunes:LICENSE", "LICENSE" },
- { "----:com.apple.iTunes:MEDIA", "MEDIA" },
-};
+namespace
+{
+ const char *keyTranslation[][2] = {
+ { "\251nam", "TITLE" },
+ { "\251ART", "ARTIST" },
+ { "\251alb", "ALBUM" },
+ { "\251cmt", "COMMENT" },
+ { "\251gen", "GENRE" },
+ { "\251day", "DATE" },
+ { "\251wrt", "COMPOSER" },
+ { "\251grp", "GROUPING" },
+ { "aART", "ALBUMARTIST" },
+ { "trkn", "TRACKNUMBER" },
+ { "disk", "DISCNUMBER" },
+ { "cpil", "COMPILATION" },
+ { "tmpo", "BPM" },
+ { "cprt", "COPYRIGHT" },
+ { "\251lyr", "LYRICS" },
+ { "\251too", "ENCODEDBY" },
+ { "soal", "ALBUMSORT" },
+ { "soaa", "ALBUMARTISTSORT" },
+ { "soar", "ARTISTSORT" },
+ { "sonm", "TITLESORT" },
+ { "soco", "COMPOSERSORT" },
+ { "sosn", "SHOWSORT" },
+ { "----:com.apple.iTunes:MusicBrainz Track Id", "MUSICBRAINZ_TRACKID" },
+ { "----:com.apple.iTunes:MusicBrainz Artist Id", "MUSICBRAINZ_ARTISTID" },
+ { "----:com.apple.iTunes:MusicBrainz Album Id", "MUSICBRAINZ_ALBUMID" },
+ { "----:com.apple.iTunes:MusicBrainz Album Artist Id", "MUSICBRAINZ_ALBUMARTISTID" },
+ { "----:com.apple.iTunes:MusicBrainz Release Group Id", "MUSICBRAINZ_RELEASEGROUPID" },
+ { "----:com.apple.iTunes:MusicBrainz Work Id", "MUSICBRAINZ_WORKID" },
+ { "----:com.apple.iTunes:ASIN", "ASIN" },
+ { "----:com.apple.iTunes:LABEL", "LABEL" },
+ { "----:com.apple.iTunes:LYRICIST", "LYRICIST" },
+ { "----:com.apple.iTunes:CONDUCTOR", "CONDUCTOR" },
+ { "----:com.apple.iTunes:REMIXER", "REMIXER" },
+ { "----:com.apple.iTunes:ENGINEER", "ENGINEER" },
+ { "----:com.apple.iTunes:PRODUCER", "PRODUCER" },
+ { "----:com.apple.iTunes:DJMIXER", "DJMIXER" },
+ { "----:com.apple.iTunes:MIXER", "MIXER" },
+ { "----:com.apple.iTunes:SUBTITLE", "SUBTITLE" },
+ { "----:com.apple.iTunes:DISCSUBTITLE", "DISCSUBTITLE" },
+ { "----:com.apple.iTunes:MOOD", "MOOD" },
+ { "----:com.apple.iTunes:ISRC", "ISRC" },
+ { "----:com.apple.iTunes:CATALOGNUMBER", "CATALOGNUMBER" },
+ { "----:com.apple.iTunes:BARCODE", "BARCODE" },
+ { "----:com.apple.iTunes:SCRIPT", "SCRIPT" },
+ { "----:com.apple.iTunes:LANGUAGE", "LANGUAGE" },
+ { "----:com.apple.iTunes:LICENSE", "LICENSE" },
+ { "----:com.apple.iTunes:MEDIA", "MEDIA" },
+ };
+ const size_t keyTranslationSize = sizeof(keyTranslation) / sizeof(keyTranslation[0]);
+
+ String translateKey(const String &key)
+ {
+ for(size_t i = 0; i < keyTranslationSize; ++i) {
+ if(key == keyTranslation[i][0])
+ return keyTranslation[i][1];
+ }
+
+ return String();
+ }
+}
PropertyMap MP4::Tag::properties() const
{
- static Map<String, String> keyMap;
- if(keyMap.isEmpty()) {
- int numKeys = sizeof(keyTranslation) / sizeof(keyTranslation[0]);
- for(int i = 0; i < numKeys; i++) {
- keyMap[keyTranslation[i][0]] = keyTranslation[i][1];
- }
- }
-
PropertyMap props;
for(MP4::ItemMap::ConstIterator it = d->items.begin(); it != d->items.end(); ++it) {
- if(keyMap.contains(it->first)) {
- String key = keyMap[it->first];
+ const String key = translateKey(it->first);
+ if(!key.isEmpty()) {
if(key == "TRACKNUMBER" || key == "DISCNUMBER") {
MP4::Item::IntPair ip = it->second.toIntPair();
String value = String::number(ip.first);