Index: media/base/android/media_source_player.cc |
diff --git a/media/base/android/media_source_player.cc b/media/base/android/media_source_player.cc |
index d4408b31396a02d90d20e912e1b75951d6950af6..fd52bba4662fc47d321d82835ee0cffb8d295f65 100644 |
--- a/media/base/android/media_source_player.cc |
+++ b/media/base/android/media_source_player.cc |
@@ -11,6 +11,7 @@ |
#include "base/barrier_closure.h" |
#include "base/basictypes.h" |
#include "base/bind.h" |
+#include "base/bind_helpers.h" |
#include "base/callback_helpers.h" |
#include "base/logging.h" |
#include "base/strings/string_number_conversions.h" |
@@ -39,7 +40,6 @@ MediaSourcePlayer::MediaSourcePlayer( |
interpolator_(&default_tick_clock_), |
doing_browser_seek_(false), |
pending_seek_(false), |
- drm_bridge_(NULL), |
cdm_registration_id_(0), |
is_waiting_for_key_(false), |
key_added_while_decode_pending_(false), |
@@ -69,9 +69,10 @@ MediaSourcePlayer::MediaSourcePlayer( |
MediaSourcePlayer::~MediaSourcePlayer() { |
Release(); |
- DCHECK_EQ(!drm_bridge_, !cdm_registration_id_); |
- if (drm_bridge_) { |
- drm_bridge_->UnregisterPlayer(cdm_registration_id_); |
+ DCHECK_EQ(!cdm_, !cdm_registration_id_); |
+ if (cdm_) { |
+ static_cast<MediaDrmBridge*>(cdm_.get()) |
+ ->UnregisterPlayer(cdm_registration_id_); |
cdm_registration_id_ = 0; |
} |
} |
@@ -267,13 +268,15 @@ void MediaSourcePlayer::OnMediaCryptoReady( |
bool /* needs_protected_surface */) { |
// Callback parameters are ignored in this player. They are intended for |
// MediaCodecPlayer which uses a different threading scheme. |
- DCHECK(!drm_bridge_->GetMediaCrypto().is_null()); |
+ DCHECK(!static_cast<MediaDrmBridge*>(cdm_.get())->GetMediaCrypto().is_null()); |
// Retry decoder creation if the decoders are waiting for MediaCrypto. |
RetryDecoderCreation(true, true); |
} |
-void MediaSourcePlayer::SetCdm(BrowserCdm* cdm) { |
+void MediaSourcePlayer::SetCdm(const scoped_refptr<MediaKeys>& cdm) { |
+ DCHECK(cdm); |
+ |
// Currently we don't support DRM change during the middle of playback, even |
// if the player is paused. |
// TODO(qinmin): support DRM change after playback has started. |
@@ -283,25 +286,29 @@ void MediaSourcePlayer::SetCdm(BrowserCdm* cdm) { |
<< "This is not well supported!"; |
} |
- if (drm_bridge_) { |
+ if (cdm_) { |
NOTREACHED() << "Currently we do not support resetting CDM."; |
return; |
} |
+ cdm_ = cdm; |
+ |
// Only MediaDrmBridge will be set on MediaSourcePlayer. |
- drm_bridge_ = static_cast<MediaDrmBridge*>(cdm); |
+ MediaDrmBridge* drm_bridge = static_cast<MediaDrmBridge*>(cdm_.get()); |
- cdm_registration_id_ = drm_bridge_->RegisterPlayer( |
+ // No need to set |cdm_unset_cb| since |this| holds a reference to the |cdm_|. |
+ cdm_registration_id_ = drm_bridge->RegisterPlayer( |
base::Bind(&MediaSourcePlayer::OnKeyAdded, weak_this_), |
- base::Bind(&MediaSourcePlayer::OnCdmUnset, weak_this_)); |
+ base::Bind(&base::DoNothing)); |
- audio_decoder_job_->SetDrmBridge(drm_bridge_); |
- video_decoder_job_->SetDrmBridge(drm_bridge_); |
+ audio_decoder_job_->SetDrmBridge(drm_bridge); |
+ video_decoder_job_->SetDrmBridge(drm_bridge); |
- if (drm_bridge_->GetMediaCrypto().is_null()) { |
+ if (drm_bridge->GetMediaCrypto().is_null()) { |
+ // Use BindToCurrentLoop to avoid reentrancy. |
MediaDrmBridge::MediaCryptoReadyCB cb = BindToCurrentLoop( |
base::Bind(&MediaSourcePlayer::OnMediaCryptoReady, weak_this_)); |
- drm_bridge_->SetMediaCryptoReadyCB(cb); |
+ drm_bridge->SetMediaCryptoReadyCB(cb); |
return; |
} |
@@ -835,18 +842,4 @@ void MediaSourcePlayer::ResumePlaybackAfterKeyAdded() { |
StartInternal(); |
} |
-void MediaSourcePlayer::OnCdmUnset() { |
- DVLOG(1) << __FUNCTION__; |
- DCHECK(drm_bridge_); |
- // TODO(xhwang): Currently this is only called during teardown. Support full |
- // detachment of CDM during playback. This will be needed when we start to |
- // support setMediaKeys(0) (see http://crbug.com/330324), or when we release |
- // MediaDrm when the video is paused, or when the device goes to sleep (see |
- // http://crbug.com/272421). |
- audio_decoder_job_->SetDrmBridge(NULL); |
- video_decoder_job_->SetDrmBridge(NULL); |
- cdm_registration_id_ = 0; |
- drm_bridge_ = NULL; |
-} |
- |
} // namespace media |