Support for determining the mime type of media via metadata extraction.
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 @@
     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() {
 }
 
+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 @@
 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 @@
 MPEG4Extractor::MPEG4Extractor(const sp<DataSource> &source)
     : mDataSource(source),
       mHaveMetadata(false),
+      mHasVideo(false),
       mFirstTrack(NULL),
       mLastTrack(NULL) {
 }
@@ -167,6 +168,23 @@
     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 err;
     while ((err = parseChunk(&offset, 0)) == OK) {
     }
-    
+
     if (mHaveMetadata) {
         return OK;
     }
@@ -561,6 +579,8 @@
         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 @@
     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 @@
         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() {
 }
 
+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 @@
     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 @@
     // 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 @@
 
     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 @@
     virtual sp<MediaSource> getTrack(size_t index);
     virtual sp<MetaData> getTrackMetaData(size_t index, uint32_t flags);
 
+    virtual sp<MetaData> getMetaData();
+
 protected:
     virtual ~WAVExtractor();