summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/media/stagefright/DataSource.h38
-rw-r--r--media/libstagefright/DataSource.cpp86
2 files changed, 80 insertions, 44 deletions
diff --git a/include/media/stagefright/DataSource.h b/include/media/stagefright/DataSource.h
index 0c31e72..de31ff0 100644
--- a/include/media/stagefright/DataSource.h
+++ b/include/media/stagefright/DataSource.h
@@ -36,6 +36,37 @@ class IDataSource;
struct IMediaHTTPService;
class String8;
struct HTTPBase;
+class DataSource;
+
+class Sniffer : public RefBase {
+public:
+ Sniffer();
+
+ ////////////////////////////////////////////////////////////////////////////
+
+ bool sniff(DataSource *source, String8 *mimeType, float *confidence, sp<AMessage> *meta);
+
+ // The sniffer can optionally fill in "meta" with an AMessage containing
+ // a dictionary of values that helps the corresponding extractor initialize
+ // its state without duplicating effort already exerted by the sniffer.
+ typedef bool (*SnifferFunc)(
+ const sp<DataSource> &source, String8 *mimeType,
+ float *confidence, sp<AMessage> *meta);
+
+ //if isExtendedExtractor = true, store the location of the sniffer to register
+ void registerSniffer_l(SnifferFunc func);
+ void registerDefaultSniffers();
+
+ virtual ~Sniffer() {}
+
+private:
+ Mutex mSnifferMutex;
+ List<SnifferFunc> mSniffers;
+ List<SnifferFunc>::iterator extendedSnifferPosition;
+
+ Sniffer(const Sniffer &);
+ Sniffer &operator=(const Sniffer &);
+};
class DataSource : public RefBase {
public:
@@ -57,7 +88,7 @@ public:
static sp<DataSource> CreateMediaHTTP(const sp<IMediaHTTPService> &httpService);
static sp<DataSource> CreateFromIDataSource(const sp<IDataSource> &source);
- DataSource() {}
+ DataSource() : mSniffer(new Sniffer()) {}
virtual status_t initCheck() const = 0;
@@ -111,10 +142,7 @@ public:
protected:
virtual ~DataSource() {}
-private:
- static Mutex gSnifferMutex;
- static List<SnifferFunc> gSniffers;
- static bool gSniffersRegistered;
+ sp<Sniffer> mSniffer;
static void RegisterSniffer_l(SnifferFunc func);
diff --git a/media/libstagefright/DataSource.cpp b/media/libstagefright/DataSource.cpp
index 85d0292..9230329 100644
--- a/media/libstagefright/DataSource.cpp
+++ b/media/libstagefright/DataSource.cpp
@@ -112,29 +112,42 @@ status_t DataSource::getSize(off64_t *size) {
////////////////////////////////////////////////////////////////////////////////
-Mutex DataSource::gSnifferMutex;
-List<DataSource::SnifferFunc> DataSource::gSniffers;
-bool DataSource::gSniffersRegistered = false;
-
bool DataSource::sniff(
String8 *mimeType, float *confidence, sp<AMessage> *meta) {
+
+ return mSniffer->sniff(this, mimeType, confidence, meta);
+}
+
+// static
+void DataSource::RegisterSniffer_l(SnifferFunc func) {
+ return;
+}
+
+// static
+void DataSource::RegisterDefaultSniffers() {
+ return;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+Sniffer::Sniffer() {
+ registerDefaultSniffers();
+}
+
+bool Sniffer::sniff(
+ DataSource *source, String8 *mimeType, float *confidence, sp<AMessage> *meta) {
+
*mimeType = "";
*confidence = 0.0f;
meta->clear();
- {
- Mutex::Autolock autoLock(gSnifferMutex);
- if (!gSniffersRegistered) {
- return false;
- }
- }
-
- for (List<SnifferFunc>::iterator it = gSniffers.begin();
- it != gSniffers.end(); ++it) {
+ Mutex::Autolock autoLock(mSnifferMutex);
+ for (List<SnifferFunc>::iterator it = mSniffers.begin();
+ it != mSniffers.end(); ++it) {
String8 newMimeType;
float newConfidence;
sp<AMessage> newMeta;
- if ((*it)(this, &newMimeType, &newConfidence, &newMeta)) {
+ if ((*it)(source, &newMimeType, &newConfidence, &newMeta)) {
if (newConfidence > *confidence) {
*mimeType = newMimeType;
*confidence = newConfidence;
@@ -146,45 +159,40 @@ bool DataSource::sniff(
return *confidence > 0.0;
}
-// static
-void DataSource::RegisterSniffer_l(SnifferFunc func) {
- for (List<SnifferFunc>::iterator it = gSniffers.begin();
- it != gSniffers.end(); ++it) {
+void Sniffer::registerSniffer_l(SnifferFunc func) {
+
+ for (List<SnifferFunc>::iterator it = mSniffers.begin();
+ it != mSniffers.end(); ++it) {
if (*it == func) {
return;
}
}
- gSniffers.push_back(func);
+ mSniffers.push_back(func);
}
-// static
-void DataSource::RegisterDefaultSniffers() {
- Mutex::Autolock autoLock(gSnifferMutex);
- if (gSniffersRegistered) {
- return;
- }
-
- RegisterSniffer_l(SniffMPEG4);
- RegisterSniffer_l(SniffMatroska);
- RegisterSniffer_l(SniffOgg);
- RegisterSniffer_l(SniffWAV);
- RegisterSniffer_l(SniffFLAC);
- RegisterSniffer_l(SniffAMR);
- RegisterSniffer_l(SniffMPEG2TS);
- RegisterSniffer_l(SniffMP3);
- RegisterSniffer_l(SniffAAC);
- RegisterSniffer_l(SniffMPEG2PS);
- RegisterSniffer_l(SniffWVM);
+void Sniffer::registerDefaultSniffers() {
+ Mutex::Autolock autoLock(mSnifferMutex);
+
+ registerSniffer_l(SniffMPEG4);
+ registerSniffer_l(SniffMatroska);
+ registerSniffer_l(SniffOgg);
+ registerSniffer_l(SniffWAV);
+ registerSniffer_l(SniffFLAC);
+ registerSniffer_l(SniffAMR);
+ registerSniffer_l(SniffMPEG2TS);
+ registerSniffer_l(SniffMP3);
+ registerSniffer_l(SniffAAC);
+ registerSniffer_l(SniffMPEG2PS);
+ registerSniffer_l(SniffWVM);
RegisterSniffer_l(SniffMidi);
RegisterSniffer_l(AVUtils::get()->getExtendedSniffer());
char value[PROPERTY_VALUE_MAX];
if (property_get("drm.service.enabled", value, NULL)
&& (!strcmp(value, "1") || !strcasecmp(value, "true"))) {
- RegisterSniffer_l(SniffDRM);
+ registerSniffer_l(SniffDRM);
}
- gSniffersRegistered = true;
}
// static