From 1cb02bf661807ffc6525dcc13e16d7ce027bef00 Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Wed, 13 Jan 2010 11:25:10 -0800 Subject: [PATCH] Support for determining the mime type of media via metadata extraction. --- include/media/mediametadataretriever.h | 1 + .../android/media/MediaMetadataRetriever.java | 1 + media/libstagefright/AMRExtractor.cpp | 12 ++++++++++ media/libstagefright/MP3Extractor.cpp | 4 ++++ media/libstagefright/MPEG4Extractor.cpp | 22 ++++++++++++++++++- .../StagefrightMediaScanner.cpp | 6 +++++ .../StagefrightMetadataRetriever.cpp | 1 + media/libstagefright/WAVExtractor.cpp | 12 ++++++++++ media/libstagefright/include/AMRExtractor.h | 2 ++ media/libstagefright/include/MPEG4Extractor.h | 9 +++++--- media/libstagefright/include/WAVExtractor.h | 2 ++ 11 files changed, 68 insertions(+), 4 deletions(-) diff --git a/include/media/mediametadataretriever.h b/include/media/mediametadataretriever.h index cfc205cc5d0fd..113c452e9537c 100644 --- a/include/media/mediametadataretriever.h +++ b/include/media/mediametadataretriever.h @@ -53,6 +53,7 @@ enum { METADATA_KEY_VIDEO_HEIGHT = 19, METADATA_KEY_VIDEO_WIDTH = 20, METADATA_KEY_WRITER = 21, + METADATA_KEY_MIMETYPE = 22, // Add more here... }; diff --git a/media/java/android/media/MediaMetadataRetriever.java b/media/java/android/media/MediaMetadataRetriever.java index cecf4f8180141..04f8b5d365152 100644 --- a/media/java/android/media/MediaMetadataRetriever.java +++ b/media/java/android/media/MediaMetadataRetriever.java @@ -255,5 +255,6 @@ public class MediaMetadataRetriever public static final int METADATA_KEY_VIDEO_HEIGHT = 19; public static final int METADATA_KEY_VIDEO_WIDTH = 20; public static final int METADATA_KEY_WRITER = 21; + public static final int METADATA_KEY_MIMETYPE = 22; // Add more here... } diff --git a/media/libstagefright/AMRExtractor.cpp b/media/libstagefright/AMRExtractor.cpp index bdd7550a14e21..3193d5e34eab8 100644 --- a/media/libstagefright/AMRExtractor.cpp +++ b/media/libstagefright/AMRExtractor.cpp @@ -128,6 +128,18 @@ AMRExtractor::AMRExtractor(const sp &source) AMRExtractor::~AMRExtractor() { } +sp AMRExtractor::getMetaData() { + sp meta = new MetaData; + + if (mInitCheck != OK) { + return meta; + } + + meta->setCString(kKeyMIMEType, mIsWide ? "audio/amr-wb" : "audio/amr"); + + return meta; +} + size_t AMRExtractor::countTracks() { return mInitCheck == OK ? 1 : 0; } diff --git a/media/libstagefright/MP3Extractor.cpp b/media/libstagefright/MP3Extractor.cpp index 48130fc5e2f40..accd94d5947f7 100644 --- a/media/libstagefright/MP3Extractor.cpp +++ b/media/libstagefright/MP3Extractor.cpp @@ -711,6 +711,10 @@ status_t MP3Source::read( sp MP3Extractor::getMetaData() { sp meta = new MetaData; + if (mFirstFramePos < 0) { + return meta; + } + meta->setCString(kKeyMIMEType, "audio/mpeg"); ID3 id3(mDataSource); diff --git a/media/libstagefright/MPEG4Extractor.cpp b/media/libstagefright/MPEG4Extractor.cpp index b340b298d15d9..9e7f1c74a0028 100644 --- a/media/libstagefright/MPEG4Extractor.cpp +++ b/media/libstagefright/MPEG4Extractor.cpp @@ -152,6 +152,7 @@ static const char *FourCC2MIME(uint32_t fourcc) { MPEG4Extractor::MPEG4Extractor(const sp &source) : mDataSource(source), mHaveMetadata(false), + mHasVideo(false), mFirstTrack(NULL), mLastTrack(NULL) { } @@ -167,6 +168,23 @@ MPEG4Extractor::~MPEG4Extractor() { mFirstTrack = mLastTrack = NULL; } +sp MPEG4Extractor::getMetaData() { + sp meta = new MetaData; + + status_t err; + if ((err = readMetaData()) != OK) { + return meta; + } + + if (mHasVideo) { + meta->setCString(kKeyMIMEType, "video/mp4"); + } else { + meta->setCString(kKeyMIMEType, "audio/mp4"); + } + + return meta; +} + size_t MPEG4Extractor::countTracks() { status_t err; if ((err = readMetaData()) != OK) { @@ -235,7 +253,7 @@ status_t MPEG4Extractor::readMetaData() { status_t err; while ((err = parseChunk(&offset, 0)) == OK) { } - + if (mHaveMetadata) { return OK; } @@ -561,6 +579,8 @@ status_t MPEG4Extractor::parseChunk(off_t *offset, int depth) { case FOURCC('s', '2', '6', '3'): case FOURCC('a', 'v', 'c', '1'): { + mHasVideo = true; + if (mHandlerType != FOURCC('v', 'i', 'd', 'e')) { return ERROR_MALFORMED; } diff --git a/media/libstagefright/StagefrightMediaScanner.cpp b/media/libstagefright/StagefrightMediaScanner.cpp index 4815db24b4921..345138395f76a 100644 --- a/media/libstagefright/StagefrightMediaScanner.cpp +++ b/media/libstagefright/StagefrightMediaScanner.cpp @@ -179,6 +179,12 @@ status_t StagefrightMediaScanner::processFile( if (mRetriever->setDataSource(path) == OK && mRetriever->setMode( METADATA_MODE_METADATA_RETRIEVAL_ONLY) == OK) { + const char *value; + if ((value = mRetriever->extractMetadata( + METADATA_KEY_MIMETYPE)) != NULL) { + client.setMimeType(value); + } + struct KeyMap { const char *tag; int key; diff --git a/media/libstagefright/StagefrightMetadataRetriever.cpp b/media/libstagefright/StagefrightMetadataRetriever.cpp index 4cc56e3d3f795..c7877a9265bd3 100644 --- a/media/libstagefright/StagefrightMetadataRetriever.cpp +++ b/media/libstagefright/StagefrightMetadataRetriever.cpp @@ -275,6 +275,7 @@ void StagefrightMetadataRetriever::parseMetaData() { int to; }; static const Map kMap[] = { + { kKeyMIMEType, METADATA_KEY_MIMETYPE }, { kKeyCDTrackNumber, METADATA_KEY_CD_TRACK_NUMBER }, { kKeyAlbum, METADATA_KEY_ALBUM }, { kKeyArtist, METADATA_KEY_ARTIST }, diff --git a/media/libstagefright/WAVExtractor.cpp b/media/libstagefright/WAVExtractor.cpp index 542c764e595f4..959a7673afb16 100644 --- a/media/libstagefright/WAVExtractor.cpp +++ b/media/libstagefright/WAVExtractor.cpp @@ -82,6 +82,18 @@ WAVExtractor::WAVExtractor(const sp &source) WAVExtractor::~WAVExtractor() { } +sp WAVExtractor::getMetaData() { + sp meta = new MetaData; + + if (mInitCheck != OK) { + return meta; + } + + meta->setCString(kKeyMIMEType, "audio/x-wav"); + + return meta; +} + size_t WAVExtractor::countTracks() { return mInitCheck == OK ? 1 : 0; } diff --git a/media/libstagefright/include/AMRExtractor.h b/media/libstagefright/include/AMRExtractor.h index 1972a1cff01b7..db49fe4bdb103 100644 --- a/media/libstagefright/include/AMRExtractor.h +++ b/media/libstagefright/include/AMRExtractor.h @@ -32,6 +32,8 @@ public: virtual sp getTrack(size_t index); virtual sp getTrackMetaData(size_t index, uint32_t flags); + virtual sp getMetaData(); + protected: virtual ~AMRExtractor(); diff --git a/media/libstagefright/include/MPEG4Extractor.h b/media/libstagefright/include/MPEG4Extractor.h index ce4736d24884a..0e360e8b0064d 100644 --- a/media/libstagefright/include/MPEG4Extractor.h +++ b/media/libstagefright/include/MPEG4Extractor.h @@ -31,9 +31,11 @@ public: // Extractor assumes ownership of "source". MPEG4Extractor(const sp &source); - size_t countTracks(); - sp getTrack(size_t index); - sp getTrackMetaData(size_t index, uint32_t flags); + virtual size_t countTracks(); + virtual sp getTrack(size_t index); + virtual sp getTrackMetaData(size_t index, uint32_t flags); + + virtual sp getMetaData(); protected: virtual ~MPEG4Extractor(); @@ -49,6 +51,7 @@ private: sp mDataSource; bool mHaveMetadata; + bool mHasVideo; Track *mFirstTrack, *mLastTrack; diff --git a/media/libstagefright/include/WAVExtractor.h b/media/libstagefright/include/WAVExtractor.h index 10b9700ee2117..8545efc0f5941 100644 --- a/media/libstagefright/include/WAVExtractor.h +++ b/media/libstagefright/include/WAVExtractor.h @@ -34,6 +34,8 @@ public: virtual sp getTrack(size_t index); virtual sp getTrackMetaData(size_t index, uint32_t flags); + virtual sp getMetaData(); + protected: virtual ~WAVExtractor();