summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/MediaExtractor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'media/libstagefright/MediaExtractor.cpp')
-rw-r--r--media/libstagefright/MediaExtractor.cpp30
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);