From ba77a3f9cb1d68b2ed4813aaae856444578e3a75 Mon Sep 17 00:00:00 2001 From: Marco Nelissen Date: Thu, 6 Jan 2011 11:12:17 -0800 Subject: [PATCH] Add support for the "compilation" tag in mp3, mp4 and ogg, and also add support for two common ways of specifying album artist in ogg files. b/3311831 Change-Id: Iba1152013b7577168af71f947d7249560419fa05 --- core/java/android/provider/MediaStore.java | 7 +++++++ include/media/mediametadataretriever.h | 1 + include/media/stagefright/MetaData.h | 1 + media/java/android/media/MediaMetadataRetriever.java | 1 + media/libstagefright/MP3Extractor.cpp | 1 + media/libstagefright/MPEG4Extractor.cpp | 11 +++++++++++ media/libstagefright/OggExtractor.cpp | 3 +++ media/libstagefright/StagefrightMediaScanner.cpp | 1 + media/libstagefright/StagefrightMetadataRetriever.cpp | 1 + 9 files changed, 27 insertions(+) diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java index 075da338cb391..c179cc5a62d51 100644 --- a/core/java/android/provider/MediaStore.java +++ b/core/java/android/provider/MediaStore.java @@ -899,6 +899,13 @@ public final class MediaStore { */ public static final String ALBUM_ARTIST = "album_artist"; + /** + * Whether the song is part of a compilation + *

Type: TEXT

+ * @hide + */ + public static final String COMPILATION = "compilation"; + /** * A non human readable key calculated from the ARTIST, used for * searching, sorting and grouping diff --git a/include/media/mediametadataretriever.h b/include/media/mediametadataretriever.h index dbbcc49dfc39a..ddc07f60da712 100644 --- a/include/media/mediametadataretriever.h +++ b/include/media/mediametadataretriever.h @@ -56,6 +56,7 @@ enum { METADATA_KEY_MIMETYPE = 22, METADATA_KEY_DISC_NUMBER = 23, METADATA_KEY_ALBUMARTIST = 24, + METADATA_KEY_COMPILATION = 25, // Add more here... }; diff --git a/include/media/stagefright/MetaData.h b/include/media/stagefright/MetaData.h index 29bfc4aaf5885..bffb9e0a36522 100644 --- a/include/media/stagefright/MetaData.h +++ b/include/media/stagefright/MetaData.h @@ -73,6 +73,7 @@ enum { kKeyDiscNumber = 'dnum', // cstring kKeyDate = 'date', // cstring kKeyWriter = 'writ', // cstring + kKeyCompilation = 'cpil', // cstring kKeyTimeScale = 'tmsl', // int32_t // video profile and level diff --git a/media/java/android/media/MediaMetadataRetriever.java b/media/java/android/media/MediaMetadataRetriever.java index 681751b4d1511..008528d432361 100644 --- a/media/java/android/media/MediaMetadataRetriever.java +++ b/media/java/android/media/MediaMetadataRetriever.java @@ -258,5 +258,6 @@ public class MediaMetadataRetriever public static final int METADATA_KEY_MIMETYPE = 22; public static final int METADATA_KEY_DISCNUMBER = 23; public static final int METADATA_KEY_ALBUMARTIST = 24; + public static final int METADATA_KEY_COMPILATION = 25; // Add more here... } diff --git a/media/libstagefright/MP3Extractor.cpp b/media/libstagefright/MP3Extractor.cpp index 82c04265e407d..b15c7204aa789 100644 --- a/media/libstagefright/MP3Extractor.cpp +++ b/media/libstagefright/MP3Extractor.cpp @@ -743,6 +743,7 @@ sp MP3Extractor::getMetaData() { { kKeyAuthor, "TXT", "TEXT" }, { kKeyCDTrackNumber, "TRK", "TRCK" }, { kKeyDiscNumber, "TPA", "TPOS" }, + { kKeyCompilation, "TCP", "TCMP" }, }; static const size_t kNumMapEntries = sizeof(kMap) / sizeof(kMap[0]); diff --git a/media/libstagefright/MPEG4Extractor.cpp b/media/libstagefright/MPEG4Extractor.cpp index 2154f2f5fc69c..34064c8c583d8 100644 --- a/media/libstagefright/MPEG4Extractor.cpp +++ b/media/libstagefright/MPEG4Extractor.cpp @@ -1176,6 +1176,17 @@ status_t MPEG4Extractor::parseMetaData(off_t offset, size_t size) { metadataKey = kKeyGenre; break; } + case FOURCC('c', 'p', 'i', 'l'): + { + if (size == 9 && flags == 21) { + char tmp[16]; + sprintf(tmp, "%d", + (int)buffer[size - 1]); + + mFileMetaData->setCString(kKeyCompilation, tmp); + } + break; + } case FOURCC('t', 'r', 'k', 'n'): { if (size == 16 && flags == 0) { diff --git a/media/libstagefright/OggExtractor.cpp b/media/libstagefright/OggExtractor.cpp index 43938b2a68644..0368fb75c9871 100644 --- a/media/libstagefright/OggExtractor.cpp +++ b/media/libstagefright/OggExtractor.cpp @@ -660,6 +660,9 @@ void MyVorbisExtractor::parseFileMetaData() { } kMap[] = { { "TITLE", kKeyTitle }, { "ARTIST", kKeyArtist }, + { "ALBUMARTIST", kKeyAlbumArtist }, + { "ALBUM ARTIST", kKeyAlbumArtist }, + { "COMPILATION", kKeyCompilation }, { "ALBUM", kKeyAlbum }, { "COMPOSER", kKeyComposer }, { "GENRE", kKeyGenre }, diff --git a/media/libstagefright/StagefrightMediaScanner.cpp b/media/libstagefright/StagefrightMediaScanner.cpp index 1629e9f17e982..d3aa2f689b902 100644 --- a/media/libstagefright/StagefrightMediaScanner.cpp +++ b/media/libstagefright/StagefrightMediaScanner.cpp @@ -155,6 +155,7 @@ status_t StagefrightMediaScanner::processFile( { "year", METADATA_KEY_YEAR }, { "duration", METADATA_KEY_DURATION }, { "writer", METADATA_KEY_WRITER }, + { "compilation", METADATA_KEY_COMPILATION }, }; static const size_t kNumEntries = sizeof(kKeyMap) / sizeof(kKeyMap[0]); diff --git a/media/libstagefright/StagefrightMetadataRetriever.cpp b/media/libstagefright/StagefrightMetadataRetriever.cpp index 9b2dec9b389a3..ac208cd252e6f 100644 --- a/media/libstagefright/StagefrightMetadataRetriever.cpp +++ b/media/libstagefright/StagefrightMetadataRetriever.cpp @@ -355,6 +355,7 @@ void StagefrightMetadataRetriever::parseMetaData() { { kKeyTitle, METADATA_KEY_TITLE }, { kKeyYear, METADATA_KEY_YEAR }, { kKeyWriter, METADATA_KEY_WRITER }, + { kKeyCompilation, METADATA_KEY_COMPILATION }, }; static const size_t kNumMapEntries = sizeof(kMap) / sizeof(kMap[0]);