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/nuplayer/GenericSource.cpp | |
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/nuplayer/GenericSource.cpp')
-rw-r--r-- | media/libmediaplayerservice/nuplayer/GenericSource.cpp | 73 |
1 files changed, 73 insertions, 0 deletions
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 |