summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2010-01-13 11:25:10 -0800
committerAndreas Huber <andih@google.com>2010-01-13 11:30:34 -0800
commit7be6407f2ad7f2b0782d195d9f792072c084d6f5 (patch)
tree61fe09168598f2eed26f83ced0fdbc541ef42e96
parentbd4bc59262df90dc85752684a1d4a92833a535a3 (diff)
downloadframeworks_av-7be6407f2ad7f2b0782d195d9f792072c084d6f5.zip
frameworks_av-7be6407f2ad7f2b0782d195d9f792072c084d6f5.tar.gz
frameworks_av-7be6407f2ad7f2b0782d195d9f792072c084d6f5.tar.bz2
Support for determining the mime type of media via metadata extraction.
-rw-r--r--include/media/mediametadataretriever.h1
-rw-r--r--media/libstagefright/AMRExtractor.cpp12
-rw-r--r--media/libstagefright/MP3Extractor.cpp4
-rw-r--r--media/libstagefright/MPEG4Extractor.cpp22
-rw-r--r--media/libstagefright/StagefrightMediaScanner.cpp6
-rw-r--r--media/libstagefright/StagefrightMetadataRetriever.cpp1
-rw-r--r--media/libstagefright/WAVExtractor.cpp12
-rw-r--r--media/libstagefright/include/AMRExtractor.h2
-rw-r--r--media/libstagefright/include/MPEG4Extractor.h9
-rw-r--r--media/libstagefright/include/WAVExtractor.h2
10 files changed, 67 insertions, 4 deletions
diff --git a/include/media/mediametadataretriever.h b/include/media/mediametadataretriever.h
index cfc205c..113c452 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/libstagefright/AMRExtractor.cpp b/media/libstagefright/AMRExtractor.cpp
index bdd7550..3193d5e 100644
--- a/media/libstagefright/AMRExtractor.cpp
+++ b/media/libstagefright/AMRExtractor.cpp
@@ -128,6 +128,18 @@ AMRExtractor::AMRExtractor(const sp<DataSource> &source)
AMRExtractor::~AMRExtractor() {
}
+sp<MetaData> AMRExtractor::getMetaData() {
+ sp<MetaData> 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 48130fc..accd94d 100644
--- a/media/libstagefright/MP3Extractor.cpp
+++ b/media/libstagefright/MP3Extractor.cpp
@@ -711,6 +711,10 @@ status_t MP3Source::read(
sp<MetaData> MP3Extractor::getMetaData() {
sp<MetaData> 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 b340b29..9e7f1c7 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<DataSource> &source)
: mDataSource(source),
mHaveMetadata(false),
+ mHasVideo(false),
mFirstTrack(NULL),
mLastTrack(NULL) {
}
@@ -167,6 +168,23 @@ MPEG4Extractor::~MPEG4Extractor() {
mFirstTrack = mLastTrack = NULL;
}
+sp<MetaData> MPEG4Extractor::getMetaData() {
+ sp<MetaData> 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 4815db2..3451383 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 4cc56e3..c7877a9 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 542c764..959a767 100644
--- a/media/libstagefright/WAVExtractor.cpp
+++ b/media/libstagefright/WAVExtractor.cpp
@@ -82,6 +82,18 @@ WAVExtractor::WAVExtractor(const sp<DataSource> &source)
WAVExtractor::~WAVExtractor() {
}
+sp<MetaData> WAVExtractor::getMetaData() {
+ sp<MetaData> 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 1972a1c..db49fe4 100644
--- a/media/libstagefright/include/AMRExtractor.h
+++ b/media/libstagefright/include/AMRExtractor.h
@@ -32,6 +32,8 @@ public:
virtual sp<MediaSource> getTrack(size_t index);
virtual sp<MetaData> getTrackMetaData(size_t index, uint32_t flags);
+ virtual sp<MetaData> getMetaData();
+
protected:
virtual ~AMRExtractor();
diff --git a/media/libstagefright/include/MPEG4Extractor.h b/media/libstagefright/include/MPEG4Extractor.h
index ce4736d..0e360e8 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<DataSource> &source);
- size_t countTracks();
- sp<MediaSource> getTrack(size_t index);
- sp<MetaData> getTrackMetaData(size_t index, uint32_t flags);
+ virtual size_t countTracks();
+ virtual sp<MediaSource> getTrack(size_t index);
+ virtual sp<MetaData> getTrackMetaData(size_t index, uint32_t flags);
+
+ virtual sp<MetaData> getMetaData();
protected:
virtual ~MPEG4Extractor();
@@ -49,6 +51,7 @@ private:
sp<DataSource> mDataSource;
bool mHaveMetadata;
+ bool mHasVideo;
Track *mFirstTrack, *mLastTrack;
diff --git a/media/libstagefright/include/WAVExtractor.h b/media/libstagefright/include/WAVExtractor.h
index 10b9700..8545efc 100644
--- a/media/libstagefright/include/WAVExtractor.h
+++ b/media/libstagefright/include/WAVExtractor.h
@@ -34,6 +34,8 @@ public:
virtual sp<MediaSource> getTrack(size_t index);
virtual sp<MetaData> getTrackMetaData(size_t index, uint32_t flags);
+ virtual sp<MetaData> getMetaData();
+
protected:
virtual ~WAVExtractor();