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

Commit 894f3ca9 authored by Jeff Tinker's avatar Jeff Tinker Committed by Android (Google) Code Review
Browse files

Merge "Fix ANRs due to Widevine DRM plugin sniff taking too long." into ics-mr1

parents 2c170cd8 8e49b604
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -2091,7 +2091,7 @@ status_t AwesomePlayer::finishSetDataSource_l() {
        String8 mimeType;
        float confidence;
        sp<AMessage> dummy;
        bool success = SniffDRM(dataSource, &mimeType, &confidence, &dummy);
        bool success = SniffWVM(dataSource, &mimeType, &confidence, &dummy);

        if (!success
                || strcasecmp(
@@ -2099,6 +2099,8 @@ status_t AwesomePlayer::finishSetDataSource_l() {
            return ERROR_UNSUPPORTED;
        }

        dataSource->DrmInitialization();

        mWVMExtractor = new WVMExtractor(dataSource);
        mWVMExtractor->setAdaptiveStreamingMode(true);
        extractor = mWVMExtractor;
+4 −4
Original line number Diff line number Diff line
@@ -282,13 +282,13 @@ bool SniffDRM(
    if (decryptHandle != NULL) {
        if (decryptHandle->decryptApiType == DecryptApiType::CONTAINER_BASED) {
            *mimeType = String8("drm+container_based+") + decryptHandle->mimeType;
            *confidence = 10.0f;
        } else if (decryptHandle->decryptApiType == DecryptApiType::ELEMENTARY_STREAM_BASED) {
            *mimeType = String8("drm+es_based+") + decryptHandle->mimeType;
        } else if (decryptHandle->decryptApiType == DecryptApiType::WV_BASED) {
            *mimeType = MEDIA_MIMETYPE_CONTAINER_WVM;
            LOGW("SniffWVM: found match\n");
        }
            *confidence = 10.0f;
        } else {
            return false;
        }

        return true;
    }
+2 −0
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@
#include "include/DRMExtractor.h"
#include "include/FLACExtractor.h"
#include "include/AACExtractor.h"
#include "include/WVMExtractor.h"

#include "matroska/MatroskaExtractor.h"

@@ -113,6 +114,7 @@ void DataSource::RegisterDefaultSniffers() {
    RegisterSniffer(SniffMP3);
    RegisterSniffer(SniffAAC);
    RegisterSniffer(SniffMPEG2PS);
    RegisterSniffer(SniffWVM);

    char value[PROPERTY_VALUE_MAX];
    if (property_get("drm.service.enabled", value, NULL)
+46 −10
Original line number Diff line number Diff line
@@ -45,18 +45,13 @@ namespace android {
static Mutex gWVMutex;

WVMExtractor::WVMExtractor(const sp<DataSource> &source)
    : mDataSource(source) {
    : mDataSource(source)
{
    Mutex::Autolock autoLock(gWVMutex);
        if (gVendorLibHandle == NULL) {
            gVendorLibHandle = dlopen("libwvm.so", RTLD_NOW);
        }

        if (gVendorLibHandle == NULL) {
            LOGE("Failed to open libwvm.so");
    if (!getVendorLibHandle()) {
        return;
    }
    }

    typedef WVMLoadableExtractor *(*GetInstanceFunc)(sp<DataSource>);
    GetInstanceFunc getInstanceFunc =
@@ -71,6 +66,19 @@ WVMExtractor::WVMExtractor(const sp<DataSource> &source)
    }
}

bool WVMExtractor::getVendorLibHandle()
{
    if (gVendorLibHandle == NULL) {
        gVendorLibHandle = dlopen("libwvm.so", RTLD_NOW);
    }

    if (gVendorLibHandle == NULL) {
        LOGE("Failed to open libwvm.so");
    }

    return gVendorLibHandle != NULL;
}

WVMExtractor::~WVMExtractor() {
}

@@ -113,5 +121,33 @@ void WVMExtractor::setAdaptiveStreamingMode(bool adaptive) {
    }
}

bool SniffWVM(
    const sp<DataSource> &source, String8 *mimeType, float *confidence,
        sp<AMessage> *) {

    Mutex::Autolock autoLock(gWVMutex);

    if (!WVMExtractor::getVendorLibHandle()) {
        return false;
    }

    typedef WVMLoadableExtractor *(*SnifferFunc)(sp<DataSource>);
    SnifferFunc snifferFunc =
        (SnifferFunc) dlsym(gVendorLibHandle,
                            "_ZN7android15IsWidevineMediaENS_2spINS_10DataSourceEEE");

    if (snifferFunc) {
        if ((*snifferFunc)(source)) {
            *mimeType = MEDIA_MIMETYPE_CONTAINER_WVM;
            *confidence = 10.0f;
            return true;
        }
    } else {
        LOGE("IsWidevineMedia not found in libwvm.so");
    }

    return false;
}

} //namespace android
+8 −0
Original line number Diff line number Diff line
@@ -23,6 +23,8 @@

namespace android {

struct AMessage;
class String8;
class DataSource;

class WVMLoadableExtractor : public MediaExtractor {
@@ -58,6 +60,8 @@ public:
    // is used.
    void setAdaptiveStreamingMode(bool adaptive);

    static bool getVendorLibHandle();

protected:
    virtual ~WVMExtractor();

@@ -69,6 +73,10 @@ private:
    WVMExtractor &operator=(const WVMExtractor &);
};

bool SniffWVM(
        const sp<DataSource> &source, String8 *mimeType, float *confidence,
        sp<AMessage> *);

}  // namespace android

#endif  // DRM_EXTRACTOR_H_