Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e3067743 authored by Marco Nelissen's avatar Marco Nelissen
Browse files

Only initialize sniffers once, don't hold mutex while sniffing

b/11482896

Change-Id: Ie036554b4c9e7e8863cb07901d414ea457f1b2f1
(cherry picked from commit 377fce69)
parent e100b813
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -80,7 +80,6 @@ public:
            const sp<DataSource> &source, String8 *mimeType,
            float *confidence, sp<AMessage> *meta);

    static void RegisterSniffer(SnifferFunc func);
    static void RegisterDefaultSniffers();

    // for DRM
@@ -101,6 +100,9 @@ protected:
private:
    static Mutex gSnifferMutex;
    static List<SnifferFunc> gSniffers;
    static bool gSniffersRegistered;

    static void RegisterSniffer_l(SnifferFunc func);

    DataSource(const DataSource &);
    DataSource &operator=(const DataSource &);
+27 −16
Original line number Diff line number Diff line
@@ -107,6 +107,7 @@ 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) {
@@ -114,7 +115,13 @@ bool DataSource::sniff(
    *confidence = 0.0f;
    meta->clear();

    {
        Mutex::Autolock autoLock(gSnifferMutex);
        if (!gSniffersRegistered) {
            return false;
        }
    }

    for (List<SnifferFunc>::iterator it = gSniffers.begin();
         it != gSniffers.end(); ++it) {
        String8 newMimeType;
@@ -133,9 +140,7 @@ bool DataSource::sniff(
}

// static
void DataSource::RegisterSniffer(SnifferFunc func) {
    Mutex::Autolock autoLock(gSnifferMutex);

void DataSource::RegisterSniffer_l(SnifferFunc func) {
    for (List<SnifferFunc>::iterator it = gSniffers.begin();
         it != gSniffers.end(); ++it) {
        if (*it == func) {
@@ -148,23 +153,29 @@ void DataSource::RegisterSniffer(SnifferFunc func) {

// static
void DataSource::RegisterDefaultSniffers() {
    RegisterSniffer(SniffMPEG4);
    RegisterSniffer(SniffMatroska);
    RegisterSniffer(SniffOgg);
    RegisterSniffer(SniffWAV);
    RegisterSniffer(SniffFLAC);
    RegisterSniffer(SniffAMR);
    RegisterSniffer(SniffMPEG2TS);
    RegisterSniffer(SniffMP3);
    RegisterSniffer(SniffAAC);
    RegisterSniffer(SniffMPEG2PS);
    RegisterSniffer(SniffWVM);
    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);

    char value[PROPERTY_VALUE_MAX];
    if (property_get("drm.service.enabled", value, NULL)
            && (!strcmp(value, "1") || !strcasecmp(value, "true"))) {
        RegisterSniffer(SniffDRM);
        RegisterSniffer_l(SniffDRM);
    }
    gSniffersRegistered = true;
}

// static