diff options
author | Ronghua Wu <ronghuawu@google.com> | 2014-08-28 15:50:29 -0700 |
---|---|---|
committer | Ronghua Wu <ronghuawu@google.com> | 2014-08-29 13:56:42 -0700 |
commit | 802768790c131f8237364906fd13981a6bb91193 (patch) | |
tree | 4d7ba73ee57592fe29079c5949fb39083ecb9184 /media/libmediaplayerservice | |
parent | d42173a44721af1a600b9c8599bc736394fcc724 (diff) | |
download | frameworks_av-802768790c131f8237364906fd13981a6bb91193.zip frameworks_av-802768790c131f8237364906fd13981a6bb91193.tar.gz frameworks_av-802768790c131f8237364906fd13981a6bb91193.tar.bz2 |
GenericSource: set DRM playback status.
Bug: 17307158
Change-Id: I36b801a9b67831b618930cf1241756bb9644b4fd
Diffstat (limited to 'media/libmediaplayerservice')
5 files changed, 94 insertions, 0 deletions
diff --git a/media/libmediaplayerservice/Android.mk b/media/libmediaplayerservice/Android.mk index 0c7e590..adc066d 100644 --- a/media/libmediaplayerservice/Android.mk +++ b/media/libmediaplayerservice/Android.mk @@ -28,6 +28,7 @@ LOCAL_SHARED_LIBRARIES := \ libcamera_client \ libcrypto \ libcutils \ + libdrmframework \ liblog \ libdl \ libgui \ diff --git a/media/libmediaplayerservice/nuplayer/GenericSource.cpp b/media/libmediaplayerservice/nuplayer/GenericSource.cpp index cdb7e69..3691c85 100644 --- a/media/libmediaplayerservice/nuplayer/GenericSource.cpp +++ b/media/libmediaplayerservice/nuplayer/GenericSource.cpp @@ -32,6 +32,7 @@ #include <media/stagefright/MediaExtractor.h> #include <media/stagefright/MediaSource.h> #include <media/stagefright/MetaData.h> +#include "../../libstagefright/include/DRMExtractor.h" #include "../../libstagefright/include/NuCachedSource2.h" #include "../../libstagefright/include/WVMExtractor.h" @@ -49,6 +50,7 @@ NuPlayer::GenericSource::GenericSource( mIsWidevine(false), mUIDValid(uidValid), mUID(uid), + mDrmManagerClient(NULL), mMetaDataSize(-1ll), mBitrate(-1ll), mPollBufferingGeneration(0) { @@ -57,12 +59,18 @@ NuPlayer::GenericSource::GenericSource( } void NuPlayer::GenericSource::resetDataSource() { + mAudioTimeUs = 0; + mVideoTimeUs = 0; mHTTPService.clear(); mUri.clear(); mUriHeaders.clear(); mFd = -1; mOffset = 0; mLength = 0; + setDrmPlaybackStatusIfNeeded(Playback::STOP, 0); + mDecryptHandle = NULL; + mDrmManagerClient = NULL; + mStarted = false; } status_t NuPlayer::GenericSource::setDataSource( @@ -130,6 +138,10 @@ status_t NuPlayer::GenericSource::initFromDataSource() { return UNKNOWN_ERROR; } + if (extractor->getDrmFlag()) { + checkDrmStatus(mDataSource); + } + sp<MetaData> fileMeta = extractor->getMetaData(); if (fileMeta != NULL) { int64_t duration; @@ -199,6 +211,28 @@ status_t NuPlayer::GenericSource::initFromDataSource() { return OK; } +void NuPlayer::GenericSource::checkDrmStatus(const sp<DataSource>& dataSource) { + dataSource->getDrmInfo(mDecryptHandle, &mDrmManagerClient); + if (mDecryptHandle != NULL) { + CHECK(mDrmManagerClient); + if (RightsStatus::RIGHTS_VALID != mDecryptHandle->status) { + sp<AMessage> msg = dupNotify(); + msg->setInt32("what", kWhatDrmNoLicense); + msg->post(); + } + } +} + +int64_t NuPlayer::GenericSource::getLastReadPosition() { + if (mAudioTrack.mSource != NULL) { + return mAudioTimeUs; + } else if (mVideoTrack.mSource != NULL) { + return mVideoTimeUs; + } else { + return 0; + } +} + status_t NuPlayer::GenericSource::setBuffers( bool audio, Vector<MediaBuffer *> &buffers) { if (mIsWidevine && !audio) { @@ -394,6 +428,33 @@ void NuPlayer::GenericSource::start() { readBuffer(MEDIA_TRACK_TYPE_VIDEO); } + + setDrmPlaybackStatusIfNeeded(Playback::START, getLastReadPosition() / 1000); + mStarted = true; +} + +void NuPlayer::GenericSource::stop() { + // nothing to do, just account for DRM playback status + setDrmPlaybackStatusIfNeeded(Playback::STOP, 0); + mStarted = false; +} + +void NuPlayer::GenericSource::pause() { + // nothing to do, just account for DRM playback status + setDrmPlaybackStatusIfNeeded(Playback::PAUSE, 0); + mStarted = false; +} + +void NuPlayer::GenericSource::resume() { + // nothing to do, just account for DRM playback status + setDrmPlaybackStatusIfNeeded(Playback::START, getLastReadPosition() / 1000); + mStarted = true; +} + +void NuPlayer::GenericSource::setDrmPlaybackStatusIfNeeded(int playbackStatus, int64_t position) { + if (mDecryptHandle != NULL) { + mDrmManagerClient->setPlaybackStatus(mDecryptHandle, playbackStatus, position); + } } status_t NuPlayer::GenericSource::feedMoreTSData() { @@ -868,6 +929,10 @@ status_t NuPlayer::GenericSource::seekTo(int64_t seekTimeUs) { readBuffer(MEDIA_TRACK_TYPE_AUDIO, seekTimeUs); } + setDrmPlaybackStatusIfNeeded(Playback::START, seekTimeUs / 1000); + if (!mStarted) { + setDrmPlaybackStatusIfNeeded(Playback::PAUSE, 0); + } return OK; } @@ -985,6 +1050,14 @@ void NuPlayer::GenericSource::readBuffer( options.clearSeekTo(); if (err == OK) { + int64_t timeUs; + CHECK(mbuf->meta_data()->findInt64(kKeyTime, &timeUs)); + if (trackType == MEDIA_TRACK_TYPE_AUDIO) { + mAudioTimeUs = timeUs; + } else if (trackType == MEDIA_TRACK_TYPE_VIDEO) { + mVideoTimeUs = timeUs; + } + // formatChange && seeking: track whose source is changed during selection // formatChange && !seeking: track whose source is not changed during selection // !formatChange: normal seek diff --git a/media/libmediaplayerservice/nuplayer/GenericSource.h b/media/libmediaplayerservice/nuplayer/GenericSource.h index 663bfae..1f13120 100644 --- a/media/libmediaplayerservice/nuplayer/GenericSource.h +++ b/media/libmediaplayerservice/nuplayer/GenericSource.h @@ -27,6 +27,8 @@ namespace android { +class DecryptHandle; +class DrmManagerClient; struct AnotherPacketSource; struct ARTSPController; struct DataSource; @@ -49,6 +51,9 @@ struct NuPlayer::GenericSource : public NuPlayer::Source { virtual void prepareAsync(); virtual void start(); + virtual void stop(); + virtual void pause(); + virtual void resume(); virtual status_t feedMoreTSData(); @@ -90,7 +95,9 @@ private: }; Track mAudioTrack; + int64_t mAudioTimeUs; Track mVideoTrack; + int64_t mVideoTimeUs; Track mSubtitleTrack; Track mTimedTextTrack; @@ -111,6 +118,9 @@ private: sp<DataSource> mDataSource; sp<NuCachedSource2> mCachedSource; sp<WVMExtractor> mWVMExtractor; + DrmManagerClient *mDrmManagerClient; + sp<DecryptHandle> mDecryptHandle; + bool mStarted; String8 mContentType; AString mSniffedMIME; off64_t mMetaDataSize; @@ -122,6 +132,9 @@ private: void resetDataSource(); status_t initFromDataSource(); + void checkDrmStatus(const sp<DataSource>& dataSource); + int64_t getLastReadPosition(); + void setDrmPlaybackStatusIfNeeded(int playbackStatus, int64_t position); status_t prefillCacheIfNecessary(); diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp index f4cd02c..bc7bf44 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp @@ -1915,6 +1915,12 @@ void NuPlayer::onSourceNotify(const sp<AMessage> &msg) { break; } + case Source::kWhatDrmNoLicense: + { + notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, ERROR_DRM_NO_LICENSE); + break; + } + default: TRESPASS(); } diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerSource.h b/media/libmediaplayerservice/nuplayer/NuPlayerSource.h index 45657c2..7ccf3b1 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerSource.h +++ b/media/libmediaplayerservice/nuplayer/NuPlayerSource.h @@ -51,6 +51,7 @@ struct NuPlayer::Source : public AHandler { kWhatSubtitleData, kWhatTimedTextData, kWhatQueueDecoderShutdown, + kWhatDrmNoLicense, }; // The provides message is used to notify the player about various |