Support for determining the mime type of media via metadata extraction.

This commit is contained in:
Andreas Huber
2010-01-13 11:25:10 -08:00
parent 5a2ade33fa
commit 1cb02bf661
11 changed files with 68 additions and 4 deletions

View File

@@ -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...
};

View File

@@ -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...
}

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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 },

View File

@@ -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;
}

View File

@@ -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();

View File

@@ -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;

View File

@@ -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();