@@ -187,7 +187,8 @@ AwesomePlayer::AwesomePlayer()
187187 mExtractorFlags(0 ),
188188 mLastVideoBuffer(NULL ),
189189 mVideoBuffer(NULL ),
190- mSuspensionState(NULL ) {
190+ mSuspensionState(NULL ),
191+ mDecryptHandle(NULL ) {
191192 CHECK_EQ (mClient .connect (), OK);
192193
193194 DataSource::RegisterDefaultSniffers ();
@@ -286,6 +287,17 @@ status_t AwesomePlayer::setDataSource_l(
286287 return UNKNOWN_ERROR;
287288 }
288289
290+ dataSource->getDrmInfo (&mDecryptHandle , &mDrmManagerClient );
291+ if (mDecryptHandle != NULL ) {
292+ if (RightsStatus::RIGHTS_VALID == mDecryptHandle ->status ) {
293+ if (DecryptApiType::CONTAINER_BASED == mDecryptHandle ->decryptApiType ) {
294+ mDrmManagerClient ->consumeRights (mDecryptHandle , Action::PLAY, true );
295+ }
296+ } else {
297+ notifyListener_l (MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, ERROR_NO_LICENSE);
298+ }
299+ }
300+
289301 return setDataSource_l (extractor);
290302}
291303
@@ -316,6 +328,11 @@ status_t AwesomePlayer::setDataSource_l(const sp<MediaExtractor> &extractor) {
316328 }
317329
318330 mExtractorFlags = extractor->flags ();
331+ if (mDecryptHandle != NULL ) {
332+ if (DecryptApiType::ELEMENTARY_STREAM_BASED == mDecryptHandle ->decryptApiType ) {
333+ mDrmManagerClient ->consumeRights (mDecryptHandle , Action::PLAY, true );
334+ }
335+ }
319336
320337 return OK;
321338}
@@ -326,6 +343,15 @@ void AwesomePlayer::reset() {
326343}
327344
328345void AwesomePlayer::reset_l () {
346+ if (mDecryptHandle != NULL ) {
347+ mDrmManagerClient ->setPlaybackStatus (mDecryptHandle ,
348+ Playback::STOP, 0 );
349+ mDrmManagerClient ->consumeRights (mDecryptHandle ,
350+ Action::PLAY, false );
351+ mDecryptHandle = NULL ;
352+ mDrmManagerClient = NULL ;
353+ }
354+
329355 if (mFlags & PREPARING) {
330356 mFlags |= PREPARE_CANCELLED;
331357 if (mConnectingDataSource != NULL ) {
@@ -568,6 +594,13 @@ status_t AwesomePlayer::play_l() {
568594 seekTo_l (0 );
569595 }
570596
597+ if (mDecryptHandle != NULL ) {
598+ int64_t position;
599+ getPosition (&position);
600+ mDrmManagerClient ->setPlaybackStatus (mDecryptHandle ,
601+ Playback::START, position / 1000 );
602+ }
603+
571604 return OK;
572605}
573606
@@ -631,6 +664,11 @@ status_t AwesomePlayer::pause_l() {
631664
632665 mFlags &= ~PLAYING;
633666
667+ if (mDecryptHandle != NULL ) {
668+ mDrmManagerClient ->setPlaybackStatus (mDecryptHandle ,
669+ Playback::PAUSE, 0 );
670+ }
671+
634672 return OK;
635673}
636674
@@ -727,6 +765,13 @@ void AwesomePlayer::seekAudioIfNecessary_l() {
727765 mWatchForAudioSeekComplete = true ;
728766 mWatchForAudioEOS = true ;
729767 mSeekNotificationSent = false ;
768+
769+ if (mDecryptHandle != NULL ) {
770+ mDrmManagerClient ->setPlaybackStatus (mDecryptHandle ,
771+ Playback::PAUSE, 0 );
772+ mDrmManagerClient ->setPlaybackStatus (mDecryptHandle ,
773+ Playback::START, mSeekTimeUs / 1000 );
774+ }
730775 }
731776}
732777
@@ -919,6 +964,13 @@ void AwesomePlayer::onVideoEvent() {
919964 mFlags |= FIRST_FRAME;
920965 mSeeking = false ;
921966 mSeekNotificationSent = false ;
967+
968+ if (mDecryptHandle != NULL ) {
969+ mDrmManagerClient ->setPlaybackStatus (mDecryptHandle ,
970+ Playback::PAUSE, 0 );
971+ mDrmManagerClient ->setPlaybackStatus (mDecryptHandle ,
972+ Playback::START, timeUs / 1000 );
973+ }
922974 }
923975
924976 if (mFlags & FIRST_FRAME) {
@@ -1137,6 +1189,17 @@ status_t AwesomePlayer::finishSetDataSource_l() {
11371189 return UNKNOWN_ERROR;
11381190 }
11391191
1192+ dataSource->getDrmInfo (&mDecryptHandle , &mDrmManagerClient );
1193+ if (mDecryptHandle != NULL ) {
1194+ if (RightsStatus::RIGHTS_VALID == mDecryptHandle ->status ) {
1195+ if (DecryptApiType::CONTAINER_BASED == mDecryptHandle ->decryptApiType ) {
1196+ mDrmManagerClient ->consumeRights (mDecryptHandle , Action::PLAY, true );
1197+ }
1198+ } else {
1199+ notifyListener_l (MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, ERROR_NO_LICENSE);
1200+ }
1201+ }
1202+
11401203 if (dataSource->flags () & DataSource::kWantsPrefetching ) {
11411204 mPrefetcher = new Prefetcher;
11421205 }
0 commit comments