Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2292)

Unified Diff: content/renderer/media/android/webmediaplayer_android.cc

Issue 1070853004: media: CdmFactory creates CDM (MediaKeys) asynchronously. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: use ScopedVector Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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_);
« no previous file with comments | « content/renderer/media/android/webmediaplayer_android.h ('k') | content/renderer/media/crypto/render_cdm_factory.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698