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

Unified Diff: content/renderer/media/webmediaplayer_impl.cc

Issue 501473003: Move EME code out of WebMediaPlayerImpl. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Make lint happy Created 6 years, 4 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/webmediaplayer_impl.cc
diff --git a/content/renderer/media/webmediaplayer_impl.cc b/content/renderer/media/webmediaplayer_impl.cc
index 9d516c92da29b3a0af13cd04e8743e569bcc6d84..5522942366ab1ba20f5f9d0779865c5f3ef3c6d5 100644
--- a/content/renderer/media/webmediaplayer_impl.cc
+++ b/content/renderer/media/webmediaplayer_impl.cc
@@ -18,25 +18,21 @@
#include "base/debug/trace_event.h"
#include "base/message_loop/message_loop_proxy.h"
#include "base/metrics/histogram.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/utf_string_conversions.h"
#include "base/synchronization/waitable_event.h"
#include "cc/blink/web_layer_impl.h"
#include "cc/layers/video_layer.h"
#include "content/public/common/content_switches.h"
#include "content/public/renderer/render_frame.h"
#include "content/renderer/media/buffered_data_source.h"
-#include "content/renderer/media/crypto/key_systems.h"
+#include "content/renderer/media/crypto/encrypted_media_support.h"
#include "content/renderer/media/render_media_log.h"
#include "content/renderer/media/texttrack_impl.h"
#include "content/renderer/media/webaudiosourceprovider_impl.h"
-#include "content/renderer/media/webcontentdecryptionmodule_impl.h"
#include "content/renderer/media/webinbandtexttrack_impl.h"
#include "content/renderer/media/webmediaplayer_delegate.h"
#include "content/renderer/media/webmediaplayer_params.h"
#include "content/renderer/media/webmediaplayer_util.h"
#include "content/renderer/media/webmediasource_impl.h"
-#include "content/renderer/pepper/pepper_webplugin_impl.h"
#include "content/renderer/render_thread_impl.h"
#include "gpu/GLES2/gl2extchromium.h"
#include "gpu/command_buffer/common/mailbox_holder.h"
@@ -60,24 +56,16 @@
#include "media/filters/opus_audio_decoder.h"
#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"
#include "third_party/WebKit/public/platform/WebString.h"
#include "third_party/WebKit/public/platform/WebURL.h"
-#include "third_party/WebKit/public/web/WebDocument.h"
#include "third_party/WebKit/public/web/WebLocalFrame.h"
-#include "third_party/WebKit/public/web/WebRuntimeFeatures.h"
#include "third_party/WebKit/public/web/WebSecurityOrigin.h"
#include "third_party/WebKit/public/web/WebView.h"
#include "v8/include/v8.h"
-#if defined(ENABLE_PEPPER_CDMS)
-#include "content/renderer/media/crypto/pepper_cdm_wrapper_impl.h"
-#endif
-
using blink::WebCanvas;
using blink::WebMediaPlayer;
using blink::WebRect;
@@ -116,9 +104,6 @@ const int kPlayerExtraMemory = 1024 * 1024;
const double kMinRate = 0.0625;
const double kMaxRate = 16.0;
-// Prefix for histograms related to Encrypted Media Extensions.
-const char* kMediaEme = "Media.EME.";
-
class SyncPointClientImpl : public media::VideoFrame::SyncPointClient {
public:
explicit SyncPointClientImpl(
@@ -136,10 +121,6 @@ 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 {
@@ -206,7 +187,7 @@ WebMediaPlayerImpl::WebMediaPlayerImpl(
BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNaturalSizeChanged),
BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnOpacityChanged))),
text_track_index_(0),
- web_cdm_(NULL) {
+ encrypted_media_support_(EncryptedMediaSupport::create(client)) {
media_log_->AddEvent(
media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_CREATED));
@@ -656,152 +637,17 @@ bool WebMediaPlayerImpl::copyVideoTextureToPlatformTexture(
return true;
}
-// Helper functions to report media EME related stats to UMA. They follow the
-// convention of more commonly used macros UMA_HISTOGRAM_ENUMERATION and
-// UMA_HISTOGRAM_COUNTS. The reason that we cannot use those macros directly is
-// that UMA_* macros require the names to be constant throughout the process'
-// lifetime.
-static void EmeUMAHistogramEnumeration(const std::string& key_system,
- const std::string& method,
- int sample,
- int boundary_value) {
- base::LinearHistogram::FactoryGet(
- kMediaEme + KeySystemNameForUMA(key_system) + "." + method,
- 1, boundary_value, boundary_value + 1,
- base::Histogram::kUmaTargetedHistogramFlag)->Add(sample);
-}
-
-static void EmeUMAHistogramCounts(const std::string& key_system,
- const std::string& method,
- int sample) {
- // Use the same parameters as UMA_HISTOGRAM_COUNTS.
- base::Histogram::FactoryGet(
- kMediaEme + KeySystemNameForUMA(key_system) + "." + method,
- 1, 1000000, 50, base::Histogram::kUmaTargetedHistogramFlag)->Add(sample);
-}
-
-// Helper enum for reporting generateKeyRequest/addKey histograms.
-enum MediaKeyException {
- kUnknownResultId,
- kSuccess,
- kKeySystemNotSupported,
- kInvalidPlayerState,
- kMaxMediaKeyException
-};
-
-static MediaKeyException MediaKeyExceptionForUMA(
- WebMediaPlayer::MediaKeyException e) {
- switch (e) {
- case WebMediaPlayer::MediaKeyExceptionKeySystemNotSupported:
- return kKeySystemNotSupported;
- case WebMediaPlayer::MediaKeyExceptionInvalidPlayerState:
- return kInvalidPlayerState;
- case WebMediaPlayer::MediaKeyExceptionNoError:
- return kSuccess;
- default:
- return kUnknownResultId;
- }
-}
-
-// Helper for converting |key_system| name and exception |e| to a pair of enum
-// values from above, for reporting to UMA.
-static void ReportMediaKeyExceptionToUMA(const std::string& method,
- const std::string& key_system,
- WebMediaPlayer::MediaKeyException e) {
- MediaKeyException result_id = MediaKeyExceptionForUMA(e);
- DCHECK_NE(result_id, kUnknownResultId) << e;
- EmeUMAHistogramEnumeration(
- key_system, method, result_id, kMaxMediaKeyException);
-}
-
-// Convert a WebString to ASCII, falling back on an empty string in the case
-// of a non-ASCII string.
-static std::string ToASCIIOrEmpty(const blink::WebString& string) {
- return base::IsStringASCII(string) ? base::UTF16ToASCII(string)
- : std::string();
-}
-
WebMediaPlayer::MediaKeyException
WebMediaPlayerImpl::generateKeyRequest(const WebString& key_system,
const unsigned char* init_data,
unsigned init_data_length) {
- DVLOG(1) << "generateKeyRequest: " << base::string16(key_system) << ": "
- << std::string(reinterpret_cast<const char*>(init_data),
- static_cast<size_t>(init_data_length));
-
- std::string ascii_key_system =
- GetUnprefixedKeySystemName(ToASCIIOrEmpty(key_system));
-
- WebMediaPlayer::MediaKeyException e =
- GenerateKeyRequestInternal(ascii_key_system, init_data, init_data_length);
- ReportMediaKeyExceptionToUMA("generateKeyRequest", ascii_key_system, e);
- return e;
-}
-
-// Guess the type of |init_data|. This is only used to handle some corner cases
-// so we keep it as simple as possible without breaking major use cases.
-static std::string GuessInitDataType(const unsigned char* init_data,
- unsigned init_data_length) {
- // Most WebM files use KeyId of 16 bytes. MP4 init data are always >16 bytes.
- if (init_data_length == 16)
- return "video/webm";
-
- return "video/mp4";
-}
-
-WebMediaPlayer::MediaKeyException
-WebMediaPlayerImpl::GenerateKeyRequestInternal(const std::string& key_system,
- const unsigned char* init_data,
- unsigned init_data_length) {
DCHECK(main_loop_->BelongsToCurrentThread());
- if (!IsConcreteSupportedKeySystem(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 ProxyDecryptor(
-#if defined(ENABLE_PEPPER_CDMS)
- // Create() must be called synchronously as |frame_| may not be
- // valid afterwards.
- base::Bind(&PepperCdmWrapperImpl::Create, frame_),
-#elif defined(ENABLE_BROWSER_CDMS)
-#error Browser side CDM in WMPI for prefixed EME API not supported yet.
-#endif
- BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnKeyAdded),
- BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnKeyError),
- BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnKeyMessage)));
- }
-
- GURL security_origin(frame_->document().securityOrigin().toString());
- if (!proxy_decryptor_->InitializeCDM(key_system, security_origin))
- return WebMediaPlayer::MediaKeyExceptionKeySystemNotSupported;
-
- if (proxy_decryptor_ && !decryptor_ready_cb_.is_null()) {
- base::ResetAndReturn(&decryptor_ready_cb_)
- .Run(proxy_decryptor_->GetDecryptor(), base::Bind(DoNothing));
- }
+ if (!encrypted_media_support_)
ddorwin 2014/08/22 21:08:48 Is this possible given line 190? Ditto below.
acolwell GONE FROM CHROMIUM 2014/08/22 23:20:22 Yes. That was the idea, but now that I think of it
+ return MediaKeyExceptionInvalidPlayerState;
- current_key_system_ = key_system;
- } else if (key_system != current_key_system_) {
- return WebMediaPlayer::MediaKeyExceptionInvalidPlayerState;
- }
-
- std::string init_data_type = init_data_type_;
- if (init_data_type.empty())
- 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;
- }
-
- return WebMediaPlayer::MediaKeyExceptionNoError;
+ return encrypted_media_support_->generateKeyRequest(
+ frame_, key_system, init_data, init_data_length);
}
WebMediaPlayer::MediaKeyException WebMediaPlayerImpl::addKey(
@@ -811,90 +657,34 @@ WebMediaPlayer::MediaKeyException WebMediaPlayerImpl::addKey(
const unsigned char* init_data,
unsigned init_data_length,
const WebString& session_id) {
- DVLOG(1) << "addKey: " << base::string16(key_system) << ": "
- << std::string(reinterpret_cast<const char*>(key),
- static_cast<size_t>(key_length)) << ", "
- << std::string(reinterpret_cast<const char*>(init_data),
- static_cast<size_t>(init_data_length)) << " ["
- << base::string16(session_id) << "]";
-
- std::string ascii_key_system =
- GetUnprefixedKeySystemName(ToASCIIOrEmpty(key_system));
- std::string ascii_session_id = ToASCIIOrEmpty(session_id);
-
- WebMediaPlayer::MediaKeyException e = AddKeyInternal(ascii_key_system,
- key,
- key_length,
- init_data,
- init_data_length,
- ascii_session_id);
- ReportMediaKeyExceptionToUMA("addKey", ascii_key_system, e);
- return e;
-}
-
-WebMediaPlayer::MediaKeyException WebMediaPlayerImpl::AddKeyInternal(
- const std::string& key_system,
- const unsigned char* key,
- unsigned key_length,
- const unsigned char* init_data,
- unsigned init_data_length,
- const std::string& session_id) {
- DCHECK(key);
- DCHECK_GT(key_length, 0u);
-
- if (!IsConcreteSupportedKeySystem(key_system))
- return WebMediaPlayer::MediaKeyExceptionKeySystemNotSupported;
+ DCHECK(main_loop_->BelongsToCurrentThread());
- if (current_key_system_.empty() || key_system != current_key_system_)
- return WebMediaPlayer::MediaKeyExceptionInvalidPlayerState;
+ if (!encrypted_media_support_)
+ return MediaKeyExceptionInvalidPlayerState;
- proxy_decryptor_->AddKey(
- key, key_length, init_data, init_data_length, session_id);
- return WebMediaPlayer::MediaKeyExceptionNoError;
+ return encrypted_media_support_->addKey(
+ key_system, key, key_length, init_data, init_data_length, session_id);
}
WebMediaPlayer::MediaKeyException WebMediaPlayerImpl::cancelKeyRequest(
const WebString& key_system,
const WebString& session_id) {
- DVLOG(1) << "cancelKeyRequest: " << base::string16(key_system) << ": "
- << " [" << base::string16(session_id) << "]";
-
- std::string ascii_key_system =
- GetUnprefixedKeySystemName(ToASCIIOrEmpty(key_system));
- std::string ascii_session_id = ToASCIIOrEmpty(session_id);
-
- WebMediaPlayer::MediaKeyException e =
- CancelKeyRequestInternal(ascii_key_system, ascii_session_id);
- ReportMediaKeyExceptionToUMA("cancelKeyRequest", ascii_key_system, e);
- return e;
-}
-
-WebMediaPlayer::MediaKeyException WebMediaPlayerImpl::CancelKeyRequestInternal(
- const std::string& key_system,
- const std::string& session_id) {
- if (!IsConcreteSupportedKeySystem(key_system))
- return WebMediaPlayer::MediaKeyExceptionKeySystemNotSupported;
+ DCHECK(main_loop_->BelongsToCurrentThread());
- if (current_key_system_.empty() || key_system != current_key_system_)
- return WebMediaPlayer::MediaKeyExceptionInvalidPlayerState;
+ if (!encrypted_media_support_)
+ return MediaKeyExceptionInvalidPlayerState;
- proxy_decryptor_->CancelKeyRequest(session_id);
- return WebMediaPlayer::MediaKeyExceptionNoError;
+ return encrypted_media_support_->cancelKeyRequest(key_system, session_id);
}
void WebMediaPlayerImpl::setContentDecryptionModule(
blink::WebContentDecryptionModule* cdm) {
DCHECK(main_loop_->BelongsToCurrentThread());
- // TODO(xhwang): Support setMediaKeys(0) if necessary: http://crbug.com/330324
- if (!cdm)
+ if (!encrypted_media_support_)
return;
- web_cdm_ = ToWebContentDecryptionModuleImpl(cdm);
-
- if (web_cdm_ && !decryptor_ready_cb_.is_null())
- base::ResetAndReturn(&decryptor_ready_cb_)
- .Run(web_cdm_->GetDecryptor(), base::Bind(DoNothing));
+ encrypted_media_support_->setContentDecryptionModule(cdm);
}
void WebMediaPlayerImpl::setContentDecryptionModule(
@@ -902,51 +692,20 @@ void WebMediaPlayerImpl::setContentDecryptionModule(
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.");
+ if (!encrypted_media_support_)
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);
- }
+ encrypted_media_support_->setContentDecryptionModule(cdm, result);
}
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();
+ if (!encrypted_media_support_)
return;
- }
- result.completeWithError(
- blink::WebContentDecryptionModuleExceptionNotSupportedError,
- 0,
- "Unable to set MediaKeys object");
+ encrypted_media_support_->setContentDecryptionModuleSync(cdm);
}
void WebMediaPlayerImpl::OnPipelineSeeked(bool time_changed,
@@ -991,8 +750,8 @@ void WebMediaPlayerImpl::OnPipelineError(PipelineStatus error) {
SetNetworkState(PipelineErrorToNetworkState(error));
- if (error == media::PIPELINE_ERROR_DECRYPT)
- EmeUMAHistogramCounts(current_key_system_, "DecryptError", 1);
+ if (error == media::PIPELINE_ERROR_DECRYPT && encrypted_media_support_)
+ encrypted_media_support_->OnDecryptError();
}
void WebMediaPlayerImpl::OnPipelineMetadata(
@@ -1047,35 +806,6 @@ void WebMediaPlayerImpl::OnDemuxerOpened() {
chunk_demuxer_, base::Bind(&LogMediaSourceError, media_log_)));
}
-void WebMediaPlayerImpl::OnKeyAdded(const std::string& session_id) {
- DCHECK(main_loop_->BelongsToCurrentThread());
- EmeUMAHistogramCounts(current_key_system_, "KeyAdded", 1);
- client_->keyAdded(
- WebString::fromUTF8(GetPrefixedKeySystemName(current_key_system_)),
- WebString::fromUTF8(session_id));
-}
-
-void WebMediaPlayerImpl::OnNeedKey(const std::string& type,
- const std::vector<uint8>& init_data) {
- DCHECK(main_loop_->BelongsToCurrentThread());
-
- // Do not fire NeedKey event if encrypted media is not enabled.
- if (!blink::WebRuntimeFeatures::isPrefixedEncryptedMediaEnabled() &&
- !blink::WebRuntimeFeatures::isEncryptedMediaEnabled()) {
- return;
- }
-
- UMA_HISTOGRAM_COUNTS(kMediaEme + std::string("NeedKey"), 1);
-
- DCHECK(init_data_type_.empty() || type.empty() || type == init_data_type_);
- if (init_data_type_.empty())
- init_data_type_ = type;
-
- const uint8* init_data_ptr = init_data.empty() ? NULL : &init_data[0];
- client_->keyNeeded(
- WebString::fromUTF8(type), init_data_ptr, init_data.size());
-}
-
void WebMediaPlayerImpl::OnAddTextTrack(
const media::TextTrackConfig& config,
const media::AddTextTrackDoneCB& done_cb) {
@@ -1100,44 +830,6 @@ void WebMediaPlayerImpl::OnAddTextTrack(
done_cb.Run(text_track.Pass());
}
-void WebMediaPlayerImpl::OnKeyError(const std::string& session_id,
- media::MediaKeys::KeyError error_code,
- uint32 system_code) {
- DCHECK(main_loop_->BelongsToCurrentThread());
-
- EmeUMAHistogramEnumeration(current_key_system_, "KeyError",
- error_code, media::MediaKeys::kMaxKeyError);
-
- unsigned short short_system_code = 0;
- if (system_code > std::numeric_limits<unsigned short>::max()) {
- LOG(WARNING) << "system_code exceeds unsigned short limit.";
- short_system_code = std::numeric_limits<unsigned short>::max();
- } else {
- short_system_code = static_cast<unsigned short>(system_code);
- }
-
- client_->keyError(
- WebString::fromUTF8(GetPrefixedKeySystemName(current_key_system_)),
- WebString::fromUTF8(session_id),
- static_cast<blink::WebMediaPlayerClient::MediaKeyErrorCode>(error_code),
- short_system_code);
-}
-
-void WebMediaPlayerImpl::OnKeyMessage(const std::string& session_id,
- const std::vector<uint8>& message,
- const GURL& destination_url) {
- DCHECK(main_loop_->BelongsToCurrentThread());
-
- DCHECK(destination_url.is_empty() || destination_url.is_valid());
-
- client_->keyMessage(
- WebString::fromUTF8(GetPrefixedKeySystemName(current_key_system_)),
- WebString::fromUTF8(session_id),
- message.empty() ? NULL : &message[0],
- message.size(),
- destination_url);
-}
-
void WebMediaPlayerImpl::DataSourceInitialized(bool success) {
DCHECK(main_loop_->BelongsToCurrentThread());
@@ -1169,6 +861,10 @@ void WebMediaPlayerImpl::StartPipeline() {
(load_type_ == LoadTypeMediaSource));
media::LogCB mse_log_cb;
+ media::Demuxer::NeedKeyCB need_key_cb;
+
+ if (encrypted_media_support_)
+ need_key_cb = encrypted_media_support_->CreateNeedKeyCB();
// Figure out which demuxer to use.
if (load_type_ != LoadTypeMediaSource) {
@@ -1177,7 +873,7 @@ void WebMediaPlayerImpl::StartPipeline() {
demuxer_.reset(new media::FFmpegDemuxer(
media_loop_, data_source_.get(),
- BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNeedKey),
+ need_key_cb,
media_log_));
} else {
DCHECK(!chunk_demuxer_);
@@ -1187,7 +883,7 @@ void WebMediaPlayerImpl::StartPipeline() {
chunk_demuxer_ = new media::ChunkDemuxer(
BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDemuxerOpened),
- BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNeedKey),
+ need_key_cb,
mse_log_cb,
true);
demuxer_.reset(chunk_demuxer_);
@@ -1197,8 +893,12 @@ void WebMediaPlayerImpl::StartPipeline() {
new media::FilterCollection());
filter_collection->SetDemuxer(demuxer_.get());
- media::SetDecryptorReadyCB set_decryptor_ready_cb =
- BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::SetDecryptorReadyCB);
+ media::SetDecryptorReadyCB set_decryptor_ready_cb;
+
+ if (encrypted_media_support_) {
+ set_decryptor_ready_cb =
+ encrypted_media_support_->CreateSetDecryptorReadyCB();
+ }
// Create our audio decoders and renderer.
ScopedVector<media::AudioDecoder> audio_decoders;
@@ -1339,43 +1039,6 @@ void WebMediaPlayerImpl::FrameReady(
frame));
}
-void WebMediaPlayerImpl::SetDecryptorReadyCB(
- const media::DecryptorReadyCB& decryptor_ready_cb) {
- DCHECK(main_loop_->BelongsToCurrentThread());
-
- // 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::Bind(DoNothing));
- }
- return;
- }
-
- // TODO(xhwang): Support multiple decryptor notification request (e.g. from
- // video and audio). The current implementation is okay for the current
- // media pipeline since we initialize audio and video decoders in sequence.
- // But WebMediaPlayerImpl should not depend on media pipeline's implementation
- // detail.
- DCHECK(decryptor_ready_cb_.is_null());
-
- // Mixed use of prefixed and unprefixed EME APIs is disallowed by Blink.
- DCHECK(!proxy_decryptor_ || !web_cdm_);
-
- if (proxy_decryptor_) {
- decryptor_ready_cb.Run(proxy_decryptor_->GetDecryptor(),
- base::Bind(DoNothing));
- return;
- }
-
- if (web_cdm_) {
- decryptor_ready_cb.Run(web_cdm_->GetDecryptor(), base::Bind(DoNothing));
- return;
- }
-
- decryptor_ready_cb_ = decryptor_ready_cb;
-}
-
static void GetCurrentFrameAndSignal(
VideoFrameCompositor* compositor,
scoped_refptr<media::VideoFrame>* video_frame_out,

Powered by Google App Engine
This is Rietveld 408576698