Chromium Code Reviews| Index: content/renderer/media/crypto/key_systems.cc |
| diff --git a/content/renderer/media/crypto/key_systems.cc b/content/renderer/media/crypto/key_systems.cc |
| index 6cd82189a2e94761b6048d6792a06841798706c5..2152378a885bc42d89d83783731f496f543224b1 100644 |
| --- a/content/renderer/media/crypto/key_systems.cc |
| +++ b/content/renderer/media/crypto/key_systems.cc |
| @@ -10,6 +10,7 @@ |
| #include "base/lazy_instance.h" |
| #include "base/logging.h" |
| #include "base/strings/string_util.h" |
| +#include "base/time/time.h" |
| #include "content/public/common/content_client.h" |
| #include "content/public/common/eme_codec.h" |
| #include "content/public/renderer/content_renderer_client.h" |
| @@ -87,6 +88,8 @@ class KeySystems { |
| public: |
| static KeySystems& GetInstance(); |
| + void UpdateIfNeeded(); |
| + |
| bool IsConcreteSupportedKeySystem(const std::string& key_system); |
| bool IsSupportedKeySystemWithMediaMimeType( |
| @@ -104,6 +107,8 @@ class KeySystems { |
| void AddCodecMask(const std::string& codec, uint32 mask); |
| private: |
| + void UpdateSupportedKeySystems(); |
| + |
| void AddConcreteSupportedKeySystems( |
| const std::vector<KeySystemInfo>& concrete_key_systems); |
| @@ -161,12 +166,15 @@ class KeySystems { |
| CodecMaskMap container_codec_masks_; |
| CodecMaskMap codec_masks_; |
| + base::Time last_update_time_; |
| + |
| DISALLOW_COPY_AND_ASSIGN(KeySystems); |
| }; |
| static base::LazyInstance<KeySystems> g_key_systems = LAZY_INSTANCE_INITIALIZER; |
| KeySystems& KeySystems::GetInstance() { |
| + g_key_systems.Get().UpdateIfNeeded(); |
| return g_key_systems.Get(); |
| } |
| @@ -187,14 +195,45 @@ KeySystems::KeySystems() { |
| codec_masks_[codec_mask.type] = codec_mask.mask; |
| } |
| + UpdateSupportedKeySystems(); |
| + |
| +#if defined(WIDEVINE_CDM_AVAILABLE) |
| + key_systems_support_uma_.AddKeySystemToReport(kWidevineKeySystem); |
| +#endif // defined(WIDEVINE_CDM_AVAILABLE) |
| +} |
| + |
| +void KeySystems::UpdateIfNeeded() { |
| +#if defined(WIDEVINE_CDM_AVAILABLE) && defined(WIDEVINE_CDM_IS_COMPONENT) |
| + if (IsConcreteSupportedKeySystem(kWidevineKeySystem)) |
| + return; |
| + |
| + // The update could involve a sync IPC to the browser process. Use a minimum |
| + // update interval to avoid unnecessary frequent IPC to the browser. |
| + static const int kMinUpdateIntervalInSeconds = 5; |
| + base::Time now = base::Time::Now(); |
| + if (now - last_update_time_ < |
| + base::TimeDelta::FromSeconds(kMinUpdateIntervalInSeconds)) { |
| + return; |
| + } |
| + |
| + UpdateSupportedKeySystems(); |
| +#endif |
| +} |
| + |
| +void KeySystems::UpdateSupportedKeySystems() { |
| + DVLOG(2) << __FUNCTION__; |
|
xhwang
2014/07/18 00:44:15
I'll remove this.
|
| + concrete_key_system_map_.clear(); |
| + parent_key_system_map_.clear(); |
| + |
| + // Build KeySystemInfo. |
| std::vector<KeySystemInfo> key_systems_info; |
| GetContentClient()->renderer()->AddKeySystems(&key_systems_info); |
| // Clear Key is always supported. |
| AddClearKey(&key_systems_info); |
| + |
| AddConcreteSupportedKeySystems(key_systems_info); |
| -#if defined(WIDEVINE_CDM_AVAILABLE) |
| - key_systems_support_uma_.AddKeySystemToReport(kWidevineKeySystem); |
| -#endif // defined(WIDEVINE_CDM_AVAILABLE) |
| + |
| + last_update_time_ = base::Time::Now(); |
| } |
| void KeySystems::AddConcreteSupportedKeySystems( |