summaryrefslogtreecommitdiffstats
path: root/media/libmediaplayerservice/nuplayer/GenericSource.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'media/libmediaplayerservice/nuplayer/GenericSource.cpp')
-rw-r--r--media/libmediaplayerservice/nuplayer/GenericSource.cpp43
1 files changed, 41 insertions, 2 deletions
diff --git a/media/libmediaplayerservice/nuplayer/GenericSource.cpp b/media/libmediaplayerservice/nuplayer/GenericSource.cpp
index 9b446b8..1b2fc5e 100644
--- a/media/libmediaplayerservice/nuplayer/GenericSource.cpp
+++ b/media/libmediaplayerservice/nuplayer/GenericSource.cpp
@@ -262,6 +262,12 @@ status_t NuPlayer::GenericSource::initFromDataSource() {
}
}
+ mBitrate = totalBitrate;
+
+ return OK;
+}
+
+status_t NuPlayer::GenericSource::startSources() {
// Start the selected A/V tracks now before we start buffering.
// Widevine sources might re-initialize crypto when starting, if we delay
// this to start(), all data buffered during prepare would be wasted.
@@ -276,8 +282,6 @@ status_t NuPlayer::GenericSource::initFromDataSource() {
return UNKNOWN_ERROR;
}
- mBitrate = totalBitrate;
-
return OK;
}
@@ -423,6 +427,32 @@ void NuPlayer::GenericSource::onPrepareAsync() {
| FLAG_CAN_SEEK_FORWARD
| FLAG_CAN_SEEK);
+ if (mIsSecure) {
+ // secure decoders must be instantiated before starting widevine source
+ sp<AMessage> reply = new AMessage(kWhatSecureDecodersInstantiated, id());
+ notifyInstantiateSecureDecoders(reply);
+ } else {
+ finishPrepareAsync();
+ }
+}
+
+void NuPlayer::GenericSource::onSecureDecodersInstantiated(status_t err) {
+ if (err != OK) {
+ ALOGE("Failed to instantiate secure decoders!");
+ notifyPreparedAndCleanup(err);
+ return;
+ }
+ finishPrepareAsync();
+}
+
+void NuPlayer::GenericSource::finishPrepareAsync() {
+ status_t err = startSources();
+ if (err != OK) {
+ ALOGE("Failed to init start data source!");
+ notifyPreparedAndCleanup(err);
+ return;
+ }
+
if (mIsStreaming) {
mPrepareBuffering = true;
@@ -441,6 +471,7 @@ void NuPlayer::GenericSource::notifyPreparedAndCleanup(status_t err) {
mDataSource.clear();
mCachedSource.clear();
mHttpSource.clear();
+ mBitrate = -1;
cancelPollBuffering();
}
@@ -870,6 +901,14 @@ void NuPlayer::GenericSource::onMessageReceived(const sp<AMessage> &msg) {
break;
}
+ case kWhatSecureDecodersInstantiated:
+ {
+ int32_t err;
+ CHECK(msg->findInt32("err", &err));
+ onSecureDecodersInstantiated(err);
+ break;
+ }
+
case kWhatStopWidevine:
{
// mStopRead is only used for Widevine to prevent the video source