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 08a67450095360d70a557bf00d880160040498c6..7787d2058348c62c9825676cd42c068fabc6497a 100644 |
--- a/content/renderer/media/android/webmediaplayer_android.cc |
+++ b/content/renderer/media/android/webmediaplayer_android.cc |
@@ -41,6 +41,7 @@ |
#include "media/base/video_frame.h" |
#include "net/base/mime_util.h" |
#include "third_party/WebKit/public/platform/Platform.h" |
+#include "third_party/WebKit/public/platform/WebContentDecryptionModuleResult.h" |
#include "third_party/WebKit/public/platform/WebGraphicsContext3DProvider.h" |
#include "third_party/WebKit/public/platform/WebMediaPlayerClient.h" |
#include "third_party/WebKit/public/platform/WebString.h" |
@@ -98,6 +99,10 @@ class SyncPointClientImpl : public media::VideoFrame::SyncPointClient { |
blink::WebGraphicsContext3D* web_graphics_context_; |
}; |
+// Used for calls to decryptor_ready_cb_ where the result can be ignored. |
+void DoNothing(bool) { |
+} |
+ |
} // namespace |
namespace content { |
@@ -1387,7 +1392,7 @@ WebMediaPlayerAndroid::GenerateKeyRequestInternal( |
if (!decryptor_ready_cb_.is_null()) { |
base::ResetAndReturn(&decryptor_ready_cb_) |
- .Run(proxy_decryptor_->GetDecryptor()); |
+ .Run(proxy_decryptor_->GetDecryptor(), base::Bind(DoNothing)); |
} |
// Only browser CDMs have CDM ID. Render side CDMs (e.g. ClearKey CDM) do |
@@ -1506,13 +1511,78 @@ void WebMediaPlayerAndroid::setContentDecryptionModule( |
if (!web_cdm_) |
return; |
- if (!decryptor_ready_cb_.is_null()) |
- base::ResetAndReturn(&decryptor_ready_cb_).Run(web_cdm_->GetDecryptor()); |
+ if (!decryptor_ready_cb_.is_null()) { |
+ base::ResetAndReturn(&decryptor_ready_cb_) |
+ .Run(web_cdm_->GetDecryptor(), base::Bind(DoNothing)); |
+ } |
+ |
+ if (web_cdm_->GetCdmId() != RendererCdmManager::kInvalidCdmId) |
+ player_manager_->SetCdm(player_id_, web_cdm_->GetCdmId()); |
+} |
+ |
+void WebMediaPlayerAndroid::setContentDecryptionModule( |
+ blink::WebContentDecryptionModule* cdm, |
+ blink::WebContentDecryptionModuleResult result) { |
+ DCHECK(main_thread_checker_.CalledOnValidThread()); |
+ |
+ // TODO(xhwang): Support setMediaKeys(0) if necessary: http://crbug.com/330324 |
+ if (!cdm) { |
+ result.completeWithError( |
+ blink::WebContentDecryptionModuleExceptionNotSupportedError, |
+ 0, |
+ "Null MediaKeys object is not supported."); |
+ return; |
+ } |
+ |
+ web_cdm_ = ToWebContentDecryptionModuleImpl(cdm); |
+ DCHECK(web_cdm_); |
+ |
+ if (!decryptor_ready_cb_.is_null()) { |
+ base::ResetAndReturn(&decryptor_ready_cb_).Run( |
+ web_cdm_->GetDecryptor(), |
+ media::BindToCurrentLoop( |
+ base::Bind(&WebMediaPlayerAndroid::ContentDecryptionModuleAttached, |
+ weak_factory_.GetWeakPtr(), |
+ result))); |
+ } else { |
+ // No pipeline/decoder connected, so resolve the promise. When something |
+ // is connected, setting the CDM will happen in SetDecryptorReadyCB(). |
+ ContentDecryptionModuleAttached(result, true); |
+ } |
+ |
+ if (web_cdm_->GetCdmId() != RendererCdmManager::kInvalidCdmId) |
+ player_manager_->SetCdm(player_id_, web_cdm_->GetCdmId()); |
+} |
+ |
+void WebMediaPlayerAndroid::setContentDecryptionModuleSync( |
+ blink::WebContentDecryptionModule* cdm) { |
+ DCHECK(main_thread_checker_.CalledOnValidThread()); |
+ |
+ // TODO(xhwang): Support setMediaKeys(0) if necessary: http://crbug.com/330324 |
+ if (!cdm) |
+ return; |
+ |
+ DCHECK(decryptor_ready_cb_.is_null()); |
+ web_cdm_ = ToWebContentDecryptionModuleImpl(cdm); |
if (web_cdm_->GetCdmId() != RendererCdmManager::kInvalidCdmId) |
player_manager_->SetCdm(player_id_, web_cdm_->GetCdmId()); |
} |
+void WebMediaPlayerAndroid::ContentDecryptionModuleAttached( |
+ blink::WebContentDecryptionModuleResult result, |
+ bool success) { |
+ if (success) { |
+ result.complete(); |
+ return; |
+ } |
+ |
+ result.completeWithError( |
+ blink::WebContentDecryptionModuleExceptionNotSupportedError, |
+ 0, |
+ "Unable to set MediaKeys object"); |
+} |
+ |
void WebMediaPlayerAndroid::OnKeyAdded(const std::string& session_id) { |
EmeUMAHistogramCounts(current_key_system_, "KeyAdded", 1); |
@@ -1587,8 +1657,10 @@ void WebMediaPlayerAndroid::SetDecryptorReadyCB( |
// Cancels the previous decryptor request. |
if (decryptor_ready_cb.is_null()) { |
- if (!decryptor_ready_cb_.is_null()) |
- base::ResetAndReturn(&decryptor_ready_cb_).Run(NULL); |
+ if (!decryptor_ready_cb_.is_null()) { |
+ base::ResetAndReturn(&decryptor_ready_cb_) |
+ .Run(NULL, base::Bind(DoNothing)); |
+ } |
return; |
} |
@@ -1603,12 +1675,13 @@ void WebMediaPlayerAndroid::SetDecryptorReadyCB( |
DCHECK(!proxy_decryptor_ || !web_cdm_); |
if (proxy_decryptor_) { |
- decryptor_ready_cb.Run(proxy_decryptor_->GetDecryptor()); |
+ decryptor_ready_cb.Run(proxy_decryptor_->GetDecryptor(), |
+ base::Bind(DoNothing)); |
return; |
} |
if (web_cdm_) { |
- decryptor_ready_cb.Run(web_cdm_->GetDecryptor()); |
+ decryptor_ready_cb.Run(web_cdm_->GetDecryptor(), base::Bind(DoNothing)); |
return; |
} |