From a64bf2af4ef3219d9d897cd1bbc7b67a7e4c3f4c Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Wed, 18 Nov 2015 16:26:56 -0800 Subject: Revert "DataSource: Remove global variables in DataSource related to sniff" * Don't change the ABI. Fun times. This reverts commit 4440ef8efc77d1bd7838885e83d41e54deb5a3b8. Change-Id: Ie9e0812f5e4ee700c29b76a413083858ec0255c9 --- include/media/stagefright/DataSource.h | 42 ++----------- media/libstagefright/DataSource.cpp | 106 ++++++++++++++++----------------- 2 files changed, 56 insertions(+), 92 deletions(-) diff --git a/include/media/stagefright/DataSource.h b/include/media/stagefright/DataSource.h index 56abe71..de5ddd3 100644 --- a/include/media/stagefright/DataSource.h +++ b/include/media/stagefright/DataSource.h @@ -36,40 +36,6 @@ 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 *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 &source, String8 *mimeType, - float *confidence, sp *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 mSniffers; - List mExtraSniffers; - List::iterator extendedSnifferPosition; - - void registerSnifferPlugin(); - - Sniffer(const Sniffer &); - Sniffer &operator=(const Sniffer &); -}; class DataSource : public RefBase { public: @@ -91,7 +57,7 @@ public: static sp CreateMediaHTTP(const sp &httpService); static sp CreateFromIDataSource(const sp &source); - DataSource() : mSniffer(new Sniffer()) {} + DataSource() {} virtual status_t initCheck() const = 0; @@ -145,7 +111,11 @@ public: protected: virtual ~DataSource() {} - sp mSniffer; +private: + static Mutex gSnifferMutex; + static List gSniffers; + static List gExtraSniffers; + static bool gSniffersRegistered; static void RegisterSniffer_l(SnifferFunc func); static void RegisterSnifferPlugin(); diff --git a/media/libstagefright/DataSource.cpp b/media/libstagefright/DataSource.cpp index 2df045f..8b49d18 100644 --- a/media/libstagefright/DataSource.cpp +++ b/media/libstagefright/DataSource.cpp @@ -129,31 +129,14 @@ status_t DataSource::getSize(off64_t *size) { //////////////////////////////////////////////////////////////////////////////// +Mutex DataSource::gSnifferMutex; +List DataSource::gSniffers; +List DataSource::gExtraSniffers; +bool DataSource::gSniffersRegistered = false; + bool DataSource::sniff( String8 *mimeType, float *confidence, sp *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 *meta) { - bool forceExtraSniffers = false; if (*confidence == 3.14f) { @@ -165,13 +148,19 @@ bool Sniffer::sniff( *confidence = 0.0f; meta->clear(); - Mutex::Autolock autoLock(mSnifferMutex); - for (List::iterator it = mSniffers.begin(); - it != mSniffers.end(); ++it) { + { + Mutex::Autolock autoLock(gSnifferMutex); + if (!gSniffersRegistered) { + return false; + } + } + + for (List::iterator it = gSniffers.begin(); + it != gSniffers.end(); ++it) { String8 newMimeType; float newConfidence; sp newMeta; - if ((*it)(source, &newMimeType, &newConfidence, &newMeta)) { + if ((*it)(this, &newMimeType, &newConfidence, &newMeta)) { if (newConfidence > *confidence) { *mimeType = newMimeType; *confidence = newConfidence; @@ -182,12 +171,12 @@ bool Sniffer::sniff( /* Only do the deeper sniffers if the results are null or in doubt */ if (mimeType->length() == 0 || *confidence < 0.21f || forceExtraSniffers) { - for (List::iterator it = mExtraSniffers.begin(); - it != mExtraSniffers.end(); ++it) { + for (List::iterator it = gExtraSniffers.begin(); + it != gExtraSniffers.end(); ++it) { String8 newMimeType; float newConfidence; sp newMeta; - if ((*it)(source, &newMimeType, &newConfidence, &newMeta)) { + if ((*it)(this, &newMimeType, &newConfidence, &newMeta)) { if (newConfidence > *confidence) { *mimeType = newMimeType; *confidence = newConfidence; @@ -200,19 +189,19 @@ bool Sniffer::sniff( return *confidence > 0.0; } -void Sniffer::registerSniffer_l(SnifferFunc func) { - - for (List::iterator it = mSniffers.begin(); - it != mSniffers.end(); ++it) { +// static +void DataSource::RegisterSniffer_l(SnifferFunc func) { + for (List::iterator it = gSniffers.begin(); + it != gSniffers.end(); ++it) { if (*it == func) { return; } } - mSniffers.push_back(func); + gSniffers.push_back(func); } -void Sniffer::registerSnifferPlugin() { +void DataSource::RegisterSnifferPlugin() { static void (*getExtractorPlugin)(MediaExtractor::Plugin *) = (void (*)(MediaExtractor::Plugin *))loadExtractorPlugin(); @@ -221,40 +210,45 @@ void Sniffer::registerSnifferPlugin() { getExtractorPlugin(plugin); } if (plugin->sniff) { - for (List::iterator it = mExtraSniffers.begin(); - it != mExtraSniffers.end(); ++it) { + for (List::iterator it = gExtraSniffers.begin(); + it != gExtraSniffers.end(); ++it) { if (*it == plugin->sniff) { return; } } - mExtraSniffers.push_back(plugin->sniff); + gExtraSniffers.push_back(plugin->sniff); } } -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()); - registerSnifferPlugin(); +// 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); + RegisterSniffer_l(SniffMidi); + RegisterSniffer_l(AVUtils::get()->getExtendedSniffer()); + RegisterSnifferPlugin(); 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 -- cgit v1.1