Index: content/renderer/media/webmediaplayer_impl.cc |
diff --git a/content/renderer/media/webmediaplayer_impl.cc b/content/renderer/media/webmediaplayer_impl.cc |
index 09633bde08c4e972a6b4742d67ba4a5bf90ac9bd..91fdc4e3bdc13add1abc6033d344feed55d864fb 100644 |
--- a/content/renderer/media/webmediaplayer_impl.cc |
+++ b/content/renderer/media/webmediaplayer_impl.cc |
@@ -61,6 +61,7 @@ |
#include "media/filters/video_renderer_impl.h" |
#include "media/filters/vpx_video_decoder.h" |
#include "third_party/WebKit/public/platform/WebContentDecryptionModule.h" |
+#include "third_party/WebKit/public/platform/WebContentDecryptionModuleResult.h" |
#include "third_party/WebKit/public/platform/WebMediaSource.h" |
#include "third_party/WebKit/public/platform/WebRect.h" |
#include "third_party/WebKit/public/platform/WebSize.h" |
@@ -135,6 +136,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 { |
@@ -771,7 +776,7 @@ WebMediaPlayerImpl::GenerateKeyRequestInternal(const std::string& key_system, |
if (proxy_decryptor_ && !decryptor_ready_cb_.is_null()) { |
base::ResetAndReturn(&decryptor_ready_cb_) |
- .Run(proxy_decryptor_->GetDecryptor()); |
+ .Run(proxy_decryptor_->GetDecryptor(), base::Bind(DoNothing)); |
} |
current_key_system_ = key_system; |
@@ -884,7 +889,58 @@ void WebMediaPlayerImpl::setContentDecryptionModule( |
web_cdm_ = ToWebContentDecryptionModuleImpl(cdm); |
if (web_cdm_ && !decryptor_ready_cb_.is_null()) |
- base::ResetAndReturn(&decryptor_ready_cb_).Run(web_cdm_->GetDecryptor()); |
+ base::ResetAndReturn(&decryptor_ready_cb_) |
+ .Run(web_cdm_->GetDecryptor(), base::Bind(DoNothing)); |
+} |
+ |
+void WebMediaPlayerImpl::setContentDecryptionModule( |
+ blink::WebContentDecryptionModule* cdm, |
+ blink::WebContentDecryptionModuleResult result) { |
+ DCHECK(main_loop_->BelongsToCurrentThread()); |
+ |
+ // 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); |
+ |
+ if (web_cdm_ && !decryptor_ready_cb_.is_null()) { |
+ base::ResetAndReturn(&decryptor_ready_cb_) |
+ .Run(web_cdm_->GetDecryptor(), |
+ BIND_TO_RENDER_LOOP1( |
+ &WebMediaPlayerImpl::ContentDecryptionModuleAttached, result)); |
+ } else { |
+ // No pipeline/decoder connected, so resolve the promise. When something |
+ // is connected, setting the CDM will happen in SetDecryptorReadyCB(). |
+ ContentDecryptionModuleAttached(result, true); |
+ } |
+} |
+ |
+void WebMediaPlayerImpl::setContentDecryptionModuleSync( |
+ blink::WebContentDecryptionModule* cdm) { |
+ DCHECK(main_loop_->BelongsToCurrentThread()); |
+ |
+ // Used when loading media and no pipeline/decoder attached yet. |
+ DCHECK(decryptor_ready_cb_.is_null()); |
+ |
+ web_cdm_ = ToWebContentDecryptionModuleImpl(cdm); |
+} |
+ |
+void WebMediaPlayerImpl::ContentDecryptionModuleAttached( |
+ blink::WebContentDecryptionModuleResult result, |
+ bool success) { |
+ if (success) |
+ result.complete(); |
xhwang
2014/08/09 00:56:03
nit: return early here so you don't need "else".
jrummell
2014/08/11 21:47:14
Done.
|
+ else |
+ result.completeWithError( |
+ blink::WebContentDecryptionModuleExceptionNotSupportedError, |
+ 0, |
+ "Unable to set MediaKeys object"); |
} |
void WebMediaPlayerImpl::OnPipelineSeeked(bool time_changed, |
@@ -1276,7 +1332,8 @@ void WebMediaPlayerImpl::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); |
+ base::ResetAndReturn(&decryptor_ready_cb_) |
+ .Run(NULL, base::Bind(DoNothing)); |
xhwang
2014/08/09 00:56:03
nit: usually we use {} for multiple line statement
jrummell
2014/08/11 21:47:14
If only clang-format did that when it reformats :)
|
return; |
} |
@@ -1291,12 +1348,13 @@ void WebMediaPlayerImpl::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; |
} |