| 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;
|
| }
|
|
|
|
|