summaryrefslogtreecommitdiffstats
path: root/media/libmediaplayerservice/nuplayer/GenericSource.cpp
diff options
context:
space:
mode:
authorChong Zhang <chz@google.com>2014-08-07 15:35:07 -0700
committerThe Android Automerger <android-build@google.com>2014-08-08 07:44:00 -0700
commita19f33e4e50cda5d5953fa0cc662502262ac9dfd (patch)
tree358e0c6547bc9cdf4e6e3c884edeb466ce234ac1 /media/libmediaplayerservice/nuplayer/GenericSource.cpp
parentb189a5b37cd1768f996096122b9541d9fa29ec43 (diff)
downloadframeworks_av-a19f33e4e50cda5d5953fa0cc662502262ac9dfd.zip
frameworks_av-a19f33e4e50cda5d5953fa0cc662502262ac9dfd.tar.gz
frameworks_av-a19f33e4e50cda5d5953fa0cc662502262ac9dfd.tar.bz2
delay data source creation for GenericSource prepare time
Bug: 16708180 Change-Id: I9d578ef5e2edaed50279d28d3831c68556468f39
Diffstat (limited to 'media/libmediaplayerservice/nuplayer/GenericSource.cpp')
-rw-r--r--media/libmediaplayerservice/nuplayer/GenericSource.cpp80
1 files changed, 65 insertions, 15 deletions
diff --git a/media/libmediaplayerservice/nuplayer/GenericSource.cpp b/media/libmediaplayerservice/nuplayer/GenericSource.cpp
index 9df3f53..1616448 100644
--- a/media/libmediaplayerservice/nuplayer/GenericSource.cpp
+++ b/media/libmediaplayerservice/nuplayer/GenericSource.cpp
@@ -21,6 +21,7 @@
#include "AnotherPacketSource.h"
+#include <media/IMediaHTTPService.h>
#include <media/stagefright/foundation/ABuffer.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/AMessage.h>
@@ -47,33 +48,48 @@ NuPlayer::GenericSource::GenericSource(
mIsWidevine(false),
mUIDValid(uidValid),
mUID(uid) {
+ resetDataSource();
DataSource::RegisterDefaultSniffers();
}
-status_t NuPlayer::GenericSource::init(
+void NuPlayer::GenericSource::resetDataSource() {
+ mHTTPService.clear();
+ mUri.clear();
+ mUriHeaders.clear();
+ mFd = -1;
+ mOffset = 0;
+ mLength = 0;
+}
+
+status_t NuPlayer::GenericSource::setDataSource(
const sp<IMediaHTTPService> &httpService,
const char *url,
const KeyedVector<String8, String8> *headers) {
- mIsWidevine = !strncasecmp(url, "widevine://", 11);
-
- AString sniffedMIME;
+ resetDataSource();
- sp<DataSource> dataSource =
- DataSource::CreateFromURI(httpService, url, headers, &sniffedMIME);
+ mHTTPService = httpService;
+ mUri = url;
- if (dataSource == NULL) {
- return UNKNOWN_ERROR;
+ if (headers) {
+ mUriHeaders = *headers;
}
- return initFromDataSource(
- dataSource, sniffedMIME.empty() ? NULL : sniffedMIME.c_str());
+ // delay data source creation to prepareAsync() to avoid blocking
+ // the calling thread in setDataSource for any significant time.
+ return OK;
}
-status_t NuPlayer::GenericSource::init(
+status_t NuPlayer::GenericSource::setDataSource(
int fd, int64_t offset, int64_t length) {
- sp<DataSource> dataSource = new FileSource(dup(fd), offset, length);
+ resetDataSource();
+
+ mFd = dup(fd);
+ mOffset = offset;
+ mLength = length;
- return initFromDataSource(dataSource, NULL);
+ // delay data source creation to prepareAsync() to avoid blocking
+ // the calling thread in setDataSource for any significant time.
+ return OK;
}
status_t NuPlayer::GenericSource::initFromDataSource(
@@ -143,7 +159,8 @@ status_t NuPlayer::GenericSource::initFromDataSource(
// check if the source requires secure buffers
int32_t secure;
- if (meta->findInt32(kKeyRequiresSecureBuffers, &secure) && secure) {
+ if (meta->findInt32(kKeyRequiresSecureBuffers, &secure)
+ && secure) {
mIsWidevine = true;
if (mUIDValid) {
extractor->setUID(mUID);
@@ -166,7 +183,8 @@ status_t NuPlayer::GenericSource::initFromDataSource(
return OK;
}
-status_t NuPlayer::GenericSource::setBuffers(bool audio, Vector<MediaBuffer *> &buffers) {
+status_t NuPlayer::GenericSource::setBuffers(
+ bool audio, Vector<MediaBuffer *> &buffers) {
if (mIsWidevine && !audio) {
return mVideoTrack.mSource->setBuffers(buffers);
}
@@ -177,6 +195,38 @@ NuPlayer::GenericSource::~GenericSource() {
}
void NuPlayer::GenericSource::prepareAsync() {
+ // delayed data source creation
+ AString sniffedMIME;
+ sp<DataSource> dataSource;
+
+ if (!mUri.empty()) {
+ mIsWidevine = !strncasecmp(mUri.c_str(), "widevine://", 11);
+
+ dataSource = DataSource::CreateFromURI(
+ mHTTPService, mUri.c_str(), &mUriHeaders, &sniffedMIME);
+ } else {
+ // set to false first, if the extractor
+ // comes back as secure, set it to true then.
+ mIsWidevine = false;
+
+ dataSource = new FileSource(mFd, mOffset, mLength);
+ }
+
+ if (dataSource == NULL) {
+ ALOGE("Failed to create data source!");
+ notifyPrepared(UNKNOWN_ERROR);
+ return;
+ }
+
+ status_t err = initFromDataSource(
+ dataSource, sniffedMIME.empty() ? NULL : sniffedMIME.c_str());
+
+ if (err != OK) {
+ ALOGE("Failed to init from data source!");
+ notifyPrepared(err);
+ return;
+ }
+
if (mVideoTrack.mSource != NULL) {
sp<MetaData> meta = mVideoTrack.mSource->getFormat();