diff --git a/proprietary/wvm/WVMExtractorImpl.cpp b/proprietary/wvm/WVMExtractorImpl.cpp index d4498cab..889d07bd 100644 --- a/proprietary/wvm/WVMExtractorImpl.cpp +++ b/proprietary/wvm/WVMExtractorImpl.cpp @@ -93,13 +93,12 @@ bool IsWidevineMedia(const sp& dataSource) { WVMExtractorImpl::WVMExtractorImpl(sp dataSource) : mFileMetaData(new MetaData()), mDataSource(dataSource), + mClientContext(new ClientContext()), mHaveMetaData(false), mUseAdaptiveStreaming(false), mIsLiveStream(false), mSession(NULL), - mSetupStatus(OK), - mUIDIsSet(false), - mCryptoPluginMode(false) + mSetupStatus(OK) { dataSource->getDrmInfo(sDecryptHandle, &sDrmManagerClient); @@ -161,13 +160,13 @@ void WVMExtractorImpl::Initialize() // Use the URI - streaming case, only for widevine:// protocol result = WV_Setup(mSession, mDataSource->getUri().string(), "RAW/RAW/RAW;destination=getdata", credentials, - WV_OutputFormat_ES, kStreamCacheSize, this); + WV_OutputFormat_ES, kStreamCacheSize, mClientContext.get()); } else { // No URI supplied or not adaptive, pull data from the stagefright data source. mFileSource = new WVMFileSource(mDataSource); result = WV_Setup(mSession, mFileSource.get(), "RAW/RAW/RAW;destination=getdata", credentials, - WV_OutputFormat_ES, kStreamCacheSize, this); + WV_OutputFormat_ES, kStreamCacheSize, mClientContext.get()); } if (result != WV_Status_OK) { @@ -198,21 +197,21 @@ void WVMExtractorImpl::SocketInfoCallback(int fd, int closing, void *context) { //ALOGD("WVMExtractorImpl::SocketInfoCallback(%d, %d, %p)", fd, closing, context); - WVMExtractorImpl *obj = (WVMExtractorImpl *)context; + ClientContext *obj = (ClientContext *)context; if (!obj) { - ALOGW("SocketInfoCallback: missing context!"); + // Not an error, there are some cases where this is expected return; - } else if (!obj->mUIDIsSet) { + } else if (!obj->haveUID()) { ALOGW("SocketInfoCallback: UID not set!"); return; } if (!closing) { uint32_t kTag = *(uint32_t *)"WVEX"; - int res = qtaguid_tagSocket(fd, kTag, obj->mUID); + int res = qtaguid_tagSocket(fd, kTag, obj->getUID()); if (res != 0) { - ALOGE("Failed tagging socket %d for uid %d (My UID=%d)", fd, obj->mUID, geteuid()); + ALOGE("Failed tagging socket %d for uid %d (My UID=%d)", fd, obj->getUID(), geteuid()); } } else { int res = qtaguid_untagSocket(fd); @@ -339,10 +338,12 @@ status_t WVMExtractorImpl::readMetaData() } } + bool cryptoPluginMode = mClientContext->getCryptoPluginMode(); + mAudioSource = new WVMMediaSource(mSession, WV_EsSelector_Audio, audioMetaData, - mIsLiveStream, mCryptoPluginMode); + mIsLiveStream, cryptoPluginMode); mVideoSource = new WVMMediaSource(mSession, WV_EsSelector_Video, videoMetaData, - mIsLiveStream, mCryptoPluginMode); + mIsLiveStream, cryptoPluginMode); // Since the WVExtractor goes away soon after this, we delegate ownership of some resources // to the constructed media source @@ -351,13 +352,17 @@ status_t WVMExtractorImpl::readMetaData() mVideoSource->delegateDataSource(mDataSource); + mClientContext->setAudioSource(mAudioSource); + mClientContext->setVideoSource(mVideoSource); + mVideoSource->delegateClientContext(mClientContext); + mFileMetaData->setCString(kKeyMIMEType, "video/wvm"); mHaveMetaData = true; mInfoListener->configureHeartbeat(); - if (mCryptoPluginMode) { + if (cryptoPluginMode) { // In crypto plugin mode, need to trigger the drm plugin to begin // license use on playback since the media player isn't involved. sDrmManagerClient->setPlaybackStatus(sDecryptHandle, Playback::START, 0); @@ -534,20 +539,13 @@ bool WVMExtractorImpl::getAdaptiveStreamingMode() const void WVMExtractorImpl::setCryptoPluginMode(bool cryptoPluginMode) { //ALOGD("WVMExtractorImpl::setCryptoPluginMode(%d)", cryptoPluginMode); - mCryptoPluginMode = cryptoPluginMode; -} - -bool WVMExtractorImpl::getCryptoPluginMode() const -{ - //ALOGD("WVMExtractorImpl::getCryptoPluginMode - %d", mCryptoPluginMode); - return mCryptoPluginMode; + mClientContext->setCryptoPluginMode(cryptoPluginMode); } void WVMExtractorImpl::setUID(uid_t uid) { //ALOGD("WVMExtractorImpl::setUID(%d)", (uint32_t)uid); - mUID = uid; - mUIDIsSet = true; + mClientContext->setUID(uid); } } // namespace android diff --git a/proprietary/wvm/WVMMediaSource.cpp b/proprietary/wvm/WVMMediaSource.cpp index 893cdae7..7a8fdd48 100644 --- a/proprietary/wvm/WVMMediaSource.cpp +++ b/proprietary/wvm/WVMMediaSource.cpp @@ -8,6 +8,7 @@ #include "WVMMediaSource.h" #include "WVMFileSource.h" #include "WVMExtractorImpl.h" +#include "ClientContext.h" #include "media/stagefright/foundation/ADebug.h" #include "media/stagefright/MediaErrors.h" #include "media/stagefright/MediaDefs.h" @@ -66,6 +67,11 @@ void WVMMediaSource::delegateDataSource(sp dataSource) mDataSource = dataSource; } +void WVMMediaSource::delegateClientContext(sp context) +{ + mClientContext = context; +} + void WVMMediaSource::allocBufferGroup() { if (mGroup) @@ -422,24 +428,25 @@ void WVMMediaSource::DecryptCallback(WVEsSelector esType, void* input, void* out //ALOGD("DecryptCallback(type=%d, in=%p, out=%p, len=%d, key=%d\n", // (int)esType, input, output, length, key); - WVMExtractorImpl *extractor = (WVMExtractorImpl *)obj; - if (!extractor) { - ALOGE("WVMMediaSource::DecryptCallback - no extractor!"); + ClientContext *clientContext = (ClientContext *)obj; + if (!clientContext) { + ALOGE("WVMMediaSource::DecryptCallback - no client context!"); return; } sp source; if (esType == WV_EsSelector_Video) - source = extractor->getVideoSource(); + source = clientContext->getVideoSource(); else - source = extractor->getAudioSource(); + source = clientContext->getAudioSource(); + DecryptContext &context = source->getDecryptContext(); OEMCrypto_UINT32 copied = length; OEMCryptoResult result; unsigned char *iv = NULL; - if (extractor->getCryptoPluginMode()) { + if (clientContext->getCryptoPluginMode()) { // just determine crypto unit boundaries if (key) { source->addEncryptedSize(length); diff --git a/proprietary/wvm/include/ClientContext.h b/proprietary/wvm/include/ClientContext.h new file mode 100644 index 00000000..b9497e19 --- /dev/null +++ b/proprietary/wvm/include/ClientContext.h @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2011 Google, Inc. All Rights Reserved + */ + +#ifndef CLIENTCONTEXT_H_ +#define CLIENTCONTEXT_H_ + +#include +#include + +namespace android { + + class WVMMediaSource; + + class ClientContext : public RefBase { + public: + ClientContext() : mUIDIsSet(false), mCryptoPluginMode(false) {} + + void setUID(uid_t uid) { mUID = uid; mUIDIsSet = true; } + uid_t getUID() const { return mUID; } + bool haveUID() const { return mUIDIsSet; } + + void setCryptoPluginMode(bool cryptoPluginMode) { mCryptoPluginMode = cryptoPluginMode; } + bool getCryptoPluginMode() const { return mCryptoPluginMode; } + + void setAudioSource(sp const &audioSource) { mAudioSource = audioSource; } + void setVideoSource(sp const &videoSource) { mVideoSource = videoSource; } + + sp getAudioSource() const { return mAudioSource.promote(); } + sp getVideoSource() const { return mVideoSource.promote(); } + + private: + bool mUIDIsSet;; + uid_t mUID; + + bool mCryptoPluginMode; + + wp mAudioSource; + wp mVideoSource; + + DISALLOW_EVIL_CONSTRUCTORS(ClientContext); + }; +}; + +#endif + diff --git a/proprietary/wvm/include/WVMExtractorImpl.h b/proprietary/wvm/include/WVMExtractorImpl.h index d857aef0..531b1d53 100644 --- a/proprietary/wvm/include/WVMExtractorImpl.h +++ b/proprietary/wvm/include/WVMExtractorImpl.h @@ -38,14 +38,16 @@ public: virtual void setAdaptiveStreamingMode(bool adaptive); bool getAdaptiveStreamingMode() const; + // + // if in CryptoPlugin mode, the extractor doesn't decrypt, + // it just accumulates the ranges of data requiring decryption + // into the MediaBuffer's metadata, the decryption happens + // later via the CryptoPlugin + // virtual void setCryptoPluginMode(bool cryptoPluginMode); - bool getCryptoPluginMode() const; virtual void setUID(uid_t uid); - sp getAudioSource() const { return mAudioSource; } - sp getVideoSource() const { return mVideoSource; } - static void SocketInfoCallback(int fd, int op, void *context); static void cleanup(); @@ -63,6 +65,7 @@ private: sp mFileSource; sp mDataSource; sp mInfoListener; + sp mClientContext; bool mHaveMetaData; bool mUseAdaptiveStreaming; @@ -73,17 +76,6 @@ private: status_t mSetupStatus; - bool mUIDIsSet; - uid_t mUID; - - // - // if in CryptoPlugin mode, the extractor doesn't decrypt, - // it just accumulates the ranges of data requiring decryption - // into the MediaBuffer's metadata, the decryption happens - // later via the CryptoPlugin - // - bool mCryptoPluginMode; - status_t readMetaData(); const static size_t kStreamCacheSize = 10 * 1024 * 1024; diff --git a/proprietary/wvm/include/WVMMediaSource.h b/proprietary/wvm/include/WVMMediaSource.h index 576d5575..3170e2cc 100644 --- a/proprietary/wvm/include/WVMMediaSource.h +++ b/proprietary/wvm/include/WVMMediaSource.h @@ -13,6 +13,7 @@ #include #include #include +#include "ClientContext.h" #ifdef REQUIRE_SECURE_BUFFERS #include "OEMCrypto_L1.h" #endif @@ -29,6 +30,7 @@ public: void delegateFileSource(sp fileSource); void delegateDataSource(sp dataSource); + void delegateClientContext(sp context); virtual status_t start(MetaData *params = NULL); virtual status_t stop(); @@ -87,6 +89,7 @@ private: sp mFileSource; sp mDataSource; + sp mClientContext; Vector mEncryptedSizes;