Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/renderer/media/crypto/key_systems.h" | 5 #include "content/renderer/media/crypto/key_systems.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/containers/hash_tables.h" | 9 #include "base/containers/hash_tables.h" |
| 10 #include "base/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
| 11 #include "base/logging.h" | 11 #include "base/logging.h" |
| 12 #include "base/strings/string_util.h" | 12 #include "base/strings/string_util.h" |
| 13 #include "base/time/time.h" | |
| 13 #include "content/public/common/content_client.h" | 14 #include "content/public/common/content_client.h" |
| 14 #include "content/public/common/eme_codec.h" | 15 #include "content/public/common/eme_codec.h" |
| 15 #include "content/public/renderer/content_renderer_client.h" | 16 #include "content/public/renderer/content_renderer_client.h" |
| 16 #include "content/public/renderer/key_system_info.h" | 17 #include "content/public/renderer/key_system_info.h" |
| 17 #include "content/renderer/media/crypto/key_systems_support_uma.h" | 18 #include "content/renderer/media/crypto/key_systems_support_uma.h" |
| 18 | 19 |
| 19 #if defined(OS_ANDROID) | 20 #if defined(OS_ANDROID) |
| 20 #include "media/base/android/media_codec_bridge.h" | 21 #include "media/base/android/media_codec_bridge.h" |
| 21 #endif | 22 #endif |
| 22 | 23 |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 80 | 81 |
| 81 info.use_aes_decryptor = true; | 82 info.use_aes_decryptor = true; |
| 82 | 83 |
| 83 concrete_key_systems->push_back(info); | 84 concrete_key_systems->push_back(info); |
| 84 } | 85 } |
| 85 | 86 |
| 86 class KeySystems { | 87 class KeySystems { |
| 87 public: | 88 public: |
| 88 static KeySystems& GetInstance(); | 89 static KeySystems& GetInstance(); |
| 89 | 90 |
| 91 void UpdateIfNeeded(); | |
| 92 | |
| 90 bool IsConcreteSupportedKeySystem(const std::string& key_system); | 93 bool IsConcreteSupportedKeySystem(const std::string& key_system); |
| 91 | 94 |
| 92 bool IsSupportedKeySystemWithMediaMimeType( | 95 bool IsSupportedKeySystemWithMediaMimeType( |
| 93 const std::string& mime_type, | 96 const std::string& mime_type, |
| 94 const std::vector<std::string>& codecs, | 97 const std::vector<std::string>& codecs, |
| 95 const std::string& key_system); | 98 const std::string& key_system); |
| 96 | 99 |
| 97 bool UseAesDecryptor(const std::string& concrete_key_system); | 100 bool UseAesDecryptor(const std::string& concrete_key_system); |
| 98 | 101 |
| 99 #if defined(ENABLE_PEPPER_CDMS) | 102 #if defined(ENABLE_PEPPER_CDMS) |
| 100 std::string GetPepperType(const std::string& concrete_key_system); | 103 std::string GetPepperType(const std::string& concrete_key_system); |
| 101 #endif | 104 #endif |
| 102 | 105 |
| 103 void AddContainerMask(const std::string& container, uint32 mask); | 106 void AddContainerMask(const std::string& container, uint32 mask); |
| 104 void AddCodecMask(const std::string& codec, uint32 mask); | 107 void AddCodecMask(const std::string& codec, uint32 mask); |
| 105 | 108 |
| 106 private: | 109 private: |
| 110 void UpdateSupportedKeySystems(); | |
| 111 | |
| 107 void AddConcreteSupportedKeySystems( | 112 void AddConcreteSupportedKeySystems( |
| 108 const std::vector<KeySystemInfo>& concrete_key_systems); | 113 const std::vector<KeySystemInfo>& concrete_key_systems); |
| 109 | 114 |
| 110 void AddConcreteSupportedKeySystem( | 115 void AddConcreteSupportedKeySystem( |
| 111 const std::string& key_system, | 116 const std::string& key_system, |
| 112 bool use_aes_decryptor, | 117 bool use_aes_decryptor, |
| 113 #if defined(ENABLE_PEPPER_CDMS) | 118 #if defined(ENABLE_PEPPER_CDMS) |
| 114 const std::string& pepper_type, | 119 const std::string& pepper_type, |
| 115 #endif | 120 #endif |
| 116 SupportedCodecs supported_codecs, | 121 SupportedCodecs supported_codecs, |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 154 | 159 |
| 155 // Map from parent key system to the concrete key system that should be used | 160 // Map from parent key system to the concrete key system that should be used |
| 156 // to represent its capabilities. | 161 // to represent its capabilities. |
| 157 ParentKeySystemMap parent_key_system_map_; | 162 ParentKeySystemMap parent_key_system_map_; |
| 158 | 163 |
| 159 KeySystemsSupportUMA key_systems_support_uma_; | 164 KeySystemsSupportUMA key_systems_support_uma_; |
| 160 | 165 |
| 161 CodecMaskMap container_codec_masks_; | 166 CodecMaskMap container_codec_masks_; |
| 162 CodecMaskMap codec_masks_; | 167 CodecMaskMap codec_masks_; |
| 163 | 168 |
| 169 base::Time last_update_time_; | |
| 170 | |
| 164 DISALLOW_COPY_AND_ASSIGN(KeySystems); | 171 DISALLOW_COPY_AND_ASSIGN(KeySystems); |
| 165 }; | 172 }; |
| 166 | 173 |
| 167 static base::LazyInstance<KeySystems> g_key_systems = LAZY_INSTANCE_INITIALIZER; | 174 static base::LazyInstance<KeySystems> g_key_systems = LAZY_INSTANCE_INITIALIZER; |
| 168 | 175 |
| 169 KeySystems& KeySystems::GetInstance() { | 176 KeySystems& KeySystems::GetInstance() { |
| 177 g_key_systems.Get().UpdateIfNeeded(); | |
|
ddorwin
2014/07/18 19:57:21
Get() is not "free": https://code.google.com/p/chr
xhwang
2014/07/19 00:58:08
Done.
| |
| 170 return g_key_systems.Get(); | 178 return g_key_systems.Get(); |
| 171 } | 179 } |
| 172 | 180 |
| 173 // Because we use a LazyInstance, the key systems info must be populated when | 181 // Because we use a LazyInstance, the key systems info must be populated when |
| 174 // the instance is lazily initiated. | 182 // the instance is lazily initiated. |
| 175 KeySystems::KeySystems() { | 183 KeySystems::KeySystems() { |
| 176 // Build container and codec masks for quick look up. | 184 // Build container and codec masks for quick look up. |
| 177 for (size_t i = 0; i < arraysize(kContainerCodecMasks); ++i) { | 185 for (size_t i = 0; i < arraysize(kContainerCodecMasks); ++i) { |
| 178 const CodecMask& container_codec_mask = kContainerCodecMasks[i]; | 186 const CodecMask& container_codec_mask = kContainerCodecMasks[i]; |
| 179 DCHECK(container_codec_masks_.find(container_codec_mask.type) == | 187 DCHECK(container_codec_masks_.find(container_codec_mask.type) == |
| 180 container_codec_masks_.end()); | 188 container_codec_masks_.end()); |
| 181 container_codec_masks_[container_codec_mask.type] = | 189 container_codec_masks_[container_codec_mask.type] = |
| 182 container_codec_mask.mask; | 190 container_codec_mask.mask; |
| 183 } | 191 } |
| 184 for (size_t i = 0; i < arraysize(kCodecMasks); ++i) { | 192 for (size_t i = 0; i < arraysize(kCodecMasks); ++i) { |
| 185 const CodecMask& codec_mask = kCodecMasks[i]; | 193 const CodecMask& codec_mask = kCodecMasks[i]; |
| 186 DCHECK(codec_masks_.find(codec_mask.type) == codec_masks_.end()); | 194 DCHECK(codec_masks_.find(codec_mask.type) == codec_masks_.end()); |
| 187 codec_masks_[codec_mask.type] = codec_mask.mask; | 195 codec_masks_[codec_mask.type] = codec_mask.mask; |
| 188 } | 196 } |
| 189 | 197 |
| 190 std::vector<KeySystemInfo> key_systems_info; | 198 UpdateSupportedKeySystems(); |
| 191 GetContentClient()->renderer()->AddKeySystems(&key_systems_info); | 199 |
| 192 // Clear Key is always supported. | |
| 193 AddClearKey(&key_systems_info); | |
| 194 AddConcreteSupportedKeySystems(key_systems_info); | |
| 195 #if defined(WIDEVINE_CDM_AVAILABLE) | 200 #if defined(WIDEVINE_CDM_AVAILABLE) |
| 196 key_systems_support_uma_.AddKeySystemToReport(kWidevineKeySystem); | 201 key_systems_support_uma_.AddKeySystemToReport(kWidevineKeySystem); |
| 197 #endif // defined(WIDEVINE_CDM_AVAILABLE) | 202 #endif // defined(WIDEVINE_CDM_AVAILABLE) |
| 198 } | 203 } |
| 199 | 204 |
| 205 void KeySystems::UpdateIfNeeded() { | |
| 206 #if defined(WIDEVINE_CDM_AVAILABLE) && defined(WIDEVINE_CDM_IS_COMPONENT) | |
| 207 if (IsConcreteSupportedKeySystem(kWidevineKeySystem)) | |
|
ddorwin
2014/07/18 19:57:21
Technically, we don't need to do this unless the r
xhwang
2014/07/19 00:58:08
Done.
| |
| 208 return; | |
| 209 | |
| 210 // The update could involve a sync IPC to the browser process. Use a minimum | |
| 211 // update interval to avoid unnecessary frequent IPC to the browser. | |
| 212 static const int kMinUpdateIntervalInSeconds = 5; | |
| 213 base::Time now = base::Time::Now(); | |
| 214 if (now - last_update_time_ < | |
| 215 base::TimeDelta::FromSeconds(kMinUpdateIntervalInSeconds)) { | |
| 216 return; | |
| 217 } | |
| 218 | |
| 219 UpdateSupportedKeySystems(); | |
|
ddorwin
2014/07/18 19:57:21
How does this affect the UMAs?
xhwang
2014/07/19 00:58:08
UMA is reported in IsSupportedKeySystemWithMediaMi
ddorwin
2014/07/20 15:47:25
But we'll get a UMA for failed and later succeeded
xhwang
2014/07/21 18:07:26
That's right. key_systems_support_uma_ could repor
| |
| 220 #endif | |
| 221 } | |
| 222 | |
| 223 void KeySystems::UpdateSupportedKeySystems() { | |
| 224 DVLOG(2) << __FUNCTION__; | |
| 225 concrete_key_system_map_.clear(); | |
|
ddorwin
2014/07/18 19:57:21
Calling this function outside the constructor (as
xhwang
2014/07/19 00:58:08
All KeySystems calls are made on the render main t
| |
| 226 parent_key_system_map_.clear(); | |
| 227 | |
| 228 // Build KeySystemInfo. | |
| 229 std::vector<KeySystemInfo> key_systems_info; | |
| 230 GetContentClient()->renderer()->AddKeySystems(&key_systems_info); | |
| 231 // Clear Key is always supported. | |
| 232 AddClearKey(&key_systems_info); | |
| 233 | |
| 234 AddConcreteSupportedKeySystems(key_systems_info); | |
| 235 | |
| 236 last_update_time_ = base::Time::Now(); | |
| 237 } | |
| 238 | |
| 200 void KeySystems::AddConcreteSupportedKeySystems( | 239 void KeySystems::AddConcreteSupportedKeySystems( |
| 201 const std::vector<KeySystemInfo>& concrete_key_systems) { | 240 const std::vector<KeySystemInfo>& concrete_key_systems) { |
| 202 for (size_t i = 0; i < concrete_key_systems.size(); ++i) { | 241 for (size_t i = 0; i < concrete_key_systems.size(); ++i) { |
| 203 const KeySystemInfo& key_system_info = concrete_key_systems[i]; | 242 const KeySystemInfo& key_system_info = concrete_key_systems[i]; |
| 204 AddConcreteSupportedKeySystem(key_system_info.key_system, | 243 AddConcreteSupportedKeySystem(key_system_info.key_system, |
| 205 key_system_info.use_aes_decryptor, | 244 key_system_info.use_aes_decryptor, |
| 206 #if defined(ENABLE_PEPPER_CDMS) | 245 #if defined(ENABLE_PEPPER_CDMS) |
| 207 key_system_info.pepper_type, | 246 key_system_info.pepper_type, |
| 208 #endif | 247 #endif |
| 209 key_system_info.supported_codecs, | 248 key_system_info.supported_codecs, |
| (...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 454 CONTENT_EXPORT void AddContainerMask(const std::string& container, | 493 CONTENT_EXPORT void AddContainerMask(const std::string& container, |
| 455 uint32 mask) { | 494 uint32 mask) { |
| 456 KeySystems::GetInstance().AddContainerMask(container, mask); | 495 KeySystems::GetInstance().AddContainerMask(container, mask); |
| 457 } | 496 } |
| 458 | 497 |
| 459 CONTENT_EXPORT void AddCodecMask(const std::string& codec, uint32 mask) { | 498 CONTENT_EXPORT void AddCodecMask(const std::string& codec, uint32 mask) { |
| 460 KeySystems::GetInstance().AddCodecMask(codec, mask); | 499 KeySystems::GetInstance().AddCodecMask(codec, mask); |
| 461 } | 500 } |
| 462 | 501 |
| 463 } // namespace content | 502 } // namespace content |
| OLD | NEW |