diff options
Diffstat (limited to 'media/libstagefright/MediaExtractor.cpp')
-rw-r--r-- | media/libstagefright/MediaExtractor.cpp | 30 |
1 files changed, 25 insertions, 5 deletions
diff --git a/media/libstagefright/MediaExtractor.cpp b/media/libstagefright/MediaExtractor.cpp index e21fe6e..8c63de2 100644 --- a/media/libstagefright/MediaExtractor.cpp +++ b/media/libstagefright/MediaExtractor.cpp @@ -40,8 +40,12 @@ #include <media/stagefright/MetaData.h> #include <utils/String8.h> +#include <stagefright/AVExtensions.h> + namespace android { +MediaExtractor::Plugin MediaExtractor::sPlugin; + sp<MetaData> MediaExtractor::getMetaData() { return new MetaData; } @@ -52,11 +56,14 @@ uint32_t MediaExtractor::flags() const { // static sp<MediaExtractor> MediaExtractor::Create( - const sp<DataSource> &source, const char *mime) { + const sp<DataSource> &source, const char *mime, + const uint32_t flags, const sp<AMessage> *prevMeta) { + sp<AMessage> meta; String8 tmp; if (mime == NULL) { + int64_t sniffStart = ALooper::GetNowUs(); float confidence; if (!source->sniff(&tmp, &confidence, &meta)) { ALOGV("FAILED to autodetect media content."); @@ -65,8 +72,11 @@ sp<MediaExtractor> MediaExtractor::Create( } mime = tmp.string(); - ALOGV("Autodetected media content as '%s' with confidence %.2f", - mime, confidence); + ALOGV("Autodetected media content as '%s' with confidence %.2f (%.2f ms)", + mime, confidence, + ((float)(ALooper::GetNowUs() - sniffStart) / 1000.0f)); + } else if (prevMeta != NULL) { + meta = *prevMeta; } bool isDrm = false; @@ -91,8 +101,15 @@ sp<MediaExtractor> MediaExtractor::Create( } } - MediaExtractor *ret = NULL; - if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_MPEG4) + sp<MediaExtractor> ret; + AString extractorName; + if ((ret = AVFactory::get()->createExtendedExtractor(source, mime, meta, flags)) != NULL) { + ALOGI("Using extended extractor"); + } else if (meta.get() && meta->findString("extended-extractor-use", &extractorName) + && sPlugin.create) { + ALOGI("Use extended extractor for the special mime(%s) or codec", mime); + ret = sPlugin.create(source, mime, meta); + } else if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_MPEG4) || !strcasecmp(mime, "audio/mp4")) { ret = new MPEG4Extractor(source); } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_MPEG)) { @@ -119,8 +136,11 @@ sp<MediaExtractor> MediaExtractor::Create( ret = new MPEG2PSExtractor(source); } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_MIDI)) { ret = new MidiExtractor(source); + } else if (!isDrm && sPlugin.create) { + ret = sPlugin.create(source, mime, meta); } + ret = AVFactory::get()->updateExtractor(ret, source, mime, meta, flags); if (ret != NULL) { if (isDrm) { ret->setDrmFlag(true); |