some fixes for crash when extractor creation fails
- prefetch data for sniffing
- notify error instead of crashing if extractor is NULL
Bug: 16818302
Change-Id: I56ff4996d99ac2811d19d141f7ff7acdd7c1da17
diff --git a/media/libmediaplayerservice/nuplayer/GenericSource.cpp b/media/libmediaplayerservice/nuplayer/GenericSource.cpp
index 32842bb..a18407f 100644
--- a/media/libmediaplayerservice/nuplayer/GenericSource.cpp
+++ b/media/libmediaplayerservice/nuplayer/GenericSource.cpp
@@ -37,10 +37,6 @@
NuPlayer::GenericSource::GenericSource(
const sp<AMessage> ¬ify,
- const sp<IMediaHTTPService> &httpService,
- const char *url,
- const KeyedVector<String8, String8> *headers,
- bool isWidevine,
bool uidValid,
uid_t uid)
: Source(notify),
@@ -48,38 +44,41 @@
mFetchTimedTextDataGeneration(0),
mDurationUs(0ll),
mAudioIsVorbis(false),
- mIsWidevine(isWidevine),
+ mIsWidevine(false),
mUIDValid(uidValid),
mUID(uid) {
DataSource::RegisterDefaultSniffers();
+}
+
+status_t NuPlayer::GenericSource::init(
+ const sp<IMediaHTTPService> &httpService,
+ const char *url,
+ const KeyedVector<String8, String8> *headers) {
+ mIsWidevine = !strncasecmp(url, "widevine://", 11);
+
+ AString sniffedMIME;
sp<DataSource> dataSource =
- DataSource::CreateFromURI(httpService, url, headers);
- CHECK(dataSource != NULL);
+ DataSource::CreateFromURI(httpService, url, headers, &sniffedMIME);
- initFromDataSource(dataSource);
+ if (dataSource == NULL) {
+ return UNKNOWN_ERROR;
+ }
+
+ return initFromDataSource(
+ dataSource, sniffedMIME.empty() ? NULL : sniffedMIME.c_str());
}
-NuPlayer::GenericSource::GenericSource(
- const sp<AMessage> ¬ify,
- int fd, int64_t offset, int64_t length)
- : Source(notify),
- mFetchSubtitleDataGeneration(0),
- mFetchTimedTextDataGeneration(0),
- mDurationUs(0ll),
- mAudioIsVorbis(false),
- mIsWidevine(false),
- mUIDValid(false),
- mUID(0) {
- DataSource::RegisterDefaultSniffers();
-
+status_t NuPlayer::GenericSource::init(
+ int fd, int64_t offset, int64_t length) {
sp<DataSource> dataSource = new FileSource(dup(fd), offset, length);
- initFromDataSource(dataSource);
+ return initFromDataSource(dataSource, NULL);
}
-void NuPlayer::GenericSource::initFromDataSource(
- const sp<DataSource> &dataSource) {
+status_t NuPlayer::GenericSource::initFromDataSource(
+ const sp<DataSource> &dataSource,
+ const char* mime) {
sp<MediaExtractor> extractor;
if (mIsWidevine) {
@@ -93,7 +92,7 @@
|| strcasecmp(
mimeType.string(), MEDIA_MIMETYPE_CONTAINER_WVM)) {
ALOGE("unsupported widevine mime: %s", mimeType.string());
- return;
+ return UNKNOWN_ERROR;
}
sp<WVMExtractor> wvmExtractor = new WVMExtractor(dataSource);
@@ -103,10 +102,12 @@
}
extractor = wvmExtractor;
} else {
- extractor = MediaExtractor::Create(dataSource);
+ extractor = MediaExtractor::Create(dataSource, mime);
}
- CHECK(extractor != NULL);
+ if (extractor == NULL) {
+ return UNKNOWN_ERROR;
+ }
sp<MetaData> fileMeta = extractor->getMetaData();
if (fileMeta != NULL) {
@@ -144,6 +145,9 @@
int32_t secure;
if (meta->findInt32(kKeyRequiresSecureBuffers, &secure) && secure) {
mIsWidevine = true;
+ if (mUIDValid) {
+ extractor->setUID(mUID);
+ }
}
}
}
@@ -158,6 +162,8 @@
}
}
}
+
+ return OK;
}
status_t NuPlayer::GenericSource::setBuffers(bool audio, Vector<MediaBuffer *> &buffers) {