Loading media/libmediaplayerservice/Android.mk +1 −0 Original line number Original line Diff line number Diff line Loading @@ -28,6 +28,7 @@ LOCAL_SHARED_LIBRARIES := \ libcamera_client \ libcamera_client \ libcrypto \ libcrypto \ libcutils \ libcutils \ libdrmframework \ liblog \ liblog \ libdl \ libdl \ libgui \ libgui \ Loading media/libmediaplayerservice/nuplayer/GenericSource.cpp +73 −0 Original line number Original line Diff line number Diff line Loading @@ -32,6 +32,7 @@ #include <media/stagefright/MediaExtractor.h> #include <media/stagefright/MediaExtractor.h> #include <media/stagefright/MediaSource.h> #include <media/stagefright/MediaSource.h> #include <media/stagefright/MetaData.h> #include <media/stagefright/MetaData.h> #include "../../libstagefright/include/DRMExtractor.h" #include "../../libstagefright/include/NuCachedSource2.h" #include "../../libstagefright/include/NuCachedSource2.h" #include "../../libstagefright/include/WVMExtractor.h" #include "../../libstagefright/include/WVMExtractor.h" Loading @@ -49,6 +50,7 @@ NuPlayer::GenericSource::GenericSource( mIsWidevine(false), mIsWidevine(false), mUIDValid(uidValid), mUIDValid(uidValid), mUID(uid), mUID(uid), mDrmManagerClient(NULL), mMetaDataSize(-1ll), mMetaDataSize(-1ll), mBitrate(-1ll), mBitrate(-1ll), mPollBufferingGeneration(0) { mPollBufferingGeneration(0) { Loading @@ -57,12 +59,18 @@ NuPlayer::GenericSource::GenericSource( } } void NuPlayer::GenericSource::resetDataSource() { void NuPlayer::GenericSource::resetDataSource() { mAudioTimeUs = 0; mVideoTimeUs = 0; mHTTPService.clear(); mHTTPService.clear(); mUri.clear(); mUri.clear(); mUriHeaders.clear(); mUriHeaders.clear(); mFd = -1; mFd = -1; mOffset = 0; mOffset = 0; mLength = 0; mLength = 0; setDrmPlaybackStatusIfNeeded(Playback::STOP, 0); mDecryptHandle = NULL; mDrmManagerClient = NULL; mStarted = false; } } status_t NuPlayer::GenericSource::setDataSource( status_t NuPlayer::GenericSource::setDataSource( Loading Loading @@ -130,6 +138,10 @@ status_t NuPlayer::GenericSource::initFromDataSource() { return UNKNOWN_ERROR; return UNKNOWN_ERROR; } } if (extractor->getDrmFlag()) { checkDrmStatus(mDataSource); } sp<MetaData> fileMeta = extractor->getMetaData(); sp<MetaData> fileMeta = extractor->getMetaData(); if (fileMeta != NULL) { if (fileMeta != NULL) { int64_t duration; int64_t duration; Loading Loading @@ -203,6 +215,28 @@ status_t NuPlayer::GenericSource::initFromDataSource() { return OK; 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( status_t NuPlayer::GenericSource::setBuffers( bool audio, Vector<MediaBuffer *> &buffers) { bool audio, Vector<MediaBuffer *> &buffers) { if (mIsWidevine && !audio) { if (mIsWidevine && !audio) { Loading Loading @@ -398,6 +432,33 @@ void NuPlayer::GenericSource::start() { readBuffer(MEDIA_TRACK_TYPE_VIDEO); 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() { status_t NuPlayer::GenericSource::feedMoreTSData() { Loading Loading @@ -872,6 +933,10 @@ status_t NuPlayer::GenericSource::seekTo(int64_t seekTimeUs) { readBuffer(MEDIA_TRACK_TYPE_AUDIO, seekTimeUs); readBuffer(MEDIA_TRACK_TYPE_AUDIO, seekTimeUs); } } setDrmPlaybackStatusIfNeeded(Playback::START, seekTimeUs / 1000); if (!mStarted) { setDrmPlaybackStatusIfNeeded(Playback::PAUSE, 0); } return OK; return OK; } } Loading Loading @@ -989,6 +1054,14 @@ void NuPlayer::GenericSource::readBuffer( options.clearSeekTo(); options.clearSeekTo(); if (err == OK) { 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 changed during selection // formatChange && !seeking: track whose source is not changed during selection // formatChange && !seeking: track whose source is not changed during selection // !formatChange: normal seek // !formatChange: normal seek Loading media/libmediaplayerservice/nuplayer/GenericSource.h +13 −0 Original line number Original line Diff line number Diff line Loading @@ -27,6 +27,8 @@ namespace android { namespace android { class DecryptHandle; class DrmManagerClient; struct AnotherPacketSource; struct AnotherPacketSource; struct ARTSPController; struct ARTSPController; struct DataSource; struct DataSource; Loading @@ -49,6 +51,9 @@ struct NuPlayer::GenericSource : public NuPlayer::Source { virtual void prepareAsync(); virtual void prepareAsync(); virtual void start(); virtual void start(); virtual void stop(); virtual void pause(); virtual void resume(); virtual status_t feedMoreTSData(); virtual status_t feedMoreTSData(); Loading Loading @@ -90,7 +95,9 @@ private: }; }; Track mAudioTrack; Track mAudioTrack; int64_t mAudioTimeUs; Track mVideoTrack; Track mVideoTrack; int64_t mVideoTimeUs; Track mSubtitleTrack; Track mSubtitleTrack; Track mTimedTextTrack; Track mTimedTextTrack; Loading @@ -111,6 +118,9 @@ private: sp<DataSource> mDataSource; sp<DataSource> mDataSource; sp<NuCachedSource2> mCachedSource; sp<NuCachedSource2> mCachedSource; sp<WVMExtractor> mWVMExtractor; sp<WVMExtractor> mWVMExtractor; DrmManagerClient *mDrmManagerClient; sp<DecryptHandle> mDecryptHandle; bool mStarted; String8 mContentType; String8 mContentType; AString mSniffedMIME; AString mSniffedMIME; off64_t mMetaDataSize; off64_t mMetaDataSize; Loading @@ -122,6 +132,9 @@ private: void resetDataSource(); void resetDataSource(); status_t initFromDataSource(); status_t initFromDataSource(); void checkDrmStatus(const sp<DataSource>& dataSource); int64_t getLastReadPosition(); void setDrmPlaybackStatusIfNeeded(int playbackStatus, int64_t position); status_t prefillCacheIfNecessary(); status_t prefillCacheIfNecessary(); Loading media/libmediaplayerservice/nuplayer/NuPlayer.cpp +6 −0 Original line number Original line Diff line number Diff line Loading @@ -1915,6 +1915,12 @@ void NuPlayer::onSourceNotify(const sp<AMessage> &msg) { break; break; } } case Source::kWhatDrmNoLicense: { notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, ERROR_DRM_NO_LICENSE); break; } default: default: TRESPASS(); TRESPASS(); } } Loading media/libmediaplayerservice/nuplayer/NuPlayerSource.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -51,6 +51,7 @@ struct NuPlayer::Source : public AHandler { kWhatSubtitleData, kWhatSubtitleData, kWhatTimedTextData, kWhatTimedTextData, kWhatQueueDecoderShutdown, kWhatQueueDecoderShutdown, kWhatDrmNoLicense, }; }; // The provides message is used to notify the player about various // The provides message is used to notify the player about various Loading Loading
media/libmediaplayerservice/Android.mk +1 −0 Original line number Original line Diff line number Diff line Loading @@ -28,6 +28,7 @@ LOCAL_SHARED_LIBRARIES := \ libcamera_client \ libcamera_client \ libcrypto \ libcrypto \ libcutils \ libcutils \ libdrmframework \ liblog \ liblog \ libdl \ libdl \ libgui \ libgui \ Loading
media/libmediaplayerservice/nuplayer/GenericSource.cpp +73 −0 Original line number Original line Diff line number Diff line Loading @@ -32,6 +32,7 @@ #include <media/stagefright/MediaExtractor.h> #include <media/stagefright/MediaExtractor.h> #include <media/stagefright/MediaSource.h> #include <media/stagefright/MediaSource.h> #include <media/stagefright/MetaData.h> #include <media/stagefright/MetaData.h> #include "../../libstagefright/include/DRMExtractor.h" #include "../../libstagefright/include/NuCachedSource2.h" #include "../../libstagefright/include/NuCachedSource2.h" #include "../../libstagefright/include/WVMExtractor.h" #include "../../libstagefright/include/WVMExtractor.h" Loading @@ -49,6 +50,7 @@ NuPlayer::GenericSource::GenericSource( mIsWidevine(false), mIsWidevine(false), mUIDValid(uidValid), mUIDValid(uidValid), mUID(uid), mUID(uid), mDrmManagerClient(NULL), mMetaDataSize(-1ll), mMetaDataSize(-1ll), mBitrate(-1ll), mBitrate(-1ll), mPollBufferingGeneration(0) { mPollBufferingGeneration(0) { Loading @@ -57,12 +59,18 @@ NuPlayer::GenericSource::GenericSource( } } void NuPlayer::GenericSource::resetDataSource() { void NuPlayer::GenericSource::resetDataSource() { mAudioTimeUs = 0; mVideoTimeUs = 0; mHTTPService.clear(); mHTTPService.clear(); mUri.clear(); mUri.clear(); mUriHeaders.clear(); mUriHeaders.clear(); mFd = -1; mFd = -1; mOffset = 0; mOffset = 0; mLength = 0; mLength = 0; setDrmPlaybackStatusIfNeeded(Playback::STOP, 0); mDecryptHandle = NULL; mDrmManagerClient = NULL; mStarted = false; } } status_t NuPlayer::GenericSource::setDataSource( status_t NuPlayer::GenericSource::setDataSource( Loading Loading @@ -130,6 +138,10 @@ status_t NuPlayer::GenericSource::initFromDataSource() { return UNKNOWN_ERROR; return UNKNOWN_ERROR; } } if (extractor->getDrmFlag()) { checkDrmStatus(mDataSource); } sp<MetaData> fileMeta = extractor->getMetaData(); sp<MetaData> fileMeta = extractor->getMetaData(); if (fileMeta != NULL) { if (fileMeta != NULL) { int64_t duration; int64_t duration; Loading Loading @@ -203,6 +215,28 @@ status_t NuPlayer::GenericSource::initFromDataSource() { return OK; 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( status_t NuPlayer::GenericSource::setBuffers( bool audio, Vector<MediaBuffer *> &buffers) { bool audio, Vector<MediaBuffer *> &buffers) { if (mIsWidevine && !audio) { if (mIsWidevine && !audio) { Loading Loading @@ -398,6 +432,33 @@ void NuPlayer::GenericSource::start() { readBuffer(MEDIA_TRACK_TYPE_VIDEO); 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() { status_t NuPlayer::GenericSource::feedMoreTSData() { Loading Loading @@ -872,6 +933,10 @@ status_t NuPlayer::GenericSource::seekTo(int64_t seekTimeUs) { readBuffer(MEDIA_TRACK_TYPE_AUDIO, seekTimeUs); readBuffer(MEDIA_TRACK_TYPE_AUDIO, seekTimeUs); } } setDrmPlaybackStatusIfNeeded(Playback::START, seekTimeUs / 1000); if (!mStarted) { setDrmPlaybackStatusIfNeeded(Playback::PAUSE, 0); } return OK; return OK; } } Loading Loading @@ -989,6 +1054,14 @@ void NuPlayer::GenericSource::readBuffer( options.clearSeekTo(); options.clearSeekTo(); if (err == OK) { 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 changed during selection // formatChange && !seeking: track whose source is not changed during selection // formatChange && !seeking: track whose source is not changed during selection // !formatChange: normal seek // !formatChange: normal seek Loading
media/libmediaplayerservice/nuplayer/GenericSource.h +13 −0 Original line number Original line Diff line number Diff line Loading @@ -27,6 +27,8 @@ namespace android { namespace android { class DecryptHandle; class DrmManagerClient; struct AnotherPacketSource; struct AnotherPacketSource; struct ARTSPController; struct ARTSPController; struct DataSource; struct DataSource; Loading @@ -49,6 +51,9 @@ struct NuPlayer::GenericSource : public NuPlayer::Source { virtual void prepareAsync(); virtual void prepareAsync(); virtual void start(); virtual void start(); virtual void stop(); virtual void pause(); virtual void resume(); virtual status_t feedMoreTSData(); virtual status_t feedMoreTSData(); Loading Loading @@ -90,7 +95,9 @@ private: }; }; Track mAudioTrack; Track mAudioTrack; int64_t mAudioTimeUs; Track mVideoTrack; Track mVideoTrack; int64_t mVideoTimeUs; Track mSubtitleTrack; Track mSubtitleTrack; Track mTimedTextTrack; Track mTimedTextTrack; Loading @@ -111,6 +118,9 @@ private: sp<DataSource> mDataSource; sp<DataSource> mDataSource; sp<NuCachedSource2> mCachedSource; sp<NuCachedSource2> mCachedSource; sp<WVMExtractor> mWVMExtractor; sp<WVMExtractor> mWVMExtractor; DrmManagerClient *mDrmManagerClient; sp<DecryptHandle> mDecryptHandle; bool mStarted; String8 mContentType; String8 mContentType; AString mSniffedMIME; AString mSniffedMIME; off64_t mMetaDataSize; off64_t mMetaDataSize; Loading @@ -122,6 +132,9 @@ private: void resetDataSource(); void resetDataSource(); status_t initFromDataSource(); status_t initFromDataSource(); void checkDrmStatus(const sp<DataSource>& dataSource); int64_t getLastReadPosition(); void setDrmPlaybackStatusIfNeeded(int playbackStatus, int64_t position); status_t prefillCacheIfNecessary(); status_t prefillCacheIfNecessary(); Loading
media/libmediaplayerservice/nuplayer/NuPlayer.cpp +6 −0 Original line number Original line Diff line number Diff line Loading @@ -1915,6 +1915,12 @@ void NuPlayer::onSourceNotify(const sp<AMessage> &msg) { break; break; } } case Source::kWhatDrmNoLicense: { notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, ERROR_DRM_NO_LICENSE); break; } default: default: TRESPASS(); TRESPASS(); } } Loading
media/libmediaplayerservice/nuplayer/NuPlayerSource.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -51,6 +51,7 @@ struct NuPlayer::Source : public AHandler { kWhatSubtitleData, kWhatSubtitleData, kWhatTimedTextData, kWhatTimedTextData, kWhatQueueDecoderShutdown, kWhatQueueDecoderShutdown, kWhatDrmNoLicense, }; }; // The provides message is used to notify the player about various // The provides message is used to notify the player about various Loading