Index: content/renderer/media/android/webmediaplayer_android.cc |
diff --git a/content/renderer/media/android/webmediaplayer_android.cc b/content/renderer/media/android/webmediaplayer_android.cc |
index a8188bd77a49452769d6976661c21222d12efd3e..77790046a0ac22889309ce8ae308e53d3728a933 100644 |
--- a/content/renderer/media/android/webmediaplayer_android.cc |
+++ b/content/renderer/media/android/webmediaplayer_android.cc |
@@ -1527,48 +1527,35 @@ WebMediaPlayerAndroid::GenerateKeyRequestInternal( |
if (!IsKeySystemSupported(key_system)) |
return WebMediaPlayer::MediaKeyExceptionKeySystemNotSupported; |
- // We do not support run-time switching between key systems for now. |
- if (current_key_system_.empty()) { |
- if (!proxy_decryptor_) { |
- proxy_decryptor_.reset(new media::ProxyDecryptor( |
- media_permission_, |
- base::Bind(&WebMediaPlayerAndroid::OnKeyAdded, |
- weak_factory_.GetWeakPtr()), |
- base::Bind(&WebMediaPlayerAndroid::OnKeyError, |
- weak_factory_.GetWeakPtr()), |
- base::Bind(&WebMediaPlayerAndroid::OnKeyMessage, |
- weak_factory_.GetWeakPtr()))); |
- } |
+ if (!proxy_decryptor_) { |
+ DCHECK(current_key_system_.empty()); |
+ proxy_decryptor_.reset(new media::ProxyDecryptor( |
+ media_permission_, base::Bind(&WebMediaPlayerAndroid::OnKeyAdded, |
+ weak_factory_.GetWeakPtr()), |
+ base::Bind(&WebMediaPlayerAndroid::OnKeyError, |
+ weak_factory_.GetWeakPtr()), |
+ base::Bind(&WebMediaPlayerAndroid::OnKeyMessage, |
+ weak_factory_.GetWeakPtr()))); |
GURL security_origin(frame_->document().securityOrigin().toString()); |
- if (!proxy_decryptor_->InitializeCDM(cdm_factory_, key_system, |
- security_origin)) { |
- return WebMediaPlayer::MediaKeyExceptionKeySystemNotSupported; |
- } |
- |
- // Set the CDM onto the media player. |
- cdm_context_ = proxy_decryptor_->GetCdmContext(); |
- |
- if (is_player_initialized_) |
- SetCdmInternal(base::Bind(&media::IgnoreCdmAttached)); |
- |
+ proxy_decryptor_->CreateCdm( |
+ cdm_factory_, key_system, security_origin, |
+ base::Bind(&WebMediaPlayerAndroid::OnCdmContextReady, |
+ weak_factory_.GetWeakPtr())); |
current_key_system_ = key_system; |
- } else if (key_system != current_key_system_) { |
- return WebMediaPlayer::MediaKeyExceptionInvalidPlayerState; |
} |
+ // We do not support run-time switching between key systems for now. |
+ DCHECK(!current_key_system_.empty()); |
+ if (key_system != current_key_system_) |
+ return WebMediaPlayer::MediaKeyExceptionInvalidPlayerState; |
+ |
media::EmeInitDataType init_data_type = init_data_type_; |
if (init_data_type == media::EmeInitDataType::UNKNOWN) |
init_data_type = GuessInitDataType(init_data, init_data_length); |
- // TODO(xhwang): We assume all streams are from the same container (thus have |
- // the same "type") for now. In the future, the "type" should be passed down |
- // from the application. |
- if (!proxy_decryptor_->GenerateKeyRequest( |
- init_data_type, init_data, init_data_length)) { |
- current_key_system_.clear(); |
- return WebMediaPlayer::MediaKeyExceptionKeySystemNotSupported; |
- } |
+ proxy_decryptor_->GenerateKeyRequest(init_data_type, init_data, |
+ init_data_length); |
return WebMediaPlayer::MediaKeyExceptionNoError; |
} |
@@ -1772,6 +1759,20 @@ void WebMediaPlayerAndroid::OnWaitingForDecryptionKey() { |
client_->didResumePlaybackBlockedForKey(); |
} |
+void WebMediaPlayerAndroid::OnCdmContextReady(media::CdmContext* cdm_context) { |
+ DCHECK(!cdm_context_); |
+ |
+ if (!cdm_context) { |
+ LOG(ERROR) << "CdmContext not available (e.g. CDM creation failed)."; |
+ return; |
+ } |
+ |
+ cdm_context_ = cdm_context; |
+ |
+ if (is_player_initialized_) |
+ SetCdmInternal(base::Bind(&media::IgnoreCdmAttached)); |
+} |
+ |
void WebMediaPlayerAndroid::SetCdmInternal( |
const media::CdmAttachedCB& cdm_attached_cb) { |
DCHECK(cdm_context_ && is_player_initialized_); |