Support for determining the mime type of media via metadata extraction.
This commit is contained in:
@@ -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...
|
||||
};
|
||||
|
||||
|
||||
@@ -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...
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 },
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user