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

This commit is contained in:
Jeff Tinker
2011-12-08 00:13:43 -08:00
committed by Android (Google) Code Review
5 changed files with 63 additions and 15 deletions

View File

@ -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;

View File

@ -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;
}

View File

@ -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)

View File

@ -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

View File

@ -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_