diff options
5 files changed, 37 insertions, 143 deletions
diff --git a/media/libmediaplayerservice/nuplayer/GenericSource.cpp b/media/libmediaplayerservice/nuplayer/GenericSource.cpp index 63a9b77..9b446b8 100644 --- a/media/libmediaplayerservice/nuplayer/GenericSource.cpp +++ b/media/libmediaplayerservice/nuplayer/GenericSource.cpp @@ -130,37 +130,23 @@ sp<MetaData> NuPlayer::GenericSource::getFileFormatMeta() const { status_t NuPlayer::GenericSource::initFromDataSource() { sp<MediaExtractor> extractor; - String8 mimeType; - float confidence; - sp<AMessage> dummy; - bool isWidevineStreaming = false; CHECK(mDataSource != NULL); if (mIsWidevine) { - isWidevineStreaming = SniffWVM( - mDataSource, &mimeType, &confidence, &dummy); - if (!isWidevineStreaming || - strcasecmp( + String8 mimeType; + float confidence; + sp<AMessage> dummy; + bool success; + + success = SniffWVM(mDataSource, &mimeType, &confidence, &dummy); + if (!success + || strcasecmp( mimeType.string(), MEDIA_MIMETYPE_CONTAINER_WVM)) { ALOGE("unsupported widevine mime: %s", mimeType.string()); return UNKNOWN_ERROR; } - } else if (mIsStreaming) { - if (mSniffedMIME.empty()) { - if (!mDataSource->sniff(&mimeType, &confidence, &dummy)) { - return UNKNOWN_ERROR; - } - mSniffedMIME = mimeType.string(); - } - isWidevineStreaming = !strcasecmp( - mSniffedMIME.c_str(), MEDIA_MIMETYPE_CONTAINER_WVM); - } - if (isWidevineStreaming) { - // we don't want cached source for widevine streaming. - mCachedSource.clear(); - mDataSource = mHttpSource; mWVMExtractor = new WVMExtractor(mDataSource); mWVMExtractor->setAdaptiveStreamingMode(true); if (mUIDValid) { @@ -195,6 +181,14 @@ status_t NuPlayer::GenericSource::initFromDataSource() { if (mFileMeta->findCString(kKeyMIMEType, &fileMime) && !strncasecmp(fileMime, "video/wvm", 9)) { mIsWidevine = true; + if (!mUri.empty()) { + // streaming, but the app forgot to specify widevine:// url + mWVMExtractor = static_cast<WVMExtractor *>(extractor.get()); + mWVMExtractor->setAdaptiveStreamingMode(true); + if (mUIDValid) { + mWVMExtractor->setUID(mUID); + } + } } } } @@ -268,12 +262,6 @@ 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. @@ -288,6 +276,8 @@ status_t NuPlayer::GenericSource::startSources() { return UNKNOWN_ERROR; } + mBitrate = totalBitrate; + return OK; } @@ -433,32 +423,6 @@ 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; @@ -477,7 +441,6 @@ void NuPlayer::GenericSource::notifyPreparedAndCleanup(status_t err) { mDataSource.clear(); mCachedSource.clear(); mHttpSource.clear(); - mBitrate = -1; cancelPollBuffering(); } @@ -693,10 +656,10 @@ void NuPlayer::GenericSource::sendCacheStats() { int32_t kbps = 0; status_t err = UNKNOWN_ERROR; - if (mWVMExtractor != NULL) { - err = mWVMExtractor->getEstimatedBandwidthKbps(&kbps); - } else if (mCachedSource != NULL) { + if (mCachedSource != NULL) { err = mCachedSource->getEstimatedBandwidthKbps(&kbps); + } else if (mWVMExtractor != NULL) { + err = mWVMExtractor->getEstimatedBandwidthKbps(&kbps); } if (err == OK) { @@ -718,13 +681,7 @@ void NuPlayer::GenericSource::onPollBuffering() { int64_t cachedDurationUs = -1ll; ssize_t cachedDataRemaining = -1; - ALOGW_IF(mWVMExtractor != NULL && mCachedSource != NULL, - "WVMExtractor and NuCachedSource both present"); - - if (mWVMExtractor != NULL) { - cachedDurationUs = - mWVMExtractor->getCachedDurationUs(&finalStatus); - } else if (mCachedSource != NULL) { + if (mCachedSource != NULL) { cachedDataRemaining = mCachedSource->approxDataRemaining(&finalStatus); @@ -740,6 +697,9 @@ void NuPlayer::GenericSource::onPollBuffering() { cachedDurationUs = cachedDataRemaining * 8000000ll / bitrate; } } + } else if (mWVMExtractor != NULL) { + cachedDurationUs + = mWVMExtractor->getCachedDurationUs(&finalStatus); } if (finalStatus != OK) { @@ -910,14 +870,6 @@ 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 diff --git a/media/libmediaplayerservice/nuplayer/GenericSource.h b/media/libmediaplayerservice/nuplayer/GenericSource.h index 2d73ea9..385d73a 100644 --- a/media/libmediaplayerservice/nuplayer/GenericSource.h +++ b/media/libmediaplayerservice/nuplayer/GenericSource.h @@ -96,7 +96,6 @@ private: kWhatStopWidevine, kWhatStart, kWhatResume, - kWhatSecureDecodersInstantiated, }; struct Track { @@ -162,9 +161,6 @@ private: status_t prefillCacheIfNecessary(); void notifyPreparedAndCleanup(status_t err); - void onSecureDecodersInstantiated(status_t err); - void finishPrepareAsync(); - status_t startSources(); void onGetFormatMeta(sp<AMessage> msg) const; sp<MetaData> doGetFormatMeta(bool audio) const; diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp index aeea204..fb8dbce 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp @@ -1004,41 +1004,23 @@ void NuPlayer::onResume() { } } -status_t NuPlayer::onInstantiateSecureDecoders() { - status_t err; - if (!(mSourceFlags & Source::FLAG_SECURE)) { - return BAD_TYPE; - } - - if (mRenderer != NULL) { - ALOGE("renderer should not be set when instantiating secure decoders"); - return UNKNOWN_ERROR; - } - - // TRICKY: We rely on mRenderer being null, so that decoder does not start requesting - // data on instantiation. - if (mNativeWindow != NULL) { - err = instantiateDecoder(false, &mVideoDecoder); - if (err != OK) { - return err; - } - } - - if (mAudioSink != NULL) { - err = instantiateDecoder(true, &mAudioDecoder); - if (err != OK) { - return err; - } - } - return OK; -} - void NuPlayer::onStart() { mOffloadAudio = false; mAudioEOS = false; mVideoEOS = false; mStarted = true; + /* instantiate decoders now for secure playback */ + if (mSourceFlags & Source::FLAG_SECURE) { + if (mNativeWindow != NULL) { + instantiateDecoder(false, &mVideoDecoder); + } + + if (mAudioSink != NULL) { + instantiateDecoder(true, &mAudioDecoder); + } + } + mSource->start(); uint32_t flags = 0; @@ -1389,7 +1371,7 @@ void NuPlayer::flushDecoder(bool audio, bool needShutdown) { FlushStatus newStatus = needShutdown ? FLUSHING_DECODER_SHUTDOWN : FLUSHING_DECODER; - mFlushComplete[audio][false /* isDecoder */] = (mRenderer == NULL); + mFlushComplete[audio][false /* isDecoder */] = false; mFlushComplete[audio][true /* isDecoder */] = false; if (audio) { ALOGE_IF(mFlushingAudio != NONE, @@ -1674,23 +1656,6 @@ void NuPlayer::onSourceNotify(const sp<AMessage> &msg) { CHECK(msg->findInt32("what", &what)); switch (what) { - case Source::kWhatInstantiateSecureDecoders: - { - if (mSource == NULL) { - // This is a stale notification from a source that was - // asynchronously preparing when the client called reset(). - // We handled the reset, the source is gone. - break; - } - - sp<AMessage> reply; - CHECK(msg->findMessage("reply", &reply)); - status_t err = onInstantiateSecureDecoders(); - reply->setInt32("err", err); - reply->post(); - break; - } - case Source::kWhatPrepared: { if (mSource == NULL) { @@ -1703,14 +1668,6 @@ void NuPlayer::onSourceNotify(const sp<AMessage> &msg) { int32_t err; CHECK(msg->findInt32("err", &err)); - if (err != OK) { - // shut down potential secure codecs in case client never calls reset - mDeferredActions.push_back( - new FlushDecoderAction(FLUSH_CMD_SHUTDOWN /* audio */, - FLUSH_CMD_SHUTDOWN /* video */)); - processDeferredActions(); - } - sp<NuPlayerDriver> driver = mDriver.promote(); if (driver != NULL) { // notify duration first, so that it's definitely set when @@ -1995,13 +1952,6 @@ void NuPlayer::Source::notifyPrepared(status_t err) { notify->post(); } -void NuPlayer::Source::notifyInstantiateSecureDecoders(const sp<AMessage> &reply) { - sp<AMessage> notify = dupNotify(); - notify->setInt32("what", kWhatInstantiateSecureDecoders); - notify->setMessage("reply", reply); - notify->post(); -} - void NuPlayer::Source::onMessageReceived(const sp<AMessage> & /* msg */) { TRESPASS(); } diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.h b/media/libmediaplayerservice/nuplayer/NuPlayer.h index 30ede1a..57eaf74 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayer.h +++ b/media/libmediaplayerservice/nuplayer/NuPlayer.h @@ -201,8 +201,6 @@ private: status_t instantiateDecoder(bool audio, sp<DecoderBase> *decoder); - status_t onInstantiateSecureDecoders(); - void updateVideoSize( const sp<AMessage> &inputFormat, const sp<AMessage> &outputFormat = NULL); diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerSource.h b/media/libmediaplayerservice/nuplayer/NuPlayerSource.h index d9f14a2..5a8beb1 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerSource.h +++ b/media/libmediaplayerservice/nuplayer/NuPlayerSource.h @@ -55,7 +55,6 @@ struct NuPlayer::Source : public AHandler { kWhatTimedTextData, kWhatQueueDecoderShutdown, kWhatDrmNoLicense, - kWhatInstantiateSecureDecoders, }; // The provides message is used to notify the player about various @@ -126,7 +125,6 @@ protected: void notifyFlagsChanged(uint32_t flags); void notifyVideoSizeChanged(const sp<AMessage> &format = NULL); - void notifyInstantiateSecureDecoders(const sp<AMessage> &reply); void notifyPrepared(status_t err = OK); private: |