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

Commit d276313b authored by Jeff Tinker's avatar Jeff Tinker Committed by Android Git Automerger
Browse files

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

* commit 'a693a4b5553584a01b8b6b3640dc0393d2d88f28':
  Fix ANRs due to Widevine DRM plugin sniff taking too long.
parents 59a6c287 894f3ca9
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_